Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 27 Feb 2016 13:12:16 +0000
From:      "iateaca (Teaca)" <phabric-noreply@FreeBSD.org>
To:        freebsd-virtualization@freebsd.org
Subject:   [Differential] [Request, 2, 605 lines] D5473: ATA/ATAPI6 device emulation in bhyve
Message-ID:  <differential-rev-PHID-DREV-2t5o3zrdohcj7mowtyki-req@FreeBSD.org>

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

--b1_370e5c04a721b87eab23b165702327c0
Content-Type: text/plain; charset = "utf-8"
Content-Transfer-Encoding: 8bit

iateaca created this revision.
iateaca added reviewers: grehan, mav, neel, tychon.
iateaca added a subscriber: freebsd-virtualization-list.

REVISION SUMMARY
  This patch implements the ATA/ATAPI6 device emulation in bhyve.
  The userspace bhyve tree sources must be patched. For example:
  
  patch -d bhyve/ < bhyve_ata_atapi6.patch

REVISION DETAIL
  https://reviews.freebsd.org/D5473

AFFECTED FILES
  Makefile
  ata.c
  pci_lpc.c

EMAIL PREFERENCES
  https://reviews.freebsd.org/settings/panel/emailpreferences/

To: iateaca, grehan, mav, neel, tychon
Cc: freebsd-virtualization-list

