If I increase the size of the LRU in NWFS to a size above 3000 buffers,
Linux starts getting SLOWER .... SLOOOWWWWWWERRRR......
SLOOOOOOOWWWWWWEEEERR ..... which is counter intuitive since more cache
should get faster performance. The performance degredation as I
increase the LRU in size is @ log2N, which would seem to indicate that
somewhere down inside of linux, as some linked lists start getting
longer, Linux really bogs down and exhibits asymtopic behavior.
The code we are testing IS NOT the nwfs0331.zip post with the brute
force AIO routine in async.c, but an improved version that allows very
rapid inserts (it combines an extensible double hash for the disk bins,
we never probe deeper than two levels to locate an insertion point in
the AIO elevator).
This would indicate that Linux cannot handle large numbers of AIO
requests at one time (right now the AIO process will flush up to 3000
requests in one pass). When I crank this number back to under 500 AIO's
at one time, then linux performance gets really good.
This would seem to indicate some bottlenecks for handling large numbers
of AIO requests at once. The code causing this is attached. Block.c
and ASYNC.C.
I will post the updated 2.2.15 release tommorrow with the fix for Steve
Hirsch and all the other problems folks have found in the past few
weeks, and the 2.4 page cache stuff. We have also increased the disk
support to 128 SCSI disks, 128 I2O disk, all the ATA Parallel Port Stuff
and up to 10 IDE interfaces (implemented all the max values in
devices.txt). We also have the gendisk stuff in for 2.4, 2.2, and 2.0
and it works great. Thanks to Stephen Tweedie.
:-)
Was seeing this problem and at first glance, thought it was ours, but it
is not.
Jeff Merkey
CEO, TRG
--------------F244F05E832D2DC45A9F06F1
Content-Type: application/x-unknown-content-type-cfile;
name="Async.c"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="Async.c"
DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqDQoqDQoqICAgQ29weXJpZ2h0IChjKSAxOTk4LCAx
OTk5IFRpbXBhbm9nYXMgUmVzZWFyY2ggR3JvdXAsIEluYy4NCiogICA4OTUgV2VzdCBDZW50
ZXIgU3RyZWV0DQoqICAgT3JlbSwgVXRhaCAgODQwNTcNCiogICBqbWVya2V5QHRpbXBhbm9n
YXMuY29tDQoqDQoqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQNCiogICB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUN
CiogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiwgb3IgYW55IGxhdGVy
IHZlcnNpb24uDQoqDQoqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dA0KKiAgIFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiogICBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
IEdOVQ0KKiAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCioN
CiogICBZb3UgYXJlIGZyZWUgdG8gbW9kaWZ5IGFuZCByZS1kaXN0cmlidXRlIHRoaXMgcHJv
Z3JhbSBpbiBhY2NvcmRhbmNlDQoqICAgd2l0aCB0aGUgdGVybXMgc3BlY2lmaWVkIGluIHRo
ZSBHTlUgUHVibGljIExpY2Vuc2UuICBUaGUgY29weXJpZ2h0DQoqICAgY29udGFpbmVkIGlu
IHRoaXMgY29kZSBpcyByZXF1aXJlZCB0byBiZSBwcmVzZW50IGluIGFueSBkZXJpdmF0aXZl
DQoqICAgd29ya3MgYW5kIHlvdSBhcmUgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGUgc291cmNl
IGNvZGUgZm9yIHRoaXMNCiogICBwcm9ncmFtIGFzIHBhcnQgb2YgYW55IGNvbW1lcmNpYWwg
b3Igbm9uLWNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uLg0KKiAgIFlvdSBhcmUgcmVxdWlyZWQg
dG8gcmVzcGVjdCB0aGUgcmlnaHRzIG9mIHRoZSBDb3B5cmlnaHQgaG9sZGVycw0KKiAgIG5h
bWVkIHdpdGhpbiB0aGlzIGNvZGUuDQoqDQoqICAgam1lcmtleUB0aW1wYW5vZ2FzLmNvbSBh
bmQgVFJHLCBJbmMuIGFyZSB0aGUgb2ZmaWNpYWwgbWFpbnRhaW5lcnMgb2YNCiogICB0aGlz
IGNvZGUuICBZb3UgYXJlIGVuY291cmFnZWQgdG8gcmVwb3J0IGFueSBidWdzLCBwcm9ibGVt
cywgZml4ZXMsDQoqICAgc3VnZ2VzdGlvbnMsIGFuZCBjb21tZW50cyBhYm91dCB0aGlzIHNv
ZnR3YXJlIHRvIGptZXJrZXlAdGltcGFub2dhcy5jb20NCiogICBvciBsaW51eC1rZXJuZWxA
dmdlci5ydXRnZXJzLmVkdS4gIE5ldyByZWxlYXNlcywgcGF0Y2hlcywgYnVnIGZpeGVzLCBh
bmQNCiogICB0ZWNobmljYWwgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQgYXQgd3d3LnRp
bXBhbm9nYXMuY29tLiAgVFJHIHdpbGwNCiogICBwZXJpb2RpY2FsbHkgcG9zdCBuZXcgcmVs
ZWFzZXMgb2YgdGhpcyBzb2Z0d2FyZSB0byB3d3cudGltcGFub2dhcy5jb20NCiogICB0aGF0
IGNvbnRhaW4gYnVnIGZpeGVzIGFuZCBlbmhhbmNlZCBjYXBhYmlsaXRpZXMuDQoqDQoqICAg
T3JpZ2luYWwgQXV0aG9yc2hpcCAgICAgIDoNCiogICAgICBzb3VyY2UgY29kZSB3cml0dGVu
IGJ5IEplZmYgVi4gTWVya2V5LCBUUkcsIEluYy4NCioNCiogICBPcmlnaW5hbCBDb250cmli
dXRvcnMgICAgOg0KKiAgICAgIEplZmYgVi4gTWVya2V5LCBUUkcsIEluYy4NCiogICAgICBE
YXJyZW4gTWFqb3IsIFRSRywgSW5jLg0KKiAgICAgIEFsYW4gQ294LCBSZWRIYXQgU29mdHdh
cmUsIEluYy4NCioNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCioNCioNCiogICBBVVRIT1Ig
ICA6ICBKZWZmIFYuIE1lcmtleSAoam1lcmtleUB0aW1wYW5vZ2FzLmNvbSkNCiogICBGSUxF
ICAgICA6ICBBU1lOQy5DDQoqICAgREVTQ1JJUCAgOiAgRkVOUklTIEFzeW5jaCBJTyBMaWJy
YXJ5DQoqICAgREFURSAgICAgOiAgSnVseSAxMywgMjAwMCAobXkgYmlydGhkYXkpDQoqDQoq
DQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpbmNsdWRlICJnbG9iYWxzLmgiDQoNCi8v
IFdlIHVzZSBlaWdodCAoOCkgcHJvY2Vzc2VzIGZvciB0aGUgYXN5bmMgaW8gbWFuYWdlci4g
IEVhY2ggZGlzayBiaW4NCi8vIGlzIGNvbXB1dGVkIGFzIGRpc2sgJSA4IGFuZCBtYXRjaGVk
IGludG8gb25lIG9mIGVpZ2h0IGJpbiBncm91cHMuDQovLyBPbiBTTVAgdmVyc2lvbnMgb2Yg
bGludXgsIHRoaXMgc2hvdWxkIGFsbG93IHVzIHRvIGtlZXAgYXMgbWFueQ0KLy8gZHJpdmUg
c3BpbmRsZXMgYWN0aXZlIGFzIHBvc3NpYmxlIGF0IG9uZSB0aW1lIHdpdGhvdXQgZWF0aW5n
IHRvbw0KLy8gbWFueSBzZXJ2ZXIgcHJvY2Vzc2VzIHRvIGRvIHRoaXMsIHByb3ZpZGVkIHRo
ZSBsaW51eCBrZXJuZWwNCi8vIGxvYWQgYmFsYW5jZXMgdGhlc2UgcHJvY2Vzc2VzIGFjcm9z
cyBwcm9jZXNzb3JzLg0KDQpBU1lOQ0hfSU8gKmRpc2tfaW9faGVhZFs4XSA9IHsgMCwgMCwg
MCwgMCwgMCwgMCwgMCB9Ow0KQVNZTkNIX0lPICpkaXNrX2lvX3RhaWxbOF0gPSB7IDAsIDAs
IDAsIDAsIDAsIDAsIDAgfTsNCkFTWU5DSF9JT19IRUFEIGFzeW5jaF9pb19oZWFkW01BWF9E
SVNLU107DQoNCiNpZiAoUFJPRklMRV9BSU8pDQpVTE9ORyBoYXNoX2hpdHMgPSAwOw0KVUxP
TkcgaGFzaF9taXNzZXMgPSAwOw0KVUxPTkcgaGFzaF9maWxsID0gMDsNClVMT05HIGhhc2hf
dG90YWwgPSAwOw0KVUxPTkcgcHJvYmVfYXZnID0gMDsNClVMT05HIHByb2JlX21heCA9IDA7
DQojZW5kaWYNCg0KI2lmIChMSU5VWF9TTEVFUCkNCg0KTldGU0luaXRNdXRleChkaXNrX2lv
X3NlbTApOw0KTldGU0luaXRNdXRleChkaXNrX2lvX3NlbTEpOw0KTldGU0luaXRNdXRleChk
aXNrX2lvX3NlbTIpOw0KTldGU0luaXRNdXRleChkaXNrX2lvX3NlbTMpOw0KTldGU0luaXRN
dXRleChkaXNrX2lvX3NlbTQpOw0KTldGU0luaXRNdXRleChkaXNrX2lvX3NlbTUpOw0KTldG
U0luaXRNdXRleChkaXNrX2lvX3NlbTYpOw0KTldGU0luaXRNdXRleChkaXNrX2lvX3NlbTcp
Ow0KTldGU0luaXRNdXRleChhc3luY2hfaGVhZF9sb2NrKTsNCg0Kc3RydWN0IHNlbWFwaG9y
ZSAqaW9fc2VtX3RhYmxlWzhdPXsNCiAgICAmZGlza19pb19zZW0wLCAmZGlza19pb19zZW0x
LCAmZGlza19pb19zZW0yLCAmZGlza19pb19zZW0zLA0KICAgICZkaXNrX2lvX3NlbTQsICZk
aXNrX2lvX3NlbTUsICZkaXNrX2lvX3NlbTYsICZkaXNrX2lvX3NlbTcNCn07DQoNCiNlbmRp
Zg0KDQpleHRlcm4gdm9pZCBSdW5Bc3luY2hJT1F1ZXVlKFVMT05HIGRpc2spOw0KDQp2b2lk
IGFzeW5jaF9sb2NrKHZvaWQpDQp7DQojaWYgKExJTlVYX1NMRUVQKQ0KICAgIGlmIChXYWl0
T25TZW1hcGhvcmUoJmFzeW5jaF9oZWFkX2xvY2spID09IC1FSU5UUikNCiAgICAgICBOV0ZT
UHJpbnQoImFzeW5jaCBsb2NrIHdhcyBpbnRlcnJ1cHRlZFxuIik7DQojZW5kaWYNCn0NCg0K
dm9pZCBhc3luY2hfdW5sb2NrKHZvaWQpDQp7DQojaWYgKExJTlVYX1NMRUVQKQ0KICAgIFNp
Z25hbFNlbWFwaG9yZSgmYXN5bmNoX2hlYWRfbG9jayk7DQojZW5kaWYNCn0NCg0KVUxPTkcg
aGFzaF9kaXNrX2lvKEFTWU5DSF9JTyAqaW8pDQp7DQogICAgcmVnaXN0ZXIgaW50IGkgPSAo
aW8tPmRpc2sgJSBNQVhfRElTS1MpOw0KICAgIHJlZ2lzdGVyIGludCBqID0gKChpby0+c2Vj
dG9yX29mZnNldCA+PiA4KSAmIDB4Rik7DQogICAgQVNZTkNIX0lPICpvbGQsICpwOw0KDQog
ICAgaWYgKCFhc3luY2hfaW9faGVhZFtpXS5oYXNoX2hlYWRbal0pDQogICAgew0KICAgICAg
IGlvLT5obmV4dCA9IGlvLT5ocHJpb3IgPSBOVUxMOw0KICAgICAgIGFzeW5jaF9pb19oZWFk
W2ldLmhhc2hfaGVhZFtqXSA9IGlvOw0KICAgICAgIGFzeW5jaF9pb19oZWFkW2ldLmhhc2hf
dGFpbFtqXSA9IGlvOw0KICAgICAgIHJldHVybiAwOw0KICAgIH0NCg0KICAgIHAgPSBhc3lu
Y2hfaW9faGVhZFtpXS5oYXNoX2hlYWRbal07DQogICAgb2xkID0gTlVMTDsNCiAgICB3aGls
ZSAocCkNCiAgICB7DQogICAgICAgaWYgKHAtPmRpc2sgIT0gaW8tPmRpc2spDQogICAgICAg
ew0KICAgICAgICAgIE5XRlNQcmludCgibndmczogIGlvIHJlcXVlc3QgaGFzIGJhZCBkaXNr
IGlkICglZC8lZClcbiIsDQogICAgICAgICAgICAgICAgICAgIChpbnQpcC0+ZGlzaywgKGlu
dClpby0+ZGlzayk7DQogICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgIH0NCg0KICAgICAg
IGlmIChwLT5zZWN0b3Jfb2Zmc2V0IDwgaW8tPnNlY3Rvcl9vZmZzZXQpDQogICAgICAgew0K
CSAgb2xkID0gcDsNCgkgIHAgPSBwLT5obmV4dDsNCiAgICAgICB9DQogICAgICAgZWxzZQ0K
ICAgICAgIHsNCgkgIGlmIChwLT5ocHJpb3IpDQoJICB7DQoJICAgICBwLT5ocHJpb3ItPmhu
ZXh0ID0gaW87DQoJICAgICBpby0+aG5leHQgPSBwOw0KCSAgICAgaW8tPmhwcmlvciA9IHAt
PmhwcmlvcjsNCgkgICAgIHAtPmhwcmlvciA9IGlvOw0KCSAgICAgcmV0dXJuIDA7DQoJICB9
DQoJICBpby0+aG5leHQgPSBwOw0KCSAgaW8tPmhwcmlvciA9IE5VTEw7DQoJICBwLT5ocHJp
b3IgPSBpbzsNCgkgIGFzeW5jaF9pb19oZWFkW2ldLmhhc2hfaGVhZFtqXSA9IGlvOw0KCSAg
cmV0dXJuIDA7DQogICAgICAgfQ0KICAgIH0NCiAgICBvbGQtPmhuZXh0ID0gaW87DQogICAg
aW8tPmhuZXh0ID0gTlVMTDsNCiAgICBpby0+aHByaW9yID0gb2xkOw0KICAgIGFzeW5jaF9p
b19oZWFkW2ldLmhhc2hfdGFpbFtqXSA9IGlvOw0KICAgIHJldHVybiAwOw0KfQ0KDQpVTE9O
RyB1bmhhc2hfZGlza19pbyhBU1lOQ0hfSU8gKmlvKQ0Kew0KICAgIHJlZ2lzdGVyIGludCBp
ID0gKGlvLT5kaXNrICUgTUFYX0RJU0tTKTsNCiAgICByZWdpc3RlciBpbnQgaiA9ICgoaW8t
PnNlY3Rvcl9vZmZzZXQgPj4gOCkgJiAweEYpOw0KDQogICAgaWYgKGFzeW5jaF9pb19oZWFk
W2ldLmhhc2hfaGVhZFtqXSA9PSBpbykNCiAgICB7DQogICAgICAgYXN5bmNoX2lvX2hlYWRb
aV0uaGFzaF9oZWFkW2pdID0gKHZvaWQgKikgaW8tPmhuZXh0Ow0KICAgICAgIGlmIChhc3lu
Y2hfaW9faGVhZFtpXS5oYXNoX2hlYWRbal0pDQoJICBhc3luY2hfaW9faGVhZFtpXS5oYXNo
X2hlYWRbal0tPmhwcmlvciA9IE5VTEw7DQogICAgICAgZWxzZQ0KCSAgYXN5bmNoX2lvX2hl
YWRbaV0uaGFzaF90YWlsW2pdID0gTlVMTDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAg
ICAgICBpby0+aHByaW9yLT5obmV4dCA9IGlvLT5obmV4dDsNCiAgICAgICBpZiAoaW8gIT0g
YXN5bmNoX2lvX2hlYWRbaV0uaGFzaF90YWlsW2pdKQ0KCSAgaW8tPmhuZXh0LT5ocHJpb3Ig
PSBpby0+aHByaW9yOw0KICAgICAgIGVsc2UNCgkgIGFzeW5jaF9pb19oZWFkW2ldLmhhc2hf
dGFpbFtqXSA9IGlvLT5ocHJpb3I7DQogICAgfQ0KICAgIGlvLT5obmV4dCA9IGlvLT5ocHJp
b3IgPSAwOw0KDQogICAgcmV0dXJuIDA7DQp9DQoNCnZvaWQgbG9ja19pbyhVTE9ORyBkaXNr
KQ0Kew0KI2lmIChMSU5VWF9TTEVFUCkNCiAgICBpZiAoV2FpdE9uU2VtYXBob3JlKGlvX3Nl
bV90YWJsZVsoZGlzayAlIDgpXSkgPT0gLUVJTlRSKQ0KICAgICAgIE5XRlNQcmludCgibG9j
ayBpbyB3YXMgaW50ZXJydXB0ZWRcbiIpOw0KI2VuZGlmDQp9DQoNCnZvaWQgdW5sb2NrX2lv
KFVMT05HIGRpc2spDQp7DQojaWYgKExJTlVYX1NMRUVQKQ0KICAgIFNpZ25hbFNlbWFwaG9y
ZShpb19zZW1fdGFibGVbKGRpc2sgJSA4KV0pOw0KI2VuZGlmDQp9DQoNCnZvaWQgcHJvY2Vz
c19hc3luY2hfaW8oVUxPTkcgZGlzaykNCnsNCiAgIHJlZ2lzdGVyIGludCBpID0gKGRpc2sg
JSA4KTsNCiAgIHJlZ2lzdGVyIGludCByLCBqOw0KICAgQVNZTkNIX0lPICpsaXN0LCAqaW87
DQoNCiAgIC8vIGNvbnRpbnVlIHRvIGN5Y2xlIHRocm91Z2ggdGhpcyBsaXN0IHVudGlsIHdl
IGhhdmUgY29tcGxldGVseQ0KICAgLy8gZW1wdGllZCB0aGUgbGlzdC4NCg0KICAgd2hpbGUg
KGRpc2tfaW9faGVhZFtpXSkNCiAgIHsNCiAgICAgIC8vIHRha2UgdGhlIGVudGlyZSBsaXN0
LCB6ZXJvIHRoZSBoZWFkIGFuZCB0YWlsIGFuZCBwcm9jZXNzIHRoZSBsaXN0DQogICAgICAv
LyBmcm9tIHRoaXMgY29udGV4dC4gIHRoaXMgd2lsbCBzaW11bGF0ZSBhbiBhbHRlcm5hdGlu
ZyBBIGFuZCBCIGxpc3QNCiAgICAgIC8vIGFuZCBhdm9pZCBlbGV2YXRvciBzdGFydmF0aW9u
LiAgV2UgYWxzbyBuZWVkIHRvIGNsZWFyIGFsbCB0aGUNCiAgICAgIC8vIGFzeW5jaCBoYXNo
IGxpc3QgaW5mbyBmb3IgdGhpcyBydW4gc28gZm9sa3MgZG9uJ3QgYXR0ZW1wdCB0bw0KICAg
ICAgLy8gbGluayBuZXcgYWlvIHJlcXVlc3RzIHRvIHRoaXMgYWN0aXZlIGFpbyBjaGFpbi4N
Cg0KICAgICAgYXN5bmNoX2xvY2soKTsNCiAgICAgIGxpc3QgPSBkaXNrX2lvX2hlYWRbaV07
DQogICAgICBkaXNrX2lvX2hlYWRbaV0gPSBkaXNrX2lvX3RhaWxbaV0gPSAwOw0KICAgICAg
Zm9yIChyPTA7IHIgPCBNQVhfRElTS1M7IHIrKykNCiAgICAgIHsNCiAgICAgICAgIGlmICgo
ciAlIDgpID09IGkpDQogICAgICAgICB7DQogICAgICAgICAgICBmb3IgKGo9MDsgaiA8IDE2
OyBqKyspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICBhc3luY2hfaW9faGVhZFty
XS5oYXNoX2hlYWRbal0gPSAwOw0KICAgICAgICAgICAgICAgYXN5bmNoX2lvX2hlYWRbcl0u
aGFzaF90YWlsW2pdID0gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgIH0NCiAgICAgIH0N
Cg0KI2lmIChQUk9GSUxFX0FJTykNCiAgICAgIGlmIChoYXNoX2hpdHMgfHwgaGFzaF9taXNz
ZXMpDQogICAgICB7DQogICAgICAgICBpZiAoaGFzaF90b3RhbCkNCiAgICAgICAgICAgIHBy
b2JlX2F2ZyA9IChwcm9iZV9hdmcgLyBoYXNoX3RvdGFsKTsNCiAgICAgICAgIGVsc2UNCiAg
ICAgICAgICAgIHByb2JlX2F2ZyA9IDA7DQoNCiAgICAgICAgIC8vIHdlIHNlZW0gdG8gYXZl
cmFnZSA5NiUgaGl0IGVmZmljaWVuY3kgZm9yIGxvY2F0aW5nIGFuIGluc2VydGlvbg0KCSAv
LyBwb2ludCBpbiB0aGUgYWlvIGxpc3Qgd2l0aCBhbiBhdmVyYWdlIG9mIDEgcHJvYmUgcGVy
IGluc2VydC4gIFRoZQ0KICAgICAgICAgLy8gb3RoZXIgNCUgaW52b2x2ZSBjYXNlcyB3aGVy
ZSBhIHNpbmdsZSBlbGVtZW50IGlzIG9uIHRoZSBsaXN0LA0KICAgICAgICAgLy8gYW5kIHdl
IG9ubHkgcHJvYmUgMSB0aW1lIHRvIGZpbmQgb3VyIGluc2VydCBwb2ludC4NCg0KICAgICAg
ICAgTldGU1ByaW50KCJoaXRzLSVkIG1pc3Nlcy0lZCBmaWxsLSVkIHRvdGFsLSVkIHByb2Jl
X2F2Zy0lZCBwcm9iZV9tYXgtJWRcbiIsDQoJICAgICAgICAgICAoaW50KWhhc2hfaGl0cywg
KGludCloYXNoX21pc3NlcywgKGludCloYXNoX2ZpbGwsDQoJCSAgIChpbnQpaGFzaF90b3Rh
bCwgKGludClwcm9iZV9hdmcsIChpbnQpcHJvYmVfbWF4KTsNCiAgICAgIH0NCiAgICAgIGhh
c2hfaGl0cyA9IGhhc2hfbWlzc2VzID0gaGFzaF9maWxsID0gaGFzaF90b3RhbCA9IHByb2Jl
X2F2ZyA9IHByb2JlX21heCA9IDA7DQojZW5kaWYNCiAgICAgIGFzeW5jaF91bmxvY2soKTsN
Cg0KICAgICAgd2hpbGUgKGxpc3QpDQogICAgICB7DQogICAgICAgICBpbyA9IGxpc3Q7DQog
ICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsNCiAgICAgICAgIGlvLT5uZXh0ID0gaW8tPnBy
aW9yID0gMDsNCg0KCSBpZiAoaW8tPnNpZ25hdHVyZSAhPSBBU0lPX1NVQk1JVF9JTykNCiAg
ICAgICAgIHsNCiAgICAgICAgICAgIE5XRlNQcmludCgibndmczogIGFzeW5jaCBpbyBwcm9j
ZXNzIC0gYmFkIGlvIHJlcXVlc3QgY21kLSVYIHMtJVhcbiIsDQoJICAgICAgICAgICAgICAo
dW5zaWduZWQpaW8tPmNvbW1hbmQsICh1bnNpZ25lZClpby0+c2lnbmF0dXJlKTsNCiAgICAg
ICAgICAgIGlvLT5jY29kZSA9IEFTSU9fQkFEX1NJR05BVFVSRTsNCiAgICAgICAgICAgIGlm
IChpby0+Y2FsbF9iYWNrX3JvdXRpbmUpDQogICAgICAgICAgICAgICAoaW8tPmNhbGxfYmFj
a19yb3V0aW5lKShpbyk7DQogICAgICAgICAgICBpby0+c2lnbmF0dXJlID0gMDsNCiAgICAg
ICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgfQ0KDQogICAgICAgICBzd2l0Y2ggKGlvLT5j
b21tYW5kKQ0KICAgICAgICAgew0KICAgICAgICAgICAgY2FzZSBBU1lOQ0hfUkVBRDoNCiAg
ICAgICAgICAgICAgIGlvLT5yZXR1cm5fY29kZSA9IHBSZWFkRGlza1NlY3RvcnMoaW8tPmRp
c2ssDQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPnNl
Y3Rvcl9vZmZzZXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGlvLT5idWZmZXIsDQoJCQkJCQkgIGlvLT5zZWN0b3JfY291bnQsDQoJCQkJ
ICAgICAgICAgICAgICAgICAgaW8tPnNlY3Rvcl9jb3VudCk7DQogICAgICAgICAgICAgICBp
by0+Y2NvZGUgPSAwOw0KCSAgICAgICBpZiAoIWlvLT5yZXR1cm5fY29kZSkNCiAgICAgICAg
ICAgICAgICAgIGlvLT5jY29kZSA9IEFTSU9fSU9fRVJST1I7DQogICAgICAgICAgICAgICBp
ZiAoaW8tPmNhbGxfYmFja19yb3V0aW5lKQ0KICAgICAgICAgICAgICAgICAgKGlvLT5jYWxs
X2JhY2tfcm91dGluZSkoaW8pOw0KICAgICAgICAgICAgICAgaW8tPnNpZ25hdHVyZSA9IDA7
DQogICAgICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgY2FzZSBBU1lOQ0hfV1JJ
VEU6DQogICAgICAgICAgICAgICBpby0+cmV0dXJuX2NvZGUgPSBwV3JpdGVEaXNrU2VjdG9y
cyhpby0+ZGlzaywNCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaW8tPnNlY3Rvcl9vZmZzZXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpby0+YnVmZmVyLA0KCQkJCQkJICAgaW8tPnNlY3Rvcl9j
b3VudCwNCgkJCQkgICAgICAgICAgICAgICAgICAgaW8tPnNlY3Rvcl9jb3VudCk7DQogICAg
ICAgICAgICAgICBpby0+Y2NvZGUgPSAwOw0KICAgICAgICAgICAgICAgaWYgKCFpby0+cmV0
dXJuX2NvZGUpDQogICAgICAgICAgICAgICAgICBpby0+Y2NvZGUgPSBBU0lPX0lPX0VSUk9S
Ow0KICAgICAgICAgICAgICAgaWYgKGlvLT5jYWxsX2JhY2tfcm91dGluZSkNCiAgICAgICAg
ICAgICAgICAgIChpby0+Y2FsbF9iYWNrX3JvdXRpbmUpKGlvKTsNCiAgICAgICAgICAgICAg
IGlvLT5zaWduYXR1cmUgPSAwOw0KICAgICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAg
ICAgIGNhc2UgQVNZTkNIX0ZJTEw6DQogICAgICAgICAgICAgICBpby0+cmV0dXJuX2NvZGUg
PSBwWmVyb0ZpbGxEaXNrU2VjdG9ycyhpby0+ZGlzaywNCgkgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPnNlY3Rvcl9vZmZzZXQsDQoJCQkJCQkg
ICAgICBpby0+c2VjdG9yX2NvdW50LA0KCQkJCSAgICAgICAgICAgICAgICAgICAgICBpby0+
c2VjdG9yX2NvdW50KTsNCiAgICAgICAgICAgICAgIGlvLT5jY29kZSA9IDA7DQogICAgICAg
ICAgICAgICBpZiAoIWlvLT5yZXR1cm5fY29kZSkNCiAgICAgICAgICAgICAgICAgIGlvLT5j
Y29kZSA9IEFTSU9fSU9fRVJST1I7DQogICAgICAgICAgICAgICBpZiAoaW8tPmNhbGxfYmFj
a19yb3V0aW5lKQ0KICAgICAgICAgICAgICAgICAgKGlvLT5jYWxsX2JhY2tfcm91dGluZSko
aW8pOw0KICAgICAgICAgICAgICAgaW8tPnNpZ25hdHVyZSA9IDA7DQogICAgICAgICAgICAg
ICBicmVhazsNCg0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgIGlvLT5j
Y29kZSA9IEFTSU9fQkFEX0NPTU1BTkQ7DQogICAgICAgICAgICAgICBpZiAoaW8tPmNhbGxf
YmFja19yb3V0aW5lKQ0KICAgICAgICAgICAgICAgICAgKGlvLT5jYWxsX2JhY2tfcm91dGlu
ZSkoaW8pOw0KICAgICAgICAgICAgICAgaW8tPnNpZ25hdHVyZSA9IDA7DQogICAgICAgICAg
ICAgICBicmVhazsNCgkgfQ0KICAgICAgfQ0KICAgfQ0KICAgcmV0dXJuOw0KfQ0KDQpVTE9O
RyBhc3luY2hfaW9fcGVuZGluZyhVTE9ORyBkaXNrKQ0Kew0KICAgcmV0dXJuICgoZGlza19p
b19oZWFkWyhkaXNrICUgOCldKSA/IDEgOiAwKTsNCn0NCg0KQVNZTkNIX0lPICpyZW1vdmVf
aW8oVUxPTkcgZGlzaywgQVNZTkNIX0lPICppbykNCnsNCiAgICByZWdpc3RlciBpbnQgaSA9
IChkaXNrICUgOCk7DQoNCiAgICBpZiAoZGlza19pb19oZWFkW2ldID09IGlvKQ0KICAgIHsN
CiAgICAgICBkaXNrX2lvX2hlYWRbaV0gPSAodm9pZCAqKSBpby0+bmV4dDsNCiAgICAgICBp
ZiAoZGlza19pb19oZWFkW2ldKQ0KCSAgZGlza19pb19oZWFkW2ldLT5wcmlvciA9IE5VTEw7
DQogICAgICAgZWxzZQ0KCSAgZGlza19pb190YWlsW2ldID0gTlVMTDsNCiAgICB9DQogICAg
ZWxzZQ0KICAgIHsNCiAgICAgICBpby0+cHJpb3ItPm5leHQgPSBpby0+bmV4dDsNCiAgICAg
ICBpZiAoaW8gIT0gZGlza19pb190YWlsW2ldKQ0KCSAgaW8tPm5leHQtPnByaW9yID0gaW8t
PnByaW9yOw0KICAgICAgIGVsc2UNCgkgIGRpc2tfaW9fdGFpbFtpXSA9IGlvLT5wcmlvcjsN
CiAgICB9DQogICAgaW8tPm5leHQgPSBpby0+cHJpb3IgPSAwOw0KDQogICAgcmV0dXJuIGlv
Ow0KDQp9DQoNClVMT05HIGluZGV4X2lvKFVMT05HIGRpc2ssIEFTWU5DSF9JTyAqaW8pDQp7
DQogICAgcmVnaXN0ZXIgaW50IGkgPSAoZGlzayAlIDgpOw0KICAgIHJlZ2lzdGVyIGludCBy
ID0gKGlvLT5kaXNrICUgTUFYX0RJU0tTKTsNCiAgICByZWdpc3RlciBpbnQgaiA9ICgoaW8t
PnNlY3Rvcl9vZmZzZXQgPj4gOCkgJiAweEYpOw0KI2lmIChQUk9GSUxFX0FJTykNCiAgICBy
ZWdpc3RlciBpbnQgY291bnQ7DQojZW5kaWYNCiAgICBBU1lOQ0hfSU8gKm9sZCwgKnA7DQoN
CiNpZiAoUFJPRklMRV9BSU8pDQogICAgY291bnQgPSAxOw0KI2VuZGlmDQogICAgaWYgKCFk
aXNrX2lvX3RhaWxbaV0pDQogICAgew0KICAgICAgIGlvLT5uZXh0ID0gaW8tPnByaW9yID0g
TlVMTDsNCiAgICAgICBkaXNrX2lvX2hlYWRbaV0gPSBpbzsNCiAgICAgICBkaXNrX2lvX3Rh
aWxbaV0gPSBpbzsNCiNpZiAoUFJPRklMRV9BSU8pDQogICAgICAgaGFzaF9maWxsKys7DQog
ICAgICAgaGFzaF90b3RhbCsrOw0KDQogICAgICAgaWYgKGNvdW50ID4gcHJvYmVfbWF4KQ0K
ICAgICAgICAgIHByb2JlX21heCA9IGNvdW50Ow0KICAgICAgIHByb2JlX2F2ZyArPSBjb3Vu
dDsNCiNlbmRpZg0KICAgICAgIHJldHVybiAwOw0KICAgIH0NCg0KICAgIGlmIChhc3luY2hf
aW9faGVhZFtyXS5oYXNoX2hlYWRbal0pDQogICAgew0KI2lmIChQUk9GSUxFX0FJTykNCiAg
ICAgICBoYXNoX2hpdHMrKzsNCiNlbmRpZg0KICAgICAgIHAgPSBhc3luY2hfaW9faGVhZFty
XS5oYXNoX2hlYWRbal07DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQojaWYgKFBST0ZJTEVf
QUlPKQ0KICAgICAgIGhhc2hfbWlzc2VzKys7DQojZW5kaWYNCiAgICAgICBwID0gZGlza19p
b19oZWFkW2ldOw0KICAgIH0NCiNpZiAoUFJPRklMRV9BSU8pDQogICAgaGFzaF90b3RhbCsr
Ow0KI2VuZGlmDQoNCiAgICBvbGQgPSBOVUxMOw0KICAgIHdoaWxlIChwKQ0KICAgIHsNCiAg
ICAgICBpZiAoKHAtPmRpc2sgPCBpby0+ZGlzaykgJiYgKHAtPnNlY3Rvcl9vZmZzZXQgPCBp
by0+c2VjdG9yX29mZnNldCkpDQogICAgICAgew0KCSAgb2xkID0gcDsNCgkgIHAgPSBwLT5u
ZXh0Ow0KI2lmIChQUk9GSUxFX0FJTykNCiAgICAgICAgICBjb3VudCsrOw0KI2VuZGlmDQog
ICAgICAgfQ0KICAgICAgIGVsc2UNCiAgICAgICB7DQoJICBpZiAocC0+cHJpb3IpDQoJICB7
DQoJICAgICBwLT5wcmlvci0+bmV4dCA9IGlvOw0KCSAgICAgaW8tPm5leHQgPSBwOw0KCSAg
ICAgaW8tPnByaW9yID0gcC0+cHJpb3I7DQoJICAgICBwLT5wcmlvciA9IGlvOw0KDQojaWYg
KFBST0ZJTEVfQUlPKQ0KICAgICAgICAgICAgIGlmIChjb3VudCA+IHByb2JlX21heCkNCiAg
ICAgICAgICAgICAgICBwcm9iZV9tYXggPSBjb3VudDsNCiAgICAgICAgICAgICBwcm9iZV9h
dmcgKz0gY291bnQ7DQojZW5kaWYNCgkgICAgIHJldHVybiAwOw0KCSAgfQ0KCSAgaW8tPm5l
eHQgPSBwOw0KCSAgaW8tPnByaW9yID0gTlVMTDsNCgkgIHAtPnByaW9yID0gaW87DQoJICBk
aXNrX2lvX2hlYWRbaV0gPSBpbzsNCg0KI2lmIChQUk9GSUxFX0FJTykNCiAgICAgICAgICBp
ZiAoY291bnQgPiBwcm9iZV9tYXgpDQogICAgICAgICAgICAgcHJvYmVfbWF4ID0gY291bnQ7
DQogICAgICAgICAgcHJvYmVfYXZnICs9IGNvdW50Ow0KI2VuZGlmDQoJICByZXR1cm4gMDsN
CiAgICAgICB9DQogICAgfQ0KICAgIG9sZC0+bmV4dCA9IGlvOw0KICAgIGlvLT5uZXh0ID0g
TlVMTDsNCiAgICBpby0+cHJpb3IgPSBvbGQ7DQogICAgZGlza19pb190YWlsW2ldID0gaW87
DQoNCiNpZiAoUFJPRklMRV9BSU8pDQogICAgaWYgKGNvdW50ID4gcHJvYmVfbWF4KQ0KICAg
ICAgIHByb2JlX21heCA9IGNvdW50Ow0KICAgIHByb2JlX2F2ZyArPSBjb3VudDsNCiNlbmRp
Zg0KICAgIHJldHVybiAwOw0KfQ0KDQp2b2lkIGluc2VydF9pbyhVTE9ORyBkaXNrLCBBU1lO
Q0hfSU8gKmlvKQ0Kew0KICAgIGFzeW5jaF9sb2NrKCk7DQogICAgaWYgKGlvLT5zaWduYXR1
cmUgPT0gQVNJT19TVUJNSVRfSU8pDQogICAgew0KICAgICAgIE5XRlNQcmludCgibndmczog
IGFzeW5jaCBpbyByZXF1ZXN0IGFscmVhZHkgYWN0aXZlXG4iKTsNCiAgICAgICBhc3luY2hf
dW5sb2NrKCk7DQogICAgICAgcmV0dXJuOw0KICAgIH0NCiAgICBpbmRleF9pbyhkaXNrLCBp
byk7DQogICAgaW8tPnNpZ25hdHVyZSA9IEFTSU9fU1VCTUlUX0lPOw0KICAgIGhhc2hfZGlz
a19pbyhpbyk7DQogICAgYXN5bmNoX3VubG9jaygpOw0KICAgIHJldHVybjsNCg0KfQ0KDQoN
Cg==
--------------F244F05E832D2DC45A9F06F1
Content-Type: application/x-unknown-content-type-cfile;
name="Block.c"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="Block.c"
DQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqDQoqDQoqICAgQ29weXJpZ2h0IChjKSAxOTk4LCAx
OTk5IFRpbXBhbm9nYXMgUmVzZWFyY2ggR3JvdXAsIEluYy4NCiogICA4OTUgV2VzdCBDZW50
ZXIgU3RyZWV0DQoqICAgT3JlbSwgVXRhaCAgODQwNTcNCiogICBqbWVya2V5QHRpbXBhbm9n
YXMuY29tDQoqDQoqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQNCiogICB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUN
CiogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiwgb3IgYW55IGxhdGVy
IHZlcnNpb24uDQoqDQoqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dA0KKiAgIFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiogICBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl
IEdOVQ0KKiAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCioN
CiogICBZb3UgYXJlIGZyZWUgdG8gbW9kaWZ5IGFuZCByZS1kaXN0cmlidXRlIHRoaXMgcHJv
Z3JhbSBpbiBhY2NvcmRhbmNlDQoqICAgd2l0aCB0aGUgdGVybXMgc3BlY2lmaWVkIGluIHRo
ZSBHTlUgUHVibGljIExpY2Vuc2UuICBUaGUgY29weXJpZ2h0DQoqICAgY29udGFpbmVkIGlu
IHRoaXMgY29kZSBpcyByZXF1aXJlZCB0byBiZSBwcmVzZW50IGluIGFueSBkZXJpdmF0aXZl
DQoqICAgd29ya3MgYW5kIHlvdSBhcmUgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGUgc291cmNl
IGNvZGUgZm9yIHRoaXMNCiogICBwcm9ncmFtIGFzIHBhcnQgb2YgYW55IGNvbW1lcmNpYWwg
b3Igbm9uLWNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uLg0KKiAgIFlvdSBhcmUgcmVxdWlyZWQg
dG8gcmVzcGVjdCB0aGUgcmlnaHRzIG9mIHRoZSBDb3B5cmlnaHQgaG9sZGVycw0KKiAgIG5h
bWVkIHdpdGhpbiB0aGlzIGNvZGUuDQoqDQoqICAgam1lcmtleUB0aW1wYW5vZ2FzLmNvbSBh
bmQgVFJHLCBJbmMuIGFyZSB0aGUgb2ZmaWNpYWwgbWFpbnRhaW5lcnMgb2YNCiogICB0aGlz
IGNvZGUuICBZb3UgYXJlIGVuY291cmFnZWQgdG8gcmVwb3J0IGFueSBidWdzLCBwcm9ibGVt
cywgZml4ZXMsDQoqICAgc3VnZ2VzdGlvbnMsIGFuZCBjb21tZW50cyBhYm91dCB0aGlzIHNv
ZnR3YXJlIHRvIGptZXJrZXlAdGltcGFub2dhcy5jb20NCiogICBvciBsaW51eC1rZXJuZWxA
dmdlci5ydXRnZXJzLmVkdS4gIE5ldyByZWxlYXNlcywgcGF0Y2hlcywgYnVnIGZpeGVzLCBh
bmQNCiogICB0ZWNobmljYWwgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQgYXQgd3d3LnRp
bXBhbm9nYXMuY29tLiAgVFJHIHdpbGwNCiogICBwZXJpb2RpY2FsbHkgcG9zdCBuZXcgcmVs
ZWFzZXMgb2YgdGhpcyBzb2Z0d2FyZSB0byB3d3cudGltcGFub2dhcy5jb20NCiogICB0aGF0
IGNvbnRhaW4gYnVnIGZpeGVzIGFuZCBlbmhhbmNlZCBjYXBhYmlsaXRpZXMuDQoqDQoqICAg
T3JpZ2luYWwgQXV0aG9yc2hpcCAgICAgIDoNCiogICAgICBzb3VyY2UgY29kZSB3cml0dGVu
IGJ5IEplZmYgVi4gTWVya2V5LCBUUkcsIEluYy4NCioNCiogICBPcmlnaW5hbCBDb250cmli
dXRvcnMgICAgOg0KKiAgICAgIEplZmYgVi4gTWVya2V5LCBUUkcsIEluYy4NCiogICAgICBE
YXJyZW4gTWFqb3IsIFRSRywgSW5jLg0KKiAgICAgIEFsYW4gQ294LCBSZWRIYXQgU29mdHdh
cmUsIEluYy4NCioNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCioNCioNCiogICBBVVRIT1JT
ICA6ICBKZWZmIFYuIE1lcmtleSAoam1lcmtleUB0aW1wYW5vZ2FzLmNvbSkNCiogICBGSUxF
ICAgICA6ICBCTE9DSy5DDQoqICAgREVTQ1JJUCAgOiAgRkVOUklTIEJsb2NrIERldmljZSBJ
bnRlcmZhY2UgTW9kdWxlDQoqICAgREFURSAgICAgOiAgRGVjZW1iZXIgMiwgMTk5OA0KKg0K
Kg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSAiZ2xvYmFscy5oIg0KDQoj
aWYgKExJTlVYXzIwIHwgTElOVVhfMjIgfCBMSU5VWF8yNCkNCg0KZXh0ZXJuIFVMT05HIGlu
c2VydF9pbyhVTE9ORyBkaXNrLCBBU1lOQ0hfSU8gKmlvKTsNCmV4dGVybiB2b2lkIFJ1bkFz
eW5jaElPUXVldWUoVUxPTkcgZGlzayk7DQoNCi8vDQovLyAgbG93IGxldmVsIGRpc2sgc2Vj
dG9yIGludGVyZmFjZSByb3V0aW5lcw0KLy8NCg0Kc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9o
ZWFkID0gMDsNCnN0cnVjdCBidWZmZXJfaGVhZCAqYmhfdGFpbCA9IDA7DQpVTE9ORyBiaF9j
b3VudCA9IDA7DQoNCiNpZiAoTElOVVhfU0xFRVApDQpOV0ZTSW5pdE11dGV4KGJoX3NlbWFw
aG9yZSk7DQojZW5kaWYNCg0Kdm9pZCBsb2NrX2JoX2ZyZWUodm9pZCkNCnsNCiNpZiAoTElO
VVhfU0xFRVApDQogICAgaWYgKFdhaXRPblNlbWFwaG9yZSgmYmhfc2VtYXBob3JlKSA9PSAt
RUlOVFIpDQogICAgICAgTldGU1ByaW50KCJsb2NrIGJoIHdhcyBpbnRlcnJ1cHRlZFxuIik7
DQojZW5kaWYNCn0NCg0Kdm9pZCB1bmxvY2tfYmhfZnJlZSh2b2lkKQ0Kew0KI2lmIChMSU5V
WF9TTEVFUCkNCiAgICBTaWduYWxTZW1hcGhvcmUoJmJoX3NlbWFwaG9yZSk7DQojZW5kaWYN
Cn0NCg0Kdm9pZCBwdXRfYmgoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkNCnsNCiAgICBsb2Nr
X2JoX2ZyZWUoKTsNCiAgICBpZiAoYmhfY291bnQgPiBNQVhfQlVGRkVSX0hFQURTKQ0KICAg
IHsNCiAgICAgICB1bmxvY2tfYmhfZnJlZSgpOw0KICAgICAgIE5XRlNGcmVlKGJoKTsNCiAg
ICAgICByZXR1cm47DQogICAgfQ0KDQogICAgaWYgKCFiaF9oZWFkKQ0KICAgIHsNCiAgICAg
ICBiaF9oZWFkID0gYmhfdGFpbCA9IGJoOw0KICAgICAgIGJoLT5iX25leHRfZnJlZSA9IGJo
LT5iX3ByZXZfZnJlZSA9IDA7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgYmhf
dGFpbC0+Yl9uZXh0X2ZyZWUgPSBiaDsNCiAgICAgICBiaC0+Yl9uZXh0X2ZyZWUgPSAwOw0K
ICAgICAgIGJoLT5iX3ByZXZfZnJlZSA9IGJoX3RhaWw7DQogICAgICAgYmhfdGFpbCA9IGJo
Ow0KICAgIH0NCiAgICBiaF9jb3VudCsrOw0KDQogICAgdW5sb2NrX2JoX2ZyZWUoKTsNCiAg
ICByZXR1cm47DQp9DQoNCnN0cnVjdCBidWZmZXJfaGVhZCAqZ2V0X2JoKHZvaWQpDQp7DQog
ICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsNCg0KICAgIGxvY2tfYmhfZnJlZSgpOw0KICAg
IGlmIChiaF9oZWFkKQ0KICAgIHsNCiAgICAgICBiaCA9IGJoX2hlYWQ7DQogICAgICAgYmhf
aGVhZCA9IGJoLT5iX25leHRfZnJlZTsNCiAgICAgICBpZiAoYmhfaGVhZCkNCgkgIGJoX2hl
YWQtPmJfcHJldl9mcmVlID0gTlVMTDsNCiAgICAgICBlbHNlDQoJICBiaF90YWlsID0gTlVM
TDsNCg0KICAgICAgIGlmIChiaF9jb3VudCkNCgkgIGJoX2NvdW50LS07DQoNCiAgICAgICBi
aC0+Yl9uZXh0X2ZyZWUgPSBiaC0+Yl9wcmV2X2ZyZWUgPSAwOw0KICAgICAgIHVubG9ja19i
aF9mcmVlKCk7DQogICAgICAgcmV0dXJuIGJoOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0K
ICAgICAgIHVubG9ja19iaF9mcmVlKCk7DQoNCiNpZiAoTElOVVhfMjAgfCBMSU5VWF8yMiB8
IExJTlVYXzI0KQ0KICAgICAgIGJoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJ1ZmZlcl9o
ZWFkKSwgR0ZQX0JVRkZFUik7DQojZWxzZQ0KICAgICAgIGJoID0gTldGU0lPQWxsb2Moc2l6
ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCksIEJIX1RBRyk7DQojZW5kaWYNCiAgICAgICBpZiAo
IWJoKQ0KCSAgcmV0dXJuIDA7DQoNCiAgICAgICBOV0ZTU2V0KGJoLCAwLCBzaXplb2Yoc3Ry
dWN0IGJ1ZmZlcl9oZWFkKSk7DQogICAgICAgcmV0dXJuIGJoOw0KICAgIH0NCiAgICB1bmxv
Y2tfYmhfZnJlZSgpOw0KICAgIHJldHVybiAwOw0KfQ0KDQp2b2lkIGZyZWVfYmhfbGlzdCh2
b2lkKQ0Kew0KICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7DQoNCiAgICBsb2NrX2JoX2Zy
ZWUoKTsNCiAgICB3aGlsZSAoYmhfaGVhZCkNCiAgICB7DQogICAgICAgYmggPSBiaF9oZWFk
Ow0KICAgICAgIGJoX2hlYWQgPSBiaC0+Yl9uZXh0X2ZyZWU7DQoNCiAgICAgICBpZiAoYmhf
Y291bnQpDQoJICBiaF9jb3VudC0tOw0KDQojaWYgKExJTlVYXzIwIHwgTElOVVhfMjIgfCBM
SU5VWF8yNCkNCiAgICAgICBrZnJlZShiaCk7DQojZWxzZQ0KICAgICAgIE5XRlNGcmVlKGJo
KTsNCiNlbmRpZg0KICAgIH0NCiAgICBiaF9oZWFkID0gYmhfdGFpbCA9IDA7DQogICAgdW5s
b2NrX2JoX2ZyZWUoKTsNCiAgICByZXR1cm47DQp9DQoNCiNpZiAoTElOVVhfQlVGRkVSX0NB
Q0hFKQ0KDQovLw0KLy8gIFRoZSAyLjIuWCBidWZmZXIgY2FjaGUgaXMgbm90IFNNUCB0aHJl
YWQgc2FmZSwNCi8vICBzbyBsb2NrIHRoZSBrZXJuZWwgd2hlbiB3ZSBlbnRlciBpdCB0byBw
cmV2ZW50IG1lbW9yeSBjb3JydXB0aW9uDQovLyAgZnJvbSBvY2N1cnJpbmcgb24gU01QIHN5
c3RlbXMuDQovLw0KDQpVTE9ORyBwUmVhZERpc2tTZWN0b3JzKFVMT05HIGRpc2ssIFVMT05H
IFN0YXJ0aW5nTEJBLCBCWVRFICpTZWN0b3IsDQoJCSAgICAgIFVMT05HIHNlY3RvcnMsIFVM
T05HIHJlYWRBaGVhZCkNCnsNCiAgICByZWdpc3RlciBVTE9ORyBpLCBieXRlc1JlYWQgPSAw
Ow0KICAgIHJlZ2lzdGVyIFVMT05HIGJwczsNCiAgICByZWdpc3RlciBOV0RJU0sgKk5XRGlz
azsNCiAgICByZWdpc3RlciBVTE9ORyByZWFkX2Vycm9yID0gMDsNCiAgICBzdHJ1Y3QgYnVm
ZmVyX2hlYWQgKmJoW3NlY3RvcnNdOw0KDQogICAgTldEaXNrID0gU3lzdGVtRGlza1tkaXNr
XTsNCiAgICBicHMgPSBOV0Rpc2stPkJ5dGVzUGVyU2VjdG9yOw0KDQojaWYgKFZFUkJPU0Up
DQogICAgTldGU1ByaW50KCJyZWFkIGRpc2stJWQgbGJhLSVkIGZvciAlZCBzZWN0b3JzXG4i
LCANCgkgICAgIChpbnQpZGlzaywgKGludClTdGFydGluZ0xCQSwgKGludClzZWN0b3JzKTsN
CiNlbmRpZg0KICAgIA0KI2lmIChMSU5VWF8yMikNCiAgICBsb2NrX2tlcm5lbCgpOw0KI2Vu
ZGlmDQogICAgZm9yIChpPTA7IGkgPCBzZWN0b3JzOyBpKyspDQogICAgew0KICAgICAgIGlm
ICghKGJoW2ldID0gZ2V0YmxrKChVTE9ORylOV0Rpc2stPlBoeXNpY2FsRGlza0hhbmRsZSwN
CgkJCSAgICAoU3RhcnRpbmdMQkEgKyBpKSwgYnBzKSkpDQogICAgICAgew0KCSAgZm9yIChp
PTA7IGkgPCBzZWN0b3JzOyBpKyspDQoJICAgICBpZiAoYmhbaV0pDQoJCWJyZWxzZShiaFtp
XSk7DQojaWYgKExJTlVYXzIyKQ0KICAgICAgICAgIHVubG9ja19rZXJuZWwoKTsNCiNlbmRp
Zg0KCSAgcmV0dXJuIDA7DQogICAgICAgfQ0KICAgIH0NCg0KICAgIGxsX3J3X2Jsb2NrKFJF
QUQsIHNlY3RvcnMsIGJoKTsNCiAgICBmb3IoaT0wOyBpIDwgc2VjdG9yczsgaSsrKQ0KICAg
IHsNCiAgICAgICB3YWl0X29uX2J1ZmZlcihiaFtpXSk7DQogICAgICAgaWYgKGJ1ZmZlcl91
cHRvZGF0ZShiaFtpXSkpDQogICAgICAgew0KCSAgTldGU0NvcHkoJlNlY3RvcltpICogYnBz
XSwgYmhbaV0tPmJfZGF0YSwgYnBzKTsNCgkgIGJ5dGVzUmVhZCArPSBicHM7DQogICAgICAg
fQ0KICAgICAgIGVsc2UNCgkgIHJlYWRfZXJyb3IgPSAxOw0KICAgICAgIGJyZWxzZShiaFtp
XSk7DQogICAgfQ0KI2lmIChMSU5VWF8yMikNCiAgICB1bmxvY2tfa2VybmVsKCk7DQojZW5k
aWYNCiAgICByZXR1cm4gKHJlYWRfZXJyb3IgPyAwIDogYnl0ZXNSZWFkKTsNCg0KfQ0KDQpV
TE9ORyBwV3JpdGVEaXNrU2VjdG9ycyhVTE9ORyBkaXNrLCBVTE9ORyBTdGFydGluZ0xCQSwg
QllURSAqU2VjdG9yLA0KCQkgICAgICAgVUxPTkcgc2VjdG9ycywgVUxPTkcgcmVhZEFoZWFk
KQ0Kew0KICAgIHJlZ2lzdGVyIFVMT05HIGksIGJ5dGVzV3JpdHRlbiA9IDA7DQogICAgcmVn
aXN0ZXIgVUxPTkcgYnBzOw0KICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhbc2VjdG9yc107
DQogICAgcmVnaXN0ZXIgVUxPTkcgd3JpdGVfZXJyb3IgPSAwOw0KICAgIHJlZ2lzdGVyIE5X
RElTSyAqTldEaXNrOw0KDQogICAgTldEaXNrID0gU3lzdGVtRGlza1tkaXNrXTsNCiAgICBi
cHMgPSBOV0Rpc2stPkJ5dGVzUGVyU2VjdG9yOw0KDQojaWYgKFZFUkJPU0UpDQogICAgTldG
U1ByaW50KCJ3cml0ZSBkaXNrLSVkIGxiYS0lZCBmb3IgJWQgc2VjdG9yc1xuIiwgDQoJICAg
ICAoaW50KWRpc2ssIChpbnQpU3RhcnRpbmdMQkEsIChpbnQpc2VjdG9ycyk7DQojZW5kaWYN
CiAgICANCiNpZiAoTElOVVhfMjIpDQogICAgbG9ja19rZXJuZWwoKTsNCiNlbmRpZg0KICAg
IGZvciAoaT0wOyBpIDwgc2VjdG9yczsgaSsrKQ0KICAgIHsNCiAgICAgICBpZiAoIShiaFtp
XSA9IGdldGJsaygoVUxPTkcpTldEaXNrLT5QaHlzaWNhbERpc2tIYW5kbGUsDQoJCQkgICAg
KFN0YXJ0aW5nTEJBICsgaSksIGJwcykpKQ0KICAgICAgIHsNCgkgIGZvciAoaT0wOyBpIDwg
c2VjdG9yczsgaSsrKQ0KCSAgICAgaWYgKGJoW2ldKQ0KCQlicmVsc2UoYmhbaV0pOw0KI2lm
IChMSU5VWF8yMikNCiAgICAgICAgICB1bmxvY2tfa2VybmVsKCk7DQojZW5kaWYNCgkgIHJl
dHVybiAwOw0KICAgICAgIH0NCiAgICAgICBOV0ZTQ29weShiaFtpXS0+Yl9kYXRhLCAmU2Vj
dG9yW2kgKiBicHNdLCBicHMpOw0KICAgICAgIG1hcmtfYnVmZmVyX3VwdG9kYXRlKGJoW2ld
LCAxKTsNCiAgICAgICBtYXJrX2J1ZmZlcl9kaXJ0eShiaFtpXSwgMCk7DQogICAgICAgYnl0
ZXNXcml0dGVuICs9IGJwczsNCiAgICB9DQoNCiAgICBsbF9yd19ibG9jayhXUklURSwgc2Vj
dG9ycywgYmgpOw0KICAgIGZvciAoaT0wOyBpIDwgc2VjdG9yczsgaSsrKQ0KICAgIHsNCiAg
ICAgICB3YWl0X29uX2J1ZmZlcihiaFtpXSk7DQogICAgICAgaWYgKCFidWZmZXJfdXB0b2Rh
dGUoYmhbaV0pKQ0KCSAgd3JpdGVfZXJyb3IgPSAxOw0KICAgICAgIGJyZWxzZShiaFtpXSk7
DQogICAgfQ0KI2lmIChMSU5VWF8yMikNCiAgICB1bmxvY2tfa2VybmVsKCk7DQojZW5kaWYN
CiAgICByZXR1cm4gKHdyaXRlX2Vycm9yID8gMCA6IGJ5dGVzV3JpdHRlbik7DQoNCn0NCg0K
VUxPTkcgcFplcm9GaWxsRGlza1NlY3RvcnMoVUxPTkcgZGlzaywgVUxPTkcgU3RhcnRpbmdM
QkEsIFVMT05HIHNlY3RvcnMsDQoJCQkgIFVMT05HIHJlYWRBaGVhZCkNCnsNCiAgICByZWdp
c3RlciBVTE9ORyBpLCBieXRlc1dyaXR0ZW4gPSAwOw0KICAgIHJlZ2lzdGVyIFVMT05HIGJw
czsNCiAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoW3NlY3RvcnNdOw0KICAgIHJlZ2lzdGVy
IFVMT05HIHdyaXRlX2Vycm9yID0gMDsNCiAgICByZWdpc3RlciBOV0RJU0sgKk5XRGlzazsN
Cg0KICAgIE5XRGlzayA9IFN5c3RlbURpc2tbZGlza107DQogICAgYnBzID0gTldEaXNrLT5C
eXRlc1BlclNlY3RvcjsNCg0KI2lmIChWRVJCT1NFKQ0KICAgIE5XRlNQcmludCgiemVybyBk
aXNrLSVkIGxiYS0lZCBmb3IgJWQgc2VjdG9yc1xuIiwgDQoJICAgICAoaW50KWRpc2ssIChp
bnQpU3RhcnRpbmdMQkEsIChpbnQpc2VjdG9ycyk7DQojZW5kaWYNCiAgICANCiNpZiAoTElO
VVhfMjIpDQogICAgbG9ja19rZXJuZWwoKTsNCiNlbmRpZg0KICAgIGZvciAoaT0wOyBpIDwg
c2VjdG9yczsgaSsrKQ0KICAgIHsNCiAgICAgICBpZiAoIShiaFtpXSA9IGdldGJsaygoVUxP
TkcpTldEaXNrLT5QaHlzaWNhbERpc2tIYW5kbGUsDQoJCQkgIChTdGFydGluZ0xCQSArIGkp
LCBicHMpKSkNCiAgICAgICB7DQoJICBmb3IgKGk9MDsgaSA8IHNlY3RvcnM7IGkrKykNCgkg
ICAgIGlmIChiaFtpXSkNCgkJYnJlbHNlKGJoW2ldKTsNCiNpZiAoTElOVVhfMjIpDQogICAg
ICAgICAgdW5sb2NrX2tlcm5lbCgpOw0KI2VuZGlmDQoJICByZXR1cm4gMDsNCiAgICAgICB9
DQogICAgICAgTldGU1NldChiaFtpXS0+Yl9kYXRhLCAwLCBicHMpOw0KICAgICAgIG1hcmtf
YnVmZmVyX3VwdG9kYXRlKGJoW2ldLCAxKTsNCiAgICAgICBtYXJrX2J1ZmZlcl9kaXJ0eShi
aFtpXSwgMCk7DQogICAgICAgYnl0ZXNXcml0dGVuICs9IGJwczsNCiAgICB9DQoNCiAgICBs
bF9yd19ibG9jayhXUklURSwgc2VjdG9ycywgYmgpOw0KICAgIGZvciAoaT0wOyBpIDwgc2Vj
dG9yczsgaSsrKQ0KICAgIHsNCiAgICAgICB3YWl0X29uX2J1ZmZlcihiaFtpXSk7DQogICAg
ICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmhbaV0pKQ0KCSAgd3JpdGVfZXJyb3IgPSAxOw0K
ICAgICAgIGJyZWxzZShiaFtpXSk7DQogICAgfQ0KI2lmIChMSU5VWF8yMikNCiAgICB1bmxv
Y2tfa2VybmVsKCk7DQojZW5kaWYNCiAgICByZXR1cm4gKHdyaXRlX2Vycm9yID8gMCA6IGJ5
dGVzV3JpdHRlbik7DQp9DQoNCiNlbHNlDQoNCi8vDQovLyB0aGlzIGNhc2UgYXNzdW1lcyB3
ZSB3aWxsIHVzZSB0aGUgTldGUyBidWZmZXIgY2FjaGUgYW5kIG5vdCBhbGxvdw0KLy8gY2Fj
aGUgc2hhcmluZyB3aXRoIHRoZSBsaW51eCBidWZmZXIgY2FjaGUuDQovLw0KDQp2b2lkIGVu
ZF9pbyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpDQp7DQogICAgbWFy
a19idWZmZXJfdXB0b2RhdGUoYmgsIHVwdG9kYXRlKTsNCiAgICB1bmxvY2tfYnVmZmVyKGJo
KTsNCiAgICByZXR1cm47DQp9DQoNCi8vDQovLyAgIExpbnV4IDIuMA0KLy8NCg0KI2lmIChM
SU5VWF8yMCkNCg0KVUxPTkcgcFJlYWREaXNrU2VjdG9ycyhVTE9ORyBkaXNrLCBVTE9ORyBT
dGFydGluZ0xCQSwgQllURSAqU2VjdG9yLA0KCQkgICAgICBVTE9ORyBzZWN0b3JzLCBVTE9O
RyByZWFkQWhlYWQpDQp7DQogICAgcmVnaXN0ZXIgVUxPTkcgaSwgaiwgYnl0ZXNSZWFkID0g
MDsNCiAgICByZWdpc3RlciBVTE9ORyBicHM7DQogICAgcmVnaXN0ZXIgTldESVNLICpOV0Rp
c2s7DQogICAgcmVnaXN0ZXIgVUxPTkcgcmVhZF9lcnJvciA9IDA7DQogICAgc3RydWN0IGJ1
ZmZlcl9oZWFkICpiaFtzZWN0b3JzXTsNCg0KICAgIE5XRGlzayA9IFN5c3RlbURpc2tbZGlz
a107DQogICAgYnBzID0gTldEaXNrLT5CeXRlc1BlclNlY3RvcjsNCg0KICAgIGZvciAoaT0w
OyBpIDwgc2VjdG9yczsgaSsrKQ0KICAgIHsNCiAgICAgICBiaFtpXSA9IGdldF9iaCgpOw0K
ICAgICAgIGlmICghYmhbaV0pDQogICAgICAgew0KCSAgZm9yIChqPTA7IGogPCBpOyBqKysp
DQoJICAgICBpZiAoYmhbal0pDQoJCXB1dF9iaChiaFtqXSk7DQoJICByZXR1cm4gMDsNCiAg
ICAgICB9DQogICAgfQ0KDQogICAgZm9yIChpPTA7IGkgPCBzZWN0b3JzOyBpKyspDQogICAg
ew0KICAgICAgIGJoW2ldLT5iX3RoaXNfcGFnZSA9IGJoWyhpICsgMSkgJSBzZWN0b3JzXTsg
Ly8gY3JlYXRlIGNpcmN1bGFyIGxpc3QNCiAgICAgICBiaFtpXS0+Yl9zdGF0ZSA9IDA7DQog
ICAgICAgYmhbaV0tPmJfbmV4dF9mcmVlID0gKHN0cnVjdCBidWZmZXJfaGVhZCAqKU5VTEw7
DQogICAgICAgYmhbaV0tPmJfc2l6ZSA9IDUxMjsNCiAgICAgICBiaFtpXS0+Yl9kYXRhID0g
KGNoYXIgKikmU2VjdG9yW2kgKiBicHNdOw0KICAgICAgIGJoW2ldLT5iX2xpc3QgPSBCVUZf
Q0xFQU47DQogICAgICAgYmhbaV0tPmJfZGV2ID0gKGludClOV0Rpc2stPlBoeXNpY2FsRGlz
a0hhbmRsZTsNCiAgICAgICBiaFtpXS0+Yl9ibG9ja25yID0gKFN0YXJ0aW5nTEJBICsgaSk7
DQogICAgICAgYmhbaV0tPmJfY291bnQgPSAxOw0KICAgICAgIGJoW2ldLT5iX2ZsdXNodGlt
ZSA9IDA7DQogICAgICAgY2xlYXJfYml0KEJIX1VwdG9kYXRlLCAmYmhbaV0tPmJfc3RhdGUp
Ow0KICAgIH0NCg0KICAgIGxsX3J3X2Jsb2NrKFJFQUQsIHNlY3RvcnMsIGJoKTsNCiAgICBm
b3IoaT0wOyBpIDwgc2VjdG9yczsgaSsrKQ0KICAgIHsNCiAgICAgICB3YWl0X29uX2J1ZmZl
cihiaFtpXSk7DQogICAgICAgaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaFtpXSkpDQoJICBieXRl
c1JlYWQgKz0gYnBzOw0KICAgICAgIGVsc2UNCgkgIHJlYWRfZXJyb3IgPSAxOw0KICAgICAg
IHB1dF9iaChiaFtpXSk7DQogICAgfQ0KICAgIHJldHVybiAocmVhZF9lcnJvciA/IDAgOiBi
eXRlc1JlYWQpOw0KDQp9DQoNClVMT05HIHBXcml0ZURpc2tTZWN0b3JzKFVMT05HIGRpc2ss
IFVMT05HIFN0YXJ0aW5nTEJBLCBCWVRFICpTZWN0b3IsDQoJCSAgICAgICBVTE9ORyBzZWN0
b3JzLCBVTE9ORyByZWFkQWhlYWQpDQp7DQogICAgcmVnaXN0ZXIgVUxPTkcgaSwgaiwgYnl0
ZXNXcml0dGVuID0gMDsNCiAgICByZWdpc3RlciBVTE9ORyBicHM7DQogICAgcmVnaXN0ZXIg
VUxPTkcgd3JpdGVfZXJyb3IgPSAwOw0KICAgIHJlZ2lzdGVyIE5XRElTSyAqTldEaXNrOw0K
ICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhbc2VjdG9yc107DQoNCiAgICBOV0Rpc2sgPSBT
eXN0ZW1EaXNrW2Rpc2tdOw0KICAgIGJwcyA9IE5XRGlzay0+Qnl0ZXNQZXJTZWN0b3I7DQoN
CiAgICBmb3IgKGk9MDsgaSA8IHNlY3RvcnM7IGkrKykNCiAgICB7DQogICAgICAgYmhbaV0g
PSBnZXRfYmgoKTsNCiAgICAgICBpZiAoIWJoW2ldKQ0KICAgICAgIHsNCgkgIGZvciAoaj0w
OyBqIDwgaTsgaisrKQ0KCSAgICAgaWYgKGJoW2pdKQ0KCQlwdXRfYmgoYmhbal0pOw0KCSAg
cmV0dXJuIDA7DQogICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaT0wOyBpIDwgc2VjdG9y
czsgaSsrKQ0KICAgIHsNCiAgICAgICBiaFtpXS0+Yl90aGlzX3BhZ2UgPSBiaFsoaSArIDEp
ICUgc2VjdG9yc107IC8vIGNyZWF0ZSBjaXJjdWxhciBsaXN0DQogICAgICAgYmhbaV0tPmJf
c3RhdGUgPSAwOw0KICAgICAgIGJoW2ldLT5iX25leHRfZnJlZSA9IChzdHJ1Y3QgYnVmZmVy
X2hlYWQgKikgTlVMTDsNCiAgICAgICBiaFtpXS0+Yl9zaXplID0gNTEyOw0KICAgICAgIGJo
W2ldLT5iX2RhdGEgPSAoY2hhciAqKSZTZWN0b3JbaSAqIGJwc107DQogICAgICAgYmhbaV0t
PmJfbGlzdCA9IEJVRl9DTEVBTjsNCiAgICAgICBiaFtpXS0+Yl9kZXYgPSAoaW50KU5XRGlz
ay0+UGh5c2ljYWxEaXNrSGFuZGxlOw0KICAgICAgIGJoW2ldLT5iX2Jsb2NrbnIgPSAoU3Rh
cnRpbmdMQkEgKyBpKTsNCiAgICAgICBiaFtpXS0+Yl9jb3VudCA9IDE7DQogICAgICAgYmhb
aV0tPmJfZmx1c2h0aW1lID0gMDsNCiAgICAgICBzZXRfYml0KEJIX1VwdG9kYXRlLCAmYmhb
aV0tPmJfc3RhdGUpOw0KICAgICAgIHNldF9iaXQoQkhfRGlydHksICZiaFtpXS0+Yl9zdGF0
ZSk7DQogICAgfQ0KDQogICAgbGxfcndfYmxvY2soV1JJVEUsIHNlY3RvcnMsIGJoKTsNCiAg
ICBmb3IgKGk9MDsgaSA8IHNlY3RvcnM7IGkrKykNCiAgICB7DQogICAgICAgd2FpdF9vbl9i
dWZmZXIoYmhbaV0pOw0KICAgICAgIGlmIChidWZmZXJfdXB0b2RhdGUoYmhbaV0pKQ0KCSAg
Ynl0ZXNXcml0dGVuICs9IGJwczsNCiAgICAgICBlbHNlDQoJICB3cml0ZV9lcnJvciA9IDE7
DQogICAgICAgcHV0X2JoKGJoW2ldKTsNCiAgICB9DQogICAgcmV0dXJuICh3cml0ZV9lcnJv
ciA/IDAgOiBieXRlc1dyaXR0ZW4pOw0KDQp9DQoNClVMT05HIHBaZXJvRmlsbERpc2tTZWN0
b3JzKFVMT05HIGRpc2ssIFVMT05HIFN0YXJ0aW5nTEJBLCBVTE9ORyBzZWN0b3JzLA0KCQkJ
ICBVTE9ORyByZWFkQWhlYWQpDQp7DQogICAgcmVnaXN0ZXIgVUxPTkcgaSwgaiwgYnl0ZXNX
cml0dGVuID0gMDsNCiAgICByZWdpc3RlciBVTE9ORyBicHM7DQogICAgcmVnaXN0ZXIgVUxP
Tkcgd3JpdGVfZXJyb3IgPSAwOw0KICAgIHJlZ2lzdGVyIE5XRElTSyAqTldEaXNrOw0KICAg
IHN0cnVjdCBidWZmZXJfaGVhZCAqYmhbc2VjdG9yc107DQoNCiAgICBOV0Rpc2sgPSBTeXN0
ZW1EaXNrW2Rpc2tdOw0KICAgIGJwcyA9IE5XRGlzay0+Qnl0ZXNQZXJTZWN0b3I7DQoNCiAg
ICBmb3IgKGk9MDsgaSA8IHNlY3RvcnM7IGkrKykNCiAgICB7DQogICAgICAgYmhbaV0gPSBn
ZXRfYmgoKTsNCiAgICAgICBpZiAoIWJoW2ldKQ0KICAgICAgIHsNCgkgIGZvciAoaj0wOyBq
IDwgaTsgaisrKQ0KCSAgICAgaWYgKGJoW2pdKQ0KCQlwdXRfYmgoYmhbal0pOw0KCSAgcmV0
dXJuIDA7DQogICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaT0wOyBpIDwgc2VjdG9yczsg
aSsrKQ0KICAgIHsNCiAgICAgICBiaFtpXS0+Yl90aGlzX3BhZ2UgPSBiaFsoaSArIDEpICUg
c2VjdG9yc107IC8vIGNyZWF0ZSBjaXJjdWxhciBsaXN0DQogICAgICAgYmhbaV0tPmJfc3Rh
dGUgPSAwOw0KICAgICAgIGJoW2ldLT5iX25leHRfZnJlZSA9IChzdHJ1Y3QgYnVmZmVyX2hl
YWQgKikgTlVMTDsNCiAgICAgICBiaFtpXS0+Yl9zaXplID0gNTEyOw0KICAgICAgIGJoW2ld
LT5iX2RhdGEgPSAoY2hhciAqKSBaZXJvQnVmZmVyOw0KICAgICAgIGJoW2ldLT5iX2xpc3Qg
PSBCVUZfQ0xFQU47DQogICAgICAgYmhbaV0tPmJfZGV2ID0gKGludClOV0Rpc2stPlBoeXNp
Y2FsRGlza0hhbmRsZTsNCiAgICAgICBiaFtpXS0+Yl9ibG9ja25yID0gKFN0YXJ0aW5nTEJB
ICsgaSk7DQogICAgICAgYmhbaV0tPmJfY291bnQgPSAxOw0KICAgICAgIGJoW2ldLT5iX2Zs
dXNodGltZSA9IDA7DQogICAgICAgc2V0X2JpdChCSF9VcHRvZGF0ZSwgJmJoW2ldLT5iX3N0
YXRlKTsNCiAgICAgICBzZXRfYml0KEJIX0RpcnR5LCAmYmhbaV0tPmJfc3RhdGUpOw0KICAg
IH0NCg0KICAgIGxsX3J3X2Jsb2NrKFdSSVRFLCBzZWN0b3JzLCBiaCk7DQogICAgZm9yIChp
PTA7IGkgPCBzZWN0b3JzOyBpKyspDQogICAgew0KICAgICAgIHdhaXRfb25fYnVmZmVyKGJo
W2ldKTsNCiAgICAgICBpZiAoYnVmZmVyX3VwdG9kYXRlKGJoW2ldKSkNCgkgIGJ5dGVzV3Jp
dHRlbiArPSBicHM7DQogICAgICAgZWxzZQ0KCSAgd3JpdGVfZXJyb3IgPSAxOw0KICAgICAg
IHB1dF9iaChiaFtpXSk7DQogICAgfQ0KICAgIHJldHVybiAod3JpdGVfZXJyb3IgPyAwIDog
Ynl0ZXNXcml0dGVuKTsNCn0NCg0KI2VuZGlmDQoNCi8vDQovLyAgTGludXggMi4yDQovLw0K
DQojaWYgKExJTlVYXzIyKQ0KDQpVTE9ORyBwUmVhZERpc2tTZWN0b3JzKFVMT05HIGRpc2ss
IFVMT05HIFN0YXJ0aW5nTEJBLCBCWVRFICpTZWN0b3IsDQoJCSAgICAgIFVMT05HIHNlY3Rv
cnMsIFVMT05HIHJlYWRBaGVhZCkNCnsNCiAgICByZWdpc3RlciBVTE9ORyBpLCBqLCBieXRl
c1JlYWQgPSAwOw0KICAgIHJlZ2lzdGVyIFVMT05HIGJwczsNCiAgICByZWdpc3RlciBOV0RJ
U0sgKk5XRGlzazsNCiAgICByZWdpc3RlciBVTE9ORyByZWFkX2Vycm9yID0gMDsNCiAgICBz
dHJ1Y3QgYnVmZmVyX2hlYWQgKmJoW3NlY3RvcnNdOw0KDQogICAgTldEaXNrID0gU3lzdGVt
RGlza1tkaXNrXTsNCiAgICBicHMgPSBOV0Rpc2stPkJ5dGVzUGVyU2VjdG9yOw0KDQogICAg
Zm9yIChpPTA7IGkgPCBzZWN0b3JzOyBpKyspDQogICAgew0KICAgICAgIGJoW2ldID0gZ2V0
X2JoKCk7DQogICAgICAgaWYgKCFiaFtpXSkNCiAgICAgICB7DQoJICBmb3IgKGo9MDsgaiA8
IGk7IGorKykNCgkgICAgIGlmIChiaFtqXSkNCgkJcHV0X2JoKGJoW2pdKTsNCgkgIHJldHVy
biAwOw0KICAgICAgIH0NCiAgICB9DQoNCiAgICBmb3IgKGk9MDsgaSA8IHNlY3RvcnM7IGkr
KykNCiAgICB7DQogICAgICAgYmhbaV0tPmJfdGhpc19wYWdlID0gYmhbKGkgKyAxKSAlIHNl
Y3RvcnNdOyAvLyBjcmVhdGUgY2lyY3VsYXIgbGlzdA0KICAgICAgIGJoW2ldLT5iX3N0YXRl
ID0gMDsNCiAgICAgICBiaFtpXS0+Yl9uZXh0X2ZyZWUgPSAoc3RydWN0IGJ1ZmZlcl9oZWFk
ICopTlVMTDsNCiAgICAgICBiaFtpXS0+Yl9zaXplID0gNTEyOw0KICAgICAgIGJoW2ldLT5i
X2RhdGEgPSAoY2hhciAqKSZTZWN0b3JbaSAqIGJwc107DQogICAgICAgYmhbaV0tPmJfbGlz
dCA9IEJVRl9DTEVBTjsNCiAgICAgICBiaFtpXS0+Yl9kZXYgPSAoaW50KU5XRGlzay0+UGh5
c2ljYWxEaXNrSGFuZGxlOw0KICAgICAgIGJoW2ldLT5iX2Jsb2NrbnIgPSAoU3RhcnRpbmdM
QkEgKyBpKTsNCiAgICAgICBiaFtpXS0+Yl9jb3VudCA9IDE7DQogICAgICAgYmhbaV0tPmJf
Zmx1c2h0aW1lID0gMDsNCiAgICAgICBiaFtpXS0+Yl9lbmRfaW8gPSBlbmRfaW87DQogICAg
ICAgY2xlYXJfYml0KEJIX1VwdG9kYXRlLCAmYmhbaV0tPmJfc3RhdGUpOw0KICAgIH0NCg0K
ICAgIGxvY2tfa2VybmVsKCk7DQogICAgbGxfcndfYmxvY2soUkVBRCwgc2VjdG9ycywgYmgp
Ow0KICAgIGZvcihpPTA7IGkgPCBzZWN0b3JzOyBpKyspDQogICAgew0KICAgICAgIHdhaXRf
b25fYnVmZmVyKGJoW2ldKTsNCiAgICAgICBpZiAoYnVmZmVyX3VwdG9kYXRlKGJoW2ldKSkN
CgkgIGJ5dGVzUmVhZCArPSBicHM7DQogICAgICAgZWxzZQ0KCSAgcmVhZF9lcnJvciA9IDE7
DQogICAgICAgcHV0X2JoKGJoW2ldKTsNCiAgICB9DQogICAgdW5sb2NrX2tlcm5lbCgpOw0K
ICAgIHJldHVybiAocmVhZF9lcnJvciA/IDAgOiBieXRlc1JlYWQpOw0KDQp9DQoNClVMT05H
IHBXcml0ZURpc2tTZWN0b3JzKFVMT05HIGRpc2ssIFVMT05HIFN0YXJ0aW5nTEJBLCBCWVRF
ICpTZWN0b3IsDQoJCSAgICAgICBVTE9ORyBzZWN0b3JzLCBVTE9ORyByZWFkQWhlYWQpDQp7
DQogICAgcmVnaXN0ZXIgVUxPTkcgaSwgaiwgYnl0ZXNXcml0dGVuID0gMDsNCiAgICByZWdp
c3RlciBVTE9ORyBicHM7DQogICAgcmVnaXN0ZXIgVUxPTkcgd3JpdGVfZXJyb3IgPSAwOw0K
ICAgIHJlZ2lzdGVyIE5XRElTSyAqTldEaXNrOw0KICAgIHN0cnVjdCBidWZmZXJfaGVhZCAq
Ymhbc2VjdG9yc107DQoNCiAgICBOV0Rpc2sgPSBTeXN0ZW1EaXNrW2Rpc2tdOw0KICAgIGJw
cyA9IE5XRGlzay0+Qnl0ZXNQZXJTZWN0b3I7DQoNCiAgICBmb3IgKGk9MDsgaSA8IHNlY3Rv
cnM7IGkrKykNCiAgICB7DQogICAgICAgYmhbaV0gPSBnZXRfYmgoKTsNCiAgICAgICBpZiAo
IWJoW2ldKQ0KICAgICAgIHsNCgkgIGZvciAoaj0wOyBqIDwgaTsgaisrKQ0KCSAgICAgaWYg
KGJoW2pdKQ0KCQlwdXRfYmgoYmhbal0pOw0KCSAgcmV0dXJuIDA7DQogICAgICAgfQ0KICAg
IH0NCg0KICAgIGZvciAoaT0wOyBpIDwgc2VjdG9yczsgaSsrKQ0KICAgIHsNCiAgICAgICBi
aFtpXS0+Yl90aGlzX3BhZ2UgPSBiaFsoaSArIDEpICUgc2VjdG9yc107IC8vIGNyZWF0ZSBj
aXJjdWxhciBsaXN0DQogICAgICAgYmhbaV0tPmJfc3RhdGUgPSAwOw0KICAgICAgIGJoW2ld
LT5iX25leHRfZnJlZSA9IChzdHJ1Y3QgYnVmZmVyX2hlYWQgKikgTlVMTDsNCiAgICAgICBi
aFtpXS0+Yl9zaXplID0gNTEyOw0KICAgICAgIGJoW2ldLT5iX2RhdGEgPSAoY2hhciAqKSZT
ZWN0b3JbaSAqIGJwc107DQogICAgICAgYmhbaV0tPmJfbGlzdCA9IEJVRl9DTEVBTjsNCiAg
ICAgICBiaFtpXS0+Yl9kZXYgPSAoaW50KU5XRGlzay0+UGh5c2ljYWxEaXNrSGFuZGxlOw0K
ICAgICAgIGJoW2ldLT5iX2Jsb2NrbnIgPSAoU3RhcnRpbmdMQkEgKyBpKTsNCiAgICAgICBi
aFtpXS0+Yl9jb3VudCA9IDE7DQogICAgICAgYmhbaV0tPmJfZmx1c2h0aW1lID0gMDsNCiAg
ICAgICBiaFtpXS0+Yl9lbmRfaW8gPSBlbmRfaW87DQogICAgICAgc2V0X2JpdChCSF9VcHRv
ZGF0ZSwgJmJoW2ldLT5iX3N0YXRlKTsNCiAgICAgICBzZXRfYml0KEJIX0RpcnR5LCAmYmhb
aV0tPmJfc3RhdGUpOw0KICAgIH0NCg0KICAgIGxvY2tfa2VybmVsKCk7DQogICAgbGxfcndf
YmxvY2soV1JJVEUsIHNlY3RvcnMsIGJoKTsNCiAgICBmb3IgKGk9MDsgaSA8IHNlY3RvcnM7
IGkrKykNCiAgICB7DQogICAgICAgd2FpdF9vbl9idWZmZXIoYmhbaV0pOw0KICAgICAgIGlm
IChidWZmZXJfdXB0b2RhdGUoYmhbaV0pKQ0KCSAgYnl0ZXNXcml0dGVuICs9IGJwczsNCiAg
ICAgICBlbHNlDQoJICB3cml0ZV9lcnJvciA9IDE7DQogICAgICAgcHV0X2JoKGJoW2ldKTsN
CiAgICB9DQogICAgdW5sb2NrX2tlcm5lbCgpOw0KICAgIHJldHVybiAod3JpdGVfZXJyb3Ig
PyAwIDogYnl0ZXNXcml0dGVuKTsNCg0KfQ0KDQpVTE9ORyBwWmVyb0ZpbGxEaXNrU2VjdG9y
cyhVTE9ORyBkaXNrLCBVTE9ORyBTdGFydGluZ0xCQSwgVUxPTkcgc2VjdG9ycywNCgkJCSAg
VUxPTkcgcmVhZEFoZWFkKQ0Kew0KICAgIHJlZ2lzdGVyIFVMT05HIGksIGosIGJ5dGVzV3Jp
dHRlbiA9IDA7DQogICAgcmVnaXN0ZXIgVUxPTkcgYnBzOw0KICAgIHJlZ2lzdGVyIFVMT05H
IHdyaXRlX2Vycm9yID0gMDsNCiAgICByZWdpc3RlciBOV0RJU0sgKk5XRGlzazsNCiAgICBz
dHJ1Y3QgYnVmZmVyX2hlYWQgKmJoW3NlY3RvcnNdOw0KDQogICAgTldEaXNrID0gU3lzdGVt
RGlza1tkaXNrXTsNCiAgICBicHMgPSBOV0Rpc2stPkJ5dGVzUGVyU2VjdG9yOw0KDQogICAg
Zm9yIChpPTA7IGkgPCBzZWN0b3JzOyBpKyspDQogICAgew0KICAgICAgIGJoW2ldID0gZ2V0
X2JoKCk7DQogICAgICAgaWYgKCFiaFtpXSkNCiAgICAgICB7DQoJICBmb3IgKGo9MDsgaiA8
IGk7IGorKykNCgkgICAgIGlmIChiaFtqXSkNCgkJcHV0X2JoKGJoW2pdKTsNCgkgIHJldHVy
biAwOw0KICAgICAgIH0NCiAgICB9DQoNCiAgICBmb3IgKGk9MDsgaSA8IHNlY3RvcnM7IGkr
KykNCiAgICB7DQogICAgICAgYmhbaV0tPmJfdGhpc19wYWdlID0gYmhbKGkgKyAxKSAlIHNl
Y3RvcnNdOyAvLyBjcmVhdGUgY2lyY3VsYXIgbGlzdA0KICAgICAgIGJoW2ldLT5iX3N0YXRl
ID0gMDsNCiAgICAgICBiaFtpXS0+Yl9uZXh0X2ZyZWUgPSAoc3RydWN0IGJ1ZmZlcl9oZWFk
ICopIE5VTEw7DQogICAgICAgYmhbaV0tPmJfc2l6ZSA9IDUxMjsNCiAgICAgICBiaFtpXS0+
Yl9kYXRhID0gKGNoYXIgKikgWmVyb0J1ZmZlcjsNCiAgICAgICBiaFtpXS0+Yl9saXN0ID0g
QlVGX0NMRUFOOw0KICAgICAgIGJoW2ldLT5iX2RldiA9IChpbnQpTldEaXNrLT5QaHlzaWNh
bERpc2tIYW5kbGU7DQogICAgICAgYmhbaV0tPmJfYmxvY2tuciA9IChTdGFydGluZ0xCQSAr
IGkpOw0KICAgICAgIGJoW2ldLT5iX2NvdW50ID0gMTsNCiAgICAgICBiaFtpXS0+Yl9mbHVz
aHRpbWUgPSAwOw0KICAgICAgIGJoW2ldLT5iX2VuZF9pbyA9IGVuZF9pbzsNCiAgICAgICBz
ZXRfYml0KEJIX1VwdG9kYXRlLCAmYmhbaV0tPmJfc3RhdGUpOw0KICAgICAgIHNldF9iaXQo
QkhfRGlydHksICZiaFtpXS0+Yl9zdGF0ZSk7DQogICAgfQ0KDQogICAgbG9ja19rZXJuZWwo
KTsNCiAgICBsbF9yd19ibG9jayhXUklURSwgc2VjdG9ycywgYmgpOw0KICAgIGZvciAoaT0w
OyBpIDwgc2VjdG9yczsgaSsrKQ0KICAgIHsNCiAgICAgICB3YWl0X29uX2J1ZmZlcihiaFtp
XSk7DQogICAgICAgaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaFtpXSkpDQoJICBieXRlc1dyaXR0
ZW4gKz0gYnBzOw0KICAgICAgIGVsc2UNCgkgIHdyaXRlX2Vycm9yID0gMTsNCiAgICAgICBw
dXRfYmgoYmhbaV0pOw0KICAgIH0NCiAgICB1bmxvY2tfa2VybmVsKCk7DQogICAgcmV0dXJu
ICh3cml0ZV9lcnJvciA/IDAgOiBieXRlc1dyaXR0ZW4pOw0KfQ0KDQojZW5kaWYNCg0KLy8N
Ci8vICBMaW51eCAyLjQNCi8vDQoNCiNpZiAoTElOVVhfMjQpDQoNClVMT05HIHBSZWFkRGlz
a1NlY3RvcnMoVUxPTkcgZGlzaywgVUxPTkcgU3RhcnRpbmdMQkEsIEJZVEUgKlNlY3RvciwN
CgkJICAgICAgVUxPTkcgc2VjdG9ycywgVUxPTkcgcmVhZEFoZWFkKQ0Kew0KICAgIHJlZ2lz
dGVyIFVMT05HIGksIGosIGJ5dGVzUmVhZCA9IDA7DQogICAgcmVnaXN0ZXIgVUxPTkcgYnBz
Ow0KICAgIHJlZ2lzdGVyIE5XRElTSyAqTldEaXNrOw0KICAgIHJlZ2lzdGVyIFVMT05HIHJl
YWRfZXJyb3IgPSAwOw0KICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhbc2VjdG9yc107DQoN
CiAgICBOV0Rpc2sgPSBTeXN0ZW1EaXNrW2Rpc2tdOw0KICAgIGJwcyA9IE5XRGlzay0+Qnl0
ZXNQZXJTZWN0b3I7DQoNCiAgICBmb3IgKGk9MDsgaSA8IHNlY3RvcnM7IGkrKykNCiAgICB7
DQogICAgICAgYmhbaV0gPSBnZXRfYmgoKTsNCiAgICAgICBpZiAoIWJoW2ldKQ0KICAgICAg
IHsNCgkgIGZvciAoaj0wOyBqIDwgaTsgaisrKQ0KCSAgICAgaWYgKGJoW2pdKQ0KCQlwdXRf
YmgoYmhbal0pOw0KCSAgcmV0dXJuIDA7DQogICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAo
aT0wOyBpIDwgc2VjdG9yczsgaSsrKQ0KICAgIHsNCiAgICAgICBiaFtpXS0+Yl90aGlzX3Bh
Z2UgPSBiaFsoaSArIDEpICUgc2VjdG9yc107IC8vIGNyZWF0ZSBjaXJjdWxhciBsaXN0DQog
ICAgICAgYmhbaV0tPmJfc3RhdGUgPSAwOw0KICAgICAgIGJoW2ldLT5iX25leHRfZnJlZSA9
IChzdHJ1Y3QgYnVmZmVyX2hlYWQgKilOVUxMOw0KICAgICAgIGJoW2ldLT5iX3NpemUgPSA1
MTI7DQogICAgICAgYmhbaV0tPmJfZGF0YSA9IChjaGFyICopJlNlY3RvcltpICogYnBzXTsN
CiAgICAgICBiaFtpXS0+Yl9saXN0ID0gQlVGX0NMRUFOOw0KICAgICAgIGJoW2ldLT5iX2Rl
diA9IChpbnQpTldEaXNrLT5QaHlzaWNhbERpc2tIYW5kbGU7DQogICAgICAgYmhbaV0tPmJf
YmxvY2tuciA9IChTdGFydGluZ0xCQSArIGkpOw0KICAgICAgIGJoW2ldLT5iX2NvdW50LmNv
dW50ZXIgPSAxOw0KICAgICAgIGJoW2ldLT5iX2ZsdXNodGltZSA9IDA7DQogICAgICAgYmhb
aV0tPmJfZW5kX2lvID0gZW5kX2lvOw0KICAgICAgIGJoW2ldLT5iX2Rldl9pZCA9IE5VTEw7
DQogICAgICAgc2V0X2JpdChCSF9OZXcsICZiaFtpXS0+Yl9zdGF0ZSk7DQogICAgICAgc2V0
X2JpdChCSF9NYXBwZWQsICZiaFtpXS0+Yl9zdGF0ZSk7DQogICAgICAgY2xlYXJfYml0KEJI
X1VwdG9kYXRlLCAmYmhbaV0tPmJfc3RhdGUpOw0KICAgIH0NCg0KICAgIGxsX3J3X2Jsb2Nr
KFJFQUQsIHNlY3RvcnMsIGJoKTsNCiAgICBmb3IoaT0wOyBpIDwgc2VjdG9yczsgaSsrKQ0K
ICAgIHsNCiAgICAgICB3YWl0X29uX2J1ZmZlcihiaFtpXSk7DQogICAgICAgaWYgKGJ1ZmZl
cl91cHRvZGF0ZShiaFtpXSkpDQoJICBieXRlc1JlYWQgKz0gYnBzOw0KICAgICAgIGVsc2UN
CgkgIHJlYWRfZXJyb3IgPSAxOw0KICAgICAgIGNsZWFyX2JpdChCSF9NYXBwZWQsICZiaFtp
XS0+Yl9zdGF0ZSk7DQogICAgICAgcHV0X2JoKGJoW2ldKTsNCiAgICB9DQogICAgcmV0dXJu
IChyZWFkX2Vycm9yID8gMCA6IGJ5dGVzUmVhZCk7DQoNCn0NCg0KVUxPTkcgcFdyaXRlRGlz
a1NlY3RvcnMoVUxPTkcgZGlzaywgVUxPTkcgU3RhcnRpbmdMQkEsIEJZVEUgKlNlY3RvciwN
CgkJICAgICAgIFVMT05HIHNlY3RvcnMsIFVMT05HIHJlYWRBaGVhZCkNCnsNCiAgICByZWdp
c3RlciBVTE9ORyBpLCBqLCBieXRlc1dyaXR0ZW4gPSAwOw0KICAgIHJlZ2lzdGVyIFVMT05H
IGJwczsNCiAgICByZWdpc3RlciBVTE9ORyB3cml0ZV9lcnJvciA9IDA7DQogICAgcmVnaXN0
ZXIgTldESVNLICpOV0Rpc2s7DQogICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaFtzZWN0b3Jz
XTsNCg0KICAgIE5XRGlzayA9IFN5c3RlbURpc2tbZGlza107DQogICAgYnBzID0gTldEaXNr
LT5CeXRlc1BlclNlY3RvcjsNCg0KICAgIGZvciAoaT0wOyBpIDwgc2VjdG9yczsgaSsrKQ0K
ICAgIHsNCiAgICAgICBiaFtpXSA9IGdldF9iaCgpOw0KICAgICAgIGlmICghYmhbaV0pDQog
ICAgICAgew0KCSAgZm9yIChqPTA7IGogPCBpOyBqKyspDQoJICAgICBpZiAoYmhbal0pDQoJ
CXB1dF9iaChiaFtqXSk7DQoJICByZXR1cm4gMDsNCiAgICAgICB9DQogICAgfQ0KDQogICAg
Zm9yIChpPTA7IGkgPCBzZWN0b3JzOyBpKyspDQogICAgew0KICAgICAgIGJoW2ldLT5iX3Ro
aXNfcGFnZSA9IGJoWyhpICsgMSkgJSBzZWN0b3JzXTsgLy8gY3JlYXRlIGNpcmN1bGFyIGxp
c3QNCiAgICAgICBiaFtpXS0+Yl9zdGF0ZSA9IDA7DQogICAgICAgYmhbaV0tPmJfbmV4dF9m
cmVlID0gKHN0cnVjdCBidWZmZXJfaGVhZCAqKSBOVUxMOw0KICAgICAgIGJoW2ldLT5iX3Np
emUgPSA1MTI7DQogICAgICAgYmhbaV0tPmJfZGF0YSA9IChjaGFyICopJlNlY3RvcltpICog
YnBzXTsNCiAgICAgICBiaFtpXS0+Yl9saXN0ID0gQlVGX0NMRUFOOw0KICAgICAgIGJoW2ld
LT5iX2RldiA9IChpbnQpTldEaXNrLT5QaHlzaWNhbERpc2tIYW5kbGU7DQogICAgICAgYmhb
aV0tPmJfYmxvY2tuciA9IChTdGFydGluZ0xCQSArIGkpOw0KICAgICAgIGJoW2ldLT5iX2Nv
dW50LmNvdW50ZXIgPSAxOw0KICAgICAgIGJoW2ldLT5iX2ZsdXNodGltZSA9IDA7DQogICAg
ICAgYmhbaV0tPmJfZW5kX2lvID0gZW5kX2lvOw0KICAgICAgIGJoW2ldLT5iX2Rldl9pZCA9
IE5VTEw7DQogICAgICAgc2V0X2JpdChCSF9OZXcsICZiaFtpXS0+Yl9zdGF0ZSk7DQogICAg
ICAgc2V0X2JpdChCSF9NYXBwZWQsICZiaFtpXS0+Yl9zdGF0ZSk7DQogICAgICAgc2V0X2Jp
dChCSF9VcHRvZGF0ZSwgJmJoW2ldLT5iX3N0YXRlKTsNCiAgICAgICBzZXRfYml0KEJIX0Rp
cnR5LCAmYmhbaV0tPmJfc3RhdGUpOw0KICAgIH0NCg0KICAgIGxsX3J3X2Jsb2NrKFdSSVRF
LCBzZWN0b3JzLCBiaCk7DQogICAgZm9yIChpPTA7IGkgPCBzZWN0b3JzOyBpKyspDQogICAg
ew0KICAgICAgIHdhaXRfb25fYnVmZmVyKGJoW2ldKTsNCiAgICAgICBpZiAoYnVmZmVyX3Vw
dG9kYXRlKGJoW2ldKSkNCgkgIGJ5dGVzV3JpdHRlbiArPSBicHM7DQogICAgICAgZWxzZQ0K
CSAgd3JpdGVfZXJyb3IgPSAxOw0KICAgICAgIGNsZWFyX2JpdChCSF9NYXBwZWQsICZiaFtp
XS0+Yl9zdGF0ZSk7DQogICAgICAgcHV0X2JoKGJoW2ldKTsNCiAgICB9DQogICAgcmV0dXJu
ICh3cml0ZV9lcnJvciA/IDAgOiBieXRlc1dyaXR0ZW4pOw0KDQp9DQoNClVMT05HIHBaZXJv
RmlsbERpc2tTZWN0b3JzKFVMT05HIGRpc2ssIFVMT05HIFN0YXJ0aW5nTEJBLCBVTE9ORyBz
ZWN0b3JzLA0KCQkJICBVTE9ORyByZWFkQWhlYWQpDQp7DQogICAgcmVnaXN0ZXIgVUxPTkcg
aSwgaiwgYnl0ZXNXcml0dGVuID0gMDsNCiAgICByZWdpc3RlciBVTE9ORyBicHM7DQogICAg
cmVnaXN0ZXIgVUxPTkcgd3JpdGVfZXJyb3IgPSAwOw0KICAgIHJlZ2lzdGVyIE5XRElTSyAq
TldEaXNrOw0KICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhbc2VjdG9yc107DQoNCiAgICBO
V0Rpc2sgPSBTeXN0ZW1EaXNrW2Rpc2tdOw0KICAgIGJwcyA9IE5XRGlzay0+Qnl0ZXNQZXJT
ZWN0b3I7DQoNCiAgICBmb3IgKGk9MDsgaSA8IHNlY3RvcnM7IGkrKykNCiAgICB7DQogICAg
ICAgYmhbaV0gPSBnZXRfYmgoKTsNCiAgICAgICBpZiAoIWJoW2ldKQ0KICAgICAgIHsNCgkg
IGZvciAoaj0wOyBqIDwgaTsgaisrKQ0KCSAgICAgaWYgKGJoW2pdKQ0KCQlwdXRfYmgoYmhb
al0pOw0KCSAgcmV0dXJuIDA7DQogICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaT0wOyBp
IDwgc2VjdG9yczsgaSsrKQ0KICAgIHsNCiAgICAgICBiaFtpXS0+Yl90aGlzX3BhZ2UgPSBi
aFsoaSArIDEpICUgc2VjdG9yc107IC8vIGNyZWF0ZSBjaXJjdWxhciBsaXN0DQogICAgICAg
YmhbaV0tPmJfc3RhdGUgPSAwOw0KICAgICAgIGJoW2ldLT5iX25leHRfZnJlZSA9IChzdHJ1
Y3QgYnVmZmVyX2hlYWQgKikgTlVMTDsNCiAgICAgICBiaFtpXS0+Yl9zaXplID0gNTEyOw0K
ICAgICAgIGJoW2ldLT5iX2RhdGEgPSAoY2hhciAqKSBaZXJvQnVmZmVyOw0KICAgICAgIGJo
W2ldLT5iX2xpc3QgPSBCVUZfQ0xFQU47DQogICAgICAgYmhbaV0tPmJfZGV2ID0gKGludClO
V0Rpc2stPlBoeXNpY2FsRGlza0hhbmRsZTsNCiAgICAgICBiaFtpXS0+Yl9ibG9ja25yID0g
KFN0YXJ0aW5nTEJBICsgaSk7DQogICAgICAgYmhbaV0tPmJfY291bnQuY291bnRlciA9IDE7
DQogICAgICAgYmhbaV0tPmJfZmx1c2h0aW1lID0gMDsNCiAgICAgICBiaFtpXS0+Yl9lbmRf
aW8gPSBlbmRfaW87DQogICAgICAgYmhbaV0tPmJfZGV2X2lkID0gTlVMTDsNCiAgICAgICBz
ZXRfYml0KEJIX05ldywgJmJoW2ldLT5iX3N0YXRlKTsNCiAgICAgICBzZXRfYml0KEJIX01h
cHBlZCwgJmJoW2ldLT5iX3N0YXRlKTsNCiAgICAgICBzZXRfYml0KEJIX1VwdG9kYXRlLCAm
YmhbaV0tPmJfc3RhdGUpOw0KICAgICAgIHNldF9iaXQoQkhfRGlydHksICZiaFtpXS0+Yl9z
dGF0ZSk7DQogICAgfQ0KDQogICAgbGxfcndfYmxvY2soV1JJVEUsIHNlY3RvcnMsIGJoKTsN
CiAgICBmb3IgKGk9MDsgaSA8IHNlY3RvcnM7IGkrKykNCiAgICB7DQogICAgICAgd2FpdF9v
bl9idWZmZXIoYmhbaV0pOw0KICAgICAgIGlmIChidWZmZXJfdXB0b2RhdGUoYmhbaV0pKQ0K
CSAgYnl0ZXNXcml0dGVuICs9IGJwczsNCiAgICAgICBlbHNlDQoJICB3cml0ZV9lcnJvciA9
IDE7DQogICAgICAgY2xlYXJfYml0KEJIX01hcHBlZCwgJmJoW2ldLT5iX3N0YXRlKTsNCiAg
ICAgICBwdXRfYmgoYmhbaV0pOw0KICAgIH0NCiAgICByZXR1cm4gKHdyaXRlX2Vycm9yID8g
MCA6IGJ5dGVzV3JpdHRlbik7DQp9DQoNCiNlbmRpZg0KDQoNCg0KI2VuZGlmDQoNCnZvaWQg
U3luY0RldmljZShVTE9ORyBkaXNrKQ0Kew0KICAgIHN5bmNfZGV2KChpbnQpZGlzayk7DQog
ICAgcmV0dXJuOw0KfQ0KDQojaWYgKERPX0FTWU5DSF9JTykNClVMT05HIHJlbGVhc2VfYWlv
KEFTWU5DSF9JTyAqaW8pDQp7DQojaWYgKExJTlVYX1NMRUVQKQ0KICAgIFNpZ25hbFNlbWFw
aG9yZSgoc3RydWN0IHNlbWFwaG9yZSAqKWlvLT5jYWxsX2JhY2tfcGFyYW1ldGVyKTsNCiNl
bmRpZg0KICAgIHJldHVybiAwOw0KfQ0KI2VuZGlmDQoNClVMT05HIFJlYWREaXNrU2VjdG9y
cyhVTE9ORyBkaXNrLCBVTE9ORyBMQkEsIEJZVEUgKlNlY3RvciwNCgkJCSAgICAgVUxPTkcg
c2VjdG9ycywgVUxPTkcgcmVhZEFoZWFkKQ0Kew0KI2lmIChET19BU1lOQ0hfSU8pDQogICAg
QVNZTkNIX0lPIGlvOw0KI2lmIChMSU5VWF9TTEVFUCkNCiAgICBOV0ZTSW5pdFNlbWFwaG9y
ZShzZW1hcGhvcmUpOw0KI2VuZGlmDQoNCiAgICBOV0ZTU2V0KCZpbywgMCwgc2l6ZW9mKEFT
WU5DSF9JTykpOw0KDQogICAgaW8uY29tbWFuZCA9IEFTWU5DSF9SRUFEOw0KICAgIGlvLmRp
c2sgPSBkaXNrOw0KICAgIGlvLnNlY3Rvcl9vZmZzZXQgPSBMQkE7DQogICAgaW8uc2VjdG9y
X2NvdW50ID0gc2VjdG9yczsNCiAgICBpby5idWZmZXIgPSBTZWN0b3I7DQogICAgaW8uY2Fs
bF9iYWNrX3JvdXRpbmUgPSByZWxlYXNlX2FpbzsNCiNpZiAoTElOVVhfU0xFRVApDQogICAg
aW8uY2FsbF9iYWNrX3BhcmFtZXRlciA9IChVTE9ORykgJnNlbWFwaG9yZTsNCiNlbmRpZg0K
DQogICAgaW5zZXJ0X2lvKGRpc2ssICZpbyk7DQoNCiAgICBSdW5Bc3luY2hJT1F1ZXVlKGRp
c2spOw0KDQojaWYgKExJTlVYX1NMRUVQKQ0KICAgIFdhaXRPblNlbWFwaG9yZSgmc2VtYXBo
b3JlKTsNCiNlbmRpZg0KDQogICAgcmV0dXJuIChVTE9ORykoaW8ucmV0dXJuX2NvZGUpOw0K
I2Vsc2UNCiAgICByZXR1cm4gKHBSZWFkRGlza1NlY3RvcnMoZGlzaywgTEJBLCBTZWN0b3Is
IHNlY3RvcnMsIHJlYWRBaGVhZCkpOw0KI2VuZGlmDQp9DQoNClVMT05HIFdyaXRlRGlza1Nl
Y3RvcnMoVUxPTkcgZGlzaywgVUxPTkcgTEJBLCBCWVRFICpTZWN0b3IsDQoJCQkgICAgICBV
TE9ORyBzZWN0b3JzLCBVTE9ORyByZWFkQWhlYWQpDQp7DQojaWYgKERPX0FTWU5DSF9JTykN
CiAgICBBU1lOQ0hfSU8gaW87DQojaWYgKExJTlVYX1NMRUVQKQ0KICAgIE5XRlNJbml0U2Vt
YXBob3JlKHNlbWFwaG9yZSk7DQojZW5kaWYNCg0KICAgIE5XRlNTZXQoJmlvLCAwLCBzaXpl
b2YoQVNZTkNIX0lPKSk7DQoNCiAgICBpby5jb21tYW5kID0gQVNZTkNIX1dSSVRFOw0KICAg
IGlvLmRpc2sgPSBkaXNrOw0KICAgIGlvLnNlY3Rvcl9vZmZzZXQgPSBMQkE7DQogICAgaW8u
c2VjdG9yX2NvdW50ID0gc2VjdG9yczsNCiAgICBpby5idWZmZXIgPSBTZWN0b3I7DQogICAg
aW8uY2FsbF9iYWNrX3JvdXRpbmUgPSByZWxlYXNlX2FpbzsNCiNpZiAoTElOVVhfU0xFRVAp
DQogICAgaW8uY2FsbF9iYWNrX3BhcmFtZXRlciA9IChVTE9ORykgJnNlbWFwaG9yZTsNCiNl
bmRpZg0KDQogICAgaW5zZXJ0X2lvKGRpc2ssICZpbyk7DQoNCiAgICBSdW5Bc3luY2hJT1F1
ZXVlKGRpc2spOw0KDQojaWYgKExJTlVYX1NMRUVQKQ0KICAgIFdhaXRPblNlbWFwaG9yZSgm
c2VtYXBob3JlKTsNCiNlbmRpZg0KDQogICAgcmV0dXJuIChVTE9ORykoaW8ucmV0dXJuX2Nv
ZGUpOw0KI2Vsc2UNCiAgICByZXR1cm4gKHBXcml0ZURpc2tTZWN0b3JzKGRpc2ssIExCQSwg
U2VjdG9yLCBzZWN0b3JzLCByZWFkQWhlYWQpKTsNCiNlbmRpZg0KfQ0KDQpVTE9ORyBaZXJv
RmlsbERpc2tTZWN0b3JzKFVMT05HIGRpc2ssIFVMT05HIFN0YXJ0aW5nTEJBLA0KCQkJCSBV
TE9ORyBzZWN0b3JzLCBVTE9ORyByZWFkQWhlYWQpDQp7DQojaWYgKERPX0FTWU5DSF9JTykN
CiAgICBBU1lOQ0hfSU8gaW87DQojaWYgKExJTlVYX1NMRUVQKQ0KICAgIE5XRlNJbml0U2Vt
YXBob3JlKHNlbWFwaG9yZSk7DQojZW5kaWYNCg0KICAgIE5XRlNTZXQoJmlvLCAwLCBzaXpl
b2YoQVNZTkNIX0lPKSk7DQoNCiAgICBpby5jb21tYW5kID0gQVNZTkNIX0ZJTEw7DQogICAg
aW8uZGlzayA9IGRpc2s7DQogICAgaW8uc2VjdG9yX29mZnNldCA9IFN0YXJ0aW5nTEJBOw0K
ICAgIGlvLnNlY3Rvcl9jb3VudCA9IHNlY3RvcnM7DQogICAgaW8uYnVmZmVyID0gTlVMTDsN
CiAgICBpby5jYWxsX2JhY2tfcm91dGluZSA9IHJlbGVhc2VfYWlvOw0KI2lmIChMSU5VWF9T
TEVFUCkNCiAgICBpby5jYWxsX2JhY2tfcGFyYW1ldGVyID0gKFVMT05HKSAmc2VtYXBob3Jl
Ow0KI2VuZGlmDQoNCiAgICBpbnNlcnRfaW8oZGlzaywgJmlvKTsNCg0KICAgIFJ1bkFzeW5j
aElPUXVldWUoZGlzayk7DQoNCiNpZiAoTElOVVhfU0xFRVApDQogICAgV2FpdE9uU2VtYXBo
b3JlKCZzZW1hcGhvcmUpOw0KI2VuZGlmDQoNCiAgICByZXR1cm4gKFVMT05HKShpby5yZXR1
cm5fY29kZSk7DQojZWxzZQ0KICAgIHJldHVybiAocFplcm9GaWxsRGlza1NlY3RvcnMoZGlz
aywgU3RhcnRpbmdMQkEsIHNlY3RvcnMsIHJlYWRBaGVhZCkpOw0KI2VuZGlmDQp9DQoNCiNl
bmRpZg0KDQoNCiNpZiAoTElOVVhfVVRJTCkNCg0KI2RlZmluZSBGT1JfVVRJTF9MSU5VWA0K
DQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQoNCiNpbmNsdWRlIDxlcnJuby5oPg0KI2luY2x1
ZGUgPHVuaXN0ZC5oPg0KDQojaWZuZGVmIEZPUl9VVElMX0xJTlVYDQoNCiNpbmNsdWRlICJl
dC9jb21fZXJyLmgiDQojaW5jbHVkZSAiZXh0MmZzL2lvLmgiDQoNCiNlbHNlIC8qIEZPUl9V
VElMX0xJTlVYICovDQoNCiNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKEhBU19M
T05HX0xPTkcpDQp0eXBlZGVmIGxvbmcgbG9uZyAgICAgICBleHQyX2xvZmZfdDsNCiNlbHNl
DQp0eXBlZGVmIGxvbmcgICAgICAgICAgICBleHQyX2xvZmZfdDsNCiNlbmRpZg0KDQpleHQy
X2xvZmZfdCBleHQyX2xsc2VlayAodW5zaWduZWQgaW50LCBleHQyX2xvZmZfdCwgdW5zaWdu
ZWQgaW50KTsNCg0KI2VuZGlmIC8qIEZPUl9VVElMX0xJTlVYICovDQoNCiNpZmRlZiBfX2xp
bnV4X18NCg0KI2lmZGVmIEhBVkVfTExTRUVLDQojaW5jbHVkZSA8c3lzY2FsbC5oPg0KDQoj
ZWxzZQkvKiBIQVZFX0xMU0VFSyAqLw0KDQojaWZkZWYgX19hbHBoYV9fDQoNCiNkZWZpbmUg
bXlfbGxzZWVrIGxzZWVrDQoNCiNlbGlmIF9faTM4Nl9fDQoNCiNpbmNsdWRlIDxsaW51eC91
bmlzdGQuaD4NCg0KI2lmbmRlZiBfX05SX19sbHNlZWsNCiNkZWZpbmUgX19OUl9fbGxzZWVr
ICAgICAgICAgICAgMTQwDQojZW5kaWYNCg0Kc3RhdGljIGludCBfbGxzZWVrICh1bnNpZ25l
ZCBpbnQsIHVuc2lnbmVkIGxvbmcsDQoJCSAgIHVuc2lnbmVkIGxvbmcsIGV4dDJfbG9mZl90
ICosIHVuc2lnbmVkIGludCk7DQoNCnN0YXRpYyBfc3lzY2FsbDUoaW50LF9sbHNlZWssdW5z
aWduZWQgaW50LGZkLHVuc2lnbmVkIGxvbmcsb2Zmc2V0X2hpZ2gsDQoJCSB1bnNpZ25lZCBs
b25nLCBvZmZzZXRfbG93LCBleHQyX2xvZmZfdCAqLHJlc3VsdCwNCgkJIHVuc2lnbmVkIGlu
dCwgb3JpZ2luKQ0KDQpzdGF0aWMgZXh0Ml9sb2ZmX3QgbXlfbGxzZWVrICh1bnNpZ25lZCBp
bnQgZmQsIGV4dDJfbG9mZl90IG9mZnNldCwNCgkJdW5zaWduZWQgaW50IG9yaWdpbikNCnsN
CglleHQyX2xvZmZfdCByZXN1bHQ7DQoJaW50IHJldHZhbDsNCg0KCXJldHZhbCA9IF9sbHNl
ZWsgKGZkLCAoKHVuc2lnbmVkIGxvbmcgbG9uZykgb2Zmc2V0KSA+PiAzMiwNCgkJCSgodW5z
aWduZWQgbG9uZyBsb25nKSBvZmZzZXQpICYgMHhmZmZmZmZmZiwNCgkJCSZyZXN1bHQsIG9y
aWdpbik7DQoJcmV0dXJuIChyZXR2YWwgPT0gLTEgPyAoZXh0Ml9sb2ZmX3QpIHJldHZhbCA6
IHJlc3VsdCk7DQp9DQoNCiNlbHNlDQoNCiNlcnJvciAibGxzZWVrKCkgaXMgbm90IGF2YWls
YWJsZSINCg0KI2VuZGlmIC8qIF9fYWxwaGFfXyAqLw0KDQojZW5kaWYJLyogSEFWRV9MTFNF
RUsgKi8NCg0KZXh0Ml9sb2ZmX3QgZXh0Ml9sbHNlZWsgKHVuc2lnbmVkIGludCBmZCwgZXh0
Ml9sb2ZmX3Qgb2Zmc2V0LA0KCQkJIHVuc2lnbmVkIGludCBvcmlnaW4pDQp7DQoJZXh0Ml9s
b2ZmX3QgcmVzdWx0Ow0KCXN0YXRpYyBpbnQgZG9fY29tcGF0ID0gMDsNCg0KCWlmICgoc2l6
ZW9mKG9mZl90KSA+PSBzaXplb2YoZXh0Ml9sb2ZmX3QpKSB8fA0KCSAgICAob2Zmc2V0IDwg
KChleHQyX2xvZmZfdCkgMSA8PCAoKHNpemVvZihvZmZfdCkqOCkgLTEpKSkpDQoJCXJldHVy
biBsc2VlayhmZCwgKG9mZl90KSBvZmZzZXQsIG9yaWdpbik7DQoNCglpZiAoZG9fY29tcGF0
KSB7DQoJCWVycm5vID0gRUlOVkFMOw0KCQlyZXR1cm4gLTE7DQoJfQ0KCQ0KCXJlc3VsdCA9
IG15X2xsc2VlayAoZmQsIG9mZnNldCwgb3JpZ2luKTsNCglpZiAocmVzdWx0ID09IC0xICYm
IGVycm5vID09IEVOT1NZUykgew0KCQkvKg0KCQkgKiBKdXN0IGluIGNhc2UgdGhpcyBjb2Rl
IHJ1bnMgb24gdG9wIG9mIGFuIG9sZCBrZXJuZWwNCgkJICogd2hpY2ggZG9lcyBub3Qgc3Vw
cG9ydCB0aGUgbGxzZWVrIHN5c3RlbSBjYWxsDQoJCSAqLw0KCQlkb19jb21wYXQrKzsNCgkJ
ZXJybm8gPSBFSU5WQUw7DQoJfQ0KCXJldHVybiByZXN1bHQ7DQp9DQoNCiNlbHNlIC8qICFs
aW51eCAqLw0KDQpleHQyX2xvZmZfdCBleHQyX2xsc2VlayAodW5zaWduZWQgaW50IGZkLCBl
eHQyX2xvZmZfdCBvZmZzZXQsDQoJCQkgdW5zaWduZWQgaW50IG9yaWdpbikNCnsNCglpZiAo
KHNpemVvZihvZmZfdCkgPCBzaXplb2YoZXh0Ml9sb2ZmX3QpKSAmJg0KCSAgICAob2Zmc2V0
ID49ICgoZXh0Ml9sb2ZmX3QpIDEgPDwgKChzaXplb2Yob2ZmX3QpKjgpIC0xKSkpKSB7DQoJ
CWVycm5vID0gRUlOVkFMOw0KCQlyZXR1cm4gLTE7DQoJfQ0KCXJldHVybiBsc2VlayAoZmQs
IChvZmZfdCkgb2Zmc2V0LCBvcmlnaW4pOw0KfQ0KDQojZW5kaWYgCS8qIGxpbnV4ICovDQoN
Ci8vDQovLyAgbG93IGxldmVsIGRpc2sgc2VjdG9yIGludGVyZmFjZSByb3V0aW5lcw0KLy8N
Cg0KVUxPTkcgcFJlYWREaXNrU2VjdG9ycyhVTE9ORyBkaXNrLCBVTE9ORyBTdGFydGluZ0xC
QSwgQllURSAqU2VjdG9yLA0KCQkgICAgICBVTE9ORyBzZWN0b3JzLCBVTE9ORyByZWFkQWhl
YWQpDQp7DQogICAgcmVnaXN0ZXIgVUxPTkcgaSwgYnl0ZXNSZWFkID0gMDsNCiAgICBMT05H
TE9ORyBjY29kZTsNCiAgICByZWdpc3RlciBVTE9ORyBicHMsIGNieXRlczsNCiAgICByZWdp
c3RlciBOV0RJU0sgKk5XRGlzazsNCg0KICAgIE5XRGlzayA9IFN5c3RlbURpc2tbZGlza107
DQogICAgYnBzID0gTldEaXNrLT5CeXRlc1BlclNlY3RvcjsNCiAgICBmb3IgKGk9MDsgaSA8
IHNlY3RvcnM7IGkrKykNCiAgICB7DQogICAgICAgTE9OR0xPTkcgb2Zmc2V0Ow0KDQogICAg
ICAgb2Zmc2V0ID0gKExPTkdMT05HKSAoU3RhcnRpbmdMQkEgKyBpKSAqIChMT05HTE9ORykg
YnBzOw0KICAgICAgIGNjb2RlID0gZXh0Ml9sbHNlZWsoKGludClOV0Rpc2stPlBoeXNpY2Fs
RGlza0hhbmRsZSwNCgkJCSAgIG9mZnNldCwgU0VFS19TRVQpOw0KDQogICAgICAgaWYgKGNj
b2RlID09IChMT05HTE9ORykgLTEpDQoJICByZXR1cm4gYnl0ZXNSZWFkOw0KDQogICAgICAg
Y2J5dGVzID0gcmVhZCgoaW50KU5XRGlzay0+UGh5c2ljYWxEaXNrSGFuZGxlLA0KCQkgICAg
ICAmU2VjdG9yW2kgKiBicHNdLCBicHMpOw0KDQogICAgICAgaWYgKGNieXRlcyAhPSBicHMp
DQogICAgICAgew0KCSAgYnl0ZXNSZWFkICs9IGNieXRlczsNCgkgIHJldHVybiBieXRlc1Jl
YWQ7DQogICAgICAgfQ0KICAgICAgIGJ5dGVzUmVhZCArPSBicHM7DQogICAgfQ0KICAgIHJl
dHVybiBieXRlc1JlYWQ7DQp9DQoNClVMT05HIHBXcml0ZURpc2tTZWN0b3JzKFVMT05HIGRp
c2ssIFVMT05HIFN0YXJ0aW5nTEJBLCBCWVRFICpTZWN0b3IsDQoJCSAgICAgICBVTE9ORyBz
ZWN0b3JzLCBVTE9ORyByZWFkQWhlYWQpDQp7DQogICAgcmVnaXN0ZXIgVUxPTkcgaSwgYnl0
ZXNXcml0dGVuID0gMDsNCiAgICBMT05HTE9ORyBjY29kZTsNCiAgICByZWdpc3RlciBVTE9O
RyBicHMsIGNieXRlczsNCiAgICByZWdpc3RlciBOV0RJU0sgKk5XRGlzazsNCg0KICAgIE5X
RGlzayA9IFN5c3RlbURpc2tbZGlza107DQogICAgYnBzID0gTldEaXNrLT5CeXRlc1BlclNl
Y3RvcjsNCg0KICAgIGZvciAoaT0wOyBpIDwgc2VjdG9yczsgaSsrKQ0KICAgIHsNCiAgICAg
ICBMT05HTE9ORyBvZmZzZXQ7DQoNCiAgICAgICBvZmZzZXQgPSAoTE9OR0xPTkcpIChTdGFy
dGluZ0xCQSArIGkpICogKExPTkdMT05HKSBicHM7DQogICAgICAgY2NvZGUgPSBleHQyX2xs
c2VlaygoaW50KU5XRGlzay0+UGh5c2ljYWxEaXNrSGFuZGxlLA0KCQkJICAgb2Zmc2V0LCBT
RUVLX1NFVCk7DQoNCiAgICAgICBpZiAoY2NvZGUgPT0gKExPTkdMT05HKSAtMSkNCgkgIHJl
dHVybiBieXRlc1dyaXR0ZW47DQoNCiAgICAgICBjYnl0ZXMgPSB3cml0ZSgoaW50KU5XRGlz
ay0+UGh5c2ljYWxEaXNrSGFuZGxlLA0KCQkgICAgICAgJlNlY3RvcltpICogYnBzXSwgYnBz
KTsNCg0KICAgICAgIGlmIChjYnl0ZXMgIT0gYnBzKQ0KICAgICAgIHsNCgkgIGJ5dGVzV3Jp
dHRlbiArPSBjYnl0ZXM7DQoJICByZXR1cm4gYnl0ZXNXcml0dGVuOw0KICAgICAgIH0NCiAg
ICAgICBieXRlc1dyaXR0ZW4gKz0gYnBzOw0KICAgIH0NCiAgICByZXR1cm4gYnl0ZXNXcml0
dGVuOw0KDQp9DQoNClVMT05HIHBaZXJvRmlsbERpc2tTZWN0b3JzKFVMT05HIGRpc2ssIFVM
T05HIFN0YXJ0aW5nTEJBLCBVTE9ORyBzZWN0b3JzLA0KCQkJICBVTE9ORyByZWFkQWhlYWQp
DQp7DQogICAgcmVnaXN0ZXIgVUxPTkcgaSwgYnl0ZXNXcml0dGVuID0gMDsNCiAgICBMT05H
TE9ORyBjY29kZTsNCiAgICByZWdpc3RlciBVTE9ORyBicHMsIGNieXRlczsNCiAgICByZWdp
c3RlciBOV0RJU0sgKk5XRGlzazsNCg0KICAgIE5XRGlzayA9IFN5c3RlbURpc2tbZGlza107
DQogICAgYnBzID0gTldEaXNrLT5CeXRlc1BlclNlY3RvcjsNCg0KICAgIGZvciAoaT0wOyBp
IDwgc2VjdG9yczsgaSsrKQ0KICAgIHsNCiAgICAgICBMT05HTE9ORyBvZmZzZXQ7DQoNCiAg
ICAgICBvZmZzZXQgPSAoTE9OR0xPTkcpIChTdGFydGluZ0xCQSArIGkpICogKExPTkdMT05H
KSBicHM7DQogICAgICAgY2NvZGUgPSBleHQyX2xsc2VlaygoaW50KU5XRGlzay0+UGh5c2lj
YWxEaXNrSGFuZGxlLA0KCQkJICAgb2Zmc2V0LCBTRUVLX1NFVCk7DQoNCiAgICAgICBpZiAo
Y2NvZGUgPT0gKExPTkdMT05HKSAtMSkNCgkgIHJldHVybiBieXRlc1dyaXR0ZW47DQoNCiAg
ICAgICBjYnl0ZXMgPSB3cml0ZSgoaW50KU5XRGlzay0+UGh5c2ljYWxEaXNrSGFuZGxlLA0K
CQkgICAgICAmWmVyb0J1ZmZlcltpICogYnBzXSwgYnBzKTsNCg0KICAgICAgIGlmIChjYnl0
ZXMgIT0gYnBzKQ0KICAgICAgIHsNCgkgIGJ5dGVzV3JpdHRlbiArPSBjYnl0ZXM7DQoJICBy
ZXR1cm4gYnl0ZXNXcml0dGVuOw0KICAgICAgIH0NCg0KICAgICAgIGJ5dGVzV3JpdHRlbiAr
PSBicHM7DQogICAgfQ0KICAgIHJldHVybiBieXRlc1dyaXR0ZW47DQoNCn0NCg0Kdm9pZCBT
eW5jRGV2aWNlKFVMT05HIGRpc2spDQp7DQogICAgc3luYygpOw0KICAgIHN5bmMoKTsNCiAg
ICByZXR1cm47DQp9DQoNClVMT05HIFJlYWREaXNrU2VjdG9ycyhVTE9ORyBkaXNrLCBVTE9O
RyBMQkEsIEJZVEUgKlNlY3RvciwNCgkJCSAgICAgVUxPTkcgc2VjdG9ycywgVUxPTkcgcmVh
ZEFoZWFkKQ0Kew0KICAgIHJldHVybiAocFJlYWREaXNrU2VjdG9ycyhkaXNrLCBMQkEsIFNl
Y3Rvciwgc2VjdG9ycywgcmVhZEFoZWFkKSk7DQp9DQoNClVMT05HIFdyaXRlRGlza1NlY3Rv
cnMoVUxPTkcgZGlzaywgVUxPTkcgTEJBLCBCWVRFICpTZWN0b3IsDQoJCQkgICAgICBVTE9O
RyBzZWN0b3JzLCBVTE9ORyByZWFkQWhlYWQpDQp7DQogICAgcmV0dXJuIChwV3JpdGVEaXNr
U2VjdG9ycyhkaXNrLCBMQkEsIFNlY3Rvciwgc2VjdG9ycywgcmVhZEFoZWFkKSk7DQp9DQoN
ClVMT05HIFplcm9GaWxsRGlza1NlY3RvcnMoVUxPTkcgZGlzaywgVUxPTkcgU3RhcnRpbmdM
QkEsDQoJCQkJIFVMT05HIHNlY3RvcnMsIFVMT05HIHJlYWRBaGVhZCkNCnsNCiAgICByZXR1
cm4gKHBaZXJvRmlsbERpc2tTZWN0b3JzKGRpc2ssIFN0YXJ0aW5nTEJBLCBzZWN0b3JzLCBy
ZWFkQWhlYWQpKTsNCn0NCg0KI2VuZGlmDQoNCg0KI2lmIChXSU5ET1dTX05UIHwgV0lORE9X
U19OVF9STykNCg0KZXh0ZXJuIFVMT05HIFJlYWREaXNrKHZvaWQgKkRpc2tQb2ludGVyLCBV
TE9ORyBTZWN0b3JPZmZzZXQsIEJZVEUgKkJ1ZmZlciwNCgkJICAgICAgVUxPTkcgU2VjdG9y
Q291bnQpOw0KDQovLw0KLy8gIGxvdyBsZXZlbCBkaXNrIHNlY3RvciBpbnRlcmZhY2Ugcm91
dGluZXMNCi8vDQoNClVMT05HIHBSZWFkRGlza1NlY3RvcnMoVUxPTkcgZGlzaywgVUxPTkcg
U3RhcnRpbmdMQkEsIEJZVEUgKlNlY3RvciwNCgkJICAgICAgVUxPTkcgc2VjdG9ycywgVUxP
TkcgcmVhZEFoZWFkKQ0Kew0KICAgIHJlZ2lzdGVyIFVMT05HIGJ5dGVzUmVhZCA9IDAsIHJl
dENvZGU7DQogICAgcmVnaXN0ZXIgVUxPTkcgYnBzOw0KICAgIHN0cnVjdCBidWZmZXJfaGVh
ZCAqYmg7DQogICAgcmVnaXN0ZXIgTldESVNLICpOV0Rpc2s7DQoNCiAgICBOV0Rpc2sgPSBT
eXN0ZW1EaXNrW2Rpc2tdOw0KICAgIGJwcyA9IE5XRGlzay0+Qnl0ZXNQZXJTZWN0b3I7DQoN
CiAgICByZXRDb2RlID0gUmVhZERpc2soU3lzdGVtRGlza1tkaXNrXS0+UGh5c2ljYWxEaXNr
SGFuZGxlLA0KCQkgICAgICAgU3RhcnRpbmdMQkEsIFNlY3Rvciwgc2VjdG9ycyk7DQoNCiAg
ICBpZiAoTlRfU1VDQ0VTUyhyZXRDb2RlKSkNCiAgICAgICBieXRlc1JlYWQgKz0gKHNlY3Rv
cnMgKiBicHMpOw0KDQogICAgcmV0dXJuIGJ5dGVzUmVhZDsNCg0KfQ0KDQpVTE9ORyBwV3Jp
dGVEaXNrU2VjdG9ycyhVTE9ORyBkaXNrLCBVTE9ORyBTdGFydGluZ0xCQSwgQllURSAqU2Vj
dG9yLA0KCQkgICAgICAgVUxPTkcgc2VjdG9ycywgVUxPTkcgcmVhZEFoZWFkKQ0Kew0KICAg
IHJldHVybiAwOw0KfQ0KDQpVTE9ORyBwWmVyb0ZpbGxEaXNrU2VjdG9ycyhVTE9ORyBkaXNr
LCBVTE9ORyBTdGFydGluZ0xCQSwgVUxPTkcgc2VjdG9ycywNCgkJCSAgVUxPTkcgcmVhZEFo
ZWFkKQ0Kew0KICAgIHJldHVybiAwOw0KfQ0KDQp2b2lkIFN5bmNEZXZpY2UoVUxPTkcgZGlz
aykNCnsNCiAgICByZXR1cm47DQp9DQoNClVMT05HIFJlYWREaXNrU2VjdG9ycyhVTE9ORyBk
aXNrLCBVTE9ORyBMQkEsIEJZVEUgKlNlY3RvciwNCgkJCSAgICAgVUxPTkcgc2VjdG9ycywg
VUxPTkcgcmVhZEFoZWFkKQ0Kew0KICAgIHJldHVybiAocFJlYWREaXNrU2VjdG9ycyhkaXNr
LCBMQkEsIFNlY3Rvciwgc2VjdG9ycywgcmVhZEFoZWFkKSk7DQp9DQoNClVMT05HIFdyaXRl
RGlza1NlY3RvcnMoVUxPTkcgZGlzaywgVUxPTkcgTEJBLCBCWVRFICpTZWN0b3IsDQoJCQkg
ICAgICBVTE9ORyBzZWN0b3JzLCBVTE9ORyByZWFkQWhlYWQpDQp7DQogICAgcmV0dXJuIChw
V3JpdGVEaXNrU2VjdG9ycyhkaXNrLCBMQkEsIFNlY3Rvciwgc2VjdG9ycywgcmVhZEFoZWFk
KSk7DQp9DQoNClVMT05HIFplcm9GaWxsRGlza1NlY3RvcnMoVUxPTkcgZGlzaywgVUxPTkcg
U3RhcnRpbmdMQkEsDQoJCQkJIFVMT05HIHNlY3RvcnMsIFVMT05HIHJlYWRBaGVhZCkNCnsN
CiAgICByZXR1cm4gKHBaZXJvRmlsbERpc2tTZWN0b3JzKGRpc2ssIFN0YXJ0aW5nTEJBLCBz
ZWN0b3JzLCByZWFkQWhlYWQpKTsNCn0NCg0KI2VuZGlmDQoNCg0KI2lmIChET1NfVVRJTCkN
Cg0KI2RlZmluZSBSRUFEX0RFVklDRSAgIDB4MDINCiNkZWZpbmUgV1JJVEVfREVWSUNFICAw
eDAzDQojZGVmaW5lIE5PX1ZFUklGWSAgICAgMHgwMA0KI2RlZmluZSBXUklURV9WRVJJRlkg
IDB4MDENCg0KLy8gY29udmVydCBjeWxpbmRlci9oZWFkL3NlY3RvciBhZGRyZXNzaW5nIHRv
IExCQQ0KDQpVTE9ORyBDSFN0b0xCQShVTE9ORyBkaXNrLCBMT05HTE9ORyBjeWwsIFVMT05H
IGhlYWQsIFVMT05HIHNlY3RvcikNCnsNCiAgICByZWdpc3RlciBVTE9ORyBsYmE7DQogICAg
VUxPTkcgaGVhZHMgPSBTeXN0ZW1EaXNrW2Rpc2tdLT5UcmFja3NQZXJDeWxpbmRlcjsNCiAg
ICBVTE9ORyBzZWN0b3JzID0gU3lzdGVtRGlza1tkaXNrXS0+U2VjdG9yc1BlclRyYWNrOw0K
DQogICAgbGJhID0gY3lsICogKGhlYWRzICogc2VjdG9ycyk7DQogICAgbGJhICs9IChoZWFk
ICogc2VjdG9ycyk7DQogICAgbGJhICs9IHNlY3RvcjsNCiAgICBsYmEgLT0gMTsgICAgLy8g
Q0hTIGlzIDEgcmVsYXRpdmUgc28gYWRqdXN0IExCQSBieSBzdWJ0cmFjdGluZyAxDQoNCiAg
ICByZXR1cm4gbGJhOw0KDQp9DQoNCi8vIGNvbnZlcnQgTEJBIHRvIGN5bGluZGVyL2hlYWQv
c2VjdG9yIGFkZHJlc3NpbmcNCg0KVUxPTkcgTEJBdG9DSFMoVUxPTkcgZGlzaywgVUxPTkcg
bGJhLCBMT05HTE9ORyAqY3lsLCBVTE9ORyAqaGVhZCwNCgkgICAgICAgVUxPTkcgKnNlY3Rv
cikNCnsNCiAgICBVTE9ORyBvZmZzZXQ7DQogICAgVUxPTkcgaGVhZHMgPSBTeXN0ZW1EaXNr
W2Rpc2tdLT5UcmFja3NQZXJDeWxpbmRlcjsNCiAgICBVTE9ORyBzZWN0b3JzID0gU3lzdGVt
RGlza1tkaXNrXS0+U2VjdG9yc1BlclRyYWNrOw0KDQogICAgaWYgKCFjeWwgfHwgIWhlYWQg
fHwgIXNlY3RvcikNCiAgICAgICByZXR1cm4gLTE7DQoNCiAgICAqY3lsID0gKGxiYSAvICho
ZWFkcyAqIHNlY3RvcnMpKTsNCiAgICBvZmZzZXQgPSBsYmEgJSAoaGVhZHMgKiBzZWN0b3Jz
KTsNCiAgICAqaGVhZCA9IChXT1JEKShvZmZzZXQgLyBzZWN0b3JzKTsNCiAgICAqc2VjdG9y
ID0gKFdPUkQpKG9mZnNldCAlIHNlY3RvcnMpICsgMTsgIC8vIHNlY3RvciBhZGRyZXNzaW5n
IGlzDQoJCQkJCSAgICAgLy8gMSByZWxhdGl2ZSBzbyBhZGQgMQ0KICAgIHJldHVybiAwOw0K
fQ0KDQpVTE9ORyBwUmVhZERpc2tTZWN0b3JzKFVMT05HIGRpc2ssIFVMT05HIFN0YXJ0aW5n
TEJBLCBCWVRFICpTZWN0b3IsDQoJCSAgICAgIFVMT05HIHNlY3RvcnMsIFVMT05HIHJlYWRB
aGVhZCkNCnsNCiAgICByZWdpc3RlciBVTE9ORyBicHMsIGNjb2RlLCBieXRlcyA9IDA7DQog
ICAgcmVnaXN0ZXIgTldESVNLICpOV0Rpc2s7DQogICAgTE9OR0xPTkcgY3lsaW5kZXI7DQog
ICAgVUxPTkcgaGVhZCwgc2VjdG9yOw0KICAgIHN0YXRpYyBfZ28zMl9kcG1pX3JlZ2lzdGVy
cyByOw0KI2lmIChXSU5ET1dTXzk4X1VUSUwpDQogICAgc3RhdGljIHVuaW9uIFJFR1Mgcmw7
DQojZW5kaWYNCg0KICAgIE5XRlNTZXQoJnIsIDAsIHNpemVvZihfZ28zMl9kcG1pX3JlZ2lz
dGVycykpOw0KDQogICAgTldEaXNrID0gU3lzdGVtRGlza1tkaXNrXTsNCiAgICBicHMgPSBO
V0Rpc2stPkJ5dGVzUGVyU2VjdG9yOw0KDQogICAgaWYgKChzZWN0b3JzICogYnBzKSA+IElP
X0JMT0NLX1NJWkUpDQogICAgICAgcmV0dXJuIGJ5dGVzOw0KDQojaWYgKFdJTkRPV1NfOThf
VVRJTCkNCiAgICBybC54LmF4ID0gMHg0NDBEOyAgICAvLyBnZW5lcmljIElPQ1RMDQogICAg
cmwuaC5iaCA9IDM7ICAgICAgICAgLy8gbG9ja3MgbGV2ZWxzIDAsIDEsIDIgb3IgMw0KICAg
IHJsLmguYmwgPSAoMHg4MCB8IChkaXNrICYgMHg3RikpOyAvLyBkb3MgbGltaXQgaXMgMTI4
IGRyaXZlcw0KICAgIHJsLmguY2ggPSAweDA4OyAgICAgIC8vIGRldmljZSBjYXRlZ29yeQ0K
ICAgIHJsLmguY2wgPSAweDRCOyAgICAgIC8vIGxvY2sgcGh5c2ljYWwgdm9sdW1lDQogICAg
cmwueC5keCA9IDA7ICAgICAgICAgLy8gcGVybWlzc2lvbnMNCiAgICBpbnQ4NigweDIxLCAm
cmwsICZybCk7DQoNCiNlbmRpZg0KDQogICAgaWYgKE5XRGlzay0+SW50MTNFeHRlbnNpb25z
KQ0KICAgIHsNCiAgICAgICBFWFRfUkVRVUVTVCByZXF1ZXN0Ow0KDQogICAgICAgTldGU1Nl
dCgmcmVxdWVzdCwgMCwgc2l6ZW9mKEVYVF9SRVFVRVNUKSk7DQoNCiAgICAgICByZXF1ZXN0
LlNpemUgPSBzaXplb2YoRVhUX1JFUVVFU1QpOw0KICAgICAgIHJlcXVlc3QuQmxvY2tzID0g
c2VjdG9yczsNCiAgICAgICByZXF1ZXN0LlRyYW5zZmVyQnVmZmVyID0gKFVMT05HKShOV0Rp
c2stPkRhdGFTZWdtZW50IDw8IDE2KSAmIDB4RkZGRjAwMDA7DQogICAgICAgcmVxdWVzdC5M
QkEgPSBTdGFydGluZ0xCQTsNCg0KICAgICAgIG1vdmVkYXRhKF9teV9kcygpLA0KCQkodW5z
aWduZWQpJnJlcXVlc3QsDQoJCU5XRGlzay0+UmVxdWVzdFNlbGVjdG9yLA0KCQkwLA0KCQlz
aXplb2YoRVhUX1JFUVVFU1QpKTsNCg0KICAgICAgIHIuaC5haCA9IDB4NDI7DQogICAgICAg
ci5oLmRsID0gKDB4ODAgfCAoZGlzayAmIDB4N0YpKTsNCiAgICAgICByLnguZHMgPSBOV0Rp
c2stPlJlcXVlc3RTZWdtZW50Ow0KICAgICAgIHIueC5zaSA9IDA7DQogICAgICAgci54LnNz
ID0gci54LnNwID0gci54LmZsYWdzID0gMDsNCg0KICAgICAgIGNjb2RlID0gX2dvMzJfZHBt
aV9zaW11bGF0ZV9pbnQoMHgxMywgJnIpOw0KICAgICAgIGlmIChjY29kZSkNCgkgIGdvdG8g
UmVhZEV4aXQ7DQoNCiAgICAgICAvLyBlcnJvciBpZiBjYXJyeSBmbGFnIGlzIHNldA0KICAg
ICAgIGlmIChyLnguZmxhZ3MgJiAxKQ0KICAgICAgIHsNCgkgIC8vIGlmIHRoZSBkcml2ZSBy
ZXBvcnRlZCBhbiBFQ0Mgb2NjdXJyZWQsIHJldHVybiBzdWNjZXNzDQoJICBpZiAoci5oLmFo
ID09IDB4MTEpDQoJICB7DQoJCW1vdmVkYXRhKE5XRGlzay0+RGF0YVNlbGVjdG9yLA0KCQkJ
IDAsDQoJCQkgX215X2RzKCksDQoJCQkgKHVuc2lnbmVkKVNlY3RvciwNCgkJCSAoc2VjdG9y
cyAqIGJwcykpOw0KDQoJCWJ5dGVzID0gKHNlY3RvcnMgKiBicHMpOw0KCQlnb3RvIFJlYWRF
eGl0Ow0KCSAgfQ0KCSAgZWxzZQ0KCSAgICAgZ290byBSZWFkRXhpdDsNCiAgICAgICB9DQoN
CiAgICAgICBtb3ZlZGF0YShOV0Rpc2stPkRhdGFTZWxlY3RvciwNCgkJMCwNCgkJX215X2Rz
KCksDQoJCSh1bnNpZ25lZClTZWN0b3IsDQoJCShzZWN0b3JzICogYnBzKSk7DQoNCiAgICAg
ICBieXRlcyA9IChzZWN0b3JzICogYnBzKTsNCiAgICAgICBnb3RvIFJlYWRFeGl0Ow0KICAg
IH0NCiAgICBlbHNlDQogICAgew0KICAgICAgIGNjb2RlID0gTEJBdG9DSFMoZGlzaywgU3Rh
cnRpbmdMQkEsICZjeWxpbmRlciwgJmhlYWQsICZzZWN0b3IpOw0KICAgICAgIGlmIChjY29k
ZSkNCgkgIGdvdG8gUmVhZEV4aXQ7DQoNCiAgICAgICByLmguZGggPSAoQllURSloZWFkOw0K
ICAgICAgIHIuaC5kbCA9ICgweDgwIHwgKGRpc2sgJiAweDdGKSk7DQogICAgICAgci5oLmNo
ID0gKEJZVEUpKGN5bGluZGVyICYgMHhGRik7DQogICAgICAgci5oLmNsID0gKEJZVEUpKChj
eWxpbmRlciAmIDB4MDMwMCkgPj4gMik7DQogICAgICAgci5oLmNsIHw9IChCWVRFKShzZWN0
b3IgJiAweDNGKTsNCiAgICAgICByLmguYWggPSBSRUFEX0RFVklDRTsNCiAgICAgICByLmgu
YWwgPSAoQllURSlzZWN0b3JzOw0KICAgICAgIHIueC5lcyA9IE5XRGlzay0+RGF0YVNlZ21l
bnQ7DQogICAgICAgci54LmJ4ID0gMDsNCiAgICAgICByLnguc3MgPSByLnguc3AgPSByLngu
ZmxhZ3MgPSAwOw0KDQogICAgICAgY2NvZGUgPSBfZ28zMl9kcG1pX3NpbXVsYXRlX2ludCgw
eDEzLCAmcik7DQogICAgICAgaWYgKGNjb2RlKQ0KCSAgZ290byBSZWFkRXhpdDsNCg0KICAg
ICAgIC8vIGVycm9yIGlmIGNhcnJ5IGZsYWcgaXMgc2V0DQogICAgICAgaWYgKHIueC5mbGFn
cyAmIDEpDQogICAgICAgew0KCSAgLy8gaWYgdGhlIGRyaXZlIHJlcG9ydGVkIGFuIEVDQyBv
Y2N1cnJlZCwgcmV0dXJuIHN1Y2Nlc3MNCgkgIGlmIChyLmguYWggPT0gMHgxMSkNCgkgIHsN
CgkgICAgIG1vdmVkYXRhKE5XRGlzay0+RGF0YVNlbGVjdG9yLA0KCQkJIDAsDQoJCQkgX215
X2RzKCksDQoJCQkgKHVuc2lnbmVkKVNlY3RvciwNCgkJCSAoc2VjdG9ycyAqIGJwcykpOw0K
DQoJICAgICBieXRlcyA9IChzZWN0b3JzICogYnBzKTsNCgkgICAgIGdvdG8gUmVhZEV4aXQ7
DQoJICB9DQoJICBlbHNlDQoJICAgICBnb3RvIFJlYWRFeGl0Ow0KICAgICAgIH0NCg0KICAg
ICAgIG1vdmVkYXRhKE5XRGlzay0+RGF0YVNlbGVjdG9yLA0KCQkwLA0KCQlfbXlfZHMoKSwN
CgkJKHVuc2lnbmVkKVNlY3RvciwNCgkJKHNlY3RvcnMgKiBicHMpKTsNCg0KICAgICAgIGJ5
dGVzID0gKHNlY3RvcnMgKiBicHMpOw0KICAgIH0NCg0KUmVhZEV4aXQ6Ow0KI2lmIChXSU5E
T1dTXzk4X1VUSUwpDQogICAgcmwueC5heCA9IDB4NDQwRDsgICAgLy8gZ2VuZXJpYyBJT0NU
TA0KICAgIHJsLmguYmwgPSAoMHg4MCB8IChkaXNrICYgMHg3RikpOyAvLyBkb3MgbGltaXQg
aXMgMTI4IGRyaXZlcw0KICAgIHJsLmguY2ggPSAweDA4OyAgICAgIC8vIGRldmljZSBjYXRl
Z29yeQ0KICAgIHJsLmguY2wgPSAweDZCOyAgICAgIC8vIHVubG9jayBwaHlzaWNhbCB2b2x1
bWUNCiAgICBpbnQ4NigweDIxLCAmcmwsICZybCk7DQojZW5kaWYNCg0KICAgIHJldHVybiBi
eXRlczsNCg0KfQ0KDQoNClVMT05HIHBXcml0ZURpc2tTZWN0b3JzKFVMT05HIGRpc2ssIFVM
T05HIFN0YXJ0aW5nTEJBLCBCWVRFICpTZWN0b3IsDQoJCSAgICAgICBVTE9ORyBzZWN0b3Jz
LCBVTE9ORyByZWFkQWhlYWQpDQp7DQogICAgcmVnaXN0ZXIgVUxPTkcgYnBzLCBjY29kZSwg
Ynl0ZXMgPSAwOw0KICAgIHJlZ2lzdGVyIE5XRElTSyAqTldEaXNrOw0KICAgIExPTkdMT05H
IGN5bGluZGVyOw0KICAgIFVMT05HIGhlYWQsIHNlY3RvcjsNCiAgICBzdGF0aWMgX2dvMzJf
ZHBtaV9yZWdpc3RlcnMgcjsNCiNpZiAoV0lORE9XU185OF9VVElMKQ0KICAgIHN0YXRpYyB1
bmlvbiBSRUdTIHJsOw0KI2VuZGlmDQoNCiAgICBOV0ZTU2V0KCZyLCAwLCBzaXplb2YoX2dv
MzJfZHBtaV9yZWdpc3RlcnMpKTsNCg0KICAgIE5XRGlzayA9IFN5c3RlbURpc2tbZGlza107
DQogICAgYnBzID0gTldEaXNrLT5CeXRlc1BlclNlY3RvcjsNCg0KICAgIGlmICgoc2VjdG9y
cyAqIGJwcykgPiBJT19CTE9DS19TSVpFKQ0KICAgICAgIHJldHVybiBieXRlczsNCg0KI2lm
IChXSU5ET1dTXzk4X1VUSUwpDQogICAgcmwueC5heCA9IDB4NDQwRDsgICAgLy8gZ2VuZXJp
YyBJT0NUTA0KICAgIHJsLmguYmggPSAzOyAgICAgICAgIC8vIGxvY2tzIGxldmVscyAwLCAx
LCAyIG9yIDMNCiAgICBybC5oLmJsID0gKDB4ODAgfCAoZGlzayAmIDB4N0YpKTsgLy8gZG9z
IGxpbWl0IGlzIDEyOCBkcml2ZXMNCiAgICBybC5oLmNoID0gMHgwODsgICAgICAvLyBkZXZp
Y2UgY2F0ZWdvcnkNCiAgICBybC5oLmNsID0gMHg0QjsgICAgICAvLyBsb2NrIHBoeXNpY2Fs
IHZvbHVtZQ0KICAgIHJsLnguZHggPSAwOyAgICAgICAgIC8vIHBlcm1pc3Npb25zDQogICAg
aW50ODYoMHgyMSwgJnJsLCAmcmwpOw0KDQojZW5kaWYNCg0KICAgIGlmIChOV0Rpc2stPklu
dDEzRXh0ZW5zaW9ucykNCiAgICB7DQogICAgICAgRVhUX1JFUVVFU1QgcmVxdWVzdDsNCg0K
ICAgICAgIE5XRlNTZXQoJnJlcXVlc3QsIDAsIHNpemVvZihFWFRfUkVRVUVTVCkpOw0KDQog
ICAgICAgcmVxdWVzdC5TaXplID0gc2l6ZW9mKEVYVF9SRVFVRVNUKTsNCiAgICAgICByZXF1
ZXN0LkJsb2NrcyA9IHNlY3RvcnM7DQogICAgICAgcmVxdWVzdC5UcmFuc2ZlckJ1ZmZlciA9
IChVTE9ORykoTldEaXNrLT5EYXRhU2VnbWVudCA8PCAxNikgJiAweEZGRkYwMDAwOw0KICAg
ICAgIHJlcXVlc3QuTEJBID0gU3RhcnRpbmdMQkE7DQoNCiAgICAgICBtb3ZlZGF0YShfbXlf
ZHMoKSwNCgkJKHVuc2lnbmVkKSZyZXF1ZXN0LA0KCQlOV0Rpc2stPlJlcXVlc3RTZWxlY3Rv
ciwNCgkJMCwNCgkJc2l6ZW9mKEVYVF9SRVFVRVNUKSk7DQoNCiAgICAgICBtb3ZlZGF0YShf
bXlfZHMoKSwNCgkJKHVuc2lnbmVkKVNlY3RvciwNCgkJTldEaXNrLT5EYXRhU2VsZWN0b3Is
DQoJCTAsDQoJCShzZWN0b3JzICogYnBzKSk7DQoNCiAgICAgICByLmguYWggPSAweDQzOw0K
ICAgICAgIHIuaC5hbCA9IE5PX1ZFUklGWTsNCiAgICAgICByLmguZGwgPSAoMHg4MCB8IChk
aXNrICYgMHg3RikpOw0KICAgICAgIHIueC5kcyA9IE5XRGlzay0+UmVxdWVzdFNlZ21lbnQ7
DQogICAgICAgci54LnNpID0gMDsNCiAgICAgICByLnguc3MgPSByLnguc3AgPSByLnguZmxh
Z3MgPSAwOw0KDQogICAgICAgY2NvZGUgPSBfZ28zMl9kcG1pX3NpbXVsYXRlX2ludCgweDEz
LCAmcik7DQogICAgICAgaWYgKGNjb2RlKQ0KCSAgZ290byBXcml0ZUV4aXQ7DQoNCiAgICAg
ICAvLyBlcnJvciBpZiBjYXJyeSBmbGFnIGlzIHNldA0KICAgICAgIGlmIChyLnguZmxhZ3Mg
JiAxKQ0KICAgICAgIHsNCgkgIC8vIGlmIHRoZSBkcml2ZSByZXBvcnRlZCBhbiBFQ0Mgb2Nj
dXJyZWQsIHJldHVybiBzdWNjZXNzDQoJICBpZiAoci5oLmFoID09IDB4MTEpDQoJICB7DQoJ
ICAgICBieXRlcyA9IChzZWN0b3JzICogYnBzKTsNCgkgICAgIGdvdG8gV3JpdGVFeGl0Ow0K
CSAgfQ0KCSAgZWxzZQ0KCSAgICAgZ290byBXcml0ZUV4aXQ7DQogICAgICAgfQ0KICAgICAg
IGJ5dGVzID0gKHNlY3RvcnMgKiBicHMpOw0KICAgICAgIGdvdG8gV3JpdGVFeGl0Ow0KICAg
IH0NCiAgICBlbHNlDQogICAgew0KICAgICAgIGNjb2RlID0gTEJBdG9DSFMoZGlzaywgU3Rh
cnRpbmdMQkEsICZjeWxpbmRlciwgJmhlYWQsICZzZWN0b3IpOw0KICAgICAgIGlmIChjY29k
ZSkNCgkgIGdvdG8gV3JpdGVFeGl0Ow0KDQogICAgICAgbW92ZWRhdGEoX215X2RzKCksDQoJ
CSh1bnNpZ25lZClTZWN0b3IsDQoJCU5XRGlzay0+RGF0YVNlbGVjdG9yLA0KCQkwLA0KCQko
c2VjdG9ycyAqIGJwcykpOw0KDQogICAgICAgci5oLmRoID0gKEJZVEUpaGVhZDsNCiAgICAg
ICByLmguZGwgPSAoMHg4MCB8IChkaXNrICYgMHg3RikpOw0KICAgICAgIHIuaC5jaCA9IChC
WVRFKShjeWxpbmRlciAmIDB4RkYpOw0KICAgICAgIHIuaC5jbCA9IChCWVRFKSgoY3lsaW5k
ZXIgJiAweDAzMDApID4+IDIpOw0KICAgICAgIHIuaC5jbCB8PSAoQllURSkoc2VjdG9yICYg
MHgzRik7DQogICAgICAgci5oLmFoID0gV1JJVEVfREVWSUNFOw0KICAgICAgIHIuaC5hbCA9
IChCWVRFKXNlY3RvcnM7DQogICAgICAgci54LmVzID0gTldEaXNrLT5EYXRhU2VnbWVudDsN
CiAgICAgICByLnguYnggPSAwOw0KICAgICAgIHIueC5kcyA9IHIueC5zcyA9IHIueC5zcCA9
IHIueC5mbGFncyA9IDA7DQoNCiAgICAgICBjY29kZSA9IF9nbzMyX2RwbWlfc2ltdWxhdGVf
aW50KDB4MTMsICZyKTsNCiAgICAgICBpZiAoY2NvZGUpDQoJICBnb3RvIFdyaXRlRXhpdDsN
Cg0KICAgICAgIC8vIGVycm9yIGlmIGNhcnJ5IGZsYWcgaXMgc2V0DQogICAgICAgaWYgKHIu
eC5mbGFncyAmIDEpDQogICAgICAgew0KCSAgLy8gaWYgdGhlIGRyaXZlIHJlcG9ydGVkIGFu
IEVDQyBvY2N1cnJlZCwgcmV0dXJuIHN1Y2Nlc3MNCgkgIGlmIChyLmguYWggPT0gMHgxMSkN
CgkgIHsNCgkgICAgIGJ5dGVzID0gKHNlY3RvcnMgKiBicHMpOw0KCSAgICAgZ290byBXcml0
ZUV4aXQ7DQoJICB9DQoJICBlbHNlDQoJICAgICBnb3RvIFdyaXRlRXhpdDsNCiAgICAgICB9
DQogICAgICAgYnl0ZXMgPSAoc2VjdG9ycyAqIGJwcyk7DQogICAgICAgZ290byBXcml0ZUV4
aXQ7DQogICAgfQ0KDQpXcml0ZUV4aXQ6Ow0KI2lmIChXSU5ET1dTXzk4X1VUSUwpDQogICAg
cmwueC5heCA9IDB4NDQwRDsgICAgLy8gZ2VuZXJpYyBJT0NUTA0KICAgIHJsLmguYmwgPSAo
MHg4MCB8IChkaXNrICYgMHg3RikpOyAvLyBkb3MgbGltaXQgaXMgMTI4IGRyaXZlcw0KICAg
IHJsLmguY2ggPSAweDA4OyAgICAgIC8vIGRldmljZSBjYXRlZ29yeQ0KICAgIHJsLmguY2wg
PSAweDZCOyAgICAgIC8vIHVubG9jayBwaHlzaWNhbCB2b2x1bWUNCiAgICBpbnQ4NigweDIx
LCAmcmwsICZybCk7DQojZW5kaWYNCg0KICAgIHJldHVybiBieXRlczsNCn0NCg0KVUxPTkcg
cFplcm9GaWxsRGlza1NlY3RvcnMoVUxPTkcgZGlzaywgVUxPTkcgU3RhcnRpbmdMQkEsIFVM
T05HIHNlY3RvcnMsDQoJCQkgIFVMT05HIHJlYWRBaGVhZCkNCnsNCiAgICByZWdpc3RlciBV
TE9ORyBicHMsIGNjb2RlLCBieXRlcyA9IDA7DQogICAgcmVnaXN0ZXIgTldESVNLICpOV0Rp
c2s7DQogICAgTE9OR0xPTkcgY3lsaW5kZXI7DQogICAgVUxPTkcgaGVhZCwgc2VjdG9yOw0K
ICAgIHN0YXRpYyBfZ28zMl9kcG1pX3JlZ2lzdGVycyByOw0KI2lmIChXSU5ET1dTXzk4X1VU
SUwpDQogICAgc3RhdGljIHVuaW9uIFJFR1Mgcmw7DQojZW5kaWYNCg0KICAgIE5XRlNTZXQo
JnIsIDAsIHNpemVvZihfZ28zMl9kcG1pX3JlZ2lzdGVycykpOw0KDQogICAgTldEaXNrID0g
U3lzdGVtRGlza1tkaXNrXTsNCiAgICBicHMgPSBOV0Rpc2stPkJ5dGVzUGVyU2VjdG9yOw0K
DQogICAgaWYgKChzZWN0b3JzICogYnBzKSA+IElPX0JMT0NLX1NJWkUpDQogICAgICAgcmV0
dXJuIGJ5dGVzOw0KDQogICAgbW92ZWRhdGEoX215X2RzKCksDQoJICAgICAodW5zaWduZWQp
WmVyb0J1ZmZlciwNCgkgICAgIE5XRGlzay0+RGF0YVNlbGVjdG9yLA0KCSAgICAgMCwNCgkg
ICAgIChzZWN0b3JzICogYnBzKSk7DQoNCiNpZiAoV0lORE9XU185OF9VVElMKQ0KICAgIHJs
LnguYXggPSAweDQ0MEQ7ICAgIC8vIGdlbmVyaWMgSU9DVEwNCiAgICBybC5oLmJoID0gMzsg
ICAgICAgICAvLyBsb2NrcyBsZXZlbHMgMCwgMSwgMiBvciAzDQogICAgcmwuaC5ibCA9ICgw
eDgwIHwgKGRpc2sgJiAweDdGKSk7IC8vIGRvcyBsaW1pdCBpcyAxMjggZHJpdmVzDQogICAg
cmwuaC5jaCA9IDB4MDg7ICAgICAgLy8gZGV2aWNlIGNhdGVnb3J5DQogICAgcmwuaC5jbCA9
IDB4NEI7ICAgICAgLy8gbG9jayBwaHlzaWNhbCB2b2x1bWUNCiAgICBybC54LmR4ID0gMDsg
ICAgICAgICAvLyBwZXJtaXNzaW9ucw0KICAgIGludDg2KDB4MjEsICZybCwgJnJsKTsNCg0K
I2VuZGlmDQoNCiAgICBpZiAoTldEaXNrLT5JbnQxM0V4dGVuc2lvbnMpDQogICAgew0KICAg
ICAgIEVYVF9SRVFVRVNUIHJlcXVlc3Q7DQoNCiAgICAgICBOV0ZTU2V0KCZyZXF1ZXN0LCAw
LCBzaXplb2YoRVhUX1JFUVVFU1QpKTsNCg0KICAgICAgIHJlcXVlc3QuU2l6ZSA9IHNpemVv
ZihFWFRfUkVRVUVTVCk7DQogICAgICAgcmVxdWVzdC5CbG9ja3MgPSBzZWN0b3JzOw0KICAg
ICAgIHJlcXVlc3QuVHJhbnNmZXJCdWZmZXIgPSAoVUxPTkcpKE5XRGlzay0+RGF0YVNlZ21l
bnQgPDwgMTYpICYgMHhGRkZGMDAwMDsNCiAgICAgICByZXF1ZXN0LkxCQSA9IFN0YXJ0aW5n
TEJBOw0KDQogICAgICAgbW92ZWRhdGEoX215X2RzKCksDQoJCSh1bnNpZ25lZCkmcmVxdWVz
dCwNCgkJTldEaXNrLT5SZXF1ZXN0U2VsZWN0b3IsDQoJCTAsDQoJCXNpemVvZihFWFRfUkVR
VUVTVCkpOw0KDQogICAgICAgci5oLmFoID0gMHg0MzsNCiAgICAgICByLmguYWwgPSBOT19W
RVJJRlk7DQogICAgICAgci5oLmRsID0gKDB4ODAgfCAoZGlzayAmIDB4N0YpKTsNCiAgICAg
ICByLnguZHMgPSBOV0Rpc2stPlJlcXVlc3RTZWdtZW50Ow0KICAgICAgIHIueC5zaSA9IDA7
DQogICAgICAgci54LnNzID0gci54LnNwID0gci54LmZsYWdzID0gMDsNCg0KICAgICAgIGNj
b2RlID0gX2dvMzJfZHBtaV9zaW11bGF0ZV9pbnQoMHgxMywgJnIpOw0KICAgICAgIGlmIChj
Y29kZSkNCgkgIGdvdG8gRmlsbEV4aXQ7DQoNCiAgICAgICAvLyBlcnJvciBpZiBjYXJyeSBm
bGFnIGlzIHNldA0KICAgICAgIGlmIChyLnguZmxhZ3MgJiAxKQ0KICAgICAgIHsNCgkgIC8v
IGlmIHRoZSBkcml2ZSByZXBvcnRlZCBhbiBFQ0Mgb2NjdXJyZWQsIHJldHVybiBzdWNjZXNz
DQoJICBpZiAoci5oLmFoID09IDB4MTEpDQoJICB7DQoJICAgICBieXRlcyA9IChzZWN0b3Jz
ICogYnBzKTsNCgkgICAgIGdvdG8gRmlsbEV4aXQ7DQoJICB9DQoJICBlbHNlDQoJICAgICBn
b3RvIEZpbGxFeGl0Ow0KICAgICAgIH0NCiAgICAgICBieXRlcyA9IChzZWN0b3JzICogYnBz
KTsNCiAgICAgICBnb3RvIEZpbGxFeGl0Ow0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAg
ICAgIGNjb2RlID0gTEJBdG9DSFMoZGlzaywgU3RhcnRpbmdMQkEsICZjeWxpbmRlciwgJmhl
YWQsICZzZWN0b3IpOw0KICAgICAgIGlmIChjY29kZSkNCgkgIGdvdG8gRmlsbEV4aXQ7DQoN
CiAgICAgICByLmguZGggPSAoQllURSloZWFkOw0KICAgICAgIHIuaC5kbCA9ICgweDgwIHwg
KGRpc2sgJiAweDdGKSk7DQogICAgICAgci5oLmNoID0gKEJZVEUpKGN5bGluZGVyICYgMHhG
Rik7DQogICAgICAgci5oLmNsID0gKEJZVEUpKChjeWxpbmRlciAmIDB4MDMwMCkgPj4gMik7
DQogICAgICAgci5oLmNsIHw9IChCWVRFKShzZWN0b3IgJiAweDNGKTsNCiAgICAgICByLmgu
YWggPSAweDAzOw0KICAgICAgIHIuaC5hbCA9IChCWVRFKXNlY3RvcnM7DQogICAgICAgci54
LmVzID0gTldEaXNrLT5EYXRhU2VnbWVudDsNCiAgICAgICByLnguYnggPSAwOw0KICAgICAg
IHIueC5kcyA9IHIueC5zcyA9IHIueC5zcCA9IHIueC5mbGFncyA9IDA7DQoNCiAgICAgICBj
Y29kZSA9IF9nbzMyX2RwbWlfc2ltdWxhdGVfaW50KDB4MTMsICZyKTsNCiAgICAgICBpZiAo
Y2NvZGUpDQoJICBnb3RvIEZpbGxFeGl0Ow0KDQogICAgICAgLy8gZXJyb3IgaWYgY2Fycnkg
ZmxhZyBpcyBzZXQNCiAgICAgICBpZiAoci54LmZsYWdzICYgMSkNCiAgICAgICB7DQoJICAv
LyBpZiB0aGUgZHJpdmUgcmVwb3J0ZWQgYW4gRUNDIG9jY3VycmVkLCByZXR1cm4gc3VjY2Vz
cw0KCSAgaWYgKHIuaC5haCA9PSAweDExKQ0KCSAgew0KCSAgICAgYnl0ZXMgPSAoc2VjdG9y
cyAqIGJwcyk7DQoJICAgICBnb3RvIEZpbGxFeGl0Ow0KCSAgfQ0KCSAgZWxzZQ0KCSAgICAg
Z290byBGaWxsRXhpdDsNCiAgICAgICB9DQogICAgICAgYnl0ZXMgPSAoc2VjdG9ycyAqIGJw
cyk7DQogICAgICAgZ290byBGaWxsRXhpdDsNCiAgICB9DQoNCkZpbGxFeGl0OjsNCiNpZiAo
V0lORE9XU185OF9VVElMKQ0KICAgIHJsLnguYXggPSAweDQ0MEQ7ICAgIC8vIGdlbmVyaWMg
SU9DVEwNCiAgICBybC5oLmJsID0gKDB4ODAgfCAoZGlzayAmIDB4N0YpKTsgLy8gZG9zIGxp
bWl0IGlzIDEyOCBkcml2ZXMNCiAgICBybC5oLmNoID0gMHgwODsgICAgICAvLyBkZXZpY2Ug
Y2F0ZWdvcnkNCiAgICBybC5oLmNsID0gMHg2QjsgICAgICAvLyB1bmxvY2sgcGh5c2ljYWwg
dm9sdW1lDQogICAgaW50ODYoMHgyMSwgJnJsLCAmcmwpOw0KI2VuZGlmDQoNCiAgICByZXR1
cm4gYnl0ZXM7DQoNCn0NCg0Kdm9pZCBTeW5jRGV2aWNlKFVMT05HIGRpc2spDQp7DQogICAg
ZnN5bmMoZGlzayk7DQogICAgcmV0dXJuOw0KfQ0KDQpVTE9ORyBSZWFkRGlza1NlY3RvcnMo
VUxPTkcgZGlzaywgVUxPTkcgTEJBLCBCWVRFICpTZWN0b3IsDQoJCQkgICAgIFVMT05HIHNl
Y3RvcnMsIFVMT05HIHJlYWRBaGVhZCkNCnsNCiAgICByZXR1cm4gKHBSZWFkRGlza1NlY3Rv
cnMoZGlzaywgTEJBLCBTZWN0b3IsIHNlY3RvcnMsIHJlYWRBaGVhZCkpOw0KfQ0KDQpVTE9O
RyBXcml0ZURpc2tTZWN0b3JzKFVMT05HIGRpc2ssIFVMT05HIExCQSwgQllURSAqU2VjdG9y
LA0KCQkJICAgICAgVUxPTkcgc2VjdG9ycywgVUxPTkcgcmVhZEFoZWFkKQ0Kew0KICAgIHJl
dHVybiAocFdyaXRlRGlza1NlY3RvcnMoZGlzaywgTEJBLCBTZWN0b3IsIHNlY3RvcnMsIHJl
YWRBaGVhZCkpOw0KfQ0KDQpVTE9ORyBaZXJvRmlsbERpc2tTZWN0b3JzKFVMT05HIGRpc2ss
IFVMT05HIFN0YXJ0aW5nTEJBLA0KCQkJCSBVTE9ORyBzZWN0b3JzLCBVTE9ORyByZWFkQWhl
YWQpDQp7DQogICAgcmV0dXJuIChwWmVyb0ZpbGxEaXNrU2VjdG9ycyhkaXNrLCBTdGFydGlu
Z0xCQSwgc2VjdG9ycywgcmVhZEFoZWFkKSk7DQp9DQoNCiNlbmRpZg0KDQoNCiNpZiAoV0lO
RE9XU19OVF9VVElMKQ0KDQovLw0KLy8gIGxvdyBsZXZlbCBkaXNrIHNlY3RvciBpbnRlcmZh
Y2Ugcm91dGluZXMNCi8vDQoNClVMT05HIHBSZWFkRGlza1NlY3RvcnMoVUxPTkcgZGlzaywg
VUxPTkcgU3RhcnRpbmdMQkEsIEJZVEUgKlNlY3RvciwNCgkJICAgICAgVUxPTkcgc2VjdG9y
cywgVUxPTkcgcmVhZEFoZWFkKQ0Kew0KICAgIHJlZ2lzdGVyIFVMT05HIGJwcywgY2J5dGVz
LCBjY29kZTsNCiAgICByZWdpc3RlciBOV0RJU0sgKk5XRGlzazsNCiAgICBMQVJHRV9JTlRF
R0VSIG9mZnNldDsNCg0KICAgIE5XRGlzayA9IFN5c3RlbURpc2tbZGlza107DQogICAgYnBz
ID0gTldEaXNrLT5CeXRlc1BlclNlY3RvcjsNCg0KICAgIG9mZnNldC5RdWFkUGFydCA9IChM
T05HTE9ORykgU3RhcnRpbmdMQkEgKiAoTE9OR0xPTkcpIGJwczsNCg0KICAgIGNjb2RlID0g
U2V0RmlsZVBvaW50ZXIoTldEaXNrLT5QaHlzaWNhbERpc2tIYW5kbGUsIG9mZnNldC5Mb3dQ
YXJ0LA0KCQkJCSZvZmZzZXQuSGlnaFBhcnQsIEZJTEVfQkVHSU4pOw0KICAgIGlmIChjY29k
ZSA9PSAoTE9ORykgLTEpDQogICAgICAgcmV0dXJuIDA7DQoNCiAgICBjYnl0ZXMgPSBGaWxl
UmVhZChOV0Rpc2stPlBoeXNpY2FsRGlza0hhbmRsZSwgU2VjdG9yLCBzZWN0b3JzICogYnBz
KTsNCg0KICAgIHJldHVybiBjYnl0ZXM7DQoNCn0NCg0KDQpVTE9ORyBwV3JpdGVEaXNrU2Vj
dG9ycyhVTE9ORyBkaXNrLCBVTE9ORyBTdGFydGluZ0xCQSwgQllURSAqU2VjdG9yLA0KCQkg
ICAgICAgVUxPTkcgc2VjdG9ycywgVUxPTkcgcmVhZEFoZWFkKQ0Kew0KICAgIHJlZ2lzdGVy
IFVMT05HIGJwcywgY2J5dGVzLCBjY29kZTsNCiAgICByZWdpc3RlciBOV0RJU0sgKk5XRGlz
azsNCiAgICBMQVJHRV9JTlRFR0VSIG9mZnNldDsNCg0KICAgIE5XRGlzayA9IFN5c3RlbURp
c2tbZGlza107DQogICAgYnBzID0gTldEaXNrLT5CeXRlc1BlclNlY3RvcjsNCg0KICAgIG9m
ZnNldC5RdWFkUGFydCA9IChMT05HTE9ORykgU3RhcnRpbmdMQkEgKiAoTE9OR0xPTkcpIGJw
czsNCg0KICAgIGNjb2RlID0gU2V0RmlsZVBvaW50ZXIoTldEaXNrLT5QaHlzaWNhbERpc2tI
YW5kbGUsIG9mZnNldC5Mb3dQYXJ0LA0KCQkJCSZvZmZzZXQuSGlnaFBhcnQsIEZJTEVfQkVH
SU4pOw0KICAgIGlmIChjY29kZSA9PSAoTE9ORykgLTEpDQogICAgICAgcmV0dXJuIDA7DQoN
CiAgICBjYnl0ZXMgPSBGaWxlV3JpdGUoTldEaXNrLT5QaHlzaWNhbERpc2tIYW5kbGUsIFNl
Y3Rvciwgc2VjdG9ycyAqIGJwcyk7DQogICAgcmV0dXJuIGNieXRlczsNCn0NCg0KVUxPTkcg
cFplcm9GaWxsRGlza1NlY3RvcnMoVUxPTkcgZGlzaywgVUxPTkcgU3RhcnRpbmdMQkEsIFVM
T05HIHNlY3RvcnMsDQoJCQkgIFVMT05HIHJlYWRBaGVhZCkNCnsNCiAgICBMT05HTE9ORyBj
Y29kZTsNCiAgICByZWdpc3RlciBVTE9ORyBicHMsIGNieXRlczsNCiAgICByZWdpc3RlciBO
V0RJU0sgKk5XRGlzazsNCiAgICBMQVJHRV9JTlRFR0VSIG9mZnNldDsNCg0KICAgIE5XRGlz
ayA9IFN5c3RlbURpc2tbZGlza107DQogICAgYnBzID0gTldEaXNrLT5CeXRlc1BlclNlY3Rv
cjsNCg0KICAgIG9mZnNldC5RdWFkUGFydCA9IChMT05HTE9ORykgU3RhcnRpbmdMQkEgKiAo
TE9OR0xPTkcpIGJwczsNCg0KICAgIGNjb2RlID0gU2V0RmlsZVBvaW50ZXIoTldEaXNrLT5Q
aHlzaWNhbERpc2tIYW5kbGUsIG9mZnNldC5Mb3dQYXJ0LA0KCQkJICAgJm9mZnNldC5IaWdo
UGFydCwgRklMRV9CRUdJTik7DQogICAgaWYgKGNjb2RlID09IChMT05HKSAtMSkNCiAgICAg
ICByZXR1cm4gMDsNCg0KICAgIGNieXRlcyA9IEZpbGVXcml0ZShOV0Rpc2stPlBoeXNpY2Fs
RGlza0hhbmRsZSwgWmVyb0J1ZmZlciwgc2VjdG9ycyAqIGJwcyk7DQoNCiAgICByZXR1cm4g
Y2J5dGVzOw0KDQp9DQoNCnZvaWQgU3luY0RldmljZShVTE9ORyBkaXNrKQ0Kew0KICAgIHJl
dHVybjsNCn0NCg0KVUxPTkcgUmVhZERpc2tTZWN0b3JzKFVMT05HIGRpc2ssIFVMT05HIExC
QSwgQllURSAqU2VjdG9yLA0KCQkJICAgICBVTE9ORyBzZWN0b3JzLCBVTE9ORyByZWFkQWhl
YWQpDQp7DQogICAgcmV0dXJuIChwUmVhZERpc2tTZWN0b3JzKGRpc2ssIExCQSwgU2VjdG9y
LCBzZWN0b3JzLCByZWFkQWhlYWQpKTsNCn0NCg0KVUxPTkcgV3JpdGVEaXNrU2VjdG9ycyhV
TE9ORyBkaXNrLCBVTE9ORyBMQkEsIEJZVEUgKlNlY3RvciwNCgkJCSAgICAgIFVMT05HIHNl
Y3RvcnMsIFVMT05HIHJlYWRBaGVhZCkNCnsNCiAgICByZXR1cm4gKHBXcml0ZURpc2tTZWN0
b3JzKGRpc2ssIExCQSwgU2VjdG9yLCBzZWN0b3JzLCByZWFkQWhlYWQpKTsNCn0NCg0KVUxP
TkcgWmVyb0ZpbGxEaXNrU2VjdG9ycyhVTE9ORyBkaXNrLCBVTE9ORyBTdGFydGluZ0xCQSwN
CgkJCQkgVUxPTkcgc2VjdG9ycywgVUxPTkcgcmVhZEFoZWFkKQ0Kew0KICAgIHJldHVybiAo
cFplcm9GaWxsRGlza1NlY3RvcnMoZGlzaywgU3RhcnRpbmdMQkEsIHNlY3RvcnMsIHJlYWRB
aGVhZCkpOw0KfQ0KDQojZW5kaWYNCg==
--------------F244F05E832D2DC45A9F06F1--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/