Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 19 Jan 2009 14:21:57 -0800
From:      Maksim Yevmenkin <maksim.yevmenkin@gmail.com>
To:        Hans Petter Selasky <hselasky@c2i.net>
Cc:        "freebsd-bluetooth@freebsd.org" <freebsd-bluetooth@freebsd.org>, Alfred Perlstein <alfred@freebsd.org>
Subject:   Re: USB2: ng_ubt2 patch
Message-ID:  <bb4a86c70901191421p55bb5404u484f9615b00cf30d@mail.gmail.com>
In-Reply-To: <200901161012.24544.hselasky@c2i.net>
References:  <bb4a86c70901141705s1af508e3yf79383ecf97293cf@mail.gmail.com> <200901152225.19150.hselasky@c2i.net> <bb4a86c70901151708u5e633e8bkbcb530646b22ca3c@mail.gmail.com> <200901161012.24544.hselasky@c2i.net>

next in thread | previous in thread | raw e-mail | index | archive | help
--000e0cd2e10ccf0fd50460dd59a4
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

hello,

[...]

>> >> > 1) Maybe you just want to merge together all the USB config structures
>> >> > into one?
>> >>
>> >> i guess, i could. since isoc transfers are going over different (from
>> >> control, interrupt and bulk transfers) interface, i kept original code
>> >> that had two separate usb2_config structures (i.e. one per each
>> >> interface). for the same reason, i added separate lock for interface 1
>> >> (where isoc transfers are). i figured, due to the nature of isoc
>> >> transfers, this lock will be grabbed a lot more often. it seemed like
>> >> a good idea to use different lock so there would be less contention
>> >> with interface 0 lock. but then again, may be i just full of it :) and
>> >> it really does not matter.
>> >>
>> >> could you please tell me what is the reason for merging usb2_config
>> >> structures? is it better for usb2?
>> >
>> > It will save some memory allocations.
>>
>> i will see what i can do.

ok, as per your request, i have merged two usb2_config structures into
one  (see attached patch)

[...]

> If isochronous is being used, then I recommend you have two transfers running
> at any time in both directions. If there is nothing to send you send zero
> length frames. Else you end up with glitches in the isochronous stream when
> you change from one transfer to the other! Both isochronous transfers should
> be queued all the time!

ok, i've made this change as well. newer code queues and keeps both
read and both write isoc. transfers running all the time.

the attached patch seems to work (there was a reference counting
problem in the previous version of the patch). i also tortured it a
bit, i.e. stop the stack and/or yank the device while stack it active
and sending lots of data (i used l2ping -f to create lots of
activity).

i think, it can be committed to -head now. it should be stable enough
for early adopters of usb2 and bluetooth :) so, please let me know how
should i proceed at this point?

do i

1) commit it to head myself

or

2) wait for you commit it into your cvs/scv/p4/etc. branch and then
merge it into -head

thanks,
max

--000e0cd2e10ccf0fd50460dd59a4
Content-Type: text/plain; charset=US-ASCII; name="ng_ubt2.diff.txt"
Content-Disposition: attachment; filename="ng_ubt2.diff.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_fq5oxlah0

