ZGlmZiAtLWdpdCBhL25ldC9pcmRhL3dyYXBwZXIuYyBiL25ldC9pcmRhL3dyYXBwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzEzMGMxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lyZGEvd3JhcHBlci5jCkBAIC0wLDAgKzEsNDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmlsZW5hbWU6ICAgICAgd3JhcHBlci5jCisgKiBWZXJzaW9uOiAgICAgICAxLjIKKyAqIERlc2NyaXB0aW9uOiAgIElyREEgU0lSIGFzeW5jIHdyYXBwZXIgbGF5ZXIKKyAqIFN0YXR1czogICAgICAgIFN0YWJsZQorICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICogQ3JlYXRlZCBhdDogICAgTW9uIEF1ZyAgNCAyMDo0MDo1MyAxOTk3CisgKiBNb2RpZmllZCBhdDogICBGcmkgSmFuIDI4IDEzOjIxOjA5IDIwMDAKKyAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KKyAqIE1vZGlmaWVkIGF0OiAgIEZyaSBNYXkgMjggIDM6MTEgQ1NUIDE5OTkKKyAqIE1vZGlmaWVkIGJ5OiAgIEhvcnN0IHZvbiBCcmFuZCA8dm9uYnJhbmRAc2xlaXBuaXIudmFscGFyYWlzby5jbD4KKyAqCisgKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKKyAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgorICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCisgKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS93cmFwcGVyLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvY3JjLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJsYXAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhcF9mcmFtZS5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGFfZGV2aWNlLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBGUkFNRSBXUkFQUElORyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBVbndyYXAgYW5kIHVuc3R1ZmYgU0lSIGZyYW1lcworICoKKyAqIE5vdGUgOiBhdCBGSVIgYW5kIE1JUiwgSERMQyBmcmFtaW5nIGlzIHVzZWQgYW5kIHVzdWFsbHkgaGFuZGxlZAorICogYnkgdGhlIGNvbnRyb2xsZXIsIHNvIHdlIGNvbWUgaGVyZSBvbmx5IGZvciBTSVIuLi4gSmVhbiBJSQorICovCisKKy8qCisgKiBGdW5jdGlvbiBzdHVmZl9ieXRlIChieXRlLCBidWYpCisgKgorICogICAgQnl0ZSBzdHVmZiBvbmUgc2luZ2xlIGJ5dGUgYW5kIHB1dCB0aGUgcmVzdWx0IGluIGJ1ZmZlciBwb2ludGVkIHRvIGJ5CisgKiAgICBidWYuIFRoZSBidWZmZXIgbXVzdCBhdCBhbGwgdGltZXMgYmUgYWJsZSB0byBoYXZlIHR3byBieXRlcyBpbnNlcnRlZC4KKyAqCisgKiBUaGlzIGlzIGluIGEgdGlnaHQgbG9vcCwgYmV0dGVyIGlubGluZSBpdCwgc28gbmVlZCB0byBiZSBwcmlvciB0byBjYWxsZXJzLgorICogKDIwMDAgYnl0ZXMgb24gUDYgMjAwTUh6LCBub24taW5saW5lZCB+MzcwdXMsIGlubGluZSB+MTcwdXMpIC0gSmVhbiBJSQorICovCitzdGF0aWMgaW5saW5lIGludCBzdHVmZl9ieXRlKF9fdTggYnl0ZSwgX191OCAqYnVmKQoreworCXN3aXRjaCAoYnl0ZSkgeworCWNhc2UgQk9GOiAvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgRU9GOiAvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgQ0U6CisJCS8qIEluc2VydCB0cmFuc3BhcmVudGx5IGNvZGVkICovCisJCWJ1ZlswXSA9IENFOyAgICAgICAgICAgICAgIC8qIFNlbmQgbGluayBlc2NhcGUgKi8KKwkJYnVmWzFdID0gYnl0ZV5JUkRBX1RSQU5TOyAgICAvKiBDb21wbGVtZW50IGJpdCA1ICovCisJCXJldHVybiAyOworCQkvKiBicmVhazsgKi8KKwlkZWZhdWx0OgorCQkgLyogTm9uLXNwZWNpYWwgdmFsdWUsIG5vIHRyYW5zcGFyZW5jeSByZXF1aXJlZCAqLworCQlidWZbMF0gPSBieXRlOworCQlyZXR1cm4gMTsKKwkJLyogYnJlYWs7ICovCisJfQorfQorCisvKgorICogRnVuY3Rpb24gYXN5bmNfd3JhcCAoc2tiLCAqdHhfYnVmZiwgYnVmZnNpemUpCisgKgorICogICAgTWFrZXMgYSBuZXcgYnVmZmVyIHdpdGggd3JhcHBpbmcgYW5kIHN0dWZmaW5nLCBzaG91bGQgY2hlY2sgdGhhdAorICogICAgd2UgZG9uJ3QgZ2V0IHR4IGJ1ZmZlciBvdmVyZmxvdy4KKyAqLworaW50IGFzeW5jX3dyYXBfc2tiKHN0cnVjdCBza19idWZmICpza2IsIF9fdTggKnR4X2J1ZmYsIGludCBidWZmc2l6ZSkKK3sKKwlzdHJ1Y3QgaXJkYV9za2JfY2IgKmNiID0gKHN0cnVjdCBpcmRhX3NrYl9jYiAqKSBza2ItPmNiOworCWludCB4Ym9mczsKKwlpbnQgaTsKKwlpbnQgbjsKKwl1bmlvbiB7CisJCV9fdTE2IHZhbHVlOworCQlfX3U4IGJ5dGVzWzJdOworCX0gZmNzOworCisJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlmY3MudmFsdWUgPSBJTklUX0ZDUzsKKwluID0gMDsKKworCS8qCisJICogIFNlbmQgIFhCT0YncyBmb3IgcmVxdWlyZWQgbWluLiB0dXJuIHRpbWUgYW5kIGZvciB0aGUgbmVnb3RpYXRlZAorCSAqICBhZGRpdGlvbmFsIFhCT0ZTCisJICovCisKKwlpZiAoY2ItPm1hZ2ljICE9IExBUF9NQUdJQykgeworCQkvKgorCQkgKiBUaGlzIHdpbGwgaGFwcGVuIGZvciBhbGwgZnJhbWVzIHNlbnQgZnJvbSB1c2VyLXNwYWNlLgorCQkgKiBOb3RoaW5nIHRvIHdvcnJ5IGFib3V0LCBidXQgd2Ugc2V0IHRoZSBkZWZhdWx0IG51bWJlciBvZgorCQkgKiBCT0YncworCQkgKi8KKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgd3JvbmcgbWFnaWMgaW4gc2tiIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJeGJvZnMgPSAxMDsKKwl9IGVsc2UKKwkJeGJvZnMgPSBjYi0+eGJvZnMgKyBjYi0+eGJvZnNfZGVsYXk7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpLCB4Ym9mcz0lZFxuIiwgX19GVU5DVElPTl9fLCB4Ym9mcyk7CisKKwkvKiBDaGVjayB0aGF0IHdlIG5ldmVyIHVzZSBtb3JlIHRoYW4gMTE1ICsgNDggeGJvZnMgKi8KKwlpZiAoeGJvZnMgPiAxNjMpIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdG9vIG1hbnkgeGJvZnMgKCVkKVxuIiwgX19GVU5DVElPTl9fLAorCQkJICAgeGJvZnMpOworCQl4Ym9mcyA9IDE2MzsKKwl9CisKKwltZW1zZXQodHhfYnVmZiArIG4sIFhCT0YsIHhib2ZzKTsKKwluICs9IHhib2ZzOworCisJLyogU3RhcnQgb2YgcGFja2V0IGNoYXJhY3RlciBCT0YgKi8KKwl0eF9idWZmW24rK10gPSBCT0Y7CisKKwkvKiBJbnNlcnQgZnJhbWUgYW5kIGNhbGMgQ1JDICovCisJZm9yIChpPTA7IGkgPCBza2ItPmxlbjsgaSsrKSB7CisJCS8qCisJCSAqICBDaGVjayBmb3IgdGhlIHBvc3NpYmlsaXR5IG9mIHR4IGJ1ZmZlciBvdmVyZmxvdy4gV2UgdXNlCisJCSAqICBidWZzaXplLTUgc2luY2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlCisJCSAqICB0cmFuc21pdHRlZCBhZnRlciB0aGlzIHBvaW50IGlzIDUuCisJCSAqLworCQlpZihuID49IChidWZmc2l6ZS01KSkgeworCQkJSVJEQV9FUlJPUigiJXMoKSwgdHggYnVmZmVyIG92ZXJmbG93IChuPSVkKVxuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18sIG4pOworCQkJcmV0dXJuIG47CisJCX0KKworCQluICs9IHN0dWZmX2J5dGUoc2tiLT5kYXRhW2ldLCB0eF9idWZmK24pOworCQlmY3MudmFsdWUgPSBpcmRhX2ZjcyhmY3MudmFsdWUsIHNrYi0+ZGF0YVtpXSk7CisJfQorCisJLyogSW5zZXJ0IENSQyBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCAoTFNCIGZpcnN0KSAqLworCWZjcy52YWx1ZSA9IH5mY3MudmFsdWU7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJbiArPSBzdHVmZl9ieXRlKGZjcy5ieXRlc1swXSwgdHhfYnVmZituKTsKKwluICs9IHN0dWZmX2J5dGUoZmNzLmJ5dGVzWzFdLCB0eF9idWZmK24pOworI2Vsc2UgLyogaWZkZWYgX19CSUdfRU5ESUFOICovCisJbiArPSBzdHVmZl9ieXRlKGZjcy5ieXRlc1sxXSwgdHhfYnVmZituKTsKKwluICs9IHN0dWZmX2J5dGUoZmNzLmJ5dGVzWzBdLCB0eF9idWZmK24pOworI2VuZGlmCisJdHhfYnVmZltuKytdID0gRU9GOworCisJcmV0dXJuIG47Cit9CitFWFBPUlRfU1lNQk9MKGFzeW5jX3dyYXBfc2tiKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogRlJBTUUgVU5XUkFQUElORyAqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFVud3JhcCBhbmQgdW5zdHVmZiBTSVIgZnJhbWVzCisgKgorICogQ29tcGxldGUgcmV3cml0ZSBieSBKZWFuIElJIDoKKyAqIE1vcmUgaW5saW5lLCBmYXN0ZXIsIG1vcmUgY29tcGFjdCwgbW9yZSBsb2dpY2FsLiBKZWFuIElJCisgKiAoMTYgYnl0ZXMgb24gUDYgMjAwTUh6LCBvbGQgNSB0byA3IHVzLCBuZXcgNCB0byA2IHVzKQorICogKDI0IGJ5dGVzIG9uIFA2IDIwME1Ieiwgb2xkIDkgdG8gMTAgdXMsIG5ldyA3IHRvIDggdXMpCisgKiAoZm9yIHJlZmVyZW5jZSwgMTE1MjAwIGIvcyBpcyAxIGJ5dGUgZXZlcnkgNjkgdXMpCisgKiBBbmQgcmVkdWNlIHdyYXBwZXIubyBieSB+OTAwQiBpbiB0aGUgcHJvY2VzcyA7LSkKKyAqCisgKiBUaGVuLCB3ZSBoYXZlIHRoZSBhZGRpdGlvbiBvZiBaZXJvQ29weSwgd2hpY2ggaXMgb3B0aW9uYWwKKyAqIChpLmUuIHRoZSBkcml2ZXIgbXVzdCBpbml0aWF0ZSBpdCkgYW5kIGltcHJvdmUgZmluYWwgcHJvY2Vzc2luZy4KKyAqICgyMDA1IEIgZnJhbWUgKyBFT0Ygb24gUDYgMjAwTUh6LCB3aXRob3V0IDMwIHRvIDUwIHVzLCB3aXRoIDEwIHRvIDI1IHVzKQorICoKKyAqIE5vdGUgOiBhdCBGSVIgYW5kIE1JUiwgSERMQyBmcmFtaW5nIGlzIHVzZWQgYW5kIHVzdWFsbHkgaGFuZGxlZAorICogYnkgdGhlIGNvbnRyb2xsZXIsIHNvIHdlIGNvbWUgaGVyZSBvbmx5IGZvciBTSVIuLi4gSmVhbiBJSQorICovCisKKy8qCisgKiBXZSBjYW4gYWxzbyBjaG9vc2Ugd2hlcmUgd2Ugd2FudCB0byBkbyB0aGUgQ1JDIGNhbGN1bGF0aW9uLiBXZSBjYW4KKyAqIGRvIGl0ICJpbmxpbmUiLCBhcyB3ZSByZWNlaXZlIHRoZSBieXRlcywgb3IgInBvc3Rwb25lZCIsIHdoZW4KKyAqIHJlY2VpdmluZyB0aGUgRW5kLU9mLUZyYW1lLgorICogKDE2IGJ5dGVzIG9uIFA2IDIwME1IeiwgaW5saW5lZCA0IHRvIDYgdXMsIHBvc3Rwb25lZCA0IHRvIDUgdXMpCisgKiAoMjQgYnl0ZXMgb24gUDYgMjAwTUh6LCBpbmxpbmVkIDcgdG8gOCB1cywgcG9zdHBvbmVkIDUgdG8gNyB1cykKKyAqIFdpdGggWmVyb0NvcHkgOgorICogKDIwMDUgQiBmcmFtZSBvbiBQNiAyMDBNSHosIGlubGluZWQgMTAgdG8gMjUgdXMsIHBvc3Rwb25lZCAxNDAgdG8gMTgwIHVzKQorICogV2l0aG91dCBaZXJvQ29weSA6CisgKiAoMjAwNSBCIGZyYW1lIG9uIFA2IDIwME1IeiwgaW5saW5lZCAzMCB0byA1MCB1cywgcG9zdHBvbmVkIDE1MCB0byAxODAgdXMpCisgKiAoTm90ZSA6IG51bWJlcnMgdGFrZW4gd2l0aCBpcnEgZGlzYWJsZWQpCisgKgorICogRnJvbSB0aG9zZSBudW1iZXJzLCBpdCdzIG5vdCBjbGVhciB3aGljaCBpcyB0aGUgYmVzdCBzdHJhdGVneSwgYmVjYXVzZQorICogd2UgZW5kIHVwIHJ1bm5pbmcgdGhyb3VnaCBhIGxvdCBvZiBkYXRhIG9uZSB3YXkgb3IgYW5vdGhlciAoaS5lLiBjYWNoZQorICogbWlzc2VzKS4gSSBwZXJzb25hbGx5IHByZWZlciB0byBhdm9pZCB0aGUgaHVnZSBsYXRlbmN5IHNwaWtlIG9mIHRoZQorICogInBvc3Rwb25lZCIgc29sdXRpb24sIGJlY2F1c2UgaXQgY29tZSBqdXN0IGF0IHRoZSB0aW1lIHdoZW4gd2UgaGF2ZQorICogbG90J3Mgb2YgcHJvdG9jb2wgcHJvY2Vzc2luZyB0byBkbyBhbmQgaXQgd2lsbCBodXJ0IG91ciBhYmlsaXR5IHRvCisgKiByZWFjaCBsb3cgbGluayB0dXJuYXJvdW5kIHRpbWVzLi4uIEplYW4gSUkKKyAqLworLy8jZGVmaW5lIFBPU1RQT05FX1JYX0NSQworCisvKgorICogRnVuY3Rpb24gYXN5bmNfYnVtcCAoYnVmLCBsZW4sIHN0YXRzKQorICoKKyAqICAgIEdvdCBhIGZyYW1lLCBtYWtlIGEgY29weSBvZiBpdCwgYW5kIHBhc3MgaXQgdXAgdGhlIHN0YWNrISBXZSBjYW4gdHJ5CisgKiAgICB0byBpbmxpbmUgaXQgc2luY2UgaXQncyBvbmx5IGNhbGxlZCBmcm9tIHN0YXRlX2luc2lkZV9mcmFtZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2FzeW5jX2J1bXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMsCisJICAgaW9idWZmX3QgKnJ4X2J1ZmYpCit7CisJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZGF0YXNrYjsKKwlpbnQJCWRvY29weTsKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gY29weSB0aGUgZGF0YSB0byBhIG5ldyBza2Igb3Igbm90LgorCSAqIElmIHRoZSBkcml2ZXIgZG9lc24ndCB1c2UgWmVyb0NvcHkgUngsIHdlIGhhdmUgdG8gZG8gaXQuCisJICogV2l0aCBaZXJvQ29weSBSeCwgdGhlIHJ4X2J1ZmYgYWxyZWFkeSBwb2ludCB0byBhIHZhbGlkCisJICogc2tiLiBCdXQsIGlmIHRoZSBmcmFtZSBpcyBzbWFsbCwgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8KKwkgKiBjb3B5IGl0IHRvIHNhdmUgbWVtb3J5IChjb3B5IHdpbGwgYmUgZmFzdCBhbnl3YXkgLSB0aGF0J3MKKwkgKiBjYWxsZWQgUngtY29weS1icmVhaykuIEplYW4gSUkgKi8KKwlkb2NvcHkgPSAoKHJ4X2J1ZmYtPnNrYiA9PSBOVUxMKSB8fAorCQkgIChyeF9idWZmLT5sZW4gPCBJUkRBX1JYX0NPUFlfVEhSRVNIT0xEKSk7CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyBza2IgKi8KKwluZXdza2IgPSBkZXZfYWxsb2Nfc2tiKGRvY29weSA/IHJ4X2J1ZmYtPmxlbiArIDEgOiByeF9idWZmLT50cnVlc2l6ZSk7CisJaWYgKCFuZXdza2IpICB7CisJCXN0YXRzLT5yeF9kcm9wcGVkKys7CisJCS8qIFdlIGNvdWxkIGRlbGl2ZXIgdGhlIGN1cnJlbnQgc2tiIGlmIGRvaW5nIFplcm9Db3B5IFJ4LAorCQkgKiBidXQgdGhpcyB3b3VsZCBzdGFsbCB0aGUgUnggcGF0aC4gQmV0dGVyIGRyb3AgdGhlCisJCSAqIHBhY2tldC4uLiBKZWFuIElJICovCisJCXJldHVybjsKKwl9CisKKwkvKiBBbGlnbiBJUCBoZWFkZXIgdG8gMjAgYnl0ZXMgKGkuZS4gaW5jcmVhc2Ugc2tiLT5kYXRhKQorCSAqIE5vdGUgdGhpcyBpcyBvbmx5IHVzZWZ1bCB3aXRoIElyTEFOLCBhcyBQUFAgaGFzIGEgdmFyaWFibGUKKwkgKiBoZWFkZXIgc2l6ZSAoMiBvciAxIGJ5dGVzKSAtIEplYW4gSUkgKi8KKwlza2JfcmVzZXJ2ZShuZXdza2IsIDEpOworCisJaWYoZG9jb3B5KSB7CisJCS8qIENvcHkgZGF0YSB3aXRob3V0IENSQyAobGVuZ2h0IGFscmVhZHkgY2hlY2tlZCkgKi8KKwkJbWVtY3B5KG5ld3NrYi0+ZGF0YSwgcnhfYnVmZi0+ZGF0YSwgcnhfYnVmZi0+bGVuIC0gMik7CisJCS8qIERlbGl2ZXIgdGhpcyBza2IgKi8KKwkJZGF0YXNrYiA9IG5ld3NrYjsKKwl9IGVsc2UgeworCQkvKiBXZSBhcmUgdXNpbmcgWmVyb0NvcHkuIERlbGl2ZXIgb2xkIHNrYiAqLworCQlkYXRhc2tiID0gcnhfYnVmZi0+c2tiOworCQkvKiBBbmQgaG9vayB0aGUgbmV3IHNrYiB0byB0aGUgcnhfYnVmZiAqLworCQlyeF9idWZmLT5za2IgPSBuZXdza2I7CisJCXJ4X2J1ZmYtPmhlYWQgPSBuZXdza2ItPmRhdGE7CS8qIE5PVCBuZXdza2ItPmhlYWQgKi8KKwkJLy9wcmludGsoS0VSTl9ERUJVRyAiWmVyb0NvcHkgOiBsZW4gPSAlZCwgZGF0YXNrYiA9ICVwLCBuZXdza2IgPSAlcFxuIiwgcnhfYnVmZi0+bGVuLCBkYXRhc2tiLCBuZXdza2IpOworCX0KKworCS8qIFNldCBwcm9wZXIgbGVuZ3RoIG9uIHNrYiAod2l0aG91dCBDUkMpICovCisJc2tiX3B1dChkYXRhc2tiLCByeF9idWZmLT5sZW4gLSAyKTsKKworCS8qIEZlZWQgaXQgdG8gSXJMQVAgbGF5ZXIgKi8KKwlkYXRhc2tiLT5kZXYgPSBkZXY7CisJZGF0YXNrYi0+bWFjLnJhdyAgPSBkYXRhc2tiLT5kYXRhOworCWRhdGFza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVJEQSk7CisKKwluZXRpZl9yeChkYXRhc2tiKTsKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHJ4X2J1ZmYtPmxlbjsKKworCS8qIENsZWFuIHVwIHJ4X2J1ZmYgKHJlZHVuZGFudCB3aXRoIGFzeW5jX3Vud3JhcF9ib2YoKSA/Pz8pICovCisJcnhfYnVmZi0+ZGF0YSA9IHJ4X2J1ZmYtPmhlYWQ7CisJcnhfYnVmZi0+bGVuID0gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGFzeW5jX3Vud3JhcF9ib2YoZGV2LCBieXRlKQorICoKKyAqICAgIEhhbmRsZSBCZWdpbm5pbmcgT2YgRnJhbWUgY2hhcmFjdGVyIHJlY2VpdmVkIHdpdGhpbiBhIGZyYW1lCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2FzeW5jX3Vud3JhcF9ib2Yoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cywKKwkJIGlvYnVmZl90ICpyeF9idWZmLCBfX3U4IGJ5dGUpCit7CisJc3dpdGNoKHJ4X2J1ZmYtPnN0YXRlKSB7CisJY2FzZSBMSU5LX0VTQ0FQRToKKwljYXNlIElOU0lERV9GUkFNRToKKwkJLyogTm90IHN1cHBvc2VkIHRvIGhhcHBlbiwgdGhlIHByZXZpb3VzIGZyYW1lIGlzIG5vdAorCQkgKiBmaW5pc2hlZCAtIEplYW4gSUkgKi8KKwkJSVJEQV9ERUJVRygxLCAiJXMoKSwgRGlzY2FyZGluZyBpbmNvbXBsZXRlIGZyYW1lXG4iLAorCQkJICAgX19GVU5DVElPTl9fKTsKKwkJc3RhdHMtPnJ4X2Vycm9ycysrOworCQlzdGF0cy0+cnhfbWlzc2VkX2Vycm9ycysrOworCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShkZXYsIFRSVUUpOworCQlicmVhazsKKworCWNhc2UgT1VUU0lERV9GUkFNRToKKwljYXNlIEJFR0lOX0ZSQU1FOgorCWRlZmF1bHQ6CisJCS8qIFdlIG1heSByZWNlaXZlIG11bHRpcGxlIEJPRiBhdCB0aGUgc3RhcnQgb2YgZnJhbWUgKi8gCisJCWJyZWFrOworCX0KKworCS8qIE5vdyByZWNlaXZpbmcgZnJhbWUgKi8KKwlyeF9idWZmLT5zdGF0ZSA9IEJFR0lOX0ZSQU1FOworCXJ4X2J1ZmYtPmluX2ZyYW1lID0gVFJVRTsKKworCS8qIFRpbWUgdG8gaW5pdGlhbGl6ZSByZWNlaXZlIGJ1ZmZlciAqLworCXJ4X2J1ZmYtPmRhdGEgPSByeF9idWZmLT5oZWFkOworCXJ4X2J1ZmYtPmxlbiA9IDA7CisJcnhfYnVmZi0+ZmNzID0gSU5JVF9GQ1M7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBhc3luY191bndyYXBfZW9mKGRldiwgYnl0ZSkKKyAqCisgKiAgICBIYW5kbGUgRW5kIE9mIEZyYW1lIGNoYXJhY3RlciByZWNlaXZlZCB3aXRoaW4gYSBmcmFtZQorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkCithc3luY191bndyYXBfZW9mKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMsCisJCSBpb2J1ZmZfdCAqcnhfYnVmZiwgX191OCBieXRlKQoreworI2lmZGVmIFBPU1RQT05FX1JYX0NSQworCWludAlpOworI2VuZGlmCisKKwlzd2l0Y2gocnhfYnVmZi0+c3RhdGUpIHsKKwljYXNlIE9VVFNJREVfRlJBTUU6CisJCS8qIFByb2JhYmx5IG1pc3NlZCB0aGUgQk9GICovCisJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisKKwljYXNlIEJFR0lOX0ZSQU1FOgorCWNhc2UgTElOS19FU0NBUEU6CisJY2FzZSBJTlNJREVfRlJBTUU6CisJZGVmYXVsdDoKKwkJLyogTm90ZSA6IGluIHRoZSBjYXNlIG9mIEJFR0lOX0ZSQU1FIGFuZCBMSU5LX0VTQ0FQRSwKKwkJICogdGhlIGZjcyB3aWxsIG1vc3QgbGlrZWx5IG5vdCBtYXRjaCBhbmQgZ2VuZXJhdGUgYW4KKwkJICogZXJyb3IsIGFzIGV4cGVjdGVkIC0gSmVhbiBJSSAqLworCQlyeF9idWZmLT5zdGF0ZSA9IE9VVFNJREVfRlJBTUU7CisJCXJ4X2J1ZmYtPmluX2ZyYW1lID0gRkFMU0U7CisKKyNpZmRlZiBQT1NUUE9ORV9SWF9DUkMKKwkJLyogSWYgd2UgaGF2ZW4ndCBkb25lIHRoZSBDUkMgYXMgd2UgcmVjZWl2ZSBieXRlcywgd2UKKwkJICogbXVzdCBkbyBpdCBub3cuLi4gSmVhbiBJSSAqLworCQlmb3IoaSA9IDA7IGkgPCByeF9idWZmLT5sZW47IGkrKykKKwkJCXJ4X2J1ZmYtPmZjcyA9IGlyZGFfZmNzKHJ4X2J1ZmYtPmZjcywKKwkJCQkJCXJ4X2J1ZmYtPmRhdGFbaV0pOworI2VuZGlmCisKKwkJLyogVGVzdCBGQ1MgYW5kIHNpZ25hbCBzdWNjZXNzIGlmIHRoZSBmcmFtZSBpcyBnb29kICovCisJCWlmIChyeF9idWZmLT5mY3MgPT0gR09PRF9GQ1MpIHsKKwkJCS8qIERlbGl2ZXIgZnJhbWUgKi8KKwkJCWFzeW5jX2J1bXAoZGV2LCBzdGF0cywgcnhfYnVmZik7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCS8qIFdyb25nIENSQywgZGlzY2FyZCBmcmFtZSEgICovCisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShkZXYsIFRSVUUpOworCisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBjcmMgZXJyb3JcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlzdGF0cy0+cnhfZXJyb3JzKys7CisJCQlzdGF0cy0+cnhfY3JjX2Vycm9ycysrOworCQl9CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGFzeW5jX3Vud3JhcF9jZShkZXYsIGJ5dGUpCisgKgorICogICAgSGFuZGxlIENoYXJhY3RlciBFc2NhcGUgY2hhcmFjdGVyIHJlY2VpdmVkIHdpdGhpbiBhIGZyYW1lCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2FzeW5jX3Vud3JhcF9jZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzLAorCQkgaW9idWZmX3QgKnJ4X2J1ZmYsIF9fdTggYnl0ZSkKK3sKKwlzd2l0Y2gocnhfYnVmZi0+c3RhdGUpIHsKKwljYXNlIE9VVFNJREVfRlJBTUU6CisJCS8qIEFjdGl2YXRlIGNhcnJpZXIgc2Vuc2UgKi8KKwkJaXJkYV9kZXZpY2Vfc2V0X21lZGlhX2J1c3koZGV2LCBUUlVFKTsKKwkJYnJlYWs7CisKKwljYXNlIExJTktfRVNDQVBFOgorCQlJUkRBX1dBUk5JTkcoIiVzOiBzdGF0ZSBub3QgZGVmaW5lZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisKKwljYXNlIEJFR0lOX0ZSQU1FOgorCWNhc2UgSU5TSURFX0ZSQU1FOgorCWRlZmF1bHQ6CisJCS8qIFN0dWZmZWQgYnl0ZSBjb21pbmcgKi8KKwkJcnhfYnVmZi0+c3RhdGUgPSBMSU5LX0VTQ0FQRTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gYXN5bmNfdW53cmFwX290aGVyKGRldiwgYnl0ZSkKKyAqCisgKiAgICBIYW5kbGUgb3RoZXIgY2hhcmFjdGVycyByZWNlaXZlZCB3aXRoaW4gYSBmcmFtZQorICoKKyAqLworc3RhdGljIGlubGluZSB2b2lkCithc3luY191bndyYXBfb3RoZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzLAorCQkgICBpb2J1ZmZfdCAqcnhfYnVmZiwgX191OCBieXRlKQoreworCXN3aXRjaChyeF9idWZmLT5zdGF0ZSkgeworCQkvKiBUaGlzIGlzIG9uIHRoZSBjcml0aWNhbCBwYXRoLCBjYXNlIGFyZSBvcmRlcmVkIGJ5CisJCSAqIHByb2JhYmlsaXR5IChtb3N0IGZyZXF1ZW50IGZpcnN0KSAtIEplYW4gSUkgKi8KKwljYXNlIElOU0lERV9GUkFNRToKKwkJLyogTXVzdCBiZSB0aGUgbmV4dCBieXRlIG9mIHRoZSBmcmFtZSAqLworCQlpZiAocnhfYnVmZi0+bGVuIDwgcnhfYnVmZi0+dHJ1ZXNpemUpICB7CisJCQlyeF9idWZmLT5kYXRhW3J4X2J1ZmYtPmxlbisrXSA9IGJ5dGU7CisjaWZuZGVmIFBPU1RQT05FX1JYX0NSQworCQkJcnhfYnVmZi0+ZmNzID0gaXJkYV9mY3MocnhfYnVmZi0+ZmNzLCBieXRlKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgUnggYnVmZmVyIG92ZXJmbG93LCBhYm9ydGluZ1xuIiwKKwkJCQkgICBfX0ZVTkNUSU9OX18pOworCQkJcnhfYnVmZi0+c3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCQl9CisJCWJyZWFrOworCisJY2FzZSBMSU5LX0VTQ0FQRToKKwkJLyoKKwkJICogIFN0dWZmZWQgY2hhciwgY29tcGxlbWVudCBiaXQgNSBvZiBieXRlCisJCSAqICBmb2xsb3dpbmcgQ0UsIElyTEFQIHAuMTE0CisJCSAqLworCQlieXRlIF49IElSREFfVFJBTlM7CisJCWlmIChyeF9idWZmLT5sZW4gPCByeF9idWZmLT50cnVlc2l6ZSkgIHsKKwkJCXJ4X2J1ZmYtPmRhdGFbcnhfYnVmZi0+bGVuKytdID0gYnl0ZTsKKyNpZm5kZWYgUE9TVFBPTkVfUlhfQ1JDCisJCQlyeF9idWZmLT5mY3MgPSBpcmRhX2ZjcyhyeF9idWZmLT5mY3MsIGJ5dGUpOworI2VuZGlmCisJCQlyeF9idWZmLT5zdGF0ZSA9IElOU0lERV9GUkFNRTsKKwkJfSBlbHNlIHsKKwkJCUlSREFfREVCVUcoMSwgIiVzKCksIFJ4IGJ1ZmZlciBvdmVyZmxvdywgYWJvcnRpbmdcbiIsCisJCQkJICAgX19GVU5DVElPTl9fKTsKKwkJCXJ4X2J1ZmYtPnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgT1VUU0lERV9GUkFNRToKKwkJLyogQWN0aXZhdGUgY2FycmllciBzZW5zZSAqLworCQlpZihieXRlICE9IFhCT0YpCisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShkZXYsIFRSVUUpOworCQlicmVhazsKKworCWNhc2UgQkVHSU5fRlJBTUU6CisJZGVmYXVsdDoKKwkJcnhfYnVmZi0+ZGF0YVtyeF9idWZmLT5sZW4rK10gPSBieXRlOworI2lmbmRlZiBQT1NUUE9ORV9SWF9DUkMKKwkJcnhfYnVmZi0+ZmNzID0gaXJkYV9mY3MocnhfYnVmZi0+ZmNzLCBieXRlKTsKKyNlbmRpZgorCQlyeF9idWZmLT5zdGF0ZSA9IElOU0lERV9GUkFNRTsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gYXN5bmNfdW53cmFwX2NoYXIgKGRldiwgcnhfYnVmZiwgYnl0ZSkKKyAqCisgKiAgICBQYXJzZSBhbmQgZGUtc3R1ZmYgZnJhbWUgcmVjZWl2ZWQgZnJvbSB0aGUgSXJEQS1wb3J0CisgKgorICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgU0lSIGRyaXZlcnMuCisgKi8KK3ZvaWQgYXN5bmNfdW53cmFwX2NoYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cywKKwkJICAgICAgIGlvYnVmZl90ICpyeF9idWZmLCBfX3U4IGJ5dGUpCit7CisJc3dpdGNoKGJ5dGUpIHsKKwljYXNlIENFOgorCQlhc3luY191bndyYXBfY2UoZGV2LCBzdGF0cywgcnhfYnVmZiwgYnl0ZSk7CisJCWJyZWFrOworCWNhc2UgQk9GOgorCQlhc3luY191bndyYXBfYm9mKGRldiwgc3RhdHMsIHJ4X2J1ZmYsIGJ5dGUpOworCQlicmVhazsKKwljYXNlIEVPRjoKKwkJYXN5bmNfdW53cmFwX2VvZihkZXYsIHN0YXRzLCByeF9idWZmLCBieXRlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXN5bmNfdW53cmFwX290aGVyKGRldiwgc3RhdHMsIHJ4X2J1ZmYsIGJ5dGUpOworCQlicmVhazsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGFzeW5jX3Vud3JhcF9jaGFyKTsKKwo=