Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Aug 2017 09:48:56 +0000
From:      "iateaca (Teaca)" <phabric-noreply@FreeBSD.org>
To:        freebsd-virtualization@freebsd.org
Subject:   [Differential] D5473: ATA/ATAPI6 device emulation in bhyve
Message-ID:  <3f564b781b1c7f1f6a251004cff0fd1c@localhost.localdomain>
In-Reply-To: <differential-rev-PHID-DREV-2t5o3zrdohcj7mowtyki-req@FreeBSD.org>
References:  <differential-rev-PHID-DREV-2t5o3zrdohcj7mowtyki-req@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--b1_3f564b781b1c7f1f6a251004cff0fd1c
Content-Type: text/plain; charset = "utf-8"
Content-Transfer-Encoding: base64

aWF0ZWFjYSB1cGRhdGVkIHRoaXMgcmV2aXNpb24gdG8gRGlmZiAzMjA4MS4KaWF0ZWFjYSBhZGRl
ZCBhIGNvbW1lbnQuCgoKICBhZGQgQ29weXJpZ2h0IGFuZCBsaWNlbnNlCgpDSEFOR0VTIFNJTkNF
IExBU1QgVVBEQVRFCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0Q1NDczP3ZzPTEzODI5
JmlkPTMyMDgxCgpSRVZJU0lPTiBERVRBSUwKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcv
RDU0NzMKCkFGRkVDVEVEIEZJTEVTCiAgTWFrZWZpbGUKICBhdGEuYwogIHBjaV9scGMuYwoKRU1B
SUwgUFJFRkVSRU5DRVMKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcvc2V0dGluZ3MvcGFu
ZWwvZW1haWxwcmVmZXJlbmNlcy8KClRvOiBpYXRlYWNhLCBncmVoYW4sIHR5Y2hvbiwgbmVlbCwg
bWF2CkNjOiBlZGl0b3JfY2FsbGZvcnRlc3Rpbmcub3JnLCBmcmVlYnNkLXZpcnR1YWxpemF0aW9u
LWxpc3QK

--b1_3f564b781b1c7f1f6a251004cff0fd1c
Content-Type: text/x-patch; charset=utf-8; name="D5473.32081.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="D5473.32081.patch"