SW5kZXg6IG5nX3VidDIuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBuZ191YnQyLmMJKHJldmlzaW9uIDE4NzMx
MykKKysrIG5nX3VidDIuYwkod29ya2luZyBjb3B5KQpAQCAtMyw3ICszLDcgQEAKICAqLwogCiAv
Ki0KLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIE1ha3NpbSBZZXZtZW5raW4gPG1fZXZtZW5r
aW5AeWFob28uY29tPgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDkgTWFrc2ltIFlldm1lbmtp
biA8bV9ldm1lbmtpbkB5YWhvby5jb20+CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dApAQCAtMzEsNiArMzEsNjkgQEAKICAqICRGcmVlQlNEJAogICovCiAKKy8qCisg
KiBOT1RFOiBuZ191YnQyIGRyaXZlciBoYXMgYSBzcGxpdCBwZXJzb25hbGl0eS4gT24gb25lIHNp
ZGUgaXQgaXMKKyAqIGEgVVNCMiBkZXZpY2UgZHJpdmVyIGFuZCBvbiB0aGUgb3RoZXIgaXQgaXMg
YSBOZXRncmFwaCBub2RlLiBUaGlzCisgKiBkcml2ZXIgd2lsbCAqTk9UKiBjcmVhdGUgdHJhZGl0
aW9uYWwgL2Rldi8gZW50aWVzLCBvbmx5IE5ldGdyYXBoIAorICogbm9kZS4KKyAqCisgKiBOT1RF
IE9OIExPQ0tTIFVTRUQ6IG5nX3VidDIgZHJpdmVzIHVzZXMgMyBsb2NrcyAobXV0ZXhlcykKKyAq
CisgKiAxKSBzY19pZl9tdHhbMF0gLSBsb2NrIGZvciBkZXZpY2UncyBpbnRlcmZhY2UgIzAuIFRo
aXMgbG9jayBpcyB1c2VkCisgKiAgICBieSBVU0IyIGZvciBhbnkgVVNCIHJlcXVlc3QgZ29pbmcg
b3ZlciBkZXZpY2UncyBpbnRlcmZhY2UgIzAsIGkuZS4KKyAqICAgIGludGVycnVwdCwgY29udHJv
bCBhbmQgYnVsayB0cmFuc2ZlcnMuCisgKiAKKyAqIDIpIHNjX2lmX210eFsxXSAtIGxvY2sgZm9y
IGRldmljZSdzIGludGVyZmFjZSAjMS4gVGhpcyBsb2NrIGlzIHVzZWQKKyAqICAgIGJ5IFVTQjIg
Zm9yIGFueSBVU0IgcmVxdWVzdCBnb2luZyBvdmVyIGRldmljZSdzIGludGVyZmFjZSAjMSwgaS5l
CisgKiAgICBpc29jLiB0cmFuc2ZlcnMuCisgKiAKKyAqIDMpIHNjX21idWZxX210eCAtIGxvY2sg
Zm9yIG1idWZxIGFuZCB0YXNrIGZsYWdzLiBUaGlzIGxvY2sgaXMgdXNlZAorICogICAgdG8gcHJv
dGVjdCBkZXZpY2UncyBvdXRnb2luZyBtYnVmIHF1ZXVlcyBhbmQgdGFzayBmbGFncy4gVGhpcyBs
b2NrCisgKiAgICAqU0hPVUxEIE5PVCogYmUgZ3JhYmJlZCBmb3IgYSBsb25nIHRpbWUuIEluIGZh
Y3QsIHRoaW5rIG9mIGl0IGFzIGEgCisgKiAgICBzcGluIGxvY2suCisgKgorICogTk9URSBPTiBM
T0NLSU5HIFNUUkFURUdZOiBuZ191YnQyIGRyaXZlciBvcGVyYXRlcyBpbiAzIGRpZmZlcmVudCBj
b250ZXh0cy4KKyAqCisgKiAxKSBVU0IgY29udGV4dC4gVGhpcyBpcyB3aGVyZSBhbGwgdGhlIFVT
QiByZWxhdGVkIHN0dWZmIGhhcHBlbnMuIEFsbAorICogICAgY2FsbGJhY2tzIHJ1biBpbiB0aGlz
IGNvbnRleHQuIEFsbCBjYWxsYmFja3MgYXJlIGNhbGxlZCAoYnkgVVNCMikgd2l0aAorICogICAg
YXBwcm9wcmlhdGUgaW50ZXJmYWNlIGxvY2sgaGVsZC4gSXQgaXMgKGdlbmVyYWxseSkgYWxsb3dl
ZCB0byBncmFiCisgKiAgICBhbnkgYWRkaXRpb25hbCBsb2Nrcy4KKyAqCisgKiAyKSBOZXRncmFw
aCBjb250ZXh0LiBUaGlzIGlzIHdoZXJlIGFsbCB0aGUgTmV0Z3JhcGggcmVsYXRlZCBzdHVmZiBo
YXBwZW5zLgorICogICAgU2luY2Ugd2UgbWFyayBub2RlIGFzIFdSSVRFUiwgdGhlIE5ldGdyYXBo
IG5vZGUgd2lsbCBiZSAibG9ja2VkIiAoZnJvbQorICogICAgTmV0Z3JhcGggcG9pbnQgb2Ygdmll
dykuIEFueSB2YXJpYWJsZSB0aGF0IGlzIG9ubHkgbW9kaWZpZWQgZnJvbSB0aGUKKyAqICAgIE5l
dGdyYXBoIGNvbnRleHQgZG9lcyBub3QgcmVxdWlyZSBhbnkgYWRkaXRvbmFsIGxvY2tpbmcuIEl0
IGlzIGdlbmVyYWxseQorICogICAgKk5PVCogYWxsb3dlZCB0byBncmFiICpBTlkqIGFkZGl0aW9u
YWwgbG9jay4gV2hhdGV2ZXIgeW91IGRvLCAqRE8gTk9UKgorICogICAgbm90IGdyYWIgYW55IGxv
bmctc2xlZXAgbG9jayBpbiB0aGUgTmV0Z3JhcGggY29udGV4dC4gSW4gZmFjdCwgdGhlIG9ubHkK
KyAqICAgIGxvY2sgdGhhdCBpcyBhbGxvd2VkIGluIHRoZSBOZXRncmFwaCBjb250ZXh0IGlzIHRo
ZSBzY19tYnVmcV9tdHggbG9jay4KKyAqCisgKiAzKSBUYXNrcXVldWUgY29udGV4dC4gVGhpcyBp
cyB3aGVyZSB1YnRfdGFzayBydW5zLiBTaW5jZSB3ZSBhcmUgTk9UIGFsbG93ZWQKKyAqICAgIHRv
IGdyYWIgYW55IGxvY2tzIGluIHRoZSBOZXRncmFwaCBjb250ZXh0LCBhbmQsIFVTQjIgcmVxdWly
ZXMgdXMgdG8KKyAqICAgIGdyYWIgaW50ZXJmYWNlIGxvY2sgYmVmb3JlIGRvaW5nIHRoaW5ncyB3
aXRoIHRyYW5zZmVycywgd2UgbmVlZCB0bworICogICAgdHJhbnNpdGlvbiBmcm9tIHRoZSBOZXRn
cmFwaCBjb250ZXh0IHRvIHRoZSBUYXNrcXVldWUgY29udGV4dCBiZWZvcmUKKyAqICAgIHdlIGNh
biBjYWxsIGludG8gVVNCMiBzdWJzeXN0ZW0uCisgKgorICogU28sIHRvIHB1dCBldmVyeXRoaW5n
IHRvZ2V0aGVyLCB0aGUgcnVsZXMgYXJlIGFzIGZvbGxvd3MuCisgKglJdCBpcyBPSyB0byBjYWxs
IGZyb20gdGhlIFVTQiBjb250ZXh0IG9yIHRoZSBUYXNrcXVldWUgY29udGV4dCBpbnRvCisgKiB0
aGUgTmV0Z3JhcGggY29udGV4dCAoaS5lLiBjYWxsIE5HX1NFTkRfeHh4IGZ1bmN0aW9ucykuIElu
IG90aGVyIHdvcmRzCisgKiBpdCBpcyBhbGxvd2VkIHRvIGNhbGwgaW50byB0aGUgTmV0Z3JhcGgg
Y29udGV4dCB3aXRoIGxvY2tzIGhlbGQuCisgKglJcyBpdCAqTk9UKiBPSyB0byBjYWxsIGZyb20g
dGhlIE5ldGdyYXBoIGNvbnRleHQgaW50byB0aGUgVVNCIGNvbnRleHQsCisgKiBiZWNhdXNlIFVT
QjIgcmVxdWlyZXMgdXMgdG8gZ3JhYiBpbnRlcmZhY2UgbG9ja3MgYW5kIHdlIGNhbiBub3QgZG8g
dGhhdC4KKyAqIFRvIGF2b2lkIHRoaXMsIHdlIHNldCB0YXNrIGZsYWdzIHRvIGluZGljYXRlIHdo
aWNoIGFjdGlvbnMgd2Ugd2FudCB0bworICogcGVyZm9ybSBhbmQgc2NoZWR1bGUgdWJ0X3Rhc2sg
d2hpY2ggd291bGQgcnVuIGluIHRoZSBUYXNrcXVldWUgY29udGV4dC4KKyAqCUlzIGlzIE9LIHRv
IGNhbGwgZnJvbSB0aGUgVGFza3F1ZXVlIGNvbnRleHQgaW50byB0aGUgVVNCIGNvbnRleHQsCisg
KiBhbmQsIHVidF90YXNrIGRvZXMganVzdCB0aGF0IChpLmUuIGdyYWJzIGFwcHJvcHJpYXRlIGlu
dGVyZmFjZSBsb2NrcworICogYmVmb3JlIGNhbGxpbmcgaW50byBVU0IyKS4KKyAqCUFjY2VzcyB0
byB0aGUgb3V0Z29pbmcgcXVldWVzIGFuZCB0YXNrIGZsYWdzIGlzIGNvbnRyb2xsZWQgYnkgdGhl
CisgKiBzY19tYnVmcV9tdHggbG9jay4gSXQgaXMgYW4gdW5hdm9pZGFibGUgZXZpbC4gQWdhaW4s
IHNjX21idWZxX210eCBzaG91bGQKKyAqIHJlYWxseSBiZSBhIHNwaW4gbG9jay4KKyAqCUFsbCBV
U0IgY2FsbGJhY2tzIGFjY2VwdCBOZXRncmFwaCBub2RlIHBvaW50ZXIgYXMgcHJpdmF0ZSBkYXRh
LiBUbworICogZW5zdXJlIHRoYXQgTmV0Z3JhcGggbm9kZSBwb2ludGVyIHJlbWFpbnMgdmFsaWQg
Zm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUKKyAqIHRyYW5zZmVyLCB3ZSBncmFiIGEgcmVmZXJyZW5j
ZSB0byB0aGUgbm9kZS4gSW4gb3RoZXIgd29yZHMsIGlmIHRyYW5zZmVyIGlzCisgKiBwZW5kaW5n
LCB0aGVuIHdlIHNob3VsZCBoYXZlIGEgcmVmZXJyZW5jZSBvbiB0aGUgbm9kZS4gTkdfTk9ERV9b
Tk9UX11WQUxJRAorICogbWFjcm8gaXMgdXNlZCB0byBjaGVjayBpZiBub2RlIGlzIHN0aWxsIHBy
ZXNlbnQgYW5kIHBvaW50ZXIgaXMgdmFsaWQuCisgKi8KKwogI2luY2x1ZGUgPGRldi91c2IyL2lu
Y2x1ZGUvdXNiMl9kZXZpZC5oPgogI2luY2x1ZGUgPGRldi91c2IyL2luY2x1ZGUvdXNiMl9zdGFu
ZGFyZC5oPgogI2luY2x1ZGUgPGRldi91c2IyL2luY2x1ZGUvdXNiMl9tZnVuYy5oPgpAQCAtNDQs
OCArMTA3LDExIEBACiAjaW5jbHVkZSA8ZGV2L3VzYjIvY29yZS91c2IyX2xvb2t1cC5oPgogI2lu
Y2x1ZGUgPGRldi91c2IyL2NvcmUvdXNiMl91dGlsLmg+CiAjaW5jbHVkZSA8ZGV2L3VzYjIvY29y
ZS91c2IyX2J1c2RtYS5oPgorI2luY2x1ZGUgPGRldi91c2IyL2NvcmUvdXNiMl9wcm9jZXNzLmg+
CisjaW5jbHVkZSA8ZGV2L3VzYjIvY29yZS91c2IyX3RyYW5zZmVyLmg+CiAKICNpbmNsdWRlIDxz
eXMvbWJ1Zi5oPgorI2luY2x1ZGUgPHN5cy90YXNrcXVldWUuaD4KIAogI2luY2x1ZGUgPG5ldGdy
YXBoL25nX21lc3NhZ2UuaD4KICNpbmNsdWRlIDxuZXRncmFwaC9uZXRncmFwaC5oPgpAQCAtNTcs
NzEgKzEyMyw1NyBAQAogI2luY2x1ZGUgPGRldi91c2IyL2JsdWV0b290aC91c2IyX2JsdWV0b290
aC5oPgogI2luY2x1ZGUgPGRldi91c2IyL2JsdWV0b290aC9uZ191YnQyX3Zhci5oPgogCi0vKgot
ICogVVNCIG1ldGhvZHMKLSAqLworc3RhdGljIGludAkJdWJ0X21vZGV2ZW50KG1vZHVsZV90LCBp
bnQsIHZvaWQgKik7CitzdGF0aWMgZGV2aWNlX3Byb2JlX3QJdWJ0X3Byb2JlOworc3RhdGljIGRl
dmljZV9hdHRhY2hfdAl1YnRfYXR0YWNoOworc3RhdGljIGRldmljZV9kZXRhY2hfdAl1YnRfZGV0
YWNoOwogCi1zdGF0aWMgZGV2aWNlX3Byb2JlX3QgdWJ0X3Byb2JlOwotc3RhdGljIGRldmljZV9h
dHRhY2hfdCB1YnRfYXR0YWNoOwotc3RhdGljIGRldmljZV9kZXRhY2hfdCB1YnRfZGV0YWNoOwor
c3RhdGljIGludAkJdWJ0X3Rhc2tfc2NoZWR1bGUodWJ0X3NvZnRjX3AsIGludCk7CitzdGF0aWMg
dGFza19mbl90CXVidF90YXNrOworc3RhdGljIHZvaWQJCXVidF94ZmVyX3N0YXJ0KHVidF9zb2Z0
Y19wLCBpbnQpOwogCi1zdGF0aWMgZGV2Y2xhc3NfdCB1YnRfZGV2Y2xhc3M7CisvKiBOZXRncmFw
aCBtZXRob2RzICovCitzdGF0aWMgbmdfY29uc3RydWN0b3JfdAluZ191YnRfY29uc3RydWN0b3I7
CitzdGF0aWMgbmdfc2h1dGRvd25fdAluZ191YnRfc2h1dGRvd247CitzdGF0aWMgbmdfbmV3aG9v
a190CW5nX3VidF9uZXdob29rOworc3RhdGljIG5nX2Nvbm5lY3RfdAluZ191YnRfY29ubmVjdDsK
K3N0YXRpYyBuZ19kaXNjb25uZWN0X3QJbmdfdWJ0X2Rpc2Nvbm5lY3Q7CitzdGF0aWMgbmdfcmN2
bXNnX3QJbmdfdWJ0X3Jjdm1zZzsKK3N0YXRpYyBuZ19yY3ZkYXRhX3QJbmdfdWJ0X3JjdmRhdGE7
CiAKLXN0YXRpYyBkZXZpY2VfbWV0aG9kX3QgdWJ0X21ldGhvZHNbXSA9IHsKLQlERVZNRVRIT0Qo
ZGV2aWNlX3Byb2JlLCB1YnRfcHJvYmUpLAotCURFVk1FVEhPRChkZXZpY2VfYXR0YWNoLCB1YnRf
YXR0YWNoKSwKLQlERVZNRVRIT0QoZGV2aWNlX2RldGFjaCwgdWJ0X2RldGFjaCksCi0JezAsIDB9
Ci19OwotCi1zdGF0aWMgZHJpdmVyX3QgdWJ0X2RyaXZlciA9IHsKLQkubmFtZSA9ICJ1YnQiLAot
CS5tZXRob2RzID0gdWJ0X21ldGhvZHMsCi0JLnNpemUgPSBzaXplb2Yoc3RydWN0IHVidF9zb2Z0
YyksCi19OwotCi0vKgotICogTmV0Z3JhcGggbWV0aG9kcwotICovCi0KLXN0YXRpYyBuZ19jb25z
dHJ1Y3Rvcl90IG5nX3VidF9jb25zdHJ1Y3RvcjsKLXN0YXRpYyBuZ19zaHV0ZG93bl90IG5nX3Vi
dF9zaHV0ZG93bjsKLXN0YXRpYyBuZ19uZXdob29rX3QgbmdfdWJ0X25ld2hvb2s7Ci1zdGF0aWMg
bmdfY29ubmVjdF90IG5nX3VidF9jb25uZWN0Owotc3RhdGljIG5nX2Rpc2Nvbm5lY3RfdCBuZ191
YnRfZGlzY29ubmVjdDsKLXN0YXRpYyBuZ19yY3Ztc2dfdCBuZ191YnRfcmN2bXNnOwotc3RhdGlj
IG5nX3JjdmRhdGFfdCBuZ191YnRfcmN2ZGF0YTsKLQogLyogUXVldWUgbGVuZ3RoICovCi1zdGF0
aWMgY29uc3Qgc3RydWN0IG5nX3BhcnNlX3N0cnVjdF9maWVsZCBuZ191YnRfbm9kZV9xbGVuX3R5
cGVfZmllbGRzW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBuZ19wYXJzZV9zdHJ1Y3RfZmllbGQJ
bmdfdWJ0X25vZGVfcWxlbl90eXBlX2ZpZWxkc1tdID0KIHsKLQl7InF1ZXVlIiwgJm5nX3BhcnNl
X2ludDMyX3R5cGUsfSwKLQl7InFsZW4iLCAmbmdfcGFyc2VfaW50MzJfdHlwZSx9LAotCXtOVUxM
LH0KKwl7ICJxdWV1ZSIsICZuZ19wYXJzZV9pbnQzMl90eXBlLCB9LAorCXsgInFsZW4iLCAgJm5n
X3BhcnNlX2ludDMyX3R5cGUsIH0sCisJeyBOVUxMLCB9CiB9Owotc3RhdGljIGNvbnN0IHN0cnVj
dCBuZ19wYXJzZV90eXBlIG5nX3VidF9ub2RlX3FsZW5fdHlwZSA9IHsKK3N0YXRpYyBjb25zdCBz
dHJ1Y3QgbmdfcGFyc2VfdHlwZQkJbmdfdWJ0X25vZGVfcWxlbl90eXBlID0KK3sKIAkmbmdfcGFy
c2Vfc3RydWN0X3R5cGUsCiAJJm5nX3VidF9ub2RlX3FsZW5fdHlwZV9maWVsZHMKIH07CiAKIC8q
IFN0YXQgaW5mbyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBuZ19wYXJzZV9zdHJ1Y3RfZmllbGQg
bmdfdWJ0X25vZGVfc3RhdF90eXBlX2ZpZWxkc1tdID0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbmdf
cGFyc2Vfc3RydWN0X2ZpZWxkCW5nX3VidF9ub2RlX3N0YXRfdHlwZV9maWVsZHNbXSA9CiB7Ci0J
eyJwY2t0c19yZWN2IiwgJm5nX3BhcnNlX3VpbnQzMl90eXBlLH0sCi0JeyJieXRlc19yZWN2Iiwg
Jm5nX3BhcnNlX3VpbnQzMl90eXBlLH0sCi0JeyJwY2t0c19zZW50IiwgJm5nX3BhcnNlX3VpbnQz
Ml90eXBlLH0sCi0JeyJieXRlc19zZW50IiwgJm5nX3BhcnNlX3VpbnQzMl90eXBlLH0sCi0JeyJv
ZXJyb3JzIiwgJm5nX3BhcnNlX3VpbnQzMl90eXBlLH0sCi0JeyJpZXJyb3JzIiwgJm5nX3BhcnNl
X3VpbnQzMl90eXBlLH0sCi0Je05VTEwsfQorCXsgInBja3RzX3JlY3YiLCAmbmdfcGFyc2VfdWlu
dDMyX3R5cGUsIH0sCisJeyAiYnl0ZXNfcmVjdiIsICZuZ19wYXJzZV91aW50MzJfdHlwZSwgfSwK
Kwl7ICJwY2t0c19zZW50IiwgJm5nX3BhcnNlX3VpbnQzMl90eXBlLCB9LAorCXsgImJ5dGVzX3Nl
bnQiLCAmbmdfcGFyc2VfdWludDMyX3R5cGUsIH0sCisJeyAib2Vycm9ycyIsICAgICZuZ19wYXJz
ZV91aW50MzJfdHlwZSwgfSwKKwl7ICJpZXJyb3JzIiwgICAgJm5nX3BhcnNlX3VpbnQzMl90eXBl
LCB9LAorCXsgTlVMTCwgfQogfTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmdfcGFyc2VfdHlwZSBu
Z191YnRfbm9kZV9zdGF0X3R5cGUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5nX3BhcnNlX3R5
cGUJCW5nX3VidF9ub2RlX3N0YXRfdHlwZSA9Cit7CiAJJm5nX3BhcnNlX3N0cnVjdF90eXBlLAog
CSZuZ191YnRfbm9kZV9zdGF0X3R5cGVfZmllbGRzCiB9OwogCiAvKiBOZXRncmFwaCBub2RlIGNv
bW1hbmQgbGlzdCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBuZ19jbWRsaXN0IG5nX3VidF9jbWRs
aXN0W10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5nX2NtZGxpc3QJCQluZ191YnRfY21kbGlz
dFtdID0KK3sKIAl7CiAJCU5HTV9VQlRfQ09PS0lFLAogCQlOR01fVUJUX05PREVfU0VUX0RFQlVH
LApAQCAtMTY0LDMxNiArMjE2LDI2NyBAQAogCQlOVUxMLAogCQlOVUxMCiAJfSwKLQl7MCx9CisJ
eyAwLCB9CiB9OwogCiAvKiBOZXRncmFwaCBub2RlIHR5cGUgKi8KLXN0YXRpYyBzdHJ1Y3Qgbmdf
dHlwZSB0eXBlc3RydWN0ID0gewotCS52ZXJzaW9uID0gTkdfQUJJX1ZFUlNJT04sCi0JLm5hbWUg
PSBOR19VQlRfTk9ERV9UWVBFLAotCS5jb25zdHJ1Y3RvciA9IG5nX3VidF9jb25zdHJ1Y3RvciwK
LQkucmN2bXNnID0gbmdfdWJ0X3Jjdm1zZywKLQkuc2h1dGRvd24gPSBuZ191YnRfc2h1dGRvd24s
Ci0JLm5ld2hvb2sgPSBuZ191YnRfbmV3aG9vaywKLQkuY29ubmVjdCA9IG5nX3VidF9jb25uZWN0
LAotCS5yY3ZkYXRhID0gbmdfdWJ0X3JjdmRhdGEsCi0JLmRpc2Nvbm5lY3QgPSBuZ191YnRfZGlz
Y29ubmVjdCwKLQkuY21kbGlzdCA9IG5nX3VidF9jbWRsaXN0CitzdGF0aWMgc3RydWN0IG5nX3R5
cGUJdHlwZXN0cnVjdCA9Cit7CisJLnZlcnNpb24gPSAJTkdfQUJJX1ZFUlNJT04sCisJLm5hbWUg
PQkJTkdfVUJUX05PREVfVFlQRSwKKwkuY29uc3RydWN0b3IgPQluZ191YnRfY29uc3RydWN0b3Is
CisJLnJjdm1zZyA9CW5nX3VidF9yY3Ztc2csCisJLnNodXRkb3duID0JbmdfdWJ0X3NodXRkb3du
LAorCS5uZXdob29rID0JbmdfdWJ0X25ld2hvb2ssCisJLmNvbm5lY3QgPQluZ191YnRfY29ubmVj
dCwKKwkucmN2ZGF0YSA9CW5nX3VidF9yY3ZkYXRhLAorCS5kaXNjb25uZWN0ID0JbmdfdWJ0X2Rp
c2Nvbm5lY3QsCisJLmNtZGxpc3QgPQluZ191YnRfY21kbGlzdAogfTsKIAorLyoqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBVU0Igc3BlY2lmaWMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKi8KKwogLyogVVNCIG1ldGhvZHMgKi8KK3N0YXRpYyB1c2IyX2NhbGxiYWNrX3QJdWJ0
X2N0cmxfd3JpdGVfY2FsbGJhY2s7CitzdGF0aWMgdXNiMl9jYWxsYmFja190CXVidF9pbnRyX3Jl
YWRfY2FsbGJhY2s7CitzdGF0aWMgdXNiMl9jYWxsYmFja190CXVidF9pbnRyX3JlYWRfY2xlYXJf
c3RhbGxfY2FsbGJhY2s7CitzdGF0aWMgdXNiMl9jYWxsYmFja190CXVidF9idWxrX3JlYWRfY2Fs
bGJhY2s7CitzdGF0aWMgdXNiMl9jYWxsYmFja190CXVidF9idWxrX3JlYWRfY2xlYXJfc3RhbGxf
Y2FsbGJhY2s7CitzdGF0aWMgdXNiMl9jYWxsYmFja190CXVidF9idWxrX3dyaXRlX2NhbGxiYWNr
Oworc3RhdGljIHVzYjJfY2FsbGJhY2tfdAl1YnRfYnVsa193cml0ZV9jbGVhcl9zdGFsbF9jYWxs
YmFjazsKK3N0YXRpYyB1c2IyX2NhbGxiYWNrX3QJdWJ0X2lzb2NfcmVhZF9jYWxsYmFjazsKK3N0
YXRpYyB1c2IyX2NhbGxiYWNrX3QJdWJ0X2lzb2Nfd3JpdGVfY2FsbGJhY2s7CiAKLXN0YXRpYyB1
c2IyX2NhbGxiYWNrX3QgdWJ0X2N0cmxfd3JpdGVfY2FsbGJhY2s7Ci1zdGF0aWMgdXNiMl9jYWxs
YmFja190IHVidF9pbnRyX3JlYWRfY2FsbGJhY2s7Ci1zdGF0aWMgdXNiMl9jYWxsYmFja190IHVi
dF9pbnRyX3JlYWRfY2xlYXJfc3RhbGxfY2FsbGJhY2s7Ci1zdGF0aWMgdXNiMl9jYWxsYmFja190
IHVidF9idWxrX3JlYWRfY2FsbGJhY2s7Ci1zdGF0aWMgdXNiMl9jYWxsYmFja190IHVidF9idWxr
X3JlYWRfY2xlYXJfc3RhbGxfY2FsbGJhY2s7Ci1zdGF0aWMgdXNiMl9jYWxsYmFja190IHVidF9i
dWxrX3dyaXRlX2NhbGxiYWNrOwotc3RhdGljIHVzYjJfY2FsbGJhY2tfdCB1YnRfYnVsa193cml0
ZV9jbGVhcl9zdGFsbF9jYWxsYmFjazsKLXN0YXRpYyB1c2IyX2NhbGxiYWNrX3QgdWJ0X2lzb2Nf
cmVhZF9jYWxsYmFjazsKLXN0YXRpYyB1c2IyX2NhbGxiYWNrX3QgdWJ0X2lzb2Nfd3JpdGVfY2Fs
bGJhY2s7CitzdGF0aWMgaW50CXVidF9pc29jX3JlYWRfb25lX2ZyYW1lKHN0cnVjdCB1c2IyX3hm
ZXIgKiwgaW50KTsKIAotc3RhdGljIGludAl1YnRfbW9kZXZlbnQobW9kdWxlX3QsIGludCwgdm9p
ZCAqKTsKLXN0YXRpYyB2b2lkCXVidF9pbnRyX3JlYWRfY29tcGxldGUobm9kZV9wLCBob29rX3As
IHZvaWQgKiwgaW50KTsKLXN0YXRpYyB2b2lkCXVidF9idWxrX3JlYWRfY29tcGxldGUobm9kZV9w
LCBob29rX3AsIHZvaWQgKiwgaW50KTsKLXN0YXRpYyB2b2lkCXVidF9pc29jX3JlYWRfY29tcGxl
dGUobm9kZV9wLCBob29rX3AsIHZvaWQgKiwgaW50KTsKKy8qCisgKiBVU0IgY29uZmlnCisgKiAK
KyAqIFRoZSBmb2xsb3dpbmcgZGVzcmliZXMgdXNiIHRyYW5zZmVycyB0aGF0IGNvdWxkIGJlIHN1
Ym1pdHRlZCBvbiBVU0IgZGV2aWNlLgorICoKKyAqIEludGVyZmFjZSAwIG9uIHRoZSBVU0IgZGV2
aWNlIG11c3QgcHJlc2VudCB0aGUgZm9sbG93aW5nIGVuZHBvaW50cworICoJMSkgSW50ZXJydXB0
IGVuZHBvaW50IHRvIHJlY2VpdmUgSENJIGV2ZW50cworICoJMikgQnVsayBJTiBlbmRwb2ludCB0
byByZWNlaXZlIEFDTCBkYXRhCisgKgkzKSBCdWxrIE9VVCBlbmRwb2ludCB0byBzZW5kIEFDTCBk
YXRhCisgKgorICogSW50ZXJmYWNlIDEgb24gdGhlIFVTQiBkZXZpY2UgbXVzdCBwcmVzZW50IHRo
ZSBmb2xsb3dpbmcgZW5kcG9pbnRzCisgKgkxKSBJc29jaHJvbm91cyBJTiBlbmRwb2ludCB0byBy
ZWNlaXZlIFNDTyBkYXRhCisgKgkyKSBJc29jaHJvbm91cyBPVVQgZW5kcG9pbnQgdG8gc2VuZCBT
Q08gZGF0YQorICovCiAKLS8qIFVTQiBjb25maWcgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNi
Ml9jb25maWcgdWJ0X2NvbmZpZ19pZl8wW1VCVF9JRl8wX05fVFJBTlNGRVJdID0geworc3RhdGlj
IGNvbnN0IHN0cnVjdCB1c2IyX2NvbmZpZwkJdWJ0X2NvbmZpZ1tVQlRfTl9UUkFOU0ZFUl0gPQor
eworCS8qCisJICogSW50ZXJmYWNlICMwCisgCSAqLwogCi0JWzBdID0gewotCQkudHlwZSA9IFVF
X0JVTEssCi0JCS5lbmRwb2ludCA9IFVFX0FERFJfQU5ZLAotCQkuZGlyZWN0aW9uID0gVUVfRElS
X09VVCwKLQkJLm1oLmJ1ZnNpemUgPSBVQlRfQlVMS19XUklURV9CVUZGRVJfU0laRSwKLQkJLm1o
LmZsYWdzID0gey5waXBlX2JvZiA9IDEsfSwKLQkJLm1oLmNhbGxiYWNrID0gJnVidF9idWxrX3dy
aXRlX2NhbGxiYWNrLAorCS8qIE91dGdvaW5nIGJ1bGsgdHJhbnNmZXIgLSBBQ0wgcGFja2V0cyAq
LworCVtVQlRfSUZfMF9CVUxLX0RUX1dSXSA9IHsKKwkJLnR5cGUgPQkJVUVfQlVMSywKKwkJLmVu
ZHBvaW50ID0JVUVfQUREUl9BTlksCisJCS5kaXJlY3Rpb24gPQlVRV9ESVJfT1VULAorCQkubWgu
YnVmc2l6ZSA9CVVCVF9CVUxLX1dSSVRFX0JVRkZFUl9TSVpFLAorCQkubWguZmxhZ3MgPQl7IC5w
aXBlX2JvZiA9IDEsIH0sCisJCS5taC5jYWxsYmFjayA9CSZ1YnRfYnVsa193cml0ZV9jYWxsYmFj
aywKIAl9LAotCi0JWzFdID0gewotCQkudHlwZSA9IFVFX0JVTEssCi0JCS5lbmRwb2ludCA9IFVF
X0FERFJfQU5ZLAotCQkuZGlyZWN0aW9uID0gVUVfRElSX0lOLAotCQkubWguYnVmc2l6ZSA9IFVC
VF9CVUxLX1JFQURfQlVGRkVSX1NJWkUsCi0JCS5taC5mbGFncyA9IHsucGlwZV9ib2YgPSAxLC5z
aG9ydF94ZmVyX29rID0gMSx9LAotCQkubWguY2FsbGJhY2sgPSAmdWJ0X2J1bGtfcmVhZF9jYWxs
YmFjaywKKwkvKiBJbmNvbWluZyBidWxrIHRyYW5zZmVyIC0gQUNMIHBhY2tldHMgKi8KKwlbVUJU
X0lGXzBfQlVMS19EVF9SRF0gPSB7CisJCS50eXBlID0JCVVFX0JVTEssCisJCS5lbmRwb2ludCA9
CVVFX0FERFJfQU5ZLAorCQkuZGlyZWN0aW9uID0JVUVfRElSX0lOLAorCQkubWguYnVmc2l6ZSA9
CVVCVF9CVUxLX1JFQURfQlVGRkVSX1NJWkUsCisJCS5taC5mbGFncyA9CXsgLnBpcGVfYm9mID0g
MSwgLnNob3J0X3hmZXJfb2sgPSAxLCB9LAorCQkubWguY2FsbGJhY2sgPQkmdWJ0X2J1bGtfcmVh
ZF9jYWxsYmFjaywKIAl9LAotCi0JWzJdID0gewotCQkudHlwZSA9IFVFX0lOVEVSUlVQVCwKLQkJ
LmVuZHBvaW50ID0gVUVfQUREUl9BTlksCi0JCS5kaXJlY3Rpb24gPSBVRV9ESVJfSU4sCi0JCS5t
aC5mbGFncyA9IHsucGlwZV9ib2YgPSAxLC5zaG9ydF94ZmVyX29rID0gMSx9LAotCQkubWguYnVm
c2l6ZSA9IDB4MTEwLAkvKiBieXRlcyAqLwotCQkubWguY2FsbGJhY2sgPSAmdWJ0X2ludHJfcmVh
ZF9jYWxsYmFjaywKKwkvKiBJbmNvbWluZyBpbnRlcnJ1cHQgdHJhbnNmZXIgLSBIQ0kgZXZlbnRz
ICovCisJW1VCVF9JRl8wX0lOVFJfRFRfUkRdID0geworCQkudHlwZSA9CQlVRV9JTlRFUlJVUFQs
CisJCS5lbmRwb2ludCA9CVVFX0FERFJfQU5ZLAorCQkuZGlyZWN0aW9uID0JVUVfRElSX0lOLAor
CQkubWguZmxhZ3MgPQl7IC5waXBlX2JvZiA9IDEsIC5zaG9ydF94ZmVyX29rID0gMSwgfSwKKwkJ
Lm1oLmJ1ZnNpemUgPQlVQlRfSU5UUl9CVUZGRVJfU0laRSwKKwkJLm1oLmNhbGxiYWNrID0JJnVi
dF9pbnRyX3JlYWRfY2FsbGJhY2ssCiAJfSwKLQotCVszXSA9IHsKLQkJLnR5cGUgPSBVRV9DT05U
Uk9MLAotCQkuZW5kcG9pbnQgPSAweDAwLAkvKiBDb250cm9sIHBpcGUgKi8KLQkJLmRpcmVjdGlv
biA9IFVFX0RJUl9BTlksCi0JCS5taC5idWZzaXplID0gKHNpemVvZihzdHJ1Y3QgdXNiMl9kZXZp
Y2VfcmVxdWVzdCkgKyBVQlRfQ1RSTF9CVUZGRVJfU0laRSksCi0JCS5taC5jYWxsYmFjayA9ICZ1
YnRfY3RybF93cml0ZV9jYWxsYmFjaywKLQkJLm1oLnRpbWVvdXQgPSA1MDAwLAkvKiA1IHNlY29u
ZHMgKi8KKwkvKiBPdXRnb2luZyBjb250cm9sIHRyYW5zZmVyIC0gSENJIGNvbW1hbmRzICovCisJ
W1VCVF9JRl8wX0NUUkxfRFRfV1JdID0geworCQkudHlwZSA9CQlVRV9DT05UUk9MLAorCQkuZW5k
cG9pbnQgPQkweDAwLAkvKiBjb250cm9sIHBpcGUgKi8KKwkJLmRpcmVjdGlvbiA9CVVFX0RJUl9B
TlksCisJCS5taC5idWZzaXplID0JVUJUX0NUUkxfQlVGRkVSX1NJWkUsCisJCS5taC5jYWxsYmFj
ayA9CSZ1YnRfY3RybF93cml0ZV9jYWxsYmFjaywKKwkJLm1oLnRpbWVvdXQgPQk1MDAwLAkvKiA1
IHNlY29uZHMgKi8KIAl9LAotCi0JWzRdID0gewotCQkudHlwZSA9IFVFX0NPTlRST0wsCi0JCS5l
bmRwb2ludCA9IDB4MDAsCS8qIENvbnRyb2wgcGlwZSAqLwotCQkuZGlyZWN0aW9uID0gVUVfRElS
X0FOWSwKLQkJLm1oLmJ1ZnNpemUgPSBzaXplb2Yoc3RydWN0IHVzYjJfZGV2aWNlX3JlcXVlc3Qp
LAotCQkubWguY2FsbGJhY2sgPSAmdWJ0X2J1bGtfd3JpdGVfY2xlYXJfc3RhbGxfY2FsbGJhY2ss
Ci0JCS5taC50aW1lb3V0ID0gMTAwMCwJLyogMSBzZWNvbmQgKi8KLQkJLm1oLmludGVydmFsID0g
NTAsCS8qIDUwbXMgKi8KKwkvKiBPdXRnb2luZyBjb250cm9sIHRyYW5zZmVyIHRvIGNsZWFyIHN0
YWxsIG9uIG91dGdvaW5nIGJ1bGsgdHJhbnNmZXIgKi8KKwlbVUJUX0lGXzBfQlVMS19DU19XUl0g
PSB7CisJCS50eXBlID0JCVVFX0NPTlRST0wsCisJCS5lbmRwb2ludCA9CTB4MDAsCS8qIGNvbnRy
b2wgcGlwZSAqLworCQkuZGlyZWN0aW9uID0JVUVfRElSX0FOWSwKKwkJLm1oLmJ1ZnNpemUgPQlz
aXplb2Yoc3RydWN0IHVzYjJfZGV2aWNlX3JlcXVlc3QpLAorCQkubWguY2FsbGJhY2sgPQkmdWJ0
X2J1bGtfd3JpdGVfY2xlYXJfc3RhbGxfY2FsbGJhY2ssCisJCS5taC50aW1lb3V0ID0JMTAwMCwJ
LyogMSBzZWNvbmQgKi8KKwkJLm1oLmludGVydmFsID0JNTAsCS8qIDUwbXMgKi8KIAl9LAotCi0J
WzVdID0gewotCQkudHlwZSA9IFVFX0NPTlRST0wsCi0JCS5lbmRwb2ludCA9IDB4MDAsCS8qIENv
bnRyb2wgcGlwZSAqLwotCQkuZGlyZWN0aW9uID0gVUVfRElSX0FOWSwKLQkJLm1oLmJ1ZnNpemUg
PSBzaXplb2Yoc3RydWN0IHVzYjJfZGV2aWNlX3JlcXVlc3QpLAotCQkubWguY2FsbGJhY2sgPSAm
dWJ0X2J1bGtfcmVhZF9jbGVhcl9zdGFsbF9jYWxsYmFjaywKLQkJLm1oLnRpbWVvdXQgPSAxMDAw
LAkvKiAxIHNlY29uZCAqLwotCQkubWguaW50ZXJ2YWwgPSA1MCwJLyogNTBtcyAqLworCS8qIE91
dGdvaW5nIGNvbnRyb2wgdHJhbnNmZXIgdG8gY2xlYXIgc3RhbGwgb24gaW5jb21pbmcgYnVsayB0
cmFuc2ZlciAqLworCVtVQlRfSUZfMF9CVUxLX0NTX1JEXSA9IHsKKwkJLnR5cGUgPQkJVUVfQ09O
VFJPTCwKKwkJLmVuZHBvaW50ID0JMHgwMCwJLyogY29udHJvbCBwaXBlICovCisJCS5kaXJlY3Rp
b24gPQlVRV9ESVJfQU5ZLAorCQkubWguYnVmc2l6ZSA9CXNpemVvZihzdHJ1Y3QgdXNiMl9kZXZp
Y2VfcmVxdWVzdCksCisJCS5taC5jYWxsYmFjayA9CSZ1YnRfYnVsa19yZWFkX2NsZWFyX3N0YWxs
X2NhbGxiYWNrLAorCQkubWgudGltZW91dCA9CTEwMDAsCS8qIDEgc2Vjb25kICovCisJCS5taC5p
bnRlcnZhbCA9CTUwLAkvKiA1MG1zICovCiAJfSwKLQotCVs2XSA9IHsKLQkJLnR5cGUgPSBVRV9D
T05UUk9MLAotCQkuZW5kcG9pbnQgPSAweDAwLAkvKiBDb250cm9sIHBpcGUgKi8KLQkJLmRpcmVj
dGlvbiA9IFVFX0RJUl9BTlksCi0JCS5taC5idWZzaXplID0gc2l6ZW9mKHN0cnVjdCB1c2IyX2Rl
dmljZV9yZXF1ZXN0KSwKLQkJLm1oLmNhbGxiYWNrID0gJnVidF9pbnRyX3JlYWRfY2xlYXJfc3Rh
bGxfY2FsbGJhY2ssCi0JCS5taC50aW1lb3V0ID0gMTAwMCwJLyogMSBzZWNvbmQgKi8KLQkJLm1o
LmludGVydmFsID0gNTAsCS8qIDUwbXMgKi8KKwkvKgorCSAqIE91dGdvaW5nIGNvbnRyb2wgdHJh
bnNmZXIgdG8gY2xlYXIgc3RhbGwgb24gaW5jb21pbmcKKwkgKiBpbnRlcnJ1cHQgdHJhbnNmZXIK
KwkgKi8KKwlbVUJUX0lGXzBfSU5UUl9DU19SRF0gPSB7CisJCS50eXBlID0JCVVFX0NPTlRST0ws
CisJCS5lbmRwb2ludCA9CTB4MDAsCS8qIGNvbnRyb2wgcGlwZSAqLworCQkuZGlyZWN0aW9uID0J
VUVfRElSX0FOWSwKKwkJLm1oLmJ1ZnNpemUgPQlzaXplb2Yoc3RydWN0IHVzYjJfZGV2aWNlX3Jl
cXVlc3QpLAorCQkubWguY2FsbGJhY2sgPQkmdWJ0X2ludHJfcmVhZF9jbGVhcl9zdGFsbF9jYWxs
YmFjaywKKwkJLm1oLnRpbWVvdXQgPQkxMDAwLAkvKiAxIHNlY29uZCAqLworCQkubWguaW50ZXJ2
YWwgPQk1MCwJLyogNTBtcyAqLwogCX0sCi19OwogCi0vKiBVU0IgY29uZmlnICovCi1zdGF0aWMg
Y29uc3Qgc3RydWN0IHVzYjJfY29uZmlnCi0JdWJ0X2NvbmZpZ19pZl8xX2Z1bGxfc3BlZWRbVUJU
X0lGXzFfTl9UUkFOU0ZFUl0gPSB7CisJLyoKKwkgKiBJbnRlcmZhY2UgIzEKKyAJICovCiAKLQlb
MF0gPSB7Ci0JCS50eXBlID0gVUVfSVNPQ0hST05PVVMsCi0JCS5lbmRwb2ludCA9IFVFX0FERFJf
QU5ZLAotCQkuZGlyZWN0aW9uID0gVUVfRElSX0lOLAotCQkubWguYnVmc2l6ZSA9IDAsCS8qIHVz
ZSAid01heFBhY2tldFNpemUgKiBmcmFtZXMiICovCi0JCS5taC5mcmFtZXMgPSBVQlRfSVNPQ19O
RlJBTUVTLAotCQkubWguZmxhZ3MgPSB7LnNob3J0X3hmZXJfb2sgPSAxLH0sCi0JCS5taC5jYWxs
YmFjayA9ICZ1YnRfaXNvY19yZWFkX2NhbGxiYWNrLAorCS8qIEluY29taW5nIGlzb2Nocm9ub3Vz
IHRyYW5zZmVyICMxIC0gU0NPIHBhY2tldHMgKi8KKwlbVUJUX0lGXzFfSVNPQ19EVF9SRDFdID0g
eworCQkudHlwZSA9CQlVRV9JU09DSFJPTk9VUywKKwkJLmVuZHBvaW50ID0JVUVfQUREUl9BTlks
CisJCS5kaXJlY3Rpb24gPQlVRV9ESVJfSU4sCisJCS5taC5idWZzaXplID0JMCwJLyogdXNlICJ3
TWF4UGFja2V0U2l6ZSAqIGZyYW1lcyIgKi8KKwkJLm1oLmZyYW1lcyA9CVVCVF9JU09DX05GUkFN
RVMsCisJCS5taC5mbGFncyA9CXsgLnNob3J0X3hmZXJfb2sgPSAxLCB9LAorCQkubWguY2FsbGJh
Y2sgPQkmdWJ0X2lzb2NfcmVhZF9jYWxsYmFjaywKIAl9LAotCi0JWzFdID0gewotCQkudHlwZSA9
IFVFX0lTT0NIUk9OT1VTLAotCQkuZW5kcG9pbnQgPSBVRV9BRERSX0FOWSwKLQkJLmRpcmVjdGlv
biA9IFVFX0RJUl9JTiwKLQkJLm1oLmJ1ZnNpemUgPSAwLAkvKiB1c2UgIndNYXhQYWNrZXRTaXpl
ICogZnJhbWVzIiAqLwotCQkubWguZnJhbWVzID0gVUJUX0lTT0NfTkZSQU1FUywKLQkJLm1oLmZs
YWdzID0gey5zaG9ydF94ZmVyX29rID0gMSx9LAotCQkubWguY2FsbGJhY2sgPSAmdWJ0X2lzb2Nf
cmVhZF9jYWxsYmFjaywKKwkvKiBJbmNvbWluZyBpc29jaHJvbm91cyB0cmFuc2ZlciAjMiAtIFND
TyBwYWNrZXRzICovCisJW1VCVF9JRl8xX0lTT0NfRFRfUkQyXSA9IHsKKwkJLnR5cGUgPQkJVUVf
SVNPQ0hST05PVVMsCisJCS5lbmRwb2ludCA9CVVFX0FERFJfQU5ZLAorCQkuZGlyZWN0aW9uID0J
VUVfRElSX0lOLAorCQkubWguYnVmc2l6ZSA9CTAsCS8qIHVzZSAid01heFBhY2tldFNpemUgKiBm
cmFtZXMiICovCisJCS5taC5mcmFtZXMgPQlVQlRfSVNPQ19ORlJBTUVTLAorCQkubWguZmxhZ3Mg
PQl7IC5zaG9ydF94ZmVyX29rID0gMSwgfSwKKwkJLm1oLmNhbGxiYWNrID0JJnVidF9pc29jX3Jl
YWRfY2FsbGJhY2ssCiAJfSwKLQotCVsyXSA9IHsKLQkJLnR5cGUgPSBVRV9JU09DSFJPTk9VUywK
LQkJLmVuZHBvaW50ID0gVUVfQUREUl9BTlksCi0JCS5kaXJlY3Rpb24gPSBVRV9ESVJfT1VULAot
CQkubWguYnVmc2l6ZSA9IDAsCS8qIHVzZSAid01heFBhY2tldFNpemUgKiBmcmFtZXMiICovCi0J
CS5taC5mcmFtZXMgPSBVQlRfSVNPQ19ORlJBTUVTLAotCQkubWguZmxhZ3MgPSB7LnNob3J0X3hm
ZXJfb2sgPSAxLH0sCi0JCS5taC5jYWxsYmFjayA9ICZ1YnRfaXNvY193cml0ZV9jYWxsYmFjaywK
KwkvKiBPdXRnb2luZyBpc29jaHJvbm91cyB0cmFuc2ZlciAjMSAtIFNDTyBwYWNrZXRzICovCisJ
W1VCVF9JRl8xX0lTT0NfRFRfV1IxXSA9IHsKKwkJLnR5cGUgPQkJVUVfSVNPQ0hST05PVVMsCisJ
CS5lbmRwb2ludCA9CVVFX0FERFJfQU5ZLAorCQkuZGlyZWN0aW9uID0JVUVfRElSX09VVCwKKwkJ
Lm1oLmJ1ZnNpemUgPQkwLAkvKiB1c2UgIndNYXhQYWNrZXRTaXplICogZnJhbWVzIiAqLworCQku
bWguZnJhbWVzID0JVUJUX0lTT0NfTkZSQU1FUywKKwkJLm1oLmZsYWdzID0JeyAuc2hvcnRfeGZl
cl9vayA9IDEsIH0sCisJCS5taC5jYWxsYmFjayA9CSZ1YnRfaXNvY193cml0ZV9jYWxsYmFjaywK
IAl9LAotCi0JWzNdID0gewotCQkudHlwZSA9IFVFX0lTT0NIUk9OT1VTLAotCQkuZW5kcG9pbnQg
PSBVRV9BRERSX0FOWSwKLQkJLmRpcmVjdGlvbiA9IFVFX0RJUl9PVVQsCi0JCS5taC5idWZzaXpl
ID0gMCwJLyogdXNlICJ3TWF4UGFja2V0U2l6ZSAqIGZyYW1lcyIgKi8KLQkJLm1oLmZyYW1lcyA9
IFVCVF9JU09DX05GUkFNRVMsCi0JCS5taC5mbGFncyA9IHsuc2hvcnRfeGZlcl9vayA9IDEsfSwK
LQkJLm1oLmNhbGxiYWNrID0gJnVidF9pc29jX3dyaXRlX2NhbGxiYWNrLAorCS8qIE91dGdvaW5n
IGlzb2Nocm9ub3VzIHRyYW5zZmVyICMyIC0gU0NPIHBhY2tldHMgKi8KKwlbVUJUX0lGXzFfSVNP
Q19EVF9XUjJdID0geworCQkudHlwZSA9CQlVRV9JU09DSFJPTk9VUywKKwkJLmVuZHBvaW50ID0J
VUVfQUREUl9BTlksCisJCS5kaXJlY3Rpb24gPQlVRV9ESVJfT1VULAorCQkubWguYnVmc2l6ZSA9
CTAsCS8qIHVzZSAid01heFBhY2tldFNpemUgKiBmcmFtZXMiICovCisJCS5taC5mcmFtZXMgPQlV
QlRfSVNPQ19ORlJBTUVTLAorCQkubWguZmxhZ3MgPQl7IC5zaG9ydF94ZmVyX29rID0gMSwgfSwK
KwkJLm1oLmNhbGxiYWNrID0JJnVidF9pc29jX3dyaXRlX2NhbGxiYWNrLAogCX0sCiB9OwogCi0v
KiBVU0IgY29uZmlnICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHVzYjJfY29uZmlnCi0JdWJ0X2Nv
bmZpZ19pZl8xX2hpZ2hfc3BlZWRbVUJUX0lGXzFfTl9UUkFOU0ZFUl0gPSB7Ci0KLQlbMF0gPSB7
Ci0JCS50eXBlID0gVUVfSVNPQ0hST05PVVMsCi0JCS5lbmRwb2ludCA9IFVFX0FERFJfQU5ZLAot
CQkuZGlyZWN0aW9uID0gVUVfRElSX0lOLAotCQkubWguYnVmc2l6ZSA9IDAsCS8qIHVzZSAid01h
eFBhY2tldFNpemUgKiBmcmFtZXMiICovCi0JCS5taC5mcmFtZXMgPSBVQlRfSVNPQ19ORlJBTUVT
ICogOCwKLQkJLm1oLmZsYWdzID0gey5zaG9ydF94ZmVyX29rID0gMSx9LAotCQkubWguY2FsbGJh
Y2sgPSAmdWJ0X2lzb2NfcmVhZF9jYWxsYmFjaywKLQl9LAotCi0JWzFdID0gewotCQkudHlwZSA9
IFVFX0lTT0NIUk9OT1VTLAotCQkuZW5kcG9pbnQgPSBVRV9BRERSX0FOWSwKLQkJLmRpcmVjdGlv
biA9IFVFX0RJUl9JTiwKLQkJLm1oLmJ1ZnNpemUgPSAwLAkvKiB1c2UgIndNYXhQYWNrZXRTaXpl
ICogZnJhbWVzIiAqLwotCQkubWguZnJhbWVzID0gVUJUX0lTT0NfTkZSQU1FUyAqIDgsCi0JCS5t
aC5mbGFncyA9IHsuc2hvcnRfeGZlcl9vayA9IDEsfSwKLQkJLm1oLmNhbGxiYWNrID0gJnVidF9p
c29jX3JlYWRfY2FsbGJhY2ssCi0JfSwKLQotCVsyXSA9IHsKLQkJLnR5cGUgPSBVRV9JU09DSFJP
Tk9VUywKLQkJLmVuZHBvaW50ID0gVUVfQUREUl9BTlksCi0JCS5kaXJlY3Rpb24gPSBVRV9ESVJf
T1VULAotCQkubWguYnVmc2l6ZSA9IDAsCS8qIHVzZSAid01heFBhY2tldFNpemUgKiBmcmFtZXMi
ICovCi0JCS5taC5mcmFtZXMgPSBVQlRfSVNPQ19ORlJBTUVTICogOCwKLQkJLm1oLmZsYWdzID0g
ey5zaG9ydF94ZmVyX29rID0gMSx9LAotCQkubWguY2FsbGJhY2sgPSAmdWJ0X2lzb2Nfd3JpdGVf
Y2FsbGJhY2ssCi0JfSwKLQotCVszXSA9IHsKLQkJLnR5cGUgPSBVRV9JU09DSFJPTk9VUywKLQkJ
LmVuZHBvaW50ID0gVUVfQUREUl9BTlksCi0JCS5kaXJlY3Rpb24gPSBVRV9ESVJfT1VULAotCQku
bWguYnVmc2l6ZSA9IDAsCS8qIHVzZSAid01heFBhY2tldFNpemUgKiBmcmFtZXMiICovCi0JCS5t
aC5mcmFtZXMgPSBVQlRfSVNPQ19ORlJBTUVTICogOCwKLQkJLm1oLmZsYWdzID0gey5zaG9ydF94
ZmVyX29rID0gMSx9LAotCQkubWguY2FsbGJhY2sgPSAmdWJ0X2lzb2Nfd3JpdGVfY2FsbGJhY2ss
Ci0JfSwKLX07Ci0KIC8qCi0gKiBNb2R1bGUKLSAqLwotCi1EUklWRVJfTU9EVUxFKG5nX3VidCwg
dXNodWIsIHVidF9kcml2ZXIsIHVidF9kZXZjbGFzcywgdWJ0X21vZGV2ZW50LCAwKTsKLU1PRFVM
RV9WRVJTSU9OKG5nX3VidCwgTkdfQkxVRVRPT1RIX1ZFUlNJT04pOwotTU9EVUxFX0RFUEVORChu
Z191YnQsIG5ldGdyYXBoLCBOR19BQklfVkVSU0lPTiwgTkdfQUJJX1ZFUlNJT04sIE5HX0FCSV9W
RVJTSU9OKTsKLU1PRFVMRV9ERVBFTkQobmdfdWJ0LCBuZ19oY2ksIE5HX0JMVUVUT09USF9WRVJT
SU9OLCBOR19CTFVFVE9PVEhfVkVSU0lPTiwgTkdfQkxVRVRPT1RIX1ZFUlNJT04pOwotTU9EVUxF
X0RFUEVORChuZ191YnQsIHVzYjJfYmx1ZXRvb3RoLCAxLCAxLCAxKTsKLU1PRFVMRV9ERVBFTkQo
bmdfdWJ0LCB1c2IyX2NvcmUsIDEsIDEsIDEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioKLSAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQiBz
cGVjaWZpYwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0v
KgotICogTG9hZC9VbmxvYWQgdGhlIGRyaXZlciBtb2R1bGUKLSAqLwotCi1zdGF0aWMgaW50Ci11
YnRfbW9kZXZlbnQobW9kdWxlX3QgbW9kLCBpbnQgZXZlbnQsIHZvaWQgKmRhdGEpCi17Ci0JaW50
IGVycm9yOwotCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgTU9EX0xPQUQ6Ci0JCWVycm9yID0g
bmdfbmV3dHlwZSgmdHlwZXN0cnVjdCk7Ci0JCWlmIChlcnJvciAhPSAwKSB7Ci0JCQlwcmludGYo
IiVzOiBDb3VsZCBub3QgcmVnaXN0ZXIgIgotCQkJICAgICJOZXRncmFwaCBub2RlIHR5cGUsIGVy
cm9yPSVkXG4iLAotCQkJICAgIE5HX1VCVF9OT0RFX1RZUEUsIGVycm9yKTsKLQkJfQotCQlicmVh
azsKLQotCWNhc2UgTU9EX1VOTE9BRDoKLQkJZXJyb3IgPSBuZ19ybXR5cGUoJnR5cGVzdHJ1Y3Qp
OwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWVycm9yID0gRU9QTk9UU1VQUDsKLQkJYnJlYWs7
Ci0JfQotCXJldHVybiAoZXJyb3IpOwotfQkJCQkJLyogdWJ0X21vZGV2ZW50ICovCi0KLS8qCiAg
KiBJZiBmb3Igc29tZSByZWFzb24gZGV2aWNlIHNob3VsZCBub3QgYmUgYXR0YWNoZWQgdGhlbiBw
dXQKICAqIFZlbmRvcklEL1Byb2R1Y3RJRCBwYWlyIGludG8gdGhlIGxpc3QgYmVsb3cuIFRoZSBm
b3JtYXQgaXMKICAqIGFzIGZvbGxvd3M6CiAgKgotICoJeyBWRU5ET1JfSUQsIFBST0RVQ1RfSUQg
fSwKKyAqCXsgVVNCX1ZQSShWRU5ET1JfSUQsIFBST0RVQ1RfSUQsIDApIH0sCiAgKgogICogd2hl
cmUgVkVORE9SX0lEIGFuZCBQUk9EVUNUX0lEIGFyZSBoZXggbnVtYmVycy4KICAqLwogc3RhdGlj
IGNvbnN0IHN0cnVjdCB1c2IyX2RldmljZV9pZCB1YnRfaWdub3JlX2RldnNbXSA9IHsKIAkvKiBB
Vk0gVVNCIEJsdWV0b290aC1BZGFwdGVyIEJsdWVGcml0eiEgdjEuMCAqLwotCXtVU0JfVlBJKFVT
Ql9WRU5ET1JfQVZNLCAweDIyMDAsIDApfSwKKwl7IFVTQl9WUEkoVVNCX1ZFTkRPUl9BVk0sIDB4
MjIwMCwgMCkgfSwKIH07CiAKIC8qIExpc3Qgb2Ygc3VwcG9ydGVkIGJsdWV0b290aCBkZXZpY2Vz
ICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYjJfZGV2aWNlX2lkIHVidF9kZXZzW10gPSB7Ci0J
LyogR2VuZXJpYyBCbHVldG9vdGggY2xhc3MgZGV2aWNlcy4gKi8KLQl7VVNCX0lGQUNFX0NMQVNT
KFVEQ0xBU1NfV0lSRUxFU1MpLAotCQlVU0JfSUZBQ0VfU1VCQ0xBU1MoVURTVUJDTEFTU19SRiks
Ci0JVVNCX0lGQUNFX1BST1RPQ09MKFVEUFJPVE9fQkxVRVRPT1RIKX0sCisJLyogR2VuZXJpYyBC
bHVldG9vdGggY2xhc3MgZGV2aWNlcyAqLworCXsgVVNCX0lGQUNFX0NMQVNTKFVEQ0xBU1NfV0lS
RUxFU1MpLAorCSAgVVNCX0lGQUNFX1NVQkNMQVNTKFVEU1VCQ0xBU1NfUkYpLAorCSAgVVNCX0lG
QUNFX1BST1RPQ09MKFVEUFJPVE9fQkxVRVRPT1RIKSB9LAogCiAJLyogQVZNIFVTQiBCbHVldG9v
dGgtQWRhcHRlciBCbHVlRnJpdHohIHYyLjAgKi8KLQl7VVNCX1ZQSShVU0JfVkVORE9SX0FWTSwg
MHgzODAwLCAwKX0sCisJeyBVU0JfVlBJKFVTQl9WRU5ET1JfQVZNLCAweDM4MDAsIDApIH0sCiB9
OwogCiAvKgotICogUHJvYmUgZm9yIGEgVVNCIEJsdWV0b290aCBkZXZpY2UKKyAqIFByb2JlIGZv
ciBhIFVTQiBCbHVldG9vdGggZGV2aWNlLgorICogVVNCIGNvbnRleHQuCiAgKi8KIAogc3RhdGlj
IGludAogdWJ0X3Byb2JlKGRldmljZV90IGRldikKIHsKLQlzdHJ1Y3QgdXNiMl9hdHRhY2hfYXJn
ICp1YWEgPSBkZXZpY2VfZ2V0X2l2YXJzKGRldik7CisJc3RydWN0IHVzYjJfYXR0YWNoX2FyZwkq
dWFhID0gZGV2aWNlX2dldF9pdmFycyhkZXYpOwogCi0JaWYgKHVhYS0+dXNiMl9tb2RlICE9IFVT
Ql9NT0RFX0hPU1QpIHsKKwlpZiAodWFhLT51c2IyX21vZGUgIT0gVVNCX01PREVfSE9TVCkKIAkJ
cmV0dXJuIChFTlhJTyk7Ci0JfQotCWlmICh1YWEtPmluZm8uYklmYWNlSW5kZXggIT0gMCkgewor
CisJaWYgKHVhYS0+aW5mby5iSWZhY2VJbmRleCAhPSAwKQogCQlyZXR1cm4gKEVOWElPKTsKLQl9
CisKIAlpZiAodXNiMl9sb29rdXBfaWRfYnlfdWFhKHVidF9pZ25vcmVfZGV2cywKLQkgICAgc2l6
ZW9mKHVidF9pZ25vcmVfZGV2cyksIHVhYSkgPT0gMCkgeworCQkJc2l6ZW9mKHVidF9pZ25vcmVf
ZGV2cyksIHVhYSkgPT0gMCkKIAkJcmV0dXJuIChFTlhJTyk7Ci0JfQorCiAJcmV0dXJuICh1c2Iy
X2xvb2t1cF9pZF9ieV91YWEodWJ0X2RldnMsIHNpemVvZih1YnRfZGV2cyksIHVhYSkpOwotfQor
fSAvKiB1YnRfcHJvYmUgKi8KIAogLyoKLSAqIEF0dGFjaCB0aGUgZGV2aWNlCisgKiBBdHRhY2gg
dGhlIGRldmljZS4KKyAqIFVTQiBjb250ZXh0LgogICovCiAKIHN0YXRpYyBpbnQKIHVidF9hdHRh
Y2goZGV2aWNlX3QgZGV2KQogewotCXN0cnVjdCB1c2IyX2F0dGFjaF9hcmcgKnVhYSA9IGRldmlj
ZV9nZXRfaXZhcnMoZGV2KTsKLQlzdHJ1Y3QgdWJ0X3NvZnRjICpzYyA9IGRldmljZV9nZXRfc29m
dGMoZGV2KTsKLQljb25zdCBzdHJ1Y3QgdXNiMl9jb25maWcgKmlzb2Nfc2V0dXA7Ci0Jc3RydWN0
IHVzYjJfZW5kcG9pbnRfZGVzY3JpcHRvciAqZWQ7Ci0JdWludDE2X3Qgd01heFBhY2tldFNpemU7
Ci0JdWludDhfdCBhbHRfaW5kZXg7Ci0JdWludDhfdCBpZmFjZV9pbmRleDsKLQl1aW50OF90IGk7
Ci0JdWludDhfdCBqOworCXN0cnVjdCB1c2IyX2F0dGFjaF9hcmcJCSp1YWEgPSBkZXZpY2VfZ2V0
X2l2YXJzKGRldik7CisJc3RydWN0IHVidF9zb2Z0YwkJKnNjID0gZGV2aWNlX2dldF9zb2Z0Yyhk
ZXYpOworCXN0cnVjdCB1c2IyX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmVkOworCXVpbnQxNl90CQkJ
d01heFBhY2tldFNpemU7CisJdWludDhfdAkJCQlhbHRfaW5kZXgsIGlmYWNlX2luZGV4LCBpLCBq
OwogCiAJZGV2aWNlX3NldF91c2IyX2Rlc2MoZGV2KTsKIAogCXNucHJpbnRmKHNjLT5zY19uYW1l
LCBzaXplb2Yoc2MtPnNjX25hbWUpLAotCSAgICAiJXMiLCBkZXZpY2VfZ2V0X25hbWV1bml0KGRl
dikpOworCQkiJXMiLCBkZXZpY2VfZ2V0X25hbWV1bml0KGRldikpOwogCisJLyogCisJICogQ3Jl
YXRlIE5ldGdyYXBoIG5vZGUKKwkgKi8KKworCXNjLT5zY19ob29rID0gTlVMTDsKKworCWlmIChu
Z19tYWtlX25vZGVfY29tbW9uKCZ0eXBlc3RydWN0LCAmc2MtPnNjX25vZGUpICE9IDApIHsKKwkJ
ZGV2aWNlX3ByaW50ZihkZXYsICJjb3VsZCBub3QgY3JlYXRlIE5ldGdyYXBoIG5vZGVcbiIpOwor
CQlyZXR1cm4gKEVOWElPKTsKKwl9CisKKwkvKiBOYW1lIE5ldGdyYXBoIG5vZGUgKi8KKwlpZiAo
bmdfbmFtZV9ub2RlKHNjLT5zY19ub2RlLCBzYy0+c2NfbmFtZSkgIT0gMCkgeworCQlkZXZpY2Vf
cHJpbnRmKGRldiwgImNvdWxkIG5vdCBuYW1lIE5ldGdyYXBoIG5vZGVcbiIpOworCQlOR19OT0RF
X1VOUkVGKHNjLT5zY19ub2RlKTsKKwkJcmV0dXJuIChFTlhJTyk7CisJfQorCU5HX05PREVfU0VU
X1BSSVZBVEUoc2MtPnNjX25vZGUsIHNjKTsKKwlOR19OT0RFX0ZPUkNFX1dSSVRFUihzYy0+c2Nf
bm9kZSk7CisKIAkvKgogCSAqIEluaXRpYWxpemUgZGV2aWNlIHNvZnRjIHN0cnVjdHVyZQogCSAq
LwpAQCAtNDgxLDM0ICs0ODQsMjggQEAKIAkvKiBzdGF0ZSAqLwogCXNjLT5zY19kZWJ1ZyA9IE5H
X1VCVF9XQVJOX0xFVkVMOwogCXNjLT5zY19mbGFncyA9IDA7Ci0JTkdfVUJUX1NUQVRfUkVTRVQo
c2MtPnNjX3N0YXQpOworCVVCVF9TVEFUX1JFU0VUKHNjKTsKIAotCS8qIGNvbnRyb2wgcGlwZSAq
LworCS8qIGluaXRpYWxpemUgbG9ja3MgKi8KKwltdHhfaW5pdCgmc2MtPnNjX21idWZxX210eCwg
InVidCBtYnVmcSIsIE5VTEwsIE1UWF9ERUYpOworCW10eF9pbml0KCZzYy0+c2NfaWZfbXR4WzBd
LCAidWJ0IGlmMCIsIE5VTEwsIE1UWF9ERUYgfCBNVFhfUkVDVVJTRSk7CisJbXR4X2luaXQoJnNj
LT5zY19pZl9tdHhbMV0sICJ1YnQgaWYxIiwgTlVMTCwgTVRYX0RFRiB8IE1UWF9SRUNVUlNFKTsK
KworCS8qIGluaXRpYWxpemUgcGFja2V0IHF1ZXVlcyAqLwogCU5HX0JUX01CVUZRX0lOSVQoJnNj
LT5zY19jbWRxLCBVQlRfREVGQVVMVF9RTEVOKTsKLQotCS8qIGJ1bGstb3V0IHBpcGUgKi8KIAlO
R19CVF9NQlVGUV9JTklUKCZzYy0+c2NfYWNscSwgVUJUX0RFRkFVTFRfUUxFTik7CisJTkdfQlRf
TUJVRlFfSU5JVCgmc2MtPnNjX3Njb3EsIFVCVF9ERUZBVUxUX1FMRU4pOwogCi0JLyogaXNvYy1v
dXQgcGlwZSAqLwotCU5HX0JUX01CVUZRX0lOSVQoJnNjLT5zY19zY29xLAotCSAgICAodXNiMl9n
ZXRfc3BlZWQodWFhLT5kZXZpY2UpID09IFVTQl9TUEVFRF9ISUdIKSA/Ci0JICAgICgyICogVUJU
X0lTT0NfTkZSQU1FUyAqIDgpIDoKLQkgICAgKDIgKiBVQlRfSVNPQ19ORlJBTUVTKSk7CisJLyog
aW5pdGlhbGl6ZSBnbHVlIHRhc2sgKi8KKwlzYy0+c2NfdGFza19mbGFncyA9IDA7CisJVEFTS19J
TklUKCZzYy0+c2NfdGFzaywgMCwgdWJ0X3Rhc2ssIHNjLT5zY19ub2RlKTsKIAotCS8qIGlzb2Mt
aW4gcGlwZSAqLwotCU5HX0JUX01CVUZRX0lOSVQoJnNjLT5zY19zY2lxLAotCSAgICAodXNiMl9n
ZXRfc3BlZWQodWFhLT5kZXZpY2UpID09IFVTQl9TUEVFRF9ISUdIKSA/Ci0JICAgICgyICogVUJU
X0lTT0NfTkZSQU1FUyAqIDgpIDoKLQkgICAgKDIgKiBVQlRfSVNPQ19ORlJBTUVTKSk7Ci0KLQkv
KiBuZXRncmFwaCBwYXJ0ICovCi0Jc2MtPnNjX25vZGUgPSBOVUxMOwotCXNjLT5zY19ob29rID0g
TlVMTDsKLQogCS8qCiAJICogQ29uZmlndXJlIEJsdWV0b290aCBVU0IgZGV2aWNlLiBEaXNjb3Zl
ciBhbGwgcmVxdWlyZWQgVVNCCiAJICogaW50ZXJmYWNlcyBhbmQgZW5kcG9pbnRzLgogCSAqCisJ
ICogRGV2aWNlIGlzIGV4cGVjdGVkIHRvIGJlIGEgaGlnaC1zcGVlZCBkZXZpY2UuCisJICoKIAkg
KiBVU0IgZGV2aWNlIG11c3QgcHJlc2VudCB0d28gaW50ZXJmYWNlczoKIAkgKiAxKSBJbnRlcmZh
Y2UgMCB0aGF0IGhhcyAzIGVuZHBvaW50cwogCSAqCTEpIEludGVycnVwdCBlbmRwb2ludCB0byBy
ZWNlaXZlIEhDSSBldmVudHMKQEAgLTUyMywxMDAzICs1MjAsMTEzNCBAQAogCSAqIGNvbmZpZ3Vy
YXRpb25zIHdpdGggZGlmZmVyZW50IHBhY2tldCBzaXplLgogCSAqLwogCisJYnplcm8oJnNjLT5z
Y194ZmVyLCBzaXplb2Yoc2MtPnNjX3hmZXIpKTsKKwogCS8qCiAJICogSW50ZXJmYWNlIDAKIAkg
Ki8KIAotCW10eF9pbml0KCZzYy0+c2NfbXR4LCAidWJ0IGxvY2siLCBOVUxMLCBNVFhfREVGIHwg
TVRYX1JFQ1VSU0UpOwotCiAJaWZhY2VfaW5kZXggPSAwOwotCWlmICh1c2IyX3RyYW5zZmVyX3Nl
dHVwCi0JICAgICh1YWEtPmRldmljZSwgJmlmYWNlX2luZGV4LCBzYy0+c2NfeGZlcl9pZl8wLCB1
YnRfY29uZmlnX2lmXzAsCi0JICAgIFVCVF9JRl8wX05fVFJBTlNGRVIsIHNjLCAmc2MtPnNjX210
eCkpIHsKLQkJZGV2aWNlX3ByaW50ZihkZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgdHJhbnNmZXJz
ICIKLQkJICAgICJmb3IgaW50ZXJmYWNlIDAhXG4iKTsKKwlpZiAodXNiMl90cmFuc2Zlcl9zZXR1
cCh1YWEtPmRldmljZSwgJmlmYWNlX2luZGV4LCBzYy0+c2NfeGZlciwKKwkJCXVidF9jb25maWcs
IFVCVF9JRl8wX05fVFJBTlNGRVIsCisJCQlzYy0+c2Nfbm9kZSwgJnNjLT5zY19pZl9tdHhbMF0p
KSB7CisJCWRldmljZV9wcmludGYoZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIHRyYW5zZmVycyBm
b3IgIiBcCisJCQkiaW50ZXJmYWNlIDAhXG4iKTsKIAkJZ290byBkZXRhY2g7CiAJfQorCiAJLyoK
IAkgKiBJbnRlcmZhY2UgMQotCSAqIChzZWFyY2ggYWx0ZXJuYXRlIHNldHRpbmdzLCBhbmQgZmlu
ZAotCSAqICB0aGUgZGVzY3JpcHRvciB3aXRoIHRoZSBsYXJnZXN0CisJICogKHNlYXJjaCBhbHRl
cm5hdGUgc2V0dGluZ3MsIGFuZCBmaW5kIHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlIGxhcmdlc3QK
IAkgKiAgd01heFBhY2tldFNpemUpCiAJICovCi0JaXNvY19zZXR1cCA9Ci0JICAgICgodXNiMl9n
ZXRfc3BlZWQodWFhLT5kZXZpY2UpID09IFVTQl9TUEVFRF9ISUdIKSA/Ci0JICAgIHVidF9jb25m
aWdfaWZfMV9oaWdoX3NwZWVkIDoKLQkgICAgdWJ0X2NvbmZpZ19pZl8xX2Z1bGxfc3BlZWQpOwog
CiAJd01heFBhY2tldFNpemUgPSAwOwotCi0JLyogc2VhcmNoIHRocm91Z2ggYWxsIHRoZSBkZXNj
cmlwdG9ycyBsb29raW5nIGZvciBiaWRpciBtb2RlICovCi0KLQlhbHRfaW5kZXggPSAwIC0gMTsK
KwlhbHRfaW5kZXggPSAwOwogCWkgPSAwOwogCWogPSAwOworCisJLyogU2VhcmNoIHRocm91Z2gg
YWxsIHRoZSBkZXNjcmlwdG9ycyBsb29raW5nIGZvciBiaWRpciBtb2RlICovCiAJd2hpbGUgKDEp
IHsKIAkJdWludDE2X3QgdGVtcDsKIAotCQllZCA9IHVzYjJfZmluZF9lZGVzYygKLQkJICAgIHVz
YjJfZ2V0X2NvbmZpZ19kZXNjcmlwdG9yKHVhYS0+ZGV2aWNlKSwgMSwgaSwgaik7CisJCWVkID0g
dXNiMl9maW5kX2VkZXNjKHVzYjJfZ2V0X2NvbmZpZ19kZXNjcmlwdG9yKHVhYS0+ZGV2aWNlKSwK
KwkJCQkxLCBpLCBqKTsKIAkJaWYgKGVkID09IE5VTEwpIHsKLQkJCWlmIChqID09IDApIHsKLQkJ
CQkvKiBlbmQgb2YgaW50ZXJmYWNlcyAqLwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKKwkJCWlm
IChqICE9IDApIHsKIAkJCQkvKiBuZXh0IGludGVyZmFjZSAqLwogCQkJCWogPSAwOwotCQkJCWkr
KzsKKwkJCQlpICsrOwogCQkJCWNvbnRpbnVlOwogCQkJfQorCisJCQlicmVhazsJLyogZW5kIG9m
IGludGVyZmFjZXMgKi8KIAkJfQorCiAJCXRlbXAgPSBVR0VUVyhlZC0+d01heFBhY2tldFNpemUp
OwogCQlpZiAodGVtcCA+IHdNYXhQYWNrZXRTaXplKSB7CiAJCQl3TWF4UGFja2V0U2l6ZSA9IHRl
bXA7CiAJCQlhbHRfaW5kZXggPSBpOwogCQl9Ci0JCWorKzsKLQl9CiAKLQlpZiAodXNiMl9zZXRf
YWx0X2ludGVyZmFjZV9pbmRleCh1YWEtPmRldmljZSwgMSwgYWx0X2luZGV4KSkgewotCQlkZXZp
Y2VfcHJpbnRmKGRldiwgIkNvdWxkIG5vdCBzZXQgYWx0ZXJuYXRlICIKLQkJICAgICJzZXR0aW5n
ICVkIGZvciBpbnRlcmZhY2UgMSFcbiIsIGFsdF9pbmRleCk7Ci0JCWdvdG8gZGV0YWNoOworCQlq
ICsrOwogCX0KLQlpZmFjZV9pbmRleCA9IDE7Ci0JaWYgKHVzYjJfdHJhbnNmZXJfc2V0dXAKLQkg
ICAgKHVhYS0+ZGV2aWNlLCAmaWZhY2VfaW5kZXgsIHNjLT5zY194ZmVyX2lmXzEsCi0JICAgIGlz
b2Nfc2V0dXAsIFVCVF9JRl8xX05fVFJBTlNGRVIsIHNjLCAmc2MtPnNjX210eCkpIHsKLQkJZGV2
aWNlX3ByaW50ZihkZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgdHJhbnNmZXJzICIKLQkJICAgICJm
b3IgaW50ZXJmYWNlIDEhXG4iKTsKLQkJZ290byBkZXRhY2g7Ci0JfQotCS8qIGNyZWF0ZSBOZXRn
cmFwaCBub2RlICovCiAKLQlpZiAobmdfbWFrZV9ub2RlX2NvbW1vbigmdHlwZXN0cnVjdCwgJnNj
LT5zY19ub2RlKSAhPSAwKSB7Ci0JCXByaW50ZigiJXM6IENvdWxkIG5vdCBjcmVhdGUgTmV0Z3Jh
cGggbm9kZVxuIiwKLQkJICAgIHNjLT5zY19uYW1lKTsKLQkJc2MtPnNjX25vZGUgPSBOVUxMOwor
CS8qIFNldCBhbHQgY29uZmlndXJhdGlvbiBvbmx5IGlmIHdlIGZvdW5kIGl0ICovCisJaWYgKHdN
YXhQYWNrZXRTaXplID4gMCAmJgorCSAgICB1c2IyX3NldF9hbHRfaW50ZXJmYWNlX2luZGV4KHVh
YS0+ZGV2aWNlLCAxLCBhbHRfaW5kZXgpKSB7CisJCWRldmljZV9wcmludGYoZGV2LCAiY291bGQg
bm90IHNldCBhbHRlcm5hdGUgc2V0dGluZyAlZCAiIFwKKwkJCSJmb3IgaW50ZXJmYWNlIDEhXG4i
LCBhbHRfaW5kZXgpOwogCQlnb3RvIGRldGFjaDsKIAl9Ci0JLyogbmFtZSBub2RlICovCiAKLQlp
ZiAobmdfbmFtZV9ub2RlKHNjLT5zY19ub2RlLCBzYy0+c2NfbmFtZSkgIT0gMCkgewotCQlwcmlu
dGYoIiVzOiBDb3VsZCBub3QgbmFtZSBOZXRncmFwaCBub2RlXG4iLAotCQkgICAgc2MtPnNjX25h
bWUpOwotCQlOR19OT0RFX1VOUkVGKHNjLT5zY19ub2RlKTsKLQkJc2MtPnNjX25vZGUgPSBOVUxM
OworCWlmYWNlX2luZGV4ID0gMTsKKwlpZiAodXNiMl90cmFuc2Zlcl9zZXR1cCh1YWEtPmRldmlj
ZSwgJmlmYWNlX2luZGV4LAorCQkJJnNjLT5zY194ZmVyW1VCVF9JRl8wX05fVFJBTlNGRVJdLAor
CQkJJnVidF9jb25maWdbVUJUX0lGXzBfTl9UUkFOU0ZFUl0sIFVCVF9JRl8xX05fVFJBTlNGRVIs
CisJCQlzYy0+c2Nfbm9kZSwgJnNjLT5zY19pZl9tdHhbMV0pKSB7CisJCWRldmljZV9wcmludGYo
ZGV2LCAiY291bGQgbm90IGFsbG9jYXRlIHRyYW5zZmVycyBmb3IgIiBcCisJCQkiaW50ZXJmYWNl
IDEhXG4iKTsKIAkJZ290byBkZXRhY2g7CiAJfQotCU5HX05PREVfU0VUX1BSSVZBVEUoc2MtPnNj
X25vZGUsIHNjKTsKLQlOR19OT0RFX0ZPUkNFX1dSSVRFUihzYy0+c2Nfbm9kZSk7CiAKLQkvKiBj
bGFpbSBhbGwgaW50ZXJmYWNlcyBvbiB0aGUgZGV2aWNlICovCi0KLQlmb3IgKGkgPSAxOzsgaSsr
KSB7Ci0KLQkJaWYgKHVzYjJfZ2V0X2lmYWNlKHVhYS0+ZGV2aWNlLCBpKSA9PSBOVUxMKSB7Ci0J
CQlicmVhazsKLQkJfQorCS8qIENsYWltIGFsbCBpbnRlcmZhY2VzIG9uIHRoZSBkZXZpY2UgKi8K
Kwlmb3IgKGkgPSAxOyB1c2IyX2dldF9pZmFjZSh1YWEtPmRldmljZSwgaSkgIT0gTlVMTDsgaSAr
KykKIAkJdXNiMl9zZXRfcGFyZW50X2lmYWNlKHVhYS0+ZGV2aWNlLCBpLCB1YWEtPmluZm8uYklm
YWNlSW5kZXgpOwotCX0KIAotCXJldHVybiAoMCk7CQkJLyogc3VjY2VzcyAqLworCXJldHVybiAo
MCk7IC8qIHN1Y2Nlc3MgKi8KIAogZGV0YWNoOgogCXVidF9kZXRhY2goZGV2KTsKIAogCXJldHVy
biAoRU5YSU8pOwotfQorfSAvKiB1YnRfYXR0YWNoICovCiAKIC8qCi0gKiBEZXRhY2ggdGhlIGRl
dmljZQorICogRGV0YWNoIHRoZSBkZXZpY2UuCisgKiBVU0IgY29udGV4dC4KICAqLwogCiBpbnQK
IHVidF9kZXRhY2goZGV2aWNlX3QgZGV2KQogewotCXN0cnVjdCB1YnRfc29mdGMgKnNjID0gZGV2
aWNlX2dldF9zb2Z0YyhkZXYpOworCXN0cnVjdCB1YnRfc29mdGMJKnNjID0gZGV2aWNlX2dldF9z
b2Z0YyhkZXYpOworCW5vZGVfcAkJCW5vZGUgPSBzYy0+c2Nfbm9kZTsKIAotCS8qIGRlc3Ryb3kg
TmV0Z3JhcGggbm9kZSAqLworCS8qIERlc3Ryb3kgTmV0Z3JhcGggbm9kZSAqLworCWlmIChub2Rl
ICE9IE5VTEwpIHsKKwkJc2MtPnNjX25vZGUgPSBOVUxMOwogCi0JaWYgKHNjLT5zY19ub2RlICE9
IE5VTEwpIHsKLQkJTkdfTk9ERV9TRVRfUFJJVkFURShzYy0+c2Nfbm9kZSwgTlVMTCk7Ci0JCW5n
X3Jtbm9kZV9zZWxmKHNjLT5zY19ub2RlKTsKLQkJc2MtPnNjX25vZGUgPSBOVUxMOworCQlOR19O
T0RFX1NFVF9QUklWQVRFKG5vZGUsIE5VTEwpOworCQlOR19OT0RFX1JFQUxMWV9ESUUobm9kZSk7
CisJCU5HX05PREVfUkVGKG5vZGUpOworCQluZ19ybW5vZGVfc2VsZihub2RlKTsKIAl9Ci0JLyog
ZnJlZSBVU0IgdHJhbnNmZXJzLCBpZiBhbnkgKi8KIAotCXVzYjJfdHJhbnNmZXJfdW5zZXR1cChz
Yy0+c2NfeGZlcl9pZl8wLCBVQlRfSUZfMF9OX1RSQU5TRkVSKTsKKwkvKiBGcmVlIFVTQiB0cmFu
c2ZlcnMsIGlmIGFueSAqLworCXVzYjJfdHJhbnNmZXJfdW5zZXR1cChzYy0+c2NfeGZlciwgVUJU
X05fVFJBTlNGRVIpOwogCi0JdXNiMl90cmFuc2Zlcl91bnNldHVwKHNjLT5zY194ZmVyX2lmXzEs
IFVCVF9JRl8xX05fVFJBTlNGRVIpOworCWlmIChub2RlICE9IE5VTEwpCisJCU5HX05PREVfVU5S
RUYobm9kZSk7CiAKLQltdHhfZGVzdHJveSgmc2MtPnNjX210eCk7Ci0KLQkvKiBkZXN0cm95IHF1
ZXVlcyAqLwotCisJLyogRGVzdHJveSBxdWV1ZXMgKi8KKwlVQlRfTUJVRlFfTE9DSyhzYyk7CiAJ
TkdfQlRfTUJVRlFfREVTVFJPWSgmc2MtPnNjX2NtZHEpOwogCU5HX0JUX01CVUZRX0RFU1RST1ko
JnNjLT5zY19hY2xxKTsKIAlOR19CVF9NQlVGUV9ERVNUUk9ZKCZzYy0+c2Nfc2NvcSk7Ci0JTkdf
QlRfTUJVRlFfREVTVFJPWSgmc2MtPnNjX3NjaXEpOworCVVCVF9NQlVGUV9VTkxPQ0soc2MpOwog
CisJbXR4X2Rlc3Ryb3koJnNjLT5zY19pZl9tdHhbMF0pOworCW10eF9kZXN0cm95KCZzYy0+c2Nf
aWZfbXR4WzFdKTsKKwltdHhfZGVzdHJveSgmc2MtPnNjX21idWZxX210eCk7CisKIAlyZXR1cm4g
KDApOwotfQorfSAvKiB1YnRfZGV0YWNoICovCiAKKy8qIAorICogQ2FsbGVkIHdoZW4gb3V0Z29p
bmcgY29udHJvbCByZXF1ZXN0IChIQ0kgY29tbWFuZCkgaGFzIGNvbXBsZXRlZCwgaS5lLgorICog
SENJIGNvbW1hbmQgd2FzIHNlbnQgdG8gdGhlIGRldmljZS4KKyAqIFVTQiBjb250ZXh0LgorICov
CisKIHN0YXRpYyB2b2lkCiB1YnRfY3RybF93cml0ZV9jYWxsYmFjayhzdHJ1Y3QgdXNiMl94ZmVy
ICp4ZmVyKQogewotCXN0cnVjdCB1YnRfc29mdGMgKnNjID0geGZlci0+cHJpdl9zYzsKLQlzdHJ1
Y3QgdXNiMl9kZXZpY2VfcmVxdWVzdCByZXE7Ci0Jc3RydWN0IG1idWYgKm07CisJbm9kZV9wCQkJ
CW5vZGUgPSB4ZmVyLT5wcml2X3NjOworCXN0cnVjdCB1YnRfc29mdGMJCSpzYzsKKwlzdHJ1Y3Qg
dXNiMl9kZXZpY2VfcmVxdWVzdAlyZXE7CisJc3RydWN0IG1idWYJCQkqbTsKIAorCWlmIChOR19O
T0RFX05PVF9WQUxJRChub2RlKSkgeworCQlOR19OT0RFX1VOUkVGKG5vZGUpOworCQlyZXR1cm47
IC8qIG5ldGdyYXBoIG5vZGUgaXMgZ29uZSAqLworCX0KKworCXNjID0gTkdfTk9ERV9QUklWQVRF
KG5vZGUpOworCiAJc3dpdGNoIChVU0JfR0VUX1NUQVRFKHhmZXIpKSB7CiAJY2FzZSBVU0JfU1Rf
VFJBTlNGRVJSRUQ6Ci10cl90cmFuc2ZlcnJlZDoKKwkJaWYgKHhmZXItPmVycm9yICE9IDApCisJ
CQlVQlRfU1RBVF9PRVJST1Ioc2MpOworCQllbHNlIHsKKwkJCVVCVF9JTkZPKHNjLCAic2VudCAl
ZCBieXRlcyB0byBjb250cm9sIHBpcGVcbiIsCisJCQkJeGZlci0+YWN0bGVuKTsKIAotCQlpZiAo
eGZlci0+ZXJyb3IpIHsKLQkJCU5HX1VCVF9TVEFUX09FUlJPUihzYy0+c2Nfc3RhdCk7Ci0JCX0g
ZWxzZSB7Ci0JCQlOR19VQlRfU1RBVF9CWVRFU19TRU5UKHNjLT5zY19zdGF0LCB4ZmVyLT5hY3Rs
ZW4pOwotCQkJTkdfVUJUX1NUQVRfUENLVFNfU0VOVChzYy0+c2Nfc3RhdCk7CisJCQlVQlRfU1RB
VF9CWVRFU19TRU5UKHNjLCB4ZmVyLT5hY3RsZW4pOworCQkJVUJUX1NUQVRfUENLVFNfU0VOVChz
Yyk7CiAJCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KIAogCWNhc2UgVVNCX1NUX1NFVFVQOgotCi0J
CS8qIGdldCBuZXh0IG1idWYsIGlmIGFueSAqLwotCitzZW5kX25leHQ6CisJCS8qIEdldCBuZXh0
IGNvbW1hbmQgbWJ1ZiwgaWYgYW55ICovCisJCVVCVF9NQlVGUV9MT0NLKHNjKTsKIAkJTkdfQlRf
TUJVRlFfREVRVUVVRSgmc2MtPnNjX2NtZHEsIG0pOworCQlVQlRfTUJVRlFfVU5MT0NLKHNjKTsK
IAogCQlpZiAobSA9PSBOVUxMKSB7Ci0JCQlOR19VQlRfSU5GTyhzYywgIkhDSSBjb21tYW5kIHF1
ZXVlIGlzIGVtcHR5XG4iKTsKKwkJCVVCVF9JTkZPKHNjLCAiSENJIGNvbW1hbmQgcXVldWUgaXMg
ZW1wdHlcbiIpOworCQkJTkdfTk9ERV9VTlJFRihub2RlKTsKIAkJCXJldHVybjsKIAkJfQotCQkv
KgotCQkgKiBjaGVjayBIQ0kgY29tbWFuZCBmcmFtZSBzaXplIGFuZAotCQkgKiBjb3B5IGl0IHRv
IFVTQiB0cmFuc2ZlciBidWZmZXI6Ci0JCSAqLwogCi0JCWlmIChtLT5tX3BrdGhkci5sZW4gPiBV
QlRfQ1RSTF9CVUZGRVJfU0laRSkgewotCQkJcGFuaWMoIkhDSSBjb21tYW5kIGZyYW1lIHRvbyBi
aWcsIHNpemU9JXpkLCBsZW49JWRcbiIsCi0JCQkgICAgVUJUX0NUUkxfQlVGRkVSX1NJWkUsIG0t
Pm1fcGt0aGRyLmxlbik7Ci0JCX0KLQkJLyogaW5pdGlhbGl6ZSBhIFVTQiBjb250cm9sIHJlcXVl
c3QgYW5kIHRoZW4gc2NoZWR1bGUgaXQgKi8KLQorCQkvKiBJbml0aWFsaXplIGEgVVNCIGNvbnRy
b2wgcmVxdWVzdCBhbmQgdGhlbiBzY2hlZHVsZSBpdCAqLwogCQliemVybygmcmVxLCBzaXplb2Yo
cmVxKSk7Ci0KIAkJcmVxLmJtUmVxdWVzdFR5cGUgPSBVQlRfSENJX1JFUVVFU1Q7CiAJCVVTRVRX
KHJlcS53TGVuZ3RoLCBtLT5tX3BrdGhkci5sZW4pOwogCi0JCU5HX1VCVF9JTkZPKHNjLCAiU2Vu
ZGluZyBjb250cm9sIHJlcXVlc3QsIGJtUmVxdWVzdFR5cGU9MHglMDJ4LCAiCi0JCSAgICAid0xl
bmd0aD0lZFxuIiwgcmVxLmJtUmVxdWVzdFR5cGUsIFVHRVRXKHJlcS53TGVuZ3RoKSk7CisJCVVC
VF9JTkZPKHNjLCAiU2VuZGluZyBjb250cm9sIHJlcXVlc3QsICIgXAorCQkJImJtUmVxdWVzdFR5
cGU9MHglMDJ4LCB3TGVuZ3RoPSVkXG4iLAorCQkJcmVxLmJtUmVxdWVzdFR5cGUsIFVHRVRXKHJl
cS53TGVuZ3RoKSk7CiAKIAkJdXNiMl9jb3B5X2luKHhmZXItPmZyYnVmZmVycywgMCwgJnJlcSwg
c2l6ZW9mKHJlcSkpOwogCQl1c2IyX21fY29weV9pbih4ZmVyLT5mcmJ1ZmZlcnMgKyAxLCAwLCBt
LCAwLCBtLT5tX3BrdGhkci5sZW4pOwogCiAJCXhmZXItPmZybGVuZ3Roc1swXSA9IHNpemVvZihy
ZXEpOwogCQl4ZmVyLT5mcmxlbmd0aHNbMV0gPSBtLT5tX3BrdGhkci5sZW47Ci0JCXhmZXItPm5m
cmFtZXMgPSB4ZmVyLT5mcmxlbmd0aHNbMV0gPyAyIDogMTsKKwkJeGZlci0+bmZyYW1lcyA9IDI7
CiAKIAkJTkdfRlJFRV9NKG0pOwogCiAJCXVzYjJfc3RhcnRfaGFyZHdhcmUoeGZlcik7Ci0JCXJl
dHVybjsKKwkJYnJlYWs7CiAKLQlkZWZhdWx0OgkJCS8qIEVycm9yICovCi0JCWlmICh4ZmVyLT5l
cnJvciA9PSBVU0JfRVJSX0NBTkNFTExFRCkgewotCQkJLyogaWdub3JlICovCi0JCQlyZXR1cm47
CisJZGVmYXVsdDogLyogRXJyb3IgKi8KKwkJaWYgKHhmZXItPmVycm9yICE9IFVTQl9FUlJfQ0FO
Q0VMTEVEKSB7CisJCQlVQlRfV0FSTihzYywgImNvbnRyb2wgdHJhbnNmZXIgZmFpbGVkOiAlc1xu
IiwKKwkJCQl1c2IyX2VycnN0cih4ZmVyLT5lcnJvcikpOworCisJCQlVQlRfU1RBVF9PRVJST1Io
c2MpOworCQkJZ290byBzZW5kX25leHQ7CiAJCX0KLQkJZ290byB0cl90cmFuc2ZlcnJlZDsKKwor
CQlOR19OT0RFX1VOUkVGKG5vZGUpOyAvKiBjYW5jZWxsZWQgKi8KKwkJYnJlYWs7CiAJfQotfQor
fSAvKiB1YnRfY3RybF93cml0ZV9jYWxsYmFjayAqLwogCisvKiAKKyAqIENhbGxlZCB3aGVuIGlu
Y29taW5nIGludGVycnVwdCB0cmFuc2ZlciAoSENJIGV2ZW50KSBoYXMgY29tcGxldGVkLCBpLmUu
CisgKiBIQ0kgZXZlbnQgd2FzIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZS4KKyAqIFVTQiBjb250
ZXh0LgorICovCisKIHN0YXRpYyB2b2lkCiB1YnRfaW50cl9yZWFkX2NhbGxiYWNrKHN0cnVjdCB1
c2IyX3hmZXIgKnhmZXIpCiB7Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSB4ZmVyLT5wcml2X3Nj
OwotCXN0cnVjdCBtYnVmICptOwotCXVpbnQzMl90IG1heF9sZW47Ci0JdWludDhfdCAqcHRyOwor
CW5vZGVfcAkJCW5vZGUgPSB4ZmVyLT5wcml2X3NjOworCXN0cnVjdCB1YnRfc29mdGMJKnNjOwor
CXN0cnVjdCBtYnVmCQkqbTsKKwluZ19oY2lfZXZlbnRfcGt0X3QJKmhkcjsKKwlpbnQJCQllcnJv
cjsKIAorCWlmIChOR19OT0RFX05PVF9WQUxJRChub2RlKSkgeworCQlOR19OT0RFX1VOUkVGKG5v
ZGUpOworCQlyZXR1cm47IC8qIG5ldGdyYXBoIG5vZGUgaXMgZ29uZSAqLworCX0KKworCXNjID0g
TkdfTk9ERV9QUklWQVRFKG5vZGUpOworCisJaWYgKChzYy0+c2NfaG9vayA9PSBOVUxMKSB8fCBO
R19IT09LX05PVF9WQUxJRChzYy0+c2NfaG9vaykpIHsKKwkJVUJUX0lORk8oc2MsICJubyB1cHN0
cmVhbSBob29rXG4iKTsKKwkJTkdfTk9ERV9VTlJFRihub2RlKTsKKwkJcmV0dXJuOyAvKiB1cHN0
cmVhbSBob29rIGlzIGdvbmUgKi8KKwl9CisKKwltID0gTlVMTDsKKwogCXN3aXRjaCAoVVNCX0dF
VF9TVEFURSh4ZmVyKSkgewogCWNhc2UgVVNCX1NUX1RSQU5TRkVSUkVEOgotCi0JCS8qIGFsbG9j
YXRlIGEgbmV3IG1idWYgKi8KLQorCQkvKiBBbGxvY2F0ZSBhIG5ldyBtYnVmICovCiAJCU1HRVRI
RFIobSwgTV9ET05UV0FJVCwgTVRfREFUQSk7Ci0KIAkJaWYgKG0gPT0gTlVMTCkgewotCQkJZ290
byB0cl9zZXR1cDsKKwkJCVVCVF9TVEFUX0lFUlJPUihzYyk7CisJCQlnb3RvIHN1Ym1pdF9uZXh0
OwogCQl9CisKIAkJTUNMR0VUKG0sIE1fRE9OVFdBSVQpOwotCiAJCWlmICghKG0tPm1fZmxhZ3Mg
JiBNX0VYVCkpIHsKLQkJCU5HX0ZSRUVfTShtKTsKLQkJCWdvdG8gdHJfc2V0dXA7CisJCQlVQlRf
U1RBVF9JRVJST1Ioc2MpOworCQkJZ290byBzdWJtaXRfbmV4dDsKIAkJfQotCQlpZiAoIShzYy0+
c2NfZmxhZ3MgJiBVQlRfSEFWRV9GUkFNRV9UWVBFKSkgewotCQkJKm10b2QobSwgdWludDhfdCAq
KT0gTkdfSENJX0VWRU5UX1BLVDsKLQkJCW0tPm1fcGt0aGRyLmxlbiA9IG0tPm1fbGVuID0gMTsK
LQkJfSBlbHNlIHsKLQkJCW0tPm1fcGt0aGRyLmxlbiA9IG0tPm1fbGVuID0gMDsKKworCQkvKiBB
ZGQgSENJIHBhY2tldCB0eXBlICovCisJCSptdG9kKG0sIHVpbnQ4X3QgKik9IE5HX0hDSV9FVkVO
VF9QS1Q7CisJCW0tPm1fcGt0aGRyLmxlbiA9IG0tPm1fbGVuID0gMTsKKworCQlpZiAoeGZlci0+
YWN0bGVuID4gTUNMQllURVMgLSAxKQorCQkJeGZlci0+YWN0bGVuID0gTUNMQllURVMgLSAxOwor
CisJCXVzYjJfY29weV9vdXQoeGZlci0+ZnJidWZmZXJzLCAwLCBtdG9kKG0sIHVpbnQ4X3QgKikg
KyAxLAorCQkJeGZlci0+YWN0bGVuKTsKKwkJbS0+bV9wa3RoZHIubGVuICs9IHhmZXItPmFjdGxl
bjsKKwkJbS0+bV9sZW4gKz0geGZlci0+YWN0bGVuOworCisJCVVCVF9JTkZPKHNjLCAiZ290ICVk
IGJ5dGVzIGZyb20gaW50ZXJydXB0IHBpcGVcbiIsCisJCQl4ZmVyLT5hY3RsZW4pOworCisJCS8q
IFZhbGlkYXRlIHBhY2tldCBhbmQgc2VuZCBpdCB1cCB0aGUgc3RhY2sgKi8KKwkJaWYgKG0tPm1f
cGt0aGRyLmxlbiA8IHNpemVvZigqaGRyKSkgeworCQkJVUJUX0lORk8oc2MsICJIQ0kgZXZlbnQg
cGFja2V0IGlzIHRvbyBzaG9ydFxuIik7CisKKwkJCVVCVF9TVEFUX0lFUlJPUihzYyk7CisJCQln
b3RvIHN1Ym1pdF9uZXh0OwogCQl9CiAKLQkJbWF4X2xlbiA9IChNQ0xCWVRFUyAtIG0tPm1fbGVu
KTsKKwkJaGRyID0gbXRvZChtLCBuZ19oY2lfZXZlbnRfcGt0X3QgKik7CisJCWlmIChoZHItPmxl
bmd0aCAhPSAobS0+bV9wa3RoZHIubGVuIC0gc2l6ZW9mKCpoZHIpKSkgeworCQkJVUJUX0VSUihz
YywgIkludmFsaWQgSENJIGV2ZW50IHBhY2tldCBzaXplLCAiIFwKKwkJCQkibGVuZ3RoPSVkLCBw
a3RsZW49JWRcbiIsCisJCQkJaGRyLT5sZW5ndGgsIG0tPm1fcGt0aGRyLmxlbik7CiAKLQkJaWYg
KHhmZXItPmFjdGxlbiA+IG1heF9sZW4pIHsKLQkJCXhmZXItPmFjdGxlbiA9IG1heF9sZW47CisJ
CQlVQlRfU1RBVF9JRVJST1Ioc2MpOworCQkJZ290byBzdWJtaXRfbmV4dDsKIAkJfQotCQlwdHIg
PSAoKHVpbnQ4X3QgKikobS0+bV9kYXRhKSkgKyBtLT5tX2xlbjsKIAotCQl1c2IyX2NvcHlfb3V0
KHhmZXItPmZyYnVmZmVycywgMCwgcHRyLCB4ZmVyLT5hY3RsZW4pOworCQlVQlRfSU5GTyhzYywg
ImdvdCBjb21wbGV0ZSBIQ0kgZXZlbnQgZnJhbWUsIHBrdGxlbj0lZCwgIiBcCisJCQkibGVuZ3Ro
PSVkXG4iLCBtLT5tX3BrdGhkci5sZW4sIGhkci0+bGVuZ3RoKTsKIAotCQltLT5tX3BrdGhkci5s
ZW4gKz0geGZlci0+YWN0bGVuOwotCQltLT5tX2xlbiArPSB4ZmVyLT5hY3RsZW47CisJCVVCVF9T
VEFUX1BDS1RTX1JFQ1Yoc2MpOworCQlVQlRfU1RBVF9CWVRFU19SRUNWKHNjLCBtLT5tX3BrdGhk
ci5sZW4pOwogCi0JCU5HX1VCVF9JTkZPKHNjLCAiZ290ICVkIGJ5dGVzIGZyb20gaW50ZXJydXB0
ICIKLQkJICAgICJwaXBlXG4iLCB4ZmVyLT5hY3RsZW4pOworCQlOR19TRU5EX0RBVEFfT05MWShl
cnJvciwgc2MtPnNjX2hvb2ssIG0pOworCQlpZiAoZXJyb3IgIT0gMCkKKwkJCVVCVF9TVEFUX0lF
UlJPUihzYyk7CiAKLQkJc2MtPnNjX2ludHJfYnVmZmVyID0gbTsKKwkJLyogbSA9PSBOVUxMIGF0
IHRoaXMgcG9pbnQgKi8KKwkJLyogRkFMTFRIUk9VR0ggKi8KIAogCWNhc2UgVVNCX1NUX1NFVFVQ
OgotdHJfc2V0dXA6CitzdWJtaXRfbmV4dDoKKwkJTkdfRlJFRV9NKG0pOyAvKiBjaGVja3MgZm9y
IG0gIT0gTlVMTCAqLwogCi0JCWlmIChzYy0+c2NfaW50cl9idWZmZXIpIHsKLQkJCW5nX3NlbmRf
Zm4oc2MtPnNjX25vZGUsIE5VTEwsIHVidF9pbnRyX3JlYWRfY29tcGxldGUsIE5VTEwsIDApOwot
CQkJcmV0dXJuOworCQlpZiAoc2MtPnNjX2ZsYWdzICYgVUJUX0ZMQUdfSU5UUl9TVEFMTCkKKwkJ
CXVzYjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hmZXJbVUJUX0lGXzBfSU5UUl9DU19SRF0pOwor
CQllbHNlIHsKKwkJCXhmZXItPmZybGVuZ3Roc1swXSA9IHhmZXItPm1heF9kYXRhX2xlbmd0aDsK
KwkJCXVzYjJfc3RhcnRfaGFyZHdhcmUoeGZlcik7CiAJCX0KLQkJaWYgKHNjLT5zY19mbGFncyAm
IFVCVF9GTEFHX0lOVFJfU1RBTEwpIHsKLQkJCXVzYjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hm
ZXJfaWZfMFs2XSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJeGZlci0+ZnJsZW5ndGhzWzBdID0geGZl
ci0+bWF4X2RhdGFfbGVuZ3RoOworCQlicmVhazsKIAotCQl1c2IyX3N0YXJ0X2hhcmR3YXJlKHhm
ZXIpOwotCQlyZXR1cm47CisJZGVmYXVsdDogLyogRXJyb3IgKi8KKwkJaWYgKHhmZXItPmVycm9y
ICE9IFVTQl9FUlJfQ0FOQ0VMTEVEKSB7CisJCQlVQlRfV0FSTihzYywgImludGVycnVwdCB0cmFu
c2ZlciBmYWlsZWQ6ICVzXG4iLAorCQkJCXVzYjJfZXJyc3RyKHhmZXItPmVycm9yKSk7CiAKLQlk
ZWZhdWx0OgkJCS8qIEVycm9yICovCi0JCWlmICh4ZmVyLT5lcnJvciAhPSBVU0JfRVJSX0NBTkNF
TExFRCkgewotCQkJLyogdHJ5IHRvIGNsZWFyIHN0YWxsIGZpcnN0ICovCisJCQkvKiBUcnkgdG8g
Y2xlYXIgc3RhbGwgZmlyc3QgKi8KIAkJCXNjLT5zY19mbGFncyB8PSBVQlRfRkxBR19JTlRSX1NU
QUxMOwotCQkJdXNiMl90cmFuc2Zlcl9zdGFydChzYy0+c2NfeGZlcl9pZl8wWzZdKTsKLQkJfQot
CQlyZXR1cm47Ci0KKwkJCXVzYjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hmZXJbVUJUX0lGXzBf
SU5UUl9DU19SRF0pOworCQl9IGVsc2UKKwkJCU5HX05PREVfVU5SRUYobm9kZSk7IC8qIGNhbmNl
bGxlZCAqLworCQlicmVhazsKIAl9Ci19Cit9IC8qIHVidF9pbnRyX3JlYWRfY2FsbGJhY2sgKi8K
IAorLyoKKyAqIENhbGxlZCB3aGVuIG91dGdvaW5nIGNvbnRyb2wgdHJhbnNmZXIgaW5pdGlhdGVk
IHRvIGNsZWFyIHN0YWxsIG9uCisgKiBpbnRlcnJ1cHQgcGlwZSBoYXMgY29tcGxldGVkLgorICog
VVNCIGNvbnRleHQuCisgKi8KKwogc3RhdGljIHZvaWQKIHVidF9pbnRyX3JlYWRfY2xlYXJfc3Rh
bGxfY2FsbGJhY2soc3RydWN0IHVzYjJfeGZlciAqeGZlcikKIHsKLQlzdHJ1Y3QgdWJ0X3NvZnRj
ICpzYyA9IHhmZXItPnByaXZfc2M7Ci0Jc3RydWN0IHVzYjJfeGZlciAqeGZlcl9vdGhlciA9IHNj
LT5zY194ZmVyX2lmXzBbMl07CisJbm9kZV9wCQkJbm9kZSA9IHhmZXItPnByaXZfc2M7CisJc3Ry
dWN0IHVidF9zb2Z0Ywkqc2M7CisJc3RydWN0IHVzYjJfeGZlcgkqeGZlcl9vdGhlcjsKIAorCWlm
IChOR19OT0RFX05PVF9WQUxJRChub2RlKSkgeworCQlOR19OT0RFX1VOUkVGKG5vZGUpOworCQly
ZXR1cm47IC8qIG5ldGdyYXBoIG5vZGUgaXMgZ29uZSAqLworCX0KKworCXNjID0gTkdfTk9ERV9Q
UklWQVRFKG5vZGUpOworCXhmZXJfb3RoZXIgPSBzYy0+c2NfeGZlcltVQlRfSUZfMF9JTlRSX0RU
X1JEXTsKKwogCWlmICh1c2IyX2NsZWFyX3N0YWxsX2NhbGxiYWNrKHhmZXIsIHhmZXJfb3RoZXIp
KSB7CiAJCURQUklOVEYoInN0YWxsIGNsZWFyZWRcbiIpOwogCQlzYy0+c2NfZmxhZ3MgJj0gflVC
VF9GTEFHX0lOVFJfU1RBTEw7CiAJCXVzYjJfdHJhbnNmZXJfc3RhcnQoeGZlcl9vdGhlcik7Ci0J
fQotfQorCX0gZWxzZQorCQlOR19OT0RFX1VOUkVGKG5vZGUpOyAvKiBjYW50IGNsZWFyIHN0YWxs
ICovCit9IC8qIHVidF9pbnRyX3JlYWRfY2xlYXJfc3RhbGxfY2FsbGJhY2sgKi8KIAorLyoKKyAq
IENhbGxlZCB3aGVuIGluY29taW5nIGJ1bGsgdHJhbnNmZXIgKEFDTCBwYWNrZXQpIGhhcyBjb21w
bGV0ZWQsIGkuZS4KKyAqIEFDTCBwYWNrZXQgd2FzIHJlY2VpdmVkIGZyb20gdGhlIGRldmljZS4K
KyAqIFVTQiBjb250ZXh0LgorICovCisKIHN0YXRpYyB2b2lkCi11YnRfaW50cl9yZWFkX2NvbXBs
ZXRlKG5vZGVfcCBub2RlLCBob29rX3AgaG9vaywgdm9pZCAqYXJnMSwgaW50IGFyZzIpCit1YnRf
YnVsa19yZWFkX2NhbGxiYWNrKHN0cnVjdCB1c2IyX3hmZXIgKnhmZXIpCiB7Ci0Jc3RydWN0IHVi
dF9zb2Z0YyAqc2MgPSBOR19OT0RFX1BSSVZBVEUobm9kZSk7Ci0Jc3RydWN0IG1idWYgKm07Ci0J
bmdfaGNpX2V2ZW50X3BrdF90ICpoZHI7Ci0JaW50IGVycm9yOworCW5vZGVfcAkJCW5vZGUgPSB4
ZmVyLT5wcml2X3NjOworCXN0cnVjdCB1YnRfc29mdGMJKnNjOworCXN0cnVjdCBtYnVmCQkqbTsK
KwluZ19oY2lfYWNsZGF0YV9wa3RfdAkqaGRyOworCXVpbnQxNl90CQlsZW47CisJaW50CQkJZXJy
b3I7CiAKLQlpZiAoc2MgPT0gTlVMTCkgewotCQlyZXR1cm47CisJaWYgKE5HX05PREVfTk9UX1ZB
TElEKG5vZGUpKSB7CisJCU5HX05PREVfVU5SRUYobm9kZSk7CisJCXJldHVybjsgLyogbmV0Z3Jh
cGggbm9kZSBpcyBnb25lICovCiAJfQotCW10eF9sb2NrKCZzYy0+c2NfbXR4KTsKIAotCW0gPSBz
Yy0+c2NfaW50cl9idWZmZXI7CisJc2MgPSBOR19OT0RFX1BSSVZBVEUobm9kZSk7CiAKLQlpZiAo
bSkgewotCi0JCXNjLT5zY19pbnRyX2J1ZmZlciA9IE5VTEw7Ci0KLQkJaGRyID0gbXRvZChtLCBu
Z19oY2lfZXZlbnRfcGt0X3QgKik7Ci0KLQkJaWYgKChzYy0+c2NfaG9vayA9PSBOVUxMKSB8fCBO
R19IT09LX05PVF9WQUxJRChzYy0+c2NfaG9vaykpIHsKLQkJCU5HX1VCVF9JTkZPKHNjLCAiTm8g
dXBzdHJlYW0gaG9va1xuIik7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJTkdfVUJUX1NUQVRfQllU
RVNfUkVDVihzYy0+c2Nfc3RhdCwgbS0+bV9wa3RoZHIubGVuKTsKLQotCQlpZiAobS0+bV9wa3Ro
ZHIubGVuIDwgc2l6ZW9mKCpoZHIpKSB7Ci0JCQlOR19VQlRfSU5GTyhzYywgIlBhY2tldCB0b28g
c2hvcnRcbiIpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCWlmIChoZHItPmxlbmd0aCA9PSAobS0+
bV9wa3RoZHIubGVuIC0gc2l6ZW9mKCpoZHIpKSkgewotCQkJTkdfVUJUX0lORk8oc2MsICJHb3Qg
Y29tcGxldGUgSENJIGV2ZW50IGZyYW1lLCAiCi0JCQkgICAgInBrdGxlbj0lZCwgbGVuZ3RoPSVk
XG4iLAotCQkJICAgIG0tPm1fcGt0aGRyLmxlbiwgaGRyLT5sZW5ndGgpOwotCi0JCQlOR19VQlRf
U1RBVF9QQ0tUU19SRUNWKHNjLT5zY19zdGF0KTsKLQotCQkJTkdfU0VORF9EQVRBX09OTFkoZXJy
b3IsIHNjLT5zY19ob29rLCBtKTsKLQotCQkJbSA9IE5VTEw7Ci0KLQkJCWlmIChlcnJvciAhPSAw
KSB7Ci0JCQkJTkdfVUJUX1NUQVRfSUVSUk9SKHNjLT5zY19zdGF0KTsKLQkJCX0KLQkJfSBlbHNl
IHsKLQkJCU5HX1VCVF9FUlIoc2MsICJJbnZhbGlkIEhDSSBldmVudCBmcmFtZSBzaXplLCAiCi0J
CQkgICAgImxlbmd0aD0lZCwgcGt0bGVuPSVkXG4iLAotCQkJICAgIGhkci0+bGVuZ3RoLCBtLT5t
X3BrdGhkci5sZW4pOwotCi0JCQlOR19VQlRfU1RBVF9JRVJST1Ioc2MtPnNjX3N0YXQpOwotCQl9
CisJaWYgKChzYy0+c2NfaG9vayA9PSBOVUxMKSB8fCBOR19IT09LX05PVF9WQUxJRChzYy0+c2Nf
aG9vaykpIHsKKwkJVUJUX0lORk8oc2MsICJubyB1cHN0cmVhbSBob29rXG4iKTsKKwkJTkdfTk9E
RV9VTlJFRihub2RlKTsKKwkJcmV0dXJuOyAvKiB1cHN0cmVhbSBob29rIGlzIGdvbmUgKi8KIAl9
Ci1kb25lOgotCWlmIChtKSB7Ci0JCU5HX0ZSRUVfTShtKTsKLQl9Ci0JLyogc3RhcnQgVVNCIHRy
YW5zZmVyIGlmIG5vdCBhbHJlYWR5IHN0YXJ0ZWQgKi8KIAotCXVzYjJfdHJhbnNmZXJfc3RhcnQo
c2MtPnNjX3hmZXJfaWZfMFsyXSk7CisJbSA9IE5VTEw7CiAKLQltdHhfdW5sb2NrKCZzYy0+c2Nf
bXR4KTsKLX0KLQotc3RhdGljIHZvaWQKLXVidF9idWxrX3JlYWRfY2FsbGJhY2soc3RydWN0IHVz
YjJfeGZlciAqeGZlcikKLXsKLQlzdHJ1Y3QgdWJ0X3NvZnRjICpzYyA9IHhmZXItPnByaXZfc2M7
Ci0Jc3RydWN0IG1idWYgKm07Ci0JdWludDMyX3QgbWF4X2xlbjsKLQl1aW50OF90ICpwdHI7Ci0K
IAlzd2l0Y2ggKFVTQl9HRVRfU1RBVEUoeGZlcikpIHsKIAljYXNlIFVTQl9TVF9UUkFOU0ZFUlJF
RDoKLQotCQkvKiBhbGxvY2F0ZSBuZXcgbWJ1ZiAqLwotCisJCS8qIEFsbG9jYXRlIG5ldyBtYnVm
ICovCiAJCU1HRVRIRFIobSwgTV9ET05UV0FJVCwgTVRfREFUQSk7Ci0KIAkJaWYgKG0gPT0gTlVM
TCkgewotCQkJZ290byB0cl9zZXR1cDsKKwkJCVVCVF9TVEFUX0lFUlJPUihzYyk7CisJCQlnb3Rv
IHN1Ym1pdF9uZXh0OwogCQl9CisKIAkJTUNMR0VUKG0sIE1fRE9OVFdBSVQpOwotCiAJCWlmICgh
KG0tPm1fZmxhZ3MgJiBNX0VYVCkpIHsKLQkJCU5HX0ZSRUVfTShtKTsKLQkJCWdvdG8gdHJfc2V0
dXA7CisJCQlVQlRfU1RBVF9JRVJST1Ioc2MpOworCQkJZ290byBzdWJtaXRfbmV4dDsKIAkJfQot
CQlpZiAoIShzYy0+c2NfZmxhZ3MgJiBVQlRfSEFWRV9GUkFNRV9UWVBFKSkgewotCQkJKm10b2Qo
bSwgdWludDhfdCAqKT0gTkdfSENJX0FDTF9EQVRBX1BLVDsKLQkJCW0tPm1fcGt0aGRyLmxlbiA9
IG0tPm1fbGVuID0gMTsKLQkJfSBlbHNlIHsKLQkJCW0tPm1fcGt0aGRyLmxlbiA9IG0tPm1fbGVu
ID0gMDsKLQkJfQogCi0JCW1heF9sZW4gPSAoTUNMQllURVMgLSBtLT5tX2xlbik7CisJCS8qIEFk
ZCBIQ0kgcGFja2V0IHR5cGUgKi8KKwkJKm10b2QobSwgdWludDhfdCAqKT0gTkdfSENJX0FDTF9E
QVRBX1BLVDsKKwkJbS0+bV9wa3RoZHIubGVuID0gbS0+bV9sZW4gPSAxOwogCi0JCWlmICh4ZmVy
LT5hY3RsZW4gPiBtYXhfbGVuKSB7Ci0JCQl4ZmVyLT5hY3RsZW4gPSBtYXhfbGVuOwotCQl9Ci0J
CXB0ciA9ICgodWludDhfdCAqKShtLT5tX2RhdGEpKSArIG0tPm1fbGVuOworCQlpZiAoeGZlci0+
YWN0bGVuID4gTUNMQllURVMgLSAxKQorCQkJeGZlci0+YWN0bGVuID0gTUNMQllURVMgLSAxOwog
Ci0JCXVzYjJfY29weV9vdXQoeGZlci0+ZnJidWZmZXJzLCAwLCBwdHIsIHhmZXItPmFjdGxlbik7
Ci0KKwkJdXNiMl9jb3B5X291dCh4ZmVyLT5mcmJ1ZmZlcnMsIDAsIG10b2QobSwgdWludDhfdCAq
KSArIDEsCisJCQl4ZmVyLT5hY3RsZW4pOwogCQltLT5tX3BrdGhkci5sZW4gKz0geGZlci0+YWN0
bGVuOwogCQltLT5tX2xlbiArPSB4ZmVyLT5hY3RsZW47CiAKLQkJTkdfVUJUX0lORk8oc2MsICJn
b3QgJWQgYnl0ZXMgZnJvbSBidWxrLWluICIKLQkJICAgICJwaXBlXG4iLCB4ZmVyLT5hY3RsZW4p
OworCQlVQlRfSU5GTyhzYywgImdvdCAlZCBieXRlcyBmcm9tIGJ1bGstaW4gcGlwZVxuIiwKKwkJ
CXhmZXItPmFjdGxlbik7CiAKLQkJc2MtPnNjX2J1bGtfaW5fYnVmZmVyID0gbTsKKwkJLyogVmFs
aWRhdGUgcGFja2V0IGFuZCBzZW5kIGl0IHVwIHRoZSBzdGFjayAqLworCQlpZiAobS0+bV9wa3Ro
ZHIubGVuIDwgc2l6ZW9mKCpoZHIpKSB7CisJCQlVQlRfSU5GTyhzYywgIkhDSSBBQ0wgcGFja2V0
IGlzIHRvbyBzaG9ydFxuIik7CiAKLQljYXNlIFVTQl9TVF9TRVRVUDoKLXRyX3NldHVwOgotCQlp
ZiAoc2MtPnNjX2J1bGtfaW5fYnVmZmVyKSB7Ci0JCQluZ19zZW5kX2ZuKHNjLT5zY19ub2RlLCBO
VUxMLCB1YnRfYnVsa19yZWFkX2NvbXBsZXRlLCBOVUxMLCAwKTsKLQkJCXJldHVybjsKKwkJCVVC
VF9TVEFUX0lFUlJPUihzYyk7CisJCQlnb3RvIHN1Ym1pdF9uZXh0OwogCQl9Ci0JCWlmIChzYy0+
c2NfZmxhZ3MgJiBVQlRfRkxBR19SRUFEX1NUQUxMKSB7Ci0JCQl1c2IyX3RyYW5zZmVyX3N0YXJ0
KHNjLT5zY194ZmVyX2lmXzBbNV0pOwotCQkJcmV0dXJuOwotCQl9Ci0JCXhmZXItPmZybGVuZ3Ro
c1swXSA9IHhmZXItPm1heF9kYXRhX2xlbmd0aDsKIAotCQl1c2IyX3N0YXJ0X2hhcmR3YXJlKHhm
ZXIpOwotCQlyZXR1cm47CisJCWhkciA9IG10b2QobSwgbmdfaGNpX2FjbGRhdGFfcGt0X3QgKik7
CisJCWxlbiA9IGxlMTZ0b2goaGRyLT5sZW5ndGgpOworCQlpZiAobGVuICE9IChtLT5tX3BrdGhk
ci5sZW4gLSBzaXplb2YoKmhkcikpKSB7CisJCQlVQlRfRVJSKHNjLCAiSW52YWxpZCBBQ0wgcGFj
a2V0IHNpemUsIGxlbmd0aD0lZCwgIiBcCisJCQkJInBrdGxlbj0lZFxuIiwgbGVuLCBtLT5tX3Br
dGhkci5sZW4pOwogCi0JZGVmYXVsdDoJCQkvKiBFcnJvciAqLwotCQlpZiAoeGZlci0+ZXJyb3Ig
IT0gVVNCX0VSUl9DQU5DRUxMRUQpIHsKLQkJCS8qIHRyeSB0byBjbGVhciBzdGFsbCBmaXJzdCAq
LwotCQkJc2MtPnNjX2ZsYWdzIHw9IFVCVF9GTEFHX1JFQURfU1RBTEw7Ci0JCQl1c2IyX3RyYW5z
ZmVyX3N0YXJ0KHNjLT5zY194ZmVyX2lmXzBbNV0pOworCQkJVUJUX1NUQVRfSUVSUk9SKHNjKTsK
KwkJCWdvdG8gc3VibWl0X25leHQ7CiAJCX0KLQkJcmV0dXJuOwogCi0JfQotfQorCQlVQlRfSU5G
TyhzYywgImdvdCBjb21wbGV0ZSBBQ0wgZGF0YSBwYWNrZXQsIHBrdGxlbj0lZCwgIiBcCisJCQki
bGVuZ3RoPSVkXG4iLCBtLT5tX3BrdGhkci5sZW4sIGxlbik7CiAKLXN0YXRpYyB2b2lkCi11YnRf
YnVsa19yZWFkX2NsZWFyX3N0YWxsX2NhbGxiYWNrKHN0cnVjdCB1c2IyX3hmZXIgKnhmZXIpCi17
Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSB4ZmVyLT5wcml2X3NjOwotCXN0cnVjdCB1c2IyX3hm
ZXIgKnhmZXJfb3RoZXIgPSBzYy0+c2NfeGZlcl9pZl8wWzFdOworCQlVQlRfU1RBVF9QQ0tUU19S
RUNWKHNjKTsKKwkJVUJUX1NUQVRfQllURVNfUkVDVihzYywgbS0+bV9wa3RoZHIubGVuKTsKIAot
CWlmICh1c2IyX2NsZWFyX3N0YWxsX2NhbGxiYWNrKHhmZXIsIHhmZXJfb3RoZXIpKSB7Ci0JCURQ
UklOVEYoInN0YWxsIGNsZWFyZWRcbiIpOwotCQlzYy0+c2NfZmxhZ3MgJj0gflVCVF9GTEFHX1JF
QURfU1RBTEw7Ci0JCXVzYjJfdHJhbnNmZXJfc3RhcnQoeGZlcl9vdGhlcik7Ci0JfQotfQorCQlO
R19TRU5EX0RBVEFfT05MWShlcnJvciwgc2MtPnNjX2hvb2ssIG0pOworCQlpZiAoZXJyb3IgIT0g
MCkKKwkJCVVCVF9TVEFUX0lFUlJPUihzYyk7CiAKLXN0YXRpYyB2b2lkCi11YnRfYnVsa19yZWFk
X2NvbXBsZXRlKG5vZGVfcCBub2RlLCBob29rX3AgaG9vaywgdm9pZCAqYXJnMSwgaW50IGFyZzIp
Ci17Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSBOR19OT0RFX1BSSVZBVEUobm9kZSk7Ci0Jc3Ry
dWN0IG1idWYgKm07Ci0JbmdfaGNpX2FjbGRhdGFfcGt0X3QgKmhkcjsKLQl1aW50MTZfdCBsZW47
Ci0JaW50IGVycm9yOworCQkvKiBtID09IE5VTEwgYXQgdGhpcyBwb2ludCAqLworCQkvKiBGQUxM
VEhPVUdIICovCiAKLQlpZiAoc2MgPT0gTlVMTCkgewotCQlyZXR1cm47Ci0JfQotCW10eF9sb2Nr
KCZzYy0+c2NfbXR4KTsKKwljYXNlIFVTQl9TVF9TRVRVUDoKK3N1Ym1pdF9uZXh0OgorCQlOR19G
UkVFX00obSk7IC8qIGNoZWNrcyBmb3IgbSAhPSBOVUxMICovCiAKLQltID0gc2MtPnNjX2J1bGtf
aW5fYnVmZmVyOwotCi0JaWYgKG0pIHsKLQotCQlzYy0+c2NfYnVsa19pbl9idWZmZXIgPSBOVUxM
OwotCi0JCWhkciA9IG10b2QobSwgbmdfaGNpX2FjbGRhdGFfcGt0X3QgKik7Ci0KLQkJaWYgKHNj
LT5zY19ob29rID09IE5VTEwgfHwgTkdfSE9PS19OT1RfVkFMSUQoc2MtPnNjX2hvb2spKSB7Ci0J
CQlOR19VQlRfSU5GTyhzYywgIk5vIHVwc3RyZWFtIGhvb2tcbiIpOwotCQkJZ290byBkb25lOwor
CQlpZiAoc2MtPnNjX2ZsYWdzICYgVUJUX0ZMQUdfUkVBRF9TVEFMTCkKKwkJCXVzYjJfdHJhbnNm
ZXJfc3RhcnQoc2MtPnNjX3hmZXJbVUJUX0lGXzBfQlVMS19DU19SRF0pOworCQllbHNlIHsKKwkJ
CXhmZXItPmZybGVuZ3Roc1swXSA9IHhmZXItPm1heF9kYXRhX2xlbmd0aDsKKwkJCXVzYjJfc3Rh
cnRfaGFyZHdhcmUoeGZlcik7CiAJCX0KLQkJTkdfVUJUX1NUQVRfQllURVNfUkVDVihzYy0+c2Nf
c3RhdCwgbS0+bV9wa3RoZHIubGVuKTsKKwkJYnJlYWs7CiAKLQkJaWYgKG0tPm1fcGt0aGRyLmxl
biA8IHNpemVvZigqaGRyKSkgewotCQkJTkdfVUJUX0lORk8oc2MsICJQYWNrZXQgdG9vIHNob3J0
XG4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlsZW4gPSBsZTE2dG9oKGhkci0+bGVuZ3RoKTsK
KwlkZWZhdWx0OiAvKiBFcnJvciAqLworCQlpZiAoeGZlci0+ZXJyb3IgIT0gVVNCX0VSUl9DQU5D
RUxMRUQpIHsKKwkJCVVCVF9XQVJOKHNjLCAiYnVsay1pbiB0cmFuc2ZlciBmYWlsZWQ6ICVzXG4i
LAorCQkJCXVzYjJfZXJyc3RyKHhmZXItPmVycm9yKSk7CiAKLQkJaWYgKGxlbiA9PSAobS0+bV9w
a3RoZHIubGVuIC0gc2l6ZW9mKCpoZHIpKSkgewotCQkJTkdfVUJUX0lORk8oc2MsICJHb3QgY29t
cGxldGUgQUNMIGRhdGEgZnJhbWUsICIKLQkJCSAgICAicGt0bGVuPSVkLCBsZW5ndGg9JWRcbiIs
Ci0JCQkgICAgbS0+bV9wa3RoZHIubGVuLCBsZW4pOworCQkJLyogVHJ5IHRvIGNsZWFyIHN0YWxs
IGZpcnN0ICovCisJCQlzYy0+c2NfZmxhZ3MgfD0gVUJUX0ZMQUdfUkVBRF9TVEFMTDsKKwkJCXVz
YjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hmZXJbVUJUX0lGXzBfQlVMS19DU19SRF0pOworCQl9
IGVsc2UKKwkJCU5HX05PREVfVU5SRUYobm9kZSk7IC8qIGNhbmNlbGxlZCAqLworCQlicmVhazsK
Kwl9Cit9IC8qIHVidF9idWxrX3JlYWRfY2FsbGJhY2sgKi8KIAotCQkJTkdfVUJUX1NUQVRfUENL
VFNfUkVDVihzYy0+c2Nfc3RhdCk7CisvKgorICogQ2FsbGVkIHdoZW4gb3V0Z29pbmcgY29udHJv
bCB0cmFuc2ZlciBpbml0aWF0ZWQgdG8gY2xlYXIgc3RhbGwgb24KKyAqIGluY29taW5nIGJ1bGsg
cGlwZSBoYXMgY29tcGxldGVkLgorICogVVNCIGNvbnRleHQuCisgKi8KIAotCQkJTkdfU0VORF9E
QVRBX09OTFkoZXJyb3IsIHNjLT5zY19ob29rLCBtKTsKK3N0YXRpYyB2b2lkCit1YnRfYnVsa19y
ZWFkX2NsZWFyX3N0YWxsX2NhbGxiYWNrKHN0cnVjdCB1c2IyX3hmZXIgKnhmZXIpCit7CisJbm9k
ZV9wCQkJbm9kZSA9IHhmZXItPnByaXZfc2M7CisJc3RydWN0IHVidF9zb2Z0Ywkqc2M7CisJc3Ry
dWN0IHVzYjJfeGZlcgkqeGZlcl9vdGhlcjsKIAotCQkJbSA9IE5VTEw7CisJaWYgKE5HX05PREVf
Tk9UX1ZBTElEKG5vZGUpKSB7CisJCU5HX05PREVfVU5SRUYobm9kZSk7CisJCXJldHVybjsgLyog
bmV0Z3JhcGggbm9kZSBpcyBnb25lICovCisJfQogCi0JCQlpZiAoZXJyb3IgIT0gMCkgewotCQkJ
CU5HX1VCVF9TVEFUX0lFUlJPUihzYy0+c2Nfc3RhdCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlO
R19VQlRfRVJSKHNjLCAiSW52YWxpZCBBQ0wgZnJhbWUgc2l6ZSwgIgotCQkJICAgICJsZW5ndGg9
JWQsIHBrdGxlbj0lZFxuIiwKLQkJCSAgICBsZW4sIG0tPm1fcGt0aGRyLmxlbik7CisJc2MgPSBO
R19OT0RFX1BSSVZBVEUobm9kZSk7CisJeGZlcl9vdGhlciA9IHNjLT5zY194ZmVyW1VCVF9JRl8w
X0JVTEtfRFRfUkRdOwogCi0JCQlOR19VQlRfU1RBVF9JRVJST1Ioc2MtPnNjX3N0YXQpOwotCQl9
Ci0JfQotZG9uZToKLQlpZiAobSkgewotCQlOR19GUkVFX00obSk7Ci0JfQotCS8qIHN0YXJ0IFVT
QiB0cmFuc2ZlciBpZiBub3QgYWxyZWFkeSBzdGFydGVkICovCisJaWYgKHVzYjJfY2xlYXJfc3Rh
bGxfY2FsbGJhY2soeGZlciwgeGZlcl9vdGhlcikpIHsKKwkJRFBSSU5URigic3RhbGwgY2xlYXJl
ZFxuIik7CisJCXNjLT5zY19mbGFncyAmPSB+VUJUX0ZMQUdfUkVBRF9TVEFMTDsKKwkJdXNiMl90
cmFuc2Zlcl9zdGFydCh4ZmVyX290aGVyKTsKKwl9IGVsc2UKKwkJTkdfTk9ERV9VTlJFRihub2Rl
KTsgLyogY2FudCBjbGVhciBzdGFsbCAqLworfSAvKiB1YnRfYnVsa19yZWFkX2NsZWFyX3N0YWxs
X2NhbGxiYWNrICovCiAKLQl1c2IyX3RyYW5zZmVyX3N0YXJ0KHNjLT5zY194ZmVyX2lmXzBbMV0p
OworLyoKKyAqIENhbGxlZCB3aGVuIG91dGdvaW5nIGJ1bGsgdHJhbnNmZXIgKEFDTCBwYWNrZXQp
IGhhcyBjb21wbGV0ZWQsIGkuZS4KKyAqIEFDTCBwYWNrZXQgd2FzIHNlbnQgdG8gdGhlIGRldmlj
ZS4KKyAqIFVTQiBjb250ZXh0LgorICovCiAKLQltdHhfdW5sb2NrKCZzYy0+c2NfbXR4KTsKLX0K
LQogc3RhdGljIHZvaWQKIHVidF9idWxrX3dyaXRlX2NhbGxiYWNrKHN0cnVjdCB1c2IyX3hmZXIg
KnhmZXIpCiB7Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSB4ZmVyLT5wcml2X3NjOwotCXN0cnVj
dCBtYnVmICptOworCW5vZGVfcAkJCW5vZGUgPSB4ZmVyLT5wcml2X3NjOworCXN0cnVjdCB1YnRf
c29mdGMJKnNjOworCXN0cnVjdCBtYnVmCQkqbTsKIAorCWlmIChOR19OT0RFX05PVF9WQUxJRChu
b2RlKSkgeworCQlOR19OT0RFX1VOUkVGKG5vZGUpOworCQlyZXR1cm47IC8qIG5ldGdyYXBoIG5v
ZGUgaXMgZ29uZSAqLworCX0KKworCXNjID0gTkdfTk9ERV9QUklWQVRFKG5vZGUpOworCiAJc3dp
dGNoIChVU0JfR0VUX1NUQVRFKHhmZXIpKSB7CiAJY2FzZSBVU0JfU1RfVFJBTlNGRVJSRUQ6Ci0J
CU5HX1VCVF9JTkZPKHNjLCAic2VudCAlZCBieXRlcyB0byBidWxrLW91dCAiCi0JCSAgICAicGlw
ZVxuIiwgeGZlci0+YWN0bGVuKTsKLQkJTkdfVUJUX1NUQVRfQllURVNfU0VOVChzYy0+c2Nfc3Rh
dCwgeGZlci0+YWN0bGVuKTsKLQkJTkdfVUJUX1NUQVRfUENLVFNfU0VOVChzYy0+c2Nfc3RhdCk7
CisJCWlmICh4ZmVyLT5lcnJvciAhPSAwKQorCQkJVUJUX1NUQVRfT0VSUk9SKHNjKTsKKwkJZWxz
ZSB7CisJCQlVQlRfSU5GTyhzYywgInNlbnQgJWQgYnl0ZXMgdG8gYnVsay1vdXQgcGlwZVxuIiwK
KwkJCQl4ZmVyLT5hY3RsZW4pOwogCi0JY2FzZSBVU0JfU1RfU0VUVVA6Ci0JCWlmIChzYy0+c2Nf
ZmxhZ3MgJiBVQlRfRkxBR19XUklURV9TVEFMTCkgewotCQkJdXNiMl90cmFuc2Zlcl9zdGFydChz
Yy0+c2NfeGZlcl9pZl8wWzRdKTsKLQkJCXJldHVybjsKKwkJCVVCVF9TVEFUX0JZVEVTX1NFTlQo
c2MsIHhmZXItPmFjdGxlbik7CisJCQlVQlRfU1RBVF9QQ0tUU19TRU5UKHNjKTsKIAkJfQotCQkv
KiBnZXQgbmV4dCBtYnVmLCBpZiBhbnkgKi8KKwkJLyogRkFMTFRIUk9VR0ggKi8KIAorCWNhc2Ug
VVNCX1NUX1NFVFVQOgorCQkvKiBHZXQgbmV4dCBtYnVmLCBpZiBhbnkgKi8KKwkJVUJUX01CVUZR
X0xPQ0soc2MpOwogCQlOR19CVF9NQlVGUV9ERVFVRVVFKCZzYy0+c2NfYWNscSwgbSk7CisJCVVC
VF9NQlVGUV9VTkxPQ0soc2MpOwogCiAJCWlmIChtID09IE5VTEwpIHsKLQkJCU5HX1VCVF9JTkZP
KHNjLCAiQUNMIGRhdGEgcXVldWUgaXMgZW1wdHlcbiIpOwotCQkJcmV0dXJuOworCQkJVUJUX0lO
Rk8oc2MsICJBQ0wgZGF0YSBxdWV1ZSBpcyBlbXB0eVxuIik7CisJCQlOR19OT0RFX1VOUkVGKG5v
ZGUpOworCQkJcmV0dXJuOyAvKiB0cmFuc2ZlciBjb21wbGV0ZWQgKi8KIAkJfQorCiAJCS8qCi0J
CSAqIGNoZWNrIEFDTCBkYXRhIGZyYW1lIHNpemUgYW5kCi0JCSAqIGNvcHkgaXQgYmFjayB0byBh
IGxpbmVhciBVU0IKLQkJICogdHJhbnNmZXIgYnVmZmVyOgorCQkgKiBDb3B5IEFDTCBkYXRhIGZy
YW1lIGJhY2sgdG8gYSBsaW5lYXIgVVNCIHRyYW5zZmVyIGJ1ZmZlcgorCQkgKiBhbmQgc2NoZWR1
bGUgdHJhbnNmZXIKIAkJICovCiAKLQkJaWYgKG0tPm1fcGt0aGRyLmxlbiA+IFVCVF9CVUxLX1dS
SVRFX0JVRkZFUl9TSVpFKSB7Ci0JCQlwYW5pYygiQUNMIGRhdGEgZnJhbWUgdG9vIGJpZywgc2l6
ZT0lZCwgbGVuPSVkXG4iLAotCQkJICAgIFVCVF9CVUxLX1dSSVRFX0JVRkZFUl9TSVpFLAotCQkJ
ICAgIG0tPm1fcGt0aGRyLmxlbik7Ci0JCX0KIAkJdXNiMl9tX2NvcHlfaW4oeGZlci0+ZnJidWZm
ZXJzLCAwLCBtLCAwLCBtLT5tX3BrdGhkci5sZW4pOworCQl4ZmVyLT5mcmxlbmd0aHNbMF0gPSBt
LT5tX3BrdGhkci5sZW47CiAKLQkJTkdfVUJUX0lORk8oc2MsICJidWxrLW91dCB0cmFuc2ZlciBo
YXMgYmVlbiBzdGFydGVkLCAiCi0JCSAgICAibGVuPSVkXG4iLCBtLT5tX3BrdGhkci5sZW4pOwor
CQlVQlRfSU5GTyhzYywgImJ1bGstb3V0IHRyYW5zZmVyIGhhcyBiZWVuIHN0YXJ0ZWQsIGxlbj0l
ZFxuIiwKKwkJCW0tPm1fcGt0aGRyLmxlbik7CiAKLQkJeGZlci0+ZnJsZW5ndGhzWzBdID0gbS0+
bV9wa3RoZHIubGVuOwotCiAJCU5HX0ZSRUVfTShtKTsKIAogCQl1c2IyX3N0YXJ0X2hhcmR3YXJl
KHhmZXIpOwotCQlyZXR1cm47CisJCWJyZWFrOwogCi0JZGVmYXVsdDoJCQkvKiBFcnJvciAqLwor
CWRlZmF1bHQ6IC8qIEVycm9yICovCiAJCWlmICh4ZmVyLT5lcnJvciAhPSBVU0JfRVJSX0NBTkNF
TExFRCkgeworCQkJVUJUX1dBUk4oc2MsICJidWxrLW91dCB0cmFuc2ZlciBmYWlsZWQ6ICVzXG4i
LAorCQkJCXVzYjJfZXJyc3RyKHhmZXItPmVycm9yKSk7CiAKLQkJCU5HX1VCVF9XQVJOKHNjLCAi
YnVsay1vdXQgdHJhbnNmZXIgZmFpbGVkOiAlc1xuIiwKLQkJCSAgICB1c2IyX2VycnN0cih4ZmVy
LT5lcnJvcikpOworCQkJVUJUX1NUQVRfT0VSUk9SKHNjKTsKIAotCQkJTkdfVUJUX1NUQVRfT0VS
Uk9SKHNjLT5zY19zdGF0KTsKLQogCQkJLyogdHJ5IHRvIGNsZWFyIHN0YWxsIGZpcnN0ICovCiAJ
CQlzYy0+c2NfZmxhZ3MgfD0gVUJUX0ZMQUdfV1JJVEVfU1RBTEw7Ci0JCQl1c2IyX3RyYW5zZmVy
X3N0YXJ0KHNjLT5zY194ZmVyX2lmXzBbNF0pOwotCQl9Ci0JCXJldHVybjsKLQorCQkJdXNiMl90
cmFuc2Zlcl9zdGFydChzYy0+c2NfeGZlcltVQlRfSUZfMF9CVUxLX0NTX1dSXSk7CisJCX0gZWxz
ZQorCQkJTkdfTk9ERV9VTlJFRihub2RlKTsgLyogY2FuY2VsbGVkICovCisJCWJyZWFrOwogCX0K
LX0KK30gLyogdWJ0X2J1bGtfd3JpdGVfY2FsbGJhY2sgKi8KIAorLyoKKyAqIENhbGxlZCB3aGVu
IG91dGdvaW5nIGNvbnRyb2wgdHJhbnNmZXIgaW5pdGlhdGVkIHRvIGNsZWFyIHN0YWxsIG9uCisg
KiBvdXRnb2luZyBidWxrIHBpcGUgaGFzIGNvbXBsZXRlZC4KKyAqIFVTQiBjb250ZXh0LgorICov
CisKIHN0YXRpYyB2b2lkCiB1YnRfYnVsa193cml0ZV9jbGVhcl9zdGFsbF9jYWxsYmFjayhzdHJ1
Y3QgdXNiMl94ZmVyICp4ZmVyKQogewotCXN0cnVjdCB1YnRfc29mdGMgKnNjID0geGZlci0+cHJp
dl9zYzsKLQlzdHJ1Y3QgdXNiMl94ZmVyICp4ZmVyX290aGVyID0gc2MtPnNjX3hmZXJfaWZfMFsw
XTsKKwlub2RlX3AJCQlub2RlID0geGZlci0+cHJpdl9zYzsKKwlzdHJ1Y3QgdWJ0X3NvZnRjCSpz
YzsKKwlzdHJ1Y3QgdXNiMl94ZmVyCSp4ZmVyX290aGVyOwogCisJaWYgKE5HX05PREVfTk9UX1ZB
TElEKG5vZGUpKSB7CisJCU5HX05PREVfVU5SRUYobm9kZSk7CisJCXJldHVybjsgLyogbmV0Z3Jh
cGggbm9kZSBpcyBnb25lICovCisJfQorCisJc2MgPSBOR19OT0RFX1BSSVZBVEUobm9kZSk7CisJ
eGZlcl9vdGhlciA9IHNjLT5zY194ZmVyW1VCVF9JRl8wX0JVTEtfRFRfV1JdOworCiAJaWYgKHVz
YjJfY2xlYXJfc3RhbGxfY2FsbGJhY2soeGZlciwgeGZlcl9vdGhlcikpIHsKIAkJRFBSSU5URigi
c3RhbGwgY2xlYXJlZFxuIik7CiAJCXNjLT5zY19mbGFncyAmPSB+VUJUX0ZMQUdfV1JJVEVfU1RB
TEw7CiAJCXVzYjJfdHJhbnNmZXJfc3RhcnQoeGZlcl9vdGhlcik7Ci0JfQotfQorCX0gZWxzZQor
CQlOR19OT0RFX1VOUkVGKG5vZGUpOyAvKiBjYW50IGNsZWFyIHN0YWxsICovCit9IC8qIHVidF9i
dWxrX3dyaXRlX2NsZWFyX3N0YWxsX2NhbGxiYWNrICovCiAKKy8qCisgKiBDYWxsZWQgd2hlbiBp
bmNvbWluZyBpc29jIHRyYW5zZmVyIChTQ08gcGFja2V0KSBoYXMgY29tcGxldGVkLCBpLmUuCisg
KiBTQ08gcGFja2V0IHdhcyByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UuCisgKiBVU0IgY29udGV4
dC4KKyAqLworCiBzdGF0aWMgdm9pZAogdWJ0X2lzb2NfcmVhZF9jYWxsYmFjayhzdHJ1Y3QgdXNi
Ml94ZmVyICp4ZmVyKQogewotCXN0cnVjdCB1YnRfc29mdGMgKnNjID0geGZlci0+cHJpdl9zYzsK
LQluZ19oY2lfc2NvZGF0YV9wa3RfdCBoZHI7Ci0Jc3RydWN0IG1idWYgKm07Ci0JdWludDhfdCAq
cHRyOwotCXVpbnQzMl90IG1heF9sZW47Ci0JdWludDMyX3QgbjsKLQl1aW50MzJfdCBvZmZzZXQ7
CisJbm9kZV9wCQkJbm9kZSA9IHhmZXItPnByaXZfc2M7CisJc3RydWN0IHVidF9zb2Z0Ywkqc2M7
CisJaW50CQkJbjsKIAotCXN3aXRjaCAoVVNCX0dFVF9TVEFURSh4ZmVyKSkgewotCWNhc2UgVVNC
X1NUX1RSQU5TRkVSUkVEOgotdHJfdHJhbnNmZXJyZWQ6Ci0JCW9mZnNldCA9IDA7CisJaWYgKE5H
X05PREVfTk9UX1ZBTElEKG5vZGUpKSB7CisJCU5HX05PREVfVU5SRUYobm9kZSk7CisJCXJldHVy
bjsgLyogbmV0Z3JhcGggbm9kZSBpcyBnb25lICovCisJfQogCi0JCWZvciAobiA9IDA7IG4gPCB4
ZmVyLT5uZnJhbWVzOyBuKyspIHsKKwlzYyA9IE5HX05PREVfUFJJVkFURShub2RlKTsKIAotCQkJ
aWYgKHhmZXItPmZybGVuZ3Roc1tuXSA+PSBzaXplb2YoaGRyKSkgeworCWlmICgoc2MtPnNjX2hv
b2sgPT0gTlVMTCkgfHwgTkdfSE9PS19OT1RfVkFMSUQoc2MtPnNjX2hvb2spKSB7CisJCVVCVF9J
TkZPKHNjLCAibm8gdXBzdHJlYW0gaG9va1xuIik7CisJCU5HX05PREVfVU5SRUYobm9kZSk7CisJ
CXJldHVybjsgLyogdXBzdHJlYW0gaG9vayBpcyBnb25lICovCisJfQogCi0JCQkJdXNiMl9jb3B5
X291dCh4ZmVyLT5mcmJ1ZmZlcnMsIG9mZnNldCwKLQkJCQkgICAgJmhkciwgc2l6ZW9mKGhkcikp
OworCXN3aXRjaCAoVVNCX0dFVF9TVEFURSh4ZmVyKSkgeworCWNhc2UgVVNCX1NUX1RSQU5TRkVS
UkVEOgorCQlmb3IgKG4gPSAwOyBuIDwgeGZlci0+bmZyYW1lczsgbiArKykKKwkJCWlmICh1YnRf
aXNvY19yZWFkX29uZV9mcmFtZSh4ZmVyLCBuKSA8IDApCisJCQkJYnJlYWs7CisJCS8qIEZBTExU
SFJPVUdIICovCiAKLQkJCQlpZiAoaGRyLmxlbmd0aCA9PSAoeGZlci0+ZnJsZW5ndGhzW25dIC0g
c2l6ZW9mKGhkcikpKSB7CisJY2FzZSBVU0JfU1RfU0VUVVA6CityZWFkX25leHQ6CisJCWZvciAo
biA9IDA7IG4gPCB4ZmVyLT5uZnJhbWVzOyBuICsrKQorCQkJeGZlci0+ZnJsZW5ndGhzW25dID0g
eGZlci0+bWF4X2ZyYW1lX3NpemU7CiAKLQkJCQkJTkdfVUJUX0lORk8oc2MsICJnb3QgY29tcGxl
dGUgU0NPIGRhdGEgIgotCQkJCQkgICAgImZyYW1lLCBsZW5ndGg9JWRcbiIsIGhkci5sZW5ndGgp
OworCQl1c2IyX3N0YXJ0X2hhcmR3YXJlKHhmZXIpOworCQlicmVhazsKIAotCQkJCQlpZiAoIU5H
X0JUX01CVUZRX0ZVTEwoJnNjLT5zY19zY2lxKSkgeworCWRlZmF1bHQ6IC8qIEVycm9yICovCisg
ICAgICAgICAgICAgICAgaWYgKHhmZXItPmVycm9yICE9IFVTQl9FUlJfQ0FOQ0VMTEVEKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBVQlRfU1RBVF9JRVJST1Ioc2MpOworICAgICAgICAgICAg
ICAgICAgICAgICAgZ290byByZWFkX25leHQ7CisJCQkvKiBOT1QgUkVBQ0hFRCAqLworICAgICAg
ICAgICAgICAgIH0KIAotCQkJCQkJLyogYWxsb2NhdGUgYSBuZXcgbWJ1ZiAqLworCQlOR19OT0RF
X1VOUkVGKG5vZGUpOyAvKiBjYW5jZWxsZWQgKi8KKwkJYnJlYWs7CisJfQorfSAvKiB1YnRfaXNv
Y19yZWFkX2NhbGxiYWNrICovCiAKLQkJCQkJCU1HRVRIRFIobSwgTV9ET05UV0FJVCwgTVRfREFU
QSk7CisvKgorICogSGVscGVyIGZ1bmN0aW9uLiBDYWxsZWQgZnJvbSB1YnRfaXNvY19yZWFkX2Nh
bGxiYWNrKCkgdG8gcmVhZAorICogU0NPIGRhdGEgZnJvbSBvbmUgZnJhbWUuCisgKiBVU0IgY29u
dGV4dC4KKyAqLwogCi0JCQkJCQlpZiAobSA9PSBOVUxMKSB7Ci0JCQkJCQkJZ290byB0cl9zZXR1
cDsKLQkJCQkJCX0KLQkJCQkJCU1DTEdFVChtLCBNX0RPTlRXQUlUKTsKK3N0YXRpYyBpbnQKK3Vi
dF9pc29jX3JlYWRfb25lX2ZyYW1lKHN0cnVjdCB1c2IyX3hmZXIgKnhmZXIsIGludCBmcmFtZV9u
bykKK3sKKwlzdHJ1Y3QgdWJ0X3NvZnRjCSpzYyA9IHhmZXItPnByaXZfc2M7CisJc3RydWN0IG1i
dWYJCSptOworCWludAkJCWxlbiwgd2FudCwgZ290LCBlcnJvcjsKIAotCQkJCQkJaWYgKCEobS0+
bV9mbGFncyAmIE1fRVhUKSkgewotCQkJCQkJCU5HX0ZSRUVfTShtKTsKLQkJCQkJCQlnb3RvIHRy
X3NldHVwOwotCQkJCQkJfQotCQkJCQkJLyoKLQkJCQkJCSAqIGZpeCBTQ08gZGF0YSBmcmFtZSBo
ZWFkZXIKLQkJCQkJCSAqIGlmIHJlcXVpcmVkCi0JCQkJCQkgKi8KKwkvKiBHZXQgZXhpc3Rpbmcg
U0NPIHJlYXNzZW1ibHkgYnVmZmVyICovCisJbSA9IHNjLT5zY19pc29jX2luX2J1ZmZlcjsKKwlz
Yy0+c2NfaXNvY19pbl9idWZmZXIgPSBOVUxMOwogCi0JCQkJCQlpZiAoIShzYy0+c2NfZmxhZ3Mg
JiBVQlRfSEFWRV9GUkFNRV9UWVBFKSkgewotCQkJCQkJCSptdG9kKG0sIHVpbnQ4X3QgKik9IE5H
X0hDSV9TQ09fREFUQV9QS1Q7Ci0JCQkJCQkJbS0+bV9wa3RoZHIubGVuID0gbS0+bV9sZW4gPSAx
OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQltLT5tX3BrdGhkci5sZW4gPSBtLT5tX2xlbiA9IDA7
Ci0JCQkJCQl9CisJLyogV2hpbGUgd2UgaGF2ZSBkYXRhIGluIHRoZSBmcmFtZSAqLworCXdoaWxl
ICgobGVuID0geGZlci0+ZnJsZW5ndGhzW2ZyYW1lX25vXSkgPiAwKSB7CisJCWlmIChtID09IE5V
TEwpIHsKKwkJCS8qIFN0YXJ0IG5ldyByZWFzc2VtYmx5IGJ1ZmZlciAqLworCQkJTUdFVEhEUiht
LCBNX0RPTlRXQUlULCBNVF9EQVRBKTsKKwkJCWlmIChtID09IE5VTEwpIHsKKwkJCQlVQlRfU1RB
VF9JRVJST1Ioc2MpOworCQkJCXJldHVybiAoLTEpOwkvKiBYWFggb3V0IG9mIHN5bmMhICovCisJ
CQl9CiAKLQkJCQkJCW1heF9sZW4gPSAoTUNMQllURVMgLSBtLT5tX2xlbik7Ci0KLQkJCQkJCWlm
ICh4ZmVyLT5mcmxlbmd0aHNbbl0gPiBtYXhfbGVuKSB7Ci0JCQkJCQkJeGZlci0+ZnJsZW5ndGhz
W25dID0gbWF4X2xlbjsKLQkJCQkJCX0KLQkJCQkJCXB0ciA9ICgodWludDhfdCAqKShtLT5tX2Rh
dGEpKSArIG0tPm1fbGVuOwotCi0JCQkJCQl1c2IyX2NvcHlfb3V0Ci0JCQkJCQkgICAgKHhmZXIt
PmZyYnVmZmVycywgb2Zmc2V0LAotCQkJCQkJICAgIHB0ciwgeGZlci0+ZnJsZW5ndGhzW25dKTsK
LQotCQkJCQkJbS0+bV9wa3RoZHIubGVuICs9IHhmZXItPmZybGVuZ3Roc1tuXTsKLQkJCQkJCW0t
Pm1fbGVuICs9IHhmZXItPmZybGVuZ3Roc1tuXTsKLQotCQkJCQkJTkdfQlRfTUJVRlFfRU5RVUVV
RSgmc2MtPnNjX3NjaXEsIG0pOwotCQkJCQl9Ci0JCQkJfQorCQkJTUNMR0VUKG0sIE1fRE9OVFdB
SVQpOworCQkJaWYgKCEobS0+bV9mbGFncyAmIE1fRVhUKSkgeworCQkJCVVCVF9TVEFUX0lFUlJP
UihzYyk7CisJCQkJTkdfRlJFRV9NKG0pOworCQkJCXJldHVybiAoLTEpOwkvKiBYWFggb3V0IG9m
IHN5bmMhICovCiAJCQl9Ci0JCQlvZmZzZXQgKz0geGZlci0+bWF4X2ZyYW1lX3NpemU7Ci0JCX0K
IAotCWNhc2UgVVNCX1NUX1NFVFVQOgotdHJfc2V0dXA6CisJCQkvKiBFeHBlY3QgU0NPIGhlYWRl
ciAqLworCQkJKm10b2QobSwgdWludDhfdCAqKSA9IE5HX0hDSV9TQ09fREFUQV9QS1Q7CisJCQlt
LT5tX3BrdGhkci5sZW4gPSBtLT5tX2xlbiA9IGdvdCA9IDE7CisJCQl3YW50ID0gc2l6ZW9mKG5n
X2hjaV9zY29kYXRhX3BrdF90KTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB3
ZSBoYXZlIFNDTyBoZWFkZXIgYW5kIGlmIHNvIAorCQkJICogYWRqdXN0IGFtb3VudCBvZiBkYXRh
IHdlIHdhbnQKKwkJCSAqLworCQkJZ290ID0gbS0+bV9wa3RoZHIubGVuOworCQkJd2FudCA9IHNp
emVvZihuZ19oY2lfc2NvZGF0YV9wa3RfdCk7CiAKLQkJaWYgKE5HX0JUX01CVUZRX0xFTigmc2Mt
PnNjX3NjaXEpID4gMCkgewotCQkJbmdfc2VuZF9mbihzYy0+c2Nfbm9kZSwgTlVMTCwgdWJ0X2lz
b2NfcmVhZF9jb21wbGV0ZSwgTlVMTCwgMCk7CisJCQlpZiAoZ290ID49IHdhbnQpCisJCQkJd2Fu
dCArPSBtdG9kKG0sIG5nX2hjaV9zY29kYXRhX3BrdF90ICopLT5sZW5ndGg7CiAJCX0KLQkJZm9y
IChuID0gMDsgbiA8IHhmZXItPm5mcmFtZXM7IG4rKykgewotCQkJeGZlci0+ZnJsZW5ndGhzW25d
ID0geGZlci0+bWF4X2ZyYW1lX3NpemU7Ci0JCX0KIAotCQl1c2IyX3N0YXJ0X2hhcmR3YXJlKHhm
ZXIpOwotCQlyZXR1cm47CisJCS8qIEFwcGVuZCBmcmFtZSBkYXRhIHRvIHRoZSBTQ08gcmVhc3Nl
bWJseSBidWZmZXIgKi8KKwkJaWYgKGdvdCArIGxlbiA+IHdhbnQpCisJCQlsZW4gPSB3YW50IC0g
Z290OwogCi0JZGVmYXVsdDoJCQkvKiBFcnJvciAqLwotCQlpZiAoeGZlci0+ZXJyb3IgPT0gVVNC
X0VSUl9DQU5DRUxMRUQpIHsKLQkJCS8qIGlnbm9yZSAqLwotCQkJcmV0dXJuOwotCQl9Ci0JCWdv
dG8gdHJfdHJhbnNmZXJyZWQ7Ci0JfQotfQorCQl1c2IyX2NvcHlfb3V0KHhmZXItPmZyYnVmZmVy
cywgZnJhbWVfbm8gKiB4ZmVyLT5tYXhfZnJhbWVfc2l6ZSwKKwkJCW10b2QobSwgdWludDhfdCAq
KSArIG0tPm1fcGt0aGRyLmxlbiwgbGVuKTsKIAotc3RhdGljIHZvaWQKLXVidF9pc29jX3JlYWRf
Y29tcGxldGUobm9kZV9wIG5vZGUsIGhvb2tfcCBob29rLCB2b2lkICphcmcxLCBpbnQgYXJnMikK
LXsKLQl1YnRfc29mdGNfcCBzYyA9IE5HX05PREVfUFJJVkFURShub2RlKTsKLQlzdHJ1Y3QgbWJ1
ZiAqbTsKLQlpbnQgZXJyb3I7CisJCW0tPm1fcGt0aGRyLmxlbiArPSBsZW47CisJCW0tPm1fbGVu
ICs9IGxlbjsKKwkJeGZlci0+ZnJsZW5ndGhzW2ZyYW1lX25vXSAtPSBsZW47CiAKLQlpZiAoc2Mg
PT0gTlVMTCkgewotCQlyZXR1cm47Ci0JfQotCW10eF9sb2NrKCZzYy0+c2NfbXR4KTsKKwkJLyog
Q2hlY2sgaWYgd2UgZ290IGV2ZXJ5dGhpbmcgd2Ugd2FudGVkLCBpZiBub3QgLSBjb250aW51ZSAq
LworCQlpZiAoZ290ICE9IHdhbnQpCisJCQljb250aW51ZTsKIAotCXdoaWxlICgxKSB7CisJCS8q
IElmIHdlIGdvdCBoZXJlIHRoZW4gd2UgZ290IGNvbXBsZXRlIFNDTyBmcmFtZSAqLworCQlVQlRf
SU5GTyhzYywgImdvdCBjb21wbGV0ZSBTQ08gZGF0YSBmcmFtZSwgcGt0bGVuPSVkLCAiIFwKKwkJ
CSJsZW5ndGg9JWRcbiIsIG0tPm1fcGt0aGRyLmxlbiwKKwkJCW10b2QobSwgbmdfaGNpX3Njb2Rh
dGFfcGt0X3QgKiktPmxlbmd0aCk7CiAKLQkJTkdfQlRfTUJVRlFfREVRVUVVRSgmc2MtPnNjX3Nj
aXEsIG0pOworCQlVQlRfU1RBVF9QQ0tUU19SRUNWKHNjKTsKKwkJVUJUX1NUQVRfQllURVNfUkVD
VihzYywgbS0+bV9wa3RoZHIubGVuKTsKIAotCQlpZiAobSA9PSBOVUxMKSB7Ci0JCQlicmVhazsK
LQkJfQotCQlpZiAoc2MtPnNjX2hvb2sgPT0gTlVMTCB8fCBOR19IT09LX05PVF9WQUxJRChzYy0+
c2NfaG9vaykpIHsKLQkJCU5HX1VCVF9JTkZPKHNjLCAiTm8gdXBzdHJlYW0gaG9va1xuIik7Ci0J
CQlnb3RvIGRvbmU7Ci0JCX0KLQkJTkdfVUJUX0lORk8oc2MsICJHb3QgY29tcGxldGUgU0NPIGRh
dGEgZnJhbWUsICIKLQkJICAgICJwa3RsZW49JWQgYnl0ZXNcbiIsIG0tPm1fcGt0aGRyLmxlbik7
CisJCU5HX1NFTkRfREFUQV9PTkxZKGVycm9yLCBzYy0+c2NfaG9vaywgbSk7CisJCWlmIChlcnJv
ciAhPSAwKQorCQkJVUJUX1NUQVRfSUVSUk9SKHNjKTsKIAotCQlOR19VQlRfU1RBVF9QQ0tUU19S
RUNWKHNjLT5zY19zdGF0KTsKLQkJTkdfVUJUX1NUQVRfQllURVNfUkVDVihzYy0+c2Nfc3RhdCwg
bS0+bV9wa3RoZHIubGVuKTsKKwkJLyogbSA9PSBOVUxMIGF0IHRoaXMgcG9pbnQgKi8KKwl9CiAK
LQkJTkdfU0VORF9EQVRBX09OTFkoZXJyb3IsIHNjLT5zY19ob29rLCBtKTsKKwkvKiBQdXQgU0NP
IHJlYXNzZW1ibHkgYnVmZmVyIGJhY2sgKi8KKwlzYy0+c2NfaXNvY19pbl9idWZmZXIgPSBtOwog
Ci0JCW0gPSBOVUxMOworCXJldHVybiAoMCk7Cit9IC8qIHVidF9pc29jX3JlYWRfb25lX2ZyYW1l
ICovCiAKLQkJaWYgKGVycm9yKSB7Ci0JCQlOR19VQlRfU1RBVF9JRVJST1Ioc2MtPnNjX3N0YXQp
OwotCQl9Ci1kb25lOgotCQlpZiAobSkgewotCQkJTkdfRlJFRV9NKG0pOwotCQl9Ci0JfQorLyoK
KyAqIENhbGxlZCB3aGVuIG91dGdvaW5nIGlzb2MgdHJhbnNmZXIgKFNDTyBwYWNrZXQpIGhhcyBj
b21wbGV0ZWQsIGkuZS4KKyAqIFNDTyBwYWNrZXQgd2FzIHNlbnQgdG8gdGhlIGRldmljZS4KKyAq
IFVTQiBjb250ZXh0LgorICovCiAKLQltdHhfdW5sb2NrKCZzYy0+c2NfbXR4KTsKLX0KLQogc3Rh
dGljIHZvaWQKIHVidF9pc29jX3dyaXRlX2NhbGxiYWNrKHN0cnVjdCB1c2IyX3hmZXIgKnhmZXIp
CiB7Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSB4ZmVyLT5wcml2X3NjOwotCXN0cnVjdCBtYnVm
ICptOwotCXVpbnQzMl90IG47Ci0JdWludDMyX3QgbGVuOwotCXVpbnQzMl90IG9mZnNldDsKKwlu
b2RlX3AJCQlub2RlID0geGZlci0+cHJpdl9zYzsKKwlzdHJ1Y3QgdWJ0X3NvZnRjCSpzYzsKKwlz
dHJ1Y3QgbWJ1ZgkJKm07CisJaW50CQkJbiwgc3BhY2UsIG9mZnNldDsKIAorCWlmIChOR19OT0RF
X05PVF9WQUxJRChub2RlKSkgeworCQlOR19OT0RFX1VOUkVGKG5vZGUpOworCQlyZXR1cm47IC8q
IG5ldGdyYXBoIG5vZGUgaXMgZ29uZSAqLworCX0KKworCXNjID0gTkdfTk9ERV9QUklWQVRFKG5v
ZGUpOworCiAJc3dpdGNoIChVU0JfR0VUX1NUQVRFKHhmZXIpKSB7CiAJY2FzZSBVU0JfU1RfVFJB
TlNGRVJSRUQ6Ci10cl90cmFuc2ZlcnJlZDoKLQkJaWYgKHhmZXItPmVycm9yKSB7Ci0JCQlOR19V
QlRfU1RBVF9PRVJST1Ioc2MtPnNjX3N0YXQpOwotCQl9IGVsc2UgewotCQkJTkdfVUJUX1NUQVRf
QllURVNfU0VOVChzYy0+c2Nfc3RhdCwgeGZlci0+YWN0bGVuKTsKLQkJCU5HX1VCVF9TVEFUX1BD
S1RTX1NFTlQoc2MtPnNjX3N0YXQpOworCQlpZiAoeGZlci0+ZXJyb3IpCisJCQlVQlRfU1RBVF9P
RVJST1Ioc2MpOworCQllbHNlIHsKKwkJCVVCVF9JTkZPKHNjLCAic2VudCAlZCBieXRlcyB0byBp
c29jLW91dCBwaXBlXG4iLAorCQkJCXhmZXItPmFjdGxlbik7CisKKwkJCVVCVF9TVEFUX0JZVEVT
X1NFTlQoc2MsIHhmZXItPmFjdGxlbik7CisJCQlVQlRfU1RBVF9QQ0tUU19TRU5UKHNjKTsKIAkJ
fQorCQkvKiBGQUxMVEhST1VHSCAqLwogCiAJY2FzZSBVU0JfU1RfU0VUVVA6CitzZW5kX25leHQ6
CiAJCW9mZnNldCA9IDA7CisJCXNwYWNlID0geGZlci0+bWF4X2ZyYW1lX3NpemUgKiB4ZmVyLT5u
ZnJhbWVzOworCQltID0gTlVMTDsKIAotCQlmb3IgKG4gPSAwOyBuIDwgeGZlci0+bmZyYW1lczsg
bisrKSB7CisJCXdoaWxlIChzcGFjZSA+IDApIHsKKwkJCWlmIChtID09IE5VTEwpIHsKKwkJCQlV
QlRfTUJVRlFfTE9DSyhzYyk7CisJCQkJTkdfQlRfTUJVRlFfREVRVUVVRSgmc2MtPnNjX3Njb3Es
IG0pOworCQkJCVVCVF9NQlVGUV9VTkxPQ0soc2MpOwogCi0JCQlOR19CVF9NQlVGUV9ERVFVRVVF
KCZzYy0+c2Nfc2NvcSwgbSk7CisJCQkJaWYgKG0gPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQl9
CiAKLQkJCWlmIChtKSB7Ci0JCQkJbGVuID0gbWluKHhmZXItPm1heF9mcmFtZV9zaXplLCBtLT5t
X3BrdGhkci5sZW4pOworCQkJbiA9IG1pbihzcGFjZSwgbS0+bV9wa3RoZHIubGVuKTsKKwkJCWlm
IChuID4gMCkgeworCQkJCXVzYjJfbV9jb3B5X2luKHhmZXItPmZyYnVmZmVycywgb2Zmc2V0LCBt
LDAsIG4pOworCQkJCW1fYWRqKG0sIG4pOwogCi0JCQkJdXNiMl9tX2NvcHlfaW4oeGZlci0+ZnJi
dWZmZXJzLCBvZmZzZXQsIG0sIDAsIGxlbik7CisJCQkJb2Zmc2V0ICs9IG47CisJCQkJc3BhY2Ug
LT0gbjsKKwkJCX0KIAotCQkJCU5HX0ZSRUVfTShtKTsKKwkJCWlmIChtLT5tX3BrdGhkci5sZW4g
PT0gMCkKKwkJCQlOR19GUkVFX00obSk7IC8qIHNldHMgbSA9IE5VTEwgKi8KKwkJfQogCi0JCQkJ
eGZlci0+ZnJsZW5ndGhzW25dID0gbGVuOwotCQkJCW9mZnNldCArPSBsZW47Ci0JCQl9IGVsc2Ug
ewotCQkJCXhmZXItPmZybGVuZ3Roc1tuXSA9IDA7Ci0JCQl9CisJCS8qIFB1dCB3aGF0ZXZlciBp
cyBsZWZ0IGZyb20gbWJ1ZiBiYWNrIG9uIHF1ZXVlICovCisJCWlmIChtICE9IE5VTEwpIHsKKwkJ
CVVCVF9NQlVGUV9MT0NLKHNjKTsKKwkJCU5HX0JUX01CVUZRX1BSRVBFTkQoJnNjLT5zY19zY29x
LCBtKTsKKwkJCVVCVF9NQlVGUV9VTkxPQ0soc2MpOwogCQl9CiAKKwkJLyoKKwkJICogQ2FsY3Vs
YXRlIHNpemVzIGZvciBpc29jIGZyYW1lcy4KKwkJICogTm90ZSB0aGF0IG9mZnNldCBjb3VsZCBi
ZSAwIGF0IHRoaXMgcG9pbnQgKGkuZS4gd2UgaGF2ZQorCQkgKiBub3RoaW5nIHRvIHNlbmQpLiBU
aGF0IGlzIGZpbmUsIGFzIHdlIGhhdmUgaXNvYy4gdHJhbnNmZXJzCisJCSAqIGdvaW5nIGluIGJv
dGggZGlyZWN0aW9ucyBhbGwgdGhlIHRpbWUuIEluIHRoaXMgY2FzZSBpdAorCQkgKiB3b3VsZCBi
ZSBqdXN0IGVtcHR5IGlzb2MuIHRyYW5zZmVyLgorCQkgKi8KKworCQlmb3IgKG4gPSAwOyBuIDwg
eGZlci0+bmZyYW1lczsgbiArKykgeworCQkJeGZlci0+ZnJsZW5ndGhzW25dID0gbWluKG9mZnNl
dCwgeGZlci0+bWF4X2ZyYW1lX3NpemUpOworCQkJb2Zmc2V0IC09IHhmZXItPmZybGVuZ3Roc1tu
XTsKKwkJfQorCiAJCXVzYjJfc3RhcnRfaGFyZHdhcmUoeGZlcik7Ci0JCXJldHVybjsKKwkJYnJl
YWs7CiAKLQlkZWZhdWx0OgkJCS8qIEVycm9yICovCi0JCWlmICh4ZmVyLT5lcnJvciA9PSBVU0Jf
RVJSX0NBTkNFTExFRCkgewotCQkJLyogaWdub3JlICovCi0JCQlyZXR1cm47CisJZGVmYXVsdDog
LyogRXJyb3IgKi8KKwkJaWYgKHhmZXItPmVycm9yICE9IFVTQl9FUlJfQ0FOQ0VMTEVEKSB7CisJ
CQlVQlRfU1RBVF9PRVJST1Ioc2MpOworCQkJZ290byBzZW5kX25leHQ7CisJCQkvKiBOT1QgUkVB
Q0hFRCAqLwogCQl9Ci0JCWdvdG8gdHJfdHJhbnNmZXJyZWQ7CisKKwkJTkdfTk9ERV9VTlJFRihu
b2RlKTsgLyogY2FuY2VsbGVkICovCisJCWJyZWFrOwogCX0KIH0KIAogLyoqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiogICAgICAgICAgICAgICAgICAgICAgICBO
ZXRncmFwaCBzcGVjaWZpYworICoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2x1
ZSAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAq
IE5ldGdyYXBoIG5vZGUgY29uc3RydWN0b3IuCi0gKiBEbyBub3QgYWxsb3cgdG8gY3JlYXRlIG5v
ZGUgb2YgdGhpcyB0eXBlOgorICogU2NoZWR1bGUgZ2x1ZSB0YXNrLiBTaG91bGQgYmUgY2FsbGVk
IHdpdGggc2NfbWJ1ZnFfbXR4IGhlbGQuCisgKiBOZXRncmFwaCBjb250ZXh0LgogICovCiAKIHN0
YXRpYyBpbnQKLW5nX3VidF9jb25zdHJ1Y3Rvcihub2RlX3Agbm9kZSkKK3VidF90YXNrX3NjaGVk
dWxlKHVidF9zb2Z0Y19wIHNjLCBpbnQgYWN0aW9uKQogewotCXJldHVybiAoRUlOVkFMKTsKLX0K
KwltdHhfYXNzZXJ0KCZzYy0+c2NfbWJ1ZnFfbXR4LCBNQV9PV05FRCk7CiAKKwlpZiAoKHNjLT5z
Y190YXNrX2ZsYWdzICYgYWN0aW9uKSA9PSAwKSB7CisJCS8qCisJCSAqIFRyeSB0byBoYW5kbGUg
Y29ybmVyIGNhc2Ugd2hlbiAic3RhcnQgYWxsIiBhbmQgInN0b3AgYWxsIgorCQkgKiBhY3Rpb25z
IGNhbiBib3RoIGJlIHNldCBiZWZvcmUgdGFzayBpcyBleGVjdXRlZC4KKwkJICoKKwkJICogQXNz
dW1lIHRoZSBmb2xsb3dpbmc6CisJCSAqIDEpICJzdG9wIGFsbCIgYWZ0ZXIgInN0YXJ0IGFsbCIg
Y2FuY2VscyAic3RhcnQgYWxsIiwgYW5kLAorCQkgKiAgICBrZWVwcyAic3RvcCBhbGwiCisJCSAq
CisJCSAqIDIpICJzdGFydCBhbGwiIGFmdGVyICJzdG9wIGFsbCIgaXMgZmluZSBiZWNhdXNlIHRh
c2sgaXMKKwkJICogICAgZXhlY3V0aW5nICJzdG9wIGFsbCIgZmlyc3QKKwkJICovCisKKwkJaWYg
KGFjdGlvbiA9PSBVQlRfRkxBR19UX1NUT1BfQUxMICYmCisJCSAgICAoc2MtPnNjX3Rhc2tfZmxh
Z3MgJiBVQlRfRkxBR19UX1NUQVJUX0FMTCkgIT0gMCkKKwkJCXNjLT5zY190YXNrX2ZsYWdzICY9
IH5VQlRfRkxBR19UX1NUQVJUX0FMTDsKKworCQlzYy0+c2NfdGFza19mbGFncyB8PSBhY3Rpb247
CisJfQorCisJaWYgKHNjLT5zY190YXNrX2ZsYWdzICYgVUJUX0ZMQUdfVF9QRU5ESU5HKQorCQly
ZXR1cm4gKDEpOworCisJaWYgKHRhc2txdWV1ZV9lbnF1ZXVlKHRhc2txdWV1ZV9zd2ksICZzYy0+
c2NfdGFzaykgPT0gMCkgeworCQlOR19OT0RFX1JFRihzYy0+c2Nfbm9kZSk7CisJCXNjLT5zY190
YXNrX2ZsYWdzIHw9IFVCVF9GTEFHX1RfUEVORElORzsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwkv
KiBYWFg6IGkgdGhpbmsgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisKKwlyZXR1cm4gKDAp
OworfSAvKiB1YnRfdGFza19zY2hlZHVsZSAqLworCiAvKgotICogTmV0Z3JhcGggbm9kZSBkZXN0
cnVjdG9yLgotICogRGVzdHJveSBub2RlIG9ubHkgd2hlbiBkZXZpY2UgaGFzIGJlZW4gZGV0YWNo
ZWQ6CisgKiBHbHVlIHRhc2suIEV4YW1pbmVzIHNjX3Rhc2tfZmxhZ3MgYW5kIGRvZXMgdGhpbmdz
IGRlcGVuZGluZyBvbiBpdC4KKyAqIFRhc2txdWV1ZSBjb250ZXh0LgogICovCiAKLXN0YXRpYyBp
bnQKLW5nX3VidF9zaHV0ZG93bihub2RlX3Agbm9kZSkKK3N0YXRpYyB2b2lkCit1YnRfdGFzayh2
b2lkICpjb250ZXh0LCBpbnQgcGVuZGluZykKIHsKLQlzdHJ1Y3QgdWJ0X3NvZnRjICpzYyA9IE5H
X05PREVfUFJJVkFURShub2RlKTsKKwlub2RlX3AJCW5vZGUgPSBjb250ZXh0OworCXVidF9zb2Z0
Y19wCXNjOworCWludAkJdGFza19mbGFnczsKIAotCS8qIExldCBvbGQgbm9kZSBnbyAqLwotCU5H
X05PREVfU0VUX1BSSVZBVEUobm9kZSwgTlVMTCk7Ci0JTkdfTk9ERV9VTlJFRihub2RlKTsKKwlp
ZiAoTkdfTk9ERV9OT1RfVkFMSUQobm9kZSkpIHsKKwkJTkdfTk9ERV9VTlJFRihub2RlKTsKKwkJ
cmV0dXJuOyAvKiBuZXRncmFwaCBub2RlIGlzIGdvbmUgKi8KKwl9CiAKLQlpZiAoc2MgPT0gTlVM
TCkgewotCQlnb3RvIGRvbmU7CisJc2MgPSBOR19OT0RFX1BSSVZBVEUobm9kZSk7CisKKwlVQlRf
TUJVRlFfTE9DSyhzYyk7CisJdGFza19mbGFncyA9IHNjLT5zY190YXNrX2ZsYWdzOworCXNjLT5z
Y190YXNrX2ZsYWdzID0gMDsKKwlVQlRfTUJVRlFfVU5MT0NLKHNjKTsKKworCS8qIFN0b3AgYWxs
IFVTQiB0cmFuc2ZlcnMgKi8KKwlpZiAodGFza19mbGFncyAmIFVCVF9GTEFHX1RfU1RPUF9BTEwp
IHsKKwkJaW50CWk7CisKKwkJLyoKKwkJICogSW50ZXJmYWNlICMwCisJCSAqLworCisJCW10eF9s
b2NrKCZzYy0+c2NfaWZfbXR4WzBdKTsKKworCQlmb3IgKGkgPSBVQlRfSUZfMF9CVUxLX0RUX1dS
OyBpIDwgVUJUX0lGXzBfTl9UUkFOU0ZFUjsgaSArKykKKwkJCXVzYjJfdHJhbnNmZXJfc3RvcChz
Yy0+c2NfeGZlcltpXSk7CisKKwkJbXR4X3VubG9jaygmc2MtPnNjX2lmX210eFswXSk7CisKKwkJ
LyoKKwkJICogSW50ZXJmYWNlICMxCisJCSAqLworCisJCW10eF9sb2NrKCZzYy0+c2NfaWZfbXR4
WzFdKTsKKworCQlmb3IgKGkgPSBVQlRfSUZfMV9JU09DX0RUX1JEMTsgaSA8IFVCVF9OX1RSQU5T
RkVSOyBpICsrKSAKKwkJCXVzYjJfdHJhbnNmZXJfc3RvcChzYy0+c2NfeGZlcltpXSk7CisKKwkJ
bXR4X3VubG9jaygmc2MtPnNjX2lmX210eFsxXSk7CiAJfQotCW10eF9sb2NrKCZzYy0+c2NfbXR4
KTsKIAotCS8qIENyZWF0ZSBOZXRncmFwaCBub2RlICovCi0JaWYgKG5nX21ha2Vfbm9kZV9jb21t
b24oJnR5cGVzdHJ1Y3QsICZzYy0+c2Nfbm9kZSkgIT0gMCkgewotCQlwcmludGYoIiVzOiBDb3Vs
ZCBub3QgY3JlYXRlIE5ldGdyYXBoIG5vZGVcbiIsCi0JCSAgICBzYy0+c2NfbmFtZSk7Ci0JCXNj
LT5zY19ub2RlID0gTlVMTDsKLQkJZ290byBkb25lOworCS8qIFN0YXJ0IGFsbCBpbmNvbWluZyBV
U0IgdHJhbnNmZXJzICovCisJaWYgKHRhc2tfZmxhZ3MgJiBVQlRfRkxBR19UX1NUQVJUX0FMTCkg
eworCQkvKgorCQkgKiBJbnRlcmZhY2UgIzAKKwkJICovCisKKwkJbXR4X2xvY2soJnNjLT5zY19p
Zl9tdHhbMF0pOworCQl1YnRfeGZlcl9zdGFydChzYywgVUJUX0lGXzBfSU5UUl9EVF9SRCk7CisJ
CXVidF94ZmVyX3N0YXJ0KHNjLCBVQlRfSUZfMF9CVUxLX0RUX1JEKTsKKwkJbXR4X3VubG9jaygm
c2MtPnNjX2lmX210eFswXSk7CisKKwkJLyoKKwkJICogSW50ZXJmYWNlICMxCisJCSAqIFN0YXJ0
IGJvdGggcmVhZCBhbmQgd3JpdGUgaXNvYy4gdHJhbnNmZXJzIGJ5IGRlZmF1bHQuCisJCSAqIEdl
dCB0aGVtIGdvaW5nIGFsbCB0aGUgdGltZSBldmVuIGlmIHdlIGhhdmUgbm90aGluZworCQkgKiB0
byBzZW5kIHRvIGF2b2lkIGFueSBkZWxheXMuCisJCSAqLworCisJCW10eF9sb2NrKCZzYy0+c2Nf
aWZfbXR4WzFdKTsKKwkJdWJ0X3hmZXJfc3RhcnQoc2MsIFVCVF9JRl8xX0lTT0NfRFRfUkQxKTsK
KwkJdWJ0X3hmZXJfc3RhcnQoc2MsIFVCVF9JRl8xX0lTT0NfRFRfUkQyKTsKKwkJdWJ0X3hmZXJf
c3RhcnQoc2MsIFVCVF9JRl8xX0lTT0NfRFRfV1IxKTsKKwkJdWJ0X3hmZXJfc3RhcnQoc2MsIFVC
VF9JRl8xX0lTT0NfRFRfV1IyKTsKKwkJbXR4X3VubG9jaygmc2MtPnNjX2lmX210eFsxXSk7CiAJ
fQotCS8qIE5hbWUgbm9kZSAqLwotCWlmIChuZ19uYW1lX25vZGUoc2MtPnNjX25vZGUsIHNjLT5z
Y19uYW1lKSAhPSAwKSB7Ci0JCXByaW50ZigiJXM6IENvdWxkIG5vdCBuYW1lIE5ldGdyYXBoIG5v
ZGVcbiIsCi0JCSAgICBzYy0+c2NfbmFtZSk7Ci0JCU5HX05PREVfVU5SRUYoc2MtPnNjX25vZGUp
OwotCQlzYy0+c2Nfbm9kZSA9IE5VTEw7Ci0JCWdvdG8gZG9uZTsKKworIAkvKiBTdGFydCBvdXRn
b2luZyBjb250cm9sIHRyYW5zZmVyICovCisJaWYgKHRhc2tfZmxhZ3MgJiBVQlRfRkxBR19UX1NU
QVJUX0NUUkwpIHsKKwkJbXR4X2xvY2soJnNjLT5zY19pZl9tdHhbMF0pOworCQl1YnRfeGZlcl9z
dGFydChzYywgVUJUX0lGXzBfQ1RSTF9EVF9XUik7CisJCW10eF91bmxvY2soJnNjLT5zY19pZl9t
dHhbMF0pOwogCX0KLQlOR19OT0RFX1NFVF9QUklWQVRFKHNjLT5zY19ub2RlLCBzYyk7Ci0JTkdf
Tk9ERV9GT1JDRV9XUklURVIoc2MtPnNjX25vZGUpOwogCi1kb25lOgotCWlmIChzYykgewotCQlt
dHhfdW5sb2NrKCZzYy0+c2NfbXR4KTsKKwkvKiBTdGFydCBvdXRnb2luZyBidWxrIHRyYW5zZmVy
ICovCisJaWYgKHRhc2tfZmxhZ3MgJiBVQlRfRkxBR19UX1NUQVJUX0JVTEspIHsKKwkJbXR4X2xv
Y2soJnNjLT5zY19pZl9tdHhbMF0pOworCQl1YnRfeGZlcl9zdGFydChzYywgVUJUX0lGXzBfQlVM
S19EVF9XUik7CisJCW10eF91bmxvY2soJnNjLT5zY19pZl9tdHhbMF0pOwogCX0KLQlyZXR1cm4g
KDApOwotfQogCisJTkdfTk9ERV9VTlJFRihub2RlKTsKK30gLyogdWJ0X3Rhc2sgKi8KKwogLyoK
LSAqIENyZWF0ZSBuZXcgaG9vay4KLSAqIFRoZXJlIGNhbiBvbmx5IGJlIG9uZS4KKyAqIFN0YXJ0
IFVTQiB0cmFuc2Zlci4KKyAqIEhlbHBlciBmdW5jdGlvbiBjYWxsZWQgZnJvbSB1YnRfdGFzay4g
TXVzdCBiZSBjYWxsZWQgd2l0aCBhcHByb3ByaWF0ZQorICogaW50ZXJmYWNlIGxvY2sgaGVsZC4K
KyAqIFRhc2txdWV1ZSBjb250ZXh0LgogICovCiAKLXN0YXRpYyBpbnQKLW5nX3VidF9uZXdob29r
KG5vZGVfcCBub2RlLCBob29rX3AgaG9vaywgY2hhciBjb25zdCAqbmFtZSkKK3N0YXRpYyB2b2lk
Cit1YnRfeGZlcl9zdGFydCh1YnRfc29mdGNfcCBzYywgaW50IHRyYW5zZmVyKQogewotCXN0cnVj
dCB1YnRfc29mdGMgKnNjID0gTkdfTk9ERV9QUklWQVRFKG5vZGUpOwotCWludCBlcnJvciA9IDA7
Ci0KLQlpZiAoc3RyY21wKG5hbWUsIE5HX1VCVF9IT09LKSAhPSAwKSB7Ci0JCXJldHVybiAoRUlO
VkFMKTsKKwlpZiAoIXVzYjJfdHJhbnNmZXJfcGVuZGluZyhzYy0+c2NfeGZlclt0cmFuc2Zlcl0p
KSB7CisJCU5HX05PREVfUkVGKHNjLT5zY19ub2RlKTsKKwkJdXNiMl90cmFuc2Zlcl9zdGFydChz
Yy0+c2NfeGZlclt0cmFuc2Zlcl0pOwogCX0KLQltdHhfbG9jaygmc2MtPnNjX210eCk7Cit9IC8q
IHVidF94ZmVyX3N0YXJ0ICovCiAKLQlpZiAoc2MtPnNjX2hvb2sgIT0gTlVMTCkgewotCQllcnJv
ciA9IEVJU0NPTk47Ci0JfSBlbHNlIHsKLQkJc2MtPnNjX2hvb2sgPSBob29rOwotCX0KKy8qKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqICAgICAgICAgICAgICAg
ICAgICAgICAgTmV0Z3JhcGggc3BlY2lmaWMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKi8KIAotCW10eF91bmxvY2soJnNjLT5zY19tdHgpOworLyoKKyAqIE5ldGdy
YXBoIG5vZGUgY29uc3RydWN0b3IuIERvIG5vdCBhbGxvdyB0byBjcmVhdGUgbm9kZSBvZiB0aGlz
IHR5cGUuCisgKiBOZXRncmFwaCBjb250ZXh0LgorICovCiAKLQlyZXR1cm4gKGVycm9yKTsKLX0K
K3N0YXRpYyBpbnQKK25nX3VidF9jb25zdHJ1Y3Rvcihub2RlX3Agbm9kZSkKK3sKKwlyZXR1cm4g
KEVJTlZBTCk7Cit9IC8qIG5nX3VidF9jb25zdHJ1Y3RvciAqLwogCiAvKgotICogQ29ubmVjdCBo
b29rLgotICogU3RhcnQgaW5jb21pbmcgVVNCIHRyYW5zZmVycworICogTmV0Z3JhcGggbm9kZSBk
ZXN0cnVjdG9yLiBEZXN0cm95IG5vZGUgb25seSB3aGVuIGRldmljZSBoYXMgYmVlbiBkZXRhY2hl
ZC4KKyAqIE5ldGdyYXBoIGNvbnRleHQuCiAgKi8KIAogc3RhdGljIGludAotbmdfdWJ0X2Nvbm5l
Y3QoaG9va19wIGhvb2spCituZ191YnRfc2h1dGRvd24obm9kZV9wIG5vZGUpCiB7Ci0Jc3RydWN0
IHVidF9zb2Z0YyAqc2MgPSBOR19OT0RFX1BSSVZBVEUoTkdfSE9PS19OT0RFKGhvb2spKTsKKwlp
ZiAobm9kZS0+bmRfZmxhZ3MgJiBOR0ZfUkVBTExZX0RJRSkgeworCQkvKgorICAgICAgICAgICAg
ICAgICAqIFdlIGNhbWUgaGVyZSBiZWNhdXNlIHRoZSBVU0IgZGV2aWNlIGlzIGJlaW5nCisJCSAq
IGRldGFjaGVkLCBzbyBzdG9wIGJlaW5nIHBlcnNpc3RhbnQuCisgICAgICAgICAgICAgICAgICov
CisJCU5HX05PREVfU0VUX1BSSVZBVEUobm9kZSwgTlVMTCk7CisJCU5HX05PREVfVU5SRUYobm9k
ZSk7CisJfSBlbHNlCisJCU5HX05PREVfUkVWSVZFKG5vZGUpOyAvKiB0ZWxsIG5nX3Jtbm9kZSB3
ZSBhcmUgcGVyc2lzYW50ICovCiAKLQlOR19IT09LX0ZPUkNFX1FVRVVFKE5HX0hPT0tfUEVFUiho
b29rKSk7CisJcmV0dXJuICgwKTsKK30gLyogbmdfdWJ0X3NodXRkb3duICovCiAKLQltdHhfbG9j
aygmc2MtPnNjX210eCk7CisvKgorICogQ3JlYXRlIG5ldyBob29rLiBUaGVyZSBjYW4gb25seSBi
ZSBvbmUuCisgKiBOZXRncmFwaCBjb250ZXh0LgorICovCiAKLQlzYy0+c2NfZmxhZ3MgfD0gKFVC
VF9GTEFHX1JFQURfU1RBTEwgfAotCSAgICBVQlRfRkxBR19XUklURV9TVEFMTCB8Ci0JICAgIFVC
VF9GTEFHX0lOVFJfU1RBTEwpOworc3RhdGljIGludAorbmdfdWJ0X25ld2hvb2sobm9kZV9wIG5v
ZGUsIGhvb2tfcCBob29rLCBjaGFyIGNvbnN0ICpuYW1lKQoreworCXN0cnVjdCB1YnRfc29mdGMJ
KnNjID0gTkdfTk9ERV9QUklWQVRFKG5vZGUpOwogCi0JLyogc3RhcnQgaW50ciB0cmFuc2ZlciAq
LwotCXVzYjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hmZXJfaWZfMFsyXSk7CisJaWYgKHN0cmNt
cChuYW1lLCBOR19VQlRfSE9PSykgIT0gMCkKKwkJcmV0dXJuIChFSU5WQUwpOwogCi0JLyogc3Rh
cnQgYnVsay1pbiB0cmFuc2ZlciAqLwotCXVzYjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hmZXJf
aWZfMFsxXSk7CisJaWYgKHNjLT5zY19ob29rICE9IE5VTEwpCisJCXJldHVybiAoRUlTQ09OTik7
CiAKLQkvKiBzdGFydCBidWxrLW91dCB0cmFuc2ZlciAqLwotCXVzYjJfdHJhbnNmZXJfc3RhcnQo
c2MtPnNjX3hmZXJfaWZfMFswXSk7CisJc2MtPnNjX2hvb2sgPSBob29rOwogCi0JLyogc3RhcnQg
Y29udHJvbC1vdXQgdHJhbnNmZXIgKi8KLQl1c2IyX3RyYW5zZmVyX3N0YXJ0KHNjLT5zY194ZmVy
X2lmXzBbM10pOwotI2lmIDAKLQlYWFggY2FuIGVuYWJsZSB0aGlzIFhYWAorCXJldHVybiAoMCk7
Cit9IC8qIG5nX3VidF9uZXdob29rICovCiAKLQkvKiBzdGFydCBpc29jLWluIHRyYW5zZmVyICov
Ci0JICAgICB1c2IyX3RyYW5zZmVyX3N0YXJ0KHNjLT5zY194ZmVyX2lmXzFbMF0pOworLyoKKyAq
IENvbm5lY3QgaG9vay4gU3RhcnQgaW5jb21pbmcgVVNCIHRyYW5zZmVycy4KKyAqIE5ldGdyYXBo
IGNvbnRleHQuCisgKi8KIAotCXVzYjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hmZXJfaWZfMVsx
XSk7CitzdGF0aWMgaW50CituZ191YnRfY29ubmVjdChob29rX3AgaG9vaykKK3sKKwlzdHJ1Y3Qg
dWJ0X3NvZnRjCSpzYyA9IE5HX05PREVfUFJJVkFURShOR19IT09LX05PREUoaG9vaykpOwogCi0J
Lyogc3RhcnQgaXNvYy1vdXQgdHJhbnNmZXIgKi8KLQl1c2IyX3RyYW5zZmVyX3N0YXJ0KHNjLT5z
Y194ZmVyX2lmXzFbMl0pOwotCXVzYjJfdHJhbnNmZXJfc3RhcnQoc2MtPnNjX3hmZXJfaWZfMVsz
XSk7Ci0jZW5kaWYKKwlOR19IT09LX0ZPUkNFX1FVRVVFKE5HX0hPT0tfUEVFUihob29rKSk7CiAK
LQltdHhfdW5sb2NrKCZzYy0+c2NfbXR4KTsKKwlVQlRfTUJVRlFfTE9DSyhzYyk7CisJdWJ0X3Rh
c2tfc2NoZWR1bGUoc2MsIFVCVF9GTEFHX1RfU1RBUlRfQUxMKTsKKwlVQlRfTUJVRlFfVU5MT0NL
KHNjKTsKIAogCXJldHVybiAoMCk7Ci19Cit9IC8qIG5nX3VidF9jb25uZWN0ICovCiAKIC8qCi0g
KiBEaXNjb25uZWN0IGhvb2sKKyAqIERpc2Nvbm5lY3QgaG9vay4KKyAqIE5ldGdyYXBoIGNvbnRl
eHQuCiAgKi8KIAogc3RhdGljIGludAogbmdfdWJ0X2Rpc2Nvbm5lY3QoaG9va19wIGhvb2spCiB7
Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSBOR19OT0RFX1BSSVZBVEUoTkdfSE9PS19OT0RFKGhv
b2spKTsKLQlpbnQgZXJyb3IgPSAwOworCW5vZGVfcAkJCW5vZGUgPSBOR19IT09LX05PREUoaG9v
ayk7CisJc3RydWN0IHVidF9zb2Z0Ywkqc2M7CiAKLQlpZiAoc2MgIT0gTlVMTCkgeworCWlmIChO
R19OT0RFX05PVF9WQUxJRChub2RlKSkKKwkJcmV0dXJuICgwKTsKIAotCQltdHhfbG9jaygmc2Mt
PnNjX210eCk7CisJc2MgPSBOR19OT0RFX1BSSVZBVEUobm9kZSk7CiAKLQkJaWYgKGhvb2sgIT0g
c2MtPnNjX2hvb2spIHsKLQkJCWVycm9yID0gRUlOVkFMOwotCQl9IGVsc2UgeworCWlmIChob29r
ICE9IHNjLT5zY19ob29rKQorCQlyZXR1cm4gKEVJTlZBTCk7CiAKLQkJCS8qIHN0b3AgaW50ciB0
cmFuc2ZlciAqLwotCQkJdXNiMl90cmFuc2Zlcl9zdG9wKHNjLT5zY194ZmVyX2lmXzBbMl0pOwot
CQkJdXNiMl90cmFuc2Zlcl9zdG9wKHNjLT5zY194ZmVyX2lmXzBbNl0pOworCXNjLT5zY19ob29r
ID0gTlVMTDsKIAotCQkJLyogc3RvcCBidWxrLWluIHRyYW5zZmVyICovCi0JCQl1c2IyX3RyYW5z
ZmVyX3N0b3Aoc2MtPnNjX3hmZXJfaWZfMFsxXSk7Ci0JCQl1c2IyX3RyYW5zZmVyX3N0b3Aoc2Mt
PnNjX3hmZXJfaWZfMFs1XSk7CisJVUJUX01CVUZRX0xPQ0soc2MpOwogCi0JCQkvKiBzdG9wIGJ1
bGstb3V0IHRyYW5zZmVyICovCi0JCQl1c2IyX3RyYW5zZmVyX3N0b3Aoc2MtPnNjX3hmZXJfaWZf
MFswXSk7Ci0JCQl1c2IyX3RyYW5zZmVyX3N0b3Aoc2MtPnNjX3hmZXJfaWZfMFs0XSk7CisJLyog
RHJhaW4gcXVldWVzICovCisJTkdfQlRfTUJVRlFfRFJBSU4oJnNjLT5zY19jbWRxKTsKKwlOR19C
VF9NQlVGUV9EUkFJTigmc2MtPnNjX2FjbHEpOworCU5HX0JUX01CVUZRX0RSQUlOKCZzYy0+c2Nf
c2NvcSk7CiAKLQkJCS8qIHN0b3AgY29udHJvbCB0cmFuc2ZlciAqLwotCQkJdXNiMl90cmFuc2Zl
cl9zdG9wKHNjLT5zY194ZmVyX2lmXzBbM10pOworCS8qIEtpY2sgb2ZmIHRhc2sgdG8gc3RvcCBh
bGwgVVNCIHhmZXJzICovCisJdWJ0X3Rhc2tfc2NoZWR1bGUoc2MsIFVCVF9GTEFHX1RfU1RPUF9B
TEwpOwogCi0JCQkvKiBzdG9wIGlzb2MtaW4gdHJhbnNmZXIgKi8KLQkJCXVzYjJfdHJhbnNmZXJf
c3RvcChzYy0+c2NfeGZlcl9pZl8xWzBdKTsKLQkJCXVzYjJfdHJhbnNmZXJfc3RvcChzYy0+c2Nf
eGZlcl9pZl8xWzFdKTsKKwlVQlRfTUJVRlFfVU5MT0NLKHNjKTsKIAotCQkJLyogc3RvcCBpc29j
LW91dCB0cmFuc2ZlciAqLwotCQkJdXNiMl90cmFuc2Zlcl9zdG9wKHNjLT5zY194ZmVyX2lmXzFb
Ml0pOwotCQkJdXNiMl90cmFuc2Zlcl9zdG9wKHNjLT5zY194ZmVyX2lmXzFbM10pOwotCi0JCQkv
KiBjbGVhbnVwIHF1ZXVlcyAqLwotCQkJTkdfQlRfTUJVRlFfRFJBSU4oJnNjLT5zY19jbWRxKTsK
LQkJCU5HX0JUX01CVUZRX0RSQUlOKCZzYy0+c2NfYWNscSk7Ci0JCQlOR19CVF9NQlVGUV9EUkFJ
Tigmc2MtPnNjX3Njb3EpOwotCQkJTkdfQlRfTUJVRlFfRFJBSU4oJnNjLT5zY19zY2lxKTsKLQot
CQkJc2MtPnNjX2hvb2sgPSBOVUxMOwotCQl9Ci0KLQkJbXR4X3VubG9jaygmc2MtPnNjX210eCk7
Ci0JfQotCXJldHVybiAoZXJyb3IpOwotfQotCisJcmV0dXJuICgwKTsKK30gLyogbmdfdWJ0X2Rp
c2Nvbm5lY3QgKi8KKwkKIC8qCi0gKiBQcm9jZXNzIGNvbnRyb2wgbWVzc2FnZQorICogUHJvY2Vz
cyBjb250cm9sIG1lc3NhZ2UuCisgKiBOZXRncmFwaCBjb250ZXh0LgogICovCiAKIHN0YXRpYyBp
bnQKIG5nX3VidF9yY3Ztc2cobm9kZV9wIG5vZGUsIGl0ZW1fcCBpdGVtLCBob29rX3AgbGFzdGhv
b2spCiB7Ci0Jc3RydWN0IHVidF9zb2Z0YyAqc2MgPSBOR19OT0RFX1BSSVZBVEUobm9kZSk7Ci0J
c3RydWN0IG5nX21lc2cgKm1zZyA9IE5VTEwsICpyc3AgPSBOVUxMOwotCXN0cnVjdCBuZ19idF9t
YnVmcSAqcSA9IE5VTEw7Ci0JaW50IGVycm9yID0gMCwgcXVldWUsIHFsZW47CisJc3RydWN0IHVi
dF9zb2Z0Ywkqc2MgPSBOR19OT0RFX1BSSVZBVEUobm9kZSk7CisJc3RydWN0IG5nX21lc2cJCSpt
c2csICpyc3AgPSBOVUxMOworCXN0cnVjdCBuZ19idF9tYnVmcQkqcTsKKwlpbnQJCQllcnJvciA9
IDAsIHF1ZXVlLCBxbGVuOwogCi0JaWYgKHNjID09IE5VTEwpIHsKLQkJTkdfRlJFRV9JVEVNKGl0
ZW0pOwotCQlyZXR1cm4gKEVIT1NURE9XTik7Ci0JfQotCW10eF9sb2NrKCZzYy0+c2NfbXR4KTsK
LQogCU5HSV9HRVRfTVNHKGl0ZW0sIG1zZyk7CiAKIAlzd2l0Y2ggKG1zZy0+aGVhZGVyLnR5cGVj
b29raWUpIHsKQEAgLTE1MjcsMjUgKzE2NTUsMzEgQEAKIAkJc3dpdGNoIChtc2ctPmhlYWRlci5j
bWQpIHsKIAkJY2FzZSBOR01fVEVYVF9TVEFUVVM6CiAJCQlOR19NS1JFU1BPTlNFKHJzcCwgbXNn
LCBOR19URVhUUkVTUE9OU0UsIE1fTk9XQUlUKTsKLQkJCWlmIChyc3AgPT0gTlVMTCkKKwkJCWlm
IChyc3AgPT0gTlVMTCkgewogCQkJCWVycm9yID0gRU5PTUVNOwotCQkJZWxzZQotCQkJCXNucHJp
bnRmKHJzcC0+ZGF0YSwgTkdfVEVYVFJFU1BPTlNFLAotCQkJCSAgICAiSG9vazogJXNcbiIgXAot
CQkJCSAgICAiRmxhZ3M6ICUjeFxuIiBcCi0JCQkJICAgICJEZWJ1ZzogJWRcbiIgXAotCQkJCSAg
ICAiQ01EIHF1ZXVlOiBbaGF2ZTolZCxtYXg6JWRdXG4iIFwKLQkJCQkgICAgIkFDTCBxdWV1ZTog
W2hhdmU6JWQsbWF4OiVkXVxuIiBcCi0JCQkJICAgICJTQ08gcXVldWU6IFtoYXZlOiVkLG1heDol
ZF0iLAotCQkJCSAgICAoc2MtPnNjX2hvb2sgIT0gTlVMTCkgPyBOR19VQlRfSE9PSyA6ICIiLAot
CQkJCSAgICBzYy0+c2NfZmxhZ3MsCi0JCQkJICAgIHNjLT5zY19kZWJ1ZywKLQkJCQkgICAgTkdf
QlRfTUJVRlFfTEVOKCZzYy0+c2NfY21kcSksCi0JCQkJICAgIHNjLT5zY19jbWRxLm1heGxlbiwK
LQkJCQkgICAgTkdfQlRfTUJVRlFfTEVOKCZzYy0+c2NfYWNscSksCi0JCQkJICAgIHNjLT5zY19h
Y2xxLm1heGxlbiwKLQkJCQkgICAgTkdfQlRfTUJVRlFfTEVOKCZzYy0+c2Nfc2NvcSksCi0JCQkJ
ICAgIHNjLT5zY19zY29xLm1heGxlbik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXNucHJpbnRm
KHJzcC0+ZGF0YSwgTkdfVEVYVFJFU1BPTlNFLAorCQkJCSJSZWZzOiAlZFxuIiBcCisJCQkJIkhv
b2s6ICVzXG4iIFwKKwkJCQkiRmxhZ3M6ICUjeFxuIiBcCisJCQkJIlRhc2sgZmxhZ3M6ICUjeFxu
IiBcCisJCQkJIkRlYnVnOiAlZFxuIiBcCisJCQkJIkNNRCBxdWV1ZTogW2hhdmU6JWQsbWF4OiVk
XVxuIiBcCisJCQkJIkFDTCBxdWV1ZTogW2hhdmU6JWQsbWF4OiVkXVxuIiBcCisJCQkJIlNDTyBx
dWV1ZTogW2hhdmU6JWQsbWF4OiVkXSIsCisJCQkJbm9kZS0+bmRfcmVmcywKKwkJCQkoc2MtPnNj
X2hvb2sgIT0gTlVMTCkgPyBOR19VQlRfSE9PSzoiIiwKKwkJCQlzYy0+c2NfZmxhZ3MsCisJCQkJ
c2MtPnNjX3Rhc2tfZmxhZ3MsCisJCQkJc2MtPnNjX2RlYnVnLAorCQkJCXNjLT5zY19jbWRxLmxl
biwKKwkJCQlzYy0+c2NfY21kcS5tYXhsZW4sCisJCQkJc2MtPnNjX2FjbHEubGVuLAorCQkJCXNj
LT5zY19hY2xxLm1heGxlbiwKKwkJCQlzYy0+c2Nfc2NvcS5sZW4sCisJCQkJc2MtPnNjX3Njb3Eu
bWF4bGVuKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CkBAIC0xNTU3LDU5ICsxNjkxLDU0IEBA
CiAJY2FzZSBOR01fVUJUX0NPT0tJRToKIAkJc3dpdGNoIChtc2ctPmhlYWRlci5jbWQpIHsKIAkJ
Y2FzZSBOR01fVUJUX05PREVfU0VUX0RFQlVHOgotCQkJaWYgKG1zZy0+aGVhZGVyLmFyZ2xlbiAh
PSBzaXplb2YobmdfdWJ0X25vZGVfZGVidWdfZXApKQorCQkJaWYgKG1zZy0+aGVhZGVyLmFyZ2xl
biAhPSBzaXplb2YobmdfdWJ0X25vZGVfZGVidWdfZXApKXsKIAkJCQllcnJvciA9IEVNU0dTSVpF
OwotCQkJZWxzZQotCQkJCXNjLT5zY19kZWJ1ZyA9Ci0JCQkJICAgICooKG5nX3VidF9ub2RlX2Rl
YnVnX2VwICopIChtc2ctPmRhdGEpKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc2MtPnNjX2Rl
YnVnID0gKigobmdfdWJ0X25vZGVfZGVidWdfZXAgKikgKG1zZy0+ZGF0YSkpOwogCQkJYnJlYWs7
CiAKIAkJY2FzZSBOR01fVUJUX05PREVfR0VUX0RFQlVHOgogCQkJTkdfTUtSRVNQT05TRShyc3As
IG1zZywgc2l6ZW9mKG5nX3VidF9ub2RlX2RlYnVnX2VwKSwKIAkJCSAgICBNX05PV0FJVCk7Ci0J
CQlpZiAocnNwID09IE5VTEwpCisJCQlpZiAocnNwID09IE5VTEwpIHsKIAkJCQllcnJvciA9IEVO
T01FTTsKLQkJCWVsc2UKLQkJCQkqKChuZ191YnRfbm9kZV9kZWJ1Z19lcCAqKSAocnNwLT5kYXRh
KSkgPQotCQkJCSAgICBzYy0+c2NfZGVidWc7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCSooKG5n
X3VidF9ub2RlX2RlYnVnX2VwICopIChyc3AtPmRhdGEpKSA9IHNjLT5zY19kZWJ1ZzsKIAkJCWJy
ZWFrOwogCiAJCWNhc2UgTkdNX1VCVF9OT0RFX1NFVF9RTEVOOgotCQkJaWYgKG1zZy0+aGVhZGVy
LmFyZ2xlbiAhPSBzaXplb2YobmdfdWJ0X25vZGVfcWxlbl9lcCkpCisJCQlpZiAobXNnLT5oZWFk
ZXIuYXJnbGVuICE9IHNpemVvZihuZ191YnRfbm9kZV9xbGVuX2VwKSkgewogCQkJCWVycm9yID0g
RU1TR1NJWkU7Ci0JCQllbHNlIHsKLQkJCQlxdWV1ZSA9ICgobmdfdWJ0X25vZGVfcWxlbl9lcCAq
KQotCQkJCSAgICAobXNnLT5kYXRhKSktPnF1ZXVlOwotCQkJCXFsZW4gPSAoKG5nX3VidF9ub2Rl
X3FsZW5fZXAgKikKLQkJCQkgICAgKG1zZy0+ZGF0YSkpLT5xbGVuOworCQkJCWJyZWFrOworCQkJ
fQogCi0JCQkJaWYgKHFsZW4gPD0gMCkgewotCQkJCQllcnJvciA9IEVJTlZBTDsKLQkJCQkJYnJl
YWs7Ci0JCQkJfQotCQkJCXN3aXRjaCAocXVldWUpIHsKLQkJCQljYXNlIE5HTV9VQlRfTk9ERV9R
VUVVRV9DTUQ6Ci0JCQkJCXEgPSAmc2MtPnNjX2NtZHE7Ci0JCQkJCWJyZWFrOworCQkJcXVldWUg
PSAoKG5nX3VidF9ub2RlX3FsZW5fZXAgKikgKG1zZy0+ZGF0YSkpLT5xdWV1ZTsKKwkJCXFsZW4g
PSAoKG5nX3VidF9ub2RlX3FsZW5fZXAgKikgKG1zZy0+ZGF0YSkpLT5xbGVuOwogCi0JCQkJY2Fz
ZSBOR01fVUJUX05PREVfUVVFVUVfQUNMOgotCQkJCQlxID0gJnNjLT5zY19hY2xxOwotCQkJCQli
cmVhazsKKwkJCXN3aXRjaCAocXVldWUpIHsKKwkJCWNhc2UgTkdNX1VCVF9OT0RFX1FVRVVFX0NN
RDoKKwkJCQlxID0gJnNjLT5zY19jbWRxOworCQkJCWJyZWFrOwogCi0JCQkJY2FzZSBOR01fVUJU
X05PREVfUVVFVUVfU0NPOgotCQkJCQlxID0gJnNjLT5zY19zY29xOwotCQkJCQlicmVhazsKKwkJ
CWNhc2UgTkdNX1VCVF9OT0RFX1FVRVVFX0FDTDoKKwkJCQlxID0gJnNjLT5zY19hY2xxOworCQkJ
CWJyZWFrOwogCi0JCQkJZGVmYXVsdDoKLQkJCQkJcSA9IE5VTEw7Ci0JCQkJCWVycm9yID0gRUlO
VkFMOwotCQkJCQlicmVhazsKLQkJCQl9CisJCQljYXNlIE5HTV9VQlRfTk9ERV9RVUVVRV9TQ086
CisJCQkJcSA9ICZzYy0+c2Nfc2NvcTsKKwkJCQlicmVhazsKIAotCQkJCWlmIChxICE9IE5VTEwp
IHsKLQkJCQkJcS0+bWF4bGVuID0gcWxlbjsKLQkJCQl9CisJCQlkZWZhdWx0OgorCQkJCWVycm9y
ID0gRUlOVkFMOworCQkJCWdvdG8gZG9uZTsKKwkJCQkvKiBOT1QgUkVBQ0hFRCAqLwogCQkJfQor
CisJCQlxLT5tYXhsZW4gPSBxbGVuOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBOR01fVUJUX05PREVf
R0VUX1FMRU46CkBAIC0xNjE3LDcgKzE3NDYsOSBAQAogCQkJCWVycm9yID0gRU1TR1NJWkU7CiAJ
CQkJYnJlYWs7CiAJCQl9CisKIAkJCXF1ZXVlID0gKChuZ191YnRfbm9kZV9xbGVuX2VwICopICht
c2ctPmRhdGEpKS0+cXVldWU7CisKIAkJCXN3aXRjaCAocXVldWUpIHsKIAkJCWNhc2UgTkdNX1VC
VF9OT0RFX1FVRVVFX0NNRDoKIAkJCQlxID0gJnNjLT5zY19jbWRxOwpAQCAtMTYzMiwzOSArMTc2
MywzNiBAQAogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgotCQkJCXEgPSBOVUxMOwogCQkJCWVy
cm9yID0gRUlOVkFMOworCQkJCWdvdG8gZG9uZTsKKwkJCQkvKiBOT1QgUkVBQ0hFRCAqLworCQkJ
fQorCisJCQlOR19NS1JFU1BPTlNFKHJzcCwgbXNnLCBzaXplb2YobmdfdWJ0X25vZGVfcWxlbl9l
cCksCisJCQkJTV9OT1dBSVQpOworCQkJaWYgKHJzcCA9PSBOVUxMKSB7CisJCQkJZXJyb3IgPSBF
Tk9NRU07CiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCWlmIChxICE9IE5VTEwpIHsKLQkJCQlOR19N
S1JFU1BPTlNFKHJzcCwgbXNnLAotCQkJCSAgICBzaXplb2YobmdfdWJ0X25vZGVfcWxlbl9lcCks
IE1fTk9XQUlUKTsKLQkJCQlpZiAocnNwID09IE5VTEwpIHsKLQkJCQkJZXJyb3IgPSBFTk9NRU07
Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkoKG5nX3VidF9ub2RlX3FsZW5fZXAgKikgKHJzcC0+
ZGF0YSkpLT5xdWV1ZSA9Ci0JCQkJICAgIHF1ZXVlOwotCQkJCSgobmdfdWJ0X25vZGVfcWxlbl9l
cCAqKSAocnNwLT5kYXRhKSktPnFsZW4gPQotCQkJCSAgICBxLT5tYXhsZW47Ci0JCQl9CisJCQko
KG5nX3VidF9ub2RlX3FsZW5fZXAgKikgKHJzcC0+ZGF0YSkpLT5xdWV1ZSA9IHF1ZXVlOworCQkJ
KChuZ191YnRfbm9kZV9xbGVuX2VwICopIChyc3AtPmRhdGEpKS0+cWxlbiA9IHEtPm1heGxlbjsK
IAkJCWJyZWFrOwogCiAJCWNhc2UgTkdNX1VCVF9OT0RFX0dFVF9TVEFUOgogCQkJTkdfTUtSRVNQ
T05TRShyc3AsIG1zZywgc2l6ZW9mKG5nX3VidF9ub2RlX3N0YXRfZXApLAogCQkJICAgIE1fTk9X
QUlUKTsKLQkJCWlmIChyc3AgPT0gTlVMTCkKKwkJCWlmIChyc3AgPT0gTlVMTCkgewogCQkJCWVy
cm9yID0gRU5PTUVNOwotCQkJZWxzZSB7Ci0JCQkJYmNvcHkoJnNjLT5zY19zdGF0LCByc3AtPmRh
dGEsCi0JCQkJICAgIHNpemVvZihuZ191YnRfbm9kZV9zdGF0X2VwKSk7CisJCQkJYnJlYWs7CiAJ
CQl9CisKKwkJCWJjb3B5KCZzYy0+c2Nfc3RhdCwgcnNwLT5kYXRhLAorCQkJCXNpemVvZihuZ191
YnRfbm9kZV9zdGF0X2VwKSk7CiAJCQlicmVhazsKIAogCQljYXNlIE5HTV9VQlRfTk9ERV9SRVNF
VF9TVEFUOgotCi0JCQlOR19VQlRfU1RBVF9SRVNFVChzYy0+c2Nfc3RhdCk7CisJCQlVQlRfU1RB
VF9SRVNFVChzYyk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtMTY3Nyw5MCArMTgwNSwx
NjEgQEAKIAkJZXJyb3IgPSBFSU5WQUw7CiAJCWJyZWFrOwogCX0KLQorZG9uZToKIAlOR19SRVNQ
T05EX01TRyhlcnJvciwgbm9kZSwgaXRlbSwgcnNwKTsKIAlOR19GUkVFX01TRyhtc2cpOwogCi0J
bXR4X3VubG9jaygmc2MtPnNjX210eCk7Ci0KIAlyZXR1cm4gKGVycm9yKTsKLX0KK30gLyogbmdf
dWJ0X3Jjdm1zZyAqLwogCiAvKgotICogUHJvY2VzcyBkYXRhCisgKiBQcm9jZXNzIGRhdGEuCisg
KiBOZXRncmFwaCBjb250ZXh0LgogICovCiAKIHN0YXRpYyBpbnQKIG5nX3VidF9yY3ZkYXRhKGhv
b2tfcCBob29rLCBpdGVtX3AgaXRlbSkKIHsKLQlzdHJ1Y3QgdWJ0X3NvZnRjICpzYyA9IE5HX05P
REVfUFJJVkFURShOR19IT09LX05PREUoaG9vaykpOwotCXN0cnVjdCBtYnVmICptOwotCXN0cnVj
dCBuZ19idF9tYnVmcSAqcTsKLQlzdHJ1Y3QgdXNiMl94ZmVyICp4ZmVyOwotCWludCBlcnJvciA9
IDA7CisJc3RydWN0IHVidF9zb2Z0Ywkqc2MgPSBOR19OT0RFX1BSSVZBVEUoTkdfSE9PS19OT0RF
KGhvb2spKTsKKwlzdHJ1Y3QgbWJ1ZgkJKm07CisJc3RydWN0IG5nX2J0X21idWZxCSpxOworCWlu
dAkJCWFjdGlvbiwgZXJyb3IgPSAwOwogCi0JaWYgKHNjID09IE5VTEwpIHsKLQkJZXJyb3IgPSBF
SE9TVERPV047Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JbXR4X2xvY2soJnNjLT5zY19tdHgpOwotCiAJ
aWYgKGhvb2sgIT0gc2MtPnNjX2hvb2spIHsKIAkJZXJyb3IgPSBFSU5WQUw7CiAJCWdvdG8gZG9u
ZTsKIAl9Ci0JLyogZGVhdGNoIG1idWYgYW5kIGdldCBIQ0kgZnJhbWUgdHlwZSAqLworCisJLyog
RGVhdGNoIG1idWYgYW5kIGdldCBIQ0kgZnJhbWUgdHlwZSAqLwogCU5HSV9HRVRfTShpdGVtLCBt
KTsKIAotCS8qIHByb2Nlc3MgSENJIGZyYW1lICovCisJLyoKKwkgKiBNaW5pbWFsIHNpemUgb2Yg
dGhlIEhDSSBmcmFtZSBpcyA0IGJ5dGVzOiAxIGJ5dGUgZnJhbWUgdHlwZSwKKwkgKiAyIGJ5dGVz
IGNvbm5lY3Rpb24gaGFuZGxlIGFuZCBhdCBsZWFzdCAxIGJ5dGUgb2YgbGVuZ3RoLgorCSAqIFBh
bmljIG9uIGRhdGEgZnJhbWUgdGhhdCBoYXMgc2l6ZSBzbWFsbGVyIHRoYW4gNCBieXRlcyAoaXQK
KwkgKiBzaG91bGQgbm90IGhhcHBlbikKKwkgKi8KKworCWlmIChtLT5tX3BrdGhkci5sZW4gPCA0
KQorCQlwYW5pYygiSENJIGZyYW1lIHNpemUgaXMgdG9vIHNtYWxsISBwa3RsZW49JWRcbiIsCisJ
CQltLT5tX3BrdGhkci5sZW4pOworCisJLyogUHJvY2VzcyBIQ0kgZnJhbWUgKi8KIAlzd2l0Y2gg
KCptdG9kKG0sIHVpbnQ4X3QgKikpIHsJLyogWFhYIGNhbGwgbV9wdWxsdXAgPyAqLwogCWNhc2Ug
TkdfSENJX0NNRF9QS1Q6Ci0JCXhmZXIgPSBzYy0+c2NfeGZlcl9pZl8wWzNdOworCQlpZiAobS0+
bV9wa3RoZHIubGVuIC0gMSA+IFVCVF9DVFJMX0JVRkZFUl9TSVpFKQorCQkJcGFuaWMoIkhDSSBj
b21tYW5kIGZyYW1lIHNpemUgaXMgdG9vIGJpZyEgIiBcCisJCQkJImJ1ZmZlciBzaXplPSV6ZCwg
cGFja2V0IGxlbj0lZFxuIiwKKwkJCQlVQlRfQ1RSTF9CVUZGRVJfU0laRSwgbS0+bV9wa3RoZHIu
bGVuKTsKKwogCQlxID0gJnNjLT5zY19jbWRxOworCQlhY3Rpb24gPSBVQlRfRkxBR19UX1NUQVJU
X0NUUkw7CiAJCWJyZWFrOwogCiAJY2FzZSBOR19IQ0lfQUNMX0RBVEFfUEtUOgotCQl4ZmVyID0g
c2MtPnNjX3hmZXJfaWZfMFswXTsKKwkJaWYgKG0tPm1fcGt0aGRyLmxlbiAtIDEgPiBVQlRfQlVM
S19XUklURV9CVUZGRVJfU0laRSkKKwkJCXBhbmljKCJBQ0wgZGF0YSBmcmFtZSBzaXplIGlzIHRv
byBiaWchICIgXAorCQkJCSJidWZmZXIgc2l6ZT0lZCwgcGFja2V0IGxlbj0lZFxuIiwKKwkJCQlV
QlRfQlVMS19XUklURV9CVUZGRVJfU0laRSwgbS0+bV9wa3RoZHIubGVuKTsKKwogCQlxID0gJnNj
LT5zY19hY2xxOworCQlhY3Rpb24gPSBVQlRfRkxBR19UX1NUQVJUX0JVTEs7CiAJCWJyZWFrOwog
CiAJY2FzZSBOR19IQ0lfU0NPX0RBVEFfUEtUOgotCQl4ZmVyID0gTlVMTDsKIAkJcSA9ICZzYy0+
c2Nfc2NvcTsKKwkJYWN0aW9uID0gMDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlOR19VQlRf
RVJSKHNjLCAiRHJvcHBpbmcgdW5zdXBwb3J0ZWQgSENJIGZyYW1lLCAiCi0JCSAgICAidHlwZT0w
eCUwMngsIHBrdGxlbj0lZFxuIiwKLQkJICAgICptdG9kKG0sIHVpbnQ4X3QgKiksCi0JCSAgICBt
LT5tX3BrdGhkci5sZW4pOworCQlVQlRfRVJSKHNjLCAiRHJvcHBpbmcgdW5zdXBwb3J0ZWQgSENJ
IGZyYW1lLCB0eXBlPTB4JTAyeCwgIiBcCisJCQkicGt0bGVuPSVkXG4iLCAqbXRvZChtLCB1aW50
OF90ICopLCBtLT5tX3BrdGhkci5sZW4pOwogCiAJCU5HX0ZSRUVfTShtKTsKIAkJZXJyb3IgPSBF
SU5WQUw7CiAJCWdvdG8gZG9uZTsKKwkJLyogTk9UIFJFQUNIRUQgKi8KIAl9CiAKLQkvKiBsb29z
ZSBmcmFtZSB0eXBlLCBpZiByZXF1aXJlZCAqLwotCWlmICghKHNjLT5zY19mbGFncyAmIFVCVF9O
RUVEX0ZSQU1FX1RZUEUpKSB7Ci0JCW1fYWRqKG0sIHNpemVvZih1aW50OF90KSk7Ci0JfQorCVVC
VF9NQlVGUV9MT0NLKHNjKTsKIAlpZiAoTkdfQlRfTUJVRlFfRlVMTChxKSkgewotCQlOR19VQlRf
RVJSKHNjLCAiRHJvcHBpbmcgSENJIGZyYW1lIDB4JTAyeCwgbGVuPSVkLiAiCi0JCSAgICAiUXVl
dWUgZnVsbFxuIiwgKm10b2QobSwgdWludDhfdCAqKSwKLQkJICAgIG0tPm1fcGt0aGRyLmxlbik7
CisJCU5HX0JUX01CVUZRX0RST1AocSk7CisJCVVCVF9NQlVGUV9VTkxPQ0soc2MpOworCQkKKwkJ
VUJUX0VSUihzYywgIkRyb3BwaW5nIEhDSSBmcmFtZSAweCUwMngsIGxlbj0lZC4gUXVldWUgZnVs
bFxuIiwKKwkJCSptdG9kKG0sIHVpbnQ4X3QgKiksIG0tPm1fcGt0aGRyLmxlbik7CisKIAkJTkdf
RlJFRV9NKG0pOwogCX0gZWxzZSB7CisJCS8qIExvb3NlIEhDSSBwYWNrZXQgdHlwZSwgZW5xdWV1
ZSBtYnVmIGFuZCBraWNrIG9mZiB0YXNrICovCisJCW1fYWRqKG0sIHNpemVvZih1aW50OF90KSk7
CiAJCU5HX0JUX01CVUZRX0VOUVVFVUUocSwgbSk7Ci0JfQorCQl1YnRfdGFza19zY2hlZHVsZShz
YywgYWN0aW9uKTsKIAotCWlmICh4ZmVyKSB7Ci0JCXVzYjJfdHJhbnNmZXJfc3RhcnQoeGZlcik7
CisJCVVCVF9NQlVGUV9VTkxPQ0soc2MpOwogCX0KIGRvbmU6CiAJTkdfRlJFRV9JVEVNKGl0ZW0p
OwogCi0JaWYgKHNjKSB7Ci0JCW10eF91bmxvY2soJnNjLT5zY19tdHgpOworCXJldHVybiAoZXJy
b3IpOworfSAvKiBuZ191YnRfcmN2ZGF0YSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioKKyAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVs
ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICog
TG9hZC9VbmxvYWQgdGhlIGRyaXZlciBtb2R1bGUKKyAqLworCitzdGF0aWMgaW50Cit1YnRfbW9k
ZXZlbnQobW9kdWxlX3QgbW9kLCBpbnQgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisJaW50CWVycm9y
OworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTU9EX0xPQUQ6CisJCWVycm9yID0gbmdfbmV3
dHlwZSgmdHlwZXN0cnVjdCk7CisJCWlmIChlcnJvciAhPSAwKQorCQkJcHJpbnRmKCIlczogQ291
bGQgbm90IHJlZ2lzdGVyIE5ldGdyYXBoIG5vZGUgdHlwZSwgIiBcCisJCQkJImVycm9yPSVkXG4i
LCBOR19VQlRfTk9ERV9UWVBFLCBlcnJvcik7CisJCWJyZWFrOworCisJY2FzZSBNT0RfVU5MT0FE
OgorCQllcnJvciA9IG5nX3JtdHlwZSgmdHlwZXN0cnVjdCk7CisJCWJyZWFrOworCisJZGVmYXVs
dDoKKwkJZXJyb3IgPSBFT1BOT1RTVVBQOworCQlicmVhazsKIAl9CisKIAlyZXR1cm4gKGVycm9y
KTsKLX0KK30gLyogdWJ0X21vZGV2ZW50ICovCisKK3N0YXRpYyBkZXZjbGFzc190CXVidF9kZXZj
bGFzczsKKworc3RhdGljIGRldmljZV9tZXRob2RfdAl1YnRfbWV0aG9kc1tdID0KK3sKKwlERVZN
RVRIT0QoZGV2aWNlX3Byb2JlLAl1YnRfcHJvYmUpLAorCURFVk1FVEhPRChkZXZpY2VfYXR0YWNo
LCB1YnRfYXR0YWNoKSwKKwlERVZNRVRIT0QoZGV2aWNlX2RldGFjaCwgdWJ0X2RldGFjaCksCisJ
eyAwLCAwIH0KK307CisKK3N0YXRpYyBkcml2ZXJfdAkJdWJ0X2RyaXZlciA9Cit7CisJLm5hbWUg
PQkgICAidWJ0IiwKKwkubWV0aG9kcyA9IHVidF9tZXRob2RzLAorCS5zaXplID0JICAgc2l6ZW9m
KHN0cnVjdCB1YnRfc29mdGMpLAorfTsKKworRFJJVkVSX01PRFVMRShuZ191YnQsIHVzaHViLCB1
YnRfZHJpdmVyLCB1YnRfZGV2Y2xhc3MsIHVidF9tb2RldmVudCwgMCk7CitNT0RVTEVfVkVSU0lP
TihuZ191YnQsIE5HX0JMVUVUT09USF9WRVJTSU9OKTsKK01PRFVMRV9ERVBFTkQobmdfdWJ0LCBu
ZXRncmFwaCwgTkdfQUJJX1ZFUlNJT04sIE5HX0FCSV9WRVJTSU9OLCBOR19BQklfVkVSU0lPTik7
CitNT0RVTEVfREVQRU5EKG5nX3VidCwgbmdfaGNpLCBOR19CTFVFVE9PVEhfVkVSU0lPTiwgTkdf
QkxVRVRPT1RIX1ZFUlNJT04sIE5HX0JMVUVUT09USF9WRVJTSU9OKTsKK01PRFVMRV9ERVBFTkQo
bmdfdWJ0LCB1c2IyX2JsdWV0b290aCwgMSwgMSwgMSk7CitNT0RVTEVfREVQRU5EKG5nX3VidCwg
dXNiMl9jb3JlLCAxLCAxLCAxKTsKKwpJbmRleDogbmdfdWJ0Ml92YXIuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBuZ191YnQyX3Zhci5oCShyZXZpc2lvbiAxODczMTMpCisrKyBuZ191YnQyX3Zhci5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zLDcgKzMsNyBAQAogICovCiAKIC8qLQotICogQ29weXJpZ2h0IChjKSAy
MDAxLTIwMDIgTWFrc2ltIFlldm1lbmtpbiA8bV9ldm1lbmtpbkB5YWhvby5jb20+CisgKiBDb3B5
cmlnaHQgKGMpIDIwMDEtMjAwOSBNYWtzaW0gWWV2bWVua2luIDxtX2V2bWVua2luQHlhaG9vLmNv
bT4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zMiw5NSAr
MzIsMTExIEBACiAgKi8KIAogI2lmbmRlZiBfTkdfVUJUX1ZBUl9IXwotI2RlZmluZQlfTkdfVUJU
X1ZBUl9IXworI2RlZmluZQlfTkdfVUJUX1ZBUl9IXwkxCiAKLS8qIHB1bGx1cCB3cmFwcGVyICov
Ci0jZGVmaW5lCU5HX1VCVF9NX1BVTExVUChtLCBzKSBcCi0JZG8geyBcCi0JCWlmICgobSktPm1f
bGVuIDwgKHMpKSBcCi0JCQkobSkgPSBtX3B1bGx1cCgobSksIChzKSk7IFwKLQkJaWYgKChtKSA9
PSBOVUxMKSB7IFwKLQkJCU5HX1VCVF9BTEVSVCgiJXM6ICVzIC0gbV9wdWxsdXAoJWQpIGZhaWxl
ZFxuIiwgXAotCQkJCV9fZnVuY19fLCBzYy0+c2NfbmFtZSwgKHMpKTsgXAotCQl9IFwKLQl9IHdo
aWxlICgwKQotCiAvKiBEZWJ1ZyBwcmludGYncyAqLwotI2RlZmluZQlOR19VQlRfREVCVUcobGV2
ZWwsIHNjLCBmbXQsIC4uLikgZG8geyBcCi0gICAgaWYgKChzYyktPnNjX2RlYnVnID49IChsZXZl
bCkpIHsgXAotICAgICAgICBwcmludGYoIiVzOiVzOiVkOiAiIGZtdCwgKHNjKS0+c2NfbmFtZSwg
XAotCSAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCMjIF9fVkFfQVJHU19fKTsgXAotICAg
IH0gXAorI2RlZmluZQlVQlRfREVCVUcobGV2ZWwsIHNjLCBmbXQsIC4uLikJCQkJXAorZG8gewkJ
CQkJCQkJXAorCWlmICgoc2MpLT5zY19kZWJ1ZyA+PSAobGV2ZWwpKQkJCQlcCisJCXByaW50Zigi
JXM6JXM6JWQ6ICIgZm10LCAoc2MpLT5zY19uYW1lLAkJXAorCQkJX19GVU5DVElPTl9fLCBfX0xJ
TkVfXywjIyBfX1ZBX0FSR1NfXyk7CVwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUJTkdfVUJUX0FM
RVJUKC4uLikgTkdfVUJUX0RFQlVHKE5HX1VCVF9BTEVSVF9MRVZFTCwgX19WQV9BUkdTX18pCi0j
ZGVmaW5lCU5HX1VCVF9FUlIoLi4uKSAgIE5HX1VCVF9ERUJVRyhOR19VQlRfRVJSX0xFVkVMLCBf
X1ZBX0FSR1NfXykKLSNkZWZpbmUJTkdfVUJUX1dBUk4oLi4uKSAgTkdfVUJUX0RFQlVHKE5HX1VC
VF9XQVJOX0xFVkVMLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUJTkdfVUJUX0lORk8oLi4uKSAgTkdf
VUJUX0RFQlVHKE5HX1VCVF9JTkZPX0xFVkVMLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUJVUJUX0FM
RVJUKC4uLikJCVVCVF9ERUJVRyhOR19VQlRfQUxFUlRfTEVWRUwsIF9fVkFfQVJHU19fKQorI2Rl
ZmluZQlVQlRfRVJSKC4uLikJCVVCVF9ERUJVRyhOR19VQlRfRVJSX0xFVkVMLCBfX1ZBX0FSR1Nf
XykKKyNkZWZpbmUJVUJUX1dBUk4oLi4uKQkJVUJUX0RFQlVHKE5HX1VCVF9XQVJOX0xFVkVMLCBf
X1ZBX0FSR1NfXykKKyNkZWZpbmUJVUJUX0lORk8oLi4uKQkJVUJUX0RFQlVHKE5HX1VCVF9JTkZP
X0xFVkVMLCBfX1ZBX0FSR1NfXykKIAorI2RlZmluZSBVQlRfTUJVRlFfTE9DSyhzYykJbXR4X2xv
Y2soJihzYyktPnNjX21idWZxX210eCkKKyNkZWZpbmUgVUJUX01CVUZRX1VOTE9DSyhzYykJbXR4
X3VubG9jaygmKHNjKS0+c2NfbWJ1ZnFfbXR4KQorCiAvKiBCbHVldG9vdGggVVNCIGNvbnRyb2wg
cmVxdWVzdCB0eXBlICovCiAjZGVmaW5lCVVCVF9IQ0lfUkVRVUVTVAkJMHgyMAotI2RlZmluZQlV
QlRfREVGQVVMVF9RTEVOCTEyCisjZGVmaW5lCVVCVF9ERUZBVUxUX1FMRU4JNjQKKyNkZWZpbmUJ
VUJUX0lTT0NfTkZSQU1FUwkzMgkvKiBzaG91bGQgYmUgZmFjdG9yIG9mIDggKi8KIAogLyogQmx1
ZXRvb3RoIFVTQiBkZWZpbmVzICovCi0jZGVmaW5lCVVCVF9JRl8wX05fVFJBTlNGRVIgIDcJCS8q
IHVuaXRzICovCi0jZGVmaW5lCVVCVF9JRl8xX05fVFJBTlNGRVIgIDQJCS8qIHVuaXRzICovCi0j
ZGVmaW5lCVVCVF9JU09DX05GUkFNRVMgICAgMjUJCS8qIHVuaXRzICovCitlbnVtIHsKKwkvKiBJ
bnRlcmZhY2UgIzAgdHJhbnNmZXJzICovCisJVUJUX0lGXzBfQlVMS19EVF9XUiA9IDAsCisJVUJU
X0lGXzBfQlVMS19EVF9SRCwKKwlVQlRfSUZfMF9JTlRSX0RUX1JELAorCVVCVF9JRl8wX0NUUkxf
RFRfV1IsCisJVUJUX0lGXzBfQlVMS19DU19XUiwKKwlVQlRfSUZfMF9CVUxLX0NTX1JELAorCVVC
VF9JRl8wX0lOVFJfQ1NfUkQsCisJVUJUX0lGXzBfTl9UUkFOU0ZFUiwJLyogbnVtYmVyIG9mIGlu
dGVyZmFjZSAwJ3MgdHJhbnNmZXJzICovCisJCisJLyogSW50ZXJmYWNlICMxIHRyYW5zZmVycyAq
LworCVVCVF9JRl8xX0lTT0NfRFRfUkQxID0gVUJUX0lGXzBfTl9UUkFOU0ZFUiwKKwlVQlRfSUZf
MV9JU09DX0RUX1JEMiwKKwlVQlRfSUZfMV9JU09DX0RUX1dSMSwKKwlVQlRfSUZfMV9JU09DX0RU
X1dSMiwKIAorCVVCVF9OX1RSQU5TRkVSLAkJLyogdG90YWwgbnVtYmVyIG9mIHRyYW5zZmVycyAq
LworCisJVUJUX0lGXzFfTl9UUkFOU0ZFUiA9IFVCVF9OX1RSQU5TRkVSIC0gVUJUX0lGXzFfSVNP
Q19EVF9SRDEsCit9OworCiAvKiBVU0IgZGV2aWNlIHNvZnRjIHN0cnVjdHVyZSAqLwogc3RydWN0
IHVidF9zb2Z0YyB7CisJdWludDhfdAkJCXNjX25hbWVbMTZdOworCiAJLyogU3RhdGUgKi8KLQlu
Z191YnRfbm9kZV9kZWJ1Z19lcCBzY19kZWJ1ZzsJLyogZGVidWcgbGV2ZWwgKi8KLQl1aW50MzJf
dCBzY19mbGFnczsJCS8qIGRldmljZSBmbGFncyAqLwotI2RlZmluZQlVQlRfTkVFRF9GUkFNRV9U
WVBFCSgxIDw8IDApLyogZGV2aWNlIHJlcXVpcmVkIGZyYW1lIHR5cGUgKi8KLSNkZWZpbmUJVUJU
X0hBVkVfRlJBTUVfVFlQRSBVQlRfTkVFRF9GUkFNRV9UWVBFCi0jZGVmaW5lCVVCVF9GTEFHX1JF
QURfU1RBTEwgICAgICgxIDw8IDEpLyogcmVhZCB0cmFuc2ZlciBoYXMgc3RhbGxlZCAqLwotI2Rl
ZmluZQlVQlRfRkxBR19XUklURV9TVEFMTCAgICAoMSA8PCAyKS8qIHdyaXRlIHRyYW5zZmVyIGhh
cyBzdGFsbGVkICovCi0jZGVmaW5lCVVCVF9GTEFHX0lOVFJfU1RBTEwgICAgICgxIDw8IDMpLyog
aW50ZXJydXB0IHRyYW5zZmVyIGhhcyBzdGFsbGVkICovCisJbmdfdWJ0X25vZGVfZGVidWdfZXAJ
c2NfZGVidWc7CS8qIGRlYnVnIGxldmVsICovCiAKLQluZ191YnRfbm9kZV9zdGF0X2VwIHNjX3N0
YXQ7CS8qIHN0YXRpc3RpYyAqLwotI2RlZmluZQlOR19VQlRfU1RBVF9QQ0tUU19TRU5UKHMpCShz
KS5wY2t0c19zZW50ICsrCi0jZGVmaW5lCU5HX1VCVF9TVEFUX0JZVEVTX1NFTlQocywgbikJKHMp
LmJ5dGVzX3NlbnQgKz0gKG4pCi0jZGVmaW5lCU5HX1VCVF9TVEFUX1BDS1RTX1JFQ1YocykJKHMp
LnBja3RzX3JlY3YgKysKLSNkZWZpbmUJTkdfVUJUX1NUQVRfQllURVNfUkVDVihzLCBuKQkocyku
Ynl0ZXNfcmVjdiArPSAobikKLSNkZWZpbmUJTkdfVUJUX1NUQVRfT0VSUk9SKHMpCQkocykub2Vy
cm9ycyArKwotI2RlZmluZQlOR19VQlRfU1RBVF9JRVJST1IocykJCShzKS5pZXJyb3JzICsrCi0j
ZGVmaW5lCU5HX1VCVF9TVEFUX1JFU0VUKHMpCQliemVybygmKHMpLCBzaXplb2YoKHMpKSkKKwlp
bnQJCQlzY19mbGFnczsJLyogZGV2aWNlIGZsYWdzICovCisjZGVmaW5lCVVCVF9GTEFHX1JFQURf
U1RBTEwJKDEgPDwgMCkJLyogcmVhZCB0cmFuc2ZlciBoYXMgc3RhbGxlZCAqLworI2RlZmluZQlV
QlRfRkxBR19XUklURV9TVEFMTAkoMSA8PCAxKQkvKiB3cml0ZSB0cmFuc2ZlciBoYXMgc3RhbGxl
ZCAqLworI2RlZmluZQlVQlRfRkxBR19JTlRSX1NUQUxMCSgxIDw8IDIpCS8qIGludGVyIHRyYW5z
ZmVyIGhhcyBzdGFsbGVkICovCiAKLQl1aW50OF90CXNjX25hbWVbMTZdOworCW5nX3VidF9ub2Rl
X3N0YXRfZXAJc2Nfc3RhdDsJLyogc3RhdGlzdGljICovCisjZGVmaW5lCVVCVF9TVEFUX1BDS1RT
X1NFTlQoc2MpCQkoc2MpLT5zY19zdGF0LnBja3RzX3NlbnQgKysKKyNkZWZpbmUJVUJUX1NUQVRf
QllURVNfU0VOVChzYywgbikJKHNjKS0+c2Nfc3RhdC5ieXRlc19zZW50ICs9IChuKQorI2RlZmlu
ZQlVQlRfU1RBVF9QQ0tUU19SRUNWKHNjKQkJKHNjKS0+c2Nfc3RhdC5wY2t0c19yZWN2ICsrCisj
ZGVmaW5lCVVCVF9TVEFUX0JZVEVTX1JFQ1Yoc2MsIG4pCShzYyktPnNjX3N0YXQuYnl0ZXNfcmVj
diArPSAobikKKyNkZWZpbmUJVUJUX1NUQVRfT0VSUk9SKHNjKQkJKHNjKS0+c2Nfc3RhdC5vZXJy
b3JzICsrCisjZGVmaW5lCVVCVF9TVEFUX0lFUlJPUihzYykJCShzYyktPnNjX3N0YXQuaWVycm9y
cyArKworI2RlZmluZQlVQlRfU1RBVF9SRVNFVChzYykJYnplcm8oJihzYyktPnNjX3N0YXQsIHNp
emVvZigoc2MpLT5zY19zdGF0KSkKIAotCXN0cnVjdCBtdHggc2NfbXR4OwotCiAJLyogVVNCIGRl
dmljZSBzcGVjaWZpYyAqLwotCXN0cnVjdCB1c2IyX3hmZXIgKnNjX3hmZXJfaWZfMFtVQlRfSUZf
MF9OX1RSQU5TRkVSXTsKLQlzdHJ1Y3QgdXNiMl94ZmVyICpzY194ZmVyX2lmXzFbVUJUX0lGXzFf
Tl9UUkFOU0ZFUl07CisJc3RydWN0IG10eAkJc2NfaWZfbXR4WzJdOwkvKiBpbnRlcmZhY2UgbG9j
a3MgKi8KKwlzdHJ1Y3QgdXNiMl94ZmVyCSpzY194ZmVyW1VCVF9OX1RSQU5TRkVSXTsKIAotCS8q
IEludGVycnVwdCBwaXBlIChIQ0kgZXZlbnRzKSAqLwotCXN0cnVjdCBtYnVmICpzY19pbnRyX2J1
ZmZlcjsJLyogaW50ZXJydXB0IGJ1ZmZlciAqLworCXN0cnVjdCBtdHgJCXNjX21idWZxX210eDsJ
LyogbG9jayBmb3IgYWxsIHF1ZXVlcyAqLwogCi0JLyogQ29udHJvbCBwaXBlIChIQ0kgY29tbWFu
ZHMpICovCi0Jc3RydWN0IG5nX2J0X21idWZxIHNjX2NtZHE7CS8qIEhDSSBjb21tYW5kIHF1ZXVl
ICovCi0jZGVmaW5lCVVCVF9DVFJMX0JVRkZFUl9TSVpFIChzaXplb2YobmdfaGNpX2NtZF9wa3Rf
dCkgKyBOR19IQ0lfQ01EX1BLVF9TSVpFKQorCS8qIEhDSSBjb21tYW5kcyAqLworCXN0cnVjdCBu
Z19idF9tYnVmcQlzY19jbWRxOwkvKiBIQ0kgY29tbWFuZCBxdWV1ZSAqLworI2RlZmluZQlVQlRf
Q1RSTF9CVUZGRVJfU0laRQkoc2l6ZW9mKHN0cnVjdCB1c2IyX2RldmljZV9yZXF1ZXN0KSArCVwK
KwkJCQkgc2l6ZW9mKG5nX2hjaV9jbWRfcGt0X3QpICsgTkdfSENJX0NNRF9QS1RfU0laRSkKKyNk
ZWZpbmUJVUJUX0lOVFJfQlVGRkVSX1NJWkUJKE1DTEJZVEVTLTEpCS8qIHJlc2VydmUgMSBieXRl
IGZvciBJRC10YWcgKi8KIAotCS8qIEJ1bGsgaW4gcGlwZSAoQUNMIGRhdGEpICovCi0Jc3RydWN0
IG1idWYgKnNjX2J1bGtfaW5fYnVmZmVyOwkvKiBidWxrLWluIGJ1ZmZlciAqLwotCi0JLyogQnVs
ayBvdXQgcGlwZSAoQUNMIGRhdGEpICovCi0Jc3RydWN0IG5nX2J0X21idWZxIHNjX2FjbHE7CS8q
IEFDTCBkYXRhIHF1ZXVlICovCi0jZGVmaW5lCVVCVF9CVUxLX1JFQURfQlVGRkVSX1NJWkUgKE1D
TEJZVEVTLTEpCS8qIHJlc2VydmUgb25lIGJ5dGUgZm9yIElELXRhZyAqLworCS8qIEFDTCBkYXRh
ICovCisJc3RydWN0IG5nX2J0X21idWZxCXNjX2FjbHE7CS8qIEFDTCBkYXRhIHF1ZXVlICovCisj
ZGVmaW5lCVVCVF9CVUxLX1JFQURfQlVGRkVSX1NJWkUgKE1DTEJZVEVTLTEpCS8qIHJlc2VydmUg
MSBieXRlIGZvciBJRC10YWcgKi8KICNkZWZpbmUJVUJUX0JVTEtfV1JJVEVfQlVGRkVSX1NJWkUg
KE1DTEJZVEVTKQogCi0JLyogSXNvYy4gb3V0IHBpcGUgKEFDTCBkYXRhKSAqLwotCXN0cnVjdCBu
Z19idF9tYnVmcSBzY19zY29xOwkvKiBTQ08gZGF0YSBxdWV1ZSAqLworCS8qIFNDTyBkYXRhICov
CisJc3RydWN0IG5nX2J0X21idWZxCXNjX3Njb3E7CS8qIFNDTyBkYXRhIHF1ZXVlICovCisJc3Ry
dWN0IG1idWYJCSpzY19pc29jX2luX2J1ZmZlcjsgLyogU0NPIHJlYXNzZW1ibHkgYnVmZmVyICov
CiAKLQkvKiBJc29jLiBpbiBwaXBlIChBQ0wgZGF0YSkgKi8KLQlzdHJ1Y3QgbmdfYnRfbWJ1ZnEg
c2Nfc2NpcTsJLyogU0NPIGRhdGEgcXVldWUgKi8KKwkvKiBOZXRncmFwaCBzcGVjaWZpYyAqLwor
CW5vZGVfcAkJCXNjX25vZGU7CS8qIHBvaW50ZXIgYmFjayB0byBub2RlICovCisJaG9va19wCQkJ
c2NfaG9vazsJLyogdXBzdHJlYW0gaG9vayAqLwogCi0JLyogTmV0Z3JhcGggc3BlY2lmaWMgKi8K
LQlub2RlX3AJc2Nfbm9kZTsJCS8qIHBvaW50ZXIgYmFjayB0byBub2RlICovCi0JaG9va19wCXNj
X2hvb2s7CQkvKiB1cHN0cmVhbSBob29rICovCisJLyogR2x1ZSAqLworCWludAkJCXNjX3Rhc2tf
ZmxhZ3M7CS8qIHRhc2sgZmxhZ3MgKi8KKyNkZWZpbmUgVUJUX0ZMQUdfVF9QRU5ESU5HCSgxIDw8
IDApCS8qIHRhc2sgcGVuZGluZyAqLworI2RlZmluZSBVQlRfRkxBR19UX1NUT1BfQUxMCSgxIDw8
IDEpCS8qIHN0b3AgYWxsIHhmZXJzICovCisjZGVmaW5lIFVCVF9GTEFHX1RfU1RBUlRfQUxMCSgx
IDw8IDIpCS8qIHN0YXJ0IGFsbCByZWFkIGFuZCBpc29jCisJCQkJCQkgICB3cml0ZSB4ZmVycyAq
LworI2RlZmluZSBVQlRfRkxBR19UX1NUQVJUX0NUUkwJKDEgPDwgMykJLyogc3RhcnQgY29udHJv
bCB4ZmVyICh3cml0ZSkgKi8KKyNkZWZpbmUgVUJUX0ZMQUdfVF9TVEFSVF9CVUxLCSgxIDw8IDQp
CS8qIHN0YXJ0IGJ1bGsgeGZlciAod3JpdGUpICovCisKKwlzdHJ1Y3QgdGFzawkJc2NfdGFzazsK
IH07Ci10eXBlZGVmIHN0cnVjdCB1YnRfc29mdGMgdWJ0X3NvZnRjX3Q7Ci10eXBlZGVmIHN0cnVj
dCB1YnRfc29mdGMgKnVidF9zb2Z0Y19wOwordHlwZWRlZiBzdHJ1Y3QgdWJ0X3NvZnRjCXVidF9z
b2Z0Y190OwordHlwZWRlZiBzdHJ1Y3QgdWJ0X3NvZnRjICoJdWJ0X3NvZnRjX3A7CiAKLSNlbmRp
ZgkJCQkJLyogbmRlZiBfTkdfVUJUX1ZBUl9IXyAqLworI2VuZGlmIC8qIG5kZWYgX05HX1VCVF9W
QVJfSF8gKi8KKwo=
--000e0cd2e10ccf0fd50460dd59a4--



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