From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jerome Anand Subject: [PATCH v4 3/5] ALSA: add Intel HDMI LPE audio driver for BYT/CHT-T Date: Sat, 21 Jan 2017 03:52:30 +0530 Message-ID: <20170120222232.27791-4-jerome.anand@intel.com> References: <20170120222232.27791-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: <20170120222232.27791-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 T24gQmF5dHJhaWwgYW5kIENoZXJyeXRyYWlsLCBIRGF1ZGlvIG1heSBiZSBmdXNlZCBvdXQgb3Ig ZGlzYWJsZWQKYnkgdGhlIEJJT1MuIFRoaXMgZHJpdmVyIGVuYWJsZXMgYW4gYWx0ZXJuYXRlIHBh dGggdG8gdGhlIGk5MTUKZGlzcGxheSByZWdpc3RlcnMgYW5kIERNQS4KCkFsdGhvdWdoIHRoZXJl IGlzIG5vIGhhcmR3YXJlIHBhdGggYmV0d2VlbiBpOTE1IGRpc3BsYXkgYW5kIExQRS9TU1QKYXVk aW8gY2x1c3RlcnMsIHRoaXMgSERNSSBjYXBhYmlsaXR5IGlzIHJlZmVycmVkIHRvIGluIHRoZSBk b2N1bWVudGF0aW9uCmFzICJIRE1JIExQRSBBdWRpbyIgc28gd2Uga2VlcCB0aGUgbmFtZSBmb3Ig Y29uc2lzdGVuY3kuIFRoZXJlIGlzIG5vCmhhcmR3YXJlIHBhdGggb3IgY29udHJvbCBkZXBlbmRl bmNpZXMgd2l0aCB0aGUgTFBFL1NTVCBEU1AgZnVuY3Rpb25hbGl0eS4KClRoZSBoZG1pLWxwZS1h dWRpbyBkcml2ZXIgd2lsbCBiZSBwcm9iZWQgd2hlbiB0aGUgaTkxNSBkcml2ZXIgY3JlYXRlcwph IGNoaWxkIHBsYXRmb3JtIGRldmljZS4KClNpbmNlIHRoaXMgZHJpdmVyIGlzIG5laXRoZXIgU29D IG5vciBQQ0ksIGEgbmV3IHg4NiBmb2xkZXIgaXMgYWRkZWQKQWRkaXRpb25hbCBpbmRpcmVjdGlv bnMgaW4gdGhlIGNvZGUgd2lsbCBiZSBjbGVhbmVkIHVwIGluIHRoZSBuZXh0IHNlcmllcwp0byBh aWQgc21vb3RoZXIgRFAgaW50ZWdyYXRpb24KClNpZ25lZC1vZmYtYnk6IFBpZXJyZS1Mb3VpcyBC b3NzYXJ0IDxwaWVycmUtbG91aXMuYm9zc2FydEBsaW51eC5pbnRlbC5jb20+ClNpZ25lZC1vZmYt Ynk6IEplcm9tZSBBbmFuZCA8amVyb21lLmFuYW5kQGludGVsLmNvbT4KLS0tCiBzb3VuZC9LY29u ZmlnICAgICAgICAgICAgICAgICAgICB8ICAgMiArCiBzb3VuZC9NYWtlZmlsZSAgICAgICAgICAg ICAgICAgICB8ICAgMiArLQogc291bmQveDg2L0tjb25maWcgICAgICAgICAgICAgICAgfCAgMTUg Kwogc291bmQveDg2L01ha2VmaWxlICAgICAgICAgICAgICAgfCAgIDQgKwogc291bmQveDg2L2lu dGVsX2hkbWlfbHBlX2F1ZGlvLmMgfCA2MTQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKIHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2xwZV9hdWRpby5oIHwgNjgzICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKwogNiBmaWxlcyBjaGFuZ2VkLCAxMzE5IGluc2Vy dGlvbnMoKyksIDEgZGVsZXRpb24oLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC94ODYvS2Nv bmZpZwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNvdW5kL3g4Ni9NYWtlZmlsZQogY3JlYXRlIG1vZGUg MTAwNjQ0IHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2xwZV9hdWRpby5jCiBjcmVhdGUgbW9kZSAxMDA2 NDQgc291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmgKCmRpZmYgLS1naXQgYS9zb3VuZC9L Y29uZmlnIGIvc291bmQvS2NvbmZpZwppbmRleCA1YTI0MGUwLi5lZTJlNjlhIDEwMDY0NAotLS0g YS9zb3VuZC9LY29uZmlnCisrKyBiL3NvdW5kL0tjb25maWcKQEAgLTEwOCw2ICsxMDgsOCBAQCBz b3VyY2UgInNvdW5kL3BhcmlzYy9LY29uZmlnIgogCiBzb3VyY2UgInNvdW5kL3NvYy9LY29uZmln IgogCitzb3VyY2UgInNvdW5kL3g4Ni9LY29uZmlnIgorCiBlbmRpZiAjIFNORAogCiBtZW51Y29u ZmlnIFNPVU5EX1BSSU1FCmRpZmYgLS1naXQgYS9zb3VuZC9NYWtlZmlsZSBiL3NvdW5kL01ha2Vm aWxlCmluZGV4IGM0MWJkZjUuLjZkZTQ1ZDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL01ha2VmaWxlCisr KyBiL3NvdW5kL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQCBvYmotJChDT05GSUdfU09VTkQpICs9 IHNvdW5kY29yZS5vCiBvYmotJChDT05GSUdfU09VTkRfUFJJTUUpICs9IG9zcy8KIG9iai0kKENP TkZJR19ETUFTT1VORCkgKz0gb3NzLwogb2JqLSQoQ09ORklHX1NORCkgKz0gY29yZS8gaTJjLyBk cml2ZXJzLyBpc2EvIHBjaS8gcHBjLyBhcm0vIHNoLyBzeW50aC8gdXNiLyBcCi0JZmlyZXdpcmUv IHNwYXJjLyBzcGkvIHBhcmlzYy8gcGNtY2lhLyBtaXBzLyBzb2MvIGF0bWVsLyBoZGEvCisJZmly ZXdpcmUvIHNwYXJjLyBzcGkvIHBhcmlzYy8gcGNtY2lhLyBtaXBzLyBzb2MvIGF0bWVsLyBoZGEv IHg4Ni8KIG9iai0kKENPTkZJR19TTkRfQU9BKSArPSBhb2EvCiAKICMgVGhpcyBvbmUgbXVzdCBi ZSBjb21waWxhYmxlIGV2ZW4gaWYgc291bmQgaXMgY29uZmlndXJlZCBvdXQKZGlmZiAtLWdpdCBh L3NvdW5kL3g4Ni9LY29uZmlnIGIvc291bmQveDg2L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMC4uMzBkMDY2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3g4Ni9L Y29uZmlnCkBAIC0wLDAgKzEsMTUgQEAKK21lbnVjb25maWcgU05EX1g4NgorCXRyaXN0YXRlICJY ODYgc291bmQgZGV2aWNlcyIKKwlkZXBlbmRzIG9uIFg4NgorCS0tLWhlbHAtLS0KKwkgIFg4NiBz b3VuZCBkZXZpY2VzIHRoYXQgZG9uJ3QgZmFsbCB1bmRlciBTb0Mgb3IgUENJIGNhdGVnb3JpZXMK KworaWYgU05EX1g4NgorCitjb25maWcgSERNSV9MUEVfQVVESU8KKwl0cmlzdGF0ZSAiSERNSSBh dWRpbyB3aXRob3V0IEhEYXVkaW8gb24gSW50ZWwgQXRvbSBwbGF0Zm9ybXMiCisJZGVwZW5kcyBv biBEUk1fSTkxNQorCWhlbHAKKwkgQ2hvb3NlIHRoaXMgb3B0aW9uIHRvIHN1cHBvcnQgSERNSSBM UEUgQXVkaW8gbW9kZQorCitlbmRpZgkjIFNORF9YODYKZGlmZiAtLWdpdCBhL3NvdW5kL3g4Ni9N YWtlZmlsZSBiL3NvdW5kL3g4Ni9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi45Yjg3Mzg0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQveDg2L01ha2VmaWxlCkBA IC0wLDAgKzEsNCBAQAorc25kLWhkbWktbHBlLWF1ZGlvLW9ianMgKz0gXAorCWludGVsX2hkbWlf bHBlX2F1ZGlvLm8KKworb2JqLSQoQ09ORklHX0hETUlfTFBFX0FVRElPKSArPSBzbmQtaGRtaS1s cGUtYXVkaW8ubwpkaWZmIC0tZ2l0IGEvc291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmMg Yi9zb3VuZC94ODYvaW50ZWxfaGRtaV9scGVfYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwLi5hOWZkMmQzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQveDg2L2ludGVs X2hkbWlfbHBlX2F1ZGlvLmMKQEAgLTAsMCArMSw2MTQgQEAKKy8qCisgKiAgaW50ZWxfaGRtaV9s cGVfYXVkaW8uYyAtIEludGVsIEhETUkgTFBFIGF1ZGlvIGRyaXZlciBmb3IgQXRvbSBwbGF0Zm9y bXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnAKKyAqICBBdXRob3JzOgor ICoJCUplcm9tZSBBbmFuZCA8amVyb21lLmFuYW5kQGludGVsLmNvbT4KKyAqCQlBcmF2aW5kIFNp ZGRhcHBhamkgPGFyYXZpbmR4LnNpZGRhcHBhamlAaW50ZWwuY29tPgorICogIH5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl ZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICog IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg dXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqLworCisj aW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxcmV0 dXJuLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8u aD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cisj aW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUg PHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxz b3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNv dW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxkcm0vaW50ZWxfbHBlX2F1ZGlvLmg+CisjaW5jbHVk ZSAiaW50ZWxfaGRtaV9scGVfYXVkaW8uaCIKKworLyogZ2xvYmFscyovCitzdGF0aWMgc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqaGxwZV9wZGV2Oworc3RhdGljIGludCBobHBlX3N0YXRlOworc3Rh dGljIHVuaW9uIG90bV9oZG1pX2VsZF90IGhscGVfZWxkOworCitzdHJ1Y3QgaGRtaV9scGVfYXVk aW9fY3R4IHsKKwlpbnQgaXJxOworCXZvaWQgX19pb21lbSAqbW1pb19zdGFydDsKKwloYWRfZXZl bnRfY2FsbF9iYWNrIGhhZF9ldmVudF9jYWxsYmFja3M7CisJc3RydWN0IHNuZF9pbnRlbF9oYWRf aW50ZXJmYWNlICpoYWRfaW50ZXJmYWNlOworCXZvaWQgKmhhZF9wdnRfZGF0YTsKKwlpbnQgdG1k c19jbG9ja19zcGVlZDsKKwl1bnNpZ25lZCBpbnQgaGFkX2NvbmZpZ19vZmZzZXQ7CisJaW50IGhk bWlfYXVkaW9faW50ZXJydXB0X21hc2s7CisJc3RydWN0IHdvcmtfc3RydWN0IGhkbWlfYXVkaW9f d3E7Cit9OworCitzdGF0aWMgdm9pZCBoZG1pX3NldF9lbGQodm9pZCAqZWxkKQoreworCWludCBz aXplOworCisJQlVJTERfQlVHX09OKHNpemVvZihobHBlX2VsZCkgPiBIRE1JX01BWF9FTERfQllU RVMpOworCisJc2l6ZSA9IHNpemVvZihobHBlX2VsZCk7CisJbWVtY3B5KCh2b2lkICopJmhscGVf ZWxkLCBlbGQsIHNpemUpOworfQorCitzdGF0aWMgaW50IGhkbWlfZ2V0X2VsZCh2b2lkICplbGQp Cit7CisJdTggKmVsZF9kYXRhID0gKHU4ICopJmhscGVfZWxkOworCisJbWVtY3B5KGVsZCwgKHZv aWQgKikmaGxwZV9lbGQsIHNpemVvZihobHBlX2VsZCkpOworCisJcHJpbnRfaGV4X2R1bXBfYnl0 ZXMoImVsZDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgZWxkX2RhdGEsCisJCQlzaXplb2YoaGxwZV9l bGQpKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGhkbWlfbHBlX2F1ZGlvX2N0 eCAqZ2V0X2hkbWlfY29udGV4dCh2b2lkKQoreworCXN0cnVjdCBoZG1pX2xwZV9hdWRpb19jdHgg KmN0eDsKKworCWN0eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGhscGVfcGRldik7CisJcmV0dXJu IGN0eDsKK30KKworLyoKKyAqIHJldHVybiB3aGV0aGVyIEhETUkgYXVkaW8gZGV2aWNlIGlzIGJ1 c3kuCisgKi8KK2Jvb2wgbWlkX2hkbWlfYXVkaW9faXNfYnVzeSh2b2lkICpkZGV2KQoreworCXN0 cnVjdCBoZG1pX2xwZV9hdWRpb19jdHggKmN0eDsKKwlpbnQgaGRtaV9hdWRpb19idXN5ID0gMDsK KwlzdHJ1Y3QgaGRtaV9hdWRpb19ldmVudCBoZG1pX2F1ZGlvX2V2ZW50OworCisJZGV2X2RiZygm aGxwZV9wZGV2LT5kZXYsICIlczogRW50ZXIiLCAgX19mdW5jX18pOworCisJY3R4ID0gcGxhdGZv cm1fZ2V0X2RydmRhdGEoaGxwZV9wZGV2KTsKKworCWlmIChobHBlX3N0YXRlID09IGhkbWlfY29u bmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQpIHsKKwkJLyogSERNSSBpcyBub3QgY29ubmVjdGVk LCBhc3N1bWluZyBhdWRpbyBkZXZpY2UgaXMgaWRsZS4gKi8KKwkJcmV0dXJuIGZhbHNlOworCX0K KworCWlmIChjdHgtPmhhZF9pbnRlcmZhY2UpIHsKKwkJaGRtaV9hdWRpb19ldmVudC50eXBlID0g SEFEX0VWRU5UX1FVRVJZX0lTX0FVRElPX0JVU1k7CisJCWhkbWlfYXVkaW9fYnVzeSA9IGN0eC0+ aGFkX2ludGVyZmFjZS0+cXVlcnkoCisJCQkJY3R4LT5oYWRfcHZ0X2RhdGEsCisJCQkJaGRtaV9h dWRpb19ldmVudCk7CisJCXJldHVybiBoZG1pX2F1ZGlvX2J1c3kgIT0gMDsKKwl9CisJcmV0dXJu IGZhbHNlOworfQorCisvKgorICogcmV0dXJuIHRydWUgaWYgSERNSSBhdWRpbyBkZXZpY2UgaXMg c3VzcGVuZGVkLyBkaXNjb25uZWN0ZWQKKyAqLworYm9vbCBtaWRfaGRtaV9hdWRpb19zdXNwZW5k KHZvaWQgKmRkZXYpCit7CisJc3RydWN0IGhkbWlfbHBlX2F1ZGlvX2N0eCAqY3R4OworCXN0cnVj dCBoZG1pX2F1ZGlvX2V2ZW50IGhkbWlfYXVkaW9fZXZlbnQ7CisJaW50IHJldCA9IDA7CisKKwlj dHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShobHBlX3BkZXYpOworCisJaWYgKGhscGVfc3RhdGUg PT0gaGRtaV9jb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZCkgeworCQkvKiBIRE1JIGlzIG5v dCBjb25uZWN0ZWQsIGFzc3VtaW5nIGF1ZGlvIGRldmljZQorCQkgKiBpcyBzdXNwZW5kZWQgYWxy ZWFkeS4KKwkJICovCisJCXJldHVybiB0cnVlOworCX0KKworCWRldl9kYmcoJmhscGVfcGRldi0+ ZGV2LCAiJXM6IGhscGVfc3RhdGUgJWQiLCAgX19mdW5jX18sCisJCQlobHBlX3N0YXRlKTsKKwor CWlmIChjdHgtPmhhZF9pbnRlcmZhY2UpIHsKKwkJaGRtaV9hdWRpb19ldmVudC50eXBlID0gMDsK KwkJcmV0ID0gY3R4LT5oYWRfaW50ZXJmYWNlLT5zdXNwZW5kKGN0eC0+aGFkX3B2dF9kYXRhLAor CQkJCWhkbWlfYXVkaW9fZXZlbnQpOworCQlyZXR1cm4gKHJldCA9PSAwKSA/IHRydWUgOiBmYWxz ZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgbWlkX2hkbWlfYXVkaW9fcmVzdW1lKHZv aWQgKmRkZXYpCit7CisJc3RydWN0IGhkbWlfbHBlX2F1ZGlvX2N0eCAqY3R4OworCisJY3R4ID0g cGxhdGZvcm1fZ2V0X2RydmRhdGEoaGxwZV9wZGV2KTsKKworCWlmIChobHBlX3N0YXRlID09IGhk bWlfY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQpIHsKKwkJLyogSERNSSBpcyBub3QgY29u bmVjdGVkLCB0aGVyZSBpcyBubyBuZWVkCisJCSAqIHRvIHJlc3VtZSBhdWRpbyBkZXZpY2UuCisJ CSAqLworCQlyZXR1cm47CisJfQorCisJZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYsICIlczogaGxw ZV9zdGF0ZSAlZCIsICBfX2Z1bmNfXywgaGxwZV9zdGF0ZSk7CisKKwlpZiAoY3R4LT5oYWRfaW50 ZXJmYWNlKQorCQljdHgtPmhhZF9pbnRlcmZhY2UtPnJlc3VtZShjdHgtPmhhZF9wdnRfZGF0YSk7 Cit9CisKK3ZvaWQgbWlkX2hkbWlfYXVkaW9fc2lnbmFsX2V2ZW50KGVudW0gaGFkX2V2ZW50X3R5 cGUgZXZlbnQpCit7CisJc3RydWN0IGhkbWlfbHBlX2F1ZGlvX2N0eCAqY3R4OworCisJZGV2X2Ri ZygmaGxwZV9wZGV2LT5kZXYsICIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKKworCWN0eCA9IHBs YXRmb3JtX2dldF9kcnZkYXRhKGhscGVfcGRldik7CisKKwkvKiBUaGUgaGFuZGxlciBpcyBwcm90 ZWN0ZWQgaW4gdGhlIHJlc3BlY3RpdmUKKwkgKiBldmVudCBoYW5kbGVycyB0byBhdm9pZCByYWNl cworCSAqLworCWlmIChjdHgtPmhhZF9ldmVudF9jYWxsYmFja3MpCisJCSgqY3R4LT5oYWRfZXZl bnRfY2FsbGJhY2tzKShldmVudCwKKwkJCWN0eC0+aGFkX3B2dF9kYXRhKTsKK30KKworLyoqCisg KiB1c2VkIHRvIHdyaXRlIGludG8gZGlzcGxheSBjb250cm9sbGVyIEhETUkgYXVkaW8gcmVnaXN0 ZXJzLgorICovCitzdGF0aWMgaW50IGhkbWlfYXVkaW9fd3JpdGUodTMyIHJlZywgdTMyIHZhbCkK K3sKKwlzdHJ1Y3QgaGRtaV9scGVfYXVkaW9fY3R4ICpjdHg7CisKKwljdHggPSBwbGF0Zm9ybV9n ZXRfZHJ2ZGF0YShobHBlX3BkZXYpOworCisJZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYsICIlczog cmVnWzB4JXhdID0gMHgleFxuIiwgX19mdW5jX18sIHJlZywgdmFsKTsKKworCWlvd3JpdGUzMih2 YWwsIChjdHgtPm1taW9fc3RhcnQrcmVnKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB1 c2VkIHRvIGdldCB0aGUgcmVnaXN0ZXIgdmFsdWUgcmVhZCBmcm9tCisgKiBkaXNwbGF5IGNvbnRy b2xsZXIgSERNSSBhdWRpbyByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyBpbnQgaGRtaV9hdWRpb19y ZWFkKHUzMiByZWcsIHUzMiAqdmFsKQoreworCXN0cnVjdCBoZG1pX2xwZV9hdWRpb19jdHggKmN0 eDsKKworCWN0eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGhscGVfcGRldik7CisJKnZhbCA9IGlv cmVhZDMyKGN0eC0+bW1pb19zdGFydCtyZWcpOworCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAi JXM6IHJlZ1sweCV4XSA9IDB4JXhcbiIsIF9fZnVuY19fLCByZWcsICp2YWwpOworCXJldHVybiAw OworfQorCisvKioKKyAqIHVzZWQgdG8gdXBkYXRlIHRoZSBtYXNrZWQgYml0cyBpbiBkaXNwbGF5 IGNvbnRyb2xsZXIgSERNSQorICogYXVkaW8gcmVnaXN0ZXJzLgorICovCitzdGF0aWMgaW50IGhk bWlfYXVkaW9fcm13KHUzMiByZWcsIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCXN0cnVjdCBoZG1p X2xwZV9hdWRpb19jdHggKmN0eDsKKwl1MzIgdmFsX3RtcCA9IDA7CisKKwljdHggPSBwbGF0Zm9y bV9nZXRfZHJ2ZGF0YShobHBlX3BkZXYpOworCisJdmFsX3RtcCA9ICh2YWwgJiBtYXNrKSB8CisJ CQkoKGlvcmVhZDMyKGN0eC0+bW1pb19zdGFydCArIHJlZykpICYgfm1hc2spOworCisJaW93cml0 ZTMyKHZhbF90bXAsIChjdHgtPm1taW9fc3RhcnQrcmVnKSk7CisJZGV2X2RiZygmaGxwZV9wZGV2 LT5kZXYsICIlczogcmVnWzB4JXhdID0gMHgleFxuIiwgX19mdW5jX18sCisJCQkJcmVnLCB2YWxf dG1wKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHVzZWQgdG8gcmV0dXJuIHRoZSBIRE1J IGF1ZGlvIGNhcGFiaWxpdGllcy4KKyAqIGUuZy4gcmVzb2x1dGlvbiwgZnJhbWUgcmF0ZS4KKyAq Lworc3RhdGljIGludCBoZG1pX2F1ZGlvX2dldF9jYXBzKGVudW0gaGFkX2NhcHNfbGlzdCBnZXRf ZWxlbWVudCwKKwkJCXZvaWQgKmNhcGFiaWxpdGllcykKK3sKKwlzdHJ1Y3QgaGRtaV9scGVfYXVk aW9fY3R4ICpjdHg7CisJaW50IHJldCA9IDA7CisKKwljdHggPSBnZXRfaGRtaV9jb250ZXh0KCk7 CisKKwlkZXZfZGJnKCZobHBlX3BkZXYtPmRldiwgIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOwor CisJc3dpdGNoIChnZXRfZWxlbWVudCkgeworCWNhc2UgSEFEX0dFVF9FTEQ6CisJCXJldCA9IGhk bWlfZ2V0X2VsZChjYXBhYmlsaXRpZXMpOworCQlicmVhazsKKwljYXNlIEhBRF9HRVRfRElTUExB WV9SQVRFOgorCQkvKiBUb0RvOiBWZXJpZnkgaWYgc2FtcGxpbmcgZnJlcSBsb2dpYyBpcyBjb3Jy ZWN0ICovCisJCSoodTMyICopY2FwYWJpbGl0aWVzID0gY3R4LT50bWRzX2Nsb2NrX3NwZWVkOwor CQlkZXZfZGJnKCZobHBlX3BkZXYtPmRldiwgIiVzOiB0bWRzX2Nsb2NrX3NwZWVkID0gMHgleFxu IiwKKwkJCQlfX2Z1bmNfXywgY3R4LT50bWRzX2Nsb2NrX3NwZWVkKTsKKwkJYnJlYWs7CisJZGVm YXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB1c2VkIHRv IGdldCB0aGUgY3VycmVudCBoZG1pIGJhc2UgYWRkcmVzcworICovCitpbnQgaGRtaV9hdWRpb19n ZXRfcmVnaXN0ZXJfYmFzZSh1MzIgKipyZWdfYmFzZSwKKwkJdTMyICpjb25maWdfb2Zmc2V0KQor eworCXN0cnVjdCBoZG1pX2xwZV9hdWRpb19jdHggKmN0eDsKKworCWN0eCA9IHBsYXRmb3JtX2dl dF9kcnZkYXRhKGhscGVfcGRldik7CisJKnJlZ19iYXNlID0gKHUzMiAqKShjdHgtPm1taW9fc3Rh cnQpOworCSpjb25maWdfb2Zmc2V0ID0gY3R4LT5oYWRfY29uZmlnX29mZnNldDsKKwlkZXZfZGJn KCZobHBlX3BkZXYtPmRldiwgIiVzOiByZWdfYmFzZSA9IDB4JXAsIGNmZ19vZmYgPSAweCV4XG4i LAorCQkJCV9fZnVuY19fLCAqcmVnX2Jhc2UsICpjb25maWdfb2Zmc2V0KTsKKwlyZXR1cm4gMDsK K30KKworLyoqCisgKiB1c2VkIHRvIHNldCB0aGUgSERNSSBhdWRpbyBjYXBhYmlsaXRpZXMuCisg KiBlLmcuIEF1ZGlvIElOVC4KKyAqLworaW50IGhkbWlfYXVkaW9fc2V0X2NhcHMoZW51bSBoYWRf Y2Fwc19saXN0IHNldF9lbGVtZW50LAorCQkJdm9pZCAqY2FwYWJpbHRpZXMpCit7CisJc3RydWN0 IGhkbWlfbHBlX2F1ZGlvX2N0eCAqY3R4OworCisJY3R4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEo aGxwZV9wZGV2KTsKKworCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiJXM6IGNhcF9pZCA9IDB4 JXhcbiIsIF9fZnVuY19fLCBzZXRfZWxlbWVudCk7CisKKwlzd2l0Y2ggKHNldF9lbGVtZW50KSB7 CisJY2FzZSBIQURfU0VUX0VOQUJMRV9BVURJT19JTlQ6CisJCXsKKwkJCXUzMiBzdGF0dXNfcmVn OworCisJCQloZG1pX2F1ZGlvX3JlYWQoQVVEX0hETUlfU1RBVFVTX3YyICsKKwkJCQljdHgtPmhh ZF9jb25maWdfb2Zmc2V0LCAmc3RhdHVzX3JlZyk7CisJCQlzdGF0dXNfcmVnIHw9CisJCQkJSERN SV9BVURJT19CVUZGRVJfRE9ORSB8IEhETUlfQVVESU9fVU5ERVJSVU47CisJCQloZG1pX2F1ZGlv X3dyaXRlKEFVRF9IRE1JX1NUQVRVU192MiArCisJCQkJY3R4LT5oYWRfY29uZmlnX29mZnNldCwg c3RhdHVzX3JlZyk7CisJCQloZG1pX2F1ZGlvX3JlYWQoQVVEX0hETUlfU1RBVFVTX3YyICsKKwkJ CQljdHgtPmhhZF9jb25maWdfb2Zmc2V0LCAmc3RhdHVzX3JlZyk7CisKKwkJfQorCQlicmVhazsK KwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVj dCAgaGRtaV9hdWRpb19yZWdpc3RlcnNfb3BzIGhkbWlfYXVkaW9fcmVnX29wcyA9IHsKKwkuaGRt aV9hdWRpb19nZXRfcmVnaXN0ZXJfYmFzZSA9IGhkbWlfYXVkaW9fZ2V0X3JlZ2lzdGVyX2Jhc2Us CisJLmhkbWlfYXVkaW9fcmVhZF9yZWdpc3RlciA9IGhkbWlfYXVkaW9fcmVhZCwKKwkuaGRtaV9h dWRpb193cml0ZV9yZWdpc3RlciA9IGhkbWlfYXVkaW9fd3JpdGUsCisJLmhkbWlfYXVkaW9fcmVh ZF9tb2RpZnkgPSBoZG1pX2F1ZGlvX3JtdywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRtaV9hdWRp b19xdWVyeV9zZXRfb3BzIGhkbWlfYXVkaW9fZ2V0X3NldF9vcHMgPSB7CisJLmhkbWlfYXVkaW9f Z2V0X2NhcHMgPSBoZG1pX2F1ZGlvX2dldF9jYXBzLAorCS5oZG1pX2F1ZGlvX3NldF9jYXBzID0g aGRtaV9hdWRpb19zZXRfY2FwcywKK307CisKK2ludCBtaWRfaGRtaV9hdWRpb19zZXR1cCgKKwkJ aGFkX2V2ZW50X2NhbGxfYmFjayBhdWRpb19jYWxsYmFja3MsCisJCXN0cnVjdCBoZG1pX2F1ZGlv X3JlZ2lzdGVyc19vcHMgKnJlZ19vcHMsCisJCXN0cnVjdCBoZG1pX2F1ZGlvX3F1ZXJ5X3NldF9v cHMgKnF1ZXJ5X29wcykKK3sKKwlzdHJ1Y3QgaGRtaV9scGVfYXVkaW9fY3R4ICpjdHg7CisKKwlj dHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShobHBlX3BkZXYpOworCisJZGV2X2RiZygmaGxwZV9w ZGV2LT5kZXYsICIlczogY2FsbGVkXG4iLCAgX19mdW5jX18pOworCisJcmVnX29wcy0+aGRtaV9h dWRpb19nZXRfcmVnaXN0ZXJfYmFzZSA9CisJCShoZG1pX2F1ZGlvX3JlZ19vcHMuaGRtaV9hdWRp b19nZXRfcmVnaXN0ZXJfYmFzZSk7CisJcmVnX29wcy0+aGRtaV9hdWRpb19yZWFkX3JlZ2lzdGVy ID0KKwkJKGhkbWlfYXVkaW9fcmVnX29wcy5oZG1pX2F1ZGlvX3JlYWRfcmVnaXN0ZXIpOworCXJl Z19vcHMtPmhkbWlfYXVkaW9fd3JpdGVfcmVnaXN0ZXIgPQorCQkoaGRtaV9hdWRpb19yZWdfb3Bz LmhkbWlfYXVkaW9fd3JpdGVfcmVnaXN0ZXIpOworCXJlZ19vcHMtPmhkbWlfYXVkaW9fcmVhZF9t b2RpZnkgPQorCQkoaGRtaV9hdWRpb19yZWdfb3BzLmhkbWlfYXVkaW9fcmVhZF9tb2RpZnkpOwor CXF1ZXJ5X29wcy0+aGRtaV9hdWRpb19nZXRfY2FwcyA9CisJCWhkbWlfYXVkaW9fZ2V0X3NldF9v cHMuaGRtaV9hdWRpb19nZXRfY2FwczsKKwlxdWVyeV9vcHMtPmhkbWlfYXVkaW9fc2V0X2NhcHMg PQorCQloZG1pX2F1ZGlvX2dldF9zZXRfb3BzLmhkbWlfYXVkaW9fc2V0X2NhcHM7CisKKwljdHgt PmhhZF9ldmVudF9jYWxsYmFja3MgPSBhdWRpb19jYWxsYmFja3M7CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIHZvaWQgX2hhZF93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJbWlk X2hkbWlfYXVkaW9fc2lnbmFsX2V2ZW50KEhBRF9FVkVOVF9IT1RfUExVRyk7Cit9CisKK2ludCBt aWRfaGRtaV9hdWRpb19yZWdpc3RlcihzdHJ1Y3Qgc25kX2ludGVsX2hhZF9pbnRlcmZhY2UgKmRy aXZlciwKKwkJCQl2b2lkICpoYWRfZGF0YSkKK3sKKwlzdHJ1Y3QgaGRtaV9scGVfYXVkaW9fY3R4 ICpjdHg7CisKKwljdHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShobHBlX3BkZXYpOworCisJZGV2 X2RiZygmaGxwZV9wZGV2LT5kZXYsICIlczogY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwljdHgt PmhhZF9wdnRfZGF0YSA9IGhhZF9kYXRhOworCWN0eC0+aGFkX2ludGVyZmFjZSA9IGRyaXZlcjsK KworCS8qIFRoZSBBdWRpbyBkcml2ZXIgaXMgbG9hZGluZyBub3cgYW5kIHdlIG5lZWQgdG8gbm90 aWZ5CisJICogaXQgaWYgdGhlcmUgaXMgYW4gSERNSSBkZXZpY2UgYXR0YWNoZWQKKwkgKi8KKwlJ TklUX1dPUksoJmN0eC0+aGRtaV9hdWRpb193cSwgX2hhZF93cSk7CisJZGV2X2RiZygmaGxwZV9w ZGV2LT5kZXYsICIlczogU2NoZWR1bGluZyBIRE1JIGF1ZGlvIHdvcmsgcXVldWVcbiIsCisJCQkJ X19mdW5jX18pOworCXNjaGVkdWxlX3dvcmsoJmN0eC0+aGRtaV9hdWRpb193cSk7CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRpc3BsYXlfcGlwZV9pbnRlcnJ1cHRfaGFu ZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdTMyIGF1ZGlvX3N0YXQsIGF1ZGlvX3Jl ZzsKKworCXN0cnVjdCBoZG1pX2xwZV9hdWRpb19jdHggKmN0eDsKKworCWRldl9kYmcoJmhscGVf cGRldi0+ZGV2LCAiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7CisKKwljdHggPSBwbGF0Zm9ybV9n ZXRfZHJ2ZGF0YShobHBlX3BkZXYpOworCisJYXVkaW9fcmVnID0gY3R4LT5oYWRfY29uZmlnX29m ZnNldCArIEFVRF9IRE1JX1NUQVRVU192MjsKKwloZG1pX2F1ZGlvX3JlYWQoYXVkaW9fcmVnLCAm YXVkaW9fc3RhdCk7CisKKwlpZiAoYXVkaW9fc3RhdCAmIEhETUlfQVVESU9fVU5ERVJSVU4pIHsK KwkJaGRtaV9hdWRpb193cml0ZShhdWRpb19yZWcsIEhETUlfQVVESU9fVU5ERVJSVU4pOworCQlt aWRfaGRtaV9hdWRpb19zaWduYWxfZXZlbnQoCisJCQkJSEFEX0VWRU5UX0FVRElPX0JVRkZFUl9V TkRFUlJVTik7CisJfQorCisJaWYgKGF1ZGlvX3N0YXQgJiBIRE1JX0FVRElPX0JVRkZFUl9ET05F KSB7CisJCWhkbWlfYXVkaW9fd3JpdGUoYXVkaW9fcmVnLCBIRE1JX0FVRElPX0JVRkZFUl9ET05F KTsKKwkJbWlkX2hkbWlfYXVkaW9fc2lnbmFsX2V2ZW50KAorCQkJCUhBRF9FVkVOVF9BVURJT19C VUZGRVJfRE9ORSk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9p ZCBub3RpZnlfYXVkaW9fbHBlKHZvaWQgKmF1ZGlvX3B0cikKK3sKKwlzdHJ1Y3QgaGRtaV9scGVf YXVkaW9fY3R4ICpjdHggPSBnZXRfaGRtaV9jb250ZXh0KCk7CisJc3RydWN0IGludGVsX2hkbWlf bHBlX2F1ZGlvX3BkYXRhICpwZGF0YSA9IGhscGVfcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJ c3RydWN0IGludGVsX2hkbWlfbHBlX2F1ZGlvX2VsZCAqZWxkID0gYXVkaW9fcHRyOworCisJaWYg KHBkYXRhLT5oZG1pX2Nvbm5lY3RlZCAhPSB0cnVlKSB7CisKKwkJZGV2X2RiZygmaGxwZV9wZGV2 LT5kZXYsICIlczogRXZlbnQ6IEhBRF9OT1RJRllfSE9UX1VOUExVR1xuIiwKKwkJCV9fZnVuY19f KTsKKworCQlpZiAoaGxwZV9zdGF0ZSA9PSBoZG1pX2Nvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVk KSB7CisKKwkJCWhscGVfc3RhdGUgPQorCQkJCWhkbWlfY29ubmVjdG9yX3N0YXR1c19kaXNjb25u ZWN0ZWQ7CisKKwkJCW1pZF9oZG1pX2F1ZGlvX3NpZ25hbF9ldmVudCgKKwkJCQlIQURfRVZFTlRf SE9UX1VOUExVRyk7CisJCX0gZWxzZQorCQkJZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYsICIlczog QWxyZWFkeSBVbnBsdWdnZWQhXG4iLAorCQkJCV9fZnVuY19fKTsKKworCX0gZWxzZSBpZiAoZWxk ICE9IE5VTEwpIHsKKworCQloZG1pX3NldF9lbGQoZWxkLT5lbGRfZGF0YSk7CisKKwkJbWlkX2hk bWlfYXVkaW9fc2lnbmFsX2V2ZW50KEhBRF9FVkVOVF9IT1RfUExVRyk7CisKKwkJaGxwZV9zdGF0 ZSA9IGhkbWlfY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisKKwkJZGV2X2RiZygmaGxwZV9w ZGV2LT5kZXYsICIlczogSEFEX05PVElGWV9FTEQgOiBwb3J0ID0gJWQsIHRtZHMgPSAlZFxuIiwK KwkJCV9fZnVuY19fLCBlbGQtPnBvcnRfaWQsCXBkYXRhLT50bWRzX2Nsb2NrX3NwZWVkKTsKKwor CQlpZiAocGRhdGEtPnRtZHNfY2xvY2tfc3BlZWQpIHsKKwkJCWN0eC0+dG1kc19jbG9ja19zcGVl ZCA9IHBkYXRhLT50bWRzX2Nsb2NrX3NwZWVkOworCQkJbWlkX2hkbWlfYXVkaW9fc2lnbmFsX2V2 ZW50KEhBRF9FVkVOVF9NT0RFX0NIQU5HSU5HKTsKKwkJfQorCX0gZWxzZQorCQlkZXZfZGJnKCZo bHBlX3BkZXYtPmRldiwgIiVzOiBFdmVudDogTlVMTCBFRElEISFcbiIsIF9fZnVuY19fKTsKK30K KworLyoqCisgKiBoZG1pX2xwZV9hdWRpb19wcm9iZSAtIHN0YXJ0IGJyaWRnZSB3aXRoIGk5MTUK KyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBpOTE1IGRyaXZlciBjcmVh dGVzIHRoZSBoZG1pLWxwZS1hdWRpbworICogcGxhdGZvcm0gZGV2aWNlLiBDYXJkIGNyZWF0aW9u IGlzIGRlZmVycmVkIHVudGlsIGEgaG90IHBsdWcgZXZlbnQgaXMKKyAqIHJlY2VpdmVkCisgKi8K K3N0YXRpYyBpbnQgaGRtaV9scGVfYXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikKK3sKKwlzdHJ1Y3QgaGRtaV9scGVfYXVkaW9fY3R4ICpjdHg7CisJc3RydWN0IGludGVs X2hkbWlfbHBlX2F1ZGlvX3BkYXRhICpwZGF0YTsKKwlpbnQgaXJxOworCXN0cnVjdCByZXNvdXJj ZSAqcmVzX21taW87CisJdm9pZCBfX2lvbWVtICptbWlvX3N0YXJ0OworCWludCByZXQgPSAwOwor CXVuc2lnbmVkIGxvbmcgZmxhZ19pcnE7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNl X2lkIGNoZXJyeXZpZXdfaWRzW10gPSB7CisJCXtQQ0lfREVWSUNFKDB4ODA4NiwgMHgyMmIwKX0s CisJCXtQQ0lfREVWSUNFKDB4ODA4NiwgMHgyMmIxKX0sCisJCXtQQ0lfREVWSUNFKDB4ODA4Niwg MHgyMmIyKX0sCisJCXtQQ0lfREVWSUNFKDB4ODA4NiwgMHgyMmIzKX0sCisJCXt9CisJfTsKKwor CWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiRW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKKworCS8q VEJEOnJlbW92ZSBnbG9iYWxzKi8KKwlobHBlX3BkZXYgPSBwZGV2OworCWhscGVfc3RhdGUgPSBo ZG1pX2Nvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOworCisJLyogZ2V0IHJlc291cmNlcyAq LworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJ ZGV2X2VycigmaGxwZV9wZGV2LT5kZXYsICJDb3VsZCBub3QgZ2V0IGlycSByZXNvdXJjZVxuIik7 CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJlc19tbWlvID0gcGxhdGZvcm1fZ2V0X3Jlc291 cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlc19tbWlvKSB7CisJCWRldl9l cnIoJmhscGVfcGRldi0+ZGV2LCAiQ291bGQgbm90IGdldCBJT19NRU0gcmVzb3VyY2VzXG4iKTsK KwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlkZXZfZGJnKCZobHBlX3BkZXYtPmRldiwgIiVzOiBt bWlvX3N0YXJ0ID0gMHgleCwgbW1pb19lbmQgPSAweCV4XG4iLAorCQlfX2Z1bmNfXywgKHVuc2ln bmVkIGludClyZXNfbW1pby0+c3RhcnQsCisJCSh1bnNpZ25lZCBpbnQpcmVzX21taW8tPmVuZCk7 CisKKwltbWlvX3N0YXJ0ID0gaW9yZW1hcF9ub2NhY2hlKHJlc19tbWlvLT5zdGFydCwKKwkJCQko c2l6ZV90KSgocmVzX21taW8tPmVuZCAtIHJlc19tbWlvLT5zdGFydCkKKwkJCQkJCSsgMSkpOwor CWlmICghbW1pb19zdGFydCkgeworCQlkZXZfZXJyKCZobHBlX3BkZXYtPmRldiwgIkNvdWxkIG5v dCBnZXQgaW9yZW1hcFxuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCS8qIHNldHVwIGlu dGVycnVwdCBoYW5kbGVyICovCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBkaXNwbGF5X3BpcGVf aW50ZXJydXB0X2hhbmRsZXIsCisJCQkwLAorCQkJcGRldi0+bmFtZSwKKwkJCU5VTEwpOworCWlm IChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmhscGVfcGRldi0+ZGV2LCAicmVxdWVzdF9pcnEgZmFp bGVkXG4iKTsKKwkJaW91bm1hcChtbWlvX3N0YXJ0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQor CisJLyogYWxsb2MgYW5kIHNhdmUgY29udGV4dCAqLworCWN0eCA9IGt6YWxsb2Moc2l6ZW9mKCpj dHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY3R4ID09IE5VTEwpIHsKKwkJZnJlZV9pcnEoaXJxLCBO VUxMKTsKKwkJaW91bm1hcChtbWlvX3N0YXJ0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJ Y3R4LT5pcnEgPSBpcnE7CisJZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYsICJoZG1pIGxwZSBhdWRp bzogaXJxIG51bSA9ICVkXG4iLCBpcnEpOworCWN0eC0+bW1pb19zdGFydCA9IG1taW9fc3RhcnQ7 CisJY3R4LT50bWRzX2Nsb2NrX3NwZWVkID0gRElTX1NBTVBMRV9SQVRFXzE0OF81OworCisJaWYg KHBjaV9kZXZfcHJlc2VudChjaGVycnl2aWV3X2lkcykpIHsKKwkJZGV2X2RiZygmaGxwZV9wZGV2 LT5kZXYsICIlczogQ2hlcnJ5dHJhaWwgTFBFIC0gRGV0ZWN0ZWRcbiIsCisJCQkJX19mdW5jX18p OworCQljdHgtPmhhZF9jb25maWdfb2Zmc2V0ID0gQVVESU9fSERNSV9DT05GSUdfQzsKKwl9IGVs c2UgeworCQlkZXZfZGJnKCZobHBlX3BkZXYtPmRldiwgIiVzOiBCYXl0cmFpbCBMUEUgLSBBc3N1 bWVcbiIsCisJCQkJX19mdW5jX18pOworCQljdHgtPmhhZF9jb25maWdfb2Zmc2V0ID0gQVVESU9f SERNSV9DT05GSUdfQTsKKwl9CisKKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwor CisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycigmaGxwZV9wZGV2LT5kZXYsICIlczog cXVpdDogcGRhdGEgbm90IGFsbG9jYXRlZCBieSBpOTE1ISFcbiIsIF9fZnVuY19fKTsKKwkJa2Zy ZWUoY3R4KTsKKwkJZnJlZV9pcnEoaXJxLCBOVUxMKTsKKwkJaW91bm1hcChtbWlvX3N0YXJ0KTsK KwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY3R4 KTsKKworCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiaGRtaSBscGUgYXVkaW86IHNldHRpbmcg cGluIGVsZCBub3RpZnkgY2FsbGJhY2tcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBkYXRh LT5scGVfYXVkaW9fc2xvY2ssIGZsYWdfaXJxKTsKKwlwZGF0YS0+bm90aWZ5X2F1ZGlvX2xwZSA9 IG5vdGlmeV9hdWRpb19scGU7CisKKwlpZiAocGRhdGEtPm5vdGlmeV9wZW5kaW5nKSB7CisKKwkJ ZGV2X2RiZygmaGxwZV9wZGV2LT5kZXYsICIlczogaGFuZGxlIHBlbmRpbmcgbm90aWZpY2F0aW9u XG4iLCBfX2Z1bmNfXyk7CisJCW5vdGlmeV9hdWRpb19scGUoJnBkYXRhLT5lbGQpOworCQlwZGF0 YS0+bm90aWZ5X3BlbmRpbmcgPSBmYWxzZTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm cGRhdGEtPmxwZV9hdWRpb19zbG9jaywgZmxhZ19pcnEpOworCisJcmV0dXJuIHJldDsKK30KKwor LyoqCisgKiBoZG1pX2xwZV9hdWRpb19yZW1vdmUgLSBzdG9wIGJyaWRnZSB3aXRoIGk5MTUKKyAq CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBwbGF0Zm9ybSBkZXZpY2UgaXMg ZGVzdHJveWVkLiBUaGUgc291bmQKKyAqIGNhcmQgc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkIG9u IGhvdCBwbHVnIGV2ZW50LgorICovCitzdGF0aWMgaW50IGhkbWlfbHBlX2F1ZGlvX3JlbW92ZShz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBoZG1pX2xwZV9hdWRpb19j dHggKmN0eDsKKworCWRldl9kYmcoJmhscGVfcGRldi0+ZGV2LCAiRW50ZXIgJXNcbiIsIF9fZnVu Y19fKTsKKworCS8qIGdldCBjb250ZXh0LCByZWxlYXNlIHJlc291cmNlcyAqLworCWN0eCA9IHBs YXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWlvdW5tYXAoY3R4LT5tbWlvX3N0YXJ0KTsKKwlm cmVlX2lycShjdHgtPmlycSwgTlVMTCk7CisJa2ZyZWUoY3R4KTsKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBoZG1pX2xwZV9hdWRpb19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KnB0X2RldiwKKwkJCQlwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJZGV2X2RiZygmaGxwZV9wZGV2 LT5kZXYsICJFbnRlciAlc1xuIiwgX19mdW5jX18pOworCW1pZF9oZG1pX2F1ZGlvX3N1c3BlbmQo TlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9scGVfYXVkaW9fcmVzdW1l KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnB0X2RldikKK3sKKwlkZXZfZGJnKCZobHBlX3BkZXYt PmRldiwgIkVudGVyICVzXG4iLCBfX2Z1bmNfXyk7CisJbWlkX2hkbWlfYXVkaW9fcmVzdW1lKE5V TEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoZG1p X2xwZV9hdWRpb19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lICA9ICJoZG1pLWxw ZS1hdWRpbyIsCisJfSwKKwkucHJvYmUgICAgICAgICAgPSBoZG1pX2xwZV9hdWRpb19wcm9iZSwK KwkucmVtb3ZlCQk9IGhkbWlfbHBlX2F1ZGlvX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGhkbWlfbHBl X2F1ZGlvX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBoZG1pX2xwZV9hdWRpb19yZXN1bWUKK307CisK K21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaGRtaV9scGVfYXVkaW9fZHJpdmVyKTsKK01PRFVMRV9M SUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06aGRtaV9scGVfYXVkaW8i KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3g4Ni9pbnRlbF9oZG1pX2xwZV9hdWRpby5oIGIvc291bmQv eDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMC4uZWM0YmRlNQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3g4Ni9pbnRlbF9oZG1pX2xw ZV9hdWRpby5oCkBAIC0wLDAgKzEsNjgzIEBACisvKgorICogICBpbnRlbF9oZG1pX2xwZV9hdWRp by5oIC0gSW50ZWwgSERNSSBMUEUgYXVkaW8gZHJpdmVyCisgKgorICogIENvcHlyaWdodCAoQykg MjAxNiBJbnRlbCBDb3JwCisgKiAgQXV0aG9yczoJU2FpbGFqYSBCYW5kYXJ1cGFsbGkgPHNhaWxh amEuYmFuZGFydXBhbGxpQGludGVsLmNvbT4KKyAqCQlSYW1lc2ggQmFidSBLIFYgPHJhbWVzaC5i YWJ1QGludGVsLmNvbT4KKyAqCQlWYWliaGF2IEFnYXJ3YWwgPHZhaWJoYXYuYWdhcndhbEBpbnRl bC5jb20+CisgKgkJSmVyb21lIEFuYW5kIDxqZXJvbWUuYW5hbmRAaW50ZWwuY29tPgorICoJCUFy YXZpbmQgU2lkZGFwcGFqaSA8YXJhdmluZHguc2lkZGFwcGFqaUBpbnRlbC5jb20+CisgKiAgfn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisg KiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl IGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqLworI2lmbmRl ZiBfX0lOVEVMX0hETUlfTFBFX0FVRElPX0gKKyNkZWZpbmUgX19JTlRFTF9IRE1JX0xQRV9BVURJ T19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwu aD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGlt ZS5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJv bC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorCisjZGVmaW5lIEhNRElfTFBFX0FVRElPX0RS SVZFUl9OQU1FCQkiaW50ZWwtaGRtaS1scGUtYXVkaW8iCisjZGVmaW5lIEhBRF9NQVhfREVWSUNF UwkJMQorI2RlZmluZSBIQURfTUlOX0NIQU5ORUwJCTIKKyNkZWZpbmUgSEFEX01BWF9DSEFOTkVM CQk4CisjZGVmaW5lIEhBRF9OVU1fT0ZfUklOR19CVUZTCTQKKworLyogQXNzdW1lIDE5MktIeiwg OGNoYW5uZWwsIDI1bXNlYyBwZXJpb2QgKi8KKyNkZWZpbmUgSEFEX01BWF9CVUZGRVIJCSg2MDAq MTAyNCkKKyNkZWZpbmUgSEFEX01JTl9CVUZGRVIJCSgzMioxMDI0KQorI2RlZmluZSBIQURfTUFY X1BFUklPRFMJCTQKKyNkZWZpbmUgSEFEX01JTl9QRVJJT0RTCQk0CisjZGVmaW5lIEhBRF9NQVhf UEVSSU9EX0JZVEVTCShIQURfTUFYX0JVRkZFUi9IQURfTUlOX1BFUklPRFMpCisjZGVmaW5lIEhB RF9NSU5fUEVSSU9EX0JZVEVTCTI1NgorI2RlZmluZSBIQURfRklGT19TSVpFCQkwIC8qIGZpZm8g bm90IGJlaW5nIHVzZWQgKi8KKyNkZWZpbmUgTUFYX1NQRUFLRVJTCQk4CisKKyNkZWZpbmUgQVVE X1NBTVBMRV9SQVRFXzMyCTMyMDAwCisjZGVmaW5lIEFVRF9TQU1QTEVfUkFURV80NF8xCTQ0MTAw CisjZGVmaW5lIEFVRF9TQU1QTEVfUkFURV80OAk0ODAwMAorI2RlZmluZSBBVURfU0FNUExFX1JB VEVfODhfMgk4ODIwMAorI2RlZmluZSBBVURfU0FNUExFX1JBVEVfOTYJOTYwMDAKKyNkZWZpbmUg QVVEX1NBTVBMRV9SQVRFXzE3Nl80CTE3NjQwMAorI2RlZmluZSBBVURfU0FNUExFX1JBVEVfMTky CTE5MjAwMAorCisjZGVmaW5lIEhBRF9NSU5fUkFURQkJQVVEX1NBTVBMRV9SQVRFXzMyCisjZGVm aW5lIEhBRF9NQVhfUkFURQkJQVVEX1NBTVBMRV9SQVRFXzE5MgorCisjZGVmaW5lIERJU19TQU1Q TEVfUkFURV8yNV8yCTI1MjAwCisjZGVmaW5lIERJU19TQU1QTEVfUkFURV8yNwkyNzAwMAorI2Rl ZmluZSBESVNfU0FNUExFX1JBVEVfNTQJNTQwMDAKKyNkZWZpbmUgRElTX1NBTVBMRV9SQVRFXzc0 XzI1CTc0MjUwCisjZGVmaW5lIERJU19TQU1QTEVfUkFURV8xNDhfNQkxNDg1MDAKKyNkZWZpbmUg SEFEX1JFR19XSURUSAkJMHgwOAorI2RlZmluZSBIQURfTUFYX0hXX0JVRlMJCTB4MDQKKyNkZWZp bmUgSEFEX01BWF9ESVBfV09SRFMJCTE2CisjZGVmaW5lIElOVEVMX0hBRAkJIkludGVsSGRtaUxw ZUF1ZGlvIgorCisvKiBfQVVEX0NPTkZJRyByZWdpc3RlciBNQVNLICovCisjZGVmaW5lIEFVRF9D T05GSUdfTUFTS19VTkRFUlJVTgkweEMwMDAwMDAwCisjZGVmaW5lIEFVRF9DT05GSUdfTUFTS19T UkRCRwkJMHgwMDAwMDAwMgorI2RlZmluZSBBVURfQ09ORklHX01BU0tfRlVOQ1JTVAkJMHgwMDAw MDAwMQorCisjZGVmaW5lIE1BWF9DTlQJCQkweEZGCisjZGVmaW5lIEhBRF9TVVNQRU5EX0RFTEFZ CTEwMDAKKworI2RlZmluZSBPVE1fSERNSV9FTERfU0laRSAxMjgKKwordW5pb24gb3RtX2hkbWlf ZWxkX3QgeworCXVuc2lnbmVkIGNoYXIgZWxkX2RhdGFbT1RNX0hETUlfRUxEX1NJWkVdOworCXN0 cnVjdCB7CisJCS8qIEJ5dGVbMF0gPSBFTEQgVmVyc2lvbiBOdW1iZXIgKi8KKwkJdW5pb24gewor CQkJdW5zaWduZWQgY2hhciAgIGJ5dGUwOworCQkJc3RydWN0IHsKKwkJCQl1bnNpZ25lZCBjaGFy IHJlc2VydmVkOjM7IC8qIFJlc2VyZiAqLworCQkJCXVuc2lnbmVkIGNoYXIgZWxkX3Zlcjo1OyAv KiBFTEQgVmVyc2lvbiBOdW1iZXIgKi8KKwkJCQkvKiAwMDAwMGIgLSByZXNlcnZlZAorCQkJCSAq IDAwMDAxYiAtIGZpcnN0IHJldiwgb2Jzb2xldGVkCisJCQkJICogMDAwMTBiIC0gdmVyc2lvbiAy LCBzdXBwb3J0aW5nIENFQSB2ZXJzaW9uCisJCQkJICoJCQk4NjFEIG9yIGJlbG93CisJCQkJICog MDAwMTFiOjExMTExYiAtIHJlc2VydmVkCisJCQkJICogZm9yIGZ1dHVyZQorCQkJCSAqLworCQkJ fTsKKwkJfTsKKworCQkvKiBCeXRlWzFdID0gVmVuZG9yIFZlcnNpb24gRmllbGQgKi8KKwkJdW5p b24geworCQkJdW5zaWduZWQgY2hhciB2ZW5kb3JfdmVyc2lvbjsKKwkJCXN0cnVjdCB7CisJCQkJ dW5zaWduZWQgY2hhciByZXNlcnZlZDE6MzsKKwkJCQl1bnNpZ25lZCBjaGFyIHZlbGRfdmVyOjU7 IC8qIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBFTEQKKwkJCQkJCSAgICAgKiBleHRlbnNpb24uIFRo aXMgdmFsdWUgaXMKKwkJCQkJCSAgICAgKiBwcm92aXNpb25lZCBhbmQgdW5pcXVlIHRvCisJCQkJ CQkgICAgICogZWFjaCB2ZW5kb3IuCisJCQkJCQkgICAgICovCisJCQl9OworCQl9OworCisJCS8q IEJ5dGVbMl0gPSBCYXNlbGluZSBMZW5ndGggZmllbGQgKi8KKwkJdW5zaWduZWQgY2hhciBiYXNl bGluZV9lbGRfbGVuZ3RoOyAvKiBMZW5ndGggb2YgdGhlIEJhc2VsaW5lIHN0cnVjdHVyZQorCQkJ CQkgICAgICAqCWRpdmlkZWQgYnkgRm91ci4KKwkJCQkJICAgICAgKi8KKworCQkvKiBCeXRlIFsz XSA9IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJCXVuc2lnbmVkIGNoYXIgYnl0ZTM7CisK KwkJLyogU3RhcnRpbmcgb2YgdGhlIEJhc2VMaW5lIEVFTEQgc3RydWN0dXJlCisJCSAqIEJ5dGVb NF0gPSBNb25pdG9yIE5hbWUgTGVuZ3RoCisJCSAqLworCQl1bmlvbiB7CisJCQl1bnNpZ25lZCBj aGFyIGJ5dGU0OworCQkJc3RydWN0IHsKKwkJCQl1bnNpZ25lZCBjaGFyIG1ubDo1OworCQkJCXVu c2lnbmVkIGNoYXIgY2VhX2VkaWRfcmV2X2lkOjM7CisJCQl9OworCQl9OworCisJCS8qIEJ5dGVb NV0gPSBDYXBhYmlsaXRpZXMgKi8KKwkJdW5pb24geworCQkJdW5zaWduZWQgY2hhciBjYXBhYmls aXRpZXM7CisJCQlzdHJ1Y3QgeworCQkJCXVuc2lnbmVkIGNoYXIgaGRjcDoxOyAvKiBIRENQIHN1 cHBvcnQgKi8KKwkJCQl1bnNpZ25lZCBjaGFyIGFpX3N1cHBvcnQ6MTsgICAvKiBBSSBzdXBwb3J0 ICovCisJCQkJdW5zaWduZWQgY2hhciBjb25uZWN0aW9uX3R5cGU6MjsgLyogQ29ubmVjdGlvbiB0 eXBlCisJCQkJCQkJICAgICogMDAgLSBIRE1JCisJCQkJCQkJICAgICogMDEgLSBEUAorCQkJCQkJ CSAgICAqIDEwIC0xMSAgUmVzZXJ2ZWQKKwkJCQkJCQkgICAgKiBmb3IgZnV0dXJlCisJCQkJCQkJ ICAgICogY29ubmVjdGlvbiB0eXBlcworCQkJCQkJCSAgICAqLworCQkJCXVuc2lnbmVkIGNoYXIg c2FkYzo0OyAvKiBJbmRpY2F0ZXMgbnVtYmVyIG9mIDMgYnl0ZXMKKwkJCQkJCSAqIFNob3J0IEF1 ZGlvIERlc2NyaXB0b3JzLgorCQkJCQkJICovCisJCQl9OworCQl9OworCisJCS8qIEJ5dGVbNl0g PSBBdWRpbyBTeW5jaCBEZWxheSAqLworCQl1bnNpZ25lZCBjaGFyIGF1ZGlvX3N5bmNoX2RlbGF5 OyAvKiBBbW91bnQgb2YgdGltZSByZXBvcnRlZCBieSB0aGUKKwkJCQkJICAgICogc2luayB0aGF0 IHRoZSB2aWRlbyB0cmFpbHMgYXVkaW8KKwkJCQkJICAgICogaW4gbWlsbGlzZWNvbmRzLgorCQkJ CQkgICAgKi8KKworCQkvKiBCeXRlWzddID0gU3BlYWtlciBBbGxvY2F0aW9uIEJsb2NrICovCisJ CXVuaW9uIHsKKwkJCXVuc2lnbmVkIGNoYXIgc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2NrOworCQkJ c3RydWN0IHsKKwkJCQl1bnNpZ25lZCBjaGFyIGZscjoxOyAvKkZyb250IExlZnQgYW5kIFJpZ2h0 IGNoYW5uZWxzKi8KKwkJCQl1bnNpZ25lZCBjaGFyIGxmZToxOyAvKkxvdyBGcmVxdWVuY3kgRWZm ZWN0IGNoYW5uZWwqLworCQkJCXVuc2lnbmVkIGNoYXIgZmM6MTsgIC8qQ2VudGVyIHRyYW5zbWlz c2lvbiBjaGFubmVsKi8KKwkJCQl1bnNpZ25lZCBjaGFyIHJscjoxOyAvKlJlYXIgTGVmdCBhbmQg UmlnaHQgY2hhbm5lbHMqLworCQkJCXVuc2lnbmVkIGNoYXIgcmM6MTsgLypSZWFyIENlbnRlciBj aGFubmVsKi8KKwkJCQl1bnNpZ25lZCBjaGFyIGZscmM6MTsgLypGcm9udCBsZWZ0IGFuZCBSaWdo dCBvZiBDZW50ZXIKKwkJCQkJCSAqdHJhbnNtaXNzaW9uIGNoYW5uZWxzCisJCQkJCQkgKi8KKwkJ CQl1bnNpZ25lZCBjaGFyIHJscmM6MTsgLypSZWFyIGxlZnQgYW5kIFJpZ2h0IG9mIENlbnRlcgor CQkJCQkJICp0cmFuc21pc3Npb24gY2hhbm5lbHMKKwkJCQkJCSAqLworCQkJCXVuc2lnbmVkIGNo YXIgcmVzZXJ2ZWQzOjE7IC8qIFJlc2VydmVkICovCisJCQl9OworCQl9OworCisJCS8qIEJ5dGVb OCAtIDE1XSAtIDggQnl0ZSBwb3J0IGlkZW50aWZpY2F0aW9uIHZhbHVlICovCisJCXVuc2lnbmVk IGNoYXIgcG9ydF9pZF92YWx1ZVs4XTsKKworCQkvKiBCeXRlWzE2IC0gMTddIC0gMiBCeXRlIE1h bnVmYWN0dXJlciBJRCAqLworCQl1bnNpZ25lZCBjaGFyIG1hbnVmYWN0dXJlcl9pZFsyXTsKKwor CQkvKiBCeXRlWzE4IC0gMTldIC0gMiBCeXRlIFByb2R1Y3QgSUQgKi8KKwkJdW5zaWduZWQgY2hh ciBwcm9kdWN0X2lkWzJdOworCisJCS8qIEJ5dGUgWzIwLTgzXSAtIDY0IEJ5dGVzIG9mIEJhc2VM aW5lIERhdGEgKi8KKwkJdW5zaWduZWQgY2hhciBtbl9zYW5kX3NhZHNbNjRdOyAvKiBUaGlzIHdp bGwgaW5jbHVkZQorCQkJCQkgICAqIC0gQVNDSUkgc3RyaW5nIG9mIE1vbml0b3IgbmFtZQorCQkJ CQkgICAqIC0gTGlzdCBvZiAzIGJ5dGUgU0FEcworCQkJCQkgICAqIC0gWmVybyBwYWRkaW5nCisJ CQkJCSAgICovCisKKwkJLyogVmVuZG9yIEVMRCBCbG9jayBzaG91bGQgY29udGludWUgaGVyZSEK KwkJICogTm8gVmVuZG9yIEVMRCBibG9jayBkZWZpbmVkIGFzIG9mIG5vdy4KKwkJICovCisJfSBf X3BhY2tlZDsKK307CisKKy8qKgorICogZW51bSBoYWRfc3RhdHVzIC0gQXVkaW8gc3RyZWFtIHN0 YXRlcworICoKKyAqIEBTVFJFQU1fSU5JVDogU3RyZWFtIGluaXRpYWxpemVkCisgKiBAU1RSRUFN X1JVTk5JTkc6IFN0cmVhbSBydW5uaW5nCisgKiBAU1RSRUFNX1BBVVNFRDogU3RyZWFtIHBhdXNl ZAorICogQFNUUkVBTV9EUk9QUEVEOiBTdHJlYW0gZHJvcHBlZAorICovCitlbnVtIGhhZF9zdHJl YW1fc3RhdHVzIHsKKwlTVFJFQU1fSU5JVCA9IDAsCisJU1RSRUFNX1JVTk5JTkcgPSAxLAorCVNU UkVBTV9QQVVTRUQgPSAyLAorCVNUUkVBTV9EUk9QUEVEID0gMworfTsKKworLyoqCisgKiBlbnVt IGhhZF9zdGF0dXNfc3RyZWFtIC0gSEFEIHN0cmVhbSBzdGF0ZXMKKyAqLworZW51bSBoYWRfc3Rh dHVzX3N0cmVhbSB7CisJSEFEX0lOSVQgPSAwLAorCUhBRF9SVU5OSU5HX1NUUkVBTSwKK307CisK K2VudW0gaGFkX2Rydl9zdGF0dXMgeworCUhBRF9EUlZfQ09OTkVDVEVELAorCUhBRF9EUlZfUlVO TklORywKKwlIQURfRFJWX0RJU0NPTk5FQ1RFRCwKKwlIQURfRFJWX1NVU1BFTkRFRCwKKwlIQURf RFJWX0VSUiwKK307CisKKy8qIGVudW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSAtIEhETUkgY29u dHJvbGxlciByaW5nIGJ1ZmZlciB0eXBlcyAqLworZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBl IHsKKwlIQURfQlVGX1RZUEVfQSA9IDAsCisJSEFEX0JVRl9UWVBFX0IgPSAxLAorCUhBRF9CVUZf VFlQRV9DID0gMiwKKwlIQURfQlVGX1RZUEVfRCA9IDMsCit9OworCitlbnVtIG51bV9hdWRfY2gg eworCUNIX1NURVJFTyA9IDAsCisJQ0hfVEhSRUVfRk9VUiA9IDEsCisJQ0hfRklWRV9TSVggPSAy LAorCUNIX1NFVkVOX0VJR0hUID0gMworfTsKKworLyogSERNSSBDb250cm9sbGVyIHJlZ2lzdGVy IG9mZnNldHMgLSBhdWRpbyBkb21haW4gY29tbW9uICovCisvKiBCYXNlIGFkZHJlc3MgZm9yIGJl bG93IHJlZ3MgPSAweDY1MDAwICovCitlbnVtIGhkbWlfY3RybF9yZWdfb2Zmc2V0X2NvbW1vbiB7 CisJQVVESU9fSERNSV9DT05GSUdfQQk9IDB4MDAwLAorCUFVRElPX0hETUlfQ09ORklHX0IgPSAw eDgwMCwKKwlBVURJT19IRE1JX0NPTkZJR19DID0gMHg5MDAsCit9OworLyogSERNSSBjb250cm9s bGVyIHJlZ2lzdGVyIG9mZnNldHMgKi8KK2VudW0gaGRtaV9jdHJsX3JlZ19vZmZzZXRfdjEgewor CUFVRF9DT05GSUcJCT0gMHgwLAorCUFVRF9DSF9TVEFUVVNfMAkJPSAweDA4LAorCUFVRF9DSF9T VEFUVVNfMQkJPSAweDBDLAorCUFVRF9IRE1JX0NUUwkJPSAweDEwLAorCUFVRF9OX0VOQUJMRQkJ PSAweDE0LAorCUFVRF9TQU1QTEVfUkFURQkJPSAweDE4LAorCUFVRF9CVUZfQ09ORklHCQk9IDB4 MjAsCisJQVVEX0JVRl9DSF9TV0FQCQk9IDB4MjQsCisJQVVEX0JVRl9BX0FERFIJCT0gMHg0MCwK KwlBVURfQlVGX0FfTEVOR1RICT0gMHg0NCwKKwlBVURfQlVGX0JfQUREUgkJPSAweDQ4LAorCUFV RF9CVUZfQl9MRU5HVEgJPSAweDRjLAorCUFVRF9CVUZfQ19BRERSCQk9IDB4NTAsCisJQVVEX0JV Rl9DX0xFTkdUSAk9IDB4NTQsCisJQVVEX0JVRl9EX0FERFIJCT0gMHg1OCwKKwlBVURfQlVGX0Rf TEVOR1RICT0gMHg1YywKKwlBVURfQ05UTF9TVAkJPSAweDYwLAorCUFVRF9IRE1JX1NUQVRVUwkJ PSAweDY4LAorCUFVRF9IRE1JV19JTkZPRlIJPSAweDExNCwKK307CisKKy8qCisgKiBEZWx0YSBj aGFuZ2VzIGluIEhETUkgY29udHJvbGxlciByZWdpc3RlciBvZmZzZXRzCisgKiBjb21wYXJlIHRv IHYxIHZlcnNpb24KKyAqLworCitlbnVtIGhkbWlfY3RybF9yZWdfb2Zmc2V0X3YyIHsKKwlBVURf SERNSV9TVEFUVVNfdjIJPSAweDY0LAorCUFVRF9IRE1JV19JTkZPRlJfdjIJPSAweDY4LAorfTsK KworLyoKKyAqCUNFQSBzcGVha2VyIHBsYWNlbWVudDoKKyAqCisgKglGTCAgRkxDICAgRkMgICBG UkMgICBGUgorICoKKyAqCQkJCQkJTEZFCisgKgorICoJUkwgIFJMQyAgIFJDICAgUlJDICAgUlIK KyAqCisgKglUaGUgTGVmdC9SaWdodCBTdXJyb3VuZCBjaGFubmVsIF9ub3Rpb25zXyBMUy9SUyBp biBTTVBURSAzMjBNCisgKgljb3JyZXNwb25kcyB0byBDRUEgUkwvUlI7IFRoZSBTTVBURSBjaGFu bmVsIF9hc3NpZ25tZW50XyBDL0xGRSBpcworICoJc3dhcHBlZCB0byBDRUEgTEZFL0ZDLgorICov CitlbnVtIGNlYV9zcGVha2VyX3BsYWNlbWVudCB7CisJRkwgID0gKDEgPDwgIDApLCAgICAgICAg LyogRnJvbnQgTGVmdCAgICAgICAgICAgKi8KKwlGQyAgPSAoMSA8PCAgMSksICAgICAgICAvKiBG cm9udCBDZW50ZXIgICAgICAgICAqLworCUZSICA9ICgxIDw8ICAyKSwgICAgICAgIC8qIEZyb250 IFJpZ2h0ICAgICAgICAgICovCisJRkxDID0gKDEgPDwgIDMpLCAgICAgICAgLyogRnJvbnQgTGVm dCBDZW50ZXIgICAgKi8KKwlGUkMgPSAoMSA8PCAgNCksICAgICAgICAvKiBGcm9udCBSaWdodCBD ZW50ZXIgICAqLworCVJMICA9ICgxIDw8ICA1KSwgICAgICAgIC8qIFJlYXIgTGVmdCAgICAgICAg ICAgICovCisJUkMgID0gKDEgPDwgIDYpLCAgICAgICAgLyogUmVhciBDZW50ZXIgICAgICAgICAg Ki8KKwlSUiAgPSAoMSA8PCAgNyksICAgICAgICAvKiBSZWFyIFJpZ2h0ICAgICAgICAgICAqLwor CVJMQyA9ICgxIDw8ICA4KSwgICAgICAgIC8qIFJlYXIgTGVmdCBDZW50ZXIgICAgICovCisJUlJD ID0gKDEgPDwgIDkpLCAgICAgICAgLyogUmVhciBSaWdodCBDZW50ZXIgICAgKi8KKwlMRkUgPSAo MSA8PCAxMCksICAgICAgICAvKiBMb3cgRnJlcXVlbmN5IEVmZmVjdCAqLworfTsKKworc3RydWN0 IGNlYV9jaGFubmVsX3NwZWFrZXJfYWxsb2NhdGlvbiB7CisJaW50IGNhX2luZGV4OworCWludCBz cGVha2Vyc1s4XTsKKworCS8qIGRlcml2ZWQgdmFsdWVzLCBqdXN0IGZvciBjb252ZW5pZW5jZSAq LworCWludCBjaGFubmVsczsKKwlpbnQgc3BrX21hc2s7Cit9OworCitzdHJ1Y3QgY2hhbm5lbF9t YXBfdGFibGUgeworCXVuc2lnbmVkIGNoYXIgbWFwOyAgICAgICAgICAgICAgLyogQUxTQSBBUEkg Y2hhbm5lbCBtYXAgcG9zaXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyIGNlYV9zbG90OyAgICAgICAg IC8qIENFQSBzbG90IHZhbHVlICovCisJaW50IHNwa19tYXNrOyAgICAgICAgICAgICAgICAgICAv KiBzcGVha2VyIHBvc2l0aW9uIGJpdCBtYXNrICovCit9OworCisvKioKKyAqIHVuaW9uIGF1ZF9j ZmcgLSBBdWRpbyBjb25maWd1cmF0aW9uCisgKgorICogQGNmZ19yZWd4OiBpbmRpdmlkdWFsIHJl Z2lzdGVyIGJpdHMKKyAqIEBjZmdfcmVndmFsOiBmdWxsIHJlZ2lzdGVyIHZhbHVlCisgKgorICov Cit1bmlvbiBhdWRfY2ZnIHsKKwlzdHJ1Y3QgeworCQl1MzIgYXVkX2VuOjE7CisJCXUzMiBsYXlv dXQ6MTsKKwkJdTMyIGZtdDoyOworCQl1MzIgbnVtX2NoOjI7CisJCXUzMiByc3ZkMDoxOworCQl1 MzIgc2V0OjE7CisJCXUzMiBmbGF0OjE7CisJCXUzMiB2YWxfYml0OjE7CisJCXUzMiB1c2VyX2Jp dDoxOworCQl1MzIgdW5kZXJydW46MTsKKwkJdTMyIHJzdmQxOjIwOworCX0gY2ZnX3JlZ3g7CisJ c3RydWN0IHsKKwkJdTMyIGF1ZF9lbjoxOworCQl1MzIgbGF5b3V0OjE7CisJCXUzMiBmbXQ6MjsK KwkJdTMyIG51bV9jaDozOworCQl1MzIgc2V0OjE7CisJCXUzMiBmbGF0OjE7CisJCXUzMiB2YWxf Yml0OjE7CisJCXUzMiB1c2VyX2JpdDoxOworCQl1MzIgdW5kZXJydW46MTsKKwkJdTMyIHBhY2tl dF9tb2RlOjE7CisJCXUzMiBsZWZ0X2FsaWduOjE7CisJCXUzMiBib2d1c19zYW1wbGU6MTsKKwkJ dTMyIGRwX21vZGVpOjE7CisJCXUzMiByc3ZkOjE2OworCX0gY2ZnX3JlZ3hfdjI7CisJdTMyIGNm Z19yZWd2YWw7Cit9OworCisvKioKKyAqIHVuaW9uIGF1ZF9jaF9zdGF0dXNfMCAtIEF1ZGlvIENo YW5uZWwgU3RhdHVzIDAgQXR0cmlidXRlcworICoKKyAqIEBzdGF0dXNfMF9yZWd4OmluZGl2aWR1 YWwgcmVnaXN0ZXIgYml0cworICogQHN0YXR1c18wX3JlZ3ZhbDpmdWxsIHJlZ2lzdGVyIHZhbHVl CisgKgorICovCit1bmlvbiBhdWRfY2hfc3RhdHVzXzAgeworCXN0cnVjdCB7CisJCXUzMiBjaF9z dGF0dXM6MTsKKwkJdTMyIGxwY21faWQ6MTsKKwkJdTMyIGNwX2luZm86MTsKKwkJdTMyIGZvcm1h dDozOworCQl1MzIgbW9kZToyOworCQl1MzIgY3RnX2NvZGU6ODsKKwkJdTMyIHNyY19udW06NDsK KwkJdTMyIGNoX251bTo0OworCQl1MzIgc2FtcF9mcmVxOjQ7CisJCXUzMiBjbGtfYWNjOjI7CisJ CXUzMiByc3ZkOjI7CisJfSBzdGF0dXNfMF9yZWd4OworCXUzMiBzdGF0dXNfMF9yZWd2YWw7Cit9 OworCisvKioKKyAqIHVuaW9uIGF1ZF9jaF9zdGF0dXNfMSAtIEF1ZGlvIENoYW5uZWwgU3RhdHVz IDEgQXR0cmlidXRlcworICoKKyAqIEBzdGF0dXNfMV9yZWd4OiBpbmRpdmlkdWFsIHJlZ2lzdGVy IGJpdHMKKyAqIEBzdGF0dXNfMV9yZWd2YWw6IGZ1bGwgcmVnaXN0ZXIgdmFsdWUKKyAqCisgKi8K K3VuaW9uIGF1ZF9jaF9zdGF0dXNfMSB7CisJc3RydWN0IHsKKwkJdTMyIG1heF93cmRfbGVuOjE7 CisJCXUzMiB3cmRfbGVuOjM7CisJCXUzMiByc3ZkOjI4OworCQl9IHN0YXR1c18xX3JlZ3g7CisJ dTMyIHN0YXR1c18xX3JlZ3ZhbDsKK307CisKKy8qKgorICogdW5pb24gYXVkX2hkbWlfY3RzIC0g Q1RTIHJlZ2lzdGVyCisgKgorICogQGN0c19yZWd4OiBpbmRpdmlkdWFsIHJlZ2lzdGVyIGJpdHMK KyAqIEBjdHNfcmVndmFsOiBmdWxsIHJlZ2lzdGVyIHZhbHVlCisgKgorICovCit1bmlvbiBhdWRf aGRtaV9jdHMgeworCXN0cnVjdCB7CisJCXUzMiBjdHNfdmFsOjIwOworCQl1MzIgZW5fY3RzX3By b2c6MTsKKwkJdTMyIHJzdmQ6MTE7CisJfSBjdHNfcmVneDsKKwlzdHJ1Y3QgeworCQl1MzIgY3Rz X3ZhbDoyNDsKKwkJdTMyIGVuX2N0c19wcm9nOjE7CisJCXUzMiByc3ZkOjc7CisJfSBjdHNfcmVn eF92MjsKKwl1MzIgY3RzX3JlZ3ZhbDsKK307CisKKy8qKgorICogdW5pb24gYXVkX2hkbWlfbl9l bmFibGUgLSBOIHJlZ2lzdGVyCisgKgorICogQG5fcmVneDogaW5kaXZpZHVhbCByZWdpc3RlciBi aXRzCisgKiBAbl9yZWd2YWw6IGZ1bGwgcmVnaXN0ZXIgdmFsdWUKKyAqCisgKi8KK3VuaW9uIGF1 ZF9oZG1pX25fZW5hYmxlIHsKKwlzdHJ1Y3QgeworCQl1MzIgbl92YWw6MjA7CisJCXUzMiBlbl9u X3Byb2c6MTsKKwkJdTMyIHJzdmQ6MTE7CisJfSBuX3JlZ3g7CisJc3RydWN0IHsKKwkJdTMyIG5f dmFsOjI0OworCQl1MzIgZW5fbl9wcm9nOjE7CisJCXUzMiByc3ZkOjc7CisJfSBuX3JlZ3hfdjI7 CisJdTMyIG5fcmVndmFsOworfTsKKworLyoqCisgKiB1bmlvbiBhdWRfYnVmX2NvbmZpZyAtICBB dWRpbyBCdWZmZXIgY29uZmlndXJhdGlvbnMKKyAqCisgKiBAYnVmX2NmZ19yZWd4OiBpbmRpdmlk dWFsIHJlZ2lzdGVyIGJpdHMKKyAqIEBidWZfY2ZndmFsOiBmdWxsIHJlZ2lzdGVyIHZhbHVlCisg KgorICovCit1bmlvbiBhdWRfYnVmX2NvbmZpZyB7CisJc3RydWN0IHsKKwkJdTMyIGZpZm9fd2lk dGg6ODsKKwkJdTMyIHJzdmQwOjg7CisJCXUzMiBhdWRfZGVsYXk6ODsKKwkJdTMyIHJzdmQxOjg7 CisJfSBidWZfY2ZnX3JlZ3g7CisJc3RydWN0IHsKKwkJdTMyIGF1ZGlvX2ZpZm9fd2F0ZXJtYXJr Ojg7CisJCXUzMiBkbWFfZmlmb193YXRlcm1hcms6MzsKKwkJdTMyIHJzdmQwOjU7CisJCXUzMiBh dWRfZGVsYXk6ODsKKwkJdTMyIHJzdmQxOjg7CisJfSBidWZfY2ZnX3JlZ3hfdjI7CisJdTMyIGJ1 Zl9jZmd2YWw7Cit9OworCisvKioKKyAqIHVuaW9uIGF1ZF9idWZfY2hfc3dhcCAtIEF1ZGlvIFNh bXBsZSBTd2FwcGluZyBvZmZzZXQKKyAqCisgKiBAYnVmX2NoX3N3YXBfcmVneDogaW5kaXZpZHVh bCByZWdpc3RlciBiaXRzCisgKiBAYnVmX2NoX3N3YXBfdmFsOiBmdWxsIHJlZ2lzdGVyIHZhbHVl CisgKgorICovCit1bmlvbiBhdWRfYnVmX2NoX3N3YXAgeworCXN0cnVjdCB7CisJCXUzMiBmaXJz dF8wOjM7CisJCXUzMiBzZWNvbmRfMDozOworCQl1MzIgZmlyc3RfMTozOworCQl1MzIgc2Vjb25k XzE6MzsKKwkJdTMyIGZpcnN0XzI6MzsKKwkJdTMyIHNlY29uZF8yOjM7CisJCXUzMiBmaXJzdF8z OjM7CisJCXUzMiBzZWNvbmRfMzozOworCQl1MzIgcnN2ZDo4OworCX0gYnVmX2NoX3N3YXBfcmVn eDsKKwl1MzIgYnVmX2NoX3N3YXBfdmFsOworfTsKKworLyoqCisgKiB1bmlvbiBhdWRfYnVmX2Fk ZHIgLSBBZGRyZXNzIGZvciBBdWRpbyBCdWZmZXIKKyAqCisgKiBAYnVmX2FkZHJfcmVneDogaW5k aXZpZHVhbCByZWdpc3RlciBiaXRzCisgKiBAYnVmX2FkZHJfdmFsOiBmdWxsIHJlZ2lzdGVyIHZh bHVlCisgKgorICovCit1bmlvbiBhdWRfYnVmX2FkZHIgeworCXN0cnVjdCB7CisJCXUzMiB2YWxp ZDoxOworCQl1MzIgaW50cl9lbjoxOworCQl1MzIgcnN2ZDo0OworCQl1MzIgYWRkcjoyNjsKKwl9 IGJ1Zl9hZGRyX3JlZ3g7CisJdTMyIGJ1Zl9hZGRyX3ZhbDsKK307CisKKy8qKgorICogdW5pb24g YXVkX2J1Zl9sZW4gLSBMZW5ndGggb2YgQXVkaW8gQnVmZmVyCisgKgorICogQGJ1Zl9sZW5fcmVn eDogaW5kaXZpZHVhbCByZWdpc3RlciBiaXRzCisgKiBAYnVmX2xlbl92YWw6IGZ1bGwgcmVnaXN0 ZXIgdmFsdWUKKyAqCisgKi8KK3VuaW9uIGF1ZF9idWZfbGVuIHsKKwlzdHJ1Y3QgeworCQl1MzIg YnVmX2xlbjoyMDsKKwkJdTMyIHJzdmQ6MTI7CisJfSBidWZfbGVuX3JlZ3g7CisJdTMyIGJ1Zl9s ZW5fdmFsOworfTsKKworLyoqCisgKiB1bmlvbiBhdWRfY3RybF9zdCAtIEF1ZGlvIENvbnRyb2wg U3RhdGUgUmVnaXN0ZXIgb2Zmc2V0CisgKgorICogQGN0cmxfcmVneDogaW5kaXZpZHVhbCByZWdp c3RlciBiaXRzCisgKiBAY3RybF92YWw6IGZ1bGwgcmVnaXN0ZXIgdmFsdWUKKyAqCisgKi8KK3Vu aW9uIGF1ZF9jdHJsX3N0IHsKKwlzdHJ1Y3QgeworCQl1MzIgcmFtX2FkZHI6NDsKKwkJdTMyIGVs ZF9hY2s6MTsKKwkJdTMyIGVsZF9hZGRyOjQ7CisJCXUzMiBlbGRfYnVmX3NpemU6NTsKKwkJdTMy IGVsZF92YWxpZDoxOworCQl1MzIgY3BfcmVhZHk6MTsKKwkJdTMyIGRpcF9mcmVxOjI7CisJCXUz MiBkaXBfaWR4OjM7CisJCXUzMiBkaXBfZW5fc3RhOjQ7CisJCXUzMiByc3ZkOjc7CisJfSBjdHJs X3JlZ3g7CisJdTMyIGN0cmxfdmFsOworfTsKKworLyoqCisgKiB1bmlvbiBhdWRfaW5mb19mcmFt ZTEgLSBBdWRpbyBIRE1JIFdpZGdldCBEYXRhIElzbGFuZCBQYWNrZXQgb2Zmc2V0CisgKgorICog QGZyMV9yZWd4OiBpbmRpdmlkdWFsIHJlZ2lzdGVyIGJpdHMKKyAqIEBmcjFfdmFsOiBmdWxsIHJl Z2lzdGVyIHZhbHVlCisgKgorICovCit1bmlvbiBhdWRfaW5mb19mcmFtZTEgeworCXN0cnVjdCB7 CisJCXUzMiBwa3RfdHlwZTo4OworCQl1MzIgdmVyX251bTo4OworCQl1MzIgbGVuOjU7CisJCXUz MiByc3ZkOjExOworCX0gZnIxX3JlZ3g7CisJdTMyIGZyMV92YWw7Cit9OworCisvKioKKyAqIHVu aW9uIGF1ZF9pbmZvX2ZyYW1lMiAtIERJUCBmcmFtZSAyCisgKgorICogQGZyMl9yZWd4OiBpbmRp dmlkdWFsIHJlZ2lzdGVyIGJpdHMKKyAqIEBmcjJfdmFsOiBmdWxsIHJlZ2lzdGVyIHZhbHVlCisg KgorICovCit1bmlvbiBhdWRfaW5mb19mcmFtZTIgeworCXN0cnVjdCB7CisJCXUzMiBjaGtzdW06 ODsKKwkJdTMyIGNobmxfY250OjM7CisJCXUzMiByc3ZkMDoxOworCQl1MzIgY29kaW5nX3R5cGU6 NDsKKwkJdTMyIHNtcGxfc2l6ZToyOworCQl1MzIgc21wbF9mcmVxOjM7CisJCXUzMiByc3ZkMToz OworCQl1MzIgZm9ybWF0Ojg7CisJfSBmcjJfcmVneDsKKwl1MzIgZnIyX3ZhbDsKK307CisKKy8q KgorICogdW5pb24gYXVkX2luZm9fZnJhbWUzIC0gRElQIGZyYW1lIDMKKyAqCisgKiBAZnIzX3Jl Z3g6IGluZGl2aWR1YWwgcmVnaXN0ZXIgYml0cworICogQGZyM192YWw6IGZ1bGwgcmVnaXN0ZXIg dmFsdWUKKyAqCisgKi8KK3VuaW9uIGF1ZF9pbmZvX2ZyYW1lMyB7CisJc3RydWN0IHsKKwkJdTMy IGNobmxfYWxsb2M6ODsKKwkJdTMyIHJzdmQwOjM7CisJCXUzMiBsc3Y6NDsKKwkJdTMyIGRtX2lu aDoxOworCQl1MzIgcnN2ZDE6MTY7CisJfSBmcjNfcmVneDsKKwl1MzIgZnIzX3ZhbDsKK307CisK K2VudW0gaGRtaV9jb25uZWN0b3Jfc3RhdHVzIHsKKwloZG1pX2Nvbm5lY3Rvcl9zdGF0dXNfY29u bmVjdGVkID0gMSwKKwloZG1pX2Nvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkID0gMiwKKwlo ZG1pX2Nvbm5lY3Rvcl9zdGF0dXNfdW5rbm93biA9IDMsCit9OworCisjZGVmaW5lIEhETUlfQVVE SU9fVU5ERVJSVU4gICAgICgxVUw8PDMxKQorI2RlZmluZSBIRE1JX0FVRElPX0JVRkZFUl9ET05F ICAoMVVMPDwyOSkKKworCisjZGVmaW5lIFBPUlRfRU5BQkxFCQkJKDEgPDwgMzEpCisjZGVmaW5l IFNEVk9fQVVESU9fRU5BQkxFCSgxIDw8IDYpCisKK2VudW0gaGFkX2NhcHNfbGlzdCB7CisJSEFE X0dFVF9FTEQgPSAxLAorCUhBRF9HRVRfRElTUExBWV9SQVRFLAorCUhBRF9TRVRfRU5BQkxFX0FV RElPLAorCUhBRF9TRVRfRElTQUJMRV9BVURJTywKKwlIQURfU0VUX0VOQUJMRV9BVURJT19JTlQs CisJSEFEX1NFVF9ESVNBQkxFX0FVRElPX0lOVCwKK307CisKK2VudW0gaGFkX2V2ZW50X3R5cGUg eworCUhBRF9FVkVOVF9IT1RfUExVRyA9IDEsCisJSEFEX0VWRU5UX0hPVF9VTlBMVUcsCisJSEFE X0VWRU5UX01PREVfQ0hBTkdJTkcsCisJSEFEX0VWRU5UX0FVRElPX0JVRkZFUl9ET05FLAorCUhB RF9FVkVOVF9BVURJT19CVUZGRVJfVU5ERVJSVU4sCisJSEFEX0VWRU5UX1FVRVJZX0lTX0FVRElP X0JVU1ksCisJSEFEX0VWRU5UX1FVRVJZX0lTX0FVRElPX1NVU1BFTkRFRCwKK307CisKKy8qCisg KiBIRE1JIERpc3BsYXkgQ29udHJvbGxlciBBdWRpbyBJbnRlcmZhY2UKKyAqCisgKi8KK3R5cGVk ZWYgaW50ICgqaGFkX2V2ZW50X2NhbGxfYmFjaykgKGVudW0gaGFkX2V2ZW50X3R5cGUgZXZlbnRf dHlwZSwKKwkJdm9pZCAqY3R4dF9pbmZvKTsKKworc3RydWN0IGhkbWlfYXVkaW9fcmVnaXN0ZXJz X29wcyB7CisJaW50ICgqaGRtaV9hdWRpb19nZXRfcmVnaXN0ZXJfYmFzZSkodTMyICoqcmVnX2Jh c2UsCisJCQl1MzIgKmNvbmZpZ19vZmZzZXQpOworCWludCAoKmhkbWlfYXVkaW9fcmVhZF9yZWdp c3RlcikodTMyIHJlZ19hZGRyLCB1MzIgKmRhdGEpOworCWludCAoKmhkbWlfYXVkaW9fd3JpdGVf cmVnaXN0ZXIpKHUzMiByZWdfYWRkciwgdTMyIGRhdGEpOworCWludCAoKmhkbWlfYXVkaW9fcmVh ZF9tb2RpZnkpKHUzMiByZWdfYWRkciwgdTMyIGRhdGEsCisJCQl1MzIgbWFzayk7Cit9OworCitz dHJ1Y3QgaGRtaV9hdWRpb19xdWVyeV9zZXRfb3BzIHsKKwlpbnQgKCpoZG1pX2F1ZGlvX2dldF9j YXBzKShlbnVtIGhhZF9jYXBzX2xpc3QgcXVlcnlfZWxlbWVudCwKKwkJCXZvaWQgKmNhcGFiaWx0 aWVzKTsKKwlpbnQgKCpoZG1pX2F1ZGlvX3NldF9jYXBzKShlbnVtIGhhZF9jYXBzX2xpc3Qgc2V0 X2VsZW1lbnQsCisJCQl2b2lkICpjYXBhYmlsdGllcyk7Cit9OworCitzdHJ1Y3QgaGRtaV9hdWRp b19ldmVudCB7CisJaW50IHR5cGU7Cit9OworCitzdHJ1Y3Qgc25kX2ludGVsX2hhZF9pbnRlcmZh Y2UgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqcXVlcnkpKHZvaWQgKmhhZF9kYXRhLCBz dHJ1Y3QgaGRtaV9hdWRpb19ldmVudCBldmVudCk7CisJaW50ICgqc3VzcGVuZCkodm9pZCAqaGFk X2RhdGEsIHN0cnVjdCBoZG1pX2F1ZGlvX2V2ZW50IGV2ZW50KTsKKwlpbnQgKCpyZXN1bWUpKHZv aWQgKmhhZF9kYXRhKTsKK307CisKK2Jvb2wgbWlkX2hkbWlfYXVkaW9faXNfYnVzeSh2b2lkICpk ZXYpOworYm9vbCBtaWRfaGRtaV9hdWRpb19zdXNwZW5kKHZvaWQgKmRldik7Cit2b2lkIG1pZF9o ZG1pX2F1ZGlvX3Jlc3VtZSh2b2lkICpkZXYpOwordm9pZCBtaWRfaGRtaV9hdWRpb19zaWduYWxf ZXZlbnQoZW51bSBoYWRfZXZlbnRfdHlwZSBldmVudCk7CitpbnQgbWlkX2hkbWlfYXVkaW9fc2V0 dXAoCisJaGFkX2V2ZW50X2NhbGxfYmFjayBhdWRpb19jYWxsYmFja3MsCisJc3RydWN0IGhkbWlf YXVkaW9fcmVnaXN0ZXJzX29wcyAqcmVnX29wcywKKwlzdHJ1Y3QgaGRtaV9hdWRpb19xdWVyeV9z ZXRfb3BzICpxdWVyeV9vcHMpOworaW50IG1pZF9oZG1pX2F1ZGlvX3JlZ2lzdGVyKAorCXN0cnVj dCBzbmRfaW50ZWxfaGFkX2ludGVyZmFjZSAqZHJpdmVyLAorCXZvaWQgKmhhZF9kYXRhKTsKKwor I2VuZGlmCi0tIAoyLjkuMwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50 ZWwtZ2Z4Cg==