My gc.c file

ANOQ of the Sun anoq@hardcoreprocessing.com
Mon, 05 Jun 2000 21:10:25 +0200


This is a multi-part message in MIME format.
--------------B09E363249B4ED416AC29157
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Hello!


This is my gc.c file - with some debug messages.
It now also has proper functioncalls to get the
system page size and total available memory
on Win32. Except that avaialble memory on
an NT system is always 2GB - I don't know
if this OK...


Cheers
-- 
http://www.HardcoreProcessing.com


--------------B09E363249B4ED416AC29157
Content-Type: application/x-unknown-content-type-ProjectBuilder.c;
 name="gc.c"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="gc.c"

LyogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgTkVDIFJlc2VhcmNoIEluc3RpdHV0ZS4KICogUGxl
YXNlIHNlZSB0aGUgZmlsZSBMSUNFTlNFIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogKi8KCiNp
bmNsdWRlICJnYy5oIgoKI2lmIGRlZmluZWQoX1dJTjMyKQojaW5jbHVkZSA8d2luZG93cy5oPgoj
aW5jbHVkZSA8c3lzL3RpbWViLmg+CgovLyBJIF90aGlua18gdGhpcyBpcyBjb3JyZWN0IC0gaXQn
cyBzb21lIGNvbnN0YW50cyBmcm9tIERlbHBoaS4uLgoKI2lmbmRlZiBfU0hfREVOWVJECiNkZWZp
bmUgX09fUkRPTkxZIDAKI2RlZmluZSBfT19XUk9OTFkgMQojZGVmaW5lIF9PX1JEV1IgMgovL09G
X1NIQVJFX0NPTVBBVCAgMAovL09GX1NIQVJFX0VYQ0xVU0lWRSAgMHgxMAojZGVmaW5lIF9TSF9E
RU5ZV1IgIDB4MjAKI2RlZmluZSBfU0hfREVOWVJEICA0OAojZGVmaW5lIF9TSF9ERU5ZTk8gIDB4
NDAKLy9PRl9QQVJTRSAgMHgxMDAKLy9PRl9ERUxFVEUgIDB4MjAwCi8vT0ZfVkVSSUZZICAweDQw
MAovL09GX0NBTkNFTCAgMHg4MDAKLy8jZGVmaW5lIF9PX0NSRUFUICAweDEwMDAKLy9PRl9QUk9N
UFQgIDB4MjAwMAovL09GX0VYSVNUICAweDQwMDAKLy9PRl9SRU9QRU4gIDB4ODAwMAojZW5kaWYK
CiNlbHNlCiNpbmNsdWRlIDxzeXMvbW1hbi5oPgojaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiNl
bmRpZgoKI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHZh
bHVlcy5oPgoKI2RlZmluZSBHQ19ESVNQTEFZX0hFQVAgRkFMU0UKI2RlZmluZSBHQ19ERUJVRyBG
QUxTRQojZGVmaW5lIEdDX0RFQlVHX0FMTE9DIEZBTFNFCiNkZWZpbmUgU1RSSU5HX0hFQURFUiBH
Q19hcnJheUhlYWRlcigxLCAwKQojZGVmaW5lIEZPUldBUkRFRCAweEZGRkZGRkZGCiNkZWZpbmUg
TlVNX1BPSU5URVJTX01BU0sgMHgwMDAwRkZGRgojZGVmaW5lIElTX05PUk1BTF9NQVNLIDB4ODAw
MAojZGVmaW5lIE5VTV9OT05fUE9JTlRFUlNfTUFTSyAweDdGRkYKCi8qIENvbnRpbnVhdGlvbiBv
YmplY3RzIGFyZSBsYXllZCBvdXQgYXMgZm9sbG93cy4KICogMSB3b3JkIGhlYWRlciAoQ09OVF9I
RUFERVIpCiAqIDEgdWludCBzaXplCiAqIDEgdWludCBleG5TdGFjawogKiBzaXplIHdvcmRzIG9m
IHN0YWNrIGRhdGEKICovCiNkZWZpbmUgQ09OVF9IRUFERVIgMHg3RkZGRkZGRgoKI2RlZmluZSB0
b0J5dGVzKG4pICgobikgPDwgMikKCnR5cGVkZWYgdm9pZCAoKnBvaW50ZXJGdW4pKEdDX3N0YXRl
ICpzLCBwb2ludGVyICpwKTsKCiNpZiBkZWZpbmVkKF9XSU4zMikKLy8gVGhlc2Ugc2VlbXMgdG8g
YmUgZGVmaW5lZCBhbHJlYWR5Li4uCi8vICNkZWZpbmUgbWluKHgsIHkpICgoKHVpbnQpeCA8ICh1
aW50KXkpID8gKHVpbnQpeCA6ICh1aW50KXkpCi8vICNkZWZpbmUgbWF4KHgsIHkpICgoKHVpbnQp
eCA+ICh1aW50KXkpID8gKHVpbnQpeCA6ICh1aW50KXkpCiNlbHNlCnN0YXRpYyBpbmxpbmUgdWlu
dCBtaW4odWludCB4LCB1aW50IHkpIHsKCXJldHVybiAoKHggPCB5KSA/IHggOiB5KTsKfQoKc3Rh
dGljIGlubGluZSB1aW50IG1heCh1aW50IHgsIHVpbnQgeSkgewoJcmV0dXJuICgoeCA+IHkpID8g
eCA6IHkpOwp9CiNlbmRpZgoKc3RhdGljIHVzaG9ydCBlbXB0eV9HQ19vZmZzZXRzW10gPSB7IDAg
fTsKCnN0YXRpYyB2b2lkIG5vTG9jYWxzKEdDX3N0YXRlICpzKSB7CglzLT5ieXRlc1JlcXVlc3Rl
ZCA9IDA7CglzLT5sb2NhbE9mZnNldHMgPSBlbXB0eV9HQ19vZmZzZXRzOwp9CgovKiAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAg
ICAgICAgU2FmZSBtbWFwIGFuZCBtdW5tYXAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKI2lmIGRlZmluZWQo
X1dJTjMyKQpsb25nIHdpbkdldFBhZ2VTaXplKCkKewogIFNZU1RFTV9JTkZPIHNJbmZvOwogIAog
IEdldFN5c3RlbUluZm8oJnNJbmZvKTsKICAKICByZXR1cm4gc0luZm8uZHdQYWdlU2l6ZTsKfQoK
I2RlZmluZSBtbHRvbl9nZXRwYWdlc2l6ZSB3aW5HZXRQYWdlU2l6ZQojZWxzZQojZGVmaW5lIG1s
dG9uX2dldHBhZ2VzaXplIGdldHBhZ2VzaXplCiNlbmRpZgoKCiNpZiBkZWZpbmVkKF9XSU4zMikK
Ly8gVGhpcyBpcyBmcm9tIHRoZSBTTUwvTkogc291cmNlLi4uCgp2b2lkICphbGxvY192bWVtKGlu
dCBuYikKewogIHZvaWQgKnA7CiAgCiAgcCA9ICh2b2lkICopIFZpcnR1YWxBbGxvYyhOVUxMLAog
ICAgCQkJICAgIG5iLAogICAgCQkJICAgIE1FTV9DT01NSVR8TUVNX1JFU0VSVkUsCiAgICAJCQkg
ICAgUEFHRV9FWEVDVVRFX1JFQURXUklURSk7CiAgaWYgKHAgPT0gTlVMTCkgewogICAgIGRpZSgi
VmlydHVhbEFsbG9jIGZhaWxlZCBvbiByZXF1ZXN0IG9mIHNpemUgJWx4XG4iLCBuYik7CiAgfQog
IHByaW50ZigiVmlydHVhbEFsbG9jOiAlbHhcbiIsIChsb25nKXApOwogIHJldHVybiBwOwp9CiAg
ICAJCQkgICAgCQkJICAgIAkJCSAgICAgICAgICAgICAgCi8qIGZyZWVfdm1lbToKICogUmV0dXJu
ICBtZW1vcnkgdG8gT1MuCiovCnZvaWQgZnJlZV92bWVtICh2b2lkICpwKQp7CiAgaWYgKCFWaXJ0
dWFsRnJlZSgoTFBWT0lEKXAsCiAgICAgICAgICAgICAgICAgICAwLAogICAgCSAgICAgICAgICAg
TUVNX1JFTEVBU0UpKSB7CiAgICAgcHJpbnRmKCJWaXJ0dWFsRnJlZSBlcnJvciBjb2RlOiAlbGRc
biIsIChsb25nKUdldExhc3RFcnJvcigpKTsKICAgICBkaWUoInVuYWJsZSB0byBWaXJ0dWFsRnJl
ZSBtZW1vcnkgYXQgJWx4XG4iLCBwKTsKICB9CiAgcHJpbnRmKCJWaXJ0dWFsRnJlZTogJWx4XG4i
LCAobG9uZylwKTsKfQojZW5kaWYKCnN0YXRpYyB2b2lkICpzbW1hcChzaXplX3QgbGVuZ3RoKSB7
Cgl2b2lkICpyZXN1bHQ7CgkKI2lmIGRlZmluZWQoX1dJTjMyKQogICAgICAgIHJlc3VsdCA9IGFs
bG9jX3ZtZW0obGVuZ3RoKTsKI2Vsc2UJCglyZXN1bHQgPSBtbWFwKE5VTEwsIGxlbmd0aCwgUFJP
VF9SRUFEIHwgUFJPVF9XUklURSwgCgkJCU1BUF9QUklWQVRFIHwgTUFQX0FOT04sIC0xLCAwKTsK
I2VuZGlmCglwcmludGYoInNtbWFwIGF0ICVseFxuIiwgKGxvbmcpcmVzdWx0KTsKCWlmIChyZXN1
bHQgPT0gKHZvaWQqKS0xKSBkaWUoIm1tYXAgZmFpbGVkIik7CgkKCXJldHVybiByZXN1bHQ7Cn0K
CnN0YXRpYyB2b2lkIHNtdW5tYXAocG9pbnRlciBiYXNlLCBzaXplX3QgbGVuZ3RoKSB7CglpZiAo
MCA9PSBsZW5ndGgpCgkJcmV0dXJuOwoJcHJpbnRmKCJzbXVubWFwIGF0ICVseFxuIiwgKGxvbmcp
YmFzZSk7CiNpZiBkZWZpbmVkKF9XSU4zMikKCWZyZWVfdm1lbShiYXNlKTsKI2Vsc2UKCWlmICgw
ICE9IG11bm1hcChiYXNlLCBsZW5ndGgpKQoJCWRpZSgibXVubWFwIGZhaWxlZCIpOwojZW5kaWYK
fQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAq
LwovKiAgICAgICAgICAgICAgICBmcm9tU3BhY2UsIHRvU3BhY2UgICAgICAgICAgICAgICAgICov
Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
CnN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMaW1pdChHQ19zdGF0ZSAqcykgewoJcy0+bGltaXQgPSBz
LT5iYXNlICsgcy0+ZnJvbVNpemU7Cn0KCnN0YXRpYyB2b2lkIGZyb21TcGFjZShHQ19zdGF0ZSAq
cykgewoJcy0+YmFzZSA9IHNtbWFwKHMtPmZyb21TaXplKTsKCWlmIChzLT5mcm9tU2l6ZSA+IHMt
Pm1heEhlYXBTaXplU2VlbikKCQlzLT5tYXhIZWFwU2l6ZVNlZW4gPSBzLT5mcm9tU2l6ZTsKCXNl
dExpbWl0KHMpOwp9CgpzdGF0aWMgdm9pZCB0b1NwYWNlKEdDX3N0YXRlICpzKSB7CglzLT50b0Jh
c2UgPSBzbW1hcChzLT50b1NpemUpOwoJaWYgKHMtPnRvU2l6ZSA+IHMtPm1heEhlYXBTaXplU2Vl
bikKCQlzLT5tYXhIZWFwU2l6ZVNlZW4gPSBzLT50b1NpemU7Cn0KCi8qIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAg
ICAgIGN1cnJlbnRUaW1lICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiByZXR1cm4gdGltZSBhcyBu
dW1iZXIgb2YgbWlsbGlzZWNvbmRzICovCnN0YXRpYyB1aW50IGN1cnJlbnRUaW1lKCkgewoJdWlu
dCByZXN1bHQ7CgkKI2lmIGRlZmluZWQoX1dJTjMyKQoJcmVzdWx0ID0gR2V0VGlja0NvdW50KCk7
CiNlbHNlCglzdHJ1Y3QgcnVzYWdlIHJ1OwoJZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcnUpOwoJ
CglyZXN1bHQgPSAwOwoJcmVzdWx0ICs9IDEwMDAgKiBydS5ydV91dGltZS50dl9zZWM7CglyZXN1
bHQgKz0gMTAwMCAqIHJ1LnJ1X3N0aW1lLnR2X3NlYzsKCXJlc3VsdCArPSBydS5ydV91dGltZS50
dl91c2VjIC8gMTAwMDsKCXJlc3VsdCArPSBydS5ydV9zdGltZS50dl91c2VjIC8gMTAwMDsKI2Vu
ZGlmCgoJcmV0dXJuIHJlc3VsdDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgIHJvdW5kUGFnZSAg
ICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqIFJvdW5kIHNpemUgdXAgdG8gYSBtdWx0aXBsZSBv
ZiB0aGUgc2l6ZSBvZiBhIHBhZ2UuCiAqLwpzaXplX3Qgcm91bmRQYWdlKHNpemVfdCBzaXplKQp7
CglzdGF0aWMgc2l6ZV90CXBzaXplOwoKCXBzaXplID0gbWx0b25fZ2V0cGFnZXNpemUoKTsKCXBy
aW50ZigiUGFnZSBzaXplOiAlbGRcbiIsIChsb25nKXBzaXplKTsKCglzaXplICs9IHBzaXplIC0g
MTsKCXNpemUgLT0gc2l6ZSAlIHBzaXplOwoJcmV0dXJuIChzaXplKTsKfQoKLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAg
ICAgICAgIGNvbXB1dGVIZWFwU2l6ZSAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIHJldHVybnMgbWlu
KHMtPm1heEhlYXBTaXplLCBsaXZlICogcmF0aW8pLgogKiBJdCBpcyBjYXJlZnVsIG5vdCB0byBv
dmVyZmxvdyB3aGVuIGRvaW5nIHRoZSBtdWx0aXBseS4KICogSXQgc2hvdWxkIG9ubHkgYmUgY2Fs
bGVkIHdoZW4gbm90IHMtPnVzZUZpeGVkSGVhcCwgc2luY2Ugcy0+bWF4SGVhcFNpemUgaXMKICog
b25seSBzZXQgaW4gdGhhdCBjYXNlLgogKi8Kc3RhdGljIHVpbnQgY29tcHV0ZUhlYXBTaXplKEdD
X3N0YXRlICpzLCB1aW50IGxpdmUsIHVpbnQgcmF0aW8pIHsKCXVsbG9uZyBuZWVkZWQ7CgoJYXNz
ZXJ0KG5vdCBzLT51c2VGaXhlZEhlYXApOwoKCW5lZWRlZCA9ICgodWxsb25nKWxpdmUpICogcmF0
aW87CglyZXR1cm4gKChuZWVkZWQgPiBzLT5tYXhIZWFwU2l6ZSkKCQk/IHMtPm1heEhlYXBTaXpl
CgkJOiByb3VuZFBhZ2UobmVlZGVkKSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICBleHRyYWN0QXJyYXlO
dW1CeXRlcyAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGFuIGFy
cmF5LCBub3QgaW5jbHVkaW5nIHRoZSBoZWFkZXIuICovCnN0YXRpYyBpbmxpbmUgdWludCBleHRy
YWN0QXJyYXlOdW1CeXRlcyhwb2ludGVyIHAsIAoJCQkJCSB1aW50IG51bVBvaW50ZXJzLAoJCQkJ
CSB1aW50IG51bU5vblBvaW50ZXJzKSB7Cgl1aW50IG51bUVsZW1lbnRzLCBieXRlc1BlckVsZW1l
bnQsIHJlc3VsdDsKCQoJbnVtRWxlbWVudHMgPSBHQ19hcnJheU51bUVsZW1lbnRzKHApOwoJYnl0
ZXNQZXJFbGVtZW50ID0gbnVtTm9uUG9pbnRlcnMgKyB0b0J5dGVzKG51bVBvaW50ZXJzKTsKCXJl
c3VsdCA9IHdvcmRBbGlnbihudW1FbGVtZW50cyAqIGJ5dGVzUGVyRWxlbWVudCk7CgkKCXJldHVy
biByZXN1bHQ7Cn0KCi8qIFdBUk5JTkc6CiAqIGZvcmVhY2hHbG9iYWwsIGZvcmVhY2hMb2NhbCwg
Zm9yZWFjaFBvaW50ZXJJblN0YWNrLCBmb3JlYWNoUG9pbnRlckluSGVhcAogKiBtYXkgYXBwbHkg
dGhlaXIgYXJndW1lbnQgZnVuY3Rpb24gZiB0byB2YWx1ZXMgdGhhdCBhcmUgbm90IHBvaW50ZXJz
LiAgVGhlc2UKICogdmFsdWVzIHdpbGwgYWx3YXlzIGJlIG5vbnplcm8gbW9kIDQsIGFuZCBzaG91
bGQgYmUgZmlyc3QgY2hlY2tlZCBieSBmIHVzaW5nIAogKiBHQ19pc1BvaW50ZXIuCiAqLwovKiAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAg
ICAgICAgICAgICAgICAgIGZvcmVhY2hHbG9iYWwgICAgICAgICAgICAgICAgICAgKi8KLyogLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogQXBw
bHkgZiB0byBlYWNoIGdsb2JhbCBwb2ludGVyIGludG8gdGhlIGhlYXAuICovCnN0YXRpYyB2b2lk
IGZvcmVhY2hHbG9iYWwoR0Nfc3RhdGUgKnMsIHBvaW50ZXJGdW4gZikgewoJaW50IGk7CgogCWZv
ciAoaSA9IDAgOyBpIDwgcy0+bnVtR2xvYmFscyA7ICsraSkKCSAgICAgICAJZihzLCAmKHMtPmds
b2JhbHNbaV0pKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICBmb3JlYWNoTG9jYWwgICAgICAgICAg
ICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gKi8KCi8qIEFwcGx5IGYgdG8gZWFjaCBsb2NhbCBwb2ludGVyIGludG8gdGhlIGhl
YXAuICovCnN0YXRpYyB2b2lkIGZvcmVhY2hMb2NhbChHQ19zdGF0ZSAqcywgcG9pbnRlckZ1biBm
KSB7CglpbnQgaTsKCglmb3IgKGkgPSAwIDsgaSA8IHMtPmxvY2FsT2Zmc2V0c1swXSA7ICsraSkK
CQlmKHMsICYocy0+bG9jYWxzW3MtPmxvY2FsT2Zmc2V0c1tpICsgMV1dKSk7Cn0KCi8qIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAg
ICAgICAgICBmb3JlYWNoUG9pbnRlckluU3RhY2sgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBBcHBseSBm
IHRvIGVhY2ggcG9pbnRlciBmcm9tIHRoZSBzdGFjayB0byB0aGUgaGVhcC4gKi8Kc3RhdGljIHZv
aWQgZm9yZWFjaFBvaW50ZXJJblN0YWNrR2VuKEdDX3N0YXRlICpzLCBwb2ludGVyIGJvdHRvbSwg
cG9pbnRlciB0b3AsCgkJCQkJcG9pbnRlckZ1biBmKSB7CglpbnQgaTsKCgl3aGlsZSAodG9wID49
IGJvdHRvbSkgewoJCS8qIGludjogdG9wIHBvaW50cyBhdCBhIGZyYW1lIGluZGV4ICovCgkJdWlu
dCBmcmFtZUluZGV4OwoJCUdDX2ZyYW1lTGF5b3V0ICpsYXlvdXQ7CgkJR0Nfb2Zmc2V0cyBmcmFt
ZU9mZnNldHM7CgoJCWZyYW1lSW5kZXggPSAqKHVpbnQqKSB0b3A7CiNpZiBHQ19ERUJVRwoJCWZw
cmludGYoc3RkZXJyLCAiZnJhbWUgaW5kZXggJWQuXG4iLCBmcmFtZUluZGV4KTsKI2VuZGlmCgkJ
YXNzZXJ0KGZyYW1lSW5kZXggPCBzLT5tYXhGcmFtZUluZGV4KTsKCQlsYXlvdXQgPSAmKHMtPmZy
YW1lTGF5b3V0c1tmcmFtZUluZGV4XSk7CgkJZnJhbWVPZmZzZXRzID0gbGF5b3V0LT5vZmZzZXRz
OwoJCXRvcCAtPSBsYXlvdXQtPm51bUJ5dGVzOwoKCQlmb3IgKGkgPSAwIDsgaSA8IGZyYW1lT2Zm
c2V0c1swXSA7ICsraSkgewojaWYgR0NfREVCVUcKCQkJZnByaW50ZihzdGRlcnIsICJmcmFtZSBv
ZmZzZXQgJWQuXG4iLCBmcmFtZU9mZnNldHNbaSArIDFdKTsKI2VuZGlmCgkJCWYocywgKHBvaW50
ZXIqKSh0b3AgKyBmcmFtZU9mZnNldHNbaSArIDFdKSk7CgkJfQoJfQoKCWFzc2VydCh0b3AgPT0g
Ym90dG9tIC0gV09SRF9TSVpFKTsKfQoKc3RhdGljIHZvaWQgZm9yZWFjaFBvaW50ZXJJblN0YWNr
KEdDX3N0YXRlICpzLCBwb2ludGVyRnVuIGYpIHsKCWZvcmVhY2hQb2ludGVySW5TdGFja0dlbihz
LCBzLT5zdGFja0JvdHRvbSwgcy0+c3RhY2tUb3AsIGYpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAgZm9y
ZWFjaFBvaW50ZXJJbkhlYXAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyogQXBwbHkgZiB0byBlYWNoIHBv
aW50ZXIgYmV0d2VlbiBzLT5mcm9udCBhbmQgcy0+YmFjaywgd2hpY2ggc2hvdWxkIGJlIGEgCiAq
IGNvbnRpZ3VvdXMgc2VxdWVuY2Ugb2Ygb2JqZWN0cywgd2hlcmUgcy0+ZnJvbnQgcG9pbnRzIGF0
IGEgaGVhZGVyIHdvcmQgCiAqIGFuZCBzLT5iYWNrIHBvaW50cyBqdXN0IHBhc3QgdGhlIGVuZCBv
ZiB0aGUgbGFzdCBvYmplY3QuCiAqIGYgbWF5IGluY3JlYXNlIHMtPmJhY2sgKGZvciBleGFtcGxl
LCB0aGlzIGlzIGRvbmUgYnkgZm9yd2FyZCkuCiAqLwpzdGF0aWMgdm9pZCBmb3JlYWNoUG9pbnRl
ckluSGVhcChHQ19zdGF0ZSAqcywgcG9pbnRlckZ1biBmKSB7Cglwb2ludGVyIGZyb250OwoKCWZy
b250ID0gcy0+ZnJvbnQ7CgogCXdoaWxlIChmcm9udCA8IHMtPmJhY2spIHsKCQkvKiBJbnZhcmlh
bnQ6IGZyb250IGFsd2F5cyBwb2ludHMgYXQgdGhlIG5leHQgaGVhZGVyIHdvcmQuICovCgkJd29y
ZCBoZWFkZXI7CgkJdWludCBudW1Qb2ludGVyczsKCQl1aW50IG51bU5vblBvaW50ZXJzOwoJCWJv
b2wgaXNBcnJheSA9IEZBTFNFOwoJCQoJCWhlYWRlciA9ICood29yZCopZnJvbnQ7CgoJCWZyb250
ICs9IFdPUkRfU0laRTsKCQkKCQlpZiAobm90IChoZWFkZXIgJiBISUdIX0JJVCkpIHsgCgkJCWlz
QXJyYXkgPSBUUlVFOwoJCQlpZiAoQ09OVF9IRUFERVIgIT0gaGVhZGVyKSB7CgkJCQkvKiBMb29r
aW5nIGF0IGFuIGFycmF5LCB0aGUgaGVhZGVyIGlzIGhlcmUuICovCgkJCQloZWFkZXIgPSAqKHdv
cmQqKWZyb250OwoJCQkJZnJvbnQgKz0gV09SRF9TSVpFOwoJCQl9CgkJfSAKCgkJLyogZnJvbnQg
cG9pbnRzIGF0IGJlZ2lubmluZyBvZiBvYmplY3QgZGF0YSAqLwogICAgCgkJLyogZXh0cmFjdCBo
ZWFkZXIgY29tcG9uZW50cyAqLwoJCW51bVBvaW50ZXJzID0gaGVhZGVyICYgTlVNX1BPSU5URVJT
X01BU0s7CgkJbnVtTm9uUG9pbnRlcnMgPSAKCQkJKGhlYWRlciA+PiBOT05fUE9JTlRFUlNfU0hJ
RlQpICYgTlVNX05PTl9QT0lOVEVSU19NQVNLOwoKCQlpZiAoaXNBcnJheSkgewoJCQlpZiAoQ09O
VF9IRUFERVIgPT0gaGVhZGVyKSB7IC8qIEl0J3MgYSBjb250aW51YXRpb24uICovCgkJCQl1aW50
IHNpemU7CgkJCQkKCQkJCXNpemUgPSAqKHVpbnQqKWZyb250OwoJCQkJZnJvbnQgKz0gMiAqIFdP
UkRfU0laRTsKCQkJCWZvcmVhY2hQb2ludGVySW5TdGFja0dlbgoJCQkJCShzLCBmcm9udCwgZnJv
bnQgKyBzaXplIC0gV09SRF9TSVpFLCBmKTsKCQkJCWZyb250ICs9IHNpemU7CgkJCX0gZWxzZSB7
IC8qIEl0J3MgcmVhbGx5IGFuIGFycmF5ICovCgkJCQl1aW50IG51bUJ5dGVzOwoKCQkJCW51bUJ5
dGVzID0gZXh0cmFjdEFycmF5TnVtQnl0ZXMoZnJvbnQsIG51bVBvaW50ZXJzLCBudW1Ob25Qb2lu
dGVycyk7CgoJCQkJaWYgKG51bUJ5dGVzID09IDApIHsgCgkJCQkJLyogQW4gZW1wdHkgYXJyYXkg
LS0gc2tpcCB0aGUgUE9JTlRFUl9TSVpFIGJ5dGVzCgkJCQkJICogZm9yIHRoZSBmb3J3YXJkaW5n
IHBvaW50ZXIuCgkJCQkJICovCgkJCQkJZnJvbnQgKz0gUE9JTlRFUl9TSVpFOwoJCQkJfSBlbHNl
IHsKCQkJCQlwb2ludGVyIG1heDsKCQoJCQkJCW1heCA9IGZyb250ICsgbnVtQnl0ZXM7CgkJCgkJ
CQkJaWYgKG51bVBvaW50ZXJzID09IDApIHsKCQkJCQkvKiBUaGVyZSBhcmUgbm8gcG9pbnRlcnMs
IGp1c3QgdXBkYXRlIHRoZSBmcm9udAoJCQkJCSAqIG9mIHRoZSBxdWV1ZS4KCQkJCQkgKi8KCQkJ
CQkJZnJvbnQgPSBtYXg7CgkJCQkJfSBlbHNlIGlmIChudW1Ob25Qb2ludGVycyA9PSAwKSB7IAoJ
CQkJCSAgCS8qIEl0J3MgYW4gYXJyYXkgd2l0aCBvbmx5IHBvaW50ZXJzLiAqLwoJCQkJCQlmb3Ig
KDsgZnJvbnQgPCBtYXg7IGZyb250ICs9IFBPSU5URVJfU0laRSkKCQkJCQkJCWYocywgKHBvaW50
ZXIqKWZyb250KTsKCQkJCQl9IGVsc2UgewoJCQkJCQl1aW50IG51bUJ5dGVzUG9pbnRlcnM7CgkJ
CQkJCQoJCQkJCQludW1CeXRlc1BvaW50ZXJzID0gdG9CeXRlcyhudW1Qb2ludGVycyk7CgoJCQkJ
CQkvKiBmb3IgZWFjaCBhcnJheSBlbGVtZW50ICovCgkJCQkJCXdoaWxlIChmcm9udCA8IG1heCkg
ewoJCQkJCQkJcG9pbnRlciBtYXgyOwoJCQkJCQkJZnJvbnQgKz0gbnVtTm9uUG9pbnRlcnM7CgkJ
CQkJCQltYXgyID0gZnJvbnQgKyBudW1CeXRlc1BvaW50ZXJzOwoJCQkJCQkJLyogRm9yd2FyZCBh
bGwgaW50ZXJuYWwgcG9pbnRlcnMuICovCgkJCQkJCQlmb3IgKCA7IGZyb250IDwgbWF4MiA7IGZy
b250ICs9IFBPSU5URVJfU0laRSkgCgkJCQkJCQkJZihzLCAocG9pbnRlciopZnJvbnQpOwoJCQkJ
CQl9CgkJCQkJfQoJCQkJCWFzc2VydChmcm9udCA9PSBtYXgpOwoJCQkJfQoJCQl9CgkJfSBlbHNl
IHsKCQkJLyogbm9ybWFsIG9iamVjdCAqLwoJCQlwb2ludGVyIG1heDsKCgkJCWZyb250ICs9IHRv
Qnl0ZXMobnVtTm9uUG9pbnRlcnMpOwoJCQltYXggPSBmcm9udCArIHRvQnl0ZXMobnVtUG9pbnRl
cnMpOwogICAgICAKCQkJLyogRm9yd2FyZCBhbGwgaW50ZXJuYWwgcG9pbnRlcnMuICovCgkJCWZv
ciAoIDsgZnJvbnQgPCBtYXggOyBmcm9udCArPSBQT0lOVEVSX1NJWkUpIAoJCQkJZihzLCAocG9p
bnRlciopZnJvbnQpOwoJCX0KCX0gLyogZW5kIHdoaWxlIChmcm9udCA8IHMtPmJhY2spICovCgoJ
cy0+ZnJvbnQgPSBmcm9udDsKCWFzc2VydChzLT5iYWNrID09IHMtPmZyb250KTsKfQoKLyogLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAg
ICAgICAgICAgICAgICAgIGludmFyaWFudCAgICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiNpZm5kZWYg
Tk9ERUJVRwpzdGF0aWMgYm9vbCBpc0luRnJvbVNwYWNlKEdDX3N0YXRlICpzLCBwb2ludGVyIHAp
IHsKCXJldHVybiAobm90KEdDX2lzUG9pbnRlcihwKSkgCgkJb3IgKHMtPmJhc2UgPD0gcCBhbmQg
cCA8IHMtPmJhc2UgKyBzLT5mcm9tU2l6ZSkpOwp9CgpzdGF0aWMgdm9pZCBhc3NlcnRJc0luRnJv
bVNwYWNlKEdDX3N0YXRlICpzLCBwb2ludGVyICpwKSB7Cglhc3NlcnQoaXNJbkZyb21TcGFjZShz
LCAqcCkpOwp9CgpzdGF0aWMgYm9vbCBpc0luVG9TcGFjZShHQ19zdGF0ZSAqcywgcG9pbnRlciBw
KSB7CglyZXR1cm4gKG5vdChHQ19pc1BvaW50ZXIocCkpCgkJb3IgKHMtPnRvQmFzZSA8PSBwIGFu
ZCBwIDwgcy0+dG9CYXNlICsgcy0+dG9TaXplKSk7Cn0KCnN0YXRpYyBib29sIGludmFyaWFudChH
Q19zdGF0ZSAqcykgewoJLyogd291bGQgYmUgbmljZSB0byBhZGQgZGl2aXNpYmxpdHkgYnkgcGFn
ZXNpemUgb2YgdmFyaW91cyB0aGluZ3MgKi8KCgkvKiBGcmFtZSBsYXlvdXRzICovCgl7CgkJaW50
IGk7CgkJZm9yIChpID0gMDsgaSA8IHMtPm1heEZyYW1lSW5kZXg7ICsraSkgewoJCQlHQ19mcmFt
ZUxheW91dCAqbGF5b3V0OwoKIAkJCWxheW91dCA9ICYocy0+ZnJhbWVMYXlvdXRzW2ldKTsKCgkJ
CWlmIChsYXlvdXQtPm51bUJ5dGVzID4gMCkgewoJCQkJR0Nfb2Zmc2V0cyBvZmZzZXRzOwoJCQkJ
aW50IGo7CgoJCQkJYXNzZXJ0KGxheW91dC0+bnVtQnl0ZXMgPD0gcy0+bWF4RnJhbWVTaXplKTsK
CQkJCW9mZnNldHMgPSBsYXlvdXQtPm9mZnNldHM7CgkJCQlmb3IgKGogPSAwOyBqIDwgb2Zmc2V0
c1swXTsgKytqKQoJCQkJCWFzc2VydChvZmZzZXRzW2ogKyAxXSA8IGxheW91dC0+bnVtQnl0ZXMp
OwoJCQl9CgkJfQoJfQoKCS8qIEhlYXAgYW5kIHN0YWNrLiAqLwoJYXNzZXJ0KHMtPmJhc2UgPD0g
cy0+ZnJvbnRpZXIpOwoJYXNzZXJ0KDAgPT0gcy0+ZnJvbVNpemUgb3Igcy0+ZnJvbnRpZXIgPCBz
LT5saW1pdCk7Cglhc3NlcnQocy0+bGltaXQgPT0gcy0+YmFzZSArIHMtPmZyb21TaXplKTsKCWFz
c2VydChzLT51c2VGaXhlZEhlYXAgb3IgKHMtPmZyb21TaXplIDw9IHMtPm1heEhlYXBTaXplCgkg
ICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcy0+dG9TaXplIDw9IHMtPm1heEhlYXBTaXpl
KSk7Cglhc3NlcnQocy0+dG9CYXNlID09IE5VTEwgb3Igcy0+dG9TaXplID09IHMtPmZyb21TaXpl
KTsKCWFzc2VydChzLT5zdGFja0JvdHRvbSAtIFdPUkRfU0laRSA8PSBzLT5zdGFja1RvcAoJCWFu
ZCBzLT5zdGFja1RvcCA8IHMtPnN0YWNrQm90dG9tICsgcy0+c3RhY2tTaXplKTsKCWFzc2VydChz
LT5zdGFja0xpbWl0ID09IHMtPnN0YWNrQm90dG9tICsgcy0+c3RhY2tTaXplIC0gcy0+bWF4RnJh
bWVTaXplKTsKCgkvKiBDaGVjayB0aGF0IGFsbCBwb2ludGVycyBhcmUgaW50byBmcm9tIHNwYWNl
LiAqLwoJZm9yZWFjaExvY2FsKHMsIGFzc2VydElzSW5Gcm9tU3BhY2UpOwoJZm9yZWFjaEdsb2Jh
bChzLCBhc3NlcnRJc0luRnJvbVNwYWNlKTsKCWZvcmVhY2hQb2ludGVySW5TdGFjayhzLCBhc3Nl
cnRJc0luRnJvbVNwYWNlKTsKCXMtPmZyb250ID0gcy0+YmFzZTsKCXMtPmJhY2sgPSBzLT5mcm9u
dGllcjsKCWZvcmVhY2hQb2ludGVySW5IZWFwKHMsIGFzc2VydElzSW5Gcm9tU3BhY2UpOwoKIAkv
KiBjaGVjayB0aGUgZXhjZXB0aW9uIHN0YWNrICovCgl7CgkJdWludCBvZmZzZXQ7CgoJCWZvciAo
b2Zmc2V0ID0gcy0+ZXhuU3RhY2s7IG9mZnNldCA+IDA7ICkgewoJCQlhc3NlcnQocy0+c3RhY2tC
b3R0b20gKyBvZmZzZXQgCgkJCQkJPD0gcy0+c3RhY2tUb3AgKyBXT1JEX1NJWkUpOwoJCQlvZmZz
ZXQgPSAqKHVpbnQqKShzLT5zdGFja0JvdHRvbSArIG9mZnNldCArIFdPUkRfU0laRSk7CgkJfQoJ
fQoKCXJldHVybiBUUlVFOwp9CiNlbmRpZgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZVN0
YWNrICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyB2b2lkIHNldFN0YWNrTGltaXQoR0Nfc3Rh
dGUgKnMpIHsKCXMtPnN0YWNrTGltaXQgPSBzLT5zdGFja0JvdHRvbSArIHMtPnN0YWNrU2l6ZSAt
IHMtPm1heEZyYW1lU2l6ZTsKfQoKc3RhdGljIHZvaWQgYWxsb2NhdGVTdGFjayhHQ19zdGF0ZSAq
cykgewoJcy0+c3RhY2tCb3R0b20gPSBzbW1hcChzLT5zdGFja1NpemUpOwoJc2V0U3RhY2tMaW1p
dChzKTsKfQkKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICB0cmFuc2xhdGVTdGFjayAgICAgICAgICAgICAg
ICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tICovCgovKiBVcGRhdGUgc3RhY2tUb3AgZm9yIGEgc3RhY2sgdGhhdCBoYXMgbW92ZWQgZnJv
bSAKICogcy0+c3RhY2tCb3R0b20gPT0gb2xkIHRvIHRoZSBjdXJyZW50IHMtPnN0YWNrQm90dG9t
LgogKiBUaGUgY29kZSBpcyBjYXJlZnVsIHRvIHVzZSBhIHVpbnQgZm9yIHRoZSBkaWZmZXJlbmNl
IGFuZCBub3QgYW4gaW50IHNvIHRoYXQgCiAqIG1vdmVzIG92ZXIgYXJiaXRyYXJpbHkgbGFyZ2Ug
ZGlmZmVyZW5jZXMgaW4gdGhlIGFkZHJlc3Mgc3BhY2UgYXJlIGFsbG93ZWQuCiAqLwpzdGF0aWMg
dm9pZCB0cmFuc2xhdGVTdGFjayhHQ19zdGF0ZSAqcywgcG9pbnRlciBvbGQpIHsKCWlmIChzLT5z
dGFja0JvdHRvbSA+IG9sZCkKCQlzLT5zdGFja1RvcCArPSAocy0+c3RhY2tCb3R0b20gLSBvbGQp
OwoJZWxzZQoJCXMtPnN0YWNrVG9wIC09IChvbGQgLSBzLT5zdGFja0JvdHRvbSk7Cn0KCi8qIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAg
ICAgICAgICAgICAgIG1heWJlU2hyaW5rU3RhY2sgICAgICAgICAgICAgICAgICAqLwovKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojZGVmaW5l
IFNUQUNLX1NIUklOS19USFJFU0hPTEQgNAojZGVmaW5lIFNUQUNLX1NIUklOS19GQUNUT1IgMgoK
dm9pZCBtYXliZVNocmlua1N0YWNrKEdDX3N0YXRlICpzKSB7Cgl1aW50IHNpemU7CgoJc2l6ZSA9
IHMtPnN0YWNrVG9wICsgV09SRF9TSVpFIC0gcy0+c3RhY2tCb3R0b207CgoJaWYgKHNpemUgKiBT
VEFDS19TSFJJTktfVEhSRVNIT0xEIDwgcy0+c3RhY2tTaXplCgkJYW5kIHMtPnN0YWNrU2l6ZSA+
IG1sdG9uX2dldHBhZ2VzaXplKCkpIHsKCQl1aW50IGtlZXA7CgoJCWtlZXAgPSByb3VuZFBhZ2Uo
bWF4KHNpemUsIHMtPnN0YWNrU2l6ZSAvIFNUQUNLX1NIUklOS19GQUNUT1IpKTsKCQlpZiAoa2Vl
cCA8IHMtPnN0YWNrU2l6ZSkgewoJCQlpZiAoR0NfREVCVUcgb3Igcy0+bWVzc2FnZXMpCgkJCQlm
cHJpbnRmKHN0ZGVyciwgIlNocmlua2luZyBzdGFjayB0byBzaXplICV1LlxuXG5cblxuXG5cblxu
XG5cblxuXG4iLAoJCQkJCWtlZXApOwoJCQlhc3NlcnQocy0+c3RhY2tUb3AgPCBzLT5zdGFja0Jv
dHRvbSArIGtlZXApOwoJCQlzbXVubWFwKHMtPnN0YWNrQm90dG9tICsga2VlcCwgcy0+c3RhY2tT
aXplIC0ga2VlcCk7CgkJCXMtPnN0YWNrU2l6ZSA9IGtlZXA7CgkJCXNldFN0YWNrTGltaXQocyk7
CgkJfQoJfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAgIEdDX2dyb3dTdGFjayAgICAgICAgICAgICAg
ICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLwoKI2RlZmluZSBTVEFDS19HUk9XX0ZBQ1RPUiAyCnZvaWQgR0NfZ3Jvd1N0YWNrKEdD
X3N0YXRlICpzKSB7Cglwb2ludGVyIG9sZDsKCXVpbnQgb2xkU2l6ZSwgc2l6ZTsKCglub0xvY2Fs
cyhzKTsKCWFzc2VydChpbnZhcmlhbnQocykpOwoJb2xkID0gcy0+c3RhY2tCb3R0b207CglvbGRT
aXplID0gcy0+c3RhY2tTaXplOwoJc2l6ZSA9IHMtPnN0YWNrVG9wICsgV09SRF9TSVpFIC0gcy0+
c3RhY2tCb3R0b207CglzLT5zdGFja1NpemUgKj0gU1RBQ0tfR1JPV19GQUNUT1I7CglpZiAoR0Nf
REVCVUcgb3Igcy0+bWVzc2FnZXMpCgkJZnByaW50ZihzdGRlcnIsICJHcm93aW5nIHN0YWNrIHRv
IHNpemUgJXUuXG4iLCBzLT5zdGFja1NpemUpOwoJYWxsb2NhdGVTdGFjayhzKTsKCW1lbWNweShz
LT5zdGFja0JvdHRvbSwgb2xkLCBzaXplKTsKCXNtdW5tYXAob2xkLCBvbGRTaXplKTsKCXRyYW5z
bGF0ZVN0YWNrKHMsIG9sZCk7CgoJYXNzZXJ0KGludmFyaWFudChzKSk7Cn0KCi8qIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAg
ICAgICAgICAgaW5pdENvdW50ZXJzICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgdm9pZCBp
bml0Q291bnRlcnMoR0Nfc3RhdGUgKnMpIHsKIAkvKiBUaGUgbmV4dCA1IGFyZSBnYy1zdW1tYXJ5
IHN0YXRpc3RpY3MgKi8KCXMtPnN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lKCk7CglzLT5ieXRlc0Fs
bG9jYXRlZCA9IDA7CglzLT5ieXRlc0NvcGllZCA9IDA7CglzLT5udW1HQ3MgPSAwOwoJcy0+Z2NU
aW1lID0gMDsKCXMtPm1heEhlYXBTaXplU2VlbiA9IDA7CglzLT5tYXhCeXRlc0xpdmUgPSAwOwoK
CS8qIFRoZSBuZXh0IDMgYXJlIGZvciBoZWFwIHJlc2l6aW5nICovCglzLT5taW5MaXZlID0gMjA7
CglzLT5tYXhMaXZlID0gMzsKCS8qIHNldCBsaXZlUmF0aW8gKGNsb3NlKSB0byB0aGUgZ2VvbWV0
cmljIG1lYW4gb2YgbWluTGl2ZSBhbmQgbWF4TGl2ZSAqLwoJeyAKCQl1aW50IGk7CgkJZm9yIChp
ID0gcy0+bWF4TGl2ZTsgaSAqIGkgPD0gcy0+bWluTGl2ZSAqIHMtPm1heExpdmU7ICsraSkgOwoJ
CXMtPmxpdmVSYXRpbyA9IGk7Cgl9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgIGdldFJBTXNpemUg
ICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBSQU0gc2l6ZSBpcyBtdWx0aXBsaWVkIGJ5IHRoaXMg
c28gdGhhdCB3ZSBkb24ndCB1c2UgdXAgYWxsIHRoZSBtZW1vcnkgKi8KI2RlZmluZSBSQU1zbG9w
IDAuOTUKCi8qIEdldCBSQU0gc2l6ZSBmcm9tIC9wcm9jL21lbWluZm8uICBWZXJ5IExpbnV4IHNw
ZWNpZmljLiAKICoKICogL3Byb2MvbWVtaW5mbyBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcuCiAq
CiAqICAgICAgICB0b3RhbDogICAgdXNlZDogICAgZnJlZTogIHNoYXJlZDogYnVmZmVyczogIGNh
Y2hlZDoKICogTWVtOiAgMjYzNDYyOTEyIDI1MTE1NDQzMiAxMjMwODQ4MCAxOTg2MTUwNCA1MjU4
ODU0NCAxMjI3Njk0MDgKICogU3dhcDogMTMxNTY3NjE2ICAgIDUzMjQ4IDEzMTUxNDM2OAogKiBN
ZW1Ub3RhbDogICAgMjU3Mjg4IGtCCiAqLwpzdGF0aWMgdWludCBnZXRSQU1zaXplKCkgewoJRklM
RSAqZmlsZTsKCWNoYXIgYzsKCWNoYXIgYnVmWzgwXTsKCXVpbnQgbjsKCiNpZiBkZWZpbmVkKF9X
SU4zMikKICAgICAgICBNRU1PUllTVEFUVVMgbVN0YXR1czsKICAgICAgICAKICAgICAgICBHbG9i
YWxNZW1vcnlTdGF0dXMoJm1TdGF0dXMpOwoKCW4gPSBtU3RhdHVzLmR3VG90YWxWaXJ0dWFsOwoJ
Ly8gV2UgY291bGQgYWxzbyB1c2UgbVN0YXR1cy5kd1RvdGFsUGh5czsKCXByaW50ZigiVG90YWwg
dmlydHVhbDogJWxkXG4iLCAobG9uZyluKTsKI2Vsc2UKCWZpbGUgPSBzb3BlbigiL3Byb2MvbWVt
aW5mbyIsICJyIik7Cgl3aGlsZSAoKGMgPSBmZ2V0YyhmaWxlKSkgIT0gJ1xuJykgOwoJZmdldHMo
YnVmLCBzaXplb2YoIk1lbToiKSwgZmlsZSk7Cgl3aGlsZSAoKGMgPSBmZ2V0YyhmaWxlKSkgPT0g
JyAnKSA7CgluID0gMDsKCWRvIG4gPSBuICogMTAgKyAoaW50KShjIC0gJzAnKTsKCXdoaWxlICgo
YyA9IGZnZXRjKGZpbGUpKSAhPSAnICcpOwoJZmNsb3NlKGZpbGUpOwojZW5kaWYKCXJldHVybiBy
b3VuZFBhZ2UoKHVpbnQpKChkb3VibGUpbiAqIFJBTXNsb3ApKTsKfQoKLyogLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAg
ICAgICBzZXRIZWFwUGFyYW1zICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIHNldCBmcm9tU2l6ZSBh
bmQgbWF5YmUgbWF4SGVhcFNpemUsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHVzZUZpeGVkSGVhcC4K
ICogc2l6ZSBtdXN0IG5vdCBiZSBhbiBhcHByb3hpbWF0aW9uLCBiZWNhdXNlIHNldEhlYXBQYXJh
bXMgd2lsbCBkaWUgaWYgaXQKICogY2FuJ3Qgc2V0IGZyb21TaXplIGJpZyBlbm91Z2guCiAqLwp2
b2lkIHNldEhlYXBQYXJhbXMoR0Nfc3RhdGUgKnMsIHVpbnQgc2l6ZSkgewoJaWYgKHMtPnVzZUZp
eGVkSGVhcCkgewoJCWlmICgwID09IHMtPmZyb21TaXplKQoJCQlzLT5mcm9tU2l6ZSA9IGdldFJB
TXNpemUoKTsKCSAgICAgICAgcy0+ZnJvbVNpemUgPSByb3VuZFBhZ2Uocy0+ZnJvbVNpemUgLyAy
KTsKCX0gZWxzZSB7CgkJaWYgKDAgPT0gcy0+bWF4SGVhcFNpemUpIAoJCQlzLT5tYXhIZWFwU2l6
ZSA9IGdldFJBTXNpemUoKTsKCQlzLT5tYXhIZWFwU2l6ZSA9IHJvdW5kUGFnZShzLT5tYXhIZWFw
U2l6ZSAvIDIpOwoJCXMtPmZyb21TaXplID0gY29tcHV0ZUhlYXBTaXplKHMsIHNpemUsIHMtPmxp
dmVSYXRpbyk7Cgl9CglpZiAoc2l6ZSA+IHMtPmZyb21TaXplKQoJCWRpZSgiT3V0IG9mIG1lbW9y
eS4iKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgICBHQ19pbml0ICAgICAgICAgICAgICAgICAg
ICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gKi8KCnZvaWQgR0NfaW5pdChHQ19zdGF0ZSAqcykgewoJaW5pdENvdW50ZXJzKHMpOwoJbm9M
b2NhbHMocyk7CglzZXRIZWFwUGFyYW1zKHMsIHMtPmJ5dGVzTGl2ZSk7Cgl7CgkJaW50IGk7CgoJ
CWZvciAoaSA9IDA7IGkgPCBzLT5udW1HbG9iYWxzOyArK2kpCgkJCXMtPmdsb2JhbHNbaV0gPSAo
cG9pbnRlcikweDE7Cgl9Cglmcm9tU3BhY2Uocyk7CglzLT5mcm9udGllciA9IHMtPmJhc2U7Cglz
LT50b1NpemUgPSBzLT5mcm9tU2l6ZTsKCXRvU3BhY2Uocyk7CgkvKiBUaGVyZSBpcyBpbml0aWFs
bHkgbm8gZXhjZXB0aW9uIHN0YWNrLCBzbyB3ZSBzdG9yZSBhIHRlcm1pbmFsCiAgICAgICAgICog
Ym9ndXMgb2Zmc2V0IG9mIDAuCgkgKi8KCXMtPmV4blN0YWNrID0gMDsKCS8qIFRoZSBpbml0aWFs
IHN0YWNrIHNpemUgbXVzdCBiZSBiaWcgZW5vdWdoIHNvIHRoYXQgZG91YmxpbmcgaXQgd2lsbAoJ
ICogYWx3YXlzIG1ha2UgZW5vdWdoIHNwYWNlIGZvciB0aGUgbGFyZ2VzdCBmcmFtZSB0aGF0IG5l
ZWRzIHB1c2hlZC4KIAkgKi8KCXMtPnN0YWNrU2l6ZSA9IG1heChtbHRvbl9nZXRwYWdlc2l6ZSgp
LCByb3VuZFBhZ2Uocy0+bWF4RnJhbWVTaXplKSk7CglhbGxvY2F0ZVN0YWNrKHMpOwoJLyogc3Rh
Y2tUb3AgcG9pbnRzIGF0IHRoZSBsYXN0IHNwb3QgaW4gdXNlICovCglzLT5zdGFja1RvcCA9IHMt
PnN0YWNrQm90dG9tIC0gV09SRF9TSVpFIDsKCglhc3NlcnQoaW52YXJpYW50KHMpKTsKfQoKLyog
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAg
ICAgICAgICAgICAgICAgICAgICBmb3J3YXJkICAgICAgICAgICAgICAgICAgICAgICovCi8qIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIEZv
cndhcmQgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5ICpwcC4KICogVXBkYXRlICpwcCB0byBwb2lu
dCB0byB0aGUgbmV3IG9iamVjdC4gCiAqLwpzdGF0aWMgaW5saW5lIHZvaWQgZm9yd2FyZChHQ19z
dGF0ZSAqcywgcG9pbnRlciAqcHApIHsKCXBvaW50ZXIgcDsKCglwID0gKnBwOwoJYXNzZXJ0KGlz
SW5Gcm9tU3BhY2UocywgcCkpOwoKIAlpZiAoR0NfaXNQb2ludGVyKHApKSB7CgkJd29yZCBoZWFk
ZXI7CgoJCS8qIFRoZSBoZWFkZXIgaXMgYWx3YXlzIG9uZSB3b3JkIGJlZm9yZSB0aGUgb2JqZWN0
LiAqLwoJCWhlYWRlciA9ICood29yZCopKHAgLSBXT1JEX1NJWkUpOwoJCWlmIChoZWFkZXIgPT0g
Rk9SV0FSREVEKSAKCQkJLyogQWxyZWFkeSBmb3J3YXJkZWQsIGp1c3QgZ2V0IHRoZSBmb3J3YXJk
aW5nIHBvaW50ZXIuICovCgkJCSpwcCA9ICoocG9pbnRlciopcDsKCQllbHNlIHsgCgkJCS8qIGZv
cndhcmQgdGhlIG9iamVjdCAqLwoJIAkJdWludCBudW1Qb2ludGVycywgbnVtTm9uUG9pbnRlcnM7
CgkJCWJvb2wgaXNOb3JtYWw7CgkJCXBvaW50ZXIgb2JqZWN0U3RhcnQ7CgkJCXVpbnQgb2JqZWN0
Qnl0ZXMsIGhlYWRlckJ5dGVzOwoJCQkKCQkJLyogZXh0cmFjdCBoZWFkZXIgY29tcG9uZW50cyAq
LwoJCQludW1Qb2ludGVycyA9IGhlYWRlciAmIE5VTV9QT0lOVEVSU19NQVNLOwoJCQludW1Ob25Q
b2ludGVycyA9IGhlYWRlciA+PiBOT05fUE9JTlRFUlNfU0hJRlQ7CgkJCWlzTm9ybWFsID0gbnVt
Tm9uUG9pbnRlcnMgJiBJU19OT1JNQUxfTUFTSzsKCQkJbnVtTm9uUG9pbnRlcnMgPSBudW1Ob25Q
b2ludGVycyAmIE5VTV9OT05fUE9JTlRFUlNfTUFTSzsKCQoJCQkvKiBzZXQgaGVhZGVyQnl0ZXMg
YW5kIG9iamVjdEJ5dGVzICovCgkJCWlmIChpc05vcm1hbCkgewoJCQkJaGVhZGVyQnl0ZXMgPSBH
Q19PQkpFQ1RfSEVBREVSX1NJWkU7CgkJCQlvYmplY3RCeXRlcyA9IHRvQnl0ZXMobnVtUG9pbnRl
cnMgKyBudW1Ob25Qb2ludGVycyk7CgkJCX0gZWxzZSBpZiAoQ09OVF9IRUFERVIgPT0gaGVhZGVy
KSB7CgkJCQloZWFkZXJCeXRlcyA9IFdPUkRfU0laRTsKCQkJCW9iamVjdEJ5dGVzID0gMiAqIFdP
UkRfU0laRSArICoodWludCopcDsKCQkJfSBlbHNlIHsgLyogYXJyYXkgKi8KCQkJCWhlYWRlckJ5
dGVzID0gR0NfQVJSQVlfSEVBREVSX1NJWkU7CgkJCQlvYmplY3RCeXRlcyA9IGV4dHJhY3RBcnJh
eU51bUJ5dGVzKHAsIG51bVBvaW50ZXJzLAoJCQkJCQkJCQkgbnVtTm9uUG9pbnRlcnMpOwoJIAkJ
CS8qIEVtcHR5IGFycmF5cyBoYXZlIFBPSU5URVJfU0laRSBieXRlcyBmb3IgdGhlIAoJCQkJICog
Zm9yd2FyZGluZyBwb2ludGVyLgoJCQkJICovCgkJCQlpZiAob2JqZWN0Qnl0ZXMgPT0gMCkgb2Jq
ZWN0Qnl0ZXMgPSBQT0lOVEVSX1NJWkU7CgkJCX0gCgkKCQkJb2JqZWN0U3RhcnQgPSBwIC0gaGVh
ZGVyQnl0ZXM7CgkKCQkJLyogY29weSB0aGUgb2JqZWN0ICovCgkJCW1lbWNweShzLT5iYWNrLCBv
YmplY3RTdGFydCwgaGVhZGVyQnl0ZXMgKyBvYmplY3RCeXRlcyk7CgkKCSAJCS8qIHNldCB0aGUg
Zm9yd2FyZGluZyBwb2ludGVyIGFuZCB1cGRhdGUgcy0+YmFjayAqLwoJCQkqKHdvcmQqKShwIC0g
V09SRF9TSVpFKSA9IEZPUldBUkRFRDsKCQkJcy0+YmFjayArPSBoZWFkZXJCeXRlczsKCQkJKnBw
ID0gcy0+YmFjazsKCQkJKihwb2ludGVyKilwID0gcy0+YmFjazsKCQkJcy0+YmFjayArPSBvYmpl
Y3RCeXRlczsKCQl9Cgl9CgoJYXNzZXJ0KGlzSW5Ub1NwYWNlKHMsICpwcCkpOwp9CgovKiAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAg
ICAgICAgICAgICAgdHJhbnNpdGl2ZUNvcHkgICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIHZv
aWQgdHJhbnNpdGl2ZUNvcHkoR0Nfc3RhdGUgKnMpIHsKI2lmIEdDX0RFQlVHCglmcHJpbnRmKHN0
ZGVyciwgIlRyYW5zaXRpdmUgY29weS5cbiIpOwojZW5kaWYKCWZvcmVhY2hQb2ludGVySW5IZWFw
KHMsIGZvcndhcmQpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAgICAgICAgc3RhcnRHQyAgICAgICAgICAg
ICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSAqLwoKc3RhdGljIHZvaWQgc3RhcnRHQyhHQ19zdGF0ZSAqcykgewogCWFzc2Vy
dChpbnZhcmlhbnQocykpOwoKCWlmIChHQ19ERUJVRyBvciBzLT5tZXNzYWdlcykKCQlmcHJpbnRm
KHN0ZGVyciwgIlN0YXJ0aW5nIGdjLlxuIik7CgogCXMtPnJlY2VudFN0YXJ0ID0gY3VycmVudFRp
bWUoKTsKCglpZiAobm90IHMtPnVzZUZpeGVkSGVhcCkgewoJCXVpbnQgbmVlZGVkOwoKCQluZWVk
ZWQgPSBjb21wdXRlSGVhcFNpemUocywgcy0+Ynl0ZXNMaXZlICsgcy0+Ynl0ZXNSZXF1ZXN0ZWQs
CgkJCQkJCXMtPmxpdmVSYXRpbyk7CgoJCS8qIHRvU3BhY2UgbXVzdCBiZSBhdCBsZWFzdCBhcyBi
aWcgYXMgZnJvbVNwYWNlICovCgkJaWYgKG5lZWRlZCA8IHMtPmZyb21TaXplKQoJCQluZWVkZWQg
PSBzLT5mcm9tU2l6ZTsKCgkJLyogTWFzc2FnZSB0b1NwYWNlIHNvIHRoYXQgaXQgaXMgb2YgbmVl
ZGVkIHNpemUuICovCgkJaWYgKHMtPnRvQmFzZSAhPSBOVUxMKSB7CgkJCSBpZiAocy0+dG9TaXpl
IDwgbmVlZGVkKSB7CgkJCQlpZiAoR0NfREVCVUcgb3Igcy0+bWVzc2FnZXMpCgkJCQkJZnByaW50
ZihzdGRlcnIsICJVbm1hcHBpbmcgdG9TcGFjZVxuIik7CgkJCQlzbXVubWFwKHMtPnRvQmFzZSwg
cy0+dG9TaXplKTsKCQkJCXMtPnRvQmFzZSA9IE5VTEw7CgkJCSB9IGVsc2UgewoJCQkJdWludCBk
ZWxldGU7CgoJCQkJZGVsZXRlID0gcy0+dG9TaXplIC0gbmVlZGVkOwoJCQkJaWYgKEdDX0RFQlVH
IG9yIHMtPm1lc3NhZ2VzKQoJCQkJCWZwcmludGYoc3RkZXJyLCAiU2hyaW5raW5nIHRvU3BhY2Ug
YnkgJXVcbiIsIGRlbGV0ZSk7CgkJCQlzbXVubWFwKHMtPnRvQmFzZSArIG5lZWRlZCwgZGVsZXRl
KTsKCQkJIH0KCQl9CgkJcy0+dG9TaXplID0gbmVlZGVkOwoJCWlmIChOVUxMID09IHMtPnRvQmFz
ZSkKCQkJdG9TcGFjZShzKTsKCX0KCiAJcy0+bnVtR0NzKys7CiAJcy0+Ynl0ZXNBbGxvY2F0ZWQg
Kz0gcy0+ZnJvbnRpZXIgLSBzLT5iYXNlIC0gcy0+Ynl0ZXNMaXZlOwoJcy0+ZnJvbnQgPSBzLT50
b0Jhc2U7CglzLT5iYWNrID0gcy0+dG9CYXNlOwoKCWlmIChHQ19ERUJVRyBvciBzLT5tZXNzYWdl
cykKCQlmcHJpbnRmKHN0ZGVyciwgCgkJCSJ0b1NwYWNlIGlzICVzIGJ5dGVzLlxuIiwKCQkJdWlu
dFRvQ29tbWFTdHJpbmcocy0+dG9TaXplKSk7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgICAgICBmaW5p
c2hHQyAgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgp2b2lkIGZpbmlzaEdDKEdDX3N0YXRlICpzKSB7
Cgl1aW50IGdjVGltZTsKCXVpbnQgc2l6ZTsKCgltYXliZVNocmlua1N0YWNrKHMpOwoKI2lmIEdD
X0RFQlVHCglmcHJpbnRmKHN0ZGVyciwgIkZvcndhcmRpbmcgZ2xvYmFscy5cbiIpOwojZW5kaWYK
CWZvcmVhY2hHbG9iYWwocywgZm9yd2FyZCk7CgojaWYgR0NfREVCVUcKCWZwcmludGYoc3RkZXJy
LCAiRm9yd2FyZGluZyBzdGFja1xuIik7CiNlbmRpZgoJZm9yZWFjaFBvaW50ZXJJblN0YWNrKHMs
IGZvcndhcmQpOwoKI2lmIEdDX0RFQlVHCglmcHJpbnRmKHN0ZGVyciwgIkZvcndhcmRpbmcgJWQg
bG9jYWxzLlxuIiwgcy0+bG9jYWxPZmZzZXRzWzBdKTsKI2VuZGlmCglmb3JlYWNoTG9jYWwocywg
Zm9yd2FyZCk7CgoJdHJhbnNpdGl2ZUNvcHkocyk7CgoJc2l6ZSA9IHMtPmZyb21TaXplOwoKCS8q
IFN3YXAgZnJvbVNwYWNlIGFuZCB0b1NwYWNlLiAqLwoJewoJCXBvaW50ZXIgdG1wOwoJCXRtcCA9
IHMtPmJhc2U7CgkJcy0+YmFzZSA9IHMtPnRvQmFzZTsKCQlzLT50b0Jhc2UgPSB0bXA7Cgl9Cgl7
CgkJdWludCB0bXA7CgkJdG1wID0gcy0+ZnJvbVNpemU7CgkJcy0+ZnJvbVNpemUgPSBzLT50b1Np
emU7CgkJcy0+dG9TaXplID0gdG1wOwoJfQoKCXMtPmZyb250aWVyID0gcy0+YmFjazsKCXMtPmJ5
dGVzTGl2ZSA9IHMtPmZyb250aWVyIC0gcy0+YmFzZTsKCWlmIChzLT5ieXRlc0xpdmUgPiBzLT5t
YXhCeXRlc0xpdmUpCgkJcy0+bWF4Qnl0ZXNMaXZlID0gcy0+Ynl0ZXNMaXZlOwoKCS8qIFJlc2l6
ZSBoZWFwLCBpZiBuZWNlc3NhcnkuICovCglpZiAobm90IHMtPnVzZUZpeGVkSGVhcCkgewoJCXVp
bnQgbmVlZGVkOwoKCQluZWVkZWQgPSBzLT5ieXRlc0xpdmUgKyBzLT5ieXRlc1JlcXVlc3RlZDsK
CQlpZiAoY29tcHV0ZUhlYXBTaXplKHMsIG5lZWRlZCwgcy0+bWluTGl2ZSkgPCBzLT5mcm9tU2l6
ZSkgewoJCQkvKiBzaHJpbmsgaGVhcCAqLwoJCQl1aW50IGtlZXA7CgoJCQlrZWVwID0gY29tcHV0
ZUhlYXBTaXplKHMsIG5lZWRlZCwgcy0+bGl2ZVJhdGlvKTsKCQkJaWYgKEdDX0RFQlVHIG9yIHMt
Pm1lc3NhZ2VzKQoJCQkJZnByaW50ZihzdGRlcnIsICJTaHJpbmtpbmcgaGVhcCB0byAldSBieXRl
cy5cbiIsIGtlZXApOwoJCQlhc3NlcnQoa2VlcCA8PSBzLT5mcm9tU2l6ZSk7CgkJCXNtdW5tYXAo
cy0+YmFzZSArIGtlZXAsIHMtPmZyb21TaXplIC0ga2VlcCk7CgkJCXMtPmZyb21TaXplID0ga2Vl
cDsKCQl9CgkKCQlpZiAoKHMtPnRvU2l6ZSA8IHMtPmZyb21TaXplKQoJCSAgICBvciAoY29tcHV0
ZUhlYXBTaXplKHMsIG5lZWRlZCwgcy0+bWF4TGl2ZSkgPiBzLT5mcm9tU2l6ZSkpIHsKCQkJLyog
cHJlcGFyZSB0byBhbGxvY2F0ZSBuZXcgdG9TcGFjZSBhdCBuZXh0IEdDICovCgkJCXNtdW5tYXAo
cy0+dG9CYXNlLCBzLT50b1NpemUpOwoJCQlzLT50b0Jhc2UgPSBOVUxMOwoJCX0gZWxzZSB7CgkJ
ICAgICAgICAvKiBzaHJpbmsgdG9TcGFjZSBzbyB0aGF0IHMtPnRvU2l6ZSA9PSBzLT5mcm9tU2l6
ZSAqLwoJCQlzbXVubWFwKHMtPnRvQmFzZSArIHMtPmZyb21TaXplLCBzLT50b1NpemUgLSBzLT5m
cm9tU2l6ZSk7CgkgCQlzLT50b1NpemUgPSBzLT5mcm9tU2l6ZTsKCQl9Cgl9CgoJc2V0TGltaXQo
cyk7CgoJcy0+Ynl0ZXNDb3BpZWQgKz0gcy0+Ynl0ZXNMaXZlOwoJZ2NUaW1lID0gY3VycmVudFRp
bWUoKSAtIHMtPnJlY2VudFN0YXJ0OwoJcy0+Z2NUaW1lICs9IGdjVGltZTsKCglpZiAoR0NfREVC
VUcgb3Igcy0+bWVzc2FnZXMpIHsKCQlmcHJpbnRmKHN0ZGVyciwgIkZpbmlzaGVkIGdjLlxuIik7
CgkJZnByaW50ZihzdGRlcnIsICJ0aW1lKG1zKTogJXNcbiIsIGludFRvQ29tbWFTdHJpbmcoZ2NU
aW1lKSk7CgkJZnByaW50ZihzdGRlcnIsICJsaXZlKGJ5dGVzKTogJXMgKCUuMWYlJSlcbiIsIAoJ
CQlpbnRUb0NvbW1hU3RyaW5nKHMtPmJ5dGVzTGl2ZSksCgkJCTEwMC4wICogKChkb3VibGUpIHMt
PmJ5dGVzTGl2ZSkgLyBzaXplKTsKCX0KCglhc3NlcnQoaW52YXJpYW50KHMpKTsKCglpZiAocy0+
ZnJvbnRpZXIgKyBzLT5ieXRlc1JlcXVlc3RlZCA+PSBzLT5saW1pdCkgewoJCWlmIChzLT51c2VG
aXhlZEhlYXAgb3Igcy0+ZnJvbVNpemUgPT0gcy0+bWF4SGVhcFNpemUpIAoJCQlkaWUoIk91dCBv
ZiBtZW1vcnkuIik7CgkJZWxzZSBHQ19nYyhzKTsKCX0KCglhc3NlcnQocy0+ZnJvbnRpZXIgKyBz
LT5ieXRlc1JlcXVlc3RlZCA8IHMtPmxpbWl0KTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgICAg
R0NfZ2MgICAgICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnZvaWQgR0NfZ2MoR0Nfc3RhdGUgKnMpIHsK
CXN0YXJ0R0Mocyk7CglmaW5pc2hHQyhzKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgICBHQ19z
aXplICAgICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnVpbnQgR0Nfc2l6ZShHQ19zdGF0ZSAqcywgcG9p
bnRlciByb290KSB7Cgl1aW50IHNpemU7CgoJbm9Mb2NhbHMocyk7CglzdGFydEdDKHMpOwoJZm9y
d2FyZChzLCAmcm9vdCk7Cgl0cmFuc2l0aXZlQ29weShzKTsKCXNpemUgPSBzLT5iYWNrIC0gcy0+
dG9CYXNlOwoJZmluaXNoR0Mocyk7CgkKCXJldHVybiBzaXplOwp9CgovKiAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAg
ICBHQ19jcmVhdGVTdHJpbmdzICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKdm9pZCBHQ19jcmVhdGVTdHJp
bmdzKEdDX3N0YXRlICpzLCBzdHJ1Y3QgR0Nfc3RyaW5nSW5pdCBpbml0c1tdKSB7Cglwb2ludGVy
IGZyb250aWVyOwoJaW50IGk7CgoJYXNzZXJ0KGludmFyaWFudChzKSk7CgkKCWZyb250aWVyID0g
cy0+ZnJvbnRpZXI7CgkKCWZvcihpID0gMDsgaW5pdHNbaV0uc3RyICE9IE5VTEw7ICsraSkgewoJ
CXVpbnQgbnVtRWxlbWVudHMsIG51bUJ5dGVzOwoKCQludW1FbGVtZW50cyA9IGluaXRzW2ldLnNp
emU7CgkJbnVtQnl0ZXMgPSBHQ19BUlJBWV9IRUFERVJfU0laRQoJCQkrICgoMCA9PSBudW1FbGVt
ZW50cykgCgkJCQk/IFBPSU5URVJfU0laRSAKCQkJCTogd29yZEFsaWduKG51bUVsZW1lbnRzKSk7
CgoJCWlmIChmcm9udGllciArIG51bUJ5dGVzID49IHMtPmxpbWl0KQoJCQlkaWUoIlVuYWJsZSB0
byBhbGxvY2F0ZSBzdHJpbmcgY29uc3RhbnQgXCIlc1wiLiIsIGluaXRzW2ldLnN0cik7CgkKCQkq
KHdvcmQqKWZyb250aWVyID0gbnVtRWxlbWVudHM7CgkJKih3b3JkKikoZnJvbnRpZXIgKyBXT1JE
X1NJWkUpID0gU1RSSU5HX0hFQURFUjsKCQlzLT5nbG9iYWxzW2luaXRzW2ldLmdsb2JhbEluZGV4
XSA9IGZyb250aWVyICsgR0NfQVJSQVlfSEVBREVSX1NJWkU7CgkJewoJCQlpbnQgajsKCgkJCWZv
ciAoaiA9IDA7IGogPCBudW1FbGVtZW50czsgKytqKQoJCQkJKihmcm9udGllciArIEdDX0FSUkFZ
X0hFQURFUl9TSVpFICsgaikgCgkJCQkJPSBpbml0c1tpXS5zdHJbal07CgkJfQoJCWZyb250aWVy
ICs9IG51bUJ5dGVzOwoJfQoJcy0+ZnJvbnRpZXIgPSBmcm9udGllcjsKCglhc3NlcnQoaW52YXJp
YW50KHMpKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgICAgICBHQ19kb25lICAgICAgICAgICAgICAg
ICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gKi8KCnN0YXRpYyB2b2lkIGRpc3BsYXlVaW50KHN0cmluZyBuYW1lLCB1aW50IG4pIHsK
CWZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBuYW1lLCB1aW50VG9Db21tYVN0cmluZyhuKSk7
Cn0KCnN0YXRpYyB2b2lkIGRpc3BsYXlVbGxvbmcoc3RyaW5nIG5hbWUsIHVsbG9uZyBuKSB7Cglm
cHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgbmFtZSwgdWxsb25nVG9Db21tYVN0cmluZyhuKSk7
Cn0KCnZvaWQgR0NfZG9uZShHQ19zdGF0ZSAqcykgewoJbm9Mb2NhbHMocyk7Cglhc3NlcnQoaW52
YXJpYW50KHMpKTsKCXNtdW5tYXAocy0+c3RhY2tCb3R0b20sIHMtPnN0YWNrU2l6ZSk7CglzbXVu
bWFwKHMtPmJhc2UsIHMtPmZyb21TaXplKTsKCWlmIChzLT50b0Jhc2UgIT0gTlVMTCkgc211bm1h
cChzLT50b0Jhc2UsIHMtPnRvU2l6ZSk7CgoJaWYgKHMtPnN1bW1hcnkpIHsKCQlkb3VibGUgdGlt
ZTsKCgkJZGlzcGxheVVpbnQoInN0YWNrIHNpemUoYnl0ZXMpIiwgcy0+c3RhY2tTaXplKTsKCQlk
aXNwbGF5VWludCgibWF4IHNlbWlzcGFjZSBzaXplKGJ5dGVzKSIsIHMtPm1heEhlYXBTaXplU2Vl
bik7CgkJdGltZSA9IChkb3VibGUpKGN1cnJlbnRUaW1lKCkgLSBzLT5zdGFydFRpbWUpOwoJCWZw
cmludGYoc3RkZXJyLCAiR0MgdGltZShtcyk6ICVzICglLjFmJSUpXG4iLAoJCQlpbnRUb0NvbW1h
U3RyaW5nKHMtPmdjVGltZSksIAoJCQkoMC4wID09IHRpbWUpID8gMC4wIAoJCQk6IDEwMC4wICog
KChkb3VibGUpIHMtPmdjVGltZSkgLyB0aW1lKTsKCQlkaXNwbGF5VWludCgibnVtYmVyIG9mIEdD
cyIsIHMtPm51bUdDcyk7CgkJZGlzcGxheVVsbG9uZygiYnl0ZXMgYWxsb2NhdGVkIiwKCSAJCQlz
LT5ieXRlc0FsbG9jYXRlZCAKCQkJCSsgKHMtPmZyb250aWVyIC0gcy0+YmFzZSAtIHMtPmJ5dGVz
TGl2ZSkpOwoJCWRpc3BsYXlVbGxvbmcoImJ5dGVzIGNvcGllZCIsIHMtPmJ5dGVzQ29waWVkKTsK
CQlkaXNwbGF5VWludCgibWF4IGJ5dGVzIGxpdmUiLCBzLT5tYXhCeXRlc0xpdmUpOwoJfQkKfQoK
LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwov
KiAgICAgICAgICAgICAgICAgICBHQ19zYXZlV29ybGQgICAgICAgICAgICAgICAgICAgICovCi8q
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8q
IFRFUk1JTkFUT1IgaXMgdXNlZCB0byBzZXBhcmF0ZSB0aGUgaHVtYW4gcmVhZGFibGUgbWVzc2Fn
ZXMgYXQgdGhlIGJlZ2lubmluZwogKiBvZiB0aGUgd29ybGQgZmlsZSBmcm9tIHRoZSBtYWNoaW5l
IHJlYWRhYmxlIGRhdGEuCiAqLwojZGVmaW5lIFRFUk1JTkFUT1IgJ1wwMDAnCgp2b2lkIEdDX3Nh
dmVXb3JsZChHQ19zdGF0ZSAqcywgCgkJCXVpbnQgbWFnaWMsCgkJCXBvaW50ZXIgZmlsZU5hbWUs
CgkJCXZvaWQgKCpzYXZlR2xvYmFscykoRklMRSAqZmlsZSkpIHsKCUZJTEUgKmZpbGU7CgoJYXNz
ZXJ0KGludmFyaWFudChzKSk7CgoJLyogVGhlIHNvcGVuIG11c3QgaGFwcGVuIGJlZm9yZSB0aGUg
Z2MsIGJlY2F1c2UgdGhlIEdDIHdpbGwgaW52YWxpZGF0ZQogCSAqIHRoZSBmaWxlTmFtZSBwb2lu
dGVyLiAKCSAqLwojaWYgZGVmaW5lZChfV0lOMzIpCgkvLyBOTyEgTm90IHRoZSB3aW5kb3dzIHNo
YXJlZCBvcGVuIGZ1bmN0aW9uLi4uIAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBf
T19DUkVBVAoJLy9maWxlID0gc29wZW4oKGNoYXIqKWZpbGVOYW1lLCBfT19XUk9OTFksIF9TSF9E
RU5ZV1IpOwoJLy8gc29wZW4ganVzdCBzdGFuZHMgZm9yIHNhZmUgb3BlbiBoZXJlLi4uCglmaWxl
ID0gc2FmZW9wZW4oKGNoYXIqKWZpbGVOYW1lLCAidyIpOwojZWxzZQoJZmlsZSA9IHNvcGVuKChj
aGFyKilmaWxlTmFtZSwgInciKTsKI2VuZGlmCgoJLyogQ29tcGFjdCB0aGUgaGVhcCBpbnRvIGZy
b21TcGFjZSAqLwoJbm9Mb2NhbHMocyk7CglHQ19nYyhzKTsKCglmcHJpbnRmKGZpbGUsICJIZWFw
IGZpbGUgY3JlYXRlZCBieSBNTHRvbi5cbmJhc2UgPSAleFxuZnJvbnRpZXIgPSAleFxuc3RhY2tC
b3R0b20gPSAleFxuc3RhY2tUb3AgPSAleFxubWF4SGVhcFNpemUgPSAldVxuIiwgCgkJKHVpbnQp
cy0+YmFzZSwKCQkodWludClzLT5mcm9udGllciwKCQkodWludClzLT5zdGFja0JvdHRvbSwKCQko
dWludClzLT5zdGFja1RvcCwKCQlzLT5tYXhIZWFwU2l6ZSk7CgogCWZwdXRjKFRFUk1JTkFUT1Is
IGZpbGUpOwoKCXN3cml0ZVVpbnQobWFnaWMsIGZpbGUpOwoJc3dyaXRlVWludCgodWludClzLT5i
YXNlLCBmaWxlKTsKCXN3cml0ZVVpbnQoKHVpbnQpcy0+ZnJvbnRpZXIsIGZpbGUpOwoJc3dyaXRl
VWludCgodWludClzLT5zdGFja0JvdHRvbSwgZmlsZSk7Cglzd3JpdGVVaW50KCh1aW50KXMtPnN0
YWNrVG9wLCBmaWxlKTsKCXN3cml0ZVVpbnQocy0+ZXhuU3RhY2ssIGZpbGUpOwoJc3dyaXRlVWlu
dCgodWludClzLT51c2VGaXhlZEhlYXAsIGZpbGUpOwoJc3dyaXRlVWludChzLT5mcm9tU2l6ZSwg
ZmlsZSk7Cglzd3JpdGVVaW50KHMtPm1heEhlYXBTaXplLCBmaWxlKTsKCglzd3JpdGUocy0+c3Rh
Y2tCb3R0b20sIDEsCgkJcy0+c3RhY2tUb3AgLSBzLT5zdGFja0JvdHRvbSArIFdPUkRfU0laRSwK
CQlmaWxlKTsKIAlzd3JpdGUocy0+YmFzZSwgMSwgcy0+ZnJvbnRpZXIgLSBzLT5iYXNlLCBmaWxl
KTsKCSgqc2F2ZUdsb2JhbHMpKGZpbGUpOwoKCWZjbG9zZShmaWxlKTsKfQoKLyogLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAg
ICAgICAgICB0cmFuc2xhdGVIZWFwICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyBpbnQgdHJh
bnNsYXRlRGlyZWN0aW9uOwpzdGF0aWMgdWludCB0cmFuc2xhdGVEaWZmOwoKdm9pZCB0cmFuc2xh
dGVQb2ludGVyKEdDX3N0YXRlICpzLCBwb2ludGVyICpwKSB7CglpZiAoR0NfaXNQb2ludGVyKCpw
KSkgewoJCWlmICgxID09IHRyYW5zbGF0ZURpcmVjdGlvbikKCQkJKnAgKz0gdHJhbnNsYXRlRGlm
ZjsKCQllbHNlCgkJCSpwIC09IHRyYW5zbGF0ZURpZmY7Cgl9Cn0KCi8qIFRyYW5zbGF0ZSBhbGwg
cG9pbnRlcnMgdG8gdGhlIGhlYXAgZnJvbSB3aXRoaW4gdGhlIHN0YWNrIGFuZCB0aGUgaGVhcCBm
b3IKICogYSBoZWFwIHRoYXQgaGFzIG1vdmVkIGZyb20gcy0+YmFzZSA9PSBvbGQgdG8gcy0+YmFz
ZS4KICovCnZvaWQgdHJhbnNsYXRlSGVhcChHQ19zdGF0ZSAqcywgcG9pbnRlciBvbGQpIHsKCWlm
IChzLT5iYXNlID09IG9sZCkKCQlyZXR1cm47CgllbHNlIGlmIChzLT5iYXNlID4gb2xkKSB7CgkJ
dHJhbnNsYXRlRGlmZiA9IHMtPmJhc2UgLSBvbGQ7CgkJdHJhbnNsYXRlRGlyZWN0aW9uID0gMTsK
CX0gZWxzZSB7CgkJdHJhbnNsYXRlRGlmZiA9IG9sZCAtIHMtPmJhc2U7CgkJdHJhbnNsYXRlRGly
ZWN0aW9uID0gLTE7Cgl9CgoJLyogVHJhbnNsYXRlIGdsb2JhbHMuICovCgl7CgkJaW50IGk7CgkJ
Zm9yIChpID0gMDsgaSA8IHMtPm51bUdsb2JhbHM7ICsraSkKCQkJdHJhbnNsYXRlUG9pbnRlcihz
LCAmKHMtPmdsb2JhbHNbaV0pKTsKCX0KCgkvKiBUcmFuc2xhdGUgc3RhY2suICovCglmb3JlYWNo
UG9pbnRlckluU3RhY2socywgdHJhbnNsYXRlUG9pbnRlcik7CgoJLyogVHJhbnNsYXRlIGhlYXAu
ICovCglzLT5mcm9udCA9IHMtPmJhc2U7CglzLT5iYWNrID0gcy0+ZnJvbnRpZXI7Cglmb3JlYWNo
UG9pbnRlckluSGVhcChzLCB0cmFuc2xhdGVQb2ludGVyKTsKfQoKLyogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAg
ICBHQ19sb2FkV29ybGQgICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnZvaWQgR0NfbG9hZFdvcmxkKEdD
X3N0YXRlICpzLCAKCQkJdWludCBtYWdpYywKCQkJY2hhciAqZmlsZU5hbWUsCgkJCWJvb2wgaGVh
cFNpemVDb21tYW5kTGluZSwKCQkJdm9pZCAoKmxvYWRHbG9iYWxzKShGSUxFICpmaWxlKSkgewoJ
RklMRSAqZmlsZTsKCXVpbnQgaGVhcFNpemUsIGZyb21TaXplLCBtYXhIZWFwU2l6ZSwgbWFnaWMy
OwoJcG9pbnRlciBiYXNlLCBmcm9udGllciwgc3RhY2tCb3R0b207CiAJYm9vbCB1c2VGaXhlZEhl
YXA7CgljaGFyIGM7CgkKCWluaXRDb3VudGVycyhzKTsKCQojaWYgZGVmaW5lZChfV0lOMzIpCgkv
L2ZpbGUgPSBzb3BlbigoY2hhciopZmlsZU5hbWUsIF9PX1JET05MWSwgX1NIX0RFTllOTyk7Cglm
aWxlID0gc2FmZW9wZW4oKGNoYXIqKWZpbGVOYW1lLCAiciIpOwojZWxzZQoJZmlsZSA9IHNvcGVu
KChjaGFyKilmaWxlTmFtZSwgInIiKTsKI2VuZGlmCgkKCXVudGlsICgoYyA9IGZnZXRjKGZpbGUp
KSA9PSBURVJNSU5BVE9SIG9yIEVPRiA9PSBjKTsKCQoJaWYgKEVPRiA9PSBjKSBkaWUoIkludmFs
aWQgd29ybGQuIik7CgkKCW1hZ2ljMiA9IHNyZWFkVWludChmaWxlKTsKCXVubGVzcyAobWFnaWMg
PT0gbWFnaWMyKQoJCWRpZSgiSW52YWxpZCB3b3JsZDogd3JvbmcgbWFnaWMgbnVtYmVyLiIpOwoJ
YmFzZSA9IChwb2ludGVyKXNyZWFkVWludChmaWxlKTsKCWZyb250aWVyID0gKHBvaW50ZXIpc3Jl
YWRVaW50KGZpbGUpOwoJaGVhcFNpemUgPSBmcm9udGllciAtIGJhc2U7CglzLT5ieXRlc0xpdmUg
PSBoZWFwU2l6ZTsKCXN0YWNrQm90dG9tID0gKHBvaW50ZXIpc3JlYWRVaW50KGZpbGUpOwoJcy0+
c3RhY2tUb3AgPSAocG9pbnRlcilzcmVhZFVpbnQoZmlsZSk7CglzLT5leG5TdGFjayA9IHNyZWFk
VWludChmaWxlKTsKCXVzZUZpeGVkSGVhcCA9IChib29sKXNyZWFkVWludChmaWxlKTsKCWZyb21T
aXplID0gc3JlYWRVaW50KGZpbGUpOwogCW1heEhlYXBTaXplID0gc3JlYWRVaW50KGZpbGUpOwoK
CS8qIHNldCBzLT51c2VGaXhlZEhlYXAsIHMtPm1heEhlYXBTaXplLCBzLT5mcm9tU2l6ZSAqLwoJ
aWYgKGhlYXBTaXplQ29tbWFuZExpbmUpCgkgICAgICAgCXNldEhlYXBQYXJhbXMocywgaGVhcFNp
emUpOwoJZWxzZSB7CgkJcy0+dXNlRml4ZWRIZWFwID0gdXNlRml4ZWRIZWFwOwoJCWlmICh1c2VG
aXhlZEhlYXApCgkJCXMtPmZyb21TaXplID0gZnJvbVNpemU7CgkJZWxzZSB7CgkJCXMtPm1heEhl
YXBTaXplID0gbWF4SGVhcFNpemU7CgkJCXMtPmZyb21TaXplID0gY29tcHV0ZUhlYXBTaXplKHMs
IGhlYXBTaXplLCBzLT5saXZlUmF0aW8pOwoJCX0KCX0KCglub0xvY2FscyhzKTsKCgkvKiBBbGxv
Y2F0ZSBzdGFjay4gKi8KCXMtPnN0YWNrU2l6ZSA9IHJvdW5kUGFnZShzLT5zdGFja1RvcCAtIHN0
YWNrQm90dG9tKTsKCWFsbG9jYXRlU3RhY2socyk7CglzcmVhZChzLT5zdGFja0JvdHRvbSwgMSwK
CQkocy0+c3RhY2tUb3AgKyBXT1JEX1NJWkUpIC0gc3RhY2tCb3R0b20sCiAJCWZpbGUpOwoJdHJh
bnNsYXRlU3RhY2socywgc3RhY2tCb3R0b20pOwoKCS8qIEFsbG9jYXRlIGZyb21TcGFjZS4gKi8K
CXVubGVzcyAoaGVhcFNpemUgPD0gcy0+ZnJvbVNpemUpIAoJCWRpZSgiTm90IGVub3VnaCBzcGFj
ZSB0byBsb2FkIHdvcmxkLiIpOwoJZnJvbVNwYWNlKHMpOwoJc3JlYWQocy0+YmFzZSwgMSwgaGVh
cFNpemUsIGZpbGUpOwoJcy0+ZnJvbnRpZXIgPSBzLT5iYXNlICsgaGVhcFNpemU7CgoJKCpsb2Fk
R2xvYmFscykoZmlsZSk7CgkKCXVubGVzcyAoRU9GID09IGZnZXRjKGZpbGUpKQoJZGllKCJJbnZh
bGlkIHdvcmxkOiBqdW5rIGF0IGVuZCBvZiBmaWxlLiIpOwoJCglmY2xvc2UoZmlsZSk7CgoJLyog
VGhpcyBtdXN0IG9jY3VyIGFmdGVyIGxvYWRpbmcgdGhlIGhlYXAsIHN0YWNrLCBhbmQgZ2xvYmFs
cywgc2luY2UgaXQKCSAqIGNoYW5nZXMgcG9pbnRlcnMgaW4gYWxsIG9mIHRoZW0uCgkgKi8KCXRy
YW5zbGF0ZUhlYXAocywgYmFzZSk7CgoJLyogQWxsb2NhdGUgdG9TcGFjZS4gIFdlIGF0IGxlYXNl
IG11c3QgZG8gdGhpcyBpZiBzLT51c2VGaXhlZEhlYXAuICovCglzLT50b1NpemUgPSBzLT5mcm9t
U2l6ZTsKCXRvU3BhY2Uocyk7CgoJYXNzZXJ0KGludmFyaWFudChzKSk7Cn0KCi8qIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAg
ICAgICAgICAgICBzYXZlU3RhY2sgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiBSZXR1cm5zIGEg
cG9pbnRlciB0byB0aGUgY29udCBvYmplY3QuICovCnBvaW50ZXIgR0Nfc2F2ZVN0YWNrKEdDX3N0
YXRlICpzKSB7Cglwb2ludGVyIGZyb250LCByZXN1bHQ7Cgl1aW50IHNpemU7CgoJc2l6ZSA9IHMt
PnN0YWNrVG9wICsgV09SRF9TSVpFIC0gcy0+c3RhY2tCb3R0b207CgoJLyogRW5zdXJlIGVub3Vn
aCBzcGFjZSBpbiBoZWFwIHRvIHNhdmUgdGhlIHN0YWNrLiAqLwoJcy0+Ynl0ZXNSZXF1ZXN0ZWQg
PSAzICogV09SRF9TSVpFICsgc2l6ZTsKCWlmIChzLT5mcm9udGllciArIHMtPmJ5dGVzUmVxdWVz
dGVkID49IHMtPmxpbWl0KSB7CgkJcy0+bG9jYWxPZmZzZXRzID0gZW1wdHlfR0Nfb2Zmc2V0czsK
CQlHQ19nYyhzKTsKCX0KCglmcm9udCA9IHMtPmZyb250aWVyOwoJKih1aW50Kilmcm9udCA9IENP
TlRfSEVBREVSOwoJZnJvbnQgKz0gV09SRF9TSVpFOwoJcmVzdWx0ID0gZnJvbnQ7CgkqKHVpbnQq
KWZyb250ID0gc2l6ZTsKCWZyb250ICs9IFdPUkRfU0laRTsKCSoodWludCopZnJvbnQgPSBzLT5l
eG5TdGFjazsKCWZyb250ICs9IFdPUkRfU0laRTsKCW1lbWNweShmcm9udCwgcy0+c3RhY2tCb3R0
b20sIHNpemUpOwoJcy0+ZnJvbnRpZXIgPSBmcm9udCArIHNpemU7CgoJcmV0dXJuIHJlc3VsdDsK
fQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAq
LwovKiAgICAgICAgICAgICAgICAgICAgcmVzdG9yZVN0YWNrICAgICAgICAgICAgICAgICAgICov
Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8K
CnZvaWQgR0NfcmVzdG9yZVN0YWNrKEdDX3N0YXRlICpzLCBwb2ludGVyIHApIHsKCXVpbnQgc2l6
ZTsKCglzaXplID0gKih1aW50KilwOwoJcy0+ZXhuU3RhY2sgPSAqKHVpbnQqKShwICsgV09SRF9T
SVpFKTsKCglzbXVubWFwKHMtPnN0YWNrQm90dG9tLCBzLT5zdGFja1NpemUpOwoJcy0+c3RhY2tT
aXplID0gcm91bmRQYWdlKHNpemUpOwoJYWxsb2NhdGVTdGFjayhzKTsKCXMtPnN0YWNrVG9wID0g
cy0+c3RhY2tCb3R0b20gKyBzaXplIC0gV09SRF9TSVpFOwoJbWVtY3B5KHMtPnN0YWNrQm90dG9t
LCBwICsgMiAqIFdPUkRfU0laRSwgc2l6ZSk7Cn0K

--------------B09E363249B4ED416AC29157--