ZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZSBiL3NyYy9NYWtlZmlsZQppbmRleCAyNGQzOWU4Li41ZWFlMWE0IDEwMDY0NAotLS0gYS9zcmMvTWFrZWZpbGUKKysrIGIvc3JjL01ha2VmaWxlCkBAIC0zMDEwLDcgKzMwMTAsNiBAQAogCQkJCSAuLi8uLi90ZXN0ZGlyL3NhdXRlc3QgXAogCQkJCSAuLi8uLi90ZXN0ZGlyL3NhbXBsZXMgXAogCQkJCSAuLi8uLi90ZXN0ZGlyL2R1bXBzIFwKLQkJCQkgLi4vLi4vdGVzdGRpci90ZXN0ODMtdGFncz8gXAogCQkJCSAuLi8uLi90ZXN0ZGlyLyoub2sgXAogCQkJCSAuLi8uLi90ZXN0ZGlyL3Rlc3RsdWFwbHVnaW4gXAogCQkJCSAuCmRpZmYgLS1naXQgYS9zcmMvcXVpY2tmaXguYyBiL3NyYy9xdWlja2ZpeC5jCmluZGV4IGRiNjA3MTcuLjBiNmE1YTMgMTAwNjQ0Ci0tLSBhL3NyYy9xdWlja2ZpeC5jCisrKyBiL3NyYy9xdWlja2ZpeC5jCkBAIC04MTA2LDggKzgxMDYsNyBAQAogCiAJLy8gQ29udmVydCBhIGxpbmUgaWYgJ2VuY29kaW5nJyBpcyBub3QgdXRmLTggYW5kCiAJLy8gdGhlIGxpbmUgY29udGFpbnMgYSBub24tQVNDSUkgY2hhcmFjdGVyLgotCWlmIChwX3ZjLT52Y190eXBlICE9IENPTlZfTk9ORQotCQkmJiBoYXNfbm9uX2FzY2lpKElPYnVmZikpCisJaWYgKHBfdmMtPnZjX3R5cGUgIT0gQ09OVl9OT05FICYmIGhhc19ub25fYXNjaWkoSU9idWZmKSkKIAl7CiAJICAgIGxpbmUgPSBzdHJpbmdfY29udmVydChwX3ZjLCBJT2J1ZmYsIE5VTEwpOwogCSAgICBpZiAobGluZSA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvc3JjL3RhZy5jIGIvc3JjL3RhZy5jCmluZGV4IGE3ZmZhNDkuLjc2NTU4Y2IgMTAwNjQ0Ci0tLSBhL3NyYy90YWcuYworKysgYi9zcmMvdGFnLmMKQEAgLTE1ODAsOCArMTU4MCwxMSBAQAogICogU3RhdGUgaW5mb3JtYXRpb24gdXNlZCBkdXJpbmcgYSB0YWcgc2VhcmNoCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBjaGFyX3UJKnRhZ19mbmFtZTsJCS8vIG5hbWUgb2YgdGFnIGZpbGUKKyAgICBjaGFyX3UJKnRhZ19mbmFtZTsJCS8vIG5hbWUgb2YgdGhlIHRhZyBmaWxlCiAgICAgcGF0X1QJb3JncGF0OwkJCS8vIGhvbGRzIHVuY29udmVydGVkIHBhdHRlcm4gaW5mbworICAgIGludAkJbmFtZV9vbmx5OwkJLy8gZ2V0IG9ubHkgdGFnIG5hbWVzCisgICAgaW50CQlnZXRfc2VhcmNocGF0OwkvLyB1c2VkIGZvciAnc2hvd2Z1bGx0YWcnCisgICAgaW50CQloZWxwX29ubHk7CQkvLyBvbmx5IHNlYXJjaCBmb3IgaGVscCB0YWdzCiAjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCiAgICAgY2hhcl91CSpoZWxwX2xhbmdfZmluZDsJLy8gbGFuZyB0byBiZSBmb3VuZAogICAgIGludAkJaXNfdHh0OwkJCS8vIGZsYWcgb2YgZmlsZSBleHRlbnNpb24KQEAgLTE2MDcsNyArMTYxMCwxMSBAQAogICogSW5pdGlhbGl6ZSB0aGUgc3RhdGUgdXNlZCBieSBmaW5kX3RhZ3MoKQogICovCiAgICAgc3RhdGljIGludAotZmluZHRhZ3Nfc3RhdGVfaW5pdChmaW5kdGFnc19zdGF0ZV9UICpzdCwgY2hhcl91ICpwYXQsIGludCBtaW5jb3VudCkKK2ZpbmR0YWdzX3N0YXRlX2luaXQoCisgICAgZmluZHRhZ3Nfc3RhdGVfVAkqc3QsCisgICAgY2hhcl91CQkqcGF0LAorICAgIGludAkJCWZsYWdzLAorICAgIGludAkJCW1pbmNvdW50KQogewogICAgIGludAkJbXR0OwogCkBAIC0xNjE1LDYgKzE2MjIsOSBAQAogICAgIHN0LT5vcmdwYXQucGF0ID0gcGF0OwogICAgIHN0LT5vcmdwYXQubGVuID0gKGludClTVFJMRU4ocGF0KTsKICAgICBzdC0+b3JncGF0LnJlZ21hdGNoLnJlZ3Byb2cgPSBOVUxMOworICAgIHN0LT5oZWxwX29ubHkgPSAoZmxhZ3MgJiBUQUdfSEVMUCk7CisgICAgc3QtPm5hbWVfb25seSA9IChmbGFncyAmIFRBR19OQU1FUyk7CisgICAgc3QtPmdldF9zZWFyY2hwYXQgPSBGQUxTRTsKICNpZmRlZiBGRUFUX01VTFRJX0xBTkcKICAgICBzdC0+aGVscF9sYW5nX2ZpbmQgPSBOVUxMOwogICAgIHN0LT5pc190eHQgPSBGQUxTRTsKQEAgLTE2NDgsNiArMTY1OCw1OTIgQEAKIH0KIAogLyoKKyAqIEZyZWUgdGhlIHN0YXRlIHVzZWQgYnkgZmluZF90YWdzKCkKKyAqLworICAgIHN0YXRpYyB2b2lkCitmaW5kdGFnc19zdGF0ZV9mcmVlKGZpbmR0YWdzX3N0YXRlX1QgKnN0KQoreworICAgIHZpbV9mcmVlKHN0LT50YWdfZm5hbWUpOworICAgIHZpbV9mcmVlKHN0LT5sYnVmKTsKKyAgICB2aW1fcmVnZnJlZShzdC0+b3JncGF0LnJlZ21hdGNoLnJlZ3Byb2cpOworI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworICAgIHZpbV9mcmVlKHN0LT5lYnVmKTsKKyNlbmRpZgorfQorCisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisvKgorICogSW5pdGlhbGl6ZSB0aGUgc3RhdGUgZm9yIHNlYXJjaGluZyB0YWdzIGluIGEgVmltIGhlbHAgZmlsZS4KKyAqIFJldHVybnMgVFJVRSB0byBwcm9jZXNzIHRoZSBoZWxwIGZpbGUgYW5kIEZBTFNFIHRvIHNraXAgdGhlIGZpbGUuCisgKi8KKyAgICBzdGF0aWMgaW50CitmaW5kdGFnc19pbl9oZWxwX2luaXQoCisgICAgZmluZHRhZ3Nfc3RhdGVfVAkqc3QsCisgICAgaW50CQkJZmxhZ3MsCisgICAgY2hhcl91CQkqaGVscF9sYW5nLAorICAgIGludAkJCSpoZWxwX3ByaSkKK3sKKyAgICBpbnQJCWk7CisgICAgY2hhcl91CSpzOworCisgICAgLy8gS2VlcCBlbiBpZiB0aGUgZmlsZSBleHRlbnNpb24gaXMgLnR4dAorICAgIGlmIChzdC0+aXNfdHh0KQorCVNUUkNQWShoZWxwX2xhbmcsICJlbiIpOworICAgIGVsc2UKKyAgICB7CisJLy8gUHJlZmVyIGhlbHAgdGFncyBhY2NvcmRpbmcgdG8gJ2hlbHBsYW5nJy4gIFB1dCB0aGUKKwkvLyB0d28tbGV0dGVyIGxhbmd1YWdlIG5hbWUgaW4gaGVscF9sYW5nW10uCisJaSA9IChpbnQpU1RSTEVOKHN0LT50YWdfZm5hbWUpOworCWlmIChpID4gMyAmJiBzdC0+dGFnX2ZuYW1lW2kgLSAzXSA9PSAnLScpCisJICAgIFNUUkNQWShoZWxwX2xhbmcsIHN0LT50YWdfZm5hbWUgKyBpIC0gMik7CisJZWxzZQorCSAgICBTVFJDUFkoaGVscF9sYW5nLCAiZW4iKTsKKyAgICB9CisgICAgLy8gV2hlbiBzZWFyY2hpbmcgZm9yIGEgc3BlY2lmaWMgbGFuZ3VhZ2Ugc2tpcCB0YWdzIGZpbGVzCisgICAgLy8gZm9yIG90aGVyIGxhbmd1YWdlcy4KKyAgICBpZiAoc3QtPmhlbHBfbGFuZ19maW5kICE9IE5VTEwKKwkgICAgJiYgU1RSSUNNUChoZWxwX2xhbmcsIHN0LT5oZWxwX2xhbmdfZmluZCkgIT0gMCkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAvLyBGb3IgQ1RSTC1dIGluIGEgaGVscCBmaWxlIHByZWZlciBhIG1hdGNoIHdpdGggdGhlIHNhbWUKKyAgICAvLyBsYW5ndWFnZS4KKyAgICBpZiAoKGZsYWdzICYgVEFHX0tFRVBfTEFORykKKwkgICAgJiYgc3QtPmhlbHBfbGFuZ19maW5kID09IE5VTEwKKwkgICAgJiYgY3VyYnVmLT5iX2ZuYW1lICE9IE5VTEwKKwkgICAgJiYgKGkgPSAoaW50KVNUUkxFTihjdXJidWYtPmJfZm5hbWUpKSA+IDQKKwkgICAgJiYgY3VyYnVmLT5iX2ZuYW1lW2kgLSAxXSA9PSAneCcKKwkgICAgJiYgY3VyYnVmLT5iX2ZuYW1lW2kgLSA0XSA9PSAnLicKKwkgICAgJiYgU1RSTklDTVAoY3VyYnVmLT5iX2ZuYW1lICsgaSAtIDMsIGhlbHBfbGFuZywgMikgPT0gMCkKKwkqaGVscF9wcmkgPSAwOworICAgIGVsc2UKKyAgICB7CisJKmhlbHBfcHJpID0gMTsKKwlmb3IgKHMgPSBwX2hsZzsgKnMgIT0gTlVMOyArK3MpCisJeworCSAgICBpZiAoU1RSTklDTVAocywgaGVscF9sYW5nLCAyKSA9PSAwKQorCQlicmVhazsKKwkgICAgKysqaGVscF9wcmk7CisJICAgIGlmICgocyA9IHZpbV9zdHJjaHIocywgJywnKSkgPT0gTlVMTCkKKwkJYnJlYWs7CisJfQorCWlmIChzID09IE5VTEwgfHwgKnMgPT0gTlVMKQorCXsKKwkgICAgLy8gTGFuZ3VhZ2Ugbm90IGluICdoZWxwbGFuZyc6IHVzZSBsYXN0LCBwcmVmZXIgRW5nbGlzaCwKKwkgICAgLy8gdW5sZXNzIGZvdW5kIGFscmVhZHkuCisJICAgICsrKmhlbHBfcHJpOworCSAgICBpZiAoU1RSSUNNUChoZWxwX2xhbmcsICJlbiIpICE9IDApCisJCSsrKmhlbHBfcHJpOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCisjaWZkZWYgRkVBVF9FVkFMCisvKgorICogVXNlIHRoZSAndGFnZnVuYycgKGlmIGNvbmZpZ3VyZWQgYW5kIGVuYWJsZWQpIHRvIGdldCB0aGUgdGFncy4KKyAqIFJldHVybiBPSyBpZiBhdCBsZWFzdCAxIHRhZyBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZm91bmQsIE5PVERPTkUgaWYgdGhlCisgKiAndGFnZnVuYycgaXMgbm90IHVzZWQgb3IgdGhlICd0YWdmdW5jJyByZXR1cm5zIHY6bnVsbCBhbmQgRkFJTCBvdGhlcndpc2UuCisgKi8KKyAgICBzdGF0aWMgaW50CitmaW5kdGFnc19hcHBseV90ZnUoCisgICAgY2hhcl91CQkqcGF0LAorICAgIGZpbmR0YWdzX3N0YXRlX1QJKnN0LAorICAgIGludAkJCWZsYWdzLAorICAgIGNoYXJfdQkJKmJ1Zl9mZm5hbWUpCit7CisgICAgaW50ICAgICAgICAgdXNlX3RmdSA9ICgoZmxhZ3MgJiBUQUdfTk9fVEFHRlVOQykgPT0gMCk7CisgICAgaW50CQlyZXR2YWw7CisKKyAgICBpZiAoIXVzZV90ZnUgfHwgdGZ1X2luX3VzZSB8fCAqY3VyYnVmLT5iX3BfdGZ1ID09IE5VTCkKKwlyZXR1cm4gTk9URE9ORTsKKworICAgIHRmdV9pbl91c2UgPSBUUlVFOworICAgIHJldHZhbCA9IGZpbmRfdGFnZnVuY190YWdzKHBhdCwgc3QtPmdhX21hdGNoLCAmc3QtPm1hdGNoX2NvdW50LAorCQkJCQkJCWZsYWdzLCBidWZfZmZuYW1lKTsKKyAgICB0ZnVfaW5fdXNlID0gRkFMU0U7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKKyNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKKy8qCisgKiBTdGFjayBmb3IgaW5jbHVkZWQgZW1hY3MtdGFncyBmaWxlLgorICogSXQgaGFzIGEgZml4ZWQgc2l6ZSwgdG8gdHJ1bmNhdGUgY3ljbGljIGluY2x1ZGVzLiBqdworICovCisjIGRlZmluZSBJTkNTVEFDS19TSVpFIDQyCitzdGF0aWMgc3RydWN0Cit7CisgICAgRklMRQkqZnA7CisgICAgY2hhcl91CSpldGFnX2ZuYW1lOworfSBpbmNzdGFja1tJTkNTVEFDS19TSVpFXTsKK3N0YXRpYyBpbnQgaW5jc3RhY2tfaWR4ID0gMDsJLy8gaW5kZXggaW4gaW5jc3RhY2sKKworLyoKKyAqIEZyZWUgdGhlIGluY2x1ZGUgdGFncyBmaWxlIHN0YWNrLgorICovCisgICAgc3RhdGljIHZvaWQKK2VtYWNzX3RhZ3NfaW5jc3RhY2tfZnJlZSh2b2lkKQoreworICAgIHdoaWxlIChpbmNzdGFja19pZHgpCisgICAgeworCS0taW5jc3RhY2tfaWR4OworCWZjbG9zZShpbmNzdGFja1tpbmNzdGFja19pZHhdLmZwKTsKKwlpbmNzdGFja1tpbmNzdGFja19pZHhdLmZwID0gTlVMTDsKKwlWSU1fQ0xFQVIoaW5jc3RhY2tbaW5jc3RhY2tfaWR4XS5ldGFnX2ZuYW1lKTsKKyAgICB9Cit9CisKKy8qCisgKiBFbWFjcyB0YWdzIGxpbmUgd2l0aCBDVFJMLUw6IE5ldyBmaWxlIG5hbWUgb24gbmV4dCBsaW5lLgorICogVGhlIGZpbGUgbmFtZSBpcyBmb2xsb3dlZCBieSBhICcsJy4gIFJlbWVtYmVyIGV0YWcgZmlsZSBuYW1lIGluIGVidWYuCisgKiBSZXR1cm5zIGEgRklMRSBwb2ludGVyIHRvIHRoZSB0YWdzIGZpbGUuIElmIGFub3RoZXIgdGFncyBmaWxlIGlzIGluY2x1ZGVkLAorICogdGhlbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3IHRhZ3MgZmlsZS4gVGhlIG9sZCBmaWxlIHBvaW50ZXIgaXMgc2F2ZWQKKyAqIGluIGluY3N0YWNrLgorICovCisgICAgc3RhdGljIEZJTEUgKgorZW1hY3NfdGFnc19uZXdfZmlsZW5hbWUoZmluZHRhZ3Nfc3RhdGVfVCAqc3QsIEZJTEUgKmZwLCBpbnQgKmlzX2V0YWcpCit7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqZnVsbHBhdGhfZWJ1ZjsKKworICAgIGlmICh2aW1fZmdldHMoc3QtPmVidWYsIExTSVpFLCBmcCkpCisJcmV0dXJuIGZwOworCisgICAgZm9yIChwID0gc3QtPmVidWY7ICpwICYmICpwICE9ICcsJzsgcCsrKQorCTsKKyAgICAqcCA9IE5VTDsKKworICAgIC8vIGNoZWNrIGZvciBhbiBpbmNsdWRlZCB0YWdzIGZpbGUuCisgICAgLy8gYXRvaShwKzEpIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYmVmb3JlIHRoZSBuZXh0IF5MIHVubGVzcyBpdCBpcyBhbgorICAgIC8vIGluY2x1ZGUgc3RhdGVtZW50LiBTa2lwIHRoZSBpbmNsdWRlZCB0YWdzIGZpbGUgaWYgaXQgZXhjZWVkcyB0aGUKKyAgICAvLyBtYXhpbXVtLgorICAgIGlmIChTVFJOQ01QKHAgKyAxLCAiaW5jbHVkZSIsIDcpICE9IDAgfHwgaW5jc3RhY2tfaWR4ID49IElOQ1NUQUNLX1NJWkUpCisJcmV0dXJuIGZwOworCisgICAgLy8gU2F2ZSBjdXJyZW50ICJmcCIgYW5kICJ0YWdfZm5hbWUiIGluIHRoZSBzdGFjay4KKyAgICBpbmNzdGFja1tpbmNzdGFja19pZHhdLmV0YWdfZm5hbWUgPSB2aW1fc3Ryc2F2ZShzdC0+dGFnX2ZuYW1lKTsKKyAgICBpZiAoaW5jc3RhY2tbaW5jc3RhY2tfaWR4XS5ldGFnX2ZuYW1lID09IE5VTEwpCisJcmV0dXJuIGZwOworCisgICAgaW5jc3RhY2tbaW5jc3RhY2tfaWR4XS5mcCA9IGZwOworICAgIGZwID0gTlVMTDsKKworICAgIC8vIEZpZ3VyZSBvdXQgInRhZ19mbmFtZSIgYW5kICJmcCIgdG8gdXNlIGZvcgorICAgIC8vIGluY2x1ZGVkIGZpbGUuCisgICAgZnVsbHBhdGhfZWJ1ZiA9IGV4cGFuZF90YWdfZm5hbWUoc3QtPmVidWYsIHN0LT50YWdfZm5hbWUsIEZBTFNFKTsKKyAgICBpZiAoZnVsbHBhdGhfZWJ1ZiAhPSBOVUxMKQorICAgIHsKKwlmcCA9IG1jaF9mb3BlbigoY2hhciAqKWZ1bGxwYXRoX2VidWYsICJyIik7CisJaWYgKGZwICE9IE5VTEwpCisJeworCSAgICBpZiAoU1RSTEVOKGZ1bGxwYXRoX2VidWYpID4gTFNJWkUpCisJCXNlbXNnKF8oZV90YWdfZmlsZV9wYXRoX3RydW5jYXRlZF9mb3Jfc3RyKSwgc3QtPmVidWYpOworCSAgICB2aW1fc3RybmNweShzdC0+dGFnX2ZuYW1lLCBmdWxscGF0aF9lYnVmLCBNQVhQQVRITCk7CisJICAgICsraW5jc3RhY2tfaWR4OworCSAgICAqaXNfZXRhZyA9IDA7IC8vIHdlIGNhbiBpbmNsdWRlIGFueXRoaW5nCisJfQorCXZpbV9mcmVlKGZ1bGxwYXRoX2VidWYpOworICAgIH0KKyAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICB7CisJLy8gQ2FuJ3Qgb3BlbiB0aGUgaW5jbHVkZWQgZmlsZSwgc2tpcCBpdCBhbmQKKwkvLyByZXN0b3JlIG9sZCB2YWx1ZSBvZiAiZnAiLgorCWZwID0gaW5jc3RhY2tbaW5jc3RhY2tfaWR4XS5mcDsKKwl2aW1fZnJlZShpbmNzdGFja1tpbmNzdGFja19pZHhdLmV0YWdfZm5hbWUpOworICAgIH0KKworICAgIHJldHVybiBmcDsKK30KKworLyoKKyAqIFJlYWNoZWQgdGhlIGVuZCBvZiBhbiBlbWFjcy1zdHlsZSB0YWdzIGZpbGUuIElmIHRoaXMgaXMgYW4gaW5jbHVkZWQgdGFncworICogZmlsZSwgdGhlbiBwb3AgaXQgZnJvbSB0aGUgaW5jc3RhY2sgYW5kIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIHBhcmVudCB0YWdzCisgKiBmaWxlLiBPdGhlcndpc2UsIHByb2Nlc3NlZCBhbGwgdGhlIHRhZ3MuCisgKiBSZXR1cm5zIFRSVUUgaWYgYW4gaW5jbHVkZWQgdGFncyBmaWxlIGlzIHBvcHBlZCBhbmQgcHJvY2Vzc2luZyBzaG91bGQKKyAqIGNvbnRpbnVlIHdpdGggdGhlIHBhcmVudCB0YWdzIGZpbGUuIE90aGVyd2lzZSByZXR1cm5zIEZBTFNFLgorICovCisgICAgc3RhdGljIGludAorZW1hY3NfdGFnc19maWxlX2VvZihmaW5kdGFnc19zdGF0ZV9UICpzdCwgRklMRSAqKmZwKQoreworICAgIGlmICghaW5jc3RhY2tfaWR4KQkvLyByZWFjaGVkIGVuZCBvZiBmaWxlLiBzdG9wIHByb2Nlc3NpbmcuCisJcmV0dXJuIEZBTFNFOworCisgICAgLy8gcmVhY2hlZCB0aGUgZW5kIG9mIGFuIGluY2x1ZGVkIHRhZ3MgZmlsZS4gcG9wIGl0LgorICAgIC0taW5jc3RhY2tfaWR4OworICAgIGZjbG9zZSgqZnApOwkvLyBlbmQgb2YgdGhpcyBmaWxlIC4uLgorICAgICpmcCA9IGluY3N0YWNrW2luY3N0YWNrX2lkeF0uZnA7CisgICAgU1RSQ1BZKHN0LT50YWdfZm5hbWUsIGluY3N0YWNrW2luY3N0YWNrX2lkeF0uZXRhZ19mbmFtZSk7CisgICAgdmltX2ZyZWUoaW5jc3RhY2tbaW5jc3RhY2tfaWR4XS5ldGFnX2ZuYW1lKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKgorICogUGFyc2UgYSBsaW5lIGZyb20gYW4gZW1hY3Mtc3R5bGUgdGFncyBmaWxlLgorICogUmV0dXJucyBPSyBpcyB0aGUgbGluZSBpcyBwYXJzZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UgRkFMU0UuCisgKi8KKyAgICBzdGF0aWMgaW50CitlbWFjc190YWdzX3BhcnNlX2xpbmUoY2hhcl91ICpsYnVmLCB0YWdwdHJzX1QgKnRhZ3ApCit7CisgICAgY2hhcl91CSpwXzdmOworICAgIGNoYXJfdQkqcDsKKworICAgIC8vIFRoZXJlIGFyZSB0d28gZm9ybWF0cyBmb3IgYW4gZW1hY3MgdGFnIGxpbmU6CisgICAgLy8gMTogIHN0cnVjdCBFbnZCYXNlIF4/RW52QmFzZV5BMTM5LDQ2MjcKKyAgICAvLyAyOiAjZGVmaW5lCUFSUEJfV0lMRF9XT1JMRCBePzE1Myw1MTk0CisgICAgcF83ZiA9IHZpbV9zdHJjaHIobGJ1ZiwgMHg3Zik7CisgICAgaWYgKHBfN2YgPT0gTlVMTCkKKyAgICB7CitldGFnX2ZhaWw6CisJaWYgKHZpbV9zdHJjaHIobGJ1ZiwgJ1xuJykgIT0gTlVMTCkKKwkgICAgcmV0dXJuIEZBSUw7CisKKwkvLyBUcnVuY2F0ZWQgbGluZS4gIElnbm9yZSBpdC4KKwlpZiAocF92ZXJib3NlID49IDUpCisJeworCSAgICB2ZXJib3NlX2VudGVyKCk7CisJICAgIG1zZyhfKCJJZ25vcmluZyBsb25nIGxpbmUgaW4gdGFncyBmaWxlIikpOworCSAgICB2ZXJib3NlX2xlYXZlKCk7CisJfQorCXRhZ3AtPmNvbW1hbmQgPSBsYnVmOworCXRhZ3AtPnRhZ25hbWUgPSBsYnVmOworCXRhZ3AtPnRhZ25hbWVfZW5kID0gbGJ1ZjsKKwlyZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gRmluZCBeQS4gIElmIG5vdCBmb3VuZCB0aGUgbGluZSBudW1iZXIgaXMgYWZ0ZXIgdGhlIDB4N2YKKyAgICBwID0gdmltX3N0cmNocihwXzdmLCBDdHJsX0EpOworICAgIGlmIChwID09IE5VTEwpCisJcCA9IHBfN2YgKyAxOworICAgIGVsc2UKKwkrK3A7CisKKyAgICBpZiAoIVZJTV9JU0RJR0lUKCpwKSkJICAgIC8vIGNoZWNrIGZvciBzdGFydCBvZiBsaW5lIG51bWJlcgorCWdvdG8gZXRhZ19mYWlsOworICAgIHRhZ3AtPmNvbW1hbmQgPSBwOworCisgICAgaWYgKHBbLTFdID09IEN0cmxfQSkJICAgIC8vIGZpcnN0IGZvcm1hdDogZXhwbGljaXQgdGFnbmFtZSBnaXZlbgorICAgIHsKKwl0YWdwLT50YWduYW1lID0gcF83ZiArIDE7CisJdGFncC0+dGFnbmFtZV9lbmQgPSBwIC0gMTsKKyAgICB9CisgICAgZWxzZQkJCSAgICAvLyBzZWNvbmQgZm9ybWF0OiBpc29sYXRlIHRhZ25hbWUKKyAgICB7CisJLy8gZmluZCBlbmQgb2YgdGFnbmFtZQorCWZvciAocCA9IHBfN2YgLSAxOyAhdmltX2lzd29yZGMoKnApOyAtLXApCisJICAgIGlmIChwID09IGxidWYpCisJCWdvdG8gZXRhZ19mYWlsOworCXRhZ3AtPnRhZ25hbWVfZW5kID0gcCArIDE7CisJd2hpbGUgKHAgPj0gbGJ1ZiAmJiB2aW1faXN3b3JkYygqcCkpCisJICAgIC0tcDsKKwl0YWdwLT50YWduYW1lID0gcCArIDE7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorI2VuZGlmCisKKy8qCisgKiBQYXJzZSBhIHRhZ3MgZmlsZSBoZWFkZXIgbGluZSBpbiAnc3QtPmxidWYnLgorICogUmV0dXJucyBUUlVFIHRvIHJlYWQgdGhlIG5leHQgaGVhZGVyIGxpbmUgYW5kIEZBTFNFIHRvIHByb2Nlc3MgdGhlIGxpbmUuCisgKi8KKyAgICBzdGF0aWMgaW50Cit0YWdzX2ZpbGVfaGRyX3BhcnNlKGZpbmR0YWdzX3N0YXRlX1QgKnN0LCB2aW1jb252X1QgKnZjcCwgaW50ICpzb3J0ZWRfZmlsZSkKK3sKKyAgICBjaGFyX3UJKnA7CisKKyAgICBpZiAoU1RSTkNNUChzdC0+bGJ1ZiwgIiFfVEFHXyIsIDYpICE9IDApCisJLy8gTm9uLWhlYWRlciBpdGVtIGJlZm9yZSB0aGUgaGVhZGVyLCBlLmcuICIhIiBpdHNlbGYuCisJcmV0dXJuIEZBTFNFOworCisgICAgLy8gUmVhZCBoZWFkZXIgbGluZS4KKyNpZmRlZiBGRUFUX1RBR19CSU5TCisgICAgaWYgKFNUUk5DTVAoc3QtPmxidWYsICIhX1RBR19GSUxFX1NPUlRFRFx0IiwgMTgpID09IDApCisJKnNvcnRlZF9maWxlID0gc3QtPmxidWZbMThdOworI2VuZGlmCisgICAgaWYgKFNUUk5DTVAoc3QtPmxidWYsICIhX1RBR19GSUxFX0VOQ09ESU5HXHQiLCAyMCkgPT0gMCkKKyAgICB7CisJLy8gUHJlcGFyZSB0byBjb252ZXJ0IGV2ZXJ5IGxpbmUgZnJvbSB0aGUgc3BlY2lmaWVkCisJLy8gZW5jb2RpbmcgdG8gJ2VuY29kaW5nJy4KKwlmb3IgKHAgPSBzdC0+bGJ1ZiArIDIwOyAqcCA+ICcgJyAmJiAqcCA8IDEyNzsgKytwKQorCSAgICA7CisJKnAgPSBOVUw7CisJY29udmVydF9zZXR1cCh2Y3AsIHN0LT5sYnVmICsgMjAsIHBfZW5jKTsKKyAgICB9CisKKyAgICAvLyBSZWFkIHRoZSBuZXh0IGxpbmUuICBVbnJlY29nbml6ZWQgZmxhZ3MgYXJlIGlnbm9yZWQuCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBDb252ZXJ0IHRoZSBlbmNvZGluZyBvZiBhIGxpbmUgcmVhZCBmcm9tIGEgdGFncyBmaWxlIGluICdzdC0+bGJ1ZicuCisgKiBDb252ZXJ0aW5nIHRoZSBwYXR0ZXJuIGZyb20gJ2VuYycgdG8gdGhlIHRhZ3MgZmlsZSBlbmNvZGluZyBkb2Vzbid0IHdvcmssCisgKiBiZWNhdXNlIGNoYXJhY3RlcnMgYXJlIG5vdCByZWNvZ25pemVkLgorICovCisgICAgc3RhdGljIHZvaWQKK2ZpbmR0YWdzX3N0cmluZ19jb252ZXJ0KGZpbmR0YWdzX3N0YXRlX1QgKnN0LCB2aW1jb252X1QgKnZjcCkKK3sKKyAgICBjaGFyX3UJKmNvbnZfbGluZTsKKyAgICBpbnQJCWxlbjsKKworICAgIGNvbnZfbGluZSA9IHN0cmluZ19jb252ZXJ0KHZjcCwgc3QtPmxidWYsIE5VTEwpOworICAgIGlmIChjb252X2xpbmUgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICAvLyBDb3B5IG9yIHN3YXAgbGJ1ZiBhbmQgY29udl9saW5lLgorICAgIGxlbiA9IChpbnQpU1RSTEVOKGNvbnZfbGluZSkgKyAxOworICAgIGlmIChsZW4gPiBzdC0+bGJ1Zl9zaXplKQorICAgIHsKKwl2aW1fZnJlZShzdC0+bGJ1Zik7CisJc3QtPmxidWYgPSBjb252X2xpbmU7CisJc3QtPmxidWZfc2l6ZSA9IGxlbjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlTVFJDUFkoc3QtPmxidWYsIGNvbnZfbGluZSk7CisJdmltX2ZyZWUoY29udl9saW5lKTsKKyAgICB9Cit9CisKKyAgICBzdGF0aWMgaW50CitmaW5kdGFnc19hZGRfbWF0Y2goCisgICAgZmluZHRhZ3Nfc3RhdGVfVAkqc3QsCisgICAgdGFncHRyc19UCQkqdGFncCwKKyAgICBjaGFyX3UJCSpidWZfZmZuYW1lLAorICAgIGludAkJCWZsYWdzIFVOVVNFRCwKKyAgICBoYXNoX1QJCSpoYXNoLAorICAgIGludAkJCW1hdGNoX3JlLAorICAgIGludAkJCW1hdGNoX25vX2ljLAorICAgIGludAkJCW1hdGNob2ZmLAorICAgIGludAkJCWlzX2V0YWcgVU5VU0VELAorICAgIGNoYXJfdQkJKmhlbHBfbGFuZyBVTlVTRUQsCisgICAgaW50CQkJaGVscF9wcmkgVU5VU0VEKQoreworI2lmZGVmIEZFQVRfQ1NDT1BFCisgICAgaW50CQl1c2VfY3Njb3BlID0gKGZsYWdzICYgVEFHX0NTQ09QRSk7CisjZW5kaWYKKyAgICBpbnQJCW10dDsKKyAgICBpbnQJCWxlbiA9IDA7CisgICAgaW50CQlpc19jdXJyZW50OwkJLy8gZmlsZSBuYW1lIG1hdGNoZXMKKyAgICBpbnQJCWlzX3N0YXRpYzsJCS8vIGN1cnJlbnQgdGFnIGxpbmUgaXMgc3RhdGljCisgICAgY2hhcl91CSptZnA7CisgICAgY2hhcl91CSpwOworICAgIGNoYXJfdQkqczsKKworI2lmZGVmIEZFQVRfQ1NDT1BFCisgICAgaWYgKHVzZV9jc2NvcGUpCisgICAgeworCS8vIERvbid0IGNoYW5nZSB0aGUgb3JkZXJpbmcsIGFsd2F5cyB1c2UgdGhlIHNhbWUgdGFibGUuCisJbXR0ID0gTVRfR0xfT1RIOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisJLy8gRGVjaWRlIGluIHdoaWNoIGFycmF5IHRvIHN0b3JlIHRoaXMgbWF0Y2guCisJaXNfY3VycmVudCA9IHRlc3RfZm9yX2N1cnJlbnQoCisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisJCWlzX2V0YWcsCisjZW5kaWYKKwkJdGFncC0+Zm5hbWUsIHRhZ3AtPmZuYW1lX2VuZCwgc3QtPnRhZ19mbmFtZSwKKwkJYnVmX2ZmbmFtZSk7CisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisJaXNfc3RhdGljID0gRkFMU0U7CisJaWYgKCFpc19ldGFnKQkvLyBlbWFjcyB0YWdzIGFyZSBuZXZlciBzdGF0aWMKKyNlbmRpZgorCSAgICBpc19zdGF0aWMgPSB0ZXN0X2Zvcl9zdGF0aWModGFncCk7CisKKwkvLyBkZWNpZGUgaW4gd2hpY2ggb2YgdGhlIHNpeHRlZW4gdGFibGVzIHRvIHN0b3JlIHRoaXMKKwkvLyBtYXRjaAorCWlmIChpc19zdGF0aWMpCisJeworCSAgICBpZiAoaXNfY3VycmVudCkKKwkJbXR0ID0gTVRfU1RfQ1VSOworCSAgICBlbHNlCisJCW10dCA9IE1UX1NUX09USDsKKwl9CisJZWxzZQorCXsKKwkgICAgaWYgKGlzX2N1cnJlbnQpCisJCW10dCA9IE1UX0dMX0NVUjsKKwkgICAgZWxzZQorCQltdHQgPSBNVF9HTF9PVEg7CisJfQorCWlmIChzdC0+b3JncGF0LnJlZ21hdGNoLnJtX2ljICYmICFtYXRjaF9ub19pYykKKwkgICAgbXR0ICs9IE1UX0lDX09GRjsKKwlpZiAobWF0Y2hfcmUpCisJICAgIG10dCArPSBNVF9SRV9PRkY7CisgICAgfQorCisgICAgLy8gQWRkIHRoZSBmb3VuZCBtYXRjaCBpbiBodF9tYXRjaFttdHRdIGFuZCBnYV9tYXRjaFttdHRdLgorICAgIC8vIFN0b3JlIHRoZSBpbmZvIHdlIG5lZWQgbGF0ZXIsIHdoaWNoIGRlcGVuZHMgb24gdGhlIGtpbmQgb2YKKyAgICAvLyB0YWdzIHdlIGFyZSBkZWFsaW5nIHdpdGguCisgICAgaWYgKHN0LT5oZWxwX29ubHkpCisgICAgeworI2lmZGVmIEZFQVRfTVVMVElfTEFORworIyBkZWZpbmUgTUxfRVhUUkEgMworI2Vsc2UKKyMgZGVmaW5lIE1MX0VYVFJBIDAKKyNlbmRpZgorCS8vIEFwcGVuZCB0aGUgaGVscC1oZXVyaXN0aWMgbnVtYmVyIGFmdGVyIHRoZSB0YWduYW1lLCBmb3IKKwkvLyBzb3J0aW5nIGl0IGxhdGVyLiAgVGhlIGhldXJpc3RpYyBpcyBpZ25vcmVkIGZvcgorCS8vIGRldGVjdGluZyBkdXBsaWNhdGVzLgorCS8vIFRoZSBmb3JtYXQgaXMge3RhZ25hbWV9QHtsYW5nfU5VTHtoZXVyaXN0aWN9TlVMCisJKnRhZ3AtPnRhZ25hbWVfZW5kID0gTlVMOworCWxlbiA9IChpbnQpKHRhZ3AtPnRhZ25hbWVfZW5kIC0gdGFncC0+dGFnbmFtZSk7CisJbWZwID0gYWxsb2Moc2l6ZW9mKGNoYXJfdSkgKyBsZW4gKyAxMCArIE1MX0VYVFJBICsgMSk7CisJaWYgKG1mcCAhPSBOVUxMKQorCXsKKwkgICAgaW50IGhldXJpc3RpYzsKKworCSAgICBwID0gbWZwOworCSAgICBTVFJDUFkocCwgdGFncC0+dGFnbmFtZSk7CisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisJICAgIHBbbGVuXSA9ICdAJzsKKwkgICAgU1RSQ1BZKHAgKyBsZW4gKyAxLCBoZWxwX2xhbmcpOworI2VuZGlmCisKKwkgICAgaGV1cmlzdGljID0gaGVscF9oZXVyaXN0aWModGFncC0+dGFnbmFtZSwKKwkJICAgIG1hdGNoX3JlID8gbWF0Y2hvZmYgOiAwLCAhbWF0Y2hfbm9faWMpOworI2lmZGVmIEZFQVRfTVVMVElfTEFORworCSAgICBoZXVyaXN0aWMgKz0gaGVscF9wcmk7CisjZW5kaWYKKwkgICAgc3ByaW50ZigoY2hhciAqKXAgKyBsZW4gKyAxICsgTUxfRVhUUkEsICIlMDZkIiwKKwkJICAgIGhldXJpc3RpYyk7CisJfQorCSp0YWdwLT50YWduYW1lX2VuZCA9IFRBQjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3QtPm5hbWVfb25seSkKKyAgICB7CisJaWYgKHN0LT5nZXRfc2VhcmNocGF0KQorCXsKKwkgICAgY2hhcl91ICp0ZW1wX2VuZCA9IHRhZ3AtPmNvbW1hbmQ7CisKKwkgICAgaWYgKCp0ZW1wX2VuZCA9PSAnLycpCisJCXdoaWxlICgqdGVtcF9lbmQgJiYgKnRlbXBfZW5kICE9ICdccicKKwkJCSYmICp0ZW1wX2VuZCAhPSAnXG4nCisJCQkmJiAqdGVtcF9lbmQgIT0gJyQnKQorCQkgICAgdGVtcF9lbmQrKzsKKworCSAgICBpZiAodGFncC0+Y29tbWFuZCArIDIgPCB0ZW1wX2VuZCkKKwkgICAgeworCQlsZW4gPSAoaW50KSh0ZW1wX2VuZCAtIHRhZ3AtPmNvbW1hbmQgLSAyKTsKKwkJbWZwID0gYWxsb2MobGVuICsgMik7CisJCWlmIChtZnAgIT0gTlVMTCkKKwkJICAgIHZpbV9zdHJuY3B5KG1mcCwgdGFncC0+Y29tbWFuZCArIDIsIGxlbik7CisJICAgIH0KKwkgICAgZWxzZQorCQltZnAgPSBOVUxMOworCSAgICBzdC0+Z2V0X3NlYXJjaHBhdCA9IEZBTFNFOworCX0KKwllbHNlCisJeworCSAgICBsZW4gPSAoaW50KSh0YWdwLT50YWduYW1lX2VuZCAtIHRhZ3AtPnRhZ25hbWUpOworCSAgICBtZnAgPSBhbGxvYyhzaXplb2YoY2hhcl91KSArIGxlbiArIDEpOworCSAgICBpZiAobWZwICE9IE5VTEwpCisJCXZpbV9zdHJuY3B5KG1mcCwgdGFncC0+dGFnbmFtZSwgbGVuKTsKKworCSAgICAvLyBpZiB3YW50ZWQsIHJlLXJlYWQgbGluZSB0byBnZXQgbG9uZyBmb3JtIHRvbworCSAgICBpZiAoU3RhdGUgJiBJTlNFUlQpCisJCXN0LT5nZXRfc2VhcmNocGF0ID0gcF9zZnQ7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCXNpemVfdCB0YWdfZm5hbWVfbGVuID0gU1RSTEVOKHN0LT50YWdfZm5hbWUpOworI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworCXNpemVfdCBlYnVmX2xlbiA9IDA7CisjZW5kaWYKKworCS8vIFNhdmUgdGhlIHRhZyBpbiBhIGJ1ZmZlci4KKwkvLyBVc2UgMHgwMiB0byBzZXBhcmF0ZSBmaWVsZHMgKENhbid0IHVzZSBOVUwgYmVjYXVzZSB0aGUKKwkvLyBoYXNoIGtleSBpcyB0ZXJtaW5hdGVkIGJ5IE5VTCwgb3IgQ3RybF9BIGJlY2F1c2UgdGhhdCBpcworCS8vIHBhcnQgb2Ygc29tZSBFbWFjcyB0YWcgZmlsZXMgLS0gc2VlIHBhcnNlX3RhZ19saW5lKS4KKwkvLyBFbWFjcyB0YWc6IDxtdHQ+PHRhZ19mbmFtZT48MHgwMj48ZWJ1Zj48MHgwMj48bGJ1Zj48TlVMPgorCS8vIG90aGVyIHRhZzogPG10dD48dGFnX2ZuYW1lPjwweDAyPjwweDAyPjxsYnVmPjxOVUw+CisJLy8gd2l0aG91dCBFbWFjcyB0YWdzOiA8bXR0Pjx0YWdfZm5hbWU+PDB4MDI+PGxidWY+PE5VTD4KKwkvLyBIZXJlIDxtdHQ+IGlzIHRoZSAibXR0IiB2YWx1ZSBwbHVzIDEgdG8gYXZvaWQgTlVMLgorCWxlbiA9IChpbnQpdGFnX2ZuYW1lX2xlbiArIChpbnQpU1RSTEVOKHN0LT5sYnVmKSArIDM7CisjaWZkZWYgRkVBVF9FTUFDU19UQUdTCisJaWYgKGlzX2V0YWcpCisJeworCSAgICBlYnVmX2xlbiA9IFNUUkxFTihzdC0+ZWJ1Zik7CisJICAgIGxlbiArPSAoaW50KWVidWZfbGVuICsgMTsKKwl9CisJZWxzZQorCSAgICArK2xlbjsKKyNlbmRpZgorCW1mcCA9IGFsbG9jKHNpemVvZihjaGFyX3UpICsgbGVuICsgMSk7CisJaWYgKG1mcCAhPSBOVUxMKQorCXsKKwkgICAgcCA9IG1mcDsKKwkgICAgcFswXSA9IG10dCArIDE7CisJICAgIFNUUkNQWShwICsgMSwgc3QtPnRhZ19mbmFtZSk7CisjaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCisJICAgIC8vIElnbm9yZSBkaWZmZXJlbmNlcyBpbiBzbGFzaGVzLCBhdm9pZCBhZGRpbmcKKwkgICAgLy8gYm90aCBwYXRoL2ZpbGUgYW5kIHBhdGhcZmlsZS4KKwkgICAgc2xhc2hfYWRqdXN0KHAgKyAxKTsKKyNlbmRpZgorCSAgICBwW3RhZ19mbmFtZV9sZW4gKyAxXSA9IFRBR19TRVA7CisJICAgIHMgPSBwICsgMSArIHRhZ19mbmFtZV9sZW4gKyAxOworI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUworCSAgICBpZiAoaXNfZXRhZykKKwkgICAgeworCQlTVFJDUFkocywgc3QtPmVidWYpOworCQlzW2VidWZfbGVuXSA9IFRBR19TRVA7CisJCXMgKz0gZWJ1Zl9sZW4gKyAxOworCSAgICB9CisJICAgIGVsc2UKKwkJKnMrKyA9IFRBR19TRVA7CisjZW5kaWYKKwkgICAgU1RSQ1BZKHMsIHN0LT5sYnVmKTsKKwl9CisgICAgfQorCisgICAgaWYgKG1mcCAhPSBOVUxMKQorICAgIHsKKwloYXNoaXRlbV9UCSpoaTsKKworCS8vIERvbid0IGFkZCBpZGVudGljYWwgbWF0Y2hlcy4KKwkvLyBBZGQgYWxsIGNzY29wZSB0YWdzLCBiZWNhdXNlIHRoZXkgYXJlIGFsbCBsaXN0ZWQuCisJLy8gIm1mcCIgaXMgdXNlZCBhcyBhIGhhc2gga2V5LCB0aGVyZSBpcyBhIE5VTCBieXRlIHRvIGVuZAorCS8vIHRoZSBwYXJ0IHRoYXQgbWF0dGVycyBmb3IgY29tcGFyaW5nLCBtb3JlIGJ5dGVzIG1heQorCS8vIGZvbGxvdyBhZnRlciBpdC4gIEUuZy4gaGVscCB0YWdzIHN0b3JlIHRoZSBwcmlvcml0eQorCS8vIGFmdGVyIHRoZSBOVUwuCisjaWZkZWYgRkVBVF9DU0NPUEUKKwlpZiAodXNlX2NzY29wZSkKKwkgICAgKysqaGFzaDsKKwllbHNlCisjZW5kaWYKKwkgICAgKmhhc2ggPSBoYXNoX2hhc2gobWZwKTsKKwloaSA9IGhhc2hfbG9va3VwKCZzdC0+aHRfbWF0Y2hbbXR0XSwgbWZwLCAqaGFzaCk7CisJaWYgKEhBU0hJVEVNX0VNUFRZKGhpKSkKKwl7CisJICAgIGlmIChoYXNoX2FkZF9pdGVtKCZzdC0+aHRfbWF0Y2hbbXR0XSwgaGksIG1mcCwgKmhhc2gpID09IEZBSUwKKwkJICAgIHx8IGdhX2dyb3coJnN0LT5nYV9tYXRjaFttdHRdLCAxKSAhPSBPSykKKwkgICAgeworCQkvLyBPdXQgb2YgbWVtb3J5ISBKdXN0IGZvcmdldCBhYm91dCB0aGUgcmVzdC4KKwkJc3QtPnN0b3Bfc2VhcmNoaW5nID0gVFJVRTsKKwkJcmV0dXJuIEZBSUw7CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCSgoY2hhcl91ICoqKShzdC0+Z2FfbWF0Y2hbbXR0XS5nYV9kYXRhKSkKKwkJICAgIFtzdC0+Z2FfbWF0Y2hbbXR0XS5nYV9sZW4rK10gPSBtZnA7CisJCXN0LT5tYXRjaF9jb3VudCsrOworCSAgICB9CisJfQorCWVsc2UKKwkgICAgLy8gZHVwbGljYXRlIHRhZywgZHJvcCBpdAorCSAgICB2aW1fZnJlZShtZnApOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworLyoKICAqIFNlYXJjaCBmb3IgdGFncyBtYXRjaGluZyAnc3QtPm9yZ3BhdC5wYXQnIGluIHRoZSAnc3QtPnRhZ19mbmFtZScgdGFncyBmaWxlLgogICogSW5mb3JtYXRpb24gbmVlZGVkIHRvIHNlYXJjaCBmb3IgdGhlIHRhZ3MgaXMgaW4gdGhlICdzdCcgc3RhdGUgc3RydWN0dXJlLgogICogVGhlIG1hdGNoaW5nIHRhZ3MgYXJlIHJldHVybmVkIGluICdzdCcuCkBAIC0xNjYyLDExICsyMjU4LDcgQEAKIHsKICAgICBGSUxFICAgICAgICpmcCA9IE5VTEw7CiAgICAgdGFncHRyc19UCXRhZ3A7Ci0gICAgaW50CQlpc19zdGF0aWM7CQkvLyBjdXJyZW50IHRhZyBsaW5lIGlzIHN0YXRpYwotICAgIGludAkJaXNfY3VycmVudDsJCS8vIGZpbGUgbmFtZSBtYXRjaGVzCiAgICAgaW50CQllb2YgPSBGQUxTRTsJCS8vIGZvdW5kIGVuZC1vZi1maWxlCi0gICAgY2hhcl91CSpwOwotICAgIGNoYXJfdQkqczsKICAgICBpbnQJCWk7CiAjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCiAgICAgaW50CQloZWxwX3ByaSA9IDA7CkBAIC0xNzA5LDI0ICsyMzAxLDggQEAKICAgICBpbnQJCW1hdGNoX3JlOwkvLyBtYXRjaCB3aXRoIHJlZ2V4cAogICAgIGludAkJbWF0Y2hvZmYgPSAwOwogCi0jaWZkZWYgRkVBVF9FTUFDU19UQUdTCi0gICAgLyoKLSAgICAgKiBTdGFjayBmb3IgaW5jbHVkZWQgZW1hY3MtdGFncyBmaWxlLgotICAgICAqIEl0IGhhcyBhIGZpeGVkIHNpemUsIHRvIHRydW5jYXRlIGN5Y2xpYyBpbmNsdWRlcy4gancKLSAgICAgKi8KLSMgZGVmaW5lIElOQ1NUQUNLX1NJWkUgNDIKLSAgICBzdHJ1Y3QKLSAgICB7Ci0JRklMRQkqZnA7Ci0JY2hhcl91CSpldGFnX2ZuYW1lOwotICAgIH0gaW5jc3RhY2tbSU5DU1RBQ0tfU0laRV07Ci0KLSAgICBpbnQJCWluY3N0YWNrX2lkeCA9IDA7CS8vIGluZGV4IGluIGluY3N0YWNrCiAgICAgaW50CQlpc19ldGFnOwkJLy8gY3VycmVudCBmaWxlIGlzIGVtYWNlcyBzdHlsZQotI2VuZGlmCiAKLSAgICBjaGFyX3UJKm1mcDsKLSAgICBpbnQJCW10dDsKICAgICBoYXNoX1QJaGFzaCA9IDA7CiAKICNpZmRlZiBGRUFUX1RBR19CSU5TCkBAIC0xNzM2LDEyICsyMzEyLDkgQEAKICNlbmRpZgogICAgIGludAkJbGluZV9lcnJvciA9IEZBTFNFOwkJLy8gc3ludGF4IGVycm9yCiAgICAgaW50CQloYXNfcmUgPSAoZmxhZ3MgJiBUQUdfUkVHRVhQKTsJLy8gcmVnZXhwIHVzZWQKLSAgICBpbnQJCWhlbHBfb25seSA9IChmbGFncyAmIFRBR19IRUxQKTsKLSAgICBpbnQJCW5hbWVfb25seSA9IChmbGFncyAmIFRBR19OQU1FUyk7CiAjaWZkZWYgRkVBVF9DU0NPUEUKICAgICBpbnQJCXVzZV9jc2NvcGUgPSAoZmxhZ3MgJiBUQUdfQ1NDT1BFKTsKICNlbmRpZgotICAgIGludAkJZ2V0X2l0X2FnYWluID0gRkFMU0U7CiAgICAgdmltY29udl9UCXZpbWNvbnY7CiAKICAgICB2aW1jb252LnZjX3R5cGUgPSBDT05WX05PTkU7CkBAIC0xNzUyLDEwICsyMzI1LDggQEAKICAgICBDTEVBUl9GSUVMRChzZWFyY2hfaW5mbyk7CiAjZW5kaWYKIAotICAgIC8qCi0gICAgICogQSBmaWxlIHRoYXQgZG9lc24ndCBleGlzdCBpcyBzaWxlbnRseSBpZ25vcmVkLiAgT25seSB3aGVuIG5vdCBhCi0gICAgICogc2luZ2xlIGZpbGUgaXMgZm91bmQsIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2l2ZW4gKGZ1cnRoZXIgb24pLgotICAgICAqLworICAgIC8vIEEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QgaXMgc2lsZW50bHkgaWdub3JlZC4gIE9ubHkgd2hlbiBub3QgYQorICAgIC8vIHNpbmdsZSBmaWxlIGlzIGZvdW5kLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdpdmVuIChmdXJ0aGVyIG9uKS4KICNpZmRlZiBGRUFUX0NTQ09QRQogICAgIGlmICh1c2VfY3Njb3BlKQogCWZwID0gTlVMTDsJICAgIC8vIGF2b2lkIEdDQyB3YXJuaW5nCkBAIC0xNzY1LDU1ICsyMzM2LDggQEAKICNpZmRlZiBGRUFUX01VTFRJX0xBTkcKIAlpZiAoY3VyYnVmLT5iX2hlbHApCiAJewotCSAgICAvLyBLZWVwIGVuIGlmIHRoZSBmaWxlIGV4dGVuc2lvbiBpcyAudHh0Ci0JICAgIGlmIChzdC0+aXNfdHh0KQotCQlTVFJDUFkoaGVscF9sYW5nLCAiZW4iKTsKLQkgICAgZWxzZQotCSAgICB7Ci0JCS8vIFByZWZlciBoZWxwIHRhZ3MgYWNjb3JkaW5nIHRvICdoZWxwbGFuZycuICBQdXQgdGhlCi0JCS8vIHR3by1sZXR0ZXIgbGFuZ3VhZ2UgbmFtZSBpbiBoZWxwX2xhbmdbXS4KLQkJaSA9IChpbnQpU1RSTEVOKHN0LT50YWdfZm5hbWUpOwotCQlpZiAoaSA+IDMgJiYgc3QtPnRhZ19mbmFtZVtpIC0gM10gPT0gJy0nKQotCQkgICAgU1RSQ1BZKGhlbHBfbGFuZywgc3QtPnRhZ19mbmFtZSArIGkgLSAyKTsKLQkJZWxzZQotCQkgICAgU1RSQ1BZKGhlbHBfbGFuZywgImVuIik7Ci0JICAgIH0KLQkgICAgLy8gV2hlbiBzZWFyY2hpbmcgZm9yIGEgc3BlY2lmaWMgbGFuZ3VhZ2Ugc2tpcCB0YWdzIGZpbGVzCi0JICAgIC8vIGZvciBvdGhlciBsYW5ndWFnZXMuCi0JICAgIGlmIChzdC0+aGVscF9sYW5nX2ZpbmQgIT0gTlVMTAotCQkgICAgJiYgU1RSSUNNUChoZWxwX2xhbmcsIHN0LT5oZWxwX2xhbmdfZmluZCkgIT0gMCkKKwkgICAgaWYgKCFmaW5kdGFnc19pbl9oZWxwX2luaXQoc3QsIGZsYWdzLCBoZWxwX2xhbmcsICZoZWxwX3ByaSkpCiAJCXJldHVybiBPSzsKLQotCSAgICAvLyBGb3IgQ1RSTC1dIGluIGEgaGVscCBmaWxlIHByZWZlciBhIG1hdGNoIHdpdGggdGhlIHNhbWUKLQkgICAgLy8gbGFuZ3VhZ2UuCi0JICAgIGlmICgoZmxhZ3MgJiBUQUdfS0VFUF9MQU5HKQotCQkgICAgJiYgc3QtPmhlbHBfbGFuZ19maW5kID09IE5VTEwKLQkJICAgICYmIGN1cmJ1Zi0+Yl9mbmFtZSAhPSBOVUxMCi0JCSAgICAmJiAoaSA9IChpbnQpU1RSTEVOKGN1cmJ1Zi0+Yl9mbmFtZSkpID4gNAotCQkgICAgJiYgY3VyYnVmLT5iX2ZuYW1lW2kgLSAxXSA9PSAneCcKLQkJICAgICYmIGN1cmJ1Zi0+Yl9mbmFtZVtpIC0gNF0gPT0gJy4nCi0JCSAgICAmJiBTVFJOSUNNUChjdXJidWYtPmJfZm5hbWUgKyBpIC0gMywgaGVscF9sYW5nLCAyKSA9PSAwKQotCQloZWxwX3ByaSA9IDA7Ci0JICAgIGVsc2UKLQkgICAgewotCQloZWxwX3ByaSA9IDE7Ci0JCWZvciAocyA9IHBfaGxnOyAqcyAhPSBOVUw7ICsrcykKLQkJewotCQkgICAgaWYgKFNUUk5JQ01QKHMsIGhlbHBfbGFuZywgMikgPT0gMCkKLQkJCWJyZWFrOwotCQkgICAgKytoZWxwX3ByaTsKLQkJICAgIGlmICgocyA9IHZpbV9zdHJjaHIocywgJywnKSkgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChzID09IE5VTEwgfHwgKnMgPT0gTlVMKQotCQl7Ci0JCSAgICAvLyBMYW5ndWFnZSBub3QgaW4gJ2hlbHBsYW5nJzogdXNlIGxhc3QsIHByZWZlciBFbmdsaXNoLAotCQkgICAgLy8gdW5sZXNzIGZvdW5kIGFscmVhZHkuCi0JCSAgICArK2hlbHBfcHJpOwotCQkgICAgaWYgKFNUUklDTVAoaGVscF9sYW5nLCAiZW4iKSAhPSAwKQotCQkJKytoZWxwX3ByaTsKLQkJfQotCSAgICB9CiAJfQogI2VuZGlmCiAKQEAgLTE4MjcsMTYgKzIzNTEsMTIgQEAKIAkgICAgdmVyYm9zZV9sZWF2ZSgpOwogCX0KICAgICB9Ci0gICAgc3QtPmRpZF9vcGVuID0gVFJVRTsgICAgLy8gcmVtZW1iZXIgdGhhdCB3ZSBmb3VuZCBhdCBsZWFzdCBvbmUgZmlsZQorICAgIHN0LT5kaWRfb3BlbiA9IFRSVUU7CS8vIHJlbWVtYmVyIHRoYXQgd2UgZm91bmQgYXQgbGVhc3Qgb25lIGZpbGUKIAotICAgIHN0YXRlID0gVFNfU1RBUlQ7ICAgLy8gd2UncmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlCi0jaWZkZWYgRkVBVF9FTUFDU19UQUdTCi0gICAgaXNfZXRhZyA9IDA7CSAgICAvLyBkZWZhdWx0IGlzOiBub3QgZW1hY3Mgc3R5bGUKLSNlbmRpZgorICAgIHN0YXRlID0gVFNfU1RBUlQ7CQkvLyB3ZSdyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUKKyAgICBpc19ldGFnID0gMDsJCS8vIGRlZmF1bHQgaXM6IG5vdCBlbWFjcyBzdHlsZQogCi0gICAgLyoKLSAgICAgKiBSZWFkIGFuZCBwYXJzZSB0aGUgbGluZXMgaW4gdGhlIGZpbGUgb25lIGJ5IG9uZQotICAgICAqLworICAgIC8vIFJlYWQgYW5kIHBhcnNlIHRoZSBsaW5lcyBpbiB0aGUgZmlsZSBvbmUgYnkgb25lCiAgICAgZm9yICg7OykKICAgICB7CiAjaWZkZWYgRkVBVF9UQUdfQklOUwpAQCAtMTg2MCwxMiArMjM4MCwxMCBAQAogCSAgICBzdC0+c3RvcF9zZWFyY2hpbmcgPSBUUlVFOwogCSAgICBicmVhazsKIAl9Ci0JaWYgKGdldF9pdF9hZ2FpbikKKwlpZiAoc3QtPmdldF9zZWFyY2hwYXQpCiAJICAgIGdvdG8gbGluZV9yZWFkX2luOwogI2lmZGVmIEZFQVRfVEFHX0JJTlMKLQkvKgotCSAqIEZvciBiaW5hcnkgc2VhcmNoOiBjb21wdXRlIHRoZSBuZXh0IG9mZnNldCB0byB1c2UuCi0JICovCisJLy8gRm9yIGJpbmFyeSBzZWFyY2g6IGNvbXB1dGUgdGhlIG5leHQgb2Zmc2V0IHRvIHVzZS4KIAlpZiAoc3RhdGUgPT0gVFNfQklOQVJZKQogCXsKIAkgICAgb2Zmc2V0ID0gc2VhcmNoX2luZm8ubG93X29mZnNldCArICgoc2VhcmNoX2luZm8uaGlnaF9vZmZzZXQKQEAgLTE5NTIsNTAgKzI0NzAsMjEgQEAKIAkgICAgaWYgKGVvZikKIAkgICAgewogI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUwotCQlpZiAoaW5jc3RhY2tfaWR4KQkvLyB0aGlzIHdhcyBhbiBpbmNsdWRlZCBmaWxlCisJCWlmIChlbWFjc190YWdzX2ZpbGVfZW9mKHN0LCAmZnApID09IFRSVUUpCiAJCXsKLQkJICAgIC0taW5jc3RhY2tfaWR4OwotCQkgICAgZmNsb3NlKGZwKTsJLy8gZW5kIG9mIHRoaXMgZmlsZSAuLi4KLQkJICAgIGZwID0gaW5jc3RhY2tbaW5jc3RhY2tfaWR4XS5mcDsKLQkJICAgIFNUUkNQWShzdC0+dGFnX2ZuYW1lLCBpbmNzdGFja1tpbmNzdGFja19pZHhdLmV0YWdfZm5hbWUpOwotCQkgICAgdmltX2ZyZWUoaW5jc3RhY2tbaW5jc3RhY2tfaWR4XS5ldGFnX2ZuYW1lKTsKKwkJICAgIC8vIGFuIGluY2x1ZGVkIHRhZ3MgZmlsZS4gQ29udGludWUgcHJvY2Vzc2luZyB0aGUgcGFyZW50CisJCSAgICAvLyB0YWdzIGZpbGUuCiAJCSAgICBpc19ldGFnID0gMTsJLy8gKG9ubHkgZXRhZ3MgY2FuIGluY2x1ZGUpCi0JCSAgICBjb250aW51ZTsJLy8gLi4uIGNvbnRpbnVlIHdpdGggcGFyZW50IGZpbGUKKwkJICAgIGNvbnRpbnVlOwogCQl9Ci0JCWVsc2UKICNlbmRpZgotCQkgICAgYnJlYWs7CQkJICAgIC8vIGVuZCBvZiBmaWxlCisJCWJyZWFrOwkJCS8vIGVuZCBvZiBmaWxlCiAJICAgIH0KIAl9CiBsaW5lX3JlYWRfaW46CiAKIAlpZiAodmltY29udi52Y190eXBlICE9IENPTlZfTk9ORSkKLQl7Ci0JICAgIGNoYXJfdQkqY29udl9saW5lOwotCSAgICBpbnQJbGVuOwotCi0JICAgIC8vIENvbnZlcnQgZXZlcnkgbGluZS4gIENvbnZlcnRpbmcgdGhlIHBhdHRlcm4gZnJvbSAnZW5jJyB0bwotCSAgICAvLyB0aGUgdGFncyBmaWxlIGVuY29kaW5nIGRvZXNuJ3Qgd29yaywgYmVjYXVzZSBjaGFyYWN0ZXJzIGFyZQotCSAgICAvLyBub3QgcmVjb2duaXplZC4KLQkgICAgY29udl9saW5lID0gc3RyaW5nX2NvbnZlcnQoJnZpbWNvbnYsIHN0LT5sYnVmLCBOVUxMKTsKLQkgICAgaWYgKGNvbnZfbGluZSAhPSBOVUxMKQotCSAgICB7Ci0JCS8vIENvcHkgb3Igc3dhcCBsYnVmIGFuZCBjb252X2xpbmUuCi0JCWxlbiA9IChpbnQpU1RSTEVOKGNvbnZfbGluZSkgKyAxOwotCQlpZiAobGVuID4gc3QtPmxidWZfc2l6ZSkKLQkJewotCQkgICAgdmltX2ZyZWUoc3QtPmxidWYpOwotCQkgICAgc3QtPmxidWYgPSBjb252X2xpbmU7Ci0JCSAgICBzdC0+bGJ1Zl9zaXplID0gbGVuOwotCQl9Ci0JCWVsc2UKLQkJewotCQkgICAgU1RSQ1BZKHN0LT5sYnVmLCBjb252X2xpbmUpOwotCQkgICAgdmltX2ZyZWUoY29udl9saW5lKTsKLQkJfQotCSAgICB9Ci0JfQotCisJICAgIGZpbmR0YWdzX3N0cmluZ19jb252ZXJ0KHN0LCAmdmltY29udik7CiAKICNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKIAkvKgpAQCAtMjAxMSw1NiArMjUwMCw3IEBACiAJewogCSAgICBpc19ldGFnID0gMTsJCS8vIGluIGNhc2UgYXQgdGhlIHN0YXJ0CiAJICAgIHN0YXRlID0gVFNfTElORUFSOwotCSAgICBpZiAoIXZpbV9mZ2V0cyhzdC0+ZWJ1ZiwgTFNJWkUsIGZwKSkKLQkgICAgewotCQlmb3IgKHAgPSBzdC0+ZWJ1ZjsgKnAgJiYgKnAgIT0gJywnOyBwKyspCi0JCSAgICA7Ci0JCSpwID0gTlVMOwotCi0JCS8qCi0JCSAqIGF0b2kocCsxKSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJlZm9yZSB0aGUgbmV4dCBeTAotCQkgKiB1bmxlc3MgaXQgaXMgYW4gaW5jbHVkZSBzdGF0ZW1lbnQuCi0JCSAqLwotCQlpZiAoU1RSTkNNUChwICsgMSwgImluY2x1ZGUiLCA3KSA9PSAwCi0JCQkmJiBpbmNzdGFja19pZHggPCBJTkNTVEFDS19TSVpFKQotCQl7Ci0JCSAgICAvLyBTYXZlIGN1cnJlbnQgImZwIiBhbmQgInRhZ19mbmFtZSIgaW4gdGhlIHN0YWNrLgotCQkgICAgaWYgKChpbmNzdGFja1tpbmNzdGFja19pZHhdLmV0YWdfZm5hbWUgPQotCQkJCXZpbV9zdHJzYXZlKHN0LT50YWdfZm5hbWUpKSAhPSBOVUxMKQotCQkgICAgewotCQkJY2hhcl91ICpmdWxscGF0aF9lYnVmOwotCi0JCQlpbmNzdGFja1tpbmNzdGFja19pZHhdLmZwID0gZnA7Ci0JCQlmcCA9IE5VTEw7Ci0KLQkJCS8vIEZpZ3VyZSBvdXQgInRhZ19mbmFtZSIgYW5kICJmcCIgdG8gdXNlIGZvcgotCQkJLy8gaW5jbHVkZWQgZmlsZS4KLQkJCWZ1bGxwYXRoX2VidWYgPSBleHBhbmRfdGFnX2ZuYW1lKHN0LT5lYnVmLAotCQkJCXN0LT50YWdfZm5hbWUsIEZBTFNFKTsKLQkJCWlmIChmdWxscGF0aF9lYnVmICE9IE5VTEwpCi0JCQl7Ci0JCQkgICAgZnAgPSBtY2hfZm9wZW4oKGNoYXIgKilmdWxscGF0aF9lYnVmLCAiciIpOwotCQkJICAgIGlmIChmcCAhPSBOVUxMKQotCQkJICAgIHsKLQkJCQlpZiAoU1RSTEVOKGZ1bGxwYXRoX2VidWYpID4gTFNJWkUpCi0JCQkJICAgIHNlbXNnKF8oZV90YWdfZmlsZV9wYXRoX3RydW5jYXRlZF9mb3Jfc3RyKSwgc3QtPmVidWYpOwotCQkJCXZpbV9zdHJuY3B5KHN0LT50YWdfZm5hbWUsIGZ1bGxwYXRoX2VidWYsCi0JCQkJCU1BWFBBVEhMKTsKLQkJCQkrK2luY3N0YWNrX2lkeDsKLQkJCQlpc19ldGFnID0gMDsgLy8gd2UgY2FuIGluY2x1ZGUgYW55dGhpbmcKLQkJCSAgICB9Ci0JCQkgICAgdmltX2ZyZWUoZnVsbHBhdGhfZWJ1Zik7Ci0JCQl9Ci0JCQlpZiAoZnAgPT0gTlVMTCkKLQkJCXsKLQkJCSAgICAvLyBDYW4ndCBvcGVuIHRoZSBpbmNsdWRlZCBmaWxlLCBza2lwIGl0IGFuZAotCQkJICAgIC8vIHJlc3RvcmUgb2xkIHZhbHVlIG9mICJmcCIuCi0JCQkgICAgZnAgPSBpbmNzdGFja1tpbmNzdGFja19pZHhdLmZwOwotCQkJICAgIHZpbV9mcmVlKGluY3N0YWNrW2luY3N0YWNrX2lkeF0uZXRhZ19mbmFtZSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQorCSAgICBmcCA9IGVtYWNzX3RhZ3NfbmV3X2ZpbGVuYW1lKHN0LCBmcCwgJmlzX2V0YWcpOwogCSAgICBjb250aW51ZTsKIAl9CiAjZW5kaWYKQEAgLTIwNzYsMjkgKzI1MTYsMTEgQEAKIAkgICAgaWYgKFNUUk5DTVAoc3QtPmxidWYsICIhX1RBR18iLCA2KSA8PSAwCiAJCSAgICB8fCAoc3QtPmxidWZbMF0gPT0gJyEnICYmIEFTQ0lJX0lTTE9XRVIoc3QtPmxidWZbMV0pKSkKIAkgICAgewotCQlpZiAoU1RSTkNNUChzdC0+bGJ1ZiwgIiFfVEFHXyIsIDYpICE9IDApCi0JCSAgICAvLyBOb24taGVhZGVyIGl0ZW0gYmVmb3JlIHRoZSBoZWFkZXIsIGUuZy4gIiEiIGl0c2VsZi4KLQkJICAgIGdvdG8gcGFyc2VfbGluZTsKKwkJaWYgKHRhZ3NfZmlsZV9oZHJfcGFyc2Uoc3QsICZ2aW1jb252LCAmdGFnX2ZpbGVfc29ydGVkKSkKKwkJICAgIC8vIFJlYWQgdGhlIG5leHQgbGluZS4gIFVucmVjb2duaXplZCBmbGFncyBhcmUgaWdub3JlZC4KKwkJICAgIGNvbnRpbnVlOwogCi0JCS8qCi0JCSAqIFJlYWQgaGVhZGVyIGxpbmUuCi0JCSAqLwotI2lmZGVmIEZFQVRfVEFHX0JJTlMKLQkJaWYgKFNUUk5DTVAoc3QtPmxidWYsICIhX1RBR19GSUxFX1NPUlRFRFx0IiwgMTgpID09IDApCi0JCSAgICB0YWdfZmlsZV9zb3J0ZWQgPSBzdC0+bGJ1ZlsxOF07Ci0jZW5kaWYKLQkJaWYgKFNUUk5DTVAoc3QtPmxidWYsICIhX1RBR19GSUxFX0VOQ09ESU5HXHQiLCAyMCkgPT0gMCkKLQkJewotCQkgICAgLy8gUHJlcGFyZSB0byBjb252ZXJ0IGV2ZXJ5IGxpbmUgZnJvbSB0aGUgc3BlY2lmaWVkCi0JCSAgICAvLyBlbmNvZGluZyB0byAnZW5jb2RpbmcnLgotCQkgICAgZm9yIChwID0gc3QtPmxidWYgKyAyMDsgKnAgPiAnICcgJiYgKnAgPCAxMjc7ICsrcCkKLQkJCTsKLQkJICAgICpwID0gTlVMOwotCQkgICAgY29udmVydF9zZXR1cCgmdmltY29udiwgc3QtPmxidWYgKyAyMCwgcF9lbmMpOwotCQl9Ci0KLQkJLy8gUmVhZCB0aGUgbmV4dCBsaW5lLiAgVW5yZWNvZ25pemVkIGZsYWdzIGFyZSBpZ25vcmVkLgotCQljb250aW51ZTsKKwkJZ290byBwYXJzZV9saW5lOwogCSAgICB9CiAKIAkgICAgLy8gSGVhZGVycyBlbmRzLgpAQCAtMjMzOCwxMSArMjc2MCwxMyBAQAogCSAgICAgKi8KIAkgICAgdGFncC5mbmFtZSA9IHRhZ3AudGFnbmFtZV9lbmQgKyAxOwogCSAgICB0YWdwLmZuYW1lX2VuZCA9IHZpbV9zdHJjaHIodGFncC5mbmFtZSwgVEFCKTsKLQkgICAgdGFncC5jb21tYW5kID0gdGFncC5mbmFtZV9lbmQgKyAxOwogCSAgICBpZiAodGFncC5mbmFtZV9lbmQgPT0gTlVMTCkKIAkJaSA9IEZBSUw7CiAJICAgIGVsc2UKKwkgICAgeworCQl0YWdwLmNvbW1hbmQgPSB0YWdwLmZuYW1lX2VuZCArIDE7CiAJCWkgPSBPSzsKKwkgICAgfQogCX0KIAllbHNlCiAJICAgIGkgPSBwYXJzZV90YWdfbGluZShzdC0+bGJ1ZiwKQEAgLTI0MDksMjI2ICsyODMzLDE5IEBACiAJICAgIG1hdGNoX3JlID0gVFJVRTsKIAl9CiAKLQkvKgotCSAqIElmIGEgbWF0Y2ggaXMgZm91bmQsIGFkZCBpdCB0byBodF9tYXRjaFtdIGFuZCBnYV9tYXRjaFtdLgotCSAqLworCS8vIElmIGEgbWF0Y2ggaXMgZm91bmQsIGFkZCBpdCB0byBodF9tYXRjaFtdIGFuZCBnYV9tYXRjaFtdLgogCWlmIChtYXRjaCkKIAl7Ci0JICAgIGludCBsZW4gPSAwOwotCi0jaWZkZWYgRkVBVF9DU0NPUEUKLQkgICAgaWYgKHVzZV9jc2NvcGUpCi0JICAgIHsKLQkJLy8gRG9uJ3QgY2hhbmdlIHRoZSBvcmRlcmluZywgYWx3YXlzIHVzZSB0aGUgc2FtZSB0YWJsZS4KLQkJbXR0ID0gTVRfR0xfT1RIOwotCSAgICB9Ci0JICAgIGVsc2UKLSNlbmRpZgotCSAgICB7Ci0JCS8vIERlY2lkZSBpbiB3aGljaCBhcnJheSB0byBzdG9yZSB0aGlzIG1hdGNoLgotCQlpc19jdXJyZW50ID0gdGVzdF9mb3JfY3VycmVudCgKLSNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKKwkgICAgaWYgKGZpbmR0YWdzX2FkZF9tYXRjaChzdCwgJnRhZ3AsIGJ1Zl9mZm5hbWUsIGZsYWdzLCAmaGFzaCwKKwkJCW1hdGNoX3JlLCBtYXRjaF9ub19pYywgbWF0Y2hvZmYsCiAJCQlpc19ldGFnLAotI2VuZGlmCi0JCQl0YWdwLmZuYW1lLCB0YWdwLmZuYW1lX2VuZCwgc3QtPnRhZ19mbmFtZSwKLQkJCWJ1Zl9mZm5hbWUpOwotI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUwotCQlpc19zdGF0aWMgPSBGQUxTRTsKLQkJaWYgKCFpc19ldGFnKQkvLyBlbWFjcyB0YWdzIGFyZSBuZXZlciBzdGF0aWMKLSNlbmRpZgotCQkgICAgaXNfc3RhdGljID0gdGVzdF9mb3Jfc3RhdGljKCZ0YWdwKTsKLQotCQkvLyBkZWNpZGUgaW4gd2hpY2ggb2YgdGhlIHNpeHRlZW4gdGFibGVzIHRvIHN0b3JlIHRoaXMKLQkJLy8gbWF0Y2gKLQkJaWYgKGlzX3N0YXRpYykKLQkJewotCQkgICAgaWYgKGlzX2N1cnJlbnQpCi0JCQltdHQgPSBNVF9TVF9DVVI7Ci0JCSAgICBlbHNlCi0JCQltdHQgPSBNVF9TVF9PVEg7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCSAgICBpZiAoaXNfY3VycmVudCkKLQkJCW10dCA9IE1UX0dMX0NVUjsKLQkJICAgIGVsc2UKLQkJCW10dCA9IE1UX0dMX09USDsKLQkJfQotCQlpZiAoc3QtPm9yZ3BhdC5yZWdtYXRjaC5ybV9pYyAmJiAhbWF0Y2hfbm9faWMpCi0JCSAgICBtdHQgKz0gTVRfSUNfT0ZGOwotCQlpZiAobWF0Y2hfcmUpCi0JCSAgICBtdHQgKz0gTVRfUkVfT0ZGOwotCSAgICB9Ci0KLQkgICAgLyoKLQkgICAgICogQWRkIHRoZSBmb3VuZCBtYXRjaCBpbiBodF9tYXRjaFttdHRdIGFuZCBnYV9tYXRjaFttdHRdLgotCSAgICAgKiBTdG9yZSB0aGUgaW5mbyB3ZSBuZWVkIGxhdGVyLCB3aGljaCBkZXBlbmRzIG9uIHRoZSBraW5kIG9mCi0JICAgICAqIHRhZ3Mgd2UgYXJlIGRlYWxpbmcgd2l0aC4KLQkgICAgICovCi0JICAgIGlmIChoZWxwX29ubHkpCi0JICAgIHsKICNpZmRlZiBGRUFUX01VTFRJX0xBTkcKLSMgZGVmaW5lIE1MX0VYVFJBIDMKKwkJCWhlbHBfbGFuZywgaGVscF9wcmkKICNlbHNlCi0jIGRlZmluZSBNTF9FWFRSQSAwCisJCQkoY2hhcl91ICopIiIsIDAKICNlbmRpZgotCQkvKgotCQkgKiBBcHBlbmQgdGhlIGhlbHAtaGV1cmlzdGljIG51bWJlciBhZnRlciB0aGUgdGFnbmFtZSwgZm9yCi0JCSAqIHNvcnRpbmcgaXQgbGF0ZXIuICBUaGUgaGV1cmlzdGljIGlzIGlnbm9yZWQgZm9yCi0JCSAqIGRldGVjdGluZyBkdXBsaWNhdGVzLgotCQkgKiBUaGUgZm9ybWF0IGlzIHt0YWduYW1lfUB7bGFuZ31OVUx7aGV1cmlzdGljfU5VTAotCQkgKi8KLQkJKnRhZ3AudGFnbmFtZV9lbmQgPSBOVUw7Ci0JCWxlbiA9IChpbnQpKHRhZ3AudGFnbmFtZV9lbmQgLSB0YWdwLnRhZ25hbWUpOwotCQltZnAgPSBhbGxvYyhzaXplb2YoY2hhcl91KSArIGxlbiArIDEwICsgTUxfRVhUUkEgKyAxKTsKLQkJaWYgKG1mcCAhPSBOVUxMKQotCQl7Ci0JCSAgICBpbnQgaGV1cmlzdGljOwotCi0JCSAgICBwID0gbWZwOwotCQkgICAgU1RSQ1BZKHAsIHRhZ3AudGFnbmFtZSk7Ci0jaWZkZWYgRkVBVF9NVUxUSV9MQU5HCi0JCSAgICBwW2xlbl0gPSAnQCc7Ci0JCSAgICBTVFJDUFkocCArIGxlbiArIDEsIGhlbHBfbGFuZyk7Ci0jZW5kaWYKLQotCQkgICAgaGV1cmlzdGljID0gaGVscF9oZXVyaXN0aWModGFncC50YWduYW1lLAotCQkJICAgIG1hdGNoX3JlID8gbWF0Y2hvZmYgOiAwLCAhbWF0Y2hfbm9faWMpOwotI2lmZGVmIEZFQVRfTVVMVElfTEFORwotCQkgICAgaGV1cmlzdGljICs9IGhlbHBfcHJpOwotI2VuZGlmCi0JCSAgICBzcHJpbnRmKChjaGFyICopcCArIGxlbiArIDEgKyBNTF9FWFRSQSwgIiUwNmQiLAotCQkJICAgIGhldXJpc3RpYyk7Ci0JCX0KLQkJKnRhZ3AudGFnbmFtZV9lbmQgPSBUQUI7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAobmFtZV9vbmx5KQotCSAgICB7Ci0JCWlmIChnZXRfaXRfYWdhaW4pCi0JCXsKLQkJICAgIGNoYXJfdSAqdGVtcF9lbmQgPSB0YWdwLmNvbW1hbmQ7Ci0KLQkJICAgIGlmICgqdGVtcF9lbmQgPT0gJy8nKQotCQkJd2hpbGUgKCp0ZW1wX2VuZCAmJiAqdGVtcF9lbmQgIT0gJ1xyJwotCQkJCSYmICp0ZW1wX2VuZCAhPSAnXG4nCi0JCQkJJiYgKnRlbXBfZW5kICE9ICckJykKLQkJCSAgICB0ZW1wX2VuZCsrOwotCi0JCSAgICBpZiAodGFncC5jb21tYW5kICsgMiA8IHRlbXBfZW5kKQotCQkgICAgewotCQkJbGVuID0gKGludCkodGVtcF9lbmQgLSB0YWdwLmNvbW1hbmQgLSAyKTsKLQkJCW1mcCA9IGFsbG9jKGxlbiArIDIpOwotCQkJaWYgKG1mcCAhPSBOVUxMKQotCQkJICAgIHZpbV9zdHJuY3B5KG1mcCwgdGFncC5jb21tYW5kICsgMiwgbGVuKTsKLQkJICAgIH0KLQkJICAgIGVsc2UKLQkJCW1mcCA9IE5VTEw7Ci0JCSAgICBnZXRfaXRfYWdhaW4gPSBGQUxTRTsKLQkJfQotCQllbHNlCi0JCXsKLQkJICAgIGxlbiA9IChpbnQpKHRhZ3AudGFnbmFtZV9lbmQgLSB0YWdwLnRhZ25hbWUpOwotCQkgICAgbWZwID0gYWxsb2Moc2l6ZW9mKGNoYXJfdSkgKyBsZW4gKyAxKTsKLQkJICAgIGlmIChtZnAgIT0gTlVMTCkKLQkJCXZpbV9zdHJuY3B5KG1mcCwgdGFncC50YWduYW1lLCBsZW4pOwotCi0JCSAgICAvLyBpZiB3YW50ZWQsIHJlLXJlYWQgbGluZSB0byBnZXQgbG9uZyBmb3JtIHRvbwotCQkgICAgaWYgKFN0YXRlICYgSU5TRVJUKQotCQkJZ2V0X2l0X2FnYWluID0gcF9zZnQ7Ci0JCX0KLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJc2l6ZV90IHRhZ19mbmFtZV9sZW4gPSBTVFJMRU4oc3QtPnRhZ19mbmFtZSk7Ci0jaWZkZWYgRkVBVF9FTUFDU19UQUdTCi0JCXNpemVfdCBlYnVmX2xlbiA9IDA7Ci0jZW5kaWYKLQotCQkvLyBTYXZlIHRoZSB0YWcgaW4gYSBidWZmZXIuCi0JCS8vIFVzZSAweDAyIHRvIHNlcGFyYXRlIGZpZWxkcyAoQ2FuJ3QgdXNlIE5VTCBiZWNhdXNlIHRoZQotCQkvLyBoYXNoIGtleSBpcyB0ZXJtaW5hdGVkIGJ5IE5VTCwgb3IgQ3RybF9BIGJlY2F1c2UgdGhhdCBpcwotCQkvLyBwYXJ0IG9mIHNvbWUgRW1hY3MgdGFnIGZpbGVzIC0tIHNlZSBwYXJzZV90YWdfbGluZSkuCi0JCS8vIEVtYWNzIHRhZzogPG10dD48dGFnX2ZuYW1lPjwweDAyPjxlYnVmPjwweDAyPjxsYnVmPjxOVUw+Ci0JCS8vIG90aGVyIHRhZzogPG10dD48dGFnX2ZuYW1lPjwweDAyPjwweDAyPjxsYnVmPjxOVUw+Ci0JCS8vIHdpdGhvdXQgRW1hY3MgdGFnczogPG10dD48dGFnX2ZuYW1lPjwweDAyPjxsYnVmPjxOVUw+Ci0JCS8vIEhlcmUgPG10dD4gaXMgdGhlICJtdHQiIHZhbHVlIHBsdXMgMSB0byBhdm9pZCBOVUwuCi0JCWxlbiA9IChpbnQpdGFnX2ZuYW1lX2xlbiArIChpbnQpU1RSTEVOKHN0LT5sYnVmKSArIDM7Ci0jaWZkZWYgRkVBVF9FTUFDU19UQUdTCi0JCWlmIChpc19ldGFnKQotCQl7Ci0JCSAgICBlYnVmX2xlbiA9IFNUUkxFTihzdC0+ZWJ1Zik7Ci0JCSAgICBsZW4gKz0gKGludCllYnVmX2xlbiArIDE7Ci0JCX0KLQkJZWxzZQotCQkgICAgKytsZW47Ci0jZW5kaWYKLQkJbWZwID0gYWxsb2Moc2l6ZW9mKGNoYXJfdSkgKyBsZW4gKyAxKTsKLQkJaWYgKG1mcCAhPSBOVUxMKQotCQl7Ci0JCSAgICBwID0gbWZwOwotCQkgICAgcFswXSA9IG10dCArIDE7Ci0JCSAgICBTVFJDUFkocCArIDEsIHN0LT50YWdfZm5hbWUpOwotI2lmZGVmIEJBQ0tTTEFTSF9JTl9GSUxFTkFNRQotCQkgICAgLy8gSWdub3JlIGRpZmZlcmVuY2VzIGluIHNsYXNoZXMsIGF2b2lkIGFkZGluZwotCQkgICAgLy8gYm90aCBwYXRoL2ZpbGUgYW5kIHBhdGhcZmlsZS4KLQkJICAgIHNsYXNoX2FkanVzdChwICsgMSk7Ci0jZW5kaWYKLQkJICAgIHBbdGFnX2ZuYW1lX2xlbiArIDFdID0gVEFHX1NFUDsKLQkJICAgIHMgPSBwICsgMSArIHRhZ19mbmFtZV9sZW4gKyAxOwotI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUwotCQkgICAgaWYgKGlzX2V0YWcpCi0JCSAgICB7Ci0JCQlTVFJDUFkocywgc3QtPmVidWYpOwotCQkJc1tlYnVmX2xlbl0gPSBUQUdfU0VQOwotCQkJcyArPSBlYnVmX2xlbiArIDE7Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0JCQkqcysrID0gVEFHX1NFUDsKLSNlbmRpZgotCQkgICAgU1RSQ1BZKHMsIHN0LT5sYnVmKTsKLQkJfQotCSAgICB9Ci0KLQkgICAgaWYgKG1mcCAhPSBOVUxMKQotCSAgICB7Ci0JCWhhc2hpdGVtX1QJKmhpOwotCi0JCS8qCi0JCSAqIERvbid0IGFkZCBpZGVudGljYWwgbWF0Y2hlcy4KLQkJICogQWRkIGFsbCBjc2NvcGUgdGFncywgYmVjYXVzZSB0aGV5IGFyZSBhbGwgbGlzdGVkLgotCQkgKiAibWZwIiBpcyB1c2VkIGFzIGEgaGFzaCBrZXksIHRoZXJlIGlzIGEgTlVMIGJ5dGUgdG8gZW5kCi0JCSAqIHRoZSBwYXJ0IHRoYXQgbWF0dGVycyBmb3IgY29tcGFyaW5nLCBtb3JlIGJ5dGVzIG1heQotCQkgKiBmb2xsb3cgYWZ0ZXIgaXQuICBFLmcuIGhlbHAgdGFncyBzdG9yZSB0aGUgcHJpb3JpdHkKLQkJICogYWZ0ZXIgdGhlIE5VTC4KLQkJICovCi0jaWZkZWYgRkVBVF9DU0NPUEUKLQkJaWYgKHVzZV9jc2NvcGUpCi0JCSAgICBoYXNoKys7Ci0JCWVsc2UKLSNlbmRpZgotCQkgICAgaGFzaCA9IGhhc2hfaGFzaChtZnApOwotCQloaSA9IGhhc2hfbG9va3VwKCZzdC0+aHRfbWF0Y2hbbXR0XSwgbWZwLCBoYXNoKTsKLQkJaWYgKEhBU0hJVEVNX0VNUFRZKGhpKSkKLQkJewotCQkgICAgaWYgKGhhc2hfYWRkX2l0ZW0oJnN0LT5odF9tYXRjaFttdHRdLCBoaSwgbWZwLCBoYXNoKQotCQkJICAgID09IEZBSUwKLQkJCSAgICB8fCBnYV9ncm93KCZzdC0+Z2FfbWF0Y2hbbXR0XSwgMSkgIT0gT0spCi0JCSAgICB7Ci0JCQkvLyBPdXQgb2YgbWVtb3J5ISBKdXN0IGZvcmdldCBhYm91dCB0aGUgcmVzdC4KLQkJCXN0LT5zdG9wX3NlYXJjaGluZyA9IFRSVUU7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJICAgIGVsc2UKLQkJICAgIHsKLQkJCSgoY2hhcl91ICoqKShzdC0+Z2FfbWF0Y2hbbXR0XS5nYV9kYXRhKSkKLQkJCSAgICBbc3QtPmdhX21hdGNoW210dF0uZ2FfbGVuKytdID0gbWZwOwotCQkJc3QtPm1hdGNoX2NvdW50Kys7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZQotCQkgICAgLy8gZHVwbGljYXRlIHRhZywgZHJvcCBpdAotCQkgICAgdmltX2ZyZWUobWZwKTsKLQkgICAgfQorCQkJKSA9PSBGQUlMKQorCQlicmVhazsKIAl9CiAjaWZkZWYgRkVBVF9DU0NPUEUKIAlpZiAodXNlX2NzY29wZSAmJiBlb2YpCkBAIC0yNjUyLDEyICsyODY5LDcgQEAKICNlbmRpZgogCWZjbG9zZShmcCk7CiAjaWZkZWYgRkVBVF9FTUFDU19UQUdTCi0gICAgd2hpbGUgKGluY3N0YWNrX2lkeCkKLSAgICB7Ci0JLS1pbmNzdGFja19pZHg7Ci0JZmNsb3NlKGluY3N0YWNrW2luY3N0YWNrX2lkeF0uZnApOwotCXZpbV9mcmVlKGluY3N0YWNrW2luY3N0YWNrX2lkeF0uZXRhZ19mbmFtZSk7Ci0gICAgfQorICAgIGVtYWNzX3RhZ3NfaW5jc3RhY2tfZnJlZSgpOwogI2VuZGlmCiAgICAgaWYgKHZpbWNvbnYudmNfdHlwZSAhPSBDT05WX05PTkUpCiAJY29udmVydF9zZXR1cCgmdmltY29udiwgTlVMTCwgTlVMTCk7CkBAIC0yNjg3LDggKzI4OTksNyBAQAogZmluZHRhZ3NfY29weV9tYXRjaGVzKAogICAgIGZpbmR0YWdzX3N0YXRlX1QJKnN0LAogICAgIGNoYXJfdQkJKioqbWF0Y2hlc3AsCi0gICAgaW50CQkJKm51bV9tYXRjaGVzLAotICAgIGludAkJCW5hbWVfb25seSkKKyAgICBpbnQJCQkqbnVtX21hdGNoZXMpCiB7CiAgICAgY2hhcl91CSoqbWF0Y2hlczsKICAgICBpbnQJCW10dDsKQEAgLTI3MTAsNyArMjkyMSw3IEBACiAJCXZpbV9mcmVlKG1mcCk7CiAJICAgIGVsc2UKIAkgICAgewotCQlpZiAoIW5hbWVfb25seSkKKwkJaWYgKCFzdC0+bmFtZV9vbmx5KQogCQl7CiAJCSAgICAvLyBDaGFuZ2UgbXR0IGJhY2sgdG8gemVyby1iYXNlZC4KIAkJICAgICptZnAgPSAqbWZwIC0gMTsKQEAgLTI3ODksMTYgKzMwMDAsMTEgQEAKIAkJCQkJCS8vIGZpbmQgYWxsIG1hdGNoaW5nIHRhZ3MKICNlbmRpZgogICAgIGludAkJaGFzX3JlID0gKGZsYWdzICYgVEFHX1JFR0VYUCk7CS8vIHJlZ2V4cCB1c2VkCi0gICAgaW50CQloZWxwX29ubHkgPSAoZmxhZ3MgJiBUQUdfSEVMUCk7Ci0gICAgaW50CQluYW1lX29ubHkgPSAoZmxhZ3MgJiBUQUdfTkFNRVMpOwogICAgIGludAkJbm9pYyA9IChmbGFncyAmIFRBR19OT0lDKTsKICNpZmRlZiBGRUFUX0NTQ09QRQogICAgIGludAkJdXNlX2NzY29wZSA9IChmbGFncyAmIFRBR19DU0NPUEUpOwogI2VuZGlmCiAgICAgaW50CQl2ZXJib3NlID0gKGZsYWdzICYgVEFHX1ZFUkJPU0UpOwotI2lmZGVmIEZFQVRfRVZBTAotICAgIGludCAgICAgICAgIHVzZV90ZnUgPSAoKGZsYWdzICYgVEFHX05PX1RBR0ZVTkMpID09IDApOwotI2VuZGlmCiAgICAgaW50CQlzYXZlX3BfaWMgPSBwX2ljOwogCiAgICAgLyoKQEAgLTI4MTYsNyArMzAyMiw3IEBACiAKICAgICBoZWxwX3NhdmUgPSBjdXJidWYtPmJfaGVscDsKIAotICAgIGlmIChmaW5kdGFnc19zdGF0ZV9pbml0KCZzdCwgcGF0LCBtaW5jb3VudCkgPT0gRkFJTCkKKyAgICBpZiAoZmluZHRhZ3Nfc3RhdGVfaW5pdCgmc3QsIHBhdCwgZmxhZ3MsIG1pbmNvdW50KSA9PSBGQUlMKQogCWdvdG8gZmluZHRhZ19lbmQ7CiAKICNpZmRlZiBGRUFUX0NTQ09QRQpAQCAtMjgyNiwxMyArMzAzMiwxMyBAQAogICAgIC8qCiAgICAgICogSW5pdGlhbGl6ZSBhIGZldyB2YXJpYWJsZXMKICAgICAgKi8KLSAgICBpZiAoaGVscF9vbmx5KQkJCQkvLyB3YW50IHRhZ3MgZnJvbSBoZWxwIGZpbGUKKyAgICBpZiAoc3QuaGVscF9vbmx5KQkJCQkvLyB3YW50IHRhZ3MgZnJvbSBoZWxwIGZpbGUKIAljdXJidWYtPmJfaGVscCA9IFRSVUU7CQkJLy8gd2lsbCBiZSByZXN0b3JlZCBsYXRlcgogI2lmZGVmIEZFQVRfQ1NDT1BFCiAgICAgZWxzZSBpZiAodXNlX2NzY29wZSkKICAgICB7CiAJLy8gTWFrZSBzdXJlIHdlIGRvbid0IG1peCBoZWxwIGFuZCBjc2NvcGUsIGNvbmZ1c2VzIENvdmVyaXR5LgotCWhlbHBfb25seSA9IEZBTFNFOworCXN0LmhlbHBfb25seSA9IEZBTFNFOwogCWN1cmJ1Zi0+Yl9oZWxwID0gRkFMU0U7CiAgICAgfQogI2VuZGlmCkBAIC0yODY3LDE1ICszMDczLDIyIEBACiAJZ290byBmaW5kdGFnX2VuZDsKIAogI2lmZGVmIEZFQVRfRVZBTAotICAgIGlmICgqY3VyYnVmLT5iX3BfdGZ1ICE9IE5VTCAmJiB1c2VfdGZ1ICYmICF0ZnVfaW5fdXNlKQotICAgIHsKLQl0ZnVfaW5fdXNlID0gVFJVRTsKLQlyZXR2YWwgPSBmaW5kX3RhZ2Z1bmNfdGFncyhwYXQsICZzdC5nYV9tYXRjaFswXSwgJnN0Lm1hdGNoX2NvdW50LAotCQkJCQkJCSAgIGZsYWdzLCBidWZfZmZuYW1lKTsKLQl0ZnVfaW5fdXNlID0gRkFMU0U7Ci0JaWYgKHJldHZhbCAhPSBOT1RET05FKQotCSAgICBnb3RvIGZpbmR0YWdfZW5kOwotICAgIH0KKyAgICByZXR2YWwgPSBmaW5kdGFnc19hcHBseV90ZnUocGF0LCAmc3QsIGZsYWdzLCBidWZfZmZuYW1lKTsKKyAgICBpZiAocmV0dmFsICE9IE5PVERPTkUpCisJZ290byBmaW5kdGFnX2VuZDsKKworICAgIC8vIHJlLWluaXRpYWxpemUgdGhlIGRlZmF1bHQgcmV0dXJuIHZhbHVlCisgICAgcmV0dmFsID0gRkFJTDsKKyNlbmRpZgorCisjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCisgICAgLy8gU2V0IGEgZmxhZyBpZiB0aGUgZmlsZSBleHRlbnNpb24gaXMgLnR4dAorICAgIGlmICgoZmxhZ3MgJiBUQUdfS0VFUF9MQU5HKQorCSAgICAmJiBzdC5oZWxwX2xhbmdfZmluZCA9PSBOVUxMCisJICAgICYmIGN1cmJ1Zi0+Yl9mbmFtZSAhPSBOVUxMCisJICAgICYmIChpID0gKGludClTVFJMRU4oY3VyYnVmLT5iX2ZuYW1lKSkgPiA0CisJICAgICYmIFNUUklDTVAoY3VyYnVmLT5iX2ZuYW1lICsgaSAtIDQsICIudHh0IikgPT0gMCkKKwlzdC5pc190eHQgPSBUUlVFOwogI2VuZGlmCiAKICAgICAvKgpAQCAtMjg4OCwxNSArMzEwMSw2IEBACiAgICAgICogV2hlbiB0aGUgdGFnIGZpbGUgaXMgY2FzZS1mb2xkIHNvcnRlZCwgaXQgaXMgZWl0aGVyIG9uZSBvciB0aGUgb3RoZXIuCiAgICAgICogT25seSBpZ25vcmUgY2FzZSB3aGVuIFRBR19OT0lDIG5vdCB1c2VkIG9yICdpZ25vcmVjYXNlJyBzZXQuCiAgICAgICovCi0jaWZkZWYgRkVBVF9NVUxUSV9MQU5HCi0gICAgLy8gU2V0IGEgZmxhZyBpZiB0aGUgZmlsZSBleHRlbnNpb24gaXMgLnR4dAotICAgIGlmICgoZmxhZ3MgJiBUQUdfS0VFUF9MQU5HKQotCSAgICAmJiBzdC5oZWxwX2xhbmdfZmluZCA9PSBOVUxMCi0JICAgICYmIGN1cmJ1Zi0+Yl9mbmFtZSAhPSBOVUxMCi0JICAgICYmIChpID0gKGludClTVFJMRU4oY3VyYnVmLT5iX2ZuYW1lKSkgPiA0Ci0JICAgICYmIFNUUklDTVAoY3VyYnVmLT5iX2ZuYW1lICsgaSAtIDQsICIudHh0IikgPT0gMCkKLQlzdC5pc190eHQgPSBUUlVFOwotI2VuZGlmCiAjaWZkZWYgRkVBVF9UQUdfQklOUwogICAgIHN0Lm9yZ3BhdC5yZWdtYXRjaC5ybV9pYyA9ICgocF9pYyB8fCAhbm9pYykKIAkJCSYmIChmaW5kYWxsIHx8IHN0Lm9yZ3BhdC5oZWFkbGVuID09IDAgfHwgIXBfdGJzKSk7CkBAIC0yOTU5LDEyICszMTYzLDcgQEAKICAgICB9CiAKIGZpbmR0YWdfZW5kOgotICAgIHZpbV9mcmVlKHN0LnRhZ19mbmFtZSk7Ci0gICAgdmltX2ZyZWUoc3QubGJ1Zik7Ci0gICAgdmltX3JlZ2ZyZWUoc3Qub3JncGF0LnJlZ21hdGNoLnJlZ3Byb2cpOwotI2lmZGVmIEZFQVRfRU1BQ1NfVEFHUwotICAgIHZpbV9mcmVlKHN0LmVidWYpOwotI2VuZGlmCisgICAgZmluZHRhZ3Nfc3RhdGVfZnJlZSgmc3QpOwogCiAgICAgLyoKICAgICAgKiBNb3ZlIHRoZSBtYXRjaGVzIGZyb20gdGhlIGdhX21hdGNoW10gYXJyYXlzIGludG8gb25lIGxpc3Qgb2YKQEAgLTI5NzMsNyArMzE3Miw3IEBACiAgICAgaWYgKHJldHZhbCA9PSBGQUlMKQogCXN0Lm1hdGNoX2NvdW50ID0gMDsKIAotICAgIGZpbmR0YWdzX2NvcHlfbWF0Y2hlcygmc3QsIG1hdGNoZXNwLCBudW1fbWF0Y2hlcywgbmFtZV9vbmx5KTsKKyAgICBmaW5kdGFnc19jb3B5X21hdGNoZXMoJnN0LCBtYXRjaGVzcCwgbnVtX21hdGNoZXMpOwogCiAgICAgY3VyYnVmLT5iX2hlbHAgPSBoZWxwX3NhdmU7CiAjaWZkZWYgRkVBVF9NVUxUSV9MQU5HCkBAIC0zMTk0LDkzICszMzkzLDMzIEBACiAgICAgY2hhcl91CSpwOwogCiAjaWZkZWYgRkVBVF9FTUFDU19UQUdTCi0gICAgY2hhcl91CSpwXzdmOwotCiAgICAgaWYgKGlzX2V0YWcpCi0gICAgewotCS8qCi0JICogVGhlcmUgYXJlIHR3byBmb3JtYXRzIGZvciBhbiBlbWFjcyB0YWcgbGluZToKLQkgKiAxOiAgc3RydWN0IEVudkJhc2UgXj9FbnZCYXNlXkExMzksNDYyNwotCSAqIDI6ICNkZWZpbmUJQVJQQl9XSUxEX1dPUkxEIF4/MTUzLDUxOTQKLQkgKi8KLQlwXzdmID0gdmltX3N0cmNocihsYnVmLCAweDdmKTsKLQlpZiAocF83ZiA9PSBOVUxMKQotCXsKLWV0YWdfZmFpbDoKLQkgICAgaWYgKHZpbV9zdHJjaHIobGJ1ZiwgJ1xuJykgPT0gTlVMTCkKLQkgICAgewotCQkvLyBUcnVuY2F0ZWQgbGluZS4gIElnbm9yZSBpdC4KLQkJaWYgKHBfdmVyYm9zZSA+PSA1KQotCQl7Ci0JCSAgICB2ZXJib3NlX2VudGVyKCk7Ci0JCSAgICBtc2coXygiSWdub3JpbmcgbG9uZyBsaW5lIGluIHRhZ3MgZmlsZSIpKTsKLQkJICAgIHZlcmJvc2VfbGVhdmUoKTsKLQkJfQotCQl0YWdwLT5jb21tYW5kID0gbGJ1ZjsKLQkJdGFncC0+dGFnbmFtZSA9IGxidWY7Ci0JCXRhZ3AtPnRhZ25hbWVfZW5kID0gbGJ1ZjsKLQkJcmV0dXJuIE9LOwotCSAgICB9Ci0JICAgIHJldHVybiBGQUlMOwotCX0KLQotCS8vIEZpbmQgXkEuICBJZiBub3QgZm91bmQgdGhlIGxpbmUgbnVtYmVyIGlzIGFmdGVyIHRoZSAweDdmCi0JcCA9IHZpbV9zdHJjaHIocF83ZiwgQ3RybF9BKTsKLQlpZiAocCA9PSBOVUxMKQotCSAgICBwID0gcF83ZiArIDE7Ci0JZWxzZQotCSAgICArK3A7Ci0KLQlpZiAoIVZJTV9JU0RJR0lUKCpwKSkJICAgIC8vIGNoZWNrIGZvciBzdGFydCBvZiBsaW5lIG51bWJlcgotCSAgICBnb3RvIGV0YWdfZmFpbDsKLQl0YWdwLT5jb21tYW5kID0gcDsKLQotCi0JaWYgKHBbLTFdID09IEN0cmxfQSkJICAgIC8vIGZpcnN0IGZvcm1hdDogZXhwbGljaXQgdGFnbmFtZSBnaXZlbgotCXsKLQkgICAgdGFncC0+dGFnbmFtZSA9IHBfN2YgKyAxOwotCSAgICB0YWdwLT50YWduYW1lX2VuZCA9IHAgLSAxOwotCX0KLQllbHNlCQkJICAgIC8vIHNlY29uZCBmb3JtYXQ6IGlzb2xhdGUgdGFnbmFtZQotCXsKLQkgICAgLy8gZmluZCBlbmQgb2YgdGFnbmFtZQotCSAgICBmb3IgKHAgPSBwXzdmIC0gMTsgIXZpbV9pc3dvcmRjKCpwKTsgLS1wKQotCQlpZiAocCA9PSBsYnVmKQotCQkgICAgZ290byBldGFnX2ZhaWw7Ci0JICAgIHRhZ3AtPnRhZ25hbWVfZW5kID0gcCArIDE7Ci0JICAgIHdoaWxlIChwID49IGxidWYgJiYgdmltX2lzd29yZGMoKnApKQotCQktLXA7Ci0JICAgIHRhZ3AtPnRhZ25hbWUgPSBwICsgMTsKLQl9Ci0gICAgfQotICAgIGVsc2UJLy8gbm90IGFuIEVtYWNzIHRhZwotICAgIHsKKwkvLyBlbWFjcy1zdHlsZSB0YWcgZmlsZQorCXJldHVybiBlbWFjc190YWdzX3BhcnNlX2xpbmUobGJ1ZiwgdGFncCk7CiAjZW5kaWYKLQkvLyBJc29sYXRlIHRoZSB0YWduYW1lLCBmcm9tIGxidWYgdXAgdG8gdGhlIGZpcnN0IHdoaXRlCi0JdGFncC0+dGFnbmFtZSA9IGxidWY7Ci0JcCA9IHZpbV9zdHJjaHIobGJ1ZiwgVEFCKTsKLQlpZiAocCA9PSBOVUxMKQotCSAgICByZXR1cm4gRkFJTDsKLQl0YWdwLT50YWduYW1lX2VuZCA9IHA7CiAKLQkvLyBJc29sYXRlIGZpbGUgbmFtZSwgZnJvbSBmaXJzdCB0byBzZWNvbmQgd2hpdGUgc3BhY2UKLQlpZiAoKnAgIT0gTlVMKQotCSAgICArK3A7Ci0JdGFncC0+Zm5hbWUgPSBwOwotCXAgPSB2aW1fc3RyY2hyKHAsIFRBQik7Ci0JaWYgKHAgPT0gTlVMTCkKLQkgICAgcmV0dXJuIEZBSUw7Ci0JdGFncC0+Zm5hbWVfZW5kID0gcDsKKyAgICAvLyBJc29sYXRlIHRoZSB0YWduYW1lLCBmcm9tIGxidWYgdXAgdG8gdGhlIGZpcnN0IHdoaXRlCisgICAgdGFncC0+dGFnbmFtZSA9IGxidWY7CisgICAgcCA9IHZpbV9zdHJjaHIobGJ1ZiwgVEFCKTsKKyAgICBpZiAocCA9PSBOVUxMKQorCXJldHVybiBGQUlMOworICAgIHRhZ3AtPnRhZ25hbWVfZW5kID0gcDsKIAotCS8vIGZpbmQgc3RhcnQgb2Ygc2VhcmNoIGNvbW1hbmQsIGFmdGVyIHNlY29uZCB3aGl0ZSBzcGFjZQotCWlmICgqcCAhPSBOVUwpCi0JICAgICsrcDsKLQlpZiAoKnAgPT0gTlVMKQotCSAgICByZXR1cm4gRkFJTDsKLQl0YWdwLT5jb21tYW5kID0gcDsKLSNpZmRlZiBGRUFUX0VNQUNTX1RBR1MKLSAgICB9Ci0jZW5kaWYKKyAgICAvLyBJc29sYXRlIGZpbGUgbmFtZSwgZnJvbSBmaXJzdCB0byBzZWNvbmQgd2hpdGUgc3BhY2UKKyAgICBpZiAoKnAgIT0gTlVMKQorCSsrcDsKKyAgICB0YWdwLT5mbmFtZSA9IHA7CisgICAgcCA9IHZpbV9zdHJjaHIocCwgVEFCKTsKKyAgICBpZiAocCA9PSBOVUxMKQorCXJldHVybiBGQUlMOworICAgIHRhZ3AtPmZuYW1lX2VuZCA9IHA7CisKKyAgICAvLyBmaW5kIHN0YXJ0IG9mIHNlYXJjaCBjb21tYW5kLCBhZnRlciBzZWNvbmQgd2hpdGUgc3BhY2UKKyAgICBpZiAoKnAgIT0gTlVMKQorCSsrcDsKKyAgICBpZiAoKnAgPT0gTlVMKQorCXJldHVybiBGQUlMOworICAgIHRhZ3AtPmNvbW1hbmQgPSBwOwogCiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDgzLXRhZ3MyIGIvc3JjL3Rlc3RkaXIvdGVzdDgzLXRhZ3MyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjlmMjFiLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0ZGlyL3Rlc3Q4My10YWdzMgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIV9UQUdfRklMRV9FTkNPRElORwljcDkzMgkvLwotgmCCYYJiCVh0YWdzMi50eHQJL4JggmGCYgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDgzLXRhZ3MzIGIvc3JjL3Rlc3RkaXIvdGVzdDgzLXRhZ3MzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2I2NTkxLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0ZGlyL3Rlc3Q4My10YWdzMworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0hX1RBR19GSUxFX1NPUlRFRAkxCS8vCi0hX1RBR19GSUxFX0VOQ09ESU5HCWNwOTMyCS8vCi1hYmMxCVh0YWdzMy50eHQJL4JggmGCYgotYWJjMglYdGFnczMudHh0CS+CYIJhgmIKLWFiYzMJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM0CVh0YWdzMy50eHQJL4JggmGCYgotYWJjNQlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzYJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM3CVh0YWdzMy50eHQJL4JggmGCYgotYWJjOAlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzkJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmMxMAlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzExCVh0YWdzMy50eHQJL4JggmGCYgotYWJjMTIJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmMxMwlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzE0CVh0YWdzMy50eHQJL4JggmGCYgotYWJjMTUJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmMxNglYdGFnczMudHh0CS+CYIJhgmIKLWFiYzE3CVh0YWdzMy50eHQJL4JggmGCYgotYWJjMTgJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmMxOQlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzIwCVh0YWdzMy50eHQJL4JggmGCYgotYWJjMjEJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmMyMglYdGFnczMudHh0CS+CYIJhgmIKLWFiYzIzCVh0YWdzMy50eHQJL4JggmGCYgotYWJjMjQJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmMyNQlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzI2CVh0YWdzMy50eHQJL4JggmGCYgotYWJjMjcJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmMyOAlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzI5CVh0YWdzMy50eHQJL4JggmGCYgotYWJjMzAJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmMzMQlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzMyCVh0YWdzMy50eHQJL4JggmGCYgotYWJjMzMJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmMzNAlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzM1CVh0YWdzMy50eHQJL4JggmGCYgotYWJjMzYJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmMzNwlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzM4CVh0YWdzMy50eHQJL4JggmGCYgotYWJjMzkJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM0MAlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzQxCVh0YWdzMy50eHQJL4JggmGCYgotYWJjNDIJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM0MwlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzQ0CVh0YWdzMy50eHQJL4JggmGCYgotYWJjNDUJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM0NglYdGFnczMudHh0CS+CYIJhgmIKLWFiYzQ3CVh0YWdzMy50eHQJL4JggmGCYgotYWJjNDgJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM0OQlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzUwCVh0YWdzMy50eHQJL4JggmGCYgotYWJjNTEJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM1MglYdGFnczMudHh0CS+CYIJhgmIKLWFiYzUzCVh0YWdzMy50eHQJL4JggmGCYgotYWJjNTQJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM1NQlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzU2CVh0YWdzMy50eHQJL4JggmGCYgotYWJjNTcJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM1OAlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzU5CVh0YWdzMy50eHQJL4JggmGCYgotYWJjNjAJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM2MQlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzYyCVh0YWdzMy50eHQJL4JggmGCYgotYWJjNjMJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM2NAlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzY1CVh0YWdzMy50eHQJL4JggmGCYgotYWJjNjYJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM2NwlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzY4CVh0YWdzMy50eHQJL4JggmGCYgotYWJjNjkJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM3MAlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzcxCVh0YWdzMy50eHQJL4JggmGCYgotYWJjNzIJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM3MwlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzc0CVh0YWdzMy50eHQJL4JggmGCYgotYWJjNzUJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM3NglYdGFnczMudHh0CS+CYIJhgmIKLWFiYzc3CVh0YWdzMy50eHQJL4JggmGCYgotYWJjNzgJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM3OQlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzgwCVh0YWdzMy50eHQJL4JggmGCYgotYWJjODEJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM4MglYdGFnczMudHh0CS+CYIJhgmIKLWFiYzgzCVh0YWdzMy50eHQJL4JggmGCYgotYWJjODQJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM4NQlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzg2CVh0YWdzMy50eHQJL4JggmGCYgotYWJjODcJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM4OAlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzg5CVh0YWdzMy50eHQJL4JggmGCYgotYWJjOTAJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM5MQlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzkyCVh0YWdzMy50eHQJL4JggmGCYgotYWJjOTMJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM5NAlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzk1CVh0YWdzMy50eHQJL4JggmGCYgotYWJjOTYJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmM5NwlYdGFnczMudHh0CS+CYIJhgmIKLWFiYzk4CVh0YWdzMy50eHQJL4JggmGCYgotYWJjOTkJWHRhZ3MzLnR4dAkvgmCCYYJiCi1hYmMxMDAJWHRhZ3MzLnR4dAkvgmCCYYJiCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0X3RhZ2p1bXAudmltIGIvc3JjL3Rlc3RkaXIvdGVzdF90YWdqdW1wLnZpbQppbmRleCA0YjQ3OWJlLi45NWEzYzMxIDEwMDY0NAotLS0gYS9zcmMvdGVzdGRpci90ZXN0X3RhZ2p1bXAudmltCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3RfdGFnanVtcC52aW0KQEAgLTIzMCw3ICsyMzAsNiBAQAogZW5kZnVuYwogCiAiIFRlc3RzIGZvciB0YWcgc2VhcmNoIHdpdGggIV9UQUdfRklMRV9FTkNPRElORy4KLSIgRGVwZW5kcyBvbiB0aGUgdGVzdDgzLXRhZ3MyIGFuZCB0ZXN0ODMtdGFnczMgZmlsZXMuCiBmdW5jIFRlc3RfdGFnX2ZpbGVfZW5jb2RpbmcoKQogICBpZiBoYXMoJ3ZtcycpCiAgICAgdGhyb3cgJ1NraXBwZWQ6IGRvZXMgbm90IHdvcmsgb24gVk1TJwpAQCAtMjYyLDE4ICsyNjEsMzEgQEAKIAogICAiIGNhc2UyOgogICBuZXcKLSAgc2V0IHRhZ3M9dGVzdDgzLXRhZ3MyCisgIGxldCBjb250ZW50ID0gWychX1RBR19GSUxFX0VOQ09ESU5HCWNwOTMyCS8vJywKKyAgICAgICAgXCAiXHg4MmBceDgyYVx4ODJiCVh0YWdzMi50eHQJL1x4ODJgXHg4MmFceDgyYiJdCisgIGNhbGwgd3JpdGVmaWxlKGNvbnRlbnQsICdYdGFncycpCisgIHNldCB0YWdzPVh0YWdzCiAgIHRhZyAvLu+8ou+8owogICBjYWxsIGFzc2VydF9lcXVhbCgnWHRhZ3MyLnR4dCcsIGV4cGFuZCgnJTp0JykpCiAgIGNhbGwgYXNzZXJ0X2VxdWFsKCfvvKHvvKLvvKMnLCBnZXRsaW5lKCcuJykpCisgIGNhbGwgZGVsZXRlKCdYdGFncycpCiAgIGNsb3NlCiAKICAgIiBjYXNlMzoKICAgbmV3Ci0gIHNldCB0YWdzPXRlc3Q4My10YWdzMworICBsZXQgY29udGVudHMgPSBbCisgICAgICBcICIhX1RBR19GSUxFX1NPUlRFRAkxCS8vIiwKKyAgICAgIFwgIiFfVEFHX0ZJTEVfRU5DT0RJTkcJY3A5MzIJLy8iXQorICBmb3IgaSBpbiByYW5nZSgxLCAxMDApCisgICAgICBjYWxsIGFkZChjb250ZW50cywgJ2FiYycgLi4gaQorICAgICAgICAgICAgXCAuLiAiCVh0YWdzMy50eHQJL1x4ODJgXHg4MmFceDgyYiIpCisgIGVuZGZvcgorICBjYWxsIHdyaXRlZmlsZShjb250ZW50cywgJ1h0YWdzJykKKyAgc2V0IHRhZ3M9WHRhZ3MKICAgdGFnIGFiYzUwCiAgIGNhbGwgYXNzZXJ0X2VxdWFsKCdYdGFnczMudHh0JywgZXhwYW5kKCclOnQnKSkKICAgY2FsbCBhc3NlcnRfZXF1YWwoJ++8oe+8ou+8oycsIGdldGxpbmUoJy4nKSkKKyAgY2FsbCBkZWxldGUoJ1h0YWdzJykKICAgY2xvc2UKIAogICBzZXQgdGFncyYKQEAgLTMyNCw2ICszMzYsNyBAQAogICAgICAgICBcIF0sICdYdGFnczInKQogICB0YWcgbWFpbgogICBjYWxsIGFzc2VydF9lcXVhbCgyLCBsaW5lKCcuJykpCisgIGNhbGwgYXNzZXJ0X2ZhaWxzKCd0YWcgYmFyJywgJ0U0MjY6JykKIAogICAiIGNvcnJ1cHRlZCB0YWcgbGluZQogICBjYWxsIHdyaXRlZmlsZShbCkBAIC0zNDksNiArMzYyLDI3IEBACiAJXCBdLCAnWHRhZ3MnKQogICBjYWxsIGFzc2VydF9mYWlscygndGFnIGZvbycsICdFNDMxOicpCiAKKyAgIiBlbmQgb2YgZmlsZSBhZnRlciBhIENUUkwtTCBsaW5lCisgIGNhbGwgd3JpdGVmaWxlKFsKKwlcICJceDBjIiwKKyAgICAgICAgXCAiWG1haW4uYyw2NCIsCisgICAgICAgIFwgInZvaWQgZm9vKCkge31ceDdmZm9vXHgwMTEsMCIsCisJXCAiXHgwYyIsCisJXCBdLCAnWHRhZ3MnKQorICBjYWxsIGFzc2VydF9mYWlscygndGFnIG1haW4nLCAnRTQyNjonKQorCisgICIgZXJyb3IgaW4gYW4gaW5jbHVkZWQgdGFncyBmaWxlCisgIGNhbGwgd3JpdGVmaWxlKFsKKyAgICAgICAgXCAiXHgwYyIsCisgICAgICAgIFwgIlh0YWdzMixpbmNsdWRlIgorICAgICAgICBcIF0sICdYdGFncycpCisgIGNhbGwgd3JpdGVmaWxlKFsKKyAgICAgICAgXCAiXHgwYyIsCisgICAgICAgIFwgIlhtYWluLmMsNjQiLAorICAgICAgICBcICJ2b2lkIGZvbygpIHt9IiwKKyAgICAgICAgXCBdLCAnWHRhZ3MyJykKKyAgY2FsbCBhc3NlcnRfZmFpbHMoJ3RhZyBmb28nLCAnRTQzMTonKQorCiAgIGNhbGwgZGVsZXRlKCdYdGFncycpCiAgIGNhbGwgZGVsZXRlKCdYdGFnczInKQogICBjYWxsIGRlbGV0ZSgnWG1haW4uYycpCkBAIC0xNDMyLDYgKzE0NjYsMTEgQEAKICAgICAgICAgXCAiZm9vIFhmaWxlIDEiXSwgJ1h0YWdzJykKICAgY2FsbCBhc3NlcnRfZmFpbHMoJ3RhZyBmb28nLCAnRTQzMTonKQogCisgICIgZmlsZSBuYW1lIGFuZCBzZWFyY2ggcGF0dGVybiBhcmUgbm90IHNlcGFyYXRlZCBieSBhIHRhYgorICBjYWxsIHdyaXRlZmlsZShbIiFfVEFHX0ZJTEVfRU5DT0RJTkdcdHV0Zi04XHQvLyIsCisgICAgICAgIFwgImZvb1x0WGZpbGUgMTsiXSwgJ1h0YWdzJykKKyAgY2FsbCBhc3NlcnRfZmFpbHMoJ3RhZyBmb28nLCAnRTQzMTonKQorCiAgIGNhbGwgZGVsZXRlKCdYdGFncycpCiAgIGNhbGwgZGVsZXRlKCdYZmlsZScpCiAgIHNldCB0YWdzJgpkaWZmIC0tZ2l0IGEvc3JjL3ZlcnNpb24uYyBiL3NyYy92ZXJzaW9uLmMKaW5kZXggNmUzMzdiNC4uZTgwODAxMCAxMDA2NDQKLS0tIGEvc3JjL3ZlcnNpb24uYworKysgYi9zcmMvdmVyc2lvbi5jCkBAIC03NTUsNiArNzU1LDggQEAKIHN0YXRpYyBpbnQgaW5jbHVkZWRfcGF0Y2hlc1tdID0KIHsgICAvKiBBZGQgbmV3IHBhdGNoIG51bWJlciBiZWxvdyB0aGlzIGxpbmUgKi8KIC8qKi8KKyAgICA0NTEyLAorLyoqLwogICAgIDQ1MTEsCiAvKiovCiAgICAgNDUxMCwK