From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jerome Anand Subject: [PATCH V3 4/5] ALSA: x86: hdmi: Add audio support for BYT and CHT Date: Tue, 10 Jan 2017 10:38:40 +0530 Message-ID: <20170110050841.31900-5-jerome.anand@intel.com> References: <20170110050841.31900-1-jerome.anand@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170110050841.31900-1-jerome.anand@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org, alsa-devel@alsa-project.org Cc: tiwai@suse.de, broonie@kernel.org, rakesh.a.ughreja@intel.com List-Id: alsa-devel@alsa-project.org SGRtaSBhdWRpbyBkcml2ZXIgYmFzZWQgb24gdGhlIGNoaWxkIHBsYXRmb3JtIGRldmljZQpjcmVh dGVkIGJ5IGdmeCBkcml2ZXIgaXMgaW1wbGVtZW50ZWQuClRoaXMgYXVkaW8gZHJpdmVyIGlzIGRl cml2ZWQgZnJvbSBsZWdhY3kgaW50ZWwKaGRtaSBhdWRpbyBkcml2ZXIuCgpUaGUgaW50ZXJmYWNl cyBmb3IgaW50ZXJhY3Rpb24gYmV0d2VlbiBnZnggYW5kIGF1ZGlvCmFyZSB1cGRhdGVkIGFuZCB0 aGUgZHJpdmVyIGltcGxlbWVudGF0aW9uIHVwZGF0ZWQgdG8KZGVyaXZlIGludGVycnVwdHMgaW4g aXRzIG93biBhZGRyZXNzIHNwYWNlIGJhc2VkIG9uCmlycSBjaGlwIGZyYW1ld29yawoKVGhlIGNo YW5nZXMgdG8gY2FsY3VsYXRlIHN1Yi1wZXJpb2QgcG9zaXRpb25zIHdhcyB0cmlnZ2VyZWQKYnkg RGF2aWQgSGVubmluZ3Nzb24gPGRhdmlkLmhlbm5pbmdzc29uQGNhbm9uaWNhbC5jb20+IGFuZCBp cwphY2NvbW9kYXRlZCBpbiB0aGlzIHBhdGNoCgpTaWduZWQtb2ZmLWJ5OiBQaWVycmUtTG91aXMg Qm9zc2FydCA8cGllcnJlLWxvdWlzLmJvc3NhcnRAbGludXguaW50ZWwuY29tPgpTaWduZWQtb2Zm LWJ5OiBKZXJvbWUgQW5hbmQgPGplcm9tZS5hbmFuZEBpbnRlbC5jb20+Ci0tLQogc291bmQveDg2 L01ha2VmaWxlICAgICAgICAgICAgICAgfCAgICAyICsKIHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1 ZGlvLmMgICAgIHwgMTkxNyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwog c291bmQveDg2L2ludGVsX2hkbWlfYXVkaW8uaCAgICAgfCAgMjAxICsrKysKIHNvdW5kL3g4Ni9p bnRlbF9oZG1pX2F1ZGlvX2lmLmMgIHwgIDU1MSArKysrKysrKysrKwogc291bmQveDg2L2ludGVs X2hkbWlfbHBlX2F1ZGlvLmMgfCAgIDE1ICstCiA1IGZpbGVzIGNoYW5nZWQsIDI2ODAgaW5zZXJ0 aW9ucygrKSwgNiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC94ODYvaW50 ZWxfaGRtaV9hdWRpby5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc291bmQveDg2L2ludGVsX2hkbWlf YXVkaW8uaAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvX2lm LmMKCmRpZmYgLS1naXQgYS9zb3VuZC94ODYvTWFrZWZpbGUgYi9zb3VuZC94ODYvTWFrZWZpbGUK aW5kZXggNTRkMDAyZC4uYThkMWE4YSAxMDA2NDQKLS0tIGEvc291bmQveDg2L01ha2VmaWxlCisr KyBiL3NvdW5kL3g4Ni9NYWtlZmlsZQpAQCAtMSw2ICsxLDggQEAKIGNjZmxhZ3MteSArPSAtSWlu Y2x1ZGUvZHJtCiAKIHNuZC1oZG1pLWxwZS1hdWRpby1vYmpzICs9IFwKKwlpbnRlbF9oZG1pX2F1 ZGlvLm8gXAorCWludGVsX2hkbWlfYXVkaW9faWYubyBcCiAJaW50ZWxfaGRtaV9scGVfYXVkaW8u bwogCiBvYmotJChDT05GSUdfSERNSV9MUEVfQVVESU8pICs9IHNuZC1oZG1pLWxwZS1hdWRpby5v CmRpZmYgLS1naXQgYS9zb3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpby5jIGIvc291bmQveDg2L2lu dGVsX2hkbWlfYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzA1 YzVjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQveDg2L2ludGVsX2hkbWlfYXVkaW8uYwpAQCAt MCwwICsxLDE5MTcgQEAKKy8qCisgKiAgIGludGVsX2hkbWlfYXVkaW8uYyAtIEludGVsIEhETUkg YXVkaW8gZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykgMjAxNiBJbnRlbCBDb3JwCisgKiAg QXV0aG9yczoJU2FpbGFqYSBCYW5kYXJ1cGFsbGkgPHNhaWxhamEuYmFuZGFydXBhbGxpQGludGVs LmNvbT4KKyAqCQlSYW1lc2ggQmFidSBLIFYJPHJhbWVzaC5iYWJ1QGludGVsLmNvbT4KKyAqCQlW YWliaGF2IEFnYXJ3YWwgPHZhaWJoYXYuYWdhcndhbEBpbnRlbC5jb20+CisgKgkJSmVyb21lIEFu YW5kIDxqZXJvbWUuYW5hbmRAaW50ZWwuY29tPgorICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgor ICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3Jh bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQK KyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh bnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl IGRldGFpbHMuCisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqIEFMU0EgZHJpdmVyIGZvciBJ bnRlbCBIRE1JIGF1ZGlvCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KQkiaGFkOiAiIGZtdAor CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8u aD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cisj aW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5j bHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNv dW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8 c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlICJp bnRlbF9oZG1pX2F1ZGlvLmgiCisKK3N0YXRpYyBERUZJTkVfTVVURVgoaGFkX211dGV4KTsKKwor LypzdGFuZGFyZCBtb2R1bGUgb3B0aW9ucyBmb3IgQUxTQS4gVGhpcyBtb2R1bGUgc3VwcG9ydHMg b25seSBvbmUgY2FyZCovCitzdGF0aWMgaW50IGhkbWlfY2FyZF9pbmRleCA9IFNORFJWX0RFRkFV TFRfSURYMTsKK3N0YXRpYyBjaGFyICpoZG1pX2NhcmRfaWQgPSBTTkRSVl9ERUZBVUxUX1NUUjE7 CitzdGF0aWMgc3RydWN0IHNuZF9pbnRlbGhhZCAqaGFkX2RhdGE7CisKK21vZHVsZV9wYXJhbV9u YW1lZChpbmRleCwgaGRtaV9jYXJkX2luZGV4LCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVT QyhpbmRleCwKKwkJIkluZGV4IHZhbHVlIGZvciBJTlRFTCBJbnRlbCBIRE1JIEF1ZGlvIGNvbnRy b2xsZXIuIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoaWQsIGhkbWlfY2FyZF9pZCwgY2hhcnAsIDA0 NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwKKwkJIklEIHN0cmluZyBmb3IgSU5URUwgSW50ZWwg SERNSSBBdWRpbyBjb250cm9sbGVyLiIpOworCisvKgorICogRUxEIFNBIGJpdHMgaW4gdGhlIENF QSBTcGVha2VyIEFsbG9jYXRpb24gZGF0YSBibG9jaworKi8KK3N0YXRpYyBpbnQgZWxkX3NwZWFr ZXJfYWxsb2NhdGlvbl9iaXRzW10gPSB7CisJWzBdID0gRkwgfCBGUiwKKwlbMV0gPSBMRkUsCisJ WzJdID0gRkMsCisJWzNdID0gUkwgfCBSUiwKKwlbNF0gPSBSQywKKwlbNV0gPSBGTEMgfCBGUkMs CisJWzZdID0gUkxDIHwgUlJDLAorCS8qIHRoZSBmb2xsb3dpbmcgYXJlIG5vdCBkZWZpbmVkIGlu IEVMRCB5ZXQgKi8KKwlbN10gPSAwLAorfTsKKworLyoKKyAqIFRoaXMgaXMgYW4gb3JkZXJlZCBs aXN0IQorICoKKyAqIFRoZSBwcmVjZWRpbmcgb25lcyBoYXZlIGJldHRlciBjaGFuY2VzIHRvIGJl IHNlbGVjdGVkIGJ5CisgKiBoZG1pX2NoYW5uZWxfYWxsb2NhdGlvbigpLgorICovCitzdGF0aWMg c3RydWN0IGNlYV9jaGFubmVsX3NwZWFrZXJfYWxsb2NhdGlvbiBjaGFubmVsX2FsbG9jYXRpb25z W10gPSB7CisvKiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6ICAgNyAgICAgNiAgICA1 ICAgIDQgICAgMyAgICAgMiAgICAxICAgIDAgICovCit7IC5jYV9pbmRleCA9IDB4MDAsICAuc3Bl YWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgIEZSLCAgRkwgfSB9LAor CQkJCS8qIDIuMSAqLworeyAuY2FfaW5kZXggPSAweDAxLCAgLnNwZWFrZXJzID0geyAgIDAsICAg IDAsICAgMCwgICAwLCAgIDAsICBMRkUsICBGUiwgIEZMIH0gfSwKKwkJCQkvKiBEb2xieSBTdXJy b3VuZCAqLworeyAuY2FfaW5kZXggPSAweDAyLCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICAg MCwgICAwLCAgRkMsICAgIDAsICBGUiwgIEZMIH0gfSwKKwkJCQkvKiBzdXJyb3VuZDQwICovCit7 IC5jYV9pbmRleCA9IDB4MDgsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgIFJSLCAgUkwsICAg MCwgICAgMCwgIEZSLCAgRkwgfSB9LAorCQkJCS8qIHN1cnJvdW5kNDEgKi8KK3sgLmNhX2luZGV4 ID0gMHgwOSwgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgUlIsICBSTCwgICAwLCAgTEZFLCAg RlIsICBGTCB9IH0sCisJCQkJLyogc3Vycm91bmQ1MCAqLworeyAuY2FfaW5kZXggPSAweDBhLCAg LnNwZWFrZXJzID0geyAgIDAsICAgIDAsICBSUiwgIFJMLCAgRkMsICAgIDAsICBGUiwgIEZMIH0g fSwKKwkJCQkvKiBzdXJyb3VuZDUxICovCit7IC5jYV9pbmRleCA9IDB4MGIsICAuc3BlYWtlcnMg PSB7ICAgMCwgICAgMCwgIFJSLCAgUkwsICBGQywgIExGRSwgIEZSLCAgRkwgfSB9LAorCQkJCS8q IDYuMSAqLworeyAuY2FfaW5kZXggPSAweDBmLCAgLnNwZWFrZXJzID0geyAgIDAsICAgUkMsICBS UiwgIFJMLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKKwkJCQkvKiBzdXJyb3VuZDcxICovCit7 IC5jYV9pbmRleCA9IDB4MTMsICAuc3BlYWtlcnMgPSB7IFJSQywgIFJMQywgIFJSLCAgUkwsICBG QywgIExGRSwgIEZSLCAgRkwgfSB9LAorCit7IC5jYV9pbmRleCA9IDB4MDMsICAuc3BlYWtlcnMg PSB7ICAgMCwgICAgMCwgICAwLCAgIDAsICBGQywgIExGRSwgIEZSLCAgRkwgfSB9LAoreyAuY2Ff aW5kZXggPSAweDA0LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICAgMCwgIFJDLCAgIDAsICAg IDAsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgwNSwgIC5zcGVha2VycyA9IHsgICAw LCAgICAwLCAgIDAsICBSQywgICAwLCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9 IDB4MDYsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgUkMsICBGQywgICAgMCwgIEZS LCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDA3LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAs ICAgMCwgIFJDLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgwYywg IC5zcGVha2VycyA9IHsgICAwLCAgIFJDLCAgUlIsICBSTCwgICAwLCAgICAwLCAgRlIsICBGTCB9 IH0sCit7IC5jYV9pbmRleCA9IDB4MGQsICAuc3BlYWtlcnMgPSB7ICAgMCwgICBSQywgIFJSLCAg UkwsICAgMCwgIExGRSwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDBlLCAgLnNwZWFr ZXJzID0geyAgIDAsICAgUkMsICBSUiwgIFJMLCAgRkMsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sg LmNhX2luZGV4ID0gMHgxMCwgIC5zcGVha2VycyA9IHsgUlJDLCAgUkxDLCAgUlIsICBSTCwgICAw LCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MTEsICAuc3BlYWtlcnMgPSB7 IFJSQywgIFJMQywgIFJSLCAgUkwsICAgMCwgIExGRSwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5k ZXggPSAweDEyLCAgLnNwZWFrZXJzID0geyBSUkMsICBSTEMsICBSUiwgIFJMLCAgRkMsICAgIDAs ICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxNCwgIC5zcGVha2VycyA9IHsgRlJDLCAg RkxDLCAgIDAsICAgMCwgICAwLCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4 MTUsICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgICAwLCAgIDAsICAgMCwgIExGRSwgIEZSLCAg RkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDE2LCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICAg MCwgICAwLCAgRkMsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxNywgIC5z cGVha2VycyA9IHsgRlJDLCAgRkxDLCAgIDAsICAgMCwgIEZDLCAgTEZFLCAgRlIsICBGTCB9IH0s Cit7IC5jYV9pbmRleCA9IDB4MTgsICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgICAwLCAgUkMs ICAgMCwgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDE5LCAgLnNwZWFrZXJz ID0geyBGUkMsICBGTEMsICAgMCwgIFJDLCAgIDAsICBMRkUsICBGUiwgIEZMIH0gfSwKK3sgLmNh X2luZGV4ID0gMHgxYSwgIC5zcGVha2VycyA9IHsgRlJDLCAgRkxDLCAgIDAsICBSQywgIEZDLCAg ICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MWIsICAuc3BlYWtlcnMgPSB7IEZS QywgIEZMQywgICAwLCAgUkMsICBGQywgIExGRSwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXgg PSAweDFjLCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICBSUiwgIFJMLCAgIDAsICAgIDAsICBG UiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxZCwgIC5zcGVha2VycyA9IHsgRlJDLCAgRkxD LCAgUlIsICBSTCwgICAwLCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MWUs ICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgIFJSLCAgUkwsICBGQywgICAgMCwgIEZSLCAgRkwg fSB9LAoreyAuY2FfaW5kZXggPSAweDFmLCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICBSUiwg IFJMLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2hhbm5l bF9tYXBfdGFibGUgbWFwX3RhYmxlc1tdID0geworCXsgU05EUlZfQ0hNQVBfRkwsICAgICAgIDB4 MDAsICAgRkwgfSwKKwl7IFNORFJWX0NITUFQX0ZSLCAgICAgICAweDAxLCAgIEZSIH0sCisJeyBT TkRSVl9DSE1BUF9STCwgICAgICAgMHgwNCwgICBSTCB9LAorCXsgU05EUlZfQ0hNQVBfUlIsICAg ICAgIDB4MDUsICAgUlIgfSwKKwl7IFNORFJWX0NITUFQX0xGRSwgICAgICAweDAyLCAgIExGRSB9 LAorCXsgU05EUlZfQ0hNQVBfRkMsICAgICAgIDB4MDMsICAgRkMgfSwKKwl7IFNORFJWX0NITUFQ X1JMQywgICAgICAweDA2LCAgIFJMQyB9LAorCXsgU05EUlZfQ0hNQVBfUlJDLCAgICAgIDB4MDcs ICAgUlJDIH0sCisJe30gLyogdGVybWluYXRvciAqLworfTsKKworLyogaGFyZHdhcmUgY2FwYWJp bGl0eSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBz bmRfaW50ZWxfaGFkc3RyZWFtID0geworCS5pbmZvID0JKFNORFJWX1BDTV9JTkZPX0lOVEVSTEVB VkVEIHwKKwkJU05EUlZfUENNX0lORk9fRE9VQkxFIHwKKwkJU05EUlZfUENNX0lORk9fTU1BUHwK KwkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCVNORFJWX1BDTV9JTkZPX0JBVENIKSwK KwkuZm9ybWF0cyA9IChTTkRSVl9QQ01fRk1UQklUX1MyNCB8CisJCVNORFJWX1BDTV9GTVRCSVRf VTI0KSwKKwkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8CisJCVNORFJWX1BDTV9SQVRF XzQ0MTAwIHwKKwkJU05EUlZfUENNX1JBVEVfNDgwMDAgfAorCQlTTkRSVl9QQ01fUkFURV84ODIw MCB8CisJCVNORFJWX1BDTV9SQVRFXzk2MDAwIHwKKwkJU05EUlZfUENNX1JBVEVfMTc2NDAwIHwK KwkJU05EUlZfUENNX1JBVEVfMTkyMDAwLAorCS5yYXRlX21pbiA9IEhBRF9NSU5fUkFURSwKKwku cmF0ZV9tYXggPSBIQURfTUFYX1JBVEUsCisJLmNoYW5uZWxzX21pbiA9IEhBRF9NSU5fQ0hBTk5F TCwKKwkuY2hhbm5lbHNfbWF4ID0gSEFEX01BWF9DSEFOTkVMLAorCS5idWZmZXJfYnl0ZXNfbWF4 ID0gSEFEX01BWF9CVUZGRVIsCisJLnBlcmlvZF9ieXRlc19taW4gPSBIQURfTUlOX1BFUklPRF9C WVRFUywKKwkucGVyaW9kX2J5dGVzX21heCA9IEhBRF9NQVhfUEVSSU9EX0JZVEVTLAorCS5wZXJp b2RzX21pbiA9IEhBRF9NSU5fUEVSSU9EUywKKwkucGVyaW9kc19tYXggPSBIQURfTUFYX1BFUklP RFMsCisJLmZpZm9fc2l6ZSA9IEhBRF9GSUZPX1NJWkUsCit9OworCisvKiBSZWdpc3RlciBhY2Nl c3MgZnVuY3Rpb25zICovCisKK2lubGluZSBpbnQgaGFkX2dldF9od3N0YXRlKHN0cnVjdCBzbmRf aW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwkvKiBDaGVjayBmb3IgZGV2aWNlIHByZXNlbmNl IC1TVyBzdGF0ZSAqLworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFEX0RSVl9E SVNDT05ORUNURUQpIHsKKwkJcHJfZGVidWcoIiVzOkRldmljZSBub3QgY29ubmVjdGVkOiVkXG4i LCBfX2Z1bmNfXywKKwkJCQlpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMpOworCQlyZXR1cm4gLUVO T0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW5saW5lIGludCBoYWRfZ2V0X2NhcHMoZW51 bSBoYWRfY2Fwc19saXN0IHF1ZXJ5LCB2b2lkICpjYXBzKQoreworCWludCByZXR2YWw7CisJc3Ry dWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gaGFkX2RhdGE7CisKKwlyZXR2YWwgPSBo YWRfZ2V0X2h3c3RhdGUoaW50ZWxoYWRkYXRhKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0g aW50ZWxoYWRkYXRhLT5xdWVyeV9vcHMuaGRtaV9hdWRpb19nZXRfY2FwcyhxdWVyeSwKKwkJCQlj YXBzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2lubGluZSBpbnQgaGFkX3NldF9jYXBzKGVu dW0gaGFkX2NhcHNfbGlzdCBzZXRfZWxlbWVudCwgdm9pZCAqY2FwcykKK3sKKwlpbnQgcmV0dmFs OworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IGhhZF9kYXRhOworCisJcmV0 dmFsID0gaGFkX2dldF9od3N0YXRlKGludGVsaGFkZGF0YSk7CisJaWYgKCFyZXR2YWwpCisJCXJl dHZhbCA9IGludGVsaGFkZGF0YS0+cXVlcnlfb3BzLmhkbWlfYXVkaW9fc2V0X2NhcHMoCisJCQkJ c2V0X2VsZW1lbnQsIGNhcHMpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW5saW5lIGludCBo YWRfcmVhZF9yZWdpc3Rlcih1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90ICpkYXRhKQoreworCWlu dCByZXR2YWw7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gaGFkX2RhdGE7 CisKKwlyZXR2YWwgPSBoYWRfZ2V0X2h3c3RhdGUoaW50ZWxoYWRkYXRhKTsKKwlpZiAoIXJldHZh bCkKKwkJcmV0dmFsID0gaW50ZWxoYWRkYXRhLT5yZWdfb3BzLmhkbWlfYXVkaW9fcmVhZF9yZWdp c3RlcigKKwkJCQlvZmZzZXQgKyBpbnRlbGhhZGRhdGEtPmF1ZGlvX2NmZ19vZmZzZXQsIGRhdGEp OworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW5saW5lIGludCBoYWRfd3JpdGVfcmVnaXN0ZXIo dWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBkYXRhKQoreworCWludCByZXR2YWw7CisJc3RydWN0 IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gaGFkX2RhdGE7CisKKwlyZXR2YWwgPSBoYWRf Z2V0X2h3c3RhdGUoaW50ZWxoYWRkYXRhKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gaW50 ZWxoYWRkYXRhLT5yZWdfb3BzLmhkbWlfYXVkaW9fd3JpdGVfcmVnaXN0ZXIoCisJCQkJb2Zmc2V0 ICsgaW50ZWxoYWRkYXRhLT5hdWRpb19jZmdfb2Zmc2V0LCBkYXRhKTsKKworCXJldHVybiByZXR2 YWw7Cit9CisKK2lubGluZSBpbnQgaGFkX3JlYWRfbW9kaWZ5KHVpbnQzMl90IG9mZnNldCwgdWlu dDMyX3QgZGF0YSwgdWludDMyX3QgbWFzaykKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzbmRf aW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IGhhZF9kYXRhOworCisJcmV0dmFsID0gaGFkX2dldF9o d3N0YXRlKGludGVsaGFkZGF0YSk7CisJaWYgKCFyZXR2YWwpCisJCXJldHZhbCA9IGludGVsaGFk ZGF0YS0+cmVnX29wcy5oZG1pX2F1ZGlvX3JlYWRfbW9kaWZ5KAorCQkJCW9mZnNldCArIGludGVs aGFkZGF0YS0+YXVkaW9fY2ZnX29mZnNldCwKKwkJCQlkYXRhLCBtYXNrKTsKKworCXJldHVybiBy ZXR2YWw7Cit9CisvKioKKyAqIGhhZF9yZWFkX21vZGlmeV9hdWRfY29uZmlnX3YyIC0gU3BlY2lm aWMgZnVuY3Rpb24gdG8gcmVhZC1tb2RpZnkKKyAqIEFVRF9DT05GSUcgcmVnaXN0ZXIgb24gVkxW Mi5UaGUgaGFkX3JlYWRfbW9kaWZ5KCkgZnVuY3Rpb24gc2hvdWxkIG5vdAorICogZGlyZWN0bHkg YmUgdXNlZCBvbiBWTFYyIGZvciB1cGRhdGluZyBBVURfQ09ORklHIHJlZ2lzdGVyLgorICogVGhp cyBpcyBiZWNhdXNlOgorICogQml0NiBvZiBBVURfQ09ORklHIHJlZ2lzdGVyIGlzIHdyaXRlb25s eSBkdWUgdG8gYSBzaWxpY29uIGJ1ZyBvbiBWTFYyCisgKiBIRE1JIElQLiBBcyBhIHJlc3VsdCBh IHJlYWQtbW9kaWZ5IG9mIEFVRF9DT05GSUcgcmVnaXRlciB3aWxsIGFsd2F5cworICogY2xlYXIg Yml0Ni4gQVVEX0NPTkZJR1s2OjRdIHJlcHJlc2VudHMgdGhlICJjaGFubmVscyIgZmllbGQgb2Yg dGhlCisgKiByZWdpc3Rlci4gVGhpcyBmaWVsZCBzaG91bGQgYmUgMXh5IGJpbmFyeSBmb3IgY29u ZmlndXJhdGlvbiB3aXRoIDYgb3IKKyAqIG1vcmUgY2hhbm5lbHMuIFJlYWQtbW9kaWZ5IG9mIEFV RF9DT05GSUcgKEVnLiBmb3IgZW5hYmxpbmcgYXVkaW8pCisgKiBjYXVzZXMgdGhlICJjaGFubmVs cyIgZmllbGQgdG8gYmUgdXBkYXRlZCBhcyAweHkgYmluYXJ5IHJlc3VsdGluZyBpbgorICogYmFk IGF1ZGlvLiBUaGUgZml4IGlzIHRvIGFsd2F5cyB3cml0ZSB0aGUgQVVEX0NPTkZJR1s2OjRdIHdp dGgKKyAqIGFwcHJvcHJpYXRlIHZhbHVlIHdoZW4gZG9pbmcgcmVhZC1tb2RpZnkgb2YgQVVEX0NP TkZJRyByZWdpc3Rlci4KKyAqCisgKiBAc3Vic3RyZWFtOiB0aGUgY3VycmVudCBzdWJzdHJlYW0g b3IgTlVMTCBpZiBubyBhY3RpdmUgc3Vic3RyZWFtCisgKiBAZGF0YSA6IGRhdGEgdG8gYmUgd3Jp dHRlbgorICogQG1hc2sgOiBtYXNrCisgKgorICovCitpbmxpbmUgaW50IGhhZF9yZWFkX21vZGlm eV9hdWRfY29uZmlnX3YyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJ CQl1aW50MzJfdCBkYXRhLCB1aW50MzJfdCBtYXNrKQoreworCXVuaW9uIGF1ZF9jZmcgY2ZnX3Zh bCA9IHsuY2ZnX3JlZ3ZhbCA9IDB9OworCXU4IGNoYW5uZWxzOworCisJLyoKKwkgKiBJZiBzdWJz dHJlYW0gaXMgTlVMTCwgdGhlcmUgaXMgbm8gYWN0aXZlIHN0cmVhbS4KKwkgKiBJbiB0aGlzIGNh c2UganVzdCBzZXQgY2hhbm5lbHMgdG8gMgorCSAqLworCWlmIChzdWJzdHJlYW0pCisJCWNoYW5u ZWxzID0gc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVsczsKKwllbHNlCisJCWNoYW5uZWxzID0g MjsKKwljZmdfdmFsLmNmZ19yZWd4X3YyLm51bV9jaCA9IGNoYW5uZWxzIC0gMjsKKworCWRhdGEg PSBkYXRhIHwgY2ZnX3ZhbC5jZmdfcmVndmFsOworCW1hc2sgPSBtYXNrIHwgQVVEX0NPTkZJR19D SF9NQVNLX1YyOworCisJcHJfZGVidWcoIiVzIDogZGF0YSA9ICV4LCBtYXNrID0leFxuIiwgX19m dW5jX18sIGRhdGEsIG1hc2spOworCisJcmV0dXJuIGhhZF9yZWFkX21vZGlmeShBVURfQ09ORklH LCBkYXRhLCBtYXNrKTsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfZW5hYmxlX2F1ZGlvX3Yx IC0gdG8gZW5hYmxlIGF1ZGlvCisgKgorICogQHN1YnN0cmVhbTogQ3VycmVudCBzdWJzdHJlYW0g b3IgTlVMTCBpZiBubyBhY3RpdmUgc3Vic3RyZWFtLgorICogQGVuYWJsZTogMSBpZiBhdWRpbyBp cyB0byBiZSBlbmFibGVkOyAwIGlmIGF1ZGlvIGlzIHRvIGJlIGRpc2FibGVkLgorICoKKyAqLwor c3RhdGljIHZvaWQgc25kX2ludGVsaGFkX2VuYWJsZV9hdWRpb192MShzdHJ1Y3Qgc25kX3BjbV9z dWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJdTggZW5hYmxlKQoreworCWhhZF9yZWFkX21vZGlm eShBVURfQ09ORklHLCBlbmFibGUsIEJJVCgwKSk7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFk X2VuYWJsZV9hdWRpb192MiAtIHRvIGVuYWJsZSBhdWRpbworICoKKyAqIEBzdWJzdHJlYW06IEN1 cnJlbnQgc3Vic3RyZWFtIG9yIE5VTEwgaWYgbm8gYWN0aXZlIHN1YnN0cmVhbS4KKyAqIEBlbmFi bGU6IDEgaWYgYXVkaW8gaXMgdG8gYmUgZW5hYmxlZDsgMCBpZiBhdWRpbyBpcyB0byBiZSBkaXNh YmxlZC4KKyAqLworc3RhdGljIHZvaWQgc25kX2ludGVsaGFkX2VuYWJsZV9hdWRpb192MihzdHJ1 Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJdTggZW5hYmxlKQoreworCWhh ZF9yZWFkX21vZGlmeV9hdWRfY29uZmlnX3YyKHN1YnN0cmVhbSwgZW5hYmxlLCBCSVQoMCkpOwor fQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9yZXNldF9hdWRpb192MSAtIHRvIHJlc2V0IGF1ZGlv IHN1YnN5c3RlbQorICoKKyAqIEByZXNldDogMSB0byByZXNldCBhdWRpbzsgMCB0byBicmluZyBh dWRpbyBvdXQgb2YgcmVzZXQuCisgKgorICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfcmVz ZXRfYXVkaW9fdjEodTggcmVzZXQpCit7CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX1NU QVRVUywgcmVzZXQpOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9yZXNldF9hdWRpb192MiAt IHRvIHJlc2V0IGF1ZGlvIHN1YnN5c3RlbQorICoKKyAqIEByZXNldDogMSB0byByZXNldCBhdWRp bzsgMCB0byBicmluZyBhdWRpbyBvdXQgb2YgcmVzZXQuCisgKgorICovCitzdGF0aWMgdm9pZCBz bmRfaW50ZWxoYWRfcmVzZXRfYXVkaW9fdjIodTggcmVzZXQpCit7CisJaGFkX3dyaXRlX3JlZ2lz dGVyKEFVRF9IRE1JX1NUQVRVU192MiwgcmVzZXQpOworfQorCisvKioKKyAqIGhhZF9wcm9nX3N0 YXR1c19yZWcgLSB0byBpbml0aWFsaXplIGF1ZGlvIGNoYW5uZWwgc3RhdHVzIHJlZ2lzdGVycwor ICoKKyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgcHJlcGFyZSBmdW5jdGlv biBpcyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3RyZWFtIHByaXZhdGUgZGF0YQorICoK KyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcmVwYXJlIGNhbGxiYWNrCisgKi8K K3N0YXRpYyBpbnQgaGFkX3Byb2dfc3RhdHVzX3JlZyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0g KnN1YnN0cmVhbSwKKwkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwl1 bmlvbiBhdWRfY2ZnIGNmZ192YWwgPSB7LmNmZ19yZWd2YWwgPSAwfTsKKwl1bmlvbiBhdWRfY2hf c3RhdHVzXzAgY2hfc3RhdDAgPSB7LnN0YXR1c18wX3JlZ3ZhbCA9IDB9OworCXVuaW9uIGF1ZF9j aF9zdGF0dXNfMSBjaF9zdGF0MSA9IHsuc3RhdHVzXzFfcmVndmFsID0gMH07CisJaW50IGZvcm1h dDsKKworCXByX2RlYnVnKCJFbnRyeSAlc1xuIiwgX19mdW5jX18pOworCisJY2hfc3RhdDAuc3Rh dHVzXzBfcmVneC5scGNtX2lkID0gKGludGVsaGFkZGF0YS0+YWVzX2JpdHMgJgorCQkJCQkJSUVD OTU4X0FFUzBfTk9OQVVESU8pPj4xOworCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guY2xrX2FjYyA9 IChpbnRlbGhhZGRhdGEtPmFlc19iaXRzICYKKwkJCQkJCUlFQzk1OF9BRVMzX0NPTl9DTE9DSyk+ PjQ7CisJY2ZnX3ZhbC5jZmdfcmVneC52YWxfYml0ID0gY2hfc3RhdDAuc3RhdHVzXzBfcmVneC5s cGNtX2lkOworCisJc3dpdGNoIChzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUpIHsKKwljYXNlIEFV RF9TQU1QTEVfUkFURV8zMjoKKwkJY2hfc3RhdDAuc3RhdHVzXzBfcmVneC5zYW1wX2ZyZXEgPSBD SF9TVEFUVVNfTUFQXzMyS0haOworCQlicmVhazsKKworCWNhc2UgQVVEX1NBTVBMRV9SQVRFXzQ0 XzE6CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF80 NEtIWjsKKwkJYnJlYWs7CisJY2FzZSBBVURfU0FNUExFX1JBVEVfNDg6CisJCWNoX3N0YXQwLnN0 YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF80OEtIWjsKKwkJYnJlYWs7CisJ Y2FzZSBBVURfU0FNUExFX1JBVEVfODhfMjoKKwkJY2hfc3RhdDAuc3RhdHVzXzBfcmVneC5zYW1w X2ZyZXEgPSBDSF9TVEFUVVNfTUFQXzg4S0haOworCQlicmVhazsKKwljYXNlIEFVRF9TQU1QTEVf UkFURV85NjoKKwkJY2hfc3RhdDAuc3RhdHVzXzBfcmVneC5zYW1wX2ZyZXEgPSBDSF9TVEFUVVNf TUFQXzk2S0haOworCQlicmVhazsKKwljYXNlIEFVRF9TQU1QTEVfUkFURV8xNzZfNDoKKwkJY2hf c3RhdDAuc3RhdHVzXzBfcmVneC5zYW1wX2ZyZXEgPSBDSF9TVEFUVVNfTUFQXzE3NktIWjsKKwkJ YnJlYWs7CisJY2FzZSBBVURfU0FNUExFX1JBVEVfMTkyOgorCQljaF9zdGF0MC5zdGF0dXNfMF9y ZWd4LnNhbXBfZnJlcSA9IENIX1NUQVRVU19NQVBfMTkyS0haOworCQlicmVhazsKKworCWRlZmF1 bHQ6CisJCS8qIGNvbnRyb2wgc2hvdWxkIG5ldmVyIGNvbWUgaGVyZSAqLworCQlyZXR1cm4gLUVJ TlZBTDsKKwlicmVhazsKKworCX0KKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0NIX1NUQVRVU18w LCBjaF9zdGF0MC5zdGF0dXNfMF9yZWd2YWwpOworCisJZm9ybWF0ID0gc3Vic3RyZWFtLT5ydW50 aW1lLT5mb3JtYXQ7CisKKwlpZiAoZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFKSB7 CisJCWNoX3N0YXQxLnN0YXR1c18xX3JlZ3gubWF4X3dyZF9sZW4gPSBNQVhfU01QTF9XSURUSF8y MDsKKwkJY2hfc3RhdDEuc3RhdHVzXzFfcmVneC53cmRfbGVuID0gU01QTF9XSURUSF8xNkJJVFM7 CisJfSBlbHNlIGlmIChmb3JtYXQgPT0gU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpIHsKKwkJY2hf c3RhdDEuc3RhdHVzXzFfcmVneC5tYXhfd3JkX2xlbiA9IE1BWF9TTVBMX1dJRFRIXzI0OworCQlj aF9zdGF0MS5zdGF0dXNfMV9yZWd4LndyZF9sZW4gPSBTTVBMX1dJRFRIXzI0QklUUzsKKwl9IGVs c2UgeworCQljaF9zdGF0MS5zdGF0dXNfMV9yZWd4Lm1heF93cmRfbGVuID0gMDsKKwkJY2hfc3Rh dDEuc3RhdHVzXzFfcmVneC53cmRfbGVuID0gMDsKKwl9CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFV RF9DSF9TVEFUVVNfMSwgY2hfc3RhdDEuc3RhdHVzXzFfcmVndmFsKTsKKwlyZXR1cm4gMDsKK30K KworLyoqCisgKiBzbmRfaW50ZWxoYWRfcHJvZ19hdWRpb19jdHJsX3YyIC0gdG8gaW5pdGlhbGl6 ZSBhdWRpbworICogcmVnaXN0ZXJzIGFuZCBidWZmZXIgY29uZmdpdXJhdGlvbiByZWdpc3RlcnMK KyAqCisgKiBAc3Vic3RyZWFtOnN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIHByZXBhcmUgZnVuY3Rp b24gaXMgY2FsbGVkCisgKiBAaW50ZWxoYWRkYXRhOnN1YnN0cmVhbSBwcml2YXRlIGRhdGEKKyAq CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJlcGFyZSBjYWxsYmFjaworICov CitpbnQgc25kX2ludGVsaGFkX3Byb2dfYXVkaW9fY3RybF92MihzdHJ1Y3Qgc25kX3BjbV9zdWJz dHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRh KQoreworCXVuaW9uIGF1ZF9jZmcgY2ZnX3ZhbCA9IHsuY2ZnX3JlZ3ZhbCA9IDB9OworCXVuaW9u IGF1ZF9idWZfY29uZmlnIGJ1Zl9jZmcgPSB7LmJ1Zl9jZmd2YWwgPSAwfTsKKwl1OCBjaGFubmVs czsKKworCWhhZF9wcm9nX3N0YXR1c19yZWcoc3Vic3RyZWFtLCBpbnRlbGhhZGRhdGEpOworCisJ YnVmX2NmZy5idWZfY2ZnX3JlZ3hfdjIuYXVkaW9fZmlmb193YXRlcm1hcmsgPSBGSUZPX1RIUkVT SE9MRDsKKwlidWZfY2ZnLmJ1Zl9jZmdfcmVneF92Mi5kbWFfZmlmb193YXRlcm1hcmsgPSBETUFf RklGT19USFJFU0hPTEQ7CisJYnVmX2NmZy5idWZfY2ZnX3JlZ3hfdjIuYXVkX2RlbGF5ID0gMDsK KwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9DT05GSUcsIGJ1Zl9jZmcuYnVmX2NmZ3ZhbCk7 CisKKwljaGFubmVscyA9IHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisJY2ZnX3ZhbC5j ZmdfcmVneF92Mi5udW1fY2ggPSBjaGFubmVscyAtIDI7CisJaWYgKGNoYW5uZWxzIDw9IDIpCisJ CWNmZ192YWwuY2ZnX3JlZ3hfdjIubGF5b3V0ID0gTEFZT1VUMDsKKwllbHNlCisJCWNmZ192YWwu Y2ZnX3JlZ3hfdjIubGF5b3V0ID0gTEFZT1VUMTsKKworCWhhZF93cml0ZV9yZWdpc3RlcihBVURf Q09ORklHLCBjZmdfdmFsLmNmZ19yZWd2YWwpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNu ZF9pbnRlbGhhZF9wcm9nX2F1ZGlvX2N0cmxfdjEgLSB0byBpbml0aWFsaXplIGF1ZGlvCisgKiBy ZWdpc3RlcnMgYW5kIGJ1ZmZlciBjb25mZ2l1cmF0aW9uIHJlZ2lzdGVycworICoKKyAqIEBzdWJz dHJlYW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgcHJlcGFyZSBmdW5jdGlvbiBpcyBjYWxsZWQK KyAqIEBpbnRlbGhhZGRhdGE6c3Vic3RyZWFtIHByaXZhdGUgZGF0YQorICoKKyAqIFRoaXMgZnVu Y3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcmVwYXJlIGNhbGxiYWNrCisgKi8KK2ludCBzbmRfaW50 ZWxoYWRfcHJvZ19hdWRpb19jdHJsX3YxKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3Ry ZWFtLAorCQkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJdW5pb24g YXVkX2NmZyBjZmdfdmFsID0gey5jZmdfcmVndmFsID0gMH07CisJdW5pb24gYXVkX2J1Zl9jb25m aWcgYnVmX2NmZyA9IHsuYnVmX2NmZ3ZhbCA9IDB9OworCXU4IGNoYW5uZWxzOworCisJaGFkX3By b2dfc3RhdHVzX3JlZyhzdWJzdHJlYW0sIGludGVsaGFkZGF0YSk7CisKKwlidWZfY2ZnLmJ1Zl9j ZmdfcmVneC5maWZvX3dpZHRoID0gRklGT19USFJFU0hPTEQ7CisJYnVmX2NmZy5idWZfY2ZnX3Jl Z3guYXVkX2RlbGF5ID0gMDsKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9DT05GSUcsIGJ1 Zl9jZmcuYnVmX2NmZ3ZhbCk7CisKKwljaGFubmVscyA9IHN1YnN0cmVhbS0+cnVudGltZS0+Y2hh bm5lbHM7CisKKwlzd2l0Y2ggKGNoYW5uZWxzKSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJY2Zn X3ZhbC5jZmdfcmVneC5udW1fY2ggPSBDSF9TVEVSRU87CisJCWNmZ192YWwuY2ZnX3JlZ3gubGF5 b3V0ID0gTEFZT1VUMDsKKwlicmVhazsKKworCWNhc2UgMzoKKwljYXNlIDQ6CisJCWNmZ192YWwu Y2ZnX3JlZ3gubnVtX2NoID0gQ0hfVEhSRUVfRk9VUjsKKwkJY2ZnX3ZhbC5jZmdfcmVneC5sYXlv dXQgPSBMQVlPVVQxOworCWJyZWFrOworCisJY2FzZSA1OgorCWNhc2UgNjoKKwkJY2ZnX3ZhbC5j ZmdfcmVneC5udW1fY2ggPSBDSF9GSVZFX1NJWDsKKwkJY2ZnX3ZhbC5jZmdfcmVneC5sYXlvdXQg PSBMQVlPVVQxOworCWJyZWFrOworCisJY2FzZSA3OgorCWNhc2UgODoKKwkJY2ZnX3ZhbC5jZmdf cmVneC5udW1fY2ggPSBDSF9TRVZFTl9FSUdIVDsKKwkJY2ZnX3ZhbC5jZmdfcmVneC5sYXlvdXQg PSBMQVlPVVQxOworCWJyZWFrOworCisJfQorCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DT05G SUcsIGNmZ192YWwuY2ZnX3JlZ3ZhbCk7CisJcmV0dXJuIDA7Cit9CisvKgorICogQ29tcHV0ZSBk ZXJpdmVkIHZhbHVlcyBpbiBjaGFubmVsX2FsbG9jYXRpb25zW10uCisgKi8KK3N0YXRpYyB2b2lk IGluaXRfY2hhbm5lbF9hbGxvY2F0aW9ucyh2b2lkKQoreworCWludCBpLCBqOworCXN0cnVjdCBj ZWFfY2hhbm5lbF9zcGVha2VyX2FsbG9jYXRpb24gKnA7CisKKwlwcl9kZWJ1ZygiJXM6IEVudGVy XG4iLCBfX2Z1bmNfXyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaGFubmVsX2Fs bG9jYXRpb25zKTsgaSsrKSB7CisJCXAgPSBjaGFubmVsX2FsbG9jYXRpb25zICsgaTsKKwkJcC0+ Y2hhbm5lbHMgPSAwOworCQlwLT5zcGtfbWFzayA9IDA7CisJCWZvciAoaiA9IDA7IGogPCBBUlJB WV9TSVpFKHAtPnNwZWFrZXJzKTsgaisrKQorCQkJaWYgKHAtPnNwZWFrZXJzW2pdKSB7CisJCQkJ cC0+Y2hhbm5lbHMrKzsKKwkJCQlwLT5zcGtfbWFzayB8PSBwLT5zcGVha2Vyc1tqXTsKKwkJCX0K Kwl9Cit9CisKKy8qCisgKiBUaGUgdHJhbnNmb3JtYXRpb24gdGFrZXMgdHdvIHN0ZXBzOgorICoK KyAqICAgICAgZWxkLT5zcGtfYWxsb2MgPT4gKGVsZF9zcGVha2VyX2FsbG9jYXRpb25fYml0c1td KSA9PiBzcGtfbWFzaworICogICAgICAgICAgICBzcGtfbWFzayA9PiAoY2hhbm5lbF9hbGxvY2F0 aW9uc1tdKSAgICAgICAgID0+IGFpLT5DQQorICoKKyAqIFRPRE86IGl0IGNvdWxkIHNlbGVjdCB0 aGUgd3JvbmcgQ0EgZnJvbSBtdWx0aXBsZSBjYW5kaWRhdGVzLgorKi8KK3N0YXRpYyBpbnQgc25k X2ludGVsaGFkX2NoYW5uZWxfYWxsb2NhdGlvbihzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhh ZGRhdGEsCisJCQkJCWludCBjaGFubmVscykKK3sKKwlpbnQgaTsKKwlpbnQgY2EgPSAwOworCWlu dCBzcGtfbWFzayA9IDA7CisKKwkvKgorCSogQ0EgZGVmYXVsdHMgdG8gMCBmb3IgYmFzaWMgc3Rl cmVvIGF1ZGlvCisJKi8KKwlpZiAoY2hhbm5lbHMgPD0gMikKKwkJcmV0dXJuIDA7CisKKwkvKgor CSogZXhwYW5kIEVMRCdzIHNwZWFrZXIgYWxsb2NhdGlvbiBtYXNrCisJKgorCSogRUxEIHRlbGxz IHRoZSBzcGVha2VyIG1hc2sgaW4gYSBjb21wYWN0KHBhaXJlZCkgZm9ybSwKKwkqIGV4cGFuZCBF TEQncyBub3Rpb25zIHRvIG1hdGNoIHRoZSBvbmVzIHVzZWQgYnkgQXVkaW8gSW5mb0ZyYW1lLgor CSovCisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlbGRfc3BlYWtlcl9hbGxvY2F0aW9u X2JpdHMpOyBpKyspIHsKKwkJaWYgKGludGVsaGFkZGF0YS0+ZWVsZC5zcGVha2VyX2FsbG9jYXRp b25fYmxvY2sgJiAoMSA8PCBpKSkKKwkJCXNwa19tYXNrIHw9IGVsZF9zcGVha2VyX2FsbG9jYXRp b25fYml0c1tpXTsKKwl9CisKKwkvKiBzZWFyY2ggZm9yIHRoZSBmaXJzdCB3b3JraW5nIG1hdGNo IGluIHRoZSBDQSB0YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoYW5uZWxf YWxsb2NhdGlvbnMpOyBpKyspIHsKKwkJaWYgKGNoYW5uZWxzID09IGNoYW5uZWxfYWxsb2NhdGlv bnNbaV0uY2hhbm5lbHMgJiYKKwkJKHNwa19tYXNrICYgY2hhbm5lbF9hbGxvY2F0aW9uc1tpXS5z cGtfbWFzaykgPT0KKwkJCQljaGFubmVsX2FsbG9jYXRpb25zW2ldLnNwa19tYXNrKSB7CisJCQlj YSA9IGNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uY2FfaW5kZXg7CisJCQlicmVhazsKKwkJfQorCX0K KworCXByX2RlYnVnKCJIRE1JOiBzZWxlY3QgQ0EgMHgleCBmb3IgJWRcbiIsIGNhLCBjaGFubmVs cyk7CisKKwlyZXR1cm4gY2E7Cit9CisKKy8qIGZyb20gc3BlYWtlciBiaXQgbWFzayB0byBBTFNB IEFQSSBjaGFubmVsIHBvc2l0aW9uICovCitzdGF0aWMgaW50IHNwa190b19jaG1hcChpbnQgc3Br KQoreworCXN0cnVjdCBjaGFubmVsX21hcF90YWJsZSAqdCA9IG1hcF90YWJsZXM7CisKKwlmb3Ig KDsgdC0+bWFwOyB0KyspIHsKKwkJaWYgKHQtPnNwa19tYXNrID09IHNwaykKKwkJCXJldHVybiB0 LT5tYXA7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGhhZF9idWlsZF9jaGFubmVsX2FsbG9j YXRpb25fbWFwKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwlpbnQgaSA9 IDAsIGMgPSAwOworCWludCBzcGtfbWFzayA9IDA7CisJc3RydWN0IHNuZF9wY21fY2htYXBfZWxl bSAqY2htYXA7CisJdWludDhfdCBlbGRfaGlnaCwgZWxkX2hpZ2hfbWFzayA9IDB4RjA7CisJdWlu dDhfdCBoaWdoX21zYjsKKworCWNobWFwID0ga3phbGxvYyhzaXplb2YoKmNobWFwKSwgR0ZQX0tF Uk5FTCk7CisJaWYgKGNobWFwID09IE5VTEwpIHsKKwkJaW50ZWxoYWRkYXRhLT5jaG1hcC0+Y2ht YXAgPSBOVUxMOworCQlyZXR1cm47CisJfQorCisJaGFkX2dldF9jYXBzKEhBRF9HRVRfRUxELCAm aW50ZWxoYWRkYXRhLT5lZWxkKTsKKworCXByX2RlYnVnKCJlZWxkLnNwZWFrZXJfYWxsb2NhdGlv bl9ibG9jayA9ICV4XG4iLAorCQkJaW50ZWxoYWRkYXRhLT5lZWxkLnNwZWFrZXJfYWxsb2NhdGlv bl9ibG9jayk7CisKKwkvKiBXQTogRml4IHRoZSBtYXggY2hhbm5lbCBzdXBwb3J0ZWQgdG8gOCAq LworCisJLyoKKwkgKiBTaW5rIG1heSBzdXBwb3J0IG1vcmUgdGhhbiA4IGNoYW5uZWxzLCBpZiBl bGRfaGlnaCBoYXMgbW9yZSB0aGFuCisJICogb25lIGJpdCBzZXQuIFNPQyBzdXBwb3J0cyBtYXgg OCBjaGFubmVscy4KKwkgKiBSZWZlciBlbGRfc3BlYWtlcl9hbGxvY2F0aW9uX2JpdHMsIGZvciBz aW5rIHNwZWFrZXIgYWxsb2NhdGlvbgorCSAqLworCisJLyogaWYgMHgyRiA8IGVsZCA8IDB4NEYg ZmFsbCBiYWNrIHRvIDB4MmYsIGVsc2UgZmFsbCBiYWNrIHRvIDB4NEYgKi8KKwllbGRfaGlnaCA9 IGludGVsaGFkZGF0YS0+ZWVsZC5zcGVha2VyX2FsbG9jYXRpb25fYmxvY2sgJiBlbGRfaGlnaF9t YXNrOworCWlmICgoZWxkX2hpZ2ggJiAoZWxkX2hpZ2gtMSkpICYmIChlbGRfaGlnaCA+IDB4MUYp KSB7CisJCS8qIGVsZF9oaWdoICYgKGVsZF9oaWdoLTEpOiBpZiBtb3JlIHRoYW4gMSBiaXQgc2V0 ICovCisJCS8qIDB4MUY6IDcgY2hhbm5lbHMgKi8KKwkJZm9yIChpID0gMTsgaSA8IDQ7IGkrKykg eworCQkJaGlnaF9tc2IgPSBlbGRfaGlnaCAmICgweDgwID4+IGkpOworCQkJaWYgKGhpZ2hfbXNi KSB7CisJCQkJaW50ZWxoYWRkYXRhLT5lZWxkLnNwZWFrZXJfYWxsb2NhdGlvbl9ibG9jayAmPQor CQkJCQloaWdoX21zYiB8IDB4RjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWZvciAo aSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVsZF9zcGVha2VyX2FsbG9jYXRpb25fYml0cyk7IGkrKykg eworCQlpZiAoaW50ZWxoYWRkYXRhLT5lZWxkLnNwZWFrZXJfYWxsb2NhdGlvbl9ibG9jayAmICgx IDw8IGkpKQorCQkJc3BrX21hc2sgfD0gZWxkX3NwZWFrZXJfYWxsb2NhdGlvbl9iaXRzW2ldOwor CX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoYW5uZWxfYWxsb2NhdGlvbnMpOyBp KyspIHsKKwkJaWYgKHNwa19tYXNrID09IGNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uc3BrX21hc2sp IHsKKwkJCWZvciAoYyA9IDA7IGMgPCBjaGFubmVsX2FsbG9jYXRpb25zW2ldLmNoYW5uZWxzOyBj KyspIHsKKwkJCQljaG1hcC0+bWFwW2NdID0gc3BrX3RvX2NobWFwKAorCQkJCQljaGFubmVsX2Fs bG9jYXRpb25zW2ldLnNwZWFrZXJzWworCQkJCQkJKE1BWF9TUEVBS0VSUyAtIDEpLWNdKTsKKwkJ CX0KKwkJCWNobWFwLT5jaGFubmVscyA9IGNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uY2hhbm5lbHM7 CisJCQlpbnRlbGhhZGRhdGEtPmNobWFwLT5jaG1hcCA9IGNobWFwOworCQkJYnJlYWs7CisJCX0K Kwl9CisJaWYgKGkgPj0gQVJSQVlfU0laRShjaGFubmVsX2FsbG9jYXRpb25zKSkgeworCQlpbnRl bGhhZGRhdGEtPmNobWFwLT5jaG1hcCA9IE5VTEw7CisJCWtmcmVlKGNobWFwKTsKKwl9Cit9CisK Ky8qCisgKiogQUxTQSBBUEkgY2hhbm5lbC1tYXAgY29udHJvbCBjYWxsYmFja3MKKyAqKi8KK3N0 YXRpYyBpbnQgaGFkX2NobWFwX2N0bF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9s LAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IHNuZF9w Y21fY2htYXAgKmluZm8gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNu ZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gaW5mby0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGlu dGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX0RJU0NPTk5FQ1RFRCkKKwkJcmV0dXJu IC1FTk9ERVY7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJ dWluZm8tPmNvdW50ID0gSEFEX01BWF9DSEFOTkVMOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1p biA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gU05EUlZfQ0hNQVBfTEFTVDsKKwly ZXR1cm4gMDsKK30KKworI2lmbmRlZiBVU0VfQUxTQV9ERUZBVUxUX1RMVgorc3RhdGljIGludCBo YWRfY2htYXBfY3RsX3RsdihzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IG9wX2Zs YWcsCisJCQkJdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBfX3VzZXIgKnRsdikKK3sK KwlzdHJ1Y3Qgc25kX3BjbV9jaG1hcCAqaW5mbyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9s KTsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBpbmZvLT5wcml2YXRlX2Rh dGE7CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVD VEVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFRPRE86IEZpeCBmb3IgcXVlcnkgY2hhbm5l bCBtYXAgKi8KKwlyZXR1cm4gLUVQRVJNOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaGFkX2No bWFwX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNu ZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9wY21fY2htYXAgKmlu Zm8gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAq aW50ZWxoYWRkYXRhID0gaW5mby0+cHJpdmF0ZV9kYXRhOworCWludCBpID0gMDsKKwljb25zdCBz dHJ1Y3Qgc25kX3BjbV9jaG1hcF9lbGVtICpjaG1hcDsKKworCWlmIChpbnRlbGhhZGRhdGEtPmRy dl9zdGF0dXMgPT0gSEFEX0RSVl9ESVNDT05ORUNURUQpCisJCXJldHVybiAtRU5PREVWOworCWlm IChpbnRlbGhhZGRhdGEtPmNobWFwLT5jaG1hcCA9PSAgTlVMTCkKKwkJcmV0dXJuIC1FTk9EQVRB OworCWNobWFwID0gaW50ZWxoYWRkYXRhLT5jaG1hcC0+Y2htYXA7CisJZm9yIChpID0gMDsgaSA8 IGNobWFwLT5jaGFubmVsczsgaSsrKSB7CisJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVl W2ldID0gY2htYXAtPm1hcFtpXTsKKwkJcHJfZGVidWcoImNobWFwLT5tYXBbJWRdID0gJWRcbiIs IGksIGNobWFwLT5tYXBbaV0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhh ZF9jaG1hcF9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVj dCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCS8qIFRPRE86IEdldCBjaGFubmVs IG1hcCBhbmQgc2V0IHN3YXAgcmVnaXN0ZXIgKi8KKwlyZXR1cm4gLUVQRVJNOworfQorCitzdGF0 aWMgaW50IGhhZF9yZWdpc3Rlcl9jaG1hcF9jdGxzKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVs aGFkZGF0YSwKKwkJCQkJCXN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJaW50IGVyciA9IDA7CisK KwllcnIgPSBzbmRfcGNtX2FkZF9jaG1hcF9jdGxzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZ QkFDSywKKwkJCU5VTEwsIDAsICh1bnNpZ25lZCBsb25nKWludGVsaGFkZGF0YSwKKwkJCSZpbnRl bGhhZGRhdGEtPmNobWFwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWludGVs aGFkZGF0YS0+Y2htYXAtPnByaXZhdGVfZGF0YSA9IGludGVsaGFkZGF0YTsKKwlpbnRlbGhhZGRh dGEtPmtjdGwgPSBpbnRlbGhhZGRhdGEtPmNobWFwLT5rY3RsOworCWludGVsaGFkZGF0YS0+a2N0 bC0+aW5mbyA9IGhhZF9jaG1hcF9jdGxfaW5mbzsKKwlpbnRlbGhhZGRhdGEtPmtjdGwtPmdldCA9 IGhhZF9jaG1hcF9jdGxfZ2V0OworCWludGVsaGFkZGF0YS0+a2N0bC0+cHV0ID0gaGFkX2NobWFw X2N0bF9wdXQ7CisjaWZuZGVmIFVTRV9BTFNBX0RFRkFVTFRfVExWCisJaW50ZWxoYWRkYXRhLT5r Y3RsLT50bHYuYyA9IGhhZF9jaG1hcF9jdGxfdGx2OworI2VuZGlmCisJaW50ZWxoYWRkYXRhLT5j aG1hcC0+Y2htYXAgPSBOVUxMOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhh ZF9wcm9nX2RpcF92MSAtIHRvIGluaXRpYWxpemUgRGF0YSBJc2xhbmQgUGFja2V0cyByZWdpc3Rl cnMKKyAqCisgKiBAc3Vic3RyZWFtOnN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIHByZXBhcmUgZnVu Y3Rpb24gaXMgY2FsbGVkCisgKiBAaW50ZWxoYWRkYXRhOnN1YnN0cmVhbSBwcml2YXRlIGRhdGEK KyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJlcGFyZSBjYWxsYmFjawor ICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfcHJvZ19kaXBfdjEoc3RydWN0IHNuZF9wY21f c3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRk YXRhKQoreworCWludCBpOworCXVuaW9uIGF1ZF9jdHJsX3N0IGN0cmxfc3RhdGUgPSB7LmN0cmxf dmFsID0gMH07CisJdW5pb24gYXVkX2luZm9fZnJhbWUyIGZyYW1lMiA9IHsuZnIyX3ZhbCA9IDB9 OworCXVuaW9uIGF1ZF9pbmZvX2ZyYW1lMyBmcmFtZTMgPSB7LmZyM192YWwgPSAwfTsKKwl1OCBj aGVja3N1bSA9IDA7CisJaW50IGNoYW5uZWxzOworCisJY2hhbm5lbHMgPSBzdWJzdHJlYW0tPnJ1 bnRpbWUtPmNoYW5uZWxzOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DTlRMX1NULCBjdHJs X3N0YXRlLmN0cmxfdmFsKTsKKworCWZyYW1lMi5mcjJfcmVneC5jaG5sX2NudCA9IHN1YnN0cmVh bS0+cnVudGltZS0+Y2hhbm5lbHMgLSAxOworCisJZnJhbWUzLmZyM19yZWd4LmNobmxfYWxsb2Mg PSBzbmRfaW50ZWxoYWRfY2hhbm5lbF9hbGxvY2F0aW9uKAorCQkJCQlpbnRlbGhhZGRhdGEsIGNo YW5uZWxzKTsKKworCS8qQ2FsY3VsdGUgdGhlIGJ5dGUgd2lkZSBjaGVja3N1bSBmb3IgYWxsIHZh bGlkIERJUCB3b3JkcyovCisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBpKyspCisJ CWNoZWNrc3VtICs9IChJTkZPX0ZSQU1FX1dPUkQxID4+IGkqQklUU19QRVJfQllURSkgJiBNQVNL X0JZVEUwOworCWZvciAoaSA9IDA7IGkgPCBCWVRFU19QRVJfV09SRDsgaSsrKQorCQljaGVja3N1 bSArPSAoZnJhbWUyLmZyMl92YWwgPj4gaSpCSVRTX1BFUl9CWVRFKSAmIE1BU0tfQllURTA7CisJ Zm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBpKyspCisJCWNoZWNrc3VtICs9IChmcmFt ZTMuZnIzX3ZhbCA+PiBpKkJJVFNfUEVSX0JZVEUpICYgTUFTS19CWVRFMDsKKworCWZyYW1lMi5m cjJfcmVneC5jaGtzdW0gPSAtKGNoZWNrc3VtKTsKKworCWhhZF93cml0ZV9yZWdpc3RlcihBVURf SERNSVdfSU5GT0ZSLCBJTkZPX0ZSQU1FX1dPUkQxKTsKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVE X0hETUlXX0lORk9GUiwgZnJhbWUyLmZyMl92YWwpOworCWhhZF93cml0ZV9yZWdpc3RlcihBVURf SERNSVdfSU5GT0ZSLCBmcmFtZTMuZnIzX3ZhbCk7CisKKwkvKiBwcm9ncmFtIHJlbWFpbmluZyBE SVAgd29yZHMgd2l0aCB6ZXJvICovCisJZm9yIChpID0gMDsgaSA8IEhBRF9NQVhfRElQX1dPUkRT LVZBTElEX0RJUF9XT1JEUzsgaSsrKQorCQloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlXX0lO Rk9GUiwgMHgwKTsKKworCWN0cmxfc3RhdGUuY3RybF9yZWd4LmRpcF9mcmVxID0gMTsKKwljdHJs X3N0YXRlLmN0cmxfcmVneC5kaXBfZW5fc3RhID0gMTsKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVE X0NOVExfU1QsIGN0cmxfc3RhdGUuY3RybF92YWwpOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhh ZF9wcm9nX2RpcF92MiAtIHRvIGluaXRpYWxpemUgRGF0YSBJc2xhbmQgUGFja2V0cyByZWdpc3Rl cnMKKyAqCisgKiBAc3Vic3RyZWFtOnN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIHByZXBhcmUgZnVu Y3Rpb24gaXMgY2FsbGVkCisgKiBAaW50ZWxoYWRkYXRhOnN1YnN0cmVhbSBwcml2YXRlIGRhdGEK KyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJlcGFyZSBjYWxsYmFjawor ICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfcHJvZ19kaXBfdjIoc3RydWN0IHNuZF9wY21f c3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRk YXRhKQoreworCWludCBpOworCXVuaW9uIGF1ZF9jdHJsX3N0IGN0cmxfc3RhdGUgPSB7LmN0cmxf dmFsID0gMH07CisJdW5pb24gYXVkX2luZm9fZnJhbWUyIGZyYW1lMiA9IHsuZnIyX3ZhbCA9IDB9 OworCXVuaW9uIGF1ZF9pbmZvX2ZyYW1lMyBmcmFtZTMgPSB7LmZyM192YWwgPSAwfTsKKwl1OCBj aGVja3N1bSA9IDA7CisJaW50IGNoYW5uZWxzOworCisJY2hhbm5lbHMgPSBzdWJzdHJlYW0tPnJ1 bnRpbWUtPmNoYW5uZWxzOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DTlRMX1NULCBjdHJs X3N0YXRlLmN0cmxfdmFsKTsKKworCWZyYW1lMi5mcjJfcmVneC5jaG5sX2NudCA9IHN1YnN0cmVh bS0+cnVudGltZS0+Y2hhbm5lbHMgLSAxOworCisJZnJhbWUzLmZyM19yZWd4LmNobmxfYWxsb2Mg PSBzbmRfaW50ZWxoYWRfY2hhbm5lbF9hbGxvY2F0aW9uKAorCQkJCQlpbnRlbGhhZGRhdGEsIGNo YW5uZWxzKTsKKworCS8qQ2FsY3VsdGUgdGhlIGJ5dGUgd2lkZSBjaGVja3N1bSBmb3IgYWxsIHZh bGlkIERJUCB3b3JkcyovCisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBpKyspCisJ CWNoZWNrc3VtICs9IChJTkZPX0ZSQU1FX1dPUkQxID4+IGkqQklUU19QRVJfQllURSkgJiBNQVNL X0JZVEUwOworCWZvciAoaSA9IDA7IGkgPCBCWVRFU19QRVJfV09SRDsgaSsrKQorCQljaGVja3N1 bSArPSAoZnJhbWUyLmZyMl92YWwgPj4gaSpCSVRTX1BFUl9CWVRFKSAmIE1BU0tfQllURTA7CisJ Zm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBpKyspCisJCWNoZWNrc3VtICs9IChmcmFt ZTMuZnIzX3ZhbCA+PiBpKkJJVFNfUEVSX0JZVEUpICYgTUFTS19CWVRFMDsKKworCWZyYW1lMi5m cjJfcmVneC5jaGtzdW0gPSAtKGNoZWNrc3VtKTsKKworCWhhZF93cml0ZV9yZWdpc3RlcihBVURf SERNSVdfSU5GT0ZSX3YyLCBJTkZPX0ZSQU1FX1dPUkQxKTsKKwloYWRfd3JpdGVfcmVnaXN0ZXIo QVVEX0hETUlXX0lORk9GUl92MiwgZnJhbWUyLmZyMl92YWwpOworCWhhZF93cml0ZV9yZWdpc3Rl cihBVURfSERNSVdfSU5GT0ZSX3YyLCBmcmFtZTMuZnIzX3ZhbCk7CisKKwkvKiBwcm9ncmFtIHJl bWFpbmluZyBESVAgd29yZHMgd2l0aCB6ZXJvICovCisJZm9yIChpID0gMDsgaSA8IEhBRF9NQVhf RElQX1dPUkRTLVZBTElEX0RJUF9XT1JEUzsgaSsrKQorCQloYWRfd3JpdGVfcmVnaXN0ZXIoQVVE X0hETUlXX0lORk9GUl92MiwgMHgwKTsKKworCWN0cmxfc3RhdGUuY3RybF9yZWd4LmRpcF9mcmVx ID0gMTsKKwljdHJsX3N0YXRlLmN0cmxfcmVneC5kaXBfZW5fc3RhID0gMTsKKwloYWRfd3JpdGVf cmVnaXN0ZXIoQVVEX0NOVExfU1QsIGN0cmxfc3RhdGUuY3RybF92YWwpOworfQorCisvKioKKyAq IHNuZF9pbnRlbGhhZF9wcm9nX2J1ZmZlciAtIHByb2dyYW1zIGJ1ZmZlcgorICogYWRkcmVzcyBh bmQgbGVuZ3RoIHJlZ2lzdGVycworICoKKyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3aGlj aCB0aGUgcHJlcGFyZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3Ry ZWFtIHByaXZhdGUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvZ3JhbXMgcmluZyBidWZm ZXIgYWRkcmVzcyBhbmQgbGVuZ3RoIGludG8gcmVnaXN0ZXJzLgorICovCitpbnQgc25kX2ludGVs aGFkX3Byb2dfYnVmZmVyKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSwKKwkJCQkJ aW50IHN0YXJ0LCBpbnQgZW5kKQoreworCXUzMiByaW5nX2J1Zl9hZGRyLCByaW5nX2J1Zl9zaXpl LCBwZXJpb2RfYnl0ZXM7CisJdTggaSwgbnVtX3BlcmlvZHM7CisJc3RydWN0IHNuZF9wY21fc3Vi c3RyZWFtICpzdWJzdHJlYW07CisKKwlzdWJzdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnN0cmVhbV9p bmZvLmhhZF9zdWJzdHJlYW07CisJaWYgKCFzdWJzdHJlYW0pIHsKKwkJcHJfZXJyKCJzdWJzdHJl YW0gaXMgTlVMTFxuIik7CisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmlu Z19idWZfYWRkciA9IHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHI7CisJcmluZ19idWZfc2l6 ZSA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCWludGVsaGFkZGF0YS0+ c3RyZWFtX2luZm8ucmluZ19idWZfc2l6ZSA9IHJpbmdfYnVmX3NpemU7CisJcGVyaW9kX2J5dGVz ID0gZnJhbWVzX3RvX2J5dGVzKHN1YnN0cmVhbS0+cnVudGltZSwKKwkJCQlzdWJzdHJlYW0tPnJ1 bnRpbWUtPnBlcmlvZF9zaXplKTsKKwludW1fcGVyaW9kcyA9IHN1YnN0cmVhbS0+cnVudGltZS0+ cGVyaW9kczsKKworCS8qCisJICogYnVmZmVyIGFkZHIgc2hvdWxkICBiZSA2NCBieXRlIGFsaWdu ZWQsIHBlcmlvZCBieXRlcworCSAqIHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgYWRkciBvZmZz ZXQKKwkgKi8KKwlwZXJpb2RfYnl0ZXMgJj0gfjB4M0Y7CisKKwkvKiBIYXJkd2FyZSBzdXBwb3J0 cyBNQVhfUEVSSU9EUyBidWZmZXJzICovCisJaWYgKGVuZCA+PSBIQURfTUFYX1BFUklPRFMpCisJ CXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHsKKwkJ LyogUHJvZ3JhbSB0aGUgYnVmIHJlZ2lzdGVycyB3aXRoIGFkZHIgYW5kIGxlbiAqLworCQlpbnRl bGhhZGRhdGEtPmJ1Zl9pbmZvW2ldLmJ1Zl9hZGRyID0gcmluZ19idWZfYWRkciArCisJCQkJCQkJ IChpICogcGVyaW9kX2J5dGVzKTsKKwkJaWYgKGkgPCBudW1fcGVyaW9kcy0xKQorCQkJaW50ZWxo YWRkYXRhLT5idWZfaW5mb1tpXS5idWZfc2l6ZSA9IHBlcmlvZF9ieXRlczsKKwkJZWxzZQorCQkJ aW50ZWxoYWRkYXRhLT5idWZfaW5mb1tpXS5idWZfc2l6ZSA9IHJpbmdfYnVmX3NpemUgLQorCQkJ CQkJCShwZXJpb2RfYnl0ZXMqaSk7CisKKwkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9CVUZfQV9B RERSICsgKGkgKiBIQURfUkVHX1dJRFRIKSwKKwkJCQkJaW50ZWxoYWRkYXRhLT5idWZfaW5mb1tp XS5idWZfYWRkciB8CisJCQkJCUJJVCgwKSB8IEJJVCgxKSk7CisJCWhhZF93cml0ZV9yZWdpc3Rl cihBVURfQlVGX0FfTEVOR1RIICsgKGkgKiBIQURfUkVHX1dJRFRIKSwKKwkJCQkJcGVyaW9kX2J5 dGVzKTsKKwkJaW50ZWxoYWRkYXRhLT5idWZfaW5mb1tpXS5pc192YWxpZCA9IHRydWU7CisJfQor CXByX2RlYnVnKCIlczpidWZbJWQtJWRdIGFkZHI9JSN4ICBhbmQgc2l6ZT0lZFxuIiwgX19mdW5j X18sIHN0YXJ0LCBlbmQsCisJCQlpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW3N0YXJ0XS5idWZfYWRk ciwKKwkJCWludGVsaGFkZGF0YS0+YnVmX2luZm9bc3RhcnRdLmJ1Zl9zaXplKTsKKwlpbnRlbGhh ZGRhdGEtPnZhbGlkX2J1Zl9jbnQgPSBudW1fcGVyaW9kczsKKwlyZXR1cm4gMDsKK30KKworaW5s aW5lIGludCBzbmRfaW50ZWxoYWRfcmVhZF9sZW4oc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxo YWRkYXRhKQoreworCWludCBpLCByZXR2YWwgPSAwOworCXUzMiBsZW5bNF07CisKKwlmb3IgKGkg PSAwOyBpIDwgNCA7IGkrKykgeworCQloYWRfcmVhZF9yZWdpc3RlcihBVURfQlVGX0FfTEVOR1RI ICsgKGkgKiBIQURfUkVHX1dJRFRIKSwKKwkJCQkJJmxlbltpXSk7CisJCWlmICghbGVuW2ldKQor CQkJcmV0dmFsKys7CisJfQorCWlmIChyZXR2YWwgIT0gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwg NCA7IGkrKykKKwkJCXByX2RlYnVnKCJidWZbJWRdIHNpemU9JWRcbiIsIGksIGxlbltpXSk7CisJ fQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfcHJvZ19jdHNf djEgLSBQcm9ncmFtIEhETUkgYXVkaW8gQ1RTIHZhbHVlCisgKgorICogQGF1ZF9zYW1wX2ZyZXE6 IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBhdWRpbyBkYXRhCisgKiBAdG1kczogc2FtcGxpbmcgZnJl cXVlbmN5IG9mIHRoZSBkaXNwbGF5IGRhdGEKKyAqIEBuX3BhcmFtOiBOIHZhbHVlLCBkZXBlbmRz IG9uIGF1ZF9zYW1wX2ZyZXEKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3RyZWFtIHByaXZhdGUgZGF0 YQorICoKKyAqIFByb2dyYW0gQ1RTIHJlZ2lzdGVyIGJhc2VkIG9uIHRoZSBhdWRpbyBhbmQgZGlz cGxheSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworc3RhdGljIHZvaWQgc25kX2ludGVsaGFkX3By b2dfY3RzX3YxKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgdG1kcywgdTMyIG5fcGFyYW0sCisJCQkJ c3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXUzMiBjdHNfdmFsOworCXU2 NCBkaXZpZGVuZCwgZGl2aXNvcjsKKworCS8qIENhbGN1bGF0ZSBDVFMgYWNjb3JkaW5nIHRvIEhE TUkgMS4zYSBzcGVjKi8KKwlkaXZpZGVuZCA9ICh1NjQpdG1kcyAqIG5fcGFyYW0qMTAwMDsKKwlk aXZpc29yID0gMTI4ICogYXVkX3NhbXBfZnJlcTsKKwljdHNfdmFsID0gZGl2NjRfdTY0KGRpdmlk ZW5kLCBkaXZpc29yKTsKKwlwcl9kZWJ1ZygiVE1EUyB2YWx1ZT0lZCwgTiB2YWx1ZT0lZCwgQ1RT IFZhbHVlPSVkXG4iLAorCQkJdG1kcywgbl9wYXJhbSwgY3RzX3ZhbCk7CisJaGFkX3dyaXRlX3Jl Z2lzdGVyKEFVRF9IRE1JX0NUUywgKEJJVCgyMCkgfCBjdHNfdmFsKSk7Cit9CisKKy8qKgorICog c25kX2ludGVsaGFkX3Byb2dfY3RzX3YyIC0gUHJvZ3JhbSBIRE1JIGF1ZGlvIENUUyB2YWx1ZQor ICoKKyAqIEBhdWRfc2FtcF9mcmVxOiBzYW1wbGluZyBmcmVxdWVuY3kgb2YgYXVkaW8gZGF0YQor ICogQHRtZHM6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiB0aGUgZGlzcGxheSBkYXRhCisgKiBAbl9w YXJhbTogTiB2YWx1ZSwgZGVwZW5kcyBvbiBhdWRfc2FtcF9mcmVxCisgKiBAaW50ZWxoYWRkYXRh OnN1YnN0cmVhbSBwcml2YXRlIGRhdGEKKyAqCisgKiBQcm9ncmFtIENUUyByZWdpc3RlciBiYXNl ZCBvbiB0aGUgYXVkaW8gYW5kIGRpc3BsYXkgc2FtcGxpbmcgZnJlcXVlbmN5CisgKi8KK3N0YXRp YyB2b2lkIHNuZF9pbnRlbGhhZF9wcm9nX2N0c192Mih1MzIgYXVkX3NhbXBfZnJlcSwgdTMyIHRt ZHMsIHUzMiBuX3BhcmFtLAorCQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkK K3sKKwl1MzIgY3RzX3ZhbDsKKwl1NjQgZGl2aWRlbmQsIGRpdmlzb3I7CisKKwkvKiBDYWxjdWxh dGUgQ1RTIGFjY29yZGluZyB0byBIRE1JIDEuM2Egc3BlYyovCisJZGl2aWRlbmQgPSAodTY0KXRt ZHMgKiBuX3BhcmFtKjEwMDA7CisJZGl2aXNvciA9IDEyOCAqIGF1ZF9zYW1wX2ZyZXE7CisJY3Rz X3ZhbCA9IGRpdjY0X3U2NChkaXZpZGVuZCwgZGl2aXNvcik7CisJcHJfZGVidWcoIlRNRFMgdmFs dWU9JWQsIE4gdmFsdWU9JWQsIENUUyBWYWx1ZT0lZFxuIiwKKwkJCXRtZHMsIG5fcGFyYW0sIGN0 c192YWwpOworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9DVFMsIChCSVQoMjQpIHwgY3Rz X3ZhbCkpOworfQorCitzdGF0aWMgaW50IGhhZF9jYWxjdWxhdGVfbl92YWx1ZSh1MzIgYXVkX3Nh bXBfZnJlcSkKK3sKKwlzMzIgbl92YWw7CisKKwkvKiBTZWxlY3QgTiBhY2NvcmRpbmcgdG8gSERN SSAxLjNhIHNwZWMqLworCXN3aXRjaCAoYXVkX3NhbXBfZnJlcSkgeworCWNhc2UgQVVEX1NBTVBM RV9SQVRFXzMyOgorCQluX3ZhbCA9IDQwOTY7CisJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVf UkFURV80NF8xOgorCQluX3ZhbCA9IDYyNzI7CisJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVf UkFURV80ODoKKwkJbl92YWwgPSA2MTQ0OworCWJyZWFrOworCisJY2FzZSBBVURfU0FNUExFX1JB VEVfODhfMjoKKwkJbl92YWwgPSAxMjU0NDsKKwlicmVhazsKKworCWNhc2UgQVVEX1NBTVBMRV9S QVRFXzk2OgorCQluX3ZhbCA9IDEyMjg4OworCWJyZWFrOworCisJY2FzZSBBVURfU0FNUExFX1JB VEVfMTc2XzQ6CisJCW5fdmFsID0gMjUwODg7CisJYnJlYWs7CisKKwljYXNlIEhBRF9NQVhfUkFU RToKKwkJbl92YWwgPSAyNDU3NjsKKwlicmVhazsKKworCWRlZmF1bHQ6CisJCW5fdmFsID0gLUVJ TlZBTDsKKwlicmVhazsKKwl9CisJcmV0dXJuIG5fdmFsOworfQorCisvKioKKyAqIHNuZF9pbnRl bGhhZF9wcm9nX25fdjEgLSBQcm9ncmFtIEhETUkgYXVkaW8gTiB2YWx1ZQorICoKKyAqIEBhdWRf c2FtcF9mcmVxOiBzYW1wbGluZyBmcmVxdWVuY3kgb2YgYXVkaW8gZGF0YQorICogQG5fcGFyYW06 IE4gdmFsdWUsIGRlcGVuZHMgb24gYXVkX3NhbXBfZnJlcQorICogQGludGVsaGFkZGF0YTpzdWJz dHJlYW0gcHJpdmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhl IHByZXBhcmUgY2FsbGJhY2suCisgKiBJdCBwcm9ncmFtcyBiYXNlZCBvbiB0aGUgYXVkaW8gYW5k IGRpc3BsYXkgc2FtcGxpbmcgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbnQgc25kX2ludGVsaGFk X3Byb2dfbl92MSh1MzIgYXVkX3NhbXBfZnJlcSwgdTMyICpuX3BhcmFtLAorCQkJCXN0cnVjdCBz bmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwlzMzIgbl92YWw7CisKKwluX3ZhbCA9CWhh ZF9jYWxjdWxhdGVfbl92YWx1ZShhdWRfc2FtcF9mcmVxKTsKKworCWlmIChuX3ZhbCA8IDApCisJ CXJldHVybiBuX3ZhbDsKKworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfTl9FTkFCTEUsIChCSVQo MjApIHwgbl92YWwpKTsKKwkqbl9wYXJhbSA9IG5fdmFsOworCXJldHVybiAwOworfQorCisvKioK KyAqIHNuZF9pbnRlbGhhZF9wcm9nX25fdjIgLSBQcm9ncmFtIEhETUkgYXVkaW8gTiB2YWx1ZQor ICoKKyAqIEBhdWRfc2FtcF9mcmVxOiBzYW1wbGluZyBmcmVxdWVuY3kgb2YgYXVkaW8gZGF0YQor ICogQG5fcGFyYW06IE4gdmFsdWUsIGRlcGVuZHMgb24gYXVkX3NhbXBfZnJlcQorICogQGludGVs aGFkZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBj YWxsZWQgaW4gdGhlIHByZXBhcmUgY2FsbGJhY2suCisgKiBJdCBwcm9ncmFtcyBiYXNlZCBvbiB0 aGUgYXVkaW8gYW5kIGRpc3BsYXkgc2FtcGxpbmcgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyBpbnQg c25kX2ludGVsaGFkX3Byb2dfbl92Mih1MzIgYXVkX3NhbXBfZnJlcSwgdTMyICpuX3BhcmFtLAor CQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwlzMzIgbl92YWw7CisK KwluX3ZhbCA9CWhhZF9jYWxjdWxhdGVfbl92YWx1ZShhdWRfc2FtcF9mcmVxKTsKKworCWlmIChu X3ZhbCA8IDApCisJCXJldHVybiBuX3ZhbDsKKworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfTl9F TkFCTEUsIChCSVQoMjQpIHwgbl92YWwpKTsKKwkqbl9wYXJhbSA9IG5fdmFsOworCXJldHVybiAw OworfQorCitzdGF0aWMgdm9pZCBoYWRfY2xlYXJfdW5kZXJydW5faW50cl92MShzdHJ1Y3Qgc25k X2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJdTMyIGhkbWlfc3RhdHVzLCBpID0gMDsKKwor CS8qIEhhbmRsZSBVbmRlcnJ1biBpbnRlcnJ1cHQgd2l0aGluIEF1ZGlvIFVuaXQgKi8KKwloYWRf d3JpdGVfcmVnaXN0ZXIoQVVEX0NPTkZJRywgMCk7CisJLyogUmVzZXQgYnVmZmVyIHBvaW50ZXJz ICovCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX1NUQVRVUywgMSk7CisJaGFkX3dyaXRl X3JlZ2lzdGVyKEFVRF9IRE1JX1NUQVRVUywgMCk7CisJLyoqCisJICogVGhlIGludGVycnVwdCBz dGF0dXMgJ3N0aWNreScgYml0cyBtaWdodCBub3QgYmUgY2xlYXJlZCBieQorCSAqIHNldHRpbmcg JzEnIHRvIHRoYXQgYml0IG9uY2UuLi4KKwkgKi8KKwlkbyB7IC8qIGNsZWFyIGJpdDMwLCAzMSBB VURfSERNSV9TVEFUVVMgKi8KKwkJaGFkX3JlYWRfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTLCAm aGRtaV9zdGF0dXMpOworCQlwcl9kZWJ1ZygiSERNSSBzdGF0dXMgPTB4JXhcbiIsIGhkbWlfc3Rh dHVzKTsKKwkJaWYgKGhkbWlfc3RhdHVzICYgQVVEX0NPTkZJR19NQVNLX1VOREVSUlVOKSB7CisJ CQlpKys7CisJCQloZG1pX3N0YXR1cyAmPSAoQVVEX0NPTkZJR19NQVNLX1NSREJHIHwKKwkJCQkJ QVVEX0NPTkZJR19NQVNLX0ZVTkNSU1QpOworCQkJaGRtaV9zdGF0dXMgfD0gfkFVRF9DT05GSUdf TUFTS19VTkRFUlJVTjsKKwkJCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9TVEFUVVMsIGhk bWlfc3RhdHVzKTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9IHdoaWxlIChpIDwgTUFYX0NOVCk7 CisJaWYgKGkgPj0gTUFYX0NOVCkKKwkJcHJfZXJyKCJVbmFibGUgdG8gY2xlYXIgVU5ERVJSVU4g Yml0c1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIGhhZF9jbGVhcl91bmRlcnJ1bl9pbnRyX3YyKHN0 cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwl1MzIgaGRtaV9zdGF0dXMsIGkg PSAwOworCisJLyogSGFuZGxlIFVuZGVycnVuIGludGVycnVwdCB3aXRoaW4gQXVkaW8gVW5pdCAq LworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfQ09ORklHLCAwKTsKKwkvKiBSZXNldCBidWZmZXIg cG9pbnRlcnMgKi8KKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTX3YyLCAxKTsK KwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTX3YyLCAwKTsKKwkvKioKKwkgKiBU aGUgaW50ZXJydXB0IHN0YXR1cyAnc3RpY2t5JyBiaXRzIG1pZ2h0IG5vdCBiZSBjbGVhcmVkIGJ5 CisJICogc2V0dGluZyAnMScgdG8gdGhhdCBiaXQgb25jZS4uLgorCSAqLworCWRvIHsgLyogY2xl YXIgYml0MzAsIDMxIEFVRF9IRE1JX1NUQVRVUyAqLworCQloYWRfcmVhZF9yZWdpc3RlcihBVURf SERNSV9TVEFUVVNfdjIsICZoZG1pX3N0YXR1cyk7CisJCXByX2RlYnVnKCJIRE1JIHN0YXR1cyA9 MHgleFxuIiwgaGRtaV9zdGF0dXMpOworCQlpZiAoaGRtaV9zdGF0dXMgJiBBVURfQ09ORklHX01B U0tfVU5ERVJSVU4pIHsKKwkJCWkrKzsKKwkJCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9T VEFUVVNfdjIsIGhkbWlfc3RhdHVzKTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9IHdoaWxlIChp IDwgTUFYX0NOVCk7CisJaWYgKGkgPj0gTUFYX0NOVCkKKwkJcHJfZXJyKCJVbmFibGUgdG8gY2xl YXIgVU5ERVJSVU4gYml0c1xuIik7Cit9CisKKy8qKgorKiBzbmRfaW50ZWxoYWRfb3BlbiAtIHN0 cmVhbSBpbml0aWFsaXphdGlvbnMgYXJlIGRvbmUgaGVyZQorKiBAc3Vic3RyZWFtOnN1YnN0cmVh bSBmb3Igd2hpY2ggdGhlIHN0cmVhbSBmdW5jdGlvbiBpcyBjYWxsZWQKKyoKKyogVGhpcyBmdW5j dGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBQQ00gc3RyZWFtIGlzIG9wZW5lZAorKi8KK3N0YXRp YyBpbnQgc25kX2ludGVsaGFkX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJl YW0pCit7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhOworCXN0cnVjdCBzbmRf cGNtX3J1bnRpbWUgKnJ1bnRpbWU7CisJc3RydWN0IGhhZF9zdHJlYW1fcHZ0ICpzdHJlYW07CisJ c3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKwlpbnQgcmV0dmFsOworCisJcHJfZGVi dWcoInNuZF9pbnRlbGhhZF9vcGVuIGNhbGxlZFxuIik7CisJaW50ZWxoYWRkYXRhID0gc25kX3Bj bV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWhhZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEt PnByaXZhdGVfZGF0YTsKKwlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJcG1fcnVu dGltZV9nZXQoaW50ZWxoYWRkYXRhLT5kZXYpOworCisJaWYgKGhhZF9nZXRfaHdzdGF0ZShpbnRl bGhhZGRhdGEpKSB7CisJCXByX2VycigiJXM6IEhETUkgY2FibGUgcGx1Z2dlZC1vdXRcbiIsIF9f ZnVuY19fKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBleGl0X3B1dF9oYW5kbGU7CisJ fQorCisJLyogQ2hlY2ssIGlmIGRldmljZSBhbHJlYWR5IGluIHVzZSAqLworCWlmIChydW50aW1l LT5wcml2YXRlX2RhdGEpIHsKKwkJcHJfZXJyKCJEZXZpY2UgYWxyZWFkeSBpbiB1c2VcbiIpOwor CQlyZXR2YWwgPSAtRUJVU1k7CisJCWdvdG8gZXhpdF9wdXRfaGFuZGxlOworCX0KKworCS8qIHNl dCB0aGUgcnVudGltZSBodyBwYXJhbWV0ZXIgd2l0aCBsb2NhbCBzbmRfcGNtX2hhcmR3YXJlIHN0 cnVjdCAqLworCXJ1bnRpbWUtPmh3ID0gc25kX2ludGVsX2hhZHN0cmVhbTsKKworCXN0cmVhbSA9 IGt6YWxsb2Moc2l6ZW9mKCpzdHJlYW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0cmVhbSkgewor CQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfcHV0X2hhbmRsZTsKKwl9CisJc3RyZWFt LT5zdHJlYW1fc3RhdHVzID0gU1RSRUFNX0lOSVQ7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0g c3RyZWFtOworCisJcmV0dmFsID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGlt ZSwKKwkJCSBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJaWYgKHJldHZhbCA8IDApCisJ CWdvdG8gZXhpdF9lcnI7CisKKwkvKiBNYWtlIHN1cmUsIHRoYXQgdGhlIHBlcmlvZCBzaXplIGlz IGFsd2F5cyBhbGlnbmVkCisJICogNjRieXRlIGJvdW5kYXJ5CisJICovCisJcmV0dmFsID0gc25k X3BjbV9od19jb25zdHJhaW50X3N0ZXAoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAorCQkJU05EUlZf UENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywgNjQpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXBy X2VycigiJXM6c3RlcF9zaXplPTY0IGZhaWxlZCxlcnI9JWRcbiIsIF9fZnVuY19fLCByZXR2YWwp OworCQlnb3RvIGV4aXRfZXJyOworCX0KKworCXJldHVybiByZXR2YWw7CitleGl0X2VycjoKKwlr ZnJlZShzdHJlYW0pOworZXhpdF9wdXRfaGFuZGxlOgorCXBtX3J1bnRpbWVfcHV0KGludGVsaGFk ZGF0YS0+ZGV2KTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXJldHVybiByZXR2 YWw7Cit9CisKKy8qKgorKiBoYWRfcGVyaW9kX2VsYXBzZWQgLSB1cGRhdGVzIHRoZSBoYXJkd2Fy ZSBwb2ludGVyIHN0YXR1cworKiBAaGFkX3N1YnN0cmVhbTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRo ZSBzdHJlYW0gZnVuY3Rpb24gaXMgY2FsbGVkCisqCisqLworc3RhdGljIHZvaWQgaGFkX3Blcmlv ZF9lbGFwc2VkKHZvaWQgKmhhZF9zdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3Ry ZWFtICpzdWJzdHJlYW0gPSBoYWRfc3Vic3RyZWFtOworCXN0cnVjdCBoYWRfc3RyZWFtX3B2dCAq c3RyZWFtOworCisJLyogcHJfZGVidWcoImhhZF9wZXJpb2RfZWxhcHNlZCBjYWxsZWRcbiIpOyAq LworCisJaWYgKCFzdWJzdHJlYW0gfHwgIXN1YnN0cmVhbS0+cnVudGltZSkKKwkJcmV0dXJuOwor CXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWlmICghc3RyZWFt KQorCQlyZXR1cm47CisKKwlpZiAoc3RyZWFtLT5zdHJlYW1fc3RhdHVzICE9IFNUUkVBTV9SVU5O SU5HKQorCQlyZXR1cm47CisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworfQor CisvKioKKyogc25kX2ludGVsaGFkX2luaXRfc3RyZWFtIC0gaW50ZXJuYWwgZnVuY3Rpb24gdG8g aW5pdGlhbGl6ZSBzdHJlYW0gaW5mbworKiBAc3Vic3RyZWFtOnN1YnN0cmVhbSBmb3Igd2hpY2gg dGhlIHN0cmVhbSBmdW5jdGlvbiBpcyBjYWxsZWQKKyoKKyovCitzdGF0aWMgaW50IHNuZF9pbnRl bGhhZF9pbml0X3N0cmVhbShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sK KwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBzbmRfcGNtX3N1YnN0cmVhbV9j aGlwKHN1YnN0cmVhbSk7CisKKwlwcl9kZWJ1Zygic25kX2ludGVsaGFkX2luaXRfc3RyZWFtIGNh bGxlZFxuIik7CisKKwlwcl9kZWJ1Zygic2V0dGluZyBidWZmZXIgcHRyIHBhcmFtXG4iKTsKKwlp bnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLnBlcmlvZF9lbGFwc2VkID0gaGFkX3BlcmlvZF9lbGFw c2VkOworCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVhbSA9IHN1YnN0cmVh bTsKKwlpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmJ1ZmZlcl9wdHIgPSAwOworCWludGVsaGFk ZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3JlbmRlcmVkID0gMDsKKwlpbnRlbGhhZGRhdGEtPnN0 cmVhbV9pbmZvLnNmcmVxID0gc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlOworCXJldHVybiAwOwor fQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9jbG9zZS0gdG8gZnJlZSBwYXJhbWV0ZXJlcyB3aGVu IHN0cmVhbSBpcyBzdG9wcGVkCisgKgorICogQHN1YnN0cmVhbTogIHN1YnN0cmVhbSBmb3Igd2hp Y2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVk IGJ5IEFMU0EgZnJhbWV3b3JrIHdoZW4gc3RyZWFtIGlzIHN0b3BwZWQKKyAqLworc3RhdGljIGlu dCBzbmRfaW50ZWxoYWRfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0p Cit7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhOworCXN0cnVjdCBzbmRfcGNt X3J1bnRpbWUgKnJ1bnRpbWU7CisKKwlwcl9kZWJ1Zygic25kX2ludGVsaGFkX2Nsb3NlIGNhbGxl ZFxuIik7CisKKwlpbnRlbGhhZGRhdGEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVh bSk7CisJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCWlmICghcnVudGltZS0+cHJp dmF0ZV9kYXRhKSB7CisJCXByX2RlYnVnKCJjbG9zZSgpIG1pZ2h0IGhhdmUgY2FsbGVkIGFmdGVy IGZhaWxlZCBvcGVuIik7CisJCXJldHVybiAwOworCX0KKworCWludGVsaGFkZGF0YS0+c3RyZWFt X2luZm8uYnVmZmVyX3JlbmRlcmVkID0gMDsKKwlpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmJ1 ZmZlcl9wdHIgPSAwOworCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uc3RyX2lkID0gMDsKKwlp bnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW0gPSBOVUxMOworCisJLyogQ2hl Y2sgaWYgZm9sbG93aW5nIGRydl9zdGF0dXMgbW9kaWZpY2F0aW9uIGlzIHJlcXVpcmVkIC0gVkEg Ki8KKwlpZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzICE9IEhBRF9EUlZfRElTQ09OTkVDVEVE KSB7CisJCWludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9IEhBRF9EUlZfQ09OTkVDVEVEOworCQlw cl9kZWJ1ZygiJXMgQCAlZDpERUJVRyBQTFVHL1VOUExVRyA6IEhBRF9EUlZfQ09OTkVDVEVEXG4i LAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwl9CisJa2ZyZWUocnVudGltZS0+cHJpdmF0ZV9k YXRhKTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXBtX3J1bnRpbWVfcHV0KGlu dGVsaGFkZGF0YS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRf aHdfcGFyYW1zLSB0byBzZXR1cCB0aGUgaGFyZHdhcmUgcGFyYW1ldGVycworICogbGlrZSBhbGxv Y2F0aW5nIHRoZSBidWZmZXJzCisgKgorICogQHN1YnN0cmVhbTogIHN1YnN0cmVhbSBmb3Igd2hp Y2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogQGh3X3BhcmFtczogaGFyZHdhcmUgcGFyYW1l dGVycworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IEFMU0EgZnJhbWV3b3JrIHdo ZW4gaGFyZHdhcmUgcGFyYW1zIGFyZSBzZXQKKyAqLworc3RhdGljIGludCBzbmRfaW50ZWxoYWRf aHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSAgICBz dHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKK3sKKwl1bnNpZ25lZCBsb25nIGFk ZHI7CisJaW50IHBhZ2VzLCBidWZfc2l6ZSwgcmV0dmFsOworCisJcHJfZGVidWcoInNuZF9pbnRl bGhhZF9od19wYXJhbXMgY2FsbGVkXG4iKTsKKworCWlmICghaHdfcGFyYW1zKQorCQlyZXR1cm4g LUVJTlZBTDsKKworCWJ1Zl9zaXplID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpOwor CXJldHZhbCA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIGJ1Zl9zaXplKTsK KwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKwlwcl9kZWJ1ZygiJXM6YWxsb2Nh dGVkIG1lbW9yeSA9ICVkXG4iLCBfX2Z1bmNfXywgYnVmX3NpemUpOworCS8qIG1hcmsgdGhlIHBh Z2VzIGFzIHVuY2FjaGVkIHJlZ2lvbiAqLworCWFkZHIgPSAodW5zaWduZWQgbG9uZykgc3Vic3Ry ZWFtLT5ydW50aW1lLT5kbWFfYXJlYTsKKwlwYWdlcyA9IChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRt YV9ieXRlcyArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCXJldHZhbCA9IHNldF9tZW1v cnlfdWMoYWRkciwgcGFnZXMpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJzZXRfbWVtb3J5 X3VjIGZhaWxlZC5FcnJvcjolZFxuIiwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJ bWVtc2V0KHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEsIDAsIGJ1Zl9zaXplKTsKKworCXJl dHVybiByZXR2YWw7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX2h3X2ZyZWUtIHRvIHJlbGVh c2UgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgZHVyaW5nCisgKiBoYXJkd2FyZSBwYXJhbXMgc2V0 dXAKKyAqCisgKiBAc3Vic3RyZWFtOiAgc3Vic3RyZWFtIGZvciB3aGljaCB0aGUgZnVuY3Rpb24g aXMgY2FsbGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQUxTQSBmcmFtZXdv cmsgYmVmb3JlIGNsb3NlIGNhbGxiYWNrLgorICoKKyAqLworc3RhdGljIGludCBzbmRfaW50ZWxo YWRfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwl1bnNp Z25lZCBsb25nIGFkZHI7CisJdTMyIHBhZ2VzOworCisJcHJfZGVidWcoInNuZF9pbnRlbGhhZF9o d19mcmVlIGNhbGxlZFxuIik7CisKKwkvKiBtYXJrIGJhY2sgdGhlIHBhZ2VzIGFzIGNhY2hlZC93 cml0ZWJhY2sgcmVnaW9uIGJlZm9yZSB0aGUgZnJlZSAqLworCWlmIChzdWJzdHJlYW0tPnJ1bnRp bWUtPmRtYV9hcmVhICE9IE5VTEwpIHsKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKSBzdWJzdHJl YW0tPnJ1bnRpbWUtPmRtYV9hcmVhOworCQlwYWdlcyA9IChzdWJzdHJlYW0tPnJ1bnRpbWUtPmRt YV9ieXRlcyArIFBBR0VfU0laRSAtIDEpIC8KKwkJCQkJCQkJUEFHRV9TSVpFOworCQlzZXRfbWVt b3J5X3diKGFkZHIsIHBhZ2VzKTsKKwkJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vi c3RyZWFtKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorKiBzbmRfaW50ZWxoYWRfcGNtX3Ry aWdnZXIgLSBzdHJlYW0gYWN0aXZpdGllcyBhcmUgaGFuZGxlZCBoZXJlCisqIEBzdWJzdHJlYW06 c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgc3RyZWFtIGZ1bmN0aW9uIGlzIGNhbGxlZAorKiBAY21k OnRoZSBzdHJlYW0gY29tbWFtZCB0aGF0cyByZXF1ZXN0ZWQgZnJvbSB1cHBlciBsYXllcgorKiBU aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBhIHN0cmVhbSBhY3Rpdml0eSBpcyBp bnZva2VkCisqLworc3RhdGljIGludCBzbmRfaW50ZWxoYWRfcGNtX3RyaWdnZXIoc3RydWN0IHNu ZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCWludCBjbWQpCit7CisJaW50IGNhcHMs IHJldHZhbCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnX2lycTsKKwlzdHJ1Y3Qgc25kX2ludGVs aGFkICppbnRlbGhhZGRhdGE7CisJc3RydWN0IGhhZF9zdHJlYW1fcHZ0ICpzdHJlYW07CisJc3Ry dWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKworCXByX2RlYnVnKCJzbmRfaW50ZWxoYWRf cGNtX3RyaWdnZXIgY2FsbGVkXG4iKTsKKworCWludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vic3Ry ZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZh dGVfZGF0YTsKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisKKwlz d2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCXByX2RlYnVn KCJUcmlnZ2VyIFN0YXJ0XG4iKTsKKworCQkvKiBEaXNhYmxlIGxvY2FsIElOVFJzIHRpbGwgcmVn aXN0ZXIgcHJnbW5nIGlzIGRvbmUgKi8KKwkJaWYgKGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhhZGRh dGEpKSB7CisJCQlwcl9lcnIoIl9TVEFSVDogSERNSSBjYWJsZSBwbHVnZ2VkLW91dFxuIik7CisJ CQlyZXR2YWwgPSAtRU5PREVWOworCQkJYnJlYWs7CisJCX0KKwkJc3RyZWFtLT5zdHJlYW1fc3Rh dHVzID0gU1RSRUFNX1JVTk5JTkc7CisKKwkJaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGUgPSBIQURf UlVOTklOR19TVFJFQU07CisKKwkJLyogRW5hYmxlIEF1ZGlvICovCisJCS8qCisJCSAqIFRvRG86 IE5lZWQgdG8gZW5hYmxlIFVOREVSUlVOIGludGVycnVwdHMgYXMgd2VsbAorCQkgKiAgIGNhcHMg PSBIRE1JX0FVRElPX1VOREVSUlVOIHwgSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwkJICovCisJ CWNhcHMgPSBIRE1JX0FVRElPX0JVRkZFUl9ET05FOworCQlyZXR2YWwgPSBoYWRfc2V0X2NhcHMo SEFEX1NFVF9FTkFCTEVfQVVESU9fSU5ULCAmY2Fwcyk7CisJCXJldHZhbCA9IGhhZF9zZXRfY2Fw cyhIQURfU0VUX0VOQUJMRV9BVURJTywgTlVMTCk7CisJCWludGVsaGFkZGF0YS0+b3BzLT5lbmFi bGVfYXVkaW8oc3Vic3RyZWFtLCAxKTsKKworCQlwcl9kZWJ1ZygiUHJvY2Vzc2VkIF9TdGFydFxu Iik7CisKKwkJYnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXByX2Rl YnVnKCJUcmlnZ2VyIFN0b3BcbiIpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRh LT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxKTsKKwkJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5z dHJfaWQgPSAwOworCQlpbnRlbGhhZGRhdGEtPmN1cnJfYnVmID0gMDsKKworCQkvKiBTdG9wIHJl cG9ydGluZyBCVUZGRVJfRE9ORS9VTkRFUlJVTiB0byBhYm92ZSBsYXllcnMqLworCisJCWhhZF9z dHJlYW0tPnN0cmVhbV90eXBlID0gSEFEX0lOSVQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycSk7CisJCS8qIERpc2FibGUgQXVk aW8gKi8KKwkJLyoKKwkJICogVG9EbzogTmVlZCB0byBkaXNhYmxlIFVOREVSUlVOIGludGVycnVw dHMgYXMgd2VsbAorCQkgKiAgIGNhcHMgPSBIRE1JX0FVRElPX1VOREVSUlVOIHwgSERNSV9BVURJ T19CVUZGRVJfRE9ORTsKKwkJICovCisJCWNhcHMgPSBIRE1JX0FVRElPX0JVRkZFUl9ET05FOwor CQloYWRfc2V0X2NhcHMoSEFEX1NFVF9ESVNBQkxFX0FVRElPX0lOVCwgJmNhcHMpOworCQlpbnRl bGhhZGRhdGEtPm9wcy0+ZW5hYmxlX2F1ZGlvKHN1YnN0cmVhbSwgMCk7CisJCS8qIFJlc2V0IGJ1 ZmZlciBwb2ludGVycyAqLworCQlpbnRlbGhhZGRhdGEtPm9wcy0+cmVzZXRfYXVkaW8oMSk7CisJ CWludGVsaGFkZGF0YS0+b3BzLT5yZXNldF9hdWRpbygwKTsKKwkJc3RyZWFtLT5zdHJlYW1fc3Rh dHVzID0gU1RSRUFNX0RST1BQRUQ7CisJCWhhZF9zZXRfY2FwcyhIQURfU0VUX0RJU0FCTEVfQVVE SU8sIE5VTEwpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHZhbCA9IC1FSU5WQUw7CisJ fQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorKiBzbmRfaW50ZWxoYWRfcGNtX3ByZXBhcmUt IGludGVybmFsIHByZXBhcmF0aW9uIGJlZm9yZSBzdGFydGluZyBhIHN0cmVhbQorKgorKiBAc3Vi c3RyZWFtOiAgc3Vic3RyZWFtIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkCisqCisq IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgc3RhcnRlZCBmb3IgaW50 ZXJuYWwgcHJlcGFyYXRpb24uCisqLworc3RhdGljIGludCBzbmRfaW50ZWxoYWRfcGNtX3ByZXBh cmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IHJldHZhbDsK Kwl1MzIgZGlzcF9zYW1wX2ZyZXEsIG5fcGFyYW07CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50 ZWxoYWRkYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CisJc3RydWN0IGhh ZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKworCXByX2RlYnVnKCJzbmRfaW50ZWxoYWRfcGNtX3By ZXBhcmUgY2FsbGVkXG4iKTsKKworCWludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2No aXAoc3Vic3RyZWFtKTsKKwlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWhhZF9zdHJl YW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKworCWlmIChoYWRfZ2V0X2h3c3RhdGUo aW50ZWxoYWRkYXRhKSkgeworCQlwcl9lcnIoIiVzOiBIRE1JIGNhYmxlIHBsdWdnZWQtb3V0XG4i LCBfX2Z1bmNfXyk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gcHJlcF9lbmQ7CisJfQor CisJcHJfZGVidWcoInBlcmlvZF9zaXplPSVkXG4iLAorCQkoaW50KWZyYW1lc190b19ieXRlcyhy dW50aW1lLCBydW50aW1lLT5wZXJpb2Rfc2l6ZSkpOworCXByX2RlYnVnKCJwZXJpb2RzPSVkXG4i LCBydW50aW1lLT5wZXJpb2RzKTsKKwlwcl9kZWJ1ZygiYnVmZmVyX3NpemU9JWRcbiIsIChpbnQp c25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSkpOworCXByX2RlYnVnKCJyYXRlPSVk XG4iLCBydW50aW1lLT5yYXRlKTsKKwlwcl9kZWJ1ZygiY2hhbm5lbHM9JWRcbiIsIHJ1bnRpbWUt PmNoYW5uZWxzKTsKKworCWlmIChpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLnN0cl9pZCkgewor CQlwcl9kZWJ1ZygiX3ByZXBhcmUgaXMgY2FsbGVkIGZvciBleGlzdGluZyBzdHJfaWQjJWRcbiIs CisJCQkJCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKKwkJcmV0dmFsID0gc25k X2ludGVsaGFkX3BjbV90cmlnZ2VyKHN1YnN0cmVhbSwKKwkJCQkJCVNORFJWX1BDTV9UUklHR0VS X1NUT1ApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXJldHZhbCA9IHNuZF9pbnRlbGhhZF9p bml0X3N0cmVhbShzdWJzdHJlYW0pOworCWlmIChyZXR2YWwpCisJCWdvdG8gcHJlcF9lbmQ7CisK KworCS8qIEdldCBOIHZhbHVlIGluIEtIeiAqLworCXJldHZhbCA9IGhhZF9nZXRfY2FwcyhIQURf R0VUX0RJU1BMQVlfUkFURSwgJmRpc3Bfc2FtcF9mcmVxKTsKKwlpZiAocmV0dmFsKSB7CisJCXBy X2VycigicXVlcnlpbmcgZGlzcGxheSBzYW1wbGluZyBmcmVxIGZhaWxlZCAlI3hcbiIsIHJldHZh bCk7CisJCWdvdG8gcHJlcF9lbmQ7CisJfQorCisJaGFkX2dldF9jYXBzKEhBRF9HRVRfRUxELCAm aW50ZWxoYWRkYXRhLT5lZWxkKTsKKworCXJldHZhbCA9IGludGVsaGFkZGF0YS0+b3BzLT5wcm9n X24oc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlLCAmbl9wYXJhbSwKKwkJCQkJCQkJaW50ZWxoYWRk YXRhKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2VycigicHJvZ3JhbW1pbmcgTiB2YWx1ZSBmYWls ZWQgJSN4XG4iLCByZXR2YWwpOworCQlnb3RvIHByZXBfZW5kOworCX0KKwlpbnRlbGhhZGRhdGEt Pm9wcy0+cHJvZ19jdHMoc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlLAorCQkJCQlkaXNwX3NhbXBf ZnJlcSwgbl9wYXJhbSwgaW50ZWxoYWRkYXRhKTsKKworCWludGVsaGFkZGF0YS0+b3BzLT5wcm9n X2RpcChzdWJzdHJlYW0sIGludGVsaGFkZGF0YSk7CisKKwlyZXR2YWwgPSBpbnRlbGhhZGRhdGEt Pm9wcy0+YXVkaW9fY3RybChzdWJzdHJlYW0sIGludGVsaGFkZGF0YSk7CisKKwkvKiBQcm9nIGJ1 ZmZlciBhZGRyZXNzICovCisJcmV0dmFsID0gc25kX2ludGVsaGFkX3Byb2dfYnVmZmVyKGludGVs aGFkZGF0YSwKKwkJCUhBRF9CVUZfVFlQRV9BLCBIQURfQlVGX1RZUEVfRCk7CisKKwkvKgorCSAq IFByb2dyYW0gY2hhbm5lbCBtYXBwaW5nIGluIGZvbGxvd2luZyBvcmRlcjoKKwkgKiBGTCwgRlIs IEMsIExGRSwgUkwsIFJSCisJICovCisKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9DSF9T V0FQLCBTV0FQX0xGRV9DRU5URVIpOworCitwcmVwX2VuZDoKKwlyZXR1cm4gcmV0dmFsOworfQor CisvKioKKyAqIHNuZF9pbnRlbGhhZF9wY21fcG9pbnRlci0gdG8gc2VuZCB0aGUgY3VycmVudCBi dWZmZXIgcG9pbnRlcnByb2Nlc3NlZCBieSBodworICoKKyAqIEBzdWJzdHJlYW06ICBzdWJzdHJl YW0gZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9u IGlzIGNhbGxlZCBieSBBTFNBIGZyYW1ld29yayB0byBnZXQgdGhlIGN1cnJlbnQgaHcgYnVmZmVy IHB0cgorICogd2hlbiBhIHBlcmlvZCBpcyBlbGFwc2VkCisgKi8KK3N0YXRpYyBzbmRfcGNtX3Vm cmFtZXNfdCBzbmRfaW50ZWxoYWRfcGNtX3BvaW50ZXIoCisJCQkJCXN0cnVjdCBzbmRfcGNtX3N1 YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0 YTsKKwl1MzIgYnl0ZXNfcmVuZGVyZWQgPSAwOworCXUzMiB0OworCWludCBidWZfaWQ7CisKKwkv KiBwcl9kZWJ1Zygic25kX2ludGVsaGFkX3BjbV9wb2ludGVyIGNhbGxlZFxuIik7ICovCisKKwlp bnRlbGhhZGRhdGEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlpZiAo aW50ZWxoYWRkYXRhLT5mbGFnX3VuZGVycnVuKSB7CisJCWludGVsaGFkZGF0YS0+ZmxhZ191bmRl cnJ1biA9IDA7CisJCXJldHVybiBTTkRSVl9QQ01fUE9TX1hSVU47CisJfQorCisJLyogVXNlIGEg aHcgcmVnaXN0ZXIgdG8gY2FsY3VsYXRlIHN1Yi1wZXJpb2QgcG9zaXRpb24gcmVwb3J0cy4KKwkg KiBUaGlzIG1ha2VzIFB1bHNlQXVkaW8gaGFwcGllci4KKwkgKi8KKworCWJ1Zl9pZCA9IGludGVs aGFkZGF0YS0+Y3Vycl9idWYgJSA0OworCWhhZF9yZWFkX3JlZ2lzdGVyKEFVRF9CVUZfQV9MRU5H VEggKyAoYnVmX2lkICogSEFEX1JFR19XSURUSCksICZ0KTsKKwlpZiAodCA9PSAwKSB7CisJCXBy X2RlYnVnKCJkaXNjb3ZlcmVkIGJ1ZmZlciBkb25lIGZvciBidWYgJWRcbiIsIGJ1Zl9pZCk7CisJ CS8qIGhhZF9wcm9jZXNzX2J1ZmZlcl9kb25lKGludGVsaGFkZGF0YSk7ICovCisJfQorCXQgPSBp bnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2J1Zl9pZF0uYnVmX3NpemUgLSB0OworCisJaWYgKGludGVs aGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3JlbmRlcmVkKQorCQlkaXZfdTY0X3JlbShpbnRl bGhhZGRhdGEtPnN0cmVhbV9pbmZvLmJ1ZmZlcl9yZW5kZXJlZCwKKwkJCWludGVsaGFkZGF0YS0+ c3RyZWFtX2luZm8ucmluZ19idWZfc2l6ZSwKKwkJCSYoYnl0ZXNfcmVuZGVyZWQpKTsKKworCWlu dGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3B0ciA9IGJ5dGVzX3RvX2ZyYW1lcygKKwkJ CQkJCXN1YnN0cmVhbS0+cnVudGltZSwKKwkJCQkJCWJ5dGVzX3JlbmRlcmVkICsgdCk7CisJcmV0 dXJuIGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3B0cjsKK30KKworLyoqCisqIHNu ZF9pbnRlbGhhZF9wY21fbW1hcC0gbW1hcHMgYSBrZXJuZWwgYnVmZmVyIHRvIHVzZXIgc3BhY2Ug Zm9yIGNvcHlpbmcgZGF0YQorKgorKiBAc3Vic3RyZWFtOiAgc3Vic3RyZWFtIGZvciB3aGljaCB0 aGUgZnVuY3Rpb24gaXMgY2FsbGVkCisqIEB2bWE6CQlzdHJ1Y3QgaW5zdGFuY2Ugb2YgbWVtb3J5 IFZNTSBtZW1vcnkgYXJlYQorKgorKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBPUyB3aGVu IGEgdXNlciBzcGFjZSBjb21wb25lbnQKKyogdHJpZXMgdG8gZ2V0IG1tYXAgbWVtb3J5IGZyb20g ZHJpdmVyCisqLworc3RhdGljIGludCBzbmRfaW50ZWxoYWRfcGNtX21tYXAoc3RydWN0IHNuZF9w Y21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7 CisKKwlwcl9kZWJ1Zygic25kX2ludGVsaGFkX3BjbV9tbWFwIGNhbGxlZFxuIik7CisKKwlwcl9k ZWJ1ZygiZW50cnkgd2l0aCBwcm90OiVzXG4iLCBfX2Z1bmNfXyk7CisJdm1hLT52bV9wYWdlX3By b3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKwlyZXR1cm4gcmVtYXBf cGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCXN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5h ZGRyID4+IFBBR0VfU0hJRlQsCisJCQl2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+ dm1fcGFnZV9wcm90KTsKK30KKworaW50IGhkbWlfYXVkaW9fbW9kZV9jaGFuZ2Uoc3RydWN0IHNu ZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IHJldHZhbCA9IDA7CisJdTMyIGRp c3Bfc2FtcF9mcmVxLCBuX3BhcmFtOworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0 YTsKKworCWludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsK KworCS8qIERpc2FibGUgQXVkaW8gKi8KKwlpbnRlbGhhZGRhdGEtPm9wcy0+ZW5hYmxlX2F1ZGlv KHN1YnN0cmVhbSwgMCk7CisKKwkvKiBVcGRhdGUgQ1RTIHZhbHVlICovCisJcmV0dmFsID0gaGFk X2dldF9jYXBzKEhBRF9HRVRfRElTUExBWV9SQVRFLCAmZGlzcF9zYW1wX2ZyZXEpOworCWlmIChy ZXR2YWwpIHsKKwkJcHJfZXJyKCJxdWVyeWluZyBkaXNwbGF5IHNhbXBsaW5nIGZyZXEgZmFpbGVk ICUjeFxuIiwgcmV0dmFsKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0dmFsID0gaW50ZWxoYWRk YXRhLT5vcHMtPnByb2dfbihzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUsICZuX3BhcmFtLAorCQkJ CQkJCQlpbnRlbGhhZGRhdGEpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJwcm9ncmFtbWlu ZyBOIHZhbHVlIGZhaWxlZCAlI3hcbiIsIHJldHZhbCk7CisJCWdvdG8gb3V0OworCX0KKwlpbnRl bGhhZGRhdGEtPm9wcy0+cHJvZ19jdHMoc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlLAorCQkJCQlk aXNwX3NhbXBfZnJlcSwgbl9wYXJhbSwgaW50ZWxoYWRkYXRhKTsKKworCS8qIEVuYWJsZSBBdWRp byAqLworCWludGVsaGFkZGF0YS0+b3BzLT5lbmFibGVfYXVkaW8oc3Vic3RyZWFtLCAxKTsKKwor b3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qUENNIG9wZXJhdGlvbnMgc3RydWN0dXJlIGFu ZCB0aGUgY2FsbHMgYmFjayBmb3IgdGhlIHNhbWUgKi8KK3N0cnVjdCBzbmRfcGNtX29wcyBzbmRf aW50ZWxoYWRfcGxheWJhY2tfb3BzID0geworCS5vcGVuID0JCXNuZF9pbnRlbGhhZF9vcGVuLAor CS5jbG9zZSA9CXNuZF9pbnRlbGhhZF9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0 bCwKKwkuaHdfcGFyYW1zID0Jc25kX2ludGVsaGFkX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNu ZF9pbnRlbGhhZF9od19mcmVlLAorCS5wcmVwYXJlID0Jc25kX2ludGVsaGFkX3BjbV9wcmVwYXJl LAorCS50cmlnZ2VyID0Jc25kX2ludGVsaGFkX3BjbV90cmlnZ2VyLAorCS5wb2ludGVyID0Jc25k X2ludGVsaGFkX3BjbV9wb2ludGVyLAorCS5tbWFwID0Jc25kX2ludGVsaGFkX3BjbV9tbWFwLAor fTsKKworLyoqCisgKiBzbmRfaW50ZWxoYWRfY3JlYXRlIC0gdG8gY3JldGUgYWxzYSBjYXJkIGlu c3RhbmNlCisgKgorICogQGludGVsaGFkZGF0YTogcG9pbnRlciB0byBpbnRlcm5hbCBjb250ZXh0 CisgKiBAY2FyZDogcG9pbnRlciB0byBjYXJkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxs ZWQgd2hlbiB0aGUgaGRtaSBjYWJsZSBpcyBwbHVnZ2VkIGluCisgKi8KK3N0YXRpYyBpbnQgc25k X2ludGVsaGFkX2NyZWF0ZSgKKwkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhLAor CQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCit7CisJaW50IHJldHZhbDsKKwlzdGF0aWMgc3RydWN0 IHNuZF9kZXZpY2Vfb3BzIG9wcyA9IHsKKwl9OworCisJcHJfZGVidWcoInNuZF9pbnRlbGhhZF9j cmVhdGUgY2FsbGVkXG4iKTsKKworCWlmICghaW50ZWxoYWRkYXRhKQorCQlyZXR1cm4gLUVJTlZB TDsKKworCS8qIEFMU0EgYXBpIHRvIHJlZ2lzdGVyIHRoZSBkZXZpY2UgKi8KKwlyZXR2YWwgPSBz bmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfTE9XTEVWRUwsIGludGVsaGFkZGF0YSwgJm9w cyk7CisJcmV0dXJuIHJldHZhbDsKK30KKy8qKgorICogc25kX2ludGVsaGFkX3BjbV9mcmVlIC0g dG8gZnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZAorICoKKyAqIEBwY206IHBvaW50ZXIgdG8gcGNt IGluc3RhbmNlCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBkZXZpY2UgaXMg cmVtb3ZlZAorICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfcGNtX2ZyZWUoc3RydWN0IHNu ZF9wY20gKnBjbSkKK3sKKwlwcl9kZWJ1ZygiRnJlZWluZyBQQ00gcHJlYWxsb2NhdGVkIHBhZ2Vz XG4iKTsKKwlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9mcmVlX2Zvcl9hbGwocGNtKTsKK30KKwor c3RhdGljIGludCBoYWRfaWVjOTU4X2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2ws CisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9 IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgaGFkX2llYzk1OF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAq a2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJ c3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gc25kX2tjb250cm9sX2NoaXAoa2Nv bnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSAoaW50ZWxoYWRk YXRhLT5hZXNfYml0cyA+PiAwKSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0 dXNbMV0gPSAoaW50ZWxoYWRkYXRhLT5hZXNfYml0cyA+PiA4KSAmIDB4ZmY7CisJdWNvbnRyb2wt PnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPQorCQkJCQkoaW50ZWxoYWRkYXRhLT5hZXNfYml0cyA+ PiAxNikgJiAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0KKwkJCQkJ KGludGVsaGFkZGF0YS0+YWVzX2JpdHMgPj4gMjQpICYgMHhmZjsKKwlyZXR1cm4gMDsKK30KK3N0 YXRpYyBpbnQgaGFkX2llYzk1OF9tYXNrX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJv bCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJv bC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1 OC5zdGF0dXNbMV0gPSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzJdID0g MHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA9IDB4ZmY7CisJcmV0dXJu IDA7Cit9CitzdGF0aWMgaW50IGhhZF9pZWM5NThfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtj b250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVu c2lnbmVkIGludCB2YWw7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gc25k X2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJcHJfZGVidWcoImVudGVyZWQgaGFkX2llYzk1 OF9wdXRcbiIpOworCXZhbCA9ICh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA8PCAw KSB8CisJCSh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA8PCA4KSB8CisJCSh1Y29u dHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA8PCAxNikgfAorCQkodWNvbnRyb2wtPnZhbHVl LmllYzk1OC5zdGF0dXNbM10gPDwgMjQpOworCWlmIChpbnRlbGhhZGRhdGEtPmFlc19iaXRzICE9 IHZhbCkgeworCQlpbnRlbGhhZGRhdGEtPmFlc19iaXRzID0gdmFsOworCQlyZXR1cm4gMTsKKwl9 CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBoYWRfY29u dHJvbF9pZWM5NThfbWFzayA9IHsKKwkuYWNjZXNzID0gICBTTkRSVl9DVExfRUxFTV9BQ0NFU1Nf UkVBRCwKKwkuaWZhY2UgPSAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPSAg ICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLCBQTEFZQkFDSywgTUFTSyksCisJLmluZm8gPSAg ICAgaGFkX2llYzk1OF9pbmZvLCAvKiBzaGFyZWQgKi8KKwkuZ2V0ID0gICAgICBoYWRfaWVjOTU4 X21hc2tfZ2V0LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhhZF9jb250 cm9sX2llYzk1OCA9IHsKKwkuaWZhY2UgPSAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJ Lm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIiwgUExBWUJBQ0ssIERFRkFV TFQpLAorCS5pbmZvID0gICAgICAgICBoYWRfaWVjOTU4X2luZm8sCisJLmdldCA9ICAgICAgICAg IGhhZF9pZWM5NThfZ2V0LAorCS5wdXQgPSAgICAgICAgICBoYWRfaWVjOTU4X3B1dAorfTsKKwor c3RhdGljIHN0cnVjdCBzbmRfaW50ZWxfaGFkX2ludGVyZmFjZSBoYWRfaW50ZXJmYWNlID0gewor CS5uYW1lID0gICAgICAgICAiaGRtaS1hdWRpbyIsCisJLnF1ZXJ5ID0gICAgICAgIGhkbWlfYXVk aW9fcXVlcnksCisJLnN1c3BlbmQgPSAgICAgIGhkbWlfYXVkaW9fc3VzcGVuZCwKKwkucmVzdW1l ID0gICAgICAgaGRtaV9hdWRpb19yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IGhhZF9vcHMg aGFkX29wc192MSA9IHsKKwkuZW5hYmxlX2F1ZGlvID0gc25kX2ludGVsaGFkX2VuYWJsZV9hdWRp b192MSwKKwkucmVzZXRfYXVkaW8gPSBzbmRfaW50ZWxoYWRfcmVzZXRfYXVkaW9fdjEsCisJLnBy b2dfbiA9CXNuZF9pbnRlbGhhZF9wcm9nX25fdjEsCisJLnByb2dfY3RzID0Jc25kX2ludGVsaGFk X3Byb2dfY3RzX3YxLAorCS5hdWRpb19jdHJsID0Jc25kX2ludGVsaGFkX3Byb2dfYXVkaW9fY3Ry bF92MSwKKwkucHJvZ19kaXAgPQlzbmRfaW50ZWxoYWRfcHJvZ19kaXBfdjEsCisJLmhhbmRsZV91 bmRlcnJ1biA9ICBoYWRfY2xlYXJfdW5kZXJydW5faW50cl92MSwKK307CisKK3N0YXRpYyBzdHJ1 Y3QgaGFkX29wcyBoYWRfb3BzX3YyID0geworCS5lbmFibGVfYXVkaW8gPSBzbmRfaW50ZWxoYWRf ZW5hYmxlX2F1ZGlvX3YyLAorCS5yZXNldF9hdWRpbyA9IHNuZF9pbnRlbGhhZF9yZXNldF9hdWRp b192MiwKKwkucHJvZ19uID0Jc25kX2ludGVsaGFkX3Byb2dfbl92MiwKKwkucHJvZ19jdHMgPQlz bmRfaW50ZWxoYWRfcHJvZ19jdHNfdjIsCisJLmF1ZGlvX2N0cmwgPQlzbmRfaW50ZWxoYWRfcHJv Z19hdWRpb19jdHJsX3YyLAorCS5wcm9nX2RpcCA9CXNuZF9pbnRlbGhhZF9wcm9nX2RpcF92MiwK KwkuaGFuZGxlX3VuZGVycnVuID0gaGFkX2NsZWFyX3VuZGVycnVuX2ludHJfdjIsCit9OworLyoq CisgKiBoZG1pX2F1ZGlvX3Byb2JlIC0gdG8gY3JlYXRlIHNvdW5kIGNhcmQgaW5zdGFuY2UgZm9y IEhETUkgYXVkaW8gcGxheWFiY2sKKyAqCisgKkBoYWRkYXRhOiBwb2ludGVyIHRvIEhBRCBwcml2 YXRlIGRhdGEKKyAqQGNhcmRfaWQ6IGNhcmQgZm9yIHdoaWNoIHByb2JlIGlzIGNhbGxlZAorICoK KyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGhkbWkgY2FibGUgaXMgcGx1Z2dl ZCBpbi4gVGhpcyBmdW5jdGlvbgorICogY3JlYXRlcyBhbmQgcmVnaXN0ZXJzIHRoZSBzb3VuZCBj YXJkIHdpdGggQUxTQQorICovCitpbnQgaGRtaV9hdWRpb19wcm9iZSh2b2lkICpkZXZpY2VwdHIp Cit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtOworCXN0cnVjdCBzbmRfY2Fy ZCAqY2FyZDsKKwlzdHJ1Y3QgaGFkX2NhbGxiYWNrX29wcyBvcHNfY2I7CisJc3RydWN0IHNuZF9p bnRlbGhhZCAqaW50ZWxoYWRkYXRhOworCXN0cnVjdCBoYWRfcHZ0X2RhdGEgKmhhZF9zdHJlYW07 CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyID0gZGV2aWNlcHRyOworCisJcHJfZGVi dWcoIkVudGVyICVzXG4iLCBfX2Z1bmNfXyk7CisKKwlwcl9kZWJ1ZygiaGRtaV9hdWRpb19wcm9i ZSBkbWFfbWFzazogJXBcbiIsIGRldnB0ci0+ZGV2LmRtYV9tYXNrKTsKKworCS8qIGFsbG9jYXRl IG1lbW9yeSBmb3Igc2F2aW5nIGludGVybmFsIGNvbnRleHQgYW5kIHdvcmtpbmcgKi8KKwlpbnRl bGhhZGRhdGEgPSBremFsbG9jKHNpemVvZigqaW50ZWxoYWRkYXRhKSwgR0ZQX0tFUk5FTCk7CisJ aWYgKCFpbnRlbGhhZGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJaGFkX3N0cmVhbSA9IGt6 YWxsb2Moc2l6ZW9mKCpoYWRfc3RyZWFtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoYWRfc3RyZWFt KSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9oYWRkYXRhOworCX0KKworCWhh ZF9kYXRhID0gaW50ZWxoYWRkYXRhOworCW9wc19jYi5pbnRlbF9oYWRfZXZlbnRfY2FsbF9iYWNr ID0gaGFkX2V2ZW50X2hhbmRsZXI7CisKKwkvKiByZWdpc3RlcmluZyB3aXRoIGRpc3BsYXkgZHJp dmVyIHRvIGdldCBhY2Nlc3MgdG8gZGlzcGxheSBBUElzICovCisKKwlyZXR2YWwgPSBtaWRfaGRt aV9hdWRpb19zZXR1cCgKKwkJCW9wc19jYi5pbnRlbF9oYWRfZXZlbnRfY2FsbF9iYWNrLAorCQkJ JihpbnRlbGhhZGRhdGEtPnJlZ19vcHMpLAorCQkJJihpbnRlbGhhZGRhdGEtPnF1ZXJ5X29wcykp OworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJxdWVyeWluZyBkaXNwbGF5IGRyaXZlciBBUElz IGZhaWxlZCAlI3hcbiIsIHJldHZhbCk7CisJCWdvdG8gZnJlZV9oYWRzdHJlYW07CisJfQorCW11 dGV4X2xvY2soJmhhZF9tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJmludGVsaGFkZGF0YS0+aGFk X3NwaW5sb2NrKTsKKwlpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPSBIQURfRFJWX0RJU0NPTk5F Q1RFRDsKKwlwcl9kZWJ1ZygiJXMgQCAlZDpERUJVRyBQTFVHL1VOUExVRyA6IEhBRF9EUlZfRElT Q09OTkVDVEVEXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCS8qIGNyZWF0ZSBhIGNh cmQgaW5zdGFuY2Ugd2l0aCBBTFNBIGZyYW1ld29yayAqLworCXJldHZhbCA9IHNuZF9jYXJkX25l dygmZGV2cHRyLT5kZXYsIGhkbWlfY2FyZF9pbmRleCwgaGRtaV9jYXJkX2lkLAorCQkJCVRISVNf TU9EVUxFLCAwLCAmY2FyZCk7CisKKwlpZiAocmV0dmFsKQorCQlnb3RvIHVubG9ja19tdXRleDsK KwlpbnRlbGhhZGRhdGEtPmNhcmQgPSBjYXJkOworCWludGVsaGFkZGF0YS0+Y2FyZF9pZCA9IGhk bWlfY2FyZF9pZDsKKwlpbnRlbGhhZGRhdGEtPmNhcmRfaW5kZXggPSBjYXJkLT5udW1iZXI7CisJ aW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGEgPSBoYWRfc3RyZWFtOworCWludGVsaGFkZGF0YS0+ ZmxhZ191bmRlcnJ1biA9IDA7CisJaW50ZWxoYWRkYXRhLT5hZXNfYml0cyA9IFNORFJWX1BDTV9E RUZBVUxUX0NPTl9TUERJRjsKKwlzdHJuY3B5KGNhcmQtPmRyaXZlciwgSU5URUxfSEFELCBzdHJs ZW4oSU5URUxfSEFEKSk7CisJc3RybmNweShjYXJkLT5zaG9ydG5hbWUsIElOVEVMX0hBRCwgc3Ry bGVuKElOVEVMX0hBRCkpOworCisJcmV0dmFsID0gc25kX3BjbV9uZXcoY2FyZCwgSU5URUxfSEFE LCBQQ01fSU5ERVgsIE1BWF9QQl9TVFJFQU1TLAorCQkJCQkJTUFYX0NBUF9TVFJFQU1TLCAmcGNt KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycjsKKworCS8qIHNldHVwIHByaXZhdGUgZGF0YSB3 aGljaCBjYW4gYmUgcmV0cmlldmVkIHdoZW4gcmVxdWlyZWQgKi8KKwlwY20tPnByaXZhdGVfZGF0 YSA9IGludGVsaGFkZGF0YTsKKwlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9pbnRlbGhhZF9wY21f ZnJlZTsKKwlwY20tPmluZm9fZmxhZ3MgPSAwOworCXN0cm5jcHkocGNtLT5uYW1lLCBjYXJkLT5z aG9ydG5hbWUsIHN0cmxlbihjYXJkLT5zaG9ydG5hbWUpKTsKKwkvKiBzZXR1cCB0aGUgb3BzIGZv ciBwYWx5YWJjayAqLworCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExB WUJBQ0ssCisJCQkgICAgJnNuZF9pbnRlbGhhZF9wbGF5YmFja19vcHMpOworCS8qIGFsbG9jYXRl IGRtYSBwYWdlcyBmb3IgQUxTQSBzdHJlYW0gb3BlcmF0aW9ucworCSAqIG1lbW9yeSBhbGxvY2F0 ZWQgaXMgYmFzZWQgb24gc2l6ZSwgbm90IG1heCB2YWx1ZQorCSAqIHRodXMgdXNpbmcgc2FtZSBh cmd1bWVudCBmb3IgbWF4ICYgc2l6ZQorCSAqLworCXJldHZhbCA9IHNuZF9wY21fbGliX3ByZWFs bG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLAorCQkJU05EUlZfRE1BX1RZUEVfREVWLCBOVUxMLAor CQkJSEFEX01BWF9CVUZGRVIsIEhBRF9NQVhfQlVGRkVSKTsKKworCWlmIChjYXJkLT5kZXYgPT0g TlVMTCkKKwkJcHJfZGVidWcoImNhcmQtPmRldiBpcyBOVUxMISEhISEgU2hvdWxkIG5vdCBiZSB0 aGlzIGNhc2VcbiIpOworCWVsc2UgaWYgKGNhcmQtPmRldi0+ZG1hX21hc2sgPT0gTlVMTCkKKwkJ cHJfZGVidWcoImhkbWlfYXVkaW9fcHJvYmUgZG1hX21hc2sgaXMgTlVMTCEhISEhXG4iKTsKKwll bHNlCisJCXByX2RlYnVnKCJoZG1pX2F1ZGlvX3Byb2JlIGRtYV9tYXNrIGlzIDogJXBcbiIsCisJ CQkJY2FyZC0+ZGV2LT5kbWFfbWFzayk7CisKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycjsKKwor CS8qIGludGVybmFsIGZ1bmN0aW9uIGNhbGwgdG8gcmVnaXN0ZXIgZGV2aWNlIHdpdGggQUxTQSAq LworCXJldHZhbCA9IHNuZF9pbnRlbGhhZF9jcmVhdGUoaW50ZWxoYWRkYXRhLCBjYXJkKTsKKwlp ZiAocmV0dmFsKQorCQlnb3RvIGVycjsKKworCWNhcmQtPnByaXZhdGVfZGF0YSA9ICZpbnRlbGhh ZGRhdGE7CisJcmV0dmFsID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKHJldHZhbCkK KwkJZ290byBlcnI7CisKKwkvKiBJRUM5NTggY29udHJvbHMgKi8KKwlyZXR2YWwgPSBzbmRfY3Rs X2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJmhhZF9jb250cm9sX2llYzk1OF9tYXNrLAorCQkJCQkJ aW50ZWxoYWRkYXRhKSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZXJyOworCXJldHZhbCA9 IHNuZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmaGFkX2NvbnRyb2xfaWVjOTU4LAorCQkJ CQkJaW50ZWxoYWRkYXRhKSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZXJyOworCisJaW5p dF9jaGFubmVsX2FsbG9jYXRpb25zKCk7CisKKwkvKiBSZWdpc3RlciBjaGFubmVsIG1hcCBjb250 cm9scyAqLworCXJldHZhbCA9IGhhZF9yZWdpc3Rlcl9jaG1hcF9jdGxzKGludGVsaGFkZGF0YSwg cGNtKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnI7CisKKwlpbnRlbGhhZGRhdGEtPmRl diA9ICZkZXZwdHItPmRldjsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoaW50ZWxoYWRkYXRhLT5k ZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKGludGVsaGFkZGF0YS0+ZGV2KTsKKworCW11dGV4X3Vu bG9jaygmaGFkX211dGV4KTsKKwlyZXR2YWwgPSBtaWRfaGRtaV9hdWRpb19yZWdpc3RlcigmaGFk X2ludGVyZmFjZSwgaW50ZWxoYWRkYXRhKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2VycigicmVn aXN0ZXJpbmcgd2l0aCBkaXNwbGF5IGRyaXZlciBmYWlsZWQgJSN4XG4iLCByZXR2YWwpOworCQlz bmRfY2FyZF9mcmVlKGNhcmQpOworCQlnb3RvIGZyZWVfaGFkc3RyZWFtOworCX0KKworCWludGVs aGFkZGF0YS0+aHdfc2lsZW5jZSA9IDE7CisJaGFkX29wc192MSA9IGhhZF9vcHNfdjE7CS8qIHVu dXNlZCAqLworCWludGVsaGFkZGF0YS0+b3BzID0gJmhhZF9vcHNfdjI7CisKKwlyZXR1cm4gcmV0 dmFsOworZXJyOgorCXNuZF9jYXJkX2ZyZWUoY2FyZCk7Cit1bmxvY2tfbXV0ZXg6CisJbXV0ZXhf dW5sb2NrKCZoYWRfbXV0ZXgpOworZnJlZV9oYWRzdHJlYW06CisJa2ZyZWUoaGFkX3N0cmVhbSk7 CisJcG1fcnVudGltZV9kaXNhYmxlKGludGVsaGFkZGF0YS0+ZGV2KTsKKwlpbnRlbGhhZGRhdGEt PmRldiA9IE5VTEw7CitmcmVlX2hhZGRhdGE6CisJa2ZyZWUoaW50ZWxoYWRkYXRhKTsKKwlpbnRl bGhhZGRhdGEgPSBOVUxMOworCXByX2VycigiRXJyb3IgcmV0dXJuZWQgZnJvbSAlcyBhcGkgJSN4 XG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGhk bWlfYXVkaW9fcmVtb3ZlIC0gcmVtb3ZlcyB0aGUgYWxzYSBjYXJkCisgKgorICpAaGFkZGF0YTog cG9pbnRlciB0byBIQUQgcHJpdmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxs ZWQgd2hlbiB0aGUgaGRtaSBjYWJsZSBpcyB1bi1wbHVnZ2VkLiBUaGlzIGZ1bmN0aW9uCisgKiBm cmVlIHRoZSBzb3VuZCBjYXJkLgorICovCitpbnQgaGRtaV9hdWRpb19yZW1vdmUodm9pZCAqcGRl dnB0cikKK3sKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBoYWRfZGF0YTsK KwlpbnQgY2FwczsKKworCXByX2RlYnVnKCJFbnRlciAlc1xuIiwgX19mdW5jX18pOworCisJaWYg KCFpbnRlbGhhZGRhdGEpCisJCXJldHVybiAwOworCisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0 YXR1cyAhPSBIQURfRFJWX0RJU0NPTk5FQ1RFRCkgeworCQljYXBzID0gSERNSV9BVURJT19VTkRF UlJVTiB8IEhETUlfQVVESU9fQlVGRkVSX0RPTkU7CisJCWhhZF9zZXRfY2FwcyhIQURfU0VUX0RJ U0FCTEVfQVVESU9fSU5ULCAmY2Fwcyk7CisJCWhhZF9zZXRfY2FwcyhIQURfU0VUX0RJU0FCTEVf QVVESU8sIE5VTEwpOworCX0KKwlzbmRfY2FyZF9mcmVlKGludGVsaGFkZGF0YS0+Y2FyZCk7CisJ a2ZyZWUoaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGEpOworCWtmcmVlKGludGVsaGFkZGF0YSk7 CisJcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIlNhaWxhamEgQmFuZGFydXBhbGxpIDxz YWlsYWphLmJhbmRhcnVwYWxsaUBpbnRlbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJSYW1lc2gg QmFidSBLIFYgPHJhbWVzaC5iYWJ1QGludGVsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlZhaWJo YXYgQWdhcndhbCA8dmFpYmhhdi5hZ2Fyd2FsQGludGVsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1Io Ikplcm9tZSBBbmFuZCA8amVyb21lLmFuYW5kQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQ VElPTigiSW50ZWwgSERNSSBBdWRpbyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIi KTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7SW50ZWwsSW50ZWxfSEFEfSIpOwpkaWZmIC0t Z2l0IGEvc291bmQveDg2L2ludGVsX2hkbWlfYXVkaW8uaCBiL3NvdW5kL3g4Ni9pbnRlbF9oZG1p X2F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmMjViNgotLS0g L2Rldi9udWxsCisrKyBiL3NvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvLmgKQEAgLTAsMCArMSwy MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSW50ZWwgQ29ycG9yYXRpb24KKyAqICBB dXRob3JzOglTYWlsYWphIEJhbmRhcnVwYWxsaSA8c2FpbGFqYS5iYW5kYXJ1cGFsbGlAaW50ZWwu Y29tPgorICoJCVJhbWVzaCBCYWJ1IEsgVgk8cmFtZXNoLmJhYnVAaW50ZWwuY29tPgorICoJCVZh aWJoYXYgQWdhcndhbCA8dmFpYmhhdi5hZ2Fyd2FsQGludGVsLmNvbT4KKyAqCQlKZXJvbWUgQW5h bmQgPGplcm9tZS5hbmFuZEBpbnRlbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkg Z3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNv cHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisg KiAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3Ry aWN0aW9uLAorICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVz ZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vu c2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0 IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICog c3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNv cHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUK KyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1 YnN0YW50aWFsCisgKiBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRX QVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisg KiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdB UlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg QVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0s IERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0Yg Q09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgor ICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJ TkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfSU5URUxfSERNSV9BVURJ T19IXworI2RlZmluZSBfSU5URUxfSERNSV9BVURJT19IXworCisjaW5jbHVkZSA8bGludXgvdHlw ZXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lv bi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291 bmRlZi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20u aD4KKyNpbmNsdWRlICJpbnRlbF9oZG1pX2xwZV9hdWRpby5oIgorCisjZGVmaW5lIFBDTV9JTkRF WAkJMAorI2RlZmluZSBNQVhfUEJfU1RSRUFNUwkJMQorI2RlZmluZSBNQVhfQ0FQX1NUUkVBTVMJ CTAKKyNkZWZpbmUgSERNSV9BVURJT19EUklWRVIJImhkbWktYXVkaW8iCisKKyNkZWZpbmUgSU5G T19GUkFNRV9XT1JEMQkweDAwMGEwMTg0CisjZGVmaW5lIEZJRk9fVEhSRVNIT0xECQkweEZFCisj ZGVmaW5lIERNQV9GSUZPX1RIUkVTSE9MRAkweDcKKyNkZWZpbmUgQllURVNfUEVSX1dPUkQJCTB4 NAorCisvKiBTYW1wbGluZyByYXRlIGFzIHBlciBJRUM2MDk1OCBWZXIgMyAqLworI2RlZmluZSBD SF9TVEFUVVNfTUFQXzMyS0haCTB4MworI2RlZmluZSBDSF9TVEFUVVNfTUFQXzQ0S0haCTB4MAor I2RlZmluZSBDSF9TVEFUVVNfTUFQXzQ4S0haCTB4MgorI2RlZmluZSBDSF9TVEFUVVNfTUFQXzg4 S0haCTB4OAorI2RlZmluZSBDSF9TVEFUVVNfTUFQXzk2S0haCTB4QQorI2RlZmluZSBDSF9TVEFU VVNfTUFQXzE3NktIWgkweEMKKyNkZWZpbmUgQ0hfU1RBVFVTX01BUF8xOTJLSFoJMHhFCisKKyNk ZWZpbmUgTUFYX1NNUExfV0lEVEhfMjAJMHgwCisjZGVmaW5lIE1BWF9TTVBMX1dJRFRIXzI0CTB4 MQorI2RlZmluZSBTTVBMX1dJRFRIXzE2QklUUwkweDEKKyNkZWZpbmUgU01QTF9XSURUSF8yNEJJ VFMJMHg1CisjZGVmaW5lIENIQU5ORUxfQUxMT0NBVElPTgkweDFGCisjZGVmaW5lIE1BU0tfQllU RTAJCTB4MDAwMDAwRkYKKyNkZWZpbmUgVkFMSURfRElQX1dPUkRTCQkzCisjZGVmaW5lIExBWU9V VDAJCQkwCisjZGVmaW5lIExBWU9VVDEJCQkxCisjZGVmaW5lIFNXQVBfTEZFX0NFTlRFUgkJMHgw MGZhYzRjOAorI2RlZmluZSBBVURfQ09ORklHX0NIX01BU0tfVjIJMHg3MAorCitzdHJ1Y3QgcGNt X3N0cmVhbV9pbmZvIHsKKwlpbnQJCXN0cl9pZDsKKwl2b2lkCSpoYWRfc3Vic3RyZWFtOworCXZv aWQJKCpwZXJpb2RfZWxhcHNlZCkodm9pZCAqaGFkX3N1YnN0cmVhbSk7CisJdTMyCQlidWZmZXJf cHRyOworCXU2NAkJYnVmZmVyX3JlbmRlcmVkOworCXUzMgkJcmluZ19idWZfc2l6ZTsKKwlpbnQJ CXNmcmVxOworfTsKKworc3RydWN0IHJpbmdfYnVmX2luZm8geworCXVpbnQzMl90CWJ1Zl9hZGRy OworCXVpbnQzMl90CWJ1Zl9zaXplOworCXVpbnQ4X3QJCWlzX3ZhbGlkOworfTsKKworc3RydWN0 IGhhZF9zdHJlYW1fcHZ0IHsKKwllbnVtIGhhZF9zdHJlYW1fc3RhdHVzCQlzdHJlYW1fc3RhdHVz OworCWludAkJCQlzdHJlYW1fb3BzOworCXNzaXplX3QJCQkJZGJnX2N1bV9ieXRlczsKK307CisK K3N0cnVjdCBoYWRfcHZ0X2RhdGEgeworCWVudW0gaGFkX3N0YXR1c19zdHJlYW0JCXN0cmVhbV90 eXBlOworfTsKKworc3RydWN0IGhhZF9jYWxsYmFja19vcHMgeworCWhhZF9ldmVudF9jYWxsX2Jh Y2sgaW50ZWxfaGFkX2V2ZW50X2NhbGxfYmFjazsKK307CisKKy8qKgorICogc3RydWN0IHNuZF9p bnRlbGhhZCAtIGludGVsaGFkIGRyaXZlciBzdHJ1Y3R1cmUKKyAqCisgKiBAY2FyZDogcHRyIHRv IGhvbGQgY2FyZCBkZXRhaWxzCisgKiBAY2FyZF9pbmRleDogc291bmQgY2FyZCBpbmRleAorICog QGNhcmRfaWQ6IGRldGVjdGVkIHNvdW5kIGNhcmQgaWQKKyAqIEByZWdfb3BzOiByZWdpc3RlciBv cGVyYXRpb25zIHRvIHByb2dyYW0gcmVnaXN0ZXJzCisgKiBAcXVlcnlfb3BzOiBjYXBzIGNhbGwg YmFja3MgZm9yIGdldC9zZXQgb3BlcmF0aW9ucworICogQGRydl9zdGF0dXM6IGRyaXZlciBzdGF0 dXMKKyAqIEBidWZfaW5mbzogcmluZyBidWZmZXIgaW5mbworICogQHN0cmVhbV9pbmZvOiBzdHJl YW0gaW5mb3JtYXRpb24KKyAqIEBlZWxkOiBob2xkcyBFRUxEIGluZm8KKyAqIEBjdXJyX2J1Zjog cG9pbnRlciB0byBob2xkIGN1cnJlbnQgYWN0aXZlIHJpbmcgYnVmCisgKiBAdmFsaWRfYnVmX2Nu dDogcmluZyBidWZmZXIgY291bnQgZm9yIHN0cmVhbQorICogQGhhZF9zcGlubG9jazogZHJpdmVy IGxvY2sKKyAqIEBhZXNfYml0czogSUVDOTU4IHN0YXR1cyBiaXRzCisgKiBAYnVmZl9kb25lOiBp ZCBvZiBjdXJyZW50IGJ1ZmZlciBkb25lIGludHIKKyAqIEBkZXY6IHBsYXRvZm9ybSBkZXZpY2Ug aGFuZGxlCisgKiBAa2N0bDogaG9sZHMga2N0bCBwdHJzIHVzZWQgZm9yIGNoYW5uZWwgbWFwCisg KiBAY2htYXA6IGhvbGRzIGNoYW5uZWwgbWFwIGluZm8KKyAqIEBhdWRpb19yZWdfYmFzZTogaGRt aSBhdWRpbyByZWdpc3RlciBiYXNlIG9mZnNldAorICogQGh3X3NpbGVuY2U6IGZsYWcgaW5kaWNh dGVzIFNvQyBzdXBwb3J0IGZvciBIVyBzaWxlbmNlL0tlZXAgYWxpdmUKKyAqIEBvcHM6IGhvbGRz IG9wcyBmdW5jdGlvbnMgYmFzZWQgb24gcGxhdGZvcm0KKyAqLworc3RydWN0IHNuZF9pbnRlbGhh ZCB7CisJc3RydWN0IHNuZF9jYXJkCSpjYXJkOworCWludAkJY2FyZF9pbmRleDsKKwljaGFyCQkq Y2FyZF9pZDsKKwlzdHJ1Y3QgaGRtaV9hdWRpb19yZWdpc3RlcnNfb3BzCXJlZ19vcHM7CisJc3Ry dWN0IGhkbWlfYXVkaW9fcXVlcnlfc2V0X29wcwlxdWVyeV9vcHM7CisJZW51bSBoYWRfZHJ2X3N0 YXR1cwlkcnZfc3RhdHVzOworCXN0cnVjdAkJcmluZ19idWZfaW5mbyBidWZfaW5mb1tIQURfTlVN X09GX1JJTkdfQlVGU107CisJc3RydWN0CQlwY21fc3RyZWFtX2luZm8gc3RyZWFtX2luZm87CisJ dW5pb24gb3RtX2hkbWlfZWxkX3QJZWVsZDsKKwllbnVtCQlpbnRlbF9oYWRfYXVkX2J1Zl90eXBl IGN1cnJfYnVmOworCWludAkJdmFsaWRfYnVmX2NudDsKKwl1bnNpZ25lZCBpbnQJYWVzX2JpdHM7 CisJaW50IGZsYWdfdW5kZXJydW47CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqcHJpdmF0ZV9kYXRh OworCXNwaW5sb2NrX3QgaGFkX3NwaW5sb2NrOworCWVudW0JCWludGVsX2hhZF9hdWRfYnVmX3R5 cGUgYnVmZl9kb25lOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc25kX2tjb250cm9s ICprY3RsOworCXN0cnVjdCBzbmRfcGNtX2NobWFwICpjaG1hcDsKKwl1bnNpZ25lZCBpbnQJKmF1 ZGlvX3JlZ19iYXNlOworCXVuc2lnbmVkIGludAlhdWRpb19jZmdfb2Zmc2V0OworCWJvb2wJCWh3 X3NpbGVuY2U7CisJc3RydWN0IGhhZF9vcHMJKm9wczsKK307CisKK3N0cnVjdCBoYWRfb3BzIHsK Kwl2b2lkICgqZW5hYmxlX2F1ZGlvKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVh bSwKKwkJCXU4IGVuYWJsZSk7CisJdm9pZCAoKnJlc2V0X2F1ZGlvKSh1OCByZXNldCk7CisJaW50 ICgqcHJvZ19uKSh1MzIgYXVkX3NhbXBfZnJlcSwgdTMyICpuX3BhcmFtLAorCQkJc3RydWN0IHNu ZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKTsKKwl2b2lkICgqcHJvZ19jdHMpKHUzMiBhdWRfc2Ft cF9mcmVxLCB1MzIgdG1kcywgdTMyIG5fcGFyYW0sCisJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICpp bnRlbGhhZGRhdGEpOworCWludCAoKmF1ZGlvX2N0cmwpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVh bSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSk7CisJ dm9pZCAoKnByb2dfZGlwKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJ CQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpOworCXZvaWQgKCpoYW5kbGVfdW5k ZXJydW4pKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSk7Cit9OworCisKK2ludCBo YWRfZXZlbnRfaGFuZGxlcihlbnVtIGhhZF9ldmVudF90eXBlIGV2ZW50X3R5cGUsIHZvaWQgKmRh dGEpOworCitpbnQgaGRtaV9hdWRpb19xdWVyeSh2b2lkICpkcnZfZGF0YSwgc3RydWN0IGhkbWlf YXVkaW9fZXZlbnQgZXZlbnQpOworaW50IGhkbWlfYXVkaW9fc3VzcGVuZCh2b2lkICpkcnZfZGF0 YSwgc3RydWN0IGhkbWlfYXVkaW9fZXZlbnQgZXZlbnQpOworaW50IGhkbWlfYXVkaW9fcmVzdW1l KHZvaWQgKmRydl9kYXRhKTsKK2ludCBoZG1pX2F1ZGlvX21vZGVfY2hhbmdlKHN0cnVjdCBzbmRf cGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKK2V4dGVybiBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25k X2ludGVsaGFkX3BsYXliYWNrX29wczsKKworaW50IHNuZF9pbnRlbGhhZF9pbml0X2F1ZGlvX2N0 cmwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRf aW50ZWxoYWQgKmludGVsaGFkZGF0YSwKKwkJCQkJaW50IGZsYWdfc2lsZW5jZSk7CitpbnQgc25k X2ludGVsaGFkX3Byb2dfYnVmZmVyKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSwK KwkJCQkJaW50IHN0YXJ0LCBpbnQgZW5kKTsKK2ludCBzbmRfaW50ZWxoYWRfaW52ZF9idWZmZXIo aW50IHN0YXJ0LCBpbnQgZW5kKTsKK2lubGluZSBpbnQgc25kX2ludGVsaGFkX3JlYWRfbGVuKHN0 cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSk7Cit2b2lkIGhhZF9idWlsZF9jaGFubmVs X2FsbG9jYXRpb25fbWFwKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSk7CisKKy8q IFJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMgKi8KK2lubGluZSBpbnQgaGFkX2dldF9od3N0YXRl KHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSk7CitpbmxpbmUgaW50IGhhZF9nZXRf Y2FwcyhlbnVtIGhhZF9jYXBzX2xpc3QgcXVlcnlfZWxlbWVudCwKKwkJCQkJCXZvaWQgKmNhcGFi aWx0aWVzKTsKK2lubGluZSBpbnQgaGFkX3NldF9jYXBzKGVudW0gaGFkX2NhcHNfbGlzdCBzZXRf ZWxlbWVudCwKKwkJCQkJCXZvaWQgKmNhcGFiaWx0aWVzKTsKK2lubGluZSBpbnQgaGFkX3JlYWRf cmVnaXN0ZXIodWludDMyX3QgcmVnX2FkZHIsIHVpbnQzMl90ICpkYXRhKTsKK2lubGluZSBpbnQg aGFkX3dyaXRlX3JlZ2lzdGVyKHVpbnQzMl90IHJlZ19hZGRyLCB1aW50MzJfdCBkYXRhKTsKK2lu bGluZSBpbnQgaGFkX3JlYWRfbW9kaWZ5KHVpbnQzMl90IHJlZ19hZGRyLCB1aW50MzJfdCBkYXRh LAorCQkJCQkJCXVpbnQzMl90IG1hc2spOworCisvKiovCitpbnQgaGRtaV9hdWRpb19wcm9iZSh2 b2lkICpkZXZwdHIpOworaW50IGhkbWlfYXVkaW9fcmVtb3ZlKHZvaWQgKnBkZXYpOworCisjZW5k aWYgLyogX0lOVEVMX0hETUlfQVVESU9fICovCmRpZmYgLS1naXQgYS9zb3VuZC94ODYvaW50ZWxf aGRtaV9hdWRpb19pZi5jIGIvc291bmQveDg2L2ludGVsX2hkbWlfYXVkaW9faWYuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjUwYmE0Ci0tLSAvZGV2L251bGwKKysrIGIv c291bmQveDg2L2ludGVsX2hkbWlfYXVkaW9faWYuYwpAQCAtMCwwICsxLDU1MSBAQAorLyoKKyAq ICAgaW50ZWxfaGRtaV9hdWRpb19pZi5jIC0gSW50ZWwgSERNSSBhdWRpbyBkcml2ZXIgZm9yIE1J RAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTYgSW50ZWwgQ29ycAorICogIEF1dGhvcnM6CVNh aWxhamEgQmFuZGFydXBhbGxpIDxzYWlsYWphLmJhbmRhcnVwYWxsaUBpbnRlbC5jb20+CisgKgkJ UmFtZXNoIEJhYnUgSyBWIDxyYW1lc2guYmFidUBpbnRlbC5jb20+CisgKgkJVmFpYmhhdiBBZ2Fy d2FsIDx2YWliaGF2LmFnYXJ3YWxAaW50ZWwuY29tPgorICoJCUplcm9tZSBBbmFuZCA8amVyb21l LmFuYW5kQGludGVsLmNvbT4KKyAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHBy b2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJp YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9V VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICog IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl ZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor ICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKiBBTFNBIGRyaXZlciBmb3IgSW50ZWwgTUlEIEhE TUkgYXVkaW8gY29udHJvbGxlci4gIFRoaXMgZmlsZSBjb250YWlucworICogaW50ZXJmYWNlIGZ1 bmN0aW9ucyBleHBvc2VkIHRvIEhETUkgRGlzcGxheSBkcml2ZXIgYW5kIGNvZGUgdG8gcmVnaXN0 ZXIKKyAqIHdpdGggQUxTQSBmcmFtZXdvcmsuLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkJ CSJoYWQ6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2pp ZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+ CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgImludGVsX2hkbWlfYXVkaW8uaCIK KyNpbmNsdWRlICJpbnRlbF9oZG1pX2xwZV9hdWRpby5oIgorCisvKioKKyAqIGhkbWlfYXVkaW9f cXVlcnkgLSBoZG1pIGF1ZGlvIHF1ZXJ5IGZ1bmN0aW9uCisgKgorICpAaGFkZGF0YTogcG9pbnRl ciB0byBIQUQgcHJpdmF0ZSBkYXRhCisgKkBldmVudDogYXVkaW8gZXZlbnQgZm9yIHdoaWNoIHRo aXMgbWV0aG9kIGlzIGludm9rZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBj bGllbnQgZHJpdmVyIHRvIHF1ZXJ5IHRoZQorICogaGRtaSBhdWRpby4KKyAqLworaW50IGhkbWlf YXVkaW9fcXVlcnkodm9pZCAqaGFkZGF0YSwgc3RydWN0IGhkbWlfYXVkaW9fZXZlbnQgZXZlbnQp Cit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBOVUxMOworCXN0cnVj dCBoYWRfcHZ0X2RhdGEgKmhhZF9zdHJlYW07CisJdW5zaWduZWQgbG9uZyBmbGFnX2lycXM7CisJ c3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gKHN0cnVjdCBzbmRfaW50ZWxoYWQg KiloYWRkYXRhOworCisJaWYgKGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVh bSkKKwkJc3Vic3RyZWFtID0gaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFt OworCWhhZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKwlzd2l0Y2ggKGV2 ZW50LnR5cGUpIHsKKwljYXNlIEhBRF9FVkVOVF9RVUVSWV9JU19BVURJT19CVVNZOgorCQlzcGlu X2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisK KwkJaWYgKChoYWRfc3RyZWFtLT5zdHJlYW1fdHlwZSA9PSBIQURfUlVOTklOR19TVFJFQU0pIHx8 CisJCQlzdWJzdHJlYW0pIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0 YS0+aGFkX3NwaW5sb2NrLAorCQkJCQkJZmxhZ19pcnFzKTsKKwkJCXByX2RlYnVnKCJBdWRpbyBz dHJlYW0gYWN0aXZlXG4iKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJYnJl YWs7CisKKwljYXNlIEhBRF9FVkVOVF9RVUVSWV9JU19BVURJT19TVVNQRU5ERUQ6CisJCXNwaW5f bG9ja19pcnFzYXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJ aWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX1NVU1BFTkRFRCkgeworCQkJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssCisJCQkJ CQlmbGFnX2lycXMpOworCQkJcHJfZGVidWcoIkF1ZGlvIGlzIHN1c3BlbmRlZFxuIik7CisJCQly ZXR1cm4gMTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhh ZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2RlYnVn KCJlcnJvciB1bi1oYW5kbGVkIGV2ZW50ICEhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJYnJl YWs7CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoZG1pX2F1ZGlvX3N1c3BlbmQg LSBwb3dlciBtYW5hZ2VtZW50IHN1c3BlbmQgZnVuY3Rpb24KKyAqCisgKkBoYWRkYXRhOiBwb2lu dGVyIHRvIEhBRCBwcml2YXRlIGRhdGEKKyAqQGV2ZW50OiBwbSBldmVudCBmb3Igd2hpY2ggdGhp cyBtZXRob2QgaXMgaW52b2tlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGNs aWVudCBkcml2ZXIgdG8gc3VzcGVuZCB0aGUKKyAqIGhkbWkgYXVkaW8uCisgKi8KK2ludCBoZG1p X2F1ZGlvX3N1c3BlbmQodm9pZCAqaGFkZGF0YSwgc3RydWN0IGhkbWlfYXVkaW9fZXZlbnQgZXZl bnQpCit7CisJaW50IGNhcHMsIHJldHZhbCA9IDA7CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFk X3N0cmVhbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxczsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJz dHJlYW0gKnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSAo c3RydWN0IHNuZF9pbnRlbGhhZCAqKWhhZGRhdGE7CisKKwlwcl9kZWJ1ZygiRW50ZXI6JXNcbiIs IF9fZnVuY19fKTsKKworCWhhZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsK KwlzdWJzdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW07CisK KwlpZiAoaW50ZWxoYWRkYXRhLT5kZXYtPnBvd2VyLnJ1bnRpbWVfc3RhdHVzICE9IFJQTV9TVVNQ RU5ERUQpIHsKKwkJcHJfZXJyKCJhdWRpbyBzdHJlYW0gaXMgYWN0aXZlXG4iKTsKKwkJcmV0dXJu IC1FQUdBSU47CisJfQorCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRf c3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBI QURfRFJWX0RJU0NPTk5FQ1RFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhh ZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZGVidWcoImhhZCBub3QgY29u bmVjdGVkXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5k cnZfc3RhdHVzID09IEhBRF9EUlZfU1VTUEVOREVEKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlwcl9kZWJ1Zygi aGFkIGFscmVhZHkgc3VzcGVuZGVkXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpbnRl bGhhZGRhdGEtPmRydl9zdGF0dXMgPSBIQURfRFJWX1NVU1BFTkRFRDsKKwlwcl9kZWJ1ZygiJXMg QCAlZDpERUJVRyBQTFVHL1VOUExVRyA6IEhBRF9EUlZfU1VTUEVOREVEXG4iLAorCQkJX19mdW5j X18sIF9fTElORV9fKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+ aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCS8qCisJICogVG9EbzogTmVlZCB0byBkaXNhYmxl IFVOREVSUlVOIGludGVycnVwdHMgYXMgd2VsbAorCSAqICBjYXBzID0gSERNSV9BVURJT19VTkRF UlJVTiB8IEhETUlfQVVESU9fQlVGRkVSX0RPTkU7CisJICovCisJY2FwcyA9IEhETUlfQVVESU9f QlVGRkVSX0RPTkU7CisJaGFkX3NldF9jYXBzKEhBRF9TRVRfRElTQUJMRV9BVURJT19JTlQsICZj YXBzKTsKKwloYWRfc2V0X2NhcHMoSEFEX1NFVF9ESVNBQkxFX0FVRElPLCBOVUxMKTsKKwlwcl9k ZWJ1ZygiRXhpdDolcyIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAq IGhkbWlfYXVkaW9fcmVzdW1lIC0gcG93ZXIgbWFuYWdlbWVudCByZXN1bWUgZnVuY3Rpb24KKyAq CisgKkBoYWRkYXRhOiBwb2ludGVyIHRvIEhBRCBwcml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1 bmN0aW9uIGlzIGNhbGxlZCBieSBjbGllbnQgZHJpdmVyIHRvIHJlc3VtZSB0aGUKKyAqIGhkbWkg YXVkaW8uCisgKi8KK2ludCBoZG1pX2F1ZGlvX3Jlc3VtZSh2b2lkICpoYWRkYXRhKQoreworCWlu dCBjYXBzLCByZXR2YWwgPSAwOworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9 IChzdHJ1Y3Qgc25kX2ludGVsaGFkICopaGFkZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJx czsKKworCXByX2RlYnVnKCJFbnRlcjolc1xuIiwgX19mdW5jX18pOworCisJc3Bpbl9sb2NrX2ly cXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCWlmIChpbnRl bGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsKKwkJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7 CisJCXByX2RlYnVnKCJoYWQgbm90IGNvbm5lY3RlZFxuIik7CisJCXJldHVybiAwOworCX0KKwor CWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgIT0gSEFEX0RSVl9TVVNQRU5ERUQpIHsKKwkJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdf aXJxcyk7CisJCXByX2VycigiaGFkIGlzIG5vdCBpbiBzdXNwZW5kZWQgc3RhdGVcbiIpOworCQly ZXR1cm4gMDsKKwl9CisKKwlpZiAoaGFkX2dldF9od3N0YXRlKGludGVsaGFkZGF0YSkpIHsKKwkJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdf aXJxcyk7CisJCXByX2VycigiRmFpbGVkIHRvIHJlc3VtZS4gRGV2aWNlIG5vdCBhY2Nlc3NpYmxl XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVz ID0gSEFEX0RSVl9DT05ORUNURUQ7CisJcHJfZGVidWcoIiVzIEAgJWQ6REVCVUcgUExVRy9VTlBM VUcgOiBIQURfRFJWX0RJU0NPTk5FQ1RFRFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdf aXJxcyk7CisJLyoKKwkgKiBUb0RvOiBOZWVkIHRvIGVuYWJsZSBVTkRFUlJVTiBpbnRlcnJ1cHRz IGFzIHdlbGwKKwkgKiBjYXBzID0gSERNSV9BVURJT19VTkRFUlJVTiB8IEhETUlfQVVESU9fQlVG RkVSX0RPTkU7CisJICovCisJY2FwcyA9IEhETUlfQVVESU9fQlVGRkVSX0RPTkU7CisJcmV0dmFs ID0gaGFkX3NldF9jYXBzKEhBRF9TRVRfRU5BQkxFX0FVRElPX0lOVCwgJmNhcHMpOworCXJldHZh bCA9IGhhZF9zZXRfY2FwcyhIQURfU0VUX0VOQUJMRV9BVURJTywgTlVMTCk7CisJcHJfZGVidWco IkV4aXQ6JXMiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGlubGlu ZSBpbnQgaGFkX2Noa19pbnRybWlzcyhzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEs CisJCWVudW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZfaWQpCit7CisJaW50IGksIGludHJf Y291bnQgPSAwOworCWVudW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZmX2RvbmU7CisJdTMy IGJ1Zl9zaXplLCBidWZfYWRkcjsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOwor CXVuc2lnbmVkIGxvbmcgZmxhZ19pcnFzOworCisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+ cHJpdmF0ZV9kYXRhOworCisJYnVmZl9kb25lID0gYnVmX2lkOworCisJaW50cl9jb3VudCA9IHNu ZF9pbnRlbGhhZF9yZWFkX2xlbihpbnRlbGhhZGRhdGEpOworCWlmIChpbnRyX2NvdW50ID4gMSkg eworCQkvKiBJbiBjYXNlIG9mIGFjdGl2ZSBwbGF5YmFjayAqLworCQlwcl9lcnIoIkRyaXZlciBk ZXRlY3RlZCAlZCBtaXNzZWQgYnVmZmVyIGRvbmUgaW50ZXJydXB0KHMpISEhIVxuIiwKKwkJCQko aW50cl9jb3VudCAtIDEpKTsKKwkJaWYgKGludHJfY291bnQgPiAzKQorCQkJcmV0dXJuIGludHJf Y291bnQ7CisKKwkJYnVmX2lkICs9IChpbnRyX2NvdW50IC0gMSk7CisJCS8qIFJlcHJvZ3JhbSBy ZWdpc3RlcnMqLworCQlmb3IgKGkgPSBidWZmX2RvbmU7IGkgPCBidWZfaWQ7IGkrKykgeworCQkJ aW50IGogPSBpICUgNDsKKworCQkJYnVmX3NpemUgPSBpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2pd LmJ1Zl9zaXplOworCQkJYnVmX2FkZHIgPSBpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2pdLmJ1Zl9h ZGRyOworCQkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9CVUZfQV9MRU5HVEggKworCQkJCQkoaiAq IEhBRF9SRUdfV0lEVEgpLCBidWZfc2l6ZSk7CisJCQloYWRfd3JpdGVfcmVnaXN0ZXIoCisJCQkJ CUFVRF9CVUZfQV9BRERSKyhqICogSEFEX1JFR19XSURUSCksCisJCQkJCShidWZfYWRkciB8IEJJ VCgwKSB8IEJJVCgxKSkpOworCQl9CisJCWJ1Zl9pZCA9IGJ1Zl9pZCAlIDQ7CisJCXNwaW5fbG9j a19pcnFzYXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJaW50 ZWxoYWRkYXRhLT5idWZmX2RvbmUgPSBidWZfaWQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCX0KKworCXJldHVybiBp bnRyX2NvdW50OworfQorCitpbnQgaGFkX3Byb2Nlc3NfYnVmZmVyX2RvbmUoc3RydWN0IHNuZF9p bnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCWludCByZXR2YWwgPSAwOworCXUzMiBsZW4gPSAx OworCWVudW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZfaWQ7CisJZW51bSBpbnRlbF9oYWRf YXVkX2J1Zl90eXBlIGJ1ZmZfZG9uZTsKKwlzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICpzdHJlYW07 CisJdTMyIGJ1Zl9zaXplOworCXN0cnVjdCBoYWRfcHZ0X2RhdGEgKmhhZF9zdHJlYW07CisJaW50 IGludHJfY291bnQ7CisJZW51bSBoYWRfc3RhdHVzX3N0cmVhbQkJc3RyZWFtX3R5cGU7CisJdW5z aWduZWQgbG9uZyBmbGFnX2lycXM7CisKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2 YXRlX2RhdGE7CisJc3RyZWFtID0gJmludGVsaGFkZGF0YS0+c3RyZWFtX2luZm87CisJaW50cl9j b3VudCA9IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3Bpbmxv Y2ssIGZsYWdfaXJxcyk7CisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJW X0RJU0NPTk5FQ1RFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEt PmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZXJyKCIlczpEZXZpY2UgYWxyZWFkeSBk aXNjb25uZWN0ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJYnVmX2lk ID0gaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZjsKKwlpbnRlbGhhZGRhdGEtPmJ1ZmZfZG9uZSA9IGJ1 Zl9pZDsKKwlidWZmX2RvbmUgPSBpbnRlbGhhZGRhdGEtPmJ1ZmZfZG9uZTsKKwlidWZfc2l6ZSA9 IGludGVsaGFkZGF0YS0+YnVmX2luZm9bYnVmX2lkXS5idWZfc2l6ZTsKKwlzdHJlYW1fdHlwZSA9 IGhhZF9zdHJlYW0tPnN0cmVhbV90eXBlOworCisJcHJfZGVidWcoIkVudGVyOiVzIGJ1Zl9pZD0l ZFxuIiwgX19mdW5jX18sIGJ1Zl9pZCk7CisKKwkvKiBFdmVyeSBkZWJ1ZyBzdGF0ZW1lbnQgaGFz IGFuIGltcGxpY2F0aW9uCisJICogb2YgfjVtc2VjLiBUaHVzLCBhdm9pZCBoYXZpbmcgPjMgZGVi dWcgc3RhdGVtZW50cworCSAqIGZvciBlYWNoIGJ1ZmZlcl9kb25lIGhhbmRsaW5nLgorCSAqLwor CisJLyogQ2hlY2sgZm9yIGFueSBpbnRyX21pc3MgaW4gY2FzZSBvZiBhY3RpdmUgcGxheWJhY2sg Ki8KKwlpZiAoaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGUgPT0gSEFEX1JVTk5JTkdfU1RSRUFNKSB7 CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBm bGFnX2lycXMpOworCQlpbnRyX2NvdW50ID0gaGFkX2Noa19pbnRybWlzcyhpbnRlbGhhZGRhdGEs IGJ1Zl9pZCk7CisJCWlmICghaW50cl9jb3VudCB8fCAoaW50cl9jb3VudCA+IDMpKSB7CisJCQlw cl9lcnIoIkhBRCBTVyBzdGF0ZSBpbiBub24tcmVjb3ZlcmFibGUhISEgbW9kZVxuIik7CisJCQlw cl9lcnIoIkFscmVhZHkgcGxheWVkIHN0YWxlIGRhdGFcbiIpOworCQkJcmV0dXJuIHJldHZhbDsK KwkJfQorCQlidWZfaWQgKz0gKGludHJfY291bnQgLSAxKTsKKwkJYnVmX2lkID0gYnVmX2lkICUg NDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFn X2lycXMpOworCX0KKworCWludGVsaGFkZGF0YS0+YnVmX2luZm9bYnVmX2lkXS5pc192YWxpZCA9 IHRydWU7CisJaWYgKGludGVsaGFkZGF0YS0+dmFsaWRfYnVmX2NudC0xID09IGJ1Zl9pZCkgewor CQlpZiAoaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGUgPj0gSEFEX1JVTk5JTkdfU1RSRUFNKQorCQkJ aW50ZWxoYWRkYXRhLT5jdXJyX2J1ZiA9IEhBRF9CVUZfVFlQRV9BOworCX0gZWxzZQorCQlpbnRl bGhhZGRhdGEtPmN1cnJfYnVmID0gYnVmX2lkICsgMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCisJaWYgKGhhZF9n ZXRfaHdzdGF0ZShpbnRlbGhhZGRhdGEpKSB7CisJCXByX2VycigiSERNSSBjYWJsZSBwbHVnZ2Vk LW91dFxuIik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLypSZXByb2dyYW0gdGhlIHJlZ2lz dGVycyB3aXRoIGFkZHIgYW5kIGxlbmd0aCovCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9CVUZf QV9MRU5HVEggKworCQkJKGJ1Zl9pZCAqIEhBRF9SRUdfV0lEVEgpLCBidWZfc2l6ZSk7CisJaGFk X3dyaXRlX3JlZ2lzdGVyKEFVRF9CVUZfQV9BRERSKyhidWZfaWQgKiBIQURfUkVHX1dJRFRIKSwK KwkJCWludGVsaGFkZGF0YS0+YnVmX2luZm9bYnVmX2lkXS5idWZfYWRkcnwKKwkJCUJJVCgwKSB8 IEJJVCgxKSk7CisKKwloYWRfcmVhZF9yZWdpc3RlcihBVURfQlVGX0FfTEVOR1RIICsgKGJ1Zl9p ZCAqIEhBRF9SRUdfV0lEVEgpLAorCQkJCQkmbGVuKTsKKwlwcl9kZWJ1ZygiJXM6RW5hYmxlZCBi dWZbJWRdXG4iLCBfX2Z1bmNfXywgYnVmX2lkKTsKKworCS8qIEluIGNhc2Ugb2YgYWN0dWFsIGRh dGEsCisJICogcmVwb3J0IGJ1ZmZlcl9kb25lIHRvIGFib3ZlIEFMU0EgbGF5ZXIKKwkgKi8KKwli dWZfc2l6ZSA9ICBpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2J1Zl9pZF0uYnVmX3NpemU7CisJaWYg KHN0cmVhbV90eXBlID49IEhBRF9SVU5OSU5HX1NUUkVBTSkgeworCQlpbnRlbGhhZGRhdGEtPnN0 cmVhbV9pbmZvLmJ1ZmZlcl9yZW5kZXJlZCArPQorCQkJKGludHJfY291bnQgKiBidWZfc2l6ZSk7 CisJCXN0cmVhbS0+cGVyaW9kX2VsYXBzZWQoc3RyZWFtLT5oYWRfc3Vic3RyZWFtKTsKKwl9CisK KwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgaGFkX3Byb2Nlc3NfYnVmZmVyX3VuZGVycnVuKHN0 cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwll bnVtIGludGVsX2hhZF9hdWRfYnVmX3R5cGUgYnVmX2lkOworCXN0cnVjdCBwY21fc3RyZWFtX2lu Zm8gKnN0cmVhbTsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCWVudW0gaGFk X3N0YXR1c19zdHJlYW0gc3RyZWFtX3R5cGU7CisJdW5zaWduZWQgbG9uZyBmbGFnX2lycXM7CisJ aW50IGRydl9zdGF0dXM7CisKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2Rh dGE7CisJc3RyZWFtID0gJmludGVsaGFkZGF0YS0+c3RyZWFtX2luZm87CisKKwlzcGluX2xvY2tf aXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJYnVmX2lk ID0gaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZjsKKwlzdHJlYW1fdHlwZSA9IGhhZF9zdHJlYW0tPnN0 cmVhbV90eXBlOworCWludGVsaGFkZGF0YS0+YnVmZl9kb25lID0gYnVmX2lkOworCWRydl9zdGF0 dXMgPSBpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXM7CisJaWYgKHN0cmVhbV90eXBlID09IEhBRF9S VU5OSU5HX1NUUkVBTSkKKwkJaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZiA9IEhBRF9CVUZfVFlQRV9B OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ss IGZsYWdfaXJxcyk7CisKKwlwcl9kZWJ1ZygiRW50ZXI6JXMgYnVmX2lkPSVkLCBzdHJlYW1fdHlw ZT0lZFxuIiwKKwkJCV9fZnVuY19fLCBidWZfaWQsIHN0cmVhbV90eXBlKTsKKworCWludGVsaGFk ZGF0YS0+b3BzLT5oYW5kbGVfdW5kZXJydW4oaW50ZWxoYWRkYXRhKTsKKworCWlmIChkcnZfc3Rh dHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJCXByX2VycigiJXM6RGV2aWNlIGFscmVh ZHkgZGlzY29ubmVjdGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJ aWYgKHN0cmVhbV90eXBlID09IEhBRF9SVU5OSU5HX1NUUkVBTSkgeworCQkvKiBSZXBvcnQgVU5E RVJSVU4gZXJyb3IgdG8gYWJvdmUgbGF5ZXJzICovCisJCWludGVsaGFkZGF0YS0+ZmxhZ191bmRl cnJ1biA9IDE7CisJCXN0cmVhbS0+cGVyaW9kX2VsYXBzZWQoc3RyZWFtLT5oYWRfc3Vic3RyZWFt KTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgaGFkX3Byb2Nlc3NfaG90X3BsdWco c3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCWludCByZXR2YWwgPSAwOwor CWVudW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZfaWQ7CisJc3RydWN0IHNuZF9wY21fc3Vi c3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKwl1 bnNpZ25lZCBsb25nIGZsYWdfaXJxczsKKworCXByX2RlYnVnKCJFbnRlcjolc1xuIiwgX19mdW5j X18pOworCisJc3Vic3RyZWFtID0gaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3Ry ZWFtOworCWhhZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKworCXNwaW5f bG9ja19pcnFzYXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlp ZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfQ09OTkVDVEVEKSB7CisJCXBy X2RlYnVnKCJEZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWRcbiIpOworCQlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcmV0dXJu IHJldHZhbDsKKwl9CisJYnVmX2lkID0gaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZjsKKwlpbnRlbGhh ZGRhdGEtPmJ1ZmZfZG9uZSA9IGJ1Zl9pZDsKKwlpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPSBI QURfRFJWX0NPTk5FQ1RFRDsKKwlwcl9kZWJ1ZygiJXMgQCAlZDpERUJVRyBQTFVHL1VOUExVRyA6 IEhBRF9EUlZfQ09OTkVDVEVEXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsK KworCXByX2RlYnVnKCJQcm9jZXNzaW5nIEhPVF9QTFVHLCBidWZfaWQgPSAlZFxuIiwgYnVmX2lk KTsKKworCSAvKiBRdWVyeSBkaXNwbGF5IGRyaXZlciBmb3IgYXVkaW8gcmVnaXN0ZXIgYmFzZSAq LworCWlmIChpbnRlbGhhZGRhdGEtPnJlZ19vcHMuaGRtaV9hdWRpb19nZXRfcmVnaXN0ZXJfYmFz ZSgKKwkJJmludGVsaGFkZGF0YS0+YXVkaW9fcmVnX2Jhc2UsCisJCSZpbnRlbGhhZGRhdGEtPmF1 ZGlvX2NmZ19vZmZzZXQpKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGdldCBhdWRpbyByZWcgYmFz ZSBmcm9tIERpc3BsYXkgZHJpdmVyXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGludGVs aGFkZGF0YS0+YXVkaW9fcmVnX2Jhc2UgPT0gTlVMTCkgeworCQlwcl9lcnIoImF1ZGlvIHJlZyBi YXNlIHZhbHVlIGlzIE5VTExcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlwcl9kZWJ1ZygiJXMg YXVkaW9fcmVnX2Jhc2UgPSAweCVwXG4iLCBfX2Z1bmNfXywKKwkJCWludGVsaGFkZGF0YS0+YXVk aW9fcmVnX2Jhc2UpOworCisJLyogU2FmZXR5IGNoZWNrICovCisJaWYgKHN1YnN0cmVhbSkgewor CQlwcl9kZWJ1ZygiVGhlcmUgc2hvdWxkIG5vdCBiZSBhY3RpdmUgUEIgZnJvbSBBTFNBXG4iKTsK KwkJcHJfZGVidWcoIlNpZ25pZmllcywgY2FibGUgaXMgcGx1Z2dlZC1pbiBldmVuIGJlZm9yZVxu Iik7CisJCXByX2RlYnVnKCJwcm9jZXNzaW5nIHNuZF9wY21fZGlzY29ubmVjdFxuIik7CisJCS8q IFNldCBydW50aW1lLT5zdGF0ZSB0byBod19wYXJhbXMgZG9uZSAqLworCQlzbmRfcGNtX3N0b3Ao c3Vic3RyZWFtLCBTTkRSVl9QQ01fU1RBVEVfU0VUVVApOworCX0KKworCWhhZF9idWlsZF9jaGFu bmVsX2FsbG9jYXRpb25fbWFwKGludGVsaGFkZGF0YSk7CisKKwlyZXR1cm4gcmV0dmFsOworCitl cnI6CisJcG1fcnVudGltZV9kaXNhYmxlKGludGVsaGFkZGF0YS0+ZGV2KTsKKwlpbnRlbGhhZGRh dGEtPmRldiA9IE5VTEw7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGhhZF9wcm9jZXNzX2hv dF91bnBsdWcoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCWludCBjYXBz LCByZXR2YWwgPSAwOworCWVudW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZfaWQ7CisJc3Ry dWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxczsK KworCXByX2RlYnVnKCJFbnRlcjolc1xuIiwgX19mdW5jX18pOworCisJaGFkX3N0cmVhbSA9IGlu dGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRhOworCWJ1Zl9pZCA9IGludGVsaGFkZGF0YS0+Y3Vycl9i dWY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZs YWdfaXJxcyk7CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElT Q09OTkVDVEVEKSB7CisJCXByX2RlYnVnKCJEZXZpY2UgYWxyZWFkeSBkaXNjb25uZWN0ZWRcbiIp OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywg ZmxhZ19pcnFzKTsKKwkJcmV0dXJuIHJldHZhbDsKKworCX0gZWxzZSB7CisJCS8qIERpc2FibGUg QXVkaW8gKi8KKwkJY2FwcyA9IEhETUlfQVVESU9fQlVGRkVSX0RPTkU7CisJCXJldHZhbCA9IGhh ZF9zZXRfY2FwcyhIQURfU0VUX0RJU0FCTEVfQVVESU9fSU5ULCAmY2Fwcyk7CisJCXJldHZhbCA9 IGhhZF9zZXRfY2FwcyhIQURfU0VUX0RJU0FCTEVfQVVESU8sIE5VTEwpOworCQlpbnRlbGhhZGRh dGEtPm9wcy0+ZW5hYmxlX2F1ZGlvKAorCQkJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRf c3Vic3RyZWFtLCAwKTsKKwl9CisKKwlpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPSBIQURfRFJW X0RJU0NPTk5FQ1RFRDsKKwlwcl9kZWJ1ZygiJXMgQCAlZDpERUJVRyBQTFVHL1VOUExVRyA6IEhB RF9EUlZfRElTQ09OTkVDVEVEXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCS8qIFJl cG9ydCB0byBhYm92ZSBBTFNBIGxheWVyICovCisJaWYgKGludGVsaGFkZGF0YS0+c3RyZWFtX2lu Zm8uaGFkX3N1YnN0cmVhbSAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlu dGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlwcl9kZWJ1ZygiJXM6IHVu bG9jayAtPiBzZW5kaW5nIHBjbV9zdG9wIC0+IGxvY2tcbiIsIF9fZnVuY19fKTsKKwkJc25kX3Bj bV9zdG9wKGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVhbSwKKwkJCQlTTkRS Vl9QQ01fU1RBVEVfRElTQ09OTkVDVEVEKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFk ZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCX0KKworCWhhZF9zdHJlYW0tPnN0cmVh bV90eXBlID0gSEFEX0lOSVQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRh LT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJa2ZyZWUoaW50ZWxoYWRkYXRhLT5jaG1hcC0+ Y2htYXApOworCWludGVsaGFkZGF0YS0+Y2htYXAtPmNobWFwID0gTlVMTDsKKwlpbnRlbGhhZGRh dGEtPmF1ZGlvX3JlZ19iYXNlID0gTlVMTDsKKwlwcl9kZWJ1ZygiJXM6IHVubG9ja2VkIC0+IHJl dHVybmVkXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGhh ZF9ldmVudF9oYW5kbGVyIC0gQ2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBldmVudHMKKyAq CisgKiBAZXZlbnRfdHlwZTogRXZlbnQgdHlwZSB0byBoYW5kbGUKKyAqIEBkYXRhOiBkYXRhIHJl bGF0ZWQgdG8gdGhlIGV2ZW50X3R5cGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQg dG8gaGFuZGxlIEhETUkgZXZlbnRzIGZyb20gY2xpZW50IGRyaXZlci4KKyAqLworaW50IGhhZF9l dmVudF9oYW5kbGVyKGVudW0gaGFkX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSwgdm9pZCAqZGF0YSkK K3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEg PSBkYXRhOworCWVudW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZfaWQ7CisJc3RydWN0IHNu ZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0 cmVhbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxczsKKworCWJ1Zl9pZCA9IGludGVsaGFkZGF0 YS0+Y3Vycl9idWY7CisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRhOwor CisJLyogU3dpdGNoaW5nIHRvIGEgZnVuY3Rpb24gY2FuIGRyb3AgYXRvbWljaXR5IGV2ZW4gaW4g SU5UUiBjb250ZXh0LgorCSAqIFRodXMsIGEgYmlnIGxvY2sgaXMgYWNxdWlyZWQgdG8gbWFpbnRh aW4gYXRvbWljaXR5LgorCSAqIFRoaXMgY2FuIGJlIG9wdGltaXplZCBsYXRlci4KKwkgKiBDdXJy ZW50bHksIG9ubHkgYnVmZmVyX2RvbmUvX3VuZGVycnVuIGV4ZWN1dGVzIGluIElOVFIgY29udGV4 dC4KKwkgKiBBbHNvLCBsb2NraW5nIGlzIGltcGxlbWVudGVkIHNlcGFyYXRlbHkgdG8gYXZvaWQg cmVhbCBjb250ZW50aW9uCisJICogb2YgZGF0YShzdHJ1Y3QgaW50ZWxoYWRkYXRhKSBiZXR3ZWVu IElSUS9TT0ZUX0lSUS9QUk9DRVNTIGNvbnRleHQuCisJICovCisJc3Vic3RyZWFtID0gaW50ZWxo YWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtOworCXN3aXRjaCAoZXZlbnRfdHlwZSkg eworCWNhc2UgSEFEX0VWRU5UX0FVRElPX0JVRkZFUl9ET05FOgorCQlyZXR2YWwgPSBoYWRfcHJv Y2Vzc19idWZmZXJfZG9uZShpbnRlbGhhZGRhdGEpOworCWJyZWFrOworCisJY2FzZSBIQURfRVZF TlRfQVVESU9fQlVGRkVSX1VOREVSUlVOOgorCQlyZXR2YWwgPSBoYWRfcHJvY2Vzc19idWZmZXJf dW5kZXJydW4oaW50ZWxoYWRkYXRhKTsKKwlicmVhazsKKworCWNhc2UgSEFEX0VWRU5UX0hPVF9Q TFVHOgorCQlyZXR2YWwgPSBoYWRfcHJvY2Vzc19ob3RfcGx1ZyhpbnRlbGhhZGRhdGEpOworCWJy ZWFrOworCisJY2FzZSBIQURfRVZFTlRfSE9UX1VOUExVRzoKKwkJcmV0dmFsID0gaGFkX3Byb2Nl c3NfaG90X3VucGx1ZyhpbnRlbGhhZGRhdGEpOworCWJyZWFrOworCisJY2FzZSBIQURfRVZFTlRf TU9ERV9DSEFOR0lORzoKKwkJcHJfZGVidWcoIiBjYWxsZWQgX2V2ZW50X2hhbmRsZXIgd2l0aCBf TU9ERV9DSEFOR0UgZXZlbnRcbiIpOworCQkvKiBQcm9jZXNzIG9ubHkgaWYgc3RyZWFtIGlzIGFj dGl2ZSAmIGNhYmxlIFBsdWdnZWQtaW4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFk ZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlpZiAoaW50ZWxoYWRkYXRhLT5kcnZf c3RhdHVzID49IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywKKwkJCQkJZmxhZ19pcnFzKTsKKwkJCWJy ZWFrOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3Nw aW5sb2NrLCBmbGFnX2lycXMpOworCQlpZiAoKGhhZF9zdHJlYW0tPnN0cmVhbV90eXBlID09IEhB RF9SVU5OSU5HX1NUUkVBTSkKKwkJCQkmJiBzdWJzdHJlYW0pCisJCQlyZXR2YWwgPSBoZG1pX2F1 ZGlvX21vZGVfY2hhbmdlKHN1YnN0cmVhbSk7CisJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcl9k ZWJ1ZygiZXJyb3IgdW4taGFuZGxlZCBldmVudCAhIVxuIik7CisJCXJldHZhbCA9IC1FSU5WQUw7 CisJYnJlYWs7CisKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3g4 Ni9pbnRlbF9oZG1pX2xwZV9hdWRpby5jIGIvc291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlv LmMKaW5kZXggYzJlYmNlMS4uY2YxNzdlOSAxMDA2NDQKLS0tIGEvc291bmQveDg2L2ludGVsX2hk bWlfbHBlX2F1ZGlvLmMKKysrIGIvc291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmMKQEAg LTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8ZHJt L2ludGVsX2xwZV9hdWRpby5oPgogI2luY2x1ZGUgImludGVsX2hkbWlfbHBlX2F1ZGlvLmgiCisj aW5jbHVkZSAiaW50ZWxfaGRtaV9hdWRpby5oIgogCiAvKiBnbG9iYWxzKi8KIHN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKmhscGVfcGRldjsKQEAgLTQ1Myw5ICs0NTQsOSBAQCBzdGF0aWMgdm9pZCBu b3RpZnlfYXVkaW9fbHBlKHZvaWQgKmF1ZGlvX3B0cikKIC8qKgogICogaGRtaV9scGVfYXVkaW9f cHJvYmUgLSBzdGFydCBicmlkZ2Ugd2l0aCBpOTE1CiAgKgotICogVGhpcyBmdW5jdGlvbiBpcyBj YWxsZWQgd2hlbiB0aGUgaTkxNSBkcml2ZXIgY3JlYXRlcyB0aGUgaGRtaS1scGUtYXVkaW8KLSAq IHBsYXRmb3JtIGRldmljZS4gQ2FyZCBjcmVhdGlvbiBpcyBkZWZlcnJlZCB1bnRpbCBhIGhvdCBw bHVnIGV2ZW50IGlzCi0gKiByZWNlaXZlZAorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hl biB0aGUgaTkxNSBkcml2ZXIgY3JlYXRlcyB0aGUKKyAqIGhkbWktbHBlLWF1ZGlvIHBsYXRmb3Jt IGRldmljZS4gQ2FyZCBjcmVhdGlvbiBpcyBkZWZlcnJlZCB1bnRpbCBhCisgKiBob3QgcGx1ZyBl dmVudCBpcyByZWNlaXZlZAogICovCiBzdGF0aWMgaW50IGhkbWlfbHBlX2F1ZGlvX3Byb2JlKHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBAIC00OTcsOCArNDk4LDggQEAgc3RhdGlj IGludCBoZG1pX2xwZV9hdWRpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQog CQkodW5zaWduZWQgaW50KXJlc19tbWlvLT5zdGFydCwgKHVuc2lnbmVkIGludClyZXNfbW1pby0+ ZW5kKTsKIAogCW1taW9fc3RhcnQgPSBpb3JlbWFwX25vY2FjaGUocmVzX21taW8tPnN0YXJ0LAot CQkJCShzaXplX3QpKChyZXNfbW1pby0+ZW5kIC0gcmVzX21taW8tPnN0YXJ0KQotCQkJCQkJKyAx KSk7CisJCQkJKHNpemVfdCkoKHJlc19tbWlvLT5lbmQgLQorCQkJCQlyZXNfbW1pby0+c3RhcnQp ICsgMSkpOwogCWlmICghbW1pb19zdGFydCkgewogCQlkZXZfZXJyKCZobHBlX3BkZXYtPmRldiwg IkNvdWxkIG5vdCBnZXQgaW9yZW1hcFxuIik7CiAJCXJldHVybiAtRUFDQ0VTOwpAQCAtNTQ4LDEx ICs1NDksMTEgQEAgc3RhdGljIGludCBoZG1pX2xwZV9hdWRpb19wcm9iZShzdHJ1Y3QgcGxhdGZv cm1fZGV2aWNlICpwZGV2KQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY3R4KTsKIAor CXJldCA9IGhkbWlfYXVkaW9fcHJvYmUoKHZvaWQgKilwZGV2KTsKIAlkZXZfZGJnKCZobHBlX3Bk ZXYtPmRldiwgImhkbWkgbHBlIGF1ZGlvOiBzZXR0aW5nIHBpbiBlbGQgbm90aWZ5IGNhbGxiYWNr XG4iKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwZGF0YS0+bHBlX2F1ZGlvX3Nsb2NrLCBmbGFn X2lycSk7CiAJcGRhdGEtPm5vdGlmeV9hdWRpb19scGUgPSBub3RpZnlfYXVkaW9fbHBlOwotCiAJ aWYgKHBkYXRhLT5ub3RpZnlfcGVuZGluZykgewogCiAJCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2 LCAiJXM6IGhhbmRsZSBwZW5kaW5nIG5vdGlmaWNhdGlvblxuIiwgX19mdW5jX18pOwpAQCAtNTc2 LDYgKzU3Nyw4IEBAIHN0YXRpYyBpbnQgaGRtaV9scGVfYXVkaW9fcmVtb3ZlKHN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYpCiAKIAlkZXZfZGJnKCZobHBlX3BkZXYtPmRldiwgIkVudGVyICVz XG4iLCBfX2Z1bmNfXyk7CiAKKwloZG1pX2F1ZGlvX3JlbW92ZShwZGV2KTsKKwogCS8qIGdldCBj b250ZXh0LCByZWxlYXNlIHJlc291cmNlcyAqLwogCWN0eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRh KHBkZXYpOwogCWlvdW5tYXAoY3R4LT5tbWlvX3N0YXJ0KTsKLS0gCjIuOS4zCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBs aXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK