ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEuYyBiL2RyaXZlcnMvbWQvcmFpZDEuYwppbmRleCAzYzVjOTE2Li4wZmQ0YzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMS5jCkBAIC0xMiw2ICsxMiwxNSBAQAogICogRml4ZXMgdG8gcmVjb25zdHJ1Y3Rpb24gYnkgSmFrb2Ig2HN0ZXJnYWFyZCIgPGpha29iQG9zdGVuZmVsZC5kaz4KICAqIFZhcmlvdXMgZml4ZXMgYnkgTmVpbCBCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgogICoKKyAqIENoYW5nZXMgYnkgUGV0ZXIgVC4gQnJldWVyIDxwdGJAaXQudWMzbS5lcz4gMzEvMS8yMDAzIHRvIHN1cHBvcnQKKyAqIGJpdG1hcHBlZCBpbnRlbGxpZ2VuY2UgaW4gcmVzeW5jOgorICoKKyAqICAgICAgLSBiaXRtYXAgbWFya2VkIGR1cmluZyBub3JtYWwgaS9vCisgKiAgICAgIC0gYml0bWFwIHVzZWQgdG8gc2tpcCBub25kaXJ0eSBibG9ja3MgZHVyaW5nIHN5bmMKKyAqCisgKiBBZGRpdGlvbnMgdG8gYml0bWFwIGNvZGUsIChDKSAyMDAzLTIwMDQgUGF1bCBDbGVtZW50cywgU3RlZWxFeWUgVGVjaG5vbG9neToKKyAqIC0gcGVyc2lzdGVudCBiaXRtYXAgY29kZQorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQpAQCAtMjIsNyArMzEsMTYgQEAKICAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNpbmNsdWRlICJkbS1iaW8tbGlzdC5oIgogI2luY2x1ZGUgPGxpbnV4L3JhaWQvcmFpZDEuaD4KKyNpbmNsdWRlIDxsaW51eC9yYWlkL2JpdG1hcC5oPgorCisjZGVmaW5lIERFQlVHIDAKKyNpZiBERUJVRworI2RlZmluZSBQUklOVEsoeC4uLikgcHJpbnRrKHgpCisjZWxzZQorI2RlZmluZSBQUklOVEsoeC4uLikKKyNlbmRpZgogCiAvKgogICogTnVtYmVyIG9mIGd1YXJhbnRlZWQgcjFiaW9zIGluIGNhc2Ugb2YgZXh0cmVtZSBWTSBsb2FkOgpAQCAtMjg3LDkgKzMwNSwxMSBAQAogCS8qCiAJICogdGhpcyBicmFuY2ggaXMgb3VyICdvbmUgbWlycm9yIElPIGhhcyBmaW5pc2hlZCcgZXZlbnQgaGFuZGxlcjoKIAkgKi8KLQlpZiAoIXVwdG9kYXRlKQorCWlmICghdXB0b2RhdGUpIHsKIAkJbWRfZXJyb3IocjFfYmlvLT5tZGRldiwgY29uZi0+bWlycm9yc1ttaXJyb3JdLnJkZXYpOwotCWVsc2UKKwkJLyogYW4gSS9PIGZhaWxlZCwgd2UgY2FuJ3QgY2xlYXIgdGhlIGJpdG1hcCAqLworCQlzZXRfYml0KFIxQklPX0RlZ3JhZGVkLCAmcjFfYmlvLT5zdGF0ZSk7CisJfSBlbHNlCiAJCS8qCiAJCSAqIFNldCBSMUJJT19VcHRvZGF0ZSBpbiBvdXIgbWFzdGVyIGJpbywgc28gdGhhdAogCQkgKiB3ZSB3aWxsIHJldHVybiBhIGdvb2QgZXJyb3IgY29kZSBmb3IgdG8gdGhlIGhpZ2hlcgpAQCAtMzA5LDYgKzMyOSwxMCBAQAogCSAqIGFscmVhZHkuCiAJICovCiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnIxX2Jpby0+cmVtYWluaW5nKSkgeworCQkvKiBjbGVhciB0aGUgYml0bWFwIGlmIGFsbCB3cml0ZXMgY29tcGxldGUgc3VjY2Vzc2Z1bGx5ICovCisJCWJpdG1hcF9lbmR3cml0ZShyMV9iaW8tPm1kZGV2LT5iaXRtYXAsIHIxX2Jpby0+c2VjdG9yLAorCQkJCXIxX2Jpby0+c2VjdG9ycywKKwkJCQkhdGVzdF9iaXQoUjFCSU9fRGVncmFkZWQsICZyMV9iaW8tPnN0YXRlKSk7CiAJCW1kX3dyaXRlX2VuZChyMV9iaW8tPm1kZGV2KTsKIAkJcmFpZF9lbmRfYmlvX2lvKHIxX2Jpbyk7CiAJfQpAQCAtNDU4LDcgKzQ4MiwxMCBAQAogCiBzdGF0aWMgdm9pZCByYWlkMV91bnBsdWcocmVxdWVzdF9xdWV1ZV90ICpxKQogewotCXVucGx1Z19zbGF2ZXMocS0+cXVldWVkYXRhKTsKKwltZGRldl90ICptZGRldiA9IHEtPnF1ZXVlZGF0YTsKKworCXVucGx1Z19zbGF2ZXMobWRkZXYpOworCW1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7CiB9CiAKIHN0YXRpYyBpbnQgcmFpZDFfaXNzdWVfZmx1c2gocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKQEAgLTUwMSwxNiArNTI4LDE2IEBACiB7CiAJc3Bpbl9sb2NrX2lycSgmY29uZi0+cmVzeW5jX2xvY2spOwogCXdhaXRfZXZlbnRfbG9ja19pcnEoY29uZi0+d2FpdF9pZGxlLCAhd2FpdHF1ZXVlX2FjdGl2ZSgmY29uZi0+d2FpdF9yZXN1bWUpLAotCQkJICAgIGNvbmYtPnJlc3luY19sb2NrLCB1bnBsdWdfc2xhdmVzKGNvbmYtPm1kZGV2KSk7CisJCQkgICAgY29uZi0+cmVzeW5jX2xvY2ssIHJhaWQxX3VucGx1Zyhjb25mLT5tZGRldi0+cXVldWUpKTsKIAkKIAlpZiAoIWNvbmYtPmJhcnJpZXIrKykgewogCQl3YWl0X2V2ZW50X2xvY2tfaXJxKGNvbmYtPndhaXRfaWRsZSwgIWNvbmYtPm5yX3BlbmRpbmcsCi0JCQkJICAgIGNvbmYtPnJlc3luY19sb2NrLCB1bnBsdWdfc2xhdmVzKGNvbmYtPm1kZGV2KSk7CisJCQkJICAgIGNvbmYtPnJlc3luY19sb2NrLCByYWlkMV91bnBsdWcoY29uZi0+bWRkZXYtPnF1ZXVlKSk7CiAJCWlmIChjb25mLT5ucl9wZW5kaW5nKQogCQkJQlVHKCk7CiAJfQogCXdhaXRfZXZlbnRfbG9ja19pcnEoY29uZi0+d2FpdF9yZXN1bWUsIGNvbmYtPmJhcnJpZXIgPCBSRVNZTkNfREVQVEgsCi0JCQkgICAgY29uZi0+cmVzeW5jX2xvY2ssIHVucGx1Z19zbGF2ZXMoY29uZi0+bWRkZXYpKTsKKwkJCSAgICBjb25mLT5yZXN5bmNfbG9jaywgcmFpZDFfdW5wbHVnKGNvbmYtPm1kZGV2LT5xdWV1ZSkpOwogCWNvbmYtPm5leHRfcmVzeW5jID0gc2VjdDsKIAlzcGluX3VubG9ja19pcnEoJmNvbmYtPnJlc3luY19sb2NrKTsKIH0KQEAgLTUyMiw4ICs1NDksMTIgQEAKIAltaXJyb3JfaW5mb190ICptaXJyb3I7CiAJcjFiaW9fdCAqcjFfYmlvOwogCXN0cnVjdCBiaW8gKnJlYWRfYmlvOwotCWludCBpLCBkaXNrczsKKwlpbnQgaSwgdGFyZ2V0cyA9IDAsIGRpc2tzOwogCW1ka19yZGV2X3QgKnJkZXY7CisJc3RydWN0IGJpdG1hcCAqYml0bWFwID0gbWRkZXYtPmJpdG1hcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBiaW9fbGlzdCBibDsKKwogCiAJLyoKIAkgKiBSZWdpc3RlciB0aGUgbmV3IHJlcXVlc3QgYW5kIHdhaXQgaWYgdGhlIHJlY29uc3RydWN0aW9uCkBAIC01NTQsNyArNTg1LDcgQEAKIAogCXIxX2Jpby0+bWFzdGVyX2JpbyA9IGJpbzsKIAlyMV9iaW8tPnNlY3RvcnMgPSBiaW8tPmJpX3NpemUgPj4gOTsKLQorCXIxX2Jpby0+c3RhdGUgPSAwOwogCXIxX2Jpby0+bWRkZXYgPSBtZGRldjsKIAlyMV9iaW8tPnNlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwogCkBAIC01OTcsNiArNjI4LDEzIEBACiAJICogYmlvc1t4XSB0byBiaW8KIAkgKi8KIAlkaXNrcyA9IGNvbmYtPnJhaWRfZGlza3M7CisjaWYgMAorCXsgc3RhdGljIGludCBmaXJzdD0xOworCWlmIChmaXJzdCkgcHJpbnRrKCJGaXJzdCBXcml0ZSBzZWN0b3IgJWxsdSBkaXNrcyAlZFxuIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylyMV9iaW8tPnNlY3RvciwgZGlza3MpOworCWZpcnN0ID0gMDsKKwl9CisjZW5kaWYKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yIChpID0gMDsgIGkgPCBkaXNrczsgaSsrKSB7CiAJCWlmICgocmRldj1jb25mLT5taXJyb3JzW2ldLnJkZXYpICE9IE5VTEwgJiYKQEAgLTYwNywxMyArNjQ1LDIxIEBACiAJCQkJcjFfYmlvLT5iaW9zW2ldID0gTlVMTDsKIAkJCX0gZWxzZQogCQkJCXIxX2Jpby0+Ymlvc1tpXSA9IGJpbzsKKwkJCXRhcmdldHMrKzsKIAkJfSBlbHNlCiAJCQlyMV9iaW8tPmJpb3NbaV0gPSBOVUxMOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCWF0b21pY19zZXQoJnIxX2Jpby0+cmVtYWluaW5nLCAxKTsKKwlpZiAodGFyZ2V0cyA8IGNvbmYtPnJhaWRfZGlza3MpIHsKKwkJLyogYXJyYXkgaXMgZGVncmFkZWQsIHdlIHdpbGwgbm90IGNsZWFyIHRoZSBiaXRtYXAKKwkJICogb24gSS9PIGNvbXBsZXRpb24gKHNlZSByYWlkMV9lbmRfd3JpdGVfcmVxdWVzdCkgKi8KKwkJc2V0X2JpdChSMUJJT19EZWdyYWRlZCwgJnIxX2Jpby0+c3RhdGUpOworCX0KIAorCWF0b21pY19zZXQoJnIxX2Jpby0+cmVtYWluaW5nLCAwKTsKKworCWJpb19saXN0X2luaXQoJmJsKTsKIAlmb3IgKGkgPSAwOyBpIDwgZGlza3M7IGkrKykgewogCQlzdHJ1Y3QgYmlvICptYmlvOwogCQlpZiAoIXIxX2Jpby0+Ymlvc1tpXSkKQEAgLTYyOSwxMyArNjc1LDIyIEBACiAJCW1iaW8tPmJpX3ByaXZhdGUgPSByMV9iaW87CiAKIAkJYXRvbWljX2luYygmcjFfYmlvLT5yZW1haW5pbmcpOwotCQlnZW5lcmljX21ha2VfcmVxdWVzdChtYmlvKTsKKworCQliaW9fbGlzdF9hZGQoJmJsLCBtYmlvKTsKIAl9CiAKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcjFfYmlvLT5yZW1haW5pbmcpKSB7Ci0JCW1kX3dyaXRlX2VuZChtZGRldik7Ci0JCXJhaWRfZW5kX2Jpb19pbyhyMV9iaW8pOwotCX0KKwliaXRtYXBfc3RhcnR3cml0ZShiaXRtYXAsIGJpby0+Ymlfc2VjdG9yLCByMV9iaW8tPnNlY3RvcnMpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjb25mLT5kZXZpY2VfbG9jaywgZmxhZ3MpOworCWJpb19saXN0X21lcmdlKCZjb25mLT5wZW5kaW5nX2Jpb19saXN0LCAmYmwpOworCWJpb19saXN0X2luaXQoJmJsKTsKKworCWJsa19wbHVnX2RldmljZShtZGRldi0+cXVldWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7CisKKyNpZiAwCisJd2hpbGUgKChiaW8gPSBiaW9fbGlzdF9wb3AoJmJsKSkgIT0gTlVMTCkKKwkJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKKyNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CkBAIC03MTYsNyArNzcxLDcgQEAKIHsKIAlzcGluX2xvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7CiAJd2FpdF9ldmVudF9sb2NrX2lycShjb25mLT53YWl0X3Jlc3VtZSwgIWNvbmYtPmJhcnJpZXIsCi0JCQkgICAgY29uZi0+cmVzeW5jX2xvY2ssIAl1bnBsdWdfc2xhdmVzKGNvbmYtPm1kZGV2KSk7CisJCQkgICAgY29uZi0+cmVzeW5jX2xvY2ssIAlyYWlkMV91bnBsdWcoY29uZi0+bWRkZXYtPnF1ZXVlKSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7CiAKIAlpZiAoY29uZi0+YmFycmllcikgQlVHKCk7CkBAIC04MzAsMTAgKzg4NSwxMSBAQAogCSAqIG9yIHJlLXJlYWQgaWYgdGhlIHJlYWQgZmFpbGVkLgogCSAqIFdlIGRvbid0IGRvIG11Y2ggaGVyZSwganVzdCBzY2hlZHVsZSBoYW5kbGluZyBieSByYWlkMWQKIAkgKi8KLQlpZiAoIXVwdG9kYXRlKQorCWlmICghdXB0b2RhdGUpIHsKIAkJbWRfZXJyb3IocjFfYmlvLT5tZGRldiwKIAkJCSBjb25mLT5taXJyb3JzW3IxX2Jpby0+cmVhZF9kaXNrXS5yZGV2KTsKLQllbHNlCisJCXNldF9iaXQoUjFCSU9fRGVncmFkZWQsICZyMV9iaW8tPnN0YXRlKTsKKwl9IGVsc2UKIAkJc2V0X2JpdChSMUJJT19VcHRvZGF0ZSwgJnIxX2Jpby0+c3RhdGUpOwogCXJkZXZfZGVjX3BlbmRpbmcoY29uZi0+bWlycm9yc1tyMV9iaW8tPnJlYWRfZGlza10ucmRldiwgY29uZi0+bWRkZXYpOwogCXJlc2NoZWR1bGVfcmV0cnkocjFfYmlvKTsKQEAgLTg1Nyw4ICs5MTMsMTAgQEAKIAkJCW1pcnJvciA9IGk7CiAJCQlicmVhazsKIAkJfQotCWlmICghdXB0b2RhdGUpCisJaWYgKCF1cHRvZGF0ZSkgewogCQltZF9lcnJvcihtZGRldiwgY29uZi0+bWlycm9yc1ttaXJyb3JdLnJkZXYpOworCQlzZXRfYml0KFIxQklPX0RlZ3JhZGVkLCAmcjFfYmlvLT5zdGF0ZSk7CisJfQogCXVwZGF0ZV9oZWFkX3BvcyhtaXJyb3IsIHIxX2Jpbyk7CiAKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcjFfYmlvLT5yZW1haW5pbmcpKSB7CkBAIC04NzgsNiArOTM2LDkgQEAKIAogCWJpbyA9IHIxX2Jpby0+Ymlvc1tyMV9iaW8tPnJlYWRfZGlza107CiAKKy8qCisJaWYgKHIxX2Jpby0+c2VjdG9yID09IDApIHByaW50aygiRmlyc3Qgc3luYyB3cml0ZSBzdGFydHNzXG4iKTsKKyovCiAJLyoKIAkgKiBzY2hlZHVsZSB3cml0ZXMKIAkgKi8KQEAgLTkwNSwxMCArOTY2LDEyIEBACiAJCWF0b21pY19pbmMoJmNvbmYtPm1pcnJvcnNbaV0ucmRldi0+bnJfcGVuZGluZyk7CiAJCWF0b21pY19pbmMoJnIxX2Jpby0+cmVtYWluaW5nKTsKIAkJbWRfc3luY19hY2N0KGNvbmYtPm1pcnJvcnNbaV0ucmRldi0+YmRldiwgd2Jpby0+Ymlfc2l6ZSA+PiA5KTsKKwogCQlnZW5lcmljX21ha2VfcmVxdWVzdCh3YmlvKTsKIAl9CiAKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcjFfYmlvLT5yZW1haW5pbmcpKSB7CisJCS8qIGlmIHdlJ3JlIGhlcmUsIGFsbCB3cml0ZShzKSBoYXZlIGNvbXBsZXRlZCwgc28gY2xlYW4gdXAgKi8KIAkJbWRfZG9uZV9zeW5jKG1kZGV2LCByMV9iaW8tPnNlY3RvcnMsIDEpOwogCQlwdXRfYnVmKHIxX2Jpbyk7CiAJfQpAQCAtOTM3LDYgKzEwMDAsMjYgQEAKIAlmb3IgKDs7KSB7CiAJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbmYtPmRldmljZV9sb2NrLCBmbGFncyk7CisKKwkJaWYgKGNvbmYtPnBlbmRpbmdfYmlvX2xpc3QuaGVhZCkgeworCQkJYmlvID0gYmlvX2xpc3RfZ2V0KCZjb25mLT5wZW5kaW5nX2Jpb19saXN0KTsKKwkJCWJsa19yZW1vdmVfcGx1ZyhtZGRldi0+cXVldWUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29uZi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwkJCS8qIGZsdXNoIGFueSBwZW5kaW5nIGJpdG1hcCB3cml0ZXMgdG8gZGlzayBiZWZvcmUgcHJvY2VlZGluZyB3LyBJL08gKi8KKwkJCWlmIChiaXRtYXBfdW5wbHVnKG1kZGV2LT5iaXRtYXApICE9IDApCisJCQkJcHJpbnRrKCIlczogYml0bWFwIGZpbGUgd3JpdGUgZmFpbGVkIVxuIiwgbWRuYW1lKG1kZGV2KSk7CisKKwkJCXdoaWxlIChiaW8pIHsgLyogc3VibWl0IHBlbmRpbmcgd3JpdGVzICovCisJCQkJc3RydWN0IGJpbyAqbmV4dCA9IGJpby0+YmlfbmV4dDsKKwkJCQliaW8tPmJpX25leHQgPSBOVUxMOworCQkJCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpbyk7CisJCQkJYmlvID0gbmV4dDsKKwkJCX0KKwkJCXVucGx1ZyA9IDE7CisKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJaWYgKGxpc3RfZW1wdHkoaGVhZCkpCiAJCQlicmVhazsKIAkJcjFfYmlvID0gbGlzdF9lbnRyeShoZWFkLT5wcmV2LCByMWJpb190LCByZXRyeV9saXN0KTsKQEAgLTEwMjAsMTcgKzExMDMsNDMgQEAKIAlpbnQgZGlzazsKIAlpbnQgaTsKIAlpbnQgd3JpdGVfdGFyZ2V0cyA9IDA7CisJaW50IHN5bmNfYmxvY2tzOwogCiAJaWYgKCFjb25mLT5yMWJ1Zl9wb29sKQorCXsKKy8qCisJCXByaW50aygic3luYyBzdGFydCAtIGJpdG1hcCAlcFxuIiwgbWRkZXYtPmJpdG1hcCk7CisqLwogCQlpZiAoaW5pdF9yZXN5bmMoY29uZikpCiAJCQlyZXR1cm4gMDsKKwl9CiAKIAltYXhfc2VjdG9yID0gbWRkZXYtPnNpemUgPDwgMTsKIAlpZiAoc2VjdG9yX25yID49IG1heF9zZWN0b3IpIHsKKwkJLyogSWYgd2UgYWJvcnRlZCwgd2UgbmVlZCB0byBhYm9ydCB0aGUKKwkJICogc3luYyBvbiB0aGUgJ2N1cnJlbnQnIGJpdG1hcCBjaHVuayAodGhlcmUgd2lsbAorCQkgKiBvbmx5IGJlIG9uZSBpbiByYWlkMSByZXN5bmMuCisJCSAqIFdlIGNhbiBmaW5kIHRoZSBjdXJyZW50IGFkZGVzcyBpbiBtZGRldi0+Y3Vycl9yZXN5bmMKKwkJICovCisJCWlmICghY29uZi0+ZnVsbHN5bmMpIHsKKwkJCWlmIChtZGRldi0+Y3Vycl9yZXN5bmMgPCBtYXhfc2VjdG9yKQorCQkJCWJpdG1hcF9lbmRfc3luYyhtZGRldi0+Yml0bWFwLAorCQkJCQkJbWRkZXYtPmN1cnJfcmVzeW5jLAorCQkJCQkJJnN5bmNfYmxvY2tzLCAxKTsKKwkJCWJpdG1hcF9jbG9zZV9zeW5jKG1kZGV2LT5iaXRtYXApOworCQl9CisJCWlmIChtZGRldi0+Y3Vycl9yZXN5bmMgPj0gbWF4X3NlY3RvcikKKwkJCWNvbmYtPmZ1bGxzeW5jID0gMDsKIAkJY2xvc2Vfc3luYyhjb25mKTsKIAkJcmV0dXJuIDA7CiAJfQogCisJaWYgKCFjb25mLT5mdWxsc3luYyAmJgorCSAgICAhYml0bWFwX3N0YXJ0X3N5bmMobWRkZXYtPmJpdG1hcCwgc2VjdG9yX25yLCAmc3luY19ibG9ja3MpKSB7CisJCS8qIFdlIGNhbiBza2lwIHRoaXMgYmxvY2ssIGFuZCBwcm9iYWJseSBzZXZlcmFsIG1vcmUgKi8KKwkJKnNraXBwZWQgPSAxOworCQlyZXR1cm4gc3luY19ibG9ja3M7CisJfQogCS8qCiAJICogSWYgdGhlcmUgaXMgbm9uLXJlc3luYyBhY3Rpdml0eSB3YWl0aW5nIGZvciB1cyB0aGVuCiAJICogcHV0IGluIGEgZGVsYXkgdG8gdGhyb3R0bGUgcmVzeW5jLgpAQCAtMTA2OSw2ICsxMTc4LDcgQEAKIAogCXIxX2Jpby0+bWRkZXYgPSBtZGRldjsKIAlyMV9iaW8tPnNlY3RvciA9IHNlY3Rvcl9ucjsKKwlyMV9iaW8tPnN0YXRlID0gMDsKIAlzZXRfYml0KFIxQklPX0lzU3luYywgJnIxX2Jpby0+c3RhdGUpOwogCXIxX2Jpby0+cmVhZF9kaXNrID0gZGlzazsKIApAQCAtMTEwMyw2ICsxMjEzLDExIEBACiAJCWJpby0+YmlfYmRldiA9IGNvbmYtPm1pcnJvcnNbaV0ucmRldi0+YmRldjsKIAkJYmlvLT5iaV9wcml2YXRlID0gcjFfYmlvOwogCX0KKworCWlmICh3cml0ZV90YXJnZXRzICsgMSA8IGNvbmYtPnJhaWRfZGlza3MpCisJCS8qIGFycmF5IGRlZ3JhZGVkLCBjYW4ndCBjbGVhciBiaXRtYXAgKi8KKwkJc2V0X2JpdChSMUJJT19EZWdyYWRlZCwgJnIxX2Jpby0+c3RhdGUpOworCiAJaWYgKHdyaXRlX3RhcmdldHMgPT0gMCkgewogCQkvKiBUaGVyZSBpcyBub3doZXJlIHRvIHdyaXRlLCBzbyBhbGwgbm9uLXN5bmMKIAkJICogZHJpdmVzIG11c3QgYmUgZmFpbGVkIC0gc28gd2UgYXJlIGZpbmlzaGVkCkBAIC0xMTIyLDYgKzEyMzcsMTQgQEAKIAkJCWxlbiA9IChtYXhfc2VjdG9yIC0gc2VjdG9yX25yKSA8PCA5OwogCQlpZiAobGVuID09IDApCiAJCQlicmVhazsKKwkJaWYgKCFjb25mLT5mdWxsc3luYyAmJiBzeW5jX2Jsb2NrcyA9PSAwKQorCQkJaWYgKCFiaXRtYXBfc3RhcnRfc3luYyhtZGRldi0+Yml0bWFwLAorCQkJCQkgICAgICAgc2VjdG9yX25yLCAmc3luY19ibG9ja3MpKQorCQkJCWJyZWFrOworCQlpZiAoc3luY19ibG9ja3MgPCAoUEFHRV9TSVpFPj45KSkKKwkJCUJVRygpOworCQlpZiAobGVuID4gKHN5bmNfYmxvY2tzPDw5KSkgbGVuID0gc3luY19ibG9ja3M8PDk7CisKIAkJZm9yIChpPTAgOyBpIDwgY29uZi0+cmFpZF9kaXNrczsgaSsrKSB7CiAJCQliaW8gPSByMV9iaW8tPmJpb3NbaV07CiAJCQlpZiAoYmlvLT5iaV9lbmRfaW8pIHsKQEAgLTExNDQsNiArMTI2Nyw3IEBACiAJCX0KIAkJbnJfc2VjdG9ycyArPSBsZW4+Pjk7CiAJCXNlY3Rvcl9uciArPSBsZW4+Pjk7CisJCXN5bmNfYmxvY2tzIC09IChsZW4+PjkpOwogCX0gd2hpbGUgKHIxX2Jpby0+Ymlvc1tkaXNrXS0+YmlfdmNudCA8IFJFU1lOQ19QQUdFUyk7CiAgYmlvX2Z1bGw6CiAJYmlvID0gcjFfYmlvLT5iaW9zW2Rpc2tdOwpAQCAtMTIzMiw2ICsxMzU2LDkgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb25mLT53YWl0X2lkbGUpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNvbmYtPndhaXRfcmVzdW1lKTsKIAorCWJpb19saXN0X2luaXQoJmNvbmYtPnBlbmRpbmdfYmlvX2xpc3QpOworCWJpb19saXN0X2luaXQoJmNvbmYtPmZsdXNoaW5nX2Jpb19saXN0KTsKKwogCWlmICghY29uZi0+d29ya2luZ19kaXNrcykgewogCQlwcmludGsoS0VSTl9FUlIgInJhaWQxOiBubyBvcGVyYXRpb25hbCBtaXJyb3JzIGZvciAlc1xuIiwKIAkJCW1kbmFtZShtZGRldikpOwpAQCAtMTI2MCwxNiArMTM4NywxNSBAQAogCWNvbmYtPmxhc3RfdXNlZCA9IGo7CiAKIAotCi0JewotCQltZGRldi0+dGhyZWFkID0gbWRfcmVnaXN0ZXJfdGhyZWFkKHJhaWQxZCwgbWRkZXYsICIlc19yYWlkMSIpOwotCQlpZiAoIW1kZGV2LT50aHJlYWQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAKLQkJCQkicmFpZDE6IGNvdWxkbid0IGFsbG9jYXRlIHRocmVhZCBmb3IgJXNcbiIsIAotCQkJCW1kbmFtZShtZGRldikpOwotCQkJZ290byBvdXRfZnJlZV9jb25mOwotCQl9CisJbWRkZXYtPnRocmVhZCA9IG1kX3JlZ2lzdGVyX3RocmVhZChyYWlkMWQsIG1kZGV2LCAiJXNfcmFpZDEiKTsKKwlpZiAoIW1kZGV2LT50aHJlYWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAicmFpZDE6IGNvdWxkbid0IGFsbG9jYXRlIHRocmVhZCBmb3IgJXNcbiIsCisJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKKwkJZ290byBvdXRfZnJlZV9jb25mOwogCX0KKwlpZiAobWRkZXYtPmJpdG1hcCkgbWRkZXYtPnRocmVhZC0+dGltZW91dCA9IG1kZGV2LT5iaXRtYXAtPmRhZW1vbl9zbGVlcCAqIEhaOworCiAJcHJpbnRrKEtFUk5fSU5GTyAKIAkJInJhaWQxOiByYWlkIHNldCAlcyBhY3RpdmUgd2l0aCAlZCBvdXQgb2YgJWQgbWlycm9yc1xuIiwKIAkJbWRuYW1lKG1kZGV2KSwgbWRkZXYtPnJhaWRfZGlza3MgLSBtZGRldi0+ZGVncmFkZWQsIApAQCAtMTM5NCw3ICsxNTIwLDcgQEAKIAlzcGluX2xvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7CiAJY29uZi0+YmFycmllcisrOwogCXdhaXRfZXZlbnRfbG9ja19pcnEoY29uZi0+d2FpdF9pZGxlLCAhY29uZi0+bnJfcGVuZGluZywKLQkJCSAgICBjb25mLT5yZXN5bmNfbG9jaywgdW5wbHVnX3NsYXZlcyhtZGRldikpOworCQkJICAgIGNvbmYtPnJlc3luY19sb2NrLCByYWlkMV91bnBsdWcobWRkZXYtPnF1ZXVlKSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjb25mLT5yZXN5bmNfbG9jayk7CiAKIAkvKiBvaywgZXZlcnl0aGluZyBpcyBzdG9wcGVkICovCg==