Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Jun 2014 08:56:43 +0200
From:      =?UTF-8?Q?Tomek_Wa=C5=82aszek?= <tmwalaszek@gmail.com>
To:        freebsd-hackers@freebsd.org
Subject:   Improve cron(8)
Message-ID:  <CAN3T69vCQTb1hU%2BAUKg%2BKLgsuCttLxYS6u2r9k3w5LM2D4zZoA@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
--089e0111c08a47d11f04fb9e10f8
Content-Type: text/plain; charset=UTF-8

Hello,
I saw on the FreeBSD Ideas page topic about cron :).
I've started updating the 'original' FreeBSD cron from sources to vixi cron
4.1. I think (well I hope :P) most of the features that were done in
FreeBSD cron are now ported into vixi cron 4.1, there are unfortunately
some missing features at the moment:
- @every_second - this need to be done
- -s and -o, in vixi cron 4.1 daylight time switches are enabled by
default, at the moment there is no -s and -o options. So you need to remove
'-s' from the cron rc script

I've also added one feature from OpenBSD, crontab is poking cron using
unix-domain socket so we don't need to have suid on crontab.

Path is in the attachment. I'm testing it on my FreeBSD box and it looks
good but anyway don't try it on production machines :).

After the installation we have to do a few things:
- Add crontab group
- Change group to crontab on /var/cron/tabs
- Add sticky bit on /var/cron/tabs
- Add group write permissions on /var/cron/tabs

This is still work in progress but if someone could have a look on this and
give me some feedback it would be great.

Regards,
Tomasz Walaszek

--089e0111c08a47d11f04fb9e10f8
Content-Type: application/octet-stream; name=vixi_patch
Content-Disposition: attachment; filename=vixi_patch
Content-Transfer-Encoding: base64
X-Attachment-Id: f_hwbtjuwi0

ZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vTWFrZWZpbGUgZnJlZWJzZF9jcm9uL01h
a2VmaWxlCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL01ha2VmaWxlCTIwMTQtMDEtMTYgMjE6
NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vTWFrZWZpbGUJMjAxNC0wNi0x
MSAxNjo0Mjo1NS4yNzE0NDQ4OTMgKzAyMDAKQEAgLTEsNCArMSw0IEBACi0jICRGcmVlQlNEOiBy
ZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL01ha2VmaWxlIDgwMDI5IDIwMDEtMDctMjAgMDY6
MjA6MzJaIG9icmllbiAkCisjICRGcmVlQlNEOiByZWxlbmcvMTAuMC91c3Iuc2Jpbi9jcm9uL01h
a2VmaWxlIDgwMDI5IDIwMDEtMDctMjAgMDY6MjA6MzJaIG9icmllbiAkCiAKIFNVQkRJUj0JbGli
IGNyb24gY3JvbnRhYgogCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL01ha2VmaWxl
LmluYyBmcmVlYnNkX2Nyb24vTWFrZWZpbGUuaW5jCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9u
L01ha2VmaWxlLmluYwkyMDE0LTAxLTE2IDIxOjQzOjUwLjAwMDAwMDAwMCArMDEwMAorKysgZnJl
ZWJzZF9jcm9uL01ha2VmaWxlLmluYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MTQ0NDg5MyArMDIw
MApAQCAtMSw0ICsxLDQgQEAKLSMgJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4wL3Vzci5zYmluL2Ny
b24vTWFrZWZpbGUuaW5jIDE0NzIyNSAyMDA1LTA2LTEwIDA2OjEyOjUzWiBkZXMgJAorIyAkRnJl
ZUJTRDogcmVsZW5nLzEwLjAvdXNyLnNiaW4vY3Jvbi9NYWtlZmlsZS5pbmMgMTQ3MjI1IDIwMDUt
MDYtMTAgMDY6MTI6NTNaIGRlcyAkCiAKIExJQkNST049ICR7Lk9CSkRJUn0vLi4vbGliL2xpYmNy
b24uYQogCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24vTWFrZWZpbGUgZnJl
ZWJzZF9jcm9uL2Nyb24vTWFrZWZpbGUKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9N
YWtlZmlsZQkyMDE0LTAxLTE2IDIxOjQzOjQ5LjAwMDAwMDAwMCArMDEwMAorKysgZnJlZWJzZF9j
cm9uL2Nyb24vTWFrZWZpbGUJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzE0NDQ4OTMgKzAyMDAKQEAg
LTEsNCArMSw0IEBACi0jICRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Ny
b24vTWFrZWZpbGUgMjAxMzkwIDIwMTAtMDEtMDIgMTE6MDc6NDRaIGVkICQKKyMgJEZyZWVCU0Q6
IHJlbGVuZy8xMC4wL3Vzci5zYmluL2Nyb24vY3Jvbi9NYWtlZmlsZSAyMDEzOTAgMjAxMC0wMS0w
MiAxMTowNzo0NFogZWQgJAogCiBQUk9HPQljcm9uCiBNQU49CWNyb24uOApkaWZmIC1ydU4gL3Vz
ci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2NvbXBhdC5oIGZyZWVic2RfY3Jvbi9jcm9uL2NvbXBh
dC5oCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24vY29tcGF0LmgJMjAxNC0wMS0xNiAy
MTo0Mzo0OS4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9jcm9uL2NvbXBhdC5oCTE5
NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xLDE0MCArMCwwIEBACi0vKiBD
b3B5cmlnaHQgMTk5MywxOTk0IGJ5IFBhdWwgVml4aWUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQK
LSAqCi0gKiBEaXN0cmlidXRlIGZyZWVseSwgZXhjZXB0OiBkb24ndCByZW1vdmUgbXkgbmFtZSBm
cm9tIHRoZSBzb3VyY2Ugb3IKLSAqIGRvY3VtZW50YXRpb24gKGRvbid0IHRha2UgY3JlZGl0IGZv
ciBteSB3b3JrKSwgbWFyayB5b3VyIGNoYW5nZXMgKGRvbid0Ci0gKiBnZXQgbWUgYmxhbWVkIGZv
ciB5b3VyIHBvc3NpYmxlIGJ1Z3MpLCBkb24ndCBhbHRlciBvciByZW1vdmUgdGhpcwotICogbm90
aWNlLiAgTWF5IGJlIHNvbGQgaWYgYnVpbGRhYmxlIHNvdXJjZSBpcyBwcm92aWRlZCB0byBidXll
ci4gIE5vCi0gKiB3YXJyYW50ZWUgb2YgYW55IGtpbmQsIGV4cHJlc3Mgb3IgaW1wbGllZCwgaXMg
aW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBzb2Z0d2FyZTsgdXNlIGF0IHlvdXIgb3duIHJpc2ssIHJl
c3BvbnNpYmlsaXR5IGZvciBkYW1hZ2VzIChpZiBhbnkpIHRvCi0gKiBhbnlvbmUgcmVzdWx0aW5n
IGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIHJlc3RzIGVudGlyZWx5IHdpdGggdGhlCi0g
KiB1c2VyLgotICoKLSAqIFNlbmQgYnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgZW5oYW5jZW1lbnRz
LCByZXF1ZXN0cywgZmxhbWVzLCBldGMuLCBhbmQKLSAqIEknbGwgdHJ5IHRvIGtlZXAgYSB2ZXJz
aW9uIHVwIHRvIGRhdGUuICBJIGNhbiBiZSByZWFjaGVkIGFzIGZvbGxvd3M6Ci0gKiBQYXVsIFZp
eGllICAgICAgICAgIDxwYXVsQHZpeC5jb20+ICAgICAgICAgIHV1bmV0IWRlY3dybCF2aXhpZSFw
YXVsCi0gKi8KLQotLyoKLSAqICRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9u
L2Nyb24vY29tcGF0LmggNTA0NzkgMTk5OS0wOC0yOCAwMTozNTo1OVogcGV0ZXIgJAotICovCi0K
LSNpZm5kZWYgX19QCi0jIGlmZGVmIF9fU1REQ19fCi0jICBkZWZpbmUgX19QKHgpIHgKLSMgZWxz
ZQotIyAgZGVmaW5lIF9fUCh4KSAoKQotIyAgZGVmaW5lIGNvbnN0Ci0jIGVuZGlmCi0jZW5kaWYK
LQotI2lmIGRlZmluZWQoVU5JWFBDKSB8fCBkZWZpbmVkKHVuaXhwYykKLSMgZGVmaW5lIFVOSVhQ
QyAxCi0jIGRlZmluZSBBVFQgMQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKGhwdXgpIHx8IGRlZmlu
ZWQoX2hwdXgpIHx8IGRlZmluZWQoX19ocHV4KQotIyBkZWZpbmUgSFBVWCAxCi0jIGRlZmluZSBz
ZXRldWlkKGUpIHNldHJlc3VpZCgtMSxlLC0xKQotIyBkZWZpbmUgc2V0cmV1aWQocixlKQlzZXRy
ZXN1aWQocixlLC0xKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9JQk1SMikKLSMgZGVmaW5lIEFJ
WCAxCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jb252ZXhfXykKLSMgZGVmaW5lIENPTlZFWCAx
Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoc2dpKSB8fCBkZWZpbmVkKF9zZ2kpIHx8IGRlZmluZWQo
X19zZ2kpCi0jIGRlZmluZSBJUklYIDEKLS8qIElSSVggNCBoZHJzIGFyZSBicm9rZW46IG9uZSBj
YW5ub3QgI2luY2x1ZGUgYm90aCA8c3RkaW8uaD4KLSAqIGFuZCA8c3RkbGliLmg+IGJlY2F1c2Ug
dGhleSBkaXNhZ3JlZSBvbiBzeXN0ZW0oKSwgcGVycm9yKCkuCi0gKiBUaGVyZWZvcmUgd2UgbXVz
dCB6YXAgdGhlICJjb25zdCIga2V5d29yZCBCRUZPUkUgaW5jbHVkaW5nCi0gKiBlaXRoZXIgb2Yg
dGhlbS4KLSAqLwotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfVU5JQ09T
KQotIyBkZWZpbmUgVU5JQ09TIDEKLSNlbmRpZgotCi0jaWZuZGVmIFBPU0lYCi0jIGlmIChCU0Qg
Pj0gMTk5MTAzKSB8fCBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQodWx0cml4KSB8fCBkZWZp
bmVkKEFJWCkgfHxcCi0JZGVmaW5lZChIUFVYKSB8fCBkZWZpbmVkKENPTlZFWCkgfHwgZGVmaW5l
ZChJUklYKQotIyAgZGVmaW5lIFBPU0lYCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBCU0QK
LSMgaWYgZGVmaW5lZCh1bHRyaXgpCi0jICBkZWZpbmUgQlNEIDE5ODkwMgotIyBlbmRpZgotI2Vu
ZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKi8KLQotI2lmICFkZWZpbmVkKEJTRCkgJiYgIWRlZmluZWQoSFBVWCkg
JiYgIWRlZmluZWQoQ09OVkVYKSAmJiAhZGVmaW5lZChfX2xpbnV4KQotIyBkZWZpbmUgTkVFRF9W
Rk9SSwotI2VuZGlmCi0KLSNpZiAoIWRlZmluZWQoQlNEKSB8fCAoQlNEIDwgMTk4OTAyKSkgJiYg
IWRlZmluZWQoX19saW51eCkgJiYgXAotCSFkZWZpbmVkKElSSVgpICYmICFkZWZpbmVkKE5lWFQp
ICYmICFkZWZpbmVkKEhQVVgpCi0jIGRlZmluZSBORUVEX1NUUkNBU0VDTVAKLSNlbmRpZgotCi0j
aWYgKCFkZWZpbmVkKEJTRCkgfHwgKEJTRCA8IDE5ODkxMSkpICYmICFkZWZpbmVkKF9fbGludXgp
ICYmXAotCSFkZWZpbmVkKElSSVgpICYmICFkZWZpbmVkKFVOSUNPUykgJiYgIWRlZmluZWQoSFBV
WCkKLSMgZGVmaW5lIE5FRURfU1RSRFVQCi0jZW5kaWYKLQotI2lmICghZGVmaW5lZChCU0QpIHx8
IChCU0QgPCAxOTg5MTEpKSAmJiAhZGVmaW5lZChQT1NJWCkgJiYgIWRlZmluZWQoTmVYVCkKLSMg
ZGVmaW5lIE5FRURfU1RSRVJST1IKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIUFVYKSB8fCBkZWZp
bmVkKEFJWCkgfHwgZGVmaW5lZChVTklYUEMpCi0jIGRlZmluZSBORUVEX0ZMT0NLCi0jZW5kaWYK
LQotI2lmbmRlZiBQT1NJWAotIyBkZWZpbmUgTkVFRF9TRVRTSUQKLSNlbmRpZgotCi0jaWYgKGRl
ZmluZWQoUE9TSVgpICYmICFkZWZpbmVkKEJTRCkpICYmICFkZWZpbmVkKF9fbGludXgpCi0jIGRl
ZmluZSBORUVEX0dFVERUQUJMRVNJWkUKLSNlbmRpZgotCi0jaWZkZWYgUE9TSVgKLSNpbmNsdWRl
IDx1bmlzdGQuaD4KLSNpZmRlZiBfUE9TSVhfU0FWRURfSURTCi0jIGRlZmluZSBIQVZFX1NBVkVE
X1VJRFMKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChBVFQpICYmICFkZWZpbmVkKF9f
bGludXgpICYmICFkZWZpbmVkKElSSVgpICYmICFkZWZpbmVkKFVOSUNPUykKLSMgZGVmaW5lIFVT
RV9TSUdDSExECi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEFJWCkgJiYgIWRlZmluZWQoVU5JQ09T
KQotIyBkZWZpbmUgU1lTX1RJTUVfSCAxCi0jZWxzZQotIyBkZWZpbmUgU1lTX1RJTUVfSCAwCi0j
ZW5kaWYKLQotI2lmIGRlZmluZWQoQlNEKSAmJiAhZGVmaW5lZChQT1NJWCkKLSMgZGVmaW5lIFVT
RV9VVElNRVMKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBSVgpIHx8IGRlZmluZWQoSFBVWCkgfHwg
ZGVmaW5lZChJUklYKQotIyBkZWZpbmUgTkVFRF9TRVRFTlYKLSNlbmRpZgotCi0jaWYgIWRlZmlu
ZWQoVU5JQ09TKSAmJiAhZGVmaW5lZChVTklYUEMpCi0jIGRlZmluZSBIQVNfRkNIT1dOCi0jZW5k
aWYKLQotI2lmICFkZWZpbmVkKFVOSUNPUykgJiYgIWRlZmluZWQoVU5JWFBDKQotIyBkZWZpbmUg
SEFTX0ZDSE1PRAotI2VuZGlmCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24v
Y29uZmlnLmggZnJlZWJzZF9jcm9uL2Nyb24vY29uZmlnLmgKLS0tIC91c3Ivc3JjL3Vzci5zYmlu
L2Nyb24vY3Jvbi9jb25maWcuaAkyMDE0LTAxLTE2IDIxOjQzOjQ5LjAwMDAwMDAwMCArMDEwMAor
KysgZnJlZWJzZF9jcm9uL2Nyb24vY29uZmlnLmgJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzE0NDQ4
OTMgKzAyMDAKQEAgLTEsMjkgKzEsMjkgQEAKIC8qIENvcHlyaWdodCAxOTg4LDE5OTAsMTk5Mywx
OTk0IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLworCisvKgorICog
Q29weXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAo
IklTQyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0d2FyZSBD
b25zb3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDogZG9uJ3Qg
cmVtb3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9uIChkb24n
dCB0YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24ndAotICog
Z2V0IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIgb3IgcmVt
b3ZlIHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3VyY2UgaXMg
cHJvdmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBleHByZXNz
IG9yIGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVzZSBhdCB5
b3VyIG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0bwotICog
YW55b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0cyBlbnRp
cmVseSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2Rp
ZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRo
IG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92
ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIg
aW4gYWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMsIGVuaGFu
Y2VtZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0byBrZWVw
IGEgdmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dzOgotICog
UGF1bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFkZWN3cmwh
dml4aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElTQyBE
SVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUg
SU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9SCisgKiBBTlkg
U1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFO
WSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRB
IE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElH
RU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBPRiBPUiBJTiBD
T05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgog
ICovCiAKLS8qIGNvbmZpZy5oIC0gY29uZmlndXJhYmxlcyBmb3IgVml4aWUgQ3JvbgorLyogY29u
ZmlnLmggLSBjb25maWd1cmFibGVzIGZvciBJU0MgQ3JvbgogICoKLSAqICRGcmVlQlNEOiByZWxl
YXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Nyb24vY29uZmlnLmggNTA0NzkgMTk5OS0wOC0yOCAw
MTozNTo1OVogcGV0ZXIgJAorICogJElkOiBjb25maWcuaCx2IDEuMTAgMjAwNC8wMS8yMyAxODo1
Njo0MiB2aXhpZSBFeHAgJAogICovCiAKLSNpZiAhZGVmaW5lZChfUEFUSF9TRU5ETUFJTCkKLSMg
ZGVmaW5lIF9QQVRIX1NFTkRNQUlMICIvdXNyL2xpYi9zZW5kbWFpbCIKLSNlbmRpZiAvKlNFTkRN
QUlMKi8KLQogLyoKICAqIHRoZXNlIGFyZSBzaXRlLWRlcGVuZGVudAogICovCkBAIC0zMyw0NCAr
MzMsMzggQEAKICNlbmRpZgogCiAJCQkvKgotCQkJICogY2hvb3NlIG9uZSBvZiB0aGVzZSBNQUlM
Q01EIGNvbW1hbmRzLiAgSSB1c2UKKwkJCSAqIGNob29zZSBvbmUgb2YgdGhlc2UgbWFpbGVyIGNv
bW1hbmRzLiAgc29tZSB1c2UKIAkJCSAqIC9iaW4vbWFpbCBmb3Igc3BlZWQ7IGl0IG1ha2VzIGJp
ZmYgYmFyayBidXQgZG9lc24ndAotCQkJICogZG8gYWxpYXNpbmcuICAvdXNyL2xpYi9zZW5kbWFp
bCBkb2VzIGFsaWFzaW5nIGJ1dCBpcworCQkJICogZG8gYWxpYXNpbmcuICBzZW5kbWFpbCBkb2Vz
IGRvIGFsaWFzaW5nIGJ1dCBpcwogCQkJICogYSBob2cgZm9yIHNob3J0IG1lc3NhZ2VzLiAgYWxp
YXNpbmcgaXMgbm90IG5lZWRlZAogCQkJICogaWYgeW91IG1ha2UgdXNlIG9mIHRoZSBNQUlMVE89
IGZlYXR1cmUgaW4gY3JvbnRhYnMuCiAJCQkgKiAoaGludDogTUFJTFRPPSB3YXMgYWRkZWQgZm9y
IHRoaXMgcmVhc29uKS4KIAkJCSAqLwogCi0jZGVmaW5lIE1BSUxDTUQgX1BBVEhfU0VORE1BSUwJ
CQkJCS8qLSovCi0jZGVmaW5lIE1BSUxBUkdTICIlcyAtRkNyb25EYWVtb24gLW9kaSAtb2VtIC1v
aSAtdCIgICAgICAgICAgICAgLyotKi8KLQkJCS8qIC1GeAkgPSBzZXQgZnVsbC1uYW1lIG9mIHNl
bmRlcgorI2RlZmluZSBNQUlMRk1UICIlcyAtRkNyb25EYWVtb24gLW9kaSAtb2VtIC1vaSAtdCIg
LyotKi8KKwkJCS8qIC1GeAkgPSBTZXQgZnVsbC1uYW1lIG9mIHNlbmRlcgogCQkJICogLW9kaQkg
PSBPcHRpb24gRGVsaXZlcnltb2RlIEludGVyYWN0aXZlCiAJCQkgKiAtb2VtCSA9IE9wdGlvbiBF
cnJvcnMgTWFpbGVkdG9zZW5kZXIKLQkJCSAqIC1vaSAgID0gT3B0aW9uIGRvdCBtZXNzYWdlIHRl
cm1pbmF0b3IKLQkJCSAqIC10ICAgID0gcmVhZCByZWNpcGllbnRzIGZyb20gaGVhZGVyIG9mIG1l
c3NhZ2UKKwkJCSAqIC1vaSAgID0gSWdub3JlICIuIiBhbG9uZSBvbiBhIGxpbmUKKwkJCSAqIC10
ICAgID0gR2V0IHJlY2lwaWVudCBmcm9tIGhlYWRlcnMKIAkJCSAqLworI2RlZmluZSBNQUlMQVJH
IF9QQVRIX1NFTkRNQUlMCQkJCS8qLSovCiAKLS8qICNkZWZpbmUgTUFJTENNRCAiL2Jpbi9tYWls
IiAqLwkJLyotKi8KLS8qICNkZWZpbmUgTUFJTEFSR1MgIiVzIC1kICAlcyIgKi8JCS8qLSovCi0J
CQkvKiAtZCA9IHVuZG9jdW1lbnRlZCBidXQgY29tbW9uIGZsYWc6IGRlbGl2ZXIgbG9jYWxseT8K
Ky8qICNkZWZpbmUgTUFJTEZNVCAiJXMgLWQgJXMiCQkJCQorCQkJIC1kID0gdW5kb2N1bWVudGVk
IGJ1dCBjb21tb24gZmxhZzogZGVsaXZlciBsb2NhbGx5PwogCQkJICovCisvKiAjZGVmaW5lIE1B
SUxBUkcgIi9iaW4vbWFpbCIsbWFpbHRvICovCiAKLS8qICNkZWZpbmUgTUFJTENNRCAiL3Vzci9t
bWRmL2Jpbi9zdWJtaXQiICovCS8qLSovCi0vKiAjZGVmaW5lIE1BSUxBUkdTICIlcyAtbWxyeHRv
ICVzIiAqLwkJLyotKi8KKy8qICNkZWZpbmUgTUFJTEZNVCAiJXMgLW1scnh0byAlcyIJCQkqLwor
LyogI2RlZmluZSBNQUlMQVJHICIvdXNyL21tZGYvYmluL3N1Ym1pdCIsbWFpbHRvCSovCiAKLS8q
ICNkZWZpbmUgTUFJTF9EQVRFICovCQkJCS8qLSovCisvKiAjZGVmaW5lIE1BSUxfREFURQkJCQkq
LwogCQkJLyogc2hvdWxkIHdlIGluY2x1ZGUgYW4gZXJzYXR6IERhdGU6IGhlYWRlciBpbgogCQkJ
ICogZ2VuZXJhdGVkIG1haWw/ICBpZiB5b3UgYXJlIHVzaW5nIHNlbmRtYWlsCi0JCQkgKiBmb3Ig
TUFJTENNRCwgaXQgaXMgYmV0dGVyIHRvIGxldCBzZW5kbWFpbAorCQkJICogYXMgdGhlIG1haWxl
ciwgaXQgaXMgYmV0dGVyIHRvIGxldCBzZW5kbWFpbAogCQkJICogZ2VuZXJhdGUgdGhlIERhdGU6
IGhlYWRlci4KIAkJCSAqLwogCi0JCQkvKiBpZiBBTExPV19GSUxFIGFuZCBERU5ZX0ZJTEUgYXJl
IG5vdCBkZWZpbmVkIG9yIGFyZQotCQkJICogZGVmaW5lZCBidXQgbmVpdGhlciBleGlzdHMsIHNo
b3VsZCBjcm9udGFiKDEpIGJlCi0JCQkgKiB1c2FibGUgb25seSBieSByb290PwotCQkJICovCi0v
KiAjZGVmaW5lIEFMTE9XX09OTFlfUk9PVCAqLwkJCS8qLSovCi0KIAkJCS8qIGlmIHlvdSB3YW50
IHRvIHVzZSBzeXNsb2coMykgaW5zdGVhZCBvZiBhcHBlbmRpbmcKIAkJCSAqIHRvIENST05ESVIv
TE9HX0ZJTEUgKC92YXIvY3Jvbi9sb2csIGUuZy4pLCBkZWZpbmUKIAkJCSAqIFNZU0xPRyBoZXJl
LiAgTm90ZSB0aGF0IHF1aXRlIGEgYml0IG9mIGxvZ2dpbmcKQEAgLTg1LDMgKzc5LDI3IEBACiAJ
CQkgKiBwbGFjZXMuCiAJCQkgKi8KICNkZWZpbmUgU1lTTE9HCSAJCQkvKi0qLworCisJCQkvKiBp
ZiB5b3Ugd2FudCBjcm9uIHRvIGNhcGl0YWxpemUgaXRzIG5hbWUgaW4gcHMKKwkJCSAqIHdoZW4g
cnVubmluZyBhIGpvYi4gIERvZXMgbm90IHdvcmsgb24gU1lTVi4KKwkJCSAqLworLyojZGVmaW5l
IENBUElUQUxJWkVfRk9SX1BTCQkqLworCisJCQkvKiBpZiB5b3UgaGF2ZSBhIHRtX2dtdG9mZiBt
ZW1iZXIgaW4gc3RydWN0IHRtLgorCQkJICogSWYgbm90LCB3ZSB3aWxsIGhhdmUgdG8gY29tcHV0
ZSB0aGUgdmFsdWUgb3Vyc2VsdmVzLgorCQkJICovCisvKiNkZWZpbmUgSEFWRV9UTV9HTVRPRkYJ
CSovCisKKwkJCS8qIGlmIHlvdXIgT1Mgc3VwcG9ydHMgYSBCU0Qtc3R5bGUgbG9naW4uY29uZiBm
aWxlICovCisvKiNkZWZpbmUgTE9HSU5fQ0FQCQkJKi8KKworCQkJLyogaWYgeW91ciBPUyBzdXBw
b3J0cyBCU0QgYXV0aGVudGljYXRpb24gKi8KKy8qI2RlZmluZSBCU0RfQVVUSAkJCSovCisKKwkJ
CS8qIERlZmluZSB0aGlzIHRvIHJ1biBjcm9udGFiIHNldGdpZCBpbnN0ZWFkIG9mICAgCisJCQkg
KiBzZXR1aWQgcm9vdC4gIEdyb3VwIGFjY2VzcyB3aWxsIGJlIHVzZWQgdG8gcmVhZAorCQkJICog
dGhlIHRhYnMvYXRqb2JzIGRpcnMgYW5kIHRoZSBhbGxvdy9kZW55IGZpbGVzLgorCQkJICogSWYg
dGhpcyBpcyBub3QgZGVmaW5lZCB0aGVuIGNyb250YWIgYW5kIGF0CisJCQkgKiBtdXN0IGJlIHNl
dHVpZCByb290LgorCQkJICovCisvKiNkZWZpbmUgQ1JPTl9HUk9VUAkiY3JvbnRhYiIJKi8KZGlm
ZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9jcm9uLjggZnJlZWJzZF9jcm9uL2Ny
b24vY3Jvbi44Ci0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24vY3Jvbi44CTIwMTQtMDEt
MTYgMjE6NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vY3Jvbi9jcm9uLjgJ
MjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzI0NDQyNzYgKzAyMDAKQEAgLTE1LDcgKzE1LDcgQEAKIC5c
IiAqIFBhdWwgVml4aWUgICAgICAgICAgPHBhdWxAdml4LmNvbT4gICAgICAgICAgdXVuZXQhZGVj
d3JsIXZpeGllIXBhdWwKIC5cIiAqLwogLlwiCi0uXCIgJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4w
L3Vzci5zYmluL2Nyb24vY3Jvbi9jcm9uLjggMTgwMDk2IDIwMDgtMDYtMjkgMTY6NTY6MThaIG1h
cmNrICQKKy5cIiAkRnJlZUJTRDogcmVsZW5nLzEwLjAvdXNyLnNiaW4vY3Jvbi9jcm9uL2Nyb24u
OCAxODAwOTYgMjAwOC0wNi0yOSAxNjo1NjoxOFogbWFyY2sgJAogLlwiCiAuRGQgSnVuZSAyOSwg
MjAwOAogLkR0IENST04gOApkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2Ny
b24uYyBmcmVlYnNkX2Nyb24vY3Jvbi9jcm9uLmMKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24v
Y3Jvbi9jcm9uLmMJMjAxNC0wMS0xNiAyMTo0Mzo0OS4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVi
c2RfY3Jvbi9jcm9uL2Nyb24uYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MjQ0NDI3NiArMDIwMApA
QCAtMSwxNDIgKzEsMTM3IEBACiAvKiBDb3B5cmlnaHQgMTk4OCwxOTkwLDE5OTMsMTk5NCBieSBQ
YXVsIFZpeGllCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKi8KKworLyoKKyAqIENvcHlyaWdo
dCAoYykgMjAwNCBieSBJbnRlcm5ldCBTeXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQor
ICogQ29weXJpZ2h0IChjKSAxOTk3LDIwMDAgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1
bSwgSW5jLgogICoKLSAqIERpc3RyaWJ1dGUgZnJlZWx5LCBleGNlcHQ6IGRvbid0IHJlbW92ZSBt
eSBuYW1lIGZyb20gdGhlIHNvdXJjZSBvcgotICogZG9jdW1lbnRhdGlvbiAoZG9uJ3QgdGFrZSBj
cmVkaXQgZm9yIG15IHdvcmspLCBtYXJrIHlvdXIgY2hhbmdlcyAoZG9uJ3QKLSAqIGdldCBtZSBi
bGFtZWQgZm9yIHlvdXIgcG9zc2libGUgYnVncyksIGRvbid0IGFsdGVyIG9yIHJlbW92ZSB0aGlz
Ci0gKiBub3RpY2UuICBNYXkgYmUgc29sZCBpZiBidWlsZGFibGUgc291cmNlIGlzIHByb3ZpZGVk
IHRvIGJ1eWVyLiAgTm8KLSAqIHdhcnJhbnRlZSBvZiBhbnkga2luZCwgZXhwcmVzcyBvciBpbXBs
aWVkLCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMKLSAqIHNvZnR3YXJlOyB1c2UgYXQgeW91ciBvd24g
cmlzaywgcmVzcG9uc2liaWxpdHkgZm9yIGRhbWFnZXMgKGlmIGFueSkgdG8KLSAqIGFueW9uZSBy
ZXN1bHRpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgcmVzdHMgZW50aXJlbHkgd2l0
aCB0aGUKLSAqIHVzZXIuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQg
ZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRo
b3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNv
cHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBj
b3BpZXMuCiAgKgotICogU2VuZCBidWcgcmVwb3J0cywgYnVnIGZpeGVzLCBlbmhhbmNlbWVudHMs
IHJlcXVlc3RzLCBmbGFtZXMsIGV0Yy4sIGFuZAotICogSSdsbCB0cnkgdG8ga2VlcCBhIHZlcnNp
b24gdXAgdG8gZGF0ZS4gIEkgY2FuIGJlIHJlYWNoZWQgYXMgZm9sbG93czoKLSAqIFBhdWwgVml4
aWUgICAgICAgICAgPHBhdWxAdml4LmNvbT4gICAgICAgICAgdXVuZXQhZGVjd3JsIXZpeGllIXBh
dWwKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xBSU1T
IEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElO
RyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MuICBJTiBOTyBFVkVOVCBTSEFMTCBJU0MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUws
IERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdF
UworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9G
SVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Ig
T1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVDVElP
TiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCi0j
aWYgIWRlZmluZWQobGludCkgJiYgIWRlZmluZWQoTElOVCkKLXN0YXRpYyBjb25zdCBjaGFyIHJj
c2lkW10gPQotICAiJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4wL3Vzci5zYmluL2Nyb24vY3Jvbi9j
cm9uLmMgMjQyMTAxIDIwMTItMTAtMjUgMjI6NTQ6MjlaIHNvYm9tYXggJCI7Ci0jZW5kaWYKKy8v
I2lmICFkZWZpbmVkKGxpbnQpICYmICFkZWZpbmVkKExJTlQpCisvL3N0YXRpYyBjaGFyIHJjc2lk
W10gPSAiJElkOiBjcm9uLmMsdiAxLjEyIDIwMDQvMDEvMjMgMTg6NTY6NDIgdml4aWUgRXhwICQi
OworLy8jZW5kaWYKIAogI2RlZmluZQlNQUlOX1BST0dSQU0KLQorI2luY2x1ZGUgPGxpYnV0aWwu
aD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgogCiAjaW5jbHVkZSAiY3Jvbi5oIgotI2luY2x1ZGUg
PHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgotI2lmIFNZU19USU1FX0gKLSMg
aW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgog
CitlbnVtIHRpbWVqdW1wIHsgbmVnYXRpdmUsIHNtYWxsLCBtZWRpdW0sIGxhcmdlIH07CiAKIHN0
YXRpYwl2b2lkCXVzYWdlKHZvaWQpLAogCQlydW5fcmVib290X2pvYnMoY3Jvbl9kYiAqKSwKLQkJ
Y3Jvbl90aWNrKGNyb25fZGIgKiwgaW50KSwKLQkJY3Jvbl9zeW5jKGludCksCi0JCWNyb25fc2xl
ZXAoY3Jvbl9kYiAqLCBpbnQpLAotCQljcm9uX2NsZWFuKGNyb25fZGIgKiksCi0jaWZkZWYgVVNF
X1NJR0NITEQKKwkJZmluZF9qb2JzKGludCwgY3Jvbl9kYiAqLCBpbnQsIGludCksCisJCXNldF90
aW1lKGludCksCisJCWNyb25fc2xlZXAoaW50KSwKIAkJc2lnY2hsZF9oYW5kbGVyKGludCksCi0j
ZW5kaWYKIAkJc2lnaHVwX2hhbmRsZXIoaW50KSwKKwkJc2lnY2hsZF9yZWFwZXIodm9pZCksCisJ
CXF1aXQoaW50KSwKIAkJcGFyc2VfYXJncyhpbnQgYywgY2hhciAqdltdKTsKIAotc3RhdGljIGlu
dAlydW5fYXRfc2VjcmVzKGNyb25fZGIgKik7Ci0KLXN0YXRpYyB0aW1lX3QJbGFzdF90aW1lID0g
MDsKLXN0YXRpYyBpbnQJZHN0X2VuYWJsZWQgPSAwOwotc3RydWN0IHBpZGZoICpwZmg7CitzdGF0
aWMJdm9sYXRpbGUgc2lnX2F0b21pY190CWdvdF9zaWdodXAsIGdvdF9zaWdjaGxkOworc3RhdGlj
CWludAkJCXRpbWVSdW5uaW5nLCB2aXJ0dWFsVGltZSwgY2xvY2tUaW1lOworc3RhdGljICBpbnQJ
CQljcm9uU29jazsKK3N0YXRpYwlsb25nCQkJR01Ub2ZmOworc3RhdGljICBjcm9uX2RiIAkJZGF0
YWJhc2U7CiAKK3N0cnVjdCBwaWRmaAkJCSpwZmg7CiBzdGF0aWMgdm9pZAotdXNhZ2UoKSB7Ci0j
aWYgREVCVUdHSU5HCi0gICAgY2hhciAqKmRmbGFnczsKLSNlbmRpZgotCi0JZnByaW50ZihzdGRl
cnIsICJ1c2FnZTogY3JvbiBbLWogaml0dGVyXSBbLUogcm9vdGppdHRlcl0gIgotCQkJIlstbSBt
YWlsdG9dIFstc10gWy1vXSBbLXggZGVidWdmbGFnWywuLi5dXVxuIik7Ci0jaWYgREVCVUdHSU5H
Ci0JZnByaW50ZihzdGRlcnIsICJcbmRlYnVnZmxhZ3M6ICIpOwordXNhZ2Uodm9pZCkgeworCWNv
bnN0IGNoYXIgKipkZmxhZ3M7CiAKLSAgICAgICAgZm9yKGRmbGFncyA9IERlYnVnRmxhZ05hbWVz
OyAqZGZsYWdzOyBkZmxhZ3MrKykgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzICIsICpkZmxhZ3Mp
OwotCX0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotI2VuZGlmCisJZnByaW50Zihz
dGRlcnIsICJ1c2FnZTogY3JvbiBbLWogaml0dGVyXSBbLUogcm9vdGppdHRlcl0gIik7CisJZnBy
aW50ZihzdGRlcnIsICIlcyBbLW5dIFsteCBbIiwgUHJvZ3JhbU5hbWUpOworCWZvciAoZGZsYWdz
ID0gRGVidWdGbGFnTmFtZXM7ICpkZmxhZ3M7IGRmbGFncysrKQorCQlmcHJpbnRmKHN0ZGVyciwg
IiVzJXMiLCAqZGZsYWdzLCBkZmxhZ3NbMV0gPyAiLCIgOiAiXSIpOwogCisJZnByaW50ZihzdGRl
cnIsICJdXG4iKTsKIAlleGl0KEVSUk9SX0VYSVQpOwogfQogCiBzdGF0aWMgdm9pZAogb3Blbl9w
aWRmaWxlKHZvaWQpCiB7Ci0JY2hhcglwaWRmaWxlW01BWF9GTkFNRV07Ci0JY2hhcglidWZbTUFY
X1RFTVBTVFJdOwotCWludAlvdGhlcnBpZDsKLQotCSh2b2lkKSBzbnByaW50ZihwaWRmaWxlLCBz
aXplb2YocGlkZmlsZSksIFBJREZJTEUsIFBJRERJUik7Ci0JcGZoID0gcGlkZmlsZV9vcGVuKHBp
ZGZpbGUsIDA2MDAsICZvdGhlcnBpZCk7Ci0JaWYgKHBmaCA9PSBOVUxMKSB7Ci0JCWlmIChlcnJu
byA9PSBFRVhJU1QpIHsKLQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkgICAgImNy
b24gYWxyZWFkeSBydW5uaW5nLCBwaWQ6ICVkIiwgb3RoZXJwaWQpOwotCQl9IGVsc2UgewotCQkJ
c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAiY2FuJ3Qgb3BlbiBvciBjcmVhdGUg
JXM6ICVzIiwgcGlkZmlsZSwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQl9Ci0JCWxvZ19p
dCgiQ1JPTiIsIGdldHBpZCgpLCAiREVBVEgiLCBidWYpOwotCQllcnJ4KEVSUk9SX0VYSVQsICIl
cyIsIGJ1Zik7Ci0JfQorICAgICAgICBjaGFyICAgIHBpZGZpbGVbTUFYX0ZOQU1FXTsKKyAgICAg
ICAgY2hhciAgICBidWZbTUFYX1RFTVBTVFJdOworICAgICAgICBpbnQgICAgIG90aGVycGlkOwor
CisgICAgICAgICh2b2lkKSBzbnByaW50ZihwaWRmaWxlLCBzaXplb2YocGlkZmlsZSksIFBJREZJ
TEUsIFBJRERJUik7CisgICAgICAgIHBmaCA9IHBpZGZpbGVfb3BlbihwaWRmaWxlLCAwNjAwLCAm
b3RoZXJwaWQpOworICAgICAgICBpZiAocGZoID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBp
ZiAoZXJybm8gPT0gRUVYSVNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50Zihi
dWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9uIGFscmVh
ZHkgcnVubmluZywgcGlkOiAlZCIsIG90aGVycGlkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgb3BlbiBvciBjcmVhdGUgJXM6ICVzIiwg
cGlkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2dfaXQoIkNST04iLCBnZXRwaWQo
KSwgIkRFQVRIIiwgYnVmKTsKKyAgICAgICAgICAgICAgICBlcnJ4KEVSUk9SX0VYSVQsICIlcyIs
IGJ1Zik7CisgICAgICAgIH0KIH0KIAogaW50Ci1tYWluKGFyZ2MsIGFyZ3YpCi0JaW50CWFyZ2M7
Ci0JY2hhcgkqYXJndltdOwotewotCWNyb25fZGIJZGF0YWJhc2U7Ci0JaW50IHJ1bm51bTsKLQlp
bnQgc2VjcmVzMSwgc2VjcmVzMjsKLQlzdHJ1Y3QgdG0gKnRtOworbWFpbihpbnQgYXJnYywgY2hh
ciAqYXJndltdKSB7CisJc3RydWN0IHNpZ2FjdGlvbiBzYWN0OwogCiAJUHJvZ3JhbU5hbWUgPSBh
cmd2WzBdOwogCisJc2V0bG9jYWxlKExDX0FMTCwgIiIpOworCiAjaWYgZGVmaW5lZChCU0QpCiAJ
c2V0bGluZWJ1ZihzdGRvdXQpOwogCXNldGxpbmVidWYoc3RkZXJyKTsKICNlbmRpZgogCisJTm9G
b3JrID0gMDsKIAlwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwogCi0jaWZkZWYgVVNFX1NJR0NITEQK
LQkodm9pZCkgc2lnbmFsKFNJR0NITEQsIHNpZ2NobGRfaGFuZGxlcik7Ci0jZWxzZQotCSh2b2lk
KSBzaWduYWwoU0lHQ0xELCBTSUdfSUdOKTsKKwliemVybygoY2hhciAqKSZzYWN0LCBzaXplb2Yg
c2FjdCk7CisJc2lnZW1wdHlzZXQoJnNhY3Quc2FfbWFzayk7CisJc2FjdC5zYV9mbGFncyA9IDA7
CisjaWZkZWYgU0FfUkVTVEFSVAorCXNhY3Quc2FfZmxhZ3MgfD0gU0FfUkVTVEFSVDsKICNlbmRp
ZgotCSh2b2lkKSBzaWduYWwoU0lHSFVQLCBzaWdodXBfaGFuZGxlcik7CisJc2FjdC5zYV9oYW5k
bGVyID0gc2lnY2hsZF9oYW5kbGVyOworCSh2b2lkKSBzaWdhY3Rpb24oU0lHQ0hMRCwgJnNhY3Qs
IE5VTEwpOworCXNhY3Quc2FfaGFuZGxlciA9IHNpZ2h1cF9oYW5kbGVyOworCSh2b2lkKSBzaWdh
Y3Rpb24oU0lHSFVQLCAmc2FjdCwgTlVMTCk7CisJc2FjdC5zYV9oYW5kbGVyID0gcXVpdDsKKwko
dm9pZCkgc2lnYWN0aW9uKFNJR0lOVCwgJnNhY3QsIE5VTEwpOworCSh2b2lkKSBzaWdhY3Rpb24o
U0lHVEVSTSwgJnNhY3QsIE5VTEwpOwogCiAJb3Blbl9waWRmaWxlKCk7CisJY3JvblNvY2sgPSBv
cGVuX3NvY2tldCgpOwogCXNldF9jcm9uX3VpZCgpOwogCXNldF9jcm9uX2N3ZCgpOwogCi0jaWYg
ZGVmaW5lZChQT1NJWCkKLQlzZXRlbnYoIlBBVEgiLCBfUEFUSF9ERUZQQVRILCAxKTsKLSNlbmRp
ZgorCWlmIChwdXRlbnYoIlBBVEg9Il9QQVRIX0RFRlBBVEgpIDwgMCkgeworCQlsb2dfaXQoIkNS
T04iLCBnZXRwaWQoKSwgIkRFQVRIIiwgImNhbid0IG1hbGxvYyIpOworCQlleGl0KDEpOworCX0K
IAogCS8qIGlmIHRoZXJlIGFyZSBubyBkZWJ1ZyBmbGFncyB0dXJuZWQgb24sIGZvcmsgYXMgYSBk
YWVtb24gc2hvdWxkLgogCSAqLwotIyBpZiBERUJVR0dJTkcKIAlpZiAoRGVidWdGbGFncykgewot
IyBlbHNlCi0JaWYgKDApIHsKLSMgZW5kaWYKLQkJKHZvaWQpIGZwcmludGYoc3RkZXJyLCAiWyVk
XSBjcm9uIHN0YXJ0ZWRcbiIsIGdldHBpZCgpKTsKLQl9IGVsc2UgeworI2lmIERFQlVHR0lORwor
CQkodm9pZCkgZnByaW50ZihzdGRlcnIsICJbJWxkXSBjcm9uIHN0YXJ0ZWRcbiIsIChsb25nKWdl
dHBpZCgpKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoTm9Gb3JrID09IDApIHsKIAkJaWYgKGRhZW1v
bigxLCAwKSA9PSAtMSkgewogCQkJcGlkZmlsZV9yZW1vdmUocGZoKTsKIAkJCWxvZ19pdCgiQ1JP
TiIsZ2V0cGlkKCksIkRFQVRIIiwiY2FuJ3QgYmVjb21lIGRhZW1vbiIpOwpAQCAtMTQ1LDE2MCAr
MTQwLDE4MCBAQAogCX0KIAogCWlmIChtYWR2aXNlKE5VTEwsIDAsIE1BRFZfUFJPVEVDVCkgIT0g
MCkKLQkJbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJXQVJOSU5HIiwgIm1hZHZpc2UoKSBmYWls
ZWQiKTsKKwkJbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJXQVJOSU5HIiwgIm1hZHZpc2UoKSBm
aWxlZCIpOwogCiAJcGlkZmlsZV93cml0ZShwZmgpOwogCWRhdGFiYXNlLmhlYWQgPSBOVUxMOwog
CWRhdGFiYXNlLnRhaWwgPSBOVUxMOwogCWRhdGFiYXNlLm10aW1lID0gKHRpbWVfdCkgMDsKIAls
b2FkX2RhdGFiYXNlKCZkYXRhYmFzZSk7Ci0Jc2VjcmVzMSA9IHNlY3JlczIgPSBydW5fYXRfc2Vj
cmVzKCZkYXRhYmFzZSk7CisJc2V0X3RpbWUoVFJVRSk7CiAJcnVuX3JlYm9vdF9qb2JzKCZkYXRh
YmFzZSk7Ci0JY3Jvbl9zeW5jKHNlY3JlczEpOwotCXJ1bm51bSA9IDA7CisJdGltZVJ1bm5pbmcg
PSB2aXJ0dWFsVGltZSA9IGNsb2NrVGltZTsKKworCS8qCisJICogVG9vIG1hbnkgY2xvY2tzLCBu
b3QgZW5vdWdoIHRpbWUgKEFsLiBFaW5zdGVpbikKKwkgKiBUaGVzZSBjbG9ja3MgYXJlIGluIG1p
bnV0ZXMgc2luY2UgdGhlIGVwb2NoLCBhZGp1c3RlZCBmb3IgdGltZXpvbmUuCisJICogdmlydHVh
bFRpbWU6IGlzIHRoZSB0aW1lIGl0ICp3b3VsZCogYmUgaWYgd2Ugd29rZSB1cAorCSAqIHByb21w
dGx5IGFuZCBub2JvZHkgZXZlciBjaGFuZ2VkIHRoZSBjbG9jay4gSXQgaXMKKwkgKiBtb25vdG9u
aWNhbGx5IGluY3JlYXNpbmcuLi4gdW5sZXNzIGEgdGltZWp1bXAgaGFwcGVucy4KKwkgKiBBdCB0
aGUgdG9wIG9mIHRoZSBsb29wLCBhbGwgam9icyBmb3IgJ3ZpcnR1YWxUaW1lJyBoYXZlIHJ1bi4K
KwkgKiB0aW1lUnVubmluZzogaXMgdGhlIHRpbWUgd2UgbGFzdCBhd2FrZW5lZC4KKwkgKiBjbG9j
a1RpbWU6IGlzIHRoZSB0aW1lIHdoZW4gc2V0X3RpbWUgd2FzIGxhc3QgY2FsbGVkLgorCSAqLwog
CXdoaWxlIChUUlVFKSB7Ci0jIGlmIERFQlVHR0lORwotCSAgICAvKiBpZiAoIShEZWJ1Z0ZsYWdz
ICYgRFRFU1QpKSAqLwotIyBlbmRpZiAvKkRFQlVHR0lORyovCi0JCQljcm9uX3NsZWVwKCZkYXRh
YmFzZSwgc2VjcmVzMSk7Ci0KLQkJaWYgKHNlY3JlczEgPT0gMCB8fCBydW5udW0gJSA2MCA9PSAw
KSB7Ci0JCQlsb2FkX2RhdGFiYXNlKCZkYXRhYmFzZSk7Ci0JCQlzZWNyZXMyID0gcnVuX2F0X3Nl
Y3JlcygmZGF0YWJhc2UpOwotCQkJaWYgKHNlY3JlczIgIT0gc2VjcmVzMSkgewotCQkJCXNlY3Jl
czEgPSBzZWNyZXMyOwotCQkJCWlmIChzZWNyZXMxICE9IDApIHsKLQkJCQkJcnVubnVtID0gMDsK
LQkJCQl9IGVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBHb2luZyBmcm9tIDEgc2VjIHRvIDYwIHNl
YyByZXMuIElmIHdlCi0JCQkJCSAqIGFyZSBhbHJlYWR5IGF0IG1pbnV0ZSdzIGJvdW5kYXJ5LCBz
bwotCQkJCQkgKiBsZXQgaXQgcnVuLCBvdGhlcndpc2Ugc2NoZWR1bGUgZm9yIHRoZQotCQkJCQkg
KiBuZXh0IG1pbnV0ZS4KLQkJCQkJICovCi0JCQkJCXRtID0gbG9jYWx0aW1lKCZUYXJnZXRUaW1l
KTsKLQkJCQkJaWYgKHRtLT50bV9zZWMgPiAwKSAgewotCQkJCQkJY3Jvbl9zeW5jKHNlY3JlczIp
OwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9CisJCWludCB0aW1lRGlmZjsKKwkJZW51
bSB0aW1lanVtcCB3YWtldXBLaW5kOworCisJCS8qIC4uLiB3YWl0IGZvciB0aGUgdGltZSAoaW4g
bWludXRlcykgdG8gY2hhbmdlIC4uLiAqLworCQlkbyB7CisJCQljcm9uX3NsZWVwKHRpbWVSdW5u
aW5nICsgMSk7CisJCQlzZXRfdGltZShGQUxTRSk7CisJCX0gd2hpbGUgKGNsb2NrVGltZSA9PSB0
aW1lUnVubmluZyk7CisJCXRpbWVSdW5uaW5nID0gY2xvY2tUaW1lOworCisJCS8qCisJCSAqIENh
bGN1bGF0ZSBob3cgdGhlIGN1cnJlbnQgdGltZSBkaWZmZXJzIGZyb20gb3VyIHZpcnR1YWwKKwkJ
ICogY2xvY2suICBDbGFzc2lmeSB0aGUgY2hhbmdlIGludG8gb25lIG9mIDQgY2FzZXMuCisJCSAq
LworCQl0aW1lRGlmZiA9IHRpbWVSdW5uaW5nIC0gdmlydHVhbFRpbWU7CisKKwkJLyogc2hvcnRj
dXQgZm9yIHRoZSBtb3N0IGNvbW1vbiBjYXNlICovCisJCWlmICh0aW1lRGlmZiA9PSAxKSB7CisJ
CQl2aXJ0dWFsVGltZSA9IHRpbWVSdW5uaW5nOworCQkJZmluZF9qb2JzKHZpcnR1YWxUaW1lLCAm
ZGF0YWJhc2UsIFRSVUUsIFRSVUUpOworCQl9IGVsc2UgeworCQkJaWYgKHRpbWVEaWZmID4gKDMq
TUlOVVRFX0NPVU5UKSB8fAorCQkJICAgIHRpbWVEaWZmIDwgLSgzKk1JTlVURV9DT1VOVCkpCisJ
CQkJd2FrZXVwS2luZCA9IGxhcmdlOworCQkJZWxzZSBpZiAodGltZURpZmYgPiA1KQorCQkJCXdh
a2V1cEtpbmQgPSBtZWRpdW07CisJCQllbHNlIGlmICh0aW1lRGlmZiA+IDApCisJCQkJd2FrZXVw
S2luZCA9IHNtYWxsOworCQkJZWxzZQorCQkJCXdha2V1cEtpbmQgPSBuZWdhdGl2ZTsKKworCQkJ
c3dpdGNoICh3YWtldXBLaW5kKSB7CisJCQljYXNlIHNtYWxsOgorCQkJCS8qCisJCQkJICogY2Fz
ZSAxOiB0aW1lRGlmZiBpcyBhIHNtYWxsIHBvc2l0aXZlIG51bWJlcgorCQkJCSAqICh3b2tldXAg
bGF0ZSkgcnVuIGpvYnMgZm9yIGVhY2ggdmlydHVhbAorCQkJCSAqIG1pbnV0ZSB1bnRpbCBjYXVn
aHQgdXAuCisJCQkJICovCisJCQkJRGVidWcoRFNDSCwgKCJbJWxkXSwgbm9ybWFsIGNhc2UgJWQg
bWludXRlcyB0byBnb1xuIiwKKwkJCQkgICAgKGxvbmcpZ2V0cGlkKCksIHRpbWVEaWZmKSkKKwkJ
CQlkbyB7CisJCQkJCWlmIChqb2JfcnVucXVldWUoKSkKKwkJCQkJCXNsZWVwKDEwKTsKKwkJCQkJ
dmlydHVhbFRpbWUrKzsKKwkJCQkJZmluZF9qb2JzKHZpcnR1YWxUaW1lLCAmZGF0YWJhc2UsCisJ
CQkJCSAgICBUUlVFLCBUUlVFKTsKKwkJCQl9IHdoaWxlICh2aXJ0dWFsVGltZSA8IHRpbWVSdW5u
aW5nKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBtZWRpdW06CisJCQkJLyoKKwkJCQkgKiBjYXNl
IDI6IHRpbWVEaWZmIGlzIGEgbWVkaXVtLXNpemVkIHBvc2l0aXZlCisJCQkJICogbnVtYmVyLCBm
b3IgZXhhbXBsZSBiZWNhdXNlIHdlIHdlbnQgdG8gRFNUCisJCQkJICogcnVuIHdpbGRjYXJkIGpv
YnMgb25jZSwgdGhlbiBydW4gYW55CisJCQkJICogZml4ZWQtdGltZSBqb2JzIHRoYXQgd291bGQg
b3RoZXJ3aXNlIGJlCisJCQkJICogc2tpcHBlZCBpZiB3ZSB1c2UgdXAgb3VyIG1pbnV0ZSAocG9z
c2libGUsCisJCQkJICogaWYgdGhlcmUgYXJlIGEgbG90IG9mIGpvYnMgdG8gcnVuKSBnbworCQkJ
CSAqIGFyb3VuZCB0aGUgbG9vcCBhZ2FpbiBzbyB0aGF0IHdpbGRjYXJkIGpvYnMKKwkJCQkgKiBo
YXZlIGEgY2hhbmNlIHRvIHJ1biwgYW5kIHdlIGRvIG91cgorCQkJCSAqIGhvdXNla2VlcGluZy4K
KwkJCQkgKi8KKwkJCQlEZWJ1ZyhEU0NILCAoIlslbGRdLCBEU1QgYmVnaW5zICVkIG1pbnV0ZXMg
dG8gZ29cbiIsCisJCQkJICAgIChsb25nKWdldHBpZCgpLCB0aW1lRGlmZikpCisJCQkJLyogcnVu
IHdpbGRjYXJkIGpvYnMgZm9yIGN1cnJlbnQgbWludXRlICovCisJCQkJZmluZF9qb2JzKHRpbWVS
dW5uaW5nLCAmZGF0YWJhc2UsIFRSVUUsIEZBTFNFKTsKKwkKKwkJCQkvKiBydW4gZml4ZWQtdGlt
ZSBqb2JzIGZvciBlYWNoIG1pbnV0ZSBtaXNzZWQgKi8KKwkJCQlkbyB7CisJCQkJCWlmIChqb2Jf
cnVucXVldWUoKSkKKwkJCQkJCXNsZWVwKDEwKTsKKwkJCQkJdmlydHVhbFRpbWUrKzsKKwkJCQkJ
ZmluZF9qb2JzKHZpcnR1YWxUaW1lLCAmZGF0YWJhc2UsCisJCQkJCSAgICBGQUxTRSwgVFJVRSk7
CisJCQkJCXNldF90aW1lKEZBTFNFKTsKKwkJCQl9IHdoaWxlICh2aXJ0dWFsVGltZTwgdGltZVJ1
bm5pbmcgJiYKKwkJCQkgICAgY2xvY2tUaW1lID09IHRpbWVSdW5uaW5nKTsKKwkJCQlicmVhazsK
KwkKKwkJCWNhc2UgbmVnYXRpdmU6CisJCQkJLyoKKwkJCQkgKiBjYXNlIDM6IHRpbWVEaWZmIGlz
IGEgc21hbGwgb3IgbWVkaXVtLXNpemVkCisJCQkJICogbmVnYXRpdmUgbnVtLCBlZy4gYmVjYXVz
ZSBvZiBEU1QgZW5kaW5nLgorCQkJCSAqIEp1c3QgcnVuIHRoZSB3aWxkY2FyZCBqb2JzLiBUaGUg
Zml4ZWQtdGltZQorCQkJCSAqIGpvYnMgcHJvYmFibHkgaGF2ZSBhbHJlYWR5IHJ1biwgYW5kIHNo
b3VsZAorCQkJCSAqIG5vdCBiZSByZXBlYXRlZC4gIFZpcnR1YWwgdGltZSBkb2VzIG5vdAorCQkJ
CSAqIGNoYW5nZSB1bnRpbCB3ZSBhcmUgY2F1Z2h0IHVwLgorCQkJCSAqLworCQkJCURlYnVnKERT
Q0gsICgiWyVsZF0sIERTVCBlbmRzICVkIG1pbnV0ZXMgdG8gZ29cbiIsCisJCQkJICAgIChsb25n
KWdldHBpZCgpLCB0aW1lRGlmZikpCisJCQkJZmluZF9qb2JzKHRpbWVSdW5uaW5nLCAmZGF0YWJh
c2UsIFRSVUUsIEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyoKKwkJCQkg
KiBvdGhlcjogdGltZSBoYXMgY2hhbmdlZCBhICpsb3QqLAorCQkJCSAqIGp1bXAgdmlydHVhbCB0
aW1lLCBhbmQgcnVuIGV2ZXJ5dGhpbmcKKwkJCQkgKi8KKwkJCQlEZWJ1ZyhEU0NILCAoIlslbGRd
LCBjbG9jayBqdW1wZWRcbiIsCisJCQkJICAgIChsb25nKWdldHBpZCgpKSkKKwkJCQl2aXJ0dWFs
VGltZSA9IHRpbWVSdW5uaW5nOworCQkJCWZpbmRfam9icyh0aW1lUnVubmluZywgJmRhdGFiYXNl
LCBUUlVFLCBUUlVFKTsKIAkJCX0KIAkJfQogCi0JCS8qIGRvIHRoaXMgaXRlcmF0aW9uCi0JCSAq
LwotCQljcm9uX3RpY2soJmRhdGFiYXNlLCBzZWNyZXMxKTsKKwkJLyogSm9icyB0byBiZSBydW4g
KGlmIGFueSkgYXJlIGxvYWRlZDsgY2xlYXIgdGhlIHF1ZXVlLiAqLworCQlqb2JfcnVucXVldWUo
KTsKIAotCQkvKiBzbGVlcCAxIG9yIDYwIHNlY29uZHMKLQkJICovCi0JCVRhcmdldFRpbWUgKz0g
KHNlY3JlczEgIT0gMCkgPyAxIDogNjA7Ci0JCXJ1bm51bSArPSAxOworCQkvKiBDaGVjayB0byBz
ZWUgaWYgd2UgcmVjZWl2ZWQgYSBzaWduYWwgd2hpbGUgcnVubmluZyBqb2JzLiAqLworCQlpZiAo
Z290X3NpZ2h1cCkgeworCQkJZ290X3NpZ2h1cCA9IDA7CisJCQlsb2dfY2xvc2UoKTsKKwkJfQor
CQlpZiAoZ290X3NpZ2NobGQpIHsKKwkJCWdvdF9zaWdjaGxkID0gMDsKKwkJCXNpZ2NobGRfcmVh
cGVyKCk7CisJCX0KKwkJbG9hZF9kYXRhYmFzZSgmZGF0YWJhc2UpOwogCX0KIH0KIAotCiBzdGF0
aWMgdm9pZAotcnVuX3JlYm9vdF9qb2JzKGRiKQotCWNyb25fZGIgKmRiOwotewotCXJlZ2lzdGVy
IHVzZXIJCSp1OwotCXJlZ2lzdGVyIGVudHJ5CQkqZTsKK3J1bl9yZWJvb3Rfam9icyhjcm9uX2Ri
ICpkYikgeworCXVzZXIgKnU7CisJZW50cnkgKmU7CiAKLQlmb3IgKHUgPSBkYi0+aGVhZDsgIHUg
IT0gTlVMTDsgIHUgPSB1LT5uZXh0KSB7Ci0JCWZvciAoZSA9IHUtPmNyb250YWI7ICBlICE9IE5V
TEw7ICBlID0gZS0+bmV4dCkgewotCQkJaWYgKGUtPmZsYWdzICYgV0hFTl9SRUJPT1QpIHsKKwlm
b3IgKHUgPSBkYi0+aGVhZDsgdSAhPSBOVUxMOyB1ID0gdS0+bmV4dCkgeworCQlmb3IgKGUgPSB1
LT5jcm9udGFiOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KSB7CisJCQlpZiAoZS0+ZmxhZ3MgJiBX
SEVOX1JFQk9PVCkKIAkJCQlqb2JfYWRkKGUsIHUpOwotCQkJfQogCQl9CiAJfQogCSh2b2lkKSBq
b2JfcnVucXVldWUoKTsKIH0KIAotCiBzdGF0aWMgdm9pZAotY3Jvbl90aWNrKGNyb25fZGIgKmRi
LCBpbnQgc2VjcmVzKQotewotCXN0YXRpYyBzdHJ1Y3QgdG0JbGFzdHRtOwotCXN0YXRpYyB0aW1l
X3QJZGlmZiA9IDAsIC8qIHRpbWUgZGlmZmVyZW5jZSBpbiBzZWNvbmRzIGZyb20gdGhlIGxhc3Qg
b2Zmc2V0IGNoYW5nZSAqLwotCQlkaWZmbGltaXQgPSAwOyAvKiBlbmQgcG9pbnQgZm9yIHRoZSB0
aW1lIHpvbmUgY29ycmVjdGlvbiAqLwotCXN0cnVjdCB0bQlvdHp0bTsgLyogdGltZSBpbiB0aGUg
b2xkIHRpbWUgem9uZSAqLwotCWludAkJb3R6c2Vjb25kLCBvdHptaW51dGUsIG90emhvdXIsIG90
emRvbSwgb3R6bW9udGgsIG90emRvdzsKLSAJcmVnaXN0ZXIgc3RydWN0IHRtCSp0bSA9IGxvY2Fs
dGltZSgmVGFyZ2V0VGltZSk7Ci0JcmVnaXN0ZXIgaW50CQlzZWNvbmQsIG1pbnV0ZSwgaG91ciwg
ZG9tLCBtb250aCwgZG93OwotCXJlZ2lzdGVyIHVzZXIJCSp1OwotCXJlZ2lzdGVyIGVudHJ5CQkq
ZTsKK2ZpbmRfam9icyhpbnQgdnRpbWUsIGNyb25fZGIgKmRiLCBpbnQgZG9XaWxkLCBpbnQgZG9O
b25XaWxkKSB7CisJdGltZV90IHZpcnR1YWxTZWNvbmQgID0gdnRpbWUgKiBTRUNPTkRTX1BFUl9N
SU5VVEU7CisJc3RydWN0IHRtICp0bSA9IGdtdGltZSgmdmlydHVhbFNlY29uZCk7CisJaW50IG1p
bnV0ZSwgaG91ciwgZG9tLCBtb250aCwgZG93OworCXVzZXIgKnU7CisJZW50cnkgKmU7CiAKIAkv
KiBtYWtlIDAtYmFzZWQgdmFsdWVzIG91dCBvZiB0aGVzZSBzbyB3ZSBjYW4gdXNlIHRoZW0gYXMg
aW5kaWNpZXMKIAkgKi8KLQlzZWNvbmQgPSAoc2VjcmVzID09IDApID8gMCA6IHRtLT50bV9zZWMg
LUZJUlNUX1NFQ09ORDsKIAltaW51dGUgPSB0bS0+dG1fbWluIC1GSVJTVF9NSU5VVEU7CiAJaG91
ciA9IHRtLT50bV9ob3VyIC1GSVJTVF9IT1VSOwogCWRvbSA9IHRtLT50bV9tZGF5IC1GSVJTVF9E
T007CiAJbW9udGggPSB0bS0+dG1fbW9uICsxIC8qIDAuLjExIC0+IDEuLjEyICovIC1GSVJTVF9N
T05USDsKIAlkb3cgPSB0bS0+dG1fd2RheSAtRklSU1RfRE9XOwogCi0JRGVidWcoRFNDSCwgKCJb
JWRdIHRpY2soJWQsJWQsJWQsJWQsJWQsJWQpXG4iLAotCQlnZXRwaWQoKSwgc2Vjb25kLCBtaW51
dGUsIGhvdXIsIGRvbSwgbW9udGgsIGRvdykpCi0KLQlpZiAoZHN0X2VuYWJsZWQgJiYgbGFzdF90
aW1lICE9IDAgCi0JJiYgVGFyZ2V0VGltZSA+IGxhc3RfdGltZSAvKiBleGNsdWRlIHN0ZXBwaW5n
IGJhY2sgKi8KLQkmJiB0bS0+dG1fZ210b2ZmICE9IGxhc3R0bS50bV9nbXRvZmYgKSB7Ci0KLQkJ
ZGlmZiA9IHRtLT50bV9nbXRvZmYgLSBsYXN0dG0udG1fZ210b2ZmOwotCi0JCWlmICggZGlmZiA+
IDAgKSB7IC8qIFNULT5EU1QgKi8KLQkJCS8qIG1hcmsgam9icyBmb3IgYW4gZWFybGllciBydW4g
Ki8KLQkJCWRpZmZsaW1pdCA9IFRhcmdldFRpbWUgKyBkaWZmOwotCQkJZm9yICh1ID0gZGItPmhl
YWQ7ICB1ICE9IE5VTEw7ICB1ID0gdS0+bmV4dCkgewotCQkJCWZvciAoZSA9IHUtPmNyb250YWI7
ICBlICE9IE5VTEw7ICBlID0gZS0+bmV4dCkgewotCQkJCQllLT5mbGFncyAmPSB+Tk9UX1VOVElM
OwotCQkJCQlpZiAoIGUtPmxhc3RydW4gPj0gVGFyZ2V0VGltZSApCi0JCQkJCQllLT5sYXN0cnVu
ID0gMDsKLQkJCQkJLyogbm90IGluY2x1ZGUgdGhlIGVuZHMgb2YgaG91cmx5IHJhbmdlcyAqLwot
CQkJCQlpZiAoIGUtPmxhc3RydW4gPCBUYXJnZXRUaW1lIC0gMzYwMCApCi0JCQkJCQllLT5mbGFn
cyB8PSBSVU5fQVQ7Ci0JCQkJCWVsc2UKLQkJCQkJCWUtPmZsYWdzICY9IH5SVU5fQVQ7Ci0JCQkJ
fQotCQkJfQotCQl9IGVsc2UgeyAvKiBkaWZmIDwgMCA6IERTVC0+U1QgKi8KLQkJCS8qIG1hcmsg
am9icyBmb3Igc2tpcHBpbmcgKi8KLQkJCWRpZmZsaW1pdCA9IFRhcmdldFRpbWUgLSBkaWZmOwot
CQkJZm9yICh1ID0gZGItPmhlYWQ7ICB1ICE9IE5VTEw7ICB1ID0gdS0+bmV4dCkgewotCQkJCWZv
ciAoZSA9IHUtPmNyb250YWI7ICBlICE9IE5VTEw7ICBlID0gZS0+bmV4dCkgewotCQkJCQllLT5m
bGFncyB8PSBOT1RfVU5USUw7Ci0JCQkJCWUtPmZsYWdzICY9IH5SVU5fQVQ7Ci0JCQkJfQotCQkJ
fQotCQl9Ci0JfQotCi0JaWYgKGRpZmYgIT0gMCkgewotCQkvKiBpZiB0aGUgdGltZSB3YXMgcmVz
ZXQgb2YgdGhlIGVuZCBvZiBzcGVjaWFsIHpvbmUgaXMgcmVhY2hlZCAqLwotCQlpZiAobGFzdF90
aW1lID09IDAgfHwgVGFyZ2V0VGltZSA+PSBkaWZmbGltaXQpIHsKLQkJCS8qIGRpc2FibGUgdGhl
IFRaIHN3aXRjaCBjaGVja3MgKi8KLQkJCWRpZmYgPSAwOwotCQkJZGlmZmxpbWl0ID0gMDsKLQkJ
CWZvciAodSA9IGRiLT5oZWFkOyAgdSAhPSBOVUxMOyAgdSA9IHUtPm5leHQpIHsKLQkJCQlmb3Ig
KGUgPSB1LT5jcm9udGFiOyAgZSAhPSBOVUxMOyAgZSA9IGUtPm5leHQpIHsKLQkJCQkJZS0+Zmxh
Z3MgJj0gfihSVU5fQVR8Tk9UX1VOVElMKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkv
KiBnZXQgdGhlIHRpbWUgaW4gdGhlIG9sZCB0aW1lIHpvbmUgKi8KLQkJCXRpbWVfdCBkaWZmdGlt
ZSA9IFRhcmdldFRpbWUgKyB0bS0+dG1fZ210b2ZmIC0gZGlmZjsKLQkJCWdtdGltZV9yKCZkaWZm
dGltZSwgJm90enRtKTsKLQotCQkJLyogbWFrZSAwLWJhc2VkIHZhbHVlcyBvdXQgb2YgdGhlc2Ug
c28gd2UgY2FuIHVzZSB0aGVtIGFzIGluZGljaWVzCi0JCQkgKi8KLQkJCW90enNlY29uZCA9IChz
ZWNyZXMgPT0gMCkgPyAwIDogb3R6dG0udG1fc2VjIC1GSVJTVF9TRUNPTkQ7Ci0JCQlvdHptaW51
dGUgPSBvdHp0bS50bV9taW4gLUZJUlNUX01JTlVURTsKLQkJCW90emhvdXIgPSBvdHp0bS50bV9o
b3VyIC1GSVJTVF9IT1VSOwotCQkJb3R6ZG9tID0gb3R6dG0udG1fbWRheSAtRklSU1RfRE9NOwot
CQkJb3R6bW9udGggPSBvdHp0bS50bV9tb24gKzEgLyogMC4uMTEgLT4gMS4uMTIgKi8gLUZJUlNU
X01PTlRIOwotCQkJb3R6ZG93ID0gb3R6dG0udG1fd2RheSAtRklSU1RfRE9XOwotCQl9Ci0JfQor
CURlYnVnKERTQ0gsICgiWyVsZF0gdGljayglZCwlZCwlZCwlZCwlZCkgJXMgJXNcbiIsCisJCSAg
ICAgKGxvbmcpZ2V0cGlkKCksIG1pbnV0ZSwgaG91ciwgZG9tLCBtb250aCwgZG93LAorCQkgICAg
IGRvV2lsZD8iICI6Ik5vIHdpbGRjYXJkIixkb05vbldpbGQ/IiAiOiJXaWxkY2FyZCBvbmx5Iikp
CiAKIAkvKiB0aGUgZG9tL2RvdyBzaXR1YXRpb24gaXMgb2RkLiAgJyogKiAxLDE1ICogU3VuJyB3
aWxsIHJ1biBvbiB0aGUKIAkgKiBmaXJzdCBhbmQgZmlmdGVlbnRoIEFORCBldmVyeSBTdW5kYXk7
ICAnKiAqICogKiBTdW4nIHdpbGwgcnVuICpvbmx5KgpAQCAtMzA2LDI2OSArMzIxLDE5NSBAQAog
CSAqIGlzIHdoeSB3ZSBrZWVwICdlLT5kb3dfc3RhcicgYW5kICdlLT5kb21fc3RhcicuICB5ZXMs
IGl0J3MgYml6YXJyZS4KIAkgKiBsaWtlIG1hbnkgYml6YXJyZSB0aGluZ3MsIGl0J3MgdGhlIHN0
YW5kYXJkLgogCSAqLwotCWZvciAodSA9IGRiLT5oZWFkOyAgdSAhPSBOVUxMOyAgdSA9IHUtPm5l
eHQpIHsKLQkJZm9yIChlID0gdS0+Y3JvbnRhYjsgIGUgIT0gTlVMTDsgIGUgPSBlLT5uZXh0KSB7
CisJZm9yICh1ID0gZGItPmhlYWQ7IHUgIT0gTlVMTDsgdSA9IHUtPm5leHQpIHsKKwkJZm9yIChl
ID0gdS0+Y3JvbnRhYjsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkgewogCQkJRGVidWcoRFNDSHxE
RVhULCAoInVzZXIgWyVzOiVkOiVkOi4uLl0gY21kPVwiJXNcIlxuIiwKLQkJCQkJICBlbnZfZ2V0
KCJMT0dOQU1FIiwgZS0+ZW52cCksCi0JCQkJCSAgZS0+dWlkLCBlLT5naWQsIGUtPmNtZCkpCi0K
LQkJCWlmICggZGlmZiAhPSAwICYmIChlLT5mbGFncyAmIChSVU5fQVR8Tk9UX1VOVElMKSkgKSB7
Ci0JCQkJaWYgKGJpdF90ZXN0KGUtPnNlY29uZCwgb3R6c2Vjb25kKQotCQkJCSAmJiBiaXRfdGVz
dChlLT5taW51dGUsIG90em1pbnV0ZSkKLQkJCQkgJiYgYml0X3Rlc3QoZS0+aG91ciwgb3R6aG91
cikKLQkJCQkgJiYgYml0X3Rlc3QoZS0+bW9udGgsIG90em1vbnRoKQotCQkJCSAmJiAoICgoZS0+
ZmxhZ3MgJiBET01fU1RBUikgfHwgKGUtPmZsYWdzICYgRE9XX1NUQVIpKQotCQkJCQkgID8gKGJp
dF90ZXN0KGUtPmRvdyxvdHpkb3cpICYmIGJpdF90ZXN0KGUtPmRvbSxvdHpkb20pKQotCQkJCQkg
IDogKGJpdF90ZXN0KGUtPmRvdyxvdHpkb3cpIHx8IGJpdF90ZXN0KGUtPmRvbSxvdHpkb20pKQot
CQkJCQkpCi0JCQkJICAgKSB7Ci0JCQkJCWlmICggZS0+ZmxhZ3MgJiBSVU5fQVQgKSB7Ci0JCQkJ
CQllLT5mbGFncyAmPSB+UlVOX0FUOwotCQkJCQkJZS0+bGFzdHJ1biA9IFRhcmdldFRpbWU7Ci0J
CQkJCQlqb2JfYWRkKGUsIHUpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSAKLQkJCQkJ
CWUtPmZsYWdzICY9IH5OT1RfVU5USUw7Ci0JCQkJfSBlbHNlIGlmICggZS0+ZmxhZ3MgJiBOT1Rf
VU5USUwgKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGJpdF90ZXN0KGUtPnNlY29u
ZCwgc2Vjb25kKQotCQkJICYmIGJpdF90ZXN0KGUtPm1pbnV0ZSwgbWludXRlKQotCQkJICYmIGJp
dF90ZXN0KGUtPmhvdXIsIGhvdXIpCi0JCQkgJiYgYml0X3Rlc3QoZS0+bW9udGgsIG1vbnRoKQot
CQkJICYmICggKChlLT5mbGFncyAmIERPTV9TVEFSKSB8fCAoZS0+ZmxhZ3MgJiBET1dfU1RBUikp
CisJCQkgICAgZW52X2dldCgiTE9HTkFNRSIsIGUtPmVudnApLCAKKwkJCSAgICBlLT51aWQsIGUt
PmdpZCwgZS0+Y21kKSkKKwkJCWlmIChiaXRfdGVzdChlLT5taW51dGUsIG1pbnV0ZSkgJiYKKwkJ
CSAgICBiaXRfdGVzdChlLT5ob3VyLCBob3VyKSAmJgorCQkJICAgIGJpdF90ZXN0KGUtPm1vbnRo
LCBtb250aCkgJiYKKwkJCSAgICAoICgoZS0+ZmxhZ3MgJiBET01fU1RBUikgfHwgKGUtPmZsYWdz
ICYgRE9XX1NUQVIpKQogCQkJICAgICAgPyAoYml0X3Rlc3QoZS0+ZG93LGRvdykgJiYgYml0X3Rl
c3QoZS0+ZG9tLGRvbSkpCiAJCQkgICAgICA6IChiaXRfdGVzdChlLT5kb3csZG93KSB8fCBiaXRf
dGVzdChlLT5kb20sZG9tKSkKIAkJCSAgICApCiAJCQkgICApIHsKLQkJCQllLT5mbGFncyAmPSB+
UlVOX0FUOwotCQkJCWUtPmxhc3RydW4gPSBUYXJnZXRUaW1lOwotCQkJCWpvYl9hZGQoZSwgdSk7
CisJCQkJaWYgKChkb05vbldpbGQgJiYKKwkJCQkgICAgIShlLT5mbGFncyAmIChNSU5fU1RBUnxI
Ul9TVEFSKSkpIHx8IAorCQkJCSAgICAoZG9XaWxkICYmIChlLT5mbGFncyAmIChNSU5fU1RBUnxI
Ul9TVEFSKSkpKQorCQkJCQlqb2JfYWRkKGUsIHUpOwogCQkJfQogCQl9CiAJfQotCi0JbGFzdF90
aW1lID0gVGFyZ2V0VGltZTsKLQlsYXN0dG0gPSAqdG07CiB9CiAKLQotLyogdGhlIHRhc2sgaGVy
ZSBpcyB0byBmaWd1cmUgb3V0IGhvdyBsb25nIGl0J3MgZ29pbmcgdG8gYmUgdW50aWwgOjAwIG9m
IHRoZQotICogZm9sbG93aW5nIG1pbnV0ZSBhbmQgaW5pdGlhbGl6ZSBUYXJnZXRUaW1lIHRvIHRo
aXMgdmFsdWUuICBUYXJnZXRUaW1lCi0gKiB3aWxsIHN1YnNlcXVlbnRseSBzbGlkZSA2MCBzZWNv
bmRzIGF0IGEgdGltZSwgd2l0aCBjb3JyZWN0aW9uIGFwcGxpZWQKLSAqIGltcGxpY2l0bHkgaW4g
Y3Jvbl9zbGVlcCgpLiAgaXQgd291bGQgYmUgbmljZSB0byBsZXQgY3JvbiBleGVjdXRlIGluCi0g
KiB0aGUgImN1cnJlbnQgbWludXRlIiBiZWZvcmUgZ29pbmcgdG8gc2xlZXAsIGJ1dCBieSByZXN0
YXJ0aW5nIGNyb24geW91Ci0gKiBjb3VsZCB0aGVuIGdldCBpdCB0byBleGVjdXRlIGEgZ2l2ZW4g
bWludXRlJ3Mgam9icyBtb3JlIHRoYW4gb25jZS4KLSAqIGluc3RlYWQgd2UgaGF2ZSB0aGUgY2hh
bmNlIG9mIG1pc3NpbmcgYSBtaW51dGUncyBqb2JzIGNvbXBsZXRlbHksIGJ1dAotICogdGhhdCdz
IHNvbWV0aGluZyBzeXNhZG1pbidzIGtub3cgdG8gZXhwZWN0IHdoYXQgd2l0aCBjcmFzaGluZyBj
b21wdXRlcnMuLgorLyoKKyAqIFNldCBTdGFydFRpbWUgYW5kIGNsb2NrVGltZSB0byB0aGUgY3Vy
cmVudCB0aW1lLgorICogVGhlc2UgYXJlIHVzZWQgZm9yIGNvbXB1dGluZyB3aGF0IHRpbWUgaXQg
cmVhbGx5IGlzIHJpZ2h0IG5vdy4KKyAqIE5vdGUgdGhhdCBjbG9ja1RpbWUgaXMgYSB1bml4IHdh
bGxjbG9jayB0aW1lIGNvbnZlcnRlZCB0byBtaW51dGVzLgogICovCiBzdGF0aWMgdm9pZAotY3Jv
bl9zeW5jKGludCBzZWNyZXMpIHsKLSAJc3RydWN0IHRtICp0bTsKLQotCVRhcmdldFRpbWUgPSB0
aW1lKCh0aW1lX3QqKTApOwotCWlmIChzZWNyZXMgIT0gMCkgewotCQlUYXJnZXRUaW1lICs9IDE7
Ci0JfSBlbHNlIHsKLQkJdG0gPSBsb2NhbHRpbWUoJlRhcmdldFRpbWUpOwotCQlUYXJnZXRUaW1l
ICs9ICg2MCAtIHRtLT50bV9zZWMpOwotCX0KLX0KK3NldF90aW1lKGludCBpbml0aWFsaXplKSB7
CisJc3RydWN0IHRtIHRtOworCXN0YXRpYyBpbnQgaXNkc3Q7CiAKLXN0YXRpYyBpbnQKLXRpbWVz
cGVjX3N1YnRyYWN0KHN0cnVjdCB0aW1lc3BlYyAqcmVzdWx0LCBzdHJ1Y3QgdGltZXNwZWMgKngs
Ci0gICAgc3RydWN0IHRpbWVzcGVjICp5KQotewotCXRpbWVfdCBuc2VjOworCVN0YXJ0VGltZSA9
IHRpbWUoTlVMTCk7CiAKLQkvKiBQZXJmb3JtIHRoZSBjYXJyeSBmb3IgdGhlIGxhdGVyIHN1YnRy
YWN0aW9uIGJ5IHVwZGF0aW5nIHkuICovCi0JaWYgKHgtPnR2X25zZWMgPCB5LT50dl9uc2VjKSB7
Ci0JCW5zZWMgPSAoeS0+dHZfbnNlYyAtIHgtPnR2X25zZWMpIC8gMTAwMDAwMDAgKyAxOwotCQl5
LT50dl9uc2VjIC09IDEwMDAwMDAwMDAgKiBuc2VjOwotCQl5LT50dl9zZWMgKz0gbnNlYzsKKwkv
KiBXZSBhZGp1c3QgdGhlIHRpbWUgdG8gR01UIHNvIHdlIGNhbiBjYXRjaCBEU1QgY2hhbmdlcy4g
Ki8KKwl0bSA9ICpsb2NhbHRpbWUoJlN0YXJ0VGltZSk7CisJaWYgKGluaXRpYWxpemUgfHwgdG0u
dG1faXNkc3QgIT0gaXNkc3QpIHsKKwkJaXNkc3QgPSB0bS50bV9pc2RzdDsKKwkJR01Ub2ZmID0g
Z2V0X2dtdG9mZigmU3RhcnRUaW1lLCAmdG0pOworCQlEZWJ1ZyhEU0NILCAoIlslbGRdIEdNVG9m
Zj0lbGRcbiIsCisJCSAgICAobG9uZylnZXRwaWQoKSwgKGxvbmcpR01Ub2ZmKSkKIAl9Ci0JaWYg
KHgtPnR2X25zZWMgLSB5LT50dl9uc2VjID4gMTAwMDAwMDAwMCkgewotCQluc2VjID0gKHgtPnR2
X25zZWMgLSB5LT50dl9uc2VjKSAvIDEwMDAwMDAwMDA7Ci0JCXktPnR2X25zZWMgKz0gMTAwMDAw
MDAwMCAqIG5zZWM7Ci0JCXktPnR2X3NlYyAtPSBuc2VjOwotCX0KLSAgICAgCi0JLyogdHZfbnNl
YyBpcyBjZXJ0YWlubHkgcG9zaXRpdmUuICovCi0JcmVzdWx0LT50dl9zZWMgPSB4LT50dl9zZWMg
LSB5LT50dl9zZWM7Ci0JcmVzdWx0LT50dl9uc2VjID0geC0+dHZfbnNlYyAtIHktPnR2X25zZWM7
Ci0gICAgIAotCS8qIFJldHVybiBUcnVlIGlmIHJlc3VsdCBpcyBuZWdhdGl2ZS4gKi8KLQlyZXR1
cm4gKHgtPnR2X3NlYyA8IHktPnR2X3NlYyk7CisJY2xvY2tUaW1lID0gKFN0YXJ0VGltZSArIEdN
VG9mZikgLyAodGltZV90KVNFQ09ORFNfUEVSX01JTlVURTsKIH0KIAorLyoKKyAqIFRyeSB0byBq
dXN0IGhpdCB0aGUgbmV4dCBtaW51dGUuCisgKi8KIHN0YXRpYyB2b2lkCi1jcm9uX3NsZWVwKGNy
b25fZGIgKmRiLCBpbnQgc2VjcmVzKQotewotCWludCBzZWNvbmRzX3RvX3dhaXQ7Ci0JaW50IHJ2
YWw7Ci0Jc3RydWN0IHRpbWVzcGVjIGN0aW1lLCB0dGltZSwgc3RpbWUsIHJlbXRpbWU7Ci0KLQkv
KgotCSAqIExvb3AgdW50aWwgd2UgcmVhY2ggdGhlIHRvcCBvZiB0aGUgbmV4dCBtaW51dGUsIHNs
ZWVwIHdoZW4gcG9zc2libGUuCi0JICovCi0KLQlmb3IgKDs7KSB7Ci0JCWNsb2NrX2dldHRpbWUo
Q0xPQ0tfUkVBTFRJTUUsICZjdGltZSk7Ci0JCXR0aW1lLnR2X3NlYyA9IFRhcmdldFRpbWU7Ci0J
CXR0aW1lLnR2X25zZWMgPSAwOwotCQl0aW1lc3BlY19zdWJ0cmFjdCgmc3RpbWUsICZ0dGltZSwg
JmN0aW1lKTsKLQorY3Jvbl9zbGVlcChpbnQgdGFyZ2V0KSB7CisJdGltZV90IHQxLCB0MjsKKwl1
bnNpZ25lZCBjaGFyIHBva2U7CisJaW50IG5mZHMsIGZkOworCXNvY2tsZW5fdCBzdW5sZW47CisJ
c3RhdGljIGZkX3NldCAqZmRzcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc191bjsKKworCXN0cnVj
dCB0aW1ldmFsIHNlY29uZHNfdG9fd2FpdDsKKwlzZWNvbmRzX3RvX3dhaXQudHZfdXNlYyA9IDA7
CisKKwl0MSA9IHRpbWUoTlVMTCkgKyBHTVRvZmY7CisJc2Vjb25kc190b193YWl0LnR2X3NlYyA9
IChpbnQpKHRhcmdldCAqIFNFQ09ORFNfUEVSX01JTlVURSAtIHQxKSArIDE7CisJRGVidWcoRFND
SCwgKCJbJWxkXSBUYXJnZXQgdGltZT0lbGQsIHNlYy10by13YWl0PSVsZFxuIiwKKwkgICAgKGxv
bmcpZ2V0cGlkKCksIChsb25nKXRhcmdldCpTRUNPTkRTX1BFUl9NSU5VVEUsIHNlY29uZHNfdG9f
d2FpdC50dl9zZWMpKQorCisJZmRzciA9IChmZF9zZXQgKiljYWxsb2MoaG93bWFueShjcm9uU29j
ayArIDEsIE5GREJJVFMpLAorCQkJc2l6ZW9mKGZkX21hc2spKTsKKworCXdoaWxlIChzZWNvbmRz
X3RvX3dhaXQudHZfc2VjID4gMCAmJiBzZWNvbmRzX3RvX3dhaXQudHZfc2VjIDwgNjUpIHsKKwkJ
cG9rZSA9IFJFTE9BRF9DUk9OOworCQlpZiAoZmRzcikKKwkJCUZEX1NFVChjcm9uU29jaywgZmRz
cik7CiAJCS8qCi0JCSAqIElmIHRoZSBzZWNvbmRzX3RvX3dhaXQgdmFsdWUgaXMgaW5zYW5lLCBq
dW1wIHRoZSBjcm9uCisJCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSB3ZXJlIGludGVycnVwdGVkIGJ5
IGEgc2lnbmFsLgorCQkgKiBJZiBzbywgc2VydmljZSB0aGUgc2lnbmFsKHMpIHRoZW4gY29udGlu
dWUgc2xlZXBpbmcKKwkJICogd2hlcmUgd2UgbGVmdCBvZmYuCiAJCSAqLwotCi0JCWlmIChzdGlt
ZS50dl9zZWMgPCAtNjAwIHx8IHN0aW1lLnR2X3NlYyA+IDYwMCkgewotCQkJY3Jvbl9jbGVhbihk
Yik7Ci0JCQljcm9uX3N5bmMoc2VjcmVzKTsKLQkJCWNvbnRpbnVlOworCQluZmRzID0gc2VsZWN0
KGNyb25Tb2NrICsgMSwgZmRzciwgTlVMTCwgTlVMTCwgJnNlY29uZHNfdG9fd2FpdCk7CisJCWlm
IChuZmRzID09IDApCisJCQlicmVhazsgICAgICAgICAgLyogdGltZXIgZXhwaXJlZCAqLworCQlp
ZiAobmZkcyA9PSAtMSAmJiBlcnJubyAhPSBFSU5UUikKKwkJCWJyZWFrOyAgICAgICAgICAvKiBh
biBlcnJvciBvY2N1cnJlZCAqLworCQlpZiAobmZkcyA+IDApIHsKKwkJCURlYnVnKERTQ0gsICgi
WyVsZF0gR290IGEgcG9rZSBvbiB0aGUgc29ja2V0XG4iLAorCQkJCQkJKGxvbmcpZ2V0cGlkKCkp
KQorCQkJc3VubGVuID0gc2l6ZW9mKHNfdW4pOworCQkJZmQgPSBhY2NlcHQoY3JvblNvY2ssIChz
dHJ1Y3Qgc29ja2FkZHIgKikmc191biwgJnN1bmxlbik7CisJCQlpZiAoZmQgPj0gMCAmJiBmY250
bChmZCwgRl9TRVRGTCwgT19OT05CTE9DSykgPT0gMCkgeworCQkJCSh2b2lkKSByZWFkKGZkLCAm
cG9rZSwgMSk7CisJCQkJY2xvc2UoZmQpOworCQkJCWlmIChwb2tlICYgUkVMT0FEX0NST04pIHsK
KwkJCQkJZGF0YWJhc2UubXRpbWUgPSAodGltZV90KTA7CisJCQkJCWxvYWRfZGF0YWJhc2UoJmRh
dGFiYXNlKTsKKwkJCQl9CisJCQl9CiAJCX0KLQotCQlzZWNvbmRzX3RvX3dhaXQgPSAoc3RpbWUu
dHZfbnNlYyA+IDApID8gc3RpbWUudHZfc2VjICsgMSA6Ci0JCSAgICBzdGltZS50dl9zZWM7Ci0K
LQkJRGVidWcoRFNDSCwgKCJbJWRdIFRhcmdldFRpbWU9JWxkLCBzZWMtdG8td2FpdD0lZFxuIiwK
LQkJCWdldHBpZCgpLCAobG9uZylUYXJnZXRUaW1lLCBzZWNvbmRzX3RvX3dhaXQpKQotCi0JCS8q
Ci0JCSAqIElmIHdlJ3ZlIHJ1biBvdXQgb2Ygd2FpdCB0aW1lIG9yIHRoZXJlIGFyZSBubyBqb2Jz
IGxlZnQKLQkJICogdG8gcnVuLCBicmVhawotCQkgKi8KLQotCQlpZiAoc3RpbWUudHZfc2VjIDwg
MCkKLQkJCWJyZWFrOwotCQlpZiAoam9iX3J1bnF1ZXVlKCkgPT0gMCkgewotCQkJRGVidWcoRFND
SCwgKCJbJWRdIHNsZWVwaW5nIGZvciAlZCBzZWNvbmRzXG4iLAotCQkJCWdldHBpZCgpLCBzZWNv
bmRzX3RvX3dhaXQpKQotCi0JCQlmb3IgKDs7KSB7Ci0JCQkJcnZhbCA9IG5hbm9zbGVlcCgmc3Rp
bWUsICZyZW10aW1lKTsKLQkJCQlpZiAocnZhbCA9PSAwIHx8IGVycm5vICE9IEVJTlRSKQotCQkJ
CQlicmVhazsKLQkJCQlzdGltZS50dl9zZWMgPSByZW10aW1lLnR2X3NlYzsKLQkJCQlzdGltZS50
dl9uc2VjID0gcmVtdGltZS50dl9uc2VjOworCQllbHNlIHsKKwkJCWlmIChnb3Rfc2lnaHVwKSB7
CisJCQkJZ290X3NpZ2h1cCA9IDA7CisJCQkJbG9nX2Nsb3NlKCk7CisJCQl9CisJCQlpZiAoZ290
X3NpZ2NobGQpIHsKKwkJCQlnb3Rfc2lnY2hsZCA9IDA7CisJCQkJc2lnY2hsZF9yZWFwZXIoKTsK
IAkJCX0KIAkJfQorCQl0MiA9IHRpbWUoTlVMTCkgKyBHTVRvZmY7CisJCXNlY29uZHNfdG9fd2Fp
dC50dl9zZWMgLT0gKGludCkodDIgLSB0MSk7CisJCXQxID0gdDI7CiAJfQogfQogCi0KLS8qIGlm
IHRoZSB0aW1lIHdhcyBjaGFuZ2VkIGFicnVwdGx5LCBjbGVhciB0aGUgZmxhZ3MgcmVsYXRlZAot
ICogdG8gdGhlIGRheWxpZ2h0IHRpbWUgc3dpdGNoIGhhbmRsaW5nIHRvIGF2b2lkIHN0cmFuZ2Ug
ZWZmZWN0cwotICovCi0KIHN0YXRpYyB2b2lkCi1jcm9uX2NsZWFuKGRiKQotCWNyb25fZGIJKmRi
OwotewotCXVzZXIJCSp1OwotCWVudHJ5CQkqZTsKK3NpZ2h1cF9oYW5kbGVyKGludCB4KSB7CisJ
Z290X3NpZ2h1cCA9IDE7Cit9CiAKLQlsYXN0X3RpbWUgPSAwOworc3RhdGljIHZvaWQKK3NpZ2No
bGRfaGFuZGxlcihpbnQgeCkgeworCWdvdF9zaWdjaGxkID0gMTsKK30KIAotCWZvciAodSA9IGRi
LT5oZWFkOyAgdSAhPSBOVUxMOyAgdSA9IHUtPm5leHQpIHsKLQkJZm9yIChlID0gdS0+Y3JvbnRh
YjsgIGUgIT0gTlVMTDsgIGUgPSBlLT5uZXh0KSB7Ci0JCQllLT5mbGFncyAmPSB+KFJVTl9BVHxO
T1RfVU5USUwpOwotCQl9Ci0JfQorc3RhdGljIHZvaWQKK3F1aXQoaW50IHgpIHsKKwlwaWRmaWxl
X3JlbW92ZShwZmgpOworCV9leGl0KDApOwogfQogCi0jaWZkZWYgVVNFX1NJR0NITEQKIHN0YXRp
YyB2b2lkCi1zaWdjaGxkX2hhbmRsZXIoaW50IHgpCi17Ci0JV0FJVF9UCQl3YWl0ZXI7Ci0JUElE
X1QJCXBpZDsKK3NpZ2NobGRfcmVhcGVyKHZvaWQpIHsKKwlXQUlUX1Qgd2FpdGVyOworCVBJRF9U
IHBpZDsKIAotCWZvciAoOzspIHsKLSNpZmRlZiBQT1NJWAorCWRvIHsKIAkJcGlkID0gd2FpdHBp
ZCgtMSwgJndhaXRlciwgV05PSEFORyk7Ci0jZWxzZQotCQlwaWQgPSB3YWl0Mygmd2FpdGVyLCBX
Tk9IQU5HLCAoc3RydWN0IHJ1c2FnZSAqKTApOwotI2VuZGlmCiAJCXN3aXRjaCAocGlkKSB7CiAJ
CWNhc2UgLTE6CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CiAJCQlEZWJ1
ZyhEUFJPQywKLQkJCQkoIlslZF0gc2lnY2hsZC4uLm5vIGNoaWxkcmVuXG4iLCBnZXRwaWQoKSkp
Ci0JCQlyZXR1cm47CisJCQkgICAgICAoIlslbGRdIHNpZ2NobGQuLi5ubyBjaGlsZHJlblxuIiwK
KwkJCSAgICAgICAobG9uZylnZXRwaWQoKSkpCisJCQlicmVhazsKIAkJY2FzZSAwOgogCQkJRGVi
dWcoRFBST0MsCi0JCQkJKCJbJWRdIHNpZ2NobGQuLi5ubyBkZWFkIGtpZHNcbiIsIGdldHBpZCgp
KSkKLQkJCXJldHVybjsKKwkJCSAgICAgICgiWyVsZF0gc2lnY2hsZC4uLm5vIGRlYWQga2lkc1xu
IiwKKwkJCSAgICAgICAobG9uZylnZXRwaWQoKSkpCisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJ
CURlYnVnKERQUk9DLAotCQkJCSgiWyVkXSBzaWdjaGxkLi4ucGlkICMlZCBkaWVkLCBzdGF0PSVk
XG4iLAotCQkJCWdldHBpZCgpLCBwaWQsIFdFWElUU1RBVFVTKHdhaXRlcikpKQorCQkJICAgICAg
KCJbJWxkXSBzaWdjaGxkLi4ucGlkICMlbGQgZGllZCwgc3RhdD0lZFxuIiwKKwkJCSAgICAgICAo
bG9uZylnZXRwaWQoKSwgKGxvbmcpcGlkLCBXRVhJVFNUQVRVUyh3YWl0ZXIpKSkKKwkJCWJyZWFr
OwogCQl9Ci0JfQorCX0gd2hpbGUgKHBpZCA+IDApOwogfQotI2VuZGlmIC8qVVNFX1NJR0NITEQq
LwotCiAKIHN0YXRpYyB2b2lkCi1zaWdodXBfaGFuZGxlcihpbnQgeCkKLXsKLQlsb2dfY2xvc2Uo
KTsKLX0KLQorcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisJaW50IGFyZ2No
OwogCi1zdGF0aWMgdm9pZAotcGFyc2VfYXJncyhhcmdjLCBhcmd2KQotCWludAlhcmdjOwotCWNo
YXIJKmFyZ3ZbXTsKLXsKLQlpbnQJYXJnY2g7Ci0JY2hhcgkqZW5kcDsKKwljaGFyICplbmRwOwog
Ci0Jd2hpbGUgKChhcmdjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiajpKOm06b3N4OiIpKSAhPSAt
MSkgeworCXdoaWxlICgtMSAhPSAoYXJnY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImo6SjptOm54
OiIpKSkgewogCQlzd2l0Y2ggKGFyZ2NoKSB7CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOwogCQlj
YXNlICdqJzoKIAkJCUppdHRlciA9IHN0cnRvdWwob3B0YXJnLCAmZW5kcCwgMTApOwogCQkJaWYg
KCpvcHRhcmcgPT0gJ1wwJyB8fCAqZW5kcCAhPSAnXDAnIHx8IEppdHRlciA+IDYwKQogCQkJCWVy
cngoRVJST1JfRVhJVCwKLQkJCQkgICAgICJiYWQgdmFsdWUgZm9yIGppdHRlcjogJXMiLCBvcHRh
cmcpOworCQkJCQkJImJhZCB2YWx1ZSBmb3Igaml0dGVyOiAlcyIsIG9wdGFyZyk7CiAJCQlicmVh
azsKIAkJY2FzZSAnSic6CiAJCQlSb290Sml0dGVyID0gc3RydG91bChvcHRhcmcsICZlbmRwLCAx
MCk7Ci0JCQlpZiAoKm9wdGFyZyA9PSAnXDAnIHx8ICplbmRwICE9ICdcMCcgfHwgUm9vdEppdHRl
ciA+IDYwKQorCQkJaWYoICpvcHRhcmcgPT0gJ1wwJyB8fCAqZW5kcCAhPSAnXDAnIHx8IFJvb3RK
aXR0ZXIgPiA2MCkKIAkJCQllcnJ4KEVSUk9SX0VYSVQsCi0JCQkJICAgICAiYmFkIHZhbHVlIGZv
ciByb290IGppdHRlcjogJXMiLCBvcHRhcmcpOworCQkJCQkJImJhZCB2YWx1ZSBmb3Igcm9vdCBq
aXR0ZXI6ICVzIiwgb3B0YXJnKTsKIAkJCWJyZWFrOwogCQljYXNlICdtJzoKIAkJCWRlZm1haWx0
byA9IG9wdGFyZzsKIAkJCWJyZWFrOwotCQljYXNlICdvJzoKLQkJCWRzdF9lbmFibGVkID0gMDsK
LQkJCWJyZWFrOwotCQljYXNlICdzJzoKLQkJCWRzdF9lbmFibGVkID0gMTsKLQkJCWJyZWFrOwog
CQljYXNlICd4JzoKIAkJCWlmICghc2V0X2RlYnVnX2ZsYWdzKG9wdGFyZykpCiAJCQkJdXNhZ2Uo
KTsKIAkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdXNhZ2UoKTsKLQkJfQotCX0KLX0KLQotc3Rh
dGljIGludAotcnVuX2F0X3NlY3Jlcyhjcm9uX2RiICpkYikKLXsKLQl1c2VyICp1OwotCWVudHJ5
ICplOwotCi0JZm9yICh1ID0gZGItPmhlYWQ7ICB1ICE9IE5VTEw7ICB1ID0gdS0+bmV4dCkgewot
CQlmb3IgKGUgPSB1LT5jcm9udGFiOyAgZSAhPSBOVUxMOyAgZSA9IGUtPm5leHQpIHsKLQkJCWlm
ICgoZS0+ZmxhZ3MgJiBTRUNfUkVTKSAhPSAwKQotCQkJCXJldHVybiAxOworCQljYXNlICduJzoK
KwkJCU5vRm9yayA9IDE7CisJCQlicmVhazsKIAkJfQogCX0KLQlyZXR1cm4gMDsKIH0KZGlmZiAt
cnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9jcm9uLmggZnJlZWJzZF9jcm9uL2Nyb24v
Y3Jvbi5oCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24vY3Jvbi5oCTIwMTQtMDEtMTYg
MjE6NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vY3Jvbi9jcm9uLmgJMjAx
NC0wNi0xMSAxNjo0Mjo1NS4yNzI0NDQyNzYgKzAyMDAKQEAgLTEsMzA3ICsxLDQ2IEBACiAvKiBD
b3B5cmlnaHQgMTk4OCwxOTkwLDE5OTMsMTk5NCBieSBQYXVsIFZpeGllCiAgKiBBbGwgcmlnaHRz
IHJlc2VydmVkCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBieSBJbnRlcm5ldCBT
eXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQorICogQ29weXJpZ2h0IChjKSAxOTk3LDIw
MDAgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bSwgSW5jLgogICoKLSAqIERpc3RyaWJ1
dGUgZnJlZWx5LCBleGNlcHQ6IGRvbid0IHJlbW92ZSBteSBuYW1lIGZyb20gdGhlIHNvdXJjZSBv
cgotICogZG9jdW1lbnRhdGlvbiAoZG9uJ3QgdGFrZSBjcmVkaXQgZm9yIG15IHdvcmspLCBtYXJr
IHlvdXIgY2hhbmdlcyAoZG9uJ3QKLSAqIGdldCBtZSBibGFtZWQgZm9yIHlvdXIgcG9zc2libGUg
YnVncyksIGRvbid0IGFsdGVyIG9yIHJlbW92ZSB0aGlzCi0gKiBub3RpY2UuICBNYXkgYmUgc29s
ZCBpZiBidWlsZGFibGUgc291cmNlIGlzIHByb3ZpZGVkIHRvIGJ1eWVyLiAgTm8KLSAqIHdhcnJh
bnRlZSBvZiBhbnkga2luZCwgZXhwcmVzcyBvciBpbXBsaWVkLCBpcyBpbmNsdWRlZCB3aXRoIHRo
aXMKLSAqIHNvZnR3YXJlOyB1c2UgYXQgeW91ciBvd24gcmlzaywgcmVzcG9uc2liaWxpdHkgZm9y
IGRhbWFnZXMgKGlmIGFueSkgdG8KLSAqIGFueW9uZSByZXN1bHRpbmcgZnJvbSB0aGUgdXNlIG9m
IHRoaXMgc29mdHdhcmUgcmVzdHMgZW50aXJlbHkgd2l0aCB0aGUKLSAqIHVzZXIuCisgKiBQZXJt
aXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJl
IGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRl
ZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMg
cGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAgKgotICogU2VuZCBidWcg
cmVwb3J0cywgYnVnIGZpeGVzLCBlbmhhbmNlbWVudHMsIHJlcXVlc3RzLCBmbGFtZXMsIGV0Yy4s
IGFuZAotICogSSdsbCB0cnkgdG8ga2VlcCBhIHZlcnNpb24gdXAgdG8gZGF0ZS4gIEkgY2FuIGJl
IHJlYWNoZWQgYXMgZm9sbG93czoKLSAqIFBhdWwgVml4aWUgICAgICAgICAgPHBhdWxAdml4LmNv
bT4gICAgICAgICAgdXVuZXQhZGVjd3JsIXZpeGllIXBhdWwKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRI
IFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVT
IE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuICBJTiBOTyBFVkVOVCBTSEFMTCBJ
U0MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJ
TkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBB
Q1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBB
UklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9S
TUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCiAvKiBjcm9uLmggLSBoZWFkZXIgZm9yIHZp
eGllJ3MgY3JvbgogICoKLSAqICRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9u
L2Nyb24vY3Jvbi5oIDI0MjEwMSAyMDEyLTEwLTI1IDIyOjU0OjI5WiBzb2JvbWF4ICQKKyAqICRJ
ZDogY3Jvbi5oLHYgMS42IDIwMDQvMDEvMjMgMTg6NTY6NDIgdml4aWUgRXhwICQKICAqCiAgKiB2
aXggMTRub3Y4OCBbcmVzdCBvZiBsb2cgaXMgaW4gUkNTXQogICogdml4IDE0amFuODcgWzAgb3Ig
NyBjYW4gYmUgc3VuZGF5OyB0aGFua3MsIG13bUBiZXJrZWxleV0KICAqIHZpeCAzMGRlYzg2IFt3
cml0dGVuXQogICovCiAKLS8qIHJlb3JkZXIgdGhlc2UgI2luY2x1ZGUncyBhdCB5b3VyIHBlcmls
ICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNp
bmNsdWRlICJjb21wYXQuaCIKKyNkZWZpbmUgQ1JPTl9WRVJTSU9OICJWNS4wIgogCi0jaW5jbHVk
ZSA8Yml0c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KK3Vuc2lnbmVkIEppdHRlciwgUm9v
dEppdHRlcjsKK2V4dGVybiB1bnNpZ25lZCBKaXR0ZXIsIFJvb3RKaXR0ZXI7CitleHRlcm4gc3Ry
dWN0IHBpZGZoICpwZmg7CiAjaW5jbHVkZSA8ZXJyLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KICNp
bmNsdWRlIDxsaWJ1dGlsLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+
Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3dh
aXQuaD4KIAotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2RlZmluZSBTWVNfTkFNRSAiKnN5c3Rl
bSoiCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiZXh0ZXJucy5oIgotCi0JLyogdGhl
c2UgYXJlIHJlYWxseSBpbW11dGFibGUsIGFuZCBhcmUKLQkgKiAgIGRlZmluZWQgZm9yIHN5bWJv
bGljIGNvbnZlbmllbmNlIG9ubHkKLQkgKiBUUlVFLCBGQUxTRSwgYW5kIEVSUiBtdXN0IGJlIGRp
c3RpbmN0Ci0JICogRVJSIG11c3QgYmUgPCBPSy4KLQkgKi8KLSNkZWZpbmUgVFJVRQkJMQotI2Rl
ZmluZSBGQUxTRQkJMAotCS8qIHN5c3RlbSBjYWxscyByZXR1cm4gdGhpcyBvbiBzdWNjZXNzICov
Ci0jZGVmaW5lIE9LCQkwCi0JLyogICBvciB0aGlzIG9uIGVycm9yICovCi0jZGVmaW5lIEVSUgkJ
KC0xKQotCi0JLyogdHVybiB0aGlzIG9uIHRvIGdldCAnLXgnIGNvZGUgKi8KLSNpZm5kZWYgREVC
VUdHSU5HCi0jZGVmaW5lIERFQlVHR0lORwlGQUxTRQotI2VuZGlmCi0KLSNkZWZpbmUgUkVBRF9Q
SVBFCTAJLyogd2hpY2ggZW5kIG9mIGEgcGlwZSBwYWlyIGRvIHlvdSByZWFkPyAqLwotI2RlZmlu
ZSBXUklURV9QSVBFCTEJLyogICBvciB3cml0ZSB0bz8gKi8KLSNkZWZpbmUgU1RESU4JCTAJLyog
d2hhdCBpcyBzdGRpbidzIGZpbGUgZGVzY3JpcHRvcj8gKi8KLSNkZWZpbmUgU1RET1VUCQkxCS8q
ICAgc3Rkb3V0J3M/ICovCi0jZGVmaW5lIFNUREVSUgkJMgkvKiAgIHN0ZGVycidzPyAqLwotI2Rl
ZmluZSBFUlJPUl9FWElUCTEJLyogZXhpdCgpIHdpdGggdGhpcyB3aWxsIHNjYXJlIHRoZSBzaGVs
bCAqLwotI2RlZmluZQlPS19FWElUCQkwCS8qIGV4aXQoKSB3aXRoIHRoaXMgaXMgY29uc2lkZXJl
ZCAnbm9ybWFsJyAqLwotI2RlZmluZQlNQVhfRk5BTUUJMTAwCS8qIG1heCBsZW5ndGggb2YgaW50
ZXJuYWxseSBnZW5lcmF0ZWQgZm4gKi8KLSNkZWZpbmUJTUFYX0NPTU1BTkQJMTAwMAkvKiBtYXgg
bGVuZ3RoIG9mIGludGVybmFsbHkgZ2VuZXJhdGVkIGNtZCAqLwotI2RlZmluZQlNQVhfRU5WU1RS
CTEwMDAJLyogbWF4IGxlbmd0aCBvZiBlbnZ2YXI9dmFsdWVcMCBzdHJpbmdzICovCi0jZGVmaW5l
CU1BWF9URU1QU1RSCTEwMAkvKiBvYnZpb3VzICovCi0jZGVmaW5lCU1BWF9VTkFNRQkyMAkvKiBt
YXggbGVuZ3RoIG9mIHVzZXJuYW1lLCBzaG91bGQgYmUgb3ZlcmtpbGwgKi8KLSNkZWZpbmUJUk9P
VF9VSUQJMAkvKiBkb24ndCBjaGFuZ2UgdGhpcywgaXQgcmVhbGx5IG11c3QgYmUgcm9vdCAqLwot
I2RlZmluZQlST09UX1VTRVIJInJvb3QiCS8qIGRpdHRvICovCi0jZGVmaW5lCVNZU19OQU1FCSIq
c3lzdGVtKiIgLyogbWFnaWMgb3duZXIgbmFtZSBmb3Igc3lzdGVtIGNyb250YWIgKi8KLQotCQkJ
CS8qIE5PVEU6IHRoZXNlIGNvcnJlc3BvbmQgdG8gRGVidWdGbGFnTmFtZXMsCi0JCQkJICoJZGVm
aW5lZCBiZWxvdy4KLQkJCQkgKi8KLSNkZWZpbmUJREVYVAkJMHgwMDAxCS8qIGV4dGVuZCBmbGFn
IGZvciBvdGhlciBkZWJ1ZyBtYXNrcyAqLwotI2RlZmluZQlEU0NICQkweDAwMDIJLyogc2NoZWR1
bGluZyBkZWJ1ZyBtYXNrICovCi0jZGVmaW5lCURQUk9DCQkweDAwMDQJLyogcHJvY2VzcyBjb250
cm9sIGRlYnVnIG1hc2sgKi8KLSNkZWZpbmUJRFBBUlMJCTB4MDAwOAkvKiBwYXJzaW5nIGRlYnVn
IG1hc2sgKi8KLSNkZWZpbmUJRExPQUQJCTB4MDAxMAkvKiBkYXRhYmFzZSBsb2FkaW5nIGRlYnVn
IG1hc2sgKi8KLSNkZWZpbmUJRE1JU0MJCTB4MDAyMAkvKiBtaXNjIGRlYnVnIG1hc2sgKi8KLSNk
ZWZpbmUJRFRFU1QJCTB4MDA0MAkvKiB0ZXN0IG1vZGU6IGRvbid0IGV4ZWN1dGUgYW55IGNvbW1h
bmRzICovCi0jZGVmaW5lCURCSVQJCTB4MDA4MAkvKiBiaXQgdHdpZGRsaW5nIHNob3duIChsb25n
KSAqLwotCi0jZGVmaW5lCUNST05fVEFCKHUpCSIlcy8lcyIsIFNQT09MX0RJUiwgdQotI2RlZmlu
ZQlSRUcJCXJlZ2lzdGVyCi0jZGVmaW5lCVBQQ19OVUxMCSgoY2hhciAqKilOVUxMKQotCi0jaWZu
ZGVmIE1BWEhPU1ROQU1FTEVOCi0jZGVmaW5lIE1BWEhPU1ROQU1FTEVOIDI1NgotI2VuZGlmCi0K
LSNkZWZpbmUJU2tpcF9CbGFua3MoYywgZikgXAotCQkJd2hpbGUgKGMgPT0gJ1x0JyB8fCBjID09
ICcgJykgXAotCQkJCWMgPSBnZXRfY2hhcihmKTsKLQotI2RlZmluZQlTa2lwX05vbmJsYW5rcyhj
LCBmKSBcCi0JCQl3aGlsZSAoYyE9J1x0JyAmJiBjIT0nICcgJiYgYyE9J1xuJyAmJiBjICE9IEVP
RikgXAotCQkJCWMgPSBnZXRfY2hhcihmKTsKLQotI2RlZmluZQlTa2lwX0xpbmUoYywgZikgXAot
CQkJZG8ge2MgPSBnZXRfY2hhcihmKTt9IHdoaWxlIChjICE9ICdcbicgJiYgYyAhPSBFT0YpOwot
Ci0jaWYgREVCVUdHSU5HCi0jIGRlZmluZSBEZWJ1ZyhtYXNrLCBtZXNzYWdlKSBcCi0JCQlpZiAo
IChEZWJ1Z0ZsYWdzICYgKG1hc2spICkgPT0gKG1hc2spICkgXAotCQkJCXByaW50ZiBtZXNzYWdl
OwotI2Vsc2UgLyogIURFQlVHR0lORyAqLwotIyBkZWZpbmUgRGVidWcobWFzaywgbWVzc2FnZSkg
XAotCQkJOwotI2VuZGlmIC8qIERFQlVHR0lORyAqLwotCi0jZGVmaW5lCU1rTG93ZXIoY2gpCShp
c3VwcGVyKGNoKSA/IHRvbG93ZXIoY2gpIDogY2gpCi0jZGVmaW5lCU1rVXBwZXIoY2gpCShpc2xv
d2VyKGNoKSA/IHRvdXBwZXIoY2gpIDogY2gpCi0jZGVmaW5lCVNldF9MaW5lTnVtKGxuKQl7RGVi
dWcoRFBBUlN8REVYVCwoImxpbmVudW09JWRcbiIsbG4pKTsgXAotCQkJIExpbmVOdW1iZXIgPSBs
bjsgXAotCQkJfQotCi0jZGVmaW5lCUZJUlNUX1NFQ09ORAkwCi0jZGVmaW5lCUxBU1RfU0VDT05E
CTU5Ci0jZGVmaW5lCVNFQ09ORF9DT1VOVAkoTEFTVF9TRUNPTkQgLSBGSVJTVF9TRUNPTkQgKyAx
KQotCi0jZGVmaW5lCUZJUlNUX01JTlVURQkwCi0jZGVmaW5lCUxBU1RfTUlOVVRFCTU5Ci0jZGVm
aW5lCU1JTlVURV9DT1VOVAkoTEFTVF9NSU5VVEUgLSBGSVJTVF9NSU5VVEUgKyAxKQotCi0jZGVm
aW5lCUZJUlNUX0hPVVIJMAotI2RlZmluZQlMQVNUX0hPVVIJMjMKLSNkZWZpbmUJSE9VUl9DT1VO
VAkoTEFTVF9IT1VSIC0gRklSU1RfSE9VUiArIDEpCi0KLSNkZWZpbmUJRklSU1RfRE9NCTEKLSNk
ZWZpbmUJTEFTVF9ET00JMzEKLSNkZWZpbmUJRE9NX0NPVU5UCShMQVNUX0RPTSAtIEZJUlNUX0RP
TSArIDEpCi0KLSNkZWZpbmUJRklSU1RfTU9OVEgJMQotI2RlZmluZQlMQVNUX01PTlRICTEyCi0j
ZGVmaW5lCU1PTlRIX0NPVU5UCShMQVNUX01PTlRIIC0gRklSU1RfTU9OVEggKyAxKQotCi0vKiBu
b3RlIG9uIERPVzogMCBhbmQgNyBhcmUgYm90aCBTdW5kYXksIGZvciBjb21wYXRpYmlsaXR5IHJl
YXNvbnMuICovCi0jZGVmaW5lCUZJUlNUX0RPVwkwCi0jZGVmaW5lCUxBU1RfRE9XCTcKLSNkZWZp
bmUJRE9XX0NPVU5UCShMQVNUX0RPVyAtIEZJUlNUX0RPVyArIDEpCi0KLSNpZmRlZiBMT0dJTl9D
QVAKLS8qIHNlZSBpbml0LmMgKi8KLSNkZWZpbmUgUkVTT1VSQ0VfUkMgImRhZW1vbiIKLSNlbmRp
ZgotCi0JCQkvKiBlYWNoIHVzZXIncyBjcm9udGFiIHdpbGwgYmUgaGVsZCBhcyBhIGxpc3Qgb2YK
LQkJCSAqIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLgotCQkJICoKLQkJCSAqIFRoZXNlIGFyZSB0
aGUgY3JvbiBjb21tYW5kcy4KLQkJCSAqLwotCi10eXBlZGVmCXN0cnVjdCBfZW50cnkgewotCXN0
cnVjdCBfZW50cnkJKm5leHQ7Ci0JdWlkX3QJCXVpZDsKLQlnaWRfdAkJZ2lkOwotI2lmZGVmIExP
R0lOX0NBUAotCWNoYXIgICAgICAgICAgICAqY2xhc3M7Ci0jZW5kaWYKLQljaGFyCQkqKmVudnA7
Ci0JY2hhcgkJKmNtZDsKLQliaXRzdHJfdAliaXRfZGVjbChzZWNvbmQsIFNFQ09ORF9DT1VOVCk7
Ci0JYml0c3RyX3QJYml0X2RlY2wobWludXRlLCBNSU5VVEVfQ09VTlQpOwotCWJpdHN0cl90CWJp
dF9kZWNsKGhvdXIsICAgSE9VUl9DT1VOVCk7Ci0JYml0c3RyX3QJYml0X2RlY2woZG9tLCAgICBE
T01fQ09VTlQpOwotCWJpdHN0cl90CWJpdF9kZWNsKG1vbnRoLCAgTU9OVEhfQ09VTlQpOwotCWJp
dHN0cl90CWJpdF9kZWNsKGRvdywgICAgRE9XX0NPVU5UKTsKLQlpbnQJCWZsYWdzOwotI2RlZmlu
ZQlET01fU1RBUgkweDAxCi0jZGVmaW5lCURPV19TVEFSCTB4MDIKLSNkZWZpbmUJV0hFTl9SRUJP
T1QJMHgwNAotI2RlZmluZQlSVU5fQVQJMHgwOAotI2RlZmluZQlOT1RfVU5USUwJMHgxMAotI2Rl
ZmluZQlTRUNfUkVTCQkweDIwCi0JdGltZV90CWxhc3RydW47Ci19IGVudHJ5OwotCi0JCQkvKiB0
aGUgY3JvbnRhYiBkYXRhYmFzZSB3aWxsIGJlIGEgbGlzdCBvZiB0aGUKLQkJCSAqIGZvbGxvd2lu
ZyBzdHJ1Y3R1cmUsIG9uZSBlbGVtZW50IHBlciB1c2VyCi0JCQkgKiBwbHVzIG9uZSBmb3IgdGhl
IHN5c3RlbS4KLQkJCSAqCi0JCQkgKiBUaGVzZSBhcmUgdGhlIGNyb250YWJzLgotCQkJICovCi0K
LXR5cGVkZWYJc3RydWN0IF91c2VyIHsKLQlzdHJ1Y3QgX3VzZXIJKm5leHQsICpwcmV2OwkvKiBs
aW5rcyAqLwotCWNoYXIJCSpuYW1lOwotCXRpbWVfdAkJbXRpbWU7CQkvKiBsYXN0IG1vZHRpbWUg
b2YgY3JvbnRhYiAqLwotCWVudHJ5CQkqY3JvbnRhYjsJLyogdGhpcyBwZXJzb24ncyBjcm9udGFi
ICovCi19IHVzZXI7Ci0KLXR5cGVkZWYJc3RydWN0IF9jcm9uX2RiIHsKLQl1c2VyCQkqaGVhZCwg
KnRhaWw7CS8qIGxpbmtzICovCi0JdGltZV90CQltdGltZTsJCS8qIGxhc3QgbW9kdGltZSBvbiBz
cG9vbGRpciAqLwotfSBjcm9uX2RiOwotCi0KLXZvaWQJCXNldF9jcm9uX3VpZCh2b2lkKSwKLQkJ
c2V0X2Nyb25fY3dkKHZvaWQpLAotCQlsb2FkX2RhdGFiYXNlKGNyb25fZGIgKiksCi0JCW9wZW5f
bG9nZmlsZSh2b2lkKSwKLQkJc2lncGlwZV9mdW5jKHZvaWQpLAotCQlqb2JfYWRkKGVudHJ5ICos
IHVzZXIgKiksCi0JCWRvX2NvbW1hbmQoZW50cnkgKiwgdXNlciAqKSwKLQkJbGlua191c2VyKGNy
b25fZGIgKiwgdXNlciAqKSwKLQkJdW5saW5rX3VzZXIoY3Jvbl9kYiAqLCB1c2VyICopLAotCQlm
cmVlX3VzZXIodXNlciAqKSwKLQkJZW52X2ZyZWUoY2hhciAqKiksCi0JCXVuZ2V0X2NoYXIoaW50
LCBGSUxFICopLAotCQlmcmVlX2VudHJ5KGVudHJ5ICopLAotCQlza2lwX2NvbW1lbnRzKEZJTEUg
KiksCi0JCWxvZ19pdChjaGFyICosIGludCwgY2hhciAqLCBjaGFyICopLAotCQlsb2dfY2xvc2Uo
dm9pZCk7Ci0KLWludAkJam9iX3J1bnF1ZXVlKHZvaWQpLAotCQlzZXRfZGVidWdfZmxhZ3MoY2hh
ciAqKSwKLQkJZ2V0X2NoYXIoRklMRSAqKSwKLQkJZ2V0X3N0cmluZyhjaGFyICosIGludCwgRklM
RSAqLCBjaGFyICopLAotCQlzd2FwX3VpZHModm9pZCksCi0JCXN3YXBfdWlkc19iYWNrKHZvaWQp
LAotCQlsb2FkX2VudihjaGFyICosIEZJTEUgKiksCi0JCWNyb25fcGNsb3NlKEZJTEUgKiksCi0J
CXN0cmNtcF91bnRpbChjaGFyICosIGNoYXIgKiwgaW50KSwKLQkJYWxsb3dlZChjaGFyICopLAot
CQlzdHJkdGIoY2hhciAqKTsKLQotY2hhcgkJKmVudl9nZXQoY2hhciAqLCBjaGFyICoqKSwKLQkJ
KmFycGFkYXRlKHRpbWVfdCAqKSwKLQkJKm1rcHJpbnRzKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWdu
ZWQgaW50KSwKLQkJKmZpcnN0X3dvcmQoY2hhciAqLCBjaGFyICopLAotCQkqKmVudl9pbml0KHZv
aWQpLAotCQkqKmVudl9jb3B5KGNoYXIgKiopLAotCQkqKmVudl9zZXQoY2hhciAqKiwgY2hhciAq
KTsKLQotdXNlcgkJKmxvYWRfdXNlcihpbnQsIHN0cnVjdCBwYXNzd2QgKiwgY2hhciAqKSwKLQkJ
KmZpbmRfdXNlcihjcm9uX2RiICosIGNoYXIgKik7Ci0KLWVudHJ5CQkqbG9hZF9lbnRyeShGSUxF
ICosIHZvaWQgKCopKGNoYXIgKiksCi0JCQkJIHN0cnVjdCBwYXNzd2QgKiwgY2hhciAqKik7Ci0K
LUZJTEUJCSpjcm9uX3BvcGVuKGNoYXIgKiwgY2hhciAqLCBlbnRyeSAqKTsKLQotCi0JCQkJLyog
aW4gdGhlIEMgdHJhZGl0aW9uLCB3ZSBvbmx5IGNyZWF0ZQotCQkJCSAqIHZhcmlhYmxlcyBmb3Ig
dGhlIG1haW4gcHJvZ3JhbSwganVzdAotCQkJCSAqIGV4dGVybiB0aGVtIGVsc2V3aGVyZS4KLQkJ
CQkgKi8KLQotI2lmZGVmIE1BSU5fUFJPR1JBTQotIyBpZiAhZGVmaW5lZChMSU5UKSAmJiAhZGVm
aW5lZChsaW50KQotY2hhcgkqY29weXJpZ2h0W10gPSB7Ci0JCSJAKCMpIENvcHlyaWdodCAxOTg4
LDE5ODksMTk5MCwxOTkzLDE5OTQgYnkgUGF1bCBWaXhpZSIsCi0JCSJAKCMpIEFsbCByaWdodHMg
cmVzZXJ2ZWQiCi0JfTsKLSMgZW5kaWYKLQotY2hhcgkqTW9udGhOYW1lc1tdID0gewotCQkiSmFu
IiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAotCQkiSnVsIiwgIkF1ZyIsICJT
ZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiLAotCQlOVUxMCi0JfTsKLQotY2hhcgkqRG93TmFtZXNb
XSA9IHsKLQkJIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIs
ICJTdW4iLAotCQlOVUxMCi0JfTsKLQotY2hhcgkqUHJvZ3JhbU5hbWUsCi0JKmRlZm1haWx0bzsK
LWludAlMaW5lTnVtYmVyOwotdW5zaWduZWQgSml0dGVyLAotCVJvb3RKaXR0ZXI7Ci10aW1lX3QJ
VGFyZ2V0VGltZTsKLQotIyBpZiBERUJVR0dJTkcKLWludAlEZWJ1Z0ZsYWdzOwotY2hhcgkqRGVi
dWdGbGFnTmFtZXNbXSA9IHsJLyogc3luYyB3aXRoICNkZWZpbmVzICovCi0JCSJleHQiLCAic2No
IiwgInByb2MiLCAicGFycyIsICJsb2FkIiwgIm1pc2MiLCAidGVzdCIsICJiaXQiLAotCQlOVUxM
CQkvKiBOVUxMIG11c3QgYmUgbGFzdCBlbGVtZW50ICovCi0JfTsKLSMgZW5kaWYgLyogREVCVUdH
SU5HICovCi0jZWxzZSAvKk1BSU5fUFJPR1JBTSovCi1leHRlcm4JY2hhcgkqY29weXJpZ2h0W10s
Ci0JCSpNb250aE5hbWVzW10sCi0JCSpEb3dOYW1lc1tdLAotCQkqUHJvZ3JhbU5hbWUsCi0JCSpk
ZWZtYWlsdG87Ci1leHRlcm4JaW50CUxpbmVOdW1iZXI7Ci1leHRlcm4gdW5zaWduZWQJSml0dGVy
LAotCQlSb290Sml0dGVyOwotZXh0ZXJuCXRpbWVfdAlUYXJnZXRUaW1lOwotZXh0ZXJuIHN0cnVj
dCBwaWRmaCAqcGZoOwotIyBpZiBERUJVR0dJTkcKLWV4dGVybglpbnQJRGVidWdGbGFnczsKLWV4
dGVybgljaGFyCSpEZWJ1Z0ZsYWdOYW1lc1tdOwotIyBlbmRpZiAvKiBERUJVR0dJTkcgKi8KLSNl
bmRpZiAvKk1BSU5fUFJPR1JBTSovCisjaW5jbHVkZSAicGF0aG5hbWVzLmgiCisjaW5jbHVkZSAi
bWFjcm9zLmgiCisjaW5jbHVkZSAic3RydWN0cy5oIgorI2luY2x1ZGUgImZ1bmNzLmgiCisjaW5j
bHVkZSAiZ2xvYmFscy5oIgpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2Rh
dGFiYXNlLmMgZnJlZWJzZF9jcm9uL2Nyb24vZGF0YWJhc2UuYwotLS0gL3Vzci9zcmMvdXNyLnNi
aW4vY3Jvbi9jcm9uL2RhdGFiYXNlLmMJMjAxNC0wMS0xNiAyMTo0Mzo0OS4wMDAwMDAwMDAgKzAx
MDAKKysrIGZyZWVic2RfY3Jvbi9jcm9uL2RhdGFiYXNlLmMJMjAxNC0wNi0xMSAxNjo0Mjo1NS4y
NzI0NDQyNzYgKzAyMDAKQEAgLTEsNTUgKzEsNDggQEAKIC8qIENvcHlyaWdodCAxOTg4LDE5OTAs
MTk5MywxOTk0IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLworCisv
KgorICogQ29weXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwg
SW5jLiAoIklTQyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0
d2FyZSBDb25zb3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDog
ZG9uJ3QgcmVtb3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9u
IChkb24ndCB0YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24n
dAotICogZ2V0IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIg
b3IgcmVtb3ZlIHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3Vy
Y2UgaXMgcHJvdmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBl
eHByZXNzIG9yIGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVz
ZSBhdCB5b3VyIG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0
bwotICogYW55b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0
cyBlbnRpcmVseSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5
LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9z
ZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRo
ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBh
cHBlYXIgaW4gYWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMs
IGVuaGFuY2VtZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0
byBrZWVwIGEgdmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dz
OgotICogUGF1bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFk
ZWN3cmwhdml4aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5E
IElTQyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09G
VFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9SCisg
KiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNF
LCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwg
TkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBPRiBP
UiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRX
QVJFLgogICovCiAKLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQotc3RhdGlj
IGNvbnN0IGNoYXIgcmNzaWRbXSA9Ci0gICIkRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNi
aW4vY3Jvbi9jcm9uL2RhdGFiYXNlLmMgMTczNDEyIDIwMDctMTEtMDcgMTA6NTM6NDFaIGtldmxv
ICQiOwotI2VuZGlmCisvLyNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQorLy9z
dGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogZGF0YWJhc2UuYyx2IDEuNyAyMDA0LzAxLzIzIDE4
OjU2OjQyIHZpeGllIEV4cCAkIjsKKy8vI2VuZGlmCiAKIC8qIHZpeCAyNmphbjg3IFtSQ1MgaGFz
IHRoZSBsb2ddCiAgKi8KIAotCiAjaW5jbHVkZSAiY3Jvbi5oIgotI2luY2x1ZGUgPGZjbnRsLmg+
Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotCiAKICNkZWZp
bmUgVE1BWChhLGIpICgoYSk+KGIpPyhhKTooYikpCiAKLQotc3RhdGljCXZvaWQJCXByb2Nlc3Nf
Y3JvbnRhYihjaGFyICosIGNoYXIgKiwgY2hhciAqLAotCQkJCQkgICAgIHN0cnVjdCBzdGF0ICos
Ci0JCQkJCSAgICAgY3Jvbl9kYiAqLCBjcm9uX2RiICopOwotCitzdGF0aWMJdm9pZAkJcHJvY2Vz
c19jcm9udGFiKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkJCQljb25zdCBjaGFyICos
IHN0cnVjdCBzdGF0ICosCisJCQkJCWNyb25fZGIgKiwgY3Jvbl9kYiAqKTsKIAogdm9pZAotbG9h
ZF9kYXRhYmFzZShvbGRfZGIpCi0JY3Jvbl9kYgkJKm9sZF9kYjsKLXsKLQlESVIJCSpkaXI7Ci0J
c3RydWN0IHN0YXQJc3RhdGJ1ZjsKLQlzdHJ1Y3Qgc3RhdAlzeXNjcm9uX3N0YXQ7Ci0JRElSX1Qg
ICAJKmRwOwotCWNyb25fZGIJCW5ld19kYjsKLQl1c2VyCQkqdSwgKm51OworbG9hZF9kYXRhYmFz
ZShjcm9uX2RiICpvbGRfZGIpIHsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmLCBzeXNjcm9uX3N0YXQ7
CisJY3Jvbl9kYiBuZXdfZGI7CisJRElSX1QgKmRwOworCURJUiAqZGlyOworCXVzZXIgKnUsICpu
dTsKIAotCURlYnVnKERMT0FELCAoIlslZF0gbG9hZF9kYXRhYmFzZSgpXG4iLCBnZXRwaWQoKSkp
CisJRGVidWcoRExPQUQsICgiWyVsZF0gbG9hZF9kYXRhYmFzZSgpXG4iLCAobG9uZylnZXRwaWQo
KSkpCiAKIAkvKiBiZWZvcmUgd2Ugc3RhcnQgbG9hZGluZyBhbnkgZGF0YSwgZG8gYSBzdGF0IG9u
IFNQT09MX0RJUgogCSAqIHNvIHRoYXQgaWYgYW55dGhpbmcgY2hhbmdlcyBhcyBvZiB0aGlzIG1v
bWVudCAoaS5lLiwgYmVmb3JlIHdlJ3ZlCkBAIC03Myw4ICs2Niw4IEBACiAJICogdGltZSB0aGlz
IGZ1bmN0aW9uIGlzIGNhbGxlZC4KIAkgKi8KIAlpZiAob2xkX2RiLT5tdGltZSA9PSBUTUFYKHN0
YXRidWYuc3RfbXRpbWUsIHN5c2Nyb25fc3RhdC5zdF9tdGltZSkpIHsKLQkJRGVidWcoRExPQUQs
ICgiWyVkXSBzcG9vbCBkaXIgbXRpbWUgdW5jaCwgbm8gbG9hZCBuZWVkZWQuXG4iLAotCQkJICAg
ICAgZ2V0cGlkKCkpKQorCQlEZWJ1ZyhETE9BRCwgKCJbJWxkXSBzcG9vbCBkaXIgbXRpbWUgdW5j
aCwgbm8gbG9hZCBuZWVkZWQuXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkpKQogCQlyZXR1
cm47CiAJfQogCkBAIC04NiwxMSArNzksOSBAQAogCW5ld19kYi5tdGltZSA9IFRNQVgoc3RhdGJ1
Zi5zdF9tdGltZSwgc3lzY3Jvbl9zdGF0LnN0X210aW1lKTsKIAluZXdfZGIuaGVhZCA9IG5ld19k
Yi50YWlsID0gTlVMTDsKIAotCWlmIChzeXNjcm9uX3N0YXQuc3RfbXRpbWUpIHsKLQkJcHJvY2Vz
c19jcm9udGFiKCJyb290IiwgU1lTX05BTUUsCi0JCQkJU1lTQ1JPTlRBQiwgJnN5c2Nyb25fc3Rh
dCwKKwlpZiAoc3lzY3Jvbl9zdGF0LnN0X210aW1lKQorCQlwcm9jZXNzX2Nyb250YWIoInJvb3Qi
LCBOVUxMLCBTWVNDUk9OVEFCLCAmc3lzY3Jvbl9zdGF0LAogCQkJCSZuZXdfZGIsIG9sZF9kYik7
Ci0JfQogCiAJLyogd2UgdXNlZCB0byBrZWVwIHRoaXMgZGlyIG9wZW4gYWxsIHRoZSB0aW1lLCBm
b3IgdGhlIHNha2Ugb2YKIAkgKiBlZmZpY2llbmN5LiAgaG93ZXZlciwgd2UgbmVlZCB0byBjbG9z
ZSBpdCBpbiBldmVyeSBmb3JrLCBhbmQKQEAgLTEwMiw4ICs5Myw3IEBACiAJfQogCiAJd2hpbGUg
KE5VTEwgIT0gKGRwID0gcmVhZGRpcihkaXIpKSkgewotCQljaGFyCWZuYW1lW01BWE5BTUxFTisx
XSwKLQkJCXRhYm5hbWVbTUFYTkFNTEVOKzFdOworCQljaGFyIGZuYW1lW01BWE5BTUxFTisxXSwg
dGFibmFtZVtNQVhOQU1MRU4rMV07CiAKIAkJLyogYXZvaWQgZmlsZSBuYW1lcyBiZWdpbm5pbmcg
d2l0aCAiLiIuICB0aGlzIGlzIGdvb2QKIAkJICogYmVjYXVzZSB3ZSB3b3VsZCBvdGhlcndpc2Ug
d2FzdGUgdHdvIGd1YXJhbnRlZWQgY2FsbHMKQEAgLTExMyw5ICsxMDMsMTMgQEAKIAkJaWYgKGRw
LT5kX25hbWVbMF0gPT0gJy4nKQogCQkJY29udGludWU7CiAKLQkJKHZvaWQpIHN0cm5jcHkoZm5h
bWUsIGRwLT5kX25hbWUsIHNpemVvZihmbmFtZSkpOwotCQlmbmFtZVtzaXplb2YoZm5hbWUpLTFd
ID0gJ1wwJzsKLQkJKHZvaWQpIHNucHJpbnRmKHRhYm5hbWUsIHNpemVvZiB0YWJuYW1lLCBDUk9O
X1RBQihmbmFtZSkpOworCQlpZiAoc3RybGVuKGRwLT5kX25hbWUpID49IHNpemVvZiBmbmFtZSkK
KwkJCWNvbnRpbnVlOwkvKiBYWFggbG9nPyAqLworCQkodm9pZCkgc3RybGNweShmbmFtZSwgZHAt
PmRfbmFtZSwgc2l6ZW9mKGZuYW1lKSk7CisJCQorCQlpZiAoIWdsdWVfc3RyaW5ncyh0YWJuYW1l
LCBzaXplb2YgdGFibmFtZSwgU1BPT0xfRElSLAorCQkJCSAgZm5hbWUsICcvJykpCisJCQljb250
aW51ZTsJLyogWFhYIGxvZz8gKi8KIAogCQlwcm9jZXNzX2Nyb250YWIoZm5hbWUsIGZuYW1lLCB0
YWJuYW1lLAogCQkJCSZzdGF0YnVmLCAmbmV3X2RiLCBvbGRfZGIpOwpAQCAtMTQ0LDEyICsxMzgs
OCBAQAogCURlYnVnKERMT0FELCAoImxvYWRfZGF0YWJhc2UgaXMgZG9uZVxuIikpCiB9CiAKLQog
dm9pZAotbGlua191c2VyKGRiLCB1KQotCWNyb25fZGIJKmRiOwotCXVzZXIJKnU7Ci17CitsaW5r
X3VzZXIoY3Jvbl9kYiAqZGIsIHVzZXIgKnUpIHsKIAlpZiAoZGItPmhlYWQgPT0gTlVMTCkKIAkJ
ZGItPmhlYWQgPSB1OwogCWlmIChkYi0+dGFpbCkKQEAgLTE1OSwxMiArMTQ5LDggQEAKIAlkYi0+
dGFpbCA9IHU7CiB9CiAKLQogdm9pZAotdW5saW5rX3VzZXIoZGIsIHUpCi0JY3Jvbl9kYgkqZGI7
Ci0JdXNlcgkqdTsKLXsKK3VubGlua191c2VyKGNyb25fZGIgKmRiLCB1c2VyICp1KSB7CiAJaWYg
KHUtPnByZXYgPT0gTlVMTCkKIAkJZGItPmhlYWQgPSB1LT5uZXh0OwogCWVsc2UKQEAgLTE3Niw0
MyArMTYyLDM2IEBACiAJCXUtPm5leHQtPnByZXYgPSB1LT5wcmV2OwogfQogCi0KIHVzZXIgKgot
ZmluZF91c2VyKGRiLCBuYW1lKQotCWNyb25fZGIJKmRiOwotCWNoYXIJKm5hbWU7Ci17Ci0JY2hh
cgkqZW52X2dldCgpOwotCXVzZXIJKnU7CitmaW5kX3VzZXIoY3Jvbl9kYiAqZGIsIGNvbnN0IGNo
YXIgKm5hbWUpIHsKKwl1c2VyICp1OwogCiAJZm9yICh1ID0gZGItPmhlYWQ7ICB1ICE9IE5VTEw7
ICB1ID0gdS0+bmV4dCkKLQkJaWYgKCFzdHJjbXAodS0+bmFtZSwgbmFtZSkpCisJCWlmIChzdHJj
bXAodS0+bmFtZSwgbmFtZSkgPT0gMCkKIAkJCWJyZWFrOwotCXJldHVybiB1OworCXJldHVybiAo
dSk7CiB9CiAKLQogc3RhdGljIHZvaWQKLXByb2Nlc3NfY3JvbnRhYih1bmFtZSwgZm5hbWUsIHRh
Ym5hbWUsIHN0YXRidWYsIG5ld19kYiwgb2xkX2RiKQotCWNoYXIJCSp1bmFtZTsKLQljaGFyCQkq
Zm5hbWU7Ci0JY2hhcgkJKnRhYm5hbWU7Ci0Jc3RydWN0IHN0YXQJKnN0YXRidWY7Ci0JY3Jvbl9k
YgkJKm5ld19kYjsKLQljcm9uX2RiCQkqb2xkX2RiOworcHJvY2Vzc19jcm9udGFiKGNvbnN0IGNo
YXIgKnVuYW1lLCBjb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqdGFibmFtZSwKKwkJc3Ry
dWN0IHN0YXQgKnN0YXRidWYsIGNyb25fZGIgKm5ld19kYiwgY3Jvbl9kYiAqb2xkX2RiKQogewot
CXN0cnVjdCBwYXNzd2QJKnB3ID0gTlVMTDsKLQlpbnQJCWNyb250YWJfZmQgPSBPSyAtIDE7Ci0J
dXNlcgkJKnU7CisJc3RydWN0IHBhc3N3ZCAqcHcgPSBOVUxMOworCWludCBjcm9udGFiX2ZkID0g
T0sgLSAxOworCXVzZXIgKnU7CiAKLQlpZiAoc3RyY21wKGZuYW1lLCBTWVNfTkFNRSkgJiYgIShw
dyA9IGdldHB3bmFtKHVuYW1lKSkpIHsKKwlpZiAoZm5hbWUgPT0gTlVMTCkgeworCQkvKiBtdXN0
IGJlIHNldCB0byBzb21ldGhpbmcgZm9yIGxvZ2dpbmcgcHVycG9zZXMuCisJCSAqLworCQlmbmFt
ZSA9ICIqc3lzdGVtKiI7CisJfSBlbHNlIGlmICgocHcgPSBnZXRwd25hbSh1bmFtZSkpID09IE5V
TEwpIHsKIAkJLyogZmlsZSBkb2Vzbid0IGhhdmUgYSB1c2VyIGluIHBhc3N3ZCBmaWxlLgogCQkg
Ki8KIAkJbG9nX2l0KGZuYW1lLCBnZXRwaWQoKSwgIk9SUEhBTiIsICJubyBwYXNzd2QgZW50cnki
KTsKIAkJZ290byBuZXh0X2Nyb250YWI7CiAJfQogCi0JaWYgKChjcm9udGFiX2ZkID0gb3Blbih0
YWJuYW1lLCBPX1JET05MWSwgMCkpIDwgT0spIHsKKwlpZiAoKGNyb250YWJfZmQgPSBvcGVuKHRh
Ym5hbWUsIE9fUkRPTkxZfE9fTk9OQkxPQ0t8T19OT0ZPTExPVywgMCkpIDwgT0spIHsKIAkJLyog
Y3JvbnRhYiBub3QgYWNjZXNzaWJsZT8KIAkJICovCiAJCWxvZ19pdChmbmFtZSwgZ2V0cGlkKCks
ICJDQU4nVCBPUEVOIiwgdGFibmFtZSk7CkBAIC0yMjMsNiArMjAyLDIzIEBACiAJCWxvZ19pdChm
bmFtZSwgZ2V0cGlkKCksICJGU1RBVCBGQUlMRUQiLCB0YWJuYW1lKTsKIAkJZ290byBuZXh0X2Ny
b250YWI7CiAJfQorCWlmICghU19JU1JFRyhzdGF0YnVmLT5zdF9tb2RlKSkgeworCQlsb2dfaXQo
Zm5hbWUsIGdldHBpZCgpLCAiTk9UIFJFR1VMQVIiLCB0YWJuYW1lKTsKKwkJZ290byBuZXh0X2Ny
b250YWI7CisJfQorCWlmICgoc3RhdGJ1Zi0+c3RfbW9kZSAmIDA3Nzc3KSAhPSAwNjAwKSB7CisJ
CWxvZ19pdChmbmFtZSwgZ2V0cGlkKCksICJCQUQgRklMRSBNT0RFIiwgdGFibmFtZSk7CisJCWdv
dG8gbmV4dF9jcm9udGFiOworCX0KKwlpZiAoc3RhdGJ1Zi0+c3RfdWlkICE9IFJPT1RfVUlEICYm
IChwdyA9PSBOVUxMIHx8CisJICAgIHN0YXRidWYtPnN0X3VpZCAhPSBwdy0+cHdfdWlkIHx8IHN0
cmNtcCh1bmFtZSwgcHctPnB3X25hbWUpICE9IDApKSB7CisJCWxvZ19pdChmbmFtZSwgZ2V0cGlk
KCksICJXUk9ORyBGSUxFIE9XTkVSIiwgdGFibmFtZSk7CisJCWdvdG8gbmV4dF9jcm9udGFiOwor
CX0KKwlpZiAoc3RhdGJ1Zi0+c3RfbmxpbmsgIT0gMSkgeworCQlsb2dfaXQoZm5hbWUsIGdldHBp
ZCgpLCAiQkFEIExJTksgQ09VTlQiLCB0YWJuYW1lKTsKKwkJZ290byBuZXh0X2Nyb250YWI7CisJ
fQogCiAJRGVidWcoRExPQUQsICgiXHQlczoiLCBmbmFtZSkpCiAJdSA9IGZpbmRfdXNlcihvbGRf
ZGIsIGZuYW1lKTsKQEAgLTI1NSw3ICsyNTEsNyBAQAogCQlsaW5rX3VzZXIobmV3X2RiLCB1KTsK
IAl9CiAKLW5leHRfY3JvbnRhYjoKKyBuZXh0X2Nyb250YWI6CiAJaWYgKGNyb250YWJfZmQgPj0g
T0spIHsKIAkJRGVidWcoRExPQUQsICgiIFtkb25lXVxuIikpCiAJCWNsb3NlKGNyb250YWJfZmQp
OwpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2RvX2NvbW1hbmQuYyBmcmVl
YnNkX2Nyb24vY3Jvbi9kb19jb21tYW5kLmMKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jv
bi9kb19jb21tYW5kLmMJMjAxNC0wMS0xNiAyMTo0Mzo0OS4wMDAwMDAwMDAgKzAxMDAKKysrIGZy
ZWVic2RfY3Jvbi9jcm9uL2RvX2NvbW1hbmQuYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MjQ0NDI3
NiArMDIwMApAQCAtMSw1NCArMSw0OSBAQAogLyogQ29weXJpZ2h0IDE5ODgsMTk5MCwxOTkzLDE5
OTQgYnkgUGF1bCBWaXhpZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICovCisKKy8qCisgKiBD
b3B5cmlnaHQgKGMpIDIwMDQgYnkgSW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuICgi
SVNDIikKKyAqIENvcHlyaWdodCAoYykgMTk5NywyMDAwIGJ5IEludGVybmV0IFNvZnR3YXJlIENv
bnNvcnRpdW0sIEluYy4KICAqCi0gKiBEaXN0cmlidXRlIGZyZWVseSwgZXhjZXB0OiBkb24ndCBy
ZW1vdmUgbXkgbmFtZSBmcm9tIHRoZSBzb3VyY2Ugb3IKLSAqIGRvY3VtZW50YXRpb24gKGRvbid0
IHRha2UgY3JlZGl0IGZvciBteSB3b3JrKSwgbWFyayB5b3VyIGNoYW5nZXMgKGRvbid0Ci0gKiBn
ZXQgbWUgYmxhbWVkIGZvciB5b3VyIHBvc3NpYmxlIGJ1Z3MpLCBkb24ndCBhbHRlciBvciByZW1v
dmUgdGhpcwotICogbm90aWNlLiAgTWF5IGJlIHNvbGQgaWYgYnVpbGRhYmxlIHNvdXJjZSBpcyBw
cm92aWRlZCB0byBidXllci4gIE5vCi0gKiB3YXJyYW50ZWUgb2YgYW55IGtpbmQsIGV4cHJlc3Mg
b3IgaW1wbGllZCwgaXMgaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBzb2Z0d2FyZTsgdXNlIGF0IHlv
dXIgb3duIHJpc2ssIHJlc3BvbnNpYmlsaXR5IGZvciBkYW1hZ2VzIChpZiBhbnkpIHRvCi0gKiBh
bnlvbmUgcmVzdWx0aW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIHJlc3RzIGVudGly
ZWx5IHdpdGggdGhlCi0gKiB1c2VyLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlm
eSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGgg
b3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBp
biBhbGwgY29waWVzLgogICoKLSAqIFNlbmQgYnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgZW5oYW5j
ZW1lbnRzLCByZXF1ZXN0cywgZmxhbWVzLCBldGMuLCBhbmQKLSAqIEknbGwgdHJ5IHRvIGtlZXAg
YSB2ZXJzaW9uIHVwIHRvIGRhdGUuICBJIGNhbiBiZSByZWFjaGVkIGFzIGZvbGxvd3M6Ci0gKiBQ
YXVsIFZpeGllICAgICAgICAgIDxwYXVsQHZpeC5jb20+ICAgICAgICAgIHV1bmV0IWRlY3dybCF2
aXhpZSFwYXVsCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJ
U0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJ
TkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBT
UEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5Z
IERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEg
T1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdF
TkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENP
Tk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAg
Ki8KIAotI2lmICFkZWZpbmVkKGxpbnQpICYmICFkZWZpbmVkKExJTlQpCi1zdGF0aWMgY29uc3Qg
Y2hhciByY3NpZFtdID0KLSAgIiRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9u
L2Nyb24vZG9fY29tbWFuZC5jIDIyODk5MCAyMDExLTEyLTMwIDEwOjU4OjE0WiB1cXMgJCI7Ci0j
ZW5kaWYKLQorLy8jaWYgIWRlZmluZWQobGludCkgJiYgIWRlZmluZWQoTElOVCkKKy8vc3RhdGlj
IGNoYXIgcmNzaWRbXSA9ICIkSWQ6IGRvX2NvbW1hbmQuYyx2IDEuOSAyMDA0LzAxLzIzIDE4OjU2
OjQyIHZpeGllIEV4cCAkIjsKKy8vI2VuZGlmCiAKICNpbmNsdWRlICJjcm9uLmgiCi0jaW5jbHVk
ZSA8c3lzL3NpZ25hbC5oPgorCiAjaWYgZGVmaW5lZChzZXF1ZW50KQogIyBpbmNsdWRlIDxzeXMv
dW5pdmVyc2UuaD4KICNlbmRpZgotI2lmIGRlZmluZWQoU1lTTE9HKQotIyBpbmNsdWRlIDxzeXNs
b2cuaD4KLSNlbmRpZgorCiAjaWYgZGVmaW5lZChMT0dJTl9DQVApCiAjIGluY2x1ZGUgPGxvZ2lu
X2NhcC5oPgogI2VuZGlmCisKICNpZmRlZiBQQU0KICMgaW5jbHVkZSA8c2VjdXJpdHkvcGFtX2Fw
cGwuaD4KICMgaW5jbHVkZSA8c2VjdXJpdHkvb3BlbnBhbS5oPgogI2VuZGlmCi0KLQotc3RhdGlj
IHZvaWQJCWNoaWxkX3Byb2Nlc3MoZW50cnkgKiwgdXNlciAqKSwKLQkJCWRvX3VuaXYodXNlciAq
KTsKLQorc3RhdGljIHZvaWQJCWNoaWxkX3Byb2Nlc3MoZW50cnkgKiwgdXNlciAqKTsKK3N0YXRp
YyBpbnQJCXNhZmVfcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CiAKIHZvaWQKLWRvX2Nv
bW1hbmQoZSwgdSkKLQllbnRyeQkqZTsKLQl1c2VyCSp1OwoteworZG9fY29tbWFuZChlbnRyeSAq
ZSwgdXNlciAqdSkgewogCURlYnVnKERQUk9DLCAoIlslZF0gZG9fY29tbWFuZCglcywgKCVzLCVk
LCVkKSlcbiIsCi0JCWdldHBpZCgpLCBlLT5jbWQsIHUtPm5hbWUsIGUtPnVpZCwgZS0+Z2lkKSkK
KwkJICAgICAgZ2V0cGlkKCksIGUtPmNtZCwgdS0+bmFtZSwgZS0+dWlkLCBlLT5naWQpKQogCiAJ
LyogZm9yayB0byBiZWNvbWUgYXN5bmNocm9ub3VzIC0tIHBhcmVudCBwcm9jZXNzIGlzIGRvbmUg
aW1tZWRpYXRlbHksCiAJICogYW5kIGNvbnRpbnVlcyB0byBydW4gdGhlIG5vcm1hbCBjcm9uIGNv
ZGUsIHdoaWNoIG1lYW5zIHJldHVybiB0bwpAQCAtNTksNDEgKzU0LDM4IEBACiAJICovCiAJc3dp
dGNoIChmb3JrKCkpIHsKIAljYXNlIC0xOgotCQlsb2dfaXQoIkNST04iLGdldHBpZCgpLCJlcnJv
ciIsImNhbid0IGZvcmsiKTsKKwkJbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJlcnJvciIsICJj
YW4ndCBmb3JrIik7CiAJCWJyZWFrOwogCWNhc2UgMDoKIAkJLyogY2hpbGQgcHJvY2VzcyAqLwog
CQlwaWRmaWxlX2Nsb3NlKHBmaCk7CiAJCWNoaWxkX3Byb2Nlc3MoZSwgdSk7Ci0JCURlYnVnKERQ
Uk9DLCAoIlslZF0gY2hpbGQgcHJvY2VzcyBkb25lLCBleGl0aW5nXG4iLCBnZXRwaWQoKSkpCisJ
CURlYnVnKERQUk9DLCAoIlslbGRdIGNoaWxkIHByb2Nlc3MgZG9uZSwgZXhpdGluZ1xuIiwKKwkJ
CSAgICAgIChsb25nKWdldHBpZCgpKSkKIAkJX2V4aXQoT0tfRVhJVCk7CiAJCWJyZWFrOwogCWRl
ZmF1bHQ6CiAJCS8qIHBhcmVudCBwcm9jZXNzICovCiAJCWJyZWFrOwogCX0KLQlEZWJ1ZyhEUFJP
QywgKCJbJWRdIG1haW4gcHJvY2VzcyByZXR1cm5pbmcgdG8gd29ya1xuIiwgZ2V0cGlkKCkpKQor
CURlYnVnKERQUk9DLCAoIlslbGRdIG1haW4gcHJvY2VzcyByZXR1cm5pbmcgdG8gd29ya1xuIiwo
bG9uZylnZXRwaWQoKSkpCiB9CiAKLQogc3RhdGljIHZvaWQKLWNoaWxkX3Byb2Nlc3MoZSwgdSkK
LQllbnRyeQkqZTsKLQl1c2VyCSp1OwotewotCWludAkJc3RkaW5fcGlwZVsyXSwgc3Rkb3V0X3Bp
cGVbMl07Ci0JcmVnaXN0ZXIgY2hhcgkqaW5wdXRfZGF0YTsKLQljaGFyCQkqdXNlcm5tLCAqbWFp
bHRvOwotCWludAkJY2hpbGRyZW4gPSAwOworY2hpbGRfcHJvY2VzcyhlbnRyeSAqZSwgdXNlciAq
dSkgeworCWludCBzdGRpbl9waXBlWzJdLCBzdGRvdXRfcGlwZVsyXTsKKwljaGFyICppbnB1dF9k
YXRhLCAqdXNlcm5tLCAqbWFpbHRvOworCWludCBjaGlsZHJlbiA9IDA7CisKICMgaWYgZGVmaW5l
ZChMT0dJTl9DQVApCi0Jc3RydWN0IHBhc3N3ZAkqcHdkOworCXN0cnVjdCBwYXNzd2QgKnB3ZDsK
IAlsb2dpbl9jYXBfdCAqbGM7CiAjIGVuZGlmCiAKLQlEZWJ1ZyhEUFJPQywgKCJbJWRdIGNoaWxk
X3Byb2Nlc3MoJyVzJylcbiIsIGdldHBpZCgpLCBlLT5jbWQpKQorCURlYnVnKERQUk9DLCAoIlsl
bGRdIGNoaWxkX3Byb2Nlc3MoJyVzJylcbiIsIChsb25nKWdldHBpZCgpLCBlLT5jbWQpKQogCi0J
LyogbWFyayBvdXJzZWx2ZXMgYXMgZGlmZmVyZW50IHRvIFBTIGNvbW1hbmQgd2F0Y2hlcnMgYnkg
dXBzaGlmdGluZwotCSAqIG91ciBwcm9ncmFtIG5hbWUuICBUaGlzIGhhcyBubyBlZmZlY3Qgb24g
c29tZSBrZXJuZWxzLgorCS8qIG1hcmsgb3Vyc2VsdmVzIGFzIGRpZmZlcmVudCB0byBQUyBjb21t
YW5kIHdhdGNoZXJzIGJ5IHVwc2hpdGluZworCSAqIG91ciBwcm9ncmFtIG5hbWUuIFRoaXMgaGFz
IG5vIGVmZmVjdCBvbiBzb21lIGtlcm5lbHMuCiAJICovCiAJc2V0cHJvY3RpdGxlKCJydW5uaW5n
IGpvYiIpOwogCkBAIC0xMDMsODggKzk1LDgwIEBACiAJbWFpbHRvID0gZW52X2dldCgiTUFJTFRP
IiwgZS0+ZW52cCk7CiAKICNpZmRlZiBQQU0KLQkvKiB1c2UgUEFNIHRvIHNlZSBpZiB0aGUgdXNl
cidzIGFjY291bnQgaXMgYXZhaWxhYmxlLAotCSAqIGkuZS4sIG5vdCBsb2NrZWQgb3IgZXhwaXJl
ZCBvciB3aGF0ZXZlci4gIHNraXAgdGhpcwotCSAqIGZvciBzeXN0ZW0gdGFza3MgZnJvbSAvZXRj
L2Nyb250YWIgLS0gdGhleSBjYW4gcnVuCi0JICogYXMgYW55IHVzZXIuCi0JICovCi0JaWYgKHN0
cmNtcCh1LT5uYW1lLCBTWVNfTkFNRSkpIHsJLyogbm90IGVxdWFsICovCi0JCXBhbV9oYW5kbGVf
dCAqcGFtaCA9IE5VTEw7Ci0JCWludCBwYW1fZXJyOwotCQlzdHJ1Y3QgcGFtX2NvbnYgcGFtYyA9
IHsKLQkJCS5jb252ID0gb3BlbnBhbV9udWxsY29udiwKLQkJCS5hcHBkYXRhX3B0ciA9IE5VTEwK
LQkJfTsKLQotCQlEZWJ1ZyhEUFJPQywgKCJbJWRdIGNoZWNraW5nIGFjY291bnQgd2l0aCBQQU1c
biIsIGdldHBpZCgpKSkKLQotCQkvKiB1LT5uYW1lIGtlZXBzIGNyb250YWIgb3duZXIgbmFtZSB3
aGlsZSBMT0dOQU1FIGlzIHRoZSBuYW1lCi0JCSAqIG9mIHVzZXIgdG8gcnVuIGNvbW1hbmQgb24g
YmVoYWxmIG9mLiAgdGhleSBzaG91bGQgYmUgdGhlCi0JCSAqIHNhbWUgZm9yIGEgdGFzayBmcm9t
IGEgcGVyLXVzZXIgY3JvbnRhYi4KLQkJICovCi0JCWlmIChzdHJjbXAodS0+bmFtZSwgdXNlcm5t
KSkgewotCQkJbG9nX2l0KHVzZXJubSwgZ2V0cGlkKCksICJ1c2VybmFtZSBhbWJpZ3VpdHkiLCB1
LT5uYW1lKTsKLQkJCWV4aXQoRVJST1JfRVhJVCk7Ci0JCX0KLQotCQlwYW1fZXJyID0gcGFtX3N0
YXJ0KCJjcm9uIiwgdXNlcm5tLCAmcGFtYywgJnBhbWgpOwotCQlpZiAocGFtX2VyciAhPSBQQU1f
U1VDQ0VTUykgewotCQkJbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJlcnJvciIsICJjYW4ndCBz
dGFydCBQQU0iKTsKLQkJCWV4aXQoRVJST1JfRVhJVCk7Ci0JCX0KKyAgICAgICAgLyogdXNlIFBB
TSB0byBzZWUgaWYgdGhlIHVzZXIncyBhY2NvdW50IGlzIGF2YWlsYWJsZSwKKyAgICAgICAgICog
aS5lLiwgbm90IGxvY2tlZCBvciBleHBpcmVkIG9yIHdoYXRldmVyLiAgc2tpcCB0aGlzCisgICAg
ICAgICAqIGZvciBzeXN0ZW0gdGFza3MgZnJvbSAvZXRjL2Nyb250YWIgLS0gdGhleSBjYW4gcnVu
CisgICAgICAgICAqIGFzIGFueSB1c2VyLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHN0cmNt
cCh1LT5uYW1lLCBTWVNfTkFNRSkpIHsgICAgICAgIC8qIG5vdCBlcXVhbCAqLworICAgICAgICAg
ICAgICAgIHBhbV9oYW5kbGVfdCAqcGFtaCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW50IHBh
bV9lcnI7CisgICAgICAgICAgICAgICAgc3RydWN0IHBhbV9jb252IHBhbWMgPSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAuY29udiA9IG9wZW5wYW1fbnVsbGNvbnYsCisgICAgICAgICAgICAg
ICAgICAgICAgICAuYXBwZGF0YV9wdHIgPSBOVUxMCisgICAgICAgICAgICAgICAgfTsKKworICAg
ICAgICAgICAgICAgIERlYnVnKERQUk9DLCAoIlslZF0gY2hlY2tpbmcgYWNjb3VudCB3aXRoIFBB
TVxuIiwgZ2V0cGlkKCkpKQorCisgICAgICAgICAgICAgICAgLyogdS0+bmFtZSBrZWVwcyBjcm9u
dGFiIG93bmVyIG5hbWUgd2hpbGUgTE9HTkFNRSBpcyB0aGUgbmFtZQorICAgICAgICAgICAgICAg
ICAqIG9mIHVzZXIgdG8gcnVuIGNvbW1hbmQgb24gYmVoYWxmIG9mLiAgdGhleSBzaG91bGQgYmUg
dGhlCisgICAgICAgICAgICAgICAgICogc2FtZSBmb3IgYSB0YXNrIGZyb20gYSBwZXItdXNlciBj
cm9udGFiLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAo
dS0+bmFtZSwgdXNlcm5tKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2l0KHVzZXJu
bSwgZ2V0cGlkKCksICJ1c2VybmFtZSBhbWJpZ3VpdHkiLCB1LT5uYW1lKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGV4aXQoRVJST1JfRVhJVCk7CisgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgcGFtX2VyciA9IHBhbV9zdGFydCgiY3JvbiIsIHVzZXJubSwgJnBhbWMsICZw
YW1oKTsKKyAgICAgICAgICAgICAgICBpZiAocGFtX2VyciAhPSBQQU1fU1VDQ0VTUykgeworICAg
ICAgICAgICAgICAgICAgICAgICAgbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJlcnJvciIsICJj
YW4ndCBzdGFydCBQQU0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVJST1JfRVhJ
VCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGFtX2VyciA9IHBhbV9h
Y2N0X21nbXQocGFtaCwgUEFNX1NJTEVOVCk7CisgICAgICAgICAgICAgICAgLyogRXhwaXJlZCBw
YXNzd29yZCBzaG91bGRuJ3QgcHJldmVudCB0aGUgam9iIGZyb20gcnVubmluZy4gKi8KKyAgICAg
ICAgICAgICAgICBpZiAocGFtX2VyciAhPSBQQU1fU1VDQ0VTUyAmJiBwYW1fZXJyICE9IFBBTV9O
RVdfQVVUSFRPS19SRVFEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaXQodXNlcm5t
LCBnZXRwaWQoKSwgIlVTRVIiLCAiYWNjb3VudCB1bmF2YWlsYWJsZSIpOworICAgICAgICAgICAg
ICAgICAgICAgICAgZXhpdChFUlJPUl9FWElUKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJcGFt
X2VyciA9IHBhbV9hY2N0X21nbXQocGFtaCwgUEFNX1NJTEVOVCk7Ci0JCS8qIEV4cGlyZWQgcGFz
c3dvcmQgc2hvdWxkbid0IHByZXZlbnQgdGhlIGpvYiBmcm9tIHJ1bm5pbmcuICovCi0JCWlmIChw
YW1fZXJyICE9IFBBTV9TVUNDRVNTICYmIHBhbV9lcnIgIT0gUEFNX05FV19BVVRIVE9LX1JFUUQp
IHsKLQkJCWxvZ19pdCh1c2Vybm0sIGdldHBpZCgpLCAiVVNFUiIsICJhY2NvdW50IHVuYXZhaWxh
YmxlIik7Ci0JCQlleGl0KEVSUk9SX0VYSVQpOwotCQl9Ci0KLQkJcGFtX2VuZChwYW1oLCBwYW1f
ZXJyKTsKLQl9CisgICAgICAgICAgICAgICAgcGFtX2VuZChwYW1oLCBwYW1fZXJyKTsKKyAgICAg
ICAgfQogI2VuZGlmCiAKLSNpZmRlZiBVU0VfU0lHQ0hMRAogCS8qIG91ciBwYXJlbnQgaXMgd2F0
Y2hpbmcgZm9yIG91ciBkZWF0aCBieSBjYXRjaGluZyBTSUdDSExELiAgd2UKIAkgKiBkbyBub3Qg
Y2FyZSB0byB3YXRjaCBmb3Igb3VyIGNoaWxkcmVuJ3MgZGVhdGhzIHRoaXMgd2F5IC0tIHdlCi0J
ICogdXNlIHdhaXQoKSBleHBsaWNpdGx5LiAgc28gd2UgaGF2ZSB0byBkaXNhYmxlIHRoZSBzaWdu
YWwgKHdoaWNoCisJICogdXNlIHdhaXQoKSBleHBsaWNpdGx5LiAgc28gd2UgaGF2ZSB0byByZXNl
dCB0aGUgc2lnbmFsICh3aGljaAogCSAqIHdhcyBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50KS4K
IAkgKi8KIAkodm9pZCkgc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOwotI2Vsc2UKLQkvKiBvbiBz
eXN0ZW0tViBzeXN0ZW1zLCB3ZSBhcmUgaWdub3JpbmcgU0lHQ0xELiAgd2UgaGF2ZSB0byBzdG9w
Ci0JICogaWdub3JpbmcgaXQgbm93IG9yIHRoZSB3YWl0KCkgaW4gY3Jvbl9wY2xvc2UoKSB3b24n
dCB3b3JrLgotCSAqIGJlY2F1c2Ugb2YgdGhpcywgd2UgaGF2ZSB0byB3YWl0KCkgZm9yIG91ciBj
aGlsZHJlbiBoZXJlLCBhcyB3ZWxsLgotCSAqLwotCSh2b2lkKSBzaWduYWwoU0lHQ0xELCBTSUdf
REZMKTsKLSNlbmRpZiAvKkJTRCovCiAKIAkvKiBjcmVhdGUgc29tZSBwaXBlcyB0byB0YWxrIHRv
IG91ciBmdXR1cmUgY2hpbGQKIAkgKi8KIAlwaXBlKHN0ZGluX3BpcGUpOwkvKiBjaGlsZCdzIHN0
ZGluICovCiAJcGlwZShzdGRvdXRfcGlwZSk7CS8qIGNoaWxkJ3Mgc3Rkb3V0ICovCi0KKwkKIAkv
KiBzaW5jZSB3ZSBhcmUgYSBmb3JrZWQgcHJvY2Vzcywgd2UgY2FuIGRpZGRsZSB0aGUgY29tbWFu
ZCBzdHJpbmcKIAkgKiB3ZSB3ZXJlIHBhc3NlZCAtLSBub2JvZHkgZWxzZSBpcyBnb2luZyB0byB1
c2UgaXQgYWdhaW4sIHJpZ2h0PwogCSAqCiAJICogaWYgYSAlIGlzIHByZXNlbnQgaW4gdGhlIGNv
bW1hbmQsIHByZXZpb3VzIGNoYXJhY3RlcnMgYXJlIHRoZQogCSAqIGNvbW1hbmQsIGFuZCBzdWJz
ZXF1ZW50IGNoYXJhY3RlcnMgYXJlIHRoZSBhZGRpdGlvbmFsIGlucHV0IHRvCi0JICogdGhlIGNv
bW1hbmQuICBTdWJzZXF1ZW50ICUncyB3aWxsIGJlIHRyYW5zZm9ybWVkIGludG8gbmV3bGluZXMs
CisJICogdGhlIGNvbW1hbmQuICBBbiBlc2NhcGVkICUgd2lsbCBoYXZlIHRoZSBlc2NhcGUgY2hh
cmFjdGVyIHN0cmlwcGVkCisJICogZnJvbSBpdC4gIFN1YnNlcXVlbnQgJSdzIHdpbGwgYmUgdHJh
bnNmb3JtZWQgaW50byBuZXdsaW5lcywKIAkgKiBidXQgdGhhdCBoYXBwZW5zIGxhdGVyLgotCSAq
Ci0JICogSWYgdGhlcmUgYXJlIGVzY2FwZWQgJSdzLCByZW1vdmUgdGhlIGVzY2FwZSBjaGFyYWN0
ZXIuCiAJICovCiAJLypsb2NhbCovewotCQlyZWdpc3RlciBpbnQgZXNjYXBlZCA9IEZBTFNFOwot
CQlyZWdpc3RlciBpbnQgY2g7Ci0JCXJlZ2lzdGVyIGNoYXIgKnA7CisJCWludCBlc2NhcGVkID0g
RkFMU0U7CisJCWludCBjaDsKKwkJY2hhciAqcDsKIAotCQlmb3IgKGlucHV0X2RhdGEgPSBwID0g
ZS0+Y21kOyAoY2ggPSAqaW5wdXRfZGF0YSk7CisJCWZvciAoaW5wdXRfZGF0YSA9IHAgPSBlLT5j
bWQ7CisJCSAgICAgKGNoID0gKmlucHV0X2RhdGEpICE9ICdcMCc7CiAJCSAgICAgaW5wdXRfZGF0
YSsrLCBwKyspIHsKIAkJCWlmIChwICE9IGlucHV0X2RhdGEpCi0JCQkgICAgKnAgPSBjaDsKKwkJ
CQkqcCA9IGNoOwogCQkJaWYgKGVzY2FwZWQpIHsKLQkJCQlpZiAoY2ggPT0gJyUnIHx8IGNoID09
ICdcXCcpCisJCQkJaWYgKGNoID09ICclJykKIAkJCQkJKi0tcCA9IGNoOwogCQkJCWVzY2FwZWQg
PSBGQUxTRTsKIAkJCQljb250aW51ZTsKQEAgLTIwNSwyNiArMTg5LDI0IEBACiAJICovCiAJc3dp
dGNoICh2Zm9yaygpKSB7CiAJY2FzZSAtMToKLQkJbG9nX2l0KCJDUk9OIixnZXRwaWQoKSwiZXJy
b3IiLCJjYW4ndCB2Zm9yayIpOworCQlsb2dfaXQoIkNST04iLCBnZXRwaWQoKSwgImVycm9yIiwg
ImNhbid0IHZmb3JrIik7CiAJCWV4aXQoRVJST1JfRVhJVCk7CiAJCS8qTk9UUkVBQ0hFRCovCiAJ
Y2FzZSAwOgotCQlEZWJ1ZyhEUFJPQywgKCJbJWRdIGdyYW5kY2hpbGQgcHJvY2VzcyBWZm9yaygp
J2VkXG4iLAotCQkJICAgICAgZ2V0cGlkKCkpKQotCisJCURlYnVnKERQUk9DLCAoIlslbGRdIGdy
YW5kY2hpbGQgcHJvY2VzcyB2Zm9yaygpJ2VkXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkp
KQogCQlpZiAoZS0+dWlkID09IFJPT1RfVUlEKQogCQkJSml0dGVyID0gUm9vdEppdHRlcjsKIAkJ
aWYgKEppdHRlciAhPSAwKSB7CiAJCQlzcmFuZG9tKGdldHBpZCgpKTsKIAkJCXNsZWVwKHJhbmRv
bSgpICUgSml0dGVyKTsKIAkJfQotCiAJCS8qIHdyaXRlIGEgbG9nIG1lc3NhZ2UuICB3ZSd2ZSB3
YWl0ZWQgdGhpcyBsb25nIHRvIGRvIGl0CiAJCSAqIGJlY2F1c2UgaXQgd2FzIG5vdCB1bnRpbCBu
b3cgdGhhdCB3ZSBrbmV3IHRoZSBQSUQgdGhhdAogCQkgKiB0aGUgYWN0dWFsIHVzZXIgY29tbWFu
ZCBzaGVsbCB3YXMgZ29pbmcgdG8gZ2V0IGFuZCB0aGUKIAkJICogUElEIGlzIHBhcnQgb2YgdGhl
IGxvZyBtZXNzYWdlLgogCQkgKi8KLQkJLypsb2NhbCoveworCQlpZiAoKGUtPmZsYWdzICYgRE9O
VF9MT0cpID09IDApIHsKIAkJCWNoYXIgKnggPSBta3ByaW50cygodV9jaGFyICopZS0+Y21kLCBz
dHJsZW4oZS0+Y21kKSk7CiAKIAkJCWxvZ19pdCh1c2Vybm0sIGdldHBpZCgpLCAiQ01EIiwgeCk7
CkBAIC0yMzMsOSArMjE1LDcgQEAKIAogCQkvKiB0aGF0J3MgdGhlIGxhc3QgdGhpbmcgd2UnbGwg
bG9nLiAgY2xvc2UgdGhlIGxvZyBmaWxlcy4KIAkJICovCi0jaWZkZWYgU1lTTE9HCi0JCWNsb3Nl
bG9nKCk7Ci0jZW5kaWYKKwkJbG9nX2Nsb3NlKCk7CiAKIAkJLyogZ2V0IG5ldyBwZ3JwLCB2b2lk
IHR0eSwgZXRjLgogCQkgKi8KQEAgLTI1Myw3NSArMjMzLDc1IEBACiAJCS8qIGdyYW5kY2hpbGQg
cHJvY2Vzcy4gIG1ha2Ugc3Rke2luLG91dH0gYmUgdGhlIGVuZHMgb2YKIAkJICogcGlwZXMgb3Bl
bmVkIGJ5IG91ciBkYWRkeTsgbWFrZSBzdGRlcnIgZ28gdG8gc3Rkb3V0LgogCQkgKi8KLQkJY2xv
c2UoU1RESU4pOwlkdXAyKHN0ZGluX3BpcGVbUkVBRF9QSVBFXSwgU1RESU4pOwotCQljbG9zZShT
VERPVVQpOwlkdXAyKHN0ZG91dF9waXBlW1dSSVRFX1BJUEVdLCBTVERPVVQpOwotCQljbG9zZShT
VERFUlIpOwlkdXAyKFNURE9VVCwgU1RERVJSKTsKLQotCQkvKiBjbG9zZSB0aGUgcGlwZXMgd2Ug
anVzdCBkdXAnZWQuICBUaGUgcmVzb3VyY2VzIHdpbGwgcmVtYWluLgotCQkgKi8KLQkJY2xvc2Uo
c3RkaW5fcGlwZVtSRUFEX1BJUEVdKTsKLQkJY2xvc2Uoc3Rkb3V0X3BpcGVbV1JJVEVfUElQRV0p
OwotCi0JCS8qIHNldCBvdXIgbG9naW4gdW5pdmVyc2UuICBEbyB0aGlzIGluIHRoZSBncmFuZGNo
aWxkCi0JCSAqIHNvIHRoYXQgdGhlIGNoaWxkIGNhbiBpbnZva2UgL3Vzci9saWIvc2VuZG1haWwK
LQkJICogd2l0aG91dCBzdXJwcmlzZXMuCi0JCSAqLwotCQlkb191bml2KHUpOwotCi0jIGlmIGRl
ZmluZWQoTE9HSU5fQ0FQKQotCQkvKiBTZXQgdXNlcidzIGVudGlyZSBjb250ZXh0LCBidXQgc2tp
cCB0aGUgZW52aXJvbm1lbnQKLQkJICogYXMgY3JvbiBwcm92aWRlcyBhIHNlcGFyYXRlIGludGVy
ZmFjZSBmb3IgdGhpcwotCQkgKi8KLQkJaWYgKChwd2QgPSBnZXRwd25hbSh1c2Vybm0pKSA9PSBO
VUxMKQotCQkJcHdkID0gZ2V0cHd1aWQoZS0+dWlkKTsKLQkJbGMgPSBOVUxMOwotCQlpZiAocHdk
ICE9IE5VTEwpIHsKLQkJCXB3ZC0+cHdfZ2lkID0gZS0+Z2lkOwotCQkJaWYgKGUtPmNsYXNzICE9
IE5VTEwpCi0JCQkJbGMgPSBsb2dpbl9nZXRjbGFzcyhlLT5jbGFzcyk7Ci0JCX0KLQkJaWYgKHB3
ZCAmJgotCQkgICAgc2V0dXNlcmNvbnRleHQobGMsIHB3ZCwgZS0+dWlkLAotCQkJICAgIExPR0lO
X1NFVEFMTCAmIH4oTE9HSU5fU0VUUEFUSHxMT0dJTl9TRVRFTlYpKSA9PSAwKQotCQkJKHZvaWQp
IGVuZHB3ZW50KCk7Ci0JCWVsc2UgewotCQkJLyogZmFsbCBiYWNrIHRvIHRoZSBvbGQgbWV0aG9k
ICovCi0JCQkodm9pZCkgZW5kcHdlbnQoKTsKLSMgZW5kaWYKLQkJCS8qIHNldCBvdXIgZGlyZWN0
b3J5LCB1aWQgYW5kIGdpZC4gIFNldCBnaWQgZmlyc3QsCi0JCQkgKiBzaW5jZSBvbmNlIHdlIHNl
dCB1aWQsIHdlJ3ZlIGxvc3Qgcm9vdCBwcml2aWxlZ2VzLgotCQkJICovCi0JCQlpZiAoc2V0Z2lk
KGUtPmdpZCkgIT0gMCkgewotCQkJCWxvZ19pdCh1c2Vybm0sIGdldHBpZCgpLAotCQkJCSAgICAi
ZXJyb3IiLCAic2V0Z2lkIGZhaWxlZCIpOwotCQkJCWV4aXQoRVJST1JfRVhJVCk7Ci0JCQl9CisJ
CWlmIChzdGRpbl9waXBlW1JFQURfUElQRV0gIT0gU1RESU4pIHsKKwkJCWR1cDIoc3RkaW5fcGlw
ZVtSRUFEX1BJUEVdLCBTVERJTik7CisJCQljbG9zZShzdGRpbl9waXBlW1JFQURfUElQRV0pOwor
CQl9CisJCWlmIChzdGRvdXRfcGlwZVtXUklURV9QSVBFXSAhPSBTVERPVVQpIHsKKwkJCWR1cDIo
c3Rkb3V0X3BpcGVbV1JJVEVfUElQRV0sIFNURE9VVCk7CisJCQljbG9zZShzdGRvdXRfcGlwZVtX
UklURV9QSVBFXSk7CisJCX0KKwkJZHVwMihTVERPVVQsIFNUREVSUik7CisKKworI2lmZGVmIExP
R0lOX0NBUAorIC8qIFNldCB1c2VyJ3MgZW50aXJlIGNvbnRleHQsIGJ1dCBza2lwIHRoZSBlbnZp
cm9ubWVudAorICAgICAgICAgICAgICAgICAqIGFzIGNyb24gcHJvdmlkZXMgYSBzZXBhcmF0ZSBp
bnRlcmZhY2UgZm9yIHRoaXMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBp
ZiAoKHB3ZCA9IGdldHB3bmFtKHVzZXJubSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAg
ICAgICBwd2QgPSBnZXRwd3VpZChlLT51aWQpOworICAgICAgICAgICAgICAgIGxjID0gTlVMTDsK
KyAgICAgICAgICAgICAgICBpZiAocHdkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHB3ZC0+cHdfZ2lkID0gZS0+Z2lkOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUt
PmNsYXNzICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjID0gbG9n
aW5fZ2V0Y2xhc3MoZS0+Y2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBpZiAocHdkICYmCisgICAgICAgICAgICAgICAgICAgIHNldHVzZXJjb250ZXh0KGxjLCBwd2Qs
IGUtPnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dJTl9TRVRBTEwgJiB+KExP
R0lOX1NFVFBBVEh8TE9HSU5fU0VURU5WKSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAg
ICh2b2lkKSBlbmRwd2VudCgpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
ICAgICAgICAgICAgLyogZmFsbCBiYWNrIHRvIHRoZSBvbGQgbWV0aG9kICovCisgICAgICAgICAg
ICAgICAgICAgICAgICAodm9pZCkgZW5kcHdlbnQoKTsKKworCisjZW5kaWYgLyogTE9HSU5fQ0FQ
ICovCisgICAgICAgICAgICAgICAgICAgIC8qIHNldCBvdXIgZGlyZWN0b3J5LCB1aWQgYW5kIGdp
ZC4gIFNldCBnaWQgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSBvbmNl
IHdlIHNldCB1aWQsIHdlJ3ZlIGxvc3Qgcm9vdCBwcml2aWxlZ2VzLgorICAgICAgICAgICAgICAg
ICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0Z2lkKGUtPmdpZCkg
IT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaXQodXNlcm5tLCBn
ZXRwaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciIsICJz
ZXRnaWQgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVJS
T1JfRVhJVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAjIGlmIGRlZmluZWQoQlNEKQot
CQkJaWYgKGluaXRncm91cHModXNlcm5tLCBlLT5naWQpICE9IDApIHsKLQkJCQlsb2dfaXQodXNl
cm5tLCBnZXRwaWQoKSwKLQkJCQkgICAgImVycm9yIiwgImluaXRncm91cHMgZmFpbGVkIik7Ci0J
CQkJZXhpdChFUlJPUl9FWElUKTsKLQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChp
bml0Z3JvdXBzKHVzZXJubSwgZS0+Z2lkKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGxvZ19pdCh1c2Vybm0sIGdldHBpZCgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgImVycm9yIiwgImluaXRncm91cHMgZmFpbGVkIik7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVJST1JfRVhJVCk7CisgICAgICAgICAgICAgICAg
ICAgICAgICB9CiAjIGVuZGlmCi0JCQlpZiAoc2V0bG9naW4odXNlcm5tKSAhPSAwKSB7Ci0JCQkJ
bG9nX2l0KHVzZXJubSwgZ2V0cGlkKCksCi0JCQkJICAgICJlcnJvciIsICJzZXRsb2dpbiBmYWls
ZWQiKTsKLQkJCQlleGl0KEVSUk9SX0VYSVQpOwotCQkJfQotCQkJaWYgKHNldHVpZChlLT51aWQp
ICE9IDApIHsKLQkJCQlsb2dfaXQodXNlcm5tLCBnZXRwaWQoKSwKLQkJCQkgICAgImVycm9yIiwg
InNldHVpZCBmYWlsZWQiKTsKLQkJCQlleGl0KEVSUk9SX0VYSVQpOwotCQkJfQotCQkJLyogd2Ug
YXJlbid0IHJvb3QgYWZ0ZXIgdGhpcy4uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChz
ZXRsb2dpbih1c2Vybm0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bG9nX2l0KHVzZXJubSwgZ2V0cGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAiZXJyb3IiLCAic2V0bG9naW4gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGV4aXQoRVJST1JfRVhJVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dWlkKGUtPnVpZCkgIT0gMCkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaXQodXNlcm5tLCBnZXRwaWQoKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciIsICJzZXR1aWQgZmFpbGVkIik7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVJST1JfRVhJVCk7CisgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmVu
J3Qgcm9vdCBhZnRlciB0aGlzLi4qLwogI2lmIGRlZmluZWQoTE9HSU5fQ0FQKQotCQl9Ci0JCWlm
IChsYyAhPSBOVUxMKQotCQkJbG9naW5fY2xvc2UobGMpOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICBpZiAobGMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxv
Z2luX2Nsb3NlKGxjKTsKICNlbmRpZgorCiAJCWNoZGlyKGVudl9nZXQoIkhPTUUiLCBlLT5lbnZw
KSk7CiAKLQkJLyogZXhlYyB0aGUgY29tbWFuZC4KKwkJLyoKKwkJICogRXhlYyB0aGUgY29tbWFu
ZC4KIAkJICovCiAJCXsKIAkJCWNoYXIJKnNoZWxsID0gZW52X2dldCgiU0hFTEwiLCBlLT5lbnZw
KTsKQEAgLTMzNiw3ICszMTYsOCBAQAogCQkJfQogIyBlbmRpZiAvKkRFQlVHR0lORyovCiAJCQll
eGVjbGUoc2hlbGwsIHNoZWxsLCAiLWMiLCBlLT5jbWQsIChjaGFyICopMCwgZS0+ZW52cCk7Ci0J
CQl3YXJuKCJleGVjbDogY291bGRuJ3QgZXhlYyBgJXMnIiwgc2hlbGwpOworCQkJZnByaW50Zihz
dGRlcnIsICJleGVjbDogY291bGRuJ3QgZXhlYyBgJXMnXG4iLCBzaGVsbCk7CisJCQlwZXJyb3Io
ImV4ZWNsIik7CiAJCQlfZXhpdChFUlJPUl9FWElUKTsKIAkJfQogCQlicmVhazsKQEAgLTM1MSw3
ICszMzIsNyBAQAogCSAqIHRoZSB1c2VyJ3MgY29tbWFuZC4KIAkgKi8KIAotCURlYnVnKERQUk9D
LCAoIlslZF0gY2hpbGQgY29udGludWVzLCBjbG9zaW5nIHBpcGVzXG4iLCBnZXRwaWQoKSkpCisJ
RGVidWcoRFBST0MsICgiWyVsZF0gY2hpbGQgY29udGludWVzLCBjbG9zaW5nIHBpcGVzXG4iLChs
b25nKWdldHBpZCgpKSkKIAogCS8qIGNsb3NlIHRoZSBlbmRzIG9mIHRoZSBwaXBlIHRoYXQgd2ls
bCBvbmx5IGJlIHJlZmVyZW5jZWQgaW4gdGhlCiAJICogZ3JhbmRjaGlsZCBwcm9jZXNzLi4uCkBA
IC0zNzEsMTcgKzM1MiwxOCBAQAogCSAqLwogCiAJaWYgKCppbnB1dF9kYXRhICYmIGZvcmsoKSA9
PSAwKSB7Ci0JCXJlZ2lzdGVyIEZJTEUJKm91dCA9IGZkb3BlbihzdGRpbl9waXBlW1dSSVRFX1BJ
UEVdLCAidyIpOwotCQlyZWdpc3RlciBpbnQJbmVlZF9uZXdsaW5lID0gRkFMU0U7Ci0JCXJlZ2lz
dGVyIGludAllc2NhcGVkID0gRkFMU0U7Ci0JCXJlZ2lzdGVyIGludAljaDsKKwkJRklMRSAqb3V0
ID0gZmRvcGVuKHN0ZGluX3BpcGVbV1JJVEVfUElQRV0sICJ3Iik7CisJCWludCBuZWVkX25ld2xp
bmUgPSBGQUxTRTsKKwkJaW50IGVzY2FwZWQgPSBGQUxTRTsKKwkJaW50IGNoOwogCiAJCWlmIChv
dXQgPT0gTlVMTCkgewotCQkJd2FybigiZmRvcGVuIGZhaWxlZCBpbiBjaGlsZDIiKTsKKwkJCXdh
cm4oImZkb3BlbiBpbiBjaGlsZDIiKTsKIAkJCV9leGl0KEVSUk9SX0VYSVQpOwogCQl9CiAKLQkJ
RGVidWcoRFBST0MsICgiWyVkXSBjaGlsZDIgc2VuZGluZyBkYXRhIHRvIGdyYW5kY2hpbGRcbiIs
IGdldHBpZCgpKSkKKwkJRGVidWcoRFBST0MsICgiWyVsZF0gY2hpbGQyIHNlbmRpbmcgZGF0YSB0
byBncmFuZGNoaWxkXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkpKQogCiAJCS8qIGNsb3Nl
IHRoZSBwaXBlIHdlIGRvbid0IHVzZSwgc2luY2Ugd2UgaW5oZXJpdGVkIGl0IGFuZAogCQkgKiBh
cmUgcGFydCBvZiBpdHMgcmVmZXJlbmNlIGNvdW50IG5vdy4KQEAgLTM5Myw3ICszNzUsNyBAQAog
CQkgKgklICAtPiBcbgogCQkgKglceCAtPiBceAlmb3IgYWxsIHggIT0gJQogCQkgKi8KLQkJd2hp
bGUgKChjaCA9ICppbnB1dF9kYXRhKyspKSB7CisJCXdoaWxlICgoY2ggPSAqaW5wdXRfZGF0YSsr
KSAhPSAnXDAnKSB7CiAJCQlpZiAoZXNjYXBlZCkgewogCQkJCWlmIChjaCAhPSAnJScpCiAJCQkJ
CXB1dGMoJ1xcJywgb3V0KTsKQEAgLTQxNyw3ICszOTksOCBAQAogCQkgKi8KIAkJZmNsb3NlKG91
dCk7CiAKLQkJRGVidWcoRFBST0MsICgiWyVkXSBjaGlsZDIgZG9uZSBzZW5kaW5nIHRvIGdyYW5k
Y2hpbGRcbiIsIGdldHBpZCgpKSkKKwkJRGVidWcoRFBST0MsICgiWyVsZF0gY2hpbGQyIGRvbmUg
c2VuZGluZyB0byBncmFuZGNoaWxkXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkpKQogCQll
eGl0KDApOwogCX0KIApAQCAtNDM1LDU3ICs0MTgsNjcgQEAKIAkgKiB3aGVuIHRoZSBncmFuZGNo
aWxkIGV4aXRzLCB3ZSdsbCBnZXQgRU9GLgogCSAqLwogCi0JRGVidWcoRFBST0MsICgiWyVkXSBj
aGlsZCByZWFkaW5nIG91dHB1dCBmcm9tIGdyYW5kY2hpbGRcbiIsIGdldHBpZCgpKSkKKwlEZWJ1
ZyhEUFJPQywgKCJbJWxkXSBjaGlsZCByZWFkaW5nIG91dHB1dCBmcm9tIGdyYW5kY2hpbGRcbiIs
CisJCSAgICAgIChsb25nKWdldHBpZCgpKSkKIAogCS8qbG9jYWwqL3sKLQkJcmVnaXN0ZXIgRklM
RQkqaW4gPSBmZG9wZW4oc3Rkb3V0X3BpcGVbUkVBRF9QSVBFXSwgInIiKTsKLQkJcmVnaXN0ZXIg
aW50CWNoOworCQlGSUxFCSppbiA9IGZkb3BlbihzdGRvdXRfcGlwZVtSRUFEX1BJUEVdLCAiciIp
OworCQlpbnQJY2ggPSBnZXRjKGluKTsKIAogCQlpZiAoaW4gPT0gTlVMTCkgewogCQkJd2Fybigi
ZmRvcGVuIGZhaWxlZCBpbiBjaGlsZCIpOwogCQkJX2V4aXQoRVJST1JfRVhJVCk7CiAJCX0KIAot
CQljaCA9IGdldGMoaW4pOwogCQlpZiAoY2ggIT0gRU9GKSB7Ci0JCQlyZWdpc3RlciBGSUxFCSpt
YWlsOwotCQkJcmVnaXN0ZXIgaW50CWJ5dGVzID0gMTsKLQkJCWludAkJc3RhdHVzID0gMDsKKwkJ
CUZJTEUJKm1haWw7CisJCQlpbnQJYnl0ZXMgPSAxOworCQkJaW50CXN0YXR1cyA9IDA7CiAKIAkJ
CURlYnVnKERQUk9DfERFWFQsCi0JCQkJKCJbJWRdIGdvdCBkYXRhICgleDolYykgZnJvbSBncmFu
ZGNoaWxkXG4iLAotCQkJCQlnZXRwaWQoKSwgY2gsIGNoKSkKKwkJCSAgICAgICgiWyVsZF0gZ290
IGRhdGEgKCV4OiVjKSBmcm9tIGdyYW5kY2hpbGRcbiIsCisJCQkgICAgICAgKGxvbmcpZ2V0cGlk
KCksIGNoLCBjaCkpCiAKIAkJCS8qIGdldCBuYW1lIG9mIHJlY2lwaWVudC4gIHRoaXMgaXMgTUFJ
TFRPIGlmIHNldCB0byBhCiAJCQkgKiB2YWxpZCBsb2NhbCB1c2VybmFtZTsgVVNFUiBvdGhlcndp
c2UuCiAJCQkgKi8KLQkJCWlmIChtYWlsdG8gPT0gTlVMTCkgewotCQkJCS8qIE1BSUxUTyBub3Qg
cHJlc2VudCwgc2V0IHRvIFVTRVIsCi0JCQkJICogdW5sZXNzIGdsb2JhbGx5IG92ZXJyaWRlbi4K
KwkJCWlmKG1haWx0byA9PSBOVUxMKSB7CisJCQkJLypNQUlMVE8gbm90IHByZXNlbnQsIHNldCB0
byBVU0VSLAorCQkJCSAqIHVubGVzcyBnbG9iYWxseSBvdmVycmlkZW4KIAkJCQkgKi8KLQkJCQlp
ZiAoZGVmbWFpbHRvKQorCQkJCWlmICghKm1haWx0bykgeworCQkJCQkvKiAuLi4gYnV0IGl0J3Mg
ZW1wdHkuIHNldCB0byBOVUxMCisJCQkJCSAqLworCQkJCQltYWlsdG8gPSBOVUxMOworCQkJCX0K
KwkJCX0gZWxzZSB7CisJCQkJLyogTUFJTFRPIG5vdCBwcmVzZW50LCBzZXQgdG8gVVNFUi4KKwkJ
CQkgKi8KKwkJCQlpZiAoZGVmbWFpbHRvKSAKIAkJCQkJbWFpbHRvID0gZGVmbWFpbHRvOwotCQkJ
CWVsc2UKKwkJCQllbHNlIAogCQkJCQltYWlsdG8gPSB1c2Vybm07CiAJCQl9Ci0JCQlpZiAobWFp
bHRvICYmICptYWlsdG8gPT0gJ1wwJykKLQkJCQltYWlsdG8gPSBOVUxMOwotCisJCQogCQkJLyog
aWYgd2UgYXJlIHN1cHBvc2VkIHRvIGJlIG1haWxpbmcsIE1BSUxUTyB3aWxsCiAJCQkgKiBiZSBu
b24tTlVMTC4gIG9ubHkgaW4gdGhpcyBjYXNlIHNob3VsZCB3ZSBzZXQKIAkJCSAqIHVwIHRoZSBt
YWlsIGNvbW1hbmQgYW5kIHN1YmplY3RzIGFuZCBzdHVmZi4uLgogCQkJICovCiAKLQkJCWlmICht
YWlsdG8pIHsKLQkJCQlyZWdpc3RlciBjaGFyCSoqZW52OwotCQkJCWF1dG8gY2hhcgltYWlsY21k
W01BWF9DT01NQU5EXTsKLQkJCQlhdXRvIGNoYXIJaG9zdG5hbWVbTUFYSE9TVE5BTUVMRU5dOwot
Ci0JCQkJKHZvaWQpIGdldGhvc3RuYW1lKGhvc3RuYW1lLCBNQVhIT1NUTkFNRUxFTik7Ci0JCQkJ
KHZvaWQpIHNucHJpbnRmKG1haWxjbWQsIHNpemVvZihtYWlsY21kKSwKLQkJCQkJICAgICAgIE1B
SUxBUkdTLCBNQUlMQ01EKTsKKwkJCWlmIChtYWlsdG8gJiYgc2FmZV9wKHVzZXJubSwgbWFpbHRv
KSkgeworCQkJCWNoYXIJKiplbnY7CisJCQkJY2hhcgltYWlsY21kW01BWF9DT01NQU5EXTsKKwkJ
CQljaGFyCWhvc3RuYW1lW01BWEhPU1ROQU1FTEVOXTsKKworCQkJCWdldGhvc3RuYW1lKGhvc3Ru
YW1lLCBNQVhIT1NUTkFNRUxFTik7CisJCQkJaWYgKHN0cmxlbnMoTUFJTEZNVCwgTUFJTEFSRywg
TlVMTCkgKyAxCisJCQkJICAgID49IHNpemVvZiBtYWlsY21kKSB7CisJCQkJCWZwcmludGYoc3Rk
ZXJyLCAibWFpbGNtZCB0b28gbG9uZ1xuIik7CisJCQkJCSh2b2lkKSBfZXhpdChFUlJPUl9FWElU
KTsKKwkJCQl9CisJCQkJKHZvaWQpc3ByaW50ZihtYWlsY21kLCBNQUlMRk1ULCBNQUlMQVJHKTsK
IAkJCQlpZiAoIShtYWlsID0gY3Jvbl9wb3BlbihtYWlsY21kLCAidyIsIGUpKSkgewotCQkJCQl3
YXJuKCIlcyIsIE1BSUxDTUQpOworCQkJCQl3YXJuKCIlcyIsIG1haWxjbWQpOwogCQkJCQkodm9p
ZCkgX2V4aXQoRVJST1JfRVhJVCk7CiAJCQkJfQogCQkJCWZwcmludGYobWFpbCwgIkZyb206ICVz
IChDcm9uIERhZW1vbilcbiIsIHVzZXJubSk7CkBAIC00OTMsMTAgKzQ4NiwxMCBAQAogCQkJCWZw
cmludGYobWFpbCwgIlN1YmplY3Q6IENyb24gPCVzQCVzPiAlc1xuIiwKIAkJCQkJdXNlcm5tLCBm
aXJzdF93b3JkKGhvc3RuYW1lLCAiLiIpLAogCQkJCQllLT5jbWQpOwotIyBpZiBkZWZpbmVkKE1B
SUxfREFURSkKKyNpZmRlZiBNQUlMX0RBVEUKIAkJCQlmcHJpbnRmKG1haWwsICJEYXRlOiAlc1xu
IiwKLQkJCQkJYXJwYWRhdGUoJlRhcmdldFRpbWUpKTsKLSMgZW5kaWYgLyogTUFJTF9EQVRFICov
CisJCQkJCWFycGFkYXRlKCZTdGFydFRpbWUpKTsKKyNlbmRpZiAvKk1BSUxfREFURSovCiAJCQkJ
Zm9yIChlbnYgPSBlLT5lbnZwOyAgKmVudjsgIGVudisrKQogCQkJCQlmcHJpbnRmKG1haWwsICJY
LUNyb24tRW52OiA8JXM+XG4iLAogCQkJCQkJKmVudik7CkBAIC01MjMsOCArNTE2LDggQEAKIAkJ
CSAqLwogCiAJCQlpZiAobWFpbHRvKSB7Ci0JCQkJRGVidWcoRFBST0MsICgiWyVkXSBjbG9zaW5n
IHBpcGUgdG8gbWFpbFxuIiwKLQkJCQkJZ2V0cGlkKCkpKQorCQkJCURlYnVnKERQUk9DLCAoIlsl
bGRdIGNsb3NpbmcgcGlwZSB0byBtYWlsXG4iLAorCQkJCQkgICAgICAobG9uZylnZXRwaWQoKSkp
CiAJCQkJLyogTm90ZTogdGhlIHBjbG9zZSB3aWxsIHByb2JhYmx5IHNlZQogCQkJCSAqIHRoZSB0
ZXJtaW5hdGlvbiBvZiB0aGUgZ3JhbmRjaGlsZAogCQkJCSAqIGluIGFkZGl0aW9uIHRvIHRoZSBt
YWlsIHByb2Nlc3MsIHNpbmNlCkBAIC01NDEsNyArNTM0LDcgQEAKIAkJCWlmIChtYWlsdG8gJiYg
c3RhdHVzKSB7CiAJCQkJY2hhciBidWZbTUFYX1RFTVBTVFJdOwogCi0JCQkJc25wcmludGYoYnVm
LCBzaXplb2YoYnVmKSwKKwkJCQlzcHJpbnRmKGJ1ZiwKIAkJCSJtYWlsZWQgJWQgYnl0ZSVzIG9m
IG91dHB1dCBidXQgZ290IHN0YXR1cyAweCUwNHhcbiIsCiAJCQkJCWJ5dGVzLCAoYnl0ZXM9PTEp
PyIiOiJzIiwKIAkJCQkJc3RhdHVzKTsKQEAgLTU1MCw2OCArNTQzLDQ4IEBACiAKIAkJfSAvKmlm
IGRhdGEgZnJvbSBncmFuZGNoaWxkKi8KIAotCQlEZWJ1ZyhEUFJPQywgKCJbJWRdIGdvdCBFT0Yg
ZnJvbSBncmFuZGNoaWxkXG4iLCBnZXRwaWQoKSkpCisJCURlYnVnKERQUk9DLCAoIlslbGRdIGdv
dCBFT0YgZnJvbSBncmFuZGNoaWxkXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkpKQogCiAJ
CWZjbG9zZShpbik7CS8qIGFsc28gY2xvc2VzIHN0ZG91dF9waXBlW1JFQURfUElQRV0gKi8KIAl9
CiAKIAkvKiB3YWl0IGZvciBjaGlsZHJlbiB0byBkaWUuCiAJICovCi0JZm9yICg7ICBjaGlsZHJl
biA+IDA7ICBjaGlsZHJlbi0tKQotCXsKLQkJV0FJVF9UCQl3YWl0ZXI7Ci0JCVBJRF9UCQlwaWQ7
Ci0KLQkJRGVidWcoRFBST0MsICgiWyVkXSB3YWl0aW5nIGZvciBncmFuZGNoaWxkICMlZCB0byBm
aW5pc2hcbiIsCi0JCQlnZXRwaWQoKSwgY2hpbGRyZW4pKQotCQlwaWQgPSB3YWl0KCZ3YWl0ZXIp
OworCWZvciAoOyBjaGlsZHJlbiA+IDA7IGNoaWxkcmVuLS0pIHsKKwkJV0FJVF9UIHdhaXRlcjsK
KwkJUElEX1QgcGlkOworCisJCURlYnVnKERQUk9DLCAoIlslbGRdIHdhaXRpbmcgZm9yIGdyYW5k
Y2hpbGQgIyVkIHRvIGZpbmlzaFxuIiwKKwkJCSAgICAgIChsb25nKWdldHBpZCgpLCBjaGlsZHJl
bikpCisJCXdoaWxlICgocGlkID0gd2FpdCgmd2FpdGVyKSkgPCBPSyAmJiBlcnJubyA9PSBFSU5U
UikKKwkJCTsKIAkJaWYgKHBpZCA8IE9LKSB7Ci0JCQlEZWJ1ZyhEUFJPQywgKCJbJWRdIG5vIG1v
cmUgZ3JhbmRjaGlsZHJlbi0tbWFpbCB3cml0dGVuP1xuIiwKLQkJCQlnZXRwaWQoKSkpCisJCQlE
ZWJ1ZyhEUFJPQywKKwkJCSAgICAgICgiWyVsZF0gbm8gbW9yZSBncmFuZGNoaWxkcmVuLS1tYWls
IHdyaXR0ZW4/XG4iLAorCQkJICAgICAgIChsb25nKWdldHBpZCgpKSkKIAkJCWJyZWFrOwogCQl9
Ci0JCURlYnVnKERQUk9DLCAoIlslZF0gZ3JhbmRjaGlsZCAjJWQgZmluaXNoZWQsIHN0YXR1cz0l
MDR4IiwKLQkJCWdldHBpZCgpLCBwaWQsIFdFWElUU1RBVFVTKHdhaXRlcikpKQorCQlEZWJ1ZyhE
UFJPQywgKCJbJWxkXSBncmFuZGNoaWxkICMlbGQgZmluaXNoZWQsIHN0YXR1cz0lMDR4IiwKKwkJ
CSAgICAgIChsb25nKWdldHBpZCgpLCAobG9uZylwaWQsIFdFWElUU1RBVFVTKHdhaXRlcikpKQog
CQlpZiAoV0lGU0lHTkFMRUQod2FpdGVyKSAmJiBXQ09SRURVTVAod2FpdGVyKSkKIAkJCURlYnVn
KERQUk9DLCAoIiwgZHVtcGVkIGNvcmUiKSkKIAkJRGVidWcoRFBST0MsICgiXG4iKSkKIAl9CiB9
CiAKLQotc3RhdGljIHZvaWQKLWRvX3VuaXYodSkKLQl1c2VyCSp1OwotewotI2lmIGRlZmluZWQo
c2VxdWVudCkKLS8qIER5bml4IChTZXF1ZW50KSBoYWNrIHRvIHB1dCB0aGUgdXNlciBhc3NvY2lh
dGVkIHdpdGgKLSAqIHRoZSBwYXNzZWQgdXNlciBzdHJ1Y3R1cmUgaW50byB0aGUgQVRUIHVuaXZl
cnNlIGlmCi0gKiBuZWNlc3NhcnkuICBXZSBoYXZlIHRvIGRpZyB0aGUgZ2Vjb3MgaW5mbyBvdXQg
b2YKLSAqIHRoZSB1c2VyJ3MgcGFzc3dvcmQgZW50cnkgdG8gc2VlIGlmIHRoZSBtYWdpYwotICog
InVuaXZlcnNlKGF0dCkiIHN0cmluZyBpcyBwcmVzZW50LgotICovCi0KLQlzdHJ1Y3QJcGFzc3dk
CSpwOwotCWNoYXIJKnM7Ci0JaW50CWk7Ci0KLQlwID0gZ2V0cHd1aWQodS0+dWlkKTsKLQkodm9p
ZCkgZW5kcHdlbnQoKTsKLQotCWlmIChwID09IE5VTEwpCi0JCXJldHVybjsKLQotCXMgPSBwLT5w
d19nZWNvczsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JewotCQlpZiAoKHMgPSBzdHJj
aHIocywgJywnKSkgPT0gTlVMTCkKLQkJCXJldHVybjsKLQkJcysrOworc3RhdGljIGludAorc2Fm
ZV9wKGNvbnN0IGNoYXIgKnVzZXJubSwgY29uc3QgY2hhciAqcykgeworCXN0YXRpYyBjb25zdCBj
aGFyIHNhZmVfZGVsaW1bXSA9ICJAITolLS4sIjsgICAgIC8qIGNvbnNlcnZhdGl2ZSEgKi8KKwlj
b25zdCBjaGFyICp0OworCWludCBjaCwgZmlyc3Q7CisKKwlmb3IgKHQgPSBzLCBmaXJzdCA9IDE7
IChjaCA9ICp0KyspICE9ICdcMCc7IGZpcnN0ID0gMCkgeworCQlpZiAoaXNhc2NpaShjaCkgJiYg
aXNwcmludChjaCkgJiYKKwkJICAgIChpc2FsbnVtKGNoKSB8fCAoIWZpcnN0ICYmIHN0cmNocihz
YWZlX2RlbGltLCBjaCkpKSkKKwkJCWNvbnRpbnVlOworCQlsb2dfaXQodXNlcm5tLCBnZXRwaWQo
KSwgIlVOU0FGRSIsIHMpOworCQlyZXR1cm4gKEZBTFNFKTsKIAl9Ci0JaWYgKHN0cmNtcChzLCAi
dW5pdmVyc2UoYXR0KSIpKQotCQlyZXR1cm47Ci0KLQkodm9pZCkgdW5pdmVyc2UoVV9BVFQpOwot
I2VuZGlmCisJcmV0dXJuIChUUlVFKTsKIH0KZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Ny
b24vY3Jvbi9leHRlcm5zLmggZnJlZWJzZF9jcm9uL2Nyb24vZXh0ZXJucy5oCi0tLSAvdXNyL3Ny
Yy91c3Iuc2Jpbi9jcm9uL2Nyb24vZXh0ZXJucy5oCTIwMTQtMDEtMTYgMjE6NDM6NDkuMDAwMDAw
MDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vY3Jvbi9leHRlcm5zLmgJMjAxNC0wNi0xMSAxNjo0
Mjo1NS4yNzI0NDQyNzYgKzAyMDAKQEAgLTEsNzggKzEsMTA0IEBACi0vKgkkRnJlZUJTRDogcmVs
ZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9jcm9uL2V4dGVybnMuaCAxNzM0MTIgMjAwNy0xMS0w
NyAxMDo1Mzo0MVoga2V2bG8gJAkqLwotCiAvKiBDb3B5cmlnaHQgMTk5MywxOTk0IGJ5IFBhdWwg
Vml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChj
KSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAoIklTQyIpCisgKiBD
b3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLCBJ
bmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDogZG9uJ3QgcmVtb3ZlIG15IG5h
bWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9uIChkb24ndCB0YWtlIGNyZWRp
dCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24ndAotICogZ2V0IG1lIGJsYW1l
ZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIgb3IgcmVtb3ZlIHRoaXMKLSAq
IG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3VyY2UgaXMgcHJvdmlkZWQgdG8g
YnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBleHByZXNzIG9yIGltcGxpZWQs
IGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVzZSBhdCB5b3VyIG93biByaXNr
LCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0bwotICogYW55b25lIHJlc3Vs
dGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0cyBlbnRpcmVseSB3aXRoIHRo
ZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0
cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQg
ZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJp
Z2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGll
cy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMsIGVuaGFuY2VtZW50cywgcmVx
dWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0byBrZWVwIGEgdmVyc2lvbiB1
cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dzOgotICogUGF1bCBWaXhpZSAg
ICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFkZWN3cmwhdml4aWUhcGF1bAor
ICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElTQyBESVNDTEFJTVMgQUxM
IFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFM
TCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4g
IElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElS
RUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisg
KiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMs
IFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhF
UiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ
VEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKLSNpZiBk
ZWZpbmVkKFBPU0lYKSB8fCBkZWZpbmVkKEFUVCkKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGlu
Y2x1ZGUgPHVuaXN0ZC5oPgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgaW5jbHVkZSA8ZGlyZW50
Lmg+Ci0jIGRlZmluZSBESVJfVAlzdHJ1Y3QgZGlyZW50Ci0jIGRlZmluZSBXQUlUX1QJaW50Ci0j
IGRlZmluZSBXQUlUX0lTX0lOVCAxCisvKiByZW9yZGVyIHRoZXNlICNpbmNsdWRlJ3MgYXQgeW91
ciBwZXJpbCAqLworCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVz
Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1
ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c3lzL3N0
YXQuaD4KKworI2luY2x1ZGUgPGJpdHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaWZu
ZGVmIGlzYXNjaWkKKyNkZWZpbmUgaXNhc2NpaShjKSAgICAgICgodW5zaWduZWQpKGMpPD0wMTc3
KQorI2VuZGlmCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNs
dWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGdycC5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2lu
Y2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgor
I2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5n
Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0
aW1lLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+
CisjaW5jbHVkZSA8c3lzL3VuLmg+CisKKworI2lmIGRlZmluZWQoU1lTTE9HKQorIyBpbmNsdWRl
IDxzeXNsb2cuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChMT0dJTl9DQVApCisjIGluY2x1ZGUg
PGxvZ2luX2NhcC5oPgorI2VuZGlmIC8qTE9HSU5fQ0FQKi8KKworI2lmIGRlZmluZWQoQlNEX0FV
VEgpCisjIGluY2x1ZGUgPGJzZF9hdXRoLmg+CisjZW5kaWYgLypCU0RfQVVUSCovCisKKyNkZWZp
bmUgRElSX1QJc3RydWN0IGRpcmVudAorI2RlZmluZSBXQUlUX1QJaW50CisjZGVmaW5lIFNJR19U
CXNpZ190CisjZGVmaW5lIFRJTUVfVAl0aW1lX3QKKyNkZWZpbmUgUElEX1QJcGlkX3QKKworI2lm
bmRlZiBUWk5BTUVfQUxSRUFEWV9ERUZJTkVECiBleHRlcm4gY2hhciAqdHpuYW1lWzJdOwotIyBk
ZWZpbmUgVFpPTkUodG0pIHR6bmFtZVsodG0pLnRtX2lzZHN0XQogI2VuZGlmCisjZGVmaW5lIFRa
T05FKHRtKSB0em5hbWVbKHRtKS50bV9pc2RzdF0KIAotI2lmIGRlZmluZWQoVU5JWFBDKQotIyB1
bmRlZiBXQUlUX1QKLSMgdW5kZWYgV0FJVF9JU19JTlQKLSMgZGVmaW5lIFdBSVRfVAl1bmlvbiB3
YWl0Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE9TSVgpCi0jIGRlZmluZSBTSUdfVAlzaWdfdAot
IyBkZWZpbmUgVElNRV9UCXRpbWVfdAotIyBkZWZpbmUgUElEX1QgcGlkX3QKLSNlbmRpZgotCi0j
aWYgZGVmaW5lZChBVFQpCi0jIGRlZmluZSBTSUdfVAl2b2lkCi0jIGRlZmluZSBUSU1FX1QJbG9u
ZwotIyBkZWZpbmUgUElEX1QgaW50Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFBPU0lYKSAmJiAh
ZGVmaW5lZChBVFQpCi0vKiBjbGFzc2ljIEJTRCAqLwotZXh0ZXJuCXRpbWVfdAkJdGltZSgpOwot
ZXh0ZXJuCXVuc2lnbmVkCXNsZWVwKCk7Ci1leHRlcm4Jc3RydWN0IHRtCSpsb2NhbHRpbWUoKTsK
LWV4dGVybglzdHJ1Y3QgcGFzc3dkCSpnZXRwd25hbSgpOwotZXh0ZXJuCWludAkJZXJybm87Ci1l
eHRlcm4Jdm9pZAkJcGVycm9yKCksIGV4aXQoKSwgZnJlZSgpOwotZXh0ZXJuCWNoYXIJCSpnZXRl
bnYoKSwgKnN0cmNweSgpLCAqc3RyY2hyKCksICpzdHJ0b2soKTsKLWV4dGVybgl2b2lkCQkqbWFs
bG9jKCksICpyZWFsbG9jKCk7Ci0jIGRlZmluZSBTSUdfVAl2b2lkCi0jIGRlZmluZSBUSU1FX1QJ
bG9uZwotIyBkZWZpbmUgUElEX1QgaW50Ci0jIGRlZmluZSBXQUlUX1QJdW5pb24gd2FpdAotIyBk
ZWZpbmUgRElSX1QJc3RydWN0IGRpcmVjdAotIyBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGRlZmlu
ZSBUWk9ORSh0bSkgKHRtKS50bV96b25lCisjaWYgKGRlZmluZWQoQlNEKSkgJiYgKEJTRCA+PSAx
OTg2MDYpIHx8IGRlZmluZWQoX19saW51eCkKKyMgZGVmaW5lIEhBVkVfRkNIT1dOCisjIGRlZmlu
ZSBIQVZFX0ZDSE1PRAogI2VuZGlmCiAKKyNpZmRlZiBQT1NJWAorI2luY2x1ZGUgPHVuaXN0ZC5o
PgorI2lmZGVmIF9QT1NJWF9TQVZFRF9JRFMKKyMgZGVmaW5lIEhBVkVfU0FWRURfVUlEUworI2Vu
ZGlmCisjZW5kaWYKKworI2RlZmluZSBNWV9VSUQocHcpIGdldHVpZCgpCisjZGVmaW5lIE1ZX0dJ
RChwdykgZ2V0Z2lkKCkKKwogLyogZ2V0b3B0KCkgaXNuJ3QgcGFydCBvZiBQT1NJWC4gIHNvbWUg
c3lzdGVtcyBkZWZpbmUgaXQgaW4gPHN0ZGxpYi5oPiBhbnl3YXkuCiAgKiBvZiB0aG9zZSB0aGF0
IGRvLCBzb21lIGNvbXBsYWluIHRoYXQgb3VyIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IGFuZCBz
b21lCiAgKiBkbyBub3QuICB0byBhZGQgdG8gdGhlIG1pc2VyeSBhbmQgY29uZnVzaW9uLCBzb21l
IHN5c3RlbXMgZGVmaW5lIGdldG9wdCgpCiAgKiBpbiB3YXlzIHRoYXQgd2UgY2Fubm90IHByZWRp
Y3Qgb3IgY29tcHJlaGVuZCwgeWV0IGRvIG5vdCBkZWZpbmUgdGhlIGFkanVuY3QKICAqIGV4dGVy
bmFsIHZhcmlhYmxlcyBuZWVkZWQgZm9yIHRoZSBpbnRlcmZhY2UuCiAgKi8KLSNpZiAoIWRlZmlu
ZWQoQlNEKSB8fCAoQlNEIDwgMTk4OTExKSkgJiYgIWRlZmluZWQoQVRUKSAmJiAhZGVmaW5lZChV
TklDT1MpCisjaWYgKCFkZWZpbmVkKEJTRCkgfHwgKEJTRCA8IDE5ODkxMSkpCiBpbnQJZ2V0b3B0
KGludCwgY2hhciAqIGNvbnN0ICosIGNvbnN0IGNoYXIgKik7CiAjZW5kaWYKIApAQCAtODEsNjcg
KzEwNywyNSBAQAogZXh0ZXJuCWludCBvcHRpbmQsIG9wdGVyciwgb3B0b3B0OwogI2VuZGlmCiAK
LSNpZiBXQUlUX0lTX0lOVAotIyBpZm5kZWYgV0VYSVRTVEFUVVMKLSMgIGRlZmluZSBXRVhJVFNU
QVRVUyh4KSAoKCh4KSA+PiA4KSAmIDB4ZmYpCi0jIGVuZGlmCi0jIGlmbmRlZiBXVEVSTVNJRwot
IyAgZGVmaW5lIFdURVJNU0lHKHgpCSgoeCkgJiAweDdmKQotIyBlbmRpZgotIyBpZm5kZWYgV0NP
UkVEVU1QCi0jICBkZWZpbmUgV0NPUkVEVU1QKHgpCSgoeCkgJiAweDgwKQotIyBlbmRpZgotI2Vs
c2UgLypXQUlUX0lTX0lOVCovCi0jIGlmbmRlZiBXRVhJVFNUQVRVUwotIyAgZGVmaW5lIFdFWElU
U1RBVFVTKHgpICgoeCkud19yZXRjb2RlKQotIyBlbmRpZgotIyBpZm5kZWYgV1RFUk1TSUcKLSMg
IGRlZmluZSBXVEVSTVNJRyh4KQkoKHgpLndfdGVybXNpZykKLSMgZW5kaWYKLSMgaWZuZGVmIFdD
T1JFRFVNUAotIyAgZGVmaW5lIFdDT1JFRFVNUCh4KQkoKHgpLndfY29yZWR1bXApCi0jIGVuZGlm
Ci0jZW5kaWYgLypXQUlUX0lTX0lOVCovCi0KLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUg
V0lGU0lHTkFMRUQoeCkJKFdURVJNU0lHKHgpICE9IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGRVhJ
VEVECi0jZGVmaW5lIFdJRkVYSVRFRCh4KQkoV1RFUk1TSUcoeCkgPT0gMCkKLSNlbmRpZgotCi0j
aWZkZWYgTkVFRF9TVFJDQVNFQ01QCi1leHRlcm4JaW50CQlzdHJjYXNlY21wKGNoYXIgKiwgY2hh
ciAqKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9TVFJEVVAKLWV4dGVybgljaGFyCQkqc3RyZHVw
KGNoYXIgKik7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfU1RSRVJST1IKLWV4dGVybgljaGFyCQkq
c3RyZXJyb3IoaW50KTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9GTE9DSworLyogZGlnaXRhbCB1
bml4IG5lZWRzIHRoaXMgYnV0IGRvZXMgbm90IGdpdmUgdXMgYSB3YXkgdG8gaWRlbnRpZnkgaXQu
CisgKi8KIGV4dGVybglpbnQJCWZsb2NrKGludCwgaW50KTsKKworLyogbm90IGFsbCBzeXN0ZW1z
IHdobyBwcm92aWRlIGZsb2NrKCkgcHJvdmlkZSB0aGVzZSBkZWZpbml0aW9ucy4KKyAqLworI2lm
bmRlZiBMT0NLX1NICiAjIGRlZmluZSBMT0NLX1NIIDEKLSMgZGVmaW5lIExPQ0tfRVggMgotIyBk
ZWZpbmUgTE9DS19OQiA0Ci0jIGRlZmluZSBMT0NLX1VOIDgKICNlbmRpZgotCi0jaWZkZWYgTkVF
RF9TRVRTSUQKLWV4dGVybglpbnQJCXNldHNpZCh2b2lkKTsKKyNpZm5kZWYgTE9DS19FWAorIyBk
ZWZpbmUgTE9DS19FWCAyCiAjZW5kaWYKLQotI2lmZGVmIE5FRURfR0VURFRBQkxFU0laRQotZXh0
ZXJuCWludAkJZ2V0ZHRhYmxlc2l6ZSh2b2lkKTsKKyNpZm5kZWYgTE9DS19OQgorIyBkZWZpbmUg
TE9DS19OQiA0CiAjZW5kaWYKLQotI2lmZGVmIE5FRURfU0VURU5WCi1leHRlcm4JaW50CQlzZXRl
bnYoY2hhciAqLCBjaGFyICosIGludCk7CisjaWZuZGVmIExPQ0tfVU4KKyMgZGVmaW5lIExPQ0tf
VU4gOAogI2VuZGlmCiAKLSNpZmRlZiBORUVEX1ZGT1JLCi1leHRlcm4JUElEX1QJCXZmb3JrKHZv
aWQpOworI2lmbmRlZiBXQ09SRURVTVAKKyMgZGVmaW5lIFdDT1JFRFVNUChzdCkgICAgICAgICAg
KCgoc3QpICYgMDIwMCkgIT0gMCkKICNlbmRpZgpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4v
Y3Jvbi9jcm9uL2Z1bmNzLmggZnJlZWJzZF9jcm9uL2Nyb24vZnVuY3MuaAotLS0gL3Vzci9zcmMv
dXNyLnNiaW4vY3Jvbi9jcm9uL2Z1bmNzLmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAg
KzAxMDAKKysrIGZyZWVic2RfY3Jvbi9jcm9uL2Z1bmNzLmgJMjAxNC0wNi0xMSAxNjo0Mjo1NS4y
NzI0NDQyNzYgKzAyMDAKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqICRJZDogZnVuY3MuaCx2IDEu
OSAyMDA0LzAxLzIzIDE4OjU2OjQyIHZpeGllIEV4cCAkCisgKi8KKworLyoKKyAqIENvcHlyaWdo
dCAoYykgMjAwNCBieSBJbnRlcm5ldCBTeXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQor
ICogQ29weXJpZ2h0IChjKSAxOTk3LDIwMDAgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1
bSwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0
cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQg
ZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJp
Z2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGll
cy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJU0NM
QUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNM
VURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVD
SUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERB
TUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1Ig
UFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNF
IE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENPTk5F
Q1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8K
KworLyogTm90ZXM6CisgKglUaGlzIGZpbGUgaGFzIHRvIGJlIGluY2x1ZGVkIGJ5IGNyb24uaCBh
ZnRlciBkYXRhIHN0cnVjdHVyZSBkZWZzLgorICoJV2Ugc2hvdWxkIHJlb3JnIHRoaXMgaW50byBz
ZWN0aW9ucyBieSBtb2R1bGUuCisgKi8KKwordm9pZAkJc2V0X2Nyb25fdWlkKHZvaWQpLAorCQlz
ZXRfY3Jvbl9jd2Qodm9pZCksCisJCWxvYWRfZGF0YWJhc2UoY3Jvbl9kYiAqKSwKKwkJb3Blbl9s
b2dmaWxlKHZvaWQpLAorCQlzaWdwaXBlX2Z1bmModm9pZCksCisJCWpvYl9hZGQoZW50cnkgKiwg
dXNlciAqKSwKKwkJZG9fY29tbWFuZChlbnRyeSAqLCB1c2VyICopLAorCQlsaW5rX3VzZXIoY3Jv
bl9kYiAqLCB1c2VyICopLAorCQl1bmxpbmtfdXNlcihjcm9uX2RiICosIHVzZXIgKiksCisJCWZy
ZWVfdXNlcih1c2VyICopLAorCQllbnZfZnJlZShjaGFyICoqKSwKKwkJdW5nZXRfY2hhcihpbnQs
IEZJTEUgKiksCisJCWZyZWVfZW50cnkoZW50cnkgKiksCisJCWFjcXVpcmVfZGFlbW9ubG9jayhp
bnQpLAorCQlza2lwX2NvbW1lbnRzKEZJTEUgKiksCisJCWxvZ19pdChjb25zdCBjaGFyICosIGlu
dCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopLAorCQlsb2dfY2xvc2Uodm9pZCksCisJCW1r
cHJpbnQoY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CisKK2ludAkJam9iX3J1bnF1ZXVl
KHZvaWQpLAorCQlzZXRfZGVidWdfZmxhZ3MoY29uc3QgY2hhciAqKSwKKwkJZ2V0X2NoYXIoRklM
RSAqKSwKKwkJZ2V0X3N0cmluZyhjaGFyICosIGludCwgRklMRSAqLCBjaGFyICopLAorCQlzd2Fw
X3VpZHModm9pZCksCisJCXN3YXBfdWlkc19iYWNrKHZvaWQpLAorCQlsb2FkX2VudihjaGFyICos
IEZJTEUgKiksCisJCWNyb25fcGNsb3NlKEZJTEUgKiksCisJCWdsdWVfc3RyaW5ncyhjaGFyICos
IHNpemVfdCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIpLAorCQlzdHJjbXBfdW50
aWwoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIpLAorCQlhbGxvd2VkKGNoYXIgKiks
CisJCXN0cmR0YihjaGFyICopLAorCQlvcGVuX3NvY2tldCh2b2lkKTsKKworc2l6ZV90CQlzdHJs
ZW5zKGNvbnN0IGNoYXIgKiwgLi4uKTsKKworY2hhcgkJKmVudl9nZXQoY2hhciAqLCBjaGFyICoq
KSwKKwkJKmFycGFkYXRlKHRpbWVfdCAqKSwKKwkJKm1rcHJpbnRzKHVuc2lnbmVkIGNoYXIgKiwg
dW5zaWduZWQgaW50KSwKKwkJKmZpcnN0X3dvcmQoY2hhciAqLCBjaGFyICopLAorCQkqKmVudl9p
bml0KHZvaWQpLAorCQkqKmVudl9jb3B5KGNoYXIgKiopLAorCQkqKmVudl9zZXQoY2hhciAqKiwg
Y2hhciAqKTsKKwordXNlcgkJKmxvYWRfdXNlcihpbnQsIHN0cnVjdCBwYXNzd2QgKiwgY29uc3Qg
Y2hhciAqKSwKKwkJKmZpbmRfdXNlcihjcm9uX2RiICosIGNvbnN0IGNoYXIgKik7CisKK2VudHJ5
CQkqbG9hZF9lbnRyeShGSUxFICosIHZvaWQgKCopKCksIHN0cnVjdCBwYXNzd2QgKiwgY2hhciAq
Kik7CisKK0ZJTEUJCSpjcm9uX3BvcGVuKGNoYXIgKiwgY2hhciAqLCBlbnRyeSAqKTsKKworc3Ry
dWN0IHBhc3N3ZAkqcHdfZHVwKGNvbnN0IHN0cnVjdCBwYXNzd2QgKik7CisKKyNpZm5kZWYgSEFW
RV9UTV9HTVRPRkYKK2xvbmcJCWdldF9nbXRvZmYodGltZV90ICosIHN0cnVjdCB0bSAqKTsKKyNl
bmRpZgpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2dsb2JhbHMuaCBmcmVl
YnNkX2Nyb24vY3Jvbi9nbG9iYWxzLmgKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9n
bG9iYWxzLmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2Rf
Y3Jvbi9jcm9uL2dsb2JhbHMuaAkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MjQ0NDI3NiArMDIwMApA
QCAtMCwwICsxLDgwIEBACisvKgorICogJElkOiBnbG9iYWxzLmgsdiAxLjEwIDIwMDQvMDEvMjMg
MTk6MDM6MzMgdml4aWUgRXhwICQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IGJ5
IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAoIklTQyIpCisgKiBDb3B5cmlnaHQg
KGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLCBJbmMuCisgKgor
ICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBz
b2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5
IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFu
ZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRI
RSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xBSU1TIEFMTCBXQVJS
QU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1Q
TElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuICBJTiBO
TyBFVkVOVCBTSEFMTCBJU0MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwg
SU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hB
VFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVU
SEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9S
VElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRI
RSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgTUFJ
Tl9QUk9HUkFNCisjIGRlZmluZSBYVFJOCisjIGRlZmluZSBJTklUKHgpID0geAorI2Vsc2UKKyMg
ZGVmaW5lIFhUUk4gZXh0ZXJuCisjIGRlZmluZSBJTklUKHgpCisjZW5kaWYKKworWFRSTiBjb25z
dCBjaGFyICpjb3B5cmlnaHRbXQorI2lmZGVmIE1BSU5fUFJPR1JBTQorCT0geworCQkiQCgjKSBJ
U0MgQ3JvbiBWNC4xIiwKKwkJIkAoIykgQ29weXJpZ2h0IDE5ODgsMTk4OSwxOTkwLDE5OTMsMTk5
NCBieSBQYXVsIFZpeGllIiwKKwkJIkAoIykgQ29weXJpZ2h0IDE5OTcsMjAwMCBieSBJbnRlcm5l
dCBTb2Z0d2FyZSBDb25zb3J0aXVtLCBJbmMuIiwKKwkJIkAoIykgQ29weXJpZ2h0IDIwMDQgYnkg
SW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuIiwKKwkJIkAoIykgQWxsIHJpZ2h0cyBy
ZXNlcnZlZCIsCisJCU5VTEwKKwl9CisjZW5kaWYKKwk7CisKK1hUUk4gY29uc3QgY2hhciAqTW9u
dGhOYW1lc1tdCisjaWZkZWYgTUFJTl9QUk9HUkFNCisJPSB7CisJCSJKYW4iLCAiRmViIiwgIk1h
ciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisJCSJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAi
Tm92IiwgIkRlYyIsCisJCU5VTEwKKwl9CisjZW5kaWYKKwk7CisKK1hUUk4gY29uc3QgY2hhciAq
RG93TmFtZXNbXQorI2lmZGVmIE1BSU5fUFJPR1JBTQorCT0geworCQkiU3VuIiwgIk1vbiIsICJU
dWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IiwgIlN1biIsCisJCU5VTEwKKwl9CisjZW5k
aWYKKwk7CisKK1hUUk4gY2hhcgkqUHJvZ3JhbU5hbWUgSU5JVCgiYW1uZXNpYSIpOworWFRSTiBj
aGFyCSpkZWZtYWlsdG87CitYVFJOIGludAlMaW5lTnVtYmVyIElOSVQoMCk7CitYVFJOIHRpbWVf
dAlTdGFydFRpbWUgSU5JVCgwKTsKK1hUUk4gaW50CU5vRm9yayBJTklUKDApOworCisjaWYgREVC
VUdHSU5HCitYVFJOIGludAlEZWJ1Z0ZsYWdzIElOSVQoMCk7CitYVFJOIGNvbnN0IGNoYXIgKkRl
YnVnRmxhZ05hbWVzW10KKyNpZmRlZiBNQUlOX1BST0dSQU0KKwk9IHsKKwkJImV4dCIsICJzY2gi
LCAicHJvYyIsICJwYXJzIiwgImxvYWQiLCAibWlzYyIsICJ0ZXN0IiwgImJpdCIsCisJCU5VTEwK
Kwl9CisjZW5kaWYKKwk7CisjZWxzZQorI2RlZmluZQlEZWJ1Z0ZsYWdzCTAKKyNlbmRpZiAvKiBE
RUJVR0dJTkcgKi8KZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9qb2IuYyBm
cmVlYnNkX2Nyb24vY3Jvbi9qb2IuYwotLS0gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2pv
Yi5jCTIwMTQtMDEtMTYgMjE6NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24v
Y3Jvbi9qb2IuYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MzQ0NDgxMiArMDIwMApAQCAtMSw3NiAr
MSw3MyBAQAogLyogQ29weXJpZ2h0IDE5ODgsMTk5MCwxOTkzLDE5OTQgYnkgUGF1bCBWaXhpZQog
ICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQg
YnkgSW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuICgiSVNDIikKKyAqIENvcHlyaWdo
dCAoYykgMTk5NywyMDAwIGJ5IEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0sIEluYy4KICAq
Ci0gKiBEaXN0cmlidXRlIGZyZWVseSwgZXhjZXB0OiBkb24ndCByZW1vdmUgbXkgbmFtZSBmcm9t
IHRoZSBzb3VyY2Ugb3IKLSAqIGRvY3VtZW50YXRpb24gKGRvbid0IHRha2UgY3JlZGl0IGZvciBt
eSB3b3JrKSwgbWFyayB5b3VyIGNoYW5nZXMgKGRvbid0Ci0gKiBnZXQgbWUgYmxhbWVkIGZvciB5
b3VyIHBvc3NpYmxlIGJ1Z3MpLCBkb24ndCBhbHRlciBvciByZW1vdmUgdGhpcwotICogbm90aWNl
LiAgTWF5IGJlIHNvbGQgaWYgYnVpbGRhYmxlIHNvdXJjZSBpcyBwcm92aWRlZCB0byBidXllci4g
IE5vCi0gKiB3YXJyYW50ZWUgb2YgYW55IGtpbmQsIGV4cHJlc3Mgb3IgaW1wbGllZCwgaXMgaW5j
bHVkZWQgd2l0aCB0aGlzCi0gKiBzb2Z0d2FyZTsgdXNlIGF0IHlvdXIgb3duIHJpc2ssIHJlc3Bv
bnNpYmlsaXR5IGZvciBkYW1hZ2VzIChpZiBhbnkpIHRvCi0gKiBhbnlvbmUgcmVzdWx0aW5nIGZy
b20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIHJlc3RzIGVudGlyZWx5IHdpdGggdGhlCi0gKiB1
c2VyLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUg
dGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMg
aGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90
aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgogICoK
LSAqIFNlbmQgYnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgZW5oYW5jZW1lbnRzLCByZXF1ZXN0cywg
ZmxhbWVzLCBldGMuLCBhbmQKLSAqIEknbGwgdHJ5IHRvIGtlZXAgYSB2ZXJzaW9uIHVwIHRvIGRh
dGUuICBJIGNhbiBiZSByZWFjaGVkIGFzIGZvbGxvd3M6Ci0gKiBQYXVsIFZpeGllICAgICAgICAg
IDxwYXVsQHZpeC5jb20+ICAgICAgICAgIHV1bmV0IWRlY3dybCF2aXhpZSFwYXVsCisgKiBUSEUg
U09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJU0NMQUlNUyBBTEwgV0FSUkFO
VElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJ
RUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiAgSU4gTk8g
RVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElO
RElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRT
T0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhF
UiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJ
T1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUg
VVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAotI2lmICFkZWZpbmVk
KGxpbnQpICYmICFkZWZpbmVkKExJTlQpCi1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0KLSAg
IiRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Nyb24vam9iLmMgNTA0Nzkg
MTk5OS0wOC0yOCAwMTozNTo1OVogcGV0ZXIgJCI7Ci0jZW5kaWYKLQorLy8jaWYgIWRlZmluZWQo
bGludCkgJiYgIWRlZmluZWQoTElOVCkKKy8vc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IGpv
Yi5jLHYgMS42IDIwMDQvMDEvMjMgMTg6NTY6NDMgdml4aWUgRXhwICQiOworLy8jZW5kaWYKIAog
I2luY2x1ZGUgImNyb24uaCIKIAotCiB0eXBlZGVmCXN0cnVjdCBfam9iIHsKIAlzdHJ1Y3QgX2pv
YgkqbmV4dDsKIAllbnRyeQkJKmU7CiAJdXNlcgkJKnU7CiB9IGpvYjsKIAotCiBzdGF0aWMgam9i
CSpqaGVhZCA9IE5VTEwsICpqdGFpbCA9IE5VTEw7CiAKLQogdm9pZAotam9iX2FkZChlLCB1KQot
CXJlZ2lzdGVyIGVudHJ5ICplOwotCXJlZ2lzdGVyIHVzZXIgKnU7Ci17Ci0JcmVnaXN0ZXIgam9i
ICpqOworam9iX2FkZChlbnRyeSAqZSwgdXNlciAqdSkgeworCWpvYiAqajsKIAogCS8qIGlmIGFs
cmVhZHkgb24gcXVldWUsIGtlZXAgZ29pbmcgKi8KLQlmb3IgKGo9amhlYWQ7IGo7IGo9ai0+bmV4
dCkKLQkJaWYgKGotPmUgPT0gZSAmJiBqLT51ID09IHUpIHsgcmV0dXJuOyB9CisJZm9yIChqID0g
amhlYWQ7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpCisJCWlmIChqLT5lID09IGUgJiYgai0+dSA9
PSB1KQorCQkJcmV0dXJuOwogCiAJLyogYnVpbGQgYSBqb2IgcXVldWUgZWxlbWVudCAqLwotCWlm
ICgoaiA9IChqb2IqKW1hbGxvYyhzaXplb2Yoam9iKSkpID09IE5VTEwpCisJaWYgKChqID0gKGpv
YiAqKW1hbGxvYyhzaXplb2Yoam9iKSkpID09IE5VTEwpCiAJCXJldHVybjsKLQlqLT5uZXh0ID0g
KGpvYiopIE5VTEw7CisJai0+bmV4dCA9IE5VTEw7CiAJai0+ZSA9IGU7CiAJai0+dSA9IHU7CiAK
IAkvKiBhZGQgaXQgdG8gdGhlIHRhaWwgKi8KLQlpZiAoIWpoZWFkKSB7IGpoZWFkPWo7IH0KLQll
bHNlIHsganRhaWwtPm5leHQ9ajsgfQorCWlmIChqaGVhZCA9PSBOVUxMKQorCQlqaGVhZCA9IGo7
CisJZWxzZQorCQlqdGFpbC0+bmV4dCA9IGo7CiAJanRhaWwgPSBqOwogfQogCi0KIGludAotam9i
X3J1bnF1ZXVlKCkKLXsKLQlyZWdpc3RlciBqb2IJKmosICpqbjsKLQlyZWdpc3RlciBpbnQJcnVu
ID0gMDsKK2pvYl9ydW5xdWV1ZSh2b2lkKSB7CisJam9iICpqLCAqam47CisJaW50IHJ1biA9IDA7
CiAKLQlmb3IgKGo9amhlYWQ7IGo7IGo9am4pIHsKKwlmb3IgKGogPSBqaGVhZDsgajsgaiA9IGpu
KSB7CiAJCWRvX2NvbW1hbmQoai0+ZSwgai0+dSk7CiAJCWpuID0gai0+bmV4dDsKIAkJZnJlZShq
KTsKIAkJcnVuKys7CiAJfQogCWpoZWFkID0ganRhaWwgPSBOVUxMOwotCXJldHVybiBydW47CisJ
cmV0dXJuIChydW4pOwogfQpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL21h
Y3Jvcy5oIGZyZWVic2RfY3Jvbi9jcm9uL21hY3Jvcy5oCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9j
cm9uL2Nyb24vbWFjcm9zLmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysr
IGZyZWVic2RfY3Jvbi9jcm9uL21hY3Jvcy5oCTIwMTQtMDYtMTEgMTY6NDI6NTUuMjczNDQ0ODEy
ICswMjAwCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogJElkOiBtYWNyb3MuaCx2IDEuOSAyMDA0
LzAxLzIzIDE4OjU2OjQzIHZpeGllIEV4cCAkCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykg
MjAwNCBieSBJbnRlcm5ldCBTeXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQorICogQ29w
eXJpZ2h0IChjKSAxOTk3LDIwMDAgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bSwgSW5j
LgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRl
IHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlz
IGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5v
dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAq
CisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJU0NMQUlNUyBB
TEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcg
QUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
LiAgSU4gTk8gRVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBE
SVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMK
KyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklU
UywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9U
SEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENPTk5FQ1RJT04g
V0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworCS8q
IHRoZXNlIGFyZSByZWFsbHkgaW1tdXRhYmxlLCBhbmQgYXJlCisJICogICBkZWZpbmVkIGZvciBz
eW1ib2xpYyBjb252ZW5pZW5jZSBvbmx5CisJICogVFJVRSwgRkFMU0UsIGFuZCBFUlIgbXVzdCBi
ZSBkaXN0aW5jdAorCSAqIEVSUiBtdXN0IGJlIDwgT0suCisJICovCisjZGVmaW5lIFRSVUUJCTEK
KyNkZWZpbmUgRkFMU0UJCTAKKwkvKiBzeXN0ZW0gY2FsbHMgcmV0dXJuIHRoaXMgb24gc3VjY2Vz
cyAqLworI2RlZmluZSBPSwkJMAorCS8qICAgb3IgdGhpcyBvbiBlcnJvciAqLworI2RlZmluZSBF
UlIJCSgtMSkKKworCS8qIHR1cm4gdGhpcyBvbiB0byBnZXQgJy14JyBjb2RlICovCisjaWZuZGVm
IERFQlVHR0lORworI2RlZmluZSBERUJVR0dJTkcJRkFMU0UKKyNlbmRpZgorCisjZGVmaW5lCUlO
SVRfUElECTEJLyogcGFyZW50IG9mIG9ycGhhbnMgKi8KKyNkZWZpbmUgUkVBRF9QSVBFCTAJLyog
d2hpY2ggZW5kIG9mIGEgcGlwZSBwYWlyIGRvIHlvdSByZWFkPyAqLworI2RlZmluZSBXUklURV9Q
SVBFCTEJLyogICBvciB3cml0ZSB0bz8gKi8KKyNkZWZpbmUgU1RESU4JCTAJLyogd2hhdCBpcyBz
dGRpbidzIGZpbGUgZGVzY3JpcHRvcj8gKi8KKyNkZWZpbmUgU1RET1VUCQkxCS8qICAgc3Rkb3V0
J3M/ICovCisjZGVmaW5lIFNUREVSUgkJMgkvKiAgIHN0ZGVycidzPyAqLworI2RlZmluZSBFUlJP
Ul9FWElUCTEJLyogZXhpdCgpIHdpdGggdGhpcyB3aWxsIHNjYXJlIHRoZSBzaGVsbCAqLworI2Rl
ZmluZQlPS19FWElUCQkwCS8qIGV4aXQoKSB3aXRoIHRoaXMgaXMgY29uc2lkZXJlZCAnbm9ybWFs
JyAqLworI2RlZmluZQlNQVhfRk5BTUUJMTAwCS8qIG1heCBsZW5ndGggb2YgaW50ZXJuYWxseSBn
ZW5lcmF0ZWQgZm4gKi8KKyNkZWZpbmUJTUFYX0NPTU1BTkQJMTAwMAkvKiBtYXggbGVuZ3RoIG9m
IGludGVybmFsbHkgZ2VuZXJhdGVkIGNtZCAqLworI2RlZmluZQlNQVhfRU5WU1RSCTEwMDAJLyog
bWF4IGxlbmd0aCBvZiBlbnZ2YXI9dmFsdWVcMCBzdHJpbmdzICovCisjZGVmaW5lCU1BWF9URU1Q
U1RSCTEwMAkvKiBvYnZpb3VzICovCisjZGVmaW5lCU1BWF9VTkFNRQkzMwkvKiBtYXggbGVuZ3Ro
IG9mIHVzZXJuYW1lLCBzaG91bGQgYmUgb3ZlcmtpbGwgKi8KKyNkZWZpbmUJUk9PVF9VSUQJMAkv
KiBkb24ndCBjaGFuZ2UgdGhpcywgaXQgcmVhbGx5IG11c3QgYmUgcm9vdCAqLworI2RlZmluZQlS
T09UX1VTRVIJInJvb3QiCS8qIGRpdHRvICovCisKKwkJCQkvKiBOT1RFOiB0aGVzZSBjb3JyZXNw
b25kIHRvIERlYnVnRmxhZ05hbWVzLAorCQkJCSAqCWRlZmluZWQgYmVsb3cuCisJCQkJICovCisj
ZGVmaW5lCURFWFQJCTB4MDAwMQkvKiBleHRlbmQgZmxhZyBmb3Igb3RoZXIgZGVidWcgbWFza3Mg
Ki8KKyNkZWZpbmUJRFNDSAkJMHgwMDAyCS8qIHNjaGVkdWxpbmcgZGVidWcgbWFzayAqLworI2Rl
ZmluZQlEUFJPQwkJMHgwMDA0CS8qIHByb2Nlc3MgY29udHJvbCBkZWJ1ZyBtYXNrICovCisjZGVm
aW5lCURQQVJTCQkweDAwMDgJLyogcGFyc2luZyBkZWJ1ZyBtYXNrICovCisjZGVmaW5lCURMT0FE
CQkweDAwMTAJLyogZGF0YWJhc2UgbG9hZGluZyBkZWJ1ZyBtYXNrICovCisjZGVmaW5lCURNSVND
CQkweDAwMjAJLyogbWlzYyBkZWJ1ZyBtYXNrICovCisjZGVmaW5lCURURVNUCQkweDAwNDAJLyog
dGVzdCBtb2RlOiBkb24ndCBleGVjdXRlIGFueSBjb21tYW5kcyAqLworCisjZGVmaW5lCVBQQ19O
VUxMCSgoY29uc3QgY2hhciAqKilOVUxMKQorCisjaWZuZGVmIE1BWEhPU1ROQU1FTEVOCisjZGVm
aW5lIE1BWEhPU1ROQU1FTEVOIDY0CisjZW5kaWYKKworI2RlZmluZQlTa2lwX0JsYW5rcyhjLCBm
KSBcCisJCQl3aGlsZSAoYyA9PSAnXHQnIHx8IGMgPT0gJyAnKSBcCisJCQkJYyA9IGdldF9jaGFy
KGYpOworCisjZGVmaW5lCVNraXBfTm9uYmxhbmtzKGMsIGYpIFwKKwkJCXdoaWxlIChjIT0nXHQn
ICYmIGMhPScgJyAmJiBjIT0nXG4nICYmIGMgIT0gRU9GKSBcCisJCQkJYyA9IGdldF9jaGFyKGYp
OworCisjaWYgREVCVUdHSU5HCisjIGRlZmluZSBEZWJ1ZyhtYXNrLCBtZXNzYWdlKSBcCisJCQlp
ZiAoKERlYnVnRmxhZ3MgJiAobWFzaykpICE9IDApIFwKKwkJCQlwcmludGYgbWVzc2FnZTsKKyNl
bHNlIC8qICFERUJVR0dJTkcgKi8KKyMgZGVmaW5lIERlYnVnKG1hc2ssIG1lc3NhZ2UpIFwKKwkJ
CTsKKyNlbmRpZiAvKiBERUJVR0dJTkcgKi8KKworI2RlZmluZQlNa1VwcGVyKGNoKQkoaXNsb3dl
cihjaCkgPyB0b3VwcGVyKGNoKSA6IGNoKQorI2RlZmluZQlTZXRfTGluZU51bShsbikJe0RlYnVn
KERQQVJTfERFWFQsKCJsaW5lbnVtPSVkXG4iLGxuKSk7IFwKKwkJCSBMaW5lTnVtYmVyID0gbG47
IFwKKwkJCX0KKworI2lmZGVmIEhBVkVfVE1fR01UT0ZGCisjZGVmaW5lCWdldF9nbXRvZmYoYywg
dCkJKCh0KS0+dG1fZ210b2ZmKQorI2VuZGlmCisKKyNkZWZpbmUJU0VDT05EU19QRVJfTUlOVVRF
CTYwCisjZGVmaW5lCVNFQ09ORFNfUEVSX0hPVVIJMzYwMAorCisjZGVmaW5lIEZJUlNUX1NFQ09O
RCAgICAwCisjZGVmaW5lIExBU1RfU0VDT05EICAgICA1OQorI2RlZmluZSBTRUNPTkRfQ09VTlQg
KExBU1RfU0VDT05EIC0gRklSU1RfU0VDT05EICsgMSkKKworI2RlZmluZQlGSVJTVF9NSU5VVEUJ
MAorI2RlZmluZQlMQVNUX01JTlVURQk1OQorI2RlZmluZQlNSU5VVEVfQ09VTlQJKExBU1RfTUlO
VVRFIC0gRklSU1RfTUlOVVRFICsgMSkKKworI2RlZmluZQlGSVJTVF9IT1VSCTAKKyNkZWZpbmUJ
TEFTVF9IT1VSCTIzCisjZGVmaW5lCUhPVVJfQ09VTlQJKExBU1RfSE9VUiAtIEZJUlNUX0hPVVIg
KyAxKQorCisjZGVmaW5lCUZJUlNUX0RPTQkxCisjZGVmaW5lCUxBU1RfRE9NCTMxCisjZGVmaW5l
CURPTV9DT1VOVAkoTEFTVF9ET00gLSBGSVJTVF9ET00gKyAxKQorCisjZGVmaW5lCUZJUlNUX01P
TlRICTEKKyNkZWZpbmUJTEFTVF9NT05USAkxMgorI2RlZmluZQlNT05USF9DT1VOVAkoTEFTVF9N
T05USCAtIEZJUlNUX01PTlRIICsgMSkKKworLyogbm90ZSBvbiBET1c6IDAgYW5kIDcgYXJlIGJv
dGggU3VuZGF5LCBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLiAqLworI2RlZmluZQlGSVJTVF9E
T1cJMAorI2RlZmluZQlMQVNUX0RPVwk3CisjZGVmaW5lCURPV19DT1VOVAkoTEFTVF9ET1cgLSBG
SVJTVF9ET1cgKyAxKQorCisvKgorICogQmVjYXVzZSBjcm9udGFiL2F0IGZpbGVzIG1heSBiZSBv
d25lZCBieSB0aGVpciByZXNwZWN0aXZlIHVzZXJzIHdlCisgKiB0YWtlIGV4dHJlbWUgY2FyZSBp
biBvcGVuaW5nIHRoZW0uICBJZiB0aGUgT1MgbGFja3MgdGhlIE9fTk9GT0xMT1cKKyAqIHdlIHdp
bGwganVzdCBoYXZlIHRvIGxpdmUgd2l0aG91dCBpdC4gIEluIG9yZGVyIGZvciB0aGlzIHRvIGJl
IGFuCisgKiBpc3N1ZSBhbiBhdHRhY2tlciB3b3VsZCBoYXZlIHRvIHN1YnZlcnQgZ3JvdXAgQ1JP
Tl9HUk9VUC4KKyAqLworI2lmbmRlZiBPX05PRk9MTE9XCisjZGVmaW5lIE9fTk9GT0xMT1cJMAor
I2VuZGlmCisKKyNkZWZpbmUgICAgICAgIFJFTE9BRF9DUk9OICAgICAweDIKZGlmZiAtcnVOIC91
c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9wYXRobmFtZXMuaCBmcmVlYnNkX2Nyb24vY3Jvbi9w
YXRobmFtZXMuaAotLS0gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL3BhdGhuYW1lcy5oCTIw
MTQtMDEtMTYgMjE6NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vY3Jvbi9w
YXRobmFtZXMuaAkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MzQ0NDgxMiArMDIwMApAQCAtMSwzMSAr
MSwzOCBAQAogLyogQ29weXJpZ2h0IDE5OTMsMTk5NCBieSBQYXVsIFZpeGllCiAgKiBBbGwgcmln
aHRzIHJlc2VydmVkCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBieSBJbnRlcm5l
dCBTeXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQorICogQ29weXJpZ2h0IChjKSAxOTk3
LDIwMDAgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bSwgSW5jLgogICoKLSAqIERpc3Ry
aWJ1dGUgZnJlZWx5LCBleGNlcHQ6IGRvbid0IHJlbW92ZSBteSBuYW1lIGZyb20gdGhlIHNvdXJj
ZSBvcgotICogZG9jdW1lbnRhdGlvbiAoZG9uJ3QgdGFrZSBjcmVkaXQgZm9yIG15IHdvcmspLCBt
YXJrIHlvdXIgY2hhbmdlcyAoZG9uJ3QKLSAqIGdldCBtZSBibGFtZWQgZm9yIHlvdXIgcG9zc2li
bGUgYnVncyksIGRvbid0IGFsdGVyIG9yIHJlbW92ZSB0aGlzCi0gKiBub3RpY2UuICBNYXkgYmUg
c29sZCBpZiBidWlsZGFibGUgc291cmNlIGlzIHByb3ZpZGVkIHRvIGJ1eWVyLiAgTm8KLSAqIHdh
cnJhbnRlZSBvZiBhbnkga2luZCwgZXhwcmVzcyBvciBpbXBsaWVkLCBpcyBpbmNsdWRlZCB3aXRo
IHRoaXMKLSAqIHNvZnR3YXJlOyB1c2UgYXQgeW91ciBvd24gcmlzaywgcmVzcG9uc2liaWxpdHkg
Zm9yIGRhbWFnZXMgKGlmIGFueSkgdG8KLSAqIGFueW9uZSByZXN1bHRpbmcgZnJvbSB0aGUgdXNl
IG9mIHRoaXMgc29mdHdhcmUgcmVzdHMgZW50aXJlbHkgd2l0aCB0aGUKLSAqIHVzZXIuCisgKiBQ
ZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3
YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3Jh
bnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRo
aXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAgKgotICogU2VuZCBi
dWcgcmVwb3J0cywgYnVnIGZpeGVzLCBlbmhhbmNlbWVudHMsIHJlcXVlc3RzLCBmbGFtZXMsIGV0
Yy4sIGFuZAotICogSSdsbCB0cnkgdG8ga2VlcCBhIHZlcnNpb24gdXAgdG8gZGF0ZS4gIEkgY2Fu
IGJlIHJlYWNoZWQgYXMgZm9sbG93czoKLSAqIFBhdWwgVml4aWUgICAgICAgICAgPHBhdWxAdml4
LmNvbT4gICAgICAgICAgdXVuZXQhZGVjd3JsIXZpeGllIXBhdWwKKyAqIFRIRSBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBX
SVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5U
SUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuICBJTiBOTyBFVkVOVCBTSEFM
TCBJU0MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNV
TFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisg
KiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9O
LCBBUklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVS
Rk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCiAvKgotICogJEZyZWVCU0Q6IHJlbGVh
c2UvMTAuMC4wL3Vzci5zYmluL2Nyb24vY3Jvbi9wYXRobmFtZXMuaCA1MDQ3OSAxOTk5LTA4LTI4
IDAxOjM1OjU5WiBwZXRlciAkCisgKiAkSWQ6IHBhdGhuYW1lcy5oLHYgMS45IDIwMDQvMDEvMjMg
MTg6NTY6NDMgdml4aWUgRXhwICQKICAqLwogCisjaWZuZGVmIF9QQVRITkFNRVNfSF8KKyNkZWZp
bmUgX1BBVEhOQU1FU19IXworCiAjaWYgKGRlZmluZWQoQlNEKSkgJiYgKEJTRCA+PSAxOTkxMDMp
IHx8IGRlZmluZWQoX19saW51eCkgfHwgZGVmaW5lZChBSVgpCiAjIGluY2x1ZGUgPHBhdGhzLmg+
CiAjZW5kaWYgLypCU0QqLwogCiAjaWZuZGVmIENST05ESVIKLQkJCS8qIENST05ESVIgaXMgd2hl
cmUgY3JvbmQoOCkgYW5kIGNyb250YWIoMSkgYm90aCBjaGRpcgotCQkJICogdG87IFNQT09MX0RJ
UiwgQUxMT1dfRklMRSwgREVOWV9GSUxFLCBhbmQgTE9HX0ZJTEUKKwkJCS8qIENST05ESVIgaXMg
d2hlcmUgY3Jvbig4KSBhbmQgY3JvbnRhYigxKSBib3RoIGNoZGlyCisJCQkgKiB0bzsgU1BPT0xf
RElSLCBDUk9OX0FMTE9XLCBDUk9OX0RFTlksIGFuZCBMT0dfRklMRQogCQkJICogYXJlIGFsbCBy
ZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS4KIAkJCSAqLwogI2RlZmluZSBDUk9ORElSCQkiL3Zh
ci9jcm9uIgpAQCAtMzQsMjQgKzQxLDI5IEBACiAJCQkvKiBTUE9PTERJUiBpcyB3aGVyZSB0aGUg
Y3JvbnRhYnMgbGl2ZS4KIAkJCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgaGF2ZSBpdHMgbW9kdGlt
ZSB1cGRhdGVkCiAJCQkgKiB3aGVuZXZlciBjcm9udGFiKDEpIGNoYW5nZXMgYSBjcm9udGFiOyB0
aGlzIGlzCi0JCQkgKiB0aGUgc2lnbmFsIGZvciBjcm9uZCg4KSB0byBsb29rIGF0IGVhY2ggaW5k
aXZpZHVhbAorCQkJICogdGhlIHNpZ25hbCBmb3IgY3Jvbig4KSB0byBsb29rIGF0IGVhY2ggaW5k
aXZpZHVhbAogCQkJICogY3JvbnRhYiBmaWxlIGFuZCByZWxvYWQgdGhvc2Ugd2hvc2UgbW9kdGlt
ZXMgYXJlCiAJCQkgKiBuZXdlciB0aGFuIHRoZXkgd2VyZSBsYXN0IHRpbWUgYXJvdW5kIChvciB3
aGljaAogCQkJICogZGlkbid0IGV4aXN0IGxhc3QgdGltZSBhcm91bmQuLi4pCiAJCQkgKi8KICNk
ZWZpbmUgU1BPT0xfRElSCSJ0YWJzIgogCi0JCQkvKiB1bmRlZmluaW5nIHRoZXNlIHR1cm5zIG9m
ZiB0aGVpciBmZWF0dXJlcy4gIG5vdGUKLQkJCSAqIHRoYXQgQUxMT1dfRklMRSBhbmQgREVOWV9G
SUxFIG11c3QgYm90aCBiZSBkZWZpbmVkCi0JCQkgKiBpbiBvcmRlciB0byBlbmFibGUgdGhlIGFs
bG93L2RlbnkgY29kZS4gIElmIG5laXRoZXIKLQkJCSAqIExPR19GSUxFIG9yIFNZU0xPRyBpcyBk
ZWZpbmVkLCB3ZSBkb24ndCBsb2cuICBJZgotCQkJICogYm90aCBhcmUgZGVmaW5lZCwgd2UgbG9n
IGJvdGggd2F5cy4KLQkJCSAqLwotI2RlZmluZQlBTExPV19GSUxFCSJhbGxvdyIJCS8qLSovCi0j
ZGVmaW5lIERFTllfRklMRQkiZGVueSIJCS8qLSovCi0vKiNkZWZpbmUgTE9HX0ZJTEUgICAgICAg
ICJsb2ciKi8gICAgICAgICAgIC8qLSovCisJCQkvKiBjcm9uIGFsbG93L2RlbnkgZmlsZS4gIEF0
IGxlYXN0IGNyb24uZGVueSBtdXN0CisJCQkgKiBleGlzdCBmb3Igb3JkaW5hcnkgdXNlcnMgdG8g
cnVuIGNyb250YWIuCisJCQkgKi8KKyNkZWZpbmUJQUxMT1dfRklMRQkiYWxsb3ciCisjZGVmaW5l
CURFTllfRklMRQkiZGVueSIKKworCQkJLyogdW5kZWZpbmluZyB0aGlzIHR1cm5zIG9mZiBsb2dn
aW5nIHRvIGEgZmlsZS4gIElmCisJCQkgKiBuZWl0aGVyIExPR19GSUxFIG9yIFNZU0xPRyBpcyBk
ZWZpbmVkLCB3ZSBkb24ndCBsb2cuCisJCQkgKiBJZiBib3RoIGFyZSBkZWZpbmVkLCB3ZSBsb2cg
Ym90aCB3YXlzLiAgTm90ZSB0aGF0IGlmCisJCQkgKiBMT0dfQ1JPTiBpcyBkZWZpbmVkIGJ5IDxz
eXNsb2cuaD4sIExPR19GSUxFIHdpbGwgbm90CisJCQkgKiBiZSB1c2VkLgorCQkJICovCisjZGVm
aW5lIExPR19GSUxFCSJsb2ciCiAKIAkJCS8qIHdoZXJlIHNob3VsZCB0aGUgZGFlbW9uIHN0aWNr
IGl0cyBQSUQ/CisJCQkgKiBQSURESVIgbXVzdCBlbmQgaW4gJy8nLgogCQkJICovCiAjaWZkZWYg
X1BBVEhfVkFSUlVOCiAjIGRlZmluZSBQSURESVIJX1BBVEhfVkFSUlVOCkBAIC01OSw2ICs3MSw4
IEBACiAjIGRlZmluZSBQSURESVIgIi9ldGMvIgogI2VuZGlmCiAjZGVmaW5lIFBJREZJTEUJCSIl
c2Nyb24ucGlkIgorI2RlZmluZSBTT0NLRklMRSAgICAgICAgIi5zb2NrIgorI2RlZmluZSBfUEFU
SF9DUk9OX1BJRAlQSURESVIgUElERklMRQogCiAJCQkvKiA0LjNCU0Qtc3R5bGUgY3JvbnRhYiAq
LwogI2RlZmluZSBTWVNDUk9OVEFCCSIvZXRjL2Nyb250YWIiCkBAIC03Miw2ICs4NiwxMCBAQAog
IyBkZWZpbmUgRURJVE9SICIvdXNyL3VjYi92aSIKICNlbmRpZgogCisjaWZuZGVmIF9QQVRIX1NF
TkRNQUlMCisjIGRlZmluZSBfUEFUSF9TRU5ETUFJTCAiL3Vzci9saWIvc2VuZG1haWwiCisjZW5k
aWYKKwogI2lmbmRlZiBfUEFUSF9CU0hFTEwKICMgZGVmaW5lIF9QQVRIX0JTSEVMTCAiL2Jpbi9z
aCIKICNlbmRpZgpAQCAtNzksMyArOTcsMTMgQEAKICNpZm5kZWYgX1BBVEhfREVGUEFUSAogIyBk
ZWZpbmUgX1BBVEhfREVGUEFUSCAiL3Vzci9iaW46L2JpbiIKICNlbmRpZgorCisjaWZuZGVmIF9Q
QVRIX1RNUAorIyBkZWZpbmUgX1BBVEhfVE1QICIvdG1wIgorI2VuZGlmCisKKyNpZm5kZWYgX1BB
VEhfREVWTlVMTAorIyBkZWZpbmUgX1BBVEhfREVWTlVMTCAiL2Rldi9udWxsIgorI2VuZGlmCisK
KyNlbmRpZiAvKiBfUEFUSE5BTUVTX0hfICovCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9j
cm9uL2Nyb24vcG9wZW4uYyBmcmVlYnNkX2Nyb24vY3Jvbi9wb3Blbi5jCi0tLSAvdXNyL3NyYy91
c3Iuc2Jpbi9jcm9uL2Nyb24vcG9wZW4uYwkyMDE0LTAxLTE2IDIxOjQzOjQ5LjAwMDAwMDAwMCAr
MDEwMAorKysgZnJlZWJzZF9jcm9uL2Nyb24vcG9wZW4uYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3
MzQ0NDgxMiArMDIwMApAQCAtMjgsNyArMjgsNyBAQAogc3RhdGljIGNoYXIgc2Njc2lkW10gPSAi
QCgjKXBvcGVuLmMJNS43IChCZXJrZWxleSkgMi8xNC84OSI7CiAjZW5kaWYKIHN0YXRpYyBjb25z
dCBjaGFyIHJjc2lkW10gPQotICAiJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4wL3Vzci5zYmluL2Ny
b24vY3Jvbi9wb3Blbi5jIDE1OTUyNyAyMDA2LTA2LTExIDIxOjEzOjQ5WiBtYXhpbSAkIjsKKyAg
IiRGcmVlQlNEOiByZWxlbmcvMTAuMC91c3Iuc2Jpbi9jcm9uL2Nyb24vcG9wZW4uYyAxNTk1Mjcg
MjAwNi0wNi0xMSAyMToxMzo0OVogbWF4aW0gJCI7CiAjZW5kaWYgLyogbm90IGxpbnQgKi8KIAog
I2luY2x1ZGUgImNyb24uaCIKZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9z
dHJ1Y3RzLmggZnJlZWJzZF9jcm9uL2Nyb24vc3RydWN0cy5oCi0tLSAvdXNyL3NyYy91c3Iuc2Jp
bi9jcm9uL2Nyb24vc3RydWN0cy5oCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAw
CisrKyBmcmVlYnNkX2Nyb24vY3Jvbi9zdHJ1Y3RzLmgJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzM0
NDQ4MTIgKzAyMDAKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICRJZDogc3RydWN0cy5oLHYgMS43
IDIwMDQvMDEvMjMgMTg6NTY6NDMgdml4aWUgRXhwICQKKyAqLworCisvKgorICogQ29weXJpZ2h0
IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAoIklTQyIpCisg
KiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVt
LCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3Ry
aWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBm
ZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmln
aHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVz
LgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xB
SU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xV
RElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MuICBJTiBOTyBFVkVOVCBTSEFMTCBJU0MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJ
QUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFN
QUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQ
Uk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0Ug
T1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVD
VElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLwor
Cit0eXBlZGVmCXN0cnVjdCBfZW50cnkgeworCXN0cnVjdCBfZW50cnkJKm5leHQ7CisJdWlkX3QJ
dWlkOworCWdpZF90CWdpZDsKKyNpZmRlZiBMT0dJTl9DQVAKKwljaGFyCSpjbGFzczsKKyNlbmRp
ZgorCWNoYXIJCSoqZW52cDsKKwljaGFyCQkqY21kOworCWJpdHN0cl90CWJpdF9kZWNsKHNlY29u
ZCwgU0VDT05EX0NPVU5UKTsKKwliaXRzdHJfdAliaXRfZGVjbChtaW51dGUsIE1JTlVURV9DT1VO
VCk7CisJYml0c3RyX3QJYml0X2RlY2woaG91ciwgICBIT1VSX0NPVU5UKTsKKwliaXRzdHJfdAli
aXRfZGVjbChkb20sICAgIERPTV9DT1VOVCk7CisJYml0c3RyX3QJYml0X2RlY2wobW9udGgsICBN
T05USF9DT1VOVCk7CisJYml0c3RyX3QJYml0X2RlY2woZG93LCAgICBET1dfQ09VTlQpOworCWlu
dAkJZmxhZ3M7CisjZGVmaW5lCU1JTl9TVEFSCTB4MDEKKyNkZWZpbmUJSFJfU1RBUgkJMHgwMgor
I2RlZmluZQlET01fU1RBUgkweDA0CisjZGVmaW5lCURPV19TVEFSCTB4MDgKKyNkZWZpbmUJV0hF
Tl9SRUJPT1QJMHgxMAorI2RlZmluZQlET05UX0xPRwkweDIwCisJdGltZV90CQlsYXN0cnVuOwor
fSBlbnRyeTsKKworCQkJLyogdGhlIGNyb250YWIgZGF0YWJhc2Ugd2lsbCBiZSBhIGxpc3Qgb2Yg
dGhlCisJCQkgKiBmb2xsb3dpbmcgc3RydWN0dXJlLCBvbmUgZWxlbWVudCBwZXIgdXNlcgorCQkJ
ICogcGx1cyBvbmUgZm9yIHRoZSBzeXN0ZW0uCisJCQkgKgorCQkJICogVGhlc2UgYXJlIHRoZSBj
cm9udGFicy4KKwkJCSAqLworCit0eXBlZGVmCXN0cnVjdCBfdXNlciB7CisJc3RydWN0IF91c2Vy
CSpuZXh0LCAqcHJldjsJLyogbGlua3MgKi8KKwljaGFyCQkqbmFtZTsKKwl0aW1lX3QJCW10aW1l
OwkJLyogbGFzdCBtb2R0aW1lIG9mIGNyb250YWIgKi8KKwllbnRyeQkJKmNyb250YWI7CS8qIHRo
aXMgcGVyc29uJ3MgY3JvbnRhYiAqLworfSB1c2VyOworCit0eXBlZGVmCXN0cnVjdCBfY3Jvbl9k
YiB7CisJdXNlcgkJKmhlYWQsICp0YWlsOwkvKiBsaW5rcyAqLworCXRpbWVfdAkJbXRpbWU7CQkv
KiBsYXN0IG1vZHRpbWUgb24gc3Bvb2xkaXIgKi8KK30gY3Jvbl9kYjsKKwkJCQkvKiBpbiB0aGUg
QyB0cmFkaXRpb24sIHdlIG9ubHkgY3JlYXRlCisJCQkJICogdmFyaWFibGVzIGZvciB0aGUgbWFp
biBwcm9ncmFtLCBqdXN0CisJCQkJICogZXh0ZXJuIHRoZW0gZWxzZXdoZXJlLgorCQkJCSAqLwpk
aWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL3VzZXIuYyBmcmVlYnNkX2Nyb24v
Y3Jvbi91c2VyLmMKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi91c2VyLmMJMjAxNC0w
MS0xNiAyMTo0Mzo0OS4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9jcm9uL3VzZXIu
YwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MzQ0NDgxMiArMDIwMApAQCAtMSwzOCArMSwzNyBAQAog
LyogQ29weXJpZ2h0IDE5ODgsMTk5MCwxOTkzLDE5OTQgYnkgUGF1bCBWaXhpZQogICogQWxsIHJp
Z2h0cyByZXNlcnZlZAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgYnkgSW50ZXJu
ZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuICgiSVNDIikKKyAqIENvcHlyaWdodCAoYykgMTk5
NywyMDAwIGJ5IEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0sIEluYy4KICAqCi0gKiBEaXN0
cmlidXRlIGZyZWVseSwgZXhjZXB0OiBkb24ndCByZW1vdmUgbXkgbmFtZSBmcm9tIHRoZSBzb3Vy
Y2Ugb3IKLSAqIGRvY3VtZW50YXRpb24gKGRvbid0IHRha2UgY3JlZGl0IGZvciBteSB3b3JrKSwg
bWFyayB5b3VyIGNoYW5nZXMgKGRvbid0Ci0gKiBnZXQgbWUgYmxhbWVkIGZvciB5b3VyIHBvc3Np
YmxlIGJ1Z3MpLCBkb24ndCBhbHRlciBvciByZW1vdmUgdGhpcwotICogbm90aWNlLiAgTWF5IGJl
IHNvbGQgaWYgYnVpbGRhYmxlIHNvdXJjZSBpcyBwcm92aWRlZCB0byBidXllci4gIE5vCi0gKiB3
YXJyYW50ZWUgb2YgYW55IGtpbmQsIGV4cHJlc3Mgb3IgaW1wbGllZCwgaXMgaW5jbHVkZWQgd2l0
aCB0aGlzCi0gKiBzb2Z0d2FyZTsgdXNlIGF0IHlvdXIgb3duIHJpc2ssIHJlc3BvbnNpYmlsaXR5
IGZvciBkYW1hZ2VzIChpZiBhbnkpIHRvCi0gKiBhbnlvbmUgcmVzdWx0aW5nIGZyb20gdGhlIHVz
ZSBvZiB0aGlzIHNvZnR3YXJlIHJlc3RzIGVudGlyZWx5IHdpdGggdGhlCi0gKiB1c2VyLgorICog
UGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0
d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdy
YW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0
aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgogICoKLSAqIFNlbmQg
YnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgZW5oYW5jZW1lbnRzLCByZXF1ZXN0cywgZmxhbWVzLCBl
dGMuLCBhbmQKLSAqIEknbGwgdHJ5IHRvIGtlZXAgYSB2ZXJzaW9uIHVwIHRvIGRhdGUuICBJIGNh
biBiZSByZWFjaGVkIGFzIGZvbGxvd3M6Ci0gKiBQYXVsIFZpeGllICAgICAgICAgIDxwYXVsQHZp
eC5jb20+ICAgICAgICAgIHV1bmV0IWRlY3dybCF2aXhpZSFwYXVsCisgKiBUSEUgU09GVFdBUkUg
SVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICog
V0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFO
VElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hB
TEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVT
VUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgor
ICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElP
TiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBF
UkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAotI2lmICFkZWZpbmVkKGxpbnQpICYm
ICFkZWZpbmVkKExJTlQpCi1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0KLSAgIiRGcmVlQlNE
OiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Nyb24vdXNlci5jIDUwNDc5IDE5OTktMDgt
MjggMDE6MzU6NTlaIHBldGVyICQiOwotI2VuZGlmCisvLyNpZiAhZGVmaW5lZChsaW50KSAmJiAh
ZGVmaW5lZChMSU5UKQorLy9zdGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogdXNlci5jLHYgMS41
IDIwMDQvMDEvMjMgMTg6NTY6NDMgdml4aWUgRXhwICQiOworLy8jZW5kaWYKIAogLyogdml4IDI2
amFuODcgW2xvZyBpcyBpbiBSQ1MgZmlsZV0KICAqLwogCi0KICNpbmNsdWRlICJjcm9uLmgiCiAK
IHN0YXRpYyBjaGFyICpVc2VyX25hbWU7Ci0KIHZvaWQKLWZyZWVfdXNlcih1KQotCXVzZXIJKnU7
Ci17Ci0JZW50cnkJKmUsICpuZTsKK2ZyZWVfdXNlcih1c2VyICp1KSB7CisJZW50cnkgKmUsICpu
ZTsKIAogCWZyZWUodS0+bmFtZSk7CiAJZm9yIChlID0gdS0+Y3JvbnRhYjsgIGUgIT0gTlVMTDsg
IGUgPSBuZSkgewpAQCAtNDMsNTYgKzQyLDQ5IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1sb2dfZXJy
b3IobXNnKQotCWNoYXIJKm1zZzsKLXsKK2xvZ19lcnJvcihjaGFyICptc2cpIHsKIAlsb2dfaXQo
VXNlcl9uYW1lLCBnZXRwaWQoKSwgIlBBUlNFIiwgbXNnKTsKIH0KIAogdXNlciAqCi1sb2FkX3Vz
ZXIoY3JvbnRhYl9mZCwgcHcsIG5hbWUpCi0JaW50CQljcm9udGFiX2ZkOwotCXN0cnVjdCBwYXNz
d2QJKnB3OwkJLyogTlVMTCBpbXBsaWVzIHN5c2Nyb250YWIgKi8KLQljaGFyCQkqbmFtZTsKLXsK
LQljaGFyCWVudnN0cltNQVhfRU5WU1RSXTsKLQlGSUxFCSpmaWxlOwotCXVzZXIJKnU7Ci0JZW50
cnkJKmU7Ci0JaW50CXN0YXR1czsKLQljaGFyCSoqZW52cCwgKip0ZW52cDsKK2xvYWRfdXNlcihp
bnQgY3JvbnRhYl9mZCwgc3RydWN0IHBhc3N3ZAkqcHcsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKwlj
aGFyIGVudnN0cltNQVhfRU5WU1RSXTsKKwlGSUxFICpmaWxlOworCXVzZXIgKnU7CisJZW50cnkg
KmU7CisJaW50IHN0YXR1cywgc2F2ZV9lcnJubzsKKwljaGFyICoqZW52cCwgKip0ZW52cDsKIAog
CWlmICghKGZpbGUgPSBmZG9wZW4oY3JvbnRhYl9mZCwgInIiKSkpIHsKLQkJd2FybigiZmRvcGVu
IG9uIGNyb250YWJfZmQgaW4gbG9hZF91c2VyIik7Ci0JCXJldHVybiBOVUxMOworCQlwZXJyb3Io
ImZkb3BlbiBvbiBjcm9udGFiX2ZkIGluIGxvYWRfdXNlciIpOworCQlyZXR1cm4gKE5VTEwpOwog
CX0KIAogCURlYnVnKERQQVJTLCAoImxvYWRfdXNlcigpXG4iKSkKIAogCS8qIGZpbGUgaXMgb3Bl
bi4gIGJ1aWxkIHVzZXIgZW50cnksIHRoZW4gcmVhZCB0aGUgY3JvbnRhYiBmaWxlLgogCSAqLwot
CWlmICgodSA9ICh1c2VyICopIG1hbGxvYyhzaXplb2YodXNlcikpKSA9PSBOVUxMKSB7Ci0JCWVy
cm5vID0gRU5PTUVNOwotCQlyZXR1cm4gTlVMTDsKLQl9CisJaWYgKCh1ID0gKHVzZXIgKikgbWFs
bG9jKHNpemVvZih1c2VyKSkpID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CiAJaWYgKCh1LT5u
YW1lID0gc3RyZHVwKG5hbWUpKSA9PSBOVUxMKSB7CisJCXNhdmVfZXJybm8gPSBlcnJubzsKIAkJ
ZnJlZSh1KTsKLQkJZXJybm8gPSBFTk9NRU07Ci0JCXJldHVybiBOVUxMOworCQllcnJubyA9IHNh
dmVfZXJybm87CisJCXJldHVybiAoTlVMTCk7CiAJfQogCXUtPmNyb250YWIgPSBOVUxMOwogCi0J
LyogCi0JICogaW5pdCBlbnZpcm9ubWVudC4gIHRoaXMgd2lsbCBiZSBjb3BpZWQvYXVnbWVudGVk
IGZvciBlYWNoIGVudHJ5LgorCS8qIGluaXQgZW52aXJvbm1lbnQuICB0aGlzIHdpbGwgYmUgY29w
aWVkL2F1Z21lbnRlZCBmb3IgZWFjaCBlbnRyeS4KIAkgKi8KIAlpZiAoKGVudnAgPSBlbnZfaW5p
dCgpKSA9PSBOVUxMKSB7CisJCXNhdmVfZXJybm8gPSBlcnJubzsKIAkJZnJlZSh1LT5uYW1lKTsK
IAkJZnJlZSh1KTsKLQkJcmV0dXJuIE5VTEw7CisJCWVycm5vID0gc2F2ZV9lcnJubzsKKwkJcmV0
dXJuIChOVUxMKTsKIAl9CiAKLQkvKgotCSAqIGxvYWQgdGhlIGNyb250YWIKKwkvKiBsb2FkIHRo
ZSBjcm9udGFiCiAJICovCiAJd2hpbGUgKChzdGF0dXMgPSBsb2FkX2VudihlbnZzdHIsIGZpbGUp
KSA+PSBPSykgewogCQlzd2l0Y2ggKHN0YXR1cykgewpAQCAtMTAxLDcgKzkzLDcgQEAKIAkJCXUg
PSBOVUxMOwogCQkJZ290byBkb25lOwogCQljYXNlIEZBTFNFOgotCQkJVXNlcl9uYW1lID0gdS0+
bmFtZTsgICAgLyogZm9yIGxvZ19lcnJvciAqLworCQkJVXNlcl9uYW1lID0gdS0+bmFtZTsKIAkJ
CWUgPSBsb2FkX2VudHJ5KGZpbGUsIGxvZ19lcnJvciwgcHcsIGVudnApOwogCQkJaWYgKGUpIHsK
IAkJCQllLT5uZXh0ID0gdS0+Y3JvbnRhYjsKQEAgLTEwOSwxMyArMTAxLDE0IEBACiAJCQl9CiAJ
CQlicmVhazsKIAkJY2FzZSBUUlVFOgotCQkJaWYgKCh0ZW52cCA9IGVudl9zZXQoZW52cCwgZW52
c3RyKSkpIHsKLQkJCQllbnZwID0gdGVudnA7Ci0JCQl9IGVsc2UgeworCQkJaWYgKCh0ZW52cCA9
IGVudl9zZXQoZW52cCwgZW52c3RyKSkgPT0gTlVMTCkgeworCQkJCXNhdmVfZXJybm8gPSBlcnJu
bzsKIAkJCQlmcmVlX3VzZXIodSk7CiAJCQkJdSA9IE5VTEw7CisJCQkJZXJybm8gPSBzYXZlX2Vy
cm5vOwogCQkJCWdvdG8gZG9uZTsKIAkJCX0KKwkJCWVudnAgPSB0ZW52cDsKIAkJCWJyZWFrOwog
CQl9CiAJfQpAQCAtMTI0LDUgKzExNyw1IEBACiAJZW52X2ZyZWUoZW52cCk7CiAJZmNsb3NlKGZp
bGUpOwogCURlYnVnKERQQVJTLCAoIi4uLmxvYWRfdXNlcigpIGRvbmVcbiIpKQotCXJldHVybiB1
OworCXJldHVybiAodSk7CiB9CmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb250
YWIvTWFrZWZpbGUgZnJlZWJzZF9jcm9uL2Nyb250YWIvTWFrZWZpbGUKLS0tIC91c3Ivc3JjL3Vz
ci5zYmluL2Nyb24vY3JvbnRhYi9NYWtlZmlsZQkyMDE0LTAxLTE2IDIxOjQzOjUwLjAwMDAwMDAw
MCArMDEwMAorKysgZnJlZWJzZF9jcm9uL2Nyb250YWIvTWFrZWZpbGUJMjAxNC0wNi0xMSAxNjo0
Mjo1NS4yNzM0NDQ4MTIgKzAyMDAKQEAgLTEsMTEgKzEsMTIgQEAKLSMgJEZyZWVCU0Q6IHJlbGVh
c2UvMTAuMC4wL3Vzci5zYmluL2Nyb24vY3JvbnRhYi9NYWtlZmlsZSAxODUwNDAgMjAwOC0xMS0x
OCAwMDoxMjoxNVogbWF0dGVvICQKKyMgJEZyZWVCU0Q6IHJlbGVuZy8xMC4wL3Vzci5zYmluL2Ny
b24vY3JvbnRhYi9NYWtlZmlsZSAxODUwNDAgMjAwOC0xMS0xOCAwMDoxMjoxNVogbWF0dGVvICQK
IAogQklORElSPQkvdXNyL2JpbgogCiBQUk9HPQljcm9udGFiCiBNQU49CWNyb250YWIuMSBjcm9u
dGFiLjUKIEJJTk9XTj0Jcm9vdAotQklOTU9ERT00NTU1CitCSU5HUlA9IGNyb250YWIKK0JJTk1P
REU9MjU1NQogUFJFQ0lPVVNQUk9HPQogCiBXQVJOUz89CTMKZGlmZiAtcnVOIC91c3Ivc3JjL3Vz
ci5zYmluL2Nyb24vY3JvbnRhYi9jcm9udGFiLjEgZnJlZWJzZF9jcm9uL2Nyb250YWIvY3JvbnRh
Yi4xCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb250YWIvY3JvbnRhYi4xCTIwMTQtMDEt
MTYgMjE6NDM6NTAuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vY3JvbnRhYi9jcm9u
dGFiLjEJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzM0NDQ4MTIgKzAyMDAKQEAgLTE1LDcgKzE1LDcg
QEAKIC5cIiAqIFBhdWwgVml4aWUgICAgICAgICAgPHBhdWxAdml4LmNvbT4gICAgICAgICAgdXVu
ZXQhZGVjd3JsIXZpeGllIXBhdWwKIC5cIiAqLwogLlwiCi0uXCIgJEZyZWVCU0Q6IHJlbGVhc2Uv
MTAuMC4wL3Vzci5zYmluL2Nyb24vY3JvbnRhYi9jcm9udGFiLjEgMjA4MDU0IDIwMTAtMDUtMTQg
MDE6MjU6MzBaIGJydWVmZmVyICQKKy5cIiAkRnJlZUJTRDogcmVsZW5nLzEwLjAvdXNyLnNiaW4v
Y3Jvbi9jcm9udGFiL2Nyb250YWIuMSAyMDgwNTQgMjAxMC0wNS0xNCAwMToyNTozMFogYnJ1ZWZm
ZXIgJAogLlwiCiAuRGQgTWF5IDEzLCAyMDEwCiAuRHQgQ1JPTlRBQiAxCmRpZmYgLXJ1TiAvdXNy
L3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb250YWIvY3JvbnRhYi41IGZyZWVic2RfY3Jvbi9jcm9udGFi
L2Nyb250YWIuNQotLS0gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9udGFiL2Nyb250YWIuNQky
MDE0LTAxLTE2IDIxOjQzOjUwLjAwMDAwMDAwMCArMDEwMAorKysgZnJlZWJzZF9jcm9uL2Nyb250
YWIvY3JvbnRhYi41CTIwMTQtMDYtMTEgMTY6NDI6NTUuMjczNDQ0ODEyICswMjAwCkBAIC0xNSw3
ICsxNSw3IEBACiAuXCIgKiBQYXVsIFZpeGllICAgICAgICAgIDxwYXVsQHZpeC5jb20+ICAgICAg
ICAgIHV1bmV0IWRlY3dybCF2aXhpZSFwYXVsCiAuXCIgKi8KIC5cIgotLlwiICRGcmVlQlNEOiBy
ZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Nyb250YWIvY3JvbnRhYi41IDI0MjEwMSAyMDEy
LTEwLTI1IDIyOjU0OjI5WiBzb2JvbWF4ICQKKy5cIiAkRnJlZUJTRDogcmVsZW5nLzEwLjAvdXNy
LnNiaW4vY3Jvbi9jcm9udGFiL2Nyb250YWIuNSAyNDIxMDEgMjAxMi0xMC0yNSAyMjo1NDoyOVog
c29ib21heCAkCiAuXCIKIC5EZCBBcHJpbCAyOCwgMjAxMgogLkR0IENST05UQUIgNQpkaWZmIC1y
dU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9udGFiL2Nyb250YWIuYyBmcmVlYnNkX2Nyb24v
Y3JvbnRhYi9jcm9udGFiLmMKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3JvbnRhYi9jcm9u
dGFiLmMJMjAxNC0wMS0xNiAyMTo0Mzo1MC4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jv
bi9jcm9udGFiL2Nyb250YWIuYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3NDQ0NDg5NiArMDIwMApA
QCAtMSwyNCArMSwyNiBAQAogLyogQ29weXJpZ2h0IDE5ODgsMTk5MCwxOTkzLDE5OTQgYnkgUGF1
bCBWaXhpZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICovCisKKy8qCisgKiBDb3B5cmlnaHQg
KGMpIDIwMDQgYnkgSW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuICgiSVNDIikKKyAq
IENvcHlyaWdodCAoYykgMTk5NywyMDAwIGJ5IEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0s
IEluYy4KICAqCi0gKiBEaXN0cmlidXRlIGZyZWVseSwgZXhjZXB0OiBkb24ndCByZW1vdmUgbXkg
bmFtZSBmcm9tIHRoZSBzb3VyY2Ugb3IKLSAqIGRvY3VtZW50YXRpb24gKGRvbid0IHRha2UgY3Jl
ZGl0IGZvciBteSB3b3JrKSwgbWFyayB5b3VyIGNoYW5nZXMgKGRvbid0Ci0gKiBnZXQgbWUgYmxh
bWVkIGZvciB5b3VyIHBvc3NpYmxlIGJ1Z3MpLCBkb24ndCBhbHRlciBvciByZW1vdmUgdGhpcwot
ICogbm90aWNlLiAgTWF5IGJlIHNvbGQgaWYgYnVpbGRhYmxlIHNvdXJjZSBpcyBwcm92aWRlZCB0
byBidXllci4gIE5vCi0gKiB3YXJyYW50ZWUgb2YgYW55IGtpbmQsIGV4cHJlc3Mgb3IgaW1wbGll
ZCwgaXMgaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBzb2Z0d2FyZTsgdXNlIGF0IHlvdXIgb3duIHJp
c2ssIHJlc3BvbnNpYmlsaXR5IGZvciBkYW1hZ2VzIChpZiBhbnkpIHRvCi0gKiBhbnlvbmUgcmVz
dWx0aW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIHJlc3RzIGVudGlyZWx5IHdpdGgg
dGhlCi0gKiB1c2VyLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRp
c3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91
dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5
cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29w
aWVzLgogICoKLSAqIFNlbmQgYnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgZW5oYW5jZW1lbnRzLCBy
ZXF1ZXN0cywgZmxhbWVzLCBldGMuLCBhbmQKLSAqIEknbGwgdHJ5IHRvIGtlZXAgYSB2ZXJzaW9u
IHVwIHRvIGRhdGUuICBJIGNhbiBiZSByZWFjaGVkIGFzIGZvbGxvd3M6Ci0gKiBQYXVsIFZpeGll
ICAgICAgICAgIDxwYXVsQHZpeC5jb20+ICAgICAgICAgIHV1bmV0IWRlY3dybCF2aXhpZSFwYXVs
Ci0gKiBGcm9tIElkOiBjcm9udGFiLmMsdiAyLjEzIDE5OTQvMDEvMTcgMDM6MjA6Mzcgdml4aWUg
RXhwCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJU0NMQUlN
UyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJ
TkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFM
LCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFH
RVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJP
RklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9S
IE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENPTk5FQ1RJ
T04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAog
I2lmICFkZWZpbmVkKGxpbnQpICYmICFkZWZpbmVkKExJTlQpCi1zdGF0aWMgY29uc3QgY2hhciBy
Y3NpZFtdID0KLSAgIiRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Nyb250
YWIvY3JvbnRhYi5jIDIzOTk5MSAyMDEyLTA5LTAxIDE0OjQ1OjE1WiBlZCAkIjsKK3N0YXRpYyBj
aGFyIHJjc2lkW10gPSAiJElkOiBjcm9udGFiLmMsdiAxLjEyIDIwMDQvMDEvMjMgMTg6NTY6NDIg
dml4aWUgRXhwICQiOwogI2VuZGlmCiAKIC8qIGNyb250YWIgLSBpbnN0YWxsIGFuZCBtYW5hZ2Ug
cGVyLXVzZXIgY3JvbnRhYiBmaWxlcwpAQCAtMjksMzYgKzMxLDIwIEBACiAjZGVmaW5lCU1BSU5f
UFJPR1JBTQogCiAjaW5jbHVkZSAiY3Jvbi5oIgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVk
ZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxtZDUuaD4KLSNpbmNsdWRlIDxwYXRocy5oPgotI2luY2x1
ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpZmRlZiBVU0VfVVRJTUVT
Ci0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDx0aW1lLmg+Ci0jIGlu
Y2x1ZGUgPHV0aW1lLmg+Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBPU0lYKQotIyBpbmNsdWRlIDxs
b2NhbGUuaD4KLSNlbmRpZgotCi0jZGVmaW5lIE1ENV9TSVpFIDMzCiAjZGVmaW5lIE5IRUFERVJf
TElORVMgMwogCi0KIGVudW0gb3B0X3QJeyBvcHRfdW5rbm93biwgb3B0X2xpc3QsIG9wdF9kZWxl
dGUsIG9wdF9lZGl0LCBvcHRfcmVwbGFjZSB9OwogCiAjaWYgREVCVUdHSU5HCiBzdGF0aWMgY2hh
cgkqT3B0aW9uc1tdID0geyAiPz8/IiwgImxpc3QiLCAiZGVsZXRlIiwgImVkaXQiLCAicmVwbGFj
ZSIgfTsKK3N0YXRpYyBjaGFyCSpnZXRvcHRhcmdzID0gInU6bGVyeDoiOworI2Vsc2UKK3N0YXRp
YyBjaGFyCSpnZXRvcHRhcmdzID0gInU6bGVyIjsKICNlbmRpZgogCi0KIHN0YXRpYwlQSURfVAkJ
UGlkOwogc3RhdGljCWNoYXIJCVVzZXJbTUFYX1VOQU1FXSwgUmVhbFVzZXJbTUFYX1VOQU1FXTsK
LXN0YXRpYwljaGFyCQlGaWxlbmFtZVtNQVhfRk5BTUVdOworc3RhdGljCWNoYXIJCUZpbGVuYW1l
W01BWF9GTkFNRV0sIFRlbXBGaWxlbmFtZVtNQVhfRk5BTUVdOwogc3RhdGljCUZJTEUJCSpOZXdD
cm9udGFiOwogc3RhdGljCWludAkJQ2hlY2tFcnJvckNvdW50Owogc3RhdGljCWVudW0gb3B0X3QJ
T3B0aW9uOwpAQCAtNjYsOTUgKzUyLDEwMyBAQAogc3RhdGljCXZvaWQJCWxpc3RfY21kKHZvaWQp
LAogCQkJZGVsZXRlX2NtZCh2b2lkKSwKIAkJCWVkaXRfY21kKHZvaWQpLAotCQkJcG9rZV9kYWVt
b24odm9pZCksCi0JCQljaGVja19lcnJvcihjaGFyICopLAotCQkJcGFyc2VfYXJncyhpbnQgYywg
Y2hhciAqdltdKTsKKwkJCXBva2VfZGFlbW9uKHVuc2lnbmVkIGNoYXIpLAorCQkJY2hlY2tfZXJy
b3IoY29uc3QgY2hhciAqKSwKKwkJCXBhcnNlX2FyZ3MoaW50IGMsIGNoYXIgKnZbXSksCisJCQlk
aWUoaW50KTsKIHN0YXRpYwlpbnQJCXJlcGxhY2VfY21kKHZvaWQpOwogCi0KIHN0YXRpYyB2b2lk
Ci11c2FnZShjaGFyICptc2cpCi17Ci0JZnByaW50ZihzdGRlcnIsICJjcm9udGFiOiB1c2FnZSBl
cnJvcjogJXNcbiIsIG1zZyk7Ci0JZnByaW50ZihzdGRlcnIsICIlc1xuJXNcbiIsCi0JCSJ1c2Fn
ZTogY3JvbnRhYiBbLXUgdXNlcl0gZmlsZSIsCi0JCSIgICAgICAgY3JvbnRhYiBbLXUgdXNlcl0g
eyAtZSB8IC1sIHwgLXIgfSIpOwordXNhZ2UoY29uc3QgY2hhciAqbXNnKSB7CisJZnByaW50Zihz
dGRlcnIsICIlczogdXNhZ2UgZXJyb3I6ICVzXG4iLCBQcm9ncmFtTmFtZSwgbXNnKTsKKwlmcHJp
bnRmKHN0ZGVyciwgInVzYWdlOlx0JXMgWy11IHVzZXJdIGZpbGVcbiIsIFByb2dyYW1OYW1lKTsK
KwlmcHJpbnRmKHN0ZGVyciwgIlx0JXMgWy11IHVzZXJdIFsgLWUgfCAtbCB8IC1yIF1cbiIsIFBy
b2dyYW1OYW1lKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0XHQoZGVmYXVsdCBvcGVyYXRpb24gaXMg
cmVwbGFjZSwgcGVyIDEwMDMuMilcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtZVx0KGVkaXQg
dXNlcidzIGNyb250YWIpXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LWxcdChsaXN0IHVzZXIn
cyBjcm9udGFiKVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1yXHQoZGVsZXRlIHVzZXIncyBj
cm9udGFiKVxuIik7CiAJZXhpdChFUlJPUl9FWElUKTsKIH0KIAotCiBpbnQKLW1haW4oaW50IGFy
Z2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQlpbnQJZXhpdHN0YXR1czsKK21haW4oaW50IGFyZ2MsIGNo
YXIgKmFyZ3ZbXSkgeworCWludCBleGl0c3RhdHVzOwogCiAJUGlkID0gZ2V0cGlkKCk7CiAJUHJv
Z3JhbU5hbWUgPSBhcmd2WzBdOwogCi0jaWYgZGVmaW5lZChQT1NJWCkKIAlzZXRsb2NhbGUoTENf
QUxMLCAiIik7Ci0jZW5kaWYKIAogI2lmIGRlZmluZWQoQlNEKQogCXNldGxpbmVidWYoc3RkZXJy
KTsKICNlbmRpZgogCXBhcnNlX2FyZ3MoYXJnYywgYXJndik7CQkvKiBzZXRzIG1hbnkgZ2xvYmFs
cywgb3BlbnMgYSBmaWxlICovCi0Jc2V0X2Nyb25fdWlkKCk7CiAJc2V0X2Nyb25fY3dkKCk7Ci0J
aWYgKCFhbGxvd2VkKFVzZXIpKSB7Ci0JCXdhcm54KCJ5b3UgKCVzKSBhcmUgbm90IGFsbG93ZWQg
dG8gdXNlIHRoaXMgcHJvZ3JhbSIsIFVzZXIpOworCWlmICghYWxsb3dlZChSZWFsVXNlcikpIHsK
KwkJZnByaW50ZihzdGRlcnIsCisJCQkiWW91ICglcykgYXJlIG5vdCBhbGxvd2VkIHRvIHVzZSB0
aGlzIHByb2dyYW0gKCVzKVxuIiwKKwkJCVVzZXIsIFByb2dyYW1OYW1lKTsKKwkJZnByaW50Zihz
dGRlcnIsICJTZWUgY3JvbnRhYigxKSBmb3IgbW9yZSBpbmZvcm1hdGlvblxuIik7CiAJCWxvZ19p
dChSZWFsVXNlciwgUGlkLCAiQVVUSCIsICJjcm9udGFiIGNvbW1hbmQgbm90IGFsbG93ZWQiKTsK
IAkJZXhpdChFUlJPUl9FWElUKTsKIAl9CiAJZXhpdHN0YXR1cyA9IE9LX0VYSVQ7CiAJc3dpdGNo
IChPcHRpb24pIHsKLQljYXNlIG9wdF9saXN0OgkJbGlzdF9jbWQoKTsKLQkJCQlicmVhazsKLQlj
YXNlIG9wdF9kZWxldGU6CWRlbGV0ZV9jbWQoKTsKLQkJCQlicmVhazsKLQljYXNlIG9wdF9lZGl0
OgkJZWRpdF9jbWQoKTsKLQkJCQlicmVhazsKLQljYXNlIG9wdF9yZXBsYWNlOglpZiAocmVwbGFj
ZV9jbWQoKSA8IDApCi0JCQkJCWV4aXRzdGF0dXMgPSBFUlJPUl9FWElUOwotCQkJCWJyZWFrOwog
CWNhc2Ugb3B0X3Vua25vd246Ci0JCQkJYnJlYWs7CisJCWV4aXRzdGF0dXMgPSBFUlJPUl9FWElU
OworCQlicmVhazsKKwljYXNlIG9wdF9saXN0OgorCQlsaXN0X2NtZCgpOworCQlicmVhazsKKwlj
YXNlIG9wdF9kZWxldGU6CisJCWRlbGV0ZV9jbWQoKTsKKwkJYnJlYWs7CisJY2FzZSBvcHRfZWRp
dDoKKwkJZWRpdF9jbWQoKTsKKwkJYnJlYWs7CisJY2FzZSBvcHRfcmVwbGFjZToKKwkJaWYgKHJl
cGxhY2VfY21kKCkgPCAwKQorCQkJZXhpdHN0YXR1cyA9IEVSUk9SX0VYSVQ7CisJCWJyZWFrOwor
CWRlZmF1bHQ6CisJCWFib3J0KCk7CiAJfQogCWV4aXQoZXhpdHN0YXR1cyk7CiAJLypOT1RSRUFD
SEVEKi8KIH0KIAotCiBzdGF0aWMgdm9pZAotcGFyc2VfYXJncyhhcmdjLCBhcmd2KQotCWludAlh
cmdjOwotCWNoYXIJKmFyZ3ZbXTsKLXsKLQlpbnQJCWFyZ2NoOwotCWNoYXIJCXJlc29sdmVkX3Bh
dGhbUEFUSF9NQVhdOwotCi0JaWYgKCEocHcgPSBnZXRwd3VpZChnZXR1aWQoKSkpKQotCQllcnJ4
KEVSUk9SX0VYSVQsICJ5b3VyIFVJRCBpc24ndCBpbiB0aGUgcGFzc3dkIGZpbGUsIGJhaWxpbmcg
b3V0Iik7Ci0JYnplcm8ocHctPnB3X3Bhc3N3ZCwgc3RybGVuKHB3LT5wd19wYXNzd2QpKTsKLQko
dm9pZCkgc3RybmNweShVc2VyLCBwdy0+cHdfbmFtZSwgKHNpemVvZiBVc2VyKS0xKTsKLQlVc2Vy
WyhzaXplb2YgVXNlciktMV0gPSAnXDAnOwotCXN0cmNweShSZWFsVXNlciwgVXNlcik7CitwYXJz
ZV9hcmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKwlpbnQgYXJnY2g7CisKKwlpZiAoIShw
dyA9IGdldHB3dWlkKGdldHVpZCgpKSkpIAorCQllcnJ4KEVSUk9SX0VYSVQsICIlczogeW91ciBV
SUQgaXNuJ3QgaW4gdGhlIHBhc3N3b3JkIGZpbGUuIiwgCisJCQkJUHJvZ3JhbU5hbWUpOworCWlm
IChzdHJsZW4ocHctPnB3X25hbWUpID49IHNpemVvZiBVc2VyKSAKKwkJZXJyeChFUlJPUl9FWElU
LCAidXNlcm5hbWUgdG9vIGxvbmdcbiIpOworCisJc3RybGNweShVc2VyLCBwdy0+cHdfbmFtZSwg
c2l6ZW9mKFVzZXIpKTsKKwlzdHJsY3B5KFJlYWxVc2VyLCBVc2VyLCBzaXplb2YoUmVhbFVzZXIp
KTsKIAlGaWxlbmFtZVswXSA9ICdcMCc7CiAJT3B0aW9uID0gb3B0X3Vua25vd247Ci0Jd2hpbGUg
KChhcmdjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAidTpsZXJ4OiIpKSAhPSAtMSkgeworCXdoaWxl
ICgtMSAhPSAoYXJnY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgZ2V0b3B0YXJncykpKSB7CiAJCXN3
aXRjaCAoYXJnY2gpIHsKKyNpZiBERUJVR0dJTkcKIAkJY2FzZSAneCc6CiAJCQlpZiAoIXNldF9k
ZWJ1Z19mbGFncyhvcHRhcmcpKQogCQkJCXVzYWdlKCJiYWQgZGVidWcgb3B0aW9uIik7CiAJCQli
cmVhazsKKyNlbmRpZgogCQljYXNlICd1JzoKLQkJCWlmIChnZXR1aWQoKSAhPSBST09UX1VJRCkK
KwkJCWlmIChNWV9VSUQocHcpICE9IFJPT1RfVUlEKSAKIAkJCQllcnJ4KEVSUk9SX0VYSVQsICJt
dXN0IGJlIHByaXZpbGVnZWQgdG8gdXNlIC11Iik7Ci0JCQlpZiAoIShwdyA9IGdldHB3bmFtKG9w
dGFyZykpKQotCQkJCWVycngoRVJST1JfRVhJVCwgInVzZXIgYCVzJyB1bmtub3duIiwgb3B0YXJn
KTsKLQkJCWJ6ZXJvKHB3LT5wd19wYXNzd2QsIHN0cmxlbihwdy0+cHdfcGFzc3dkKSk7Ci0JCQko
dm9pZCkgc3RybmNweShVc2VyLCBwdy0+cHdfbmFtZSwgKHNpemVvZiBVc2VyKS0xKTsKLQkJCVVz
ZXJbKHNpemVvZiBVc2VyKS0xXSA9ICdcMCc7CisKKwkJCWlmICghKHB3ID0gZ2V0cHduYW0ob3B0
YXJnKSkpIAorCQkJCWVycngoRVJST1JfRVhJVCwgIiVzOiB1c2VyICVzIHVua25vd24iLCBQcm9n
cmFtTmFtZSwgb3B0YXJnKTsKKworCQkJaWYgKHN0cmxlbihvcHRhcmcpID49IHNpemVvZiBVc2Vy
KQorCQkJCXVzYWdlKCJ1c2VybmFtZSB0b28gbG9uZyIpOworCQkJKHZvaWQpIHN0cmxjcHkoVXNl
ciwgb3B0YXJnLCBzaXplb2YoVXNlcikpOwogCQkJYnJlYWs7CiAJCWNhc2UgJ2wnOgogCQkJaWYg
KE9wdGlvbiAhPSBvcHRfdW5rbm93bikKQEAgLTE3OSwyMTAgKzE3MywyMDYgQEAKIAllbmRwd2Vu
dCgpOwogCiAJaWYgKE9wdGlvbiAhPSBvcHRfdW5rbm93bikgewotCQlpZiAoYXJndltvcHRpbmRd
ICE9IE5VTEwpIHsKKwkJaWYgKGFyZ3Zbb3B0aW5kXSAhPSBOVUxMKQogCQkJdXNhZ2UoIm5vIGFy
Z3VtZW50cyBwZXJtaXR0ZWQgYWZ0ZXIgdGhpcyBvcHRpb24iKTsKLQkJfQogCX0gZWxzZSB7CiAJ
CWlmIChhcmd2W29wdGluZF0gIT0gTlVMTCkgewogCQkJT3B0aW9uID0gb3B0X3JlcGxhY2U7Ci0J
CQkodm9pZCkgc3RybmNweSAoRmlsZW5hbWUsIGFyZ3Zbb3B0aW5kXSwgKHNpemVvZiBGaWxlbmFt
ZSktMSk7Ci0JCQlGaWxlbmFtZVsoc2l6ZW9mIEZpbGVuYW1lKS0xXSA9ICdcMCc7Ci0KLQkJfSBl
bHNlIHsKKwkJCWlmIChzdHJsZW4oYXJndltvcHRpbmRdKSA+PSBzaXplb2YgRmlsZW5hbWUpCisJ
CQkJdXNhZ2UoImZpbGVuYW1lIHRvbyBsb25nIik7CisJCQkodm9pZCkgc3RybGNweSAoRmlsZW5h
bWUsIGFyZ3Zbb3B0aW5kXSwgc2l6ZW9mKEZpbGVuYW1lKSk7CisJCX0gZWxzZQogCQkJdXNhZ2Uo
ImZpbGUgbmFtZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgcmVwbGFjZSIpOwotCQl9CiAJfQogCiAJ
aWYgKE9wdGlvbiA9PSBvcHRfcmVwbGFjZSkgewotCQkvKiByZWxpbnF1aXNoIHRoZSBzZXR1aWQg
c3RhdHVzIG9mIHRoZSBiaW5hcnkgZHVyaW5nCi0JCSAqIHRoZSBvcGVuLCBsZXN0IG5vbnJvb3Qg
dXNlcnMgcmVhZCBmaWxlcyB0aGV5IHNob3VsZAotCQkgKiBub3QgYmUgYWJsZSB0byByZWFkLiAg
d2UgY2FuJ3QgdXNlIGFjY2VzcygpIGhlcmUKLQkJICogc2luY2UgdGhlcmUncyBhIHJhY2UgY29u
ZGl0aW9uLiAgdGhhbmtzIGdvIG91dCB0bwotCQkgKiBBcm50IEd1bGJyYW5kc2VuIDxhZ3VsYnJh
QHB2di51bml0Lm5vPiBmb3Igc3BvdHRpbmcKLQkJICogdGhlIHJhY2UuCi0JCSAqLwotCi0JCWlm
IChzd2FwX3VpZHMoKSA8IE9LKQotCQkJZXJyKEVSUk9SX0VYSVQsICJzd2FwcGluZyB1aWRzIik7
Ci0KIAkJLyogd2UgaGF2ZSB0byBvcGVuIHRoZSBmaWxlIGhlcmUgYmVjYXVzZSB3ZSdyZSBnb2lu
ZyB0bwogCQkgKiBjaGRpcigyKSBpbnRvIC92YXIvY3JvbiBiZWZvcmUgd2UgZ2V0IGFyb3VuZCB0
bwogCQkgKiByZWFkaW5nIHRoZSBmaWxlLgogCQkgKi8KLQkJaWYgKCFzdHJjbXAoRmlsZW5hbWUs
ICItIikpIHsKKwkJaWYgKCFzdHJjbXAoRmlsZW5hbWUsICItIikpCiAJCQlOZXdDcm9udGFiID0g
c3RkaW47Ci0JCX0gZWxzZSBpZiAocmVhbHBhdGgoRmlsZW5hbWUsIHJlc29sdmVkX3BhdGgpICE9
IE5VTEwgJiYKLQkJICAgICFzdHJjbXAocmVzb2x2ZWRfcGF0aCwgU1lTQ1JPTlRBQikpIHsKLQkJ
CWVycihFUlJPUl9FWElULCBTWVNDUk9OVEFCICIgbXVzdCBiZSBlZGl0ZWQgbWFudWFsbHkiKTsK
LQkJfSBlbHNlIHsKLQkJCWlmICghKE5ld0Nyb250YWIgPSBmb3BlbihGaWxlbmFtZSwgInIiKSkp
Ci0JCQkJZXJyKEVSUk9SX0VYSVQsICIlcyIsIEZpbGVuYW1lKTsKLQkJfQotCQlpZiAoc3dhcF91
aWRzX2JhY2soKSA8IE9LKQotCQkJZXJyKEVSUk9SX0VYSVQsICJzd2FwcGluZyB1aWRzIGJhY2si
KTsKLQl9CisJCWVsc2UgeworCQkJLyogcmVsaW5xdWlzaCB0aGUgc2V0dWlkIHN0YXR1cyBvZiB0
aGUgYmluYXJ5IGR1cmluZworCQkJICogdGhlIG9wZW4sIGxlc3Qgbm9ucm9vdCB1c2VycyByZWFk
IGZpbGVzIHRoZXkgc2hvdWxkCisJCQkgKiBub3QgYmUgYWJsZSB0byByZWFkLiAgd2UgY2FuJ3Qg
dXNlIGFjY2VzcygpIGhlcmUKKwkJCSAqIHNpbmNlIHRoZXJlJ3MgYSByYWNlIGNvbmRpdGlvbi4g
IHRoYW5rcyBnbyBvdXQgdG8KKwkJCSAqIEFybnQgR3VsYnJhbmRzZW4gPGFndWxicmFAcHZ2LnVu
aXQubm8+IGZvciBzcG90dGluZworCQkJICogdGhlIHJhY2UuCisJCQkgKi8KIAotCURlYnVnKERN
SVNDLCAoInVzZXI9JXMsIGZpbGU9JXMsIG9wdGlvbj0lc1xuIiwKLQkJICAgICAgVXNlciwgRmls
ZW5hbWUsIE9wdGlvbnNbKGludClPcHRpb25dKSkKLX0KKwkJCWlmIChzd2FwX3VpZHMoKSA8IE9L
KSAKKwkJCQllcnJ4KEVSUk9SX0VYSVQsICJzd2FwcGluZyB1aWRzIik7CiAKLXN0YXRpYyB2b2lk
Ci1jb3B5X2ZpbGUoRklMRSAqaW4sIEZJTEUgKm91dCkgewotCWludAl4LCBjaDsKKwkJCWlmICgh
KE5ld0Nyb250YWIgPSBmb3BlbihGaWxlbmFtZSwgInIiKSkpIAorCQkJCWVycngoRVJST1JfRVhJ
VCwgIiVzIiwgRmlsZW5hbWUpOwogCi0JU2V0X0xpbmVOdW0oMSkKLQkvKiBpZ25vcmUgdGhlIHRv
cCBmZXcgY29tbWVudHMgc2luY2Ugd2UgcHJvYmFibHkgcHV0IHRoZW0gdGhlcmUuCi0JICovCi0J
Zm9yICh4ID0gMDsgIHggPCBOSEVBREVSX0xJTkVTOyAgeCsrKSB7Ci0JCWNoID0gZ2V0X2NoYXIo
aW4pOwotCQlpZiAoRU9GID09IGNoKQotCQkJYnJlYWs7Ci0JCWlmICgnIycgIT0gY2gpIHsKLQkJ
CXB1dGMoY2gsIG91dCk7Ci0JCQlicmVhazsKKwkJCWlmIChzd2FwX3VpZHNfYmFjaygpIDwgT0sp
IAorCQkJCWVycngoRVJST1JfRVhJVCwgInN3YXBwaW5nIHVpZHMgYmFjayIpOwogCQl9Ci0JCXdo
aWxlIChFT0YgIT0gKGNoID0gZ2V0X2NoYXIoaW4pKSkKLQkJCWlmIChjaCA9PSAnXG4nKQotCQkJ
CWJyZWFrOwotCQlpZiAoRU9GID09IGNoKQotCQkJYnJlYWs7CiAJfQogCi0JLyogY29weSB0aGUg
cmVzdCBvZiB0aGUgY3JvbnRhYiAoaWYgYW55KSB0byB0aGUgb3V0cHV0IGZpbGUuCi0JICovCi0J
aWYgKEVPRiAhPSBjaCkKLQkJd2hpbGUgKEVPRiAhPSAoY2ggPSBnZXRfY2hhcihpbikpKQotCQkJ
cHV0YyhjaCwgb3V0KTsKKwlEZWJ1ZyhETUlTQywgKCJ1c2VyPSVzLCBmaWxlPSVzLCBvcHRpb249
JXNcbiIsCisJCSAgICAgIFVzZXIsIEZpbGVuYW1lLCBPcHRpb25zWyhpbnQpT3B0aW9uXSkpCiB9
CiAKIHN0YXRpYyB2b2lkCi1saXN0X2NtZCgpIHsKLQljaGFyCW5bTUFYX0ZOQU1FXTsKLQlGSUxF
CSpmOworbGlzdF9jbWQodm9pZCkgeworCWNoYXIgbltNQVhfRk5BTUVdOworCUZJTEUgKmY7CisJ
aW50IGNoOwogCiAJbG9nX2l0KFJlYWxVc2VyLCBQaWQsICJMSVNUIiwgVXNlcik7Ci0JKHZvaWQp
IHNucHJpbnRmKG4sIHNpemVvZihuKSwgQ1JPTl9UQUIoVXNlcikpOworCWlmICghZ2x1ZV9zdHJp
bmdzKG4sIHNpemVvZiBuLCBTUE9PTF9ESVIsIFVzZXIsICcvJykpIAorCQllcnJ4KEVSUk9SX0VY
SVQsICJwYXRoIHRvbyBsb25nIik7CisKIAlpZiAoIShmID0gZm9wZW4obiwgInIiKSkpIHsKIAkJ
aWYgKGVycm5vID09IEVOT0VOVCkKLQkJCWVycngoRVJST1JfRVhJVCwgIm5vIGNyb250YWIgZm9y
ICVzIiwgVXNlcik7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm5vIGNyb250YWIgZm9yICVzXG4iLCBV
c2VyKTsKIAkJZWxzZQotCQkJZXJyKEVSUk9SX0VYSVQsICIlcyIsIG4pOworCQkJcGVycm9yKG4p
OworCQlleGl0KEVSUk9SX0VYSVQpOwogCX0KIAogCS8qIGZpbGUgaXMgb3Blbi4gY29weSB0byBz
dGRvdXQsIGNsb3NlLgogCSAqLwotCWNvcHlfZmlsZShmLCBzdGRvdXQpOworCVNldF9MaW5lTnVt
KDEpCisJd2hpbGUgKEVPRiAhPSAoY2ggPSBnZXRfY2hhcihmKSkpCisJCXB1dGNoYXIoY2gpOwog
CWZjbG9zZShmKTsKIH0KIAotCiBzdGF0aWMgdm9pZAotZGVsZXRlX2NtZCgpIHsKLQljaGFyCW5b
TUFYX0ZOQU1FXTsKLQlpbnQgY2gsIGZpcnN0OwotCi0JaWYgKGlzYXR0eShTVERJTl9GSUxFTk8p
KSB7Ci0JCSh2b2lkKWZwcmludGYoc3RkZXJyLCAicmVtb3ZlIGNyb250YWIgZm9yICVzPyAiLCBV
c2VyKTsKLQkJZmlyc3QgPSBjaCA9IGdldGNoYXIoKTsKLQkJd2hpbGUgKGNoICE9ICdcbicgJiYg
Y2ggIT0gRU9GKQotCQkJY2ggPSBnZXRjaGFyKCk7Ci0JCWlmIChmaXJzdCAhPSAneScgJiYgZmly
c3QgIT0gJ1knKQotCQkJcmV0dXJuOwotCX0KK2RlbGV0ZV9jbWQodm9pZCkgeworCWNoYXIgbltN
QVhfRk5BTUVdOwogCiAJbG9nX2l0KFJlYWxVc2VyLCBQaWQsICJERUxFVEUiLCBVc2VyKTsKLQko
dm9pZCkgc25wcmludGYobiwgc2l6ZW9mKG4pLCBDUk9OX1RBQihVc2VyKSk7Ci0JaWYgKHVubGlu
ayhuKSkgeworCWlmICghZ2x1ZV9zdHJpbmdzKG4sIHNpemVvZiBuLCBTUE9PTF9ESVIsIFVzZXIs
ICcvJykpIAorCQllcnJ4KEVSUk9SX0VYSVQsICJwYXRoIHRvIGxvbmciKTsKKworCWlmICh1bmxp
bmsobikgIT0gMCkgewogCQlpZiAoZXJybm8gPT0gRU5PRU5UKQotCQkJZXJyeChFUlJPUl9FWElU
LCAibm8gY3JvbnRhYiBmb3IgJXMiLCBVc2VyKTsKKwkJCWZwcmludGYoc3RkZXJyLCAibm8gY3Jv
bnRhYiBmb3IgJXNcbiIsIFVzZXIpOwogCQllbHNlCi0JCQllcnIoRVJST1JfRVhJVCwgIiVzIiwg
bik7CisJCQlwZXJyb3Iobik7CisJCWV4aXQoRVJST1JfRVhJVCk7CiAJfQotCXBva2VfZGFlbW9u
KCk7CisJcG9rZV9kYWVtb24oUkVMT0FEX0NST04pOwogfQogCi0KIHN0YXRpYyB2b2lkCi1jaGVj
a19lcnJvcihtc2cpCi0JY2hhcgkqbXNnOwoteworY2hlY2tfZXJyb3IoY29uc3QgY2hhciAqbXNn
KSB7CiAJQ2hlY2tFcnJvckNvdW50Kys7CiAJZnByaW50ZihzdGRlcnIsICJcIiVzXCI6JWQ6ICVz
XG4iLCBGaWxlbmFtZSwgTGluZU51bWJlci0xLCBtc2cpOwogfQogCi0KIHN0YXRpYyB2b2lkCi1l
ZGl0X2NtZCgpIHsKLQljaGFyCQluW01BWF9GTkFNRV0sIHFbTUFYX1RFTVBTVFJdLCAqZWRpdG9y
OwotCUZJTEUJCSpmOwotCWludAkJdDsKLQlzdHJ1Y3Qgc3RhdAlzdGF0YnVmLCBmc2J1ZjsKLQlX
QUlUX1QJCXdhaXRlcjsKLQlQSURfVAkJcGlkLCB4cGlkOwotCW1vZGVfdAkJdW07Ci0JaW50CQlz
eW50YXhfZXJyb3IgPSAwOwotCWNoYXIJCW9yaWdfbWQ1W01ENV9TSVpFXTsKLQljaGFyCQluZXdf
bWQ1W01ENV9TSVpFXTsKK2VkaXRfY21kKHZvaWQpIHsKKwljaGFyIG5bTUFYX0ZOQU1FXSwgcVtN
QVhfVEVNUFNUUl0sICplZGl0b3I7CisJRklMRSAqZjsKKwlpbnQgY2gsIHQsIHg7CisJc3RydWN0
IHN0YXQgc3RhdGJ1ZiwgZnNidWY7CisJc3RydWN0IHV0aW1idWYgdXRpbWVidWY7CisJV0FJVF9U
IHdhaXRlcjsKKwlQSURfVCBwaWQsIHhwaWQ7CiAKIAlsb2dfaXQoUmVhbFVzZXIsIFBpZCwgIkJF
R0lOIEVESVQiLCBVc2VyKTsKLQkodm9pZCkgc25wcmludGYobiwgc2l6ZW9mKG4pLCBDUk9OX1RB
QihVc2VyKSk7CisJaWYgKCFnbHVlX3N0cmluZ3Mobiwgc2l6ZW9mIG4sIFNQT09MX0RJUiwgVXNl
ciwgJy8nKSkgCisJCWVycngoRVJST1JfRVhJVCwgInBhdGggdG9vIGxvbmciKTsKKwogCWlmICgh
KGYgPSBmb3BlbihuLCAiciIpKSkgewotCQlpZiAoZXJybm8gIT0gRU5PRU5UKQotCQkJZXJyKEVS
Uk9SX0VYSVQsICIlcyIsIG4pOwotCQl3YXJueCgibm8gY3JvbnRhYiBmb3IgJXMgLSB1c2luZyBh
biBlbXB0eSBvbmUiLCBVc2VyKTsKLQkJaWYgKCEoZiA9IGZvcGVuKF9QQVRIX0RFVk5VTEwsICJy
IikpKQotCQkJZXJyKEVSUk9SX0VYSVQsIF9QQVRIX0RFVk5VTEwpOworCQlpZiAoZXJybm8gIT0g
RU5PRU5UKSB7CisJCQlwZXJyb3Iobik7CisJCQlleGl0KEVSUk9SX0VYSVQpOworCQl9CisJCWZw
cmludGYoc3RkZXJyLCAibm8gY3JvbnRhYiBmb3IgJXMgLSB1c2luZyBhbiBlbXB0eSBvbmVcbiIs
CisJCQlVc2VyKTsKKwkJaWYgKCEoZiA9IGZvcGVuKF9QQVRIX0RFVk5VTEwsICJyIikpKSB7CisJ
CQlwZXJyb3IoX1BBVEhfREVWTlVMTCk7CisJCQlleGl0KEVSUk9SX0VYSVQpOworCQl9CiAJfQog
Ci0JdW0gPSB1bWFzaygwNzcpOwotCSh2b2lkKSBzbnByaW50ZihGaWxlbmFtZSwgc2l6ZW9mKEZp
bGVuYW1lKSwgIi90bXAvY3JvbnRhYi5YWFhYWFhYWFhYIik7Ci0JaWYgKCh0ID0gbWtzdGVtcChG
aWxlbmFtZSkpID09IC0xKSB7Ci0JCXdhcm4oIiVzIiwgRmlsZW5hbWUpOwotCQkodm9pZCkgdW1h
c2sodW0pOworCWlmIChmc3RhdChmaWxlbm8oZiksICZzdGF0YnVmKSA8IDApIHsKKwkJcGVycm9y
KCJmc3RhdCIpOworCQlnb3RvIGZhdGFsOworCX0KKwl1dGltZWJ1Zi5hY3RpbWUgPSBzdGF0YnVm
LnN0X2F0aW1lOworCXV0aW1lYnVmLm1vZHRpbWUgPSBzdGF0YnVmLnN0X210aW1lOworCisJLyog
VHVybiBvZmYgc2lnbmFscy4gKi8KKwkodm9pZClzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKwko
dm9pZClzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKwkodm9pZClzaWduYWwoU0lHUVVJVCwgU0lH
X0lHTik7CisKKwlpZiAoIWdsdWVfc3RyaW5ncyhGaWxlbmFtZSwgc2l6ZW9mIEZpbGVuYW1lLCBf
UEFUSF9UTVAsCisJICAgICJjcm9udGFiLlhYWFhYWFhYWFgiLCAnLycpKSB7CisJCWZwcmludGYo
c3RkZXJyLCAicGF0aCB0b28gbG9uZ1xuIik7CisJCWdvdG8gZmF0YWw7CisJfQorCWlmICgtMSA9
PSAodCA9IG1rc3RlbXAoRmlsZW5hbWUpKSkgeworCQlwZXJyb3IoRmlsZW5hbWUpOwogCQlnb3Rv
IGZhdGFsOwogCX0KLQkodm9pZCkgdW1hc2sodW0pOwogI2lmZGVmIEhBU19GQ0hPV04KLQlpZiAo
ZmNob3duKHQsIGdldHVpZCgpLCBnZXRnaWQoKSkgPCAwKSB7CisJaWYgKGZjaG93bih0LCBNWV9V
SUQocHcpLCBNWV9HSUQocHcpKSA8IDApIHsKKwkJcGVycm9yKCJmY2hvd24iKTsKKwkJZ290byBm
YXRhbDsKKwl9CiAjZWxzZQotCWlmIChjaG93bihGaWxlbmFtZSwgZ2V0dWlkKCksIGdldGdpZCgp
KSA8IDApIHsKLSNlbmRpZgotCQl3YXJuKCJmY2hvd24iKTsKKwlpZiAoY2hvd24oRmlsZW5hbWUs
IE1ZX1VJRChwdyksIC0xKSA8IDApIHsKKwkJcGVycm9yKCJjaG93biIpOwogCQlnb3RvIGZhdGFs
OwogCX0KKyNlbmRpZgogCWlmICghKE5ld0Nyb250YWIgPSBmZG9wZW4odCwgInIrIikpKSB7CiAJ
CXdhcm4oImZkb3BlbiIpOwogCQlnb3RvIGZhdGFsOwogCX0KIAotCWNvcHlfZmlsZShmLCBOZXdD
cm9udGFiKTsKKwlTZXRfTGluZU51bSgxKQorCisJLyogaWdub3JlIHRoZSB0b3AgZmV3IGNvbW1l
bnRzIHNpbmNlIHdlIHByb2JhYmx5IHB1dCB0aGVtIHRoZXJlLgorCSAqLworCXggPSAwOworCXdo
aWxlIChFT0YgIT0gKGNoID0gZ2V0X2NoYXIoZikpKSB7CisJCWlmICgnIycgIT0gY2gpIHsKKwkJ
CXB1dGMoY2gsIE5ld0Nyb250YWIpOworCQkJYnJlYWs7CisJCX0KKwkJd2hpbGUgKEVPRiAhPSAo
Y2ggPSBnZXRfY2hhcihmKSkpCisJCQlpZiAoY2ggPT0gJ1xuJykKKwkJCQlicmVhazsKKwkJaWYg
KCsreCA+PSBOSEVBREVSX0xJTkVTKQorCQkJYnJlYWs7CisJfQorCisJLyogY29weSB0aGUgcmVz
dCBvZiB0aGUgY3JvbnRhYiAoaWYgYW55KSB0byB0aGUgdGVtcCBmaWxlLgorCSAqLworCWlmIChF
T0YgIT0gY2gpCisJCXdoaWxlIChFT0YgIT0gKGNoID0gZ2V0X2NoYXIoZikpKQorCQkJcHV0Yyhj
aCwgTmV3Q3JvbnRhYik7CiAJZmNsb3NlKGYpOwotCWlmIChmZmx1c2goTmV3Q3JvbnRhYikpCi0J
CWVycihFUlJPUl9FWElULCAiJXMiLCBGaWxlbmFtZSk7CisJaWYgKGZmbHVzaChOZXdDcm9udGFi
KSA8IE9LKSAKKwkJZXJyeChFUlJPUl9FWElULCAiJXMiLCBGaWxlbmFtZSk7CiAJaWYgKGZzdGF0
KHQsICZmc2J1ZikgPCAwKSB7CiAJCXdhcm4oInVuYWJsZSB0byBmc3RhdCB0ZW1wIGZpbGUiKTsK
IAkJZ290byBmYXRhbDsKIAl9CisKKwl1dGltZShGaWxlbmFtZSwgJnV0aW1lYnVmKTsKICBhZ2Fp
bjoKLQlpZiAoc3dhcF91aWRzKCkgPCBPSykKLQkJZXJyKEVSUk9SX0VYSVQsICJzd2FwcGluZyB1
aWRzIik7Ci0JaWYgKHN0YXQoRmlsZW5hbWUsICZzdGF0YnVmKSA8IDApIHsKLQkJd2Fybigic3Rh
dCIpOwotIGZhdGFsOgkJdW5saW5rKEZpbGVuYW1lKTsKKwlyZXdpbmQoTmV3Q3JvbnRhYik7CisJ
aWYgKGZlcnJvcihOZXdDcm9udGFiKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciB3
aGlsZSB3cml0aW5nIG5ldyBjcm9udGFiIHRvICVzXG4iLAorCQkJUHJvZ3JhbU5hbWUsIEZpbGVu
YW1lKTsKKyBmYXRhbDoKKwkJdW5saW5rKEZpbGVuYW1lKTsKIAkJZXhpdChFUlJPUl9FWElUKTsK
IAl9Ci0JaWYgKHN3YXBfdWlkc19iYWNrKCkgPCBPSykKLQkJZXJyKEVSUk9SX0VYSVQsICJzd2Fw
cGluZyB1aWRzIGJhY2siKTsKLQlpZiAoc3RhdGJ1Zi5zdF9kZXYgIT0gZnNidWYuc3RfZGV2IHx8
IHN0YXRidWYuc3RfaW5vICE9IGZzYnVmLnN0X2lubykKLQkJZXJyeChFUlJPUl9FWElULCAidGVt
cCBmaWxlIG11c3QgYmUgZWRpdGVkIGluIHBsYWNlIik7Ci0JaWYgKE1ENUZpbGUoRmlsZW5hbWUs
IG9yaWdfbWQ1KSA9PSBOVUxMKSB7Ci0JCXdhcm4oIk1ENSIpOwotCQlnb3RvIGZhdGFsOwotCX0K
IAotCWlmICgoIShlZGl0b3IgPSBnZXRlbnYoIlZJU1VBTCIpKSkKLQkgJiYgKCEoZWRpdG9yID0g
Z2V0ZW52KCJFRElUT1IiKSkpCi0JICAgICkgeworCWlmICgoKGVkaXRvciA9IGdldGVudigiVklT
VUFMIikpID09IE5VTEwgfHwgKmVkaXRvciA9PSAnXDAnKSAmJgorCSAgICAoKGVkaXRvciA9IGdl
dGVudigiRURJVE9SIikpID09IE5VTEwgfHwgKmVkaXRvciA9PSAnXDAnKSkgewogCQllZGl0b3Ig
PSBFRElUT1I7CiAJfQogCkBAIC0zOTYsMTggKzM4NiwyNiBAQAogCiAJc3dpdGNoIChwaWQgPSBm
b3JrKCkpIHsKIAljYXNlIC0xOgotCQl3YXJuKCJmb3JrIik7CisJCXBlcnJvcigiZm9yayIpOwog
CQlnb3RvIGZhdGFsOwogCWNhc2UgMDoKIAkJLyogY2hpbGQgKi8KLQkJaWYgKHNldHVpZChnZXR1
aWQoKSkgPCAwKQotCQkJZXJyKEVSUk9SX0VYSVQsICJzZXR1aWQoZ2V0dWlkKCkpIik7Ci0JCWlm
IChjaGRpcigiL3RtcCIpIDwgMCkKLQkJCWVycihFUlJPUl9FWElULCAiY2hkaXIoL3RtcCkiKTsK
LQkJaWYgKHN0cmxlbihlZGl0b3IpICsgc3RybGVuKEZpbGVuYW1lKSArIDIgPj0gTUFYX1RFTVBT
VFIpCi0JCQllcnJ4KEVSUk9SX0VYSVQsICJlZGl0b3Igb3IgZmlsZW5hbWUgdG9vIGxvbmciKTsK
LQkJZXhlY2xwKGVkaXRvciwgZWRpdG9yLCBGaWxlbmFtZSwgKGNoYXIgKilOVUxMKTsKLQkJZXJy
KEVSUk9SX0VYSVQsICIlcyIsIGVkaXRvcik7CisJCWlmIChzZXRnaWQoTVlfR0lEKHB3KSkgPCAw
KSAKKwkJCWVycngoRVJST1JfRVhJVCwgInNldGdpZChnZXRnaWQoKSkiKTsKKworCQlpZiAoc2V0
dWlkKE1ZX1VJRChwdykpIDwgMCkgCisJCQllcnJ4KEVSUk9SX0VYSVQsICJzZXR1aWQoZ2V0dWlk
KCkpIik7CisKKwkJaWYgKGNoZGlyKF9QQVRIX1RNUCkgPCAwKSAKKwkJCWVycngoRVJST1JfRVhJ
VCwgX1BBVEhfVE1QKTsKKworCQlpZiAoIWdsdWVfc3RyaW5ncyhxLCBzaXplb2YgcSwgZWRpdG9y
LCBGaWxlbmFtZSwgJyAnKSkgCisJCQllcnJ4KEVSUk9SX0VYSVQsICIlczogZWRpdG9yIGNvbW1h
bmQgbGluZSB0b28gbG9uZyIsCisJCQkJCVByb2dyYW1OYW1lKTsKKworCQlleGVjbHAoX1BBVEhf
QlNIRUxMLCBfUEFUSF9CU0hFTEwsICItYyIsIHEsIChjaGFyICopMCk7CisJCXBlcnJvcihlZGl0
b3IpOworCQlleGl0KEVSUk9SX0VYSVQpOwogCQkvKk5PVFJFQUNIRUQqLwogCWRlZmF1bHQ6CiAJ
CS8qIHBhcmVudCAqLwpAQCAtNDE1LDc0ICs0MTMsNzMgQEAKIAl9CiAKIAkvKiBwYXJlbnQgKi8K
LQl7Ci0Jdm9pZCAoKnNpZ1szXSkoaW50IHNpZ25hbCk7Ci0Jc2lnWzBdID0gc2lnbmFsKFNJR0hV
UCwgU0lHX0lHTik7Ci0Jc2lnWzFdID0gc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7Ci0Jc2lnWzJd
ID0gc2lnbmFsKFNJR1RFUk0sIFNJR19JR04pOwotCXhwaWQgPSB3YWl0KCZ3YWl0ZXIpOwotCXNp
Z25hbChTSUdIVVAsIHNpZ1swXSk7Ci0Jc2lnbmFsKFNJR0lOVCwgc2lnWzFdKTsKLQlzaWduYWwo
U0lHVEVSTSwgc2lnWzJdKTsKLQl9Ci0JaWYgKHhwaWQgIT0gcGlkKSB7Ci0JCXdhcm54KCJ3cm9u
ZyBQSUQgKCVkICE9ICVkKSBmcm9tIFwiJXNcIiIsIHhwaWQsIHBpZCwgZWRpdG9yKTsKLQkJZ290
byBmYXRhbDsKLQl9Ci0JaWYgKFdJRkVYSVRFRCh3YWl0ZXIpICYmIFdFWElUU1RBVFVTKHdhaXRl
cikpIHsKLQkJd2FybngoIlwiJXNcIiBleGl0ZWQgd2l0aCBzdGF0dXMgJWQiLCBlZGl0b3IsIFdF
WElUU1RBVFVTKHdhaXRlcikpOwotCQlnb3RvIGZhdGFsOwotCX0KLQlpZiAoV0lGU0lHTkFMRUQo
d2FpdGVyKSkgewotCQl3YXJueCgiXCIlc1wiIGtpbGxlZDsgc2lnbmFsICVkICglc2NvcmUgZHVt
cGVkKSIsCi0JCQllZGl0b3IsIFdURVJNU0lHKHdhaXRlciksIFdDT1JFRFVNUCh3YWl0ZXIpID8i
IiA6Im5vICIpOwotCQlnb3RvIGZhdGFsOwotCX0KLQlpZiAoc3dhcF91aWRzKCkgPCBPSykKLQkJ
ZXJyKEVSUk9SX0VYSVQsICJzd2FwcGluZyB1aWRzIik7Ci0JaWYgKHN0YXQoRmlsZW5hbWUsICZz
dGF0YnVmKSA8IDApIHsKLQkJd2Fybigic3RhdCIpOwotCQlnb3RvIGZhdGFsOwotCX0KLQlpZiAo
c3RhdGJ1Zi5zdF9kZXYgIT0gZnNidWYuc3RfZGV2IHx8IHN0YXRidWYuc3RfaW5vICE9IGZzYnVm
LnN0X2lubykKLQkJZXJyeChFUlJPUl9FWElULCAidGVtcCBmaWxlIG11c3QgYmUgZWRpdGVkIGlu
IHBsYWNlIik7Ci0JaWYgKE1ENUZpbGUoRmlsZW5hbWUsIG5ld19tZDUpID09IE5VTEwpIHsKLQkJ
d2FybigiTUQ1Iik7Ci0JCWdvdG8gZmF0YWw7Ci0JfQotCWlmIChzd2FwX3VpZHNfYmFjaygpIDwg
T0spCi0JCWVycihFUlJPUl9FWElULCAic3dhcHBpbmcgdWlkcyBiYWNrIik7Ci0JaWYgKHN0cmNt
cChvcmlnX21kNSwgbmV3X21kNSkgPT0gMCAmJiAhc3ludGF4X2Vycm9yKSB7Ci0JCXdhcm54KCJu
byBjaGFuZ2VzIG1hZGUgdG8gY3JvbnRhYiIpOworCWZvciAoOzspIHsKKwkJeHBpZCA9IHdhaXRw
aWQocGlkLCAmd2FpdGVyLCBXVU5UUkFDRUQpOworCQlpZiAoeHBpZCA9PSAtMSkgeworCQkJaWYg
KGVycm5vICE9IEVJTlRSKQorCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHdhaXRwaWQoKSBmYWls
ZWQgd2FpdGluZyBmb3IgUElEICVsZCBmcm9tIFwiJXNcIjogJXNcbiIsCisJCQkJCVByb2dyYW1O
YW1lLCAobG9uZylwaWQsIGVkaXRvciwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfSBlbHNlIGlmICh4
cGlkICE9IHBpZCkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogd3JvbmcgUElEICglbGQgIT0g
JWxkKSBmcm9tIFwiJXNcIlxuIiwKKwkJCQlQcm9ncmFtTmFtZSwgKGxvbmcpeHBpZCwgKGxvbmcp
cGlkLCBlZGl0b3IpOworCQkJZ290byBmYXRhbDsKKwkJfSBlbHNlIGlmIChXSUZTVE9QUEVEKHdh
aXRlcikpIHsKKwkJCWtpbGwoZ2V0cGlkKCksIFdTVE9QU0lHKHdhaXRlcikpOworCQl9IGVsc2Ug
aWYgKFdJRkVYSVRFRCh3YWl0ZXIpICYmIFdFWElUU1RBVFVTKHdhaXRlcikpIHsKKwkJCWZwcmlu
dGYoc3RkZXJyLCAiJXM6IFwiJXNcIiBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIsCisJCQkJUHJv
Z3JhbU5hbWUsIGVkaXRvciwgV0VYSVRTVEFUVVMod2FpdGVyKSk7CisJCQlnb3RvIGZhdGFsOwor
CQl9IGVsc2UgaWYgKFdJRlNJR05BTEVEKHdhaXRlcikpIHsKKwkJCWZwcmludGYoc3RkZXJyLAor
CQkJCSIlczogXCIlc1wiIGtpbGxlZDsgc2lnbmFsICVkICglc2NvcmUgZHVtcGVkKVxuIiwKKwkJ
CQlQcm9ncmFtTmFtZSwgZWRpdG9yLCBXVEVSTVNJRyh3YWl0ZXIpLAorCQkJCVdDT1JFRFVNUCh3
YWl0ZXIpID8iIiA6Im5vICIpOworCQkJZ290byBmYXRhbDsKKwkJfSBlbHNlCisJCQlicmVhazsK
Kwl9CisJKHZvaWQpc2lnbmFsKFNJR0hVUCwgU0lHX0RGTCk7CisJKHZvaWQpc2lnbmFsKFNJR0lO
VCwgU0lHX0RGTCk7CisJKHZvaWQpc2lnbmFsKFNJR1FVSVQsIFNJR19ERkwpOworCWlmIChmc3Rh
dCh0LCAmc3RhdGJ1ZikgPCAwKSB7CisJCXBlcnJvcigiZnN0YXQiKTsKKwkJZ290byBmYXRhbDsK
Kwl9CisJaWYgKHV0aW1lYnVmLm1vZHRpbWUgPT0gc3RhdGJ1Zi5zdF9tdGltZSkgeworCQlmcHJp
bnRmKHN0ZGVyciwgIiVzOiBubyBjaGFuZ2VzIG1hZGUgdG8gY3JvbnRhYlxuIiwKKwkJCVByb2dy
YW1OYW1lKTsKIAkJZ290byByZW1vdmU7CiAJfQotCXdhcm54KCJpbnN0YWxsaW5nIG5ldyBjcm9u
dGFiIik7CisJZnByaW50ZihzdGRlcnIsICIlczogaW5zdGFsbGluZyBuZXcgY3JvbnRhYlxuIiwg
UHJvZ3JhbU5hbWUpOwogCXN3aXRjaCAocmVwbGFjZV9jbWQoKSkgewotCWNhc2UgMDoJCQkvKiBT
dWNjZXNzICovCisJY2FzZSAwOgogCQlicmVhazsKLQljYXNlIC0xOgkJLyogU3ludGF4IGVycm9y
ICovCisJY2FzZSAtMToKIAkJZm9yICg7OykgewogCQkJcHJpbnRmKCJEbyB5b3Ugd2FudCB0byBy
ZXRyeSB0aGUgc2FtZSBlZGl0PyAiKTsKIAkJCWZmbHVzaChzdGRvdXQpOwogCQkJcVswXSA9ICdc
MCc7CiAJCQkodm9pZCkgZmdldHMocSwgc2l6ZW9mIHEsIHN0ZGluKTsKLQkJCXN3aXRjaCAoaXNs
b3dlcihxWzBdKSA/IHFbMF0gOiB0b2xvd2VyKHFbMF0pKSB7CisJCQlzd2l0Y2ggKHFbMF0pIHsK
IAkJCWNhc2UgJ3knOgotCQkJCXN5bnRheF9lcnJvciA9IDE7CisJCQljYXNlICdZJzoKIAkJCQln
b3RvIGFnYWluOwogCQkJY2FzZSAnbic6CisJCQljYXNlICdOJzoKIAkJCQlnb3RvIGFiYW5kb247
CiAJCQlkZWZhdWx0OgogCQkJCWZwcmludGYoc3RkZXJyLCAiRW50ZXIgWSBvciBOXG4iKTsKIAkJ
CX0KIAkJfQogCQkvKk5PVFJFQUNIRUQqLwotCWNhc2UgLTI6CQkvKiBJbnN0YWxsIGVycm9yICov
CisJY2FzZSAtMjoKIAlhYmFuZG9uOgotCQl3YXJueCgiZWRpdHMgbGVmdCBpbiAlcyIsIEZpbGVu
YW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICIlczogZWRpdHMgbGVmdCBpbiAlc1xuIiwKKwkJCVBy
b2dyYW1OYW1lLCBGaWxlbmFtZSk7CiAJCWdvdG8gZG9uZTsKIAlkZWZhdWx0OgotCQl3YXJueCgi
cGFuaWM6IGJhZCBzd2l0Y2goKSBpbiByZXBsYWNlX2NtZCgpIik7CisJCWZwcmludGYoc3RkZXJy
LCAiJXM6IHBhbmljOiBiYWQgc3dpdGNoKCkgaW4gcmVwbGFjZV9jbWQoKVxuIiwKKwkJCVByb2dy
YW1OYW1lKTsKIAkJZ290byBmYXRhbDsKIAl9CiAgcmVtb3ZlOgpAQCAtNDkxLDQwICs0ODgsNTMg
QEAKIAlsb2dfaXQoUmVhbFVzZXIsIFBpZCwgIkVORCBFRElUIiwgVXNlcik7CiB9CiAKLQogLyog
cmV0dXJucwkwCW9uIHN1Y2Nlc3MKICAqCQktMQlvbiBzeW50YXggZXJyb3IKICAqCQktMglvbiBp
bnN0YWxsIGVycm9yCiAgKi8KIHN0YXRpYyBpbnQKLXJlcGxhY2VfY21kKCkgewotCWNoYXIJbltN
QVhfRk5BTUVdLCBlbnZzdHJbTUFYX0VOVlNUUl0sIHRuW01BWF9GTkFNRV07Ci0JRklMRQkqdG1w
OwotCWludAljaCwgZW9mOwotCWVudHJ5CSplOwotCXRpbWVfdAlub3cgPSB0aW1lKE5VTEwpOwot
CWNoYXIJKiplbnZwID0gZW52X2luaXQoKTsKK3JlcGxhY2VfY21kKHZvaWQpIHsKKwljaGFyIG5b
TUFYX0ZOQU1FXSwgZW52c3RyW01BWF9FTlZTVFJdOworCUZJTEUgKnRtcDsKKwlpbnQgY2gsIGVv
ZiwgZmQ7CisJaW50IGVycm9yID0gMDsKKwllbnRyeSAqZTsKKwl1aWRfdCBmaWxlX293bmVyOwor
CXRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworCWNoYXIgKiplbnZwID0gZW52X2luaXQoKTsKIAog
CWlmIChlbnZwID09IE5VTEwpIHsKLQkJd2FybngoImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkiKTsK
KwkJZnByaW50ZihzdGRlcnIsICIlczogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeS5cbiIsIFByb2dy
YW1OYW1lKTsKIAkJcmV0dXJuICgtMik7CiAJfQogCi0JKHZvaWQpIHNucHJpbnRmKG4sIHNpemVv
ZihuKSwgInRtcC4lZCIsIFBpZCk7Ci0JKHZvaWQpIHNucHJpbnRmKHRuLCBzaXplb2YodG4pLCBD
Uk9OX1RBQihuKSk7Ci0KLQlpZiAoISh0bXAgPSBmb3Blbih0biwgIncrIikpKSB7Ci0JCXdhcm4o
IiVzIiwgdG4pOworCWlmICghZ2x1ZV9zdHJpbmdzKFRlbXBGaWxlbmFtZSwgc2l6ZW9mIFRlbXBG
aWxlbmFtZSwgU1BPT0xfRElSLAorCSAgICAidG1wLlhYWFhYWFhYWFgiLCAnLycpKSB7CisJCVRl
bXBGaWxlbmFtZVswXSA9ICdcMCc7CisJCWZwcmludGYoc3RkZXJyLCAicGF0aCB0b28gbG9uZ1xu
Iik7CisJCXJldHVybiAoLTIpOworCX0KKwlpZiAoKGZkID0gbWtzdGVtcChUZW1wRmlsZW5hbWUp
KSA9PSAtMSB8fCAhKHRtcCA9IGZkb3BlbihmZCwgIncrIikpKSB7CisJCXBlcnJvcihUZW1wRmls
ZW5hbWUpOworCQlpZiAoZmQgIT0gLTEpIHsKKwkJCWNsb3NlKGZkKTsKKwkJCXVubGluayhUZW1w
RmlsZW5hbWUpOworCQl9CisJCVRlbXBGaWxlbmFtZVswXSA9ICdcMCc7CiAJCXJldHVybiAoLTIp
OwogCX0KIAorCSh2b2lkKSBzaWduYWwoU0lHSFVQLCBkaWUpOworCSh2b2lkKSBzaWduYWwoU0lH
SU5ULCBkaWUpOworCSh2b2lkKSBzaWduYWwoU0lHUVVJVCwgZGllKTsKKwogCS8qIHdyaXRlIGEg
c2lnbmF0dXJlIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuCiAJICoKIAkgKiBWRVJZIElNUE9SVEFO
VDogbWFrZSBzdXJlIE5IRUFERVJfTElORVMgYWdyZWVzIHdpdGggdGhpcyBjb2RlLgogCSAqLwog
CWZwcmludGYodG1wLCAiIyBETyBOT1QgRURJVCBUSElTIEZJTEUgLSBlZGl0IHRoZSBtYXN0ZXIg
YW5kIHJlaW5zdGFsbC5cbiIpOwogCWZwcmludGYodG1wLCAiIyAoJXMgaW5zdGFsbGVkIG9uICUt
MjQuMjRzKVxuIiwgRmlsZW5hbWUsIGN0aW1lKCZub3cpKTsKLQlmcHJpbnRmKHRtcCwgIiMgKENy
b24gdmVyc2lvbiAtLSAlcylcbiIsIHJjc2lkKTsKKwlmcHJpbnRmKHRtcCwgIiMgKENyb24gdmVy
c2lvbiAlcyAtLSAlcylcbiIsIENST05fVkVSU0lPTiwgcmNzaWQpOwogCiAJLyogY29weSB0aGUg
Y3JvbnRhYiB0byB0aGUgdG1wCiAJICovCkBAIC01MzIsMTMgKzU0MiwxNSBAQAogCVNldF9MaW5l
TnVtKDEpCiAJd2hpbGUgKEVPRiAhPSAoY2ggPSBnZXRfY2hhcihOZXdDcm9udGFiKSkpCiAJCXB1
dGMoY2gsIHRtcCk7Ci0JZnRydW5jYXRlKGZpbGVubyh0bXApLCBmdGVsbCh0bXApKTsKKwlmdHJ1
bmNhdGUoZmlsZW5vKHRtcCksIGZ0ZWxsKHRtcCkpOwkvKiBYWFggcmVkdW5kYW50IHdpdGggIncr
Ij8gKi8KIAlmZmx1c2godG1wKTsgIHJld2luZCh0bXApOwogCiAJaWYgKGZlcnJvcih0bXApKSB7
Ci0JCXdhcm54KCJlcnJvciB3aGlsZSB3cml0aW5nIG5ldyBjcm9udGFiIHRvICVzIiwgdG4pOwot
CQlmY2xvc2UodG1wKTsgIHVubGluayh0bik7Ci0JCXJldHVybiAoLTIpOworCQlmcHJpbnRmKHN0
ZGVyciwgIiVzOiBlcnJvciB3aGlsZSB3cml0aW5nIG5ldyBjcm9udGFiIHRvICVzXG4iLAorCQkJ
UHJvZ3JhbU5hbWUsIFRlbXBGaWxlbmFtZSk7CisJCWZjbG9zZSh0bXApOworCQllcnJvciA9IC0y
OworCQlnb3RvIGRvbmU7CiAJfQogCiAJLyogY2hlY2sgdGhlIHN5bnRheCBvZiB0aGUgZmlsZSBi
ZWluZyBpbnN0YWxsZWQuCkBAIC01NTMsNiArNTY1LDExIEBACiAJd2hpbGUgKCFDaGVja0Vycm9y
Q291bnQgJiYgIWVvZikgewogCQlzd2l0Y2ggKGxvYWRfZW52KGVudnN0ciwgdG1wKSkgewogCQlj
YXNlIEVSUjoKKwkJCS8qIGNoZWNrIGZvciBkYXRhIGJlZm9yZSB0aGUgRU9GICovCisJCQlpZiAo
ZW52c3RyWzBdICE9ICdcMCcpIHsKKwkJCQlTZXRfTGluZU51bShMaW5lTnVtYmVyICsgMSk7CisJ
CQkJY2hlY2tfZXJyb3IoInByZW1hdHVyZSBFT0YiKTsKKwkJCX0KIAkJCWVvZiA9IFRSVUU7CiAJ
CQlicmVhazsKIAkJY2FzZSBGQUxTRToKQEAgLTU2Niw3OCArNTgzLDExMCBAQAogCX0KIAogCWlm
IChDaGVja0Vycm9yQ291bnQgIT0gMCkgewotCQl3YXJueCgiZXJyb3JzIGluIGNyb250YWIgZmls
ZSwgY2FuJ3QgaW5zdGFsbCIpOwotCQlmY2xvc2UodG1wKTsgIHVubGluayh0bik7Ci0JCXJldHVy
biAoLTEpOworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9ycyBpbiBjcm9udGFiIGZpbGUsIGNhbid0
IGluc3RhbGwuXG4iKTsKKwkJZmNsb3NlKHRtcCk7CisJCWVycm9yID0gLTE7CisJCWdvdG8gZG9u
ZTsKIAl9CiAKKwlmaWxlX293bmVyID0gKGdldGdpZCgpID09IGdldGVnaWQoKSkgPyBST09UX1VJ
RCA6IHB3LT5wd191aWQ7CisKICNpZmRlZiBIQVNfRkNIT1dOCi0JaWYgKGZjaG93bihmaWxlbm8o
dG1wKSwgUk9PVF9VSUQsIC0xKSA8IE9LKQotI2Vsc2UKLQlpZiAoY2hvd24odG4sIFJPT1RfVUlE
LCAtMSkgPCBPSykKLSNlbmRpZgotCXsKLQkJd2FybigiY2hvd24iKTsKLQkJZmNsb3NlKHRtcCk7
ICB1bmxpbmsodG4pOwotCQlyZXR1cm4gKC0yKTsKKwlpZiAoZmNob3duKGZpbGVubyh0bXApLCBm
aWxlX293bmVyLCAtMSkgPCBPSykgeworCQlwZXJyb3IoImZjaG93biIpOworCQlmY2xvc2UodG1w
KTsKKwkJZXJyb3IgPSAtMjsKKwkJZ290byBkb25lOwogCX0KLQotI2lmZGVmIEhBU19GQ0hNT0QK
LQlpZiAoZmNobW9kKGZpbGVubyh0bXApLCAwNjAwKSA8IE9LKQogI2Vsc2UKLQlpZiAoY2htb2Qo
dG4sIDA2MDApIDwgT0spCi0jZW5kaWYKLQl7Ci0JCXdhcm4oImNob3duIik7Ci0JCWZjbG9zZSh0
bXApOyAgdW5saW5rKHRuKTsKLQkJcmV0dXJuICgtMik7CisJaWYgKGNob3duKFRlbXBGaWxlbmFt
ZSwgZmlsZV9vd25lciwgLTEpIDwgT0spIHsKKwkJcGVycm9yKCJjaG93biIpOworCQlmY2xvc2Uo
dG1wKTsKKwkJZXJyb3IgPSAtMjsKKwkJZ290byBkb25lOwogCX0KKyNlbmRpZgogCiAJaWYgKGZj
bG9zZSh0bXApID09IEVPRikgewotCQl3YXJuKCJmY2xvc2UiKTsKLQkJdW5saW5rKHRuKTsKLQkJ
cmV0dXJuICgtMik7CisJCXBlcnJvcigiZmNsb3NlIik7CisJCWVycm9yID0gLTI7CisJCWdvdG8g
ZG9uZTsKIAl9CiAKLQkodm9pZCkgc25wcmludGYobiwgc2l6ZW9mKG4pLCBDUk9OX1RBQihVc2Vy
KSk7Ci0JaWYgKHJlbmFtZSh0biwgbikpIHsKLQkJd2FybigiZXJyb3IgcmVuYW1pbmcgJXMgdG8g
JXMiLCB0biwgbik7Ci0JCXVubGluayh0bik7Ci0JCXJldHVybiAoLTIpOworCWlmICghZ2x1ZV9z
dHJpbmdzKG4sIHNpemVvZiBuLCBTUE9PTF9ESVIsIFVzZXIsICcvJykpIHsKKwkJZnByaW50Zihz
dGRlcnIsICJwYXRoIHRvbyBsb25nXG4iKTsKKwkJZXJyb3IgPSAtMjsKKwkJZ290byBkb25lOwog
CX0KLQorCWlmIChyZW5hbWUoVGVtcEZpbGVuYW1lLCBuKSkgeworCQlmcHJpbnRmKHN0ZGVyciwg
IiVzOiBlcnJvciByZW5hbWluZyAlcyB0byAlc1xuIiwKKwkJCVByb2dyYW1OYW1lLCBUZW1wRmls
ZW5hbWUsIG4pOworCQlwZXJyb3IoInJlbmFtZSIpOworCQllcnJvciA9IC0yOworCQlnb3RvIGRv
bmU7CisJfQorCVRlbXBGaWxlbmFtZVswXSA9ICdcMCc7CiAJbG9nX2l0KFJlYWxVc2VyLCBQaWQs
ICJSRVBMQUNFIiwgVXNlcik7CiAKLQkvKgotCSAqIENyZWF0aW5nIHRoZSAndG4nIHRlbXAgZmls
ZSBoYXMgYWxyZWFkeSB1cGRhdGVkIHRoZQotCSAqIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBz
cG9vbCBkaXJlY3RvcnkuICBTbGVlcCBmb3IgYQotCSAqIHNlY29uZCB0byBlbnN1cmUgdGhhdCBw
b2tlX2RhZW1vbigpIHNldHMgYSBsYXRlcgotCSAqIG1vZGlmaWNhdGlvbiB0aW1lLiAgT3RoZXJ3
aXNlLCB0aGlzIGNhbiByYWNlIHdpdGggdGhlIGNyb24KLQkgKiBkYWVtb24gc2Nhbm5pbmcgZm9y
IHVwZGF0ZWQgY3JvbnRhYnMuCi0JICovCi0Jc2xlZXAoMSk7Ci0KLQlwb2tlX2RhZW1vbigpOwor
CXBva2VfZGFlbW9uKFJFTE9BRF9DUk9OKTsKIAotCXJldHVybiAoMCk7Citkb25lOgorCSh2b2lk
KSBzaWduYWwoU0lHSFVQLCBTSUdfREZMKTsKKwkodm9pZCkgc2lnbmFsKFNJR0lOVCwgU0lHX0RG
TCk7CisJKHZvaWQpIHNpZ25hbChTSUdRVUlULCBTSUdfREZMKTsKKwlpZiAoVGVtcEZpbGVuYW1l
WzBdKSB7CisJCSh2b2lkKSB1bmxpbmsoVGVtcEZpbGVuYW1lKTsKKwkJVGVtcEZpbGVuYW1lWzBd
ID0gJ1wwJzsKKwl9CisJcmV0dXJuIChlcnJvcik7CiB9CiAKLQogc3RhdGljIHZvaWQKLXBva2Vf
ZGFlbW9uKCkgeworcG9rZV9kYWVtb24odW5zaWduZWQgY2hhciBjb29raWUpIHsKKwlpbnQgc29j
ayA9IC0xOworCXN0cnVjdCBzb2NrYWRkcl91biBzX3VuOwogI2lmZGVmIFVTRV9VVElNRVMKLQlz
dHJ1Y3QgdGltZXZhbCB0dnNbMl07Ci0KLQkodm9pZClnZXR0aW1lb2ZkYXkoJnR2c1swXSwgTlVM
TCk7Ci0JdHZzWzFdID0gdHZzWzBdOwotCWlmICh1dGltZXMoU1BPT0xfRElSLCB0dnMpIDwgT0sp
IHsKKwlzdHJ1Y3QgdGltZXZhbCB0dnNbMV07CisJCisJKHZvaWQpZ2V0dGltZW9mZGF5KCZ0dnMs
IE5VTEwpOworCWlmICh1dGltZShTUE9PTF9ESVIsIHR2cykgPCBPSykgewogCQl3YXJuKCJjYW4n
dCB1cGRhdGUgbXRpbWUgb24gc3Bvb2xkaXIgJXMiLCBTUE9PTF9ESVIpOwogCQlyZXR1cm47CiAJ
fQogI2Vsc2UKIAlpZiAodXRpbWUoU1BPT0xfRElSLCBOVUxMKSA8IE9LKSB7Ci0JCXdhcm4oImNh
bid0IHVwZGF0ZSBtdGltZSBvbiBzcG9vbGRpciAlcyIsIFNQT09MX0RJUik7CisJCXdhcm4oImNh
bnQndCB1cGRhdGUgbXRpbWUgb24gc3Bvb2xkaXIgJXMiLCBTUE9PTF9ESVIpOwogCQlyZXR1cm47
CiAJfQogI2VuZGlmIC8qVVNFX1VUSU1FUyovCisKKwltZW1zZXQoJnNfdW4sICdcMCcsIHNpemVv
ZihzX3VuKSk7CisJaWYgKCh1bnNpZ25lZCBsb25nKXNucHJpbnRmKHNfdW4uc3VuX3BhdGgsIHNp
emVvZihzX3VuLnN1bl9wYXRoKSwgIiVzLyVzLyVzIiwKKwkJCQlDUk9ORElSLCBTUE9PTF9ESVIs
IFNPQ0tGSUxFKSA+PSBzaXplb2Yoc191bi5zdW5fcGF0aCkpIHsKKwkJZnByaW50ZihzdGRlcnIs
ICIlczogJXMvJXM6IHBhdGggdG9vIGxvbmdcbiIsCisJCQkJUHJvZ3JhbU5hbWUsIENST05ESVIs
IFNPQ0tGSUxFKTsKKwkJcmV0dXJuOworCX0KKwkKKwlzX3VuLnN1bl9mYW1pbHkgPSBQRl9MT0NB
TDsKKyNpZmRlZiBTVU5fTEVOCisJc191bi5zdW5fbGVuID0gU1VOX0xFTigmc191bik7CisjZW5k
aWYKKwkodm9pZCkgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCWlmICgoc29jayA9IHNvY2tl
dChQRl9MT0NBTCwgU09DS19TVFJFQU0sIDApKSA+PSAwICYmCisJCQljb25uZWN0KHNvY2ssIChz
dHJ1Y3Qgc29ja2FkZHIgKikmc191biwgc2l6ZW9mKHNfdW4pKSA9PSAwKQorCQl3cml0ZShzb2Nr
LCAmY29va2llLCAxKTsKKwllbHNlCisJCWZwcmludGYoc3RkZXJyLCAiJXM6IHdhcm5pbmcsIGNy
b24gZG9lcyBub3QgYXBwZWFyIHRvIGJlICIKKwkJCQkicnVubmluZy5cbiIsIFByb2dyYW1OYW1l
KTsKKwlpZiAoc29jayA+PSAwKQorCQljbG9zZShzb2NrKTsKKwkodm9pZCkgc2lnbmFsKFNJR1BJ
UEUsIFNJR19ERkwpOworfQorCitzdGF0aWMgdm9pZAorZGllKGludCB4KSB7CisJaWYgKFRlbXBG
aWxlbmFtZVswXSkKKwkJKHZvaWQpIHVubGluayhUZW1wRmlsZW5hbWUpOworCV9leGl0KEVSUk9S
X0VYSVQpOwogfQpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9kb2MvQ0hBTkdFUyBm
cmVlYnNkX2Nyb24vZG9jL0NIQU5HRVMKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vZG9jL0NI
QU5HRVMJMjAxNC0wMS0xNiAyMTo0Mzo1MC4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jv
bi9kb2MvQ0hBTkdFUwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3NDQ0NDg5NiArMDIwMApAQCAtMSw0
ICsxLDQgQEAKLSRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2RvYy9DSEFO
R0VTIDIyODk5MCAyMDExLTEyLTMwIDEwOjU4OjE0WiB1cXMgJAorJEZyZWVCU0Q6IHJlbGVuZy8x
MC4wL3Vzci5zYmluL2Nyb24vZG9jL0NIQU5HRVMgMjI4OTkwIDIwMTEtMTItMzAgMTA6NTg6MTRa
IHVxcyAkCiAtLS0tLS0tLQogCiBWaXhpZSBDcm9uCQlDaGFuZ2VzIGZyb20gVjIgdG8gVjMKZGlm
ZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vZG9jL0NPTlZFUlNJT04gZnJlZWJzZF9jcm9u
L2RvYy9DT05WRVJTSU9OCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2RvYy9DT05WRVJTSU9O
CTIwMTQtMDEtMTYgMjE6NDM6NTAuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vZG9j
L0NPTlZFUlNJT04JMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzQ0NDQ4OTYgKzAyMDAKQEAgLTEsNCAr
MSw0IEBACi0kRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9kb2MvQ09OVkVS
U0lPTiA3MjA5MSAyMDAxLTAyLTA2IDExOjIxOjU4WiBhc21vZGFpICQKKyRGcmVlQlNEOiByZWxl
bmcvMTAuMC91c3Iuc2Jpbi9jcm9uL2RvYy9DT05WRVJTSU9OIDcyMDkxIDIwMDEtMDItMDYgMTE6
MjE6NThaIGFzbW9kYWkgJAogCiBDb252ZXJzaW9uIG9mIEJTRCA0LlsyM10gY3JvbnRhYiBmaWxl
czoKIApkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9kb2MvRkVBVFVSRVMgZnJlZWJz
ZF9jcm9uL2RvYy9GRUFUVVJFUwotLS0gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9kb2MvRkVBVFVS
RVMJMjAxNC0wMS0xNiAyMTo0Mzo1MC4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9k
b2MvRkVBVFVSRVMJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzQ0NDQ4OTYgKzAyMDAKQEAgLTEsNCAr
MSw0IEBACi0kRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9kb2MvRkVBVFVS
RVMgNTA0NzkgMTk5OS0wOC0yOCAwMTozNTo1OVogcGV0ZXIgJAorJEZyZWVCU0Q6IHJlbGVuZy8x
MC4wL3Vzci5zYmluL2Nyb24vZG9jL0ZFQVRVUkVTIDUwNDc5IDE5OTktMDgtMjggMDE6MzU6NTla
IHBldGVyICQKIAogRmVhdHVyZXMgb2YgVml4aWUncyBjcm9uIHJlbGF0aXZlIHRvIEJTRCA0Llsy
M10gYW5kIFN5c1YgY3JvbnM6CiAKZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vZG9j
L0lOU1RBTEwgZnJlZWJzZF9jcm9uL2RvYy9JTlNUQUxMCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9j
cm9uL2RvYy9JTlNUQUxMCTIwMTQtMDEtMTYgMjE6NDM6NTAuMDAwMDAwMDAwICswMTAwCisrKyBm
cmVlYnNkX2Nyb24vZG9jL0lOU1RBTEwJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzQ0NDQ4OTYgKzAy
MDAKQEAgLTE1LDcgKzE1LDcgQEAKICAqIFBhdWwgVml4aWUgICAgICAgICAgPHBhdWxAdml4LmNv
bT4gICAgICAgICAgdXVuZXQhZGVjd3JsIXZpeGllIXBhdWwKICAqLwogCi0kRnJlZUJTRDogcmVs
ZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9kb2MvSU5TVEFMTCA1MDQ3OSAxOTk5LTA4LTI4IDAx
OjM1OjU5WiBwZXRlciAkCiskRnJlZUJTRDogcmVsZW5nLzEwLjAvdXNyLnNiaW4vY3Jvbi9kb2Mv
SU5TVEFMTCA1MDQ3OSAxOTk5LTA4LTI4IDAxOjM1OjU5WiBwZXRlciAkCiAKIFJlYWQgdGhlIGNv
bW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhlIE1ha2VmaWxlLCB0aGVuIGVkaXQgdGhlIGFyZWEgbWFy
a2VkCiAnY29uZmlndXJhYmxlIHN0dWZmJy4KZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Ny
b24vZG9jL01BSUwgZnJlZWJzZF9jcm9uL2RvYy9NQUlMCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9j
cm9uL2RvYy9NQUlMCTIwMTQtMDEtMTYgMjE6NDM6NTAuMDAwMDAwMDAwICswMTAwCisrKyBmcmVl
YnNkX2Nyb24vZG9jL01BSUwJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzQ0NDQ4OTYgKzAyMDAKQEAg
LTMsNyArMyw3IEBACiAgIHZlcnNpb24gb2YgY3Jvbi4gIGl0IGlzIHByZXNlbnRlZCBoZXJlIGZv
ciBpdHMgZW50ZXJ0YWlubWVudCB2YWx1ZS4KICAgLS12aXggXQogCi0kRnJlZUJTRDogcmVsZWFz
ZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9kb2MvTUFJTCAyMjg5OTAgMjAxMS0xMi0zMCAxMDo1ODox
NFogdXFzICQKKyRGcmVlQlNEOiByZWxlbmcvMTAuMC91c3Iuc2Jpbi9jcm9uL2RvYy9NQUlMIDIy
ODk5MCAyMDExLTEyLTMwIDEwOjU4OjE0WiB1cXMgJAogCiBGcm9tIHB0c2ZhIWxsbC1jcmchYW1l
cyFhY29ybnJjIWJvYiBXZWQgRGVjIDMxIDEwOjA3OjA4IDE5ODYKIERhdGU6IFdlZCwgMzEgRGVj
IDg2IDA4OjU5OjMxIHBzdApkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9kb2MvTWFr
ZWZpbGUudml4aWUgZnJlZWJzZF9jcm9uL2RvYy9NYWtlZmlsZS52aXhpZQotLS0gL3Vzci9zcmMv
dXNyLnNiaW4vY3Jvbi9kb2MvTWFrZWZpbGUudml4aWUJMjAxNC0wMS0xNiAyMTo0Mzo1MC4wMDAw
MDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9kb2MvTWFrZWZpbGUudml4aWUJMjAxNC0wNi0x
MSAxNjo0Mjo1NS4yNzQ0NDQ4OTYgKzAyMDAKQEAgLTE3LDcgKzE3LDcgQEAKIAogIyBNYWtlZmls
ZSBmb3Igdml4aWUncyBjcm9uCiAjCi0jICRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jp
bi9jcm9uL2RvYy9NYWtlZmlsZS52aXhpZSA1MDQ3OSAxOTk5LTA4LTI4IDAxOjM1OjU5WiBwZXRl
ciAkCisjICRGcmVlQlNEOiByZWxlbmcvMTAuMC91c3Iuc2Jpbi9jcm9uL2RvYy9NYWtlZmlsZS52
aXhpZSA1MDQ3OSAxOTk5LTA4LTI4IDAxOjM1OjU5WiBwZXRlciAkCiAjCiAjIHZpeCAwM21hcjg4
IFttb3ZlZCB0byBSQ1MsIHJlc3Qgb2YgbG9nIGlzIGluIHRoZXJlXQogIyB2aXggMzBtYXI4NyBb
Z29vZGJ5ZSwgdGltZS5jOyBoZWxsbywgZ2V0b3B0XQpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNi
aW4vY3Jvbi9kb2MvUkVBRE1FIGZyZWVic2RfY3Jvbi9kb2MvUkVBRE1FCi0tLSAvdXNyL3NyYy91
c3Iuc2Jpbi9jcm9uL2RvYy9SRUFETUUJMjAxNC0wMS0xNiAyMTo0Mzo1MC4wMDAwMDAwMDAgKzAx
MDAKKysrIGZyZWVic2RfY3Jvbi9kb2MvUkVBRE1FCTIwMTQtMDYtMTEgMTY6NDI6NTUuMjc0NDQ0
ODk2ICswMjAwCkBAIC02OSw0ICs2OSw0IEBACiAJaWYgeW91IGxpa2UgaXQsIGNoYW5nZSB5b3Vy
IC9ldGMve3JjLHJjLmxvY2FsfSB0byB1c2UgaXQgaW5zdGVhZCBvZgogCQl0aGUgb2xkIG9uZS4K
IAotJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4wL3Vzci5zYmluL2Nyb24vZG9jL1JFQURNRSA1MDQ3
OSAxOTk5LTA4LTI4IDAxOjM1OjU5WiBwZXRlciAkCiskRnJlZUJTRDogcmVsZW5nLzEwLjAvdXNy
LnNiaW4vY3Jvbi9kb2MvUkVBRE1FIDUwNDc5IDE5OTktMDgtMjggMDE6MzU6NTlaIHBldGVyICQK
ZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vbGliL01ha2VmaWxlIGZyZWVic2RfY3Jv
bi9saWIvTWFrZWZpbGUKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vbGliL01ha2VmaWxlCTIw
MTQtMDEtMTYgMjE6NDM6NTAuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vbGliL01h
a2VmaWxlCTIwMTQtMDYtMTEgMTY6NDI6NTUuMjc1NDQ0Mzc5ICswMjAwCkBAIC0xLDQgKzEsNCBA
QAotIyAkRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9saWIvTWFrZWZpbGUg
MTg1MDQyIDIwMDgtMTEtMTggMDA6NTk6MjZaIG1hdHRlbyAkCisjICRGcmVlQlNEOiByZWxlbmcv
MTAuMC91c3Iuc2Jpbi9jcm9uL2xpYi9NYWtlZmlsZSAxODUwNDIgMjAwOC0xMS0xOCAwMDo1OToy
NlogbWF0dGVvICQKIAogTElCPQljcm9uCiBJTlRFUk5BTExJQj0KZGlmZiAtcnVOIC91c3Ivc3Jj
L3Vzci5zYmluL2Nyb24vbGliL2NvbXBhdC5jIGZyZWVic2RfY3Jvbi9saWIvY29tcGF0LmMKLS0t
IC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vbGliL2NvbXBhdC5jCTIwMTQtMDEtMTYgMjE6NDM6NTAu
MDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vbGliL2NvbXBhdC5jCTE5NzAtMDEtMDEg
MDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xLDIzNyArMCwwIEBACi0vKiBDb3B5cmlnaHQg
MTk4OCwxOTkwLDE5OTMsMTk5NCBieSBQYXVsIFZpeGllCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVk
Ci0gKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDogZG9uJ3QgcmVtb3ZlIG15IG5hbWUg
ZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9uIChkb24ndCB0YWtlIGNyZWRpdCBm
b3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24ndAotICogZ2V0IG1lIGJsYW1lZCBm
b3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIgb3IgcmVtb3ZlIHRoaXMKLSAqIG5v
dGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3VyY2UgaXMgcHJvdmlkZWQgdG8gYnV5
ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBleHByZXNzIG9yIGltcGxpZWQsIGlz
IGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVzZSBhdCB5b3VyIG93biByaXNrLCBy
ZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0bwotICogYW55b25lIHJlc3VsdGlu
ZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0cyBlbnRpcmVseSB3aXRoIHRoZQot
ICogdXNlci4KLSAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMsIGVuaGFuY2VtZW50
cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0byBrZWVwIGEgdmVy
c2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dzOgotICogUGF1bCBW
aXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFkZWN3cmwhdml4aWUh
cGF1bAotICovCi0KLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQotc3RhdGlj
IGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9s
aWIvY29tcGF0LmMgNjk3OTMgMjAwMC0xMi0wOSAwOTozNTo1NVogb2JyaWVuICQiOwotI2VuZGlm
Ci0KLS8qIHZpeCAzMGRlYzkzIFticm9rZSB0aGlzIG91dCBvZiBtaXNjLmMgLSBzZWUgUkNTIGxv
ZyBmb3IgaGlzdG9yeV0KLSAqIHZpeCAxNWphbjg3IFthZGRlZCBUSU9DTk9UVFksIHRoYW5rcyBj
c2dAcHlyYW1pZF0KLSAqLwotCi0KLSNpbmNsdWRlICJjcm9uLmgiCi0jaWZkZWYgTkVFRF9HRVRE
VEFCTEVTSVpFCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2VuZGlmCi0jaWYgZGVmaW5lZChORUVE
X1NFVFNJRCkgJiYgZGVmaW5lZChCU0QpCi0jIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2VuZGlm
Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwYXRocy5oPgotCi0KLS8qIHRoZSBjb2Rl
IGRvZXMgbm90IGRlcGVuZCBvbiBhbnkgb2YgdmZvcmsncwotICogc2lkZS1lZmZlY3RzOyBpdCBq
dXN0IHVzZXMgaXQgYXMgYSBxdWljawotICogZm9yay1hbmQtZXhlYy4KLSAqLwotI2lmZGVmIE5F
RURfVkZPUksKLVBJRF9UCi12Zm9yaygpIHsKLQlyZXR1cm4gKGZvcmsoKSk7Ci19Ci0jZW5kaWYK
LQotCi0jaWZkZWYgTkVFRF9TVFJEVVAKLWNoYXIgKgotc3RyZHVwKHN0cikKLQljaGFyCSpzdHI7
Ci17Ci0JY2hhcgkqdGVtcDsKLQotCWlmICgodGVtcCA9IG1hbGxvYyhzdHJsZW4oc3RyKSArIDEp
KSA9PSBOVUxMKSB7Ci0JCWVycm5vID0gRU5PTUVNOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JKHZv
aWQpIHN0cmNweSh0ZW1wLCBzdHIpOwotCXJldHVybiB0ZW1wOwotfQotI2VuZGlmCi0KLQotI2lm
ZGVmIE5FRURfU1RSRVJST1IKLWNoYXIgKgotc3RyZXJyb3IoZXJyb3IpCi0JaW50IGVycm9yOwot
ewotCWV4dGVybiBjaGFyICpzeXNfZXJybGlzdFtdOwotCWV4dGVybiBpbnQgc3lzX25lcnI7Ci0J
c3RhdGljIGNoYXIgYnVmWzMyXTsKLQotCWlmICgoZXJyb3IgPD0gc3lzX25lcnIpICYmIChlcnJv
ciA+IDApKSB7Ci0JCXJldHVybiBzeXNfZXJybGlzdFtlcnJvcl07Ci0JfQotCi0Jc3ByaW50Zihi
dWYsICJVbmtub3duIGVycm9yOiAlZCIsIGVycm9yKTsKLQlyZXR1cm4gYnVmOwotfQotI2VuZGlm
Ci0KLQotI2lmZGVmIE5FRURfU1RSQ0FTRUNNUAotaW50Ci1zdHJjYXNlY21wKGxlZnQsIHJpZ2h0
KQotCWNoYXIJKmxlZnQ7Ci0JY2hhcgkqcmlnaHQ7Ci17Ci0Jd2hpbGUgKCpsZWZ0ICYmIChNa0xv
d2VyKCpsZWZ0KSA9PSBNa0xvd2VyKCpyaWdodCkpKSB7Ci0JCWxlZnQrKzsKLQkJcmlnaHQrKzsK
LQl9Ci0JcmV0dXJuIE1rTG93ZXIoKmxlZnQpIC0gTWtMb3dlcigqcmlnaHQpOwotfQotI2VuZGlm
Ci0KLQotI2lmZGVmIE5FRURfU0VUU0lECi1pbnQKLXNldHNpZCgpCi17Ci0JaW50CW5ld3BncnA7
Ci0jIGlmIGRlZmluZWQoQlNEKQotCWludAlmZDsKLSMgIGlmIGRlZmluZWQoUE9TSVgpCi0JbmV3
cGdycCA9IHNldHBnaWQoKHBpZF90KTAsIGdldHBpZCgpKTsKLSMgIGVsc2UKLQluZXdwZ3JwID0g
c2V0cGdycCgwLCBnZXRwaWQoKSk7Ci0jICBlbmRpZgotCWlmICgoZmQgPSBvcGVuKF9QQVRIX1RU
WSwgMikpID49IDApCi0JewotCQkodm9pZCkgaW9jdGwoZmQsIFRJT0NOT1RUWSwgKGNoYXIqKTAp
OwotCQkodm9pZCkgY2xvc2UoZmQpOwotCX0KLSMgZWxzZSAvKkJTRCovCi0JbmV3cGdycCA9IHNl
dHBncnAoKTsKLQotCSh2b2lkKSBjbG9zZShTVERJTik7CSh2b2lkKSBvcGVuKF9QQVRIX0RFVk5V
TEwsIDApOwotCSh2b2lkKSBjbG9zZShTVERPVVQpOwkodm9pZCkgb3BlbihfUEFUSF9ERVZOVUxM
LCAxKTsKLQkodm9pZCkgY2xvc2UoU1RERVJSKTsJKHZvaWQpIG9wZW4oX1BBVEhfREVWTlVMTCwg
Mik7Ci0jIGVuZGlmIC8qQlNEKi8KLQlyZXR1cm4gbmV3cGdycDsKLX0KLSNlbmRpZiAvKk5FRURf
U0VUU0lEKi8KLQotCi0jaWZkZWYgTkVFRF9HRVREVEFCTEVTSVpFCi1pbnQKLWdldGR0YWJsZXNp
emUoKSB7Ci0jaWZkZWYgX1NDX09QRU5fTUFYCi0JcmV0dXJuIHN5c2NvbmYoX1NDX09QRU5fTUFY
KTsKLSNlbHNlCi0JcmV0dXJuIF9QT1NJWF9PUEVOX01BWDsKLSNlbmRpZgotfQotI2VuZGlmCi0K
LQotI2lmZGVmIE5FRURfRkxPQ0sKLS8qIFRoZSBmb2xsb3dpbmcgZmxvY2soKSBlbXVsYXRpb24g
c25hcmZlZCBpbnRhY3QgKikgZnJvbSB0aGUgSFAtVVgKLSAqICJCU0QgdG8gSFAtVVggcG9ydGlu
ZyB0cmlja3MiIG1haW50YWluZWQgYnkKLSAqIHN5c3RlbUBhbGNoZW15LmNoZW0udXRvcm9udG8u
Y2EgKFN5c3RlbSBBZG1pbiAoTWlrZSBQZXRlcnNvbikpCi0gKiBmcm9tIHRoZSB2ZXJzaW9uICJs
YXN0IHVwZGF0ZWQ6IDExLUphbi0xOTkzIgotICogU25hcmZhZ2UgZG9uZSBieSBKYXJra28gSGll
dGFuaWVtaSA8SmFya2tvLkhpZXRhbmllbWlAaHV0LmZpPgotICogKikgd2VsbCwgYWxtb3N0LCBo
YWQgdG8gSyZSIHRoZSBmdW5jdGlvbiBlbnRyeSwgSFBVWCAiY2MiCi0gKiBkb2VzIG5vdCBncm9r
IEFOU0kgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotIAotLyoKLSAqIGZsb2NrIChmZCwgb3BlcmF0
aW9uKQotICoKLSAqIFRoaXMgcm91dGluZSBwZXJmb3JtcyBzb21lIGZpbGUgbG9ja2luZyBsaWtl
IHRoZSBCU0QgJ2Zsb2NrJwotICogb24gdGhlIG9iamVjdCBkZXNjcmliZWQgYnkgdGhlIGludCBm
aWxlIGRlc2NyaXB0b3IgJ2ZkJywKLSAqIHdoaWNoIG11c3QgYWxyZWFkeSBiZSBvcGVuLgotICoK
LSAqIFRoZSBvcGVyYXRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBhcmU6Ci0gKgotICogTE9DS19T
SCAgLSAgZ2V0IGEgc2hhcmVkIGxvY2suCi0gKiBMT0NLX0VYICAtICBnZXQgYW4gZXhjbHVzaXZl
IGxvY2suCi0gKiBMT0NLX05CICAtICBkb24ndCBibG9jayAobXVzdCBiZSBPUmVkIHdpdGggTE9D
S19TSCBvciBMT0NLX0VYKS4KLSAqIExPQ0tfVU4gIC0gIHJlbGVhc2UgYSBsb2NrLgotICoKLSAq
IFJldHVybiB2YWx1ZTogMCBpZiBsb2NrIHN1Y2Nlc3NmdWwsIC0xIGlmIGZhaWxlZC4KLSAqCi0g
KiBOb3RlIHRoYXQgd2hldGhlciB0aGUgbG9ja3MgYXJlIGVuZm9yY2VkIG9yIGFkdmlzb3J5IGlz
Ci0gKiBjb250cm9sbGVkIGJ5IHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIHRoZSBTRVRHSUQg
Yml0IG9uCi0gKiB0aGUgZXhlY3V0YWJsZS4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8g
ZGlmZmVyZW5jZSBiZXR3ZWVuIHNoYXJlZCBhbmQgZXhjbHVzaXZlCi0gKiBsb2Nrcywgc2luY2Ug
dGhlICdsb2NrZicgc3lzdGVtIGNhbGwgaW4gU1lTViBkb2Vzbid0IG1ha2UgYW55Ci0gKiBkaXN0
aW5jdGlvbi4KLSAqCi0gKiBUaGUgZmlsZSAiPHN5cy9maWxlLmg+IiBzaG91bGQgYmUgbW9kaWZp
ZWQgdG8gY29udGFpbiB0aGUgZGVmaW5pdGlvbnMKLSAqIG9mIHRoZSBhdmFpbGFibGUgb3BlcmF0
aW9ucywgd2hpY2ggbXVzdCBiZSBhZGRlZCBtYW51YWxseSAoc2VlIGJlbG93Ci0gKiBmb3IgdGhl
IHZhbHVlcykuCi0gKi8KLQotLyogdGhpcyBjb2RlIGhhcyBiZWVuIHJlZm9ybWF0dGVkIGJ5IHZp
eGllICovCi0KLWludAotZmxvY2soZmQsIG9wZXJhdGlvbikKLQlpbnQgZmQ7Ci0JaW50IG9wZXJh
dGlvbjsKLXsKLQlpbnQgaTsKLQotCXN3aXRjaCAob3BlcmF0aW9uKSB7Ci0JY2FzZSBMT0NLX1NI
OgkJLyogZ2V0IGEgc2hhcmVkIGxvY2sgKi8KLQljYXNlIExPQ0tfRVg6CQkvKiBnZXQgYW4gZXhj
bHVzaXZlIGxvY2sgKi8KLQkJaSA9IGxvY2tmIChmZCwgRl9MT0NLLCAwKTsKLQkJYnJlYWs7Ci0K
LQljYXNlIExPQ0tfU0h8TE9DS19OQjoJLyogZ2V0IGEgbm9uLWJsb2NraW5nIHNoYXJlZCBsb2Nr
ICovCi0JY2FzZSBMT0NLX0VYfExPQ0tfTkI6CS8qIGdldCBhIG5vbi1ibG9ja2luZyBleGNsdXNp
dmUgbG9jayAqLwotCQlpID0gbG9ja2YgKGZkLCBGX1RMT0NLLCAwKTsKLQkJaWYgKGkgPT0gLTEp
Ci0JCQlpZiAoKGVycm5vID09IEVBR0FJTikgfHwgKGVycm5vID09IEVBQ0NFUykpCi0JCQkJZXJy
bm8gPSBFV09VTERCTE9DSzsKLQkJYnJlYWs7Ci0KLQljYXNlIExPQ0tfVU46CQkvKiB1bmxvY2sg
Ki8KLQkJaSA9IGxvY2tmIChmZCwgRl9VTE9DSywgMCk7Ci0JCWJyZWFrOwotIAotCWRlZmF1bHQ6
CQkvKiBjYW4ndCBkZWNpcGhlciBvcGVyYXRpb24gKi8KLQkJaSA9IC0xOwotCQllcnJubyA9IEVJ
TlZBTDsKLQkJYnJlYWs7Ci0JfQotIAotCXJldHVybiAoaSk7Ci19Ci0jZW5kaWYgLypORUVEX0ZM
T0NLKi8KLQotCi0jaWZkZWYgTkVFRF9TRVRFTlYKLWludAotc2V0ZW52KG5hbWUsIHZhbHVlLCBv
dmVyd3JpdGUpCi0JY2hhciAqbmFtZSwgKnZhbHVlOwotCWludCBvdmVyd3JpdGU7Ci17Ci0JY2hh
ciAqdG1wOwotCi0JaWYgKG92ZXJ3cml0ZSAmJiBnZXRlbnYobmFtZSkpCi0JCXJldHVybiAtMTsK
LQotCWlmICghKHRtcCA9IG1hbGxvYyhzdHJsZW4obmFtZSkgKyBzdHJsZW4odmFsdWUpICsgMikp
KSB7Ci0JCWVycm5vID0gRU5PTUVNOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc3ByaW50Zih0bXAs
ICIlcz0lcyIsIG5hbWUsIHZhbHVlKTsKLQlyZXR1cm4gcHV0ZW52KHRtcCk7CS8qIGludGVudGlv
bmFsbHkgb3JwaGFuICd0bXAnIHN0b3JhZ2UgKi8KLX0KLSNlbmRpZgpkaWZmIC1ydU4gL3Vzci9z
cmMvdXNyLnNiaW4vY3Jvbi9saWIvZW50cnkuYyBmcmVlYnNkX2Nyb24vbGliL2VudHJ5LmMKLS0t
IC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vbGliL2VudHJ5LmMJMjAxNC0wMS0xNiAyMTo0Mzo1MC4w
MDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9saWIvZW50cnkuYwkyMDE0LTA2LTExIDE2
OjQyOjU1LjI3NTQ0NDM3OSArMDIwMApAQCAtMSwyNCArMSwyOCBAQAotLyogQ29weXJpZ2h0IDE5
ODgsMTk5MCwxOTkzLDE5OTQgYnkgUGF1bCBWaXhpZQorLyoKKyAqIENvcHlyaWdodCAxOTg4LDE5
OTAsMTk5MywxOTk0IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLwor
CisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1
bSwgSW5jLiAoIklTQyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBT
b2Z0d2FyZSBDb25zb3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2Vw
dDogZG9uJ3QgcmVtb3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0
aW9uIChkb24ndCB0YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChk
b24ndAotICogZ2V0IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0
ZXIgb3IgcmVtb3ZlIHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBz
b3VyY2UgaXMgcHJvdmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5k
LCBleHByZXNzIG9yIGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7
IHVzZSBhdCB5b3VyIG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55
KSB0bwotICogYW55b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBy
ZXN0cyBlbnRpcmVseSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBj
b3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVy
cG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0
IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGlj
ZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4
ZXMsIGVuaGFuY2VtZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRy
eSB0byBrZWVwIGEgdmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xs
b3dzOgotICogUGF1bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5l
dCFkZWN3cmwhdml4aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIg
QU5EIElTQyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMg
U09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9S
CisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0Yg
VVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFD
VCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBP
RiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNP
RlRXQVJFLgogICovCiAKLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQotc3Rh
dGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9Ci0gICIkRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNy
LnNiaW4vY3Jvbi9saWIvZW50cnkuYyAyNDIxMDEgMjAxMi0xMC0yNSAyMjo1NDoyOVogc29ib21h
eCAkIjsKLSNlbmRpZgorLy8jaWYgIWRlZmluZWQobGludCkgJiYgIWRlZmluZWQoTElOVCkKKy8v
c3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IGVudHJ5LmMsdiAxLjE3IDIwMDQvMDEvMjMgMTg6
NTY6NDIgdml4aWUgRXhwICQiOworLy8jZW5kaWYKIAogLyogdml4IDI2amFuODcgW1JDUydkOyBy
ZXN0IG9mIGxvZyBpcyBpbiBSQ1MgZmlsZV0KICAqIHZpeCAwMWphbjg3IFthZGRlZCBsaW5lLWxl
dmVsIGVycm9yIHJlY292ZXJ5XQpAQCAtMjYsMjcgKzMwLDE0IEBACiAgKiB2aXggMzBkZWM4NiBb
d3JpdHRlbl0KICAqLwogCi0KICNpbmNsdWRlICJjcm9uLmgiCi0jaW5jbHVkZSA8Z3JwLmg+Ci0j
aWZkZWYgTE9HSU5fQ0FQCi0jaW5jbHVkZSA8bG9naW5fY2FwLmg+Ci0jZW5kaWYKIAogdHlwZWRl
ZgllbnVtIGVjb2RlIHsKIAllX25vbmUsIGVfbWludXRlLCBlX2hvdXIsIGVfZG9tLCBlX21vbnRo
LCBlX2RvdywKLQllX2NtZCwgZV90aW1lc3BlYywgZV91c2VybmFtZSwgZV9ncm91cCwgZV9tZW0K
LSNpZmRlZiBMT0dJTl9DQVAKLQksIGVfY2xhc3MKLSNlbmRpZgorCWVfY21kLCBlX3RpbWVzcGVj
LCBlX3VzZXJuYW1lLCBlX29wdGlvbiwgZV9tZW1vcnkKIH0gZWNvZGVfZTsKIAotc3RhdGljIGNo
YXIJZ2V0X2xpc3QoYml0c3RyX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdLCBpbnQsIEZJTEUgKiks
Ci0JCWdldF9yYW5nZShiaXRzdHJfdCAqLCBpbnQsIGludCwgY2hhciAqW10sIGludCwgRklMRSAq
KSwKLQkJZ2V0X251bWJlcihpbnQgKiwgaW50LCBjaGFyICpbXSwgaW50LCBGSUxFICopOwotc3Rh
dGljIGludAlzZXRfZWxlbWVudChiaXRzdHJfdCAqLCBpbnQsIGludCwgaW50KTsKLQotc3RhdGlj
IGNoYXIgKmVjb2Rlc1tdID0KK3N0YXRpYyBjb25zdCBjaGFyICplY29kZXNbXSA9CiAJewogCQki
bm8gZXJyb3IiLAogCQkiYmFkIG1pbnV0ZSIsCkBAIC01NywxOSArNDgsMTggQEAKIAkJImJhZCBj
b21tYW5kIiwKIAkJImJhZCB0aW1lIHNwZWNpZmllciIsCiAJCSJiYWQgdXNlcm5hbWUiLAotCQki
YmFkIGdyb3VwIG5hbWUiLAotCQkib3V0IG9mIG1lbW9yeSIsCi0jaWZkZWYgTE9HSU5fQ0FQCi0J
CSJiYWQgY2xhc3MgbmFtZSIsCi0jZW5kaWYKKwkJImJhZCBvcHRpb24iLAorCQkib3V0IG9mIG1l
bW9yeSIKIAl9OwogCitzdGF0aWMgaW50CWdldF9saXN0KGJpdHN0cl90ICosIGludCwgaW50LCBj
b25zdCBjaGFyICpbXSwgaW50LCBGSUxFICopLAorCQlnZXRfcmFuZ2UoYml0c3RyX3QgKiwgaW50
LCBpbnQsIGNvbnN0IGNoYXIgKltdLCBpbnQsIEZJTEUgKiksCisJCWdldF9udW1iZXIoaW50ICos
IGludCwgY29uc3QgY2hhciAqW10sIGludCwgRklMRSAqLCBjb25zdCBjaGFyICopLAorCQlzZXRf
ZWxlbWVudChiaXRzdHJfdCAqLCBpbnQsIGludCwgaW50KTsKIAogdm9pZAotZnJlZV9lbnRyeShl
KQotCWVudHJ5CSplOwotewotI2lmZGVmIExPR0lOX0NBUAorZnJlZV9lbnRyeShlbnRyeSAqZSkg
eworIyBpZmRlZiBMT0dJTl9DQVAKIAlpZiAoZS0+Y2xhc3MgIT0gTlVMTCkKIAkJZnJlZShlLT5j
bGFzcyk7CiAjZW5kaWYKQEAgLTgwLDIwICs3MCwxNCBAQAogCWZyZWUoZSk7CiB9CiAKLQogLyog
cmV0dXJuIE5VTEwgaWYgZW9mIG9yIHN5bnRheCBlcnJvciBvY2N1cnM7CiAgKiBvdGhlcndpc2Ug
cmV0dXJuIGEgcG9pbnRlciB0byBhIG5ldyBlbnRyeS4KICAqLwogZW50cnkgKgotbG9hZF9lbnRy
eShmaWxlLCBlcnJvcl9mdW5jLCBwdywgZW52cCkKLQlGSUxFCQkqZmlsZTsKLQl2b2lkCQkoKmVy
cm9yX2Z1bmMpKGNoYXIgKik7Ci0Jc3RydWN0IHBhc3N3ZAkqcHc7Ci0JY2hhcgkJKiplbnZwOwot
eworbG9hZF9lbnRyeShGSUxFICpmaWxlLCB2b2lkICgqZXJyb3JfZnVuYykoKSwgc3RydWN0IHBh
c3N3ZCAqcHcsIGNoYXIgKiplbnZwKSB7CiAJLyogdGhpcyBmdW5jdGlvbiByZWFkcyBvbmUgY3Jv
bnRhYiBlbnRyeSAtLSB0aGUgbmV4dCAtLSBmcm9tIGEgZmlsZS4KIAkgKiBpdCBza2lwcyBhbnkg
bGVhZGluZyBibGFuayBsaW5lcywgaWdub3JlcyBjb21tZW50cywgYW5kIHJldHVybnMKLQkgKiBF
T0YgaWYgZm9yIGFueSByZWFzb24gdGhlIGVudHJ5IGNhbid0IGJlIHJlYWQgYW5kIHBhcnNlZC4K
KwkgKiBOVUxMIGlmIGZvciBhbnkgcmVhc29uIHRoZSBlbnRyeSBjYW4ndCBiZSByZWFkIGFuZCBw
YXJzZWQuCiAJICoKIAkgKiB0aGUgZW50cnkgaXMgYWxzbyBwYXJzZWQgaGVyZS4KIAkgKgpAQCAt
MTA1LDExICs4OSwxMSBAQAogCSAqLwogCiAJZWNvZGVfZQllY29kZSA9IGVfbm9uZTsKLQllbnRy
eQkqZTsKLQlpbnQJY2g7Ci0JY2hhcgljbWRbTUFYX0NPTU1BTkRdOwotCWNoYXIJZW52c3RyW01B
WF9FTlZTVFJdOwotCWNoYXIJKipwcmV2X2VudjsKKwllbnRyeSAqZTsKKwlpbnQgY2g7CisJY2hh
ciBjbWRbTUFYX0NPTU1BTkRdOworCWNoYXIgZW52c3RyW01BWF9FTlZTVFJdOworCWNoYXIgKip0
ZW52cDsKIAogCURlYnVnKERQQVJTLCAoImxvYWRfZW50cnkoKS4uLmFib3V0IHRvIGVhdCBjb21t
ZW50c1xuIikpCiAKQEAgLTExNyw3ICsxMDEsNyBAQAogCiAJY2ggPSBnZXRfY2hhcihmaWxlKTsK
IAlpZiAoY2ggPT0gRU9GKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIChOVUxMKTsKIAogCS8q
IGNoIGlzIG5vdyB0aGUgZmlyc3QgdXNlZnVsIGNoYXJhY3RlciBvZiBhIHVzZWZ1bCBsaW5lLgog
CSAqIGl0IG1heSBiZSBhbiBAc3BlY2lhbCBvciBpdCBtYXkgYmUgdGhlIGZpcnN0IGNoYXJhY3Rl
cgpAQCAtMTI2LDExICsxMTAsNiBAQAogCiAJZSA9IChlbnRyeSAqKSBjYWxsb2Moc2l6ZW9mKGVu
dHJ5KSwgc2l6ZW9mKGNoYXIpKTsKIAotCWlmIChlID09IE5VTEwpIHsKLQkJd2FybigibG9hZF9l
bnRyeTogY2FsbG9jIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KIAlpZiAoY2ggPT0g
J0AnKSB7CiAJCS8qIGFsbCBvZiB0aGVzZSBzaG91bGQgYmUgZmxhZ2dlZCBhbmQgbG9hZC1saW1p
dGVkOyBpLmUuLAogCQkgKiBpbnN0ZWFkIG9mIEBob3VybHkgbWVhbmluZyAiMCAqICogKiAqIiBp
dCBzaG91bGQgbWVhbgpAQCAtMTQ0LDE0ICsxMjMsMTAgQEAKIAkJICogYW55bW9yZS4gIHRvbyBt
dWNoIGZvciBteSBvdmVybG9hZGVkIGJyYWluLiAodml4LCBqYW45MCkKIAkJICogSElOVAogCQkg
Ki8KLQkJRGVidWcoRFBBUlMsICgibG9hZF9lbnRyeSgpLi4uYWJvdXQgdG8gdGVzdCBzaG9ydGN1
dHNcbiIpKQogCQljaCA9IGdldF9zdHJpbmcoY21kLCBNQVhfQ09NTUFORCwgZmlsZSwgIiBcdFxu
Iik7CiAJCWlmICghc3RyY21wKCJyZWJvb3QiLCBjbWQpKSB7Ci0JCQlEZWJ1ZyhEUEFSUywgKCJs
b2FkX2VudHJ5KCkuLi5yZWJvb3Qgc2hvcnRjdXRcbiIpKQogCQkJZS0+ZmxhZ3MgfD0gV0hFTl9S
RUJPT1Q7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCgieWVhcmx5IiwgY21kKSB8fCAhc3RyY21wKCJh
bm51YWxseSIsIGNtZCkpewotCQkJRGVidWcoRFBBUlMsICgibG9hZF9lbnRyeSgpLi4ueWVhcmx5
IHNob3J0Y3V0XG4iKSkKLQkJCWJpdF9zZXQoZS0+c2Vjb25kLCAwKTsKIAkJCWJpdF9zZXQoZS0+
bWludXRlLCAwKTsKIAkJCWJpdF9zZXQoZS0+aG91ciwgMCk7CiAJCQliaXRfc2V0KGUtPmRvbSwg
MCk7CkBAIC0xNTksOCArMTM0LDYgQEAKIAkJCWJpdF9uc2V0KGUtPmRvdywgMCwgKExBU1RfRE9X
LUZJUlNUX0RPVysxKSk7CiAJCQllLT5mbGFncyB8PSBET1dfU1RBUjsKIAkJfSBlbHNlIGlmICgh
c3RyY21wKCJtb250aGx5IiwgY21kKSkgewotCQkJRGVidWcoRFBBUlMsICgibG9hZF9lbnRyeSgp
Li4ubW9udGhseSBzaG9ydGN1dFxuIikpCi0JCQliaXRfc2V0KGUtPnNlY29uZCwgMCk7CiAJCQli
aXRfc2V0KGUtPm1pbnV0ZSwgMCk7CiAJCQliaXRfc2V0KGUtPmhvdXIsIDApOwogCQkJYml0X3Nl
dChlLT5kb20sIDApOwpAQCAtMTY4LDQ3ICsxNDEsMzMgQEAKIAkJCWJpdF9uc2V0KGUtPmRvdywg
MCwgKExBU1RfRE9XLUZJUlNUX0RPVysxKSk7CiAJCQllLT5mbGFncyB8PSBET1dfU1RBUjsKIAkJ
fSBlbHNlIGlmICghc3RyY21wKCJ3ZWVrbHkiLCBjbWQpKSB7Ci0JCQlEZWJ1ZyhEUEFSUywgKCJs
b2FkX2VudHJ5KCkuLi53ZWVrbHkgc2hvcnRjdXRcbiIpKQotCQkJYml0X3NldChlLT5zZWNvbmQs
IDApOwogCQkJYml0X3NldChlLT5taW51dGUsIDApOwogCQkJYml0X3NldChlLT5ob3VyLCAwKTsK
IAkJCWJpdF9uc2V0KGUtPmRvbSwgMCwgKExBU1RfRE9NLUZJUlNUX0RPTSsxKSk7Ci0JCQllLT5m
bGFncyB8PSBET01fU1RBUjsKIAkJCWJpdF9uc2V0KGUtPm1vbnRoLCAwLCAoTEFTVF9NT05USC1G
SVJTVF9NT05USCsxKSk7CiAJCQliaXRfc2V0KGUtPmRvdywgMCk7CisJCQllLT5mbGFncyB8PSBE
T1dfU1RBUjsKIAkJfSBlbHNlIGlmICghc3RyY21wKCJkYWlseSIsIGNtZCkgfHwgIXN0cmNtcCgi
bWlkbmlnaHQiLCBjbWQpKSB7Ci0JCQlEZWJ1ZyhEUEFSUywgKCJsb2FkX2VudHJ5KCkuLi5kYWls
eSBzaG9ydGN1dFxuIikpCi0JCQliaXRfc2V0KGUtPnNlY29uZCwgMCk7CiAJCQliaXRfc2V0KGUt
Pm1pbnV0ZSwgMCk7CiAJCQliaXRfc2V0KGUtPmhvdXIsIDApOwogCQkJYml0X25zZXQoZS0+ZG9t
LCAwLCAoTEFTVF9ET00tRklSU1RfRE9NKzEpKTsKIAkJCWJpdF9uc2V0KGUtPm1vbnRoLCAwLCAo
TEFTVF9NT05USC1GSVJTVF9NT05USCsxKSk7CiAJCQliaXRfbnNldChlLT5kb3csIDAsIChMQVNU
X0RPVy1GSVJTVF9ET1crMSkpOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAoImhvdXJseSIsIGNtZCkp
IHsKLQkJCURlYnVnKERQQVJTLCAoImxvYWRfZW50cnkoKS4uLmhvdXJseSBzaG9ydGN1dFxuIikp
Ci0JCQliaXRfc2V0KGUtPnNlY29uZCwgMCk7CiAJCQliaXRfc2V0KGUtPm1pbnV0ZSwgMCk7CiAJ
CQliaXRfbnNldChlLT5ob3VyLCAwLCAoTEFTVF9IT1VSLUZJUlNUX0hPVVIrMSkpOwogCQkJYml0
X25zZXQoZS0+ZG9tLCAwLCAoTEFTVF9ET00tRklSU1RfRE9NKzEpKTsKIAkJCWJpdF9uc2V0KGUt
Pm1vbnRoLCAwLCAoTEFTVF9NT05USC1GSVJTVF9NT05USCsxKSk7CiAJCQliaXRfbnNldChlLT5k
b3csIDAsIChMQVNUX0RPVy1GSVJTVF9ET1crMSkpOworCQkJZS0+ZmxhZ3MgfD0gSFJfU1RBUjsK
IAkJfSBlbHNlIGlmICghc3RyY21wKCJldmVyeV9taW51dGUiLCBjbWQpKSB7CiAJCQlEZWJ1ZyhE
UEFSUywgKCJsb2FkX2VudHJ5KCkuLi5ldmVyeV9taW51dGUgc2hvcnRjdXRcbiIpKQotCQkJYml0
X3NldChlLT5zZWNvbmQsIDApOwotCQkJYml0X25zZXQoZS0+bWludXRlLCAwLCAoTEFTVF9NSU5V
VEUtRklSU1RfTUlOVVRFKzEpKTsKLQkJCWJpdF9uc2V0KGUtPmhvdXIsIDAsIChMQVNUX0hPVVIt
RklSU1RfSE9VUisxKSk7Ci0JCQliaXRfbnNldChlLT5kb20sIDAsIChMQVNUX0RPTS1GSVJTVF9E
T00rMSkpOwotCQkJYml0X25zZXQoZS0+bW9udGgsIDAsIChMQVNUX01PTlRILUZJUlNUX01PTlRI
KzEpKTsKLQkJCWJpdF9uc2V0KGUtPmRvdywgMCwgKExBU1RfRE9XLUZJUlNUX0RPVysxKSk7Ci0J
CX0gZWxzZSBpZiAoIXN0cmNtcCgiZXZlcnlfc2Vjb25kIiwgY21kKSkgewotCQkJRGVidWcoRFBB
UlMsICgibG9hZF9lbnRyeSgpLi4uZXZlcnlfc2Vjb25kIHNob3J0Y3V0XG4iKSkKLQkJCWUtPmZs
YWdzIHw9IFNFQ19SRVM7Ci0JCQliaXRfbnNldChlLT5zZWNvbmQsIDAsIChMQVNUX1NFQ09ORC1G
SVJTVF9TRUNPTkQrMSkpOwotCQkJYml0X25zZXQoZS0+bWludXRlLCAwLCAoTEFTVF9NSU5VVEUt
RklSU1RfTUlOVVRFKzEpKTsKLQkJCWJpdF9uc2V0KGUtPmhvdXIsIDAsIChMQVNUX0hPVVItRklS
U1RfSE9VUisxKSk7Ci0JCQliaXRfbnNldChlLT5kb20sIDAsIChMQVNUX0RPTS1GSVJTVF9ET00r
MSkpOwotCQkJYml0X25zZXQoZS0+bW9udGgsIDAsIChMQVNUX01PTlRILUZJUlNUX01PTlRIKzEp
KTsKLQkJCWJpdF9uc2V0KGUtPmRvdywgMCwgKExBU1RfRE9XLUZJUlNUX0RPVysxKSk7CisgICAg
ICAgICAgICAgICAgICAgICAgICBiaXRfc2V0KGUtPnNlY29uZCwgMCk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBiaXRfbnNldChlLT5taW51dGUsIDAsIChMQVNUX01JTlVURS1GSVJTVF9NSU5V
VEUrMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYml0X25zZXQoZS0+aG91ciwgMCwgKExB
U1RfSE9VUi1GSVJTVF9IT1VSKzEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdF9uc2V0
KGUtPmRvbSwgMCwgKExBU1RfRE9NLUZJUlNUX0RPTSsxKSk7CisgICAgICAgICAgICAgICAgICAg
ICAgICBiaXRfbnNldChlLT5tb250aCwgMCwgKExBU1RfTU9OVEgtRklSU1RfTU9OVEgrMSkpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgYml0X25zZXQoZS0+ZG93LCAwLCAoTEFTVF9ET1ctRklS
U1RfRE9XKzEpKTsKIAkJfSBlbHNlIHsKIAkJCWVjb2RlID0gZV90aW1lc3BlYzsKIAkJCWdvdG8g
ZW9mOwpAQCAtMjE3LDE0ICsxNzYsMTUgQEAKIAkJICogdXNlcm5hbWUvY29tbWFuZC4KIAkJICov
CiAJCVNraXBfQmxhbmtzKGNoLCBmaWxlKTsKLQkJaWYgKGNoID09IEVPRikgeworCQlpZiAoY2gg
PT0gRU9GIHx8IGNoID09ICdcbicpIHsKIAkJCWVjb2RlID0gZV9jbWQ7CiAJCQlnb3RvIGVvZjsK
IAkJfQogCX0gZWxzZSB7CiAJCURlYnVnKERQQVJTLCAoImxvYWRfZW50cnkoKS4uLmFib3V0IHRv
IHBhcnNlIG51bWVyaWNzXG4iKSkKLQkJYml0X3NldChlLT5zZWNvbmQsIDApOwogCisJCWlmIChj
aCA9PSAnKicpCisJCQllLT5mbGFncyB8PSBNSU5fU1RBUjsKIAkJY2ggPSBnZXRfbGlzdChlLT5t
aW51dGUsIEZJUlNUX01JTlVURSwgTEFTVF9NSU5VVEUsCiAJCQkgICAgICBQUENfTlVMTCwgY2gs
IGZpbGUpOwogCQlpZiAoY2ggPT0gRU9GKSB7CkBAIC0yMzUsNiArMTk1LDggQEAKIAkJLyogaG91
cnMKIAkJICovCiAKKwkJaWYgKGNoID09ICcqJykKKwkJCWUtPmZsYWdzIHw9IEhSX1NUQVI7CiAJ
CWNoID0gZ2V0X2xpc3QoZS0+aG91ciwgRklSU1RfSE9VUiwgTEFTVF9IT1VSLAogCQkJICAgICAg
UFBDX05VTEwsIGNoLCBmaWxlKTsKIAkJaWYgKGNoID09IEVPRikgewpAQCAtMjgzLDE0OSArMjQ1
LDEzOCBAQAogCQliaXRfc2V0KGUtPmRvdywgNyk7CiAJfQogCisJLyogY2hlY2sgZm9yIHBlcm1h
dHVyZSBFT0wgYW5kIGNhdGNoIGEgY29tbW9uIHR5cG8gKi8KKwlpZiAoY2ggPT0gJ1xuJyB8fCBj
aCA9PSAnKicpIHsKKwkJZWNvZGUgPSBlX2NtZDsKKwkJZ290byBlb2Y7CisJfQorCiAJLyogY2gg
aXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIGNvbW1hbmQsIG9yIGEgdXNlcm5hbWUgKi8KIAl1
bmdldF9jaGFyKGNoLCBmaWxlKTsKIAogCWlmICghcHcpIHsKIAkJY2hhcgkJKnVzZXJuYW1lID0g
Y21kOwkvKiB0ZW1wIGJ1ZmZlciAqLwotCQljaGFyICAgICAgICAgICAgKnM7Ci0JCXN0cnVjdCBn
cm91cCAgICAqZ3JwOwotI2lmZGVmIExPR0lOX0NBUAotCQlsb2dpbl9jYXBfdCAqbGM7Ci0jZW5k
aWYKIAogCQlEZWJ1ZyhEUEFSUywgKCJsb2FkX2VudHJ5KCkuLi5hYm91dCB0byBwYXJzZSB1c2Vy
bmFtZVxuIikpCi0JCWNoID0gZ2V0X3N0cmluZyh1c2VybmFtZSwgTUFYX0NPTU1BTkQsIGZpbGUs
ICIgXHQiKTsKKwkJY2ggPSBnZXRfc3RyaW5nKHVzZXJuYW1lLCBNQVhfQ09NTUFORCwgZmlsZSwg
IiBcdFxuIik7CiAKIAkJRGVidWcoRFBBUlMsICgibG9hZF9lbnRyeSgpLi4uZ290ICVzXG4iLHVz
ZXJuYW1lKSkKLQkJaWYgKGNoID09IEVPRikgeworCQlpZiAoY2ggPT0gRU9GIHx8IGNoID09ICdc
bicgfHwgY2ggPT0gJyonKSB7CiAJCQllY29kZSA9IGVfY21kOwogCQkJZ290byBlb2Y7CiAJCX0K
IAotI2lmZGVmIExPR0lOX0NBUAotCQlpZiAoKHMgPSBzdHJyY2hyKHVzZXJuYW1lLCAnLycpKSAh
PSBOVUxMKSB7Ci0JCQkqcyA9ICdcMCc7Ci0JCQllLT5jbGFzcyA9IHN0cmR1cChzICsgMSk7Ci0J
CQlpZiAoZS0+Y2xhc3MgPT0gTlVMTCkKLQkJCQl3YXJuKCJzdHJkdXAoXCIlc1wiKSIsIHMgKyAx
KTsKLQkJfSBlbHNlIHsKLQkJCWUtPmNsYXNzID0gc3RyZHVwKFJFU09VUkNFX1JDKTsKLQkJCWlm
IChlLT5jbGFzcyA9PSBOVUxMKQotCQkJCXdhcm4oInN0cmR1cChcIiVzXCIpIiwgUkVTT1VSQ0Vf
UkMpOwotCQl9Ci0JCWlmIChlLT5jbGFzcyA9PSBOVUxMKSB7Ci0JCQllY29kZSA9IGVfbWVtOwot
CQkJZ290byBlb2Y7Ci0JCX0KLQkJaWYgKChsYyA9IGxvZ2luX2dldGNsYXNzKGUtPmNsYXNzKSkg
PT0gTlVMTCkgewotCQkJZWNvZGUgPSBlX2NsYXNzOwotCQkJZ290byBlb2Y7Ci0JCX0KLQkJbG9n
aW5fY2xvc2UobGMpOwotI2VuZGlmCi0JCWdycCA9IE5VTEw7Ci0JCWlmICgocyA9IHN0cnJjaHIo
dXNlcm5hbWUsICc6JykpICE9IE5VTEwpIHsKLQkJCSpzID0gJ1wwJzsKLQkJCWlmICgoZ3JwID0g
Z2V0Z3JuYW0ocyArIDEpKSA9PSBOVUxMKSB7Ci0JCQkJZWNvZGUgPSBlX2dyb3VwOwotCQkJCWdv
dG8gZW9mOwotCQkJfQotCQl9Ci0KIAkJcHcgPSBnZXRwd25hbSh1c2VybmFtZSk7CiAJCWlmIChw
dyA9PSBOVUxMKSB7CiAJCQllY29kZSA9IGVfdXNlcm5hbWU7CiAJCQlnb3RvIGVvZjsKIAkJfQot
CQlpZiAoZ3JwICE9IE5VTEwpCi0JCQlwdy0+cHdfZ2lkID0gZ3JwLT5ncl9naWQ7Ci0JCURlYnVn
KERQQVJTLCAoImxvYWRfZW50cnkoKS4uLnVpZCAlZCwgZ2lkICVkXG4iLHB3LT5wd191aWQscHct
PnB3X2dpZCkpCi0jaWZkZWYgTE9HSU5fQ0FQCi0JCURlYnVnKERQQVJTLCAoImxvYWRfZW50cnko
KS4uLmNsYXNzICVzXG4iLGUtPmNsYXNzKSkKKwkJRGVidWcoRFBBUlMsICgibG9hZF9lbnRyeSgp
Li4udWlkICVsZCwgZ2lkICVsZFxuIiwKKwkJCSAgICAgIChsb25nKXB3LT5wd191aWQsIChsb25n
KXB3LT5wd19naWQpKQorIyBpZmRlZiBMT0dJTl9DQVAKKwkJRGVidWcoRFBBUlMsICgibG9hZF9l
bnRyeSgpLi4uY2xhc3MgJXNcbiIsIGUtPmNsYXNzKSkKICNlbmRpZgogCX0KIAotI2lmbmRlZiBQ
QU0JLyogUEFNIHRha2VzIGNhcmUgb2YgYWNjb3VudCBleHBpcmF0aW9uIGJ5IGl0c2VsZiAqLwot
CWlmIChwdy0+cHdfZXhwaXJlICYmIHRpbWUoTlVMTCkgPj0gcHctPnB3X2V4cGlyZSkgeworI2lm
bmRlZiBQQU0KKwlpZiAocG0tPnB3X2V4cGlyZSAmJiB0aW1lKE5VTEwpID49IHB3LT5wd19leHBp
cmUpIHsKIAkJZWNvZGUgPSBlX3VzZXJuYW1lOwogCQlnb3RvIGVvZjsKIAl9Ci0jZW5kaWYgLyog
IVBBTSAqLwotCisjZW5kaWYKIAllLT51aWQgPSBwdy0+cHdfdWlkOwogCWUtPmdpZCA9IHB3LT5w
d19naWQ7CiAKIAkvKiBjb3B5IGFuZCBmaXggdXAgZW52aXJvbm1lbnQuICBzb21lIHZhcmlhYmxl
cyBhcmUganVzdCBkZWZhdWx0cyBhbmQKIAkgKiBvdGhlcnMgYXJlIG92ZXJyaWRlcy4KIAkgKi8K
LQllLT5lbnZwID0gZW52X2NvcHkoZW52cCk7Ci0JaWYgKGUtPmVudnAgPT0gTlVMTCkgewotCQl3
YXJuKCJlbnZfY29weSIpOwotCQllY29kZSA9IGVfbWVtOworCWlmICgoZS0+ZW52cCA9IGVudl9j
b3B5KGVudnApKSA9PSBOVUxMKSB7CisJCWVjb2RlID0gZV9tZW1vcnk7CiAJCWdvdG8gZW9mOwog
CX0KIAlpZiAoIWVudl9nZXQoIlNIRUxMIiwgZS0+ZW52cCkpIHsKLQkJcHJldl9lbnYgPSBlLT5l
bnZwOwotCQlzcHJpbnRmKGVudnN0ciwgIlNIRUxMPSVzIiwgX1BBVEhfQlNIRUxMKTsKLQkJZS0+
ZW52cCA9IGVudl9zZXQoZS0+ZW52cCwgZW52c3RyKTsKLQkJaWYgKGUtPmVudnAgPT0gTlVMTCkg
ewotCQkJd2FybigiZW52X3NldCglcykiLCBlbnZzdHIpOwotCQkJZW52X2ZyZWUocHJldl9lbnYp
OwotCQkJZWNvZGUgPSBlX21lbTsKLQkJCWdvdG8gZW9mOwotCQl9CisJCWlmIChnbHVlX3N0cmlu
Z3MoZW52c3RyLCBzaXplb2YgZW52c3RyLCAiU0hFTEwiLAorCQkJCSBfUEFUSF9CU0hFTEwsICc9
JykpIHsKKwkJCWlmICgodGVudnAgPSBlbnZfc2V0KGUtPmVudnAsIGVudnN0cikpID09IE5VTEwp
IHsKKwkJCQllY29kZSA9IGVfbWVtb3J5OworCQkJCWdvdG8gZW9mOworCQkJfQorCQkJZS0+ZW52
cCA9IHRlbnZwOworCQl9IGVsc2UKKwkJCWxvZ19pdCgiQ1JPTiIsIGdldHBpZCgpLCAiZXJyb3Ii
LCAiY2FuJ3Qgc2V0IFNIRUxMIik7CiAJfQogCWlmICghZW52X2dldCgiSE9NRSIsIGUtPmVudnAp
KSB7Ci0JCXByZXZfZW52ID0gZS0+ZW52cDsKLQkJc3ByaW50ZihlbnZzdHIsICJIT01FPSVzIiwg
cHctPnB3X2Rpcik7Ci0JCWUtPmVudnAgPSBlbnZfc2V0KGUtPmVudnAsIGVudnN0cik7Ci0JCWlm
IChlLT5lbnZwID09IE5VTEwpIHsKLQkJCXdhcm4oImVudl9zZXQoJXMpIiwgZW52c3RyKTsKLQkJ
CWVudl9mcmVlKHByZXZfZW52KTsKLQkJCWVjb2RlID0gZV9tZW07Ci0JCQlnb3RvIGVvZjsKLQkJ
fQorCQlpZiAoZ2x1ZV9zdHJpbmdzKGVudnN0ciwgc2l6ZW9mIGVudnN0ciwgIkhPTUUiLAorCQkJ
CSBwdy0+cHdfZGlyLCAnPScpKSB7CisJCQlpZiAoKHRlbnZwID0gZW52X3NldChlLT5lbnZwLCBl
bnZzdHIpKSA9PSBOVUxMKSB7CisJCQkJZWNvZGUgPSBlX21lbW9yeTsKKwkJCQlnb3RvIGVvZjsK
KwkJCX0KKwkJCWUtPmVudnAgPSB0ZW52cDsKKwkJfSBlbHNlCisJCQlsb2dfaXQoIkNST04iLCBn
ZXRwaWQoKSwgImVycm9yIiwgImNhbid0IHNldCBIT01FIik7CiAJfQorI2lmbmRlZiBMT0dJTl9D
QVAKKwkvKiBJZiBsb2dpbi5jb25mIGlzIGluIHVzZWQgd2Ugd2lsbCBnZXQgdGhlIGRlZmF1bHQg
UEFUSCBsYXRlci4gKi8KIAlpZiAoIWVudl9nZXQoIlBBVEgiLCBlLT5lbnZwKSkgewotCQlwcmV2
X2VudiA9IGUtPmVudnA7Ci0JCXNwcmludGYoZW52c3RyLCAiUEFUSD0lcyIsIF9QQVRIX0RFRlBB
VEgpOwotCQllLT5lbnZwID0gZW52X3NldChlLT5lbnZwLCBlbnZzdHIpOwotCQlpZiAoZS0+ZW52
cCA9PSBOVUxMKSB7Ci0JCQl3YXJuKCJlbnZfc2V0KCVzKSIsIGVudnN0cik7Ci0JCQllbnZfZnJl
ZShwcmV2X2Vudik7Ci0JCQllY29kZSA9IGVfbWVtOwotCQkJZ290byBlb2Y7Ci0JCX0KLQl9Ci0J
cHJldl9lbnYgPSBlLT5lbnZwOwotCXNwcmludGYoZW52c3RyLCAiJXM9JXMiLCAiTE9HTkFNRSIs
IHB3LT5wd19uYW1lKTsKLQllLT5lbnZwID0gZW52X3NldChlLT5lbnZwLCBlbnZzdHIpOwotCWlm
IChlLT5lbnZwID09IE5VTEwpIHsKLQkJd2FybigiZW52X3NldCglcykiLCBlbnZzdHIpOwotCQll
bnZfZnJlZShwcmV2X2Vudik7Ci0JCWVjb2RlID0gZV9tZW07Ci0JCWdvdG8gZW9mOwotCX0KLSNp
ZiBkZWZpbmVkKEJTRCkKLQlwcmV2X2VudiA9IGUtPmVudnA7Ci0Jc3ByaW50ZihlbnZzdHIsICIl
cz0lcyIsICJVU0VSIiwgcHctPnB3X25hbWUpOwotCWUtPmVudnAgPSBlbnZfc2V0KGUtPmVudnAs
IGVudnN0cik7Ci0JaWYgKGUtPmVudnAgPT0gTlVMTCkgewotCQl3YXJuKCJlbnZfc2V0KCVzKSIs
IGVudnN0cik7Ci0JCWVudl9mcmVlKHByZXZfZW52KTsKLQkJZWNvZGUgPSBlX21lbTsKLQkJZ290
byBlb2Y7Ci0JfQorCQlpZiAoZ2x1ZV9zdHJpbmdzKGVudnN0ciwgc2l6ZW9mIGVudnN0ciwgIlBB
VEgiLAorCQkJCSBfUEFUSF9ERUZQQVRILCAnPScpKSB7CisJCQlpZiAoKHRlbnZwID0gZW52X3Nl
dChlLT5lbnZwLCBlbnZzdHIpKSA9PSBOVUxMKSB7CisJCQkJZWNvZGUgPSBlX21lbW9yeTsKKwkJ
CQlnb3RvIGVvZjsKKwkJCX0KKwkJCWUtPmVudnAgPSB0ZW52cDsKKwkJfSBlbHNlCisJCQlsb2df
aXQoIkNST04iLCBnZXRwaWQoKSwgImVycm9yIiwgImNhbid0IHNldCBQQVRIIik7CisJfQorI2Vu
ZGlmIC8qIExPR0lOX0NBUCAqLworCWlmIChnbHVlX3N0cmluZ3MoZW52c3RyLCBzaXplb2YgZW52
c3RyLCAiTE9HTkFNRSIsCisJCQkgcHctPnB3X25hbWUsICc9JykpIHsKKwkJaWYgKCh0ZW52cCA9
IGVudl9zZXQoZS0+ZW52cCwgZW52c3RyKSkgPT0gTlVMTCkgeworCQkJZWNvZGUgPSBlX21lbW9y
eTsKKwkJCWdvdG8gZW9mOworCQl9CisJCWUtPmVudnAgPSB0ZW52cDsKKwl9IGVsc2UKKwkJbG9n
X2l0KCJDUk9OIiwgZ2V0cGlkKCksICJlcnJvciIsICJjYW4ndCBzZXQgTE9HTkFNRSIpOworI2lm
IGRlZmluZWQoQlNEKSB8fCBkZWZpbmVkKF9fbGludXgpCisJaWYgKGdsdWVfc3RyaW5ncyhlbnZz
dHIsIHNpemVvZiBlbnZzdHIsICJVU0VSIiwKKwkJCSBwdy0+cHdfbmFtZSwgJz0nKSkgeworCQlp
ZiAoKHRlbnZwID0gZW52X3NldChlLT5lbnZwLCBlbnZzdHIpKSA9PSBOVUxMKSB7CisJCQllY29k
ZSA9IGVfbWVtb3J5OworCQkJZ290byBlb2Y7CisJCX0KKwkJZS0+ZW52cCA9IHRlbnZwOworCX0g
ZWxzZQorCQlsb2dfaXQoIkNST04iLCBnZXRwaWQoKSwgImVycm9yIiwgImNhbid0IHNldCBVU0VS
Iik7CiAjZW5kaWYKIAogCURlYnVnKERQQVJTLCAoImxvYWRfZW50cnkoKS4uLmFib3V0IHRvIHBh
cnNlIGNvbW1hbmRcbiIpKQogCisJLyogSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgY29t
bWFuZCBpcyAnLScgaXQgaXMgYSBjcm9uIG9wdGlvbi4KKwkgKi8KKwl3aGlsZSAoKGNoID0gZ2V0
X2NoYXIoZmlsZSkpID09ICctJykgeworCQlzd2l0Y2ggKGNoID0gZ2V0X2NoYXIoZmlsZSkpIHsK
KwkJY2FzZSAncSc6CisJCQllLT5mbGFncyB8PSBET05UX0xPRzsKKwkJCVNraXBfTm9uYmxhbmtz
KGNoLCBmaWxlKQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllY29kZSA9IGVfb3B0aW9uOwor
CQkJZ290byBlb2Y7CisJCX0KKwkJU2tpcF9CbGFua3MoY2gsIGZpbGUpCisJCWlmIChjaCA9PSBF
T0YgfHwgY2ggPT0gJ1xuJykgeworCQkJZWNvZGUgPSBlX2NtZDsKKwkJCWdvdG8gZW9mOworCQl9
CisJfQorCXVuZ2V0X2NoYXIoY2gsIGZpbGUpOworCiAJLyogRXZlcnl0aGluZyB1cCB0byB0aGUg
bmV4dCBcbiBvciBFT0YgaXMgcGFydCBvZiB0aGUgY29tbWFuZC4uLgogCSAqIHRvbyBiYWQgd2Ug
ZG9uJ3Qga25vdyBpbiBhZHZhbmNlIGhvdyBsb25nIGl0IHdpbGwgYmUsIHNpbmNlIHdlCiAJICog
bmVlZCB0byBtYWxsb2MgYSBzdHJpbmcgZm9yIGl0Li4uIHNvLCB3ZSBsaW1pdCBpdCB0byBNQVhf
Q09NTUFORC4KLQkgKiBYWFggLSBzaG91bGQgdXNlIHJlYWxsb2MoKS4KLQkgKi8KKwkgKi8gCiAJ
Y2ggPSBnZXRfc3RyaW5nKGNtZCwgTUFYX0NPTU1BTkQsIGZpbGUsICJcbiIpOwogCiAJLyogYSBm
aWxlIHdpdGhvdXQgYSBcbiBiZWZvcmUgdGhlIEVPRiBpcyBydWRlLCBzbyB3ZSdsbCBjb21wbGFp
bi4uLgpAQCAtNDM3LDM3ICszODgsMzUgQEAKIAogCS8qIGdvdCB0aGUgY29tbWFuZCBpbiB0aGUg
J2NtZCcgc3RyaW5nOyBzYXZlIGl0IGluICplLgogCSAqLwotCWUtPmNtZCA9IHN0cmR1cChjbWQp
OwotCWlmIChlLT5jbWQgPT0gTlVMTCkgewotCQl3YXJuKCJzdHJkdXAoXCIlc1wiKSIsIGNtZCk7
Ci0JCWVjb2RlID0gZV9tZW07CisJaWYgKChlLT5jbWQgPSBzdHJkdXAoY21kKSkgPT0gTlVMTCkg
eworCQllY29kZSA9IGVfbWVtb3J5OwogCQlnb3RvIGVvZjsKIAl9CisKIAlEZWJ1ZyhEUEFSUywg
KCJsb2FkX2VudHJ5KCkuLi5yZXR1cm5pbmcgc3VjY2Vzc2Z1bGx5XG4iKSkKIAogCS8qIHN1Y2Nl
c3MsIGZpbmksIHJldHVybiBwb2ludGVyIHRvIHRoZSBlbnRyeSB3ZSBqdXN0IGNyZWF0ZWQuLi4K
IAkgKi8KLQlyZXR1cm4gZTsKKwlyZXR1cm4gKGUpOwogCiAgZW9mOgotCWZyZWVfZW50cnkoZSk7
CisJaWYgKGUtPmVudnApCisJCWVudl9mcmVlKGUtPmVudnApOworCWlmIChlLT5jbWQpCisJCWZy
ZWUoZS0+Y21kKTsKKwlmcmVlKGUpOworCXdoaWxlIChjaCAhPSAnXG4nICYmICFmZW9mKGZpbGUp
KQorCQljaCA9IGdldF9jaGFyKGZpbGUpOwogCWlmIChlY29kZSAhPSBlX25vbmUgJiYgZXJyb3Jf
ZnVuYykKIAkJKCplcnJvcl9mdW5jKShlY29kZXNbKGludCllY29kZV0pOwotCXdoaWxlIChjaCAh
PSBFT0YgJiYgY2ggIT0gJ1xuJykKLQkJY2ggPSBnZXRfY2hhcihmaWxlKTsKLQlyZXR1cm4gTlVM
TDsKKwlyZXR1cm4gKE5VTEwpOwogfQogCi0KLXN0YXRpYyBjaGFyCi1nZXRfbGlzdChiaXRzLCBs
b3csIGhpZ2gsIG5hbWVzLCBjaCwgZmlsZSkKLQliaXRzdHJfdAkqYml0czsJCS8qIG9uZSBiaXQg
cGVyIGZsYWcsIGRlZmF1bHQ9RkFMU0UgKi8KLQlpbnQJCWxvdywgaGlnaDsJLyogYm91bmRzLCBp
bXBsLiBvZmZzZXQgZm9yIGJpdHN0ciAqLwotCWNoYXIJCSpuYW1lc1tdOwkvKiBOVUxMIG9yICpb
XSBvZiBuYW1lcyBmb3IgdGhlc2UgZWxlbWVudHMgKi8KLQlpbnQJCWNoOwkJLyogY3VycmVudCBj
aGFyYWN0ZXIgYmVpbmcgcHJvY2Vzc2VkICovCi0JRklMRQkJKmZpbGU7CQkvKiBmaWxlIGJlaW5n
IHJlYWQgKi8KK3N0YXRpYyBpbnQKK2dldF9saXN0KGJpdHN0cl90ICpiaXRzLCBpbnQgbG93LCBp
bnQgaGlnaCwgY29uc3QgY2hhciAqbmFtZXNbXSwKKwkgaW50IGNoLCBGSUxFICpmaWxlKQogewot
CXJlZ2lzdGVyIGludAlkb25lOworCWludCBkb25lOwogCiAJLyogd2Uga25vdyB0aGF0IHdlIHBv
aW50IHRvIGEgbm9uLWJsYW5rIGNoYXJhY3RlciBoZXJlOwogCSAqIG11c3QgZG8gYSBTa2lwX0Js
YW5rcyBiZWZvcmUgd2UgZXhpdCwgc28gdGhhdCB0aGUKQEAgLTQ3OSw3ICs0MjgsNyBAQAogCiAJ
LyogbGlzdCA9IHJhbmdlIHsiLCIgcmFuZ2V9CiAJICovCi0KKwkKIAkvKiBjbGVhciB0aGUgYml0
IHN0cmluZywgc2luY2UgdGhlIGRlZmF1bHQgaXMgJ29mZicuCiAJICovCiAJYml0X25jbGVhcihi
aXRzLCAwLCAoaGlnaC1sb3crMSkpOwpAQCAtNDg4LDcgKzQzNyw4IEBACiAJICovCiAJZG9uZSA9
IEZBTFNFOwogCXdoaWxlICghZG9uZSkgewotCQljaCA9IGdldF9yYW5nZShiaXRzLCBsb3csIGhp
Z2gsIG5hbWVzLCBjaCwgZmlsZSk7CisJCWlmIChFT0YgPT0gKGNoID0gZ2V0X3JhbmdlKGJpdHMs
IGxvdywgaGlnaCwgbmFtZXMsIGNoLCBmaWxlKSkpCisJCQlyZXR1cm4gKEVPRik7CiAJCWlmIChj
aCA9PSAnLCcpCiAJCQljaCA9IGdldF9jaGFyKGZpbGUpOwogCQllbHNlCkBAIC01MDIsMjMgKzQ1
MiwxOCBAQAogCiAJRGVidWcoRFBBUlN8REVYVCwgKCJnZXRfbGlzdCgpLi4uZXhpdGluZyB3LyAl
MDJ4XG4iLCBjaCkpCiAKLQlyZXR1cm4gY2g7CisJcmV0dXJuIChjaCk7CiB9CiAKIAotc3RhdGlj
IGNoYXIKLWdldF9yYW5nZShiaXRzLCBsb3csIGhpZ2gsIG5hbWVzLCBjaCwgZmlsZSkKLQliaXRz
dHJfdAkqYml0czsJCS8qIG9uZSBiaXQgcGVyIGZsYWcsIGRlZmF1bHQ9RkFMU0UgKi8KLQlpbnQJ
CWxvdywgaGlnaDsJLyogYm91bmRzLCBpbXBsLiBvZmZzZXQgZm9yIGJpdHN0ciAqLwotCWNoYXIJ
CSpuYW1lc1tdOwkvKiBOVUxMIG9yIG5hbWVzIG9mIGVsZW1lbnRzICovCi0JaW50CQljaDsJCS8q
IGN1cnJlbnQgY2hhcmFjdGVyIGJlaW5nIHByb2Nlc3NlZCAqLwotCUZJTEUJCSpmaWxlOwkJLyog
ZmlsZSBiZWluZyByZWFkICovCitzdGF0aWMgaW50CitnZXRfcmFuZ2UoYml0c3RyX3QgKmJpdHMs
IGludCBsb3csIGludCBoaWdoLCBjb25zdCBjaGFyICpuYW1lc1tdLAorCSAgaW50IGNoLCBGSUxF
ICpmaWxlKQogewogCS8qIHJhbmdlID0gbnVtYmVyIHwgbnVtYmVyICItIiBudW1iZXIgWyAiLyIg
bnVtYmVyIF0KIAkgKi8KIAotCXJlZ2lzdGVyIGludAlpOwotCWF1dG8gaW50CW51bTEsIG51bTIs
IG51bTM7CisJaW50IGksIG51bTEsIG51bTIsIG51bTM7CiAKIAlEZWJ1ZyhEUEFSU3xERVhULCAo
ImdldF9yYW5nZSgpLi4uZW50ZXJpbmcsIGV4aXQgd29uJ3Qgc2hvd1xuIikpCiAKQEAgLTUyOSwz
MSArNDc0LDMyIEBACiAJCW51bTIgPSBoaWdoOwogCQljaCA9IGdldF9jaGFyKGZpbGUpOwogCQlp
ZiAoY2ggPT0gRU9GKQotCQkJcmV0dXJuIEVPRjsKKwkJCXJldHVybiAoRU9GKTsKIAl9IGVsc2Ug
ewotCQlpZiAoRU9GID09IChjaCA9IGdldF9udW1iZXIoJm51bTEsIGxvdywgbmFtZXMsIGNoLCBm
aWxlKSkpCi0JCQlyZXR1cm4gRU9GOworCQljaCA9IGdldF9udW1iZXIoJm51bTEsIGxvdywgbmFt
ZXMsIGNoLCBmaWxlLCAiLC0gXHRcbiIpOworCQlpZiAoY2ggPT0gRU9GKQorCQkJcmV0dXJuIChF
T0YpOwogCi0JCWlmIChjaCA9PSAnLycpCi0JCQludW0yID0gaGlnaDsKLQkJZWxzZSBpZiAoY2gg
IT0gJy0nKSB7CisJCWlmIChjaCAhPSAnLScpIHsKIAkJCS8qIG5vdCBhIHJhbmdlLCBpdCdzIGEg
c2luZ2xlIG51bWJlci4KIAkJCSAqLwotCQkJaWYgKEVPRiA9PSBzZXRfZWxlbWVudChiaXRzLCBs
b3csIGhpZ2gsIG51bTEpKQotCQkJCXJldHVybiBFT0Y7Ci0JCQlyZXR1cm4gY2g7CisJCQlpZiAo
RU9GID09IHNldF9lbGVtZW50KGJpdHMsIGxvdywgaGlnaCwgbnVtMSkpIHsKKwkJCQl1bmdldF9j
aGFyKGNoLCBmaWxlKTsKKwkJCQlyZXR1cm4gKEVPRik7CisJCQl9CisJCQlyZXR1cm4gKGNoKTsK
IAkJfSBlbHNlIHsKIAkJCS8qIGVhdCB0aGUgZGFzaAogCQkJICovCiAJCQljaCA9IGdldF9jaGFy
KGZpbGUpOwogCQkJaWYgKGNoID09IEVPRikKLQkJCQlyZXR1cm4gRU9GOworCQkJCXJldHVybiAo
RU9GKTsKIAogCQkJLyogZ2V0IHRoZSBudW1iZXIgZm9sbG93aW5nIHRoZSBkYXNoCiAJCQkgKi8K
LQkJCWNoID0gZ2V0X251bWJlcigmbnVtMiwgbG93LCBuYW1lcywgY2gsIGZpbGUpOwotCQkJaWYg
KGNoID09IEVPRikKLQkJCQlyZXR1cm4gRU9GOworCQkJY2ggPSBnZXRfbnVtYmVyKCZudW0yLCBs
b3csIG5hbWVzLCBjaCwgZmlsZSwgIi8sIFx0XG4iKTsKKwkJCWlmIChjaCA9PSBFT0YgfHwgbnVt
MSA+IG51bTIpCisJCQkJcmV0dXJuIChFT0YpOwogCQl9CiAJfQogCkBAIC01NjQsMTYgKzUxMCwx
NiBAQAogCQkgKi8KIAkJY2ggPSBnZXRfY2hhcihmaWxlKTsKIAkJaWYgKGNoID09IEVPRikKLQkJ
CXJldHVybiBFT0Y7CisJCQlyZXR1cm4gKEVPRik7CiAKIAkJLyogZ2V0IHRoZSBzdGVwIHNpemUg
LS0gbm90ZTogd2UgZG9uJ3QgcGFzcyB0aGUKIAkJICogbmFtZXMgaGVyZSwgYmVjYXVzZSB0aGUg
bnVtYmVyIGlzIG5vdCBhbgogCQkgKiBlbGVtZW50IGlkLCBpdCdzIGEgc3RlcCBzaXplLiAgJ2xv
dycgaXMKIAkJICogc2VudCBhcyBhIDAgc2luY2UgdGhlcmUgaXMgbm8gb2Zmc2V0IGVpdGhlci4K
IAkJICovCi0JCWNoID0gZ2V0X251bWJlcigmbnVtMywgMCwgUFBDX05VTEwsIGNoLCBmaWxlKTsK
KwkJY2ggPSBnZXRfbnVtYmVyKCZudW0zLCAwLCBQUENfTlVMTCwgY2gsIGZpbGUsICIsIFx0XG4i
KTsKIAkJaWYgKGNoID09IEVPRiB8fCBudW0zID09IDApCi0JCQlyZXR1cm4gRU9GOworCQkJcmV0
dXJuIChFT0YpOwogCX0gZWxzZSB7CiAJCS8qIG5vIHN0ZXAuICBkZWZhdWx0PT0xLgogCQkgKi8K
QEAgLTU4Myw4NSArNTI5LDc2IEBACiAJLyogcmFuZ2UuIHNldCBhbGwgZWxlbWVudHMgZnJvbSBu
dW0xIHRvIG51bTIsIHN0ZXBwaW5nCiAJICogYnkgbnVtMy4gICh0aGUgc3RlcCBpcyBhIGRvd253
YXJkLWNvbXBhdGlibGUgZXh0ZW5zaW9uCiAJICogcHJvcG9zZWQgY29uY2VwdHVhbGx5IGJ5IGJv
YkBhY29ybnJjLCBzeW50YWN0aWNhbGx5Ci0JICogZGVzaWduZWQgdGhlbiBpbXBsbWVudGVkIGJ5
IHBhdWwgdml4aWUpLgorCSAqIGRlc2lnbmVkIHRoZW4gaW1wbGVtZW50ZWQgYnkgcGF1bCB2aXhp
ZSkuCiAJICovCiAJZm9yIChpID0gbnVtMTsgIGkgPD0gbnVtMjsgIGkgKz0gbnVtMykKLQkJaWYg
KEVPRiA9PSBzZXRfZWxlbWVudChiaXRzLCBsb3csIGhpZ2gsIGkpKQotCQkJcmV0dXJuIEVPRjsK
KwkJaWYgKEVPRiA9PSBzZXRfZWxlbWVudChiaXRzLCBsb3csIGhpZ2gsIGkpKSB7CisJCQl1bmdl
dF9jaGFyKGNoLCBmaWxlKTsKKwkJCXJldHVybiAoRU9GKTsKKwkJfQogCi0JcmV0dXJuIGNoOwor
CXJldHVybiAoY2gpOwogfQogCitzdGF0aWMgaW50CitnZXRfbnVtYmVyKGludCAqbnVtcHRyLCBp
bnQgbG93LCBjb25zdCBjaGFyICpuYW1lc1tdLCBpbnQgY2gsIEZJTEUgKmZpbGUsCisgICAgY29u
c3QgY2hhciAqdGVybXMpIHsKKwljaGFyIHRlbXBbTUFYX1RFTVBTVFJdLCAqcGM7CisJaW50IGxl
biwgaTsKIAotc3RhdGljIGNoYXIKLWdldF9udW1iZXIobnVtcHRyLCBsb3csIG5hbWVzLCBjaCwg
ZmlsZSkKLQlpbnQJKm51bXB0cjsJLyogd2hlcmUgZG9lcyB0aGUgcmVzdWx0IGdvPyAqLwotCWlu
dAlsb3c7CQkvKiBvZmZzZXQgYXBwbGllZCB0byByZXN1bHQgaWYgc3ltYm9saWMgZW51bSB1c2Vk
ICovCi0JY2hhcgkqbmFtZXNbXTsJLyogc3ltYm9saWMgbmFtZXMsIGlmIGFueSwgZm9yIGVudW1z
ICovCi0JaW50CWNoOwkJLyogY3VycmVudCBjaGFyYWN0ZXIgKi8KLQlGSUxFCSpmaWxlOwkJLyog
c291cmNlICovCi17Ci0JY2hhcgl0ZW1wW01BWF9URU1QU1RSXSwgKnBjOwotCWludAlsZW4sIGks
IGFsbF9kaWdpdHM7Ci0KLQkvKiBjb2xsZWN0IGFscGhhbnVtZXJpY3MgaW50byBvdXIgZml4ZWQt
c2l6ZSB0ZW1wIGFycmF5Ci0JICovCiAJcGMgPSB0ZW1wOwogCWxlbiA9IDA7Ci0JYWxsX2RpZ2l0
cyA9IFRSVUU7Ci0Jd2hpbGUgKGlzYWxudW0oY2gpKSB7Ci0JCWlmICgrK2xlbiA+PSBNQVhfVEVN
UFNUUikKLQkJCXJldHVybiBFT0Y7CiAKKwkvKiBmaXJzdCBsb29rIGZvciBhIG51bWJlciAqLwor
CXdoaWxlIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKWNoKSkgeworCQlpZiAoKytsZW4gPj0gTUFY
X1RFTVBTVFIpCisJCQlnb3RvIGJhZDsKIAkJKnBjKysgPSBjaDsKLQotCQlpZiAoIWlzZGlnaXQo
Y2gpKQotCQkJYWxsX2RpZ2l0cyA9IEZBTFNFOwotCiAJCWNoID0gZ2V0X2NoYXIoZmlsZSk7CiAJ
fQogCSpwYyA9ICdcMCc7Ci0JaWYgKGxlbiA9PSAwKQotCSAgICByZXR1cm4gKEVPRik7CisJaWYg
KGxlbiAhPSAwKSB7CisJCS8qIGdvdCBhIG51bWJlciwgY2hlY2sgZm9yIHZhbGlkIHRlcm1pbmF0
b3IgKi8KKwkJaWYgKCFzdHJjaHIodGVybXMsIGNoKSkKKwkJCWdvdG8gYmFkOworCQkqbnVtcHRy
ID0gYXRvaSh0ZW1wKTsKKwkJcmV0dXJuIChjaCk7CisJfQogCi0JLyogdHJ5IHRvIGZpbmQgdGhl
IG5hbWUgaW4gdGhlIG5hbWUgbGlzdAotCSAqLworCS8qIG5vIG51bWJlcnMsIGxvb2sgZm9yIGEg
c3RyaW5nIGlmIHdlIGhhdmUgYW55ICovCiAJaWYgKG5hbWVzKSB7Ci0JCWZvciAoaSA9IDA7ICBu
YW1lc1tpXSAhPSBOVUxMOyAgaSsrKSB7Ci0JCQlEZWJ1ZyhEUEFSU3xERVhULAotCQkJCSgiZ2V0
X251bSwgY29tcGFyZSglcywlcylcbiIsIG5hbWVzW2ldLCB0ZW1wKSkKLQkJCWlmICghc3RyY2Fz
ZWNtcChuYW1lc1tpXSwgdGVtcCkpIHsKLQkJCQkqbnVtcHRyID0gaStsb3c7Ci0JCQkJcmV0dXJu
IGNoOworCQl3aGlsZSAoaXNhbHBoYSgodW5zaWduZWQgY2hhciljaCkpIHsKKwkJCWlmICgrK2xl
biA+PSBNQVhfVEVNUFNUUikKKwkJCQlnb3RvIGJhZDsKKwkJCSpwYysrID0gY2g7CisJCQljaCA9
IGdldF9jaGFyKGZpbGUpOworCQl9CisJCSpwYyA9ICdcMCc7CisJCWlmIChsZW4gIT0gMCAmJiBz
dHJjaHIodGVybXMsIGNoKSkgeworCQkJZm9yIChpID0gMDsgIG5hbWVzW2ldICE9IE5VTEw7ICBp
KyspIHsKKwkJCQlEZWJ1ZyhEUEFSU3xERVhULAorCQkJCQkoImdldF9udW0sIGNvbXBhcmUoJXMs
JXMpXG4iLCBuYW1lc1tpXSwKKwkJCQkJdGVtcCkpCisJCQkJaWYgKCFzdHJjYXNlY21wKG5hbWVz
W2ldLCB0ZW1wKSkgeworCQkJCQkqbnVtcHRyID0gaStsb3c7CisJCQkJCXJldHVybiAoY2gpOwor
CQkJCX0KIAkJCX0KIAkJfQogCX0KIAotCS8qIG5vIG5hbWUgbGlzdCBzcGVjaWZpZWQsIG9yIHRo
ZXJlIGlzIG9uZSBhbmQgb3VyIHN0cmluZyBpc24ndAotCSAqIGluIGl0LiAgZWl0aGVyIHdheTog
aWYgaXQncyBhbGwgZGlnaXRzLCB1c2UgaXRzIG1hZ25pdHVkZS4KLQkgKiBvdGhlcndpc2UsIGl0
J3MgYW4gZXJyb3IuCi0JICovCi0JaWYgKGFsbF9kaWdpdHMpIHsKLQkJKm51bXB0ciA9IGF0b2ko
dGVtcCk7Ci0JCXJldHVybiBjaDsKLQl9Ci0KLQlyZXR1cm4gRU9GOworYmFkOgorCXVuZ2V0X2No
YXIoY2gsIGZpbGUpOworCXJldHVybiAoRU9GKTsKIH0KIAotCiBzdGF0aWMgaW50Ci1zZXRfZWxl
bWVudChiaXRzLCBsb3csIGhpZ2gsIG51bWJlcikKLQliaXRzdHJfdAkqYml0czsgCQkvKiBvbmUg
Yml0IHBlciBmbGFnLCBkZWZhdWx0PUZBTFNFICovCi0JaW50CQlsb3c7Ci0JaW50CQloaWdoOwot
CWludAkJbnVtYmVyOwoteworc2V0X2VsZW1lbnQoYml0c3RyX3QgKmJpdHMsIGludCBsb3csIGlu
dCBoaWdoLCBpbnQgbnVtYmVyKSB7CiAJRGVidWcoRFBBUlN8REVYVCwgKCJzZXRfZWxlbWVudCg/
LCVkLCVkLCVkKVxuIiwgbG93LCBoaWdoLCBudW1iZXIpKQogCiAJaWYgKG51bWJlciA8IGxvdyB8
fCBudW1iZXIgPiBoaWdoKQotCQlyZXR1cm4gRU9GOworCQlyZXR1cm4gKEVPRik7CiAKIAliaXRf
c2V0KGJpdHMsIChudW1iZXItbG93KSk7Ci0JcmV0dXJuIE9LOworCXJldHVybiAoT0spOwogfQpk
aWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9saWIvZW52LmMgZnJlZWJzZF9jcm9uL2xp
Yi9lbnYuYwotLS0gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9saWIvZW52LmMJMjAxNC0wMS0xNiAy
MTo0Mzo1MC4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9saWIvZW52LmMJMjAxNC0w
Ni0xMSAxNjo0Mjo1NS4yNzU0NDQzNzkgKzAyMDAKQEAgLTEsOTUgKzEsODIgQEAKIC8qIENvcHly
aWdodCAxOTg4LDE5OTAsMTk5MywxOTk0IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVz
ZXJ2ZWQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3Rl
bXMgQ29uc29ydGl1bSwgSW5jLiAoIklTQyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBi
eSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBm
cmVlbHksIGV4Y2VwdDogZG9uJ3QgcmVtb3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0g
KiBkb2N1bWVudGF0aW9uIChkb24ndCB0YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91
ciBjaGFuZ2VzIChkb24ndAotICogZ2V0IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdz
KSwgZG9uJ3QgYWx0ZXIgb3IgcmVtb3ZlIHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlm
IGJ1aWxkYWJsZSBzb3VyY2UgaXMgcHJvdmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVl
IG9mIGFueSBraW5kLCBleHByZXNzIG9yIGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwot
ICogc29mdHdhcmU7IHVzZSBhdCB5b3VyIG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFt
YWdlcyAoaWYgYW55KSB0bwotICogYW55b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhp
cyBzb2Z0d2FyZSByZXN0cyBlbnRpcmVseSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Np
b24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9y
IGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBw
cm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJt
aXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBv
cnRzLCBidWcgZml4ZXMsIGVuaGFuY2VtZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5k
Ci0gKiBJJ2xsIHRyeSB0byBrZWVwIGEgdmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVh
Y2hlZCBhcyBmb2xsb3dzOgotICogUGF1bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAg
ICAgICAgICB1dW5ldCFkZWN3cmwhdml4aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJ
REVEICJBUyBJUyIgQU5EIElTQyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVH
QVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YK
KyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBC
RSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBG
Uk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElP
TiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJ
TkcgT1VUCisgKiBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5D
RSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5l
ZChMSU5UKQotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9Ci0gICIkRnJlZUJTRDogcmVsZWFz
ZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9saWIvZW52LmMgMTEwNjM4IDIwMDMtMDItMTAgMTE6MjA6
NThaIHRob21hcyAkIjsKLSNlbmRpZgotCisvLyNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5l
ZChMSU5UKQorLy9zdGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogZW52LmMsdiAxLjEwIDIwMDQv
MDEvMjMgMTg6NTY6NDIgdml4aWUgRXhwICQiOworLy8jZW5kaWYKIAogI2luY2x1ZGUgImNyb24u
aCIKIAotCiBjaGFyICoqCi1lbnZfaW5pdCgpCi17Ci0JcmVnaXN0ZXIgY2hhcgkqKnAgPSAoY2hh
ciAqKikgbWFsbG9jKHNpemVvZihjaGFyICopKTsKK2Vudl9pbml0KHZvaWQpIHsKKwljaGFyICoq
cCA9IChjaGFyICoqKSBtYWxsb2Moc2l6ZW9mKGNoYXIgKiopKTsKIAotCWlmIChwKQorCWlmIChw
ICE9IE5VTEwpCiAJCXBbMF0gPSBOVUxMOwogCXJldHVybiAocCk7CiB9CiAKLQogdm9pZAotZW52
X2ZyZWUoZW52cCkKLQljaGFyCSoqZW52cDsKLXsKLQljaGFyCSoqcDsKK2Vudl9mcmVlKGNoYXIg
KiplbnZwKSB7CisJY2hhciAqKnA7CiAKLQlpZiAoKHAgPSBlbnZwKSkKLQkgICAgZm9yICg7ICAq
cDsgIHArKykKKwlmb3IgKHAgPSBlbnZwOyAqcCAhPSBOVUxMOyBwKyspCiAJCWZyZWUoKnApOwog
CWZyZWUoZW52cCk7CiB9CiAKLQogY2hhciAqKgotZW52X2NvcHkoZW52cCkKLQlyZWdpc3RlciBj
aGFyCSoqZW52cDsKLXsKLQlyZWdpc3RlciBpbnQJY291bnQsIGk7Ci0JcmVnaXN0ZXIgY2hhcgkq
KnA7Ci0KLQlmb3IgKGNvdW50ID0gMDsgIGVudnBbY291bnRdICE9IE5VTEw7ICBjb3VudCsrKQot
CQk7Ci0JcCA9IChjaGFyICoqKSBtYWxsb2MoKGNvdW50KzEpICogc2l6ZW9mKGNoYXIgKikpOyAv
KiAxIGZvciB0aGUgTlVMTCAqLwotCWlmIChwID09IE5VTEwpIHsKLQkJZXJybm8gPSBFTk9NRU07
Ci0JCXJldHVybiBOVUxMOworZW52X2NvcHkoY2hhciAqKmVudnApIHsKKwlpbnQgY291bnQsIGks
IHNhdmVfZXJybm87CisJY2hhciAqKnA7CisKKwlmb3IgKGNvdW50ID0gMDsgZW52cFtjb3VudF0g
IT0gTlVMTDsgY291bnQrKykKKwkJTlVMTDsKKwlwID0gKGNoYXIgKiopIG1hbGxvYygoY291bnQr
MSkgKiBzaXplb2YoY2hhciAqKSk7ICAvKiAxIGZvciB0aGUgTlVMTCAqLworCWlmIChwICE9IE5V
TEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQlpZiAoKHBbaV0gPSBzdHJk
dXAoZW52cFtpXSkpID09IE5VTEwpIHsKKwkJCQlzYXZlX2Vycm5vID0gZXJybm87CisJCQkJd2hp
bGUgKC0taSA+PSAwKQorCQkJCQlmcmVlKHBbaV0pOworCQkJCWZyZWUocCk7CisJCQkJZXJybm8g
PSBzYXZlX2Vycm5vOworCQkJCXJldHVybiAoTlVMTCk7CisJCQl9CisJCXBbY291bnRdID0gTlVM
TDsKIAl9Ci0JZm9yIChpID0gMDsgIGkgPCBjb3VudDsgIGkrKykKLQkJaWYgKChwW2ldID0gc3Ry
ZHVwKGVudnBbaV0pKSA9PSBOVUxMKSB7Ci0JCQl3aGlsZSAoLS1pID49IDApCi0JCQkJKHZvaWQp
IGZyZWUocFtpXSk7Ci0JCQlmcmVlKHApOwotCQkJZXJybm8gPSBFTk9NRU07Ci0JCQlyZXR1cm4g
TlVMTDsKLQkJfQotCXBbY291bnRdID0gTlVMTDsKIAlyZXR1cm4gKHApOwogfQogCi0KIGNoYXIg
KioKLWVudl9zZXQoZW52cCwgZW52c3RyKQotCWNoYXIJKiplbnZwOwotCWNoYXIJKmVudnN0cjsK
LXsKLQlyZWdpc3RlciBpbnQJY291bnQsIGZvdW5kOwotCXJlZ2lzdGVyIGNoYXIJKipwOwotCWNo
YXIJCSpxOworZW52X3NldChjaGFyICoqZW52cCwgY2hhciAqZW52c3RyKSB7CisJaW50IGNvdW50
LCBmb3VuZDsKKwljaGFyICoqcCwgKmVudnRtcDsKIAogCS8qCiAJICogY291bnQgdGhlIG51bWJl
ciBvZiBlbGVtZW50cywgaW5jbHVkaW5nIHRoZSBudWxsIHBvaW50ZXI7CiAJICogYWxzbyBzZXQg
J2ZvdW5kJyB0byAtMSBvciBpbmRleCBvZiBlbnRyeSBpZiBhbHJlYWR5IGluIGhlcmUuCiAJICov
CiAJZm91bmQgPSAtMTsKLQlmb3IgKGNvdW50ID0gMDsgIGVudnBbY291bnRdICE9IE5VTEw7ICBj
b3VudCsrKSB7CisJZm9yIChjb3VudCA9IDA7IGVudnBbY291bnRdICE9IE5VTEw7IGNvdW50Kysp
IHsKIAkJaWYgKCFzdHJjbXBfdW50aWwoZW52cFtjb3VudF0sIGVudnN0ciwgJz0nKSkKIAkJCWZv
dW5kID0gY291bnQ7CiAJfQpAQCAtMTAwLDE0ICs4NywxMCBAQAogCQkgKiBpdCBleGlzdHMgYWxy
ZWFkeSwgc28ganVzdCBmcmVlIHRoZSBleGlzdGluZyBzZXR0aW5nLAogCQkgKiBzYXZlIG91ciBu
ZXcgb25lIHRoZXJlLCBhbmQgcmV0dXJuIHRoZSBleGlzdGluZyBhcnJheS4KIAkJICovCi0JCXEg
PSBlbnZwW2ZvdW5kXTsKLQkJaWYgKChlbnZwW2ZvdW5kXSA9IHN0cmR1cChlbnZzdHIpKSA9PSBO
VUxMKSB7Ci0JCQllbnZwW2ZvdW5kXSA9IHE7Ci0JCQkvKiBYWFggZW52X2ZyZWUoZW52cCk7ICov
Ci0JCQllcnJubyA9IEVOT01FTTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWZyZWUocSk7CisJ
CWlmICgoZW52dG1wID0gc3RyZHVwKGVudnN0cikpID09IE5VTEwpCisJCQlyZXR1cm4gKE5VTEwp
OworCQlmcmVlKGVudnBbZm91bmRdKTsKKwkJZW52cFtmb3VuZF0gPSBlbnZ0bXA7CiAJCXJldHVy
biAoZW52cCk7CiAJfQogCkBAIC0xMTYsNDcgKzk5LDQyIEBACiAJICogb25lLCBzYXZlIG91ciBz
dHJpbmcgb3ZlciB0aGUgb2xkIG51bGwgcG9pbnRlciwgYW5kIHJldHVybiByZXNpemVkCiAJICog
YXJyYXkuCiAJICovCisJaWYgKChlbnZ0bXAgPSBzdHJkdXAoZW52c3RyKSkgPT0gTlVMTCkKKwkJ
cmV0dXJuIChOVUxMKTsKIAlwID0gKGNoYXIgKiopIHJlYWxsb2MoKHZvaWQgKikgZW52cCwKLQkJ
CSAgICAgICh1bnNpZ25lZCkgKChjb3VudCsxKSAqIHNpemVvZihjaGFyICopKSk7Ci0JaWYgKHAg
PT0gTlVMTCkgCXsKLQkJLyogWFhYIGVudl9mcmVlKGVudnApOyAqLwotCQllcnJubyA9IEVOT01F
TTsKLQkJcmV0dXJuIE5VTEw7CisJCQkgICAgICAoc2l6ZV90KSAoKGNvdW50KzEpICogc2l6ZW9m
KGNoYXIgKiopKSk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlmcmVlKGVudnRtcCk7CisJCXJldHVy
biAoTlVMTCk7CiAJfQogCXBbY291bnRdID0gcFtjb3VudC0xXTsKLQlpZiAoKHBbY291bnQtMV0g
PSBzdHJkdXAoZW52c3RyKSkgPT0gTlVMTCkgewotCQllbnZfZnJlZShwKTsKLQkJZXJybm8gPSBF
Tk9NRU07Ci0JCXJldHVybiBOVUxMOwotCX0KKwlwW2NvdW50LTFdID0gZW52dG1wOwogCXJldHVy
biAocCk7CiB9CiAKKy8qIFRoZSBmb2xsb3dpbmcgc3RhdGVzIGFyZSB1c2VkIGJ5IGxvYWRfZW52
KCksIHRyYXZlcnNlZCBpbiBvcmRlcjogKi8KK2VudW0gZW52X3N0YXRlIHsKKwlOQU1FSSwJCS8q
IEZpcnN0IGNoYXIgb2YgTkFNRSwgbWF5IGJlIHF1b3RlICovCisJTkFNRSwJCS8qIFN1YnNlcXVl
bnQgY2hhcnMgb2YgTkFNRSAqLworCUVRMSwJCS8qIEFmdGVyIGVuZCBvZiBuYW1lLCBsb29raW5n
IGZvciAnPScgc2lnbiAqLworCUVRMiwJCS8qIEFmdGVyICc9Jywgc2tpcHBpbmcgd2hpdGVzcGFj
ZSAqLworCVZBTFVFSSwJCS8qIEZpcnN0IGNoYXIgb2YgVkFMVUUsIG1heSBiZSBxdW90ZSAqLwor
CVZBTFVFLAkJLyogU3Vic2VxdWVudCBjaGFycyBvZiBWQUxVRSAqLworCUZJTkksCQkvKiBBbGwg
ZG9uZSwgc2tpcHBpbmcgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCUVSUk9SLAkJLyogRXJyb3Ig
Ki8KK307CiAKIC8qIHJldHVybglFUlIgPSBlbmQgb2YgZmlsZQogICoJCUZBTFNFID0gbm90IGFu
IGVudiBzZXR0aW5nIChmaWxlIHdhcyByZXBvc2l0aW9uZWQpCiAgKgkJVFJVRSA9IHdhcyBhbiBl
bnYgc2V0dGluZwogICovCiBpbnQKLWxvYWRfZW52KGVudnN0ciwgZikKLQljaGFyCSplbnZzdHI7
Ci0JRklMRQkqZjsKLXsKLQlsb25nCWZpbGVwb3M7Ci0JaW50CWZpbGVsaW5lOwotCWNoYXIJbmFt
ZVtNQVhfRU5WU1RSXSwgdmFsW01BWF9FTlZTVFJdOwotCWNoYXIJcXVvdGVjaGFyLCAqYywgKnN0
cjsKLQlpbnQJc3RhdGU7Ci0KLQkvKiBUaGUgZm9sbG93aW5nIHN0YXRlcyBhcmUgdHJhdmVyc2Vk
IGluIG9yZGVyOiAqLwotI2RlZmluZSBOQU1FSQkwCS8qIEZpcnN0IGNoYXIgb2YgTkFNRSwgbWF5
IGJlIHF1b3RlICovCi0jZGVmaW5lIE5BTUUJMQkvKiBTdWJzZXF1ZW50IGNoYXJzIG9mIE5BTUUg
Ki8KLSNkZWZpbmUgRVExCTIJLyogQWZ0ZXIgZW5kIG9mIG5hbWUsIGxvb2tpbmcgZm9yICc9JyBz
aWduICovCi0jZGVmaW5lIEVRMgkzCS8qIEFmdGVyICc9Jywgc2tpcHBpbmcgd2hpdGVzcGFjZSAq
LwotI2RlZmluZSBWQUxVRUkJNAkvKiBGaXJzdCBjaGFyIG9mIFZBTFVFLCBtYXkgYmUgcXVvdGUg
Ki8KLSNkZWZpbmUgVkFMVUUJNQkvKiBTdWJzZXF1ZW50IGNoYXJzIG9mIFZBTFVFICovCi0jZGVm
aW5lIEZJTkkJNgkvKiBBbGwgZG9uZSwgc2tpcHBpbmcgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwot
I2RlZmluZSBFUlJPUgk3CS8qIEVycm9yICovCitsb2FkX2VudihjaGFyICplbnZzdHIsIEZJTEUg
KmYpIHsKKwlsb25nIGZpbGVwb3M7CisJaW50IGZpbGVsaW5lOworCWVudW0gZW52X3N0YXRlIHN0
YXRlOworCWNoYXIgbmFtZVtNQVhfRU5WU1RSXSwgdmFsW01BWF9FTlZTVFJdOworCWNoYXIgcXVv
dGVjaGFyLCAqYywgKnN0cjsKIAogCWZpbGVwb3MgPSBmdGVsbChmKTsKIAlmaWxlbGluZSA9IExp
bmVOdW1iZXI7CkBAIC0xNjQsMTAgKzE0MiwxMCBAQAogCWlmIChFT0YgPT0gZ2V0X3N0cmluZyhl
bnZzdHIsIE1BWF9FTlZTVFIsIGYsICJcbiIpKQogCQlyZXR1cm4gKEVSUik7CiAKLQlEZWJ1ZyhE
UEFSUywgKCJsb2FkX2VudiwgcmVhZCA8JXM+XG4iLCBlbnZzdHIpKTsKKwlEZWJ1ZyhEUEFSUywg
KCJsb2FkX2VudiwgcmVhZCA8JXM+XG4iLCBlbnZzdHIpKQogCi0JYnplcm8gKG5hbWUsIHNpemVv
ZiBuYW1lKTsKLQliemVybyAodmFsLCBzaXplb2YgdmFsKTsKKwliemVybyhuYW1lLCBzaXplb2Yg
bmFtZSk7CisJYnplcm8odmFsLCBzaXplb2YgdmFsKTsKIAlzdHIgPSBuYW1lOwogCXN0YXRlID0g
TkFNRUk7CiAJcXVvdGVjaGFyID0gJ1wwJzsKQEAgLTE3OCw3ICsxNTYsNyBAQAogCQljYXNlIFZB
TFVFSToKIAkJCWlmICgqYyA9PSAnXCcnIHx8ICpjID09ICciJykKIAkJCQlxdW90ZWNoYXIgPSAq
YysrOwotCQkJKytzdGF0ZTsKKwkJCXN0YXRlKys7CiAJCQkvKiBGQUxMVEhST1VHSCAqLwogCQlj
YXNlIE5BTUU6CiAJCWNhc2UgVkFMVUU6CkBAIC0xOTQsNyArMTcyLDcgQEAKIAkJCQl9CiAJCQl9
IGVsc2UgewogCQkJCWlmIChzdGF0ZSA9PSBOQU1FKSB7Ci0JCQkJCWlmIChpc3NwYWNlICgqYykp
IHsKKwkJCQkJaWYgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKmMpKSB7CiAJCQkJCQljKys7CiAJ
CQkJCQlzdGF0ZSsrOwogCQkJCQkJYnJlYWs7CkBAIC0yMTQsNTIgKzE5Miw1NSBAQAogCQkJCXN0
ciA9IHZhbDsKIAkJCQlxdW90ZWNoYXIgPSAnXDAnOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWlz
c3BhY2UgKCpjKSkKKwkJCQlpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKmMpKQogCQkJCQlz
dGF0ZSA9IEVSUk9SOwogCQkJfQogCQkJYysrOwogCQkJYnJlYWs7CisKIAkJY2FzZSBFUTI6CiAJ
CWNhc2UgRklOSToKLQkJCWlmIChpc3NwYWNlICgqYykpCisJCQlpZiAoaXNzcGFjZSgodW5zaWdu
ZWQgY2hhcikqYykpCiAJCQkJYysrOwogCQkJZWxzZQogCQkJCXN0YXRlKys7CiAJCQlicmVhazsK
KworCQlkZWZhdWx0OgorCQkJYWJvcnQoKTsKIAkJfQogCX0KIAlpZiAoc3RhdGUgIT0gRklOSSAm
JiAhKHN0YXRlID09IFZBTFVFICYmICFxdW90ZWNoYXIpKSB7Ci0JCURlYnVnKERQQVJTLCAoImxv
YWRfZW52LCBwYXJzZSBlcnJvciwgc3RhdGUgPSAlZFxuIiwgc3RhdGUpKQorCQlEZWJ1ZyhEUEFS
UywgKCJsb2FkX2Vudiwgbm90IGFuIGVudiB2YXIsIHN0YXRlID0gJWRcbiIsIHN0YXRlKSkKIAkJ
ZnNlZWsoZiwgZmlsZXBvcywgMCk7CiAJCVNldF9MaW5lTnVtKGZpbGVsaW5lKTsKIAkJcmV0dXJu
IChGQUxTRSk7CiAJfQogCWlmIChzdGF0ZSA9PSBWQUxVRSkgewogCQkvKiBFbmQgb2YgdW5xdW90
ZWQgdmFsdWU6IHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotCQljID0gdmFsICsgc3RybGVu
ICh2YWwpOwotCQl3aGlsZSAoYyA+IHZhbCAmJiBpc3NwYWNlICgqKGMgLSAxKSkpCisJCWMgPSB2
YWwgKyBzdHJsZW4odmFsKTsKKwkJd2hpbGUgKGMgPiB2YWwgJiYgaXNzcGFjZSgodW5zaWduZWQg
Y2hhciljWy0xXSkpCiAJCQkqKC0tYykgPSAnXDAnOwogCX0KIAogCS8qIDIgZmllbGRzIGZyb20g
cGFyc2VyOyBsb29rcyBsaWtlIGFuIGVudiBzZXR0aW5nICovCiAKLQlpZiAoc3RybGVuKG5hbWUp
ICsgMSArIHN0cmxlbih2YWwpID49IE1BWF9FTlZTVFItMSkKKwkvKgorCSAqIFRoaXMgY2FuJ3Qg
b3ZlcmZsb3cgYmVjYXVzZSBnZXRfc3RyaW5nKCkgbGltaXRlZCB0aGUgc2l6ZSBvZiB0aGUKKwkg
KiBuYW1lIGFuZCB2YWwgZmllbGRzLiAgU3RpbGwsIGl0IGRvZXNuJ3QgaHVydCB0byBiZSBjYXJl
ZnVsLi4uCisJICovCisJaWYgKCFnbHVlX3N0cmluZ3MoZW52c3RyLCBNQVhfRU5WU1RSLCBuYW1l
LCB2YWwsICc9JykpCiAJCXJldHVybiAoRkFMU0UpOwotCSh2b2lkKSBzcHJpbnRmKGVudnN0ciwg
IiVzPSVzIiwgbmFtZSwgdmFsKTsKIAlEZWJ1ZyhEUEFSUywgKCJsb2FkX2VudiwgPCVzPiA8JXM+
IC0+IDwlcz5cbiIsIG5hbWUsIHZhbCwgZW52c3RyKSkKIAlyZXR1cm4gKFRSVUUpOwogfQogCi0K
IGNoYXIgKgotZW52X2dldChuYW1lLCBlbnZwKQotCXJlZ2lzdGVyIGNoYXIJKm5hbWU7Ci0JcmVn
aXN0ZXIgY2hhcgkqKmVudnA7Ci17Ci0JcmVnaXN0ZXIgaW50CWxlbiA9IHN0cmxlbihuYW1lKTsK
LQlyZWdpc3RlciBjaGFyCSpwLCAqcTsKK2Vudl9nZXQoY2hhciAqbmFtZSwgY2hhciAqKmVudnAp
IHsKKwlpbnQgbGVuID0gc3RybGVuKG5hbWUpOworCWNoYXIgKnAsICpxOwogCi0Jd2hpbGUgKChw
ID0gKmVudnArKykpIHsKKwl3aGlsZSAoKHAgPSAqZW52cCsrKSAhPSBOVUxMKSB7CiAJCWlmICgh
KHEgPSBzdHJjaHIocCwgJz0nKSkpCiAJCQljb250aW51ZTsKIAkJaWYgKChxIC0gcCkgPT0gbGVu
ICYmICFzdHJuY21wKHAsIG5hbWUsIGxlbikpCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9j
cm9uL2xpYi9taXNjLmMgZnJlZWJzZF9jcm9uL2xpYi9taXNjLmMKLS0tIC91c3Ivc3JjL3Vzci5z
YmluL2Nyb24vbGliL21pc2MuYwkyMDE0LTAxLTE2IDIxOjQzOjUwLjAwMDAwMDAwMCArMDEwMAor
KysgZnJlZWJzZF9jcm9uL2xpYi9taXNjLmMJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzU0NDQzNzkg
KzAyMDAKQEAgLTEsNjMgKzEsOTAgQEAKIC8qIENvcHlyaWdodCAxOTg4LDE5OTAsMTk5MywxOTk0
IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLworCisvKgorICogQ29w
eXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAoIklT
QyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25z
b3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDogZG9uJ3QgcmVt
b3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9uIChkb24ndCB0
YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24ndAotICogZ2V0
IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIgb3IgcmVtb3Zl
IHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3VyY2UgaXMgcHJv
dmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBleHByZXNzIG9y
IGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVzZSBhdCB5b3Vy
IG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0bwotICogYW55
b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0cyBlbnRpcmVs
eSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnks
IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9y
IHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQor
ICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4g
YWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMsIGVuaGFuY2Vt
ZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0byBrZWVwIGEg
dmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dzOgotICogUGF1
bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFkZWN3cmwhdml4
aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElTQyBESVND
TEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5D
TFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BF
Q0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBE
QU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9S
IFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5D
RSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBPRiBPUiBJTiBDT05O
RUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICov
CiAKLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQotc3RhdGljIGNvbnN0IGNo
YXIgcmNzaWRbXSA9Ci0gICIkRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9s
aWIvbWlzYy5jIDI0MTEyNSAyMDEyLTEwLTAyIDA5OjIzOjE2WiBwbHVrbmV0ICQiOwotI2VuZGlm
CisvLyNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQorLy9zdGF0aWMgY2hhciBy
Y3NpZFtdID0gIiRJZDogbWlzYy5jLHYgMS4xNiAyMDA0LzAxLzIzIDE4OjU2OjQzIHZpeGllIEV4
cCAkIjsKKy8vI2VuZGlmCiAKIC8qIHZpeCAyNmphbjg3IFtSQ1MgaGFzIHRoZSByZXN0IG9mIHRo
ZSBsb2ddCiAgKiB2aXggMzBkZWM4NiBbd3JpdHRlbl0KICAqLwogCi0KICNpbmNsdWRlICJjcm9u
LmgiCi0jaWYgU1lTX1RJTUVfSAotIyBpbmNsdWRlIDxzeXMvdGltZS5oPgotI2Vsc2UKLSMgaW5j
bHVkZSA8dGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxz
eXMvc3RhdC5oPgotI2luY2x1ZGUgPGVyci5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVk
ZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZiBkZWZpbmVkKFNZU0xPRykKLSMg
aW5jbHVkZSA8c3lzbG9nLmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KIAorI2lmIGRl
ZmluZWQoU1lTTE9HKSAmJiBkZWZpbmVkKExPR19GSUxFKQorIyB1bmRlZiBMT0dfRklMRQorI2Vu
ZGlmCiAKICNpZiBkZWZpbmVkKExPR19EQUVNT04pICYmICFkZWZpbmVkKExPR19DUk9OKQotI2Rl
ZmluZSBMT0dfQ1JPTiBMT0dfREFFTU9OCisjIGRlZmluZSBMT0dfQ1JPTiBMT0dfREFFTU9OCiAj
ZW5kaWYKIAorI2lmbmRlZiBGQUNJTElUWQorI2RlZmluZSBGQUNJTElUWSBMT0dfQ1JPTgorI2Vu
ZGlmCiAKLXN0YXRpYyBpbnQJCUxvZ0ZEID0gRVJSOworc3RhdGljIGludCBMb2dGRCA9IEVSUjsK
IAorI2lmIGRlZmluZWQoU1lTTE9HKQorc3RhdGljIGludCBzeXNsb2dfb3BlbiA9IEZBTFNFOwor
I2VuZGlmCiAKKy8qCisgKiBnbHVlX3N0cmluZ3MgaXMgdGhlIG92ZXJmbG93LXNhZmUgZXF1aXZh
bGVudCBvZgorICoJCXNwcmludGYoYnVmZmVyLCAiJXMlYyVzIiwgYSwgc2VwYXJhdG9yLCBiKTsK
KyAqCisgKiByZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlLiAgJ2J1ZmZlcicgTVVT
VCBOT1QgYmUgdXNlZCBpZgorICogZ2x1ZV9zdHJpbmdzIGZhaWxzLgorICovCiBpbnQKLXN0cmNt
cF91bnRpbChsZWZ0LCByaWdodCwgdW50aWwpCi0JY2hhcgkqbGVmdDsKLQljaGFyCSpyaWdodDsK
LQlpbnQJdW50aWw7CitnbHVlX3N0cmluZ3MoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3Np
emUsIGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIsCisJICAgICBjaGFyIHNlcGFyYXRvcikK
IHsKLQlyZWdpc3RlciBpbnQJZGlmZjsKKwljaGFyICpidWY7CisJY2hhciAqYnVmX2VuZDsKKwor
CWlmIChidWZmZXJfc2l6ZSA8PSAwKQorCQlyZXR1cm4gKDApOworCWJ1Zl9lbmQgPSBidWZmZXIg
KyBidWZmZXJfc2l6ZTsKKwlidWYgPSBidWZmZXI7CisKKwlmb3IgKCAvKiBub3RoaW5nICovOyBi
dWYgPCBidWZfZW5kICYmICphICE9ICdcMCc7IGJ1ZisrLCBhKysgKQorCQkqYnVmID0gKmE7CisJ
aWYgKGJ1ZiA9PSBidWZfZW5kKQorCQlyZXR1cm4gKDApOworCWlmIChzZXBhcmF0b3IgIT0gJy8n
IHx8IGJ1ZiA9PSBidWZmZXIgfHwgYnVmWy0xXSAhPSAnLycpCisJCSpidWYrKyA9IHNlcGFyYXRv
cjsKKwlpZiAoYnVmID09IGJ1Zl9lbmQpCisJCXJldHVybiAoMCk7CisJZm9yICggLyogbm90aGlu
ZyAqLzsgYnVmIDwgYnVmX2VuZCAmJiAqYiAhPSAnXDAnOyBidWYrKywgYisrICkKKwkJKmJ1ZiA9
ICpiOworCWlmIChidWYgPT0gYnVmX2VuZCkKKwkJcmV0dXJuICgwKTsKKwkqYnVmID0gJ1wwJzsK
KwlyZXR1cm4gKDEpOworfQogCitpbnQKK3N0cmNtcF91bnRpbChjb25zdCBjaGFyICpsZWZ0LCBj
b25zdCBjaGFyICpyaWdodCwgY2hhciB1bnRpbCkgewogCXdoaWxlICgqbGVmdCAmJiAqbGVmdCAh
PSB1bnRpbCAmJiAqbGVmdCA9PSAqcmlnaHQpIHsKIAkJbGVmdCsrOwogCQlyaWdodCsrOwpAQCAt
NjUsMjEgKzkyLDE1IEBACiAKIAlpZiAoKCpsZWZ0PT0nXDAnIHx8ICpsZWZ0ID09IHVudGlsKSAm
JgogCSAgICAoKnJpZ2h0PT0nXDAnIHx8ICpyaWdodCA9PSB1bnRpbCkpIHsKLQkJZGlmZiA9IDA7
Ci0JfSBlbHNlIHsKLQkJZGlmZiA9ICpsZWZ0IC0gKnJpZ2h0OworCQlyZXR1cm4gKDApOwogCX0K
LQotCXJldHVybiBkaWZmOworCXJldHVybiAoKmxlZnQgLSAqcmlnaHQpOwogfQogCi0KIC8qIHN0
cmR0YihzKSAtIGRlbGV0ZSB0cmFpbGluZyBibGFua3MgaW4gc3RyaW5nICdzJyBhbmQgcmV0dXJu
IG5ldyBsZW5ndGgKICAqLwogaW50Ci1zdHJkdGIocykKLQljaGFyCSpzOwoteworc3RyZHRiKGNo
YXIgKnMpIHsKIAljaGFyCSp4ID0gczsKIAogCS8qIHNjYW4gZm9yd2FyZCB0byB0aGUgbnVsbApA
QCAtOTEsNyArMTEyLDcgQEAKIAkgKiBvciB0aGUgbGFzdCBub24tYmxhbmsgaW4gdGhlIHN0cmlu
Zywgd2hpY2hldmVyIGNvbWVzIGZpcnN0LgogCSAqLwogCWRvCXt4LS07fQotCXdoaWxlICh4ID49
IHMgJiYgaXNzcGFjZSgqeCkpOworCXdoaWxlICh4ID49IHMgJiYgaXNzcGFjZSgodW5zaWduZWQg
Y2hhcikqeCkpOwogCiAJLyogb25lIGNoYXJhY3RlciBiZXlvbmQgd2hlcmUgd2Ugc3RvcHBlZCBh
Ym92ZSBpcyB3aGVyZSB0aGUgbnVsbAogCSAqIGdvZXMuCkBAIC0xMDEsMTQgKzEyMiwxMSBAQAog
CS8qIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvc2l0aW9uIG9mIHRoZSBudWxsIGNoYXJh
Y3RlciBhbmQKIAkgKiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUg
c3RyaW5nIGlzIHRoZSBsZW5ndGguCiAJICovCi0JcmV0dXJuIHggLSBzOworCXJldHVybiAoeCAt
IHMpOwogfQogCi0KIGludAotc2V0X2RlYnVnX2ZsYWdzKGZsYWdzKQotCWNoYXIJKmZsYWdzOwot
eworc2V0X2RlYnVnX2ZsYWdzKGNvbnN0IGNoYXIgKmZsYWdzKSB7CiAJLyogZGVidWcgZmxhZ3Mg
YXJlIG9mIHRoZSBmb3JtICAgIGZsYWdbLGZsYWcgLi4uXQogCSAqCiAJICogaWYgYW4gZXJyb3Ig
b2NjdXJzLCBwcmludCBhIG1lc3NhZ2UgdG8gc3Rkb3V0IGFuZCByZXR1cm4gRkFMU0UuCkBAIC0x
MTgsMzEgKzEzNiwzMCBAQAogI2lmICFERUJVR0dJTkcKIAogCXByaW50ZigidGhpcyBwcm9ncmFt
IHdhcyBjb21waWxlZCB3aXRob3V0IGRlYnVnZ2luZyBlbmFibGVkXG4iKTsKLQlyZXR1cm4gRkFM
U0U7CisJcmV0dXJuIChGQUxTRSk7CiAKICNlbHNlIC8qIERFQlVHR0lORyAqLwogCi0JY2hhcgkq
cGMgPSBmbGFnczsKKwljb25zdCBjaGFyICpwYyA9IGZsYWdzOwogCiAJRGVidWdGbGFncyA9IDA7
CiAKIAl3aGlsZSAoKnBjKSB7Ci0JCWNoYXIJKip0ZXN0OwotCQlpbnQJbWFzazsKKwkJY29uc3Qg
Y2hhcgkqKnRlc3Q7CisJCWludAkJbWFzazsKIAogCQkvKiB0cnkgdG8gZmluZCBkZWJ1ZyBmbGFn
IG5hbWUgaW4gb3VyIGxpc3QuCiAJCSAqLwotCQlmb3IgKAl0ZXN0ID0gRGVidWdGbGFnTmFtZXMs
IG1hc2sgPSAxOwotCQkJKnRlc3QgJiYgc3RyY21wX3VudGlsKCp0ZXN0LCBwYywgJywnKTsKLQkJ
CXRlc3QrKywgbWFzayA8PD0gMQotCQkgICAgKQotCQkJOworCQlmb3IgKHRlc3QgPSBEZWJ1Z0Zs
YWdOYW1lcywgbWFzayA9IDE7CisJCSAgICAgKnRlc3QgIT0gTlVMTCAmJiBzdHJjbXBfdW50aWwo
KnRlc3QsIHBjLCAnLCcpOworCQkgICAgIHRlc3QrKywgbWFzayA8PD0gMSkKKwkJCU5VTEw7CiAK
IAkJaWYgKCEqdGVzdCkgewogCQkJZnByaW50ZihzdGRlcnIsCiAJCQkJInVucmVjb2duaXplZCBk
ZWJ1ZyBmbGFnIDwlcz4gPCVzPlxuIiwKIAkJCQlmbGFncywgcGMpOwotCQkJcmV0dXJuIEZBTFNF
OworCQkJcmV0dXJuIChGQUxTRSk7CiAJCX0KIAogCQlEZWJ1Z0ZsYWdzIHw9IG1hc2s7CkBAIC0x
NTYsNyArMTczLDcgQEAKIAl9CiAKIAlpZiAoRGVidWdGbGFncykgewotCQlpbnQJZmxhZzsKKwkJ
aW50IGZsYWc7CiAKIAkJZnByaW50ZihzdGRlcnIsICJkZWJ1ZyBmbGFncyBlbmFibGVkOiIpOwog
CkBAIC0xNjYsOTAgKzE4MywxMDUgQEAKIAkJZnByaW50ZihzdGRlcnIsICJcbiIpOwogCX0KIAot
CXJldHVybiBUUlVFOworCXJldHVybiAoVFJVRSk7CiAKICNlbmRpZiAvKiBERUJVR0dJTkcgKi8K
IH0KIAotCiB2b2lkCi1zZXRfY3Jvbl91aWQoKQoteworc2V0X2Nyb25fdWlkKHZvaWQpIHsKICNp
ZiBkZWZpbmVkKEJTRCkgfHwgZGVmaW5lZChQT1NJWCkKLQlpZiAoc2V0ZXVpZChST09UX1VJRCkg
PCBPSykKLQkJZXJyKEVSUk9SX0VYSVQsICJzZXRldWlkIik7CisJaWYgKHNldGV1aWQoUk9PVF9V
SUQpIDwgT0spIHsKKwkJcGVycm9yKCJzZXRldWlkIik7CisJCWV4aXQoRVJST1JfRVhJVCk7CisJ
fQogI2Vsc2UKLQlpZiAoc2V0dWlkKFJPT1RfVUlEKSA8IE9LKQotCQllcnIoRVJST1JfRVhJVCwg
InNldHVpZCIpOworCWlmIChzZXR1aWQoUk9PVF9VSUQpIDwgT0spIHsKKwkJcGVycm9yKCJzZXR1
aWQiKTsKKwkJZXhpdChFUlJPUl9FWElUKTsKKwl9CiAjZW5kaWYKIH0KIAotCiB2b2lkCi1zZXRf
Y3Jvbl9jd2QoKQotewotCXN0cnVjdCBzdGF0CXNiOworc2V0X2Nyb25fY3dkKHZvaWQpIHsKKwlz
dHJ1Y3Qgc3RhdCBzYjsKKwlzdHJ1Y3QgZ3JvdXAgKmdycCA9IE5VTEw7CiAKKyNpZmRlZiBDUk9O
X0dST1VQCisJZ3JwID0gZ2V0Z3JuYW0oQ1JPTl9HUk9VUCk7CisjZW5kaWYKIAkvKiBmaXJzdCBj
aGVjayBmb3IgQ1JPTkRJUiAoIi92YXIvY3JvbiIgb3Igc29tZSBzdWNoKQogCSAqLwogCWlmIChz
dGF0KENST05ESVIsICZzYikgPCBPSyAmJiBlcnJubyA9PSBFTk9FTlQpIHsKLQkJd2FybigiJXMi
LCBDUk9ORElSKTsKLQkJaWYgKE9LID09IG1rZGlyKENST05ESVIsIDA3MDApKSB7Ci0JCQl3YXJu
eCgiJXM6IGNyZWF0ZWQiLCBDUk9ORElSKTsKKwkJcGVycm9yKENST05ESVIpOworCQlpZiAoT0sg
PT0gbWtkaXIoQ1JPTkRJUiwgMDcxMCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNyZWF0
ZWRcbiIsIENST05ESVIpOwogCQkJc3RhdChDUk9ORElSLCAmc2IpOwogCQl9IGVsc2UgewotCQkJ
ZXJyKEVSUk9SX0VYSVQsICIlczogbWtkaXIiLCBDUk9ORElSKTsKKwkJCWZwcmludGYoc3RkZXJy
LCAiJXM6ICIsIENST05ESVIpOworCQkJcGVycm9yKCJta2RpciIpOworCQkJZXhpdChFUlJPUl9F
WElUKTsKIAkJfQogCX0KLQlpZiAoIShzYi5zdF9tb2RlICYgU19JRkRJUikpCi0JCWVycihFUlJP
Ul9FWElULCAiJyVzJyBpcyBub3QgYSBkaXJlY3RvcnksIGJhaWxpbmcgb3V0IiwgQ1JPTkRJUik7
Ci0JaWYgKGNoZGlyKENST05ESVIpIDwgT0spCi0JCWVycihFUlJPUl9FWElULCAiY2Fubm90IGNo
ZGlyKCVzKSwgYmFpbGluZyBvdXQiLCBDUk9ORElSKTsKKwlpZiAoIVNfSVNESVIoc2Iuc3RfbW9k
ZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICInJXMnIGlzIG5vdCBhIGRpcmVjdG9yeSwgYmFpbGlu
ZyBvdXQuXG4iLAorCQkJQ1JPTkRJUik7CisJCWV4aXQoRVJST1JfRVhJVCk7CisJfQorCWlmIChj
aGRpcihDUk9ORElSKSA8IE9LKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY2Fubm90IGNoZGlyKCVz
KSwgYmFpbGluZyBvdXQuXG4iLCBDUk9ORElSKTsKKwkJcGVycm9yKENST05ESVIpOworCQlleGl0
KEVSUk9SX0VYSVQpOworCX0KIAogCS8qIENST05ESVIgb2theSAobm93PT1DV0QpLCBub3cgbG9v
ayBhdCBTUE9PTF9ESVIgKCJ0YWJzIiBvciBzb21lIHN1Y2gpCiAJICovCiAJaWYgKHN0YXQoU1BP
T0xfRElSLCAmc2IpIDwgT0sgJiYgZXJybm8gPT0gRU5PRU5UKSB7Ci0JCXdhcm4oIiVzIiwgU1BP
T0xfRElSKTsKKwkJcGVycm9yKFNQT09MX0RJUik7CiAJCWlmIChPSyA9PSBta2RpcihTUE9PTF9E
SVIsIDA3MDApKSB7Ci0JCQl3YXJueCgiJXM6IGNyZWF0ZWQiLCBTUE9PTF9ESVIpOworCQkJZnBy
aW50ZihzdGRlcnIsICIlczogY3JlYXRlZFxuIiwgU1BPT0xfRElSKTsKIAkJCXN0YXQoU1BPT0xf
RElSLCAmc2IpOwogCQl9IGVsc2UgewotCQkJZXJyKEVSUk9SX0VYSVQsICIlczogbWtkaXIiLCBT
UE9PTF9ESVIpOworCQkJZnByaW50ZihzdGRlcnIsICIlczogIiwgU1BPT0xfRElSKTsKKwkJCXBl
cnJvcigibWtkaXIiKTsKKwkJCWV4aXQoRVJST1JfRVhJVCk7CiAJCX0KIAl9Ci0JaWYgKCEoc2Iu
c3RfbW9kZSAmIFNfSUZESVIpKQotCQllcnIoRVJST1JfRVhJVCwgIiclcycgaXMgbm90IGEgZGly
ZWN0b3J5LCBiYWlsaW5nIG91dCIsIFNQT09MX0RJUik7CisJaWYgKCFTX0lTRElSKHNiLnN0X21v
ZGUpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJyVzJyBpcyBub3QgYSBkaXJlY3RvcnksIGJhaWxp
bmcgb3V0LlxuIiwKKwkJCVNQT09MX0RJUik7CisJCWV4aXQoRVJST1JfRVhJVCk7CisJfQorCWlm
IChncnAgIT0gTlVMTCkgeworCQlpZiAoc2Iuc3RfZ2lkICE9IGdycC0+Z3JfZ2lkKQorCQkJY2hv
d24oU1BPT0xfRElSLCAtMSwgZ3JwLT5ncl9naWQpOworCQlpZiAoc2Iuc3RfbW9kZSAhPSAwMTcz
MCkKKwkJCWNobW9kKFNQT09MX0RJUiwgMDE3MzApOworCX0KIH0KIAotCiAvKiBnZXRfY2hhcihm
aWxlKSA6IGxpa2UgZ2V0YygpIGJ1dCBpbmNyZW1lbnQgTGluZU51bWJlciBvbiBuZXdsaW5lcwog
ICovCiBpbnQKLWdldF9jaGFyKGZpbGUpCi0JRklMRQkqZmlsZTsKLXsKLQlpbnQJY2g7CitnZXRf
Y2hhcihGSUxFICpmaWxlKSB7CisJaW50IGNoOwogCiAJY2ggPSBnZXRjKGZpbGUpOwogCWlmIChj
aCA9PSAnXG4nKQogCQlTZXRfTGluZU51bShMaW5lTnVtYmVyICsgMSkKLQlyZXR1cm4gY2g7CisJ
cmV0dXJuIChjaCk7CiB9CiAKLQogLyogdW5nZXRfY2hhcihjaCwgZmlsZSkgOiBsaWtlIHVuZ2V0
YyBidXQgZG8gTGluZU51bWJlciBwcm9jZXNzaW5nCiAgKi8KIHZvaWQKLXVuZ2V0X2NoYXIoY2gs
IGZpbGUpCi0JaW50CWNoOwotCUZJTEUJKmZpbGU7Ci17Cit1bmdldF9jaGFyKGludCBjaCwgRklM
RSAqZmlsZSkgewogCXVuZ2V0YyhjaCwgZmlsZSk7CiAJaWYgKGNoID09ICdcbicpCiAJCVNldF9M
aW5lTnVtKExpbmVOdW1iZXIgLSAxKQogfQogCi0KIC8qIGdldF9zdHJpbmcoc3RyLCBtYXgsIGZp
bGUsIHRlcm1zdHIpIDogbGlrZSBmZ2V0cygpIGJ1dAogICoJCSgxKSBoYXMgdGVybWluYXRvciBz
dHJpbmcgd2hpY2ggc2hvdWxkIGluY2x1ZGUgXG4KICAqCQkoMikgd2lsbCBhbHdheXMgbGVhdmUg
cm9vbSBmb3IgdGhlIG51bGwKQEAgLTI1NywxMyArMjg5LDggQEAKICAqCQkoNCkgcmV0dXJucyBF
T0Ygb3IgdGVybWluYXRpbmcgY2hhcmFjdGVyLCB3aGljaGV2ZXIKICAqLwogaW50Ci1nZXRfc3Ry
aW5nKHN0cmluZywgc2l6ZSwgZmlsZSwgdGVybXMpCi0JY2hhcgkqc3RyaW5nOwotCWludAlzaXpl
OwotCUZJTEUJKmZpbGU7Ci0JY2hhcgkqdGVybXM7Ci17Ci0JaW50CWNoOworZ2V0X3N0cmluZyhj
aGFyICpzdHJpbmcsIGludCBzaXplLCBGSUxFICpmaWxlLCBjaGFyICp0ZXJtcykgeworCWludCBj
aDsKIAogCXdoaWxlIChFT0YgIT0gKGNoID0gZ2V0X2NoYXIoZmlsZSkpICYmICFzdHJjaHIodGVy
bXMsIGNoKSkgewogCQlpZiAoc2l6ZSA+IDEpIHsKQEAgLTI3NSwxNyArMzAyLDE0IEBACiAJaWYg
KHNpemUgPiAwKQogCQkqc3RyaW5nID0gJ1wwJzsKIAotCXJldHVybiBjaDsKKwlyZXR1cm4gKGNo
KTsKIH0KIAotCiAvKiBza2lwX2NvbW1lbnRzKGZpbGUpIDogcmVhZCBwYXN0IGNvbW1lbnQgKGlm
IGFueSkKICAqLwogdm9pZAotc2tpcF9jb21tZW50cyhmaWxlKQotCUZJTEUJKmZpbGU7Ci17Ci0J
aW50CWNoOworc2tpcF9jb21tZW50cyhGSUxFICpmaWxlKSB7CisJaW50IGNoOwogCiAJd2hpbGUg
KEVPRiAhPSAoY2ggPSBnZXRfY2hhcihmaWxlKSkpIHsKIAkJLyogY2ggaXMgbm93IHRoZSBmaXJz
dCBjaGFyYWN0ZXIgb2YgYSBsaW5lLgpAQCAtMzE4LDkyICszNDIsODcgQEAKIAkJdW5nZXRfY2hh
cihjaCwgZmlsZSk7CiB9CiAKLQotLyogaW50IGluX2ZpbGUoY2hhciAqc3RyaW5nLCBGSUxFICpm
aWxlKQorLyogaW50IGluX2ZpbGUoY29uc3QgY2hhciAqc3RyaW5nLCBGSUxFICpmaWxlLCBpbnQg
ZXJyb3IpCiAgKglyZXR1cm4gVFJVRSBpZiBvbmUgb2YgdGhlIGxpbmVzIGluIGZpbGUgbWF0Y2hl
cyBzdHJpbmcgZXhhY3RseSwKLSAqCUZBTFNFIG90aGVyd2lzZS4KKyAqCUZBTFNFIGlmIG5vIGxp
bmVzIG1hdGNoLCBhbmQgZXJyb3Igb24gZXJyb3IuCiAgKi8KIHN0YXRpYyBpbnQKLWluX2ZpbGUo
Y2hhciAqc3RyaW5nLCBGSUxFICpmaWxlKQoraW5fZmlsZShjb25zdCBjaGFyICpzdHJpbmcsIEZJ
TEUgKmZpbGUsIGludCBlcnJvcikKIHsKIAljaGFyIGxpbmVbTUFYX1RFTVBTVFJdOworCWNoYXIg
KmVuZHA7CiAKLQlyZXdpbmQoZmlsZSk7CisJaWYgKGZzZWVrKGZpbGUsIDBMLCBTRUVLX1NFVCkp
CisJCXJldHVybiAoZXJyb3IpOwogCXdoaWxlIChmZ2V0cyhsaW5lLCBNQVhfVEVNUFNUUiwgZmls
ZSkpIHsKLQkJaWYgKGxpbmVbMF0gIT0gJ1wwJykKLQkJCWlmIChsaW5lW3N0cmxlbihsaW5lKS0x
XSA9PSAnXG4nKQotCQkJCWxpbmVbc3RybGVuKGxpbmUpLTFdID0gJ1wwJzsKLQkJaWYgKDAgPT0g
c3RyY21wKGxpbmUsIHN0cmluZykpCi0JCQlyZXR1cm4gVFJVRTsKKwkJaWYgKGxpbmVbMF0gIT0g
J1wwJykgeworCQkJZW5kcCA9ICZsaW5lW3N0cmxlbihsaW5lKSAtIDFdOworCQkJaWYgKCplbmRw
ICE9ICdcbicpCisJCQkJcmV0dXJuIChlcnJvcik7CisJCQkqZW5kcCA9ICdcMCc7CisJCQlpZiAo
MCA9PSBzdHJjbXAobGluZSwgc3RyaW5nKSkKKwkJCQlyZXR1cm4gKFRSVUUpOworCQl9CiAJfQot
CXJldHVybiBGQUxTRTsKKwlpZiAoZmVycm9yKGZpbGUpKQorCQlyZXR1cm4gKGVycm9yKTsKKwly
ZXR1cm4gKEZBTFNFKTsKIH0KIAotCiAvKiBpbnQgYWxsb3dlZChjaGFyICp1c2VybmFtZSkKLSAq
CXJldHVybnMgVFJVRSBpZiAoQUxMT1dfRklMRSBleGlzdHMgYW5kIHVzZXIgaXMgbGlzdGVkKQot
ICoJb3IgKERFTllfRklMRSBleGlzdHMgYW5kIHVzZXIgaXMgTk9UIGxpc3RlZCkKLSAqCW9yIChu
ZWl0aGVyIGZpbGUgZXhpc3RzIGJ1dCB1c2VyPT0icm9vdCIgc28gaXQncyBva2F5KQorICogICAg
ICByZXR1cm5zIFRSVUUgaWYgKEFMTE9XX0ZJTEUgZXhpc3RzIGFuZCB1c2VyIGlzIGxpc3RlZCkK
KyAqICAgICAgb3IgKERFTllfRklMRSBleGlzdHMgYW5kIHVzZXIgaXMgTk9UIGxpc3RlZCkKKyAq
ICAgICAgb3IgKG5laXRoZXIgZmlsZSBleGlzdHMgYnV0IHVzZXI9PSJyb290IiBzbyBpdCdzIG9r
YXkpCiAgKi8KKwogaW50Ci1hbGxvd2VkKHVzZXJuYW1lKQotCWNoYXIgKnVzZXJuYW1lOworYWxs
b3dlZChjaGFyICp1c2VybmFtZSkKIHsKLQlGSUxFCSphbGxvdywgKmRlbnk7Ci0JaW50CWlzYWxs
b3dlZDsKKyAgICAgICAgRklMRSAgICAqYWxsb3csICpkZW55OworICAgICAgICBpbnQgICAgIGlz
YWxsb3dlZDsKIAotCWlzYWxsb3dlZCA9IEZBTFNFOworICAgICAgICBpc2FsbG93ZWQgPSBGQUxT
RTsKIAotCWRlbnkgPSBOVUxMOworICAgICAgICBkZW55ID0gTlVMTDsKICNpZiBkZWZpbmVkKEFM
TE9XX0ZJTEUpICYmIGRlZmluZWQoREVOWV9GSUxFKQotCWlmICgoYWxsb3cgPSBmb3BlbihBTExP
V19GSUxFLCAiciIpKSA9PSBOVUxMICYmIGVycm5vICE9IEVOT0VOVCkKLQkJZ290byBvdXQ7Ci0J
aWYgKChkZW55ID0gZm9wZW4oREVOWV9GSUxFLCAiciIpKSA9PSBOVUxMICYmIGVycm5vICE9IEVO
T0VOVCkKLQkJZ290byBvdXQ7Ci0JRGVidWcoRE1JU0MsICgiYWxsb3cvZGVueSBlbmFibGVkLCAl
ZC8lZFxuIiwgISFhbGxvdywgISFkZW55KSkKKyAgICAgICAgaWYgKChhbGxvdyA9IGZvcGVuKEFM
TE9XX0ZJTEUsICJyIikpID09IE5VTEwgJiYgZXJybm8gIT0gRU5PRU5UKQorICAgICAgICAgICAg
ICAgIGdvdG8gb3V0OworICAgICAgICBpZiAoKGRlbnkgPSBmb3BlbihERU5ZX0ZJTEUsICJyIikp
ID09IE5VTEwgJiYgZXJybm8gIT0gRU5PRU5UKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0Owor
ICAgICAgICBEZWJ1ZyhETUlTQywgKCJhbGxvdy9kZW55IGVuYWJsZWQsICVkLyVkXG4iLCAhIWFs
bG93LCAhIWRlbnkpKQogI2Vsc2UKLQlhbGxvdyA9IE5VTEw7CisgICAgICAgIGFsbG93ID0gTlVM
TDsKICNlbmRpZgogCi0JaWYgKGFsbG93KQotCQlpc2FsbG93ZWQgPSBpbl9maWxlKHVzZXJuYW1l
LCBhbGxvdyk7Ci0JZWxzZSBpZiAoZGVueSkKLQkJaXNhbGxvd2VkID0gIWluX2ZpbGUodXNlcm5h
bWUsIGRlbnkpOwotCWVsc2UgeworICAgICAgICBpZiAoYWxsb3cpCisgICAgICAgICAgICAgICAg
aXNhbGxvd2VkID0gaW5fZmlsZSh1c2VybmFtZSwgYWxsb3csIEZBTFNFKTsKKyAgICAgICAgZWxz
ZSBpZiAoZGVueSkKKyAgICAgICAgICAgICAgICBpc2FsbG93ZWQgPSAhaW5fZmlsZSh1c2VybmFt
ZSwgZGVueSwgRkFMU0UpOworICAgICAgICBlbHNlIHsKICNpZiBkZWZpbmVkKEFMTE9XX09OTFlf
Uk9PVCkKLQkJaXNhbGxvd2VkID0gKHN0cmNtcCh1c2VybmFtZSwgUk9PVF9VU0VSKSA9PSAwKTsK
KyAgICAgICAgICAgICAgICBpc2FsbG93ZWQgPSAoc3RyY21wKHVzZXJuYW1lLCBST09UX1VTRVIp
ID09IDApOwogI2Vsc2UKLQkJaXNhbGxvd2VkID0gVFJVRTsgCisgICAgICAgICAgICAgICAgaXNh
bGxvd2VkID0gVFJVRTsgCiAjZW5kaWYKLQl9Ci1vdXQ6CWlmIChhbGxvdykKLQkJZmNsb3NlKGFs
bG93KTsKLQlpZiAoZGVueSkKLQkJZmNsb3NlKGRlbnkpOwotCXJldHVybiAoaXNhbGxvd2VkKTsK
KyAgICAgICAgfQorb3V0OiAgICBpZiAoYWxsb3cpCisgICAgICAgICAgICAgICAgZmNsb3NlKGFs
bG93KTsKKyAgICAgICAgaWYgKGRlbnkpCisgICAgICAgICAgICAgICAgZmNsb3NlKGRlbnkpOwor
ICAgICAgICByZXR1cm4gKGlzYWxsb3dlZCk7CiB9CiAKLQogdm9pZAotbG9nX2l0KHVzZXJuYW1l
LCB4cGlkLCBldmVudCwgZGV0YWlsKQotCWNoYXIJKnVzZXJuYW1lOwotCWludAl4cGlkOwotCWNo
YXIJKmV2ZW50OwotCWNoYXIJKmRldGFpbDsKLXsKK2xvZ19pdChjb25zdCBjaGFyICp1c2VybmFt
ZSwgUElEX1QgeHBpZCwgY29uc3QgY2hhciAqZXZlbnQsIGNvbnN0IGNoYXIgKmRldGFpbCkgewog
I2lmIGRlZmluZWQoTE9HX0ZJTEUpIHx8IERFQlVHR0lORwotCVBJRF9UCQkJcGlkID0geHBpZDsK
KwlQSURfVCBwaWQgPSB4cGlkOwogI2VuZGlmCiAjaWYgZGVmaW5lZChMT0dfRklMRSkKLQljaGFy
CQkJKm1zZzsKLQlUSU1FX1QJCQlub3cgPSB0aW1lKChUSU1FX1QpIDApOwotCXJlZ2lzdGVyIHN0
cnVjdCB0bQkqdCA9IGxvY2FsdGltZSgmbm93KTsKKwljaGFyICptc2c7CisJVElNRV9UIG5vdyA9
IHRpbWUoKFRJTUVfVCkgMCk7CisJc3RydWN0IHRtICp0ID0gbG9jYWx0aW1lKCZub3cpOwogI2Vu
ZGlmIC8qTE9HX0ZJTEUqLwogCi0jaWYgZGVmaW5lZChTWVNMT0cpCi0Jc3RhdGljIGludAkJc3lz
bG9nX29wZW4gPSAwOwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKExPR19GSUxFKQogCS8qIHdlIGFz
c3VtZSB0aGF0IE1BWF9URU1QU1RSIHdpbGwgaG9sZCB0aGUgZGF0ZSwgdGltZSwgJnB1bmN0dWF0
aW9uLgogCSAqLwpAQCAtNDExLDkwICs0MzAsODkgQEAKIAkJICAgICArIHN0cmxlbihldmVudCkK
IAkJICAgICArIHN0cmxlbihkZXRhaWwpCiAJCSAgICAgKyBNQVhfVEVNUFNUUik7Ci0KIAlpZiAo
bXNnID09IE5VTEwpCi0JCXdhcm54KCJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBsb2cg
bWVzc2FnZSIpOwotCWVsc2UgeworCQlyZXR1cm47CisKKwlpZiAoTG9nRkQgPCBPSykgeworCQlM
b2dGRCA9IG9wZW4oTE9HX0ZJTEUsIE9fV1JPTkxZfE9fQVBQRU5EfE9fQ1JFQVQsIDA2MDApOwog
CQlpZiAoTG9nRkQgPCBPSykgewotCQkJTG9nRkQgPSBvcGVuKExPR19GSUxFLCBPX1dST05MWXxP
X0FQUEVORHxPX0NSRUFULCAwNjAwKTsKLQkJCWlmIChMb2dGRCA8IE9LKSB7Ci0JCQkJd2Fybigi
Y2FuJ3Qgb3BlbiBsb2cgZmlsZSAlcyIsIExPR19GSUxFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJKHZv
aWQpIGZjbnRsKExvZ0ZELCBGX1NFVEZELCAxKTsKLQkJCX0KKwkJCWZwcmludGYoc3RkZXJyLCAi
JXM6IGNhbid0IG9wZW4gbG9nIGZpbGVcbiIsCisJCQkJUHJvZ3JhbU5hbWUpOworCQkJcGVycm9y
KExPR19GSUxFKTsKKwkJfSBlbHNlIHsKKwkJCSh2b2lkKSBmY250bChMb2dGRCwgRl9TRVRGRCwg
MSk7CiAJCX0KKwl9CiAKLQkJLyogd2UgaGF2ZSB0byBzcHJpbnRmKCkgaXQgYmVjYXVzZSBmcHJp
bnRmKCkgZG9lc24ndCBhbHdheXMKLQkJICogd3JpdGUgZXZlcnl0aGluZyBvdXQgaW4gb25lIGNo
dW5rIGFuZCB0aGlzIGhhcyB0byBiZQotCQkgKiBhdG9taWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBs
b2cgZmlsZS4KLQkJICovCi0JCXNwcmludGYobXNnLCAiJXMgKCUwMmQvJTAyZC0lMDJkOiUwMmQ6
JTAyZC0lZCkgJXMgKCVzKVxuIiwKLQkJCXVzZXJuYW1lLAotCQkJdC0+dG1fbW9uKzEsIHQtPnRt
X21kYXksIHQtPnRtX2hvdXIsIHQtPnRtX21pbiwKLQkJCXQtPnRtX3NlYywgcGlkLCBldmVudCwg
ZGV0YWlsKTsKLQotCQkvKiB3ZSBoYXZlIHRvIHJ1biBzdHJsZW4oKSBiZWNhdXNlIHNwcmludGYo
KSByZXR1cm5zIChjaGFyKikKLQkJICogb24gb2xkIEJTRC4KLQkJICovCi0JCWlmIChMb2dGRCA8
IE9LIHx8IHdyaXRlKExvZ0ZELCBtc2csIHN0cmxlbihtc2cpKSA8IE9LKSB7Ci0JCQlpZiAoTG9n
RkQgPj0gT0spCi0JCQkJd2FybigiJXMiLCBMT0dfRklMRSk7Ci0JCQl3YXJueCgiY2FuJ3Qgd3Jp
dGUgdG8gbG9nIGZpbGUiKTsKLQkJCXdyaXRlKFNUREVSUiwgbXNnLCBzdHJsZW4obXNnKSk7Ci0J
CX0KKwkvKiB3ZSBoYXZlIHRvIHNwcmludGYoKSBpdCBiZWNhdXNlIGZwcmludGYoKSBkb2Vzbid0
IGFsd2F5cyB3cml0ZQorCSAqIGV2ZXJ5dGhpbmcgb3V0IGluIG9uZSBjaHVuayBhbmQgdGhpcyBo
YXMgdG8gYmUgYXRvbWljYWxseSBhcHBlbmRlZAorCSAqIHRvIHRoZSBsb2cgZmlsZS4KKwkgKi8K
KwlzcHJpbnRmKG1zZywgIiVzICglMDJkLyUwMmQtJTAyZDolMDJkOiUwMmQtJWQpICVzICglcylc
biIsCisJCXVzZXJuYW1lLAorCQl0LT50bV9tb24rMSwgdC0+dG1fbWRheSwgdC0+dG1faG91ciwg
dC0+dG1fbWluLCB0LT50bV9zZWMsIHBpZCwKKwkJZXZlbnQsIGRldGFpbCk7CiAKLQkJZnJlZSht
c2cpOworCS8qIHdlIGhhdmUgdG8gcnVuIHN0cmxlbigpIGJlY2F1c2Ugc3ByaW50ZigpIHJldHVy
bnMgKGNoYXIqKSBvbiBvbGQgQlNECisJICovCisJaWYgKExvZ0ZEIDwgT0sgfHwgd3JpdGUoTG9n
RkQsIG1zZywgc3RybGVuKG1zZykpIDwgT0spIHsKKwkJaWYgKExvZ0ZEID49IE9LKQorCQkJcGVy
cm9yKExPR19GSUxFKTsKKwkJZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgd3JpdGUgdG8gbG9n
IGZpbGVcbiIsIFByb2dyYW1OYW1lKTsKKwkJd3JpdGUoU1RERVJSLCBtc2csIHN0cmxlbihtc2cp
KTsKIAl9CisKKwlmcmVlKG1zZyk7CiAjZW5kaWYgLypMT0dfRklMRSovCiAKICNpZiBkZWZpbmVk
KFNZU0xPRykKIAlpZiAoIXN5c2xvZ19vcGVuKSB7Ci0JCS8qIHdlIGRvbid0IHVzZSBMT0dfUElE
IHNpbmNlIHRoZSBwaWQgcGFzc2VkIHRvIHVzIGJ5Ci0JCSAqIG91ciBjbGllbnQgbWF5IG5vdCBi
ZSBvdXIgb3duLiAgdGhlcmVmb3JlIHdlIHdhbnQgdG8KLQkJICogcHJpbnQgdGhlIHBpZCBvdXJz
ZWx2ZXMuCi0JCSAqLwogIyBpZmRlZiBMT0dfREFFTU9OCi0JCW9wZW5sb2coUHJvZ3JhbU5hbWUs
IExPR19QSUQsIExPR19DUk9OKTsKKwkJb3BlbmxvZyhQcm9ncmFtTmFtZSwgTE9HX1BJRCwgRkFD
SUxJVFkpOwogIyBlbHNlCiAJCW9wZW5sb2coUHJvZ3JhbU5hbWUsIExPR19QSUQpOwogIyBlbmRp
ZgogCQlzeXNsb2dfb3BlbiA9IFRSVUU7CQkvKiBhc3N1bWUgb3BlbmxvZyBzdWNjZXNzICovCiAJ
fQogCi0Jc3lzbG9nKExPR19JTkZPLCAiKCVzKSAlcyAoJXMpXG4iLCB1c2VybmFtZSwgZXZlbnQs
IGRldGFpbCk7CisJc3lzbG9nKExPR19JTkZPLCAiKCVzKSAlcyAoJXMpIiwgdXNlcm5hbWUsIGV2
ZW50LCBkZXRhaWwpOwogCiAjZW5kaWYgLypTWVNMT0cqLwogCiAjaWYgREVCVUdHSU5HCiAJaWYg
KERlYnVnRmxhZ3MpIHsKLQkJZnByaW50ZihzdGRlcnIsICJsb2dfaXQ6ICglcyAlZCkgJXMgKCVz
KVxuIiwKLQkJCXVzZXJuYW1lLCBwaWQsIGV2ZW50LCBkZXRhaWwpOworCQlmcHJpbnRmKHN0ZGVy
ciwgImxvZ19pdDogKCVzICVsZCkgJXMgKCVzKVxuIiwKKwkJCXVzZXJuYW1lLCAobG9uZylwaWQs
IGV2ZW50LCBkZXRhaWwpOwogCX0KICNlbmRpZgogfQogCi0KIHZvaWQKLWxvZ19jbG9zZSgpIHsK
K2xvZ19jbG9zZSh2b2lkKSB7CiAJaWYgKExvZ0ZEICE9IEVSUikgewogCQljbG9zZShMb2dGRCk7
CiAJCUxvZ0ZEID0gRVJSOwogCX0KKyNpZiBkZWZpbmVkKFNZU0xPRykKKwljbG9zZWxvZygpOwor
CXN5c2xvZ19vcGVuID0gRkFMU0U7CisjZW5kaWYgLypTWVNMT0cqLwogfQogCi0KLS8qIHR3byB3
YXJuaW5nczoKKy8qIGNoYXIgKmZpcnN0X3dvcmQoY2hhciAqcywgY2hhciAqdCkKKyAqCXJldHVy
biBwb2ludGVyIHRvIGZpcnN0IHdvcmQKKyAqIHBhcmFtZXRlcnM6CisgKglzIC0gc3RyaW5nIHdl
IHdhbnQgdGhlIGZpcnN0IHdvcmQgb2YKKyAqCXQgLSB0ZXJtaW5hdG9ycywgaW1wbGljaXRseSBp
bmNsdWRpbmcgXDAKKyAqIHdhcm5pbmdzOgogICoJKDEpIHRoaXMgcm91dGluZSBpcyBmYWlybHkg
c2xvdwogICoJKDIpIGl0IHJldHVybnMgYSBwb2ludGVyIHRvIHN0YXRpYyBzdG9yYWdlCiAgKi8K
IGNoYXIgKgotZmlyc3Rfd29yZChzLCB0KQotCXJlZ2lzdGVyIGNoYXIgKnM7CS8qIHN0cmluZyB3
ZSB3YW50IHRoZSBmaXJzdCB3b3JkIG9mICovCi0JcmVnaXN0ZXIgY2hhciAqdDsJLyogdGVybWlu
YXRvcnMsIGltcGxpY2l0bHkgaW5jbHVkaW5nIFwwICovCi17CitmaXJzdF93b3JkKGNoYXIgKnMs
IGNoYXIgKnQpIHsKIAlzdGF0aWMgY2hhciByZXRidWZbMl1bTUFYX1RFTVBTVFIgKyAxXTsJLyog
c3VyZSB3aXNoIEMgaGFkIEdDICovCiAJc3RhdGljIGludCByZXRzZWwgPSAwOwotCXJlZ2lzdGVy
IGNoYXIgKnJiLCAqcnA7CisJY2hhciAqcmIsICpycDsKIAogCS8qIHNlbGVjdCBhIHJldHVybiBi
dWZmZXIgKi8KIAlyZXRzZWwgPSAxLXJldHNlbDsKQEAgLTUxMywxOSArNTMxLDIzIEBACiAKIAkv
KiBmaW5pc2ggdGhlIHJldHVybi1zdHJpbmcgYW5kIHJldHVybiBpdCAqLwogCSpycCA9ICdcMCc7
Ci0JcmV0dXJuIHJiOworCXJldHVybiAocmIpOwogfQogCi0KIC8qIHdhcm5pbmc6CiAgKgloZWF2
aWx5IGFzY2lpLWRlcGVuZGVudC4KICAqLwotc3RhdGljIHZvaWQKLW1rcHJpbnQocmVnaXN0ZXIg
Y2hhciAqZHN0LCByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzcmMsIHJlZ2lzdGVyIGludCBsZW4p
Cit2b2lkCitta3ByaW50KGNoYXIgKmRzdCwgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgbGVuKQog
eworCS8qCisJICogWFhYCisJICogV2Uga25vdyB0aGlzIHJvdXRpbmUgY2FuJ3Qgb3ZlcmZsb3cg
dGhlIGRzdCBidWZmZXIgYmVjYXVzZSBta3ByaW50cygpCisJICogYWxsb2NhdGVkIGVub3VnaCBz
cGFjZSBmb3IgdGhlIHdvcnN0IGNhc2UuCisJICovCiAJd2hpbGUgKGxlbi0tID4gMCkKIAl7Ci0J
CXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgY2ggPSAqc3JjKys7CisJCXVuc2lnbmVkIGNoYXIgY2gg
PSAqc3JjKys7CiAKIAkJaWYgKGNoIDwgJyAnKSB7CQkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8K
IAkJCSpkc3QrKyA9ICdeJzsKQEAgLTU0Myw1OCArNTY1LDE3NSBAQAogCSpkc3QgPSAnXDAnOwog
fQogCi0KIC8qIHdhcm5pbmc6CiAgKglyZXR1cm5zIGEgcG9pbnRlciB0byBtYWxsb2MnZCBzdG9y
YWdlLCB5b3UgbXVzdCBjYWxsIGZyZWUgeW91cnNlbGYuCiAgKi8KIGNoYXIgKgogbWtwcmludHMo
c3JjLCBsZW4pCi0JcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqc3JjOwotCXJlZ2lzdGVyIHVuc2ln
bmVkIGludCBsZW47CisJdW5zaWduZWQgY2hhciAqc3JjOworCXVuc2lnbmVkIGludCBsZW47CiB7
Ci0JcmVnaXN0ZXIgY2hhciAqZHN0ID0gbWFsbG9jKGxlbio0ICsgMSk7CisJY2hhciAqZHN0ID0g
bWFsbG9jKGxlbio0ICsgMSk7CiAKLQlpZiAoZHN0ICE9IE5VTEwpCisJaWYgKGRzdCkKIAkJbWtw
cmludChkc3QsIHNyYywgbGVuKTsKIAotCXJldHVybiBkc3Q7CisJcmV0dXJuIChkc3QpOwogfQog
Ci0KICNpZmRlZiBNQUlMX0RBVEUKLS8qIFNhdCwgMjcgRmViIDkzIDExOjQ0OjUxIENTVAotICog
MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3CisvKiBTYXQsIDI3IEZlYiAxOTkzIDExOjQ0OjUx
IC0wODAwIChDU1QpCisgKiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3CiAg
Ki8KIGNoYXIgKgogYXJwYWRhdGUoY2xvY2spCiAJdGltZV90ICpjbG9jazsKIHsKLQl0aW1lX3Qg
dCA9IGNsb2NrID8qY2xvY2sgOnRpbWUoMEwpOwotCXN0cnVjdCB0bSAqdG0gPSBsb2NhbHRpbWUo
JnQpOwotCXN0YXRpYyBjaGFyIHJldFszMl07CS8qIHpvbmUgbmFtZSBtaWdodCBiZSA+MyBjaGFy
cyAqLwotCi0JaWYgKHRtLT50bV95ZWFyID49IDEwMCkKLQkJdG0tPnRtX3llYXIgKz0gMTkwMDsK
LQotCSh2b2lkKSBzbnByaW50ZihyZXQsIHNpemVvZihyZXQpLCAiJXMsICUyZCAlcyAlZCAlMDJk
OiUwMmQ6JTAyZCAlcyIsCi0JCSAgICAgICBEb3dOYW1lc1t0bS0+dG1fd2RheV0sCi0JCSAgICAg
ICB0bS0+dG1fbWRheSwKLQkJICAgICAgIE1vbnRoTmFtZXNbdG0tPnRtX21vbl0sCi0JCSAgICAg
ICB0bS0+dG1feWVhciwKLQkJICAgICAgIHRtLT50bV9ob3VyLAotCQkgICAgICAgdG0tPnRtX21p
biwKLQkJICAgICAgIHRtLT50bV9zZWMsCisJdGltZV90IHQgPSBjbG9jayA/ICpjbG9jayA6IHRp
bWUoKFRJTUVfVCkgMCk7CisJc3RydWN0IHRtIHRtID0gKmxvY2FsdGltZSgmdCk7CisJbG9uZyBn
bXRvZmYgPSBnZXRfZ210b2ZmKCZ0LCAmdG0pOworCWludCBob3VycyA9IGdtdG9mZiAvIFNFQ09O
RFNfUEVSX0hPVVI7CisJaW50IG1pbnV0ZXMgPSAoZ210b2ZmIC0gKGhvdXJzICogU0VDT05EU19Q
RVJfSE9VUikpIC8gU0VDT05EU19QRVJfTUlOVVRFOworCXN0YXRpYyBjaGFyIHJldFs2NF07CS8q
IHpvbmUgbmFtZSBtaWdodCBiZSA+MyBjaGFycyAqLworCQorCSh2b2lkKSBzcHJpbnRmKHJldCwg
IiVzLCAlMmQgJXMgJTJkICUwMmQ6JTAyZDolMDJkICUuMmQlLjJkICglcykiLAorCQkgICAgICAg
RG93TmFtZXNbdG0udG1fd2RheV0sCisJCSAgICAgICB0bS50bV9tZGF5LAorCQkgICAgICAgTW9u
dGhOYW1lc1t0bS50bV9tb25dLAorCQkgICAgICAgdG0udG1feWVhciArIDE5MDAsCisJCSAgICAg
ICB0bS50bV9ob3VyLAorCQkgICAgICAgdG0udG1fbWluLAorCQkgICAgICAgdG0udG1fc2VjLAor
CQkgICAgICAgaG91cnMsCisJCSAgICAgICBtaW51dGVzLAogCQkgICAgICAgVFpPTkUoKnRtKSk7
Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gKHJldCk7CiB9CiAjZW5kaWYgLypNQUlMX0RBVEUqLwog
Ci0KICNpZmRlZiBIQVZFX1NBVkVEX1VJRFMKLXN0YXRpYyBpbnQgc2F2ZV9ldWlkOwotaW50IHN3
YXBfdWlkcygpIHsgc2F2ZV9ldWlkID0gZ2V0ZXVpZCgpOyByZXR1cm4gc2V0ZXVpZChnZXR1aWQo
KSk7IH0KLWludCBzd2FwX3VpZHNfYmFjaygpIHsgcmV0dXJuIHNldGV1aWQoc2F2ZV9ldWlkKTsg
fQorc3RhdGljIHVpZF90IHNhdmVfZXVpZDsKK3N0YXRpYyBnaWRfdCBzYXZlX2VnaWQ7CisKK2lu
dCBzd2FwX3VpZHModm9pZCkgeworCXNhdmVfZWdpZCA9IGdldGVnaWQoKTsKKwlzYXZlX2V1aWQg
PSBnZXRldWlkKCk7CisJcmV0dXJuICgoc2V0ZWdpZChnZXRnaWQoKSkgfHwgc2V0ZXVpZChnZXR1
aWQoKSkpID8gLTEgOiAwKTsKK30KKworaW50IHN3YXBfdWlkc19iYWNrKHZvaWQpIHsKKwlyZXR1
cm4gKChzZXRlZ2lkKGdldGdpZCgpKSB8fCBzZXRldWlkKGdldHVpZCgpKSkgPyAtMSA6IDApOwor
fQorCiAjZWxzZSAvKkhBVkVfU0FWRURfVUlEUyovCi1pbnQgc3dhcF91aWRzKCkgeyByZXR1cm4g
c2V0cmV1aWQoZ2V0ZXVpZCgpLCBnZXR1aWQoKSk7IH0KLWludCBzd2FwX3VpZHNfYmFjaygpIHsg
cmV0dXJuIHN3YXBfdWlkcygpOyB9CisKK2ludCBzd2FwX3VpZHModm9pZCkgeworCXJldHVybiAo
KHNldHJlZ2lkKGdldGVnaWQoKSwgZ2V0Z2lkKCkpIHx8IHNldHJldWlkKGdldGV1aWQoKSwgZ2V0
dWlkKCkpKQorCSAgICA/IC0xIDogMCk7Cit9CisKK2ludCBzd2FwX3VpZHNfYmFjayh2b2lkKSB7
CisJcmV0dXJuIChzd2FwX3VpZHMoKSk7Cit9CiAjZW5kaWYgLypIQVZFX1NBVkVEX1VJRFMqLwor
CitzaXplX3QKK3N0cmxlbnMoY29uc3QgY2hhciAqbGFzdCwgLi4uKSB7CisJdmFfbGlzdCBhcDsK
KwlzaXplX3QgcmV0ID0gMDsKKwljb25zdCBjaGFyICpzdHI7CisKKwl2YV9zdGFydChhcCwgbGFz
dCk7CisJZm9yIChzdHIgPSBsYXN0OyBzdHIgIT0gTlVMTDsgc3RyID0gdmFfYXJnKGFwLCBjb25z
dCBjaGFyICopKQorCQlyZXQgKz0gc3RybGVuKHN0cik7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4g
KHJldCk7Cit9CisKKy8qIFJldHVybiB0aGUgb2Zmc2V0IGZyb20gR01UIGluIHNlY29uZHMgKGFs
Z29yaXRobSB0YWtlbiBmcm9tIHNlbmRtYWlsKS4KKyAqCisgKiB3YXJuaW5nOgorICoJY2xvYmJl
cnMgdGhlIHN0YXRpYyBzdG9yYWdlIHNwYWNlIHVzZWQgYnkgbG9jYWx0aW1lKCkgYW5kIGdtdGlt
ZSgpLgorICoJSWYgdGhlIGxvY2FsIHBvaW50ZXIgaXMgbm9uLU5VTEwgaXQgKm11c3QqIHBvaW50
IHRvIGEgbG9jYWwgY29weS4KKyAqLworI2lmbmRlZiBIQVZFX1RNX0dNVE9GRgorbG9uZyBnZXRf
Z210b2ZmKHRpbWVfdCAqY2xvY2ssIHN0cnVjdCB0bSAqbG9jYWwpCit7CisJc3RydWN0IHRtIGdt
dDsKKwlsb25nIG9mZnNldDsKKworCWdtdCA9ICpnbXRpbWUoY2xvY2spOworCWlmIChsb2NhbCA9
PSBOVUxMKQorCQlsb2NhbCA9IGxvY2FsdGltZShjbG9jayk7CisKKwlvZmZzZXQgPSAobG9jYWwt
PnRtX3NlYyAtIGdtdC50bV9zZWMpICsKKwkgICAgKChsb2NhbC0+dG1fbWluIC0gZ210LnRtX21p
bikgKiA2MCkgKworCSAgICAoKGxvY2FsLT50bV9ob3VyIC0gZ210LnRtX2hvdXIpICogMzYwMCk7
CisKKwkvKiBUaW1lem9uZSBtYXkgY2F1c2UgeWVhciByb2xsb3ZlciB0byBoYXBwZW4gb24gYSBk
aWZmZXJlbnQgZGF5LiAqLworCWlmIChsb2NhbC0+dG1feWVhciA8IGdtdC50bV95ZWFyKQorCQlv
ZmZzZXQgLT0gMjQgKiAzNjAwOworCWVsc2UgaWYgKGxvY2FsLT50bV95ZWFyID4gZ210LnRtX3ll
YXIpCisJCW9mZnNldCAtPSAyNCAqIDM2MDA7CisJZWxzZSBpZiAobG9jYWwtPnRtX3lkYXkgPCBn
bXQudG1feWRheSkKKwkJb2Zmc2V0IC09IDI0ICogMzYwMDsKKwllbHNlIGlmIChsb2NhbC0+dG1f
eWRheSA+IGdtdC50bV95ZGF5KQorCQlvZmZzZXQgKz0gMjQgKiAzNjAwOworCisJcmV0dXJuIChv
ZmZzZXQpOworfQorI2VuZGlmIC8qIEhBVkVfVE1fR01UT0ZGICovCisKK2ludAorb3Blbl9zb2Nr
ZXQodm9pZCkKK3sKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgIHNvY2s7CisgICAgICAgIG1v
ZGVfdCAgICAgICAgICAgICBvbWFzazsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX3VuIHNfdW47
CisKKyAgICAgICAgc29jayA9IHNvY2tldChQRl9MT0NBTCwgU09DS19TVFJFQU0sIDApOworICAg
ICAgICBpZiAoc29jayA9PSAtMSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAi
JXM6IGNhbid0IGNyZWF0ZSBzb2NrZXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBQcm9n
cmFtTmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBleGl0KEVYSVRfRkFJ
TFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZjbnRsKHNvY2ssIEZfU0VURkQsIEZEX0NM
T0VYRUMpID09IC0xKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2Fu
J3QgbWFrZSBzb2NrZXQgY2xvc2Ugb24gZXhlYzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAg
IFByb2dyYW1OYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIGV4aXQoRVhJ
VF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmNudGwoc29jaywgRl9TRVRGTCwg
T19OT05CTE9DSykgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVz
OiBjYW4ndCBtYWtlIHNvY2tldCBub24tYmxvY2tpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAg
ICAgICBQcm9ncmFtTmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBleGl0
KEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KCZzX3VuLCAnXDAnLCBz
aXplb2Yoc191bikpOworICAgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpc25wcmludGYoc191bi5z
dW5fcGF0aCwgc2l6ZW9mKHNfdW4uc3VuX3BhdGgpLCAiJXMvJXMvJXMiLAorICAgICAgICAgICAg
ICBDUk9ORElSLCBTUE9PTF9ESVIsIFNPQ0tGSUxFKSA+PSBzaXplb2Yoc191bi5zdW5fcGF0aCkp
IHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzLyVzOiBwYXRoIHRvbyBsb25n
XG4iLCBDUk9ORElSLCBTT0NLRklMRSk7CisgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxV
UkUpOworICAgICAgICB9CisgICAgICAgIHVubGluayhzX3VuLnN1bl9wYXRoKTsKKyAgICAgICAg
c191bi5zdW5fZmFtaWx5ID0gUEZfTE9DQUw7CisjaWZkZWYgU1VOX0xFTgorICAgICAgICBzX3Vu
LnN1bl9sZW4gPSBTVU5fTEVOKCZzX3VuKTsKKyNlbmRpZgorCisgICAgICAgIG9tYXNrID0gdW1h
c2soMDA3KTsKKyAgICAgICAgaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzX3Vu
LCBzaXplb2Yoc191bikpKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczog
Y2FuJ3QgYmluZCBzb2NrZXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBQcm9ncmFtTmFt
ZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICB1bWFzayhvbWFzayk7CisgICAg
ICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIHVtYXNr
KG9tYXNrKTsKKyAgICAgICAgaWYgKGxpc3Rlbihzb2NrLCBTT01BWENPTk4pKSB7CisgICAgICAg
ICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3QgbGlzdGVuIG9uIHNvY2tldDogJXNc
biIsCisgICAgICAgICAgICAgICAgICAgIFByb2dyYW1OYW1lLCBzdHJlcnJvcihlcnJubykpOwor
ICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBj
aG1vZChzX3VuLnN1bl9wYXRoLCAwNjYwKTsKKworICAgICAgICByZXR1cm4oc29jayk7Cit9CisK
--089e0111c08a47d11f04fb9e10f8--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAN3T69vCQTb1hU%2BAUKg%2BKLgsuCttLxYS6u2r9k3w5LM2D4zZoA>