--b1_370e5c04a721b87eab23b165702327c0
Content-Type: text/x-patch; charset=utf-8; name="D5473.13829.patch"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="D5473.13829.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
QCAtMCwwICsxLDI1ODAgQEAKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lz
L2F0YS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisj
aW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcu
aD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8Y2FtL3Njc2kvc2NzaV9hbGwuaD4K
KyNpbmNsdWRlIDxtYWNoaW5lL3ZtbS5oPgorI2luY2x1ZGUgPHZtbWFwaS5oPgorCisjaW5jbHVk
ZSAiYmxvY2tfaWYuaCIKKyNpbmNsdWRlICJiaHl2ZXJ1bi5oIgorI2luY2x1ZGUgInBjaV9lbXVs
LmgiCisjaW5jbHVkZSAicGNpX2lycS5oIgorI2luY2x1ZGUgImlub3V0LmgiCisKKworLyoKKyAq
IEFUQSBEZWJ1ZyBMb2cKKyAqLworI2RlZmluZQlERUJVR19BVEEJCQkxCisjaWYgREVCVUdfQVRB
ID09IDEKKwordHlwZWRlZiBlbnVtIHsKKwlMT0dfREVCVUcgPSAwLAorCUxPR19FUlIgPSAxLAor
fSBMT0dfTEVWRUw7CisKK3N0YXRpYyBGSUxFICpkYmc7CisKK3N0YXRpYyB2b2lkIGF0YV9vcGVu
X2RiZ19maWxlKHZvaWQpCit7CisJZGJnID0gZm9wZW4oIi90bXAvYmh5dmVfYXRhLmxvZyIsICJ3
KyIpOworCXJldHVybjsKK30KKworI2RlZmluZSBkcHJpbnQobGV2ZWwsIGZvcm1hdCwgYXJnLi4u
KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG97ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
XAorCQlpZiAobGV2ZWwgPT0gTE9HX0RFQlVHKSB7ZnByaW50ZihkYmcsIGZvcm1hdCwgIyNhcmcp
O30gICAgICAgXAorCQllbHNlIHtmcHJpbnRmKGRiZywgIkxPR19FUlI6ICJmb3JtYXQsICMjYXJn
KTt9ICAgICAgICAgICAgICAgXAorCQlmZmx1c2goZGJnKTsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX13aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUg
YXRhX29wZW5fZGJnX2ZpbGUoKQk7CisjZGVmaW5lIGRwcmludChsZXZlbCwgZm10LCAuLi4pIGRv
IHt9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyoKKyAqIEFUQSBkZWZpbmVzCisgKi8KKworI2Rl
ZmluZSBQQ0lfQVRBX0NIX1NFUAkJCSc7JworCisvKiBBVEEgQ2hhbm5lbHMgKi8KKyNkZWZpbmUg
QVRBX0NIQU5ORUxTCQkJMHgwMgorI2RlZmluZQlBVEFfWAkJCQkweDAwCisjZGVmaW5lCUFUQV9Z
CQkJCTB4MDEKKworI2RlZmluZQlBVEFfRFJJVkVTCQkJMHgwMgorI2RlZmluZQlBVEFfTUFTVEVS
CQkJMHgwMAorI2RlZmluZQlBVEFfU0xBVkUJCQkweDAxCisKKyNkZWZpbmUJQVRBX0RSSVZFX0FC
U0VOVAkJMHhmOAorCisjZGVmaW5lCUFUQV9ERVYodW5pdCkJCQkoKHVuaXQgPiAwKSA/IDB4MTAg
OiAwKQorCisjZGVmaW5lIEFUQV9JT1NJWkUJCQkweDA4CisjZGVmaW5lIEFUQV9DVExJT1NJWkUJ
CQkweDAxCisjZGVmaW5lIEFUQV9CTUlPU0laRQkJCTB4MDgKKworI2RlZmluZQlBVEFfU0VDVE9S
X1NJWkUJCQk1MTIKKyNkZWZpbmUJQVRBX1NFQ1RPUlNfUEVSX0JMT0NLCQkxMjgKKyNkZWZpbmUJ
QVRBX01BWF9TRUNfQ09VTlQJCTI1NgorI2RlZmluZQlBVEFfQkxPQ0tfU0laRQkJCShBVEFfU0VD
VE9SU19QRVJfQkxPQ0sgKiBBVEFfU0VDVE9SX1NJWkUpCisjZGVmaW5lCUFUQV9JTkJVRl9TSVpF
CQkJKEFUQV9NQVhfU0VDX0NPVU5UICogQVRBX1NFQ1RPUl9TSVpFKQorI2RlZmluZQlBVEFfTEJB
XzI3XzI0X01BU0sJCTB4MGYKKworI2RlZmluZSBBVEFQSV9QQUNLRVRfU0laRQkJMTIKKyNkZWZp
bmUgQVRBUElfQkxPQ0tfU0laRQkJMjA0OAorCisjZGVmaW5lCUFUQV9XUklURV9NVUxfQ09NUExF
VEUJCTAKKyNkZWZpbmUJQVRBX1JFQURfTVVMX0NPTVBMRVRFCQkwCisKKyNkZWZpbmUJQVRBX0RN
QV9NQVhfUFJEX0NPVU5UCQk2NTUzNgorI2RlZmluZQlBVEFfRE1BX1BSRFRfU0laRQkJNjU1MzYK
KyNkZWZpbmUJQVRBX0RNQV9QUkRUX0VPVAkJMHg4MDAwCisKKyNkZWZpbmUJQVRBX0RNQV9SRUFE
CQkJKDApCisjZGVmaW5lCUFUQV9ETUFfV1JJVEUJCQkoMSkKKworI2RlZmluZQlBVEFfV19ETUEy
CQkJMHgwNAorI2RlZmluZQlBVEFfTU9ERV9QSU80CQkJMHgwMgorCisjZGVmaW5lCUFUQV9BVEFQ
SV82CQkJMHg0MAorCisjZGVmaW5lIEFUQVBJX01BR0lDX0xTQgkJCTB4MTQKKyNkZWZpbmUgQVRB
UElfTUFHSUNfTVNCCQkJMHhlYgorCisvKiBQQ0kgQkFSUyBpZHggKi8KKyNkZWZpbmUJUENJX0JB
UjAJCQkwCisjZGVmaW5lCVBDSV9CQVIxCQkJMQorI2RlZmluZQlQQ0lfQkFSMgkJCTIKKyNkZWZp
bmUJUENJX0JBUjMJCQkzCisjZGVmaW5lCVBDSV9CQVI0CQkJNAorCisvKiBBVEEgQnVzIE1hc3Rl
ciBSZWdpc3RlciBPZmZzZXRzIGFuZCBWYWx1ZXMqLworI2RlZmluZQlBVEFfQk1DTURfWF9SRUcJ
CQkweDAwCisjZGVmaW5lCUFUQV9CTUNNRF9ZX1JFRwkJCTB4MDgKKyNkZWZpbmUJCUFUQV9CTUNN
RF9TVEFSVF9TVE9QCTB4MDEKKyNkZWZpbmUJCUFUQV9CTUNNRF9XUklURV9SRUFECTB4MDgKKwor
I2RlZmluZQlBVEFfQk1TVEFUX1hfUkVHCQkweDAyCisjZGVmaW5lCUFUQV9CTVNUQVRfWV9SRUcJ
CTB4MEEKKyNkZWZpbmUJCUFUQV9CTVNUQVRfQUNUSVZFCTB4MDEKKyNkZWZpbmUJCUFUQV9CTVNU
QVRfRVJST1IJMHgwMgorI2RlZmluZQkJQVRBX0JNU1RBVF9JTlRFUlJVUFQJMHgwNAorI2RlZmlu
ZQkJQVRBX0JNU1RBVF9NQVNLCQkweDA3CisjZGVmaW5lCQlBVEFfQk1TVEFUX0RNQV9NQVNURVIJ
MHgyMAorI2RlZmluZQkJQVRBX0JNU1RBVF9ETUFfU0xBVkUJMHg0MAorI2RlZmluZQkJQVRBX0JN
U1RBVF9ETUFfU0lNUExFWAkweDgwCisKKyNkZWZpbmUJQVRBX0JNUFJEVF9YX1JFRwkJMHgwNAor
I2RlZmluZQlBVEFfQk1QUkRUX1lfUkVHCQkweDBDCisKKy8qIFRoZSBDb21tYW5kIEJsb2NrIHJl
Z2lzdGVycyAqLworI2RlZmluZQlBVEFfREFUQV9SRUcJCQkweDAwCisjZGVmaW5lCUFUQV9FUlJP
Ul9SRUcJCQkweDAxCisjZGVmaW5lCQlBVEFfRV9JTEkJCTB4MDEgICAgLyogaWxsZWdhbCBsZW5n
dGggKi8KKyNkZWZpbmUgICAgICAgICBBVEFfRV9BQk9SVCAgICAgICAgICAgICAweDA0ICAgIC8q
IGNvbW1hbmQgYWJvcnRlZCAqLworI2RlZmluZQlBVEFfRkVBVFVSRVNfUkVHCQkweDAxCisjZGVm
aW5lCUFUQV9TRUNDT1VOVF9SRUcJCTB4MDIKKyNkZWZpbmUJCUFUQV9JX0NNRAkJMHgwMSAgICAv
KiBjbWQgKDEpIHwgZGF0YSAoMCkgKi8KKyNkZWZpbmUJCUFUQV9JX0lOCQkweDAyICAgIC8qIHJl
YWQgKDEpIHwgd3JpdGUgKDApICovCisjZGVmaW5lCQlBVEFfSV9SRUxFQVNFCQkweDA0ICAgIC8q
IHJlbGVhc2VkIGJ1cyAoMSkgKi8KKyNkZWZpbmUJQVRBX0xCQV9MT1dfUkVHCQkJMHgwMworI2Rl
ZmluZQlBVEFfTEJBX01JRF9SRUcJCQkweDA0CisjZGVmaW5lCUFUQV9MQkFfSElHSF9SRUcJCTB4
MDUKKyNkZWZpbmUJQVRBX0hEREVWU0VMX1JFRwkJMHgwNgorI2RlZmluZQkJQVRBX0RfTEJBCQkw
eDQwICAgIC8qIHVzZSBMQkEgYWRkcmVzc2luZyAqLworI2RlZmluZQkJQVRBX0RfSUJNCQkweGEw
ICAgIC8qIDUxMiBieXRlIHNlY3RvcnMsIEVDQyAqLworI2RlZmluZQlBVEFfQ09NTUFORF9SRUcJ
CQkweDA3CisjZGVmaW5lCUFUQV9TVEFUVVNfUkVHCQkJMHgwNworI2RlZmluZQkJQVRBX1NfQlVT
WQkJMHg4MCAgICAvKiBidXN5ICovCisjZGVmaW5lCQlBVEFfU19SRUFEWQkJMHg0MCAgICAvKiBk
cml2ZSByZWFkeSAqLworI2RlZmluZQkJQVRBX1NfRFdGCQkweDIwICAgIC8qIGRyaXZlIHdyaXRl
IGZhdWx0ICovCisjZGVmaW5lCQlBVEFfU19EUlEJCTB4MDggICAgLyogZGF0YSByZXF1ZXN0ICov
CisjZGVmaW5lCQlBVEFfU19EU0MJCTB4MTAgICAgLyogZHJpdmUgc2VlayBjb21wbGV0ZWQgKi8K
KyNkZWZpbmUJCUFUQV9TX0VSUk9SCQkweDAxICAgIC8qIGVycm9yICovCisKKy8qIFRoZSBDb250
cm9sIEJsb2NrIHJlZ2lzdGVycyAqLworI2RlZmluZQlBVEFfQ09OVFJPTF9SRUcJCQkweDBDCisj
ZGVmaW5lCQlBVEFfQV9JRFMJCTB4MDIgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisjZGVm
aW5lCQlBVEFfQV9SRVNFVAkJMHgwNCAgICAvKiBSRVNFVCBjb250cm9sbGVyICovCisjZGVmaW5l
CUFUQV9BTFRTVEFUVVNfUkVHCQkweDBDCisKKyNkZWZpbmUgUkVBRF9UT0MJCQkweDQzCisKK3N0
cnVjdCBhdGFfY2hhbm5lbDsKKwordHlwZWRlZiB2b2lkICgqYXRhX2ludHJfZnVuY190KSh2b2lk
ICphcmcpOwordHlwZWRlZiB2b2lkICgqYXRhX3Bpb19lbmRfdHJhbnNmZXJfZnVuY190KShzdHJ1
Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworCit0eXBlZGVmIGVudW0geworCUFUQV9IRCwKKwlB
VEFQSV9DRCwKKwlBVEFfRFJJVkVfRU1QVFkKK30gYXRhX2RyaXZlX3R5cGU7CisKKy8qCisgKiBB
VEEgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCBhdGFfcGlvX2J1ZmZlciB7CisJdWludDhf
dCAgZGF0YVtBVEFfSU5CVUZfU0laRV07CisJdWludDY0X3QgY3VycmVudF9wb3M7Cit9OworCitz
dHJ1Y3QgYXRhX3Bpb19zZXR1cCB7CisJdWludDhfdCB1c2Vfd29yZDsKKwlzdHJ1Y3QgYmxvY2tp
Zl9yZXEgYnJlcTsKKwlzdHJ1Y3QgYXRhX3Bpb19idWZmZXIgcGlvX2J1ZmZlcjsKKworCXVpbnQ2
NF90IHNpemVfdHJhbnNmZXI7CisJYXRhX3Bpb19lbmRfdHJhbnNmZXJfZnVuY190IGVuZF90cmFu
c2ZlcjsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWw7Cit9OworCitzdHJ1Y3QgcHJkX2Vu
dHJ5IHsKKwl1aW50MzJfdCBwcmRfYWRkcmVzczsKKwl1aW50MTZfdCBieXRlX2NvdW50OworCXVp
bnQxNl90IHZlbmRvcl9zcGVjaWZpYzsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwor
CitzdHJ1Y3QgcGNpX2F0YV9kbWFfdHJhbnNhY3Rpb24geworCXN0cnVjdCBibG9ja2lmX3JlcSBi
cmVxOworCXVpbnQ4X3QgaXNfZW90OworCXVpbnQ4X3Qgc3RhcnRlZDsKKwl1aW50NjRfdCBvZmZz
ZXQ7CisJdWludDY0X3QgbmJ5dGVzOworCXVpbnQ4X3QgIG9wX2RpcjsKK307CisKK3N0cnVjdCBh
dGFfZHJpdmUgeworCS8qIEFUQSBEcml2ZSBSZWdpc3RlcnMgKi8KKworCS8qIHRoZSBpbyBwb3J0
IHJhbmdlIHNpemUgPSAweDA4ICovCisJdWludDhfdCBkYXRhOworCXVpbnQ4X3QgZXJyb3I7CisJ
dWludDhfdCBmZWF0dXJlczsKKwl1aW50OF90IHNlY2NvdW50OworCXVpbnQ4X3QgbGJhX2xvdzsK
Kwl1aW50OF90IGxiYV9taWQ7CisJdWludDhfdCBsYmFfaGlnaDsKKwl1aW50OF90IGhkZGV2c2Vs
OworCXVpbnQ4X3QgY29tbWFuZDsKKwl1aW50OF90IHN0YXR1czsKKworCS8qIHRoZSBhbHRwb3J0
IHJhbmdlIHNpemUgPSAweDAxICovCisJdWludDhfdCBhbHRzdGF0dXM7CisKKwlhdGFfZHJpdmVf
dHlwZSB0eXBlOworCXVpbnQxNl90IGJ5dGVfY291bnQ7CisJdWludDY0X3Qgb2Zmc2V0OworCXVp
bnQ2NF90IGNvdW50OworCXVpbnQ4X3QgaXJxX2Rpc2FibGVkOworCXN0cnVjdCBibG9ja2lmX2N0
eHQgKmJjdHh0OworCXN0cnVjdCBhdGFfcGlvX3NldHVwIHBpb19zZXR1cDsKK307CisKK3N0cnVj
dCBhdGFfY2hhbm5lbCB7CisJLyogQVRBIENoYW5uZWwgU3RhdGUgVmFyaWFibGVzICovCisJdWlu
dDMyX3Qgc2l6ZTsKKwl1aW50OF90IGludGVyZmFjZTsKKwl1aW50OF90IGRyaXZlOworCXVpbnQ4
X3QgaGFzX3NsYXZlOworCXVpbnQ4X3QgbW9kZTsKKwl1aW50OF90IHNlY3RvcnNfcGVyX2Jsb2Nr
OworCXVpbnQ4X3QgdXNlXzE2Yml0OworCisJc3RydWN0IGJsb2NraWZfcmVxIGZsdXNoX2JyZXE7
CisKKwlzdHJ1Y3QgYXRhX2RyaXZlIGRyaXZlc1tBVEFfRFJJVkVTXTsKKworCXN0cnVjdCB2bWN0
eCAqdm1fY3R4OworCXZvaWQgKnByX3NjOworCisJLyogSW50ZXJydXB0cyBjYWxsYmFja3MgKFBD
SSBvciBMUEMpICovCisJYXRhX2ludHJfZnVuY190IGludHJfYXNzZXJ0OworCWF0YV9pbnRyX2Z1
bmNfdCBpbnRyX2RlYXNzZXJ0OworCXVpbnQ4X3QgbGludHI7Cit9OworCitzdHJ1Y3QgcGNpX2F0
YV9zb2Z0YyB7CisJLyogQVRBIEJ1cyBNYXN0ZXIgUmVnaXN0ZXIgKi8KKwl1aW50OF90ICBjbWRb
QVRBX0NIQU5ORUxTXTsKKwl1aW50OF90ICBzdGF0W0FUQV9DSEFOTkVMU107CisJdWludDMyX3Qg
cHJkdFtBVEFfQ0hBTk5FTFNdOworCisJc3RydWN0IHBjaV9hdGFfZG1hX3RyYW5zYWN0aW9uIGRt
YV90cmFuc2FjdGlvbnNbQVRBX0NIQU5ORUxTXTsKKworCXN0cnVjdCBwY2lfZGV2aW5zdCAqYXNj
X3BpOworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbHNbQVRBX0NIQU5ORUxTXTsKK307CisK
K3N0cnVjdCBscGNfYXRhX3NvZnRjIHsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWw7CisJ
aW50IGlycTsKKwlpbnQgYmFzZV9hZGRyX2lvOworCWludCBiYXNlX2FkZHJfaW9jdGw7CisJY29u
c3QgY2hhciAqbmFtZV9pbzsKKwljb25zdCBjaGFyICpuYW1lX2lvY3RsOworfTsKKworCisvKgor
ICogQVRBIG1vZHVsZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2F0
YV9pcnFfcmFpc2Uoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCith
dGFfaXJxX2xvd2VyKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyBhdGFf
ZHJpdmVfdHlwZQorYXRhX2RyaXZlX3R5cGVfYnlfbmFtZShjaGFyICpkcml2ZV9uYW1lKTsKK3N0
YXRpYyBpbnQKK2F0YV9wYXJzZV9wYXJhbXMoY29uc3QgY2hhciAqb3B0cywgaW50ICpjaGFubmVs
LCBjaGFyICpkaXNrX21hc3RlciwKKwkJIGNoYXIgKmRpc2tfc2xhdmUsIHVpbnQ4X3QgKmhhc19z
bGF2ZSk7CitzdGF0aWMgc3RydWN0IGF0YV9jaGFubmVsICoKK2F0YV9pbml0KHN0cnVjdCB2bWN0
eCAqY3R4LCBhdGFfaW50cl9mdW5jX3QgaW50cl9hc3NlcnQsIGF0YV9pbnRyX2Z1bmNfdCBpbnRy
X2RlYXNzZXJ0LCB2b2lkICpwcl9zYywKKwkgY29uc3QgY2hhciAqb3B0cywgdWludDhfdCBpc2Ff
YXQpOworCitzdGF0aWMgdm9pZAorYXRhX3Nyc3Qoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVs
KTsKK3N0YXRpYyB2b2lkCithdGFfaW5pdGlhbGl6ZV9pZGVudChzdHJ1Y3QgYXRhX2NoYW5uZWwg
KmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9pbml0aWFsaXplX2lkZW50KHN0cnVj
dCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyBpbnQKK2F0YV9jaGFubmVsX2lzX29r
KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCBjaCk7CitzdGF0aWMgaW50Cith
dGFfc2VsZWN0X2RyaXZlX2lzX29rKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0
aWMgdm9pZAorYXRhX3NldF9zdGF0dXNfb2soc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsK
K3N0YXRpYyB2b2lkCithdGFfc2V0X2RhdGFfYmxvY2tfcmVhZHkoc3RydWN0IGF0YV9jaGFubmVs
ICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfY29tbWFuZF9hYm9ydGVkKHN0cnVjdCBhdGFf
Y2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX3NldF9zaWduYXR1cmUoc3RydWN0
IGF0YV9kcml2ZSAqZHJpdmUpOworCitzdGF0aWMgdm9pZAorYXRhX2FkZHJlc3Npbmdfc2VjX2Nv
dW50KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDE2X3QgKnBfc2VjdG9yX2NvdW50
KTsKK3N0YXRpYyB2b2lkCithdGFfYWRkcmVzc2luZ18yOF9sYmEoc3RydWN0IGF0YV9jaGFubmVs
ICpjaGFubmVsLCB1aW50MzJfdCAqcF9sYmFfYWRkcmVzcyk7CisKK3N0YXRpYyB2b2lkCithdGFf
aW5pdF9ibG9ja19yZXF1ZXN0KHN0cnVjdCBibG9ja2lmX3JlcSAqYnJlcSwgc3RydWN0IGF0YV9j
aGFubmVsICpjaGFubmVsLAorCQkgICAgICAgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBuYnl0
ZXMsIHZvaWQgKmJ1ZmZlcik7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9ibG9ja19yZXF1ZXN0
KHN0cnVjdCBibG9ja2lmX3JlcSAqcmVxLCBpbnQgZXJyKTsKKworc3RhdGljIHZvaWQKK2F0YV9w
aW9fZG9fdHJhbnNmZXIoc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCwgdWludDY0X3Qg
c2l6ZV90cmFuc2ZlciwKKwkJICAgICBhdGFfcGlvX2VuZF90cmFuc2Zlcl9mdW5jX3QgZW5kX3Ry
YW5zZmVyLCB1aW50OF90IHVzZV93b3JkKTsKK3N0YXRpYyBpbnQKK2F0YV9waW9faW5fcHJvZ3Jl
c3Moc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCk7CitzdGF0aWMgdWludDhfdCAqCith
dGFfcGlvX2dldF9idWZmZXJfZGF0YShzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKTsK
K3N0YXRpYyB2b2lkCithdGFfcGlvX2NoZWNrX2VuZF90cmFuc2ZlcihzdHJ1Y3QgYXRhX3Bpb19z
ZXR1cCAqcGlvX3NldHVwKTsKK3N0YXRpYyB1aW50MzJfdAorYXRhX3Bpb19nZXRfdWludChzdHJ1
Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKTsKK3N0YXRpYyB2b2lkCithdGFfcGlvX3B1dF91
aW50KHN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAsIHVpbnQzMl90IHdyaXRlX3ZhbHVl
KTsKK3N0YXRpYyB2b2lkCithdGFfcGlvX2dlbmVyaWNfZW5kX3RyYW5zZmVyKHN0cnVjdCBhdGFf
Y2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyB2b2lkCithdGFfcmVhZF9tdWx0aXBsZV9ibG9j
a19kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX3dy
aXRlX211bHRpcGxlX2Jsb2NrX2RvbmUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKKwor
c3RhdGljIHZvaWQKK2F0YV9hdGFwaV9oYW5kbGVfcmVhZF9kb25lKHN0cnVjdCBhdGFfY2hhbm5l
bCAqY2hhbm5lbCk7CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX2lkZW50aWZ5KHN0cnVjdCBh
dGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9zZXRmZWF0dXJl
cyhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVf
c2V0X211bHRpKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRh
X2hhbmRsZV9yZWFkX211bHRpcGxlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0
aWMgdm9pZAorYXRhX2hhbmRsZV9yZWFkX3ZlcmlmeShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5u
ZWwpOworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfd3JpdGVfbXVsdGlwbGUoc3RydWN0IGF0YV9j
aGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX2RtYShzdHJ1Y3QgYXRh
X2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3Qgb3BfZGlyKTsKK3N0YXRpYyB2b2lkCithdGFfaGFu
ZGxlX2ZsdXNoY2FjaGUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lk
CithdGFfaGFuZGxlX3NlZWsoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2
b2lkCithdGFfaGFuZGxlX2F0YXBpX2lkZW50aWZ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l
bCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9wYWNrZXRfY21kKHN0cnVjdCBhdGFfY2hhbm5l
bCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9jbWQoc3RydWN0IGF0YV9jaGFu
bmVsICpjaGFubmVsLCB1aW50OF90IGNtZCk7CisKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlfZGF0
YV9yZXF1ZXN0KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRh
X2F0YXBpX2NtZF9kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9p
ZAorYXRhX2F0YXBpX2hhbmRsZV9pbnF1aXJ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwg
dWludDhfdCAqcGFja2V0KTsKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlfaGFuZGxlX3JlYWRfY2Fw
YWNpdHkoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50OF90ICpwYWNrZXQpOworc3Rh
dGljIHZvaWQKK2F0YV9hdGFwaV9oYW5kbGVfcmVhZF90b2Moc3RydWN0IGF0YV9jaGFubmVsICpj
aGFubmVsLCB1aW50OF90ICpwYWNrZXQpOworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9oYW5kbGVf
cmVhZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3QgKnBhY2tldCk7CitzdGF0
aWMgdm9pZAorYXRhX2F0YXBpX2NtZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworCitz
dGF0aWMgdWludDY0X3QKK2F0YV9jb21tYW5kX2Jsb2NrX3JlYWQoc3RydWN0IGF0YV9jaGFubmVs
ICpjaGFubmVsLCB1aW50NjRfdCBvZmZzZXQpOworc3RhdGljIHZvaWQKK2F0YV9jb21tYW5kX2Js
b2NrX3dyaXRlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwKKwkJdWludDY0X3Qgb2Zmc2V0
LCBpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpOworCitzdGF0aWMgdWludDY0X3QKK2F0YV9hbHRz
dGF0dXNfcmVhZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0
YV9jb250cm9sX3dyaXRlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwKKwkJaW50IHNpemUs
IHVpbnQ2NF90IHZhbHVlKTsKKworLyoKKyAqIFBDSSBBVEEgZnVuY3Rpb24gZGVjbGFyYXRpb25z
CisgKi8KK3N0YXRpYyB2b2lkCitwY2lfYXRhX2ludHJfYXNzZXJ0KHZvaWQgKmFyZyk7CitzdGF0
aWMgdm9pZAorcGNpX2F0YV9pbnRyX2RlYXNzZXJ0KHZvaWQgKmFyZyk7CisKK3N0YXRpYyBpbnQK
K3BjaV9hdGFfcGFyc2VfcGFyYW1zKGNvbnN0IGNoYXIgKm9wdHMsIGNoYXIgKm9wdDAsIGNoYXIg
Km9wdDEsIHVpbnQ4X3QgKm5yX2NoYW5uZWxzKTsKK3N0YXRpYyBpbnQKK3BjaV9hdGFfaW5pdChz
dHJ1Y3Qgdm1jdHggKmN0eCwgc3RydWN0IHBjaV9kZXZpbnN0ICpwaSwgY2hhciAqb3B0cywgaW50
IGF0YXBpKTsKK3N0YXRpYyBpbnQKK3BjaV9hdGFfaGRfaW5pdChzdHJ1Y3Qgdm1jdHggKmN0eCwg
c3RydWN0IHBjaV9kZXZpbnN0ICpwaSwgY2hhciAqb3B0cyk7CisKK3N0YXRpYyB2b2lkCitwY2lf
YXRhX2RtYV9zdGFydChzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MsIHVpbnQ4X3QgY2gpOworc3Rh
dGljIHZvaWQKK3BjaV9hdGFfZG1hX3N0b3Aoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50
OF90IGNoKTsKK3N0YXRpYyB1aW50NjRfdAorcGNpX2F0YV9idXNfbWFzdGVyX3JlYWQoc3RydWN0
IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50NjRfdCBvZmZzZXQpOworc3RhdGljIHZvaWQKK3BjaV9h
dGFfYnVzX21hc3Rlcl93cml0ZShzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MsCisJCXVpbnQ2NF90
IG9mZnNldCwgaW50IHNpemUsIHVpbnQ2NF90IHZhbHVlKTsKKworc3RhdGljIHVpbnQ2NF90Citw
Y2lfYXRhX3JlYWQoc3RydWN0IHZtY3R4ICpjdHgsIGludCB2Y3B1LCBzdHJ1Y3QgcGNpX2Rldmlu
c3QgKnBpLCBpbnQgYmFyaWR4LAorCQl1aW50NjRfdCBvZmZzZXQsIGludCBzaXplKTsKK3N0YXRp
YyB2b2lkCitwY2lfYXRhX3dyaXRlKHN0cnVjdCB2bWN0eCAqY3R4LCBpbnQgdmNwdSwgc3RydWN0
IHBjaV9kZXZpbnN0ICpwaSwKKwkJaW50IGJhcmlkeCwgdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2l6
ZSwgdWludDY0X3QgdmFsdWUpOworCisvKgorICogTFBDIEFUQSBmdW5jdGlvbiBkZWNsYXJhdGlv
bnMKKyAqLworc3RhdGljIHZvaWQKK2xwY19hdGFfaW50cl9hc3NlcnQodm9pZCAqYXJnKTsKK3N0
YXRpYyB2b2lkCitscGNfYXRhX2ludHJfZGVhc3NlcnQodm9pZCAqYXJnKTsKKworaW50CitscGNf
YXRhX2luaXQoc3RydWN0IHZtY3R4ICpjdHgsIGNvbnN0IGNoYXIgKm9wdHMpOworCitzdGF0aWMg
aW50CitscGNfYXRhX2lvX2hhbmRsZXIoc3RydWN0IHZtY3R4ICpjdHgsIGludCB2Y3B1LAorCQkg
ICBpbnQgaW4sIGludCBwb3J0LCBpbnQgYnl0ZXMsIHVpbnQzMl90ICplYXgsIHZvaWQgKmFyZyk7
CitzdGF0aWMgaW50CitscGNfYXRhX2lvY3RsX2hhbmRsZXIoc3RydWN0IHZtY3R4ICpjdHgsIGlu
dCB2Y3B1LAorCQkgICBpbnQgaW4sIGludCBwb3J0LCBpbnQgYnl0ZXMsIHVpbnQzMl90ICplYXgs
IHZvaWQgKmFyZyk7CisKKworLyoKKyAqIEFUQSBnbG9iYWwgZGF0YQorICovCitzdHJ1Y3QgcGNp
X2RldmVtdSBwY2lfZGVfYXRhX2hkID0geworCS5wZV9lbXUgPQkiYXRhLWhkIiwKKwkucGVfaW5p
dCA9CXBjaV9hdGFfaGRfaW5pdCwKKwkucGVfYmFyd3JpdGUgPQlwY2lfYXRhX3dyaXRlLAorCS5w
ZV9iYXJyZWFkID0JcGNpX2F0YV9yZWFkCit9OworUENJX0VNVUxfU0VUKHBjaV9kZV9hdGFfaGQp
OworCitzdGF0aWMgc3RydWN0IGxwY19hdGFfc29mdGMgbHBjX2F0YV9zY1tBVEFfQ0hBTk5FTFNd
ID0geworCXtOVUxMLCAxNCwgMHgxZjAsIDB4M2Y2LCAiYXRhMF9pb3BvcnQiLCAiYXRhMF9pb2N0
bHBvcnQifSwKKwl7TlVMTCwgMTUsIDB4MTcwLCAweDM3NiwgImF0YTFfaW9wb3J0IiwgImF0YTFf
aW9jdGxwb3J0In0KK307CisKKworLyoKKyAqIEFUQSBtb2R1bGUgZnVuY3Rpb24gZGVmaW5pdGlv
bnMKKyAqLworc3RhdGljIHZvaWQKK2F0YV9pcnFfcmFpc2Uoc3RydWN0IGF0YV9jaGFubmVsICpj
aGFubmVsKQoreworCXVpbnQ4X3QgaXJxX2Rpc2FibGVkOworCisJaXJxX2Rpc2FibGVkID0gY2hh
bm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXS5pcnFfZGlzYWJsZWQ7CisKKwlpZiAoIWlycV9k
aXNhYmxlZCAmJiAhY2hhbm5lbC0+bGludHIpIHsKKwkJY2hhbm5lbC0+bGludHIgPSAxOworCQlj
aGFubmVsLT5pbnRyX2Fzc2VydChjaGFubmVsLT5wcl9zYyk7CisJfQorCisJcmV0dXJuOworfQor
CitzdGF0aWMgdm9pZAorYXRhX2lycV9sb3dlcihzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwp
Cit7CisJaWYgKGNoYW5uZWwtPmxpbnRyKSB7CisJCWNoYW5uZWwtPmxpbnRyID0gMDsKKwkJY2hh
bm5lbC0+aW50cl9kZWFzc2VydChjaGFubmVsLT5wcl9zYyk7CisJfQorCisJcmV0dXJuOworfQor
CitzdGF0aWMgYXRhX2RyaXZlX3R5cGUKK2F0YV9kcml2ZV90eXBlX2J5X25hbWUoY2hhciAqZHJp
dmVfbmFtZSkKK3sKKwlpbnQgaSwgbGVuOworCWNoYXIgKmV4dCA9IE5VTEw7CisKKwlpZiAoIWRy
aXZlX25hbWUpCisJCXJldHVybiBBVEFfRFJJVkVfRU1QVFk7CisKKwlsZW4gPSBzdHJsZW4oZHJp
dmVfbmFtZSk7CisKKwlmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkgeworCQlpZiAoZHJp
dmVfbmFtZVtpXSA9PSAnLicpIHsKKwkJCWV4dCA9IGRyaXZlX25hbWUgKyBpICsgMTsKKwkJCWlm
IChzdHJjbXAoZXh0LCAiaXNvIikgPT0gMCkKKwkJCQlyZXR1cm4gQVRBUElfQ0Q7CisJCQlicmVh
azsKKwkJfQorCX0KKworCXJldHVybiBBVEFfSEQ7Cit9CisKK3N0YXRpYyBpbnQKK2F0YV9wYXJz
ZV9wYXJhbXMoY29uc3QgY2hhciAqb3B0cywgaW50ICpjaGFubmVsLCBjaGFyICpkaXNrX21hc3Rl
ciwKKwkJIGNoYXIgKmRpc2tfc2xhdmUsIHVpbnQ4X3QgKmhhc19zbGF2ZSkKK3sKKwl1aW50OF90
IGxlbjsKKwljaGFyIHBhcmFtWzY0XTsKKwljaGFyICpwYXJhbXNbM107CisJdWludDhfdCBpLCBq
OworCWludCBjaDsKKworCXBhcmFtc1swXSA9IE5VTEw7CisJcGFyYW1zWzFdID0gTlVMTDsKKwlw
YXJhbXNbMl0gPSBOVUxMOworCisJaWYgKCFvcHRzKSB7CisJCWRwcmludChMT0dfRVJSLCAiYXRh
X3BhcnNlX3BhcmFtczogb3B0cyBzaG91bGQgYmUgbGlrZTogWCxNQVNURVJbLFNMQVZFXVxuIik7
CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW4gPSBzdHJsZW4ob3B0cyk7CisJaWYgKGxlbiA+PSA2
NCkgeworCQlkcHJpbnQoTE9HX0VSUiwgImF0YV9wYXJzZV9wYXJhbXM6IEFUQSBzdHJpbmcgcGFy
YW0gdG9vIGJpZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdHJjcHkocGFyYW0sIG9wdHMp
OworCisJaiA9IDA7CisJcGFyYW1zW2pdID0gcGFyYW07CisJZm9yIChpID0gMDsgaSA8IGxlbjsg
aSsrKSB7CisJCWlmIChwYXJhbVtpXSA9PSAnLCcpIHsKKwkJCWorKzsKKwkJCWlmIChqID4gMikg
eworCQkJCWRwcmludChMT0dfRVJSLCAiYXRhX3BhcnNlX3BhcmFtczogdG8gbWFueSBwYXJhbXNc
biIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXBhcmFtW2ldID0gJ1wwJzsKKwkJCXBhcmFt
c1tqXSA9IHBhcmFtICsgaSArIDE7CisJCX0KKwl9CisKKwljaCA9IGF0b2kocGFyYW1zWzBdKTsK
KwlpZiAoY2ggIT0gQVRBX1ggJiYgY2ggIT0gQVRBX1kpIHsKKwkJZHByaW50KExPR19FUlIsICJh
dGFfcGFyc2VfcGFyYW1zOiB0aGUgY2hhbm5lbCBzaG91bGQgYmUgMCBvciAxXG4iKTsKKwkJcmV0
dXJuIC0xOworCX0KKwkqY2hhbm5lbCA9IGNoOworCisJaWYgKHBhcmFtc1sxXSA9PSBOVUxMIHx8
IHN0cmxlbihwYXJhbXNbMV0pID49IDMyKSB7CisJCWRwcmludChMT0dfRVJSLCAiYXRhX3BhcnNl
X3BhcmFtczogdGhlIG5hbWUgb2YgTUFTVEVSIHNob3VsZCBiZSBnaXZlblxuIik7CisJCXJldHVy
biAtMTsKKwl9CisJc3RyY3B5KGRpc2tfbWFzdGVyLCBwYXJhbXNbMV0pOworCisJaWYgKHBhcmFt
c1syXSAhPSBOVUxMICYmIHN0cmxlbihwYXJhbXNbMl0pIDwgMzIpIHsKKwkJc3RyY3B5KGRpc2tf
c2xhdmUsICBwYXJhbXNbMl0pOworCQkqaGFzX3NsYXZlID0gMTsKKwl9CisKKwlyZXR1cm4gMDsK
KworfQorCitzdGF0aWMgc3RydWN0IGF0YV9jaGFubmVsICoKK2F0YV9pbml0KHN0cnVjdCB2bWN0
eCAqY3R4LCBhdGFfaW50cl9mdW5jX3QgaW50cl9hc3NlcnQsIGF0YV9pbnRyX2Z1bmNfdCBpbnRy
X2RlYXNzZXJ0LCB2b2lkICpwcl9zYywKKwkgY29uc3QgY2hhciAqb3B0cywgdWludDhfdCBpc2Ff
YXQpCit7CisJY2hhciBiaWRlbnRbc2l6ZW9mKCJYWDpYOlg6WCIpXTsKKwlzdHJ1Y3QgYmxvY2tp
Zl9jdHh0ICpiY3R4dCA9IE5VTEwsICpiY3R4dF9zID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX2NoYW5u
ZWwgKmNoYW5uZWwgPSBOVUxMOworCWludCByZXQ7CisJaW50IGNoX2F0YSA9IC0xOworCWNoYXIg
ZGlza19tYXN0ZXJbMzJdOworCWNoYXIgZGlza19zbGF2ZVszMl07CisJdWludDhfdCBoYXNfc2xh
dmUgPSAwOworCWF0YV9kcml2ZV90eXBlIG1hc3Rlcl90eXBlID0gQVRBX0RSSVZFX0VNUFRZOwor
CWF0YV9kcml2ZV90eXBlIHNsYXZlX3R5cGUgPSBBVEFfRFJJVkVfRU1QVFk7CisKKwlyZXQgPSBh
dGFfcGFyc2VfcGFyYW1zKG9wdHMsICZjaF9hdGEsIGRpc2tfbWFzdGVyLCBkaXNrX3NsYXZlLCAm
aGFzX3NsYXZlKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZHByaW50KExPR19FUlIsICJhdGFfaW5p
dDogc29tZSBlcnJvcnMgd2l0aCB0aGUgaW5wdXQgY2hlY2tpbmdcbiIpOworCQlyZXR1cm4gTlVM
TDsKKwl9CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6IGNoX2F0YTogJWRcbiIsIGNo
X2F0YSk7CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gb3BlbiB0aGUgYmFja2luZyBpbWFnZXMuIFVz
ZSB0aGUKKwkgKiAiUENJL0lTQTpjaDpkcml2ZSIgZm9yIHRoZSBpZGVudGlmaWVyIHN0cmluZy4K
KwkgKi8KKwlzbnByaW50ZihiaWRlbnQsIHNpemVvZihiaWRlbnQpLCAiJWQ6JWQ6JWQiLCBpc2Ff
YXQsIGNoX2F0YSwgQVRBX01BU1RFUik7CisJYmN0eHQgPSBibG9ja2lmX29wZW4oZGlza19tYXN0
ZXIsIGJpZGVudCk7CisJaWYgKGJjdHh0ID09IE5VTEwpIHsKKwkJZ290byBvcGVuX2ZhaWw7CisJ
fQorCisJbWFzdGVyX3R5cGUgPSBhdGFfZHJpdmVfdHlwZV9ieV9uYW1lKGRpc2tfbWFzdGVyKTsK
KwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6IGRpc2tfbWFzdGVyOiAlcyB0eXBlOiAlc1xu
IiwKKwkgICAgICAgZGlza19tYXN0ZXIsIG1hc3Rlcl90eXBlID09IEFUQV9IRCA/ICJhdGFfaGQi
IDogImF0YXBpX2NkIik7CisKKwlpZiAoaGFzX3NsYXZlKSB7CisJCXNucHJpbnRmKGJpZGVudCwg
c2l6ZW9mKGJpZGVudCksICIlZDolZDolZCIsIGlzYV9hdCwgY2hfYXRhLCBBVEFfU0xBVkUpOwor
CQliY3R4dF9zID0gYmxvY2tpZl9vcGVuKGRpc2tfc2xhdmUsIGJpZGVudCk7CisJCWlmIChiY3R4
dF9zID09IE5VTEwpIHsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG9wZW5fZmFpbDsKKwkJfQorCisJ
CXNsYXZlX3R5cGUgPSBhdGFfZHJpdmVfdHlwZV9ieV9uYW1lKGRpc2tfc2xhdmUpOworCQlkcHJp
bnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6IGRpc2tfc2xhdmU6ICVzIHR5cGU6ICVzXG4iLAorCQkg
ICAgICAgZGlza19zbGF2ZSwgc2xhdmVfdHlwZSA9PSBBVEFfSEQgPyAiYXRhX2hkIiA6ICJhdGFw
aV9jZCIpOworCX0KKworCWRwcmludChMT0dfREVCVUcsICJhdGFfaW5pdDogb3B0czogJXMsIGF0
YXBpOiAlZFxuIiwgb3B0cywgMCk7CisKKwljaGFubmVsID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1
Y3QgYXRhX2NoYW5uZWwpKTsKKworCWNoYW5uZWwtPnZtX2N0eCA9IGN0eDsKKwljaGFubmVsLT5p
bnRlcmZhY2UgPSBjaF9hdGE7CisJY2hhbm5lbC0+aGFzX3NsYXZlID0gaGFzX3NsYXZlOworCisJ
Y2hhbm5lbC0+ZHJpdmVzW0FUQV9NQVNURVJdLnR5cGUgPSBtYXN0ZXJfdHlwZTsKKwljaGFubmVs
LT5kcml2ZXNbQVRBX1NMQVZFXS50eXBlID0gc2xhdmVfdHlwZTsKKworCWNoYW5uZWwtPmRyaXZl
c1tBVEFfTUFTVEVSXS5iY3R4dCA9IGJjdHh0OworCWNoYW5uZWwtPmRyaXZlc1tBVEFfU0xBVkVd
LmJjdHh0ICA9IGJjdHh0X3M7CisKKwljaGFubmVsLT5kcml2ZXNbQVRBX01BU1RFUl0ucGlvX3Nl
dHVwLmNoYW5uZWwgPSBjaGFubmVsOworCWNoYW5uZWwtPmRyaXZlc1tBVEFfU0xBVkVdLnBpb19z
ZXR1cC5jaGFubmVsICA9IGNoYW5uZWw7CisKKwljaGFubmVsLT5pbnRyX2Fzc2VydCA9IGludHJf
YXNzZXJ0OworCWNoYW5uZWwtPmludHJfZGVhc3NlcnQgPSBpbnRyX2RlYXNzZXJ0OworCWNoYW5u
ZWwtPnByX3NjID0gcHJfc2M7CisKKwlyZXR1cm4gY2hhbm5lbDsKKworb3Blbl9mYWlsOgorCWlm
IChyZXQpIHsKKwkJYmxvY2tpZl9jbG9zZShiY3R4dCk7CisJCWlmIChiY3R4dF9zICE9IE5VTEwp
IHsKKwkJCWJsb2NraWZfY2xvc2UoYmN0eHRfcyk7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsK
K30KKworc3RhdGljIHZvaWQKK2F0YV9zcnN0KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkK
K3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9IE5VTEw7CisJaW50IGRldjsKKworCWRwcmlu
dChMT0dfREVCVUcsICJhdGFfc3JzdDogU29mdHdhcmUgUmVzZXRcbiIpOworCisJZm9yIChkZXYg
PSAwOyBkZXYgPCBBVEFfRFJJVkVTOyBkZXYrKykgeworCQlkcml2ZSA9ICZjaGFubmVsLT5kcml2
ZXNbZGV2XTsKKworCQlpZiAoZHJpdmUtPnR5cGUgIT0gQVRBX0RSSVZFX0VNUFRZKSB7CisKKwkJ
CWRyaXZlLT5lcnJvciAgPSBBVEFfRV9JTEk7CisJCQlkcml2ZS0+c3RhdHVzID0gQVRBX1NfUkVB
RFk7CisKKwkJCWF0YV9zZXRfc2lnbmF0dXJlKGRyaXZlKTsKKwkJfQorCX0KKworCXJldHVybjsK
K30KKworc3RhdGljIHZvaWQKK2F0YV9pbml0aWFsaXplX2lkZW50KHN0cnVjdCBhdGFfY2hhbm5l
bCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2
ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsK
KwlzdHJ1Y3QgYXRhX3BhcmFtcyAqaWRlbnRfZGF0YSA9IE5VTEw7CisJc3RydWN0IGF0YV9waW9f
c2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisKKwl1aW50MTZfdCBjeWxpbmRlcnM7CisJdWludDhf
dCAgaGVhZHM7CisJdWludDhfdCAgc2VjdG9yczsKKwl1aW50MzJfdCB0b3RhbF9zZWN0b3JzOwor
CisJYmN0eHQgPSBkcml2ZS0+YmN0eHQ7CisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7
CisJaWRlbnRfZGF0YSA9IChzdHJ1Y3QgYXRhX3BhcmFtcyAqKWF0YV9waW9fZ2V0X2J1ZmZlcl9k
YXRhKHBpb19zZXR1cCk7CisKKwl0b3RhbF9zZWN0b3JzID0gYmxvY2tpZl9zaXplKGJjdHh0KSAv
IEFUQV9TRUNUT1JfU0laRTsKKworCW1lbXNldChpZGVudF9kYXRhLCAwLCBzaXplb2Yoc3RydWN0
IGF0YV9wYXJhbXMpKTsKKworCS8qIE51bWJlciBvZiBzZWN0b3JzIHBlciBibG9jayB1c2VkIGlu
IHJlYWQgLyB3cml0ZSBtdWx0aSBjb21tYW5kcyAqLworCWlkZW50X2RhdGEtPnNlY3RvcnNfaW50
ciB8PSAweDgwIDw8IDg7CisJaWRlbnRfZGF0YS0+c2VjdG9yc19pbnRyIHw9IEFUQV9TRUNUT1JT
X1BFUl9CTE9DSzsKKworCS8qIFVzZSBETUEyIG1vZGUgKi8KKwlpZGVudF9kYXRhLT5jYXBhYmls
aXRpZXMxIHw9IEFUQV9TVVBQT1JUX0RNQTsKKwlpZGVudF9kYXRhLT5td2RtYW1vZGVzIHw9IEFU
QV9XX0RNQTI7CisKKwkvKiBVc2UgUElPNCBtb2RlICovCisJaWRlbnRfZGF0YS0+YXRhdmFsaWQg
IHw9IEFUQV9GTEFHXzY0XzcwOworCWlkZW50X2RhdGEtPmFwaW9tb2RlcyB8PSBBVEFfTU9ERV9Q
SU80OworCisJLyogV2UgdXNlIDI4LWJpdCBMQkEgYWRkcmVzc2luZyBiZWNhdXNlIENIUyBhZGRy
ZXNzaW5nIGlzIG9ic29sZXRlIGluIEFUQS9BVEFQSSA2ICovCisJaWRlbnRfZGF0YS0+Y2FwYWJp
bGl0aWVzMSB8PSBBVEFfU1VQUE9SVF9MQkE7CisJaWRlbnRfZGF0YS0+bGJhX3NpemVfMSA9IHRv
dGFsX3NlY3RvcnM7CisJaWRlbnRfZGF0YS0+bGJhX3NpemVfMiA9IHRvdGFsX3NlY3RvcnMgPj4g
MTY7CisKKwkvKiBTdXBwb3J0IHdyaXRlLXJlYWQtdmVyaWZ5ICovCisJaWRlbnRfZGF0YS0+c3Vw
cG9ydDIgfD0gQVRBX1NVUFBPUlRfV1JJVEVSRUFEVkVSSUZZOworCWlkZW50X2RhdGEtPmVuYWJs
ZWQyIHw9IEFUQV9TVVBQT1JUX1dSSVRFUkVBRFZFUklGWTsKKworCS8qIFN1cHBvcnQgQVRBIEZM
VVNIQ0FDSEUgKi8KKwlpZGVudF9kYXRhLT5zdXBwb3J0LmNvbW1hbmQyIHw9IEFUQV9TVVBQT1JU
X0ZMVVNIQ0FDSEU7CisJaWRlbnRfZGF0YS0+ZW5hYmxlZC5jb21tYW5kMiB8PSBBVEFfU1VQUE9S
VF9GTFVTSENBQ0hFOworCisJLyogTWFqb3IgdmVyc2lvbiBudW1iZXIgPSBBVEEvQVRBUEktNiAq
LworCWlkZW50X2RhdGEtPnZlcnNpb25fbWFqb3IgfD0gQVRBX0FUQVBJXzY7CisKKwkvKiBUaGlz
IGluZm9ybWF0aW9uIGFyZSB1c2VkIG9ubHkgZm9yIHByaW50aW5nIHB1cnBvc2VzICovCisJYmxv
Y2tpZl9jaHMoYmN0eHQsICZjeWxpbmRlcnMsICZoZWFkcywgJnNlY3RvcnMpOworCisJaWRlbnRf
ZGF0YS0+Y3lsaW5kZXJzID0gY3lsaW5kZXJzOworCWlkZW50X2RhdGEtPmhlYWRzICAgICA9IGhl
YWRzOworCWlkZW50X2RhdGEtPnNlY3RvcnMgICA9IHNlY3RvcnM7CisKKwkvKiBNb2RlbDogQkhZ
VkUgQVRBIElERSBESVNLICovCisJbWVtY3B5KGlkZW50X2RhdGEtPm1vZGVsLCAgICAiSEJWWSBF
VEEgQURJIEVJREtTICAgICAgICAgICAgICAgICAgICAgICIsIDQwKTsKKwkvKiBTZXJpYWwgbnVt
YmVyOiAxMjM0NTYgKi8KKwltZW1jcHkoaWRlbnRfZGF0YS0+c2VyaWFsLCAgICIyMTQzNjUgICAg
ICAgICAgICAgICIsIDIwKTsKKwkvKiBGaXJtd2FyZSB2ZXJzaW9uOiAxLjAgKi8KKwltZW1jcHko
aWRlbnRfZGF0YS0+cmV2aXNpb24sICIuMSAwICAgICIsIDgpOworCisJZHByaW50KExPR19ERUJV
RywgImF0YV9pbml0aWFsaXplX2lkZW50OiBjaGFubmVsOiAlZCwgZHJpdmU6ICVkIEM6ICVkLCBI
OiAlZCwgUzogJWQsIHRvdGFsX3NlY3RvcnM6ICVkXG4iLAorCQkJY2hhbm5lbC0+aW50ZXJmYWNl
LCBjaGFubmVsLT5kcml2ZSwgY3lsaW5kZXJzLCBoZWFkcywgc2VjdG9ycywgdG90YWxfc2VjdG9y
cyk7CisKKwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1cCwgc2l6ZW9mKHN0cnVjdCBhdGFf
cGFyYW1zKSwgYXRhX3Bpb19nZW5lcmljX2VuZF90cmFuc2ZlciwgY2hhbm5lbC0+dXNlXzE2Yml0
KTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9pbml0aWFsaXplX2lk
ZW50KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpk
cml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBhdGFfcGFy
YW1zICppZGVudF9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVw
ID0gTlVMTDsKKworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWlkZW50X2RhdGEg
PSAoc3RydWN0IGF0YV9wYXJhbXMgKilhdGFfcGlvX2dldF9idWZmZXJfZGF0YShwaW9fc2V0dXAp
OworCisJbWVtc2V0KGlkZW50X2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYXRhX3BhcmFtcykpOwor
CisJLyogQ0RST00gZGV2aWNlICovCisJaWRlbnRfZGF0YS0+Y29uZmlnIHw9IChBVEFfUFJPVE9f
QVRBUElfMTIgfCBBVEFfQVRBUElfVFlQRV9DRFJPTSB8IEFUQV9EUlFfRkFTVCk7CisKKwkvKiBV
c2UgRE1BMiBtb2RlICovCisJaWRlbnRfZGF0YS0+Y2FwYWJpbGl0aWVzMSB8PSBBVEFfU1VQUE9S
VF9ETUE7CisJaWRlbnRfZGF0YS0+bXdkbWFtb2RlcyB8PSBBVEFfV19ETUEyOworCisJLyogVXNl
IFBJTzQgbW9kZSAqLworCWlkZW50X2RhdGEtPmF0YXZhbGlkICB8PSBBVEFfRkxBR182NF83MDsK
KwlpZGVudF9kYXRhLT5hcGlvbW9kZXMgfD0gQVRBX01PREVfUElPNDsKKworCS8qIFdlIHVzZSAy
OC1iaXQgTEJBIGFkZHJlc3NpbmcgYmVjYXVzZSBDSFMgYWRkcmVzc2luZyBpcyBvYnNvbGV0ZSBp
biBBVEEvQVRBUEkgNiAqLworCWlkZW50X2RhdGEtPmNhcGFiaWxpdGllczEgfD0gQVRBX1NVUFBP
UlRfTEJBOworCisJLyogTWFqb3IgdmVyc2lvbiBudW1iZXIgPSBBVEEvQVRBUEktNiAqLworCWlk
ZW50X2RhdGEtPnZlcnNpb25fbWFqb3IgfD0gQVRBX0FUQVBJXzY7CisKKwkvKiBNb2RlbDogQkhZ
VkUgQVRBUEkgSURFIENEUk9NICovCisJbWVtY3B5KGlkZW50X2RhdGEtPm1vZGVsLCAgICAiSEJW
WSBFVEFQQSBJREkgRURDT1IgTSAgICAgICAgICAgICAgICAgICIsIDQwKTsKKwkvKiBTZXJpYWwg
bnVtYmVyOiAxMjM0NTYgKi8KKwltZW1jcHkoaWRlbnRfZGF0YS0+c2VyaWFsLCAgICIyMTQzNjUg
ICAgICAgICAgICAgICIsIDIwKTsKKwkvKiBGaXJtd2FyZSB2ZXJzaW9uOiAxLjAgKi8KKwltZW1j
cHkoaWRlbnRfZGF0YS0+cmV2aXNpb24sICIuMSAwICAgICIsIDgpOworCisJZHByaW50KExPR19E
RUJVRywgImF0YV9hdGFwaV9pbml0aWFsaXplX2lkZW50OiBjaGFubmVsOiAlZCwgZHJpdmU6ICVk
XG4iLAorCSAgICAgICBjaGFubmVsLT5pbnRlcmZhY2UsIGNoYW5uZWwtPmRyaXZlKTsKKworCWF0
YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXplb2Yoc3RydWN0IGF0YV9wYXJhbXMpLCBh
dGFfcGlvX2dlbmVyaWNfZW5kX3RyYW5zZmVyLCBjaGFubmVsLT51c2VfMTZiaXQpOworCisJcmV0
dXJuOworfQorCitzdGF0aWMgaW50CithdGFfY2hhbm5lbF9pc19vayhzdHJ1Y3QgYXRhX2NoYW5u
ZWwgKmNoYW5uZWwsIHVpbnQ4X3QgY2gpCit7CisJaWYgKGNoYW5uZWwtPmludGVyZmFjZSA9PSBj
aCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYXRhX3NlbGVj
dF9kcml2ZV9pc19vayhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaWYgKGNoYW5u
ZWwtPmRyaXZlID09IEFUQV9TTEFWRSAmJiAhY2hhbm5lbC0+aGFzX3NsYXZlKSB7CisJCXJldHVy
biAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorYXRhX3NldF9zdGF0dXNf
b2soc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRy
aXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcml2ZS0+c3RhdHVz
ICY9IH5BVEFfU19CVVNZOworCWRyaXZlLT5zdGF0dXMgfD0gQVRBX1NfUkVBRFk7CisJZHJpdmUt
PnN0YXR1cyAmPSB+QVRBX1NfRFdGOworCWRyaXZlLT5zdGF0dXMgJj0gfkFUQV9TX0RSUTsKKwlk
cml2ZS0+c3RhdHVzICY9IH5BVEFfU19FUlJPUjsKKworCWRyaXZlLT5lcnJvciA9IDA7CisKKwly
ZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfc2V0X2RhdGFfYmxvY2tfcmVhZHkoc3RydWN0
IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNo
YW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcml2ZS0+YWx0c3RhdHVzICY9IH5B
VEFfU19CVVNZOworCWRyaXZlLT5hbHRzdGF0dXMgfD0gQVRBX1NfRFJROworCWRyaXZlLT5hbHRz
dGF0dXMgfD0gQVRBX1NfUkVBRFk7CisKKwlkcml2ZS0+c3RhdHVzIHw9IEFUQV9TX0RSUTsKKwor
CXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9jb21tYW5kX2Fib3J0ZWQoc3RydWN0IGF0
YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5u
ZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcml2ZS0+c3RhdHVzICY9IH5BVEFfU19C
VVNZOworCWRyaXZlLT5zdGF0dXMgJj0gfkFUQV9TX0RSUTsKKwlkcml2ZS0+c3RhdHVzIHw9IEFU
QV9TX0VSUk9SOworCisJZHJpdmUtPmVycm9yIHw9IEFUQV9FX0FCT1JUOworCisJcmV0dXJuOwor
fQorCitzdGF0aWMgdm9pZAorYXRhX3NldF9zaWduYXR1cmUoc3RydWN0IGF0YV9kcml2ZSAqZHJp
dmUpCit7CisJZHJpdmUtPnNlY2NvdW50ID0gMHgwMTsKKwlkcml2ZS0+bGJhX2xvdyAgPSAweDAx
OworCisJaWYgKGRyaXZlLT50eXBlID09IEFUQV9IRCkgeworCQlkcml2ZS0+bGJhX21pZCAgPSAw
eDAwOworCQlkcml2ZS0+bGJhX2hpZ2ggPSAweDAwOworCQlkcml2ZS0+aGRkZXZzZWwgPSAweDAw
OworCX0KKwllbHNlIGlmIChkcml2ZS0+dHlwZSA9PSBBVEFQSV9DRCkgeworCQlkcml2ZS0+bGJh
X21pZCAgPSBBVEFQSV9NQUdJQ19MU0I7CisJCWRyaXZlLT5sYmFfaGlnaCA9IEFUQVBJX01BR0lD
X01TQjsKKwkJZHJpdmUtPmhkZGV2c2VsICY9IDB4MTA7CisJfQorCWVsc2UKKwkJYXNzZXJ0KDAp
OworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2FkZHJlc3Npbmdfc2VjX2NvdW50
KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDE2X3QgKnBfc2VjdG9yX2NvdW50KQor
eworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5k
cml2ZV07CisJdWludDE2X3Qgc2VjdG9yX2NvdW50OworCisJc2VjdG9yX2NvdW50ID0gZHJpdmUt
PnNlY2NvdW50ID8gZHJpdmUtPnNlY2NvdW50IDogQVRBX01BWF9TRUNfQ09VTlQ7CisJKnBfc2Vj
dG9yX2NvdW50ID0gc2VjdG9yX2NvdW50OworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAor
YXRhX2FkZHJlc3NpbmdfMjhfbGJhKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDMy
X3QgKnBfbGJhX2FkZHJlc3MpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5l
bC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwl1aW50MzJfdCBsYmFfYWRkcmVzcyA9IDA7CisK
KwlsYmFfYWRkcmVzcyB8PSBkcml2ZS0+bGJhX2xvdzsKKwlsYmFfYWRkcmVzcyB8PSBkcml2ZS0+
bGJhX21pZCA8PCA4OworCWxiYV9hZGRyZXNzIHw9IGRyaXZlLT5sYmFfaGlnaCA8PCAxNjsKKwls
YmFfYWRkcmVzcyB8PSAoZHJpdmUtPmhkZGV2c2VsICYgQVRBX0xCQV8yN18yNF9NQVNLKSA8PCAy
NDsKKworCSpwX2xiYV9hZGRyZXNzID0gbGJhX2FkZHJlc3M7CisKKwlyZXR1cm47Cit9CisKK3N0
YXRpYyB2b2lkCithdGFfaW5pdF9ibG9ja19yZXF1ZXN0KHN0cnVjdCBibG9ja2lmX3JlcSAqYnJl
cSwgc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLAorCQkgICAgICAgdWludDY0X3Qgb2Zmc2V0
LCB1aW50NjRfdCBuYnl0ZXMsIHZvaWQgKmJ1ZmZlcikKK3sKKwlicmVxLT5icl9wYXJhbSA9IGNo
YW5uZWw7CisJYnJlcS0+YnJfY2FsbGJhY2sgPSBhdGFfaGFuZGxlX2Jsb2NrX3JlcXVlc3Q7CisJ
YnJlcS0+YnJfb2Zmc2V0ID0gb2Zmc2V0OworCWJyZXEtPmJyX2lvdmNudCA9IDE7CisJYnJlcS0+
YnJfaW92WzBdLmlvdl9sZW4gPSBuYnl0ZXM7CisJYnJlcS0+YnJfaW92WzBdLmlvdl9iYXNlID0g
YnVmZmVyOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9ibG9ja19y
ZXF1ZXN0KHN0cnVjdCBibG9ja2lmX3JlcSAqcmVxLCBpbnQgZXJyKQoreworCXN0cnVjdCBhdGFf
Y2hhbm5lbCAqY2hhbm5lbCA9IChzdHJ1Y3QgYXRhX2NoYW5uZWwgKilyZXEtPmJyX3BhcmFtOwor
CisJYXRhX3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJYXRhX3NldF9kYXRhX2Jsb2NrX3JlYWR5
KGNoYW5uZWwpOworCWF0YV9pcnFfcmFpc2UoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0
YXRpYyB2b2lkCithdGFfcGlvX2RvX3RyYW5zZmVyKHN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9f
c2V0dXAsIHVpbnQ2NF90IHNpemVfdHJhbnNmZXIsCisJCSAgICAgYXRhX3Bpb19lbmRfdHJhbnNm
ZXJfZnVuY190IGVuZF90cmFuc2ZlciwgdWludDhfdCB1c2Vfd29yZCkKK3sKKwlhc3NlcnQoc2l6
ZV90cmFuc2ZlciA8PSBBVEFfSU5CVUZfU0laRSk7CisJYXNzZXJ0KCFhdGFfcGlvX2luX3Byb2dy
ZXNzKHBpb19zZXR1cCkpOworCisJcGlvX3NldHVwLT51c2Vfd29yZCA9IHVzZV93b3JkOworCXBp
b19zZXR1cC0+cGlvX2J1ZmZlci5jdXJyZW50X3BvcyA9IDA7CisJcGlvX3NldHVwLT5zaXplX3Ry
YW5zZmVyID0gc2l6ZV90cmFuc2ZlcjsKKwlwaW9fc2V0dXAtPmVuZF90cmFuc2ZlciA9IGVuZF90
cmFuc2ZlcjsKKworCXJldHVybjsKK30KKworc3RhdGljIGludAorYXRhX3Bpb19pbl9wcm9ncmVz
cyhzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKQoreworCXJldHVybiAoaW50KXBpb19z
ZXR1cC0+ZW5kX3RyYW5zZmVyOworfQorCitzdGF0aWMgdWludDhfdCAqCithdGFfcGlvX2dldF9i
dWZmZXJfZGF0YShzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKQoreworCXJldHVybiBw
aW9fc2V0dXAtPnBpb19idWZmZXIuZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2F0YV9waW9fY2hl
Y2tfZW5kX3RyYW5zZmVyKHN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXApCit7CisJc3Ry
dWN0IGF0YV9jaGFubmVsICpjaGFubmVsID0gcGlvX3NldHVwLT5jaGFubmVsOworCXN0cnVjdCBh
dGFfcGlvX2J1ZmZlciAqcGlvX2J1ZmZlciA9ICZwaW9fc2V0dXAtPnBpb19idWZmZXI7CisJYXRh
X3Bpb19lbmRfdHJhbnNmZXJfZnVuY190IGVuZF90cmFuc2ZlciA9IHBpb19zZXR1cC0+ZW5kX3Ry
YW5zZmVyOworCisJaWYgKHBpb19idWZmZXItPmN1cnJlbnRfcG9zID09IHBpb19zZXR1cC0+c2l6
ZV90cmFuc2ZlcikgeworCQlwaW9fc2V0dXAtPmVuZF90cmFuc2ZlciA9IE5VTEw7CisJCWVuZF90
cmFuc2ZlcihjaGFubmVsKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB1aW50MzJfdAor
YXRhX3Bpb19nZXRfdWludChzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKQoreworCXN0
cnVjdCBhdGFfcGlvX2J1ZmZlciAqcGlvX2J1ZmZlciA9ICZwaW9fc2V0dXAtPnBpb19idWZmZXI7
CisJdWludDMyX3QgdmFsdWU7CisKKwlhc3NlcnQocGlvX2J1ZmZlci0+Y3VycmVudF9wb3MgPCBw
aW9fc2V0dXAtPnNpemVfdHJhbnNmZXIpOworCisJaWYgKHBpb19zZXR1cC0+dXNlX3dvcmQpIHsK
KwkJdmFsdWUgPSAqKHVpbnQxNl90ICopKHBpb19idWZmZXItPmRhdGEgKyBwaW9fYnVmZmVyLT5j
dXJyZW50X3Bvcyk7CisJCXBpb19idWZmZXItPmN1cnJlbnRfcG9zICs9IHNpemVvZih1aW50MTZf
dCk7CisJfQorCWVsc2UgeworCQl2YWx1ZSA9ICoodWludDMyX3QgKikocGlvX2J1ZmZlci0+ZGF0
YSArIHBpb19idWZmZXItPmN1cnJlbnRfcG9zKTsKKwkJcGlvX2J1ZmZlci0+Y3VycmVudF9wb3Mg
Kz0gc2l6ZW9mKHVpbnQzMl90KTsKKwl9CisKKwlhdGFfcGlvX2NoZWNrX2VuZF90cmFuc2Zlcihw
aW9fc2V0dXApOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZAorYXRhX3Bpb19w
dXRfdWludChzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwLCB1aW50MzJfdCB3cml0ZV92
YWx1ZSkKK3sKKwlzdHJ1Y3QgYXRhX3Bpb19idWZmZXIgKnBpb19idWZmZXIgPSAmcGlvX3NldHVw
LT5waW9fYnVmZmVyOworCisJYXNzZXJ0KHBpb19idWZmZXItPmN1cnJlbnRfcG9zIDwgcGlvX3Nl
dHVwLT5zaXplX3RyYW5zZmVyKTsKKworCWlmIChwaW9fc2V0dXAtPnVzZV93b3JkKSB7CisJCSoo
dWludDE2X3QgKikocGlvX2J1ZmZlci0+ZGF0YSArIHBpb19idWZmZXItPmN1cnJlbnRfcG9zKSA9
ICh1aW50MTZfdCl3cml0ZV92YWx1ZTsKKwkJcGlvX2J1ZmZlci0+Y3VycmVudF9wb3MgKz0gc2l6
ZW9mKHVpbnQxNl90KTsKKwl9CisJZWxzZSB7CisJCSoodWludDMyX3QgKikocGlvX2J1ZmZlci0+
ZGF0YSArIHBpb19idWZmZXItPmN1cnJlbnRfcG9zKSA9IHdyaXRlX3ZhbHVlOworCQlwaW9fYnVm
ZmVyLT5jdXJyZW50X3BvcyArPSBzaXplb2YodWludDMyX3QpOworCX0KKworCWF0YV9waW9fY2hl
Y2tfZW5kX3RyYW5zZmVyKHBpb19zZXR1cCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lk
CithdGFfcGlvX2dlbmVyaWNfZW5kX3RyYW5zZmVyKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l
bCkKK3sKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX3Bpb19nZW5lcmljX2VuZF90cmFuc2Zlcjog
Y2g6ICVkIGRyaXZlOiAlZFxuIiwKKwkgICAgICAgY2hhbm5lbC0+aW50ZXJmYWNlLCBjaGFubmVs
LT5kcml2ZSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfcmVhZF9tdWx0aXBs
ZV9ibG9ja19kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRh
X2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVj
dCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlv
X3NldHVwID0gTlVMTDsKKwlzdHJ1Y3QgYmxvY2tpZl9yZXEgKmJyZXEgPSBOVUxMOworCXVpbnQ2
NF90IGNvdW50OworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJaW50IGVycjsKKworCWJjdHh0
ID0gZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWJyZXEg
PSAmcGlvX3NldHVwLT5icmVxOworCisJZHJpdmUtPm9mZnNldCArPSBwaW9fc2V0dXAtPnNpemVf
dHJhbnNmZXI7CisJZHJpdmUtPmNvdW50IC09IHBpb19zZXR1cC0+c2l6ZV90cmFuc2ZlcjsKKwor
CWNvdW50ID0gZHJpdmUtPmNvdW50OworCisJaWYgKGNvdW50KSB7CisJCXNpemVfdHJhbnNmZXIg
PSBjb3VudCA+PSBBVEFfQkxPQ0tfU0laRSA/IEFUQV9CTE9DS19TSVpFIDogY291bnQ7CisJCWF0
YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXplX3RyYW5zZmVyLCBhdGFfcmVhZF9tdWx0
aXBsZV9ibG9ja19kb25lLCBjaGFubmVsLT51c2VfMTZiaXQpOworCisJCWF0YV9pbml0X2Jsb2Nr
X3JlcXVlc3QoYnJlcSwgY2hhbm5lbCwgZHJpdmUtPm9mZnNldCwKKwkJCQkgICAgICAgc2l6ZV90
cmFuc2ZlciwgYXRhX3Bpb19nZXRfYnVmZmVyX2RhdGEocGlvX3NldHVwKSk7CisKKwkJZXJyID0g
YmxvY2tpZl9yZWFkKGJjdHh0LCBicmVxKTsKKwkJYXNzZXJ0KCFlcnIpOworCX0KKwllbHNlIHsK
KwkJZHByaW50KExPR19ERUJVRywgImF0YV9yZWFkX211bHRpcGxlX2Jsb2NrX2RvbmU6IEFUQV9S
RUFEX01VTCBjb21wbGV0ZWRcbiIpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQK
K2F0YV93cml0ZV9tdWx0aXBsZV9ibG9ja19kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l
bCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5l
bC0+ZHJpdmVdOworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsKKwlzdHJ1Y3Qg
YXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKwlzdHJ1Y3QgYmxvY2tpZl9yZXEgKmJy
ZXEgPSBOVUxMOworCXVpbnQ2NF90IGNvdW50OworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJ
aW50IGVycjsKKworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+
cGlvX3NldHVwOworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOworCisJYXRhX2luaXRfYmxvY2tf
cmVxdWVzdChicmVxLCBjaGFubmVsLCBkcml2ZS0+b2Zmc2V0LAorCQkJICAgICAgIHBpb19zZXR1
cC0+c2l6ZV90cmFuc2ZlciwgYXRhX3Bpb19nZXRfYnVmZmVyX2RhdGEocGlvX3NldHVwKSk7CisK
Kwlkcml2ZS0+b2Zmc2V0ICs9IHBpb19zZXR1cC0+c2l6ZV90cmFuc2ZlcjsKKwlkcml2ZS0+Y291
bnQgLT0gcGlvX3NldHVwLT5zaXplX3RyYW5zZmVyOworCisJY291bnQgPSBkcml2ZS0+Y291bnQ7
CisKKwlpZiAoY291bnQpIHsKKwkJc2l6ZV90cmFuc2ZlciA9IGNvdW50ID49IEFUQV9CTE9DS19T
SVpFID8gQVRBX0JMT0NLX1NJWkUgOiBjb3VudDsKKwkJYXRhX3Bpb19kb190cmFuc2ZlcihwaW9f
c2V0dXAsIHNpemVfdHJhbnNmZXIsIGF0YV93cml0ZV9tdWx0aXBsZV9ibG9ja19kb25lLCBjaGFu
bmVsLT51c2VfMTZiaXQpOworCX0KKwllbHNlIHsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV93
cml0ZV9tdWx0aXBsZV9ibG9ja19kb25lOiBBVEFfV1JJVEVfTVVMIGNvbXBsZXRlZFxuIik7CisJ
fQorCisJZXJyID0gYmxvY2tpZl93cml0ZShiY3R4dCwgYnJlcSk7CisJYXNzZXJ0KCFlcnIpOwor
CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2RvbmUo
c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZl
ID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJc3RydWN0IGJsb2NraWZfY3R4
dCAqYmN0eHQgPSBOVUxMOworCXN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAgPSBOVUxM
OworCXN0cnVjdCBibG9ja2lmX3JlcSAqYnJlcSA9IE5VTEw7CisJdWludDY0X3QgY291bnQ7CisJ
aW50IGVycjsKKworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+
cGlvX3NldHVwOworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOworCisJZHJpdmUtPm9mZnNldCAr
PSBBVEFQSV9CTE9DS19TSVpFOworCWRyaXZlLT5jb3VudCAtPSBBVEFQSV9CTE9DS19TSVpFOwor
CisJY291bnQgPSBkcml2ZS0+Y291bnQ7CisKKwlpZiAoY291bnQpIHsKKwkJYXNzZXJ0KGNvdW50
ID49IEFUQVBJX0JMT0NLX1NJWkUpOworCisJCWRyaXZlLT5zZWNjb3VudCA9IEFUQV9JX0lOOwor
CisJCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBBVEFQSV9CTE9DS19TSVpFLCBhdGFf
YXRhcGlfaGFuZGxlX3JlYWRfZG9uZSwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKworCQlhdGFfaW5p
dF9ibG9ja19yZXF1ZXN0KGJyZXEsIGNoYW5uZWwsIGRyaXZlLT5vZmZzZXQsCisJCQkJICAgICAg
IEFUQVBJX0JMT0NLX1NJWkUsIGF0YV9waW9fZ2V0X2J1ZmZlcl9kYXRhKHBpb19zZXR1cCkpOwor
CisJCWVyciA9IGJsb2NraWZfcmVhZChiY3R4dCwgYnJlcSk7CisJCWFzc2VydCghZXJyKTsKKwl9
CisJZWxzZSB7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfYXRhcGlfaGFuZGxlX3JlYWRfZG9u
ZTogUkVBRCBjb21wbGV0ZWRcbiIpOworCQlhdGFfYXRhcGlfY21kX2RvbmUoY2hhbm5lbCk7CisJ
fQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9pZGVudGlmeShzdHJ1
Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAm
Y2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKworCWlmIChkcml2ZS0+dHlwZSA9PSBB
VEFfSEQpIHsKKwkJYXRhX2luaXRpYWxpemVfaWRlbnQoY2hhbm5lbCk7CisKKwkJYXRhX3NldF9k
YXRhX2Jsb2NrX3JlYWR5KGNoYW5uZWwpOworCQlhdGFfc2V0X3N0YXR1c19vayhjaGFubmVsKTsK
KwkJYXRhX2lycV9yYWlzZShjaGFubmVsKTsKKwl9CisJZWxzZSBpZiAoZHJpdmUtPnR5cGUgPT0g
QVRBUElfQ0QpIHsKKwkJYXRhX2NvbW1hbmRfYWJvcnRlZChjaGFubmVsKTsKKwkJYXRhX3NldF9z
aWduYXR1cmUoZHJpdmUpOworCX0KKwllbHNlCisJCWFzc2VydCgwKTsKKworCXJldHVybjsKK30K
Kworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfc2V0ZmVhdHVyZXMoc3RydWN0IGF0YV9jaGFubmVs
ICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZl
c1tjaGFubmVsLT5kcml2ZV07CisKKwlzd2l0Y2ggKGRyaXZlLT5mZWF0dXJlcykgeworCWNhc2Ug
QVRBX1NGX1NFVFhGRVI6CisJCWNoYW5uZWwtPm1vZGUgPSBkcml2ZS0+c2VjY291bnQ7CisJCWRw
cmludChMT0dfREVCVUcsICJhdGFfaGFuZGxlX3NldGZlYXR1cmVzIEFUQV9TRl9TRVRYRkVSOiBt
b2RlOiAlZFxuIiwKKwkJICAgICAgIGNoYW5uZWwtPm1vZGUpOworCQlicmVhazsKKwljYXNlIEFU
QV9TRl9FTkFCX1dDQUNIRToKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfRElTX1dDQUNIRToKKwkJ
YnJlYWs7CisJY2FzZSBBVEFfU0ZfRU5BQl9QVUlTOgorCQlicmVhazsKKwljYXNlIEFUQV9TRl9E
SVNfUFVJUzoKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfUFVJU19TUElOVVA6CisJCWJyZWFrOwor
CWNhc2UgQVRBX1NGX0VOQUJfUkNBQ0hFOgorCQlicmVhazsKKwljYXNlIEFUQV9TRl9ESVNfUkNB
Q0hFOgorCQlicmVhazsKKwljYXNlIEFUQV9TRl9FTkFCX1JFTElSUToKKwkJYnJlYWs7CisJY2Fz
ZSBBVEFfU0ZfRElTX1JFTElSUToKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfRU5BQl9TUlZJUlE6
CisJCWJyZWFrOworCWNhc2UgQVRBX1NGX0RJU19TUlZJUlE6CisJCWJyZWFrOworCWRlZmF1bHQ6
CisJCWJyZWFrOworCX0KKworCWF0YV9zZXRfc3RhdHVzX29rKGNoYW5uZWwpOworCWF0YV9pcnFf
cmFpc2UoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxl
X3NldF9tdWx0aShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0YV9k
cml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKworCWNoYW5u
ZWwtPnNlY3RvcnNfcGVyX2Jsb2NrID0gZHJpdmUtPnNlY2NvdW50OworCisJYXNzZXJ0KGNoYW5u
ZWwtPnNlY3RvcnNfcGVyX2Jsb2NrID09IEFUQV9TRUNUT1JTX1BFUl9CTE9DSyk7CisKKwlkcHJp
bnQoTE9HX0RFQlVHLCAiYXRhX2hhbmRsZV9zZXRfbXVsdGk6IHNlY3RvcnNfcGVyX2Jsb2NrOiAl
ZFxuIiwKKwkgICAgICAgY2hhbm5lbC0+c2VjdG9yc19wZXJfYmxvY2spOworCisJYXRhX3NldF9z
dGF0dXNfb2soY2hhbm5lbCk7CisJYXRhX2lycV9yYWlzZShjaGFubmVsKTsKKworCXJldHVybjsK
K30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfcmVhZF9tdWx0aXBsZShzdHJ1Y3QgYXRhX2No
YW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+
ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYmxvY2tpZl9jdHh0ICpiY3R4dCA9IE5V
TEw7CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJc3RydWN0IGJs
b2NraWZfcmVxICpicmVxID0gTlVMTDsKKworCXVpbnQxNl90IHNlY3Rvcl9jb3VudDsKKwl1aW50
MzJfdCBsYmFfYWRkcmVzcyA9IDA7CisJdWludDY0X3Qgb2Zmc2V0OworCXVpbnQ2NF90IGNvdW50
OworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJaW50IGVycjsKKworCWJjdHh0ID0gZHJpdmUt
PmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWJyZXEgPSAmcGlvX3Nl
dHVwLT5icmVxOworCisJYXRhX2FkZHJlc3Npbmdfc2VjX2NvdW50KGNoYW5uZWwsICZzZWN0b3Jf
Y291bnQpOworCWF0YV9hZGRyZXNzaW5nXzI4X2xiYShjaGFubmVsLCAmbGJhX2FkZHJlc3MpOwor
CisJZHByaW50KExPR19ERUJVRywgImF0YV9oYW5kbGVfcmVhZF9tdWx0aXBsZTogc2VjdG9yX2Nv
dW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXhcbiIsCisJICAgICAgIHNlY3Rvcl9jb3VudCwgbGJh
X2FkZHJlc3MpOworCisJb2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9hZGRyZXNzICogQVRBX1NFQ1RP
Ul9TSVpFOworCWNvdW50ID0gKHVpbnQ2NF90KXNlY3Rvcl9jb3VudCAqIEFUQV9TRUNUT1JfU0la
RTsKKworCWRyaXZlLT5jb3VudCA9IGNvdW50OworCWRyaXZlLT5vZmZzZXQgPSBvZmZzZXQ7CisK
KwlzaXplX3RyYW5zZmVyID0gY291bnQgPj0gQVRBX0JMT0NLX1NJWkUgPyBBVEFfQkxPQ0tfU0la
RSA6IGNvdW50OworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXplX3RyYW5zZmVy
LCBhdGFfcmVhZF9tdWx0aXBsZV9ibG9ja19kb25lLCBjaGFubmVsLT51c2VfMTZiaXQpOworCisJ
YXRhX2luaXRfYmxvY2tfcmVxdWVzdChicmVxLCBjaGFubmVsLCBkcml2ZS0+b2Zmc2V0LAorCQkJ
ICAgICAgIHNpemVfdHJhbnNmZXIsIGF0YV9waW9fZ2V0X2J1ZmZlcl9kYXRhKHBpb19zZXR1cCkp
OworCisJZXJyID0gYmxvY2tpZl9yZWFkKGJjdHh0LCBicmVxKTsKKwlhc3NlcnQoIWVycik7CisK
KwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX3JlYWRfdmVyaWZ5KHN0cnVj
dCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZj
aGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCWRwcmludChMT0dfREVCVUcsICJhdGFf
aGFuZGxlX3JlYWRfdmVyaWZ5XG4iKTsKKworCWF0YV9zZXRfc3RhdHVzX29rKGNoYW5uZWwpOwor
CWRyaXZlLT5hbHRzdGF0dXMgJj0gfkFUQV9TX0RSUTsKKwlhdGFfaXJxX3JhaXNlKGNoYW5uZWwp
OworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV93cml0ZV9tdWx0aXBs
ZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJp
dmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYmxvY2tpZl9j
dHh0ICpiY3R4dCA9IE5VTEw7CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5V
TEw7CisKKwl1aW50MTZfdCBzZWN0b3JfY291bnQ7CisJdWludDMyX3QgbGJhX2FkZHJlc3MgPSAw
OworCXVpbnQ2NF90IG9mZnNldDsKKwl1aW50NjRfdCBjb3VudDsKKwl1aW50NjRfdCBzaXplX3Ry
YW5zZmVyOworCisJYmN0eHQgPSBkcml2ZS0+YmN0eHQ7CisJcGlvX3NldHVwID0gJmRyaXZlLT5w
aW9fc2V0dXA7CisKKwlhdGFfYWRkcmVzc2luZ19zZWNfY291bnQoY2hhbm5lbCwgJnNlY3Rvcl9j
b3VudCk7CisJYXRhX2FkZHJlc3NpbmdfMjhfbGJhKGNoYW5uZWwsICZsYmFfYWRkcmVzcyk7CisK
KwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2hhbmRsZV93cml0ZV9tdWx0aXBsZTogc2VjdG9yX2Nv
dW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXhcbiIsCisJICAgICAgIHNlY3Rvcl9jb3VudCwgbGJh
X2FkZHJlc3MpOworCisJb2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9hZGRyZXNzICogQVRBX1NFQ1RP
Ul9TSVpFOworCWNvdW50ID0gKHVpbnQ2NF90KXNlY3Rvcl9jb3VudCAqIEFUQV9TRUNUT1JfU0la
RTsKKworCWRyaXZlLT5vZmZzZXQgPSBvZmZzZXQ7CisJZHJpdmUtPmNvdW50ID0gY291bnQ7CisK
KwlzaXplX3RyYW5zZmVyID0gY291bnQgPj0gQVRBX0JMT0NLX1NJWkUgPyBBVEFfQkxPQ0tfU0la
RSA6IGNvdW50OworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXplX3RyYW5zZmVy
LCBhdGFfd3JpdGVfbXVsdGlwbGVfYmxvY2tfZG9uZSwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKwor
CXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfZG1hKHN0cnVjdCBhdGFfY2hh
bm5lbCAqY2hhbm5lbCwgdWludDhfdCBvcF9kaXIpCit7CisJc3RydWN0IHBjaV9hdGFfc29mdGMg
KnNjID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2F0YV9kbWFfdHJhbnNhY3Rpb24gKmRtYV90cmFuc2Fj
dGlvbiA9IE5VTEw7CisKKwl1aW50MTZfdCBzZWN0b3JfY291bnQ7CisJdWludDMyX3QgbGJhX2Fk
ZHJlc3MgPSAwOworCisJc2MgPSBjaGFubmVsLT5wcl9zYzsKKwlkbWFfdHJhbnNhY3Rpb24gPSAm
c2MtPmRtYV90cmFuc2FjdGlvbnNbY2hhbm5lbC0+aW50ZXJmYWNlXTsKKworCWFzc2VydCghZG1h
X3RyYW5zYWN0aW9uLT5zdGFydGVkKTsKKworCWF0YV9hZGRyZXNzaW5nX3NlY19jb3VudChjaGFu
bmVsLCAmc2VjdG9yX2NvdW50KTsKKwlhdGFfYWRkcmVzc2luZ18yOF9sYmEoY2hhbm5lbCwgJmxi
YV9hZGRyZXNzKTsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFfaGFuZGxlX2RtYTogc2VjdG9y
X2NvdW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXggRElSOiAlZFxuIiwKKwkJCXNlY3Rvcl9jb3Vu
dCwgbGJhX2FkZHJlc3MsIG9wX2Rpcik7CisKKwlkbWFfdHJhbnNhY3Rpb24tPnN0YXJ0ZWQgPSAx
OworCWRtYV90cmFuc2FjdGlvbi0+b2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9hZGRyZXNzICogQVRB
X1NFQ1RPUl9TSVpFOworCWRtYV90cmFuc2FjdGlvbi0+bmJ5dGVzID0gKHVpbnQ2NF90KXNlY3Rv
cl9jb3VudCAqIEFUQV9TRUNUT1JfU0laRTsKKwlkbWFfdHJhbnNhY3Rpb24tPm9wX2RpciA9IG9w
X2RpcjsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfZmx1c2hjYWNo
ZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGJsb2NraWZfY3R4dCAq
YmN0eHQgPSBOVUxMOworCXN0cnVjdCBibG9ja2lmX3JlcSAqYnJlcSA9IE5VTEw7CisJaW50IGVy
cjsKKworCWJjdHh0ID0gY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXS5iY3R4dDsKKwli
cmVxID0gJmNoYW5uZWwtPmZsdXNoX2JyZXE7CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2hh
bmRsZV9mbHVzaGNhY2hlXG4iKTsKKworCWF0YV9pbml0X2Jsb2NrX3JlcXVlc3QoYnJlcSwgY2hh
bm5lbCwgMCwgMCwgTlVMTCk7CisKKwllcnIgPSBibG9ja2lmX2ZsdXNoKGJjdHh0LCBicmVxKTsK
Kwlhc3NlcnQoIWVycik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxl
X3NlZWsoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUg
KmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcHJpbnQoTE9H
X0RFQlVHLCAiYXRhX2hhbmRsZV9zZWVrXG4iKTsKKworCWF0YV9zZXRfc3RhdHVzX29rKGNoYW5u
ZWwpOworCWRyaXZlLT5zdGF0dXMgfD0gQVRBX1NfRFNDOworCWF0YV9pcnFfcmFpc2UoY2hhbm5l
bCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX2F0YXBpX2lkZW50
aWZ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlhdGFfYXRhcGlfaW5pdGlhbGl6
ZV9pZGVudChjaGFubmVsKTsKKworCWF0YV9zZXRfZGF0YV9ibG9ja19yZWFkeShjaGFubmVsKTsK
KwlhdGFfc2V0X3N0YXR1c19vayhjaGFubmVsKTsKKwlhdGFfaXJxX3JhaXNlKGNoYW5uZWwpOwor
CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9wYWNrZXRfY21kKHN0cnVj
dCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZj
aGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBhdGFfcGlvX3NldHVwICpw
aW9fc2V0dXAgPSBOVUxMOworCisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlk
cml2ZS0+Ynl0ZV9jb3VudCA9IGRyaXZlLT5sYmFfbWlkIHwgKGRyaXZlLT5sYmFfaGlnaCA8PCA4
KTsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFfaGFuZGxlX3BhY2tldF9jbWQ6IGJ5dGVfY291
bnQ6ICVkXG4iLCBkcml2ZS0+Ynl0ZV9jb3VudCk7CisKKwlhdGFfc2V0X3N0YXR1c19vayhjaGFu
bmVsKTsKKwlkcml2ZS0+c2VjY291bnQgPSBBVEFfSV9DTUQ7CisJZHJpdmUtPnN0YXR1cyB8PSBB
VEFfU19EUlE7CisKKwkvKiBUaGUgUGFja2V0IGNtZCBpcyByZWNlaXZlZCBhcyA2IHdvcmRzIG9u
IGJvdGggTFBDIGFuZCBQQ0kgKi8KKwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1cCwgQVRB
UElfUEFDS0VUX1NJWkUsIGF0YV9hdGFwaV9jbWQsIDEpOworCisJcmV0dXJuOworfQorCitzdGF0
aWMgdm9pZAorYXRhX2hhbmRsZV9jbWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50
OF90IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVRBX0FUQV9JREVOVElGWToKKwkJ
YXRhX2hhbmRsZV9pZGVudGlmeShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0VURkVB
VFVSRVM6CisJCWF0YV9oYW5kbGVfc2V0ZmVhdHVyZXMoY2hhbm5lbCk7CisJCWJyZWFrOworCWNh
c2UgQVRBX1NFVF9NVUxUSToKKwkJYXRhX2hhbmRsZV9zZXRfbXVsdGkoY2hhbm5lbCk7CisJCWJy
ZWFrOworCWNhc2UgQVRBX1JFQUQ6CisJY2FzZSBBVEFfUkVBRF9NVUw6CisJCWF0YV9oYW5kbGVf
cmVhZF9tdWx0aXBsZShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfUkVBRF9WRVJJRlk6
CisJCWF0YV9oYW5kbGVfcmVhZF92ZXJpZnkoY2hhbm5lbCk7CisJCWJyZWFrOworCWNhc2UgQVRB
X1dSSVRFOgorCWNhc2UgQVRBX1dSSVRFX01VTDoKKwkJYXRhX2hhbmRsZV93cml0ZV9tdWx0aXBs
ZShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfUkVBRF9ETUE6CisJCWF0YV9oYW5kbGVf
ZG1hKGNoYW5uZWwsIEFUQV9ETUFfUkVBRCk7CisJCWJyZWFrOworCWNhc2UgQVRBX1dSSVRFX0RN
QToKKwkJYXRhX2hhbmRsZV9kbWEoY2hhbm5lbCwgQVRBX0RNQV9XUklURSk7CisJCWJyZWFrOwor
CWNhc2UgQVRBX0ZMVVNIQ0FDSEU6CisJCWF0YV9oYW5kbGVfZmx1c2hjYWNoZShjaGFubmVsKTsK
KwkJYnJlYWs7CisJY2FzZSBBVEFfU0VFSzoKKwkJYXRhX2hhbmRsZV9zZWVrKGNoYW5uZWwpOwor
CQlicmVhazsKKwljYXNlIEFUQV9BVEFQSV9JREVOVElGWToKKwkJYXRhX2hhbmRsZV9hdGFwaV9p
ZGVudGlmeShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfUEFDS0VUX0NNRDoKKwkJYXRh
X2hhbmRsZV9wYWNrZXRfY21kKGNoYW5uZWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJp
bnQoTE9HX0VSUiwgImF0YV9oYW5kbGVfY21kOiB1bnN1cHBvcnRlZCBjbWQ6ICUwMnhcbiIsIGNt
ZCk7CisJCWFzc2VydCgwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICog
YXRhX2NwdV90b19iZTMyIHRyYW5zbGF0ZXMgZnJvbSBsaXR0bGUgZW5kaWFuIHRvIGJpZyBlbmRp
YW4KKyAqIHRoZSBsaXR0bGUgZW5kaWFuIGZvcm1hdCBpcyB1c2VkIGJ5IHRoZSBjcHUKKyAqIEB2
YWwgLSB0aGUgaW50ZWdlciB2YWx1ZSBiZWluZyB0cmFuc2xhdGVkCisgKiBAYnVmIC0gdGhlIGFk
ZHJlc3Mgd2hlcmUgdGhlIHJlc3VsdCBpcyBzdG9yZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lk
CithdGFfY3B1X3RvX2JlMzIodWludDhfdCAqYnVmLCB1aW50MzJfdCB2YWwpCit7CisJYnVmWzBd
ID0gdmFsID4+IDI0OworCWJ1ZlsxXSA9IHZhbCA+PiAxNjsKKwlidWZbMl0gPSB2YWwgPj4gODsK
KwlidWZbM10gPSB2YWw7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBhdGFfY3B1X3RvX2JlMTYg
dHJhbnNsYXRlcyBmcm9tIGxpdHRsZSBlbmRpYW4gdG8gYmlnIGVuZGlhbgorICogdGhlIGxpdHRs
ZSBlbmRpYW4gZm9ybWF0IGlzIHVzZWQgYnkgdGhlIGNwdQorICogQHZhbCAtIHRoZSB3b3JkIGJl
aW5nIHRyYW5zbGF0ZWQKKyAqIEBidWYgLSB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgcmVzdWx0IGlz
IHN0b3JlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2F0YV9jcHVfdG9fYmUxNih1aW50OF90
ICpidWYsIHVpbnQxNl90IHZhbCkKK3sKKwlidWZbMF0gPSB2YWwgPj4gODsKKwlidWZbMV0gPSB2
YWw7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBhdGFfYmUzMl90b19jcHUgdHJhbnNsYXRlcyBm
cm9tIGJpZyBlbmRpYW4gdG8gbGl0dGxlIGVuZGlhbgorICogdGhlIGxpdHRsZSBlbmRpYW4gZm9y
bWF0IGlzIHVzZWQgYnkgdGhlIGNwdQorICogQHZhbCAtIHRoZSByZXR1cm4gaW50ZWdlciB2YWx1
ZQorICogQGJ1ZiAtIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZSBiZWluZyB0cmFuc2xhdGVkCisg
Ki8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK2F0YV9iZTMyX3RvX2NwdSh1aW50OF90ICpidWYp
Cit7CisJdWludDMyX3QgdmFsID0gMDsKKworCXZhbCB8PSBidWZbMF0gPDwgMjQ7CisJdmFsIHw9
IGJ1ZlsxXSA8PCAxNjsKKwl2YWwgfD0gYnVmWzJdIDw8IDg7CisJdmFsIHw9IGJ1ZlszXTsKKwor
CXJldHVybiB2YWw7Cit9CisKKy8qCisgKiBhdGFfYmUxNl90b19jcHUgdHJhbnNsYXRlcyBmcm9t
IGJpZyBlbmRpYW4gdG8gbGl0dGxlIGVuZGlhbgorICogdGhlIGxpdHRsZSBlbmRpYW4gZm9ybWF0
IGlzIHVzZWQgYnkgdGhlIGNwdQorICogQHZhbCAtIHRoZSByZXR1cm4gd29yZCB2YWx1ZQorICog
QGJ1ZiAtIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZSBiZWluZyB0cmFuc2xhdGVkCisgKi8KK3N0
YXRpYyBpbmxpbmUgdWludDE2X3QKK2F0YV9iZTE2X3RvX2NwdSh1aW50OF90ICpidWYpCit7CisJ
dWludDE2X3QgdmFsID0gMDsKKworCXZhbCB8PSBidWZbMF0gPDwgODsKKwl2YWwgfD0gYnVmWzFd
OworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9wcmludF9wYWNr
ZXQodWludDhfdCAqcGFja2V0KQoreworCWludCBpOworCisJZHByaW50KExPR19ERUJVRywgImF0
YV9hdGFwaV9wcmludF9wYWNrZXQgY21kOiAweCV4IHBhY2tldDogIiwgcGFja2V0WzBdKTsKKwlm
b3IgKGkgPSAwOyBpIDwgQVRBUElfUEFDS0VUX1NJWkU7IGkrKykgeworCQlkcHJpbnQoTE9HX0RF
QlVHLCAiJXggIiwgcGFja2V0W2ldKTsKKwl9CisJZHByaW50KExPR19ERUJVRywgIlxuIik7CisK
KwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlfZGF0YV9yZXF1ZXN0KHN0cnVj
dCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZj
aGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCisJYXRhX3NldF9zdGF0dXNfb2soY2hh
bm5lbCk7CisJZHJpdmUtPnNlY2NvdW50ID0gQVRBX0lfSU47CisJZHJpdmUtPnN0YXR1cyB8PSBB
VEFfU19EUlE7CisKKwlhdGFfaXJxX3JhaXNlKGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitz
dGF0aWMgdm9pZAorYXRhX2F0YXBpX2NtZF9kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l
bCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5l
bC0+ZHJpdmVdOworCisJYXRhX3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJZHJpdmUtPnNlY2Nv
dW50ID0gQVRBX0lfSU4gfCBBVEFfSV9DTUQ7CisKKwlhdGFfaXJxX3JhaXNlKGNoYW5uZWwpOwor
CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9pbnF1aXJ5KHN0
cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFja2V0KQoreworCXN0cnVjdCBh
dGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJc3Ry
dWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJc3RydWN0IHNjc2lfaW5xdWly
eV9kYXRhICppbnF1aXJ5X2RhdGEgPSAoc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICopcGFja2V0
OworCXVpbnQ4X3QgbWF4X2xlbiA9IDA7CisKKwlwaW9fc2V0dXAgPSAmZHJpdmUtPnBpb19zZXR1
cDsKKworCW1heF9sZW4gPSBwYWNrZXRbNF07CisJYXNzZXJ0KG1heF9sZW4gPj0gU0hPUlRfSU5R
VUlSWV9MRU5HVEgpOworCisJLyogZm9yIG5vdyB3ZSBpbXBsZW1lbnQgb25seSB0aGUgc2hvcnQg
aW5xdWlyeSBjbWQgKi8KKwlpZiAocGFja2V0WzFdICYgMHgwMSkgeworCQlhc3NlcnQoMCk7CisJ
fSBlbHNlIHsKKwkJbWVtc2V0KGlucXVpcnlfZGF0YSwgMCwgU0hPUlRfSU5RVUlSWV9MRU5HVEgp
OworCisJCWlucXVpcnlfZGF0YS0+ZGV2aWNlID0gVF9DRFJPTTsKKwkJaW5xdWlyeV9kYXRhLT5k
ZXZfcXVhbDIgPSBTSURfUk1COworCQlpbnF1aXJ5X2RhdGEtPnZlcnNpb24gPSBTQ1NJX1JFVl8w
OworCQlpbnF1aXJ5X2RhdGEtPnJlc3BvbnNlX2Zvcm1hdCA9IDI7CisJCWlucXVpcnlfZGF0YS0+
YWRkaXRpb25hbF9sZW5ndGggPSBTSE9SVF9JTlFVSVJZX0xFTkdUSCAtIDU7CisKKwkJbWVtY3B5
KGlucXVpcnlfZGF0YS0+dmVuZG9yLCAiQkhZVkUgICAiLCBTSURfVkVORE9SX1NJWkUpOworCQlt
ZW1jcHkoaW5xdWlyeV9kYXRhLT5wcm9kdWN0LCAiQVRBUEkgSURFIENEUk9NICIsIFNJRF9QUk9E
VUNUX1NJWkUpOworCQltZW1jcHkoaW5xdWlyeV9kYXRhLT5yZXZpc2lvbiwgIjEuMSAiLCBTSURf
UkVWSVNJT05fU0laRSk7CisKKwkJYXRhX3Bpb19kb190cmFuc2ZlcihwaW9fc2V0dXAsIFNIT1JU
X0lOUVVJUllfTEVOR1RILCBhdGFfYXRhcGlfY21kX2RvbmUsIGNoYW5uZWwtPnVzZV8xNmJpdCk7
CisJCWF0YV9hdGFwaV9kYXRhX3JlcXVlc3QoY2hhbm5lbCk7CisJfQorCisJcmV0dXJuOworfQor
CitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2NhcGFjaXR5KHN0cnVjdCBhdGFf
Y2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFja2V0KQoreworCXN0cnVjdCBhdGFfZHJpdmUg
KmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJc3RydWN0IGF0YV9w
aW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJaW50IG5zZWN0b3JzID0gYmxvY2tpZl9zaXpl
KGRyaXZlLT5iY3R4dCkgLyBBVEFQSV9CTE9DS19TSVpFOworCisJcGlvX3NldHVwID0gJmRyaXZl
LT5waW9fc2V0dXA7CisKKwlhdGFfY3B1X3RvX2JlMzIocGFja2V0LCBuc2VjdG9ycyAtIDEpOwor
CWF0YV9jcHVfdG9fYmUzMihwYWNrZXQgKyA0LCBBVEFQSV9CTE9DS19TSVpFKTsKKworCWF0YV9w
aW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCA4LCBhdGFfYXRhcGlfY21kX2RvbmUsIGNoYW5uZWwt
PnVzZV8xNmJpdCk7CisJYXRhX2F0YXBpX2RhdGFfcmVxdWVzdChjaGFubmVsKTsKKworCXJldHVy
bjsKK30KKworc3RhdGljIHZvaWQgbGJhX3RvX21zZih1aW50OF90ICpidWYsIGludCBsYmEpCit7
CisJbGJhICs9IDE1MDsKKwlidWZbMF0gPSAobGJhIC8gNzUpIC8gNjA7CisJYnVmWzFdID0gKGxi
YSAvIDc1KSAlIDYwOworCWJ1ZlsyXSA9IGxiYSAlIDc1OworCisJcmV0dXJuOworfQorCitzdGF0
aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFkX3RvYyhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNo
YW5uZWwsIHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZj
aGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBhdGFfcGlvX3NldHVwICpw
aW9fc2V0dXAgPSBOVUxMOworCWludCBuc2VjdG9ycyA9IGJsb2NraWZfc2l6ZShkcml2ZS0+YmN0
eHQpIC8gQVRBUElfQkxPQ0tfU0laRTsKKworCXVpbnQ4X3QgbXNmID0gcGFja2V0WzFdICYgMjsK
Kwl1aW50OF90IGZvcm1hdCA9IHBhY2tldFsyXSAmIDB4MGY7CisJdWludDhfdCB0cmFja19udW1i
ZXIgPSBwYWNrZXRbNl07CisJdWludDE2X3QgYWxsb2NhdGlvbl9sZW5ndGggPSAocGFja2V0Wzdd
IDw8IDgpIHwgcGFja2V0WzhdOworCisJdWludDE2X3QgZGF0YV9sZW4gPSAwOworCXVpbnQ4X3Qg
KmRhdGFfem9uZSA9IE5VTEw7CisJdWludDhfdCAqbGVhZF9vdXQgPSBOVUxMOworCisJcGlvX3Nl
dHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlhc3NlcnQodHJhY2tfbnVtYmVyIDw9IDEgfHwg
dHJhY2tfbnVtYmVyID09IDB4YWEpOworCWFzc2VydCghZm9ybWF0KTsKKworCXBhY2tldFsyXSA9
IDE7CQkvKiBGaXJzdCBUcmFjayAqLworCXBhY2tldFszXSA9IDE7CQkvKiBMYXN0IFRyYWNrICov
CisKKwlsZWFkX291dCA9IHBhY2tldCArIDQ7CisKKwlpZiAodHJhY2tfbnVtYmVyIDw9IDEpIHsK
KwkJZGF0YV96b25lID0gcGFja2V0ICsgNDsKKwkJbGVhZF9vdXQgPSBwYWNrZXQgKyAxMjsKKwor
CQlkYXRhX3pvbmVbMF0gPSAwOwkJLyogUmVzZXJ2ZWQgKi8KKwkJZGF0YV96b25lWzFdID0gMHgx
NDsJCS8qIEFEUiwgY29udHJvbCAqLworCQlkYXRhX3pvbmVbMl0gPSAxOwkJLyogdHJhY2sgbnVt
YmVyICovCisJCWRhdGFfem9uZVszXSA9IDA7CQkvKiBSZXNlcnZlZCAqLworCQlpZiAobXNmKSB7
CisJCQlkYXRhX3pvbmVbNF0gPSAwOworCQkJbGJhX3RvX21zZihkYXRhX3pvbmUgKyA1LCAwKTsK
KwkJfQorCQllbHNlIHsKKwkJCWF0YV9jcHVfdG9fYmUzMihkYXRhX3pvbmUgKyA0LCAwKTsKKwkJ
fQorCX0KKworCWxlYWRfb3V0WzBdID0gMDsJCS8qIFJlc2VydmVkICovCisJbGVhZF9vdXRbMV0g
PSAweDE2OwkJLyogQURSLCBjb250cm9sICovCisJbGVhZF9vdXRbMl0gPSAweGFhOwkJLyogdHJh
Y2sgbnVtYmVyICovCisJbGVhZF9vdXRbM10gPSAwOwkJLyogUmVzZXJ2ZWQgKi8KKwlpZiAobXNm
KSB7CisJCWxlYWRfb3V0WzRdID0gMDsKKwkJbGJhX3RvX21zZihsZWFkX291dCArIDUsIG5zZWN0
b3JzKTsKKwl9CisJZWxzZSB7CisJCWF0YV9jcHVfdG9fYmUzMihsZWFkX291dCArIDQsIG5zZWN0
b3JzKTsKKwl9CisKKwlkYXRhX2xlbiA9IChsZWFkX291dCAtIHBhY2tldCkgKyA4OworCWF0YV9j
cHVfdG9fYmUxNihwYWNrZXQsIGRhdGFfbGVuIC0gMik7CisKKwlkYXRhX2xlbiA9IChkYXRhX2xl
biA8IGFsbG9jYXRpb25fbGVuZ3RoKSA/IGRhdGFfbGVuIDogYWxsb2NhdGlvbl9sZW5ndGg7CisK
KwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1cCwgZGF0YV9sZW4sIGF0YV9hdGFwaV9jbWRf
ZG9uZSwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKwlhdGFfYXRhcGlfZGF0YV9yZXF1ZXN0KGNoYW5u
ZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFk
KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFja2V0KQoreworCXN0cnVj
dCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJ
c3RydWN0IGJsb2NraWZfY3R4dCAqYmN0eHQgPSBOVUxMOworCXN0cnVjdCBhdGFfcGlvX3NldHVw
ICpwaW9fc2V0dXAgPSBOVUxMOworCXN0cnVjdCBibG9ja2lmX3JlcSAqYnJlcSA9IE5VTEw7CisK
Kwl1aW50MTZfdCBzZWN0b3JfY291bnQgPSAwOworCXVpbnQzMl90IGxiYV9hZGRyZXNzID0gMDsK
Kwl1aW50NjRfdCBvZmZzZXQ7CisJdWludDY0X3QgY291bnQ7CisJaW50IGVycjsKKworCWFzc2Vy
dChkcml2ZS0+Ynl0ZV9jb3VudCA+PSBBVEFQSV9CTE9DS19TSVpFKTsKKworCWJjdHh0ID0gZHJp
dmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWJyZXEgPSAmcGlv
X3NldHVwLT5icmVxOworCisJbGJhX2FkZHJlc3MgPSBhdGFfYmUzMl90b19jcHUocGFja2V0ICsg
Mik7CisJc2VjdG9yX2NvdW50ID0gYXRhX2JlMTZfdG9fY3B1KHBhY2tldCArIDcpOworCisJZHBy
aW50KExPR19ERUJVRywgImF0YV9hdGFwaV9oYW5kbGVfcmVhZDogc2VjdG9yX2NvdW50OiAlZCwg
bGJhX2FkZHJlc3M6IDB4JXhcbiIsCisJICAgICAgIHNlY3Rvcl9jb3VudCwgbGJhX2FkZHJlc3Mp
OworCisJb2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9hZGRyZXNzICogQVRBUElfQkxPQ0tfU0laRTsK
Kwljb3VudCA9ICh1aW50NjRfdClzZWN0b3JfY291bnQgKiBBVEFQSV9CTE9DS19TSVpFOworCisJ
ZHJpdmUtPmNvdW50ID0gY291bnQ7CisJZHJpdmUtPm9mZnNldCA9IG9mZnNldDsKKworCWRyaXZl
LT5sYmFfbWlkID0gQVRBUElfQkxPQ0tfU0laRSAmIDB4ZmY7CisJZHJpdmUtPmxiYV9oaWdoID0g
KEFUQVBJX0JMT0NLX1NJWkUgPj4gOCkgJiAweGZmOworCisJZHJpdmUtPnNlY2NvdW50ID0gQVRB
X0lfSU47CisKKwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1cCwgQVRBUElfQkxPQ0tfU0la
RSwgYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2RvbmUsIGNoYW5uZWwtPnVzZV8xNmJpdCk7CisKKwlh
dGFfaW5pdF9ibG9ja19yZXF1ZXN0KGJyZXEsIGNoYW5uZWwsIGRyaXZlLT5vZmZzZXQsCisJCQkg
ICAgICAgQVRBUElfQkxPQ0tfU0laRSwgYXRhX3Bpb19nZXRfYnVmZmVyX2RhdGEocGlvX3NldHVw
KSk7CisKKwllcnIgPSBibG9ja2lmX3JlYWQoYmN0eHQsIGJyZXEpOworCWFzc2VydCghZXJyKTsK
KworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9jbWQoc3RydWN0IGF0YV9j
aGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwt
PmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1
cCA9IE5VTEw7CisJdWludDhfdCAqcGFja2V0ID0gTlVMTDsKKwl1aW50OF90IG9wX2NvZGUgPSAw
OworCisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisJcGFja2V0ID0gYXRhX3Bpb19n
ZXRfYnVmZmVyX2RhdGEocGlvX3NldHVwKTsKKworCWF0YV9hdGFwaV9wcmludF9wYWNrZXQocGFj
a2V0KTsKKworCW9wX2NvZGUgPSBwYWNrZXRbMF07CisKKwlzd2l0Y2ggKG9wX2NvZGUpIHsKKwlj
YXNlIElOUVVJUlk6CisJCWF0YV9hdGFwaV9oYW5kbGVfaW5xdWlyeShjaGFubmVsLCBwYWNrZXQp
OworCQlicmVhazsKKwljYXNlIFJFQURfQ0FQQUNJVFk6CisJCWF0YV9hdGFwaV9oYW5kbGVfcmVh
ZF9jYXBhY2l0eShjaGFubmVsLCBwYWNrZXQpOworCQlicmVhazsKKwljYXNlIFBSRVZFTlRfQUxM
T1c6CisJCWF0YV9hdGFwaV9jbWRfZG9uZShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBSRUFE
X1RPQzoKKwkJYXRhX2F0YXBpX2hhbmRsZV9yZWFkX3RvYyhjaGFubmVsLCBwYWNrZXQpOworCQli
cmVhazsKKwljYXNlIFJFQURfMTA6CisJCWF0YV9hdGFwaV9oYW5kbGVfcmVhZChjaGFubmVsLCBw
YWNrZXQpOworCQlicmVhazsKKwljYXNlIFRFU1RfVU5JVF9SRUFEWToKKwkJYXRhX2F0YXBpX2Nt
ZF9kb25lKGNoYW5uZWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnQoTE9HX0VSUiwg
ImF0YV9hdGFwaV9jbWQ6IHVuc3VwcG9ydGVkIGNtZDogJTAyeFxuIiwgb3BfY29kZSk7CisJCWFz
c2VydCgwKTsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybjsKK30KKworc3RhdGljIHVpbnQ2NF90
CithdGFfY29tbWFuZF9ibG9ja19yZWFkKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWlu
dDY0X3Qgb2Zmc2V0KQoreworCXVpbnQ2NF90IHZhbHVlID0gMDsKKwlzdHJ1Y3QgYXRhX2RyaXZl
ICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBhdGFf
cGlvX3NldHVwICpwaW9fc2V0dXAgPSBOVUxMOworCisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9f
c2V0dXA7CisKKwlzd2l0Y2ggKG9mZnNldCkgeworCWNhc2UgQVRBX0RBVEFfUkVHOgorCQl2YWx1
ZSA9IGF0YV9waW9fZ2V0X3VpbnQocGlvX3NldHVwKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfRVJS
T1JfUkVHOgorCQl2YWx1ZSA9IGRyaXZlLT5lcnJvcjsKKwkJZHByaW50KExPR19ERUJVRywgImF0
YV9jb21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9FUlJPUl9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJ
YnJlYWs7CisJY2FzZSBBVEFfU0VDQ09VTlRfUkVHOgorCQl2YWx1ZSA9IGRyaXZlLT5zZWNjb3Vu
dDsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9TRUND
T1VOVF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfTEJBX0xPV19S
RUc6CisJCXZhbHVlID0gZHJpdmUtPmxiYV9sb3c7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFf
Y29tbWFuZF9ibG9ja19yZWFkOiBBVEFfTEJBX0xPV19SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJ
YnJlYWs7CisJY2FzZSBBVEFfTEJBX01JRF9SRUc6CisJCXZhbHVlID0gZHJpdmUtPmxiYV9taWQ7
CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja19yZWFkOiBBVEFfTEJBX01J
RF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfTEJBX0hJR0hfUkVH
OgorCQl2YWx1ZSA9IGRyaXZlLT5sYmFfaGlnaDsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9j
b21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9MQkFfSElHSF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJ
YnJlYWs7CisJY2FzZSBBVEFfSERERVZTRUxfUkVHOgorCQl2YWx1ZSA9IGRyaXZlLT5oZGRldnNl
bDsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9IRERF
VlNFTF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfU1RBVFVTX1JF
RzoKKwkJYXRhX2lycV9sb3dlcihjaGFubmVsKTsKKworCQl2YWx1ZSA9IGRyaXZlLT5zdGF0dXM7
CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja19yZWFkOiBBVEFfU1RBVFVT
X1JFRzogJWx4aFxuIiwgdmFsdWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2YWx1ZSA9IDA7
CisJCWJyZWFrOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQKK2F0YV9j
b21tYW5kX2Jsb2NrX3dyaXRlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwKKwkJdWludDY0
X3Qgb2Zmc2V0LCBpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpCit7CisJc3RydWN0IGF0YV9kcml2
ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYXRh
X2RyaXZlICpkcml2ZTAgPSAmY2hhbm5lbC0+ZHJpdmVzW0FUQV9NQVNURVJdOworCXN0cnVjdCBh
dGFfZHJpdmUgKmRyaXZlMSA9ICZjaGFubmVsLT5kcml2ZXNbQVRBX1NMQVZFXTsKKwlzdHJ1Y3Qg
YXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKworCXVpbnQ4X3QgcmVnX3ZhbHVlOwor
CisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlzd2l0Y2ggKG9mZnNldCkgewor
CWNhc2UgQVRBX0RBVEFfUkVHOgorCQlhdGFfcGlvX3B1dF91aW50KHBpb19zZXR1cCwgdmFsdWUp
OworCQlicmVhazsKKwljYXNlIEFUQV9GRUFUVVJFU19SRUc6CisJCWRyaXZlMC0+ZmVhdHVyZXMg
PSB2YWx1ZTsKKwkJZHJpdmUxLT5mZWF0dXJlcyA9IHZhbHVlOworCQlkcHJpbnQoTE9HX0RFQlVH
LCAiYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGU6IEFUQV9GRUFUVVJFU19SRUc6ICV4aFxuIiwgKHVp
bnQ4X3QpdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9TRUNDT1VOVF9SRUc6CisJCWRyaXZl
MC0+c2VjY291bnQgPSB2YWx1ZTsKKwkJZHJpdmUxLT5zZWNjb3VudCA9IHZhbHVlOworCQlkcHJp
bnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGU6IEFUQV9TRUNDT1VOVF9SRUc6
ICV4aFxuIiwgKHVpbnQ4X3QpdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9MQkFfTE9XX1JF
RzoKKwkJZHJpdmUwLT5sYmFfbG93ID0gdmFsdWU7CisJCWRyaXZlMS0+bGJhX2xvdyA9IHZhbHVl
OworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGU6IEFUQV9MQkFf
TE9XX1JFRzogJXhoXG4iLCAodWludDhfdCl2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0xC
QV9NSURfUkVHOgorCQlkcml2ZTAtPmxiYV9taWQgPSB2YWx1ZTsKKwkJZHJpdmUxLT5sYmFfbWlk
ID0gdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja193cml0ZTog
QVRBX0xCQV9NSURfUkVHOiAleGhcbiIsICh1aW50OF90KXZhbHVlKTsKKwkJYnJlYWs7CisJY2Fz
ZSBBVEFfTEJBX0hJR0hfUkVHOgorCQlkcml2ZTAtPmxiYV9oaWdoID0gdmFsdWU7CisJCWRyaXZl
MS0+bGJhX2hpZ2ggPSB2YWx1ZTsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Js
b2NrX3dyaXRlOiBBVEFfTEJBX0hJR0hfUkVHOiAleGhcbiIsICh1aW50OF90KXZhbHVlKTsKKwkJ
YnJlYWs7CisJY2FzZSBBVEFfSERERVZTRUxfUkVHOgorCQlyZWdfdmFsdWUgPSB2YWx1ZTsKKwor
CQlkcml2ZTAtPmhkZGV2c2VsID0gdmFsdWU7CisJCWRyaXZlMS0+aGRkZXZzZWwgPSB2YWx1ZTsK
KwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlOiBBVEFfSERERVZT
RUxfUkVHOiAleGhcbiIsIHJlZ192YWx1ZSk7CisKKwkJaWYgKHJlZ192YWx1ZSAmIEFUQV9EX0lC
TSkKKwkJCWNoYW5uZWwtPnNpemUgPSBBVEFfU0VDVE9SX1NJWkU7CisJCWlmIChyZWdfdmFsdWUg
JiBBVEFfREVWKEFUQV9TTEFWRSkpIHsKKwkJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFu
ZF9ibG9ja193cml0ZTogc2VsZWN0IEFUQV9TTEFWRVxuIik7CisJCQljaGFubmVsLT5kcml2ZSA9
IEFUQV9TTEFWRTsKKwkJfQorCQllbHNlIHsKKwkJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29t
bWFuZF9ibG9ja193cml0ZTogc2VsZWN0IEFUQV9NQVNURVJcbiIpOworCQkJY2hhbm5lbC0+ZHJp
dmUgPSBBVEFfTUFTVEVSOworCQl9CisJCWlmICghYXRhX3NlbGVjdF9kcml2ZV9pc19vayhjaGFu
bmVsKSkgeworCQkJZHJpdmUxLT5zdGF0dXMgPSBBVEFfRFJJVkVfQUJTRU5UOworCQl9CisJCWJy
ZWFrOworCWNhc2UgQVRBX0NPTU1BTkRfUkVHOgorCQlkcml2ZTAtPmNvbW1hbmQgPSB2YWx1ZTsK
KwkJZHJpdmUxLT5jb21tYW5kID0gdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29t
bWFuZF9ibG9ja193cml0ZTogQVRBX0NPTU1BTkRfUkVHOiAleGhcbiIsICh1aW50OF90KXZhbHVl
KTsKKwkJYXRhX2hhbmRsZV9jbWQoY2hhbm5lbCwgdmFsdWUpOworCQlicmVhazsKKwlkZWZhdWx0
OgorCQlkcHJpbnQoTE9HX0VSUiwgImF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlOiB1bnN1cHBvcnRl
ZCByZWc6JWx4XG4iLCBvZmZzZXQpOworCQlhc3NlcnQoMCk7CisJCWJyZWFrOworCX0KKworCXJl
dHVybjsKK30KKworc3RhdGljIHVpbnQ2NF90CithdGFfYWx0c3RhdHVzX3JlYWQoc3RydWN0IGF0
YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5u
ZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJdWludDY0X3QgdmFsdWUgPSAwOworCisJdmFs
dWUgPSBkcml2ZS0+YWx0c3RhdHVzOworCisJZHByaW50KExPR19ERUJVRywgImF0YV9hbHRzdGF0
dXNfcmVhZDogdmFsdWU6ICVsdVxuIiwgdmFsdWUpOworCisJcmV0dXJuIHZhbHVlOworfQorCitz
dGF0aWMgdm9pZAorYXRhX2NvbnRyb2xfd3JpdGUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVs
LAorCQlpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpCit7CisJdWludDhfdCByZWdfdmFsdWU7CisJ
c3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZl
XTsKKworCXJlZ192YWx1ZSA9ICh1aW50OF90KXZhbHVlOworCisJZHByaW50KExPR19ERUJVRywg
ImF0YV9jb250cm9sX3dyaXRlOiBpcnFfZGlzYWJsZWQ6ICVkXG4iLCByZWdfdmFsdWUgJiBBVEFf
QV9JRFMpOworCisJaWYgKHJlZ192YWx1ZSAmIEFUQV9BX0lEUykKKwkJZHJpdmUtPmlycV9kaXNh
YmxlZCA9IDE7CisJZWxzZQorCQlkcml2ZS0+aXJxX2Rpc2FibGVkID0gMDsKKworCWlmIChyZWdf
dmFsdWUgJiBBVEFfQV9SRVNFVCkKKwkJYXRhX3Nyc3QoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9
CisKKy8qCisgKiBQQ0kgQVRBIGZ1bmN0aW9uIGRlZmluaXRpb25zCisgKi8KK3N0YXRpYyB2b2lk
CitwY2lfYXRhX2ludHJfYXNzZXJ0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcGNpX2F0YV9zb2Z0
YyAqc2MgPSAoc3RydWN0IHBjaV9hdGFfc29mdGMgKilhcmc7CisJc3RydWN0IHBjaV9kZXZpbnN0
ICpwaSA9IHNjLT5hc2NfcGk7CisKKwlwY2lfbGludHJfYXNzZXJ0KHBpKTsKKworCXJldHVybjsK
K30KKworc3RhdGljIHZvaWQKK3BjaV9hdGFfaW50cl9kZWFzc2VydCh2b2lkICphcmcpCit7CisJ
c3RydWN0IHBjaV9hdGFfc29mdGMgKnNjID0gKHN0cnVjdCBwY2lfYXRhX3NvZnRjICopYXJnOwor
CXN0cnVjdCBwY2lfZGV2aW5zdCAqcGkgPSBzYy0+YXNjX3BpOworCisJcGNpX2xpbnRyX2RlYXNz
ZXJ0KHBpKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludAorcGNpX2F0YV9wYXJzZV9wYXJh
bXMoY29uc3QgY2hhciAqb3B0cywgY2hhciAqb3B0MCwgY2hhciAqb3B0MSwgdWludDhfdCAqbnJf
Y2hhbm5lbHMpCit7CisJdWludDhfdCBsZW47CisJY2hhciB0bXBfb3B0c1sxMjhdOworCWNoYXIg
KmNoMCA9IE5VTEwsICpjaDEgPSBOVUxMOworCXVpbnQ4X3QgaTsKKworCWlmICghb3B0cykgewor
CQlkcHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfcGFyc2VfcGFyYW1zOiBvcHRzIHNob3VsZCBiZSBs
aWtlOiAlc1xuIiwKKwkJICAgICAgICJYLE1BU1RFUl9YWyxTTEFWRV9YXVs7WSxNQVNURVJfWVss
U0xBVkVfWV1dIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW4gPSBzdHJsZW4ob3B0cyk7CisJ
aWYgKGxlbiA+PSAxMjgpIHsKKwkJZHByaW50KExPR19FUlIsICJwY2lfYXRhX3BhcnNlX3BhcmFt
czogUENJIEFUQSBzdHJpbmcgcGFyYW1zIHRvbyBiaWdcbiIpOworCQlyZXR1cm4gLTE7CisJfQor
CisJc3RyY3B5KHRtcF9vcHRzLCBvcHRzKTsKKworCWNoMCA9IHRtcF9vcHRzOworCisJZm9yIChp
ID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICh0bXBfb3B0c1tpXSA9PSBQQ0lfQVRBX0NIX1NF
UCkgeworCQkJaWYgKGNoMSkgeworCQkJCWRwcmludChMT0dfRVJSLCAicGNpX2F0YV9wYXJzZV9w
YXJhbXM6IHRvIG1hbnkgY2hhbm5lbHNcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXRt
cF9vcHRzW2ldID0gJ1wwJzsKKwkJCWNoMSA9IHRtcF9vcHRzICsgaSArIDE7CisJCX0KKwl9CisK
KwlpZiAoc3RybGVuKGNoMCkgPj0gNjQpIHsKKwkJZHByaW50KExPR19FUlIsICJwY2lfYXRhX3Bh
cnNlX3BhcmFtczogdGhlIG5hbWUgb2YgQVRBX1ggY2hhbm5lbCB0b28gYmlnXG4iKTsKKwkJcmV0
dXJuIC0xOworCX0KKwlzdHJjcHkob3B0MCwgY2gwKTsKKwkqbnJfY2hhbm5lbHMgPSAxOworCisJ
aWYgKGNoMSAhPSBOVUxMICYmIHN0cmxlbihjaDEpIDwgNjQpIHsKKwkJc3RyY3B5KG9wdDEsICBj
aDEpOworCQkqbnJfY2hhbm5lbHMgPSAyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMg
aW50CitwY2lfYXRhX2luaXQoc3RydWN0IHZtY3R4ICpjdHgsIHN0cnVjdCBwY2lfZGV2aW5zdCAq
cGksIGNoYXIgKm9wdHMsIGludCBhdGFwaSkKK3sKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5u
ZWwgPSBOVUxMOworCXN0cnVjdCBwY2lfYXRhX3NvZnRjICpwY2lfYXRhX3NjID0gTlVMTDsKKwlj
aGFyIGNoX29wdHNbMl1bNjRdOworCXVpbnQ4X3QgbnJfY2hhbm5lbHMgPSAwOworCWludCByZXQs
IGk7CisKKwlhdGFfb3Blbl9kYmdfZmlsZSgpOworCisJcmV0ID0gcGNpX2F0YV9wYXJzZV9wYXJh
bXMob3B0cywgY2hfb3B0c1swXSwgY2hfb3B0c1sxXSwgJm5yX2NoYW5uZWxzKTsKKwlpZiAocmV0
KSB7CisJCWRwcmludChMT0dfRVJSLCAicGNpX2F0YV9pbml0OiBzb21lIGVycm9ycyB3aXRoIHRo
ZSBpbnB1dCBjaGVja2luZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwY2lfYXRhX3NjID0g
Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcGNpX2F0YV9zb2Z0YykpOworCWlmICghcGNpX2F0YV9z
YykKKwkJcmV0dXJuIC0xOworCisJcGNpX2F0YV9zYy0+Y2hhbm5lbHNbQVRBX1hdID0gTlVMTDsK
KwlwY2lfYXRhX3NjLT5jaGFubmVsc1tBVEFfWV0gPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8
IG5yX2NoYW5uZWxzOyBpKyspIHsKKwkJY2hhbm5lbCA9IGF0YV9pbml0KGN0eCwgcGNpX2F0YV9p
bnRyX2Fzc2VydCwgcGNpX2F0YV9pbnRyX2RlYXNzZXJ0LAorCQkJCSAgIHBjaV9hdGFfc2MsIGNo
X29wdHNbaV0sIDApOworCQlpZiAoIWNoYW5uZWwpCisJCQljb250aW51ZTsKKwkJY2hhbm5lbC0+
dXNlXzE2Yml0ID0gMDsKKwkJYXNzZXJ0KCFwY2lfYXRhX3NjLT5jaGFubmVsc1tjaGFubmVsLT5p
bnRlcmZhY2VdKTsKKwkJcGNpX2F0YV9zYy0+Y2hhbm5lbHNbY2hhbm5lbC0+aW50ZXJmYWNlXSA9
IGNoYW5uZWw7CisJfQorCisJLyogZXhpdCBpZiBub25lIG9mIHRoZSBjaGFubmVscyBhcmUgaW5p
dGlhbGl6ZWQgKi8KKwlpZiAoIXBjaV9hdGFfc2MtPmNoYW5uZWxzW0FUQV9YXSAmJiAhcGNpX2F0
YV9zYy0+Y2hhbm5lbHNbQVRBX1ldKSB7CisJCWZyZWUocGNpX2F0YV9zYyk7CisJCXJldHVybiAt
MTsKKwl9CisKKwlwaS0+cGlfYXJnID0gcGNpX2F0YV9zYzsKKwlwY2lfYXRhX3NjLT5hc2NfcGkg
PSBwaTsKKworCS8qIGdlbmVyaWMgUENJIEFUQS9BVEFQSSBkZXZpY2UgQVRBX0lUODIxMUYgKi8K
KwlwY2lfc2V0X2NmZ2RhdGExNihwaSwgUENJUl9ERVZJQ0UsIDB4ODIxMSk7CS8qIEFUQS9BVEFQ
SSBDb250cm9sbGVyICovCisJcGNpX3NldF9jZmdkYXRhMTYocGksIFBDSVJfVkVORE9SLCAweDEy
ODMpOwkvKiBXYWxkbyAqLworCisJLyogdGhpcyBpcyBhIHN0b3JhZ2UgY2xhc3MgZGV2aWNlICov
CisJcGNpX3NldF9jZmdkYXRhOChwaSwgUENJUl9DTEFTUywgUENJQ19TVE9SQUdFKTsKKwkvKiB0
aGlzIGlzIGFuIElERS9BVEEgdHlwZSBkZXZpY2UgKi8KKwlwY2lfc2V0X2NmZ2RhdGE4KHBpLCBQ
Q0lSX1NVQkNMQVNTLCBQQ0lTX1NUT1JBR0VfSURFKTsKKworCXBjaV9zZXRfY2ZnZGF0YTgocGks
IFBDSVJfUFJPR0lGLCBQQ0lQX1NUT1JBR0VfSURFX01BU1RFUkRFViB8CisJCQkgUENJUF9TVE9S
QUdFX0lERV9NT0RFUFJJTSB8IFBDSVBfU1RPUkFHRV9JREVfTU9ERVNFQyk7CisKKwlwY2lfZW11
bF9hbGxvY19iYXIocGksIFBDSV9CQVIwLCBQQ0lCQVJfSU8sIEFUQV9JT1NJWkUpOworCXBjaV9l
bXVsX2FsbG9jX2JhcihwaSwgUENJX0JBUjEsIFBDSUJBUl9JTywgQVRBX0NUTElPU0laRSk7CisJ
cGNpX2VtdWxfYWxsb2NfYmFyKHBpLCBQQ0lfQkFSMiwgUENJQkFSX0lPLCBBVEFfSU9TSVpFKTsK
KwlwY2lfZW11bF9hbGxvY19iYXIocGksIFBDSV9CQVIzLCBQQ0lCQVJfSU8sIEFUQV9DVExJT1NJ
WkUpOworCXBjaV9lbXVsX2FsbG9jX2JhcihwaSwgUENJX0JBUjQsIFBDSUJBUl9JTywgQVRBX0NI
QU5ORUxTICogQVRBX0JNSU9TSVpFKTsKKworCXBjaV9saW50cl9yZXF1ZXN0KHBpKTsKKworCXJl
dHVybiAwOworfQorCitzdGF0aWMgaW50CitwY2lfYXRhX2hkX2luaXQoc3RydWN0IHZtY3R4ICpj
dHgsIHN0cnVjdCBwY2lfZGV2aW5zdCAqcGksIGNoYXIgKm9wdHMpCit7CisJcmV0dXJuIChwY2lf
YXRhX2luaXQoY3R4LCBwaSwgb3B0cywgMCkpOworfQorCitzdGF0aWMgdm9pZAorcGNpX2F0YV9k
bWFfc3RhcnQoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50OF90IGNoKQoreworCXN0cnVj
dCB2bWN0eCAqY3R4ID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxM
OworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2F0YV9k
bWFfdHJhbnNhY3Rpb24gKmRtYV90cmFuc2FjdGlvbiA9IE5VTEw7CisJc3RydWN0IGJsb2NraWZf
cmVxICpicmVxID0gTlVMTDsKKworCXN0cnVjdCBwcmRfZW50cnkgKnByZHQgPSBOVUxMOworCXN0
cnVjdCBwcmRfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwl1aW50MzJfdCBwcmR0X2FkZHJlc3M7CisJ
dWludDMyX3QgaW5kZXg7CisJdWludDMyX3QgYnl0ZV9jb3VudDsKKwl2b2lkICplbnRyeV9idWZm
ID0gTlVMTDsKKwlpbnQgZXJyOworCisJY2hhbm5lbCA9IHNjLT5jaGFubmVsc1tjaF07CisKKwlj
dHggPSBjaGFubmVsLT52bV9jdHg7CisJYXNzZXJ0KGN0eCAhPSBOVUxMKTsKKworCWJjdHh0ID0g
Y2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXS5iY3R4dDsKKwlkbWFfdHJhbnNhY3Rpb24g
PSAmc2MtPmRtYV90cmFuc2FjdGlvbnNbY2hdOworCisJYXNzZXJ0KGRtYV90cmFuc2FjdGlvbi0+
c3RhcnRlZCk7CisKKwlhc3NlcnQoKChzYy0+Y21kW2NoXSAmIEFUQV9CTUNNRF9XUklURV9SRUFE
KSAmJiBkbWFfdHJhbnNhY3Rpb24tPm9wX2RpciA9PSBBVEFfRE1BX1JFQUQpIHx8CisJCSghKHNj
LT5jbWRbY2hdICYgQVRBX0JNQ01EX1dSSVRFX1JFQUQpICYmIGRtYV90cmFuc2FjdGlvbi0+b3Bf
ZGlyID09IEFUQV9ETUFfV1JJVEUpKTsKKworCXNjLT5zdGF0W2NoXSB8PSBBVEFfQk1TVEFUX0FD
VElWRTsKKworCS8qIHByZHRfYWRkcmVzcyBpcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUg
cHJkdCBpbiB0aGUgZ3Vlc3QgbWVtb3J5ICovCisJcHJkdF9hZGRyZXNzID0gc2MtPnByZHRbY2hd
OworCisJLyogbWFwIHRoZSBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIGludG8gdGhlIGhvc3Qgdmly
dHVhbCBhZGRyZXNzICovCisJcHJkdCA9IHBhZGRyX2d1ZXN0Mmhvc3QoY3R4LCBwcmR0X2FkZHJl
c3MsIEFUQV9ETUFfUFJEVF9TSVpFKTsKKwlhc3NlcnQocHJkdCAhPSBOVUxMKTsKKworCWJyZXEg
PSAmZG1hX3RyYW5zYWN0aW9uLT5icmVxOworCWJyZXEtPmJyX3BhcmFtID0gY2hhbm5lbDsKKwli
cmVxLT5icl9jYWxsYmFjayA9IGF0YV9oYW5kbGVfYmxvY2tfcmVxdWVzdDsKKwlicmVxLT5icl9v
ZmZzZXQgPSBkbWFfdHJhbnNhY3Rpb24tPm9mZnNldDsKKworCWRtYV90cmFuc2FjdGlvbi0+aXNf
ZW90ID0gMDsKKwlpbmRleCA9IDA7CisJd2hpbGUgKCFkbWFfdHJhbnNhY3Rpb24tPmlzX2VvdCAm
JiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcyA+IDApIHsKKwkJZW50cnkgPSBwcmR0ICsgaW5kZXg7
CisKKwkJZW50cnlfYnVmZiA9IHBhZGRyX2d1ZXN0Mmhvc3QoY3R4LCBlbnRyeS0+cHJkX2FkZHJl
c3MsIGVudHJ5LT5ieXRlX2NvdW50KTsKKwkJYnl0ZV9jb3VudCA9IGVudHJ5LT5ieXRlX2NvdW50
ID8gZW50cnktPmJ5dGVfY291bnQgOiBBVEFfRE1BX01BWF9QUkRfQ09VTlQ7CisKKwkJaWYgKGJ5
dGVfY291bnQgPiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcykgeworCQkJZHByaW50KExPR19FUlIs
ICJwY2lfYXRhX2RtYV9zdGFydDogdGhlIFBSRCBlbnRyeSBjb250YWlucyAlcyIsCisJCQkgICAg
ICAgIm1vcmUgYnl0ZXMgdGhhbiB0aGUgQVRBIHRyYW5zZmVyIHNpemVcbiIpOworCQkJYnl0ZV9j
b3VudCA9IGRtYV90cmFuc2FjdGlvbi0+bmJ5dGVzOworCQl9CisKKwkJaWYgKGluZGV4ID09IEJM
T0NLSUZfSU9WX01BWCkgeworCQkJZHByaW50KExPR19FUlIsICJwY2lfYXRhX2RtYV9zdGFydDog
dGhlIFBSRCBUYWJsZSBjb250YWlucyAlcyIsCisJCQkgICAgICAgIm1vcmUgdGhhbiBCTE9DS0lG
X0lPVl9NQVggZW50cmllc1xuIik7CisJCQlicmVhazsKKwkJfQorCisJCWJyZXEtPmJyX2lvdltp
bmRleF0uaW92X2xlbiA9IGJ5dGVfY291bnQ7CisJCWJyZXEtPmJyX2lvdltpbmRleF0uaW92X2Jh
c2UgPSBlbnRyeV9idWZmOworCisJCWRtYV90cmFuc2FjdGlvbi0+bmJ5dGVzIC09IGJ5dGVfY291
bnQ7CisKKwkJaWYgKGVudHJ5LT52ZW5kb3Jfc3BlY2lmaWMgJiBBVEFfRE1BX1BSRFRfRU9UKQor
CQkJZG1hX3RyYW5zYWN0aW9uLT5pc19lb3QgPSAxOworCisJCWluZGV4Kys7CisJfQorCisJYnJl
cS0+YnJfaW92Y250ID0gaW5kZXg7CisKKwlzYy0+c3RhdFtjaF0gfD0gQVRBX0JNU1RBVF9JTlRF
UlJVUFQ7CisKKwkvKgorCSAqIFVzZSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBmb3IgcmVhZCAv
IHdyaXRlIG9uIHRoZSBibG9jazsKKwkgKiB1cGRhdGUgdGhlIHN0YXR1cyByZWdpc3RlcnMgYW5k
IG5vdGlmeSB0aGUgZ3Vlc3Qgb3BlcmF0aW5nCisJICogc3lzdGVtIHVzaW5nIGFuIGludGVycnVw
dCBpbiB0aGUgYXRhX2hhbmRsZV9ibG9ja19yZXF1ZXN0IGNhbGxiYWNrCisJICovCisJaWYgKGRt
YV90cmFuc2FjdGlvbi0+b3BfZGlyID09IEFUQV9ETUFfUkVBRCkgeworCQllcnIgPSBibG9ja2lm
X3JlYWQoYmN0eHQsIGJyZXEpOworCX0KKwllbHNlIGlmIChkbWFfdHJhbnNhY3Rpb24tPm9wX2Rp
ciA9PSBBVEFfRE1BX1dSSVRFKSB7CisJCWVyciA9IGJsb2NraWZfd3JpdGUoYmN0eHQsIGJyZXEp
OworCX0KKwllbHNlIHsKKwkJYXNzZXJ0KDApOworCX0KKworCWFzc2VydCghZXJyKTsKKworCXJl
dHVybjsKK30KKworc3RhdGljIHZvaWQKK3BjaV9hdGFfZG1hX3N0b3Aoc3RydWN0IHBjaV9hdGFf
c29mdGMgKnNjLCB1aW50OF90IGNoKQoreworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCA9
IE5VTEw7CisJc3RydWN0IHBjaV9hdGFfZG1hX3RyYW5zYWN0aW9uICpkbWFfdHJhbnNhY3Rpb24g
PSBOVUxMOworCisJY2hhbm5lbCA9IHNjLT5jaGFubmVsc1tjaF07CisJZG1hX3RyYW5zYWN0aW9u
ID0gJnNjLT5kbWFfdHJhbnNhY3Rpb25zW2NoXTsKKworCWlmKCFkbWFfdHJhbnNhY3Rpb24tPnN0
YXJ0ZWQpIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChkbWFfdHJhbnNhY3Rpb24tPmlzX2VvdCAm
JiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcyA9PSAwKSB7CisJCXNjLT5zdGF0W2NoXSB8PSBBVEFf
Qk1TVEFUX0lOVEVSUlVQVDsKKwkJc2MtPnN0YXRbY2hdICY9IH5BVEFfQk1TVEFUX0VSUk9SOwor
CQlzYy0+c3RhdFtjaF0gJj0gfkFUQV9CTVNUQVRfQUNUSVZFOworCX0KKwllbHNlIGlmICghZG1h
X3RyYW5zYWN0aW9uLT5pc19lb3QgJiYgZG1hX3RyYW5zYWN0aW9uLT5uYnl0ZXMgPT0gMCkgewor
CQlzYy0+c3RhdFtjaF0gfD0gQVRBX0JNU1RBVF9JTlRFUlJVUFQ7CisJCXNjLT5zdGF0W2NoXSAm
PSB+QVRBX0JNU1RBVF9FUlJPUjsKKwkJc2MtPnN0YXRbY2hdIHw9IEFUQV9CTVNUQVRfQUNUSVZF
OworCQlkcHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfZG1hX3N0b3A6IERNQSBQUkRUIHRyYW5zZmVy
IHdhcyAlcyIsCisJCSAgICAgICAibGFyZ2VyIHRoYW4gdGhlIEFUQSB0cmFuc2ZlciBzaXplXG4i
KTsKKwl9CisJZWxzZSBpZiAoZG1hX3RyYW5zYWN0aW9uLT5pc19lb3QgJiYgZG1hX3RyYW5zYWN0
aW9uLT5uYnl0ZXMgPiAwKSB7CisJCXNjLT5zdGF0W2NoXSAmPSB+QVRBX0JNU1RBVF9JTlRFUlJV
UFQ7CisJCXNjLT5zdGF0W2NoXSAmPSB+QVRBX0JNU1RBVF9FUlJPUjsKKwkJc2MtPnN0YXRbY2hd
ICY9IH5BVEFfQk1TVEFUX0FDVElWRTsKKwkJZHByaW50KExPR19FUlIsICJwY2lfYXRhX2RtYV9z
dG9wOiBETUEgUFJEVCB0cmFuc2ZlciB3YXMgJXMiLAorCQkgICAgICAgInNtYWxsZXIgdGhhbiB0
aGUgQVRBIHRyYW5zZmVyIHNpemVcbiIpOworCX0KKwllbHNlIGlmICghZG1hX3RyYW5zYWN0aW9u
LT5pc19lb3QgJiYgZG1hX3RyYW5zYWN0aW9uLT5uYnl0ZXMgPiAwKSB7CisJCXNjLT5zdGF0W2No
XSB8PSBBVEFfQk1TVEFUX0VSUk9SOworCQlkcHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfZG1hX3N0
b3A6IHRoZSBQUkQgVGFibGUgY29udGFpbnMgJXMiLAorCQkgICAgICAgIm1vcmUgdGhhbiBCTE9D
S0lGX0lPVl9NQVggZW50cmllc1xuIik7CisJfQorCisJZG1hX3RyYW5zYWN0aW9uLT5zdGFydGVk
ID0gMDsKKworCXJldHVybjsKK30KKworc3RhdGljIHVpbnQ2NF90CitwY2lfYXRhX2J1c19tYXN0
ZXJfcmVhZChzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MsIHVpbnQ2NF90IG9mZnNldCkKK3sKKwl1
aW50NjRfdCB2YWx1ZSA9IDA7CisKKwlzd2l0Y2ggKG9mZnNldCkgeworCWNhc2UgQVRBX0JNQ01E
X1hfUkVHOgorCQl2YWx1ZSA9IHNjLT5jbWRbQVRBX1hdOworCQlkcHJpbnQoTE9HX0RFQlVHLCAi
cGNpX2F0YV9idXNfbWFzdGVyX3JlYWQ6IEFUQV9CTUNNRF9YX1JFRzogJWx1XG4iLCB2YWx1ZSk7
CisJCWJyZWFrOworCWNhc2UgQVRBX0JNU1RBVF9YX1JFRzoKKwkJdmFsdWUgPSBzYy0+c3RhdFtB
VEFfWF07CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDogQVRB
X0JNU1RBVF9YX1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNUFJE
VF9YX1JFRzoKKwkJdmFsdWUgPSBzYy0+cHJkdFtBVEFfWF07CisJCWRwcmludChMT0dfREVCVUcs
ICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDogQVRBX0JNUFJEVF9YX1JFRzogJWx1XG4iLCB2YWx1
ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNQ01EX1lfUkVHOgorCQl2YWx1ZSA9IHNjLT5jbWRb
QVRBX1ldOworCQlkcHJpbnQoTE9HX0RFQlVHLCAicGNpX2F0YV9idXNfbWFzdGVyX3JlYWQ6IEFU
QV9CTUNNRF9ZX1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNU1RB
VF9ZX1JFRzoKKwkJdmFsdWUgPSBzYy0+c3RhdFtBVEFfWV07CisJCWRwcmludChMT0dfREVCVUcs
ICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDogQVRBX0JNU1RBVF9ZX1JFRzogJWx1XG4iLCB2YWx1
ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNUFJEVF9ZX1JFRzoKKwkJdmFsdWUgPSBzYy0+cHJk
dFtBVEFfWV07CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDog
QVRBX0JNUFJEVF9ZX1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJ
CXZhbHVlID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMg
dm9pZAorcGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlKHN0cnVjdCBwY2lfYXRhX3NvZnRjICpzYywK
KwkJdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpCit7CisKKwl1aW50
OF90IHJlZ192YWx1ZTsKKworCWlmIChvZmZzZXQgIT0gQVRBX0JNUFJEVF9YX1JFRyAmJiBvZmZz
ZXQgIT0gQVRBX0JNUFJEVF9ZX1JFRyAmJiBzaXplICE9IDEpCisJCXJldHVybjsKKwlpZiAoKG9m
ZnNldCA9PSBBVEFfQk1QUkRUX1hfUkVHIHx8IG9mZnNldCA9PSBBVEFfQk1QUkRUX1lfUkVHKSAm
JiBzaXplICE9IDQpCisJCXJldHVybjsKKworCXN3aXRjaCAob2Zmc2V0KSB7CisJY2FzZSBBVEFf
Qk1DTURfWF9SRUc6CisJCXJlZ192YWx1ZSA9IHNjLT5jbWRbQVRBX1hdID0gKHVpbnQ4X3QpdmFs
dWU7CisKKwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl93cml0ZVtYXTog
QVRBX0JNQ01EX1NUQVJUX1NUT1A6ICVkXG4iLAorCQkgICAgICAgcmVnX3ZhbHVlICYgQVRBX0JN
Q01EX1NUQVJUX1NUT1ApOworCQlpZiAocmVnX3ZhbHVlICYgQVRBX0JNQ01EX1NUQVJUX1NUT1Ap
IHsKKwkJCXBjaV9hdGFfZG1hX3N0YXJ0KHNjLCBBVEFfWCk7CisJCX0KKwkJZWxzZSB7CisJCQlw
Y2lfYXRhX2RtYV9zdG9wKHNjLCBBVEFfWCk7CisJCX0KKworCQlkcHJpbnQoTE9HX0RFQlVHLCAi
cGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlW1hdOiBBVEFfQk1DTURfV1JJVEVfUkVBRDogJWRcbiIs
CisJCSAgICAgICByZWdfdmFsdWUgJiBBVEFfQk1DTURfV1JJVEVfUkVBRCk7CisJCWJyZWFrOwor
CWNhc2UgQVRBX0JNU1RBVF9YX1JFRzoKKwkJcmVnX3ZhbHVlID0gc2MtPnN0YXRbQVRBX1hdID0g
KHVpbnQ4X3QpdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJf
d3JpdGVbWF06IEFUQV9CTVNUQVRfSU5URVJSVVBUOiAlZCwgQVRBX0JNU1RBVF9FUlJPUjogJWRc
biIsCisJCQkJcmVnX3ZhbHVlICAmIEFUQV9CTVNUQVRfSU5URVJSVVBULCByZWdfdmFsdWUgJiBB
VEFfQk1TVEFUX0VSUk9SKTsKKwkJaWYgKHJlZ192YWx1ZSAmIEFUQV9CTVNUQVRfSU5URVJSVVBU
KQorCQkJc2MtPnN0YXRbQVRBX1hdICY9IH5BVEFfQk1TVEFUX0lOVEVSUlVQVDsKKwkJaWYgKHJl
Z192YWx1ZSAmIEFUQV9CTVNUQVRfRVJST1IpCisJCQlzYy0+c3RhdFtBVEFfWF0gJj0gfkFUQV9C
TVNUQVRfRVJST1I7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNUFJEVF9YX1JFRzoKKwkJZHByaW50
KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl93cml0ZVtYXTogQVRBX0JNUFJEVF9YX1JF
RzogMHgleFxuIiwgKHVpbnQzMl90KXZhbHVlKTsKKwkJc2MtPnByZHRbQVRBX1hdID0gdmFsdWU7
CisJCWJyZWFrOworCWNhc2UgQVRBX0JNQ01EX1lfUkVHOgorCQlyZWdfdmFsdWUgPSBzYy0+Y21k
W0FUQV9ZXSA9ICh1aW50OF90KXZhbHVlOworCisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRh
X2J1c19tYXN0ZXJfd3JpdGVbWV06IEFUQV9CTUNNRF9TVEFSVF9TVE9QOiAlZFxuIiwKKwkJICAg
ICAgIHJlZ192YWx1ZSAmIEFUQV9CTUNNRF9TVEFSVF9TVE9QKTsKKwkJaWYgKHJlZ192YWx1ZSAm
IEFUQV9CTUNNRF9TVEFSVF9TVE9QKSB7CisJCQlwY2lfYXRhX2RtYV9zdGFydChzYywgQVRBX1kp
OworCQl9CisJCWVsc2UgeworCQkJcGNpX2F0YV9kbWFfc3RvcChzYywgQVRBX1kpOworCQl9CisK
KwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl93cml0ZVtZXTogQVRBX0JN
Q01EX1dSSVRFX1JFQUQ6ICVkXG4iLAorCQkgICAgICAgcmVnX3ZhbHVlICYgQVRBX0JNQ01EX1dS
SVRFX1JFQUQpOworCQlicmVhazsKKwljYXNlIEFUQV9CTVNUQVRfWV9SRUc6CisJCXJlZ192YWx1
ZSA9IHNjLT5zdGF0W0FUQV9ZXSA9ICh1aW50OF90KXZhbHVlOworCQlkcHJpbnQoTE9HX0RFQlVH
LCAicGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlW1ldOiBBVEFfQk1TVEFUX0lOVEVSUlVQVDogJWQs
IEFUQV9CTVNUQVRfRVJST1I6ICVkXG4iLAorCQkJCXJlZ192YWx1ZSAgJiBBVEFfQk1TVEFUX0lO
VEVSUlVQVCwgcmVnX3ZhbHVlICYgQVRBX0JNU1RBVF9FUlJPUik7CisJCWlmIChyZWdfdmFsdWUg
JiBBVEFfQk1TVEFUX0lOVEVSUlVQVCkKKwkJCXNjLT5zdGF0W0FUQV9ZXSAmPSB+QVRBX0JNU1RB
VF9JTlRFUlJVUFQ7CisJCWlmIChyZWdfdmFsdWUgJiBBVEFfQk1TVEFUX0VSUk9SKQorCQkJc2Mt
PnN0YXRbQVRBX1ldICY9IH5BVEFfQk1TVEFUX0VSUk9SOworCQlicmVhazsKKwljYXNlIEFUQV9C
TVBSRFRfWV9SRUc6CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfd3Jp
dGVbWV06IEFUQV9CTVBSRFRfWF9SRUc6IDB4JXhcbiIsICh1aW50MzJfdCl2YWx1ZSk7CisJCXNj
LT5wcmR0W0FUQV9ZXSA9ICh1aW50MzJfdCl2YWx1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJ
YnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdWludDY0X3QKK3BjaV9hdGFfcmVh
ZChzdHJ1Y3Qgdm1jdHggKmN0eCwgaW50IHZjcHUsIHN0cnVjdCBwY2lfZGV2aW5zdCAqcGksIGlu
dCBiYXJpZHgsCisJCXVpbnQ2NF90IG9mZnNldCwgaW50IHNpemUpCit7CisJc3RydWN0IHBjaV9h
dGFfc29mdGMgKnNjID0gcGktPnBpX2FyZzsKKwl1aW50NjRfdCB2YWx1ZSA9IDA7CisKKwlzd2l0
Y2ggKGJhcmlkeCkgeworCWNhc2UgUENJX0JBUjA6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9Y
XSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FU
QV9YXSwgQVRBX1gpKTsKKwkJdmFsdWUgPSBhdGFfY29tbWFuZF9ibG9ja19yZWFkKHNjLT5jaGFu
bmVsc1tBVEFfWF0sIG9mZnNldCk7CisJCWJyZWFrOworCWNhc2UgUENJX0JBUjE6CisJCWlmICgh
c2MtPmNoYW5uZWxzW0FUQV9YXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNf
b2soc2MtPmNoYW5uZWxzW0FUQV9YXSwgQVRBX1gpKTsKKwkJdmFsdWUgPSBhdGFfYWx0c3RhdHVz
X3JlYWQoc2MtPmNoYW5uZWxzW0FUQV9YXSk7CisJCWJyZWFrOworCWNhc2UgUENJX0JBUjI6CisJ
CWlmICghc2MtPmNoYW5uZWxzW0FUQV9ZXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5u
ZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9ZXSwgQVRBX1kpKTsKKwkJdmFsdWUgPSBhdGFfY29t
bWFuZF9ibG9ja19yZWFkKHNjLT5jaGFubmVsc1tBVEFfWV0sIG9mZnNldCk7CisJCWJyZWFrOwor
CWNhc2UgUENJX0JBUjM6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9ZXSkKKwkJCWJyZWFrOwor
CQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9ZXSwgQVRBX1kpKTsK
KwkJdmFsdWUgPSBhdGFfYWx0c3RhdHVzX3JlYWQoc2MtPmNoYW5uZWxzW0FUQV9ZXSk7CisJCWJy
ZWFrOworCWNhc2UgUENJX0JBUjQ6CisJCXZhbHVlID0gcGNpX2F0YV9idXNfbWFzdGVyX3JlYWQo
c2MsIG9mZnNldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFzc2VydCgwKTsKKwkJYnJlYWs7
CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZAorcGNpX2F0YV93cml0ZShz
dHJ1Y3Qgdm1jdHggKmN0eCwgaW50IHZjcHUsIHN0cnVjdCBwY2lfZGV2aW5zdCAqcGksCisJCWlu
dCBiYXJpZHgsIHVpbnQ2NF90IG9mZnNldCwgaW50IHNpemUsIHVpbnQ2NF90IHZhbHVlKQorewor
CXN0cnVjdCBwY2lfYXRhX3NvZnRjICpzYyA9IHBpLT5waV9hcmc7CisKKwlzd2l0Y2ggKGJhcmlk
eCkgeworCWNhc2UgUENJX0JBUjA6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9YXSkKKwkJCWJy
ZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9YXSwgQVRB
X1gpKTsKKwkJYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGUoc2MtPmNoYW5uZWxzW0FUQV9YXSwgb2Zm
c2V0LCBzaXplLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgUENJX0JBUjE6CisJCWlmICghc2Mt
PmNoYW5uZWxzW0FUQV9YXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2so
c2MtPmNoYW5uZWxzW0FUQV9YXSwgQVRBX1gpKTsKKwkJYXRhX2NvbnRyb2xfd3JpdGUoc2MtPmNo
YW5uZWxzW0FUQV9YXSwgc2l6ZSwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIFBDSV9CQVIyOgor
CQlpZiAoIXNjLT5jaGFubmVsc1tBVEFfWV0pCisJCQlicmVhazsKKwkJYXNzZXJ0KGF0YV9jaGFu
bmVsX2lzX29rKHNjLT5jaGFubmVsc1tBVEFfWV0sIEFUQV9ZKSk7CisJCWF0YV9jb21tYW5kX2Js
b2NrX3dyaXRlKHNjLT5jaGFubmVsc1tBVEFfWV0sIG9mZnNldCwgc2l6ZSwgdmFsdWUpOworCQli
cmVhazsKKwljYXNlIFBDSV9CQVIzOgorCQlpZiAoIXNjLT5jaGFubmVsc1tBVEFfWV0pCisJCQli
cmVhazsKKwkJYXNzZXJ0KGF0YV9jaGFubmVsX2lzX29rKHNjLT5jaGFubmVsc1tBVEFfWV0sIEFU
QV9ZKSk7CisJCWF0YV9jb250cm9sX3dyaXRlKHNjLT5jaGFubmVsc1tBVEFfWV0sIHNpemUsIHZh
bHVlKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfQkFSNDoKKwkJcGNpX2F0YV9idXNfbWFzdGVyX3dy
aXRlKHNjLCBvZmZzZXQsIHNpemUsIHZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXNz
ZXJ0KDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBMUEMgQVRBIGZ1
bmN0aW9uIGRlZmluaXRpb25zCisgKi8KK3N0YXRpYyB2b2lkCitscGNfYXRhX2ludHJfYXNzZXJ0
KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbHBjX2F0YV9zb2Z0YyAqc2NfbHBjX2F0YSA9IChzdHJ1
Y3QgbHBjX2F0YV9zb2Z0YyAqKWFyZzsKKwlzdHJ1Y3Qgdm1jdHggKmxwY19jdHggPSBzY19scGNf
YXRhLT5jaGFubmVsLT52bV9jdHg7CisKKwl2bV9pc2FfcHVsc2VfaXJxKGxwY19jdHgsIHNjX2xw
Y19hdGEtPmlycSwgc2NfbHBjX2F0YS0+aXJxKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZv
aWQKK2xwY19hdGFfaW50cl9kZWFzc2VydCh2b2lkICphcmcpCit7CisJLyoKKwkgKiBUaGUgQVRB
IGRldmljZXMgb24gdGhlIExQQyBidXMgZ2VuZXJhdGUgZWRnZSB0cmlnZ2VyZWQgaW50ZXJydXB0
cworCSAqIHNvIG5vdGhpbmcgbW9yZSB0byBkbyBoZXJlCisJICovCisKKwlyZXR1cm47Cit9CisK
K2ludAorbHBjX2F0YV9pbml0KHN0cnVjdCB2bWN0eCAqY3R4LCBjb25zdCBjaGFyICpvcHRzKQor
eworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisJc3RydWN0IGlub3V0X3Bv
cnQgaW9wLCBpb2N0bHA7CisJaW50IGNoX2F0YSA9IC0xOworCWludCBlcnI7CisKKwlhdGFfb3Bl
bl9kYmdfZmlsZSgpOworCisJYXNzZXJ0KG9wdHNbMF0gPT0gJzAnIHx8IG9wdHNbMF0gPT0gJzEn
KTsKKwljaF9hdGEgPSBvcHRzWzBdIC0gJzAnOworCisJaWYgKGxwY19hdGFfc2NbY2hfYXRhXS5j
aGFubmVsKSB7CisJCWRwcmludChMT0dfRVJSLCAibHBjX2F0YV9pbml0OiB0aGUgTFBDIGF0YSVk
IGlzIGluaXRpYWxpemVkXG4iLCBjaF9hdGEpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2hhbm5l
bCA9IGF0YV9pbml0KGN0eCwgbHBjX2F0YV9pbnRyX2Fzc2VydCwgbHBjX2F0YV9pbnRyX2RlYXNz
ZXJ0LCAmbHBjX2F0YV9zY1tjaF9hdGFdLCBvcHRzLCAxKTsKKwlpZiAoIWNoYW5uZWwpCisJCXJl
dHVybiAtMTsKKworCWFzc2VydChjaF9hdGEgPT0gY2hhbm5lbC0+aW50ZXJmYWNlKTsKKwljaGFu
bmVsLT51c2VfMTZiaXQgPSAxOworCisJbHBjX2F0YV9zY1tjaF9hdGFdLmNoYW5uZWwgPSBjaGFu
bmVsOworCisJYnplcm8oJmlvcCwgc2l6ZW9mKHN0cnVjdCBpbm91dF9wb3J0KSk7CisJaW9wLm5h
bWUgPSBscGNfYXRhX3NjW2NoX2F0YV0ubmFtZV9pbzsKKwlpb3AucG9ydCA9IGxwY19hdGFfc2Nb
Y2hfYXRhXS5iYXNlX2FkZHJfaW87CisJaW9wLnNpemUgPSBBVEFfSU9TSVpFOworCWlvcC5mbGFn
cyA9IElPUE9SVF9GX0lOT1VUOworCWlvcC5oYW5kbGVyID0gbHBjX2F0YV9pb19oYW5kbGVyOwor
CWlvcC5hcmcgPSAmbHBjX2F0YV9zY1tjaF9hdGFdOworCisJZXJyID0gcmVnaXN0ZXJfaW5vdXQo
JmlvcCk7CisJYXNzZXJ0KGVyciA9PSAwKTsKKworCWJ6ZXJvKCZpb2N0bHAsIHNpemVvZihzdHJ1
Y3QgaW5vdXRfcG9ydCkpOworCWlvY3RscC5uYW1lID0gbHBjX2F0YV9zY1tjaF9hdGFdLm5hbWVf
aW9jdGw7CisJaW9jdGxwLnBvcnQgPSBscGNfYXRhX3NjW2NoX2F0YV0uYmFzZV9hZGRyX2lvY3Rs
OworCWlvY3RscC5zaXplID0gQVRBX0NUTElPU0laRTsKKwlpb2N0bHAuZmxhZ3MgPSBJT1BPUlRf
Rl9JTk9VVDsKKwlpb2N0bHAuaGFuZGxlciA9IGxwY19hdGFfaW9jdGxfaGFuZGxlcjsKKwlpb2N0
bHAuYXJnID0gJmxwY19hdGFfc2NbY2hfYXRhXTsKKworCWVyciA9IHJlZ2lzdGVyX2lub3V0KCZp
b2N0bHApOworCWFzc2VydChlcnIgPT0gMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu
dAorbHBjX2F0YV9pb19oYW5kbGVyKHN0cnVjdCB2bWN0eCAqY3R4LCBpbnQgdmNwdSwKKwkJICAg
aW50IGluLCBpbnQgcG9ydCwgaW50IGJ5dGVzLCB1aW50MzJfdCAqZWF4LCB2b2lkICphcmcpCit7
CisJc3RydWN0IGxwY19hdGFfc29mdGMgKmxwY19zYyA9IChzdHJ1Y3QgbHBjX2F0YV9zb2Z0YyAq
KWFyZzsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworCXVpbnQ4X3Qgb2Zm
c2V0ID0gMDsKKworCWFzc2VydChscGNfc2MpOworCWNoYW5uZWwgPSBscGNfc2MtPmNoYW5uZWw7
CisJYXNzZXJ0KGNoYW5uZWwpOworCisJb2Zmc2V0ID0gcG9ydCAtIGxwY19zYy0+YmFzZV9hZGRy
X2lvOworCWFzc2VydChvZmZzZXQgPCBBVEFfSU9TSVpFKTsKKworCWlmIChpbikKKwkJKmVheCA9
IGF0YV9jb21tYW5kX2Jsb2NrX3JlYWQoY2hhbm5lbCwgb2Zmc2V0KTsKKwllbHNlCisJCWF0YV9j
b21tYW5kX2Jsb2NrX3dyaXRlKGNoYW5uZWwsIG9mZnNldCwgYnl0ZXMsICplYXgpOworCisJcmV0
dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2xwY19hdGFfaW9jdGxfaGFuZGxlcihzdHJ1Y3Qgdm1j
dHggKmN0eCwgaW50IHZjcHUsCisJCSAgIGludCBpbiwgaW50IHBvcnQsIGludCBieXRlcywgdWlu
dDMyX3QgKmVheCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBscGNfYXRhX3NvZnRjICpscGNfc2Mg
PSAoc3RydWN0IGxwY19hdGFfc29mdGMgKilhcmc7CisJc3RydWN0IGF0YV9jaGFubmVsICpjaGFu
bmVsID0gTlVMTDsKKwl1aW50OF90IG9mZnNldCA9IDA7CisKKwlhc3NlcnQobHBjX3NjKTsKKwlj
aGFubmVsID0gbHBjX3NjLT5jaGFubmVsOworCWFzc2VydChjaGFubmVsKTsKKworCW9mZnNldCA9
IHBvcnQgLSBscGNfc2MtPmJhc2VfYWRkcl9pb2N0bDsKKwlhc3NlcnQob2Zmc2V0IDwgQVRBX0NU
TElPU0laRSk7CisKKwlpZiAoaW4pCisJCSplYXggPSBhdGFfYWx0c3RhdHVzX3JlYWQoY2hhbm5l
bCk7CisJZWxzZQorCQlhdGFfY29udHJvbF93cml0ZShjaGFubmVsLCBieXRlcywgKmVheCk7CisK
KwlyZXR1cm4gMDsKK30KKwoK


--b1_370e5c04a721b87eab23b165702327c0--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?differential-rev-PHID-DREV-2t5o3zrdohcj7mowtyki-req>