Improve cron(8)
--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
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
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
--089e0111c08a47d11f04fb9e10f8--
info
因文章內容過長,因此無法取得中間部份內容。您可以登入 https://term.ptt.cc/ 查看完整內容。
討論串 (同標題文章)
完整討論串 (本文為第 1 之 21 篇):