From mboxrd@z Thu Jan 1 00:00:00 1970
From: Philipp Zabel
Subject: [PATCH v16 4/8] drm/mediatek: Add DSI sub driver
Date: Fri, 6 May 2016 15:05:50 +0200
Message-ID: <1462539954-26158-5-git-send-email-p.zabel@pengutronix.de>
References: <1462539954-26158-1-git-send-email-p.zabel@pengutronix.de>
Mime-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Return-path:
In-Reply-To: <1462539954-26158-1-git-send-email-p.zabel@pengutronix.de>
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
Errors-To: dri-devel-bounces@lists.freedesktop.org
Sender: "dri-devel"
To: dri-devel@lists.freedesktop.org
Cc: Mark Rutland , Stephen Boyd , Michael Turquette , Jie Qiu , Cawa Cheng , YT Shen , Yingjoe Chen , devicetree@vger.kernel.org, Jitao Shi , kernel@pengutronix.de, Pawel Moll , Ian Campbell , Rob Herring , linux-mediatek@lists.infradead.org, Matthias Brugger , Paul Bolle , Emil Velikov , Tomasz Figa , Kumar Gala
List-Id: devicetree@vger.kernel.org
RnJvbTogQ0sgSHUgPGNrLmh1QG1lZGlhdGVrLmNvbT4KClRoaXMgcGF0Y2ggYWRkIGEgZHJtIGVu
Y29kZXIvY29ubmVjdG9yIGRyaXZlciBmb3IgdGhlIE1JUEkgRFNJIGZ1bmN0aW9uCmJsb2NrIG9m
IHRoZSBNZWRpYXRlayBkaXNwbGF5IHN1YnN5c3RlbSBhbmQgYSBwaHkgZHJpdmVyIGZvciB0aGUg
TUlQSSBUWApELVBIWSBjb250cm9sIG1vZHVsZS4KClNpZ25lZC1vZmYtYnk6IEppdGFvIFNoaSA8
aml0YW8uc2hpQG1lZGlhdGVrLmNvbT4KU2lnbmVkLW9mZi1ieTogUGhpbGlwcCBaYWJlbCA8cC56
YWJlbEBwZW5ndXRyb25peC5kZT4KLS0tCkNoYW5nZXMgc2luY2UgdjE1OgogLSBPcmRlciBtdGtf
ZHJtX2RyaXZlcnMgYWxwaGFiZXRpY2FsbHkKLS0tCiBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsv
S2NvbmZpZyAgICAgICB8ICAgMiArCiBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvTWFrZWZpbGUg
ICAgICB8ICAgNCArLQogZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZHJ2LmMgfCAg
IDIgKwogZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcm1fZHJ2LmggfCAgIDIgKwogZHJp
dmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kc2kuYyAgICAgfCA5MjcgKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX21pcGlfdHgu
YyB8IDQ2MyArKysrKysrKysrKysrKysrCiA2IGZpbGVzIGNoYW5nZWQsIDEzOTkgaW5zZXJ0aW9u
cygrKSwgMSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9t
ZWRpYXRlay9tdGtfZHNpLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vbWVk
aWF0ZWsvbXRrX21pcGlfdHguYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRl
ay9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL0tjb25maWcKaW5kZXggMzBlNTM3
MS4uZWVlZmM5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL0tjb25maWcK
KysrIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL0tjb25maWcKQEAgLTQsNiArNCw4IEBAIGNv
bmZpZyBEUk1fTUVESUFURUsKIAlkZXBlbmRzIG9uIEFSQ0hfTUVESUFURUsgfHwgKEFSTSAmJiBD
T01QSUxFX1RFU1QpCiAJc2VsZWN0IERSTV9HRU1fQ01BX0hFTFBFUgogCXNlbGVjdCBEUk1fS01T
X0hFTFBFUgorCXNlbGVjdCBEUk1fTUlQSV9EU0kKKwlzZWxlY3QgRFJNX1BBTkVMCiAJc2VsZWN0
IElPTU1VX0RNQQogCXNlbGVjdCBNRU1PUlkKIAlzZWxlY3QgTVRLX1NNSQpkaWZmIC0tZ2l0IGEv
ZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL21lZGlh
dGVrL01ha2VmaWxlCmluZGV4IGQ0YmRlN2MuLmU3ODFkYjVhIDEwMDY0NAotLS0gYS9kcml2ZXJz
L2dwdS9kcm0vbWVkaWF0ZWsvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVr
L01ha2VmaWxlCkBAIC02LDYgKzYsOCBAQCBtZWRpYXRlay1kcm0teSA6PSBtdGtfZGlzcF9vdmwu
byBcCiAJCSAgbXRrX2RybV9kcnYubyBcCiAJCSAgbXRrX2RybV9mYi5vIFwKIAkJICBtdGtfZHJt
X2dlbS5vIFwKLQkJICBtdGtfZHJtX3BsYW5lLm8KKwkJICBtdGtfZHJtX3BsYW5lLm8gXAorCQkg
IG10a19kc2kubyBcCisJCSAgbXRrX21pcGlfdHgubwogCiBvYmotJChDT05GSUdfRFJNX01FRElB
VEVLKSArPSBtZWRpYXRlay1kcm0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21lZGlh
dGVrL210a19kcm1fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kcnYu
YwppbmRleCBlNmU1NjU0Li4wODc4MmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWVk
aWF0ZWsvbXRrX2RybV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2Ry
bV9kcnYuYwpAQCAtNTE3LDYgKzUxNyw4IEBAIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVy
ICogY29uc3QgbXRrX2RybV9kcml2ZXJzW10gPSB7CiAJJm10a19kaXNwX292bF9kcml2ZXIsCiAJ
Jm10a19kaXNwX3JkbWFfZHJpdmVyLAogCSZtdGtfZHJtX3BsYXRmb3JtX2RyaXZlciwKKwkmbXRr
X2RzaV9kcml2ZXIsCisJJm10a19taXBpX3R4X2RyaXZlciwKIH07CiAKIHN0YXRpYyBpbnQgX19p
bml0IG10a19kcm1faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21lZGlh
dGVrL210a19kcm1fZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RybV9kcnYu
aAppbmRleCAyN2RjOGZhLi5hYzZjOTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbWVk
aWF0ZWsvbXRrX2RybV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2Ry
bV9kcnYuaApAQCAtNTMsNSArNTMsNyBAQCBzdHJ1Y3QgbXRrX2RybV9wcml2YXRlIHsKIGV4dGVy
biBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG10a19kZHBfZHJpdmVyOwogZXh0ZXJuIHN0cnVjdCBw
bGF0Zm9ybV9kcml2ZXIgbXRrX2Rpc3Bfb3ZsX2RyaXZlcjsKIGV4dGVybiBzdHJ1Y3QgcGxhdGZv
cm1fZHJpdmVyIG10a19kaXNwX3JkbWFfZHJpdmVyOworZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9k
cml2ZXIgbXRrX2RzaV9kcml2ZXI7CitleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdGtf
bWlwaV90eF9kcml2ZXI7CiAKICNlbmRpZiAvKiBNVEtfRFJNX0RSVl9IICovCmRpZmYgLS1naXQg
YS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2RzaS5jIGIvZHJpdmVycy9ncHUvZHJtL21l
ZGlhdGVrL210a19kc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGU4
ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kc2ku
YwpAQCAtMCwwICsxLDkyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBNZWRpYVRlayBJ
bmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICov
CisKKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgorI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljX2hlbHBl
ci5oPgorI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KKyNpbmNsdWRlIDxkcm0vZHJt
X21pcGlfZHNpLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9wYW5lbC5oPgorI2luY2x1ZGUgPGxpbnV4
L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L29m
Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9n
cmFwaC5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0
Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDx2aWRlby92aWRlb21vZGUuaD4KKworI2luY2x1ZGUg
Im10a19kcm1fZGRwX2NvbXAuaCIKKworI2RlZmluZSBEU0lfVklERU9fRklGT19ERVBUSAkoMTky
MCAvIDQpCisjZGVmaW5lIERTSV9IT1NUX0ZJRk9fREVQVEgJNjQKKworI2RlZmluZSBEU0lfU1RB
UlQJCTB4MDAKKworI2RlZmluZSBEU0lfQ09OX0NUUkwJCTB4MTAKKyNkZWZpbmUgRFNJX1JFU0VU
CQkJQklUKDApCisjZGVmaW5lIERTSV9FTgkJCQlCSVQoMSkKKworI2RlZmluZSBEU0lfTU9ERV9D
VFJMCQkweDE0CisjZGVmaW5lIE1PREUJCQkJKDMpCisjZGVmaW5lIENNRF9NT0RFCQkJMAorI2Rl
ZmluZSBTWU5DX1BVTFNFX01PREUJCQkxCisjZGVmaW5lIFNZTkNfRVZFTlRfTU9ERQkJCTIKKyNk
ZWZpbmUgQlVSU1RfTU9ERQkJCTMKKyNkZWZpbmUgRlJNX01PREUJCQlCSVQoMTYpCisjZGVmaW5l
IE1JWF9NT0RFCQkJQklUKDE3KQorCisjZGVmaW5lIERTSV9UWFJYX0NUUkwJCTB4MTgKKyNkZWZp
bmUgVkNfTlVNCQkJCSgyIDw8IDApCisjZGVmaW5lIExBTkVfTlVNCQkJKDB4ZiA8PCAyKQorI2Rl
ZmluZSBESVNfRU9UCQkJCUJJVCg2KQorI2RlZmluZSBOVUxMX0VOCQkJCUJJVCg3KQorI2RlZmlu
ZSBURV9GUkVFUlVOCQkJQklUKDgpCisjZGVmaW5lIEVYVF9URV9FTgkJCUJJVCg5KQorI2RlZmlu
ZSBFWFRfVEVfRURHRQkJCUJJVCgxMCkKKyNkZWZpbmUgTUFYX1JUTl9TSVpFCQkJKDB4ZiA8PCAx
MikKKyNkZWZpbmUgSFNUWF9DS0xQX0VOCQkJQklUKDE2KQorCisjZGVmaW5lIERTSV9QU0NUUkwJ
CTB4MWMKKyNkZWZpbmUgRFNJX1BTX1dDCQkJMHgzZmZmCisjZGVmaW5lIERTSV9QU19TRUwJCQko
MyA8PCAxNikKKyNkZWZpbmUgUEFDS0VEX1BTXzE2QklUX1JHQjU2NQkJKDAgPDwgMTYpCisjZGVm
aW5lIExPT1NFTFlfUFNfMThCSVRfUkdCNjY2CQkoMSA8PCAxNikKKyNkZWZpbmUgUEFDS0VEX1BT
XzE4QklUX1JHQjY2NgkJKDIgPDwgMTYpCisjZGVmaW5lIFBBQ0tFRF9QU18yNEJJVF9SR0I4ODgJ
CSgzIDw8IDE2KQorCisjZGVmaW5lIERTSV9WU0FfTkwJCTB4MjAKKyNkZWZpbmUgRFNJX1ZCUF9O
TAkJMHgyNAorI2RlZmluZSBEU0lfVkZQX05MCQkweDI4CisjZGVmaW5lIERTSV9WQUNUX05MCQkw
eDJDCisjZGVmaW5lIERTSV9IU0FfV0MJCTB4NTAKKyNkZWZpbmUgRFNJX0hCUF9XQwkJMHg1NAor
I2RlZmluZSBEU0lfSEZQX1dDCQkweDU4CisKKyNkZWZpbmUgRFNJX0hTVFhfQ0tMX1dDCQkweDY0
CisKKyNkZWZpbmUgRFNJX1BIWV9MQ0NPTgkJMHgxMDQKKyNkZWZpbmUgTENfSFNfVFhfRU4JCQlC
SVQoMCkKKyNkZWZpbmUgTENfVUxQTV9FTgkJCUJJVCgxKQorI2RlZmluZSBMQ19XQUtFVVBfRU4J
CQlCSVQoMikKKworI2RlZmluZSBEU0lfUEhZX0xEMENPTgkJMHgxMDgKKyNkZWZpbmUgTEQwX0hT
X1RYX0VOCQkJQklUKDApCisjZGVmaW5lIExEMF9VTFBNX0VOCQkJQklUKDEpCisjZGVmaW5lIExE
MF9XQUtFVVBfRU4JCQlCSVQoMikKKworI2RlZmluZSBEU0lfUEhZX1RJTUVDT04wCTB4MTEwCisj
ZGVmaW5lIExQWAkJCQkoMHhmZiA8PCAwKQorI2RlZmluZSBIU19QUlBSCQkJCSgweGZmIDw8IDgp
CisjZGVmaW5lIEhTX1pFUk8JCQkJKDB4ZmYgPDwgMTYpCisjZGVmaW5lIEhTX1RSQUlMCQkJKDB4
ZmYgPDwgMjQpCisKKyNkZWZpbmUgRFNJX1BIWV9USU1FQ09OMQkweDExNAorI2RlZmluZSBUQV9H
TwkJCQkoMHhmZiA8PCAwKQorI2RlZmluZSBUQV9TVVJFCQkJCSgweGZmIDw8IDgpCisjZGVmaW5l
IFRBX0dFVAkJCQkoMHhmZiA8PCAxNikKKyNkZWZpbmUgREFfSFNfRVhJVAkJCSgweGZmIDw8IDI0
KQorCisjZGVmaW5lIERTSV9QSFlfVElNRUNPTjIJMHgxMTgKKyNkZWZpbmUgQ09OVF9ERVQJCQko
MHhmZiA8PCAwKQorI2RlZmluZSBDTEtfWkVSTwkJCSgweGZmIDw8IDE2KQorI2RlZmluZSBDTEtf
VFJBSUwJCQkoMHhmZiA8PCAyNCkKKworI2RlZmluZSBEU0lfUEhZX1RJTUVDT04zCTB4MTFjCisj
ZGVmaW5lIENMS19IU19QUlBSCQkJKDB4ZmYgPDwgMCkKKyNkZWZpbmUgQ0xLX0hTX1BPU1QJCQko
MHhmZiA8PCA4KQorI2RlZmluZSBDTEtfSFNfRVhJVAkJCSgweGZmIDw8IDE2KQorCisjZGVmaW5l
IE5TX1RPX0NZQ0xFKG4sIGMpICAgICgobikgLyAoYykgKyAoKChuKSAlIChjKSkgPyAxIDogMCkp
CisKK3N0cnVjdCBwaHk7CisKK3N0cnVjdCBtdGtfZHNpIHsKKwlzdHJ1Y3QgbXRrX2RkcF9jb21w
IGRkcF9jb21wOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbWlwaV9kc2lfaG9zdCBo
b3N0OworCXN0cnVjdCBkcm1fZW5jb2RlciBlbmNvZGVyOworCXN0cnVjdCBkcm1fY29ubmVjdG9y
IGNvbm47CisJc3RydWN0IGRybV9wYW5lbCAqcGFuZWw7CisJc3RydWN0IGRybV9icmlkZ2UgKmJy
aWRnZTsKKwlzdHJ1Y3QgcGh5ICpwaHk7CisKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisKKwlzdHJ1
Y3QgY2xrICplbmdpbmVfY2xrOworCXN0cnVjdCBjbGsgKmRpZ2l0YWxfY2xrOworCXN0cnVjdCBj
bGsgKmhzX2NsazsKKworCXUzMiBkYXRhX3JhdGU7CisKKwl1bnNpZ25lZCBsb25nIG1vZGVfZmxh
Z3M7CisJZW51bSBtaXBpX2RzaV9waXhlbF9mb3JtYXQgZm9ybWF0OworCXVuc2lnbmVkIGludCBs
YW5lczsKKwlzdHJ1Y3QgdmlkZW9tb2RlIHZtOworCWludCByZWZjb3VudDsKKwlib29sIGVuYWJs
ZWQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtdGtfZHNpICplbmNvZGVyX3RvX2RzaShz
dHJ1Y3QgZHJtX2VuY29kZXIgKmUpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihlLCBzdHJ1Y3Qg
bXRrX2RzaSwgZW5jb2Rlcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG10a19kc2kgKmNv
bm5lY3Rvcl90b19kc2koc3RydWN0IGRybV9jb25uZWN0b3IgKmMpCit7CisJcmV0dXJuIGNvbnRh
aW5lcl9vZihjLCBzdHJ1Y3QgbXRrX2RzaSwgY29ubik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3Ry
dWN0IG10a19kc2kgKmhvc3RfdG9fZHNpKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpoKQoreworCXJl
dHVybiBjb250YWluZXJfb2YoaCwgc3RydWN0IG10a19kc2ksIGhvc3QpOworfQorCitzdGF0aWMg
dm9pZCBtdGtfZHNpX21hc2soc3RydWN0IG10a19kc2kgKmRzaSwgdTMyIG9mZnNldCwgdTMyIG1h
c2ssIHUzMiBkYXRhKQoreworCXUzMiB0ZW1wID0gcmVhZGwoZHNpLT5yZWdzICsgb2Zmc2V0KTsK
KworCXdyaXRlbCgodGVtcCAmIH5tYXNrKSB8IChkYXRhICYgbWFzayksIGRzaS0+cmVncyArIG9m
ZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9waHlfdGltY29uZmlnKHN0cnVjdCBtdGtfZHNp
ICpkc2kpCit7CisJdTMyIHRpbWNvbjAsIHRpbWNvbjEsIHRpbWNvbjIsIHRpbWNvbjM7CisJdW5z
aWduZWQgaW50IHVpLCBjeWNsZV90aW1lOworCXVuc2lnbmVkIGludCBscHg7CisKKwl1aSA9IDEw
MDAgLyBkc2ktPmRhdGFfcmF0ZSArIDB4MDE7CisJY3ljbGVfdGltZSA9IDgwMDAgLyBkc2ktPmRh
dGFfcmF0ZSArIDB4MDE7CisJbHB4ID0gNTsKKworCXRpbWNvbjAgPSAoOCA8PCAyNCkgfCAoMHhh
IDw8IDE2KSB8ICgweDYgPDwgOCkgfCBscHg7CisJdGltY29uMSA9ICg3IDw8IDI0KSB8ICg1ICog
bHB4IDw8IDE2KSB8ICgoMyAqIGxweCkgLyAyKSA8PCA4IHwKKwkJICAoNCAqIGxweCk7CisJdGlt
Y29uMiA9ICgoTlNfVE9fQ1lDTEUoMHg2NCwgY3ljbGVfdGltZSkgKyAweGEpIDw8IDI0KSB8CisJ
CSAgKE5TX1RPX0NZQ0xFKDB4MTUwLCBjeWNsZV90aW1lKSA8PCAxNik7CisJdGltY29uMyA9ICgy
ICogbHB4KSA8PCAxNiB8IE5TX1RPX0NZQ0xFKDgwICsgNTIgKiB1aSwgY3ljbGVfdGltZSkgPDwg
OCB8CisJCSAgIE5TX1RPX0NZQ0xFKDB4NDAsIGN5Y2xlX3RpbWUpOworCisJd3JpdGVsKHRpbWNv
bjAsIGRzaS0+cmVncyArIERTSV9QSFlfVElNRUNPTjApOworCXdyaXRlbCh0aW1jb24xLCBkc2kt
PnJlZ3MgKyBEU0lfUEhZX1RJTUVDT04xKTsKKwl3cml0ZWwodGltY29uMiwgZHNpLT5yZWdzICsg
RFNJX1BIWV9USU1FQ09OMik7CisJd3JpdGVsKHRpbWNvbjMsIGRzaS0+cmVncyArIERTSV9QSFlf
VElNRUNPTjMpOworfQorCitzdGF0aWMgdm9pZCBtdGtfZHNpX2VuYWJsZShzdHJ1Y3QgbXRrX2Rz
aSAqZHNpKQoreworCW10a19kc2lfbWFzayhkc2ksIERTSV9DT05fQ1RSTCwgRFNJX0VOLCBEU0lf
RU4pOworfQorCitzdGF0aWMgdm9pZCBtdGtfZHNpX2Rpc2FibGUoc3RydWN0IG10a19kc2kgKmRz
aSkKK3sKKwltdGtfZHNpX21hc2soZHNpLCBEU0lfQ09OX0NUUkwsIERTSV9FTiwgMCk7Cit9CisK
K3N0YXRpYyB2b2lkIG10a19kc2lfcmVzZXQoc3RydWN0IG10a19kc2kgKmRzaSkKK3sKKwltdGtf
ZHNpX21hc2soZHNpLCBEU0lfQ09OX0NUUkwsIERTSV9SRVNFVCwgRFNJX1JFU0VUKTsKKwltdGtf
ZHNpX21hc2soZHNpLCBEU0lfQ09OX0NUUkwsIERTSV9SRVNFVCwgMCk7Cit9CisKK3N0YXRpYyBp
bnQgbXRrX2RzaV9wb3dlcm9uKHN0cnVjdCBtdGtfZHNpICpkc2kpCit7CisJc3RydWN0IGRldmlj
ZSAqZGV2ID0gZHNpLT5kZXY7CisJaW50IHJldDsKKworCWlmICgrK2RzaS0+cmVmY291bnQgIT0g
MSkKKwkJcmV0dXJuIDA7CisKKwkvKioKKwkgKiBkYXRhX3JhdGUgPSAocGl4ZWxfY2xvY2sgLyAx
MDAwKSAqIHBpeGVsX2RpcHRoICogbWlwaV9yYXRpbzsKKwkgKiBwaXhlbF9jbG9jayB1bml0IGlz
IEtoeiwgZGF0YV9yYXRhIHVuaXQgaXMgTUh6LCBzbyBuZWVkIGRpdmlkZSAxMDAwLgorCSAqIG1p
cGlfcmF0aW8gaXMgbWlwaSBjbGsgY29lZmZpY2llbnQgZm9yIGJhbGFuY2UgdGhlIHBpeGVsIGNs
ayBpbiBtaXBpLgorCSAqIHdlIHNldCBtaXBpX3JhdGlvIGlzIDEuMDUuCisJICovCisJZHNpLT5k
YXRhX3JhdGUgPSBkc2ktPnZtLnBpeGVsY2xvY2sgKiAzICogMjEgLyAoMSAqIDEwMDAgKiAxMCk7
CisKKwlyZXQgPSBjbGtfc2V0X3JhdGUoZHNpLT5oc19jbGssIGRzaS0+ZGF0YV9yYXRlICogMTAw
MDAwMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IGRh
dGEgcmF0ZTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX3JlZmNvdW50OworCX0KKworCXBoeV9w
b3dlcl9vbihkc2ktPnBoeSk7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHNpLT5lbmdp
bmVfY2xrKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFi
bGUgZW5naW5lIGNsb2NrOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfcGh5X3Bvd2VyX29mZjsK
Kwl9CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHNpLT5kaWdpdGFsX2Nsayk7CisJaWYg
KHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIGRpZ2l0YWwgY2xv
Y2s6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9kaXNhYmxlX2VuZ2luZV9jbGs7CisJfQorCisJ
bXRrX2RzaV9lbmFibGUoZHNpKTsKKwltdGtfZHNpX3Jlc2V0KGRzaSk7CisJZHNpX3BoeV90aW1j
b25maWcoZHNpKTsKKworCXJldHVybiAwOworCitlcnJfZGlzYWJsZV9lbmdpbmVfY2xrOgorCWNs
a19kaXNhYmxlX3VucHJlcGFyZShkc2ktPmVuZ2luZV9jbGspOworZXJyX3BoeV9wb3dlcl9vZmY6
CisJcGh5X3Bvd2VyX29mZihkc2ktPnBoeSk7CitlcnJfcmVmY291bnQ6CisJZHNpLT5yZWZjb3Vu
dC0tOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9jbGtfdWxwX21vZGVfZW50
ZXIoc3RydWN0IG10a19kc2kgKmRzaSkKK3sKKwltdGtfZHNpX21hc2soZHNpLCBEU0lfUEhZX0xD
Q09OLCBMQ19IU19UWF9FTiwgMCk7CisJbXRrX2RzaV9tYXNrKGRzaSwgRFNJX1BIWV9MQ0NPTiwg
TENfVUxQTV9FTiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRzaV9jbGtfdWxwX21vZGVfbGVhdmUo
c3RydWN0IG10a19kc2kgKmRzaSkKK3sKKwltdGtfZHNpX21hc2soZHNpLCBEU0lfUEhZX0xDQ09O
LCBMQ19VTFBNX0VOLCAwKTsKKwltdGtfZHNpX21hc2soZHNpLCBEU0lfUEhZX0xDQ09OLCBMQ19X
QUtFVVBfRU4sIExDX1dBS0VVUF9FTik7CisJbXRrX2RzaV9tYXNrKGRzaSwgRFNJX1BIWV9MQ0NP
TiwgTENfV0FLRVVQX0VOLCAwKTsKK30KKworc3RhdGljIHZvaWQgZHNpX2xhbmUwX3VscF9tb2Rl
X2VudGVyKHN0cnVjdCBtdGtfZHNpICpkc2kpCit7CisJbXRrX2RzaV9tYXNrKGRzaSwgRFNJX1BI
WV9MRDBDT04sIExEMF9IU19UWF9FTiwgMCk7CisJbXRrX2RzaV9tYXNrKGRzaSwgRFNJX1BIWV9M
RDBDT04sIExEMF9VTFBNX0VOLCAwKTsKK30KKworc3RhdGljIHZvaWQgZHNpX2xhbmUwX3VscF9t
b2RlX2xlYXZlKHN0cnVjdCBtdGtfZHNpICpkc2kpCit7CisJbXRrX2RzaV9tYXNrKGRzaSwgRFNJ
X1BIWV9MRDBDT04sIExEMF9VTFBNX0VOLCAwKTsKKwltdGtfZHNpX21hc2soZHNpLCBEU0lfUEhZ
X0xEMENPTiwgTEQwX1dBS0VVUF9FTiwgTEQwX1dBS0VVUF9FTik7CisJbXRrX2RzaV9tYXNrKGRz
aSwgRFNJX1BIWV9MRDBDT04sIExEMF9XQUtFVVBfRU4sIDApOworfQorCitzdGF0aWMgYm9vbCBk
c2lfY2xrX2hzX3N0YXRlKHN0cnVjdCBtdGtfZHNpICpkc2kpCit7CisJdTMyIHRtcF9yZWcxOwor
CisJdG1wX3JlZzEgPSByZWFkbChkc2ktPnJlZ3MgKyBEU0lfUEhZX0xDQ09OKTsKKwlyZXR1cm4g
KCh0bXBfcmVnMSAmIExDX0hTX1RYX0VOKSA9PSAxKSA/IHRydWUgOiBmYWxzZTsKK30KKworc3Rh
dGljIHZvaWQgZHNpX2Nsa19oc19tb2RlKHN0cnVjdCBtdGtfZHNpICpkc2ksIGJvb2wgZW50ZXIp
Cit7CisJaWYgKGVudGVyICYmICFkc2lfY2xrX2hzX3N0YXRlKGRzaSkpCisJCW10a19kc2lfbWFz
ayhkc2ksIERTSV9QSFlfTENDT04sIExDX0hTX1RYX0VOLCBMQ19IU19UWF9FTik7CisJZWxzZSBp
ZiAoIWVudGVyICYmIGRzaV9jbGtfaHNfc3RhdGUoZHNpKSkKKwkJbXRrX2RzaV9tYXNrKGRzaSwg
RFNJX1BIWV9MQ0NPTiwgTENfSFNfVFhfRU4sIDApOworfQorCitzdGF0aWMgdm9pZCBkc2lfc2V0
X21vZGUoc3RydWN0IG10a19kc2kgKmRzaSkKK3sKKwl1MzIgdmlkX21vZGUgPSBDTURfTU9ERTsK
KworCWlmIChkc2ktPm1vZGVfZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPKSB7CisJCXZpZF9t
b2RlID0gU1lOQ19QVUxTRV9NT0RFOworCisJCWlmICgoZHNpLT5tb2RlX2ZsYWdzICYgTUlQSV9E
U0lfTU9ERV9WSURFT19CVVJTVCkgJiYKKwkJICAgICEoZHNpLT5tb2RlX2ZsYWdzICYgTUlQSV9E
U0lfTU9ERV9WSURFT19TWU5DX1BVTFNFKSkKKwkJCXZpZF9tb2RlID0gQlVSU1RfTU9ERTsKKwl9
CisKKwl3cml0ZWwodmlkX21vZGUsIGRzaS0+cmVncyArIERTSV9NT0RFX0NUUkwpOworfQorCitz
dGF0aWMgdm9pZCBkc2lfcHNfY29udHJvbF92YWN0KHN0cnVjdCBtdGtfZHNpICpkc2kpCit7CisJ
c3RydWN0IHZpZGVvbW9kZSAqdm0gPSAmZHNpLT52bTsKKwl1MzIgZHNpX2J1Zl9icHAsIHBzX3dj
OworCXUzMiBwc19icHBfbW9kZTsKKworCWlmIChkc2ktPmZvcm1hdCA9PSBNSVBJX0RTSV9GTVRf
UkdCNTY1KQorCQlkc2lfYnVmX2JwcCA9IDI7CisJZWxzZQorCQlkc2lfYnVmX2JwcCA9IDM7CisK
Kwlwc193YyA9IHZtLT5oYWN0aXZlICogZHNpX2J1Zl9icHA7CisJcHNfYnBwX21vZGUgPSBwc193
YzsKKworCXN3aXRjaCAoZHNpLT5mb3JtYXQpIHsKKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I4ODg6
CisJCXBzX2JwcF9tb2RlIHw9IFBBQ0tFRF9QU18yNEJJVF9SR0I4ODg7CisJCWJyZWFrOworCWNh
c2UgTUlQSV9EU0lfRk1UX1JHQjY2NjoKKwkJcHNfYnBwX21vZGUgfD0gUEFDS0VEX1BTXzE4QklU
X1JHQjY2NjsKKwkJYnJlYWs7CisJY2FzZSBNSVBJX0RTSV9GTVRfUkdCNjY2X1BBQ0tFRDoKKwkJ
cHNfYnBwX21vZGUgfD0gTE9PU0VMWV9QU18xOEJJVF9SR0I2NjY7CisJCWJyZWFrOworCWNhc2Ug
TUlQSV9EU0lfRk1UX1JHQjU2NToKKwkJcHNfYnBwX21vZGUgfD0gUEFDS0VEX1BTXzE2QklUX1JH
QjU2NTsKKwkJYnJlYWs7CisJfQorCisJd3JpdGVsKHZtLT52YWN0aXZlLCBkc2ktPnJlZ3MgKyBE
U0lfVkFDVF9OTCk7CisJd3JpdGVsKHBzX2JwcF9tb2RlLCBkc2ktPnJlZ3MgKyBEU0lfUFNDVFJM
KTsKKwl3cml0ZWwocHNfd2MsIGRzaS0+cmVncyArIERTSV9IU1RYX0NLTF9XQyk7Cit9CisKK3N0
YXRpYyB2b2lkIGRzaV9yeHR4X2NvbnRyb2woc3RydWN0IG10a19kc2kgKmRzaSkKK3sKKwl1MzIg
dG1wX3JlZzsKKworCXN3aXRjaCAoZHNpLT5sYW5lcykgeworCWNhc2UgMToKKwkJdG1wX3JlZyA9
IDEgPDwgMjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl0bXBfcmVnID0gMyA8PCAyOworCQlicmVh
azsKKwljYXNlIDM6CisJCXRtcF9yZWcgPSA3IDw8IDI7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJ
dG1wX3JlZyA9IDB4ZiA8PCAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0bXBfcmVnID0gMHhm
IDw8IDI7CisJCWJyZWFrOworCX0KKworCXdyaXRlbCh0bXBfcmVnLCBkc2ktPnJlZ3MgKyBEU0lf
VFhSWF9DVFJMKTsKK30KKworc3RhdGljIHZvaWQgZHNpX3BzX2NvbnRyb2woc3RydWN0IG10a19k
c2kgKmRzaSkKK3sKKwl1bnNpZ25lZCBpbnQgZHNpX3RtcF9idWZfYnBwOworCXUzMiB0bXBfcmVn
OworCisJc3dpdGNoIChkc2ktPmZvcm1hdCkgeworCWNhc2UgTUlQSV9EU0lfRk1UX1JHQjg4ODoK
KwkJdG1wX3JlZyA9IFBBQ0tFRF9QU18yNEJJVF9SR0I4ODg7CisJCWRzaV90bXBfYnVmX2JwcCA9
IDM7CisJCWJyZWFrOworCWNhc2UgTUlQSV9EU0lfRk1UX1JHQjY2NjoKKwkJdG1wX3JlZyA9IExP
T1NFTFlfUFNfMThCSVRfUkdCNjY2OworCQlkc2lfdG1wX2J1Zl9icHAgPSAzOworCQlicmVhazsK
KwljYXNlIE1JUElfRFNJX0ZNVF9SR0I2NjZfUEFDS0VEOgorCQl0bXBfcmVnID0gUEFDS0VEX1BT
XzE4QklUX1JHQjY2NjsKKwkJZHNpX3RtcF9idWZfYnBwID0gMzsKKwkJYnJlYWs7CisJY2FzZSBN
SVBJX0RTSV9GTVRfUkdCNTY1OgorCQl0bXBfcmVnID0gUEFDS0VEX1BTXzE2QklUX1JHQjU2NTsK
KwkJZHNpX3RtcF9idWZfYnBwID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdG1wX3JlZyA9
IFBBQ0tFRF9QU18yNEJJVF9SR0I4ODg7CisJCWRzaV90bXBfYnVmX2JwcCA9IDM7CisJCWJyZWFr
OworCX0KKworCXRtcF9yZWcgKz0gZHNpLT52bS5oYWN0aXZlICogZHNpX3RtcF9idWZfYnBwICYg
RFNJX1BTX1dDOworCXdyaXRlbCh0bXBfcmVnLCBkc2ktPnJlZ3MgKyBEU0lfUFNDVFJMKTsKK30K
Kworc3RhdGljIHZvaWQgZHNpX2NvbmZpZ192ZG9fdGltaW5nKHN0cnVjdCBtdGtfZHNpICpkc2kp
Cit7CisJdW5zaWduZWQgaW50IGhvcml6b250YWxfc3luY19hY3RpdmVfYnl0ZTsKKwl1bnNpZ25l
ZCBpbnQgaG9yaXpvbnRhbF9iYWNrcG9yY2hfYnl0ZTsKKwl1bnNpZ25lZCBpbnQgaG9yaXpvbnRh
bF9mcm9udHBvcmNoX2J5dGU7CisJdW5zaWduZWQgaW50IGRzaV90bXBfYnVmX2JwcDsKKworCXN0
cnVjdCB2aWRlb21vZGUgKnZtID0gJmRzaS0+dm07CisKKwlpZiAoZHNpLT5mb3JtYXQgPT0gTUlQ
SV9EU0lfRk1UX1JHQjU2NSkKKwkJZHNpX3RtcF9idWZfYnBwID0gMjsKKwllbHNlCisJCWRzaV90
bXBfYnVmX2JwcCA9IDM7CisKKwl3cml0ZWwodm0tPnZzeW5jX2xlbiwgZHNpLT5yZWdzICsgRFNJ
X1ZTQV9OTCk7CisJd3JpdGVsKHZtLT52YmFja19wb3JjaCwgZHNpLT5yZWdzICsgRFNJX1ZCUF9O
TCk7CisJd3JpdGVsKHZtLT52ZnJvbnRfcG9yY2gsIGRzaS0+cmVncyArIERTSV9WRlBfTkwpOwor
CXdyaXRlbCh2bS0+dmFjdGl2ZSwgZHNpLT5yZWdzICsgRFNJX1ZBQ1RfTkwpOworCisJaG9yaXpv
bnRhbF9zeW5jX2FjdGl2ZV9ieXRlID0gKHZtLT5oc3luY19sZW4gKiBkc2lfdG1wX2J1Zl9icHAg
LSAxMCk7CisKKwlpZiAoZHNpLT5tb2RlX2ZsYWdzICYgTUlQSV9EU0lfTU9ERV9WSURFT19TWU5D
X1BVTFNFKQorCQlob3Jpem9udGFsX2JhY2twb3JjaF9ieXRlID0KKwkJCSh2bS0+aGJhY2tfcG9y
Y2ggKiBkc2lfdG1wX2J1Zl9icHAgLSAxMCk7CisJZWxzZQorCQlob3Jpem9udGFsX2JhY2twb3Jj
aF9ieXRlID0gKCh2bS0+aGJhY2tfcG9yY2ggKyB2bS0+aHN5bmNfbGVuKSAqCisJCQlkc2lfdG1w
X2J1Zl9icHAgLSAxMCk7CisKKwlob3Jpem9udGFsX2Zyb250cG9yY2hfYnl0ZSA9ICh2bS0+aGZy
b250X3BvcmNoICogZHNpX3RtcF9idWZfYnBwIC0gMTIpOworCisJd3JpdGVsKGhvcml6b250YWxf
c3luY19hY3RpdmVfYnl0ZSwgZHNpLT5yZWdzICsgRFNJX0hTQV9XQyk7CisJd3JpdGVsKGhvcml6
b250YWxfYmFja3BvcmNoX2J5dGUsIGRzaS0+cmVncyArIERTSV9IQlBfV0MpOworCXdyaXRlbCho
b3Jpem9udGFsX2Zyb250cG9yY2hfYnl0ZSwgZHNpLT5yZWdzICsgRFNJX0hGUF9XQyk7CisKKwlk
c2lfcHNfY29udHJvbChkc2kpOworfQorCitzdGF0aWMgdm9pZCBtdGtfZHNpX3N0YXJ0KHN0cnVj
dCBtdGtfZHNpICpkc2kpCit7CisJd3JpdGVsKDAsIGRzaS0+cmVncyArIERTSV9TVEFSVCk7CisJ
d3JpdGVsKDEsIGRzaS0+cmVncyArIERTSV9TVEFSVCk7Cit9CisKK3N0YXRpYyB2b2lkIG10a19k
c2lfcG93ZXJvZmYoc3RydWN0IG10a19kc2kgKmRzaSkKK3sKKwlpZiAoV0FSTl9PTihkc2ktPnJl
ZmNvdW50ID09IDApKQorCQlyZXR1cm47CisKKwlpZiAoLS1kc2ktPnJlZmNvdW50ICE9IDApCisJ
CXJldHVybjsKKworCWRzaV9sYW5lMF91bHBfbW9kZV9lbnRlcihkc2kpOworCWRzaV9jbGtfdWxw
X21vZGVfZW50ZXIoZHNpKTsKKworCW10a19kc2lfZGlzYWJsZShkc2kpOworCisJY2xrX2Rpc2Fi
bGVfdW5wcmVwYXJlKGRzaS0+ZW5naW5lX2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRz
aS0+ZGlnaXRhbF9jbGspOworCisJcGh5X3Bvd2VyX29mZihkc2ktPnBoeSk7Cit9CisKK3N0YXRp
YyB2b2lkIG10a19vdXRwdXRfZHNpX2VuYWJsZShzdHJ1Y3QgbXRrX2RzaSAqZHNpKQoreworCWlu
dCByZXQ7CisKKwlpZiAoZHNpLT5lbmFibGVkKQorCQlyZXR1cm47CisKKwlpZiAoZHNpLT5wYW5l
bCkgeworCQlpZiAoZHJtX3BhbmVsX3ByZXBhcmUoZHNpLT5wYW5lbCkpIHsKKwkJCURSTV9FUlJP
UigiZmFpbGVkIHRvIHNldHVwIHRoZSBwYW5lbFxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisK
KwlyZXQgPSBtdGtfZHNpX3Bvd2Vyb24oZHNpKTsKKwlpZiAocmV0IDwgMCkgeworCQlEUk1fRVJS
T1IoImZhaWxlZCB0byBwb3dlciBvbiBkc2lcbiIpOworCQlyZXR1cm47CisJfQorCisJZHNpX3J4
dHhfY29udHJvbChkc2kpOworCisJZHNpX2Nsa191bHBfbW9kZV9sZWF2ZShkc2kpOworCWRzaV9s
YW5lMF91bHBfbW9kZV9sZWF2ZShkc2kpOworCWRzaV9jbGtfaHNfbW9kZShkc2ksIDApOworCWRz
aV9zZXRfbW9kZShkc2kpOworCisJZHNpX3BzX2NvbnRyb2xfdmFjdChkc2kpOworCWRzaV9jb25m
aWdfdmRvX3RpbWluZyhkc2kpOworCisJZHNpX3NldF9tb2RlKGRzaSk7CisJZHNpX2Nsa19oc19t
b2RlKGRzaSwgMSk7CisKKwltdGtfZHNpX3N0YXJ0KGRzaSk7CisKKwlkc2ktPmVuYWJsZWQgPSB0
cnVlOworfQorCitzdGF0aWMgdm9pZCBtdGtfb3V0cHV0X2RzaV9kaXNhYmxlKHN0cnVjdCBtdGtf
ZHNpICpkc2kpCit7CisJaWYgKCFkc2ktPmVuYWJsZWQpCisJCXJldHVybjsKKworCWlmIChkc2kt
PnBhbmVsKSB7CisJCWlmIChkcm1fcGFuZWxfZGlzYWJsZShkc2ktPnBhbmVsKSkgeworCQkJRFJN
X0VSUk9SKCJmYWlsZWQgdG8gZGlzYWJsZSB0aGUgcGFuZWxcbiIpOworCQkJcmV0dXJuOworCQl9
CisJfQorCisJbXRrX2RzaV9wb3dlcm9mZihkc2kpOworCisJZHNpLT5lbmFibGVkID0gZmFsc2U7
Cit9CisKK3N0YXRpYyB2b2lkIG10a19kc2lfZW5jb2Rlcl9kZXN0cm95KHN0cnVjdCBkcm1fZW5j
b2RlciAqZW5jb2RlcikKK3sKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworfQorCitz
dGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2Z1bmNzIG10a19kc2lfZW5jb2Rlcl9mdW5j
cyA9IHsKKwkuZGVzdHJveSA9IG10a19kc2lfZW5jb2Rlcl9kZXN0cm95LAorfTsKKworc3RhdGlj
IGJvb2wgbXRrX2RzaV9lbmNvZGVyX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNv
ZGVyLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJ
CQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJcmV0
dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIG10a19kc2lfZW5jb2Rlcl9tb2RlX3NldChzdHJ1
Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9k
ZSAqbW9kZSwKKwkJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZCkKK3sK
KwlzdHJ1Y3QgbXRrX2RzaSAqZHNpID0gZW5jb2Rlcl90b19kc2koZW5jb2Rlcik7CisKKwlkc2kt
PnZtLnBpeGVsY2xvY2sgPSBhZGp1c3RlZC0+Y2xvY2s7CisJZHNpLT52bS5oYWN0aXZlID0gYWRq
dXN0ZWQtPmhkaXNwbGF5OworCWRzaS0+dm0uaGJhY2tfcG9yY2ggPSBhZGp1c3RlZC0+aHRvdGFs
IC0gYWRqdXN0ZWQtPmhzeW5jX2VuZDsKKwlkc2ktPnZtLmhmcm9udF9wb3JjaCA9IGFkanVzdGVk
LT5oc3luY19zdGFydCAtIGFkanVzdGVkLT5oZGlzcGxheTsKKwlkc2ktPnZtLmhzeW5jX2xlbiA9
IGFkanVzdGVkLT5oc3luY19lbmQgLSBhZGp1c3RlZC0+aHN5bmNfc3RhcnQ7CisKKwlkc2ktPnZt
LnZhY3RpdmUgPSBhZGp1c3RlZC0+dmRpc3BsYXk7CisJZHNpLT52bS52YmFja19wb3JjaCA9IGFk
anVzdGVkLT52dG90YWwgLSBhZGp1c3RlZC0+dnN5bmNfZW5kOworCWRzaS0+dm0udmZyb250X3Bv
cmNoID0gYWRqdXN0ZWQtPnZzeW5jX3N0YXJ0IC0gYWRqdXN0ZWQtPnZkaXNwbGF5OworCWRzaS0+
dm0udnN5bmNfbGVuID0gYWRqdXN0ZWQtPnZzeW5jX2VuZCAtIGFkanVzdGVkLT52c3luY19zdGFy
dDsKK30KKworc3RhdGljIHZvaWQgbXRrX2RzaV9lbmNvZGVyX2Rpc2FibGUoc3RydWN0IGRybV9l
bmNvZGVyICplbmNvZGVyKQoreworCXN0cnVjdCBtdGtfZHNpICpkc2kgPSBlbmNvZGVyX3RvX2Rz
aShlbmNvZGVyKTsKKworCW10a19vdXRwdXRfZHNpX2Rpc2FibGUoZHNpKTsKK30KKworc3RhdGlj
IHZvaWQgbXRrX2RzaV9lbmNvZGVyX2VuYWJsZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIp
Cit7CisJc3RydWN0IG10a19kc2kgKmRzaSA9IGVuY29kZXJfdG9fZHNpKGVuY29kZXIpOworCisJ
bXRrX291dHB1dF9kc2lfZW5hYmxlKGRzaSk7Cit9CisKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0
b3Jfc3RhdHVzIG10a19kc2lfY29ubmVjdG9yX2RldGVjdCgKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rv
ciAqY29ubmVjdG9yLCBib29sIGZvcmNlKQoreworCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Nv
bm5lY3RlZDsKK30KKworc3RhdGljIHZvaWQgbXRrX2RzaV9jb25uZWN0b3JfZGVzdHJveShzdHJ1
Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCWRybV9jb25uZWN0b3JfdW5yZWdpc3Rl
cihjb25uZWN0b3IpOworCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOworfQorCitz
dGF0aWMgaW50IG10a19kc2lfY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3Rv
ciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBtdGtfZHNpICpkc2kgPSBjb25uZWN0b3JfdG9fZHNp
KGNvbm5lY3Rvcik7CisKKwlyZXR1cm4gZHJtX3BhbmVsX2dldF9tb2Rlcyhkc2ktPnBhbmVsKTsK
K30KKworc3RhdGljIHN0cnVjdCBkcm1fZW5jb2RlciAqbXRrX2RzaV9jb25uZWN0b3JfYmVzdF9l
bmNvZGVyKAorCQlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBt
dGtfZHNpICpkc2kgPSBjb25uZWN0b3JfdG9fZHNpKGNvbm5lY3Rvcik7CisKKwlyZXR1cm4gJmRz
aS0+ZW5jb2RlcjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJf
ZnVuY3MgbXRrX2RzaV9lbmNvZGVyX2hlbHBlcl9mdW5jcyA9IHsKKwkubW9kZV9maXh1cCA9IG10
a19kc2lfZW5jb2Rlcl9tb2RlX2ZpeHVwLAorCS5tb2RlX3NldCA9IG10a19kc2lfZW5jb2Rlcl9t
b2RlX3NldCwKKwkuZGlzYWJsZSA9IG10a19kc2lfZW5jb2Rlcl9kaXNhYmxlLAorCS5lbmFibGUg
PSBtdGtfZHNpX2VuY29kZXJfZW5hYmxlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1f
Y29ubmVjdG9yX2Z1bmNzIG10a19kc2lfY29ubmVjdG9yX2Z1bmNzID0geworCS5kcG1zID0gZHJt
X2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2RwbXMsCisJLmRldGVjdCA9IG10a19kc2lfY29ubmVj
dG9yX2RldGVjdCwKKwkuZmlsbF9tb2RlcyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5l
Y3Rvcl9tb2RlcywKKwkuZGVzdHJveSA9IG10a19kc2lfY29ubmVjdG9yX2Rlc3Ryb3ksCisJLnJl
c2V0ID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX3Jlc2V0LAorCS5hdG9taWNfZHVwbGlj
YXRlX3N0YXRlID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2R1cGxpY2F0ZV9zdGF0ZSwK
KwkuYXRvbWljX2Rlc3Ryb3lfc3RhdGUgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZGVz
dHJveV9zdGF0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxw
ZXJfZnVuY3MKKwltdGtfZHNpX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7CisJLmdldF9tb2Rl
cyA9IG10a19kc2lfY29ubmVjdG9yX2dldF9tb2RlcywKKwkuYmVzdF9lbmNvZGVyID0gbXRrX2Rz
aV9jb25uZWN0b3JfYmVzdF9lbmNvZGVyLAorfTsKKworc3RhdGljIGludCBtdGtfZHJtX2F0dGFj
aF9icmlkZ2Uoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSwKKwkJCQkgc3RydWN0IGRybV9lbmNv
ZGVyICplbmNvZGVyKQoreworCWludCByZXQ7CisKKwlpZiAoIWJyaWRnZSkKKwkJcmV0dXJuIC1F
Tk9FTlQ7CisKKwllbmNvZGVyLT5icmlkZ2UgPSBicmlkZ2U7CisJYnJpZGdlLT5lbmNvZGVyID0g
ZW5jb2RlcjsKKwlyZXQgPSBkcm1fYnJpZGdlX2F0dGFjaChlbmNvZGVyLT5kZXYsIGJyaWRnZSk7
CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBhdHRhY2ggYnJpZGdlIHRvIGRy
bVxuIik7CisJCWVuY29kZXItPmJyaWRnZSA9IE5VTEw7CisJCWJyaWRnZS0+ZW5jb2RlciA9IE5V
TEw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdGtfZHNpX2NyZWF0ZV9j
b25uZWN0b3Ioc3RydWN0IGRybV9kZXZpY2UgKmRybSwgc3RydWN0IG10a19kc2kgKmRzaSkKK3sK
KwlpbnQgcmV0OworCisJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9pbml0KGRybSwgJmRzaS0+Y29ubiwg
Jm10a19kc2lfY29ubmVjdG9yX2Z1bmNzLAorCQkJCSBEUk1fTU9ERV9DT05ORUNUT1JfRFNJKTsK
KwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiRmFpbGVkIHRvIGNvbm5lY3RvciBpbml0IHRvIGRy
bVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKCZk
c2ktPmNvbm4sICZtdGtfZHNpX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCisJcmV0ID0gZHJt
X2Nvbm5lY3Rvcl9yZWdpc3RlcigmZHNpLT5jb25uKTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJP
UigiRmFpbGVkIHRvIGNvbm5lY3RvciByZWdpc3RlciB0byBkcm1cbiIpOworCQlnb3RvIGVycl9j
b25uZWN0b3JfY2xlYW51cDsKKwl9CisKKwlkc2ktPmNvbm4uZHBtcyA9IERSTV9NT0RFX0RQTVNf
T0ZGOworCWRybV9tb2RlX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcigmZHNpLT5jb25uLCAmZHNp
LT5lbmNvZGVyKTsKKworCWlmIChkc2ktPnBhbmVsKSB7CisJCXJldCA9IGRybV9wYW5lbF9hdHRh
Y2goZHNpLT5wYW5lbCwgJmRzaS0+Y29ubik7CisJCWlmIChyZXQpIHsKKwkJCURSTV9FUlJPUigi
RmFpbGVkIHRvIGF0dGFjaCBwYW5lbCB0byBkcm1cbiIpOworCQkJZ290byBlcnJfY29ubmVjdG9y
X3VucmVnaXN0ZXI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2Nvbm5lY3Rvcl91bnJl
Z2lzdGVyOgorCWRybV9jb25uZWN0b3JfdW5yZWdpc3RlcigmZHNpLT5jb25uKTsKK2Vycl9jb25u
ZWN0b3JfY2xlYW51cDoKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAoJmRzaS0+Y29ubik7CisJcmV0
dXJuIHJldDsKK30KKworc3RhdGljIGludCBtdGtfZHNpX2NyZWF0ZV9jb25uX2VuYyhzdHJ1Y3Qg
ZHJtX2RldmljZSAqZHJtLCBzdHJ1Y3QgbXRrX2RzaSAqZHNpKQoreworCWludCByZXQ7CisKKwly
ZXQgPSBkcm1fZW5jb2Rlcl9pbml0KGRybSwgJmRzaS0+ZW5jb2RlciwgJm10a19kc2lfZW5jb2Rl
cl9mdW5jcywKKwkJCSAgICAgICBEUk1fTU9ERV9FTkNPREVSX0RTSSwgTlVMTCk7CisJaWYgKHJl
dCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBlbmNvZGVyIGluaXQgdG8gZHJtXG4iKTsKKwkJ
cmV0dXJuIHJldDsKKwl9CisJZHJtX2VuY29kZXJfaGVscGVyX2FkZCgmZHNpLT5lbmNvZGVyLCAm
bXRrX2RzaV9lbmNvZGVyX2hlbHBlcl9mdW5jcyk7CisKKwkvKgorCSAqIEN1cnJlbnRseSBkaXNw
bGF5IGRhdGEgcGF0aHMgYXJlIHN0YXRpY2FsbHkgYXNzaWduZWQgdG8gYSBjcnRjIGVhY2guCisJ
ICogY3J0YyAwIGlzIE9WTDAgLT4gQ09MT1IwIC0+IEFBTCAtPiBPRCAtPiBSRE1BMCAtPiBVRk9F
IC0+IERTSTAKKwkgKi8KKwlkc2ktPmVuY29kZXIucG9zc2libGVfY3J0Y3MgPSAxOworCisJLyog
SWYgdGhlcmUncyBhIGJyaWRnZSwgYXR0YWNoIHRvIGl0IGFuZCBsZXQgaXQgY3JlYXRlIHRoZSBj
b25uZWN0b3IgKi8KKwlyZXQgPSBtdGtfZHJtX2F0dGFjaF9icmlkZ2UoZHNpLT5icmlkZ2UsICZk
c2ktPmVuY29kZXIpOworCWlmIChyZXQpIHsKKwkJLyogT3RoZXJ3aXNlIGNyZWF0ZSBvdXIgb3du
IGNvbm5lY3RvciBhbmQgYXR0YWNoIHRvIGEgcGFuZWwgKi8KKwkJcmV0ID0gbXRrX2RzaV9jcmVh
dGVfY29ubmVjdG9yKGRybSwgZHNpKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2VuY29kZXJf
Y2xlYW51cDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2VuY29kZXJfY2xlYW51cDoKKwlkcm1f
ZW5jb2Rlcl9jbGVhbnVwKCZkc2ktPmVuY29kZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRp
YyB2b2lkIG10a19kc2lfZGVzdHJveV9jb25uX2VuYyhzdHJ1Y3QgbXRrX2RzaSAqZHNpKQorewor
CWRybV9lbmNvZGVyX2NsZWFudXAoJmRzaS0+ZW5jb2Rlcik7CisJLyogU2tpcCBjb25uZWN0b3Ig
Y2xlYW51cCBpZiBjcmVhdGlvbiB3YXMgZGVsZWdhdGVkIHRvIHRoZSBicmlkZ2UgKi8KKwlpZiAo
ZHNpLT5jb25uLmRldikgeworCQlkcm1fY29ubmVjdG9yX3VucmVnaXN0ZXIoJmRzaS0+Y29ubik7
CisJCWRybV9jb25uZWN0b3JfY2xlYW51cCgmZHNpLT5jb25uKTsKKwl9Cit9CisKK3N0YXRpYyB2
b2lkIG10a19kc2lfZGRwX3N0YXJ0KHN0cnVjdCBtdGtfZGRwX2NvbXAgKmNvbXApCit7CisJc3Ry
dWN0IG10a19kc2kgKmRzaSA9IGNvbnRhaW5lcl9vZihjb21wLCBzdHJ1Y3QgbXRrX2RzaSwgZGRw
X2NvbXApOworCisJbXRrX2RzaV9wb3dlcm9uKGRzaSk7Cit9CisKK3N0YXRpYyB2b2lkIG10a19k
c2lfZGRwX3N0b3Aoc3RydWN0IG10a19kZHBfY29tcCAqY29tcCkKK3sKKwlzdHJ1Y3QgbXRrX2Rz
aSAqZHNpID0gY29udGFpbmVyX29mKGNvbXAsIHN0cnVjdCBtdGtfZHNpLCBkZHBfY29tcCk7CisK
KwltdGtfZHNpX3Bvd2Vyb2ZmKGRzaSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2Rk
cF9jb21wX2Z1bmNzIG10a19kc2lfZnVuY3MgPSB7CisJLnN0YXJ0ID0gbXRrX2RzaV9kZHBfc3Rh
cnQsCisJLnN0b3AgPSBtdGtfZHNpX2RkcF9zdG9wLAorfTsKKworc3RhdGljIGludCBtdGtfZHNp
X2hvc3RfYXR0YWNoKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAorCQkJICAgICAgIHN0cnVj
dCBtaXBpX2RzaV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbXRrX2RzaSAqZHNpID0gaG9z
dF90b19kc2koaG9zdCk7CisKKwlkc2ktPmxhbmVzID0gZGV2aWNlLT5sYW5lczsKKwlkc2ktPmZv
cm1hdCA9IGRldmljZS0+Zm9ybWF0OworCWRzaS0+bW9kZV9mbGFncyA9IGRldmljZS0+bW9kZV9m
bGFnczsKKworCWlmIChkc2ktPmNvbm4uZGV2KQorCQlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQo
ZHNpLT5jb25uLmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdGtfZHNpX2hv
c3RfZGV0YWNoKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAorCQkJICAgICAgIHN0cnVjdCBt
aXBpX2RzaV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgbXRrX2RzaSAqZHNpID0gaG9zdF90
b19kc2koaG9zdCk7CisKKwlpZiAoZHNpLT5jb25uLmRldikKKwkJZHJtX2hlbHBlcl9ocGRfaXJx
X2V2ZW50KGRzaS0+Y29ubi5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBz
dHJ1Y3QgbWlwaV9kc2lfaG9zdF9vcHMgbXRrX2RzaV9vcHMgPSB7CisJLmF0dGFjaCA9IG10a19k
c2lfaG9zdF9hdHRhY2gsCisJLmRldGFjaCA9IG10a19kc2lfaG9zdF9kZXRhY2gsCit9OworCitz
dGF0aWMgaW50IG10a19kc2lfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2Ug
Km1hc3Rlciwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkcm1fZGV2aWNlICpk
cm0gPSBkYXRhOworCXN0cnVjdCBtdGtfZHNpICpkc2kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsK
KworCXJldCA9IG10a19kZHBfY29tcF9yZWdpc3Rlcihkcm0sICZkc2ktPmRkcF9jb21wKTsKKwlp
ZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciBjb21wb25l
bnQgJXM6ICVkXG4iLAorCQkJZGV2LT5vZl9ub2RlLT5mdWxsX25hbWUsIHJldCk7CisJCXJldHVy
biByZXQ7CisJfQorCisJcmV0ID0gbWlwaV9kc2lfaG9zdF9yZWdpc3RlcigmZHNpLT5ob3N0KTsK
KwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciBEU0kg
aG9zdDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2RkcF9jb21wX3VucmVnaXN0ZXI7CisJfQor
CisJcmV0ID0gbXRrX2RzaV9jcmVhdGVfY29ubl9lbmMoZHJtLCBkc2kpOworCWlmIChyZXQpIHsK
KwkJRFJNX0VSUk9SKCJFbmNvZGVyIGNyZWF0ZSBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKKwkJ
Z290byBlcnJfdW5yZWdpc3RlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3VucmVnaXN0ZXI6
CisJbWlwaV9kc2lfaG9zdF91bnJlZ2lzdGVyKCZkc2ktPmhvc3QpOworZXJyX2RkcF9jb21wX3Vu
cmVnaXN0ZXI6CisJbXRrX2RkcF9jb21wX3VucmVnaXN0ZXIoZHJtLCAmZHNpLT5kZHBfY29tcCk7
CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXRrX2RzaV91bmJpbmQoc3RydWN0IGRl
dmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCisJCQkgICB2b2lkICpkYXRhKQorewor
CXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkYXRhOworCXN0cnVjdCBtdGtfZHNpICpkc2kgPSBk
ZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCW10a19kc2lfZGVzdHJveV9jb25uX2VuYyhkc2kpOwor
CW1pcGlfZHNpX2hvc3RfdW5yZWdpc3RlcigmZHNpLT5ob3N0KTsKKwltdGtfZGRwX2NvbXBfdW5y
ZWdpc3Rlcihkcm0sICZkc2ktPmRkcF9jb21wKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBj
b21wb25lbnRfb3BzIG10a19kc2lfY29tcG9uZW50X29wcyA9IHsKKwkuYmluZCA9IG10a19kc2lf
YmluZCwKKwkudW5iaW5kID0gbXRrX2RzaV91bmJpbmQsCit9OworCitzdGF0aWMgaW50IG10a19k
c2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXRrX2Rz
aSAqZHNpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRldmlj
ZV9ub2RlICpyZW1vdGVfbm9kZSwgKmVuZHBvaW50OworCXN0cnVjdCByZXNvdXJjZSAqcmVnczsK
KwlpbnQgY29tcF9pZDsKKwlpbnQgcmV0OworCisJZHNpID0gZGV2bV9remFsbG9jKGRldiwgc2l6
ZW9mKCpkc2kpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRzaSkKKwkJcmV0dXJuIC1FTk9NRU07CisK
Kwlkc2ktPmhvc3Qub3BzID0gJm10a19kc2lfb3BzOworCWRzaS0+aG9zdC5kZXYgPSBkZXY7CisK
KwllbmRwb2ludCA9IG9mX2dyYXBoX2dldF9uZXh0X2VuZHBvaW50KGRldi0+b2Zfbm9kZSwgTlVM
TCk7CisJaWYgKGVuZHBvaW50KSB7CisJCXJlbW90ZV9ub2RlID0gb2ZfZ3JhcGhfZ2V0X3JlbW90
ZV9wb3J0X3BhcmVudChlbmRwb2ludCk7CisJCWlmICghcmVtb3RlX25vZGUpIHsKKwkJCWRldl9l
cnIoZGV2LCAiTm8gcGFuZWwgY29ubmVjdGVkXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9
CisKKwkJZHNpLT5icmlkZ2UgPSBvZl9kcm1fZmluZF9icmlkZ2UocmVtb3RlX25vZGUpOworCQlk
c2ktPnBhbmVsID0gb2ZfZHJtX2ZpbmRfcGFuZWwocmVtb3RlX25vZGUpOworCQlvZl9ub2RlX3B1
dChyZW1vdGVfbm9kZSk7CisJCWlmICghZHNpLT5icmlkZ2UgJiYgIWRzaS0+cGFuZWwpIHsKKwkJ
CWRldl9pbmZvKGRldiwgIldhaXRpbmcgZm9yIGJyaWRnZSBvciBwYW5lbCBkcml2ZXJcbiIpOwor
CQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJCX0KKwl9CisKKwlkc2ktPmVuZ2luZV9jbGsgPSBk
ZXZtX2Nsa19nZXQoZGV2LCAiZW5naW5lIik7CisJaWYgKElTX0VSUihkc2ktPmVuZ2luZV9jbGsp
KSB7CisJCXJldCA9IFBUUl9FUlIoZHNpLT5lbmdpbmVfY2xrKTsKKwkJZGV2X2VycihkZXYsICJG
YWlsZWQgdG8gZ2V0IGVuZ2luZSBjbG9jazogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJ
fQorCisJZHNpLT5kaWdpdGFsX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJkaWdpdGFsIik7CisJ
aWYgKElTX0VSUihkc2ktPmRpZ2l0YWxfY2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKGRzaS0+ZGln
aXRhbF9jbGspOworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgZGlnaXRhbCBjbG9jazog
JWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZHNpLT5oc19jbGsgPSBkZXZtX2Ns
a19nZXQoZGV2LCAiaHMiKTsKKwlpZiAoSVNfRVJSKGRzaS0+aHNfY2xrKSkgeworCQlyZXQgPSBQ
VFJfRVJSKGRzaS0+aHNfY2xrKTsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IGhzIGNs
b2NrOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZWdzID0gcGxhdGZvcm1f
Z2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlkc2ktPnJlZ3MgPSBkZXZt
X2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZWdzKTsKKwlpZiAoSVNfRVJSKGRzaS0+cmVncykpIHsK
KwkJcmV0ID0gUFRSX0VSUihkc2ktPnJlZ3MpOworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBp
b3JlbWFwIG1lbW9yeTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZHNpLT5w
aHkgPSBkZXZtX3BoeV9nZXQoZGV2LCAiZHBoeSIpOworCWlmIChJU19FUlIoZHNpLT5waHkpKSB7
CisJCXJldCA9IFBUUl9FUlIoZHNpLT5waHkpOworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBn
ZXQgTUlQSS1EUEhZOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljb21wX2lk
ID0gbXRrX2RkcF9jb21wX2dldF9pZChkZXYtPm9mX25vZGUsIE1US19EU0kpOworCWlmIChjb21w
X2lkIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBpZGVudGlmeSBieSBhbGlhczog
JWRcbiIsIGNvbXBfaWQpOworCQlyZXR1cm4gY29tcF9pZDsKKwl9CisKKwlyZXQgPSBtdGtfZGRw
X2NvbXBfaW5pdChkZXYsIGRldi0+b2Zfbm9kZSwgJmRzaS0+ZGRwX2NvbXAsIGNvbXBfaWQsCisJ
CQkJJm10a19kc2lfZnVuY3MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQg
dG8gaW5pdGlhbGl6ZSBjb21wb25lbnQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0K
KworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRzaSk7CisKKwlyZXR1cm4gY29tcG9uZW50
X2FkZCgmcGRldi0+ZGV2LCAmbXRrX2RzaV9jb21wb25lbnRfb3BzKTsKK30KKworc3RhdGljIGlu
dCBtdGtfZHNpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVj
dCBtdGtfZHNpICpkc2kgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW10a19vdXRw
dXRfZHNpX2Rpc2FibGUoZHNpKTsKKwljb21wb25lbnRfZGVsKCZwZGV2LT5kZXYsICZtdGtfZHNp
X2NvbXBvbmVudF9vcHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg
b2ZfZGV2aWNlX2lkIG10a19kc2lfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1l
ZGlhdGVrLG10ODE3My1kc2kiIH0sCisJeyB9LAorfTsKKworc3RydWN0IHBsYXRmb3JtX2RyaXZl
ciBtdGtfZHNpX2RyaXZlciA9IHsKKwkucHJvYmUgPSBtdGtfZHNpX3Byb2JlLAorCS5yZW1vdmUg
PSBtdGtfZHNpX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtdGstZHNpIiwKKwkJ
Lm9mX21hdGNoX3RhYmxlID0gbXRrX2RzaV9vZl9tYXRjaCwKKwl9LAorfTsKZGlmZiAtLWdpdCBh
L2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfbWlwaV90eC5jIGIvZHJpdmVycy9ncHUvZHJt
L21lZGlhdGVrL210a19taXBpX3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uY2Y4ZjM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9t
dGtfbWlwaV90eC5jCkBAIC0wLDAgKzEsNDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1
IE1lZGlhVGVrIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3Jh
bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Ns
ay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgv
aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9y
bV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisKKyNkZWZpbmUgTUlQSVRY
X0RTSV9DT04JCTB4MDAKKyNkZWZpbmUgUkdfRFNJX0xET0NPUkVfRU4JCUJJVCgwKQorI2RlZmlu
ZSBSR19EU0lfQ0tHX0xET09VVF9FTgkJQklUKDEpCisjZGVmaW5lIFJHX0RTSV9CQ0xLX1NFTAkJ
CSgzIDw8IDIpCisjZGVmaW5lIFJHX0RTSV9MRF9JRFhfU0VMCQkoNyA8PCA0KQorI2RlZmluZSBS
R19EU0lfUEhZQ0xLX1NFTAkJKDIgPDwgOCkKKyNkZWZpbmUgUkdfRFNJX0RTSUNMS19GUkVRX1NF
TAkJQklUKDEwKQorI2RlZmluZSBSR19EU0lfTFBUWF9DTE1QX0VOCQlCSVQoMTEpCisKKyNkZWZp
bmUgTUlQSVRYX0RTSV9DTE9DS19MQU5FCTB4MDQKKyNkZWZpbmUgTUlQSVRYX0RTSV9EQVRBX0xB
TkUwCTB4MDgKKyNkZWZpbmUgTUlQSVRYX0RTSV9EQVRBX0xBTkUxCTB4MGMKKyNkZWZpbmUgTUlQ
SVRYX0RTSV9EQVRBX0xBTkUyCTB4MTAKKyNkZWZpbmUgTUlQSVRYX0RTSV9EQVRBX0xBTkUzCTB4
MTQKKyNkZWZpbmUgUkdfRFNJX0xOVHhfTERPT1VUX0VOCQlCSVQoMCkKKyNkZWZpbmUgUkdfRFNJ
X0xOVHhfQ0tMQU5FX0VOCQlCSVQoMSkKKyNkZWZpbmUgUkdfRFNJX0xOVHhfTFBUWF9JUExVUzEJ
CUJJVCgyKQorI2RlZmluZSBSR19EU0lfTE5UeF9MUFRYX0lQTFVTMgkJQklUKDMpCisjZGVmaW5l
IFJHX0RTSV9MTlR4X0xQVFhfSU1JTlVTCQlCSVQoNCkKKyNkZWZpbmUgUkdfRFNJX0xOVHhfTFBD
RF9JUExVUwkJQklUKDUpCisjZGVmaW5lIFJHX0RTSV9MTlR4X0xQQ0RfSU1JTlVTCQlCSVQoNikK
KyNkZWZpbmUgUkdfRFNJX0xOVHhfUlRfQ09ERQkJKDB4ZiA8PCA4KQorCisjZGVmaW5lIE1JUElU
WF9EU0lfVE9QX0NPTgkweDQwCisjZGVmaW5lIFJHX0RTSV9MTlRfSU5UUl9FTgkJQklUKDApCisj
ZGVmaW5lIFJHX0RTSV9MTlRfSFNfQklBU19FTgkJQklUKDEpCisjZGVmaW5lIFJHX0RTSV9MTlRf
SU1QX0NBTF9FTgkJQklUKDIpCisjZGVmaW5lIFJHX0RTSV9MTlRfVEVTVE1PREVfRU4JCUJJVCgz
KQorI2RlZmluZSBSR19EU0lfTE5UX0lNUF9DQUxfQ09ERQkJKDB4ZiA8PCA0KQorI2RlZmluZSBS
R19EU0lfTE5UX0FJT19TRUwJCSg3IDw8IDgpCisjZGVmaW5lIFJHX0RTSV9QQURfVElFX0xPV19F
TgkJQklUKDExKQorI2RlZmluZSBSR19EU0lfREVCVUdfSU5QVVRfRU4JCUJJVCgxMikKKyNkZWZp
bmUgUkdfRFNJX1BSRVNFUlZFCQkJKDcgPDwgMTMpCisKKyNkZWZpbmUgTUlQSVRYX0RTSV9CR19D
T04JMHg0NAorI2RlZmluZSBSR19EU0lfQkdfQ09SRV9FTgkJQklUKDApCisjZGVmaW5lIFJHX0RT
SV9CR19DS0VOCQkJQklUKDEpCisjZGVmaW5lIFJHX0RTSV9CR19ESVYJCQkoMHgzIDw8IDIpCisj
ZGVmaW5lIFJHX0RTSV9CR19GQVNUX0NIQVJHRQkJQklUKDQpCisjZGVmaW5lIFJHX0RTSV9WT1VU
X01TSwkJCSgweDNmZmZmIDw8IDUpCisjZGVmaW5lIFJHX0RTSV9WMTJfU0VMCQkJKDcgPDwgNSkK
KyNkZWZpbmUgUkdfRFNJX1YxMF9TRUwJCQkoNyA8PCA4KQorI2RlZmluZSBSR19EU0lfVjA3Ml9T
RUwJCQkoNyA8PCAxMSkKKyNkZWZpbmUgUkdfRFNJX1YwNF9TRUwJCQkoNyA8PCAxNCkKKyNkZWZp
bmUgUkdfRFNJX1YwMzJfU0VMCQkJKDcgPDwgMTcpCisjZGVmaW5lIFJHX0RTSV9WMDJfU0VMCQkJ
KDcgPDwgMjApCisjZGVmaW5lIFJHX0RTSV9CR19SMV9UUklNCQkoMHhmIDw8IDI0KQorI2RlZmlu
ZSBSR19EU0lfQkdfUjJfVFJJTQkJKDB4ZiA8PCAyOCkKKworI2RlZmluZSBNSVBJVFhfRFNJX1BM
TF9DT04wCTB4NTAKKyNkZWZpbmUgUkdfRFNJX01QUExMX1BMTF9FTgkJQklUKDApCisjZGVmaW5l
IFJHX0RTSV9NUFBMTF9ESVZfTVNLCQkoMHgxZmYgPDwgMSkKKyNkZWZpbmUgUkdfRFNJX01QUExM
X1BSRURJVgkJKDMgPDwgMSkKKyNkZWZpbmUgUkdfRFNJX01QUExMX1RYRElWMAkJKDMgPDwgMykK
KyNkZWZpbmUgUkdfRFNJX01QUExMX1RYRElWMQkJKDMgPDwgNSkKKyNkZWZpbmUgUkdfRFNJX01Q
UExMX1BPU0RJVgkJKDcgPDwgNykKKyNkZWZpbmUgUkdfRFNJX01QUExMX01PTlZDX0VOCQlCSVQo
MTApCisjZGVmaW5lIFJHX0RTSV9NUFBMTF9NT05SRUZfRU4JCUJJVCgxMSkKKyNkZWZpbmUgUkdf
RFNJX01QUExMX1ZPRF9FTgkJQklUKDEyKQorCisjZGVmaW5lIE1JUElUWF9EU0lfUExMX0NPTjEJ
MHg1NAorI2RlZmluZSBSR19EU0lfTVBQTExfU0RNX0ZSQV9FTgkJQklUKDApCisjZGVmaW5lIFJH
X0RTSV9NUFBMTF9TRE1fU1NDX1BIX0lOSVQJQklUKDEpCisjZGVmaW5lIFJHX0RTSV9NUFBMTF9T
RE1fU1NDX0VOCQlCSVQoMikKKyNkZWZpbmUgUkdfRFNJX01QUExMX1NETV9TU0NfUFJECSgweGZm
ZmYgPDwgMTYpCisKKyNkZWZpbmUgTUlQSVRYX0RTSV9QTExfQ09OMgkweDU4CisKKyNkZWZpbmUg
TUlQSVRYX0RTSV9QTExfUFdSCTB4NjgKKyNkZWZpbmUgUkdfRFNJX01QUExMX1NETV9QV1JfT04J
CUJJVCgwKQorI2RlZmluZSBSR19EU0lfTVBQTExfU0RNX0lTT19FTgkJQklUKDEpCisjZGVmaW5l
IFJHX0RTSV9NUFBMTF9TRE1fUFdSX0FDSwlCSVQoOCkKKworI2RlZmluZSBNSVBJVFhfRFNJX1NX
X0NUUkwJMHg4MAorI2RlZmluZSBTV19DVFJMX0VOCQkJQklUKDApCisKKyNkZWZpbmUgTUlQSVRY
X0RTSV9TV19DVFJMX0NPTjAJMHg4NAorI2RlZmluZSBTV19MTlRDX0xQVFhfUFJFX09FCQlCSVQo
MCkKKyNkZWZpbmUgU1dfTE5UQ19MUFRYX09FCQkJQklUKDEpCisjZGVmaW5lIFNXX0xOVENfTFBU
WF9QCQkJQklUKDIpCisjZGVmaW5lIFNXX0xOVENfTFBUWF9OCQkJQklUKDMpCisjZGVmaW5lIFNX
X0xOVENfSFNUWF9QUkVfT0UJCUJJVCg0KQorI2RlZmluZSBTV19MTlRDX0hTVFhfT0UJCQlCSVQo
NSkKKyNkZWZpbmUgU1dfTE5UQ19IU1RYX1pFUk9DTEsJCUJJVCg2KQorI2RlZmluZSBTV19MTlQw
X0xQVFhfUFJFX09FCQlCSVQoNykKKyNkZWZpbmUgU1dfTE5UMF9MUFRYX09FCQkJQklUKDgpCisj
ZGVmaW5lIFNXX0xOVDBfTFBUWF9QCQkJQklUKDkpCisjZGVmaW5lIFNXX0xOVDBfTFBUWF9OCQkJ
QklUKDEwKQorI2RlZmluZSBTV19MTlQwX0hTVFhfUFJFX09FCQlCSVQoMTEpCisjZGVmaW5lIFNX
X0xOVDBfSFNUWF9PRQkJCUJJVCgxMikKKyNkZWZpbmUgU1dfTE5UMF9MUFJYX0VOCQkJQklUKDEz
KQorI2RlZmluZSBTV19MTlQxX0xQVFhfUFJFX09FCQlCSVQoMTQpCisjZGVmaW5lIFNXX0xOVDFf
TFBUWF9PRQkJCUJJVCgxNSkKKyNkZWZpbmUgU1dfTE5UMV9MUFRYX1AJCQlCSVQoMTYpCisjZGVm
aW5lIFNXX0xOVDFfTFBUWF9OCQkJQklUKDE3KQorI2RlZmluZSBTV19MTlQxX0hTVFhfUFJFX09F
CQlCSVQoMTgpCisjZGVmaW5lIFNXX0xOVDFfSFNUWF9PRQkJCUJJVCgxOSkKKyNkZWZpbmUgU1df
TE5UMl9MUFRYX1BSRV9PRQkJQklUKDIwKQorI2RlZmluZSBTV19MTlQyX0xQVFhfT0UJCQlCSVQo
MjEpCisjZGVmaW5lIFNXX0xOVDJfTFBUWF9QCQkJQklUKDIyKQorI2RlZmluZSBTV19MTlQyX0xQ
VFhfTgkJCUJJVCgyMykKKyNkZWZpbmUgU1dfTE5UMl9IU1RYX1BSRV9PRQkJQklUKDI0KQorI2Rl
ZmluZSBTV19MTlQyX0hTVFhfT0UJCQlCSVQoMjUpCisKK3N0cnVjdCBtdGtfbWlwaV90eCB7CisJ
c3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqcmVnczsKKwl1bnNpZ25lZCBpbnQg
ZGF0YV9yYXRlOworCXN0cnVjdCBjbGtfaHcgcGxsX2h3OworCXN0cnVjdCBjbGsgKnBsbDsKK307
CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG10a19taXBpX3R4ICptdGtfbWlwaV90eF9mcm9tX2Ns
a19odyhzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGh3LCBzdHJ1
Y3QgbXRrX21pcGlfdHgsIHBsbF9odyk7Cit9CisKK3N0YXRpYyB2b2lkIG10a19taXBpX3R4X2Ns
ZWFyX2JpdHMoc3RydWN0IG10a19taXBpX3R4ICptaXBpX3R4LCB1MzIgb2Zmc2V0LAorCQkJCSAg
IHUzMiBiaXRzKQoreworCXUzMiB0ZW1wID0gcmVhZGwobWlwaV90eC0+cmVncyArIG9mZnNldCk7
CisKKwl3cml0ZWwodGVtcCAmIH5iaXRzLCBtaXBpX3R4LT5yZWdzICsgb2Zmc2V0KTsKK30KKwor
c3RhdGljIHZvaWQgbXRrX21pcGlfdHhfc2V0X2JpdHMoc3RydWN0IG10a19taXBpX3R4ICptaXBp
X3R4LCB1MzIgb2Zmc2V0LAorCQkJCSB1MzIgYml0cykKK3sKKwl1MzIgdGVtcCA9IHJlYWRsKG1p
cGlfdHgtPnJlZ3MgKyBvZmZzZXQpOworCisJd3JpdGVsKHRlbXAgfCBiaXRzLCBtaXBpX3R4LT5y
ZWdzICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgbXRrX21pcGlfdHhfdXBkYXRlX2JpdHMo
c3RydWN0IG10a19taXBpX3R4ICptaXBpX3R4LCB1MzIgb2Zmc2V0LAorCQkJCSAgICB1MzIgbWFz
aywgdTMyIGRhdGEpCit7CisJdTMyIHRlbXAgPSByZWFkbChtaXBpX3R4LT5yZWdzICsgb2Zmc2V0
KTsKKworCXdyaXRlbCgodGVtcCAmIH5tYXNrKSB8IChkYXRhICYgbWFzayksIG1pcGlfdHgtPnJl
Z3MgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW50IG10a19taXBpX3R4X3BsbF9wcmVwYXJlKHN0
cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBtdGtfbWlwaV90eCAqbWlwaV90eCA9IG10a19t
aXBpX3R4X2Zyb21fY2xrX2h3KGh3KTsKKwl1bnNpZ25lZCBpbnQgdHhkaXYsIHR4ZGl2MCwgdHhk
aXYxOworCXU2NCBwY3c7CisKKwlkZXZfZGJnKG1pcGlfdHgtPmRldiwgInByZXBhcmU6ICV1IEh6
XG4iLCBtaXBpX3R4LT5kYXRhX3JhdGUpOworCisJaWYgKG1pcGlfdHgtPmRhdGFfcmF0ZSA+PSA1
MDAwMDAwMDApIHsKKwkJdHhkaXYgPSAxOworCQl0eGRpdjAgPSAwOworCQl0eGRpdjEgPSAwOwor
CX0gZWxzZSBpZiAobWlwaV90eC0+ZGF0YV9yYXRlID49IDI1MDAwMDAwMCkgeworCQl0eGRpdiA9
IDI7CisJCXR4ZGl2MCA9IDE7CisJCXR4ZGl2MSA9IDA7CisJfSBlbHNlIGlmIChtaXBpX3R4LT5k
YXRhX3JhdGUgPj0gMTI1MDAwMDAwKSB7CisJCXR4ZGl2ID0gNDsKKwkJdHhkaXYwID0gMjsKKwkJ
dHhkaXYxID0gMDsKKwl9IGVsc2UgaWYgKG1pcGlfdHgtPmRhdGFfcmF0ZSA+IDYyMDAwMDAwKSB7
CisJCXR4ZGl2ID0gODsKKwkJdHhkaXYwID0gMjsKKwkJdHhkaXYxID0gMTsKKwl9IGVsc2UgaWYg
KG1pcGlfdHgtPmRhdGFfcmF0ZSA+PSA1MDAwMDAwMCkgeworCQl0eGRpdiA9IDE2OworCQl0eGRp
djAgPSAyOworCQl0eGRpdjEgPSAyOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0K
KworCW10a19taXBpX3R4X3VwZGF0ZV9iaXRzKG1pcGlfdHgsIE1JUElUWF9EU0lfQkdfQ09OLAor
CQkJCVJHX0RTSV9WT1VUX01TSyB8CisJCQkJUkdfRFNJX0JHX0NLRU4gfCBSR19EU0lfQkdfQ09S
RV9FTiwKKwkJCQkoNCA8PCAyMCkgfCAoNCA8PCAxNykgfCAoNCA8PCAxNCkgfAorCQkJCSg0IDw8
IDExKSB8ICg0IDw8IDgpIHwgKDQgPDwgNSkgfAorCQkJCVJHX0RTSV9CR19DS0VOIHwgUkdfRFNJ
X0JHX0NPUkVfRU4pOworCisJdXNsZWVwX3JhbmdlKDMwLCAxMDApOworCisJbXRrX21pcGlfdHhf
dXBkYXRlX2JpdHMobWlwaV90eCwgTUlQSVRYX0RTSV9UT1BfQ09OLAorCQkJCVJHX0RTSV9MTlRf
SU1QX0NBTF9DT0RFIHwgUkdfRFNJX0xOVF9IU19CSUFTX0VOLAorCQkJCSg4IDw8IDQpIHwgUkdf
RFNJX0xOVF9IU19CSUFTX0VOKTsKKworCW10a19taXBpX3R4X3NldF9iaXRzKG1pcGlfdHgsIE1J
UElUWF9EU0lfQ09OLAorCQkJICAgICBSR19EU0lfQ0tHX0xET09VVF9FTiB8IFJHX0RTSV9MRE9D
T1JFX0VOKTsKKworCW10a19taXBpX3R4X3VwZGF0ZV9iaXRzKG1pcGlfdHgsIE1JUElUWF9EU0lf
UExMX1BXUiwKKwkJCQlSR19EU0lfTVBQTExfU0RNX1BXUl9PTiB8CisJCQkJUkdfRFNJX01QUExM
X1NETV9JU09fRU4sCisJCQkJUkdfRFNJX01QUExMX1NETV9QV1JfT04pOworCisJbXRrX21pcGlf
dHhfY2xlYXJfYml0cyhtaXBpX3R4LCBNSVBJVFhfRFNJX1BMTF9DT04wLAorCQkJICAgICAgIFJH
X0RTSV9NUFBMTF9QTExfRU4pOworCisJbXRrX21pcGlfdHhfdXBkYXRlX2JpdHMobWlwaV90eCwg
TUlQSVRYX0RTSV9QTExfQ09OMCwKKwkJCQlSR19EU0lfTVBQTExfVFhESVYwIHwgUkdfRFNJX01Q
UExMX1RYRElWMSB8CisJCQkJUkdfRFNJX01QUExMX1BSRURJViwKKwkJCQkodHhkaXYwIDw8IDMp
IHwgKHR4ZGl2MSA8PCA1KSk7CisKKwkvKgorCSAqIFBMTCBQQ1cgY29uZmlnCisJICogUENXIGJp
dCAyNH4zMCA9IGludGVnZXIgcGFydCBvZiBwY3cKKwkgKiBQQ1cgYml0IDB+MjMgPSBmcmFjdGlv
bmFsIHBhcnQgb2YgcGN3CisJICogcGN3ID0gZGF0YV9SYXRlKjQqdHhkaXYvKFJlZl9jbGsqMik7
CisJICogUG9zdCBESVYgPTQsIHNvIG5lZWQgZGF0YV9SYXRlKjQKKwkgKiBSZWZfY2xrIGlzIDI2
TUh6CisJICovCisJcGN3ID0gZGl2X3U2NCgoKHU2NCltaXBpX3R4LT5kYXRhX3JhdGUgKiAyICog
dHhkaXYpIDw8IDI0LAorCQkgICAgICAyNjAwMDAwMCk7CisJd3JpdGVsKHBjdywgbWlwaV90eC0+
cmVncyArIE1JUElUWF9EU0lfUExMX0NPTjIpOworCisJbXRrX21pcGlfdHhfc2V0X2JpdHMobWlw
aV90eCwgTUlQSVRYX0RTSV9QTExfQ09OMSwKKwkJCSAgICAgUkdfRFNJX01QUExMX1NETV9GUkFf
RU4pOworCisJbXRrX21pcGlfdHhfc2V0X2JpdHMobWlwaV90eCwgTUlQSVRYX0RTSV9QTExfQ09O
MCwgUkdfRFNJX01QUExMX1BMTF9FTik7CisKKwl1c2xlZXBfcmFuZ2UoMjAsIDEwMCk7CisKKwlt
dGtfbWlwaV90eF9jbGVhcl9iaXRzKG1pcGlfdHgsIE1JUElUWF9EU0lfUExMX0NPTjEsCisJCQkg
ICAgICAgUkdfRFNJX01QUExMX1NETV9TU0NfRU4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp
YyB2b2lkIG10a19taXBpX3R4X3BsbF91bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJ
c3RydWN0IG10a19taXBpX3R4ICptaXBpX3R4ID0gbXRrX21pcGlfdHhfZnJvbV9jbGtfaHcoaHcp
OworCisJZGV2X2RiZyhtaXBpX3R4LT5kZXYsICJ1bnByZXBhcmVcbiIpOworCisJbXRrX21pcGlf
dHhfY2xlYXJfYml0cyhtaXBpX3R4LCBNSVBJVFhfRFNJX1BMTF9DT04wLAorCQkJICAgICAgIFJH
X0RTSV9NUFBMTF9QTExfRU4pOworCisJbXRrX21pcGlfdHhfdXBkYXRlX2JpdHMobWlwaV90eCwg
TUlQSVRYX0RTSV9QTExfUFdSLAorCQkJCVJHX0RTSV9NUFBMTF9TRE1fSVNPX0VOIHwKKwkJCQlS
R19EU0lfTVBQTExfU0RNX1BXUl9PTiwKKwkJCQlSR19EU0lfTVBQTExfU0RNX0lTT19FTik7CisK
KwltdGtfbWlwaV90eF9jbGVhcl9iaXRzKG1pcGlfdHgsIE1JUElUWF9EU0lfVE9QX0NPTiwKKwkJ
CSAgICAgICBSR19EU0lfTE5UX0hTX0JJQVNfRU4pOworCisJbXRrX21pcGlfdHhfY2xlYXJfYml0
cyhtaXBpX3R4LCBNSVBJVFhfRFNJX0NPTiwKKwkJCSAgICAgICBSR19EU0lfQ0tHX0xET09VVF9F
TiB8IFJHX0RTSV9MRE9DT1JFX0VOKTsKKworCW10a19taXBpX3R4X2NsZWFyX2JpdHMobWlwaV90
eCwgTUlQSVRYX0RTSV9CR19DT04sCisJCQkgICAgICAgUkdfRFNJX0JHX0NLRU4gfCBSR19EU0lf
QkdfQ09SRV9FTik7CisKKwltdGtfbWlwaV90eF9jbGVhcl9iaXRzKG1pcGlfdHgsIE1JUElUWF9E
U0lfUExMX0NPTjAsCisJCQkgICAgICAgUkdfRFNJX01QUExMX0RJVl9NU0spOworfQorCitzdGF0
aWMgbG9uZyBtdGtfbWlwaV90eF9wbGxfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywgdW5z
aWduZWQgbG9uZyByYXRlLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nICpwcmF0ZSkKK3sKKwly
ZXR1cm4gY2xhbXBfdmFsKHJhdGUsIDUwMDAwMDAwLCAxMjUwMDAwMDAwKTsKK30KKworc3RhdGlj
IGludCBtdGtfbWlwaV90eF9wbGxfc2V0X3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVk
IGxvbmcgcmF0ZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwlzdHJ1
Y3QgbXRrX21pcGlfdHggKm1pcGlfdHggPSBtdGtfbWlwaV90eF9mcm9tX2Nsa19odyhodyk7CisK
KwlkZXZfZGJnKG1pcGlfdHgtPmRldiwgInNldCByYXRlOiAlbHUgSHpcbiIsIHJhdGUpOworCisJ
bWlwaV90eC0+ZGF0YV9yYXRlID0gcmF0ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5z
aWduZWQgbG9uZyBtdGtfbWlwaV90eF9wbGxfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcs
CisJCQkJCQkgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwlzdHJ1Y3QgbXRrX21pcGlf
dHggKm1pcGlfdHggPSBtdGtfbWlwaV90eF9mcm9tX2Nsa19odyhodyk7CisKKwlyZXR1cm4gbWlw
aV90eC0+ZGF0YV9yYXRlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgbXRrX21p
cGlfdHhfcGxsX29wcyA9IHsKKwkucHJlcGFyZSA9IG10a19taXBpX3R4X3BsbF9wcmVwYXJlLAor
CS51bnByZXBhcmUgPSBtdGtfbWlwaV90eF9wbGxfdW5wcmVwYXJlLAorCS5yb3VuZF9yYXRlID0g
bXRrX21pcGlfdHhfcGxsX3JvdW5kX3JhdGUsCisJLnNldF9yYXRlID0gbXRrX21pcGlfdHhfcGxs
X3NldF9yYXRlLAorCS5yZWNhbGNfcmF0ZSA9IG10a19taXBpX3R4X3BsbF9yZWNhbGNfcmF0ZSwK
K307CisKK3N0YXRpYyBpbnQgbXRrX21pcGlfdHhfcG93ZXJfb25fc2lnbmFsKHN0cnVjdCBwaHkg
KnBoeSkKK3sKKwlzdHJ1Y3QgbXRrX21pcGlfdHggKm1pcGlfdHggPSBwaHlfZ2V0X2RydmRhdGEo
cGh5KTsKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJZm9yIChyZWcgPSBNSVBJVFhfRFNJX0NMT0NL
X0xBTkU7CisJICAgICByZWcgPD0gTUlQSVRYX0RTSV9EQVRBX0xBTkUzOyByZWcgKz0gNCkKKwkJ
bXRrX21pcGlfdHhfc2V0X2JpdHMobWlwaV90eCwgcmVnLCBSR19EU0lfTE5UeF9MRE9PVVRfRU4p
OworCisJbXRrX21pcGlfdHhfY2xlYXJfYml0cyhtaXBpX3R4LCBNSVBJVFhfRFNJX1RPUF9DT04s
CisJCQkgICAgICAgUkdfRFNJX1BBRF9USUVfTE9XX0VOKTsKKworCXJldHVybiAwOworfQorCitz
dGF0aWMgaW50IG10a19taXBpX3R4X3Bvd2VyX29uKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1
Y3QgbXRrX21pcGlfdHggKm1pcGlfdHggPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlpbnQgcmV0
OworCisJLyogUG93ZXIgdXAgY29yZSBhbmQgZW5hYmxlIFBMTCAqLworCXJldCA9IGNsa19wcmVw
YXJlX2VuYWJsZShtaXBpX3R4LT5wbGwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0Owor
CisJLyogRW5hYmxlIERTSSBMYW5lIExETyBvdXRwdXRzLCBkaXNhYmxlIHBhZCB0aWUgbG93ICov
CisJbXRrX21pcGlfdHhfcG93ZXJfb25fc2lnbmFsKHBoeSk7CisKKwlyZXR1cm4gMDsKK30KKwor
c3RhdGljIHZvaWQgbXRrX21pcGlfdHhfcG93ZXJfb2ZmX3NpZ25hbChzdHJ1Y3QgcGh5ICpwaHkp
Cit7CisJc3RydWN0IG10a19taXBpX3R4ICptaXBpX3R4ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7
CisJdW5zaWduZWQgaW50IHJlZzsKKworCW10a19taXBpX3R4X3NldF9iaXRzKG1pcGlfdHgsIE1J
UElUWF9EU0lfVE9QX0NPTiwKKwkJCSAgICAgUkdfRFNJX1BBRF9USUVfTE9XX0VOKTsKKworCWZv
ciAocmVnID0gTUlQSVRYX0RTSV9DTE9DS19MQU5FOworCSAgICAgcmVnIDw9IE1JUElUWF9EU0lf
REFUQV9MQU5FMzsgcmVnICs9IDQpCisJCW10a19taXBpX3R4X2NsZWFyX2JpdHMobWlwaV90eCwg
cmVnLCBSR19EU0lfTE5UeF9MRE9PVVRfRU4pOworfQorCitzdGF0aWMgaW50IG10a19taXBpX3R4
X3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IG10a19taXBpX3R4ICptaXBp
X3R4ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisKKwkvKiBFbmFibGUgcGFkIHRpZSBsb3csIGRp
c2FibGUgRFNJIExhbmUgTERPIG91dHB1dHMgKi8KKwltdGtfbWlwaV90eF9wb3dlcl9vZmZfc2ln
bmFsKHBoeSk7CisKKwkvKiBEaXNhYmxlIFBMTCBhbmQgcG93ZXIgZG93biBjb3JlICovCisJY2xr
X2Rpc2FibGVfdW5wcmVwYXJlKG1pcGlfdHgtPnBsbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh
dGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIG10a19taXBpX3R4X29wcyA9IHsKKwkucG93ZXJfb24g
PSBtdGtfbWlwaV90eF9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmID0gbXRrX21pcGlfdHhfcG93ZXJf
b2ZmLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBtdGtfbWlwaV90
eF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Ug
KmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IG10a19taXBpX3R4ICptaXBpX3R4OworCXN0cnVj
dCByZXNvdXJjZSAqbWVtOworCXN0cnVjdCBjbGsgKnJlZl9jbGs7CisJY29uc3QgY2hhciAqcmVm
X2Nsa19uYW1lOworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGNsa19pbml0ID0geworCQkub3BzID0g
Jm10a19taXBpX3R4X3BsbF9vcHMsCisJCS5udW1fcGFyZW50cyA9IDEsCisJCS5wYXJlbnRfbmFt
ZXMgPSAoY29uc3QgY2hhciAqIGNvbnN0ICopJnJlZl9jbGtfbmFtZSwKKwkJLmZsYWdzID0gQ0xL
X1NFVF9SQVRFX0dBVEUsCisJfTsKKwlzdHJ1Y3QgcGh5ICpwaHk7CisJc3RydWN0IHBoeV9wcm92
aWRlciAqcGh5X3Byb3ZpZGVyOworCWludCByZXQ7CisKKwltaXBpX3R4ID0gZGV2bV9remFsbG9j
KGRldiwgc2l6ZW9mKCptaXBpX3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtaXBpX3R4KQorCQly
ZXR1cm4gLUVOT01FTTsKKworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JF
U09VUkNFX01FTSwgMCk7CisJbWlwaV90eC0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShk
ZXYsIG1lbSk7CisJaWYgKElTX0VSUihtaXBpX3R4LT5yZWdzKSkgeworCQlyZXQgPSBQVFJfRVJS
KG1pcGlfdHgtPnJlZ3MpOworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgbWVtb3J5IHJl
c291cmNlOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZWZfY2xrID0gZGV2
bV9jbGtfZ2V0KGRldiwgTlVMTCk7CisJaWYgKElTX0VSUihyZWZfY2xrKSkgeworCQlyZXQgPSBQ
VFJfRVJSKHJlZl9jbGspOworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgcmVmZXJlbmNl
IGNsb2NrOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmVmX2Nsa19uYW1lID0g
X19jbGtfZ2V0X25hbWUocmVmX2Nsayk7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmlu
ZyhkZXYtPm9mX25vZGUsICJjbG9jay1vdXRwdXQtbmFtZXMiLAorCQkJCSAgICAgICZjbGtfaW5p
dC5uYW1lKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFk
IGNsb2NrLW91dHB1dC1uYW1lczogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJ
bWlwaV90eC0+cGxsX2h3LmluaXQgPSAmY2xrX2luaXQ7CisJbWlwaV90eC0+cGxsID0gZGV2bV9j
bGtfcmVnaXN0ZXIoZGV2LCAmbWlwaV90eC0+cGxsX2h3KTsKKwlpZiAoSVNfRVJSKG1pcGlfdHgt
PnBsbCkpIHsKKwkJcmV0ID0gUFRSX0VSUihtaXBpX3R4LT5wbGwpOworCQlkZXZfZXJyKGRldiwg
IkZhaWxlZCB0byByZWdpc3RlciBQTEw6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0K
KworCXBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsIE5VTEwsICZtdGtfbWlwaV90eF9vcHMpOwor
CWlmIChJU19FUlIocGh5KSkgeworCQlyZXQgPSBQVFJfRVJSKHBoeSk7CisJCWRldl9lcnIoZGV2
LCAiRmFpbGVkIHRvIGNyZWF0ZSBNSVBJIEQtUEhZOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJl
dDsKKwl9CisJcGh5X3NldF9kcnZkYXRhKHBoeSwgbWlwaV90eCk7CisKKwlwaHlfcHJvdmlkZXIg
PSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYsIG9mX3BoeV9zaW1wbGVfeGxhdGUp
OworCWlmIChJU19FUlIocGh5KSkgeworCQlyZXQgPSBQVFJfRVJSKHBoeV9wcm92aWRlcik7CisJ
CXJldHVybiByZXQ7CisJfQorCisJbWlwaV90eC0+ZGV2ID0gZGV2OworCisJcmV0dXJuIG9mX2Ns
a19hZGRfcHJvdmlkZXIoZGV2LT5vZl9ub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsCisJCQkJ
ICAgbWlwaV90eC0+cGxsKTsKK30KKworc3RhdGljIGludCBtdGtfbWlwaV90eF9yZW1vdmUoc3Ry
dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlvZl9jbGtfZGVsX3Byb3ZpZGVyKHBkZXYt
PmRldi5vZl9ub2RlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9k
ZXZpY2VfaWQgbXRrX21pcGlfdHhfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1lZGlh
dGVrLG10ODE3My1taXBpLXR4IiwgfSwKKwl7fSwKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9kcml2
ZXIgbXRrX21pcGlfdHhfZHJpdmVyID0geworCS5wcm9iZSA9IG10a19taXBpX3R4X3Byb2JlLAor
CS5yZW1vdmUgPSBtdGtfbWlwaV90eF9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAi
bWVkaWF0ZWstbWlwaS10eCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG10a19taXBpX3R4X21hdGNo
LAorCX0sCit9OwotLSAKMi44LjAucmMzCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5m
cmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0
aW5mby9kcmktZGV2ZWwK