ZGlmZiAtLWdpdCBhL3BjaV9scGMuYyBiL3BjaV9scGMuYwotLS0gYS9wY2lfbHBjLmMKKysrIGIv
cGNpX2xwYy5jCkBAIC03Myw2ICs3MywxMSBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqbHBjX3Vh
cnRfbmFtZXNbTFBDX1VBUlRfTlVNXSA9IHsgIkNPTTEiLCAiQ09NMiIgfTsKIAorZXh0ZXJuIGlu
dAorbHBjX2F0YV9pbml0KHN0cnVjdCB2bWN0eCAqY3R4LCBjb25zdCBjaGFyICpvcHRzKTsKK3N0
YXRpYyBjb25zdCBjaGFyICpscGNfYXRhMF9vcHRzID0gTlVMTDsKK3N0YXRpYyBjb25zdCBjaGFy
ICpscGNfYXRhMV9vcHRzID0gTlVMTDsKKwogLyoKICAqIExQQyBkZXZpY2UgY29uZmlndXJhdGlv
biBpcyBpbiB0aGUgZm9sbG93aW5nIGZvcm06CiAgKiA8bHBjX2RldmljZV9uYW1lPlssPG9wdGlv
bnM+XQpAQCAtOTUsNiArMTAwLDE2IEBACiAJCQkJZ290byBkb25lOwogCQkJfQogCQl9CisKKwkJ
aWYgKHN0cmNhc2VjbXAobHBjZGV2LCAiYXRhLWhkIikgPT0gMCkgeworCQkJaWYgKHN0clswXSA9
PSAnMCcpCisJCQkJbHBjX2F0YTBfb3B0cyA9IHN0cjsKKwkJCWVsc2UgaWYgKHN0clswXSA9PSAn
MScpCisJCQkJbHBjX2F0YTFfb3B0cyA9IHN0cjsKKworCQkJZXJyb3IgPSAwOworCQkJZ290byBk
b25lOworCQl9CiAJfQogCiBkb25lOgpAQCAtMTk3LDYgKzIxMiwxMSBAQAogCQlzYy0+ZW5hYmxl
ZCA9IDE7CiAJfQogCisJaWYgKGxwY19hdGEwX29wdHMpCisJCWxwY19hdGFfaW5pdChscGNfYnJp
ZGdlLT5waV92bWN0eCwgbHBjX2F0YTBfb3B0cyk7CisJaWYgKGxwY19hdGExX29wdHMpCisJCWxw
Y19hdGFfaW5pdChscGNfYnJpZGdlLT5waV92bWN0eCwgbHBjX2F0YTFfb3B0cyk7CisKIAlyZXR1
cm4gKDApOwogfQogCkBAIC0zNzksNiArMzk5LDggQEAKIAkJcmV0dXJuICgtMSk7CiAJfQogCisJ
bHBjX2JyaWRnZSA9IHBpOworCiAJaWYgKGxwY19pbml0KCkgIT0gMCkKIAkJcmV0dXJuICgtMSk7
CiAKQEAgLTM4OCw4ICs0MTAsNiBAQAogCXBjaV9zZXRfY2ZnZGF0YTgocGksIFBDSVJfQ0xBU1Ms
IFBDSUNfQlJJREdFKTsKIAlwY2lfc2V0X2NmZ2RhdGE4KHBpLCBQQ0lSX1NVQkNMQVNTLCBQQ0lT
X0JSSURHRV9JU0EpOwogCi0JbHBjX2JyaWRnZSA9IHBpOwotCiAJcmV0dXJuICgwKTsKIH0KIApk
aWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtl
ZmlsZQpAQCAtMTEsNiArMTEsNyBAQAogU1JDUz0JXAogCWF0a2JkYy5jCQlcCiAJYWNwaS5jCQkJ
XAorCWF0YS5jCQkJXAogCWJoeXZlcnVuLmMJCVwKIAlibG9ja19pZi5jCQlcCiAJY29uc3BvcnQu
YwkJXApkaWZmIC0tZ2l0IGEvYXRhLmMgYi9hdGEuYwotLS0gYS9hdGEuYworKysgYi9hdGEuYwpA
QCAtMCwwICsxLDI2MDYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE2IEFsZXggVGVhY2Eg
PGlhdGVhY2FAZnJlZWJzZC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycg
QU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0
Lmg+CisjaW5jbHVkZSA8c3lzL2F0YS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1
ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4K
KyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8Y2Ft
L3Njc2kvc2NzaV9hbGwuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3ZtbS5oPgorI2luY2x1ZGUgPHZt
bWFwaS5oPgorCisjaW5jbHVkZSAiYmxvY2tfaWYuaCIKKyNpbmNsdWRlICJiaHl2ZXJ1bi5oIgor
I2luY2x1ZGUgInBjaV9lbXVsLmgiCisjaW5jbHVkZSAicGNpX2lycS5oIgorI2luY2x1ZGUgImlu
b3V0LmgiCisKKworLyoKKyAqIEFUQSBEZWJ1ZyBMb2cKKyAqLworI2RlZmluZQlERUJVR19BVEEJ
CQkxCisjaWYgREVCVUdfQVRBID09IDEKKwordHlwZWRlZiBlbnVtIHsKKwlMT0dfREVCVUcgPSAw
LAorCUxPR19FUlIgPSAxLAorfSBMT0dfTEVWRUw7CisKK3N0YXRpYyBGSUxFICpkYmc7CisKK3N0
YXRpYyB2b2lkIGF0YV9vcGVuX2RiZ19maWxlKHZvaWQpCit7CisJZGJnID0gZm9wZW4oIi90bXAv
Ymh5dmVfYXRhLmxvZyIsICJ3KyIpOworCXJldHVybjsKK30KKworI2RlZmluZSBkcHJpbnQobGV2
ZWwsIGZvcm1hdCwgYXJnLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisJZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgXAorCQlpZiAobGV2ZWwgPT0gTE9HX0RFQlVHKSB7ZnByaW50Zihk
YmcsIGZvcm1hdCwgIyNhcmcpO30gICAgICAgXAorCQllbHNlIHtmcHJpbnRmKGRiZywgIkxPR19F
UlI6ICJmb3JtYXQsICMjYXJnKTt9ICAgICAgICAgICAgICAgXAorCQlmZmx1c2goZGJnKTsgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX13aGlsZSgw
KQorI2Vsc2UKKyNkZWZpbmUgYXRhX29wZW5fZGJnX2ZpbGUoKQk7CisjZGVmaW5lIGRwcmludChs
ZXZlbCwgZm10LCAuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyoKKyAqIEFUQSBk
ZWZpbmVzCisgKi8KKworI2RlZmluZSBQQ0lfQVRBX0NIX1NFUAkJCSc7JworCisvKiBBVEEgQ2hh
bm5lbHMgKi8KKyNkZWZpbmUgQVRBX0NIQU5ORUxTCQkJMHgwMgorI2RlZmluZQlBVEFfWAkJCQkw
eDAwCisjZGVmaW5lCUFUQV9ZCQkJCTB4MDEKKworI2RlZmluZQlBVEFfRFJJVkVTCQkJMHgwMgor
I2RlZmluZQlBVEFfTUFTVEVSCQkJMHgwMAorI2RlZmluZQlBVEFfU0xBVkUJCQkweDAxCisKKyNk
ZWZpbmUJQVRBX0RSSVZFX0FCU0VOVAkJMHhmOAorCisjZGVmaW5lCUFUQV9ERVYodW5pdCkJCQko
KHVuaXQgPiAwKSA/IDB4MTAgOiAwKQorCisjZGVmaW5lIEFUQV9JT1NJWkUJCQkweDA4CisjZGVm
aW5lIEFUQV9DVExJT1NJWkUJCQkweDAxCisjZGVmaW5lIEFUQV9CTUlPU0laRQkJCTB4MDgKKwor
I2RlZmluZQlBVEFfU0VDVE9SX1NJWkUJCQk1MTIKKyNkZWZpbmUJQVRBX1NFQ1RPUlNfUEVSX0JM
T0NLCQkxMjgKKyNkZWZpbmUJQVRBX01BWF9TRUNfQ09VTlQJCTI1NgorI2RlZmluZQlBVEFfQkxP
Q0tfU0laRQkJCShBVEFfU0VDVE9SU19QRVJfQkxPQ0sgKiBBVEFfU0VDVE9SX1NJWkUpCisjZGVm
aW5lCUFUQV9JTkJVRl9TSVpFCQkJKEFUQV9NQVhfU0VDX0NPVU5UICogQVRBX1NFQ1RPUl9TSVpF
KQorI2RlZmluZQlBVEFfTEJBXzI3XzI0X01BU0sJCTB4MGYKKworI2RlZmluZSBBVEFQSV9QQUNL
RVRfU0laRQkJMTIKKyNkZWZpbmUgQVRBUElfQkxPQ0tfU0laRQkJMjA0OAorCisjZGVmaW5lCUFU
QV9XUklURV9NVUxfQ09NUExFVEUJCTAKKyNkZWZpbmUJQVRBX1JFQURfTVVMX0NPTVBMRVRFCQkw
CisKKyNkZWZpbmUJQVRBX0RNQV9NQVhfUFJEX0NPVU5UCQk2NTUzNgorI2RlZmluZQlBVEFfRE1B
X1BSRFRfU0laRQkJNjU1MzYKKyNkZWZpbmUJQVRBX0RNQV9QUkRUX0VPVAkJMHg4MDAwCisKKyNk
ZWZpbmUJQVRBX0RNQV9SRUFECQkJKDApCisjZGVmaW5lCUFUQV9ETUFfV1JJVEUJCQkoMSkKKwor
I2RlZmluZQlBVEFfV19ETUEyCQkJMHgwNAorI2RlZmluZQlBVEFfTU9ERV9QSU80CQkJMHgwMgor
CisjZGVmaW5lCUFUQV9BVEFQSV82CQkJMHg0MAorCisjZGVmaW5lIEFUQVBJX01BR0lDX0xTQgkJ
CTB4MTQKKyNkZWZpbmUgQVRBUElfTUFHSUNfTVNCCQkJMHhlYgorCisvKiBQQ0kgQkFSUyBpZHgg
Ki8KKyNkZWZpbmUJUENJX0JBUjAJCQkwCisjZGVmaW5lCVBDSV9CQVIxCQkJMQorI2RlZmluZQlQ
Q0lfQkFSMgkJCTIKKyNkZWZpbmUJUENJX0JBUjMJCQkzCisjZGVmaW5lCVBDSV9CQVI0CQkJNAor
CisvKiBBVEEgQnVzIE1hc3RlciBSZWdpc3RlciBPZmZzZXRzIGFuZCBWYWx1ZXMqLworI2RlZmlu
ZQlBVEFfQk1DTURfWF9SRUcJCQkweDAwCisjZGVmaW5lCUFUQV9CTUNNRF9ZX1JFRwkJCTB4MDgK
KyNkZWZpbmUJCUFUQV9CTUNNRF9TVEFSVF9TVE9QCTB4MDEKKyNkZWZpbmUJCUFUQV9CTUNNRF9X
UklURV9SRUFECTB4MDgKKworI2RlZmluZQlBVEFfQk1TVEFUX1hfUkVHCQkweDAyCisjZGVmaW5l
CUFUQV9CTVNUQVRfWV9SRUcJCTB4MEEKKyNkZWZpbmUJCUFUQV9CTVNUQVRfQUNUSVZFCTB4MDEK
KyNkZWZpbmUJCUFUQV9CTVNUQVRfRVJST1IJMHgwMgorI2RlZmluZQkJQVRBX0JNU1RBVF9JTlRF
UlJVUFQJMHgwNAorI2RlZmluZQkJQVRBX0JNU1RBVF9NQVNLCQkweDA3CisjZGVmaW5lCQlBVEFf
Qk1TVEFUX0RNQV9NQVNURVIJMHgyMAorI2RlZmluZQkJQVRBX0JNU1RBVF9ETUFfU0xBVkUJMHg0
MAorI2RlZmluZQkJQVRBX0JNU1RBVF9ETUFfU0lNUExFWAkweDgwCisKKyNkZWZpbmUJQVRBX0JN
UFJEVF9YX1JFRwkJMHgwNAorI2RlZmluZQlBVEFfQk1QUkRUX1lfUkVHCQkweDBDCisKKy8qIFRo
ZSBDb21tYW5kIEJsb2NrIHJlZ2lzdGVycyAqLworI2RlZmluZQlBVEFfREFUQV9SRUcJCQkweDAw
CisjZGVmaW5lCUFUQV9FUlJPUl9SRUcJCQkweDAxCisjZGVmaW5lCQlBVEFfRV9JTEkJCTB4MDEg
ICAgLyogaWxsZWdhbCBsZW5ndGggKi8KKyNkZWZpbmUgICAgICAgICBBVEFfRV9BQk9SVCAgICAg
ICAgICAgICAweDA0ICAgIC8qIGNvbW1hbmQgYWJvcnRlZCAqLworI2RlZmluZQlBVEFfRkVBVFVS
RVNfUkVHCQkweDAxCisjZGVmaW5lCUFUQV9TRUNDT1VOVF9SRUcJCTB4MDIKKyNkZWZpbmUJCUFU
QV9JX0NNRAkJMHgwMSAgICAvKiBjbWQgKDEpIHwgZGF0YSAoMCkgKi8KKyNkZWZpbmUJCUFUQV9J
X0lOCQkweDAyICAgIC8qIHJlYWQgKDEpIHwgd3JpdGUgKDApICovCisjZGVmaW5lCQlBVEFfSV9S
RUxFQVNFCQkweDA0ICAgIC8qIHJlbGVhc2VkIGJ1cyAoMSkgKi8KKyNkZWZpbmUJQVRBX0xCQV9M
T1dfUkVHCQkJMHgwMworI2RlZmluZQlBVEFfTEJBX01JRF9SRUcJCQkweDA0CisjZGVmaW5lCUFU
QV9MQkFfSElHSF9SRUcJCTB4MDUKKyNkZWZpbmUJQVRBX0hEREVWU0VMX1JFRwkJMHgwNgorI2Rl
ZmluZQkJQVRBX0RfTEJBCQkweDQwICAgIC8qIHVzZSBMQkEgYWRkcmVzc2luZyAqLworI2RlZmlu
ZQkJQVRBX0RfSUJNCQkweGEwICAgIC8qIDUxMiBieXRlIHNlY3RvcnMsIEVDQyAqLworI2RlZmlu
ZQlBVEFfQ09NTUFORF9SRUcJCQkweDA3CisjZGVmaW5lCUFUQV9TVEFUVVNfUkVHCQkJMHgwNwor
I2RlZmluZQkJQVRBX1NfQlVTWQkJMHg4MCAgICAvKiBidXN5ICovCisjZGVmaW5lCQlBVEFfU19S
RUFEWQkJMHg0MCAgICAvKiBkcml2ZSByZWFkeSAqLworI2RlZmluZQkJQVRBX1NfRFdGCQkweDIw
ICAgIC8qIGRyaXZlIHdyaXRlIGZhdWx0ICovCisjZGVmaW5lCQlBVEFfU19EUlEJCTB4MDggICAg
LyogZGF0YSByZXF1ZXN0ICovCisjZGVmaW5lCQlBVEFfU19EU0MJCTB4MTAgICAgLyogZHJpdmUg
c2VlayBjb21wbGV0ZWQgKi8KKyNkZWZpbmUJCUFUQV9TX0VSUk9SCQkweDAxICAgIC8qIGVycm9y
ICovCisKKy8qIFRoZSBDb250cm9sIEJsb2NrIHJlZ2lzdGVycyAqLworI2RlZmluZQlBVEFfQ09O
VFJPTF9SRUcJCQkweDBDCisjZGVmaW5lCQlBVEFfQV9JRFMJCTB4MDIgICAgLyogZGlzYWJsZSBp
bnRlcnJ1cHRzICovCisjZGVmaW5lCQlBVEFfQV9SRVNFVAkJMHgwNCAgICAvKiBSRVNFVCBjb250
cm9sbGVyICovCisjZGVmaW5lCUFUQV9BTFRTVEFUVVNfUkVHCQkweDBDCisKKyNkZWZpbmUgUkVB
RF9UT0MJCQkweDQzCisKK3N0cnVjdCBhdGFfY2hhbm5lbDsKKwordHlwZWRlZiB2b2lkICgqYXRh
X2ludHJfZnVuY190KSh2b2lkICphcmcpOwordHlwZWRlZiB2b2lkICgqYXRhX3Bpb19lbmRfdHJh
bnNmZXJfZnVuY190KShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworCit0eXBlZGVmIGVu
dW0geworCUFUQV9IRCwKKwlBVEFQSV9DRCwKKwlBVEFfRFJJVkVfRU1QVFkKK30gYXRhX2RyaXZl
X3R5cGU7CisKKy8qCisgKiBBVEEgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCBhdGFfcGlv
X2J1ZmZlciB7CisJdWludDhfdCAgZGF0YVtBVEFfSU5CVUZfU0laRV07CisJdWludDY0X3QgY3Vy
cmVudF9wb3M7Cit9OworCitzdHJ1Y3QgYXRhX3Bpb19zZXR1cCB7CisJdWludDhfdCB1c2Vfd29y
ZDsKKwlzdHJ1Y3QgYmxvY2tpZl9yZXEgYnJlcTsKKwlzdHJ1Y3QgYXRhX3Bpb19idWZmZXIgcGlv
X2J1ZmZlcjsKKworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJYXRhX3Bpb19lbmRfdHJhbnNm
ZXJfZnVuY190IGVuZF90cmFuc2ZlcjsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWw7Cit9
OworCitzdHJ1Y3QgcHJkX2VudHJ5IHsKKwl1aW50MzJfdCBwcmRfYWRkcmVzczsKKwl1aW50MTZf
dCBieXRlX2NvdW50OworCXVpbnQxNl90IHZlbmRvcl9zcGVjaWZpYzsKK30gX19hdHRyaWJ1dGVf
XygoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgcGNpX2F0YV9kbWFfdHJhbnNhY3Rpb24geworCXN0
cnVjdCBibG9ja2lmX3JlcSBicmVxOworCXVpbnQ4X3QgaXNfZW90OworCXVpbnQ4X3Qgc3RhcnRl
ZDsKKwl1aW50NjRfdCBvZmZzZXQ7CisJdWludDY0X3QgbmJ5dGVzOworCXVpbnQ4X3QgIG9wX2Rp
cjsKK307CisKK3N0cnVjdCBhdGFfZHJpdmUgeworCS8qIEFUQSBEcml2ZSBSZWdpc3RlcnMgKi8K
KworCS8qIHRoZSBpbyBwb3J0IHJhbmdlIHNpemUgPSAweDA4ICovCisJdWludDhfdCBkYXRhOwor
CXVpbnQ4X3QgZXJyb3I7CisJdWludDhfdCBmZWF0dXJlczsKKwl1aW50OF90IHNlY2NvdW50Owor
CXVpbnQ4X3QgbGJhX2xvdzsKKwl1aW50OF90IGxiYV9taWQ7CisJdWludDhfdCBsYmFfaGlnaDsK
Kwl1aW50OF90IGhkZGV2c2VsOworCXVpbnQ4X3QgY29tbWFuZDsKKwl1aW50OF90IHN0YXR1czsK
KworCS8qIHRoZSBhbHRwb3J0IHJhbmdlIHNpemUgPSAweDAxICovCisJdWludDhfdCBhbHRzdGF0
dXM7CisKKwlhdGFfZHJpdmVfdHlwZSB0eXBlOworCXVpbnQxNl90IGJ5dGVfY291bnQ7CisJdWlu
dDY0X3Qgb2Zmc2V0OworCXVpbnQ2NF90IGNvdW50OworCXVpbnQ4X3QgaXJxX2Rpc2FibGVkOwor
CXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0OworCXN0cnVjdCBhdGFfcGlvX3NldHVwIHBpb19z
ZXR1cDsKK307CisKK3N0cnVjdCBhdGFfY2hhbm5lbCB7CisJLyogQVRBIENoYW5uZWwgU3RhdGUg
VmFyaWFibGVzICovCisJdWludDMyX3Qgc2l6ZTsKKwl1aW50OF90IGludGVyZmFjZTsKKwl1aW50
OF90IGRyaXZlOworCXVpbnQ4X3QgaGFzX3NsYXZlOworCXVpbnQ4X3QgbW9kZTsKKwl1aW50OF90
IHNlY3RvcnNfcGVyX2Jsb2NrOworCXVpbnQ4X3QgdXNlXzE2Yml0OworCisJc3RydWN0IGJsb2Nr
aWZfcmVxIGZsdXNoX2JyZXE7CisKKwlzdHJ1Y3QgYXRhX2RyaXZlIGRyaXZlc1tBVEFfRFJJVkVT
XTsKKworCXN0cnVjdCB2bWN0eCAqdm1fY3R4OworCXZvaWQgKnByX3NjOworCisJLyogSW50ZXJy
dXB0cyBjYWxsYmFja3MgKFBDSSBvciBMUEMpICovCisJYXRhX2ludHJfZnVuY190IGludHJfYXNz
ZXJ0OworCWF0YV9pbnRyX2Z1bmNfdCBpbnRyX2RlYXNzZXJ0OworCXVpbnQ4X3QgbGludHI7Cit9
OworCitzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyB7CisJLyogQVRBIEJ1cyBNYXN0ZXIgUmVnaXN0ZXIg
Ki8KKwl1aW50OF90ICBjbWRbQVRBX0NIQU5ORUxTXTsKKwl1aW50OF90ICBzdGF0W0FUQV9DSEFO
TkVMU107CisJdWludDMyX3QgcHJkdFtBVEFfQ0hBTk5FTFNdOworCisJc3RydWN0IHBjaV9hdGFf
ZG1hX3RyYW5zYWN0aW9uIGRtYV90cmFuc2FjdGlvbnNbQVRBX0NIQU5ORUxTXTsKKworCXN0cnVj
dCBwY2lfZGV2aW5zdCAqYXNjX3BpOworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbHNbQVRB
X0NIQU5ORUxTXTsKK307CisKK3N0cnVjdCBscGNfYXRhX3NvZnRjIHsKKwlzdHJ1Y3QgYXRhX2No
YW5uZWwgKmNoYW5uZWw7CisJaW50IGlycTsKKwlpbnQgYmFzZV9hZGRyX2lvOworCWludCBiYXNl
X2FkZHJfaW9jdGw7CisJY29uc3QgY2hhciAqbmFtZV9pbzsKKwljb25zdCBjaGFyICpuYW1lX2lv
Y3RsOworfTsKKworCisvKgorICogQVRBIG1vZHVsZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAq
Lworc3RhdGljIHZvaWQKK2F0YV9pcnFfcmFpc2Uoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVs
KTsKK3N0YXRpYyB2b2lkCithdGFfaXJxX2xvd2VyKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l
bCk7CisKK3N0YXRpYyBhdGFfZHJpdmVfdHlwZQorYXRhX2RyaXZlX3R5cGVfYnlfbmFtZShjaGFy
ICpkcml2ZV9uYW1lKTsKK3N0YXRpYyBpbnQKK2F0YV9wYXJzZV9wYXJhbXMoY29uc3QgY2hhciAq
b3B0cywgaW50ICpjaGFubmVsLCBjaGFyICpkaXNrX21hc3RlciwKKwkJIGNoYXIgKmRpc2tfc2xh
dmUsIHVpbnQ4X3QgKmhhc19zbGF2ZSk7CitzdGF0aWMgc3RydWN0IGF0YV9jaGFubmVsICoKK2F0
YV9pbml0KHN0cnVjdCB2bWN0eCAqY3R4LCBhdGFfaW50cl9mdW5jX3QgaW50cl9hc3NlcnQsIGF0
YV9pbnRyX2Z1bmNfdCBpbnRyX2RlYXNzZXJ0LCB2b2lkICpwcl9zYywKKwkgY29uc3QgY2hhciAq
b3B0cywgdWludDhfdCBpc2FfYXQpOworCitzdGF0aWMgdm9pZAorYXRhX3Nyc3Qoc3RydWN0IGF0
YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfaW5pdGlhbGl6ZV9pZGVudChz
dHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9pbml0
aWFsaXplX2lkZW50KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyBpbnQK
K2F0YV9jaGFubmVsX2lzX29rKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCBj
aCk7CitzdGF0aWMgaW50CithdGFfc2VsZWN0X2RyaXZlX2lzX29rKHN0cnVjdCBhdGFfY2hhbm5l
bCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX3NldF9zdGF0dXNfb2soc3RydWN0IGF0YV9j
aGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfc2V0X2RhdGFfYmxvY2tfcmVhZHko
c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfY29tbWFuZF9h
Ym9ydGVkKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX3Nl
dF9zaWduYXR1cmUoc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUpOworCitzdGF0aWMgdm9pZAorYXRh
X2FkZHJlc3Npbmdfc2VjX2NvdW50KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDE2
X3QgKnBfc2VjdG9yX2NvdW50KTsKK3N0YXRpYyB2b2lkCithdGFfYWRkcmVzc2luZ18yOF9sYmEo
c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50MzJfdCAqcF9sYmFfYWRkcmVzcyk7CisK
K3N0YXRpYyB2b2lkCithdGFfaW5pdF9ibG9ja19yZXF1ZXN0KHN0cnVjdCBibG9ja2lmX3JlcSAq
YnJlcSwgc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLAorCQkgICAgICAgdWludDY0X3Qgb2Zm
c2V0LCB1aW50NjRfdCBuYnl0ZXMsIHZvaWQgKmJ1ZmZlcik7CitzdGF0aWMgdm9pZAorYXRhX2hh
bmRsZV9ibG9ja19yZXF1ZXN0KHN0cnVjdCBibG9ja2lmX3JlcSAqcmVxLCBpbnQgZXJyKTsKKwor
c3RhdGljIHZvaWQKK2F0YV9waW9fZG9fdHJhbnNmZXIoc3RydWN0IGF0YV9waW9fc2V0dXAgKnBp
b19zZXR1cCwgdWludDY0X3Qgc2l6ZV90cmFuc2ZlciwKKwkJICAgICBhdGFfcGlvX2VuZF90cmFu
c2Zlcl9mdW5jX3QgZW5kX3RyYW5zZmVyLCB1aW50OF90IHVzZV93b3JkKTsKK3N0YXRpYyBpbnQK
K2F0YV9waW9faW5fcHJvZ3Jlc3Moc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCk7Citz
dGF0aWMgdWludDhfdCAqCithdGFfcGlvX2dldF9idWZmZXJfZGF0YShzdHJ1Y3QgYXRhX3Bpb19z
ZXR1cCAqcGlvX3NldHVwKTsKK3N0YXRpYyB2b2lkCithdGFfcGlvX2NoZWNrX2VuZF90cmFuc2Zl
cihzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKTsKK3N0YXRpYyB1aW50MzJfdAorYXRh
X3Bpb19nZXRfdWludChzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKTsKK3N0YXRpYyB2
b2lkCithdGFfcGlvX3B1dF91aW50KHN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAsIHVp
bnQzMl90IHdyaXRlX3ZhbHVlKTsKK3N0YXRpYyB2b2lkCithdGFfcGlvX2dlbmVyaWNfZW5kX3Ry
YW5zZmVyKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyB2b2lkCithdGFf
cmVhZF9tdWx0aXBsZV9ibG9ja19kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7Citz
dGF0aWMgdm9pZAorYXRhX3dyaXRlX211bHRpcGxlX2Jsb2NrX2RvbmUoc3RydWN0IGF0YV9jaGFu
bmVsICpjaGFubmVsKTsKKworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9oYW5kbGVfcmVhZF9kb25l
KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxl
X2lkZW50aWZ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRh
X2hhbmRsZV9zZXRmZWF0dXJlcyhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGlj
IHZvaWQKK2F0YV9oYW5kbGVfc2V0X211bHRpKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7
CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9yZWFkX211bHRpcGxlKHN0cnVjdCBhdGFfY2hhbm5l
bCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9yZWFkX3ZlcmlmeShzdHJ1Y3Qg
YXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfd3JpdGVfbXVs
dGlwbGUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfaGFu
ZGxlX2RtYShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3Qgb3BfZGlyKTsKK3N0
YXRpYyB2b2lkCithdGFfaGFuZGxlX2ZsdXNoY2FjaGUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFu
bmVsKTsKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX3NlZWsoc3RydWN0IGF0YV9jaGFubmVsICpj
aGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX2F0YXBpX2lkZW50aWZ5KHN0cnVjdCBh
dGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9wYWNrZXRfY21k
KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9j
bWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50OF90IGNtZCk7CisKK3N0YXRpYyB2
b2lkCithdGFfYXRhcGlfZGF0YV9yZXF1ZXN0KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7
CitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2NtZF9kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hh
bm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9pbnF1aXJ5KHN0cnVjdCBhdGFf
Y2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFja2V0KTsKK3N0YXRpYyB2b2lkCithdGFfYXRh
cGlfaGFuZGxlX3JlYWRfY2FwYWNpdHkoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50
OF90ICpwYWNrZXQpOworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9oYW5kbGVfcmVhZF90b2Moc3Ry
dWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50OF90ICpwYWNrZXQpOworc3RhdGljIHZvaWQK
K2F0YV9hdGFwaV9oYW5kbGVfcmVhZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4
X3QgKnBhY2tldCk7CitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2NtZChzdHJ1Y3QgYXRhX2NoYW5u
ZWwgKmNoYW5uZWwpOworCitzdGF0aWMgdWludDY0X3QKK2F0YV9jb21tYW5kX2Jsb2NrX3JlYWQo
c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50NjRfdCBvZmZzZXQpOworc3RhdGljIHZv
aWQKK2F0YV9jb21tYW5kX2Jsb2NrX3dyaXRlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwK
KwkJdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpOworCitzdGF0aWMg
dWludDY0X3QKK2F0YV9hbHRzdGF0dXNfcmVhZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwp
Oworc3RhdGljIHZvaWQKK2F0YV9jb250cm9sX3dyaXRlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hh
bm5lbCwKKwkJaW50IHNpemUsIHVpbnQ2NF90IHZhbHVlKTsKKworLyoKKyAqIFBDSSBBVEEgZnVu
Y3Rpb24gZGVjbGFyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkCitwY2lfYXRhX2ludHJfYXNzZXJ0
KHZvaWQgKmFyZyk7CitzdGF0aWMgdm9pZAorcGNpX2F0YV9pbnRyX2RlYXNzZXJ0KHZvaWQgKmFy
Zyk7CisKK3N0YXRpYyBpbnQKK3BjaV9hdGFfcGFyc2VfcGFyYW1zKGNvbnN0IGNoYXIgKm9wdHMs
IGNoYXIgKm9wdDAsIGNoYXIgKm9wdDEsIHVpbnQ4X3QgKm5yX2NoYW5uZWxzKTsKK3N0YXRpYyBp
bnQKK3BjaV9hdGFfaW5pdChzdHJ1Y3Qgdm1jdHggKmN0eCwgc3RydWN0IHBjaV9kZXZpbnN0ICpw
aSwgY2hhciAqb3B0cywgaW50IGF0YXBpKTsKK3N0YXRpYyBpbnQKK3BjaV9hdGFfaGRfaW5pdChz
dHJ1Y3Qgdm1jdHggKmN0eCwgc3RydWN0IHBjaV9kZXZpbnN0ICpwaSwgY2hhciAqb3B0cyk7CisK
K3N0YXRpYyB2b2lkCitwY2lfYXRhX2RtYV9zdGFydChzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2Ms
IHVpbnQ4X3QgY2gpOworc3RhdGljIHZvaWQKK3BjaV9hdGFfZG1hX3N0b3Aoc3RydWN0IHBjaV9h
dGFfc29mdGMgKnNjLCB1aW50OF90IGNoKTsKK3N0YXRpYyB1aW50NjRfdAorcGNpX2F0YV9idXNf
bWFzdGVyX3JlYWQoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50NjRfdCBvZmZzZXQpOwor
c3RhdGljIHZvaWQKK3BjaV9hdGFfYnVzX21hc3Rlcl93cml0ZShzdHJ1Y3QgcGNpX2F0YV9zb2Z0
YyAqc2MsCisJCXVpbnQ2NF90IG9mZnNldCwgaW50IHNpemUsIHVpbnQ2NF90IHZhbHVlKTsKKwor
c3RhdGljIHVpbnQ2NF90CitwY2lfYXRhX3JlYWQoc3RydWN0IHZtY3R4ICpjdHgsIGludCB2Y3B1
LCBzdHJ1Y3QgcGNpX2Rldmluc3QgKnBpLCBpbnQgYmFyaWR4LAorCQl1aW50NjRfdCBvZmZzZXQs
IGludCBzaXplKTsKK3N0YXRpYyB2b2lkCitwY2lfYXRhX3dyaXRlKHN0cnVjdCB2bWN0eCAqY3R4
LCBpbnQgdmNwdSwgc3RydWN0IHBjaV9kZXZpbnN0ICpwaSwKKwkJaW50IGJhcmlkeCwgdWludDY0
X3Qgb2Zmc2V0LCBpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpOworCisvKgorICogTFBDIEFUQSBm
dW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2xwY19hdGFfaW50cl9hc3Nl
cnQodm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkCitscGNfYXRhX2ludHJfZGVhc3NlcnQodm9pZCAq
YXJnKTsKKworaW50CitscGNfYXRhX2luaXQoc3RydWN0IHZtY3R4ICpjdHgsIGNvbnN0IGNoYXIg
Km9wdHMpOworCitzdGF0aWMgaW50CitscGNfYXRhX2lvX2hhbmRsZXIoc3RydWN0IHZtY3R4ICpj
dHgsIGludCB2Y3B1LAorCQkgICBpbnQgaW4sIGludCBwb3J0LCBpbnQgYnl0ZXMsIHVpbnQzMl90
ICplYXgsIHZvaWQgKmFyZyk7CitzdGF0aWMgaW50CitscGNfYXRhX2lvY3RsX2hhbmRsZXIoc3Ry
dWN0IHZtY3R4ICpjdHgsIGludCB2Y3B1LAorCQkgICBpbnQgaW4sIGludCBwb3J0LCBpbnQgYnl0
ZXMsIHVpbnQzMl90ICplYXgsIHZvaWQgKmFyZyk7CisKKworLyoKKyAqIEFUQSBnbG9iYWwgZGF0
YQorICovCitzdHJ1Y3QgcGNpX2RldmVtdSBwY2lfZGVfYXRhX2hkID0geworCS5wZV9lbXUgPQki
YXRhLWhkIiwKKwkucGVfaW5pdCA9CXBjaV9hdGFfaGRfaW5pdCwKKwkucGVfYmFyd3JpdGUgPQlw
Y2lfYXRhX3dyaXRlLAorCS5wZV9iYXJyZWFkID0JcGNpX2F0YV9yZWFkCit9OworUENJX0VNVUxf
U0VUKHBjaV9kZV9hdGFfaGQpOworCitzdGF0aWMgc3RydWN0IGxwY19hdGFfc29mdGMgbHBjX2F0
YV9zY1tBVEFfQ0hBTk5FTFNdID0geworCXtOVUxMLCAxNCwgMHgxZjAsIDB4M2Y2LCAiYXRhMF9p
b3BvcnQiLCAiYXRhMF9pb2N0bHBvcnQifSwKKwl7TlVMTCwgMTUsIDB4MTcwLCAweDM3NiwgImF0
YTFfaW9wb3J0IiwgImF0YTFfaW9jdGxwb3J0In0KK307CisKKworLyoKKyAqIEFUQSBtb2R1bGUg
ZnVuY3Rpb24gZGVmaW5pdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2F0YV9pcnFfcmFpc2Uoc3Ry
dWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXVpbnQ4X3QgaXJxX2Rpc2FibGVkOworCisJ
aXJxX2Rpc2FibGVkID0gY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXS5pcnFfZGlzYWJs
ZWQ7CisKKwlpZiAoIWlycV9kaXNhYmxlZCAmJiAhY2hhbm5lbC0+bGludHIpIHsKKwkJY2hhbm5l
bC0+bGludHIgPSAxOworCQljaGFubmVsLT5pbnRyX2Fzc2VydChjaGFubmVsLT5wcl9zYyk7CisJ
fQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2lycV9sb3dlcihzdHJ1Y3QgYXRh
X2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaWYgKGNoYW5uZWwtPmxpbnRyKSB7CisJCWNoYW5uZWwt
PmxpbnRyID0gMDsKKwkJY2hhbm5lbC0+aW50cl9kZWFzc2VydChjaGFubmVsLT5wcl9zYyk7CisJ
fQorCisJcmV0dXJuOworfQorCitzdGF0aWMgYXRhX2RyaXZlX3R5cGUKK2F0YV9kcml2ZV90eXBl
X2J5X25hbWUoY2hhciAqZHJpdmVfbmFtZSkKK3sKKwlpbnQgaSwgbGVuOworCWNoYXIgKmV4dCA9
IE5VTEw7CisKKwlpZiAoIWRyaXZlX25hbWUpCisJCXJldHVybiBBVEFfRFJJVkVfRU1QVFk7CisK
KwlsZW4gPSBzdHJsZW4oZHJpdmVfbmFtZSk7CisKKwlmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7
IGktLSkgeworCQlpZiAoZHJpdmVfbmFtZVtpXSA9PSAnLicpIHsKKwkJCWV4dCA9IGRyaXZlX25h
bWUgKyBpICsgMTsKKwkJCWlmIChzdHJjbXAoZXh0LCAiaXNvIikgPT0gMCkKKwkJCQlyZXR1cm4g
QVRBUElfQ0Q7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBBVEFfSEQ7Cit9CisKK3N0
YXRpYyBpbnQKK2F0YV9wYXJzZV9wYXJhbXMoY29uc3QgY2hhciAqb3B0cywgaW50ICpjaGFubmVs
LCBjaGFyICpkaXNrX21hc3RlciwKKwkJIGNoYXIgKmRpc2tfc2xhdmUsIHVpbnQ4X3QgKmhhc19z
bGF2ZSkKK3sKKwl1aW50OF90IGxlbjsKKwljaGFyIHBhcmFtWzY0XTsKKwljaGFyICpwYXJhbXNb
M107CisJdWludDhfdCBpLCBqOworCWludCBjaDsKKworCXBhcmFtc1swXSA9IE5VTEw7CisJcGFy
YW1zWzFdID0gTlVMTDsKKwlwYXJhbXNbMl0gPSBOVUxMOworCisJaWYgKCFvcHRzKSB7CisJCWRw
cmludChMT0dfRVJSLCAiYXRhX3BhcnNlX3BhcmFtczogb3B0cyBzaG91bGQgYmUgbGlrZTogWCxN
QVNURVJbLFNMQVZFXVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW4gPSBzdHJsZW4ob3B0
cyk7CisJaWYgKGxlbiA+PSA2NCkgeworCQlkcHJpbnQoTE9HX0VSUiwgImF0YV9wYXJzZV9wYXJh
bXM6IEFUQSBzdHJpbmcgcGFyYW0gdG9vIGJpZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlz
dHJjcHkocGFyYW0sIG9wdHMpOworCisJaiA9IDA7CisJcGFyYW1zW2pdID0gcGFyYW07CisJZm9y
IChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChwYXJhbVtpXSA9PSAnLCcpIHsKKwkJCWor
KzsKKwkJCWlmIChqID4gMikgeworCQkJCWRwcmludChMT0dfRVJSLCAiYXRhX3BhcnNlX3BhcmFt
czogdG8gbWFueSBwYXJhbXNcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXBhcmFtW2ld
ID0gJ1wwJzsKKwkJCXBhcmFtc1tqXSA9IHBhcmFtICsgaSArIDE7CisJCX0KKwl9CisKKwljaCA9
IGF0b2kocGFyYW1zWzBdKTsKKwlpZiAoY2ggIT0gQVRBX1ggJiYgY2ggIT0gQVRBX1kpIHsKKwkJ
ZHByaW50KExPR19FUlIsICJhdGFfcGFyc2VfcGFyYW1zOiB0aGUgY2hhbm5lbCBzaG91bGQgYmUg
MCBvciAxXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwkqY2hhbm5lbCA9IGNoOworCisJaWYgKHBh
cmFtc1sxXSA9PSBOVUxMIHx8IHN0cmxlbihwYXJhbXNbMV0pID49IDMyKSB7CisJCWRwcmludChM
T0dfRVJSLCAiYXRhX3BhcnNlX3BhcmFtczogdGhlIG5hbWUgb2YgTUFTVEVSIHNob3VsZCBiZSBn
aXZlblxuIik7CisJCXJldHVybiAtMTsKKwl9CisJc3RyY3B5KGRpc2tfbWFzdGVyLCBwYXJhbXNb
MV0pOworCisJaWYgKHBhcmFtc1syXSAhPSBOVUxMICYmIHN0cmxlbihwYXJhbXNbMl0pIDwgMzIp
IHsKKwkJc3RyY3B5KGRpc2tfc2xhdmUsICBwYXJhbXNbMl0pOworCQkqaGFzX3NsYXZlID0gMTsK
Kwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgc3RydWN0IGF0YV9jaGFubmVsICoKK2F0
YV9pbml0KHN0cnVjdCB2bWN0eCAqY3R4LCBhdGFfaW50cl9mdW5jX3QgaW50cl9hc3NlcnQsIGF0
YV9pbnRyX2Z1bmNfdCBpbnRyX2RlYXNzZXJ0LCB2b2lkICpwcl9zYywKKwkgY29uc3QgY2hhciAq
b3B0cywgdWludDhfdCBpc2FfYXQpCit7CisJY2hhciBiaWRlbnRbc2l6ZW9mKCJYWDpYOlg6WCIp
XTsKKwlzdHJ1Y3QgYmxvY2tpZl9jdHh0ICpiY3R4dCA9IE5VTEwsICpiY3R4dF9zID0gTlVMTDsK
KwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworCWludCByZXQ7CisJaW50IGNo
X2F0YSA9IC0xOworCWNoYXIgZGlza19tYXN0ZXJbMzJdOworCWNoYXIgZGlza19zbGF2ZVszMl07
CisJdWludDhfdCBoYXNfc2xhdmUgPSAwOworCWF0YV9kcml2ZV90eXBlIG1hc3Rlcl90eXBlID0g
QVRBX0RSSVZFX0VNUFRZOworCWF0YV9kcml2ZV90eXBlIHNsYXZlX3R5cGUgPSBBVEFfRFJJVkVf
RU1QVFk7CisKKwlyZXQgPSBhdGFfcGFyc2VfcGFyYW1zKG9wdHMsICZjaF9hdGEsIGRpc2tfbWFz
dGVyLCBkaXNrX3NsYXZlLCAmaGFzX3NsYXZlKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZHByaW50
KExPR19FUlIsICJhdGFfaW5pdDogc29tZSBlcnJvcnMgd2l0aCB0aGUgaW5wdXQgY2hlY2tpbmdc
biIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6
IGNoX2F0YTogJWRcbiIsIGNoX2F0YSk7CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gb3BlbiB0aGUg
YmFja2luZyBpbWFnZXMuIFVzZSB0aGUKKwkgKiAiUENJL0lTQTpjaDpkcml2ZSIgZm9yIHRoZSBp
ZGVudGlmaWVyIHN0cmluZy4KKwkgKi8KKwlzbnByaW50ZihiaWRlbnQsIHNpemVvZihiaWRlbnQp
LCAiJWQ6JWQ6JWQiLCBpc2FfYXQsIGNoX2F0YSwgQVRBX01BU1RFUik7CisJYmN0eHQgPSBibG9j
a2lmX29wZW4oZGlza19tYXN0ZXIsIGJpZGVudCk7CisJaWYgKGJjdHh0ID09IE5VTEwpIHsKKwkJ
Z290byBvcGVuX2ZhaWw7CisJfQorCisJbWFzdGVyX3R5cGUgPSBhdGFfZHJpdmVfdHlwZV9ieV9u
YW1lKGRpc2tfbWFzdGVyKTsKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6IGRpc2tfbWFz
dGVyOiAlcyB0eXBlOiAlc1xuIiwKKwkgICAgICAgZGlza19tYXN0ZXIsIG1hc3Rlcl90eXBlID09
IEFUQV9IRCA/ICJhdGFfaGQiIDogImF0YXBpX2NkIik7CisKKwlpZiAoaGFzX3NsYXZlKSB7CisJ
CXNucHJpbnRmKGJpZGVudCwgc2l6ZW9mKGJpZGVudCksICIlZDolZDolZCIsIGlzYV9hdCwgY2hf
YXRhLCBBVEFfU0xBVkUpOworCQliY3R4dF9zID0gYmxvY2tpZl9vcGVuKGRpc2tfc2xhdmUsIGJp
ZGVudCk7CisJCWlmIChiY3R4dF9zID09IE5VTEwpIHsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG9w
ZW5fZmFpbDsKKwkJfQorCisJCXNsYXZlX3R5cGUgPSBhdGFfZHJpdmVfdHlwZV9ieV9uYW1lKGRp
c2tfc2xhdmUpOworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6IGRpc2tfc2xhdmU6ICVz
IHR5cGU6ICVzXG4iLAorCQkgICAgICAgZGlza19zbGF2ZSwgc2xhdmVfdHlwZSA9PSBBVEFfSEQg
PyAiYXRhX2hkIiA6ICJhdGFwaV9jZCIpOworCX0KKworCWRwcmludChMT0dfREVCVUcsICJhdGFf
aW5pdDogb3B0czogJXMsIGF0YXBpOiAlZFxuIiwgb3B0cywgMCk7CisKKwljaGFubmVsID0gY2Fs
bG9jKDEsIHNpemVvZihzdHJ1Y3QgYXRhX2NoYW5uZWwpKTsKKworCWNoYW5uZWwtPnZtX2N0eCA9
IGN0eDsKKwljaGFubmVsLT5pbnRlcmZhY2UgPSBjaF9hdGE7CisJY2hhbm5lbC0+aGFzX3NsYXZl
ID0gaGFzX3NsYXZlOworCisJY2hhbm5lbC0+ZHJpdmVzW0FUQV9NQVNURVJdLnR5cGUgPSBtYXN0
ZXJfdHlwZTsKKwljaGFubmVsLT5kcml2ZXNbQVRBX1NMQVZFXS50eXBlID0gc2xhdmVfdHlwZTsK
KworCWNoYW5uZWwtPmRyaXZlc1tBVEFfTUFTVEVSXS5iY3R4dCA9IGJjdHh0OworCWNoYW5uZWwt
PmRyaXZlc1tBVEFfU0xBVkVdLmJjdHh0ICA9IGJjdHh0X3M7CisKKwljaGFubmVsLT5kcml2ZXNb
QVRBX01BU1RFUl0ucGlvX3NldHVwLmNoYW5uZWwgPSBjaGFubmVsOworCWNoYW5uZWwtPmRyaXZl
c1tBVEFfU0xBVkVdLnBpb19zZXR1cC5jaGFubmVsICA9IGNoYW5uZWw7CisKKwljaGFubmVsLT5p
bnRyX2Fzc2VydCA9IGludHJfYXNzZXJ0OworCWNoYW5uZWwtPmludHJfZGVhc3NlcnQgPSBpbnRy
X2RlYXNzZXJ0OworCWNoYW5uZWwtPnByX3NjID0gcHJfc2M7CisKKwlyZXR1cm4gY2hhbm5lbDsK
Kworb3Blbl9mYWlsOgorCWlmIChyZXQpIHsKKwkJYmxvY2tpZl9jbG9zZShiY3R4dCk7CisJCWlm
IChiY3R4dF9zICE9IE5VTEwpIHsKKwkJCWJsb2NraWZfY2xvc2UoYmN0eHRfcyk7CisJCX0KKwl9
CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2F0YV9zcnN0KHN0cnVjdCBhdGFf
Y2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9IE5VTEw7CisJ
aW50IGRldjsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFfc3JzdDogU29mdHdhcmUgUmVzZXRc
biIpOworCisJZm9yIChkZXYgPSAwOyBkZXYgPCBBVEFfRFJJVkVTOyBkZXYrKykgeworCQlkcml2
ZSA9ICZjaGFubmVsLT5kcml2ZXNbZGV2XTsKKworCQlpZiAoZHJpdmUtPnR5cGUgIT0gQVRBX0RS
SVZFX0VNUFRZKSB7CisKKwkJCWRyaXZlLT5lcnJvciAgPSBBVEFfRV9JTEk7CisJCQlkcml2ZS0+
c3RhdHVzID0gQVRBX1NfUkVBRFk7CisKKwkJCWF0YV9zZXRfc2lnbmF0dXJlKGRyaXZlKTsKKwkJ
fQorCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9pbml0aWFsaXplX2lkZW50
KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2
ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBibG9ja2lmX2N0
eHQgKmJjdHh0ID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX3BhcmFtcyAqaWRlbnRfZGF0YSA9IE5VTEw7
CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisKKwl1aW50MTZfdCBj
eWxpbmRlcnM7CisJdWludDhfdCAgaGVhZHM7CisJdWludDhfdCAgc2VjdG9yczsKKwl1aW50MzJf
dCB0b3RhbF9zZWN0b3JzOworCisJYmN0eHQgPSBkcml2ZS0+YmN0eHQ7CisJcGlvX3NldHVwID0g
JmRyaXZlLT5waW9fc2V0dXA7CisJaWRlbnRfZGF0YSA9IChzdHJ1Y3QgYXRhX3BhcmFtcyAqKWF0
YV9waW9fZ2V0X2J1ZmZlcl9kYXRhKHBpb19zZXR1cCk7CisKKwl0b3RhbF9zZWN0b3JzID0gYmxv
Y2tpZl9zaXplKGJjdHh0KSAvIEFUQV9TRUNUT1JfU0laRTsKKworCW1lbXNldChpZGVudF9kYXRh
LCAwLCBzaXplb2Yoc3RydWN0IGF0YV9wYXJhbXMpKTsKKworCS8qIE51bWJlciBvZiBzZWN0b3Jz
IHBlciBibG9jayB1c2VkIGluIHJlYWQgLyB3cml0ZSBtdWx0aSBjb21tYW5kcyAqLworCWlkZW50
X2RhdGEtPnNlY3RvcnNfaW50ciB8PSAweDgwIDw8IDg7CisJaWRlbnRfZGF0YS0+c2VjdG9yc19p
bnRyIHw9IEFUQV9TRUNUT1JTX1BFUl9CTE9DSzsKKworCS8qIFVzZSBETUEyIG1vZGUgKi8KKwlp
ZGVudF9kYXRhLT5jYXBhYmlsaXRpZXMxIHw9IEFUQV9TVVBQT1JUX0RNQTsKKwlpZGVudF9kYXRh
LT5td2RtYW1vZGVzIHw9IEFUQV9XX0RNQTI7CisKKwkvKiBVc2UgUElPNCBtb2RlICovCisJaWRl
bnRfZGF0YS0+YXRhdmFsaWQgIHw9IEFUQV9GTEFHXzY0XzcwOworCWlkZW50X2RhdGEtPmFwaW9t
b2RlcyB8PSBBVEFfTU9ERV9QSU80OworCisJLyogV2UgdXNlIDI4LWJpdCBMQkEgYWRkcmVzc2lu
ZyBiZWNhdXNlIENIUyBhZGRyZXNzaW5nIGlzIG9ic29sZXRlIGluIEFUQS9BVEFQSSA2ICovCisJ
aWRlbnRfZGF0YS0+Y2FwYWJpbGl0aWVzMSB8PSBBVEFfU1VQUE9SVF9MQkE7CisJaWRlbnRfZGF0
YS0+bGJhX3NpemVfMSA9IHRvdGFsX3NlY3RvcnM7CisJaWRlbnRfZGF0YS0+bGJhX3NpemVfMiA9
IHRvdGFsX3NlY3RvcnMgPj4gMTY7CisKKwkvKiBTdXBwb3J0IHdyaXRlLXJlYWQtdmVyaWZ5ICov
CisJaWRlbnRfZGF0YS0+c3VwcG9ydDIgfD0gQVRBX1NVUFBPUlRfV1JJVEVSRUFEVkVSSUZZOwor
CWlkZW50X2RhdGEtPmVuYWJsZWQyIHw9IEFUQV9TVVBQT1JUX1dSSVRFUkVBRFZFUklGWTsKKwor
CS8qIFN1cHBvcnQgQVRBIEZMVVNIQ0FDSEUgKi8KKwlpZGVudF9kYXRhLT5zdXBwb3J0LmNvbW1h
bmQyIHw9IEFUQV9TVVBQT1JUX0ZMVVNIQ0FDSEU7CisJaWRlbnRfZGF0YS0+ZW5hYmxlZC5jb21t
YW5kMiB8PSBBVEFfU1VQUE9SVF9GTFVTSENBQ0hFOworCisJLyogTWFqb3IgdmVyc2lvbiBudW1i
ZXIgPSBBVEEvQVRBUEktNiAqLworCWlkZW50X2RhdGEtPnZlcnNpb25fbWFqb3IgfD0gQVRBX0FU
QVBJXzY7CisKKwkvKiBUaGlzIGluZm9ybWF0aW9uIGFyZSB1c2VkIG9ubHkgZm9yIHByaW50aW5n
IHB1cnBvc2VzICovCisJYmxvY2tpZl9jaHMoYmN0eHQsICZjeWxpbmRlcnMsICZoZWFkcywgJnNl
Y3RvcnMpOworCisJaWRlbnRfZGF0YS0+Y3lsaW5kZXJzID0gY3lsaW5kZXJzOworCWlkZW50X2Rh
dGEtPmhlYWRzICAgICA9IGhlYWRzOworCWlkZW50X2RhdGEtPnNlY3RvcnMgICA9IHNlY3RvcnM7
CisKKwkvKiBNb2RlbDogQkhZVkUgQVRBIElERSBESVNLICovCisJbWVtY3B5KGlkZW50X2RhdGEt
Pm1vZGVsLCAgICAiSEJWWSBFVEEgQURJIEVJREtTICAgICAgICAgICAgICAgICAgICAgICIsIDQw
KTsKKwkvKiBTZXJpYWwgbnVtYmVyOiAxMjM0NTYgKi8KKwltZW1jcHkoaWRlbnRfZGF0YS0+c2Vy
aWFsLCAgICIyMTQzNjUgICAgICAgICAgICAgICIsIDIwKTsKKwkvKiBGaXJtd2FyZSB2ZXJzaW9u
OiAxLjAgKi8KKwltZW1jcHkoaWRlbnRfZGF0YS0+cmV2aXNpb24sICIuMSAwICAgICIsIDgpOwor
CisJZHByaW50KExPR19ERUJVRywgImF0YV9pbml0aWFsaXplX2lkZW50OiBjaGFubmVsOiAlZCwg
ZHJpdmU6ICVkIEM6ICVkLCBIOiAlZCwgUzogJWQsIHRvdGFsX3NlY3RvcnM6ICVkXG4iLAorCQkJ
Y2hhbm5lbC0+aW50ZXJmYWNlLCBjaGFubmVsLT5kcml2ZSwgY3lsaW5kZXJzLCBoZWFkcywgc2Vj
dG9ycywgdG90YWxfc2VjdG9ycyk7CisKKwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1cCwg
c2l6ZW9mKHN0cnVjdCBhdGFfcGFyYW1zKSwgYXRhX3Bpb19nZW5lcmljX2VuZF90cmFuc2Zlciwg
Y2hhbm5lbC0+dXNlXzE2Yml0KTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9h
dGFwaV9pbml0aWFsaXplX2lkZW50KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlz
dHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVd
OworCXN0cnVjdCBhdGFfcGFyYW1zICppZGVudF9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX3Bp
b19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3Nl
dHVwOworCWlkZW50X2RhdGEgPSAoc3RydWN0IGF0YV9wYXJhbXMgKilhdGFfcGlvX2dldF9idWZm
ZXJfZGF0YShwaW9fc2V0dXApOworCisJbWVtc2V0KGlkZW50X2RhdGEsIDAsIHNpemVvZihzdHJ1
Y3QgYXRhX3BhcmFtcykpOworCisJLyogQ0RST00gZGV2aWNlICovCisJaWRlbnRfZGF0YS0+Y29u
ZmlnIHw9IChBVEFfUFJPVE9fQVRBUElfMTIgfCBBVEFfQVRBUElfVFlQRV9DRFJPTSB8IEFUQV9E
UlFfRkFTVCk7CisKKwkvKiBVc2UgRE1BMiBtb2RlICovCisJaWRlbnRfZGF0YS0+Y2FwYWJpbGl0
aWVzMSB8PSBBVEFfU1VQUE9SVF9ETUE7CisJaWRlbnRfZGF0YS0+bXdkbWFtb2RlcyB8PSBBVEFf
V19ETUEyOworCisJLyogVXNlIFBJTzQgbW9kZSAqLworCWlkZW50X2RhdGEtPmF0YXZhbGlkICB8
PSBBVEFfRkxBR182NF83MDsKKwlpZGVudF9kYXRhLT5hcGlvbW9kZXMgfD0gQVRBX01PREVfUElP
NDsKKworCS8qIFdlIHVzZSAyOC1iaXQgTEJBIGFkZHJlc3NpbmcgYmVjYXVzZSBDSFMgYWRkcmVz
c2luZyBpcyBvYnNvbGV0ZSBpbiBBVEEvQVRBUEkgNiAqLworCWlkZW50X2RhdGEtPmNhcGFiaWxp
dGllczEgfD0gQVRBX1NVUFBPUlRfTEJBOworCisJLyogTWFqb3IgdmVyc2lvbiBudW1iZXIgPSBB
VEEvQVRBUEktNiAqLworCWlkZW50X2RhdGEtPnZlcnNpb25fbWFqb3IgfD0gQVRBX0FUQVBJXzY7
CisKKwkvKiBNb2RlbDogQkhZVkUgQVRBUEkgSURFIENEUk9NICovCisJbWVtY3B5KGlkZW50X2Rh
dGEtPm1vZGVsLCAgICAiSEJWWSBFVEFQQSBJREkgRURDT1IgTSAgICAgICAgICAgICAgICAgICIs
IDQwKTsKKwkvKiBTZXJpYWwgbnVtYmVyOiAxMjM0NTYgKi8KKwltZW1jcHkoaWRlbnRfZGF0YS0+
c2VyaWFsLCAgICIyMTQzNjUgICAgICAgICAgICAgICIsIDIwKTsKKwkvKiBGaXJtd2FyZSB2ZXJz
aW9uOiAxLjAgKi8KKwltZW1jcHkoaWRlbnRfZGF0YS0+cmV2aXNpb24sICIuMSAwICAgICIsIDgp
OworCisJZHByaW50KExPR19ERUJVRywgImF0YV9hdGFwaV9pbml0aWFsaXplX2lkZW50OiBjaGFu
bmVsOiAlZCwgZHJpdmU6ICVkXG4iLAorCSAgICAgICBjaGFubmVsLT5pbnRlcmZhY2UsIGNoYW5u
ZWwtPmRyaXZlKTsKKworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXplb2Yoc3Ry
dWN0IGF0YV9wYXJhbXMpLCBhdGFfcGlvX2dlbmVyaWNfZW5kX3RyYW5zZmVyLCBjaGFubmVsLT51
c2VfMTZiaXQpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50CithdGFfY2hhbm5lbF9pc19v
ayhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3QgY2gpCit7CisJaWYgKGNoYW5u
ZWwtPmludGVyZmFjZSA9PSBjaCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh
dGljIGludAorYXRhX3NlbGVjdF9kcml2ZV9pc19vayhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5u
ZWwpCit7CisJaWYgKGNoYW5uZWwtPmRyaXZlID09IEFUQV9TTEFWRSAmJiAhY2hhbm5lbC0+aGFz
X3NsYXZlKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9p
ZAorYXRhX3NldF9zdGF0dXNfb2soc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0
cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07
CisKKwlkcml2ZS0+c3RhdHVzICY9IH5BVEFfU19CVVNZOworCWRyaXZlLT5zdGF0dXMgfD0gQVRB
X1NfUkVBRFk7CisJZHJpdmUtPnN0YXR1cyAmPSB+QVRBX1NfRFdGOworCWRyaXZlLT5zdGF0dXMg
Jj0gfkFUQV9TX0RSUTsKKwlkcml2ZS0+c3RhdHVzICY9IH5BVEFfU19FUlJPUjsKKworCWRyaXZl
LT5lcnJvciA9IDA7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfc2V0X2RhdGFf
YmxvY2tfcmVhZHkoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFf
ZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcml2
ZS0+YWx0c3RhdHVzICY9IH5BVEFfU19CVVNZOworCWRyaXZlLT5hbHRzdGF0dXMgfD0gQVRBX1Nf
RFJROworCWRyaXZlLT5hbHRzdGF0dXMgfD0gQVRBX1NfUkVBRFk7CisKKwlkcml2ZS0+c3RhdHVz
IHw9IEFUQV9TX0RSUTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9jb21tYW5k
X2Fib3J0ZWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJp
dmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcml2ZS0+
c3RhdHVzICY9IH5BVEFfU19CVVNZOworCWRyaXZlLT5zdGF0dXMgJj0gfkFUQV9TX0RSUTsKKwlk
cml2ZS0+c3RhdHVzIHw9IEFUQV9TX0VSUk9SOworCisJZHJpdmUtPmVycm9yIHw9IEFUQV9FX0FC
T1JUOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX3NldF9zaWduYXR1cmUoc3Ry
dWN0IGF0YV9kcml2ZSAqZHJpdmUpCit7CisJZHJpdmUtPnNlY2NvdW50ID0gMHgwMTsKKwlkcml2
ZS0+bGJhX2xvdyAgPSAweDAxOworCisJaWYgKGRyaXZlLT50eXBlID09IEFUQV9IRCkgeworCQlk
cml2ZS0+bGJhX21pZCAgPSAweDAwOworCQlkcml2ZS0+bGJhX2hpZ2ggPSAweDAwOworCQlkcml2
ZS0+aGRkZXZzZWwgPSAweDAwOworCX0KKwllbHNlIGlmIChkcml2ZS0+dHlwZSA9PSBBVEFQSV9D
RCkgeworCQlkcml2ZS0+bGJhX21pZCAgPSBBVEFQSV9NQUdJQ19MU0I7CisJCWRyaXZlLT5sYmFf
aGlnaCA9IEFUQVBJX01BR0lDX01TQjsKKwkJZHJpdmUtPmhkZGV2c2VsICY9IDB4MTA7CisJfQor
CWVsc2UKKwkJYXNzZXJ0KDApOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2Fk
ZHJlc3Npbmdfc2VjX2NvdW50KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDE2X3Qg
KnBfc2VjdG9yX2NvdW50KQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwt
PmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJdWludDE2X3Qgc2VjdG9yX2NvdW50OworCisJc2Vj
dG9yX2NvdW50ID0gZHJpdmUtPnNlY2NvdW50ID8gZHJpdmUtPnNlY2NvdW50IDogQVRBX01BWF9T
RUNfQ09VTlQ7CisJKnBfc2VjdG9yX2NvdW50ID0gc2VjdG9yX2NvdW50OworCisJcmV0dXJuOwor
fQorCitzdGF0aWMgdm9pZAorYXRhX2FkZHJlc3NpbmdfMjhfbGJhKHN0cnVjdCBhdGFfY2hhbm5l
bCAqY2hhbm5lbCwgdWludDMyX3QgKnBfbGJhX2FkZHJlc3MpCit7CisJc3RydWN0IGF0YV9kcml2
ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwl1aW50MzJfdCBs
YmFfYWRkcmVzcyA9IDA7CisKKwlsYmFfYWRkcmVzcyB8PSBkcml2ZS0+bGJhX2xvdzsKKwlsYmFf
YWRkcmVzcyB8PSBkcml2ZS0+bGJhX21pZCA8PCA4OworCWxiYV9hZGRyZXNzIHw9IGRyaXZlLT5s
YmFfaGlnaCA8PCAxNjsKKwlsYmFfYWRkcmVzcyB8PSAoZHJpdmUtPmhkZGV2c2VsICYgQVRBX0xC
QV8yN18yNF9NQVNLKSA8PCAyNDsKKworCSpwX2xiYV9hZGRyZXNzID0gbGJhX2FkZHJlc3M7CisK
KwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaW5pdF9ibG9ja19yZXF1ZXN0KHN0cnVj
dCBibG9ja2lmX3JlcSAqYnJlcSwgc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLAorCQkgICAg
ICAgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBuYnl0ZXMsIHZvaWQgKmJ1ZmZlcikKK3sKKwli
cmVxLT5icl9wYXJhbSA9IGNoYW5uZWw7CisJYnJlcS0+YnJfY2FsbGJhY2sgPSBhdGFfaGFuZGxl
X2Jsb2NrX3JlcXVlc3Q7CisJYnJlcS0+YnJfb2Zmc2V0ID0gb2Zmc2V0OworCWJyZXEtPmJyX2lv
dmNudCA9IDE7CisJYnJlcS0+YnJfaW92WzBdLmlvdl9sZW4gPSBuYnl0ZXM7CisJYnJlcS0+YnJf
aW92WzBdLmlvdl9iYXNlID0gYnVmZmVyOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAor
YXRhX2hhbmRsZV9ibG9ja19yZXF1ZXN0KHN0cnVjdCBibG9ja2lmX3JlcSAqcmVxLCBpbnQgZXJy
KQoreworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCA9IChzdHJ1Y3QgYXRhX2NoYW5uZWwg
KilyZXEtPmJyX3BhcmFtOworCisJYXRhX3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJYXRhX3Nl
dF9kYXRhX2Jsb2NrX3JlYWR5KGNoYW5uZWwpOworCWF0YV9pcnFfcmFpc2UoY2hhbm5lbCk7CisK
KwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfcGlvX2RvX3RyYW5zZmVyKHN0cnVjdCBh
dGFfcGlvX3NldHVwICpwaW9fc2V0dXAsIHVpbnQ2NF90IHNpemVfdHJhbnNmZXIsCisJCSAgICAg
YXRhX3Bpb19lbmRfdHJhbnNmZXJfZnVuY190IGVuZF90cmFuc2ZlciwgdWludDhfdCB1c2Vfd29y
ZCkKK3sKKwlhc3NlcnQoc2l6ZV90cmFuc2ZlciA8PSBBVEFfSU5CVUZfU0laRSk7CisJYXNzZXJ0
KCFhdGFfcGlvX2luX3Byb2dyZXNzKHBpb19zZXR1cCkpOworCisJcGlvX3NldHVwLT51c2Vfd29y
ZCA9IHVzZV93b3JkOworCXBpb19zZXR1cC0+cGlvX2J1ZmZlci5jdXJyZW50X3BvcyA9IDA7CisJ
cGlvX3NldHVwLT5zaXplX3RyYW5zZmVyID0gc2l6ZV90cmFuc2ZlcjsKKwlwaW9fc2V0dXAtPmVu
ZF90cmFuc2ZlciA9IGVuZF90cmFuc2ZlcjsKKworCXJldHVybjsKK30KKworc3RhdGljIGludAor
YXRhX3Bpb19pbl9wcm9ncmVzcyhzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKQorewor
CXJldHVybiAoaW50KXBpb19zZXR1cC0+ZW5kX3RyYW5zZmVyOworfQorCitzdGF0aWMgdWludDhf
dCAqCithdGFfcGlvX2dldF9idWZmZXJfZGF0YShzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3Nl
dHVwKQoreworCXJldHVybiBwaW9fc2V0dXAtPnBpb19idWZmZXIuZGF0YTsKK30KKworc3RhdGlj
IHZvaWQKK2F0YV9waW9fY2hlY2tfZW5kX3RyYW5zZmVyKHN0cnVjdCBhdGFfcGlvX3NldHVwICpw
aW9fc2V0dXApCit7CisJc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsID0gcGlvX3NldHVwLT5j
aGFubmVsOworCXN0cnVjdCBhdGFfcGlvX2J1ZmZlciAqcGlvX2J1ZmZlciA9ICZwaW9fc2V0dXAt
PnBpb19idWZmZXI7CisJYXRhX3Bpb19lbmRfdHJhbnNmZXJfZnVuY190IGVuZF90cmFuc2ZlciA9
IHBpb19zZXR1cC0+ZW5kX3RyYW5zZmVyOworCisJaWYgKHBpb19idWZmZXItPmN1cnJlbnRfcG9z
ID09IHBpb19zZXR1cC0+c2l6ZV90cmFuc2ZlcikgeworCQlwaW9fc2V0dXAtPmVuZF90cmFuc2Zl
ciA9IE5VTEw7CisJCWVuZF90cmFuc2ZlcihjaGFubmVsKTsKKwl9CisKKwlyZXR1cm47Cit9CisK
K3N0YXRpYyB1aW50MzJfdAorYXRhX3Bpb19nZXRfdWludChzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAq
cGlvX3NldHVwKQoreworCXN0cnVjdCBhdGFfcGlvX2J1ZmZlciAqcGlvX2J1ZmZlciA9ICZwaW9f
c2V0dXAtPnBpb19idWZmZXI7CisJdWludDMyX3QgdmFsdWU7CisKKwlhc3NlcnQocGlvX2J1ZmZl
ci0+Y3VycmVudF9wb3MgPCBwaW9fc2V0dXAtPnNpemVfdHJhbnNmZXIpOworCisJaWYgKHBpb19z
ZXR1cC0+dXNlX3dvcmQpIHsKKwkJdmFsdWUgPSAqKHVpbnQxNl90ICopKHBpb19idWZmZXItPmRh
dGEgKyBwaW9fYnVmZmVyLT5jdXJyZW50X3Bvcyk7CisJCXBpb19idWZmZXItPmN1cnJlbnRfcG9z
ICs9IHNpemVvZih1aW50MTZfdCk7CisJfQorCWVsc2UgeworCQl2YWx1ZSA9ICoodWludDMyX3Qg
KikocGlvX2J1ZmZlci0+ZGF0YSArIHBpb19idWZmZXItPmN1cnJlbnRfcG9zKTsKKwkJcGlvX2J1
ZmZlci0+Y3VycmVudF9wb3MgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwl9CisKKwlhdGFfcGlvX2No
ZWNrX2VuZF90cmFuc2ZlcihwaW9fc2V0dXApOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0
aWMgdm9pZAorYXRhX3Bpb19wdXRfdWludChzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVw
LCB1aW50MzJfdCB3cml0ZV92YWx1ZSkKK3sKKwlzdHJ1Y3QgYXRhX3Bpb19idWZmZXIgKnBpb19i
dWZmZXIgPSAmcGlvX3NldHVwLT5waW9fYnVmZmVyOworCisJYXNzZXJ0KHBpb19idWZmZXItPmN1
cnJlbnRfcG9zIDwgcGlvX3NldHVwLT5zaXplX3RyYW5zZmVyKTsKKworCWlmIChwaW9fc2V0dXAt
PnVzZV93b3JkKSB7CisJCSoodWludDE2X3QgKikocGlvX2J1ZmZlci0+ZGF0YSArIHBpb19idWZm
ZXItPmN1cnJlbnRfcG9zKSA9ICh1aW50MTZfdCl3cml0ZV92YWx1ZTsKKwkJcGlvX2J1ZmZlci0+
Y3VycmVudF9wb3MgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwl9CisJZWxzZSB7CisJCSoodWludDMy
X3QgKikocGlvX2J1ZmZlci0+ZGF0YSArIHBpb19idWZmZXItPmN1cnJlbnRfcG9zKSA9IHdyaXRl
X3ZhbHVlOworCQlwaW9fYnVmZmVyLT5jdXJyZW50X3BvcyArPSBzaXplb2YodWludDMyX3QpOwor
CX0KKworCWF0YV9waW9fY2hlY2tfZW5kX3RyYW5zZmVyKHBpb19zZXR1cCk7CisKKwlyZXR1cm47
Cit9CisKK3N0YXRpYyB2b2lkCithdGFfcGlvX2dlbmVyaWNfZW5kX3RyYW5zZmVyKHN0cnVjdCBh
dGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX3Bpb19nZW5l
cmljX2VuZF90cmFuc2ZlcjogY2g6ICVkIGRyaXZlOiAlZFxuIiwKKwkgICAgICAgY2hhbm5lbC0+
aW50ZXJmYWNlLCBjaGFubmVsLT5kcml2ZSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lk
CithdGFfcmVhZF9tdWx0aXBsZV9ibG9ja19kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l
bCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5l
bC0+ZHJpdmVdOworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsKKwlzdHJ1Y3Qg
YXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKwlzdHJ1Y3QgYmxvY2tpZl9yZXEgKmJy
ZXEgPSBOVUxMOworCXVpbnQ2NF90IGNvdW50OworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJ
aW50IGVycjsKKworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+
cGlvX3NldHVwOworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOworCisJZHJpdmUtPm9mZnNldCAr
PSBwaW9fc2V0dXAtPnNpemVfdHJhbnNmZXI7CisJZHJpdmUtPmNvdW50IC09IHBpb19zZXR1cC0+
c2l6ZV90cmFuc2ZlcjsKKworCWNvdW50ID0gZHJpdmUtPmNvdW50OworCisJaWYgKGNvdW50KSB7
CisJCXNpemVfdHJhbnNmZXIgPSBjb3VudCA+PSBBVEFfQkxPQ0tfU0laRSA/IEFUQV9CTE9DS19T
SVpFIDogY291bnQ7CisJCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXplX3RyYW5z
ZmVyLCBhdGFfcmVhZF9tdWx0aXBsZV9ibG9ja19kb25lLCBjaGFubmVsLT51c2VfMTZiaXQpOwor
CisJCWF0YV9pbml0X2Jsb2NrX3JlcXVlc3QoYnJlcSwgY2hhbm5lbCwgZHJpdmUtPm9mZnNldCwK
KwkJCQkgICAgICAgc2l6ZV90cmFuc2ZlciwgYXRhX3Bpb19nZXRfYnVmZmVyX2RhdGEocGlvX3Nl
dHVwKSk7CisKKwkJZXJyID0gYmxvY2tpZl9yZWFkKGJjdHh0LCBicmVxKTsKKwkJYXNzZXJ0KCFl
cnIpOworCX0KKwllbHNlIHsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9yZWFkX211bHRpcGxl
X2Jsb2NrX2RvbmU6IEFUQV9SRUFEX01VTCBjb21wbGV0ZWRcbiIpOworCX0KKworCXJldHVybjsK
K30KKworc3RhdGljIHZvaWQKK2F0YV93cml0ZV9tdWx0aXBsZV9ibG9ja19kb25lKHN0cnVjdCBh
dGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFu
bmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0
ID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKwlzdHJ1
Y3QgYmxvY2tpZl9yZXEgKmJyZXEgPSBOVUxMOworCXVpbnQ2NF90IGNvdW50OworCXVpbnQ2NF90
IHNpemVfdHJhbnNmZXI7CisJaW50IGVycjsKKworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBp
b19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOwor
CisJYXRhX2luaXRfYmxvY2tfcmVxdWVzdChicmVxLCBjaGFubmVsLCBkcml2ZS0+b2Zmc2V0LAor
CQkJICAgICAgIHBpb19zZXR1cC0+c2l6ZV90cmFuc2ZlciwgYXRhX3Bpb19nZXRfYnVmZmVyX2Rh
dGEocGlvX3NldHVwKSk7CisKKwlkcml2ZS0+b2Zmc2V0ICs9IHBpb19zZXR1cC0+c2l6ZV90cmFu
c2ZlcjsKKwlkcml2ZS0+Y291bnQgLT0gcGlvX3NldHVwLT5zaXplX3RyYW5zZmVyOworCisJY291
bnQgPSBkcml2ZS0+Y291bnQ7CisKKwlpZiAoY291bnQpIHsKKwkJc2l6ZV90cmFuc2ZlciA9IGNv
dW50ID49IEFUQV9CTE9DS19TSVpFID8gQVRBX0JMT0NLX1NJWkUgOiBjb3VudDsKKwkJYXRhX3Bp
b19kb190cmFuc2ZlcihwaW9fc2V0dXAsIHNpemVfdHJhbnNmZXIsIGF0YV93cml0ZV9tdWx0aXBs
ZV9ibG9ja19kb25lLCBjaGFubmVsLT51c2VfMTZiaXQpOworCX0KKwllbHNlIHsKKwkJZHByaW50
KExPR19ERUJVRywgImF0YV93cml0ZV9tdWx0aXBsZV9ibG9ja19kb25lOiBBVEFfV1JJVEVfTVVM
IGNvbXBsZXRlZFxuIik7CisJfQorCisJZXJyID0gYmxvY2tpZl93cml0ZShiY3R4dCwgYnJlcSk7
CisJYXNzZXJ0KCFlcnIpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBp
X2hhbmRsZV9yZWFkX2RvbmUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVj
dCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJ
c3RydWN0IGJsb2NraWZfY3R4dCAqYmN0eHQgPSBOVUxMOworCXN0cnVjdCBhdGFfcGlvX3NldHVw
ICpwaW9fc2V0dXAgPSBOVUxMOworCXN0cnVjdCBibG9ja2lmX3JlcSAqYnJlcSA9IE5VTEw7CisJ
dWludDY0X3QgY291bnQ7CisJaW50IGVycjsKKworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBp
b19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOwor
CisJZHJpdmUtPm9mZnNldCArPSBBVEFQSV9CTE9DS19TSVpFOworCWRyaXZlLT5jb3VudCAtPSBB
VEFQSV9CTE9DS19TSVpFOworCisJY291bnQgPSBkcml2ZS0+Y291bnQ7CisKKwlpZiAoY291bnQp
IHsKKwkJYXNzZXJ0KGNvdW50ID49IEFUQVBJX0JMT0NLX1NJWkUpOworCisJCWRyaXZlLT5zZWNj
b3VudCA9IEFUQV9JX0lOOworCisJCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBBVEFQ
SV9CTE9DS19TSVpFLCBhdGFfYXRhcGlfaGFuZGxlX3JlYWRfZG9uZSwgY2hhbm5lbC0+dXNlXzE2
Yml0KTsKKworCQlhdGFfaW5pdF9ibG9ja19yZXF1ZXN0KGJyZXEsIGNoYW5uZWwsIGRyaXZlLT5v
ZmZzZXQsCisJCQkJICAgICAgIEFUQVBJX0JMT0NLX1NJWkUsIGF0YV9waW9fZ2V0X2J1ZmZlcl9k
YXRhKHBpb19zZXR1cCkpOworCisJCWVyciA9IGJsb2NraWZfcmVhZChiY3R4dCwgYnJlcSk7CisJ
CWFzc2VydCghZXJyKTsKKwl9CisJZWxzZSB7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfYXRh
cGlfaGFuZGxlX3JlYWRfZG9uZTogUkVBRCBjb21wbGV0ZWRcbiIpOworCQlhdGFfYXRhcGlfY21k
X2RvbmUoY2hhbm5lbCk7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hh
bmRsZV9pZGVudGlmeShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0
YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKworCWlm
IChkcml2ZS0+dHlwZSA9PSBBVEFfSEQpIHsKKwkJYXRhX2luaXRpYWxpemVfaWRlbnQoY2hhbm5l
bCk7CisKKwkJYXRhX3NldF9kYXRhX2Jsb2NrX3JlYWR5KGNoYW5uZWwpOworCQlhdGFfc2V0X3N0
YXR1c19vayhjaGFubmVsKTsKKwkJYXRhX2lycV9yYWlzZShjaGFubmVsKTsKKwl9CisJZWxzZSBp
ZiAoZHJpdmUtPnR5cGUgPT0gQVRBUElfQ0QpIHsKKwkJYXRhX2NvbW1hbmRfYWJvcnRlZChjaGFu
bmVsKTsKKwkJYXRhX3NldF9zaWduYXR1cmUoZHJpdmUpOworCX0KKwllbHNlCisJCWFzc2VydCgw
KTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfc2V0ZmVhdHVyZXMo
c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZl
ID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlzd2l0Y2ggKGRyaXZlLT5m
ZWF0dXJlcykgeworCWNhc2UgQVRBX1NGX1NFVFhGRVI6CisJCWNoYW5uZWwtPm1vZGUgPSBkcml2
ZS0+c2VjY291bnQ7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfaGFuZGxlX3NldGZlYXR1cmVz
IEFUQV9TRl9TRVRYRkVSOiBtb2RlOiAlZFxuIiwKKwkJICAgICAgIGNoYW5uZWwtPm1vZGUpOwor
CQlicmVhazsKKwljYXNlIEFUQV9TRl9FTkFCX1dDQUNIRToKKwkJYnJlYWs7CisJY2FzZSBBVEFf
U0ZfRElTX1dDQUNIRToKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfRU5BQl9QVUlTOgorCQlicmVh
azsKKwljYXNlIEFUQV9TRl9ESVNfUFVJUzoKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfUFVJU19T
UElOVVA6CisJCWJyZWFrOworCWNhc2UgQVRBX1NGX0VOQUJfUkNBQ0hFOgorCQlicmVhazsKKwlj
YXNlIEFUQV9TRl9ESVNfUkNBQ0hFOgorCQlicmVhazsKKwljYXNlIEFUQV9TRl9FTkFCX1JFTElS
UToKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfRElTX1JFTElSUToKKwkJYnJlYWs7CisJY2FzZSBB
VEFfU0ZfRU5BQl9TUlZJUlE6CisJCWJyZWFrOworCWNhc2UgQVRBX1NGX0RJU19TUlZJUlE6CisJ
CWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWF0YV9zZXRfc3RhdHVzX29rKGNo
YW5uZWwpOworCWF0YV9pcnFfcmFpc2UoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRp
YyB2b2lkCithdGFfaGFuZGxlX3NldF9tdWx0aShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwp
Cit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwt
PmRyaXZlXTsKKworCWNoYW5uZWwtPnNlY3RvcnNfcGVyX2Jsb2NrID0gZHJpdmUtPnNlY2NvdW50
OworCisJYXNzZXJ0KGNoYW5uZWwtPnNlY3RvcnNfcGVyX2Jsb2NrID09IEFUQV9TRUNUT1JTX1BF
Ul9CTE9DSyk7CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2hhbmRsZV9zZXRfbXVsdGk6IHNl
Y3RvcnNfcGVyX2Jsb2NrOiAlZFxuIiwKKwkgICAgICAgY2hhbm5lbC0+c2VjdG9yc19wZXJfYmxv
Y2spOworCisJYXRhX3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJYXRhX2lycV9yYWlzZShjaGFu
bmVsKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfcmVhZF9tdWx0
aXBsZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0YV9kcml2ZSAq
ZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYmxvY2tp
Zl9jdHh0ICpiY3R4dCA9IE5VTEw7CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9
IE5VTEw7CisJc3RydWN0IGJsb2NraWZfcmVxICpicmVxID0gTlVMTDsKKworCXVpbnQxNl90IHNl
Y3Rvcl9jb3VudDsKKwl1aW50MzJfdCBsYmFfYWRkcmVzcyA9IDA7CisJdWludDY0X3Qgb2Zmc2V0
OworCXVpbnQ2NF90IGNvdW50OworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJaW50IGVycjsK
KworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVw
OworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOworCisJYXRhX2FkZHJlc3Npbmdfc2VjX2NvdW50
KGNoYW5uZWwsICZzZWN0b3JfY291bnQpOworCWF0YV9hZGRyZXNzaW5nXzI4X2xiYShjaGFubmVs
LCAmbGJhX2FkZHJlc3MpOworCisJZHByaW50KExPR19ERUJVRywgImF0YV9oYW5kbGVfcmVhZF9t
dWx0aXBsZTogc2VjdG9yX2NvdW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXhcbiIsCisJICAgICAg
IHNlY3Rvcl9jb3VudCwgbGJhX2FkZHJlc3MpOworCisJb2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9h
ZGRyZXNzICogQVRBX1NFQ1RPUl9TSVpFOworCWNvdW50ID0gKHVpbnQ2NF90KXNlY3Rvcl9jb3Vu
dCAqIEFUQV9TRUNUT1JfU0laRTsKKworCWRyaXZlLT5jb3VudCA9IGNvdW50OworCWRyaXZlLT5v
ZmZzZXQgPSBvZmZzZXQ7CisKKwlzaXplX3RyYW5zZmVyID0gY291bnQgPj0gQVRBX0JMT0NLX1NJ
WkUgPyBBVEFfQkxPQ0tfU0laRSA6IGNvdW50OworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3Nl
dHVwLCBzaXplX3RyYW5zZmVyLCBhdGFfcmVhZF9tdWx0aXBsZV9ibG9ja19kb25lLCBjaGFubmVs
LT51c2VfMTZiaXQpOworCisJYXRhX2luaXRfYmxvY2tfcmVxdWVzdChicmVxLCBjaGFubmVsLCBk
cml2ZS0+b2Zmc2V0LAorCQkJICAgICAgIHNpemVfdHJhbnNmZXIsIGF0YV9waW9fZ2V0X2J1ZmZl
cl9kYXRhKHBpb19zZXR1cCkpOworCisJZXJyID0gYmxvY2tpZl9yZWFkKGJjdHh0LCBicmVxKTsK
Kwlhc3NlcnQoIWVycik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxl
X3JlYWRfdmVyaWZ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRh
X2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCWRwcmlu
dChMT0dfREVCVUcsICJhdGFfaGFuZGxlX3JlYWRfdmVyaWZ5XG4iKTsKKworCWF0YV9zZXRfc3Rh
dHVzX29rKGNoYW5uZWwpOworCWRyaXZlLT5hbHRzdGF0dXMgJj0gfkFUQV9TX0RSUTsKKwlhdGFf
aXJxX3JhaXNlKGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hh
bmRsZV93cml0ZV9tdWx0aXBsZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3Ry
dWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsK
KwlzdHJ1Y3QgYmxvY2tpZl9jdHh0ICpiY3R4dCA9IE5VTEw7CisJc3RydWN0IGF0YV9waW9fc2V0
dXAgKnBpb19zZXR1cCA9IE5VTEw7CisKKwl1aW50MTZfdCBzZWN0b3JfY291bnQ7CisJdWludDMy
X3QgbGJhX2FkZHJlc3MgPSAwOworCXVpbnQ2NF90IG9mZnNldDsKKwl1aW50NjRfdCBjb3VudDsK
Kwl1aW50NjRfdCBzaXplX3RyYW5zZmVyOworCisJYmN0eHQgPSBkcml2ZS0+YmN0eHQ7CisJcGlv
X3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlhdGFfYWRkcmVzc2luZ19zZWNfY291bnQo
Y2hhbm5lbCwgJnNlY3Rvcl9jb3VudCk7CisJYXRhX2FkZHJlc3NpbmdfMjhfbGJhKGNoYW5uZWws
ICZsYmFfYWRkcmVzcyk7CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2hhbmRsZV93cml0ZV9t
dWx0aXBsZTogc2VjdG9yX2NvdW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXhcbiIsCisJICAgICAg
IHNlY3Rvcl9jb3VudCwgbGJhX2FkZHJlc3MpOworCisJb2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9h
ZGRyZXNzICogQVRBX1NFQ1RPUl9TSVpFOworCWNvdW50ID0gKHVpbnQ2NF90KXNlY3Rvcl9jb3Vu
dCAqIEFUQV9TRUNUT1JfU0laRTsKKworCWRyaXZlLT5vZmZzZXQgPSBvZmZzZXQ7CisJZHJpdmUt
PmNvdW50ID0gY291bnQ7CisKKwlzaXplX3RyYW5zZmVyID0gY291bnQgPj0gQVRBX0JMT0NLX1NJ
WkUgPyBBVEFfQkxPQ0tfU0laRSA6IGNvdW50OworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3Nl
dHVwLCBzaXplX3RyYW5zZmVyLCBhdGFfd3JpdGVfbXVsdGlwbGVfYmxvY2tfZG9uZSwgY2hhbm5l
bC0+dXNlXzE2Yml0KTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVf
ZG1hKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCBvcF9kaXIpCit7CisJc3Ry
dWN0IHBjaV9hdGFfc29mdGMgKnNjID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2F0YV9kbWFfdHJhbnNh
Y3Rpb24gKmRtYV90cmFuc2FjdGlvbiA9IE5VTEw7CisKKwl1aW50MTZfdCBzZWN0b3JfY291bnQ7
CisJdWludDMyX3QgbGJhX2FkZHJlc3MgPSAwOworCisJc2MgPSBjaGFubmVsLT5wcl9zYzsKKwlk
bWFfdHJhbnNhY3Rpb24gPSAmc2MtPmRtYV90cmFuc2FjdGlvbnNbY2hhbm5lbC0+aW50ZXJmYWNl
XTsKKworCWFzc2VydCghZG1hX3RyYW5zYWN0aW9uLT5zdGFydGVkKTsKKworCWF0YV9hZGRyZXNz
aW5nX3NlY19jb3VudChjaGFubmVsLCAmc2VjdG9yX2NvdW50KTsKKwlhdGFfYWRkcmVzc2luZ18y
OF9sYmEoY2hhbm5lbCwgJmxiYV9hZGRyZXNzKTsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFf
aGFuZGxlX2RtYTogc2VjdG9yX2NvdW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXggRElSOiAlZFxu
IiwKKwkJCXNlY3Rvcl9jb3VudCwgbGJhX2FkZHJlc3MsIG9wX2Rpcik7CisKKwlkbWFfdHJhbnNh
Y3Rpb24tPnN0YXJ0ZWQgPSAxOworCWRtYV90cmFuc2FjdGlvbi0+b2Zmc2V0ID0gKHVpbnQ2NF90
KWxiYV9hZGRyZXNzICogQVRBX1NFQ1RPUl9TSVpFOworCWRtYV90cmFuc2FjdGlvbi0+bmJ5dGVz
ID0gKHVpbnQ2NF90KXNlY3Rvcl9jb3VudCAqIEFUQV9TRUNUT1JfU0laRTsKKwlkbWFfdHJhbnNh
Y3Rpb24tPm9wX2RpciA9IG9wX2RpcjsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0
YV9oYW5kbGVfZmx1c2hjYWNoZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3Ry
dWN0IGJsb2NraWZfY3R4dCAqYmN0eHQgPSBOVUxMOworCXN0cnVjdCBibG9ja2lmX3JlcSAqYnJl
cSA9IE5VTEw7CisJaW50IGVycjsKKworCWJjdHh0ID0gY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwt
PmRyaXZlXS5iY3R4dDsKKwlicmVxID0gJmNoYW5uZWwtPmZsdXNoX2JyZXE7CisKKwlkcHJpbnQo
TE9HX0RFQlVHLCAiYXRhX2hhbmRsZV9mbHVzaGNhY2hlXG4iKTsKKworCWF0YV9pbml0X2Jsb2Nr
X3JlcXVlc3QoYnJlcSwgY2hhbm5lbCwgMCwgMCwgTlVMTCk7CisKKwllcnIgPSBibG9ja2lmX2Zs
dXNoKGJjdHh0LCBicmVxKTsKKwlhc3NlcnQoIWVycik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRp
YyB2b2lkCithdGFfaGFuZGxlX3NlZWsoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQorewor
CXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2
ZV07CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2hhbmRsZV9zZWVrXG4iKTsKKworCWF0YV9z
ZXRfc3RhdHVzX29rKGNoYW5uZWwpOworCWRyaXZlLT5zdGF0dXMgfD0gQVRBX1NfRFNDOworCWF0
YV9pcnFfcmFpc2UoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFf
aGFuZGxlX2F0YXBpX2lkZW50aWZ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlh
dGFfYXRhcGlfaW5pdGlhbGl6ZV9pZGVudChjaGFubmVsKTsKKworCWF0YV9zZXRfZGF0YV9ibG9j
a19yZWFkeShjaGFubmVsKTsKKwlhdGFfc2V0X3N0YXR1c19vayhjaGFubmVsKTsKKwlhdGFfaXJx
X3JhaXNlKGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRs
ZV9wYWNrZXRfY21kKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRh
X2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVj
dCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAgPSBOVUxMOworCisJcGlvX3NldHVwID0gJmRyaXZl
LT5waW9fc2V0dXA7CisKKwlkcml2ZS0+Ynl0ZV9jb3VudCA9IGRyaXZlLT5sYmFfbWlkIHwgKGRy
aXZlLT5sYmFfaGlnaCA8PCA4KTsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFfaGFuZGxlX3Bh
Y2tldF9jbWQ6IGJ5dGVfY291bnQ6ICVkXG4iLCBkcml2ZS0+Ynl0ZV9jb3VudCk7CisKKwlhdGFf
c2V0X3N0YXR1c19vayhjaGFubmVsKTsKKwlkcml2ZS0+c2VjY291bnQgPSBBVEFfSV9DTUQ7CisJ
ZHJpdmUtPnN0YXR1cyB8PSBBVEFfU19EUlE7CisKKwkvKiBUaGUgUGFja2V0IGNtZCBpcyByZWNl
aXZlZCBhcyA2IHdvcmRzIG9uIGJvdGggTFBDIGFuZCBQQ0kgKi8KKwlhdGFfcGlvX2RvX3RyYW5z
ZmVyKHBpb19zZXR1cCwgQVRBUElfUEFDS0VUX1NJWkUsIGF0YV9hdGFwaV9jbWQsIDEpOworCisJ
cmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9jbWQoc3RydWN0IGF0YV9jaGFu
bmVsICpjaGFubmVsLCB1aW50OF90IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVRB
X0FUQV9JREVOVElGWToKKwkJYXRhX2hhbmRsZV9pZGVudGlmeShjaGFubmVsKTsKKwkJYnJlYWs7
CisJY2FzZSBBVEFfU0VURkVBVFVSRVM6CisJCWF0YV9oYW5kbGVfc2V0ZmVhdHVyZXMoY2hhbm5l
bCk7CisJCWJyZWFrOworCWNhc2UgQVRBX1NFVF9NVUxUSToKKwkJYXRhX2hhbmRsZV9zZXRfbXVs
dGkoY2hhbm5lbCk7CisJCWJyZWFrOworCWNhc2UgQVRBX1JFQUQ6CisJY2FzZSBBVEFfUkVBRF9N
VUw6CisJCWF0YV9oYW5kbGVfcmVhZF9tdWx0aXBsZShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2Fz
ZSBBVEFfUkVBRF9WRVJJRlk6CisJCWF0YV9oYW5kbGVfcmVhZF92ZXJpZnkoY2hhbm5lbCk7CisJ
CWJyZWFrOworCWNhc2UgQVRBX1dSSVRFOgorCWNhc2UgQVRBX1dSSVRFX01VTDoKKwkJYXRhX2hh
bmRsZV93cml0ZV9tdWx0aXBsZShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfUkVBRF9E
TUE6CisJCWF0YV9oYW5kbGVfZG1hKGNoYW5uZWwsIEFUQV9ETUFfUkVBRCk7CisJCWJyZWFrOwor
CWNhc2UgQVRBX1dSSVRFX0RNQToKKwkJYXRhX2hhbmRsZV9kbWEoY2hhbm5lbCwgQVRBX0RNQV9X
UklURSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0ZMVVNIQ0FDSEU6CisJCWF0YV9oYW5kbGVfZmx1
c2hjYWNoZShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0VFSzoKKwkJYXRhX2hhbmRs
ZV9zZWVrKGNoYW5uZWwpOworCQlicmVhazsKKwljYXNlIEFUQV9BVEFQSV9JREVOVElGWToKKwkJ
YXRhX2hhbmRsZV9hdGFwaV9pZGVudGlmeShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFf
UEFDS0VUX0NNRDoKKwkJYXRhX2hhbmRsZV9wYWNrZXRfY21kKGNoYW5uZWwpOworCQlicmVhazsK
KwlkZWZhdWx0OgorCQlkcHJpbnQoTE9HX0VSUiwgImF0YV9oYW5kbGVfY21kOiB1bnN1cHBvcnRl
ZCBjbWQ6ICUwMnhcbiIsIGNtZCk7CisJCWFzc2VydCgwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0
dXJuOworfQorCisvKgorICogYXRhX2NwdV90b19iZTMyIHRyYW5zbGF0ZXMgZnJvbSBsaXR0bGUg
ZW5kaWFuIHRvIGJpZyBlbmRpYW4KKyAqIHRoZSBsaXR0bGUgZW5kaWFuIGZvcm1hdCBpcyB1c2Vk
IGJ5IHRoZSBjcHUKKyAqIEB2YWwgLSB0aGUgaW50ZWdlciB2YWx1ZSBiZWluZyB0cmFuc2xhdGVk
CisgKiBAYnVmIC0gdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHJlc3VsdCBpcyBzdG9yZWQKKyAqLwor
c3RhdGljIGlubGluZSB2b2lkCithdGFfY3B1X3RvX2JlMzIodWludDhfdCAqYnVmLCB1aW50MzJf
dCB2YWwpCit7CisJYnVmWzBdID0gdmFsID4+IDI0OworCWJ1ZlsxXSA9IHZhbCA+PiAxNjsKKwli
dWZbMl0gPSB2YWwgPj4gODsKKwlidWZbM10gPSB2YWw7CisKKwlyZXR1cm47Cit9CisKKy8qCisg
KiBhdGFfY3B1X3RvX2JlMTYgdHJhbnNsYXRlcyBmcm9tIGxpdHRsZSBlbmRpYW4gdG8gYmlnIGVu
ZGlhbgorICogdGhlIGxpdHRsZSBlbmRpYW4gZm9ybWF0IGlzIHVzZWQgYnkgdGhlIGNwdQorICog
QHZhbCAtIHRoZSB3b3JkIGJlaW5nIHRyYW5zbGF0ZWQKKyAqIEBidWYgLSB0aGUgYWRkcmVzcyB3
aGVyZSB0aGUgcmVzdWx0IGlzIHN0b3JlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2F0YV9j
cHVfdG9fYmUxNih1aW50OF90ICpidWYsIHVpbnQxNl90IHZhbCkKK3sKKwlidWZbMF0gPSB2YWwg
Pj4gODsKKwlidWZbMV0gPSB2YWw7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBhdGFfYmUzMl90
b19jcHUgdHJhbnNsYXRlcyBmcm9tIGJpZyBlbmRpYW4gdG8gbGl0dGxlIGVuZGlhbgorICogdGhl
IGxpdHRsZSBlbmRpYW4gZm9ybWF0IGlzIHVzZWQgYnkgdGhlIGNwdQorICogQHZhbCAtIHRoZSBy
ZXR1cm4gaW50ZWdlciB2YWx1ZQorICogQGJ1ZiAtIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZSBi
ZWluZyB0cmFuc2xhdGVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK2F0YV9iZTMyX3Rv
X2NwdSh1aW50OF90ICpidWYpCit7CisJdWludDMyX3QgdmFsID0gMDsKKworCXZhbCB8PSBidWZb
MF0gPDwgMjQ7CisJdmFsIHw9IGJ1ZlsxXSA8PCAxNjsKKwl2YWwgfD0gYnVmWzJdIDw8IDg7CisJ
dmFsIHw9IGJ1ZlszXTsKKworCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiBhdGFfYmUxNl90b19j
cHUgdHJhbnNsYXRlcyBmcm9tIGJpZyBlbmRpYW4gdG8gbGl0dGxlIGVuZGlhbgorICogdGhlIGxp
dHRsZSBlbmRpYW4gZm9ybWF0IGlzIHVzZWQgYnkgdGhlIGNwdQorICogQHZhbCAtIHRoZSByZXR1
cm4gd29yZCB2YWx1ZQorICogQGJ1ZiAtIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZSBiZWluZyB0
cmFuc2xhdGVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QKK2F0YV9iZTE2X3RvX2NwdSh1
aW50OF90ICpidWYpCit7CisJdWludDE2X3QgdmFsID0gMDsKKworCXZhbCB8PSBidWZbMF0gPDwg
ODsKKwl2YWwgfD0gYnVmWzFdOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQKK2F0
YV9hdGFwaV9wcmludF9wYWNrZXQodWludDhfdCAqcGFja2V0KQoreworCWludCBpOworCisJZHBy
aW50KExPR19ERUJVRywgImF0YV9hdGFwaV9wcmludF9wYWNrZXQgY21kOiAweCV4IHBhY2tldDog
IiwgcGFja2V0WzBdKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVRBUElfUEFDS0VUX1NJWkU7IGkrKykg
eworCQlkcHJpbnQoTE9HX0RFQlVHLCAiJXggIiwgcGFja2V0W2ldKTsKKwl9CisJZHByaW50KExP
R19ERUJVRywgIlxuIik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlf
ZGF0YV9yZXF1ZXN0KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRh
X2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCisJYXRh
X3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJZHJpdmUtPnNlY2NvdW50ID0gQVRBX0lfSU47CisJ
ZHJpdmUtPnN0YXR1cyB8PSBBVEFfU19EUlE7CisKKwlhdGFfaXJxX3JhaXNlKGNoYW5uZWwpOwor
CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2NtZF9kb25lKHN0cnVjdCBh
dGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFu
bmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCisJYXRhX3NldF9zdGF0dXNfb2soY2hhbm5l
bCk7CisJZHJpdmUtPnNlY2NvdW50ID0gQVRBX0lfSU4gfCBBVEFfSV9DTUQ7CisKKwlhdGFfaXJx
X3JhaXNlKGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBp
X2hhbmRsZV9pbnF1aXJ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFj
a2V0KQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFu
bmVsLT5kcml2ZV07CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJ
c3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICppbnF1aXJ5X2RhdGEgPSAoc3RydWN0IHNjc2lfaW5x
dWlyeV9kYXRhICopcGFja2V0OworCXVpbnQ4X3QgbWF4X2xlbiA9IDA7CisKKwlwaW9fc2V0dXAg
PSAmZHJpdmUtPnBpb19zZXR1cDsKKworCW1heF9sZW4gPSBwYWNrZXRbNF07CisJYXNzZXJ0KG1h
eF9sZW4gPj0gU0hPUlRfSU5RVUlSWV9MRU5HVEgpOworCisJLyogZm9yIG5vdyB3ZSBpbXBsZW1l
bnQgb25seSB0aGUgc2hvcnQgaW5xdWlyeSBjbWQgKi8KKwlpZiAocGFja2V0WzFdICYgMHgwMSkg
eworCQlhc3NlcnQoMCk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KGlucXVpcnlfZGF0YSwgMCwgU0hP
UlRfSU5RVUlSWV9MRU5HVEgpOworCisJCWlucXVpcnlfZGF0YS0+ZGV2aWNlID0gVF9DRFJPTTsK
KwkJaW5xdWlyeV9kYXRhLT5kZXZfcXVhbDIgPSBTSURfUk1COworCQlpbnF1aXJ5X2RhdGEtPnZl
cnNpb24gPSBTQ1NJX1JFVl8wOworCQlpbnF1aXJ5X2RhdGEtPnJlc3BvbnNlX2Zvcm1hdCA9IDI7
CisJCWlucXVpcnlfZGF0YS0+YWRkaXRpb25hbF9sZW5ndGggPSBTSE9SVF9JTlFVSVJZX0xFTkdU
SCAtIDU7CisKKwkJbWVtY3B5KGlucXVpcnlfZGF0YS0+dmVuZG9yLCAiQkhZVkUgICAiLCBTSURf
VkVORE9SX1NJWkUpOworCQltZW1jcHkoaW5xdWlyeV9kYXRhLT5wcm9kdWN0LCAiQVRBUEkgSURF
IENEUk9NICIsIFNJRF9QUk9EVUNUX1NJWkUpOworCQltZW1jcHkoaW5xdWlyeV9kYXRhLT5yZXZp
c2lvbiwgIjEuMSAiLCBTSURfUkVWSVNJT05fU0laRSk7CisKKwkJYXRhX3Bpb19kb190cmFuc2Zl
cihwaW9fc2V0dXAsIFNIT1JUX0lOUVVJUllfTEVOR1RILCBhdGFfYXRhcGlfY21kX2RvbmUsIGNo
YW5uZWwtPnVzZV8xNmJpdCk7CisJCWF0YV9hdGFwaV9kYXRhX3JlcXVlc3QoY2hhbm5lbCk7CisJ
fQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2Nh
cGFjaXR5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFja2V0KQorewor
CXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2
ZV07CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJaW50IG5zZWN0
b3JzID0gYmxvY2tpZl9zaXplKGRyaXZlLT5iY3R4dCkgLyBBVEFQSV9CTE9DS19TSVpFOworCisJ
cGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlhdGFfY3B1X3RvX2JlMzIocGFja2V0
LCBuc2VjdG9ycyAtIDEpOworCWF0YV9jcHVfdG9fYmUzMihwYWNrZXQgKyA0LCBBVEFQSV9CTE9D
S19TSVpFKTsKKworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCA4LCBhdGFfYXRhcGlf
Y21kX2RvbmUsIGNoYW5uZWwtPnVzZV8xNmJpdCk7CisJYXRhX2F0YXBpX2RhdGFfcmVxdWVzdChj
aGFubmVsKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbGJhX3RvX21zZih1aW50OF90
ICpidWYsIGludCBsYmEpCit7CisJbGJhICs9IDE1MDsKKwlidWZbMF0gPSAobGJhIC8gNzUpIC8g
NjA7CisJYnVmWzFdID0gKGxiYSAvIDc1KSAlIDYwOworCWJ1ZlsyXSA9IGxiYSAlIDc1OworCisJ
cmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFkX3RvYyhzdHJ1
Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlzdHJ1Y3QgYXRh
X2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVj
dCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAgPSBOVUxMOworCWludCBuc2VjdG9ycyA9IGJsb2Nr
aWZfc2l6ZShkcml2ZS0+YmN0eHQpIC8gQVRBUElfQkxPQ0tfU0laRTsKKworCXVpbnQ4X3QgbXNm
ID0gcGFja2V0WzFdICYgMjsKKwl1aW50OF90IGZvcm1hdCA9IHBhY2tldFsyXSAmIDB4MGY7CisJ
dWludDhfdCB0cmFja19udW1iZXIgPSBwYWNrZXRbNl07CisJdWludDE2X3QgYWxsb2NhdGlvbl9s
ZW5ndGggPSAocGFja2V0WzddIDw8IDgpIHwgcGFja2V0WzhdOworCisJdWludDE2X3QgZGF0YV9s
ZW4gPSAwOworCXVpbnQ4X3QgKmRhdGFfem9uZSA9IE5VTEw7CisJdWludDhfdCAqbGVhZF9vdXQg
PSBOVUxMOworCisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlhc3NlcnQodHJh
Y2tfbnVtYmVyIDw9IDEgfHwgdHJhY2tfbnVtYmVyID09IDB4YWEpOworCWFzc2VydCghZm9ybWF0
KTsKKworCXBhY2tldFsyXSA9IDE7CQkvKiBGaXJzdCBUcmFjayAqLworCXBhY2tldFszXSA9IDE7
CQkvKiBMYXN0IFRyYWNrICovCisKKwlsZWFkX291dCA9IHBhY2tldCArIDQ7CisKKwlpZiAodHJh
Y2tfbnVtYmVyIDw9IDEpIHsKKwkJZGF0YV96b25lID0gcGFja2V0ICsgNDsKKwkJbGVhZF9vdXQg
PSBwYWNrZXQgKyAxMjsKKworCQlkYXRhX3pvbmVbMF0gPSAwOwkJLyogUmVzZXJ2ZWQgKi8KKwkJ
ZGF0YV96b25lWzFdID0gMHgxNDsJCS8qIEFEUiwgY29udHJvbCAqLworCQlkYXRhX3pvbmVbMl0g
PSAxOwkJLyogdHJhY2sgbnVtYmVyICovCisJCWRhdGFfem9uZVszXSA9IDA7CQkvKiBSZXNlcnZl
ZCAqLworCQlpZiAobXNmKSB7CisJCQlkYXRhX3pvbmVbNF0gPSAwOworCQkJbGJhX3RvX21zZihk
YXRhX3pvbmUgKyA1LCAwKTsKKwkJfQorCQllbHNlIHsKKwkJCWF0YV9jcHVfdG9fYmUzMihkYXRh
X3pvbmUgKyA0LCAwKTsKKwkJfQorCX0KKworCWxlYWRfb3V0WzBdID0gMDsJCS8qIFJlc2VydmVk
ICovCisJbGVhZF9vdXRbMV0gPSAweDE2OwkJLyogQURSLCBjb250cm9sICovCisJbGVhZF9vdXRb
Ml0gPSAweGFhOwkJLyogdHJhY2sgbnVtYmVyICovCisJbGVhZF9vdXRbM10gPSAwOwkJLyogUmVz
ZXJ2ZWQgKi8KKwlpZiAobXNmKSB7CisJCWxlYWRfb3V0WzRdID0gMDsKKwkJbGJhX3RvX21zZihs
ZWFkX291dCArIDUsIG5zZWN0b3JzKTsKKwl9CisJZWxzZSB7CisJCWF0YV9jcHVfdG9fYmUzMihs
ZWFkX291dCArIDQsIG5zZWN0b3JzKTsKKwl9CisKKwlkYXRhX2xlbiA9IChsZWFkX291dCAtIHBh
Y2tldCkgKyA4OworCWF0YV9jcHVfdG9fYmUxNihwYWNrZXQsIGRhdGFfbGVuIC0gMik7CisKKwlk
YXRhX2xlbiA9IChkYXRhX2xlbiA8IGFsbG9jYXRpb25fbGVuZ3RoKSA/IGRhdGFfbGVuIDogYWxs
b2NhdGlvbl9sZW5ndGg7CisKKwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1cCwgZGF0YV9s
ZW4sIGF0YV9hdGFwaV9jbWRfZG9uZSwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKwlhdGFfYXRhcGlf
ZGF0YV9yZXF1ZXN0KGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRh
X2F0YXBpX2hhbmRsZV9yZWFkKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAq
cGFja2V0KQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tj
aGFubmVsLT5kcml2ZV07CisJc3RydWN0IGJsb2NraWZfY3R4dCAqYmN0eHQgPSBOVUxMOworCXN0
cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAgPSBOVUxMOworCXN0cnVjdCBibG9ja2lmX3Jl
cSAqYnJlcSA9IE5VTEw7CisKKwl1aW50MTZfdCBzZWN0b3JfY291bnQgPSAwOworCXVpbnQzMl90
IGxiYV9hZGRyZXNzID0gMDsKKwl1aW50NjRfdCBvZmZzZXQ7CisJdWludDY0X3QgY291bnQ7CisJ
aW50IGVycjsKKworCWFzc2VydChkcml2ZS0+Ynl0ZV9jb3VudCA+PSBBVEFQSV9CTE9DS19TSVpF
KTsKKworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3Nl
dHVwOworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOworCisJbGJhX2FkZHJlc3MgPSBhdGFfYmUz
Ml90b19jcHUocGFja2V0ICsgMik7CisJc2VjdG9yX2NvdW50ID0gYXRhX2JlMTZfdG9fY3B1KHBh
Y2tldCArIDcpOworCisJZHByaW50KExPR19ERUJVRywgImF0YV9hdGFwaV9oYW5kbGVfcmVhZDog
c2VjdG9yX2NvdW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXhcbiIsCisJICAgICAgIHNlY3Rvcl9j
b3VudCwgbGJhX2FkZHJlc3MpOworCisJb2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9hZGRyZXNzICog
QVRBUElfQkxPQ0tfU0laRTsKKwljb3VudCA9ICh1aW50NjRfdClzZWN0b3JfY291bnQgKiBBVEFQ
SV9CTE9DS19TSVpFOworCisJZHJpdmUtPmNvdW50ID0gY291bnQ7CisJZHJpdmUtPm9mZnNldCA9
IG9mZnNldDsKKworCWRyaXZlLT5sYmFfbWlkID0gQVRBUElfQkxPQ0tfU0laRSAmIDB4ZmY7CisJ
ZHJpdmUtPmxiYV9oaWdoID0gKEFUQVBJX0JMT0NLX1NJWkUgPj4gOCkgJiAweGZmOworCisJZHJp
dmUtPnNlY2NvdW50ID0gQVRBX0lfSU47CisKKwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1
cCwgQVRBUElfQkxPQ0tfU0laRSwgYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2RvbmUsIGNoYW5uZWwt
PnVzZV8xNmJpdCk7CisKKwlhdGFfaW5pdF9ibG9ja19yZXF1ZXN0KGJyZXEsIGNoYW5uZWwsIGRy
aXZlLT5vZmZzZXQsCisJCQkgICAgICAgQVRBUElfQkxPQ0tfU0laRSwgYXRhX3Bpb19nZXRfYnVm
ZmVyX2RhdGEocGlvX3NldHVwKSk7CisKKwllcnIgPSBibG9ja2lmX3JlYWQoYmN0eHQsIGJyZXEp
OworCWFzc2VydCghZXJyKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9hdGFw
aV9jbWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUg
KmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJc3RydWN0IGF0YV9w
aW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJdWludDhfdCAqcGFja2V0ID0gTlVMTDsKKwl1
aW50OF90IG9wX2NvZGUgPSAwOworCisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisJ
cGFja2V0ID0gYXRhX3Bpb19nZXRfYnVmZmVyX2RhdGEocGlvX3NldHVwKTsKKworCWF0YV9hdGFw
aV9wcmludF9wYWNrZXQocGFja2V0KTsKKworCW9wX2NvZGUgPSBwYWNrZXRbMF07CisKKwlzd2l0
Y2ggKG9wX2NvZGUpIHsKKwljYXNlIElOUVVJUlk6CisJCWF0YV9hdGFwaV9oYW5kbGVfaW5xdWly
eShjaGFubmVsLCBwYWNrZXQpOworCQlicmVhazsKKwljYXNlIFJFQURfQ0FQQUNJVFk6CisJCWF0
YV9hdGFwaV9oYW5kbGVfcmVhZF9jYXBhY2l0eShjaGFubmVsLCBwYWNrZXQpOworCQlicmVhazsK
KwljYXNlIFBSRVZFTlRfQUxMT1c6CisJCWF0YV9hdGFwaV9jbWRfZG9uZShjaGFubmVsKTsKKwkJ
YnJlYWs7CisJY2FzZSBSRUFEX1RPQzoKKwkJYXRhX2F0YXBpX2hhbmRsZV9yZWFkX3RvYyhjaGFu
bmVsLCBwYWNrZXQpOworCQlicmVhazsKKwljYXNlIFJFQURfMTA6CisJCWF0YV9hdGFwaV9oYW5k
bGVfcmVhZChjaGFubmVsLCBwYWNrZXQpOworCQlicmVhazsKKwljYXNlIFRFU1RfVU5JVF9SRUFE
WToKKwkJYXRhX2F0YXBpX2NtZF9kb25lKGNoYW5uZWwpOworCQlicmVhazsKKwlkZWZhdWx0Ogor
CQlkcHJpbnQoTE9HX0VSUiwgImF0YV9hdGFwaV9jbWQ6IHVuc3VwcG9ydGVkIGNtZDogJTAyeFxu
Iiwgb3BfY29kZSk7CisJCWFzc2VydCgwKTsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybjsKK30K
Kworc3RhdGljIHVpbnQ2NF90CithdGFfY29tbWFuZF9ibG9ja19yZWFkKHN0cnVjdCBhdGFfY2hh
bm5lbCAqY2hhbm5lbCwgdWludDY0X3Qgb2Zmc2V0KQoreworCXVpbnQ2NF90IHZhbHVlID0gMDsK
KwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJp
dmVdOworCXN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAgPSBOVUxMOworCisJcGlvX3Nl
dHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlzd2l0Y2ggKG9mZnNldCkgeworCWNhc2UgQVRB
X0RBVEFfUkVHOgorCQl2YWx1ZSA9IGF0YV9waW9fZ2V0X3VpbnQocGlvX3NldHVwKTsKKwkJYnJl
YWs7CisJY2FzZSBBVEFfRVJST1JfUkVHOgorCQl2YWx1ZSA9IGRyaXZlLT5lcnJvcjsKKwkJZHBy
aW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9FUlJPUl9SRUc6ICVs
eGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0VDQ09VTlRfUkVHOgorCQl2YWx1
ZSA9IGRyaXZlLT5zZWNjb3VudDsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Js
b2NrX3JlYWQ6IEFUQV9TRUNDT1VOVF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJ
Y2FzZSBBVEFfTEJBX0xPV19SRUc6CisJCXZhbHVlID0gZHJpdmUtPmxiYV9sb3c7CisJCWRwcmlu
dChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja19yZWFkOiBBVEFfTEJBX0xPV19SRUc6ICVs
eGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfTEJBX01JRF9SRUc6CisJCXZhbHVl
ID0gZHJpdmUtPmxiYV9taWQ7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9j
a19yZWFkOiBBVEFfTEJBX01JRF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2Fz
ZSBBVEFfTEJBX0hJR0hfUkVHOgorCQl2YWx1ZSA9IGRyaXZlLT5sYmFfaGlnaDsKKwkJZHByaW50
KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9MQkFfSElHSF9SRUc6ICVs
eGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfSERERVZTRUxfUkVHOgorCQl2YWx1
ZSA9IGRyaXZlLT5oZGRldnNlbDsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Js
b2NrX3JlYWQ6IEFUQV9IRERFVlNFTF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJ
Y2FzZSBBVEFfU1RBVFVTX1JFRzoKKwkJYXRhX2lycV9sb3dlcihjaGFubmVsKTsKKworCQl2YWx1
ZSA9IGRyaXZlLT5zdGF0dXM7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9j
a19yZWFkOiBBVEFfU1RBVFVTX1JFRzogJWx4aFxuIiwgdmFsdWUpOworCQlicmVhazsKKwlkZWZh
dWx0OgorCQl2YWx1ZSA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKwor
c3RhdGljIHZvaWQKK2F0YV9jb21tYW5kX2Jsb2NrX3dyaXRlKHN0cnVjdCBhdGFfY2hhbm5lbCAq
Y2hhbm5lbCwKKwkJdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpCit7
CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRy
aXZlXTsKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZTAgPSAmY2hhbm5lbC0+ZHJpdmVzW0FUQV9N
QVNURVJdOworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlMSA9ICZjaGFubmVsLT5kcml2ZXNbQVRB
X1NMQVZFXTsKKwlzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKworCXVp
bnQ4X3QgcmVnX3ZhbHVlOworCisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlz
d2l0Y2ggKG9mZnNldCkgeworCWNhc2UgQVRBX0RBVEFfUkVHOgorCQlhdGFfcGlvX3B1dF91aW50
KHBpb19zZXR1cCwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9GRUFUVVJFU19SRUc6CisJ
CWRyaXZlMC0+ZmVhdHVyZXMgPSB2YWx1ZTsKKwkJZHJpdmUxLT5mZWF0dXJlcyA9IHZhbHVlOwor
CQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGU6IEFUQV9GRUFUVVJF
U19SRUc6ICV4aFxuIiwgKHVpbnQ4X3QpdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9TRUND
T1VOVF9SRUc6CisJCWRyaXZlMC0+c2VjY291bnQgPSB2YWx1ZTsKKwkJZHJpdmUxLT5zZWNjb3Vu
dCA9IHZhbHVlOworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGU6
IEFUQV9TRUNDT1VOVF9SRUc6ICV4aFxuIiwgKHVpbnQ4X3QpdmFsdWUpOworCQlicmVhazsKKwlj
YXNlIEFUQV9MQkFfTE9XX1JFRzoKKwkJZHJpdmUwLT5sYmFfbG93ID0gdmFsdWU7CisJCWRyaXZl
MS0+bGJhX2xvdyA9IHZhbHVlOworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxv
Y2tfd3JpdGU6IEFUQV9MQkFfTE9XX1JFRzogJXhoXG4iLCAodWludDhfdCl2YWx1ZSk7CisJCWJy
ZWFrOworCWNhc2UgQVRBX0xCQV9NSURfUkVHOgorCQlkcml2ZTAtPmxiYV9taWQgPSB2YWx1ZTsK
KwkJZHJpdmUxLT5sYmFfbWlkID0gdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29t
bWFuZF9ibG9ja193cml0ZTogQVRBX0xCQV9NSURfUkVHOiAleGhcbiIsICh1aW50OF90KXZhbHVl
KTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfTEJBX0hJR0hfUkVHOgorCQlkcml2ZTAtPmxiYV9oaWdo
ID0gdmFsdWU7CisJCWRyaXZlMS0+bGJhX2hpZ2ggPSB2YWx1ZTsKKwkJZHByaW50KExPR19ERUJV
RywgImF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlOiBBVEFfTEJBX0hJR0hfUkVHOiAleGhcbiIsICh1
aW50OF90KXZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfSERERVZTRUxfUkVHOgorCQlyZWdf
dmFsdWUgPSB2YWx1ZTsKKworCQlkcml2ZTAtPmhkZGV2c2VsID0gdmFsdWU7CisJCWRyaXZlMS0+
aGRkZXZzZWwgPSB2YWx1ZTsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2Nr
X3dyaXRlOiBBVEFfSERERVZTRUxfUkVHOiAleGhcbiIsIHJlZ192YWx1ZSk7CisKKwkJaWYgKHJl
Z192YWx1ZSAmIEFUQV9EX0lCTSkKKwkJCWNoYW5uZWwtPnNpemUgPSBBVEFfU0VDVE9SX1NJWkU7
CisJCWlmIChyZWdfdmFsdWUgJiBBVEFfREVWKEFUQV9TTEFWRSkpIHsKKwkJCWRwcmludChMT0df
REVCVUcsICJhdGFfY29tbWFuZF9ibG9ja193cml0ZTogc2VsZWN0IEFUQV9TTEFWRVxuIik7CisJ
CQljaGFubmVsLT5kcml2ZSA9IEFUQV9TTEFWRTsKKwkJfQorCQllbHNlIHsKKwkJCWRwcmludChM
T0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja193cml0ZTogc2VsZWN0IEFUQV9NQVNURVJcbiIp
OworCQkJY2hhbm5lbC0+ZHJpdmUgPSBBVEFfTUFTVEVSOworCQl9CisJCWlmICghYXRhX3NlbGVj
dF9kcml2ZV9pc19vayhjaGFubmVsKSkgeworCQkJZHJpdmUxLT5zdGF0dXMgPSBBVEFfRFJJVkVf
QUJTRU5UOworCQl9CisJCWJyZWFrOworCWNhc2UgQVRBX0NPTU1BTkRfUkVHOgorCQlkcml2ZTAt
PmNvbW1hbmQgPSB2YWx1ZTsKKwkJZHJpdmUxLT5jb21tYW5kID0gdmFsdWU7CisJCWRwcmludChM
T0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja193cml0ZTogQVRBX0NPTU1BTkRfUkVHOiAleGhc
biIsICh1aW50OF90KXZhbHVlKTsKKwkJYXRhX2hhbmRsZV9jbWQoY2hhbm5lbCwgdmFsdWUpOwor
CQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnQoTE9HX0VSUiwgImF0YV9jb21tYW5kX2Jsb2Nr
X3dyaXRlOiB1bnN1cHBvcnRlZCByZWc6JWx4XG4iLCBvZmZzZXQpOworCQlhc3NlcnQoMCk7CisJ
CWJyZWFrOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHVpbnQ2NF90CithdGFfYWx0c3Rh
dHVzX3JlYWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJp
dmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJdWludDY0X3Qg
dmFsdWUgPSAwOworCisJdmFsdWUgPSBkcml2ZS0+YWx0c3RhdHVzOworCisJZHByaW50KExPR19E
RUJVRywgImF0YV9hbHRzdGF0dXNfcmVhZDogdmFsdWU6ICVsdVxuIiwgdmFsdWUpOworCisJcmV0
dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZAorYXRhX2NvbnRyb2xfd3JpdGUoc3RydWN0IGF0
YV9jaGFubmVsICpjaGFubmVsLAorCQlpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpCit7CisJdWlu
dDhfdCByZWdfdmFsdWU7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJp
dmVzW2NoYW5uZWwtPmRyaXZlXTsKKworCXJlZ192YWx1ZSA9ICh1aW50OF90KXZhbHVlOworCisJ
ZHByaW50KExPR19ERUJVRywgImF0YV9jb250cm9sX3dyaXRlOiBpcnFfZGlzYWJsZWQ6ICVkXG4i
LCByZWdfdmFsdWUgJiBBVEFfQV9JRFMpOworCisJaWYgKHJlZ192YWx1ZSAmIEFUQV9BX0lEUykK
KwkJZHJpdmUtPmlycV9kaXNhYmxlZCA9IDE7CisJZWxzZQorCQlkcml2ZS0+aXJxX2Rpc2FibGVk
ID0gMDsKKworCWlmIChyZWdfdmFsdWUgJiBBVEFfQV9SRVNFVCkKKwkJYXRhX3Nyc3QoY2hhbm5l
bCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBQQ0kgQVRBIGZ1bmN0aW9uIGRlZmluaXRpb25z
CisgKi8KK3N0YXRpYyB2b2lkCitwY2lfYXRhX2ludHJfYXNzZXJ0KHZvaWQgKmFyZykKK3sKKwlz
dHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MgPSAoc3RydWN0IHBjaV9hdGFfc29mdGMgKilhcmc7CisJ
c3RydWN0IHBjaV9kZXZpbnN0ICpwaSA9IHNjLT5hc2NfcGk7CisKKwlwY2lfbGludHJfYXNzZXJ0
KHBpKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK3BjaV9hdGFfaW50cl9kZWFzc2Vy
dCh2b2lkICphcmcpCit7CisJc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjID0gKHN0cnVjdCBwY2lf
YXRhX3NvZnRjICopYXJnOworCXN0cnVjdCBwY2lfZGV2aW5zdCAqcGkgPSBzYy0+YXNjX3BpOwor
CisJcGNpX2xpbnRyX2RlYXNzZXJ0KHBpKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludAor
cGNpX2F0YV9wYXJzZV9wYXJhbXMoY29uc3QgY2hhciAqb3B0cywgY2hhciAqb3B0MCwgY2hhciAq
b3B0MSwgdWludDhfdCAqbnJfY2hhbm5lbHMpCit7CisJdWludDhfdCBsZW47CisJY2hhciB0bXBf
b3B0c1sxMjhdOworCWNoYXIgKmNoMCA9IE5VTEwsICpjaDEgPSBOVUxMOworCXVpbnQ4X3QgaTsK
KworCWlmICghb3B0cykgeworCQlkcHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfcGFyc2VfcGFyYW1z
OiBvcHRzIHNob3VsZCBiZSBsaWtlOiAlc1xuIiwKKwkJICAgICAgICJYLE1BU1RFUl9YWyxTTEFW
RV9YXVs7WSxNQVNURVJfWVssU0xBVkVfWV1dIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW4g
PSBzdHJsZW4ob3B0cyk7CisJaWYgKGxlbiA+PSAxMjgpIHsKKwkJZHByaW50KExPR19FUlIsICJw
Y2lfYXRhX3BhcnNlX3BhcmFtczogUENJIEFUQSBzdHJpbmcgcGFyYW1zIHRvbyBiaWdcbiIpOwor
CQlyZXR1cm4gLTE7CisJfQorCisJc3RyY3B5KHRtcF9vcHRzLCBvcHRzKTsKKworCWNoMCA9IHRt
cF9vcHRzOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICh0bXBfb3B0c1tp
XSA9PSBQQ0lfQVRBX0NIX1NFUCkgeworCQkJaWYgKGNoMSkgeworCQkJCWRwcmludChMT0dfRVJS
LCAicGNpX2F0YV9wYXJzZV9wYXJhbXM6IHRvIG1hbnkgY2hhbm5lbHNcbiIpOworCQkJCXJldHVy
biAtMTsKKwkJCX0KKwkJCXRtcF9vcHRzW2ldID0gJ1wwJzsKKwkJCWNoMSA9IHRtcF9vcHRzICsg
aSArIDE7CisJCX0KKwl9CisKKwlpZiAoc3RybGVuKGNoMCkgPj0gNjQpIHsKKwkJZHByaW50KExP
R19FUlIsICJwY2lfYXRhX3BhcnNlX3BhcmFtczogdGhlIG5hbWUgb2YgQVRBX1ggY2hhbm5lbCB0
b28gYmlnXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzdHJjcHkob3B0MCwgY2gwKTsKKwkqbnJf
Y2hhbm5lbHMgPSAxOworCisJaWYgKGNoMSAhPSBOVUxMICYmIHN0cmxlbihjaDEpIDwgNjQpIHsK
KwkJc3RyY3B5KG9wdDEsICBjaDEpOworCQkqbnJfY2hhbm5lbHMgPSAyOworCX0KKworCXJldHVy
biAwOworfQorCitzdGF0aWMgaW50CitwY2lfYXRhX2luaXQoc3RydWN0IHZtY3R4ICpjdHgsIHN0
cnVjdCBwY2lfZGV2aW5zdCAqcGksIGNoYXIgKm9wdHMsIGludCBhdGFwaSkKK3sKKwlzdHJ1Y3Qg
YXRhX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworCXN0cnVjdCBwY2lfYXRhX3NvZnRjICpwY2lf
YXRhX3NjID0gTlVMTDsKKwljaGFyIGNoX29wdHNbMl1bNjRdOworCXVpbnQ4X3QgbnJfY2hhbm5l
bHMgPSAwOworCWludCByZXQsIGk7CisKKwlhdGFfb3Blbl9kYmdfZmlsZSgpOworCisJcmV0ID0g
cGNpX2F0YV9wYXJzZV9wYXJhbXMob3B0cywgY2hfb3B0c1swXSwgY2hfb3B0c1sxXSwgJm5yX2No
YW5uZWxzKTsKKwlpZiAocmV0KSB7CisJCWRwcmludChMT0dfRVJSLCAicGNpX2F0YV9pbml0OiBz
b21lIGVycm9ycyB3aXRoIHRoZSBpbnB1dCBjaGVja2luZ1xuIik7CisJCXJldHVybiAtMTsKKwl9
CisKKwlwY2lfYXRhX3NjID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcGNpX2F0YV9zb2Z0Yykp
OworCWlmICghcGNpX2F0YV9zYykKKwkJcmV0dXJuIC0xOworCisJcGNpX2F0YV9zYy0+Y2hhbm5l
bHNbQVRBX1hdID0gTlVMTDsKKwlwY2lfYXRhX3NjLT5jaGFubmVsc1tBVEFfWV0gPSBOVUxMOwor
CisJZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyBpKyspIHsKKwkJY2hhbm5lbCA9IGF0YV9p
bml0KGN0eCwgcGNpX2F0YV9pbnRyX2Fzc2VydCwgcGNpX2F0YV9pbnRyX2RlYXNzZXJ0LAorCQkJ
CSAgIHBjaV9hdGFfc2MsIGNoX29wdHNbaV0sIDApOworCQlpZiAoIWNoYW5uZWwpCisJCQljb250
aW51ZTsKKwkJY2hhbm5lbC0+dXNlXzE2Yml0ID0gMDsKKwkJYXNzZXJ0KCFwY2lfYXRhX3NjLT5j
aGFubmVsc1tjaGFubmVsLT5pbnRlcmZhY2VdKTsKKwkJcGNpX2F0YV9zYy0+Y2hhbm5lbHNbY2hh
bm5lbC0+aW50ZXJmYWNlXSA9IGNoYW5uZWw7CisJfQorCisJLyogZXhpdCBpZiBub25lIG9mIHRo
ZSBjaGFubmVscyBhcmUgaW5pdGlhbGl6ZWQgKi8KKwlpZiAoIXBjaV9hdGFfc2MtPmNoYW5uZWxz
W0FUQV9YXSAmJiAhcGNpX2F0YV9zYy0+Y2hhbm5lbHNbQVRBX1ldKSB7CisJCWZyZWUocGNpX2F0
YV9zYyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwaS0+cGlfYXJnID0gcGNpX2F0YV9zYzsKKwlw
Y2lfYXRhX3NjLT5hc2NfcGkgPSBwaTsKKworCS8qIGdlbmVyaWMgUENJIEFUQS9BVEFQSSBkZXZp
Y2UgQVRBX0lUODIxMUYgKi8KKwlwY2lfc2V0X2NmZ2RhdGExNihwaSwgUENJUl9ERVZJQ0UsIDB4
ODIxMSk7CS8qIEFUQS9BVEFQSSBDb250cm9sbGVyICovCisJcGNpX3NldF9jZmdkYXRhMTYocGks
IFBDSVJfVkVORE9SLCAweDEyODMpOwkvKiBXYWxkbyAqLworCisJLyogdGhpcyBpcyBhIHN0b3Jh
Z2UgY2xhc3MgZGV2aWNlICovCisJcGNpX3NldF9jZmdkYXRhOChwaSwgUENJUl9DTEFTUywgUENJ
Q19TVE9SQUdFKTsKKwkvKiB0aGlzIGlzIGFuIElERS9BVEEgdHlwZSBkZXZpY2UgKi8KKwlwY2lf
c2V0X2NmZ2RhdGE4KHBpLCBQQ0lSX1NVQkNMQVNTLCBQQ0lTX1NUT1JBR0VfSURFKTsKKworCXBj
aV9zZXRfY2ZnZGF0YTgocGksIFBDSVJfUFJPR0lGLCBQQ0lQX1NUT1JBR0VfSURFX01BU1RFUkRF
ViB8CisJCQkgUENJUF9TVE9SQUdFX0lERV9NT0RFUFJJTSB8IFBDSVBfU1RPUkFHRV9JREVfTU9E
RVNFQyk7CisKKwlwY2lfZW11bF9hbGxvY19iYXIocGksIFBDSV9CQVIwLCBQQ0lCQVJfSU8sIEFU
QV9JT1NJWkUpOworCXBjaV9lbXVsX2FsbG9jX2JhcihwaSwgUENJX0JBUjEsIFBDSUJBUl9JTywg
QVRBX0NUTElPU0laRSk7CisJcGNpX2VtdWxfYWxsb2NfYmFyKHBpLCBQQ0lfQkFSMiwgUENJQkFS
X0lPLCBBVEFfSU9TSVpFKTsKKwlwY2lfZW11bF9hbGxvY19iYXIocGksIFBDSV9CQVIzLCBQQ0lC
QVJfSU8sIEFUQV9DVExJT1NJWkUpOworCXBjaV9lbXVsX2FsbG9jX2JhcihwaSwgUENJX0JBUjQs
IFBDSUJBUl9JTywgQVRBX0NIQU5ORUxTICogQVRBX0JNSU9TSVpFKTsKKworCXBjaV9saW50cl9y
ZXF1ZXN0KHBpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwY2lfYXRhX2hkX2lu
aXQoc3RydWN0IHZtY3R4ICpjdHgsIHN0cnVjdCBwY2lfZGV2aW5zdCAqcGksIGNoYXIgKm9wdHMp
Cit7CisJcmV0dXJuIChwY2lfYXRhX2luaXQoY3R4LCBwaSwgb3B0cywgMCkpOworfQorCitzdGF0
aWMgdm9pZAorcGNpX2F0YV9kbWFfc3RhcnQoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50
OF90IGNoKQoreworCXN0cnVjdCB2bWN0eCAqY3R4ID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX2NoYW5u
ZWwgKmNoYW5uZWwgPSBOVUxMOworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsK
KwlzdHJ1Y3QgcGNpX2F0YV9kbWFfdHJhbnNhY3Rpb24gKmRtYV90cmFuc2FjdGlvbiA9IE5VTEw7
CisJc3RydWN0IGJsb2NraWZfcmVxICpicmVxID0gTlVMTDsKKworCXN0cnVjdCBwcmRfZW50cnkg
KnByZHQgPSBOVUxMOworCXN0cnVjdCBwcmRfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwl1aW50MzJf
dCBwcmR0X2FkZHJlc3M7CisJdWludDMyX3QgaW5kZXg7CisJdWludDMyX3QgYnl0ZV9jb3VudDsK
Kwl2b2lkICplbnRyeV9idWZmID0gTlVMTDsKKwlpbnQgZXJyOworCisJY2hhbm5lbCA9IHNjLT5j
aGFubmVsc1tjaF07CisKKwljdHggPSBjaGFubmVsLT52bV9jdHg7CisJYXNzZXJ0KGN0eCAhPSBO
VUxMKTsKKworCWJjdHh0ID0gY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXS5iY3R4dDsK
KwlkbWFfdHJhbnNhY3Rpb24gPSAmc2MtPmRtYV90cmFuc2FjdGlvbnNbY2hdOworCisJYXNzZXJ0
KGRtYV90cmFuc2FjdGlvbi0+c3RhcnRlZCk7CisKKwlhc3NlcnQoKChzYy0+Y21kW2NoXSAmIEFU
QV9CTUNNRF9XUklURV9SRUFEKSAmJiBkbWFfdHJhbnNhY3Rpb24tPm9wX2RpciA9PSBBVEFfRE1B
X1JFQUQpIHx8CisJCSghKHNjLT5jbWRbY2hdICYgQVRBX0JNQ01EX1dSSVRFX1JFQUQpICYmIGRt
YV90cmFuc2FjdGlvbi0+b3BfZGlyID09IEFUQV9ETUFfV1JJVEUpKTsKKworCXNjLT5zdGF0W2No
XSB8PSBBVEFfQk1TVEFUX0FDVElWRTsKKworCS8qIHByZHRfYWRkcmVzcyBpcyB0aGUgcGh5c2lj
YWwgYWRkcmVzcyBvZiB0aGUgcHJkdCBpbiB0aGUgZ3Vlc3QgbWVtb3J5ICovCisJcHJkdF9hZGRy
ZXNzID0gc2MtPnByZHRbY2hdOworCisJLyogbWFwIHRoZSBndWVzdCBwaHlzaWNhbCBhZGRyZXNz
IGludG8gdGhlIGhvc3QgdmlydHVhbCBhZGRyZXNzICovCisJcHJkdCA9IHBhZGRyX2d1ZXN0Mmhv
c3QoY3R4LCBwcmR0X2FkZHJlc3MsIEFUQV9ETUFfUFJEVF9TSVpFKTsKKwlhc3NlcnQocHJkdCAh
PSBOVUxMKTsKKworCWJyZXEgPSAmZG1hX3RyYW5zYWN0aW9uLT5icmVxOworCWJyZXEtPmJyX3Bh
cmFtID0gY2hhbm5lbDsKKwlicmVxLT5icl9jYWxsYmFjayA9IGF0YV9oYW5kbGVfYmxvY2tfcmVx
dWVzdDsKKwlicmVxLT5icl9vZmZzZXQgPSBkbWFfdHJhbnNhY3Rpb24tPm9mZnNldDsKKworCWRt
YV90cmFuc2FjdGlvbi0+aXNfZW90ID0gMDsKKwlpbmRleCA9IDA7CisJd2hpbGUgKCFkbWFfdHJh
bnNhY3Rpb24tPmlzX2VvdCAmJiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcyA+IDApIHsKKwkJZW50
cnkgPSBwcmR0ICsgaW5kZXg7CisKKwkJZW50cnlfYnVmZiA9IHBhZGRyX2d1ZXN0Mmhvc3QoY3R4
LCBlbnRyeS0+cHJkX2FkZHJlc3MsIGVudHJ5LT5ieXRlX2NvdW50KTsKKwkJYnl0ZV9jb3VudCA9
IGVudHJ5LT5ieXRlX2NvdW50ID8gZW50cnktPmJ5dGVfY291bnQgOiBBVEFfRE1BX01BWF9QUkRf
Q09VTlQ7CisKKwkJaWYgKGJ5dGVfY291bnQgPiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcykgewor
CQkJZHByaW50KExPR19FUlIsICJwY2lfYXRhX2RtYV9zdGFydDogdGhlIFBSRCBlbnRyeSBjb250
YWlucyAlcyIsCisJCQkgICAgICAgIm1vcmUgYnl0ZXMgdGhhbiB0aGUgQVRBIHRyYW5zZmVyIHNp
emVcbiIpOworCQkJYnl0ZV9jb3VudCA9IGRtYV90cmFuc2FjdGlvbi0+bmJ5dGVzOworCQl9CisK
KwkJaWYgKGluZGV4ID09IEJMT0NLSUZfSU9WX01BWCkgeworCQkJZHByaW50KExPR19FUlIsICJw
Y2lfYXRhX2RtYV9zdGFydDogdGhlIFBSRCBUYWJsZSBjb250YWlucyAlcyIsCisJCQkgICAgICAg
Im1vcmUgdGhhbiBCTE9DS0lGX0lPVl9NQVggZW50cmllc1xuIik7CisJCQlicmVhazsKKwkJfQor
CisJCWJyZXEtPmJyX2lvdltpbmRleF0uaW92X2xlbiA9IGJ5dGVfY291bnQ7CisJCWJyZXEtPmJy
X2lvdltpbmRleF0uaW92X2Jhc2UgPSBlbnRyeV9idWZmOworCisJCWRtYV90cmFuc2FjdGlvbi0+
bmJ5dGVzIC09IGJ5dGVfY291bnQ7CisKKwkJaWYgKGVudHJ5LT52ZW5kb3Jfc3BlY2lmaWMgJiBB
VEFfRE1BX1BSRFRfRU9UKQorCQkJZG1hX3RyYW5zYWN0aW9uLT5pc19lb3QgPSAxOworCisJCWlu
ZGV4Kys7CisJfQorCisJYnJlcS0+YnJfaW92Y250ID0gaW5kZXg7CisKKwlzYy0+c3RhdFtjaF0g
fD0gQVRBX0JNU1RBVF9JTlRFUlJVUFQ7CisKKwkvKgorCSAqIFVzZSBhc3luY2hyb25vdXMgb3Bl
cmF0aW9ucyBmb3IgcmVhZCAvIHdyaXRlIG9uIHRoZSBibG9jazsKKwkgKiB1cGRhdGUgdGhlIHN0
YXR1cyByZWdpc3RlcnMgYW5kIG5vdGlmeSB0aGUgZ3Vlc3Qgb3BlcmF0aW5nCisJICogc3lzdGVt
IHVzaW5nIGFuIGludGVycnVwdCBpbiB0aGUgYXRhX2hhbmRsZV9ibG9ja19yZXF1ZXN0IGNhbGxi
YWNrCisJICovCisJaWYgKGRtYV90cmFuc2FjdGlvbi0+b3BfZGlyID09IEFUQV9ETUFfUkVBRCkg
eworCQllcnIgPSBibG9ja2lmX3JlYWQoYmN0eHQsIGJyZXEpOworCX0KKwllbHNlIGlmIChkbWFf
dHJhbnNhY3Rpb24tPm9wX2RpciA9PSBBVEFfRE1BX1dSSVRFKSB7CisJCWVyciA9IGJsb2NraWZf
d3JpdGUoYmN0eHQsIGJyZXEpOworCX0KKwllbHNlIHsKKwkJYXNzZXJ0KDApOworCX0KKworCWFz
c2VydCghZXJyKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK3BjaV9hdGFfZG1hX3N0
b3Aoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50OF90IGNoKQoreworCXN0cnVjdCBhdGFf
Y2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisJc3RydWN0IHBjaV9hdGFfZG1hX3RyYW5zYWN0aW9u
ICpkbWFfdHJhbnNhY3Rpb24gPSBOVUxMOworCisJY2hhbm5lbCA9IHNjLT5jaGFubmVsc1tjaF07
CisJZG1hX3RyYW5zYWN0aW9uID0gJnNjLT5kbWFfdHJhbnNhY3Rpb25zW2NoXTsKKworCWlmKCFk
bWFfdHJhbnNhY3Rpb24tPnN0YXJ0ZWQpIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChkbWFfdHJh
bnNhY3Rpb24tPmlzX2VvdCAmJiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcyA9PSAwKSB7CisJCXNj
LT5zdGF0W2NoXSB8PSBBVEFfQk1TVEFUX0lOVEVSUlVQVDsKKwkJc2MtPnN0YXRbY2hdICY9IH5B
VEFfQk1TVEFUX0VSUk9SOworCQlzYy0+c3RhdFtjaF0gJj0gfkFUQV9CTVNUQVRfQUNUSVZFOwor
CX0KKwllbHNlIGlmICghZG1hX3RyYW5zYWN0aW9uLT5pc19lb3QgJiYgZG1hX3RyYW5zYWN0aW9u
LT5uYnl0ZXMgPT0gMCkgeworCQlzYy0+c3RhdFtjaF0gfD0gQVRBX0JNU1RBVF9JTlRFUlJVUFQ7
CisJCXNjLT5zdGF0W2NoXSAmPSB+QVRBX0JNU1RBVF9FUlJPUjsKKwkJc2MtPnN0YXRbY2hdIHw9
IEFUQV9CTVNUQVRfQUNUSVZFOworCQlkcHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfZG1hX3N0b3A6
IERNQSBQUkRUIHRyYW5zZmVyIHdhcyAlcyIsCisJCSAgICAgICAibGFyZ2VyIHRoYW4gdGhlIEFU
QSB0cmFuc2ZlciBzaXplXG4iKTsKKwl9CisJZWxzZSBpZiAoZG1hX3RyYW5zYWN0aW9uLT5pc19l
b3QgJiYgZG1hX3RyYW5zYWN0aW9uLT5uYnl0ZXMgPiAwKSB7CisJCXNjLT5zdGF0W2NoXSAmPSB+
QVRBX0JNU1RBVF9JTlRFUlJVUFQ7CisJCXNjLT5zdGF0W2NoXSAmPSB+QVRBX0JNU1RBVF9FUlJP
UjsKKwkJc2MtPnN0YXRbY2hdICY9IH5BVEFfQk1TVEFUX0FDVElWRTsKKwkJZHByaW50KExPR19F
UlIsICJwY2lfYXRhX2RtYV9zdG9wOiBETUEgUFJEVCB0cmFuc2ZlciB3YXMgJXMiLAorCQkgICAg
ICAgInNtYWxsZXIgdGhhbiB0aGUgQVRBIHRyYW5zZmVyIHNpemVcbiIpOworCX0KKwllbHNlIGlm
ICghZG1hX3RyYW5zYWN0aW9uLT5pc19lb3QgJiYgZG1hX3RyYW5zYWN0aW9uLT5uYnl0ZXMgPiAw
KSB7CisJCXNjLT5zdGF0W2NoXSB8PSBBVEFfQk1TVEFUX0VSUk9SOworCQlkcHJpbnQoTE9HX0VS
UiwgInBjaV9hdGFfZG1hX3N0b3A6IHRoZSBQUkQgVGFibGUgY29udGFpbnMgJXMiLAorCQkgICAg
ICAgIm1vcmUgdGhhbiBCTE9DS0lGX0lPVl9NQVggZW50cmllc1xuIik7CisJfQorCisJZG1hX3Ry
YW5zYWN0aW9uLT5zdGFydGVkID0gMDsKKworCXJldHVybjsKK30KKworc3RhdGljIHVpbnQ2NF90
CitwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZChzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MsIHVpbnQ2
NF90IG9mZnNldCkKK3sKKwl1aW50NjRfdCB2YWx1ZSA9IDA7CisKKwlzd2l0Y2ggKG9mZnNldCkg
eworCWNhc2UgQVRBX0JNQ01EX1hfUkVHOgorCQl2YWx1ZSA9IHNjLT5jbWRbQVRBX1hdOworCQlk
cHJpbnQoTE9HX0RFQlVHLCAicGNpX2F0YV9idXNfbWFzdGVyX3JlYWQ6IEFUQV9CTUNNRF9YX1JF
RzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNU1RBVF9YX1JFRzoKKwkJ
dmFsdWUgPSBzYy0+c3RhdFtBVEFfWF07CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1
c19tYXN0ZXJfcmVhZDogQVRBX0JNU1RBVF9YX1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFr
OworCWNhc2UgQVRBX0JNUFJEVF9YX1JFRzoKKwkJdmFsdWUgPSBzYy0+cHJkdFtBVEFfWF07CisJ
CWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDogQVRBX0JNUFJEVF9Y
X1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNQ01EX1lfUkVHOgor
CQl2YWx1ZSA9IHNjLT5jbWRbQVRBX1ldOworCQlkcHJpbnQoTE9HX0RFQlVHLCAicGNpX2F0YV9i
dXNfbWFzdGVyX3JlYWQ6IEFUQV9CTUNNRF9ZX1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFr
OworCWNhc2UgQVRBX0JNU1RBVF9ZX1JFRzoKKwkJdmFsdWUgPSBzYy0+c3RhdFtBVEFfWV07CisJ
CWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDogQVRBX0JNU1RBVF9Z
X1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNUFJEVF9ZX1JFRzoK
KwkJdmFsdWUgPSBzYy0+cHJkdFtBVEFfWV07CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRh
X2J1c19tYXN0ZXJfcmVhZDogQVRBX0JNUFJEVF9ZX1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJy
ZWFrOworCWRlZmF1bHQ6CisJCXZhbHVlID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZh
bHVlOworfQorCitzdGF0aWMgdm9pZAorcGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlKHN0cnVjdCBw
Y2lfYXRhX3NvZnRjICpzYywKKwkJdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2l6ZSwgdWludDY0X3Qg
dmFsdWUpCit7CisKKwl1aW50OF90IHJlZ192YWx1ZTsKKworCWlmIChvZmZzZXQgIT0gQVRBX0JN
UFJEVF9YX1JFRyAmJiBvZmZzZXQgIT0gQVRBX0JNUFJEVF9ZX1JFRyAmJiBzaXplICE9IDEpCisJ
CXJldHVybjsKKwlpZiAoKG9mZnNldCA9PSBBVEFfQk1QUkRUX1hfUkVHIHx8IG9mZnNldCA9PSBB
VEFfQk1QUkRUX1lfUkVHKSAmJiBzaXplICE9IDQpCisJCXJldHVybjsKKworCXN3aXRjaCAob2Zm
c2V0KSB7CisJY2FzZSBBVEFfQk1DTURfWF9SRUc6CisJCXJlZ192YWx1ZSA9IHNjLT5jbWRbQVRB
X1hdID0gKHVpbnQ4X3QpdmFsdWU7CisKKwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVz
X21hc3Rlcl93cml0ZVtYXTogQVRBX0JNQ01EX1NUQVJUX1NUT1A6ICVkXG4iLAorCQkgICAgICAg
cmVnX3ZhbHVlICYgQVRBX0JNQ01EX1NUQVJUX1NUT1ApOworCQlpZiAocmVnX3ZhbHVlICYgQVRB
X0JNQ01EX1NUQVJUX1NUT1ApIHsKKwkJCXBjaV9hdGFfZG1hX3N0YXJ0KHNjLCBBVEFfWCk7CisJ
CX0KKwkJZWxzZSB7CisJCQlwY2lfYXRhX2RtYV9zdG9wKHNjLCBBVEFfWCk7CisJCX0KKworCQlk
cHJpbnQoTE9HX0RFQlVHLCAicGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlW1hdOiBBVEFfQk1DTURf
V1JJVEVfUkVBRDogJWRcbiIsCisJCSAgICAgICByZWdfdmFsdWUgJiBBVEFfQk1DTURfV1JJVEVf
UkVBRCk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNU1RBVF9YX1JFRzoKKwkJcmVnX3ZhbHVlID0g
c2MtPnN0YXRbQVRBX1hdID0gKHVpbnQ4X3QpdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJw
Y2lfYXRhX2J1c19tYXN0ZXJfd3JpdGVbWF06IEFUQV9CTVNUQVRfSU5URVJSVVBUOiAlZCwgQVRB
X0JNU1RBVF9FUlJPUjogJWRcbiIsCisJCQkJcmVnX3ZhbHVlICAmIEFUQV9CTVNUQVRfSU5URVJS
VVBULCByZWdfdmFsdWUgJiBBVEFfQk1TVEFUX0VSUk9SKTsKKwkJaWYgKHJlZ192YWx1ZSAmIEFU
QV9CTVNUQVRfSU5URVJSVVBUKQorCQkJc2MtPnN0YXRbQVRBX1hdICY9IH5BVEFfQk1TVEFUX0lO
VEVSUlVQVDsKKwkJaWYgKHJlZ192YWx1ZSAmIEFUQV9CTVNUQVRfRVJST1IpCisJCQlzYy0+c3Rh
dFtBVEFfWF0gJj0gfkFUQV9CTVNUQVRfRVJST1I7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNUFJE
VF9YX1JFRzoKKwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl93cml0ZVtY
XTogQVRBX0JNUFJEVF9YX1JFRzogMHgleFxuIiwgKHVpbnQzMl90KXZhbHVlKTsKKwkJc2MtPnBy
ZHRbQVRBX1hdID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNQ01EX1lfUkVHOgorCQly
ZWdfdmFsdWUgPSBzYy0+Y21kW0FUQV9ZXSA9ICh1aW50OF90KXZhbHVlOworCisJCWRwcmludChM
T0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfd3JpdGVbWV06IEFUQV9CTUNNRF9TVEFSVF9T
VE9QOiAlZFxuIiwKKwkJICAgICAgIHJlZ192YWx1ZSAmIEFUQV9CTUNNRF9TVEFSVF9TVE9QKTsK
KwkJaWYgKHJlZ192YWx1ZSAmIEFUQV9CTUNNRF9TVEFSVF9TVE9QKSB7CisJCQlwY2lfYXRhX2Rt
YV9zdGFydChzYywgQVRBX1kpOworCQl9CisJCWVsc2UgeworCQkJcGNpX2F0YV9kbWFfc3RvcChz
YywgQVRBX1kpOworCQl9CisKKwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rl
cl93cml0ZVtZXTogQVRBX0JNQ01EX1dSSVRFX1JFQUQ6ICVkXG4iLAorCQkgICAgICAgcmVnX3Zh
bHVlICYgQVRBX0JNQ01EX1dSSVRFX1JFQUQpOworCQlicmVhazsKKwljYXNlIEFUQV9CTVNUQVRf
WV9SRUc6CisJCXJlZ192YWx1ZSA9IHNjLT5zdGF0W0FUQV9ZXSA9ICh1aW50OF90KXZhbHVlOwor
CQlkcHJpbnQoTE9HX0RFQlVHLCAicGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlW1ldOiBBVEFfQk1T
VEFUX0lOVEVSUlVQVDogJWQsIEFUQV9CTVNUQVRfRVJST1I6ICVkXG4iLAorCQkJCXJlZ192YWx1
ZSAgJiBBVEFfQk1TVEFUX0lOVEVSUlVQVCwgcmVnX3ZhbHVlICYgQVRBX0JNU1RBVF9FUlJPUik7
CisJCWlmIChyZWdfdmFsdWUgJiBBVEFfQk1TVEFUX0lOVEVSUlVQVCkKKwkJCXNjLT5zdGF0W0FU
QV9ZXSAmPSB+QVRBX0JNU1RBVF9JTlRFUlJVUFQ7CisJCWlmIChyZWdfdmFsdWUgJiBBVEFfQk1T
VEFUX0VSUk9SKQorCQkJc2MtPnN0YXRbQVRBX1ldICY9IH5BVEFfQk1TVEFUX0VSUk9SOworCQli
cmVhazsKKwljYXNlIEFUQV9CTVBSRFRfWV9SRUc6CisJCWRwcmludChMT0dfREVCVUcsICJwY2lf
YXRhX2J1c19tYXN0ZXJfd3JpdGVbWV06IEFUQV9CTVBSRFRfWF9SRUc6IDB4JXhcbiIsICh1aW50
MzJfdCl2YWx1ZSk7CisJCXNjLT5wcmR0W0FUQV9ZXSA9ICh1aW50MzJfdCl2YWx1ZTsKKwkJYnJl
YWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdWlu
dDY0X3QKK3BjaV9hdGFfcmVhZChzdHJ1Y3Qgdm1jdHggKmN0eCwgaW50IHZjcHUsIHN0cnVjdCBw
Y2lfZGV2aW5zdCAqcGksIGludCBiYXJpZHgsCisJCXVpbnQ2NF90IG9mZnNldCwgaW50IHNpemUp
Cit7CisJc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjID0gcGktPnBpX2FyZzsKKwl1aW50NjRfdCB2
YWx1ZSA9IDA7CisKKwlzd2l0Y2ggKGJhcmlkeCkgeworCWNhc2UgUENJX0JBUjA6CisJCWlmICgh
c2MtPmNoYW5uZWxzW0FUQV9YXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNf
b2soc2MtPmNoYW5uZWxzW0FUQV9YXSwgQVRBX1gpKTsKKwkJdmFsdWUgPSBhdGFfY29tbWFuZF9i
bG9ja19yZWFkKHNjLT5jaGFubmVsc1tBVEFfWF0sIG9mZnNldCk7CisJCWJyZWFrOworCWNhc2Ug
UENJX0JBUjE6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9YXSkKKwkJCWJyZWFrOworCQlhc3Nl
cnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9YXSwgQVRBX1gpKTsKKwkJdmFs
dWUgPSBhdGFfYWx0c3RhdHVzX3JlYWQoc2MtPmNoYW5uZWxzW0FUQV9YXSk7CisJCWJyZWFrOwor
CWNhc2UgUENJX0JBUjI6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9ZXSkKKwkJCWJyZWFrOwor
CQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9ZXSwgQVRBX1kpKTsK
KwkJdmFsdWUgPSBhdGFfY29tbWFuZF9ibG9ja19yZWFkKHNjLT5jaGFubmVsc1tBVEFfWV0sIG9m
ZnNldCk7CisJCWJyZWFrOworCWNhc2UgUENJX0JBUjM6CisJCWlmICghc2MtPmNoYW5uZWxzW0FU
QV9ZXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxz
W0FUQV9ZXSwgQVRBX1kpKTsKKwkJdmFsdWUgPSBhdGFfYWx0c3RhdHVzX3JlYWQoc2MtPmNoYW5u
ZWxzW0FUQV9ZXSk7CisJCWJyZWFrOworCWNhc2UgUENJX0JBUjQ6CisJCXZhbHVlID0gcGNpX2F0
YV9idXNfbWFzdGVyX3JlYWQoc2MsIG9mZnNldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFz
c2VydCgwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9p
ZAorcGNpX2F0YV93cml0ZShzdHJ1Y3Qgdm1jdHggKmN0eCwgaW50IHZjcHUsIHN0cnVjdCBwY2lf
ZGV2aW5zdCAqcGksCisJCWludCBiYXJpZHgsIHVpbnQ2NF90IG9mZnNldCwgaW50IHNpemUsIHVp
bnQ2NF90IHZhbHVlKQoreworCXN0cnVjdCBwY2lfYXRhX3NvZnRjICpzYyA9IHBpLT5waV9hcmc7
CisKKwlzd2l0Y2ggKGJhcmlkeCkgeworCWNhc2UgUENJX0JBUjA6CisJCWlmICghc2MtPmNoYW5u
ZWxzW0FUQV9YXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNo
YW5uZWxzW0FUQV9YXSwgQVRBX1gpKTsKKwkJYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGUoc2MtPmNo
YW5uZWxzW0FUQV9YXSwgb2Zmc2V0LCBzaXplLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgUENJ
X0JBUjE6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9YXSkKKwkJCWJyZWFrOworCQlhc3NlcnQo
YXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9YXSwgQVRBX1gpKTsKKwkJYXRhX2Nv
bnRyb2xfd3JpdGUoc2MtPmNoYW5uZWxzW0FUQV9YXSwgc2l6ZSwgdmFsdWUpOworCQlicmVhazsK
KwljYXNlIFBDSV9CQVIyOgorCQlpZiAoIXNjLT5jaGFubmVsc1tBVEFfWV0pCisJCQlicmVhazsK
KwkJYXNzZXJ0KGF0YV9jaGFubmVsX2lzX29rKHNjLT5jaGFubmVsc1tBVEFfWV0sIEFUQV9ZKSk7
CisJCWF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlKHNjLT5jaGFubmVsc1tBVEFfWV0sIG9mZnNldCwg
c2l6ZSwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIFBDSV9CQVIzOgorCQlpZiAoIXNjLT5jaGFu
bmVsc1tBVEFfWV0pCisJCQlicmVhazsKKwkJYXNzZXJ0KGF0YV9jaGFubmVsX2lzX29rKHNjLT5j
aGFubmVsc1tBVEFfWV0sIEFUQV9ZKSk7CisJCWF0YV9jb250cm9sX3dyaXRlKHNjLT5jaGFubmVs
c1tBVEFfWV0sIHNpemUsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfQkFSNDoKKwkJcGNp
X2F0YV9idXNfbWFzdGVyX3dyaXRlKHNjLCBvZmZzZXQsIHNpemUsIHZhbHVlKTsKKwkJYnJlYWs7
CisJZGVmYXVsdDoKKwkJYXNzZXJ0KDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisK
Ky8qCisgKiBMUEMgQVRBIGZ1bmN0aW9uIGRlZmluaXRpb25zCisgKi8KK3N0YXRpYyB2b2lkCits
cGNfYXRhX2ludHJfYXNzZXJ0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbHBjX2F0YV9zb2Z0YyAq
c2NfbHBjX2F0YSA9IChzdHJ1Y3QgbHBjX2F0YV9zb2Z0YyAqKWFyZzsKKwlzdHJ1Y3Qgdm1jdHgg
KmxwY19jdHggPSBzY19scGNfYXRhLT5jaGFubmVsLT52bV9jdHg7CisKKwl2bV9pc2FfcHVsc2Vf
aXJxKGxwY19jdHgsIHNjX2xwY19hdGEtPmlycSwgc2NfbHBjX2F0YS0+aXJxKTsKKworCXJldHVy
bjsKK30KKworc3RhdGljIHZvaWQKK2xwY19hdGFfaW50cl9kZWFzc2VydCh2b2lkICphcmcpCit7
CisJLyoKKwkgKiBUaGUgQVRBIGRldmljZXMgb24gdGhlIExQQyBidXMgZ2VuZXJhdGUgZWRnZSB0
cmlnZ2VyZWQgaW50ZXJydXB0cworCSAqIHNvIG5vdGhpbmcgbW9yZSB0byBkbyBoZXJlCisJICov
CisKKwlyZXR1cm47Cit9CisKK2ludAorbHBjX2F0YV9pbml0KHN0cnVjdCB2bWN0eCAqY3R4LCBj
b25zdCBjaGFyICpvcHRzKQoreworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7
CisJc3RydWN0IGlub3V0X3BvcnQgaW9wLCBpb2N0bHA7CisJaW50IGNoX2F0YSA9IC0xOworCWlu
dCBlcnI7CisKKwlhdGFfb3Blbl9kYmdfZmlsZSgpOworCisJYXNzZXJ0KG9wdHNbMF0gPT0gJzAn
IHx8IG9wdHNbMF0gPT0gJzEnKTsKKwljaF9hdGEgPSBvcHRzWzBdIC0gJzAnOworCisJaWYgKGxw
Y19hdGFfc2NbY2hfYXRhXS5jaGFubmVsKSB7CisJCWRwcmludChMT0dfRVJSLCAibHBjX2F0YV9p
bml0OiB0aGUgTFBDIGF0YSVkIGlzIGluaXRpYWxpemVkXG4iLCBjaF9hdGEpOworCQlyZXR1cm4g
LTE7CisJfQorCisJY2hhbm5lbCA9IGF0YV9pbml0KGN0eCwgbHBjX2F0YV9pbnRyX2Fzc2VydCwg
bHBjX2F0YV9pbnRyX2RlYXNzZXJ0LCAmbHBjX2F0YV9zY1tjaF9hdGFdLCBvcHRzLCAxKTsKKwlp
ZiAoIWNoYW5uZWwpCisJCXJldHVybiAtMTsKKworCWFzc2VydChjaF9hdGEgPT0gY2hhbm5lbC0+
aW50ZXJmYWNlKTsKKwljaGFubmVsLT51c2VfMTZiaXQgPSAxOworCisJbHBjX2F0YV9zY1tjaF9h
dGFdLmNoYW5uZWwgPSBjaGFubmVsOworCisJYnplcm8oJmlvcCwgc2l6ZW9mKHN0cnVjdCBpbm91
dF9wb3J0KSk7CisJaW9wLm5hbWUgPSBscGNfYXRhX3NjW2NoX2F0YV0ubmFtZV9pbzsKKwlpb3Au
cG9ydCA9IGxwY19hdGFfc2NbY2hfYXRhXS5iYXNlX2FkZHJfaW87CisJaW9wLnNpemUgPSBBVEFf
SU9TSVpFOworCWlvcC5mbGFncyA9IElPUE9SVF9GX0lOT1VUOworCWlvcC5oYW5kbGVyID0gbHBj
X2F0YV9pb19oYW5kbGVyOworCWlvcC5hcmcgPSAmbHBjX2F0YV9zY1tjaF9hdGFdOworCisJZXJy
ID0gcmVnaXN0ZXJfaW5vdXQoJmlvcCk7CisJYXNzZXJ0KGVyciA9PSAwKTsKKworCWJ6ZXJvKCZp
b2N0bHAsIHNpemVvZihzdHJ1Y3QgaW5vdXRfcG9ydCkpOworCWlvY3RscC5uYW1lID0gbHBjX2F0
YV9zY1tjaF9hdGFdLm5hbWVfaW9jdGw7CisJaW9jdGxwLnBvcnQgPSBscGNfYXRhX3NjW2NoX2F0
YV0uYmFzZV9hZGRyX2lvY3RsOworCWlvY3RscC5zaXplID0gQVRBX0NUTElPU0laRTsKKwlpb2N0
bHAuZmxhZ3MgPSBJT1BPUlRfRl9JTk9VVDsKKwlpb2N0bHAuaGFuZGxlciA9IGxwY19hdGFfaW9j
dGxfaGFuZGxlcjsKKwlpb2N0bHAuYXJnID0gJmxwY19hdGFfc2NbY2hfYXRhXTsKKworCWVyciA9
IHJlZ2lzdGVyX2lub3V0KCZpb2N0bHApOworCWFzc2VydChlcnIgPT0gMCk7CisKKwlyZXR1cm4g
MDsKK30KKworc3RhdGljIGludAorbHBjX2F0YV9pb19oYW5kbGVyKHN0cnVjdCB2bWN0eCAqY3R4
LCBpbnQgdmNwdSwKKwkJICAgaW50IGluLCBpbnQgcG9ydCwgaW50IGJ5dGVzLCB1aW50MzJfdCAq
ZWF4LCB2b2lkICphcmcpCit7CisJc3RydWN0IGxwY19hdGFfc29mdGMgKmxwY19zYyA9IChzdHJ1
Y3QgbHBjX2F0YV9zb2Z0YyAqKWFyZzsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwgPSBO
VUxMOworCXVpbnQ4X3Qgb2Zmc2V0ID0gMDsKKworCWFzc2VydChscGNfc2MpOworCWNoYW5uZWwg
PSBscGNfc2MtPmNoYW5uZWw7CisJYXNzZXJ0KGNoYW5uZWwpOworCisJb2Zmc2V0ID0gcG9ydCAt
IGxwY19zYy0+YmFzZV9hZGRyX2lvOworCWFzc2VydChvZmZzZXQgPCBBVEFfSU9TSVpFKTsKKwor
CWlmIChpbikKKwkJKmVheCA9IGF0YV9jb21tYW5kX2Jsb2NrX3JlYWQoY2hhbm5lbCwgb2Zmc2V0
KTsKKwllbHNlCisJCWF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlKGNoYW5uZWwsIG9mZnNldCwgYnl0
ZXMsICplYXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2xwY19hdGFfaW9jdGxf
aGFuZGxlcihzdHJ1Y3Qgdm1jdHggKmN0eCwgaW50IHZjcHUsCisJCSAgIGludCBpbiwgaW50IHBv
cnQsIGludCBieXRlcywgdWludDMyX3QgKmVheCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBscGNf
YXRhX3NvZnRjICpscGNfc2MgPSAoc3RydWN0IGxwY19hdGFfc29mdGMgKilhcmc7CisJc3RydWN0
IGF0YV9jaGFubmVsICpjaGFubmVsID0gTlVMTDsKKwl1aW50OF90IG9mZnNldCA9IDA7CisKKwlh
c3NlcnQobHBjX3NjKTsKKwljaGFubmVsID0gbHBjX3NjLT5jaGFubmVsOworCWFzc2VydChjaGFu
bmVsKTsKKworCW9mZnNldCA9IHBvcnQgLSBscGNfc2MtPmJhc2VfYWRkcl9pb2N0bDsKKwlhc3Nl
cnQob2Zmc2V0IDwgQVRBX0NUTElPU0laRSk7CisKKwlpZiAoaW4pCisJCSplYXggPSBhdGFfYWx0
c3RhdHVzX3JlYWQoY2hhbm5lbCk7CisJZWxzZQorCQlhdGFfY29udHJvbF93cml0ZShjaGFubmVs
LCBieXRlcywgKmVheCk7CisKKwlyZXR1cm4gMDsKK30KKwoK


--b1_3f564b781b1c7f1f6a251004cff0fd1c--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3f564b781b1c7f1f6a251004cff0fd1c>