This is the mail archive of the
gcc-prs@gcc.gnu.org
mailing list for the GCC project.
c++/521: error handling array bounds
- To: gcc-gnats at gcc dot gnu dot org
- Subject: c++/521: error handling array bounds
- From: dbertini at gsi dot de
- Date: 11 Sep 2000 08:47:06 -0000
- Reply-To: dbertini at gsi dot de
- Resent-Cc: gcc-prs at gcc dot gnu dot org, gcc-bugs at gcc dot gnu dot org, jason at gcc dot gnu dot org
- Resent-Reply-To: gcc-gnats@gcc.gnu.org, dbertini@gsi.de
>Number: 521
>Category: c++
>Synopsis: error handling array bounds
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: unassigned
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Mon Sep 11 01:56:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator: dbertini@gsi.de
>Release: 1.0
>Organization:
>Environment:
ROOT software framework (c++ based)
>Description:
// used a function to define maximum index
// TBItem is a class
// this line gives internal error
>How-To-Repeat:
>Fix:
// Pb is solved using instead these 2 lines
const Int_t index = MaxIndex() + 1;
fItem = new TBtItem[ index ];
>Release-Note:
>Audit-Trail:
>Unformatted:
>> fItem = new TBItem[MaxIndex() + 1]
----gnatsweb-attachment----
Content-Type: application/octet-stream; name="TBtree.cxx"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="TBtree.cxx"
Ly8gQCgjKXJvb3QvY29udDokTmFtZTogICQ6JElkOiBUQnRyZWUuY3h4LHYgMS4xLjEuMSAyMDAw
LzA1LzE2IDE3OjAwOjQwIHJkbSBFeHAgJAovLyBBdXRob3I6IEZvbnMgUmFkZW1ha2VycyAgIDEw
LzEwLzk1CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCwgUmVu
ZSBCcnVuIGFuZCBGb25zIFJhZGVtYWtlcnMuICAgICAgICAgICAgICAgKgogKiBBbGwgcmlnaHRz
IHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKgogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKgogKiBGb3IgdGhlIGxpY2Vuc2luZyB0ZXJtcyBzZWUgJFJP
T1RTWVMvTElDRU5TRS4gICAgICAgICAgICAgICAgICAgICAgICAgKgogKiBGb3IgdGhlIGxpc3Qg
b2YgY29udHJpYnV0b3JzIHNlZSAkUk9PVFNZUy9SRUFETUUvQ1JFRElUUy4gICAgICAgICAgICAg
KgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKi8KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
Ci8vIFRCdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vIEItdHJlZSBjbGFzcy4gVEJ0
cmVlIGluaGVyaXRzIGZyb20gdGhlIFRTZXFDb2xsZWN0aW9uIEFCQy4gICAgICAgICAgIC8vCi8v
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vQkVHSU5fSFRNTAovKgo8L3ByZT4K
PGgyPkItdHJlZSBJbXBsZW1lbnRhdGlvbiBub3RlczwvaDI+CgpUaGlzIGltcGxlbWVudHMgQi10
cmVlcyB3aXRoIHNldmVyYWwgcmVmaW5lbWVudHMuIE1vc3Qgb2YgdGhlbSBjYW4gYmUgZm91bmQK
aW4gS251dGggVm9sIDMsIGJ1dCBzb21lIHdlcmUgZGV2ZWxvcGVkIHRvIGFkYXB0IHRvIHJlc3Ry
aWN0aW9ucyBpbXBvc2VkCmJ5IEMrKy4gRmlyc3QsIGEgcmVzdGF0ZW1lbnQgb2YgS251dGgncyBw
cm9wZXJ0aWVzIHRoYXQgYSBCLXRyZWUgbXVzdApzYXRpc2Z5LCBhc3N1bWluZyB3ZSBtYWtlIHRo
ZSBlbmhhbmNlbWVudCBoZSBzdWdnZXN0cyBpbiB0aGUgcGFyYWdyYXBoCmF0IHRoZSBib3R0b20g
b2YgcGFnZSA0NzYuIEluc3RlYWQgb2Ygc3RvcmluZyBudWxsIHBvaW50ZXJzIHRvIG5vbi1leGlz
dGVudApub2RlcyAod2hpY2ggS251dGggY2FsbHMgdGhlIGxlYXZlcykgd2UgdXRpbGl6ZSB0aGUg
c3BhY2UgdG8gc3RvcmUga2V5cy4KVGhlcmVmb3JlLCB3aGF0IEtudXRoIGNhbGxzIGxldmVsIChs
LTEpIGlzIHRoZSBib3R0b20gb2Ygb3VyIHRyZWUsIGFuZAp3ZSBjYWxsIHRoZSBub2RlcyBhdCB0
aGlzIGxldmVsIExlYWZOb2Rlcy4gT3RoZXIgbm9kZXMgYXJlIGNhbGxlZCBJbm5lck5vZGVzLgpU
aGUgb3RoZXIgZW5oYW5jZW1lbnQgd2UgaGF2ZSBhZG9wdGVkIGlzIGluIHRoZSBwYXJhZ3JhcGgg
YXQgdGhlIGJvdHRvbSBvZgpwYWdlIDQ3Nzogb3ZlcmZsb3cgY29udHJvbC4KPHA+ClRoZSBmb2xs
b3dpbmcgYXJlIG1vZGlmaWNhdGlvbnMgb2YgS251dGgncyBwcm9wZXJ0aWVzIG9uIHBhZ2UgNDc4
Ogo8cD4KPG9sPgo8bGk+ICBFdmVyeSBJbm5lck5vZGUgaGFzIGF0IG1vc3QgT3JkZXIga2V5cywg
YW5kIGF0IG1vc3QgT3JkZXIrMSBzdWItdHJlZXMuCjxsaT4gIEV2ZXJ5IExlYWZOb2RlIGhhcyBh
dCBtb3N0IDIqKE9yZGVyKzEpIGtleXMuCjxsaT4gIEFuIElubmVyTm9kZSB3aXRoIGsga2V5cyBo
YXMgaysxIHN1Yi10cmVlcy4KPGxpPiAgRXZlcnkgSW5uZXJOb2RlIHRoYXQgaXMgbm90IHRoZSBy
b290IGhhcyBhdCBsZWFzdCBJbm5lckxvd1dhdGVyTWFyayBrZXlzLgo8bGk+ICBFdmVyeSBMZWFm
Tm9kZSB0aGF0IGlzIG5vdCB0aGUgcm9vdCBoYXMgYXQgbGVhc3QgTGVhZkxvd1dhdGVyTWFyayBr
ZXlzLgo8bGk+ICBJZiB0aGUgcm9vdCBpcyBhIExlYWZOb2RlLCBpdCBoYXMgYXQgbGVhc3Qgb25l
IGtleS4KPGxpPiAgSWYgdGhlIHJvb3QgaXMgYW4gSW5uZXJOb2RlLCBpdCBoYXMgYXQgbGVhc3Qg
b25lIGtleSBhbmQgdHdvIHN1Yi10cmVlcy4KPGxpPiAgQWxsIExlYWZOb2RlcyBhcmUgdGhlIHNh
bWUgZGlzdGFuY2UgZnJvbSB0aGUgcm9vdCBhcyBhbGwgdGhlIG90aGVyCiAgICAgIExlYWZOb2Rl
cy4KPGxpPiAgRm9yIElubmVyTm9kZSBuIHdpdGgga2V5IG5baV0ua2V5LCB0aGVuIHN1Yi10cmVl
IG5baS0xXS50cmVlIGNvbnRhaW5zCiAgICAgIGFsbCBrZXlzICZsdDsgbltpXS5rZXksIGFuZCBz
dWItdHJlZSBuW2ldLnRyZWUgY29udGFpbnMgYWxsIGtleXMKICAgICAgJmd0Oz0gbltpXS5rZXku
CjxsaT4gIE9yZGVyIGlzIGF0IGxlYXN0IDMuCjwvb2w+CjxwPgpUaGUgdmFsdWVzIG9mIElubmVy
TG93V2F0ZXJNYXJrIGFuZCBMZWFmTG93V2F0ZXJNYXJrIG1heSBhY3R1YWxseSBiZSBzZXQKYnkg
dGhlIHVzZXIgd2hlbiB0aGUgdHJlZSBpcyBpbml0aWFsaXplZCwgYnV0IGN1cnJlbnRseSB0aGV5
IGFyZSBzZXQKYXV0b21hdGljYWxseSB0bzoKPHA+PHByZT4KICAgICAgICBJbm5lckxvd1dhdGVy
TWFyayA9IGNlaWxpbmcoT3JkZXIvMikKICAgICAgICBMZWFmTG93V2F0ZXJNYXJrICA9IE9yZGVy
IC0gMQo8L3ByZT48cD4KSWYgdGhlIHRyZWUgaXMgb25seSBmaWxsZWQsIHRoZW4gYWxsIHRoZSBu
b2RlcyB3aWxsIGJlIGF0IGxlYXN0IDIvMyBmdWxsLgpUaGV5IHdpbGwgYWxtb3N0IGFsbCBiZSBl
eGFjdGx5IDIvMyBmdWxsIGlmIHRoZSBlbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlCnRyZWUgaW4g
b3JkZXIgKGVpdGhlciBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcpLiBbS251dGggc2F5cyBNY0Ny
ZWlnaHQncwpleHBlcmltZW50cyBzaG93ZWQgYWxtb3N0IDEwMCUgbWVtb3J5IHV0aWxpemF0aW9u
LiBJIGRvbid0IHNlZSBob3cgdGhhdApjYW4gYmUgZ2l2ZW4gdGhlIGFsZ29yaXRobXMgdGhhdCBL
bnV0aCBnaXZlcy4gTWNDcmVpZ2h0IG11c3QgaGF2ZSB1c2VkCmEgZGlmZmVyZW50IHNjaGVtZSBm
b3IgYmFsYW5jaW5nLiBbTm8sIGhlIHVzZWQgYSBkaWZmZXJlbnQgc2NoZW1lIGZvcgpzcGxpdHRp
bmc6IGhlIGRpZCBhIHR3by13YXkgc3BsaXQgaW5zdGVhZCBvZiB0aGUgdGhyZWUgd2F5IHNwbGl0
IGFzIHdlIGRvCmhlcmUuIFdoaWNoIG1lYW5zIHRoYXQgTWNDcmVpZ2h0IGRvZXMgYmV0dGVyIG9u
IGluc2VydGlvbiBvZiBvcmRlcmVkIGRhdGEsCmJ1dCB3ZSBzaG91bGQgZG8gYmV0dGVyIG9uIGlu
c2VydGlvbiBvZiByYW5kb20gZGF0YS5dXQo8cD4KSXQgbXVzdCBhbHNvIGJlIG5vdGVkIHRoYXQg
Qi10cmVlcyB3ZXJlIGRlc2lnbmVkIGZvciBESVNLIGFjY2VzcyBhbGdvcml0aG1zLApub3QgbmVj
ZXNzYXJpbHkgaW4tbWVtb3J5IHNvcnRpbmcsIGFzIHdlIGludGVuZCBpdCB0byBiZSB1c2VkIGhl
cmUuIEhvd2V2ZXIsCmlmIHRoZSBvcmRlciBpcyBrZXB0IHNtYWxsICgmbHQ7IDY/KSBhbnkgaW5l
ZmZpY2llbmN5IGlzIG5lZ2xpZ2libGUgZm9yCmluLW1lbW9yeSBzb3J0aW5nLiBLbnV0aCBwb2lu
dHMgb3V0IHRoYXQgYmFsYW5jZWQgdHJlZXMgYXJlIGFjdHVhbGx5CnByZWZlcmFibGUgZm9yIG1l
bW9yeSBzb3J0aW5nLiBJJ20gbm90IHN1cmUgdGhhdCBJIGJlbGlldmUgdGhpcywgYnV0Cml0J3Mg
aW50ZXJlc3RpbmcuIEFsc28sIGRlbGV0aW5nIGVsZW1lbnRzIGZyb20gYmFsYW5jZWQgYmluYXJ5
IHRyZWVzLCBiZWluZwpiZXlvbmQgdGhlIHNjb3BlIG9mIEtudXRoJ3MgYm9vayAocC4gNDY1KSwg
aXMgYmV5b25kIG15IHNjb3BlLiBCLXRyZWVzCmFyZSBnb29kIGVub3VnaC4KPHA+CkEgQi10cmVl
IGlzIGRlY2xhcmVkIHRvIGJlIG9mIGEgY2VydGFpbiBPUkRFUiAoMyBieSBkZWZhdWx0KS4gVGhp
cyBudW1iZXIKZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGtleXMgY29udGFpbmVkIGluIGFueSBp
bnRlcmlvciBub2RlIG9mIHRoZSB0cmVlLgpFYWNoIGludGVyaW9yIG5vZGUgd2lsbCBjb250YWlu
IE9SREVSIGtleXMsIGFuZCB0aGVyZWZvcmUgT1JERVIrMSBwb2ludGVycwp0byBzdWItdHJlZXMu
IFRoZSBrZXlzIGFyZSBudW1iZXJlZCBhbmQgaW5kZXhlZCAxIHRvIE9SREVSIHdoaWxlIHRoZQpw
b2ludGVycyBhcmUgbnVtYmVyZWQgYW5kIGluZGV4ZWQgMCB0byBPUkRFUi4gVGhlIDB0aCBwdHIg
cG9pbnRzIHRvIHRoZQpzdWItdHJlZSBvZiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFu
IGtleVsxXS4gUHRyWzFdIHBvaW50cyB0byB0aGUKc3ViLXRyZWUgdGhhdCBjb250YWlucyBhbGwg
dGhlIGVsZW1lbnRzIGdyZWF0ZXIgdGhhbiBrZXlbMV0gYW5kIGxlc3MgdGhhbgprZXlbMl0uIGV0
Yy4gVGhlIGFycmF5IG9mIHBvaW50ZXJzIGFuZCBrZXlzIGlzIGFsbG9jYXRlZCBhcyBPUkRFUisx
CnBhaXJzIG9mIGtleXMgYW5kIG5vZGVzLCBtZWFuaW5nIHRoYXQgb25lIGtleSBmaWVsZCAoa2V5
WzBdKSBpcyBub3QgdXNlZAphbmQgdGhlcmVmb3JlIHdhc3RlZC4gIEdpdmVuIHRoYXQgdGhlIG51
bWJlciBvZiBpbnRlcmlvciBub2RlcyBpcwpzbWFsbCwgdGhhdCB0aGlzIHdhc3RlIGFsbG93cyBm
ZXdlciBjYXNlcyBvZiBzcGVjaWFsIGNvZGUsIGFuZCB0aGF0IGl0CmlzIHVzZWZ1bCBpbiBjZXJ0
YWluIG9mIHRoZSBtZXRob2RzLCBpdCB3YXMgZmVsdCB0byBiZSBhIHdvcnRod2hpbGUgd2FzdGUu
CjxwPgpUaGUgc2l6ZSBvZiB0aGUgZXh0ZXJpb3Igbm9kZXMgKGxlYWYgbm9kZXMpIGRvZXMgbm90
IG5lZWQgdG8gYmUgcmVsYXRlZCB0bwp0aGUgc2l6ZSBvZiB0aGUgaW50ZXJpb3Igbm9kZXMgYXQg
YWxsLiBTaW5jZSBsZWFmIG5vZGVzIGNvbnRhaW4gb25seQprZXlzLCB0aGV5IG1heSBiZSBhcyBs
YXJnZSBvciBzbWFsbCBhcyB3ZSBsaWtlIGluZGVwZW5kZW50IG9mIHRoZSBzaXplCm9mIHRoZSBp
bnRlcmlvciBub2Rlcy4gRm9yIG5vIHBhcnRpY3VsYXIgcmVhc29uIG90aGVyIHRoYW4gaXQgc2Vl
bXMgbGlrZQphIGdvb2QgaWRlYSwgd2Ugd2lsbCBhbGxvY2F0ZSAyKihPUkRFUisxKSBrZXlzIGlu
IGVhY2ggbGVhZiBub2RlLCBhbmQgdGhleQp3aWxsIGJlIG51bWJlcmVkIGFuZCBpbmRleGVkIGZy
b20gMCB0byAyKk9SREVSKzEuIEl0IGRvZXMgaGF2ZSB0aGUgYWR2YW50YWdlCm9mIGtlZXBpbmcg
dGhlIHNpemUgb2YgdGhlIGxlYWYgYW5kIGludGVyaW9yIGFycmF5cyB0aGUgc2FtZSwgc28gdGhh
dCBpZiB3ZQpmaW5kIGFsbG9jYXRpb24gYW5kIGRlLWFsbG9jYXRpb24gb2YgdGhlc2UgYXJyYXlz
IGV4cGVuc2l2ZSwgd2UgY2FuIG1vZGlmeQp0aGVpciBhbGxvY2F0aW9uIHRvIHVzZSBhIGdhcmJh
Z2UgcmluZywgb3Igc29tZXRoaW5nLgo8cD4KQm90aCBvZiB0aGVzZSBudW1iZXJzIHdpbGwgYmUg
cnVuLXRpbWUgY29uc3RhbnRzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHRyZWUKKGVhY2ggdHJlZSBh
dCBydW4tdGltZSBjYW4gYmUgb2YgYSBkaWZmZXJlbnQgb3JkZXIpLiBUaGUgdmFyaWFibGUgIm9y
ZGVyIgppcyB0aGUgb3JkZXIgb2YgdGhlIHRyZWUsIGFuZCB0aGUgaW5jbHVzaXZlIHVwcGVyIGxp
bWl0IG9uIHRoZSBpbmRpY2VzIG9mCnRoZSBrZXlzIGluIHRoZSBpbnRlcmlvciBub2Rlcy4gIFRo
ZSB2YXJpYWJsZSAib3JkZXIyIiBpcyB0aGUgaW5jbHVzaXZlCnVwcGVyIGxpbWl0IG9uIHRoZSBp
bmRpY2VzIG9mIHRoZSBsZWFmIG5vZGVzLCBhbmQgaXMgZGVzaWduZWQKPHA+PHByZT4KICAgICgx
KSB0byBrZWVwIHRoZSBzaXplcyBvZiB0aGUgdHdvIGtpbmRzIG9mIG5vZGVzIHRoZSBzYW1lOwog
ICAgKDIpIHRvIGtlZXAgdGhlIGV4cHJlc3Npb25zIGludm9sdmluZyB0aGUgYXJyYXlzIG9mIGtl
eXMgbG9va2luZwogICAgICAgIHNvbWV3aGF0IHRoZSBzYW1lOiAgIGxvd2VyIGxpbWl0ICAgICAg
ICB1cHBlciBsaW1pdAogICAgICAgICAgZm9yIGlubmVyIG5vZGVzOiAgICAgICAgMSAgICAgICAg
ICAgICAgICBvcmRlcgogICAgICAgICAgZm9yIGxlYWYgIG5vZGVzOiAgICAgICAgMCAgICAgICAg
ICAgICAgICBvcmRlcjIKICAgICAgICBSZW1lbWJlciB0aGF0IGluZGV4IDAgb2YgdGhlIGlubmVy
IG5vZGVzIGlzIHNwZWNpYWwuCjwvcHJlPjxwPgpDdXJyZW50bHksIG9yZGVyMiA9IDIqKG9yZGVy
KzEpLgo8cD48cHJlPgogUGljdHVyZTogKGFsc28gc2VlIEtudXRoIFZvbCAzIHBnIDQ3OCkKCiAg
ICAgICAgICAgKy0tKy0tKy0tKy0tKy0tKy0tLi4uCiAgICAgICAgICAgfCAgfCAgfCAgfCAgfCAg
fAogcGFyZW50LS0tJmd0O3wgIHwgICAgIHwgICAgIHwKICAgICAgICAgICB8ICB8ICAgICB8ICAg
ICB8CiAgICAgICAgICAgKyotKyotKyotKy0tKy0tKy0tLi4uCiAgICAgICAgICAgIHwgIHwgIHwK
ICAgICAgICstLS0tKyAgfCAgKy0tLS0tKwogICAgICAgfCAgICAgICArLS0tLS0rICB8CiAgICAg
ICBWICAgICAgICAgICAgIHwgIFYKICAgICAgICstLS0tLS0tLS0tKyAgfCAgKy0tLS0tLS0tLS0r
CiAgICAgICB8ICAgICAgICAgIHwgIHwgIHwgICAgICAgICAgfAogdGhpcy0mZ3Q7fCAgICAgICAg
ICB8ICB8ICB8ICAgICAgICAgIHwmbHQ7LS1zaWIKICAgICAgICstLS0tLS0tLS0tKyAgfCAgKy0t
LS0tLS0tLS0rCiAgICAgICAgICAgICAgICAgICAgIFYKICAgICAgICAgICAgICAgICAgICBkYXRh
CjwvcHJlPjxwPgpJdCBpcyBjb25jZXB0dWFsbHkgVkVSWSBjb252ZW5pZW50IHRvIHRoaW5rIG9m
IHRoZSBkYXRhIGFzIGJlaW5nIHRoZQp2ZXJ5IGZpcnN0IGVsZW1lbnQgb2YgdGhlIHNpYiBub2Rl
LiBBbnkgcHJpbWl0aXZlIHRoYXQgdGVsbHMgc2liIHRvCnBlcmZvcm0gc29tZSBhY3Rpb24gb24g
biBub2RlcyBzaG91bGQgaW5jbHVkZSB0aGlzICdoaWRkZW4nIGVsZW1lbnQuCkZvciBJbm5lck5v
ZGVzLCB0aGUgaGlkZGVuIGVsZW1lbnQgaGFzIChwaHlzaWNhbCkgaW5kZXggMCBpbiB0aGUgYXJy
YXksCmFuZCBpbiBMZWFmTm9kZXMsIHRoZSBoaWRkZW4gZWxlbWVudCBoYXMgKHZpcnR1YWwpIGlu
ZGV4IC0xIGluIHRoZSBhcnJheS4KVGhlcmVmb3JlLCB0aGVyZSBhcmUgdHdvICdzaXplJyBwcmlt
aXRpdmVzIGZvciBub2RlczoKPHA+PHByZT4KUHNpemUgICAgICAgLSB0aGUgcGh5c2ljYWwgc2l6
ZTogaG93IG1hbnkgZWxlbWVudHMgYXJlIGNvbnRhaW5lZCBpbiB0aGUKICAgICAgICAgICAgICBh
cnJheSBpbiB0aGUgbm9kZS4KVnNpemUgICAgICAgLSB0aGUgJ3ZpcnR1YWwnIHNpemU7IGlmIHRo
ZSBub2RlIGlzIHBvaW50ZWQgdG8gYnkKICAgICAgICAgICAgICBlbGVtZW50IDAgb2YgdGhlIHBh
cmVudCBub2RlLCB0aGVuIFZzaXplID09IFBzaXplOwogICAgICAgICAgICAgIG90aGVyd2lzZSB0
aGUgZWxlbWVudCBpbiB0aGUgcGFyZW50IGl0ZW0gdGhhdCBwb2ludHMgdG8gdGhpcwogICAgICAg
ICAgICAgIG5vZGUgJ2JlbG9uZ3MnIHRvIHRoaXMgbm9kZSwgYW5kIFZzaXplID09IFBzaXplKzE7
CjwvcHJlPjxwPgpQYXJlbnQgbm9kZXMgYXJlIGFsd2F5cyBJbm5lck5vZGVzLgo8cD4KVGhlc2Ug
YXJlIHRoZSBwcmltaXRpdmUgb3BlcmF0aW9ucyBvbiBOb2RlczoKPHA+PHByZT4KQXBwZW5kKGVs
dCkgICAgIC0gYWRkcyBhbiBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIGFycmF5IG9mIGVsZW1l
bnRzIGluIGEKICAgICAgICAgICAgICAgICAgbm9kZS4gIEl0IG11c3QgbmV2ZXIgYmUgY2FsbGVk
IHdoZXJlIGFwcGVuZGluZyB0aGUgZWxlbWVudAogICAgICAgICAgICAgICAgICB3b3VsZCBmaWxs
IHRoZSBub2RlLgpTcGxpdCgpICAgICAgICAgLSBkaXZpZGUgYSBub2RlIGluIHR3bywgYW5kIGNy
ZWF0ZSB0d28gbmV3IG5vZGVzLgpTcGxpdFdpdGgoc2liKSAgLSBjcmVhdGUgYSB0aGlyZCBub2Rl
IGJldHdlZW4gdGhpcyBub2RlIGFuZCB0aGUgc2liIG5vZGUsCiAgICAgICAgICAgICAgICAgIGRp
dnZ5aW5nIHVwIHRoZSBlbGVtZW50cyBvZiB0aGVpciBhcnJheXMuClB1c2hMZWZ0KG4pICAgICAt
IG1vdmUgbiBlbGVtZW50cyBpbnRvIHRoZSBsZWZ0IHNpYmxpbmcKUHVzaFJpZ2h0KG4pICAgIC0g
bW92ZSBuIGVsZW1lbnRzIGludG8gdGhlIHJpZ2h0IHNpYmxpbmcKQmFsYW5jZVdpdGhSaWdodCgp
IC0gZXZlbiB1cCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0d28gbm9kZXMuCkJhbGFu
Y2VXaXRoTGVmdCgpICAtIGRpdHRvCjwvcHJlPjxwPgpUbyBhbGxvdyB0aGlzIGltcGxlbWVudGF0
aW9uIG9mIGJ0cmVlcyB0byBhbHNvIGJlIGFuIGltcGxlbWVudGF0aW9uIG9mCnNvcnRlZCBhcnJh
eXMvbGlzdHMsIHRoZSBvdmVyaGVhZCBpcyBpbmNsdWRlZCB0byBhbGxvdyBPKGxvZyBuKSBhY2Nl
c3MKb2YgZWxlbWVudHMgYnkgdGhlaXIgcmFuayAoYGdpdmUgbWUgdGhlIDV0aCBsYXJnZXN0IGVs
ZW1lbnQnKS4KVGhlcmVmb3JlLCBlYWNoIEl0ZW0ga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBv
ZiBrZXlzIGluIGFuZCBiZWxvdyBpdAppbiB0aGUgdHJlZSAocmVtZW1iZXIsIGVhY2ggaXRlbSdz
IHRyZWUgaXMgYWxsIGtleXMgdG8gdGhlIFJJR0hUIG9mIHRoZQppdGVtJ3Mgb3duIGtleSkuCjxw
PjxwcmU+ClsgWyAmbHQ7IDAgMSAyIDMgJmd0OyA0ICZsdDsgNSA2IDcgJmd0OyA4ICZsdDsgOSAx
MCAxMSAxMiAmZ3Q7IF0gMTMgWyAmbHQ7IDE0IDE1IDE2ICZndDsgMTcgJmx0OyAxOCAxOSAyMCAm
Z3Q7IF0gXQogICA0ICAxIDEgMSAxICAgNCAgIDEgMSAxICAgNSAgIDEgIDEgIDEgIDEgICAgICA3
ICAzICAgMSAgMSAgMSAgICA0ICAgIDEgIDEgIDEKPC9wcmU+PHA+CjxwcmU+CiovCi8vRU5EX0hU
TUwKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgIlRCdHJlZS5oIgoKCkNsYXNzSW1wKFRC
dHJlZSkKCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClRCdHJlZTo6VEJ0cmVlKGludCBvcmRlcikK
ewogICAvLyBDcmVhdGUgYSBCLXRyZWUgb2YgY2VydGFpbiBvcmRlciAoYnkgZGVmYXVsdCAzKS4K
CiAgIEluaXQob3JkZXIpOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpUQnRyZWU6On5UQnRy
ZWUoKQp7CiAgIC8vIERlbGV0ZSBCLXRyZWUuCgogICBpZiAoZlJvb3QpIHsKICAgICAgQ2xlYXIo
KTsKICAgICAgU2FmZURlbGV0ZShmUm9vdCk7CiAgIH0KfQoKLy9fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X18Kdm9pZCBUQnRyZWU6OkFkZChUT2JqZWN0ICpvYmopCnsKICAgLy8gQWRkIG9iamVjdCB0byBC
LXRyZWUuCgogICBpZiAoSXNBcmdOdWxsKCJBZGQiLCBvYmopKSByZXR1cm47CiAgIGlmICghb2Jq
LT5Jc1NvcnRhYmxlKCkpIHsKICAgICAgRXJyb3IoIkFkZCIsICJvYmplY3QgbXVzdCBiZSBzb3J0
YWJsZSIpOwogICAgICByZXR1cm47CiAgIH0KICAgaWYgKCFmUm9vdCkgewogICAgICBmUm9vdCA9
IG5ldyBUQnRMZWFmTm9kZSgwLCBvYmosIHRoaXMpOwogICAgICBDaGVjayhmUm9vdCAhPSAwKTsK
ICAgICAgSW5jck5vZktleXMoKTsKICAgfSBlbHNlIHsKICAgICAgVEJ0Tm9kZSAqbG9jOwogICAg
ICBJbnRfdCBpZHg7CiAgICAgIGlmIChmUm9vdC0+Rm91bmQob2JqLCAmbG9jLCAmaWR4KSAhPSAw
KSB7CiAgICAgICAgIC8vIGxvYyBhbmQgaWR4IGFyZSBzZXQgdG8gZWl0aGVyIHdoZXJlIHRoZSBv
YmplY3QKICAgICAgICAgLy8gd2FzIGZvdW5kLCBvciB3aGVyZSBpdCBzaG91bGQgZ28gaW4gdGhl
IEJ0cmVlLgogICAgICAgICAvLyBOb3RoaW5nIGlzIGhlcmUgbm93LCBidXQgbGF0ZXIgd2UgbWln
aHQgZ2l2ZSB0aGUgdXNlcgogICAgICAgICAvLyB0aGUgYWJpbGl0eSB0byBkZWNsYXJlIGEgQi10
cmVlIGFzIGB1bmlxdWUgZWxlbWVudHMgb25seScsCiAgICAgICAgIC8vIGluIHdoaWNoIGNhc2Ug
d2Ugd291bGQgaGFuZGxlIGFuIGV4Y2VwdGlvbiBoZXJlLgogICAgICB9CiAgICAgIGxvYy0+QWRk
KG9iaiwgaWR4KTsKICAgfQp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpUT2JqZWN0ICpUQnRy
ZWU6OkFmdGVyKFRPYmplY3QgKikgY29uc3QKewogICAvLyBDYW5ub3QgdXNlIHRoaXMgbWV0aG9k
IHNpbmNlIEItdHJlZSBkZWNpZGVzIG9yZGVyLgoKICAgTWF5Tm90VXNlKCJBZnRlciIpOwogICBy
ZXR1cm4gMDsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KVE9iamVjdCAqVEJ0cmVlOjpCZWZv
cmUoVE9iamVjdCAqKSBjb25zdAp7CiAgIC8vIE1heSBub3QgdXNlIHRoaXMgbWV0aG9kIHNpbmNl
IEItdHJlZSBkZWNpZGVzIG9yZGVyLgoKICAgTWF5Tm90VXNlKCJCZWZvcmUiKTsKICAgcmV0dXJu
IDA7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCnZvaWQgVEJ0cmVlOjpDbGVhcihPcHRpb25f
dCAqKQp7CiAgIC8vIFJlbW92ZSBhbGwgb2JqZWN0cyBmcm9tIEItdHJlZS4gRG9lcyBOT1QgZGVs
ZXRlIG9iamVjdHMuCgogICBTYWZlRGVsZXRlKGZSb290KTsKICAgZlNpemUgPSAwOwp9CgovL19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdHJlZTo6RGVsZXRlKE9wdGlvbl90ICopCnsKICAg
Ly8gUmVtb3ZlIGFsbCBvYmplY3RzIGZyb20gQi10cmVlIEFORCBkZWxldGUgYWxsIGhlYXAgYmFz
ZWQgb2JqZWN0cy4KCiAgIGZvciAoSW50X3QgaSA9IDA7IGkgPCBmU2l6ZTsgaSsrKSB7CiAgICAg
IFRPYmplY3QgKm9iaiA9IEF0KGkpOwogICAgICBpZiAob2JqICYmIG9iai0+SXNPbkhlYXAoKSkK
ICAgICAgICAgVENvbGxlY3Rpb246OkdhcmJhZ2VDb2xsZWN0KG9iaik7CiAgIH0KICAgQ2xlYXIo
KTsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KVE9iamVjdCAqVEJ0cmVlOjpGaW5kT2JqZWN0
KGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0CnsKICAgLy8gRmluZCBvYmplY3QgdXNpbmcgaXRzIG5h
bWUgKHNlZSBvYmplY3QncyBHZXROYW1lKCkpLiBSZXF1aXJlcyBzZXF1ZW50aWFsCiAgIC8vIHNl
YXJjaCBvZiBjb21wbGV0ZSB0cmVlIHRpbGwgb2JqZWN0IGlzIGZvdW5kLgoKICAgcmV0dXJuIFRD
b2xsZWN0aW9uOjpGaW5kT2JqZWN0KG5hbWUpOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpU
T2JqZWN0ICpUQnRyZWU6OkZpbmRPYmplY3QoVE9iamVjdCAqb2JqKSBjb25zdAp7CiAgIC8vIEZp
bmQgb2JqZWN0IHVzaW5nIHRoZSBvYmplY3RzIENvbXBhcmUoKSBtZW1iZXIgZnVuY3Rpb24uCgog
ICBpZiAoIW9iai0+SXNTb3J0YWJsZSgpKSB7CiAgICAgIEVycm9yKCJGaW5kT2JqZWN0IiwgIm9i
amVjdCBtdXN0IGJlIHNvcnRhYmxlIik7CiAgICAgIHJldHVybiAwOwogICB9CiAgIGlmICghZlJv
b3QpCiAgICAgIHJldHVybiAwOwogICBlbHNlIHsKICAgICAgVEJ0Tm9kZSAqbG9jOwogICAgICBJ
bnRfdCBpZHg7CiAgICAgIHJldHVybiBmUm9vdC0+Rm91bmQob2JqLCAmbG9jLCAmaWR4KTsKICAg
fQp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRfdCBUQnRyZWU6OklkeEFkZChjb25zdCBU
T2JqZWN0ICZvYmopCnsKICAgLy8gQWRkIG9iamVjdCBhbmQgcmV0dXJuIGl0cyBpbmRleCBpbiB0
aGUgdHJlZS4KCiAgIEludF90IHI7CiAgIGlmICghb2JqLklzU29ydGFibGUoKSkgewogICAgICBF
cnJvcigiSWR4QWRkIiwgIm9iamVjdCBtdXN0IGJlIHNvcnRhYmxlIik7CiAgICAgIHJldHVybiAt
MTsKICAgfQogICBpZiAoIWZSb290KSB7CiAgICAgIGZSb290ID0gbmV3IFRCdExlYWZOb2RlKDAs
ICZvYmosIHRoaXMpOwogICAgICBBc3NlcnQoZlJvb3QgIT0gMCk7CiAgICAgIEluY3JOb2ZLZXlz
KCk7CiAgICAgIHIgPSAwOwogICB9IGVsc2UgewogICAgICBUQnROb2RlICpsb2M7CiAgICAgIGlu
dCBpZHg7CiAgICAgIGlmIChmUm9vdC0+Rm91bmQoJm9iaiwgJmxvYywgJmlkeCkgIT0gMCkgewog
ICAgICAgICAvLyBsb2MgYW5kIGlkeCBhcmUgc2V0IHRvIGVpdGhlciB3aGVyZSB0aGUgb2JqZWN0
CiAgICAgICAgIC8vIHdhcyBmb3VuZCwgb3Igd2hlcmUgaXQgc2hvdWxkIGdvIGluIHRoZSBCdHJl
ZS4KICAgICAgICAgLy8gTm90aGluZyBpcyBoZXJlIG5vdywgYnV0IGxhdGVyIHdlIG1pZ2h0IGdp
dmUgdGhlIHVzZXIKICAgICAgICAgLy8gdGhlIGFiaWxpdHkgdG8gZGVjbGFyZSBhIEItdHJlZSBh
cyBgdW5pcXVlIGVsZW1lbnRzIG9ubHknLAogICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlIHdv
dWxkIGhhbmRsZSBhbiBleGNlcHRpb24gaGVyZS4KICAgICAgICAgLy8gY2VyciA8PCAiTXVsdGlw
bGUgZW50cnkgd2FybmluZ1xuIjsKICAgICAgfSBlbHNlIHsKICAgICAgICAgQ2hlY2sobG9jLT5m
SXNMZWFmKTsKICAgICAgfQogICAgICBpZiAobG9jLT5mSXNMZWFmKSB7CiAgICAgICAgIGlmIChs
b2MtPmZQYXJlbnQgPT0gMCkKICAgICAgICAgICAgciA9IGlkeDsKICAgICAgICAgZWxzZQogICAg
ICAgICAgICByID0gaWR4ICsgbG9jLT5mUGFyZW50LT5GaW5kUmFua1VwKGxvYyk7CiAgICAgIH0g
ZWxzZSB7CiAgICAgICAgICBUQnRJbm5lck5vZGUgKmlsb2MgPSAoVEJ0SW5uZXJOb2RlKikgbG9j
OwogICAgICAgICAgciA9IGlsb2MtPkZpbmRSYW5rVXAoaWxvYy0+R2V0VHJlZShpZHgpKTsKICAg
ICAgfQogICAgICBsb2MtPkFkZCgmb2JqLCBpZHgpOwogICB9CiAgIENoZWNrKHIgPT0gUmFuaygm
b2JqKSB8fCAmb2JqID09ICgqdGhpcylbcl0pOwogICByZXR1cm4gcjsKfQoKLy9fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX18Kdm9pZCBUQnRyZWU6OkluaXQoSW50X3Qgb3JkZXIpCnsKICAgLy8gSW5pdGlh
bGl6ZSBhIEItdHJlZS4KCiAgIGlmIChvcmRlciA8IDMpIHsKICAgICAgV2FybmluZygiSW5pdCIs
ICJvcmRlciBtdXN0IGJlIGF0IGxlYXN0IDMiKTsKICAgICAgb3JkZXIgPSAzOwogICB9CiAgIGZS
b290ICAgPSAwOwogICBmT3JkZXIgID0gb3JkZXI7CiAgIGZPcmRlcjIgPSAyICogKGZPcmRlcisx
KTsKICAgZkxlYWZNYXhJbmRleCAgPSBmT3JkZXIyIC0gMTsgICAgIC8vIGZJdGVtWzAuLmZPcmRl
cjItMV0KICAgZklubmVyTWF4SW5kZXggPSBmT3JkZXI7ICAgICAgICAgIC8vIGZJdGVtWzEuLmZP
cmRlcl0KICAgLy8KICAgLy8gdGhlIGxvdyB3YXRlciBtYXJrcyB0cmlnZ2VyIGFuIGV4cGxvcmF0
aW9uIGZvciBiYWxhbmNpbmcKICAgLy8gb3IgbWVyZ2luZyBub2Rlcy4KICAgLy8gV2hlbiB0aGUg
c2l6ZSBvZiBhIG5vZGUgZmFsbHMgYmVsb3cgWCwgdGhlbiBpdCBtdXN0IGJlIHBvc3NpYmxlIHRv
CiAgIC8vIGVpdGhlciBiYWxhbmNlIHRoaXMgbm9kZSB3aXRoIGFub3RoZXIgbm9kZSwgb3IgaXQg
bXVzdCBiZSBwb3NzaWJsZQogICAvLyB0byBtZXJnZSB0aGlzIG5vZGUgd2l0aCBhbm90aGVyIG5v
ZGUuCiAgIC8vIFRoaXMgY2FuIGJlIGd1YXJhbnRlZWQgb25seSBpZiAodGhpcy0+U2l6ZSgpIDwg
KE1heFNpemUoKS0xKS8yKS4KICAgLy8KICAgLy8KCiAgIC8vID09IE1heFNpemUoKSBzYXRpc2Zp
ZXMgdGhlIGFib3ZlIGJlY2F1c2Ugd2UgY29tcGFyZQogICAvLyBsb3d3YXRlcm1hcmsgd2l0aCBm
TGFzdAogICBmTGVhZkxvd1dhdGVyTWFyayAgPSAoKGZMZWFmTWF4SW5kZXgrMSktMSkgLyAyIC0g
MTsKICAgZklubmVyTG93V2F0ZXJNYXJrID0gKGZPcmRlci0xKSAvIDI7Cn0KCi8vX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fCi8vdm9pZCBUQnRyZWU6OlByaW50T24ob3N0cmVhbSYgb3V0KSBjb25zdAov
L3sKLy8gICAvLyBQcmludCBhIEItdHJlZS4KLy8KLy8gICBpZiAoIWZSb290KQovLyAgICAgIG91
dCA8PCAiPGVtcHR5PiI7Ci8vICAgZWxzZQovLyAgICAgIGZSb290LT5QcmludE9uKG91dCk7Ci8v
fQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX18KVEl0ZXJhdG9yICpUQnRyZWU6Ok1ha2VJdGVyYXRv
cihCb29sX3QgZGlyKSBjb25zdAp7CiAgIC8vIFJldHVybnMgYSBCLXRyZWUgaXRlcmF0b3IuCgog
ICByZXR1cm4gbmV3IFRCdHJlZUl0ZXIodGhpcywgZGlyKTsKfQoKLy9fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18KSW50X3QgVEJ0cmVlOjpSYW5rKGNvbnN0IFRPYmplY3QgKm9iaikgY29uc3QKewogICAv
LyBSZXR1cm5zIHRoZSByYW5rIG9mIHRoZSBvYmplY3QgaW4gdGhlIHRyZWUuCgogICBpZiAoIW9i
ai0+SXNTb3J0YWJsZSgpKSB7CiAgICAgIEVycm9yKCJSYW5rIiwgIm9iamVjdCBtdXN0IGJlIHNv
cnRhYmxlIik7CiAgICAgIHJldHVybiAtMTsKICAgfQogICBpZiAoIWZSb290KQogICAgICByZXR1
cm4gLTE7CiAgIGVsc2UKICAgICAgcmV0dXJuIGZSb290LT5GaW5kUmFuayhvYmopOwp9CgovL19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fXwpUT2JqZWN0ICpUQnRyZWU6OlJlbW92ZShUT2JqZWN0ICpvYmop
CnsKICAgLy8gUmVtb3ZlIGFuIG9iamVjdCBmcm9tIHRoZSB0cmVlLgoKICAgaWYgKCFvYmotPklz
U29ydGFibGUoKSkgewogICAgICBFcnJvcigiUmVtb3ZlIiwgIm9iamVjdCBtdXN0IGJlIHNvcnRh
YmxlIik7CiAgICAgIHJldHVybiAwOwogICB9CiAgIGlmICghZlJvb3QpCiAgICAgIHJldHVybiAw
OwoKICAgVEJ0Tm9kZSAqbG9jOwogICBJbnRfdCBpZHg7CiAgIFRPYmplY3QgKm9iID0gZlJvb3Qt
PkZvdW5kKG9iaiwgJmxvYywgJmlkeCk7CiAgIGlmICghb2IpCiAgICAgIHJldHVybiAwOwogICBs
b2MtPlJlbW92ZShpZHgpOwogICByZXR1cm4gb2I7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
CnZvaWQgVEJ0cmVlOjpSb290SXNGdWxsKCkKewogICAvLyBUaGUgcm9vdCBvZiB0aGUgdHJlZSBp
cyBmdWxsLiBDcmVhdGUgYW4gSW5uZXJOb2RlIHRoYXQKICAgLy8gcG9pbnRzIHRvIGl0LCBhbmQg
dGhlbiBpbmZvcm0gdGhlIElubmVyTm9kZSB0aGF0IGl0IGlzIGZ1bGwuCgogICBUQnROb2RlICpv
bGRyb290ID0gZlJvb3Q7CiAgIGZSb290ID0gbmV3IFRCdElubmVyTm9kZSgwLCB0aGlzLCBvbGRy
b290KTsKICAgQXNzZXJ0KGZSb290ICE9IDApOwogICBvbGRyb290LT5TcGxpdCgpOwp9CgovL19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdHJlZTo6Um9vdElzRW1wdHkoKQp7CiAgIC8vIElm
IHJvb3QgaXMgZW1wdHkgY2xlYW4gdXAgaXRzIHNwYWNlLgoKICAgaWYgKGZSb290LT5mSXNMZWFm
KSB7CiAgICAgIFRCdExlYWZOb2RlICpscm9vdCA9IChUQnRMZWFmTm9kZSopZlJvb3Q7CiAgICAg
IENoZWNrKGxyb290LT5Qc2l6ZSgpID09IDApOwogICAgICBkZWxldGUgbHJvb3Q7CiAgICAgIGZS
b290ID0gMDsKICAgfSBlbHNlIHsKICAgICAgVEJ0SW5uZXJOb2RlICppcm9vdCA9IChUQnRJbm5l
ck5vZGUqKWZSb290OwogICAgICBDaGVjayhpcm9vdC0+UHNpemUoKSA9PSAwKTsKICAgICAgZlJv
b3QgPSBpcm9vdC0+R2V0VHJlZSgwKTsKICAgICAgZlJvb3QtPmZQYXJlbnQgPSAwOwogICAgICBk
ZWxldGUgaXJvb3Q7CiAgIH0KfQoKCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kdm9pZCBUQnRyZWU6OlN0cmVh
bWVyKFRCdWZmZXIgJmIpCnsKICAgLy8gU3RyZWFtIGFsbCBvYmplY3RzIGluIHRoZSBidHJlZSB0
byBvciBmcm9tIHRoZSBJL08gYnVmZmVyLgoKICAgaWYgKGIuSXNSZWFkaW5nKCkpIHsKICAgICAg
Yi5SZWFkVmVyc2lvbigpOyAgLy9WZXJzaW9uX3QgdiA9IGIuUmVhZFZlcnNpb24oKTsKICAgICAg
YiA+PiBmT3JkZXI7CiAgICAgIGIgPj4gZk9yZGVyMjsKICAgICAgYiA+PiBmSW5uZXJMb3dXYXRl
ck1hcms7CiAgICAgIGIgPj4gZkxlYWZMb3dXYXRlck1hcms7CiAgICAgIGIgPj4gZklubmVyTWF4
SW5kZXg7CiAgICAgIGIgPj4gZkxlYWZNYXhJbmRleDsKICAgICAgVFNlcUNvbGxlY3Rpb246OlN0
cmVhbWVyKGIpOwogICB9IGVsc2UgewogICAgICBiLldyaXRlVmVyc2lvbihUQnRyZWU6OklzQSgp
KTsKICAgICAgYiA8PCBmT3JkZXI7CiAgICAgIGIgPDwgZk9yZGVyMjsKICAgICAgYiA8PCBmSW5u
ZXJMb3dXYXRlck1hcms7CiAgICAgIGIgPDwgZkxlYWZMb3dXYXRlck1hcms7CiAgICAgIGIgPDwg
ZklubmVyTWF4SW5kZXg7CiAgICAgIGIgPDwgZkxlYWZNYXhJbmRleDsKICAgICAgVFNlcUNvbGxl
Y3Rpb246OlN0cmVhbWVyKGIpOwogICB9Cn0KCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvLwovLyBUQnRJdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovLyBJdGVtIHN0b3Jl
ZCBpbiBpbm5lciBub2RlcyBvZiBhIFRCdHJlZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAvLwovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAvLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKLy9fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX18KVEJ0SXRlbTo6VEJ0SXRlbSgpCnsKICAgLy8gQ3JlYXRlIGFuIGl0ZW0gdG8gYmUg
c3RvcmVkIGluIHRoZSB0cmVlLiBBbiBpdGVtIGNvbnRhaW5zIGEgY291bnRlcgogICAvLyBvZiB0
aGUgbnVtYmVyIG9mIGtleXMgKGkuZS4gb2JqZWN0cykgaW4gdGhlIG5vZGUuIEEgcG9pbnRlciB0
byB0aGUKICAgLy8gbm9kZSBhbmQgYSBwb2ludGVyIHRvIHRoZSBvYmplY3QgYmVpbmcgc3RvcmVk
LgoKICAgZk5vZktleXNJblRyZWUgPSAwOwogICBmVHJlZSA9IDA7CiAgIGZLZXkgID0gMDsKfQoK
Ly9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX18KVEJ0SXRlbTo6VEJ0SXRlbShUQnROb2RlICpuLCBUT2Jq
ZWN0ICpvYmopCnsKICAgLy8gQ3JlYXRlIGFuIGl0ZW0gdG8gYmUgc3RvcmVkIGluIHRoZSB0cmVl
LiBBbiBpdGVtIGNvbnRhaW5zIGEgY291bnRlcgogICAvLyBvZiB0aGUgbnVtYmVyIG9mIGtleXMg
KGkuZS4gb2JqZWN0cykgaW4gdGhlIG5vZGUuIEEgcG9pbnRlciB0byB0aGUKICAgLy8gbm9kZSBh
bmQgYSBwb2ludGVyIHRvIHRoZSBvYmplY3QgYmVpbmcgc3RvcmVkLgoKICAgZk5vZktleXNJblRy
ZWUgPSBuLT5Ob2ZLZXlzKCkrMTsKICAgZlRyZWUgPSBuOwogICBmS2V5ICA9IG9iajsKfQoKLy9f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX18KVEJ0SXRlbTo6VEJ0SXRlbShUT2JqZWN0ICpvYmosIFRCdE5v
ZGUgKm4pCnsKICAgLy8gQ3JlYXRlIGFuIGl0ZW0gdG8gYmUgc3RvcmVkIGluIHRoZSB0cmVlLiBB
biBpdGVtIGNvbnRhaW5zIGEgY291bnRlcgogICAvLyBvZiB0aGUgbnVtYmVyIG9mIGtleXMgKGku
ZS4gb2JqZWN0cykgaW4gdGhlIG5vZGUuIEEgcG9pbnRlciB0byB0aGUKICAgLy8gbm9kZSBhbmQg
YSBwb2ludGVyIHRvIHRoZSBvYmplY3QgYmVpbmcgc3RvcmVkLgoKICAgZk5vZktleXNJblRyZWUg
PSBuLT5Ob2ZLZXlzKCkrMTsKICAgZlRyZWUgPSBuOwogICBmS2V5ICA9IG9iajsKfQoKLy9fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX18KVEJ0SXRlbTo6flRCdEl0ZW0oKQp7CiAgIC8vIERlbGV0ZSBhIHRy
ZWUgaXRlbS4KfQoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vIFRCdE5v
ZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vIEFic3RyYWN0IGJhc2UgY2xhc3MgKEFCQykg
b2YgYSBUQnRyZWUgbm9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpUQnROb2Rl
OjpUQnROb2RlKEludF90IGlzbGVhZiwgVEJ0SW5uZXJOb2RlICpwLCBUQnRyZWUgKnQpCnsKICAg
Ly8gQ3JlYXRlIGEgQi10cmVlIG5vZGUuCgogICBmTGFzdCAgID0gLTE7CiAgIGZJc0xlYWYgPSBp
c2xlYWY7CiAgIGZQYXJlbnQgPSBwOwogICBpZiAocCA9PSAwKSB7CiAgICAgIENoZWNrKHQgIT0g
MCk7CiAgICAgIGZUcmVlID0gdDsKICAgfSBlbHNlCiNpZmRlZiBjeHhidWcKLy8gIEJVRyBpbiB0
aGUgY3h4IGNvbXBpbGVyLiBjeHggY29tcGxhaW5zIHRoYXQgaXQgY2Fubm90IGFjY2VzcyBmVHJl
ZQovLyAgZnJvbSBUQnRJbm5lck5vZGUuIFRvIHJlcHJvZHVjZSB0aGUgY3h4IGJ1ZyB1bmNvbW1l
bnQgdGhlIGZvbGxvd2luZyBsaW5lCi8vICBhbmQgZGVsZXRlIHRoZSBsaW5lIGFmdGVyLgovLyAg
ICBmVHJlZSA9IHAtPmZUcmVlOwogICAgICBmVHJlZSA9IHAtPkdldFBhcmVudFRyZWUoKTsKI2Vs
c2UKICAgICAgZlRyZWUgPSBwLT5mVHJlZTsKI2VuZGlmCn0KCi8vX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fClRCdE5vZGU6On5UQnROb2RlKCkKewogICAvLyBEZWxldGUgYSBCLXRyZWUgbm9kZS4KfQoK
Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vIFRCdHJlZUl0ZXIgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8v
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIC8vCi8vIEl0ZXJhdG9yIG9mIGJ0cmVlLiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vCgpDbGFzc0ltcChUQnRyZWVJdGVyKQoKLy9fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X18KVEJ0cmVlSXRlcjo6VEJ0cmVlSXRlcihjb25zdCBUQnRyZWUgKnQsIEJvb2xfdCBkaXIpCiAg
ICAgICAgICAgIDogZlRyZWUodCksIGZDdXJzb3IoMCksIGZEaXJlY3Rpb24oZGlyKQp7CiAgIC8v
IENyZWF0ZSBhIEItdHJlZSBpdGVyYXRvci4KCiAgIFJlc2V0KCk7Cn0KCi8vX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fClRCdHJlZUl0ZXI6OlRCdHJlZUl0ZXIoY29uc3QgVEJ0cmVlSXRlciAmaXRlcikK
ewogICAvLyBDb3B5IGN0b3IuCgogICBmVHJlZSAgICAgID0gaXRlci5mVHJlZTsKICAgZkN1cnNv
ciAgICA9IGl0ZXIuZkN1cnNvcjsKICAgZkRpcmVjdGlvbiA9IGl0ZXIuZkRpcmVjdGlvbjsKfQoK
Ly9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX18KVEl0ZXJhdG9yICZUQnRyZWVJdGVyOjpvcGVyYXRvcj0o
Y29uc3QgVEl0ZXJhdG9yICZyaHMpCnsKICAgLy8gT3ZlcnJpZGRlbiBhc3NpZ25tZW50IG9wZXJh
dG9yLgoKICAgaWYgKHRoaXMgIT0gJnJocyAmJiByaHMuSXNBKCkgPT0gVEJ0cmVlSXRlcjo6Q2xh
c3MoKSkgewogICAgICBjb25zdCBUQnRyZWVJdGVyICZyaHMxID0gKGNvbnN0IFRCdHJlZUl0ZXIg
JilyaHM7CiAgICAgIGZUcmVlICAgICAgPSByaHMxLmZUcmVlOwogICAgICBmQ3Vyc29yICAgID0g
cmhzMS5mQ3Vyc29yOwogICAgICBmRGlyZWN0aW9uID0gcmhzMS5mRGlyZWN0aW9uOwogICB9CiAg
IHJldHVybiAqdGhpczsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KVEJ0cmVlSXRlciAmVEJ0
cmVlSXRlcjo6b3BlcmF0b3I9KGNvbnN0IFRCdHJlZUl0ZXIgJnJocykKewogICAvLyBPdmVybG9h
ZGVkIGFzc2lnbm1lbnQgb3BlcmF0b3IuCgogICBpZiAodGhpcyAhPSAmcmhzKSB7CiAgICAgIGZU
cmVlICAgICAgPSByaHMuZlRyZWU7CiAgICAgIGZDdXJzb3IgICAgPSByaHMuZkN1cnNvcjsKICAg
ICAgZkRpcmVjdGlvbiA9IHJocy5mRGlyZWN0aW9uOwogICB9CiAgIHJldHVybiAqdGhpczsKfQoK
Ly9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX18Kdm9pZCBUQnRyZWVJdGVyOjpSZXNldCgpCnsKICAgLy8g
UmVzZXQgdGhlIEItdHJlZSBpdGVyYXRvci4KCiAgIGlmIChmRGlyZWN0aW9uID09IGtJdGVyRm9y
d2FyZCkKICAgICAgZkN1cnNvciA9IDA7CiAgIGVsc2UKICAgICAgZkN1cnNvciA9IGZUcmVlLT5H
ZXRTaXplKCkgLSAxOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpUT2JqZWN0ICpUQnRyZWVJ
dGVyOjpOZXh0KCkKewogICAvLyBHZXQgbmV4dCBvYmplY3QgZnJvbSBCLXRyZWUuIFJldHVybnMg
MCB3aGVuIG5vIG1vcmUgb2JqZWN0cyBpbiB0cmVlLgoKICAgaWYgKGZEaXJlY3Rpb24gPT0ga0l0
ZXJGb3J3YXJkKSB7CiAgICAgIGlmIChmQ3Vyc29yIDwgZlRyZWUtPkdldFNpemUoKSkKICAgICAg
ICAgcmV0dXJuICgqZlRyZWUpW2ZDdXJzb3IrK107CiAgIH0gZWxzZSB7CiAgICAgIGlmIChmQ3Vy
c29yID49IDApCiAgICAgICAgIHJldHVybiAoKmZUcmVlKVtmQ3Vyc29yLS1dOwogICB9CiAgIHJl
dHVybiAwOwp9CgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gVEJ0SW5u
ZXJOb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgLy8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gSW5uZXIgbm9kZSBvZiBhIFRCdHJlZS4gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLy8gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClRCdElubmVy
Tm9kZTo6VEJ0SW5uZXJOb2RlKFRCdElubmVyTm9kZSAqcCwgVEJ0cmVlICp0KSA6IFRCdE5vZGUo
MCxwLHQpCnsKICAgLy8gQ3JlYXRlIGEgQi10cmVlIGlubmVybm9kZS4KCiAgIGNvbnN0IEludF90
IGluZGV4ID0gTWF4SW5kZXgoKSArIDE7CiAgIGZJdGVtID0gbmV3IFRCdEl0ZW1bIGluZGV4IF07
CiAgIGlmIChmSXRlbSA9PSAwKQogICAgICA6OkZhdGFsKCJUQnRJbm5lck5vZGU6OlRCdElubmVy
Tm9kZSIsICJubyBtb3JlIG1lbW9yeSIpOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpUQnRJ
bm5lck5vZGU6OlRCdElubmVyTm9kZShUQnRJbm5lck5vZGUgKnBhcmVudCwgVEJ0cmVlICp0cmVl
LCBUQnROb2RlICpvbGRyb290KQogICAgICAgICAgICAgICAgOiBUQnROb2RlKDAsIHBhcmVudCwg
dHJlZSkKewogICAvLyBDYWxsZWQgb25seSBieSBUQnRyZWUgdG8gaW5pdGlhbGl6ZSB0aGUgVEJ0
SW5uZXJOb2RlIHRoYXQgaXMKICAgLy8gYWJvdXQgdG8gYmVjb21lIHRoZSByb290LgoKICAgY29u
c3QgSW50X3QgaW5kZXggPSBNYXhJbmRleCgpICsgMTsKICAgZkl0ZW0gPSBuZXcgVEJ0SXRlbVsg
aW5kZXggXTsKICAgaWYgKGZJdGVtID09IDApCiAgICAgIDo6RmF0YWwoIlRCdElubmVyTm9kZTo6
VEJ0SW5uZXJOb2RlIiwgIm5vIG1vcmUgbWVtb3J5Iik7CiAgIEFwcGVuZCgwLCBvbGRyb290KTsK
fQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX18KVEJ0SW5uZXJOb2RlOjp+VEJ0SW5uZXJOb2RlKCkK
ewogICBpZiAoZkxhc3QgPiAwKQogICAgICBkZWxldGUgZkl0ZW1bMF0uZlRyZWU7CiAgIGZvciAo
SW50X3QgaSA9IDE7IGkgPD0gZkxhc3Q7IGkrKykKICAgICAgZGVsZXRlIGZJdGVtW2ldLmZUcmVl
OwoKICAgZGVsZXRlIFtdIGZJdGVtOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp2b2lkIFRC
dElubmVyTm9kZTo6QWRkKGNvbnN0IFRPYmplY3QgKm9iaiwgSW50X3QgaW5kZXgpCnsKICAgLy8g
VGhpcyBpcyBjYWxsZWQgb25seSBmcm9tIFRCdHJlZTo6QWRkKCkuCgogICBBc3NlcnQoaW5kZXgg
Pj0gMSAmJiBvYmotPklzU29ydGFibGUoKSk7CiAgIFRCdExlYWZOb2RlICpsbiA9IEdldFRyZWUo
aW5kZXgtMSktPkxhc3RMZWFmTm9kZSgpOwogICBsbi0+QWRkKG9iaiwgbG4tPmZMYXN0KzEpOwp9
CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdElubmVyTm9kZTo6QWRkRWx0KFRCdEl0
ZW0gJml0bSwgSW50X3QgYXQpCnsKICAgQXNzZXJ0KDAgPD0gYXQgJiYgYXQgPD0gZkxhc3QrMSk7
CiAgIEFzc2VydChmTGFzdCA8IE1heEluZGV4KCkpOwogICBmb3IgKEludF90IGkgPSBmTGFzdCsx
OyBpID4gYXQgOyBpLS0pCiAgICAgIEdldEl0ZW0oaSkgPSBHZXRJdGVtKGktMSk7CiAgIFNldEl0
ZW0oYXQsIGl0bSk7CiAgIGZMYXN0Kys7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCnZvaWQg
VEJ0SW5uZXJOb2RlOjpBZGRFbHQoSW50X3QgYXQsIFRPYmplY3QgKmssIFRCdE5vZGUgKnQpCnsK
ICAgVEJ0SXRlbSBuZXdpdGVtKGssIHQpOwogICBBZGRFbHQobmV3aXRlbSwgYXQpOwp9CgovL19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdElubmVyTm9kZTo6QWRkKFRCdEl0ZW0gJml0bSwg
SW50X3QgYXQpCnsKICAgQWRkRWx0KGl0bSwgYXQpOwogICBpZiAoSXNGdWxsKCkpCiAgICAgIElu
Zm9ybVBhcmVudCgpOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdElubmVyTm9k
ZTo6QWRkKEludF90IGF0LCBUT2JqZWN0ICprLCBUQnROb2RlICp0KQp7CiAgIFRCdEl0ZW0gbmV3
aXRlbShrLCB0KTsKICAgQWRkKG5ld2l0ZW0sIGF0KTsKfQoKLy9fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X18Kdm9pZCBUQnRJbm5lck5vZGU6OkFwcGVuZEZyb20oVEJ0SW5uZXJOb2RlICpzcmMsIEludF90
IHN0YXJ0LCBJbnRfdCBzdG9wKQp7CiAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGNyZWF0ZSBhIGZ1
bGwgbm9kZSB0aGF0IGlzLCBpdCBpcyBub3QgdXNlZAogICAvLyBhbnl3aGVyZSB3aGVyZSBUSElT
IGNvdWxkIHBvc3NpYmx5IGJlIG5lYXIgZnVsbC4KCiAgIGlmIChzdGFydCA+IHN0b3ApCiAgICAg
IHJldHVybjsKICAgQXNzZXJ0KDAgPD0gc3RhcnQgJiYgc3RhcnQgPD0gc3JjLT5mTGFzdCk7CiAg
IEFzc2VydCgwIDw9IHN0b3AgICYmIHN0b3AgIDw9IHNyYy0+Zkxhc3QgKTsKICAgQXNzZXJ0KGZM
YXN0ICsgc3RvcCAtIHN0YXJ0ICsgMSA8IE1heEluZGV4KCkpOyAvLyBmdWxsLW5vZGUgY2hlY2sK
ICAgZm9yIChJbnRfdCBpID0gc3RhcnQ7IGkgPD0gc3RvcDsgaSsrKQogICAgICBTZXRJdGVtKCsr
Zkxhc3QsIHNyYy0+R2V0SXRlbShpKSk7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCnZvaWQg
VEJ0SW5uZXJOb2RlOjpBcHBlbmQoVE9iamVjdCAqZCwgVEJ0Tm9kZSAqbikKewogICAvLyBOZXZl
ciBjYWxsZWQgZnJvbSBhbnl3aGVyZSB3aGVyZSBpdCBtaWdodCBmaWxsIHVwIFRISVMuCgogICBB
c3NlcnQoZkxhc3QgPCBNYXhJbmRleCgpKTsKICAgaWYgKGQpIEFzc2VydChkLT5Jc1NvcnRhYmxl
KCkpOwogICBTZXRJdGVtKCsrZkxhc3QsIGQsIG4pOwp9CgovL19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
Xwp2b2lkIFRCdElubmVyTm9kZTo6QXBwZW5kKFRCdEl0ZW0gJml0bSkKewogICBBc3NlcnQoZkxh
c3QgPCBNYXhJbmRleCgpKTsKICAgU2V0SXRlbSgrK2ZMYXN0LCBpdG0pOwp9CgovL19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fXwp2b2lkIFRCdElubmVyTm9kZTo6QmFsYW5jZVdpdGhMZWZ0KFRCdElubmVy
Tm9kZSAqbGVmdHNpYiwgSW50X3QgcGlkeCkKewogICAvLyBUSElTIGhhcyBtb3JlIHRoYW4gTEVG
VFNJQi4gTW92ZSBzb21lIGl0ZW0gZnJvbSBUSElTIHRvIExFRlRTSUIuCiAgIC8vIFBJRFggaXMg
dGhlIGluZGV4IG9mIHRoZSBwYXJlbnQgaXRlbSB0aGF0IHdpbGwgY2hhbmdlIHdoZW4ga2V5cwog
ICAvLyBhcmUgbW92ZWQuCgogICBBc3NlcnQoVnNpemUoKSA+PSBsZWZ0c2liLT5Qc2l6ZSgpKTsK
ICAgQXNzZXJ0KGZQYXJlbnQtPkdldFRyZWUocGlkeCkgPT0gdGhpcyk7CiAgIEludF90IG5ld1Ro
aXNTaXplID0gKFZzaXplKCkgKyBsZWZ0c2liLT5Qc2l6ZSgpKS8yOwogICBJbnRfdCBub0Zyb21U
aGlzID0gUHNpemUoKSAtIG5ld1RoaXNTaXplOwogICBQdXNoTGVmdChub0Zyb21UaGlzLCBsZWZ0
c2liLCBwaWR4KTsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kdm9pZCBUQnRJbm5lck5vZGU6
OkJhbGFuY2VXaXRoUmlnaHQoVEJ0SW5uZXJOb2RlICpyaWdodHNpYiwgSW50X3QgcGlkeCkKewog
ICAvLyBUSElTIGhhcyBtb3JlIHRoYW4gUklHSFRTSUIuIE1vdmUgc29tZSBpdGVtcyBmcm9tIFRI
SVMgdG8gUklHSFRTSUIuCiAgIC8vIFBJRFggaXMgdGhlIGluZGV4IG9mIHRoZSBwYXJlbnQgaXRl
bSB0aGF0IHdpbGwgY2hhbmdlIHdoZW4ga2V5cwogICAvLyBhcmUgbW92ZWQuCgogICBBc3NlcnQo
UHNpemUoKSA+PSByaWdodHNpYi0+VnNpemUoKSk7CiAgIEFzc2VydChmUGFyZW50LT5HZXRUcmVl
KHBpZHgpID09IHJpZ2h0c2liKTsKICAgSW50X3QgbmV3VGhpc1NpemUgPSAoUHNpemUoKSArIHJp
Z2h0c2liLT5Wc2l6ZSgpKS8yOwogICBJbnRfdCBub0Zyb21UaGlzID0gUHNpemUoKSAtIG5ld1Ro
aXNTaXplOwogICBQdXNoUmlnaHQobm9Gcm9tVGhpcywgcmlnaHRzaWIsIHBpZHgpOwp9CgovL19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdElubmVyTm9kZTo6QmFsYW5jZVdpdGgoVEJ0SW5u
ZXJOb2RlICpyaWdodHNpYiwgSW50X3QgcGluZHgpCnsKICAgLy8gUElORFggaXMgdGhlIGluZGV4
IG9mIHRoZSBwYXJlbnQgaXRlbSB3aG9zZSBrZXkgd2lsbCBjaGFuZ2Ugd2hlbgogICAvLyBrZXlz
IGFyZSBzaGlmdGVkIGZyb20gb25lIElubmVyTm9kZSB0byB0aGUgb3RoZXIuCgogICBpZiAoUHNp
emUoKSA8IHJpZ2h0c2liLT5Wc2l6ZSgpKQogICAgICByaWdodHNpYi0+QmFsYW5jZVdpdGhMZWZ0
KHRoaXMsIHBpbmR4KTsKICAgZWxzZQogICAgICBCYWxhbmNlV2l0aFJpZ2h0KHJpZ2h0c2liLCBw
aW5keCk7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCnZvaWQgVEJ0SW5uZXJOb2RlOjpEZWNy
Tm9mS2V5cyhUQnROb2RlICp0aGF0KQp7CiAgIC8vIFRIQVQgaXMgYSBjaGlsZCBvZiBUSElTIHRo
YXQgaGFzIGp1c3Qgc2hydW5rIGJ5IDEuCgogICBJbnRfdCBpID0gSW5kZXhPZih0aGF0KTsKICAg
Zkl0ZW1baV0uZk5vZktleXNJblRyZWUtLTsKICAgaWYgKGZQYXJlbnQgIT0gMCkKICAgICAgZlBh
cmVudC0+RGVjck5vZktleXModGhpcyk7CiAgIGVsc2UKICAgICAgZlRyZWUtPkRlY3JOb2ZLZXlz
KCk7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludF90IFRCdElubmVyTm9kZTo6RmluZFJh
bmsoY29uc3QgVE9iamVjdCAqd2hhdCkgY29uc3QKewogICAvLyBSZWN1cnNpdmVseSBsb29rIGZv
ciBXSEFUIHN0YXJ0aW5nIGluIHRoZSBjdXJyZW50IG5vZGUuCgogICBpZiAoKChUT2JqZWN0ICop
d2hhdCktPkNvbXBhcmUoR2V0S2V5KDEpKSA8IDApCiAgICAgIHJldHVybiBHZXRUcmVlKDApLT5G
aW5kUmFuayh3aGF0KTsKICAgSW50X3Qgc3VtID0gR2V0Tm9mS2V5cygwKTsKICAgZm9yIChJbnRf
dCBpID0gMTsgaSA8IGZMYXN0OyBpKyspIHsKICAgICAgaWYgKCgoVE9iamVjdCopd2hhdCktPkNv
bXBhcmUoR2V0S2V5KGkpKSA9PSAwKQogICAgICAgICByZXR1cm4gc3VtOwogICAgICBzdW0rKzsK
ICAgICAgaWYgKCgoVE9iamVjdCAqKXdoYXQpLT5Db21wYXJlKEdldEtleShpKzEpKSA8IDApCiAg
ICAgICAgIHJldHVybiBzdW0gKyBHZXRUcmVlKGkpLT5GaW5kUmFuayh3aGF0KTsKICAgICAgc3Vt
ICs9IEdldE5vZktleXMoaSk7CiAgIH0KICAgaWYgKCgoVE9iamVjdCopd2hhdCktPkNvbXBhcmUo
R2V0S2V5KGZMYXN0KSkgPT0gMCkKICAgICAgcmV0dXJuIHN1bTsKICAgc3VtKys7CiAgIC8vICp3
aGF0ID4gR2V0S2V5KGZMYXN0KSwgc28gcmVjdXJzZSBvbiBsYXN0IGZJdGVtLmZUcmVlCiAgIHJl
dHVybiBzdW0gKyBHZXRUcmVlKGZMYXN0KS0+RmluZFJhbmsod2hhdCk7Cn0KCi8vX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fCkludF90IFRCdElubmVyTm9kZTo6RmluZFJhbmtVcChjb25zdCBUQnROb2Rl
ICp0aGF0KSBjb25zdAp7CiAgIC8vIEZpbmRSYW5rVXAgaXMgRmluZFJhbmsgaW4gcmV2ZXJzZS4K
ICAgLy8gV2hlcmVhcyBGaW5kUmFuayBsb29rcyBmb3IgdGhlIG9iamVjdCBhbmQgY29tcHV0ZXMg
dGhlIHJhbmsKICAgLy8gYWxvbmcgdGhlIHdheSB3aGlsZSB3YWxraW5nIERPV04gdGhlIHRyZWUs
IEZpbmRSYW5rVXAgYWxyZWFkeQogICAvLyBrbm93cyB3aGVyZSB0aGUgb2JqZWN0IGlzIGFuZCBo
YXMgdG8gd2FsayBVUCB0aGUgdHJlZSBmcm9tIHRoZQogICAvLyBvYmplY3QgdG8gY29tcHV0ZSB0
aGUgcmFuay4KCiAgIEludF90IGwgICA9IEluZGV4T2YodGhhdCk7CiAgIEludF90IHN1bSA9IDA7
CiAgIGZvciAoSW50X3QgaSA9IDA7IGkgPCBsOyBpKyspCiAgICAgIHN1bSArPSBHZXROb2ZLZXlz
KGkpOwogICByZXR1cm4gc3VtICsgbCArIChmUGFyZW50ID09IDAgPyAwIDogZlBhcmVudC0+Rmlu
ZFJhbmtVcCh0aGlzKSk7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClRCdExlYWZOb2RlICpU
QnRJbm5lck5vZGU6OkZpcnN0TGVhZk5vZGUoKQp7CiAgIHJldHVybiBHZXRUcmVlKDApLT5GaXJz
dExlYWZOb2RlKCk7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClRPYmplY3QgKlRCdElubmVy
Tm9kZTo6Rm91bmQoY29uc3QgVE9iamVjdCAqd2hhdCwgVEJ0Tm9kZSAqKndoaWNoLCBJbnRfdCAq
d2hlcmUpCnsKICAgLy8gUmVjdXJzaXZlbHkgbG9vayBmb3IgV0hBVCBzdGFydGluZyBpbiB0aGUg
Y3VycmVudCBub2RlLgoKICAgQXNzZXJ0KHdoYXQtPklzU29ydGFibGUoKSk7CiAgIGZvciAoSW50
X3QgaSA9IDEgOyBpIDw9IGZMYXN0OyBpKyspIHsKICAgICAgaWYgKEdldEtleShpKS0+Q29tcGFy
ZSgoVE9iamVjdCopd2hhdCkgPT0gMCkgewogICAgICAgICAvLyB0aGVuIGNvdWxkIGdvIGluIGVp
dGhlciBmSXRlbVtpXS5mVHJlZSBvciBmSXRlbVtpLTFdLmZUcmVlCiAgICAgICAgIC8vIHNob3Vs
ZCBnbyBpbiBvbmUgd2l0aCB0aGUgbW9zdCByb29tLCBidXQgdGhhdCdzIGtpbmRhCiAgICAgICAg
IC8vIGhhcmQgdG8gY2FsY3VsYXRlLCBzbyB3ZSdsbCBzdGljayBpdCBpbiBmSXRlbVtpXS5mVHJl
ZQogICAgICAgICAqd2hpY2ggPSB0aGlzOwogICAgICAgICAqd2hlcmUgPSBpOwogICAgICAgICBy
ZXR1cm4gR2V0S2V5KGkpOwogICAgICB9CiAgICAgIGlmIChHZXRLZXkoaSktPkNvbXBhcmUoKFRP
YmplY3QqKXdoYXQpID4gMCkKICAgICAgICAgcmV0dXJuIEdldFRyZWUoaS0xKS0+Rm91bmQod2hh
dCwgd2hpY2gsIHdoZXJlKTsKICAgfQogICAvLyAqd2hhdCA+ICooKnRoaXMpW2ZMYXN0XS5mS2V5
LCBzbyByZWN1cnNlIG9uIGxhc3QgZkl0ZW0uZlRyZWUKICAgcmV0dXJuIEdldFRyZWUoZkxhc3Qp
LT5Gb3VuZCh3aGF0LCB3aGljaCwgd2hlcmUpOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp2
b2lkIFRCdElubmVyTm9kZTo6SW5jck5vZktleXMoVEJ0Tm9kZSAqdGhhdCkKewogICAvLyBUSEFU
IGlzIGEgY2hpbGQgb2YgVEhJUyB0aGF0IGhhcyBqdXN0IGdyb3duIGJ5IDEuCgogICBJbnRfdCBp
ID0gSW5kZXhPZih0aGF0KTsKICAgZkl0ZW1baV0uZk5vZktleXNJblRyZWUrKzsKICAgaWYgKGZQ
YXJlbnQgIT0gMCkKICAgICAgZlBhcmVudC0+SW5jck5vZktleXModGhpcyk7CiAgIGVsc2UKICAg
ICAgZlRyZWUtPkluY3JOb2ZLZXlzKCk7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludF90
IFRCdElubmVyTm9kZTo6SW5kZXhPZihjb25zdCBUQnROb2RlICp0aGF0KSBjb25zdAp7CiAgIC8v
IFJldHVybnMgYSBudW1iZXIgaW4gdGhlIHJhbmdlIDAgdG8gdGhpcy0+Zkxhc3QKICAgLy8gMCBp
cyByZXR1cm5lZCBpZiBUSEFUID09IGZUcmVlWzBdLgoKICAgZm9yIChJbnRfdCBpID0gMDsgaSA8
PSBmTGFzdDsgaSsrKQogICAgICBpZiAoR2V0VHJlZShpKSA9PSB0aGF0KQogICAgICAgICByZXR1
cm4gaTsKICAgQ2hlY2soMCk7CiAgIHJldHVybiAwOwp9CgovL19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
Xwp2b2lkIFRCdElubmVyTm9kZTo6SW5mb3JtUGFyZW50KCkKewogICBpZiAoZlBhcmVudCA9PSAw
KSB7CiAgICAgIC8vIHRoZW4gdGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgdHJlZSBhbmQgbmVlZHMg
dG8gYmUgc3BsaXQKICAgICAgLy8gaW5mb3JtIHRoZSBidHJlZS4KICAgICAgQXNzZXJ0KGZUcmVl
LT5mUm9vdCA9PSB0aGlzKTsKICAgICAgZlRyZWUtPlJvb3RJc0Z1bGwoKTsKICAgfSBlbHNlCiAg
ICAgIGZQYXJlbnQtPklzRnVsbCh0aGlzKTsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kdm9p
ZCBUQnRJbm5lck5vZGU6OklzRnVsbChUQnROb2RlICp0aGF0KQp7CiAgIC8vIFRoZSBjaGlsZCBu
b2RlIFRIQVQgaXMgZnVsbC4gV2Ugd2lsbCBlaXRoZXIgcmVkaXN0cmlidXRlIGVsZW1lbnRzCiAg
IC8vIG9yIGNyZWF0ZSBhIG5ldyBub2RlIGFuZCB0aGVuIHJlZGlzdHJpYnV0ZS4KICAgLy8gSW4g
YW4gYXR0ZW1wdCB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIHNwbGl0cywgd2UgYWRvcHQgdGhl
IGZvbGxvd2luZwogICAvLyBzdHJhdGVneToKICAgLy8gICogcmVkaXN0cmlidXRlIGlmIHBvc3Np
YmxlCiAgIC8vICAqIGlmIG5vdCBwb3NzaWJsZSwgdGhlbiBzcGxpdCB3aXRoIGEgc2libGluZwoK
ICAgaWYgKHRoYXQtPmZJc0xlYWYpIHsKICAgICAgVEJ0TGVhZk5vZGUgKmxlYWYgPSAoVEJ0TGVh
Zk5vZGUgKil0aGF0OwogICAgICBUQnRMZWFmTm9kZSAqbGVmdCA9IDA7CiAgICAgIFRCdExlYWZO
b2RlICpyaWdodD0gMDsKICAgICAgLy8gc3BsaXQgTEVBRiBvbmx5IGlmIGJvdGggc2libGluZyBu
b2RlcyBhcmUgZnVsbC4KICAgICAgSW50X3QgbGVhZmlkeCA9IEluZGV4T2YobGVhZik7CiAgICAg
IEludF90IGhhc1JpZ2h0U2liID0gKGxlYWZpZHggPCBmTGFzdCkgJiYKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKChyaWdodCA9IChUQnRMZWFmTm9kZSopR2V0VHJlZShsZWFmaWR4KzEpKSAh
PSAwKTsKICAgICAgSW50X3QgaGFzTGVmdFNpYiAgPSAobGVhZmlkeCA+IDApICYmCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICgobGVmdCA9IChUQnRMZWFmTm9kZSopR2V0VHJlZShsZWFmaWR4
LTEpKSAhPSAwKTsKICAgICAgSW50X3QgcmlnaHRTaWJGdWxsID0gKGhhc1JpZ2h0U2liICYmIHJp
Z2h0LT5Jc0FsbW9zdEZ1bGwoKSk7CiAgICAgIEludF90IGxlZnRTaWJGdWxsICA9IChoYXNMZWZ0
U2liICAmJiBsZWZ0LT5Jc0FsbW9zdEZ1bGwoKSk7CiAgICAgIGlmIChyaWdodFNpYkZ1bGwpIHsK
ICAgICAgICAgaWYgKGxlZnRTaWJGdWxsKSB7CiAgICAgICAgICAgIC8vIGJvdGggZnVsbCwgc28g
cGljayBvbmUgdG8gc3BsaXQgd2l0aAogICAgICAgICAgICBsZWZ0LT5TcGxpdFdpdGgobGVhZiwg
bGVhZmlkeCk7CiAgICAgICAgIH0gZWxzZSBpZiAoaGFzTGVmdFNpYikgewogICAgICAgICAgICAv
LyBsZWZ0IHNpYiBub3QgZnVsbCwgc28gYmFsYW5jZSB3aXRoIGl0CiAgICAgICAgICAgIGxlYWYt
PkJhbGFuY2VXaXRoTGVmdChsZWZ0LCBsZWFmaWR4KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAg
ICAgICAgLy8gdGhlcmUgaXMgbm8gbGVmdCBzaWJsaW5nLCBzbyBzcGxpdCB3aXRoIHJpZ2h0CiAg
ICAgICAgICAgIGxlYWYtPlNwbGl0V2l0aChyaWdodCwgbGVhZmlkeCsxKTsKICAgICAgICAgfQog
ICAgICB9IGVsc2UgaWYgKGhhc1JpZ2h0U2liKSB7CiAgICAgICAgIC8vIHJpZ2h0IHNpYiBub3Qg
ZnVsbCwgc28gYmFsYW5jZSB3aXRoIGl0CiAgICAgICAgIGxlYWYtPkJhbGFuY2VXaXRoUmlnaHQo
cmlnaHQsIGxlYWZpZHgrMSk7CiAgICAgIH0gZWxzZSBpZiAobGVmdFNpYkZ1bGwpIHsKICAgICAg
ICAgLy8gbm8gcmlnaHQgc2liLCBhbmQgbGVmdCBzaWIgaXMgZnVsbCwgc28gc3BsaXQgd2l0aCBp
dAogICAgICAgICBsZWZ0LT5TcGxpdFdpdGgobGVhZiwgbGVhZmlkeCk7CiAgICAgIH0gZWxzZSBp
ZiAoaGFzTGVmdFNpYikgewogICAgICAgICAvLyBsZWZ0IHNpYiBub3QgZnVsbCBzbyBiYWxhbmNl
IHdpdGggaXQKICAgICAgICAgbGVhZi0+QmFsYW5jZVdpdGhMZWZ0KGxlZnQsIGxlYWZpZHgpOwog
ICAgICB9IGVsc2UgewogICAgICAgICAvLyBuZWl0aGVyIGEgbGVmdCBvciByaWdodCBzaWI7IHNo
b3VsZCBuZXZlciBoYXBwZW4KICAgICAgICAgQ2hlY2soMCk7CiAgICAgIH0KICAgfSBlbHNlIHsK
ICAgICAgVEJ0SW5uZXJOb2RlICppbm5lciA9IChUQnRJbm5lck5vZGUgKil0aGF0OwogICAgICAv
LyBzcGxpdCBJTk5FUiBvbmx5IGlmIGJvdGggc2libGluZyBub2RlcyBhcmUgZnVsbAogICAgICBJ
bnRfdCBpbm5lcmlkeCA9IEluZGV4T2YoaW5uZXIpOwogICAgICBUQnRJbm5lck5vZGUgKmxlZnQg
PSAwOwogICAgICBUQnRJbm5lck5vZGUgKnJpZ2h0PSAwOwogICAgICBJbnRfdCBoYXNSaWdodFNp
YiA9IChpbm5lcmlkeCA8IGZMYXN0KSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJp
Z2h0ID0gKFRCdElubmVyTm9kZSopR2V0VHJlZShpbm5lcmlkeCsxKSkgIT0gMCk7CiAgICAgIElu
dF90IGhhc0xlZnRTaWIgID0gKGlubmVyaWR4ID4gMCkgJiYKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKChsZWZ0PShUQnRJbm5lck5vZGUqKUdldFRyZWUoaW5uZXJpZHgtMSkpICE9IDApOwog
ICAgICBJbnRfdCByaWdodFNpYkZ1bGwgPSAoaGFzUmlnaHRTaWIgJiYgcmlnaHQtPklzQWxtb3N0
RnVsbCgpKTsKICAgICAgSW50X3QgbGVmdFNpYkZ1bGwgID0gKGhhc0xlZnRTaWIgICYmIGxlZnQt
PklzQWxtb3N0RnVsbCgpKTsKICAgICAgaWYgKHJpZ2h0U2liRnVsbCkgewogICAgICAgICBpZiAo
bGVmdFNpYkZ1bGwpIHsKICAgICAgICAgICAgbGVmdC0+U3BsaXRXaXRoKGlubmVyLCBpbm5lcmlk
eCk7CiAgICAgICAgIH0gZWxzZSBpZiAoaGFzTGVmdFNpYikgewogICAgICAgICAgICBpbm5lci0+
QmFsYW5jZVdpdGhMZWZ0KGxlZnQsIGlubmVyaWR4KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAg
ICAgICAgLy8gdGhlcmUgaXMgbm8gbGVmdCBzaWJsaW5nCiAgICAgICAgICAgIGlubmVyLT5TcGxp
dFdpdGgocmlnaHQsIGlubmVyaWR4KzEpOwogICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoaGFz
UmlnaHRTaWIpIHsKICAgICAgICAgaW5uZXItPkJhbGFuY2VXaXRoUmlnaHQocmlnaHQsIGlubmVy
aWR4KzEpOwogICAgICB9IGVsc2UgaWYgKGxlZnRTaWJGdWxsKSB7CiAgICAgICAgIGxlZnQtPlNw
bGl0V2l0aChpbm5lciwgaW5uZXJpZHgpOwogICAgICB9IGVsc2UgaWYgKGhhc0xlZnRTaWIpIHsK
ICAgICAgICAgaW5uZXItPkJhbGFuY2VXaXRoTGVmdChsZWZ0LCBpbm5lcmlkeCk7CiAgICAgIH0g
ZWxzZSB7CiAgICAgICAgIENoZWNrKDApOwogICAgICB9CiAgIH0KfQoKLy9fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX18Kdm9pZCBUQnRJbm5lck5vZGU6OklzTG93KFRCdE5vZGUgKnRoYXQpCnsKICAgLy8g
VGhlIGNoaWxkIG5vZGUgVEhBVCBpcyA8PSBoYWxmIGZ1bGwuIFdlIHdpbGwgZWl0aGVyIHJlZGlz
dHJpYnV0ZQogICAvLyBlbGVtZW50cyBiZXR3ZWVuIGNoaWxkcmVuLCBvciBUSEFUIHdpbGwgYmUg
bWVyZ2VkIHdpdGggYW5vdGhlciBjaGlsZC4KICAgLy8gSW4gYW4gYXR0ZW1wdCB0byBtaW5pbWl6
ZSB0aGUgbnVtYmVyIG9mIG1lcmdlcnMsIHdlIGFkb3B0IHRoZSBmb2xsb3dpbmcKICAgLy8gc3Ry
YXRlZ3k6CiAgIC8vICAqIHJlZGlzdHJpYnV0ZSBpZiBwb3NzaWJsZQogICAvLyAgKiBpZiBub3Qg
cG9zc2libGUsIHRoZW4gbWVyZ2Ugd2l0aCBhIHNpYmxpbmcKCiAgIGlmICh0aGF0LT5mSXNMZWFm
KSB7CiAgICAgIFRCdExlYWZOb2RlICpsZWFmID0gKFRCdExlYWZOb2RlICopdGhhdDsKICAgICAg
VEJ0TGVhZk5vZGUgKmxlZnQgPSAwOwogICAgICBUQnRMZWFmTm9kZSAqcmlnaHQ9IDA7CiAgICAg
IC8vIHNwbGl0IExFQUYgb25seSBpZiBib3RoIHNpYmxpbmcgbm9kZXMgYXJlIGZ1bGwuCiAgICAg
IEludF90IGxlYWZpZHggPSBJbmRleE9mKGxlYWYpOwogICAgICBJbnRfdCBoYXNSaWdodFNpYiA9
IChsZWFmaWR4IDwgZkxhc3QpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgocmlnaHQg
PSAoVEJ0TGVhZk5vZGUqKUdldFRyZWUobGVhZmlkeCsxKSkgIT0gMCk7CiAgICAgIEludF90IGhh
c0xlZnRTaWIgID0gKGxlYWZpZHggPiAwKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAo
KGxlZnQgPSAoVEJ0TGVhZk5vZGUqKUdldFRyZWUobGVhZmlkeC0xKSkgIT0gMCk7CiAgICAgIGlm
IChoYXNSaWdodFNpYiAmJiAobGVhZi0+UHNpemUoKSArIHJpZ2h0LT5Wc2l6ZSgpKSA+PSBsZWFm
LT5NYXhQc2l6ZSgpKSB7CiAgICAgICAgIC8vIHRoZW4gY2Fubm90IG1lcmdlLAogICAgICAgICAv
LyBhbmQgYmFsYW5jaW5nIHRoaXMgYW5kIHJpZ2h0c2liIHdpbGwgbGVhdmUgdGhlbSBib3RoCiAg
ICAgICAgIC8vIG1vcmUgdGhhbiBoYWxmIGZ1bGwKICAgICAgICAgbGVhZi0+QmFsYW5jZVdpdGgo
cmlnaHQsIGxlYWZpZHgrMSk7CiAgICAgIH0gZWxzZSBpZiAoaGFzTGVmdFNpYiAmJiAobGVhZi0+
VnNpemUoKSArIGxlZnQtPlBzaXplKCkpID49IGxlYWYtPk1heFBzaXplKCkpIHsKICAgICAgICAg
Ly8gZGl0dG8KICAgICAgICAgbGVmdC0+QmFsYW5jZVdpdGgobGVhZiwgbGVhZmlkeCk7CiAgICAg
IH0gZWxzZSBpZiAoaGFzTGVmdFNpYikgewogICAgICAgICAvLyB0aGVuIHRoZXkgc2hvdWxkIGJl
IG1lcmdlZAogICAgICAgICBsZWZ0LT5NZXJnZVdpdGhSaWdodChsZWFmLCBsZWFmaWR4KTsKICAg
ICAgfSBlbHNlIGlmIChoYXNSaWdodFNpYikgewogICAgICAgICBsZWFmLT5NZXJnZVdpdGhSaWdo
dChyaWdodCwgbGVhZmlkeCsxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAgQ2hlY2soMCk7IC8v
IHNob3VsZCBuZXZlciBoYXBwZW4KICAgICAgfQogICB9IGVsc2UgewogICAgICBUQnRJbm5lck5v
ZGUgKmlubmVyID0gKFRCdElubmVyTm9kZSAqKXRoYXQ7CgogICAgICBJbnRfdCBpbm5lcmlkeCA9
IEluZGV4T2YoaW5uZXIpOwogICAgICBUQnRJbm5lck5vZGUgKmxlZnQgPSAwOwogICAgICBUQnRJ
bm5lck5vZGUgKnJpZ2h0PSAwOwogICAgICBJbnRfdCBoYXNSaWdodFNpYiA9IChpbm5lcmlkeCA8
IGZMYXN0KSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJpZ2h0ID0gKFRCdElubmVy
Tm9kZSopR2V0VHJlZShpbm5lcmlkeCsxKSkgIT0gMCk7CiAgICAgIEludF90IGhhc0xlZnRTaWIg
ID0gKGlubmVyaWR4ID4gMCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsZWZ0ID0g
KFRCdElubmVyTm9kZSopR2V0VHJlZShpbm5lcmlkeC0xKSkgIT0gMCk7CiAgICAgIGlmIChoYXNS
aWdodFNpYiAmJiAoaW5uZXItPlBzaXplKCkgKyByaWdodC0+VnNpemUoKSkgPj0gaW5uZXItPk1h
eFBzaXplKCkpIHsKICAgICAgICAgLy8gY2Fubm90IG1lcmdlCiAgICAgICAgIGlubmVyLT5CYWxh
bmNlV2l0aChyaWdodCwgaW5uZXJpZHgrMSk7CiAgICAgIH0gZWxzZSBpZiAoaGFzTGVmdFNpYiAm
JiAoaW5uZXItPlZzaXplKCkgKyBsZWZ0LT5Qc2l6ZSgpKSA+PSBpbm5lci0+TWF4UHNpemUoKSkg
ewogICAgICAgICAvLyBjYW5ub3QgbWVyZ2UKICAgICAgICAgbGVmdC0+QmFsYW5jZVdpdGgoaW5u
ZXIsIGlubmVyaWR4KTsKICAgICAgfSBlbHNlIGlmIChoYXNMZWZ0U2liKSB7CiAgICAgICAgIGxl
ZnQtPk1lcmdlV2l0aFJpZ2h0KGlubmVyLCBpbm5lcmlkeCk7CiAgICAgIH0gZWxzZSBpZiAoaGFz
UmlnaHRTaWIpIHsKICAgICAgICAgaW5uZXItPk1lcmdlV2l0aFJpZ2h0KHJpZ2h0LCBpbm5lcmlk
eCsxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAgQ2hlY2soMCk7CiAgICAgIH0KICAgfQp9Cgov
L19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXwpUQnRMZWFmTm9kZSAqVEJ0SW5uZXJOb2RlOjpMYXN0TGVh
Zk5vZGUoKQp7CiAgICByZXR1cm4gR2V0VHJlZShmTGFzdCktPkxhc3RMZWFmTm9kZSgpOwp9Cgov
L19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdElubmVyTm9kZTo6TWVyZ2VXaXRoUmlnaHQo
VEJ0SW5uZXJOb2RlICpyaWdodHNpYiwgSW50X3QgcGlkeCkKewogICBBc3NlcnQoUHNpemUoKSAr
IHJpZ2h0c2liLT5Wc2l6ZSgpIDwgTWF4SW5kZXgoKSk7CiAgIGlmIChyaWdodHNpYi0+UHNpemUo
KSA+IDApCiAgICAgIHJpZ2h0c2liLT5QdXNoTGVmdChyaWdodHNpYi0+UHNpemUoKSwgdGhpcywg
cGlkeCk7CiAgIHJpZ2h0c2liLT5TZXRLZXkoMCwgZlBhcmVudC0+R2V0S2V5KHBpZHgpKTsKICAg
QXBwZW5kRnJvbShyaWdodHNpYiwgMCwgMCk7CiAgIGZQYXJlbnQtPkluY05vZktleXMocGlkeC0x
LCByaWdodHNpYi0+R2V0Tm9mS2V5cygwKSsxKTsKICAgZlBhcmVudC0+UmVtb3ZlSXRlbShwaWR4
KTsKICAgZGVsZXRlIHJpZ2h0c2liOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRfdCBU
QnRJbm5lck5vZGU6Ok5vZktleXMoKSBjb25zdAp7CiAgIEludF90IHN1bSA9IDA7CiAgIGZvciAo
SW50X3QgaSA9IDA7IGkgPD0gZkxhc3Q7IGkrKykKICAgICAgc3VtICs9IEdldE5vZktleXMoaSk7
CiAgIHJldHVybiBzdW0gKyBQc2l6ZSgpOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpUT2Jq
ZWN0ICpUQnRJbm5lck5vZGU6Om9wZXJhdG9yW10oSW50X3QgaWR4KSBjb25zdAp7CiAgIGZvciAo
SW50X3QgaiA9IDA7IGogPD0gZkxhc3Q7IGorKykgewogICAgICBJbnRfdCByOwogICAgICBpZiAo
aWR4IDwgKHIgPSBHZXROb2ZLZXlzKGopKSkKICAgICAgICAgcmV0dXJuICgqR2V0VHJlZShqKSlb
aWR4XTsKICAgICAgaWYgKGlkeCA9PSByKSB7CiAgICAgICAgIGlmIChqID09IGZMYXN0KSB7CiAg
ICAgICAgICAgIDo6RXJyb3IoIlRCdElubmVyTm9kZTo6b3BlcmF0b3JbXSIsICJzaG91bGQgbm90
IGhhcHBlbiwgMCByZXR1cm5lZCIpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0g
ZWxzZQogICAgICAgICAgICByZXR1cm4gR2V0S2V5KGorMSk7CiAgICAgIH0KICAgICAgaWR4IC09
IHIrMTsgLy8gKzEgYmVjYXVzZSBvZiB0aGUga2V5IGluIHRoZSBub2RlCiAgIH0KICAgOjpFcnJv
cigiVEJ0SW5uZXJOb2RlOjpvcGVyYXRvcltdIiwgInNob3VsZCBub3QgaGFwcGVuLCAwIHJldHVy
bmVkIik7CiAgIHJldHVybiAwOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdElu
bmVyTm9kZTo6UHVzaExlZnQoSW50X3Qgbm9Gcm9tVGhpcywgVEJ0SW5uZXJOb2RlICpsZWZ0c2li
LCBJbnRfdCBwaWR4KQp7CiAgIC8vIG5vRnJvbVRoaXM9PTEgPT4gbW92ZXMgdGhlIHBhcmVudCBp
dGVtIGludG8gdGhlIGxlZnRzaWIsCiAgIC8vIGFuZCB0aGUgZmlyc3QgaXRlbSBpbiB0aGlzJ3Mg
YXJyYXkgaW50byB0aGUgcGFyZW50IGl0ZW0uCgogICBBc3NlcnQoZlBhcmVudC0+R2V0VHJlZShw
aWR4KSA9PSB0aGlzKTsKICAgQXNzZXJ0KG5vRnJvbVRoaXMgPiAwICYmIG5vRnJvbVRoaXMgPD0g
UHNpemUoKSk7CiAgIEFzc2VydChub0Zyb21UaGlzICsgbGVmdHNpYi0+UHNpemUoKSA8IE1heFBz
aXplKCkpOwogICBTZXRLZXkoMCwgZlBhcmVudC0+R2V0S2V5KHBpZHgpKTsgLy8gbWFrZXMgQXBw
ZW5kRnJvbSdzIGpvYiBlYXNpZXIKICAgbGVmdHNpYi0+QXBwZW5kRnJvbSh0aGlzLCAwLCBub0Zy
b21UaGlzLTEpOwogICBTaGlmdExlZnQobm9Gcm9tVGhpcyk7CiAgIGZQYXJlbnQtPlNldEtleShw
aWR4LCBHZXRLZXkoMCkpOwogICBmUGFyZW50LT5TZXROb2ZLZXlzKHBpZHgtMSwgbGVmdHNpYi0+
Tm9mS2V5cygpKTsKICAgZlBhcmVudC0+U2V0Tm9mS2V5cyhwaWR4LCBOb2ZLZXlzKCkpOwp9Cgov
L19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdElubmVyTm9kZTo6UHVzaFJpZ2h0KEludF90
IG5vRnJvbVRoaXMsIFRCdElubmVyTm9kZSAqcmlnaHRzaWIsIEludF90IHBpZHgpCnsKICAgQXNz
ZXJ0KG5vRnJvbVRoaXMgPiAwICYmIG5vRnJvbVRoaXMgPD0gUHNpemUoKSk7CiAgIEFzc2VydChu
b0Zyb21UaGlzICsgcmlnaHRzaWItPlBzaXplKCkgPCByaWdodHNpYi0+TWF4UHNpemUoKSk7CiAg
IEFzc2VydChmUGFyZW50LT5HZXRUcmVlKHBpZHgpID09IHJpZ2h0c2liKTsKICAgLy8KICAgLy8g
VGhlIG9wZXJhdGlvbiBpcyB0aHJlZSBzdGVwczoKICAgLy8gIFN0ZXAgSS4gICBNYWtlIHJvb20g
Zm9yIHRoZSBpbmNvbWluZyBrZXlzIGluIFJJR0hUU0lCLgogICAvLyAgU3RlcCBJSS4gIE1vdmUg
dGhlIGl0ZW1zIGZyb20gVEhJUyBpbnRvIFJJR0hUU0lCLgogICAvLyAgU3RlcCBJSUkuIFVwZGF0
ZSB0aGUgbGVuZ3RoIG9mIFRISVMuCiAgIC8vCiAgIC8vIFN0ZXAgSS4gTWFrZSBzcGFjZSBmb3Ig
bm9Gcm9tVGhpcyBpdGVtcwogICAvLwogICBJbnRfdCBzdGFydCA9IGZMYXN0IC0gbm9Gcm9tVGhp
cyArIDE7CiAgIEludF90IHRndCwgc3JjOwogICB0Z3QgPSByaWdodHNpYi0+Zkxhc3QgKyBub0Zy
b21UaGlzOwogICBzcmMgPSByaWdodHNpYi0+Zkxhc3Q7CiAgIHJpZ2h0c2liLT5mTGFzdCA9IHRn
dDsKICAgcmlnaHRzaWItPlNldEtleSgwLCBmUGFyZW50LT5HZXRLZXkocGlkeCkpOyBJbmNOb2ZL
ZXlzKDApOwogICB3aGlsZSAoc3JjID49IDApIHsKICAgICAgLy8gZG8gdGhpcyBraW5kIG9mIGFz
c2lnbm1lbnQgb24gVEJ0SW5uZXJOb2RlIGl0ZW1zIG9ubHkgd2hlbgogICAgICAvLyB0aGUgcGFy
ZW50IGZpZWxkcyBvZiB0aGUgbW92ZWQgaXRlbXMgZG8gbm90IGNoYW5nZSwgYXMgdGhleQogICAg
ICAvLyBkb24ndCBoZXJlLgogICAgICAvLyBPdGhlcndpc2UsIHVzZSBTZXRJdGVtIHNvIHRoZSBw
YXJlbnRzIGFyZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHkuCiAgICAgIHJpZ2h0c2liLT5HZXRJdGVt
KHRndC0tKSA9IHJpZ2h0c2liLT5HZXRJdGVtKHNyYy0tKTsKICAgfQoKICAgLy8gU3RlcCBJSS4g
TW92ZSB0aGUgaXRlbXMgZnJvbSBUSElTIGludG8gUklHSFRTSUIKICAgZm9yIChJbnRfdCBpID0g
Zkxhc3Q7IGkgPj0gc3RhcnQ7IGktLSApIHsKICAgICAgLy8gdGhpcyBpcyB0aGUga2luZCBvZiBh
c3NpZ25tZW50IHRvIHVzZSB3aGVuIHBhcmVudHMgY2hhbmdlCiAgICAgIHJpZ2h0c2liLT5TZXRJ
dGVtKHRndC0tLCBHZXRJdGVtKGkpKTsKICAgfQogICBmUGFyZW50LT5TZXRLZXkocGlkeCwgcmln
aHRzaWItPkdldEtleSgwKSk7CiAgIERlY05vZktleXMoMCk7CiAgIENoZWNrKHRndCA9PSAtMSk7
CgogICAvLyBTdGVwIElJSS4KICAgZkxhc3QgLT0gbm9Gcm9tVGhpczsKCiAgIC8vIFN0ZXAgVkku
ICB1cGRhdGUgTm9mS2V5cwogICBmUGFyZW50LT5TZXROb2ZLZXlzKHBpZHgtMSwgTm9mS2V5cygp
KTsKICAgZlBhcmVudC0+U2V0Tm9mS2V5cyhwaWR4LCByaWdodHNpYi0+Tm9mS2V5cygpKTsKfQoK
Ly9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX18Kdm9pZCBUQnRJbm5lck5vZGU6OlJlbW92ZShJbnRfdCBp
bmRleCkKewogICBBc3NlcnQoaW5kZXggPj0gMSAmJiBpbmRleCA8PSBmTGFzdCk7CiAgIFRCdExl
YWZOb2RlICpsZiA9IEdldFRyZWUoaW5kZXgpLT5GaXJzdExlYWZOb2RlKCk7CiAgIFNldEtleShp
bmRleCwgbGYtPmZJdGVtWzBdKTsKICAgbGYtPlJlbW92ZUl0ZW0oMCk7Cn0KCi8vX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fCnZvaWQgVEJ0SW5uZXJOb2RlOjpSZW1vdmVJdGVtKEludF90IGluZGV4KQp7
CiAgIEFzc2VydChpbmRleCA+PSAxICYmIGluZGV4IDw9IGZMYXN0KTsKICAgZm9yIChJbnRfdCB0
byA9IGluZGV4OyB0byA8IGZMYXN0OyB0bysrKQogICAgICBmSXRlbVt0b10gPSBmSXRlbVt0bysx
XTsKICAgZkxhc3QtLTsKICAgaWYgKElzTG93KCkpIHsKICAgICAgaWYgKGZQYXJlbnQgPT0gMCkg
ewogICAgICAgICAvLyB0aGVuIHRoaXMgaXMgdGhlIHJvb3Q7IHdoZW4gb25seSBvbmUgY2hpbGQs
IG1ha2UgdGhlIGNoaWxkIHRoZSByb290CiAgICAgICAgIGlmIChQc2l6ZSgpID09IDApCiAgICAg
ICAgICAgIGZUcmVlLT5Sb290SXNFbXB0eSgpOwogICAgICB9IGVsc2UKICAgICAgICAgZlBhcmVu
dC0+SXNMb3codGhpcyk7CiAgIH0KfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kdm9pZCBUQnRJ
bm5lck5vZGU6OlNoaWZ0TGVmdChJbnRfdCBjbnQpCnsKICAgaWYgKGNudCA8PSAwKQogICAgICBy
ZXR1cm47CiAgIGZvciAoSW50X3QgaSA9IGNudDsgaSA8PSBmTGFzdDsgaSsrKQogICAgICBHZXRJ
dGVtKGktY250KSA9IEdldEl0ZW0oaSk7CiAgIGZMYXN0IC09IGNudDsKfQoKLy9fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX18Kdm9pZCBUQnRJbm5lck5vZGU6OlNwbGl0KCkKewogICAvLyBUaGlzIGZ1bmN0
aW9uIGlzIGNhbGxlZCBvbmx5IHdoZW4gVEhJUyBpcyB0aGUgb25seSBkZXNjZW5kZW50CiAgIC8v
IG9mIHRoZSByb290IG5vZGUsIGFuZCBUSElTIG5lZWRzIHRvIGJlIHNwbGl0LgogICAvLyBBc3N1
bWVzIHRoYXQgaWR4IG9mIFRISVMgaW4gZlBhcmVudCBpcyAwLgoKICAgVEJ0SW5uZXJOb2RlICpu
ZXdub2RlID0gbmV3IFRCdElubmVyTm9kZShmUGFyZW50KTsKICAgQ2hlY2sobmV3bm9kZSAhPSAw
KTsKICAgZlBhcmVudC0+QXBwZW5kKEdldEtleShmTGFzdCksIG5ld25vZGUpOwogICBuZXdub2Rl
LT5BcHBlbmRGcm9tKHRoaXMsIGZMYXN0LCBmTGFzdCk7CiAgIGZMYXN0LS07CiAgIGZQYXJlbnQt
PkluY05vZktleXMoMSwgbmV3bm9kZS0+R2V0Tm9mS2V5cygwKSk7CiAgIGZQYXJlbnQtPkRlY05v
ZktleXMoMCwgbmV3bm9kZS0+R2V0Tm9mS2V5cygwKSk7CiAgIEJhbGFuY2VXaXRoUmlnaHQobmV3
bm9kZSwgMSk7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCnZvaWQgVEJ0SW5uZXJOb2RlOjpT
cGxpdFdpdGgoVEJ0SW5uZXJOb2RlICpyaWdodHNpYiwgSW50X3Qga2V5aWR4KQp7CiAgIC8vIFRI
SVMgYW5kIFNJQiBhcmUgdG9vIGZ1bGw7IGNyZWF0ZSBhIE5FV05PREUsIGFuZCBiYWxhbmNlCiAg
IC8vIHRoZSBudW1iZXIgb2Yga2V5cyBiZXR3ZWVuIHRoZSB0aHJlZSBvZiB0aGVtLgogICAvLwog
ICAvLyBwaWN0dXJlOiAoYWxzbyBzZWUgS251dGggVm9sIDMgcGcgNDc4KQogICAvLyAgICAgICAg
ICAgICAgIGtleWlkeCBrZXlpZHgrMQogICAvLyAgICAgICAgICAgICstLSstLSstLSstLSstLSst
LS4uLgogICAvLyAgICAgICAgICAgIHwgIHwgIHwgIHwgIHwgIHwKICAgLy8gZlBhcmVudC0tLT58
ICB8ICAgICB8ICAgICB8CiAgIC8vICAgICAgICAgICAgfCAgfCAgICAgfCAgICAgfAogICAvLyAg
ICAgICAgICAgICsqLSsqLSsqLSstLSstLSstLS4uLgogICAvLyAgICAgICAgICAgICB8ICB8ICB8
CiAgIC8vICAgICAgICArLS0tLSsgIHwgICstLS0tLSsKICAgLy8gICAgICAgIHwgICAgICAgKy0t
LS0tKyAgfAogICAvLyAgICAgICAgViAgICAgICAgICAgICB8ICBWCiAgIC8vICAgICAgICArLS0t
LS0tLS0tLSsgIHwgICstLS0tLS0tLS0tKwogICAvLyAgICAgICAgfCAgICAgICAgICB8ICB8ICB8
ICAgICAgICAgIHwKICAgLy8gIHRoaXMtPnwgICAgICAgICAgfCAgfCAgfCAgICAgICAgICB8PC0t
c2liCiAgIC8vICAgICAgICArLS0tLS0tLS0tLSsgIHwgICstLS0tLS0tLS0tKwogICAvLyAgICAg
ICAgICAgICAgICAgICAgICBWCiAgIC8vICAgICAgICAgICAgICAgICAgICBkYXRhCiAgIC8vCiAg
IC8vIGtleWlkeCBpcyB0aGUgaW5kZXggb2Ygd2hlcmUgdGhlIHNpYmxpbmcgaXMsIGFuZCB3aGVy
ZSB0aGUKICAgLy8gbmV3bHkgY3JlYXRlZCBub2RlIHdpbGwgYmUgcmVjb3JkZWQgKHNpYmxpbmcg
d2lsbCBiZSBtb3ZlZCB0bwogICAvLyBrZXlpZHgrMSkKCiAgIEFzc2VydChrZXlpZHggPiAwICYm
IGtleWlkeCA8PSBmUGFyZW50LT5mTGFzdCk7CgogICByaWdodHNpYi0+U2V0S2V5KDAsIGZQYXJl
bnQtPkdldEtleShrZXlpZHgpKTsKICAgSW50X3Qgbm9mS2V5cyAgICAgID0gUHNpemUoKSArIHJp
Z2h0c2liLT5Wc2l6ZSgpOwogICBJbnRfdCBuZXdTaXplVGhpcyAgPSBub2ZLZXlzIC8gMzsKICAg
SW50X3QgbmV3U2l6ZU5ldyAgID0gKG5vZktleXMgLSBuZXdTaXplVGhpcykgLyAyOwogICBJbnRf
dCBuZXdTaXplU2liICAgPSAobm9mS2V5cyAtIG5ld1NpemVUaGlzIC0gbmV3U2l6ZU5ldyk7CiAg
IEludF90IG5vRnJvbVRoaXMgICA9IFBzaXplKCkgLSBuZXdTaXplVGhpczsKICAgSW50X3Qgbm9G
cm9tU2liICAgID0gcmlnaHRzaWItPlZzaXplKCkgLSBuZXdTaXplU2liOwogICAvLyBiZWNhdXNl
IG9mIHRoZWlyIHNtYWxsZXIgc2l6ZSwgdGhpcyBUQnRJbm5lck5vZGUgbWF5IG5vdCBoYXZlIHRv
CiAgIC8vIGdpdmUgdXAgYW55IGVsZW1lbnRzIHRvIHRoZSBuZXcgbm9kZS4gIEkuZS4sIG5vRnJv
bVRoaXMgPT0gMC4KICAgLy8gVGhpcyB3aWxsIG5vdCBoYXBwZW4gZm9yIFRCdExlYWZOb2Rlcy4K
ICAgLy8gV2UgaGFuZGxlIHRoaXMgYnkgcHVsbGluZyBhbiBpdGVtIGZyb20gdGhlIHJpZ2h0c2li
LgogICBDaGVjayhub0Zyb21UaGlzID49IDApOwogICBDaGVjayhub0Zyb21TaWIgPj0gMSk7CiAg
IFRCdElubmVyTm9kZSAqbmV3Tm9kZSA9IG5ldyBUQnRJbm5lck5vZGUoZlBhcmVudCk7CiAgIENo
ZWNrKG5ld05vZGUgIT0gMCk7CiAgIGlmIChub0Zyb21UaGlzID4gMCkgewogICAgICBuZXdOb2Rl
LT5BcHBlbmQoR2V0SXRlbShmTGFzdCkpOwogICAgICBmUGFyZW50LT5BZGRFbHQoa2V5aWR4LCBH
ZXRLZXkoZkxhc3QtLSksIG5ld05vZGUpOwogICAgICBpZiAobm9Gcm9tVGhpcyA+IDIpCiAgICAg
ICAgIHRoaXMtPlB1c2hSaWdodChub0Zyb21UaGlzLTEsIG5ld05vZGUsIGtleWlkeCk7CiAgICAg
IHJpZ2h0c2liLT5QdXNoTGVmdChub0Zyb21TaWIsIG5ld05vZGUsIGtleWlkeCsxKTsKICAgfSBl
bHNlIHsKICAgICAgLy8gcHVsbCBhbiBlbGVtZW50IGZyb20gdGhlIHJpZ2h0c2liCiAgICAgIG5l
d05vZGUtPkFwcGVuZChyaWdodHNpYi0+R2V0SXRlbSgwKSk7CiAgICAgIGZQYXJlbnQtPkFkZEVs
dChrZXlpZHgrMSwgcmlnaHRzaWItPkdldEtleSgxKSwgcmlnaHRzaWIpOwogICAgICByaWdodHNp
Yi0+U2hpZnRMZWZ0KDEpOwogICAgICBmUGFyZW50LT5TZXRUcmVlKGtleWlkeCwgbmV3Tm9kZSk7
CiAgICAgIHJpZ2h0c2liLT5QdXNoTGVmdChub0Zyb21TaWItMSwgbmV3Tm9kZSwga2V5aWR4KzEp
OwogICB9CiAgIGZQYXJlbnQtPlNldE5vZktleXMoa2V5aWR4LTEsIHRoaXMtPk5vZktleXMoKSk7
CiAgIGZQYXJlbnQtPlNldE5vZktleXMoa2V5aWR4LCBuZXdOb2RlLT5Ob2ZLZXlzKCkpOwogICBm
UGFyZW50LT5TZXROb2ZLZXlzKGtleWlkeCsxLCByaWdodHNpYi0+Tm9mS2V5cygpKTsKICAgaWYg
KGZQYXJlbnQtPklzRnVsbCgpKQogICAgICBmUGFyZW50LT5JbmZvcm1QYXJlbnQoKTsKfQoKCi8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vIFRCdExlYWZOb2RlICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIC8vCi8vIExlYWYgbm9kZSBvZiBhIFRCdHJlZS4gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vCgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpUQnRMZWFmTm9kZTo6VEJ0TGVhZk5v
ZGUoVEJ0SW5uZXJOb2RlICpwLCBjb25zdCBUT2JqZWN0ICpvYmosIFRCdHJlZSAqdCk6IFRCdE5v
ZGUoMSwgcCwgdCkKewogICBmSXRlbSA9IG5ldyBUT2JqZWN0ICpbTWF4SW5kZXgoKSsxXTsKICAg
bWVtc2V0KGZJdGVtLCAwLCAoTWF4SW5kZXgoKSsxKSpzaXplb2YoVE9iamVjdCopKTsKCiAgIEFz
c2VydChmSXRlbSAhPSAwKTsKICAgaWYgKG9iaiAhPSAwKQogICAgICBmSXRlbVsrK2ZMYXN0XSA9
IChUT2JqZWN0KilvYmo7ICAgLy8gY2FzdCBjb25zdCBhd2F5Cn0KCi8vX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fClRCdExlYWZOb2RlOjp+VEJ0TGVhZk5vZGUoKQp7CiAgIGRlbGV0ZSBbXSBmSXRlbTsK
fQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX18Kdm9pZCBUQnRMZWFmTm9kZTo6QWRkKGNvbnN0IFRP
YmplY3QgKm9iaiwgSW50X3QgaW5kZXgpCnsKICAgLy8gQWRkIHRoZSBvYmplY3QgT0JKIHRvIHRo
ZSBsZWFmIG5vZGUsIGluc2VydGluZyBpdCBhdCBsb2NhdGlvbiBJTkRFWAogICAvLyBpbiB0aGUg
Zkl0ZW0gYXJyYXkuCgogICBBc3NlcnQob2JqLT5Jc1NvcnRhYmxlKCkpOwogICBBc3NlcnQoMCA8
PSBpbmRleCAmJiBpbmRleCA8PSBmTGFzdCsxKTsKICAgQXNzZXJ0KGZMYXN0IDw9IE1heEluZGV4
KCkpOwogICBmb3IgKEludF90IGkgPSBmTGFzdCsxOyBpID4gaW5kZXggOyBpLS0pCiAgICAgIGZJ
dGVtW2ldID0gZkl0ZW1baS0xXTsKICAgZkl0ZW1baW5kZXhdID0gKFRPYmplY3QgKilvYmo7CiAg
IGZMYXN0Kys7CgogICAvLyBjaGVjayBmb3Igb3ZlcmZsb3cKICAgaWYgKGZQYXJlbnQgPT0gMCkK
ICAgICAgZlRyZWUtPkluY3JOb2ZLZXlzKCk7CiAgIGVsc2UKICAgICAgZlBhcmVudC0+SW5jck5v
ZktleXModGhpcyk7CgogICBpZiAoSXNGdWxsKCkpIHsKICAgICAgLy8gaXQncyBmdWxsOyB0ZWxs
IHBhcmVudCBub2RlCiAgICAgIGlmIChmUGFyZW50ID09IDApIHsKICAgICAgICAgLy8gdGhpcyBv
Y2N1cnMgd2hlbiB0aGlzIGxlYWYgaXMgdGhlIG9ubHkgbm9kZSBpbiB0aGUKICAgICAgICAgLy8g
YnRyZWUsIGFuZCB0aGlzLT5mVHJlZS0+ZlJvb3QgPT0gdGhpcwogICAgICAgICBDaGVjayhmVHJl
ZS0+ZlJvb3QgPT0gdGhpcyk7CiAgICAgICAgIC8vIGluIHdoaWNoIGNhc2Ugd2UgaW5mb3JtIHRo
ZSBidHJlZSwgd2hpY2ggY2FuIGJlCiAgICAgICAgIC8vIGNvbnNpZGVyZWQgdGhlIHBhcmVudCBv
ZiB0aGlzIG5vZGUKICAgICAgICAgZlRyZWUtPlJvb3RJc0Z1bGwoKTsKICAgICAgfSBlbHNlIHsK
ICAgICAgICAgLy8gdGhlIHBhcmVudCBpcyByZXNwb25zaWJsZSBmb3Igc3BsaXR0aW5nL2JhbGFu
Y2luZyBzdWJub2RlcwogICAgICAgICBmUGFyZW50LT5Jc0Z1bGwodGhpcyk7CiAgICAgIH0KICAg
fQp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdExlYWZOb2RlOjpBcHBlbmRGcm9t
KFRCdExlYWZOb2RlICpzcmMsIEludF90IHN0YXJ0LCBJbnRfdCBzdG9wKQp7CiAgIC8vIEEgY29u
dmVuaWVuY2UgZnVuY3Rpb24sIGRvZXMgbm90IHdvcnJ5IGFib3V0IHRoZSBlbGVtZW50IGluCiAg
IC8vIHRoZSBwYXJlbnQsIHNpbXBseSBtb3ZlcyBlbGVtZW50cyBmcm9tIFNSQ1tzdGFydF0gdG8g
U1JDW3N0b3BdCiAgIC8vIGludG8gdGhlIGN1cnJlbnQgYXJyYXkuCiAgIC8vIFRoaXMgc2hvdWxk
IG5ldmVyIGNyZWF0ZSBhIGZ1bGwgbm9kZS4KICAgLy8gVGhhdCBpcywgaXQgaXMgbm90IHVzZWQg
YW55d2hlcmUgd2hlcmUgVEhJUyBjb3VsZCBwb3NzaWJseSBiZQogICAvLyBuZWFyIGZ1bGwuCiAg
IC8vIERvZXMgTk9UIGhhbmRsZSBub2ZLZXlzLgoKICAgaWYgKHN0YXJ0ID4gc3RvcCkKICAgICAg
cmV0dXJuOwogICBBc3NlcnQoMCA8PSBzdGFydCAmJiBzdGFydCA8PSBzcmMtPmZMYXN0KTsKICAg
QXNzZXJ0KDAgPD0gc3RvcCAgJiYgc3RvcCAgPD0gc3JjLT5mTGFzdCk7CiAgIEFzc2VydChmTGFz
dCArIHN0b3AgLSBzdGFydCArIDEgPCBNYXhJbmRleCgpKTsgLy8gZnVsbC1ub2RlIGNoZWNrCiAg
IGZvciAoSW50X3QgaSA9IHN0YXJ0OyBpIDw9IHN0b3A7IGkrKykKICAgICAgZkl0ZW1bKytmTGFz
dF0gPSBzcmMtPmZJdGVtW2ldOwogICBDaGVjayhmTGFzdCA8IE1heEluZGV4KCkpOwp9CgovL19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdExlYWZOb2RlOjpBcHBlbmQoVE9iamVjdCAqb2Jq
KQp7CiAgIC8vIE5ldmVyIGNhbGxlZCBmcm9tIGFueXdoZXJlIHdoZXJlIGl0IG1pZ2h0IGZpbGwg
dXAgVEhJUwogICAvLyBkb2VzIE5PVCBoYW5kbGUgbm9mS2V5cy4KCiAgIEFzc2VydChvYmotPklz
U29ydGFibGUoKSk7CiAgIGZJdGVtWysrZkxhc3RdID0gb2JqOwogICBDaGVjayhmTGFzdCA8IE1h
eEluZGV4KCkpOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdExlYWZOb2RlOjpC
YWxhbmNlV2l0aExlZnQoVEJ0TGVhZk5vZGUgKmxlZnRzaWIsIEludF90IHBpZHgpCnsKICAgLy8g
VEhJUyBoYXMgbW9yZSB0aGFuIExFRlRTSUI7ICBtb3ZlIHNvbWUgaXRlbXMgZnJvbSBUSElTIHRv
IExFRlRTSUIuCgogICBBc3NlcnQoVnNpemUoKSA+PSBsZWZ0c2liLT5Qc2l6ZSgpKTsKICAgSW50
X3QgbmV3VGhpc1NpemUgPSAoVnNpemUoKSArIGxlZnRzaWItPlBzaXplKCkpLzI7CiAgIEludF90
IG5vRnJvbVRoaXMgID0gUHNpemUoKSAtIG5ld1RoaXNTaXplOwogICBQdXNoTGVmdChub0Zyb21U
aGlzLCBsZWZ0c2liLCBwaWR4KTsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kdm9pZCBUQnRM
ZWFmTm9kZTo6QmFsYW5jZVdpdGhSaWdodChUQnRMZWFmTm9kZSAqcmlnaHRzaWIsIEludF90IHBp
ZHgpCnsKICAgLy8gVEhJUyBoYXMgbW9yZSB0aGFuIFJJR0hUU0lCOyAgbW92ZSBzb21lIGl0ZW1z
IGZyb20gVEhJUyB0byBSSUdIVFNJQi4KCiAgIEFzc2VydChQc2l6ZSgpID49IHJpZ2h0c2liLT5W
c2l6ZSgpKTsKICAgSW50X3QgbmV3VGhpc1NpemUgPSAoUHNpemUoKSArIHJpZ2h0c2liLT5Wc2l6
ZSgpKS8yOwogICBJbnRfdCBub0Zyb21UaGlzICA9IFBzaXplKCkgLSBuZXdUaGlzU2l6ZTsKICAg
UHVzaFJpZ2h0KG5vRnJvbVRoaXMsIHJpZ2h0c2liLCBwaWR4KTsKfQoKLy9fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX18Kdm9pZCBUQnRMZWFmTm9kZTo6QmFsYW5jZVdpdGgoVEJ0TGVhZk5vZGUgKnJpZ2h0
c2liLCBJbnRfdCBwaWR4KQp7CiAgIC8vIFBJVEVNIGlzIHRoZSBwYXJlbnQgaXRlbSB3aG9zZSBr
ZXkgd2lsbCBjaGFuZ2Ugd2hlbiBrZXlzIGFyZSBzaGlmdGVkCiAgIC8vIGZyb20gb25lIExlYWZO
b2RlIHRvIHRoZSBvdGhlci4KCiAgIGlmIChQc2l6ZSgpIDwgcmlnaHRzaWItPlZzaXplKCkpCiAg
ICAgIHJpZ2h0c2liLT5CYWxhbmNlV2l0aExlZnQodGhpcywgcGlkeCk7CiAgIGVsc2UKICAgICAg
QmFsYW5jZVdpdGhSaWdodChyaWdodHNpYiwgcGlkeCk7Cn0KCi8vX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fCkludF90IFRCdExlYWZOb2RlOjpGaW5kUmFuayhjb25zdCBUT2JqZWN0ICp3aGF0KSBjb25z
dAp7CiAgIC8vIFdIQVQgd2FzIG5vdCBpbiBhbnkgaW5uZXIgbm9kZTsgaXQgaXMgZWl0aGVyIGhl
cmUsIG9yIGl0J3MKICAgLy8gbm90IGluIHRoZSB0cmVlLgoKICAgZm9yIChJbnRfdCBpID0gMDsg
aSA8PSBmTGFzdDsgaSsrKSB7CiAgICAgIGlmIChmSXRlbVtpXS0+Q29tcGFyZSgoVE9iamVjdCop
d2hhdCkgPT0gMCkKICAgICAgICAgcmV0dXJuIGk7CiAgICAgIGlmIChmSXRlbVtpXS0+Q29tcGFy
ZSgoVE9iamVjdCopd2hhdCkgPiAwKQogICAgICAgICByZXR1cm4gLTE7CiAgIH0KICAgcmV0dXJu
IC0xOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpUQnRMZWFmTm9kZSAqVEJ0TGVhZk5vZGU6
OkZpcnN0TGVhZk5vZGUoKQp7CiAgIHJldHVybiB0aGlzOwp9CgovL19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fXwpUT2JqZWN0ICpUQnRMZWFmTm9kZTo6Rm91bmQoY29uc3QgVE9iamVjdCAqd2hhdCwgVEJ0
Tm9kZSAqKndoaWNoLCBJbnRfdCAqd2hlcmUpCnsKICAgLy8gV0hBVCB3YXMgbm90IGluIGFueSBp
bm5lciBub2RlOyBpdCBpcyBlaXRoZXIgaGVyZSwgb3IgaXQncwogICAvLyBub3QgaW4gdGhlIHRy
ZWUuCgogICBBc3NlcnQod2hhdC0+SXNTb3J0YWJsZSgpKTsKICAgZm9yIChJbnRfdCBpID0gMDsg
aSA8PSBmTGFzdDsgaSsrKSB7CiAgICAgIGlmIChmSXRlbVtpXS0+Q29tcGFyZSgoVE9iamVjdCop
d2hhdCkgPT0gMCkgewogICAgICAgICAqd2hpY2ggPSB0aGlzOwogICAgICAgICAqd2hlcmUgPSBp
OwogICAgICAgICByZXR1cm4gZkl0ZW1baV07CiAgICAgIH0KICAgICAgaWYgKGZJdGVtW2ldLT5D
b21wYXJlKChUT2JqZWN0Kil3aGF0KSA+IDApIHsKICAgICAgICAgKndoaWNoID0gdGhpczsKICAg
ICAgICAgKndoZXJlID0gaTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgfQogICAqd2hp
Y2ggPSB0aGlzOwogICAqd2hlcmUgPSBmTGFzdCsxOwogICByZXR1cm4gMDsKfQoKLy9fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX18KSW50X3QgVEJ0TGVhZk5vZGU6OkluZGV4T2YoY29uc3QgVE9iamVjdCAq
dGhhdCkgY29uc3QKewogICAvLyBSZXR1cm5zIGEgbnVtYmVyIGluIHRoZSByYW5nZSAwIHRvIE1h
eEluZGV4KCkuCgogICBmb3IgKEludF90IGkgPSAwOyBpIDw9IGZMYXN0OyBpKyspIHsKICAgICAg
aWYgKGZJdGVtW2ldID09IHRoYXQpCiAgICAgICAgIHJldHVybiBpOwogICB9CiAgIENoZWNrKDAp
OwogICByZXR1cm4gLTE7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClRCdExlYWZOb2RlICpU
QnRMZWFmTm9kZTo6TGFzdExlYWZOb2RlKCkKewogICByZXR1cm4gdGhpczsKfQoKLy9fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX18Kdm9pZCBUQnRMZWFmTm9kZTo6TWVyZ2VXaXRoUmlnaHQoVEJ0TGVhZk5v
ZGUgKnJpZ2h0c2liLCBJbnRfdCBwaWR4KQp7CiAgIEFzc2VydChQc2l6ZSgpICsgcmlnaHRzaWIt
PlZzaXplKCkgPCBNYXhQc2l6ZSgpKTsKICAgcmlnaHRzaWItPlB1c2hMZWZ0KHJpZ2h0c2liLT5Q
c2l6ZSgpLCB0aGlzLCBwaWR4KTsKICAgQXBwZW5kKGZQYXJlbnQtPkdldEtleShwaWR4KSk7CiAg
IGZQYXJlbnQtPlNldE5vZktleXMocGlkeC0xLCBOb2ZLZXlzKCkpOwogICBmUGFyZW50LT5SZW1v
dmVJdGVtKHBpZHgpOwogICBkZWxldGUgcmlnaHRzaWI7Cn0KCi8vX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fCkludF90IFRCdExlYWZOb2RlOjpOb2ZLZXlzKEludF90ICkgY29uc3QKewogICByZXR1cm4g
MTsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50X3QgVEJ0TGVhZk5vZGU6Ok5vZktleXMo
KSBjb25zdAp7CiAgIHJldHVybiBQc2l6ZSgpOwp9CgovL19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwov
L3ZvaWQgVEJ0TGVhZk5vZGU6OlByaW50T24ob3N0cmVhbSYgb3V0KSBjb25zdAovL3sKLy8gICAg
b3V0IDw8ICIgPCAiOwovLyAgICBmb3IgKEludF90IGkgPSAwOyBpIDw9IGZMYXN0OyBpKyspCi8v
ICAgICAgICBvdXQgPDwgKmZJdGVtW2ldIDw8ICIgIiA7Ci8vICAgIG91dCA8PCAiPiAiOwovL30K
Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fCnZvaWQgVEJ0TGVhZk5vZGU6OlB1c2hMZWZ0KEludF90
IG5vRnJvbVRoaXMsIFRCdExlYWZOb2RlICpsZWZ0c2liLCBJbnRfdCBwaWR4KQp7CiAgIC8vIG5v
RnJvbVRoaXM9PTEgPT4gbW92ZXMgdGhlIHBhcmVudCBpdGVtIGludG8gdGhlIGxlZnRzaWIsCiAg
IC8vIGFuZCB0aGUgZmlyc3QgaXRlbSBpbiB0aGlzJ3MgYXJyYXkgaW50byB0aGUgcGFyZW50IGl0
ZW0uCgogICBBc3NlcnQobm9Gcm9tVGhpcyA+IDAgJiYgbm9Gcm9tVGhpcyA8PSBQc2l6ZSgpKTsK
ICAgQXNzZXJ0KG5vRnJvbVRoaXMgKyBsZWZ0c2liLT5Qc2l6ZSgpIDwgTWF4UHNpemUoKSk7CiAg
IEFzc2VydChmUGFyZW50LT5HZXRUcmVlKHBpZHgpID09IHRoaXMpOwogICBsZWZ0c2liLT5BcHBl
bmQoZlBhcmVudC0+R2V0S2V5KHBpZHgpKTsKICAgaWYgKG5vRnJvbVRoaXMgPiAxKQogICAgICBs
ZWZ0c2liLT5BcHBlbmRGcm9tKHRoaXMsIDAsIG5vRnJvbVRoaXMtMik7CiAgIGZQYXJlbnQtPlNl
dEtleShwaWR4LCBmSXRlbVtub0Zyb21UaGlzLTFdKTsKICAgU2hpZnRMZWZ0KG5vRnJvbVRoaXMp
OwogICBmUGFyZW50LT5TZXROb2ZLZXlzKHBpZHgtMSwgbGVmdHNpYi0+Tm9mS2V5cygpKTsKICAg
ZlBhcmVudC0+U2V0Tm9mS2V5cyhwaWR4LCBOb2ZLZXlzKCkpOwp9CgovL19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fXwp2b2lkIFRCdExlYWZOb2RlOjpQdXNoUmlnaHQoSW50X3Qgbm9Gcm9tVGhpcywgVEJ0
TGVhZk5vZGUgKnJpZ2h0c2liLCBJbnRfdCBwaWR4KQp7CiAgIC8vIG5vRnJvbVRoaXM9PTEgPT4g
bW92ZXMgdGhlIHBhcmVudCBpdGVtIGludG8gdGhlCiAgIC8vIHJpZ2h0c2liLCBhbmQgdGhlIGxh
c3QgaXRlbSBpbiB0aGlzJ3MgYXJyYXkgaW50byB0aGUgcGFyZW50CiAgIC8vIGl0ZW0uCgogICBB
c3NlcnQobm9Gcm9tVGhpcyA+IDAgJiYgbm9Gcm9tVGhpcyA8PSBQc2l6ZSgpKTsKICAgQXNzZXJ0
KG5vRnJvbVRoaXMgKyByaWdodHNpYi0+UHNpemUoKSA8IE1heFBzaXplKCkpOwogICBBc3NlcnQo
ZlBhcmVudC0+R2V0VHJlZShwaWR4KSA9PSByaWdodHNpYik7CiAgIC8vIFRoZSBvcGVyYXRpb24g
aXMgZml2ZSBzdGVwczoKICAgLy8gIFN0ZXAgSS4gICBNYWtlIHJvb20gZm9yIHRoZSBpbmNvbWlu
ZyBrZXlzIGluIFJJR0hUU0lCLgogICAvLyAgU3RlcCBJSS4gIE1vdmUgdGhlIGtleSBpbiB0aGUg
cGFyZW50IGludG8gUklHSFRTSUIuCiAgIC8vICBTdGVwIElJSS4gTW92ZSB0aGUgaXRlbXMgZnJv
bSBUSElTIGludG8gUklHSFRTSUIuCiAgIC8vICBTdGVwIElWLiAgTW92ZSB0aGUgaXRlbSBmcm9t
IFRISVMgaW50byB0aGUgcGFyZW50LgogICAvLyAgU3RlcCBWLiAgIFVwZGF0ZSB0aGUgbGVuZ3Ro
IG9mIFRISVMuCiAgIC8vCiAgIC8vIFN0ZXAgSS46IG1ha2Ugc3BhY2UgZm9yIG5vRnJvbVRoaXMg
aXRlbXMKICAgLy8KICAgSW50X3Qgc3RhcnQgPSBmTGFzdCAtIG5vRnJvbVRoaXMgKyAxOwogICBJ
bnRfdCB0Z3QsIHNyYzsKICAgdGd0ID0gcmlnaHRzaWItPmZMYXN0ICsgbm9Gcm9tVGhpczsKICAg
c3JjID0gcmlnaHRzaWItPmZMYXN0OwogICByaWdodHNpYi0+Zkxhc3QgPSB0Z3Q7CiAgIHdoaWxl
IChzcmMgPj0gMCkKICAgICAgcmlnaHRzaWItPmZJdGVtW3RndC0tXSA9IHJpZ2h0c2liLT5mSXRl
bVtzcmMtLV07CgogICAvLyBTdGVwIElJLiBNb3ZlIHRoZSBrZXkgZnJvbSB0aGUgcGFyZW50IGlu
dG8gcGxhY2UKICAgcmlnaHRzaWItPmZJdGVtW3RndC0tXSA9IGZQYXJlbnQtPkdldEtleShwaWR4
KTsKCiAgIC8vIFN0ZXAgSUlJLk1vdmUgdGhlIGl0ZW1zIGZyb20gVEhJUyBpbnRvIFJJR0hUU0lC
CiAgIGZvciAoSW50X3QgaSA9IGZMYXN0OyBpID4gc3RhcnQ7IGktLSkKICAgICAgcmlnaHRzaWIt
PmZJdGVtW3RndC0tXSA9IGZJdGVtW2ldOwogICBDaGVjayh0Z3QgPT0gLTEpOwoKICAgLy8gU3Rl
cCBJVi4KICAgZlBhcmVudC0+U2V0S2V5KHBpZHgsIGZJdGVtW3N0YXJ0XSk7CgogICAvLyBTdGVw
IFYuCiAgIGZMYXN0IC09IG5vRnJvbVRoaXM7CgogICAvLyBTdGVwIFZJLiAgdXBkYXRlIG5vZktl
eXMKICAgZlBhcmVudC0+U2V0Tm9mS2V5cyhwaWR4LTEsIE5vZktleXMoKSk7CiAgIGZQYXJlbnQt
PlNldE5vZktleXMocGlkeCwgcmlnaHRzaWItPk5vZktleXMoKSk7Cn0KCi8vX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fCnZvaWQgVEJ0TGVhZk5vZGU6OlJlbW92ZShJbnRfdCBpbmRleCkKewogICBBc3Nl
cnQoaW5kZXggPj0gMCAmJiBpbmRleCA8PSBmTGFzdCk7CiAgIGZvciAoSW50X3QgdG8gPSBpbmRl
eDsgdG8gPCBmTGFzdDsgdG8rKykKICAgICAgZkl0ZW1bdG9dID0gZkl0ZW1bdG8rMV07CiAgIGZM
YXN0LS07CiAgIGlmIChmUGFyZW50ID09IDApCiAgICAgIGZUcmVlLT5EZWNyTm9mS2V5cygpOwog
ICBlbHNlCiAgICAgIGZQYXJlbnQtPkRlY3JOb2ZLZXlzKHRoaXMpOwogICBpZiAoSXNMb3coKSkg
ewogICAgICBpZiAoZlBhcmVudCA9PSAwKSB7CiAgICAgICAgIC8vIHRoZW4gdGhpcyBpcyB0aGUg
cm9vdDsgd2hlbiBubyBrZXlzIGxlZnQsIGluZm9ybSB0aGUgdHJlZQogICAgICAgICBpZiAoUHNp
emUoKSA9PSAwKQogICAgICAgICAgICBmVHJlZS0+Um9vdElzRW1wdHkoKTsKICAgICAgfSBlbHNl
CiAgICAgICAgIGZQYXJlbnQtPklzTG93KHRoaXMpOwogICB9Cn0KCi8vX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fCnZvaWQgVEJ0TGVhZk5vZGU6OlNoaWZ0TGVmdChJbnRfdCBjbnQpCnsKICAgaWYgKGNu
dCA8PSAwKQogICAgICByZXR1cm47CiAgIGZvciAoSW50X3QgaSA9IGNudDsgaSA8PSBmTGFzdDsg
aSsrKQogICAgICBmSXRlbVtpLWNudF0gPSBmSXRlbVtpXTsKICAgZkxhc3QgLT0gY250Owp9Cgov
L19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXwp2b2lkIFRCdExlYWZOb2RlOjpTcGxpdCgpCnsKICAgLy8g
VGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSB3aGVuIFRISVMgaXMgdGhlIG9ubHkgZGVzY2Vu
ZGVudAogICAvLyBvZiB0aGUgcm9vdCBub2RlLCBhbmQgVEhJUyBuZWVkcyB0byBiZSBzcGxpdC4K
ICAgLy8gQXNzdW1lcyB0aGF0IGlkeCBvZiBUSElTIGluIFBhcmVudCBpcyAwLgoKICAgVEJ0TGVh
Zk5vZGUgKm5ld25vZGUgPSBuZXcgVEJ0TGVhZk5vZGUoZlBhcmVudCk7CiAgIEFzc2VydChuZXdu
b2RlICE9IDApOwogICBmUGFyZW50LT5BcHBlbmQoZkl0ZW1bZkxhc3QtLV0sIG5ld25vZGUpOwog
ICBmUGFyZW50LT5TZXROb2ZLZXlzKDAsIGZQYXJlbnQtPkdldFRyZWUoMCktPk5vZktleXMoKSk7
CiAgIGZQYXJlbnQtPlNldE5vZktleXMoMSwgZlBhcmVudC0+R2V0VHJlZSgxKS0+Tm9mS2V5cygp
KTsKICAgQmFsYW5jZVdpdGhSaWdodChuZXdub2RlLCAxKTsKfQoKLy9fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18Kdm9pZCBUQnRMZWFmTm9kZTo6U3BsaXRXaXRoKFRCdExlYWZOb2RlICpyaWdodHNpYiwg
SW50X3Qga2V5aWR4KQp7CiAgIEFzc2VydChmUGFyZW50ID09IHJpZ2h0c2liLT5mUGFyZW50KTsK
ICAgQXNzZXJ0KGtleWlkeCA+IDAgJiYga2V5aWR4IDw9IGZQYXJlbnQtPmZMYXN0KTsKICAgSW50
X3Qgbm9mS2V5cyAgICAgID0gUHNpemUoKSArIHJpZ2h0c2liLT5Wc2l6ZSgpOwogICBJbnRfdCBu
ZXdTaXplVGhpcyAgPSBub2ZLZXlzIC8gMzsKICAgSW50X3QgbmV3U2l6ZU5ldyAgID0gKG5vZktl
eXMgLSBuZXdTaXplVGhpcykgLyAyOwogICBJbnRfdCBuZXdTaXplU2liICAgPSAobm9mS2V5cyAt
IG5ld1NpemVUaGlzIC0gbmV3U2l6ZU5ldyk7CiAgIEludF90IG5vRnJvbVRoaXMgICA9IFBzaXpl
KCkgLSBuZXdTaXplVGhpczsKICAgSW50X3Qgbm9Gcm9tU2liICAgID0gcmlnaHRzaWItPlZzaXpl
KCkgLSBuZXdTaXplU2liOwogICBDaGVjayhub0Zyb21UaGlzID49IDApOwogICBDaGVjayhub0Zy
b21TaWIgPj0gMSk7CiAgIFRCdExlYWZOb2RlICpuZXdOb2RlICA9IG5ldyBUQnRMZWFmTm9kZShm
UGFyZW50KTsKICAgQXNzZXJ0KG5ld05vZGUgIT0gMCk7CiAgIGZQYXJlbnQtPkFkZEVsdChrZXlp
ZHgsIGZJdGVtW2ZMYXN0LS1dLCBuZXdOb2RlKTsKICAgZlBhcmVudC0+U2V0Tm9mS2V5cyhrZXlp
ZHgsIDApOwogICBmUGFyZW50LT5EZWNOb2ZLZXlzKGtleWlkeC0xKTsKICAgdGhpcy0+UHVzaFJp
Z2h0KG5vRnJvbVRoaXMtMSwgbmV3Tm9kZSwga2V5aWR4KTsKICAgcmlnaHRzaWItPlB1c2hMZWZ0
KG5vRnJvbVNpYiwgbmV3Tm9kZSwga2V5aWR4KzEpOwogICBpZiAoZlBhcmVudC0+SXNGdWxsKCkp
CiAgICAgIGZQYXJlbnQtPkluZm9ybVBhcmVudCgpOwp9Cg==