public inbox for gcc-prs@sourceware.org help / color / mirror / Atom feed
From: athurston@bigfoot.com To: gcc-gnats@gcc.gnu.org Subject: c++/3450: internal compiler error on my incorrect syntax Date: Wed, 27 Jun 2001 21:26:00 -0000 [thread overview] Message-ID: <20010628041948.19593.qmail@sourceware.cygnus.com> (raw) >Number: 3450 >Category: c++ >Synopsis: internal compiler error on my incorrect syntax >Confidential: no >Severity: non-critical >Priority: low >Responsible: unassigned >State: open >Class: ice-on-illegal-code >Submitter-Id: net >Arrival-Date: Wed Jun 27 21:26:01 PDT 2001 >Closed-Date: >Last-Modified: >Originator: Adrian Thurston >Release: gcc version 2.95.2 19991024 (release) >Organization: >Environment: Reading specs from /usr/lib/gcc-lib/i586-pc-linux-gnu/2.95.2/specs >Description: ICE on my bad syntax Command line that triggers bug: c++ --save-temps -g -Wall -I.. -I../include -o testFsmGraph.tst testFsmGraph.cpp ../aapl.a Compiler output: In file included from testFsmGraph.cpp:8: ../include/FsmBaseVkImp.h:130: Internal compiler error. ../include/FsmBaseVkImp.h:130: Please submit a full bug report. ../include/FsmBaseVkImp.h:130: See <URL: http://www.gnu.org/software/gcc/faq.html#bugreport > for instructions. >How-To-Repeat: compile preprocessor output >Fix: A few lines above the ice line number add the missing open brace that I forgot and no ice occurs. >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="testFsmGraph.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="testFsmGraph.ii" IyAxICJ0ZXN0RnNtR3JhcGguY3BwIgogCgoKCiMgMSAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDEg MwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMu aCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoK CiAKCgoKCgogCgoKCiAKCgoKCgoKCiAKIyAxNDIgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAz CgoKIAoKCgoKCgoKCgogCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDIw OCAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDMKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCiAKCgoKIAoKCiAKCgoKCgoKCgogCgoKCgogCgoKCgoKCgoKCgoKCgoKCgogCgoKIyAx ICIvdXNyL2luY2x1ZGUvc3lzL2NkZWZzLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoK CgoKIAoKCgoKCgogCgoKCgoKIAoKCgoKCgoKCiAKCgoKIyA2NSAiL3Vzci9pbmNsdWRlL3N5cy9j ZGVmcy5oIiAzCgoKIAoKCgoKCiAKCgoKCiAKCgoKCgoKCgoKIAoKCgoKCgoKIAoKCgoKCgoKCgoK CgoKCgogCgoKCgoKCgogCgoKCgoKCiAKCgoKCgoKCgogCgoKCgoKCgoKIAoKCgoKCgoKCiAKCgoK CgoKCiAKCgoKCiAKCgoKCgoKIyAyODMgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAyIDMKCgoK IAoKCgoKCgoKCiAKCgoKCiAKCiAKCgoKCgoKCgojIDEgIi91c3IvaW5jbHVkZS9nbnUvc3R1YnMu aCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAzMTEgIi91c3IvaW5j bHVkZS9mZWF0dXJlcy5oIiAyIDMKCgoKCiMgMjcgIi91c3IvaW5jbHVkZS9zdGRpby5oIiAyIDMK CgpleHRlcm4gIkMiIHsgCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdu dS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCgoKCgoKCiAKCgojIDE5ICIvdXNyL2xpYi9n Y2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAK CgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45 NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoK CgoKIAoKIAoKIyAxMzEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4y L2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgp0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3Q7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgog CgoKCgogCgojIDI3MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIv aW5jbHVkZS9zdGRkZWYuaCIgMwoKCiMgMjgzICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMtbGlu dXgtZ251LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKIyAzMTcgIi91c3IvbGli L2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoK CiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAzMyAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDIgMwoK CgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVk ZS9zdGRhcmcuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKdHlwZWRlZiB2b2lkICpfX2dudWNfdmFf bGlzdDsKCgoKIAoKIyAxMjIgIi91c3IvbGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45 NS4yL2luY2x1ZGUvc3RkYXJnLmgiIDMKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDIwOSAiL3Vzci9s aWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRhcmcuaCIgMwoK CgoKIyAzOCAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDIgMwoKCiMgMSAiL3Vzci9pbmNsdWRlL2Jp dHMvdHlwZXMuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCiMgMSAiL3Vzci9s aWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMSAz CgoKCgoKCiAKCgojIDE5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIuOTUu Mi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2dj Yy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoK CgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKIyAxMzEgIi91c3IvbGliL2djYy1s aWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgogCgoK IyAxODggIi91c3IvbGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUv c3RkZGVmLmgiIDMKCgoKCgogCgoKCgogCgojIDI3MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBj LWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiMgMjgzICIvdXNyL2xpYi9n Y2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoK IAoKIyAzMTcgIi91c3IvbGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1 ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAyOSAiL3Vzci9pbmNs dWRlL2JpdHMvdHlwZXMuaCIgMiAzCgoKIAp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191X2NoYXI7 CnR5cGVkZWYgdW5zaWduZWQgc2hvcnQgX191X3Nob3J0Owp0eXBlZGVmIHVuc2lnbmVkIGludCBf X3VfaW50Owp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX191X2xvbmc7CgpfX2V4dGVuc2lvbl9fIHR5 cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBfX3VfcXVhZF90OwpfX2V4dGVuc2lvbl9fIHR5 cGVkZWYgbG9uZyBsb25nIGludCBfX3F1YWRfdDsKIyA0OCAiL3Vzci9pbmNsdWRlL2JpdHMvdHlw ZXMuaCIgMwoKdHlwZWRlZiBzaWduZWQgY2hhciBfX2ludDhfdDsKdHlwZWRlZiB1bnNpZ25lZCBj aGFyIF9fdWludDhfdDsKdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IF9faW50MTZfdDsKdHlwZWRl ZiB1bnNpZ25lZCBzaG9ydCBpbnQgX191aW50MTZfdDsKdHlwZWRlZiBzaWduZWQgaW50IF9faW50 MzJfdDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX191aW50MzJfdDsKCl9fZXh0ZW5zaW9uX18gdHlw ZWRlZiBzaWduZWQgbG9uZyBsb25nIGludCBfX2ludDY0X3Q7Cl9fZXh0ZW5zaW9uX18gdHlwZWRl ZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fdWludDY0X3Q7Cgp0eXBlZGVmIF9fcXVhZF90ICpf X3FhZGRyX3Q7Cgp0eXBlZGVmIF9fdV9xdWFkX3QgX19kZXZfdDsJCSAKdHlwZWRlZiBfX3VfaW50 IF9fdWlkX3Q7CQkgCnR5cGVkZWYgX191X2ludCBfX2dpZF90OwkJIAp0eXBlZGVmIF9fdV9sb25n IF9faW5vX3Q7CQkgCnR5cGVkZWYgX191X2ludCBfX21vZGVfdDsJCSAKdHlwZWRlZiBfX3VfaW50 IF9fbmxpbmtfdDsgCQkgCnR5cGVkZWYgbG9uZyBpbnQgX19vZmZfdDsJCSAKdHlwZWRlZiBfX3F1 YWRfdCBfX2xvZmZfdDsJCSAKdHlwZWRlZiBpbnQgX19waWRfdDsJCQkgCnR5cGVkZWYgaW50IF9f c3NpemVfdDsJCQkgCnR5cGVkZWYgX191X2xvbmcgX19ybGltX3Q7CQkgCnR5cGVkZWYgX191X3F1 YWRfdCBfX3JsaW02NF90OwkJIAp0eXBlZGVmIF9fdV9pbnQgX19pZF90OwkJCSAKCnR5cGVkZWYg c3RydWN0CiAgewogICAgaW50IF9fdmFsWzJdOwogIH0gX19mc2lkX3Q7CQkJCSAKCiAKdHlwZWRl ZiBpbnQgX19kYWRkcl90OwkJCSAKdHlwZWRlZiBjaGFyICpfX2NhZGRyX3Q7CnR5cGVkZWYgbG9u ZyBpbnQgX190aW1lX3Q7CnR5cGVkZWYgdW5zaWduZWQgaW50IF9fdXNlY29uZHNfdDsKdHlwZWRl ZiBsb25nIGludCBfX3N1c2Vjb25kc190Owp0eXBlZGVmIGxvbmcgaW50IF9fc3dibGtfdDsJCSAK DAp0eXBlZGVmIGxvbmcgaW50IF9fY2xvY2tfdDsKCiAKdHlwZWRlZiBpbnQgX19jbG9ja2lkX3Q7 CgogCnR5cGVkZWYgaW50IF9fdGltZXJfdDsKCgogCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQg X19mZF9tYXNrOwoKIAoKCiAKCgoKCiAKdHlwZWRlZiBzdHJ1Y3QKICB7CiAgICAgCgoKCgoKICAg IF9fZmRfbWFzayBfX2Zkc19iaXRzWzEwMjQgIC8gKDggKiBzaXplb2YgKF9fZmRfbWFzaykpIF07 CgoKICB9IF9fZmRfc2V0OwoKCnR5cGVkZWYgaW50IF9fa2V5X3Q7CgogCnR5cGVkZWYgdW5zaWdu ZWQgc2hvcnQgaW50IF9faXBjX3BpZF90OwoKCiAKdHlwZWRlZiBsb25nIGludCBfX2Jsa3NpemVf dDsKCiAKCiAKdHlwZWRlZiBsb25nIGludCBfX2Jsa2NudF90Owp0eXBlZGVmIF9fcXVhZF90IF9f YmxrY250NjRfdDsKCiAKdHlwZWRlZiBfX3VfbG9uZyBfX2ZzYmxrY250X3Q7CnR5cGVkZWYgX191 X3F1YWRfdCBfX2ZzYmxrY250NjRfdDsKCiAKdHlwZWRlZiBfX3VfbG9uZyBfX2ZzZmlsY250X3Q7 CnR5cGVkZWYgX191X3F1YWRfdCBfX2ZzZmlsY250NjRfdDsKCiAKdHlwZWRlZiBfX3VfcXVhZF90 IF9faW5vNjRfdDsKCiAKdHlwZWRlZiBfX2xvZmZfdCBfX29mZjY0X3Q7CgogCnR5cGVkZWYgbG9u ZyBpbnQgX190X3NjYWxhcl90Owp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IF9fdF91c2NhbGFy X3Q7CgogCnR5cGVkZWYgaW50IF9faW50cHRyX3Q7CgogCnR5cGVkZWYgdW5zaWduZWQgaW50IF9f c29ja2xlbl90OwoKCiAKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMvcHRocmVhZHR5cGVzLmgiIDEg MwogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCgoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2Jp dHMvc2NoZWQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCiMgNjIgIi91c3IvaW5jbHVkZS9i aXRzL3NjaGVkLmgiIDMKCgoKCgogCnN0cnVjdCBfX3NjaGVkX3BhcmFtCiAgewogICAgaW50IHNj aGVkX3ByaW9yaXR5OwogIH07CgoKIyAyMyAiL3Vzci9pbmNsdWRlL2JpdHMvcHRocmVhZHR5cGVz LmgiIDIgMwoKCiAKc3RydWN0IF9wdGhyZWFkX2Zhc3Rsb2NrCnsKICBsb25nIGludCBfX3N0YXR1 czsgICAgCiAgaW50IF9fc3BpbmxvY2s7ICAgICAgIAoKfTsKCgogCnR5cGVkZWYgc3RydWN0IF9w dGhyZWFkX2Rlc2NyX3N0cnVjdCAqX3B0aHJlYWRfZGVzY3I7CgoKCgogCnR5cGVkZWYgc3RydWN0 CnsKICBpbnQgX19kZXRhY2hzdGF0ZTsKICBpbnQgX19zY2hlZHBvbGljeTsKICBzdHJ1Y3QgX19z Y2hlZF9wYXJhbSBfX3NjaGVkcGFyYW07CiAgaW50IF9faW5oZXJpdHNjaGVkOwogIGludCBfX3Nj b3BlOwogIHNpemVfdCBfX2d1YXJkc2l6ZTsKICBpbnQgX19zdGFja2FkZHJfc2V0OwogIHZvaWQg Kl9fc3RhY2thZGRyOwogIHNpemVfdCBfX3N0YWNrc2l6ZTsKfSBwdGhyZWFkX2F0dHJfdDsKCgog CnR5cGVkZWYgc3RydWN0CnsKICBzdHJ1Y3QgX3B0aHJlYWRfZmFzdGxvY2sgX19jX2xvY2s7ICAK ICBfcHRocmVhZF9kZXNjciBfX2Nfd2FpdGluZzsgICAgICAgICAKfSBwdGhyZWFkX2NvbmRfdDsK CgogCnR5cGVkZWYgc3RydWN0CnsKICBpbnQgX19kdW1teTsKfSBwdGhyZWFkX2NvbmRhdHRyX3Q7 CgogCnR5cGVkZWYgdW5zaWduZWQgaW50IHB0aHJlYWRfa2V5X3Q7CgoKIAogCgp0eXBlZGVmIHN0 cnVjdAp7CiAgaW50IF9fbV9yZXNlcnZlZDsgICAgICAgICAgICAgICAgCiAgaW50IF9fbV9jb3Vu dDsgICAgICAgICAgICAgICAgICAgCiAgX3B0aHJlYWRfZGVzY3IgX19tX293bmVyOyAgICAgICAg CiAgaW50IF9fbV9raW5kOyAgICAgICAgICAgICAgICAgICAgCiAgc3RydWN0IF9wdGhyZWFkX2Zh c3Rsb2NrIF9fbV9sb2NrOyAgCn0gcHRocmVhZF9tdXRleF90OwoKCiAKdHlwZWRlZiBzdHJ1Y3QK ewogIGludCBfX211dGV4a2luZDsKfSBwdGhyZWFkX211dGV4YXR0cl90OwoKCiAKdHlwZWRlZiBp bnQgcHRocmVhZF9vbmNlX3Q7CgoKIyAxMTcgIi91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBl cy5oIiAzCgoKIyAxMzYgIi91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oIiAzCgoKCiAK dHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBwdGhyZWFkX3Q7CgoKIyAxNjUgIi91c3IvaW5jbHVk ZS9iaXRzL3R5cGVzLmgiIDIgMwoKCgoKIyA0MCAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDIgMwoK CgoKCgoKCiAKdHlwZWRlZiBzdHJ1Y3QgX0lPX0ZJTEUgRklMRTsKCgoKCgoKCgogCnR5cGVkZWYg c3RydWN0IF9JT19GSUxFIF9fRklMRTsKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvbGliaW8u aCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL19H X2NvbmZpZy5oIiAxIDMKIAoKCgoKCiAKCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYt cGMtbGludXgtZ251LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkg Ii91c3IvbGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkZGVm LmgiIDMKCgoKIAoKCiAKCgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxp bnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoK CgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4 LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCgojIDE4OCAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoK CiAKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgdW5zaWduZWQgaW50ICB3 aW50X3Q7CgoKCgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdu dS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoj IDE0ICIvdXNyL2luY2x1ZGUvX0dfY29uZmlnLmgiIDIgMwoKCgoKCgoKCgoKIyAxICIvdXNyL2lu Y2x1ZGUvd2NoYXIuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKIyA0MyAi L3Vzci9pbmNsdWRlL3djaGFyLmgiIDMKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1wYy1s aW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vz ci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIg MwoKCgogCgoKIAoKCgoKCiAKCgojIDYxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMtbGludXgt Z251LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAKCgoKCgoKCgoKCgoKCgoK CgoKIAoKCgoKCiAKCiAKCiMgMTMxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMtbGludXgtZ251 LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKIyAxOTAgIi91c3IvbGliL2djYy1s aWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCgoK IAoKIyAyNzEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1 ZGUvc3RkZGVmLmgiIDMKCgoKCgoKCgoKCgoKCgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxp Yi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCgojIDQ1ICIvdXNyL2luY2x1ZGUvd2NoYXIuaCIgMiAzCgoKIyAxICIv dXNyL2luY2x1ZGUvYml0cy93Y2hhci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK IyA0NyAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDIgMwoKCiAKCgoKCgoKCgoKCgoKCiAKdHlwZWRl ZiBzdHJ1Y3QKewogIGludCBfX2NvdW50OwogIHVuaW9uCiAgewogICAgd2ludF90IF9fd2NoOwog ICAgY2hhciBfX3djaGJbNF07CiAgfSBfX3ZhbHVlOwkJIAp9IF9fbWJzdGF0ZV90OwoKCgoKIAoK IyA2ODEgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAzCgoKCiMgMjQgIi91c3IvaW5jbHVkZS9fR19j b25maWcuaCIgMiAzCgoKdHlwZWRlZiBzdHJ1Y3QKewogIF9fb2ZmX3QgX19wb3M7CiAgX19tYnN0 YXRlX3QgX19zdGF0ZTsKfSBfR19mcG9zX3Q7CnR5cGVkZWYgc3RydWN0CnsKICBfX29mZjY0X3Qg X19wb3M7CiAgX19tYnN0YXRlX3QgX19zdGF0ZTsKfSBfR19mcG9zNjRfdDsKCgoKCgoKCgojIDEg Ii91c3IvaW5jbHVkZS9nY29udi5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoj IDEgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoK CgoKCgojIDQzICIvdXNyL2luY2x1ZGUvd2NoYXIuaCIgMwoKCiMgMSAiL3Vzci9saWIvZ2NjLWxp Yi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCgoKCgoKCiAK CgojIDE5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIuOTUuMi9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTU4 Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoKIAoKCgoK CgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKIyAxMzEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1w Yy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgogCgojIDE5MCAiL3Vz ci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIg MwoKCgogCgoKCgogCgojIDI3MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8y Ljk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKCgoKCgoKCgoKCiAKCiAKCiMgMzE3ICIvdXNy L2xpYi9nY2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAz CgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgNDUgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAy IDMKCgoKCiAKCgoKCgoKCgoKCgojIDczICIvdXNyL2luY2x1ZGUvd2NoYXIuaCIgMwoKCgoKIAoK IyA2ODEgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAzCgoKCiMgMjggIi91c3IvaW5jbHVkZS9nY29u di5oIiAyIDMKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4y L2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgogCgoKIAoKCgoK CiAKCgojIDYxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIuOTUuMi9pbmNs dWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCiAKCiAK CiMgMTMxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIuOTUuMi9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMtbGlu dXgtZ251LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKIAoKCgoKIAoKIyAyNzEgIi91 c3IvbGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgi IDMKCgojIDI4MyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5j bHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMt bGludXgtZ251LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoKCgoK CgoKCgoKCiMgMzAgIi91c3IvaW5jbHVkZS9nY29udi5oIiAyIDMKCgogCgoKIAplbnVtCnsKICBf X0dDT05WX09LID0gMCwKICBfX0dDT05WX05PQ09OViwKICBfX0dDT05WX05PREIsCiAgX19HQ09O Vl9OT01FTSwKCiAgX19HQ09OVl9FTVBUWV9JTlBVVCwKICBfX0dDT05WX0ZVTExfT1VUUFVULAog IF9fR0NPTlZfSUxMRUdBTF9JTlBVVCwKICBfX0dDT05WX0lOQ09NUExFVEVfSU5QVVQsCgogIF9f R0NPTlZfSUxMRUdBTF9ERVNDUklQVE9SLAogIF9fR0NPTlZfSU5URVJOQUxfRVJST1IKfTsKCgog CmVudW0KewogIF9fR0NPTlZfSVNfTEFTVCA9IDB4MDAwMSwKICBfX0dDT05WX0lHTk9SRV9FUlJP UlMgPSAweDAwMDIKfTsKCgogCnN0cnVjdCBfX2djb252X3N0ZXA7CnN0cnVjdCBfX2djb252X3N0 ZXBfZGF0YTsKc3RydWN0IF9fZ2NvbnZfbG9hZGVkX29iamVjdDsKc3RydWN0IF9fZ2NvbnZfdHJh bnNfZGF0YTsKCgogCnR5cGVkZWYgaW50ICgqX19nY29udl9mY3QpIChzdHJ1Y3QgX19nY29udl9z dGVwICosIHN0cnVjdCBfX2djb252X3N0ZXBfZGF0YSAqLAoJCQkgICAgX19jb25zdCB1bnNpZ25l ZCBjaGFyICoqLCBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwKCQkJICAgIHVuc2lnbmVkIGNoYXIg KiosIHNpemVfdCAqLCBpbnQsIGludCk7CgogCnR5cGVkZWYgaW50ICgqX19nY29udl9pbml0X2Zj dCkgKHN0cnVjdCBfX2djb252X3N0ZXAgKik7CnR5cGVkZWYgdm9pZCAoKl9fZ2NvbnZfZW5kX2Zj dCkgKHN0cnVjdCBfX2djb252X3N0ZXAgKik7CgoKIAp0eXBlZGVmIGludCAoKl9fZ2NvbnZfdHJh bnNfZmN0KSAoc3RydWN0IF9fZ2NvbnZfc3RlcCAqLAoJCQkJICBzdHJ1Y3QgX19nY29udl9zdGVw X2RhdGEgKiwgdm9pZCAqLAoJCQkJICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwKCQkJCSAgX19j b25zdCB1bnNpZ25lZCBjaGFyICoqLAoJCQkJICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5z aWduZWQgY2hhciAqKiwKCQkJCSAgc2l6ZV90ICopOwoKIAp0eXBlZGVmIGludCAoKl9fZ2NvbnZf dHJhbnNfY29udGV4dF9mY3QpICh2b2lkICosIF9fY29uc3QgdW5zaWduZWQgY2hhciAqLAoJCQkJ CSAgX19jb25zdCB1bnNpZ25lZCBjaGFyICosCgkJCQkJICB1bnNpZ25lZCBjaGFyICosIHVuc2ln bmVkIGNoYXIgKik7CgogCnR5cGVkZWYgaW50ICgqX19nY29udl90cmFuc19xdWVyeV9mY3QpIChf X2NvbnN0IGNoYXIgKiwgX19jb25zdCBjaGFyICoqKiwKCQkJCQlzaXplX3QgKik7CgogCnR5cGVk ZWYgaW50ICgqX19nY29udl90cmFuc19pbml0X2ZjdCkgKHZvaWQgKiosIGNvbnN0IGNoYXIgKik7 CnR5cGVkZWYgdm9pZCAoKl9fZ2NvbnZfdHJhbnNfZW5kX2ZjdCkgKHZvaWQgKik7CgpzdHJ1Y3Qg X19nY29udl90cmFuc19kYXRhCnsKICAgCiAgX19nY29udl90cmFuc19mY3QgX190cmFuc19mY3Q7 CiAgX19nY29udl90cmFuc19jb250ZXh0X2ZjdCBfX3RyYW5zX2NvbnRleHRfZmN0OwogIF9fZ2Nv bnZfdHJhbnNfZW5kX2ZjdCBfX3RyYW5zX2VuZF9mY3Q7CiAgdm9pZCAqX19kYXRhOwogIHN0cnVj dCBfX2djb252X3RyYW5zX2RhdGEgKl9fbmV4dDsKfTsKCgogCnN0cnVjdCBfX2djb252X3N0ZXAK ewogIHN0cnVjdCBfX2djb252X2xvYWRlZF9vYmplY3QgKl9fc2hsaWJfaGFuZGxlOwogIF9fY29u c3QgY2hhciAqX19tb2RuYW1lOwoKICBpbnQgX19jb3VudGVyOwoKICBfX2NvbnN0IGNoYXIgKl9f ZnJvbV9uYW1lOwogIF9fY29uc3QgY2hhciAqX190b19uYW1lOwoKICBfX2djb252X2ZjdCBfX2Zj dDsKICBfX2djb252X2luaXRfZmN0IF9faW5pdF9mY3Q7CiAgX19nY29udl9lbmRfZmN0IF9fZW5k X2ZjdDsKCiAgIAoKICBpbnQgX19taW5fbmVlZGVkX2Zyb207CiAgaW50IF9fbWF4X25lZWRlZF9m cm9tOwogIGludCBfX21pbl9uZWVkZWRfdG87CiAgaW50IF9fbWF4X25lZWRlZF90bzsKCiAgIAog IGludCBfX3N0YXRlZnVsOwoKICB2b2lkICpfX2RhdGE7CQkgCn07CgogCgpzdHJ1Y3QgX19nY29u dl9zdGVwX2RhdGEKewogIHVuc2lnbmVkIGNoYXIgKl9fb3V0YnVmOyAgICAgCiAgdW5zaWduZWQg Y2hhciAqX19vdXRidWZlbmQ7ICAKCgogICAKICBpbnQgX19mbGFnczsKCiAgIAoKICBpbnQgX19p bnZvY2F0aW9uX2NvdW50ZXI7CgogICAKCiAgaW50IF9faW50ZXJuYWxfdXNlOwoKICBfX21ic3Rh dGVfdCAqX19zdGF0ZXA7CiAgX19tYnN0YXRlX3QgX19zdGF0ZTsJIAoKCiAgIAogIHN0cnVjdCBf X2djb252X3RyYW5zX2RhdGEgKl9fdHJhbnM7Cn07CgoKIAp0eXBlZGVmIHN0cnVjdCBfX2djb252 X2luZm8KewogIHNpemVfdCBfX25zdGVwczsKICBzdHJ1Y3QgX19nY29udl9zdGVwICpfX3N0ZXBz OwogIF9fZXh0ZW5zaW9uX18gc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhIF9fZGF0YVswXTsKfSAq X19nY29udl90OwoKCiMgNDQgIi91c3IvaW5jbHVkZS9fR19jb25maWcuaCIgMiAzCgp0eXBlZGVm IHVuaW9uCnsKICBzdHJ1Y3QgX19nY29udl9pbmZvIF9fY2Q7CiAgc3RydWN0CiAgewogICAgc3Ry dWN0IF9fZ2NvbnZfaW5mbyBfX2NkOwogICAgc3RydWN0IF9fZ2NvbnZfc3RlcF9kYXRhIF9fZGF0 YTsKICB9IF9fY29tYmluZWQ7Cn0gX0dfaWNvbnZfdDsKCnR5cGVkZWYgaW50IF9HX2ludDE2X3Qg X19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX0hJX18pKSk7CnR5cGVkZWYgaW50IF9HX2ludDMy X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX1NJX18pKSk7CnR5cGVkZWYgdW5zaWduZWQg aW50IF9HX3VpbnQxNl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19ISV9fKSkpOwp0eXBl ZGVmIHVuc2lnbmVkIGludCBfR191aW50MzJfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKF9f U0lfXykpKTsKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKIAoKCgoKCgoKCgoKCgoKCiMg MzAgIi91c3IvaW5jbHVkZS9saWJpby5oIiAyIDMKCiAKCgoKCgoKCgoKCgoKCgoKCgogCgojIDEg Ii91c3IvbGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkYXJn LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgogCgojIDEyMiAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRhcmcuaCIgMwoKCgoKCgoKCgoKCgoK CgoKCgoKCiMgMjA5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIuOTUuMi9p bmNsdWRlL3N0ZGFyZy5oIiAzCgoKCgojIDUxICIvdXNyL2luY2x1ZGUvbGliaW8uaCIgMiAzCgoK CgoKCgojIDcwICIvdXNyL2luY2x1ZGUvbGliaW8uaCIgMwoKCiAKCgoKCgoKCgoKCgoKCgoKCgoj IDEwMSAiL3Vzci9pbmNsdWRlL2xpYmlvLmgiIDMKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgpzdHJ1Y3QgX0lPX2p1bXBfdDsgIHN0cnVj dCBfSU9fRklMRTsKCiAKCgoKCgoKCnR5cGVkZWYgdm9pZCBfSU9fbG9ja190OwoKCgogCgpzdHJ1 Y3QgX0lPX21hcmtlciB7CiAgc3RydWN0IF9JT19tYXJrZXIgKl9uZXh0OwogIHN0cnVjdCBfSU9f RklMRSAqX3NidWY7CiAgIAoKICAgCiAgaW50IF9wb3M7CiMgMTkwICIvdXNyL2luY2x1ZGUvbGli aW8uaCIgMwoKfTsKCiAKZW51bSBfX2NvZGVjdnRfcmVzdWx0CnsKICBfX2NvZGVjdnRfb2ssCiAg X19jb2RlY3Z0X3BhcnRpYWwsCiAgX19jb2RlY3Z0X2Vycm9yLAogIF9fY29kZWN2dF9ub2NvbnYK fTsKCiMgMjYxICIvdXNyL2luY2x1ZGUvbGliaW8uaCIgMwoKCnN0cnVjdCBfSU9fRklMRSB7CiAg aW50IF9mbGFnczsJCSAKCgogICAKICAgCiAgY2hhciogX0lPX3JlYWRfcHRyOwkgCiAgY2hhciog X0lPX3JlYWRfZW5kOwkgCiAgY2hhciogX0lPX3JlYWRfYmFzZTsJIAogIGNoYXIqIF9JT193cml0 ZV9iYXNlOwkgCiAgY2hhciogX0lPX3dyaXRlX3B0cjsJIAogIGNoYXIqIF9JT193cml0ZV9lbmQ7 CSAKICBjaGFyKiBfSU9fYnVmX2Jhc2U7CSAKICBjaGFyKiBfSU9fYnVmX2VuZDsJIAogICAKICBj aGFyICpfSU9fc2F2ZV9iYXNlOyAgCiAgY2hhciAqX0lPX2JhY2t1cF9iYXNlOyAgIAogIGNoYXIg Kl9JT19zYXZlX2VuZDsgIAoKICBzdHJ1Y3QgX0lPX21hcmtlciAqX21hcmtlcnM7CgogIHN0cnVj dCBfSU9fRklMRSAqX2NoYWluOwoKICBpbnQgX2ZpbGVubzsKICBpbnQgX2Jsa3NpemU7CiAgX19v ZmZfdCAgIF9vbGRfb2Zmc2V0OyAgCgoKICAgCiAgdW5zaWduZWQgc2hvcnQgX2N1cl9jb2x1bW47 CiAgc2lnbmVkIGNoYXIgX3Z0YWJsZV9vZmZzZXQ7CiAgY2hhciBfc2hvcnRidWZbMV07CgogICAK CiAgX0lPX2xvY2tfdCAqX2xvY2s7CgoKCgoKCgoKICBfX29mZjY0X3QgICBfb2Zmc2V0OwoKCgoK CiAgdm9pZCAqX19wYWQxOwogIHZvaWQgKl9fcGFkMjsKCiAgaW50IF9tb2RlOwogICAKICBjaGFy IF91bnVzZWQyWzE1ICogc2l6ZW9mIChpbnQpIC0gMiAqIHNpemVvZiAodm9pZCAqKV07Cgp9OwoK CgoKCnN0cnVjdCBfSU9fRklMRV9wbHVzOwoKZXh0ZXJuIHN0cnVjdCBfSU9fRklMRV9wbHVzIF9J T18yXzFfc3RkaW5fOwpleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lPXzJfMV9zdGRvdXRf OwpleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lPXzJfMV9zdGRlcnJfOwoKCgoKCgoKCgoK CiAKCiAKCnR5cGVkZWYgX19zc2l6ZV90IF9faW9fcmVhZF9mbiAodm9pZCAqX19jb29raWUsIGNo YXIgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMpOwoKIAoKCgoKCnR5cGVkZWYgX19zc2l6ZV90IF9f aW9fd3JpdGVfZm4gKHZvaWQgKl9fY29va2llLCBfX2NvbnN0IGNoYXIgKl9fYnVmLAoJCQkJIHNp emVfdCBfX24pOwoKIAoKCgoKCnR5cGVkZWYgaW50IF9faW9fc2Vla19mbiAodm9pZCAqX19jb29r aWUsIF9fb2ZmNjRfdCAgICpfX3BvcywgaW50IF9fdyk7CgogCnR5cGVkZWYgaW50IF9faW9fY2xv c2VfZm4gKHZvaWQgKl9fY29va2llKTsKCgojIDM5MSAiL3Vzci9pbmNsdWRlL2xpYmlvLmgiIDMK CgoKCmV4dGVybiAiQyIgewoKCmV4dGVybiBpbnQgX191bmRlcmZsb3cgKF9JT19GSUxFICopIHRo cm93ICgpIDsKZXh0ZXJuIGludCBfX3VmbG93IChfSU9fRklMRSAqKSB0aHJvdyAoKSA7CmV4dGVy biBpbnQgX19vdmVyZmxvdyAoX0lPX0ZJTEUgKiwgaW50KSB0aHJvdyAoKSA7CmV4dGVybiB3aW50 X3QgICBfX3d1bmRlcmZsb3cgKF9JT19GSUxFICopIHRocm93ICgpIDsKZXh0ZXJuIHdpbnRfdCAg IF9fd3VmbG93IChfSU9fRklMRSAqKSB0aHJvdyAoKSA7CmV4dGVybiB3aW50X3QgICBfX3dvdmVy ZmxvdyAoX0lPX0ZJTEUgKiwgd2ludF90ICApIHRocm93ICgpIDsKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKZXh0ZXJuIGludCBfSU9fZ2V0YyAoX0lPX0ZJTEUgKl9fZnApIHRocm93ICgpIDsKZXh0 ZXJuIGludCBfSU9fcHV0YyAoaW50IF9fYywgX0lPX0ZJTEUgKl9fZnApIHRocm93ICgpIDsKZXh0 ZXJuIGludCBfSU9fZmVvZiAoX0lPX0ZJTEUgKl9fZnApIHRocm93ICgpIDsKZXh0ZXJuIGludCBf SU9fZmVycm9yIChfSU9fRklMRSAqX19mcCkgdGhyb3cgKCkgOwoKZXh0ZXJuIGludCBfSU9fcGVl a2NfbG9ja2VkIChfSU9fRklMRSAqX19mcCkgdGhyb3cgKCkgOwoKIAoKCgpleHRlcm4gdm9pZCBf SU9fZmxvY2tmaWxlIChfSU9fRklMRSAqKSB0aHJvdyAoKSA7CmV4dGVybiB2b2lkIF9JT19mdW5s b2NrZmlsZSAoX0lPX0ZJTEUgKikgdGhyb3cgKCkgOwpleHRlcm4gaW50IF9JT19mdHJ5bG9ja2Zp bGUgKF9JT19GSUxFICopIHRocm93ICgpIDsKCgoKCgoKCgoKCgoKCgoKCmV4dGVybiBpbnQgX0lP X3Zmc2NhbmYgKF9JT19GSUxFICogX19yZXN0cmljdCwgY29uc3QgY2hhciAqIF9fcmVzdHJpY3Qs CgkJCV9fZ251Y192YV9saXN0ICwgaW50ICpfX3Jlc3RyaWN0KSB0aHJvdyAoKSA7CmV4dGVybiBp bnQgX0lPX3ZmcHJpbnRmIChfSU9fRklMRSAqX19yZXN0cmljdCwgY29uc3QgY2hhciAqX19yZXN0 cmljdCwKCQkJIF9fZ251Y192YV9saXN0ICkgdGhyb3cgKCkgOwpleHRlcm4gX19zc2l6ZV90ICAg X0lPX3BhZG4gKF9JT19GSUxFICosIGludCwgX19zc2l6ZV90ICApIHRocm93ICgpIDsKZXh0ZXJu IHNpemVfdCAgIF9JT19zZ2V0biAoX0lPX0ZJTEUgKiwgdm9pZCAqLCBzaXplX3QgICkgdGhyb3cg KCkgOwoKZXh0ZXJuIF9fb2ZmNjRfdCAgIF9JT19zZWVrb2ZmIChfSU9fRklMRSAqLCBfX29mZjY0 X3QgICwgaW50LCBpbnQpIHRocm93ICgpIDsKZXh0ZXJuIF9fb2ZmNjRfdCAgIF9JT19zZWVrcG9z IChfSU9fRklMRSAqLCBfX29mZjY0X3QgICwgaW50KSB0aHJvdyAoKSA7CgpleHRlcm4gdm9pZCBf SU9fZnJlZV9iYWNrdXBfYXJlYSAoX0lPX0ZJTEUgKikgdGhyb3cgKCkgOwoKIyA1MTEgIi91c3Iv aW5jbHVkZS9saWJpby5oIiAzCgoKCn0KCgoKIyA2OSAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDIg MwoKCiAKCnR5cGVkZWYgX0dfZnBvc190IGZwb3NfdDsKCgoKCgoKCiAKCgoKCgogCgoKCgoKIAoK CgoKCgogCgoKCgoKCgogCgoKCgogCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9zdGRp b19saW0uaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMg MTIyICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMiAzCgoKCiAKZXh0ZXJuIEZJTEUgKnN0ZGluOwkJ IApleHRlcm4gRklMRSAqc3Rkb3V0OwkJIApleHRlcm4gRklMRSAqc3RkZXJyOwkJIAogCgoKCgog CmV4dGVybiBpbnQgcmVtb3ZlIChfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUpIHRocm93ICgpIDsK IApleHRlcm4gaW50IHJlbmFtZSAoX19jb25zdCBjaGFyICpfX29sZCwgX19jb25zdCBjaGFyICpf X25ldykgdGhyb3cgKCkgOwoKCiAKCmV4dGVybiBGSUxFICp0bXBmaWxlICh2b2lkKSB0aHJvdyAo KSA7CgoKCgoKCgoKCgogCmV4dGVybiBjaGFyICp0bXBuYW0gKGNoYXIgKl9fcykgdGhyb3cgKCkg OwoKCiAKCmV4dGVybiBjaGFyICp0bXBuYW1fciAoY2hhciAqX19zKSB0aHJvdyAoKSA7CgoKCgog CgoKCgoKCmV4dGVybiBjaGFyICp0ZW1wbmFtIChfX2NvbnN0IGNoYXIgKl9fZGlyLCBfX2NvbnN0 IGNoYXIgKl9fcGZ4KQogICAgIHRocm93ICgpICAgOwoKCgogCmV4dGVybiBpbnQgZmNsb3NlIChG SUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwogCmV4dGVybiBpbnQgZmZsdXNoIChGSUxFICpfX3N0 cmVhbSkgdGhyb3cgKCkgOwoKCiAKZXh0ZXJuIGludCBmZmx1c2hfdW5sb2NrZWQgKEZJTEUgKl9f c3RyZWFtKSB0aHJvdyAoKSA7CgoKCgoKCgoKCiAKZXh0ZXJuIEZJTEUgKmZvcGVuIChfX2NvbnN0 IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwKCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3Ry aWN0IF9fbW9kZXMpIHRocm93ICgpIDsKIApleHRlcm4gRklMRSAqZnJlb3BlbiAoX19jb25zdCBj aGFyICpfX3Jlc3RyaWN0IF9fZmlsZW5hbWUsCgkJICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3Ry aWN0IF9fbW9kZXMsCgkJICAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cgKCkg OwojIDIxMyAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoKCgoKCgoKCiAKZXh0ZXJuIEZJTEUg KmZkb3BlbiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19tb2RlcykgdGhyb3cgKCkgOwoKCiMg MjQyICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMwoKCgogCgpleHRlcm4gdm9pZCBzZXRidWYgKEZJ TEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYpIHRocm93ICgp IDsKIAoKCmV4dGVybiBpbnQgc2V0dmJ1ZiAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgY2hh ciAqX19yZXN0cmljdCBfX2J1ZiwKCQkgICAgaW50IF9fbW9kZXMsIHNpemVfdCBfX24pIHRocm93 ICgpIDsKCgogCgpleHRlcm4gdm9pZCBzZXRidWZmZXIgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJl YW0sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCgkJICAgICAgIHNpemVfdCBfX3NpemUpIHRocm93 ICgpIDsKCiAKZXh0ZXJuIHZvaWQgc2V0bGluZWJ1ZiAoRklMRSAqX19zdHJlYW0pIHRocm93ICgp IDsKCgoKIApleHRlcm4gaW50IGZwcmludGYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCgkJ ICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSB0aHJvdyAoKSA7CiAK ZXh0ZXJuIGludCBwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4u KSB0aHJvdyAoKSA7CiAKZXh0ZXJuIGludCBzcHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywK CQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIHRocm93ICgpIDsK CiAKZXh0ZXJuIGludCB2ZnByaW50ZiAoRklMRSAqX19yZXN0cmljdCBfX3MsIF9fY29uc3QgY2hh ciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKCQkgICAgIF9fZ251Y192YV9saXN0ICBfX2FyZykgdGhy b3cgKCkgOwogCmV4dGVybiBpbnQgdnByaW50ZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9f Zm9ybWF0LCBfX2dudWNfdmFfbGlzdCAgX19hcmcpCiAgICAgdGhyb3cgKCkgOwogCmV4dGVybiBp bnQgdnNwcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJp Y3QgX19mb3JtYXQsCgkJICAgICBfX2dudWNfdmFfbGlzdCAgX19hcmcpIHRocm93ICgpIDsKCgog CmV4dGVybiBpbnQgc25wcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhs ZW4sCgkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKICAgICB0 aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSk7 CgpleHRlcm4gaW50IF9fdnNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9f bWF4bGVuLAoJCQlfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIF9fZ251Y192YV9s aXN0ICBfX2FyZykKICAgICB0aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9f cHJpbnRmX18sIDMsIDApKSk7CmV4dGVybiBpbnQgdnNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0 IF9fcywgc2l6ZV90IF9fbWF4bGVuLAoJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBf X2Zvcm1hdCwgX19nbnVjX3ZhX2xpc3QgIF9fYXJnKQogICAgIHRocm93ICgpICBfX2F0dHJpYnV0 ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkpKTsKCgojIDMxNyAiL3Vzci9pbmNs dWRlL3N0ZGlvLmgiIDMKCgoKIApleHRlcm4gaW50IGZzY2FuZiAoRklMRSAqX19yZXN0cmljdCBf X3N0cmVhbSwKCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgdGhy b3cgKCkgOwogCmV4dGVybiBpbnQgc2NhbmYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zv cm1hdCwgLi4uKSB0aHJvdyAoKSA7CiAKZXh0ZXJuIGludCBzc2NhbmYgKF9fY29uc3QgY2hhciAq X19yZXN0cmljdCBfX3MsCgkJICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAu Li4pIHRocm93ICgpIDsKCiMgMzQzICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMwoKCgogCmV4dGVy biBpbnQgZmdldGMgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQgZ2V0YyAo RklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCBnZXRjaGFyICh2b2lkKSB0 aHJvdyAoKSA7CgogCgoKCgogCmV4dGVybiBpbnQgZ2V0Y191bmxvY2tlZCAoRklMRSAqX19zdHJl YW0pIHRocm93ICgpIDsKZXh0ZXJuIGludCBnZXRjaGFyX3VubG9ja2VkICh2b2lkKSB0aHJvdyAo KSA7CgoKCiAKZXh0ZXJuIGludCBmZ2V0Y191bmxvY2tlZCAoRklMRSAqX19zdHJlYW0pIHRocm93 ICgpIDsKCgoKIApleHRlcm4gaW50IGZwdXRjIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkgdGhy b3cgKCkgOwpleHRlcm4gaW50IHB1dGMgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAo KSA7CgogCmV4dGVybiBpbnQgcHV0Y2hhciAoaW50IF9fYykgdGhyb3cgKCkgOwoKIAoKCgoKIApl eHRlcm4gaW50IGZwdXRjX3VubG9ja2VkIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkgdGhyb3cg KCkgOwoKCgogCmV4dGVybiBpbnQgcHV0Y191bmxvY2tlZCAoaW50IF9fYywgRklMRSAqX19zdHJl YW0pIHRocm93ICgpIDsKZXh0ZXJuIGludCBwdXRjaGFyX3VubG9ja2VkIChpbnQgX19jKSB0aHJv dyAoKSA7CgoKCgogCmV4dGVybiBpbnQgZ2V0dyAoRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsK CiAKZXh0ZXJuIGludCBwdXR3IChpbnQgX193LCBGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoK CgogCmV4dGVybiBjaGFyICpmZ2V0cyAoY2hhciAqX19yZXN0cmljdCBfX3MsIGludCBfX24sIEZJ TEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pCiAgICAgdGhyb3cgKCkgOwoKCgoKCgoKIAoKZXh0ZXJu IGNoYXIgKmdldHMgKGNoYXIgKl9fcykgdGhyb3cgKCkgOwoKCiMgNDMzICIvdXNyL2luY2x1ZGUv c3RkaW8uaCIgMwoKCgogCmV4dGVybiBpbnQgZnB1dHMgKF9fY29uc3QgY2hhciAqX19yZXN0cmlj dCBfX3MsIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pCiAgICAgdGhyb3cgKCkgOwoKCgoKCgoK IApleHRlcm4gaW50IHB1dHMgKF9fY29uc3QgY2hhciAqX19zKSB0aHJvdyAoKSA7CgoKIApleHRl cm4gaW50IHVuZ2V0YyAoaW50IF9fYywgRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKCgogCmV4 dGVybiBzaXplX3QgZnJlYWQgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUs CgkJICAgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSB0aHJvdyAoKSA7 CiAKZXh0ZXJuIHNpemVfdCBmd3JpdGUgKF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3B0ciwg c2l6ZV90IF9fc2l6ZSwKCQkgICAgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fcykg dGhyb3cgKCkgOwoKCiAKZXh0ZXJuIHNpemVfdCBmcmVhZF91bmxvY2tlZCAodm9pZCAqX19yZXN0 cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKCQkJICAgICAgc2l6ZV90IF9fbiwgRklMRSAqX19y ZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cgKCkgOwpleHRlcm4gc2l6ZV90IGZ3cml0ZV91bmxvY2tl ZCAoX19jb25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLAoJCQkgICAg ICAgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cgKCkgOwoKCgog CmV4dGVybiBpbnQgZnNlZWsgKEZJTEUgKl9fc3RyZWFtLCBsb25nIGludCBfX29mZiwgaW50IF9f d2hlbmNlKSB0aHJvdyAoKSA7CiAKZXh0ZXJuIGxvbmcgaW50IGZ0ZWxsIChGSUxFICpfX3N0cmVh bSkgdGhyb3cgKCkgOwogCmV4dGVybiB2b2lkIHJld2luZCAoRklMRSAqX19zdHJlYW0pIHRocm93 ICgpIDsKCiAKCgoKCiAKCgp0eXBlZGVmIF9fb2ZmX3Qgb2ZmX3Q7CgoKCgoKCgoKCgoKCgoKCgoK CgoKIApleHRlcm4gaW50IGZnZXRwb3MgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGZwb3Nf dCAqX19yZXN0cmljdCBfX3BvcykKICAgICB0aHJvdyAoKSA7CiAKZXh0ZXJuIGludCBmc2V0cG9z IChGSUxFICpfX3N0cmVhbSwgX19jb25zdCBmcG9zX3QgKl9fcG9zKSB0aHJvdyAoKSA7CiMgNTMy ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMwoKCgoKCgoKCgoKIApleHRlcm4gdm9pZCBjbGVhcmVy ciAoRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKIApleHRlcm4gaW50IGZlb2YgKEZJTEUgKl9f c3RyZWFtKSB0aHJvdyAoKSA7CiAKZXh0ZXJuIGludCBmZXJyb3IgKEZJTEUgKl9fc3RyZWFtKSB0 aHJvdyAoKSA7CgoKIApleHRlcm4gdm9pZCBjbGVhcmVycl91bmxvY2tlZCAoRklMRSAqX19zdHJl YW0pIHRocm93ICgpIDsKZXh0ZXJuIGludCBmZW9mX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkg dGhyb3cgKCkgOwpleHRlcm4gaW50IGZlcnJvcl91bmxvY2tlZCAoRklMRSAqX19zdHJlYW0pIHRo cm93ICgpIDsKCgoKIApleHRlcm4gdm9pZCBwZXJyb3IgKF9fY29uc3QgY2hhciAqX19zKSB0aHJv dyAoKSA7CgogCgoKZXh0ZXJuIGludCBzeXNfbmVycjsKZXh0ZXJuIF9fY29uc3QgY2hhciAqX19j b25zdCBzeXNfZXJybGlzdFtdOwoKCgoKCgoKCiAKZXh0ZXJuIGludCBmaWxlbm8gKEZJTEUgKl9f c3RyZWFtKSB0aHJvdyAoKSA7CgoKCiAKZXh0ZXJuIGludCBmaWxlbm9fdW5sb2NrZWQgKEZJTEUg Kl9fc3RyZWFtKSB0aHJvdyAoKSA7CgoKCgoKIApleHRlcm4gRklMRSAqcG9wZW4gKF9fY29uc3Qg Y2hhciAqX19jb21tYW5kLCBfX2NvbnN0IGNoYXIgKl9fbW9kZXMpIHRocm93ICgpIDsKCiAKZXh0 ZXJuIGludCBwY2xvc2UgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CgoKCgogCmV4dGVybiBj aGFyICpjdGVybWlkIChjaGFyICpfX3MpIHRocm93ICgpIDsKCgoKCgoKCgoKIyA2MTQgIi91c3Iv aW5jbHVkZS9zdGRpby5oIiAzCgoKCgogCgogCmV4dGVybiB2b2lkIGZsb2NrZmlsZSAoRklMRSAq X19zdHJlYW0pIHRocm93ICgpIDsKCiAKCmV4dGVybiBpbnQgZnRyeWxvY2tmaWxlIChGSUxFICpf X3N0cmVhbSkgdGhyb3cgKCkgOwoKIApleHRlcm4gdm9pZCBmdW5sb2NrZmlsZSAoRklMRSAqX19z dHJlYW0pIHRocm93ICgpIDsKCgoKCgoKCgoKCiAKCgoKCgp9IAoKCgoKIyA1ICJ0ZXN0RnNtR3Jh cGguY3BwIiAyCgoKIyAxICIuLi9pbmNsdWRlL0ZzbUJhc2VWay5oIiAxCiAKCgoKCgojIDEgIi4u L2luY2x1ZGUvVmVjdG9yU2V0LmgiIDEKIAoKCgoKCgojIDEgIi91c3IvaW5jbHVkZS9tYWxsb2Mu aCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYu aCIgMSAzCgoKCgoKCiAKCgoKCgoKCiAKCiAKCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3Iv bGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMK CgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKCgoKCgoKCgoKCgoKCgoK CgoKCgp0eXBlZGVmIGludCBwdHJkaWZmX3Q7CgoKCgoKCgoKCiAKCgoKCiAKCiAKCgojIDE4OCAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYu aCIgMwoKCgoKCiAKCgoKCiAKCgojIDI2OSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4 LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKCgoKCgoKCgoKCgoKIAoKIAoKIyAz MTcgIi91c3IvbGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3Rk ZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCiMgNDQgIi91c3IvaW5jbHVkZS9t YWxsb2MuaCIgMiAzCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCiAKCgoKIyA5MyAiL3Vz ci9pbmNsdWRlL21hbGxvYy5oIiAzCgoKCgoKCgoKCgoKZXh0ZXJuICJDIiB7CgoKIAoKCgoKCmV4 dGVybiBpbnQgX19tYWxsb2NfaW5pdGlhbGl6ZWQ7CgogCgoKCgogCmV4dGVybiB2b2lkICogIG1h bGxvYyAgKHNpemVfdCBfX3NpemUpICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiB2b2lkICogIGNh bGxvYyAgKHNpemVfdCBfX25tZW1iLCBzaXplX3QgX19zaXplKSAgdGhyb3cgKCkgIAogICAgICAg IDsKCiAKCmV4dGVybiB2b2lkICogIHJlYWxsb2MgICh2b2lkICogIF9fcHRyLAoJCQkJCSAgIHNp emVfdCBfX3NpemUpICB0aHJvdyAoKSAgCiAgICAgICAgOwoKIApleHRlcm4gdm9pZCBmcmVlICAo dm9pZCAqICBfX3B0cikgIHRocm93ICgpICA7CgogCmV4dGVybiB2b2lkIGNmcmVlICAodm9pZCAq ICBfX3B0cikgIHRocm93ICgpICA7CgogCmV4dGVybiB2b2lkICogIG1lbWFsaWduICAoc2l6ZV90 IF9fYWxpZ25tZW50LCBzaXplX3QgX19zaXplKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIHZvaWQg KiAgdmFsbG9jICAoc2l6ZV90IF9fc2l6ZSkgIHRocm93ICgpICAgIDsKCiAKCmV4dGVybiB2b2lk ICogICBwdmFsbG9jICAoc2l6ZV90IF9fc2l6ZSkgIHRocm93ICgpICAKICAgICAgICA7CgogCgpl eHRlcm4gdm9pZCAqICAoKl9fbW9yZWNvcmUpICAocHRyZGlmZl90IF9fc2l6ZSkgIDsKCiAKZXh0 ZXJuIHZvaWQgKiAgX19kZWZhdWx0X21vcmVjb3JlICAocHRyZGlmZl90IF9fc2l6ZSkgIHRocm93 ICgpICAKICAgICAgICA7CgogCnN0cnVjdCBtYWxsaW5mbyB7CiAgaW50IGFyZW5hOyAgICAgCiAg aW50IG9yZGJsa3M7ICAgCiAgaW50IHNtYmxrczsgICAgCiAgaW50IGhibGtzOyAgICAgCiAgaW50 IGhibGtoZDsgICAgCiAgaW50IHVzbWJsa3M7ICAgCiAgaW50IGZzbWJsa3M7ICAgCiAgaW50IHVv cmRibGtzOyAgCiAgaW50IGZvcmRibGtzOyAgCiAgaW50IGtlZXBjb3N0OyAgCn07CgogCmV4dGVy biBzdHJ1Y3QgbWFsbGluZm8gbWFsbGluZm8gICh2b2lkKSAgdGhyb3cgKCkgIDsKCiAKCgoKCgoK CgoKCgoKCiAKCgoKCgoKIApleHRlcm4gaW50IG1hbGxvcHQgIChpbnQgX19wYXJhbSwgaW50IF9f dmFsKSAgdGhyb3cgKCkgIDsKCiAKCmV4dGVybiBpbnQgbWFsbG9jX3RyaW0gIChzaXplX3QgX19w YWQpICB0aHJvdyAoKSAgOwoKIAoKZXh0ZXJuIHNpemVfdCBtYWxsb2NfdXNhYmxlX3NpemUgICh2 b2lkICogIF9fcHRyKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIHZvaWQgbWFsbG9jX3N0YXRzICAo dm9pZCkgIHRocm93ICgpICA7CgogCmV4dGVybiB2b2lkICogIG1hbGxvY19nZXRfc3RhdGUgICh2 b2lkKSAgdGhyb3cgKCkgIDsKCiAKCmV4dGVybiBpbnQgbWFsbG9jX3NldF9zdGF0ZSAgKHZvaWQg KiAgX19wdHIpICB0aHJvdyAoKSAgOwoKCiAKCgpleHRlcm4gdm9pZCAoKl9fbWFsbG9jX2luaXRp YWxpemVfaG9vaykgICh2b2lkKSAgOwogCmV4dGVybiB2b2lkICgqX19mcmVlX2hvb2spICAodm9p ZCAqICBfX3B0ciwKCQkJCQlfX2NvbnN0IHZvaWQgKiApICA7CmV4dGVybiB2b2lkICogICgqX19t YWxsb2NfaG9vaykgIChzaXplX3QgX19zaXplLAoJCQkJCQkgICAgX19jb25zdCB2b2lkICogKSAg OwpleHRlcm4gdm9pZCAqICAoKl9fcmVhbGxvY19ob29rKSAgKHZvaWQgKiAgX19wdHIsCgkJCQkJ CSAgICAgc2l6ZV90IF9fc2l6ZSwKCQkJCQkJICAgICBfX2NvbnN0IHZvaWQgKiApICA7CmV4dGVy biB2b2lkICogICgqX19tZW1hbGlnbl9ob29rKSAgKHNpemVfdCBfX2FsaWdubWVudCwKCQkJCQkJ ICAgICAgc2l6ZV90IF9fc2l6ZSwKCQkJCQkJICAgICAgX19jb25zdCB2b2lkICogKSAgOwpleHRl cm4gdm9pZCAoKl9fYWZ0ZXJfbW9yZWNvcmVfaG9vaykgICh2b2lkKSAgOwoKIApleHRlcm4gdm9p ZCBfX21hbGxvY19jaGVja19pbml0ICAodm9pZCkgIHRocm93ICgpICA7CgoKCn07ICAKCgoKIyA4 ICIuLi9pbmNsdWRlL1ZlY3RvclNldC5oIiAyCgojIDEgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIg MSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKZXh0ZXJuICJDIiB7IAoKIAoKCiMgMSAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYu aCIgMSAzCgoKCgoKCiAKCgojIDE5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMtbGludXgtZ251 LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3Iv bGliL2djYy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMK CgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKCiMgMTI2ICIvdXNyL2xp Yi9nY2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoK IAoKCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIu OTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKIAoKCgoKIAoKCiMgMjY5ICIvdXNyL2xpYi9n Y2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoK CgoKCgoKCgoKCgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdu dS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoKCgoKCgoKCgoKIAoKCgoKCgoK IyAzMyAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAyIDMKCgoKIApleHRlcm4gdm9pZCAqbWVtY3B5 ICh2b2lkICpfX3Jlc3RyaWN0IF9fZGVzdCwKCQkgICAgIF9fY29uc3Qgdm9pZCAqX19yZXN0cmlj dCBfX3NyYywgc2l6ZV90IF9fbikgdGhyb3cgKCkgOwogCgpleHRlcm4gdm9pZCAqbWVtbW92ZSAo dm9pZCAqX19kZXN0LCBfX2NvbnN0IHZvaWQgKl9fc3JjLCBzaXplX3QgX19uKQogICAgIHRocm93 ICgpIDsKCiAKCgoKZXh0ZXJuIHZvaWQgKm1lbWNjcHkgKHZvaWQgKl9fcmVzdHJpY3QgX19kZXN0 LCBfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19zcmMsCgkJICAgICAgaW50IF9fYywgc2l6ZV90 IF9fbikKICAgICB0aHJvdyAoKSA7CgoKCiAKZXh0ZXJuIHZvaWQgKm1lbXNldCAodm9pZCAqX19z LCBpbnQgX19jLCBzaXplX3QgX19uKSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgbWVtY21wIChf X2NvbnN0IHZvaWQgKl9fczEsIF9fY29uc3Qgdm9pZCAqX19zMiwgc2l6ZV90IF9fbikKICAgICB0 aHJvdyAoKSAgIDsKCiAKZXh0ZXJuIHZvaWQgKm1lbWNociAoX19jb25zdCB2b2lkICpfX3MsIGlu dCBfX2MsIHNpemVfdCBfX24pCiAgICAgIHRocm93ICgpICAgOwoKIyA3MyAiL3Vzci9pbmNsdWRl L3N0cmluZy5oIiAzCgoKCiAKZXh0ZXJuIGNoYXIgKnN0cmNweSAoY2hhciAqX19yZXN0cmljdCBf X2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYykKICAgICB0aHJvdyAoKSA7CiAK ZXh0ZXJuIGNoYXIgKnN0cm5jcHkgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LAoJCSAgICAgIF9f Y29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikgdGhyb3cgKCkgOwoKIApl eHRlcm4gY2hhciAqc3RyY2F0IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFy ICpfX3Jlc3RyaWN0IF9fc3JjKQogICAgIHRocm93ICgpIDsKIApleHRlcm4gY2hhciAqc3RybmNh dCAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3Ny YywKCQkgICAgICBzaXplX3QgX19uKSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgc3RyY21wIChf X2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMikKICAgICB0aHJvdyAoKSAgIDsK IApleHRlcm4gaW50IHN0cm5jbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpf X3MyLCBzaXplX3QgX19uKQogICAgIHRocm93ICgpICAgOwoKIApleHRlcm4gaW50IHN0cmNvbGwg KF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKQogICAgIHRocm93ICgpICAg OwogCmV4dGVybiBzaXplX3Qgc3RyeGZybSAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsCgkJICAg ICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikgdGhyb3cgKCkg OwoKIyAxMTYgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMwoKCgogCmV4dGVybiBjaGFyICpzdHJk dXAgKF9fY29uc3QgY2hhciAqX19zKSB0aHJvdyAoKSAgIDsKCgogCgoKCgoKCgojIDE1MiAiL3Vz ci9pbmNsdWRlL3N0cmluZy5oIiAzCgoKIApleHRlcm4gY2hhciAqc3RyY2hyIChfX2NvbnN0IGNo YXIgKl9fcywgaW50IF9fYykgdGhyb3cgKCkgICA7CiAKZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKF9f Y29uc3QgY2hhciAqX19zLCBpbnQgX19jKSB0aHJvdyAoKSAgIDsKCgoKCgoKCiAKCmV4dGVybiBz aXplX3Qgc3RyY3NwbiAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19yZWplY3Qp CiAgICAgdGhyb3cgKCkgICA7CiAKCmV4dGVybiBzaXplX3Qgc3Ryc3BuIChfX2NvbnN0IGNoYXIg Kl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkKICAgICB0aHJvdyAoKSAgIDsKIApleHRlcm4g Y2hhciAqc3RycGJyayAoX19jb25zdCBjaGFyICpfX3MsIF9fY29uc3QgY2hhciAqX19hY2NlcHQp CiAgICAgdGhyb3cgKCkgICA7CiAKZXh0ZXJuIGNoYXIgKnN0cnN0ciAoX19jb25zdCBjaGFyICpf X2hheXN0YWNrLCBfX2NvbnN0IGNoYXIgKl9fbmVlZGxlKQogICAgIHRocm93ICgpICAgOwoKCgoK CgoKIApleHRlcm4gY2hhciAqc3RydG9rIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBj aGFyICpfX3Jlc3RyaWN0IF9fZGVsaW0pCiAgICAgdGhyb3cgKCkgOwoKIAoKZXh0ZXJuIGNoYXIg Kl9fc3RydG9rX3IgKGNoYXIgKl9fcmVzdHJpY3QgX19zLAoJCQkgX19jb25zdCBjaGFyICpfX3Jl c3RyaWN0IF9fZGVsaW0sCgkJCSBjaGFyICoqX19yZXN0cmljdCBfX3NhdmVfcHRyKSB0aHJvdyAo KSA7CgpleHRlcm4gY2hhciAqc3RydG9rX3IgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0 IGNoYXIgKl9fcmVzdHJpY3QgX19kZWxpbSwKCQkgICAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19z YXZlX3B0cikgdGhyb3cgKCkgOwoKCiMgMjE0ICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDMKCgoK IApleHRlcm4gc2l6ZV90IHN0cmxlbiAoX19jb25zdCBjaGFyICpfX3MpIHRocm93ICgpICAgOwoK CgoKCgoKCgogCmV4dGVybiBjaGFyICpzdHJlcnJvciAoaW50IF9fZXJybnVtKSB0aHJvdyAoKSA7 CgogCgpleHRlcm4gY2hhciAqX19zdHJlcnJvcl9yIChpbnQgX19lcnJudW0sIGNoYXIgKl9fYnVm LCBzaXplX3QgX19idWZsZW4pIHRocm93ICgpIDsKZXh0ZXJuIGNoYXIgKnN0cmVycm9yX3IgKGlu dCBfX2Vycm51bSwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1ZmxlbikgdGhyb3cgKCkgOwoKCiAK CmV4dGVybiB2b2lkIF9fYnplcm8gKHZvaWQgKl9fcywgc2l6ZV90IF9fbikgdGhyb3cgKCkgOwoK CiAKZXh0ZXJuIHZvaWQgYmNvcHkgKF9fY29uc3Qgdm9pZCAqX19zcmMsIHZvaWQgKl9fZGVzdCwg c2l6ZV90IF9fbikgdGhyb3cgKCkgOwoKIApleHRlcm4gdm9pZCBiemVybyAodm9pZCAqX19zLCBz aXplX3QgX19uKSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgYmNtcCAoX19jb25zdCB2b2lkICpf X3MxLCBfX2NvbnN0IHZvaWQgKl9fczIsIHNpemVfdCBfX24pCiAgICAgdGhyb3cgKCkgICA7Cgog CmV4dGVybiBjaGFyICppbmRleCAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIHRocm93ICgp ICAgOwoKIApleHRlcm4gY2hhciAqcmluZGV4IChfX2NvbnN0IGNoYXIgKl9fcywgaW50IF9fYykg dGhyb3cgKCkgICA7CgogCgpleHRlcm4gaW50IF9fZmZzIChpbnQgX19pKSB0aHJvdyAoKSAgX19h dHRyaWJ1dGVfXyAoKGNvbnN0KSk7CmV4dGVybiBpbnQgZmZzIChpbnQgX19pKSB0aHJvdyAoKSAg X19hdHRyaWJ1dGVfXyAoKGNvbnN0KSk7CgogCgoKCgoKCgoKCiAKZXh0ZXJuIGludCBzdHJjYXNl Y21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMikKICAgICB0aHJvdyAo KSAgIDsKCiAKZXh0ZXJuIGludCBzdHJuY2FzZWNtcCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2Nv bnN0IGNoYXIgKl9fczIsIHNpemVfdCBfX24pCiAgICAgdGhyb3cgKCkgICA7CgoKIyAyOTEgIi91 c3IvaW5jbHVkZS9zdHJpbmcuaCIgMwoKCgogCgpleHRlcm4gY2hhciAqc3Ryc2VwIChjaGFyICoq X19yZXN0cmljdCBfX3N0cmluZ3AsCgkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19k ZWxpbSkgdGhyb3cgKCkgOwoKCiMgMzM0ICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDMKCgoKCiMg MzYyICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDMKCgoKfSAKCgojIDkgIi4uL2luY2x1ZGUvVmVj dG9yU2V0LmgiIDIKCiMgMSAiLi4vaW5jbHVkZS9Db21wYXJlLmgiIDEKIAoKCgoKCiMgMSAiLi4v aW5jbHVkZS9UYWJsZS5oIiAxCiAKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvZysrL2lvc3RyZWFt IiAxIDMKIAogCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2crKy9pb3N0cmVhbS5oIiAxIDMKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKI3ByYWdtYSBpbnRlcmZhY2UKCgoKIyAxICIvdXNyL2luY2x1 ZGUvZysrL3N0cmVhbWJ1Zi5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiNwcmFn bWEgaW50ZXJmYWNlCgoKICAgCgoKCmV4dGVybiAiQyIgewoKfQogCgojIDEgIi91c3IvbGliL2dj Yy1saWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvc3RkYXJnLmgiIDEgMwogCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgogCgoKCgoKCgoKCgogCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgp2b2lkIHZhX2VuZCAoX19n bnVjX3ZhX2xpc3QpOwkJIAoKCiAKCgoKIAoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKIAogCgoKCgoKCgoKCgoKCgojIDE3NSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxp bnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRhcmcuaCIgMwoKCiAKCgoKCiAKCiAKCiAKCnR5cGVk ZWYgX19nbnVjX3ZhX2xpc3QgdmFfbGlzdDsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyA0MCAi L3Vzci9pbmNsdWRlL2crKy9zdHJlYW1idWYuaCIgMiAzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgpleHRlcm4gIkMrKyIgewpjbGFzcyBpc3RyZWFtOyAgCmNsYXNzIG9zdHJlYW07IGNsYXNzIHN0 cmVhbWJ1ZjsKCiAKCgoKCnR5cGVkZWYgX19vZmY2NF90ICAgc3RyZWFtb2ZmOwp0eXBlZGVmIF9f b2ZmNjRfdCAgIHN0cmVhbXBvczsKCgoKCnR5cGVkZWYgX19zc2l6ZV90ICAgc3RyZWFtc2l6ZTsK CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBfX2ZtdGZsYWdzOwp0eXBlZGVmIHVuc2lnbmVkIGNoYXIg X19pb3N0YXRlOwoKc3RydWN0IF9pb3NfZmllbGRzCnsgIAogICAgc3RyZWFtYnVmICpfc3RyYnVm OwogICAgb3N0cmVhbSogX3RpZTsKICAgIGludCBfd2lkdGg7CiAgICBfX2ZtdGZsYWdzIF9mbGFn czsKICAgIHdjaGFyX3QgICBfZmlsbDsKICAgIF9faW9zdGF0ZSBfc3RhdGU7CiAgICBfX2lvc3Rh dGUgX2V4Y2VwdGlvbnM7CiAgICBpbnQgX3ByZWNpc2lvbjsKCiAgICB2b2lkICpfYXJyYXlzOyAg Cn07CgoKCgoKCgoKCgoKCgoKCiMgMTI0ICIvdXNyL2luY2x1ZGUvZysrL3N0cmVhbWJ1Zi5oIiAz CgoKY2xhc3MgaW9zIDogcHVibGljIF9pb3NfZmllbGRzIHsKICBpb3MmIG9wZXJhdG9yPShpb3Mm KTsgICAKICBpb3MgKGNvbnN0IGlvcyYpOyAgCiAgcHVibGljOgogICAgdHlwZWRlZiBfX2ZtdGZs YWdzIGZtdGZsYWdzOwogICAgdHlwZWRlZiBpbnQgaW9zdGF0ZTsKICAgIHR5cGVkZWYgaW50IG9w ZW5tb2RlOwogICAgdHlwZWRlZiBfX3NzaXplX3QgICBzdHJlYW1zaXplOwogICAgZW51bSBpb19z dGF0ZSB7Cglnb29kYml0ID0gMCAsCgllb2ZiaXQgPSAxICwKCWZhaWxiaXQgPSAyICwKCWJhZGJp dCA9IDQgIH07CiAgICBlbnVtIG9wZW5fbW9kZSB7CglpbiA9IDEgLAoJb3V0ID0gMiAsCglhdGUg PSA0ICwKCWFwcCA9IDggLAoJdHJ1bmMgPSAxNiAsCglub2NyZWF0ZSA9IDMyICwKCW5vcmVwbGFj ZSA9IDY0ICwKCWJpbiA9IDEyOCAsICAKCWJpbmFyeSA9IDEyOCAgfTsKICAgIGVudW0gc2Vla19k aXIgeyBiZWcsIGN1ciwgZW5kfTsKICAgIHR5cGVkZWYgZW51bSBzZWVrX2RpciBzZWVrZGlyOwog ICAgIAogICAgZW51bSB7IHNraXB3cz0gMDEgLAoJICAgbGVmdD0gMDIgLCByaWdodD0gMDQgLCBp bnRlcm5hbD0gMDEwICwKCSAgIGRlYz0gMDIwICwgb2N0PSAwNDAgLCBoZXg9IDAxMDAgLAoJICAg c2hvd2Jhc2U9IDAyMDAgLCBzaG93cG9pbnQ9IDA0MDAgLAoJICAgdXBwZXJjYXNlPSAwMTAwMCAs IHNob3dwb3M9IDAyMDAwICwKCSAgIHNjaWVudGlmaWM9IDA0MDAwICwgZml4ZWQ9IDAxMDAwMCAs CgkgICB1bml0YnVmPSAwMjAwMDAgLCBzdGRpbz0gMDQwMDAwIAoKCgoJICAgfTsKICAgIGVudW0g eyAgCgliYXNlZmllbGQ9ZGVjK29jdCtoZXgsCglmbG9hdGZpZWxkID0gc2NpZW50aWZpYytmaXhl ZCwKCWFkanVzdGZpZWxkID0gbGVmdCtyaWdodCtpbnRlcm5hbAogICAgfTsKCiMgMTc3ICIvdXNy L2luY2x1ZGUvZysrL3N0cmVhbWJ1Zi5oIiAzCgoKICAgIG9zdHJlYW0qIHRpZSgpIGNvbnN0IHsg cmV0dXJuIF90aWU7IH0KICAgIG9zdHJlYW0qIHRpZShvc3RyZWFtKiB2YWwpIHsgb3N0cmVhbSog c2F2ZT1fdGllOyBfdGllPXZhbDsgcmV0dXJuIHNhdmU7IH0KCiAgICAgCiAgICB3Y2hhcl90ICAg ZmlsbCgpIGNvbnN0IHsgcmV0dXJuIF9maWxsOyB9CiAgICB3Y2hhcl90ICAgZmlsbCh3Y2hhcl90 ICAgbmV3ZikKCXt3Y2hhcl90ICAgb2xkZiA9IF9maWxsOyBfZmlsbCA9IG5ld2Y7IHJldHVybiBv bGRmO30KICAgIGZtdGZsYWdzIGZsYWdzKCkgY29uc3QgeyByZXR1cm4gX2ZsYWdzOyB9CiAgICBm bXRmbGFncyBmbGFncyhmbXRmbGFncyBuZXdfdmFsKSB7CglmbXRmbGFncyBvbGRfdmFsID0gX2Zs YWdzOyBfZmxhZ3MgPSBuZXdfdmFsOyByZXR1cm4gb2xkX3ZhbDsgfQogICAgaW50IHByZWNpc2lv bigpIGNvbnN0IHsgcmV0dXJuIF9wcmVjaXNpb247IH0KICAgIGludCBwcmVjaXNpb24oaW50IG5l d3ApIHsKCXVuc2lnbmVkIHNob3J0IG9sZHAgPSBfcHJlY2lzaW9uOyBfcHJlY2lzaW9uID0gKHVu c2lnbmVkIHNob3J0KW5ld3A7CglyZXR1cm4gb2xkcDsgfQogICAgZm10ZmxhZ3Mgc2V0ZihmbXRm bGFncyB2YWwpIHsKCWZtdGZsYWdzIG9sZGJpdHMgPSBfZmxhZ3M7CglfZmxhZ3MgfD0gdmFsOyBy ZXR1cm4gb2xkYml0czsgfQogICAgZm10ZmxhZ3Mgc2V0ZihmbXRmbGFncyB2YWwsIGZtdGZsYWdz IG1hc2spIHsKCWZtdGZsYWdzIG9sZGJpdHMgPSBfZmxhZ3M7CglfZmxhZ3MgPSAoX2ZsYWdzICYg fm1hc2spIHwgKHZhbCAmIG1hc2spOyByZXR1cm4gb2xkYml0czsgfQogICAgZm10ZmxhZ3MgdW5z ZXRmKGZtdGZsYWdzIG1hc2spIHsKCWZtdGZsYWdzIG9sZGJpdHMgPSBfZmxhZ3M7CglfZmxhZ3Mg Jj0gfm1hc2s7IHJldHVybiBvbGRiaXRzOyB9CiAgICBpbnQgd2lkdGgoKSBjb25zdCB7IHJldHVy biBfd2lkdGg7IH0KICAgIGludCB3aWR0aChpbnQgdmFsKSB7IGludCBzYXZlID0gX3dpZHRoOyBf d2lkdGggPSB2YWw7IHJldHVybiBzYXZlOyB9CgoKCgogICAgdm9pZCBfdGhyb3dfZmFpbHVyZSgp IGNvbnN0IHsgfQoKICAgIHZvaWQgY2xlYXIoaW9zdGF0ZSBzdGF0ZSA9IDApIHsKCV9zdGF0ZSA9 IF9zdHJidWYgPyBzdGF0ZSA6IHN0YXRlfGJhZGJpdDsKCWlmIChfc3RhdGUgJiBfZXhjZXB0aW9u cykgX3Rocm93X2ZhaWx1cmUoKTsgfQogICAgdm9pZCBzZXQoaW9zdGF0ZSBmbGFnKSB7IF9zdGF0 ZSB8PSBmbGFnOwoJaWYgKF9zdGF0ZSAmIF9leGNlcHRpb25zKSBfdGhyb3dfZmFpbHVyZSgpOyB9 CiAgICB2b2lkIHNldHN0YXRlKGlvc3RhdGUgZmxhZykgeyBfc3RhdGUgfD0gZmxhZzsgIAoJaWYg KF9zdGF0ZSAmIF9leGNlcHRpb25zKSBfdGhyb3dfZmFpbHVyZSgpOyB9CiAgICBpbnQgZ29vZCgp IGNvbnN0IHsgcmV0dXJuIF9zdGF0ZSA9PSAwOyB9CiAgICBpbnQgZW9mKCkgY29uc3QgeyByZXR1 cm4gX3N0YXRlICYgaW9zOjplb2ZiaXQ7IH0KICAgIGludCBmYWlsKCkgY29uc3QgeyByZXR1cm4g X3N0YXRlICYgKGlvczo6YmFkYml0fGlvczo6ZmFpbGJpdCk7IH0KICAgIGludCBiYWQoKSBjb25z dCB7IHJldHVybiBfc3RhdGUgJiBpb3M6OmJhZGJpdDsgfQogICAgaW9zdGF0ZSByZHN0YXRlKCkg Y29uc3QgeyByZXR1cm4gX3N0YXRlOyB9CiAgICBvcGVyYXRvciB2b2lkKigpIGNvbnN0IHsgcmV0 dXJuIGZhaWwoKSA/ICh2b2lkKikwIDogKHZvaWQqKSgtMSk7IH0KICAgIGludCBvcGVyYXRvciEo KSBjb25zdCB7IHJldHVybiBmYWlsKCk7IH0KICAgIGlvc3RhdGUgZXhjZXB0aW9ucygpIGNvbnN0 IHsgcmV0dXJuIF9leGNlcHRpb25zOyB9CiAgICB2b2lkIGV4Y2VwdGlvbnMoaW9zdGF0ZSBlbmFi bGUpIHsKCV9leGNlcHRpb25zID0gZW5hYmxlOwoJaWYgKF9zdGF0ZSAmIF9leGNlcHRpb25zKSBf dGhyb3dfZmFpbHVyZSgpOyB9CgogICAgc3RyZWFtYnVmKiByZGJ1ZigpIGNvbnN0IHsgcmV0dXJu IF9zdHJidWY7IH0KICAgIHN0cmVhbWJ1ZiogcmRidWYoc3RyZWFtYnVmICpfcykgewogICAgICBz dHJlYW1idWYgKl9vbGQgPSBfc3RyYnVmOyBfc3RyYnVmID0gX3M7IGNsZWFyICgpOyByZXR1cm4g X29sZDsgfQoKICAgIHN0YXRpYyBpbnQgc3luY193aXRoX3N0ZGlvKGludCBvbik7CiAgICBzdGF0 aWMgdm9pZCBzeW5jX3dpdGhfc3RkaW8oKSB7IHN5bmNfd2l0aF9zdGRpbygxKTsgfQogICAgc3Rh dGljIGZtdGZsYWdzIGJpdGFsbG9jKCk7CiAgICBzdGF0aWMgaW50IHhhbGxvYygpOwogICAgdm9p ZComIHB3b3JkKGludCk7CiAgICB2b2lkKiBwd29yZChpbnQpIGNvbnN0OwogICAgbG9uZyYgaXdv cmQoaW50KTsKICAgIGxvbmcgaXdvcmQoaW50KSBjb25zdDsKCgoKCgoKCgoKICAgICAKICAgIGNs YXNzIEluaXQgewogICAgcHVibGljOgogICAgICBJbml0ICgpIHsgfQogICAgfTsKCiAgcHJvdGVj dGVkOgogICAgaW5saW5lIGlvcyhzdHJlYW1idWYqIHNiID0gMCwgb3N0cmVhbSogdGllX3RvID0g MCk7CiAgICBpbmxpbmUgdmlydHVhbCB+aW9zKCk7CiAgICBpbmxpbmUgdm9pZCBpbml0KHN0cmVh bWJ1Ziogc2IsIG9zdHJlYW0qIHRpZSA9IDApOwp9OwoKCgoKdHlwZWRlZiBpb3M6OnNlZWtfZGly IF9zZWVrX2RpcjsKCgogCiAKIAogCiAKCiAKIApjbGFzcyBzdHJlYW1tYXJrZXIgOiBwcml2YXRl IF9JT19tYXJrZXIgewogICAgZnJpZW5kIGNsYXNzIHN0cmVhbWJ1ZjsKICAgIHZvaWQgc2V0X29m ZnNldChpbnQgb2Zmc2V0KSB7IF9wb3MgPSBvZmZzZXQ7IH0KICBwdWJsaWM6CiAgICBzdHJlYW1t YXJrZXIoc3RyZWFtYnVmICpzYik7CiAgICB+c3RyZWFtbWFya2VyKCk7CiAgICBpbnQgc2F2aW5n KCkgeyByZXR1cm4gIDE7IH0KICAgIGludCBkZWx0YShzdHJlYW1tYXJrZXImKTsKICAgIGludCBk ZWx0YSgpOwp9OwoKc3RydWN0IHN0cmVhbWJ1ZiA6IHB1YmxpYyBfSU9fRklMRSB7ICAKICAgIGZy aWVuZCBjbGFzcyBpb3M7CiAgICBmcmllbmQgY2xhc3MgaXN0cmVhbTsKICAgIGZyaWVuZCBjbGFz cyBvc3RyZWFtOwogICAgZnJpZW5kIGNsYXNzIHN0cmVhbW1hcmtlcjsKICAgIGNvbnN0IHZvaWQg KiZfdnRhYmxlKCkgeyByZXR1cm4gKihjb25zdCB2b2lkKiopKChfSU9fRklMRSopdGhpcyArIDEp OyB9CiAgcHJvdGVjdGVkOgogICAgc3RhdGljIHN0cmVhbWJ1ZiogX2xpc3RfYWxsOyAgCiAgICBf SU9fRklMRSomIHhjaGFpbigpIHsgcmV0dXJuIF9jaGFpbjsgfQogICAgdm9pZCBfdW5fbGluaygp OwogICAgdm9pZCBfbGlua19pbigpOwogICAgY2hhciogZ3B0cigpIGNvbnN0CiAgICAgIHsgcmV0 dXJuIF9mbGFncyAgJiAweDEwMCAgPyBfSU9fc2F2ZV9iYXNlIDogX0lPX3JlYWRfcHRyOyB9CiAg ICBjaGFyKiBwcHRyKCkgY29uc3QgeyByZXR1cm4gX0lPX3dyaXRlX3B0cjsgfQogICAgY2hhciog ZWdwdHIoKSBjb25zdAogICAgICB7IHJldHVybiBfZmxhZ3MgICYgMHgxMDAgID8gX0lPX3NhdmVf ZW5kIDogX0lPX3JlYWRfZW5kOyB9CiAgICBjaGFyKiBlcHB0cigpIGNvbnN0IHsgcmV0dXJuIF9J T193cml0ZV9lbmQ7IH0KICAgIGNoYXIqIHBiYXNlKCkgY29uc3QgeyByZXR1cm4gX0lPX3dyaXRl X2Jhc2U7IH0KICAgIGNoYXIqIGViYWNrKCkgY29uc3QKICAgICAgeyByZXR1cm4gX2ZsYWdzICAm IDB4MTAwICA/IF9JT19zYXZlX2Jhc2UgOiBfSU9fcmVhZF9iYXNlO30KICAgIGNoYXIqIGJhc2Uo KSBjb25zdCB7IHJldHVybiBfSU9fYnVmX2Jhc2U7IH0KICAgIGNoYXIqIGVidWYoKSBjb25zdCB7 IHJldHVybiBfSU9fYnVmX2VuZDsgfQogICAgaW50IGJsZW4oKSBjb25zdCB7IHJldHVybiBfSU9f YnVmX2VuZCAtIF9JT19idWZfYmFzZTsgfQogICAgdm9pZCB4cHV0X2NoYXIoY2hhciBjKSB7ICpf SU9fd3JpdGVfcHRyKysgPSBjOyB9CiAgICBpbnQgeGZsYWdzKCkgeyByZXR1cm4gX2ZsYWdzIDsg fQogICAgaW50IHhmbGFncyhpbnQgZikge2ludCBmbCA9IF9mbGFncyA7IF9mbGFncyAgPSBmOyBy ZXR1cm4gZmw7fQogICAgdm9pZCB4c2V0ZmxhZ3MoaW50IGYpIHsgX2ZsYWdzICB8PSBmOyB9CiAg ICB2b2lkIHhzZXRmbGFncyhpbnQgZiwgaW50IG1hc2spCiAgICAgIHsgX2ZsYWdzICA9IChfZmxh Z3MgICYgfm1hc2spIHwgKGYgJiBtYXNrKTsgfQogICAgdm9pZCBnYnVtcChpbnQgbikKICAgICAg eyBfZmxhZ3MgICYgMHgxMDAgID8gKF9JT19zYXZlX2Jhc2UrPW4pOihfSU9fcmVhZF9wdHIrPW4p O30KICAgIHZvaWQgcGJ1bXAoaW50IG4pIHsgX0lPX3dyaXRlX3B0ciArPSBuOyB9CiAgICB2b2lk IHNldGIoY2hhciogYiwgY2hhciogZWIsIGludCBhPTApOwogICAgdm9pZCBzZXRwKGNoYXIqIHAs IGNoYXIqIGVwKQogICAgICB7IF9JT193cml0ZV9iYXNlPV9JT193cml0ZV9wdHI9cDsgX0lPX3dy aXRlX2VuZD1lcDsgfQogICAgdm9pZCBzZXRnKGNoYXIqIGViLCBjaGFyKiBnLCBjaGFyICplZykg ewogICAgICBpZiAoX2ZsYWdzICAmIDB4MTAwICkgX0lPX2ZyZWVfYmFja3VwX2FyZWEodGhpcyk7 IAogICAgICBfSU9fcmVhZF9iYXNlID0gZWI7IF9JT19yZWFkX3B0ciA9IGc7IF9JT19yZWFkX2Vu ZCA9IGVnOyB9CiAgICBjaGFyICpzaG9ydGJ1ZigpIHsgcmV0dXJuIF9zaG9ydGJ1ZjsgfQoKICAg IGludCBpbl9iYWNrdXAoKSB7IHJldHVybiBfZmxhZ3MgJiAweDEwMCA7IH0KICAgICAKICAgIGNo YXIgKkdiYXNlKCkgeyByZXR1cm4gaW5fYmFja3VwKCkgPyBfSU9fc2F2ZV9iYXNlIDogX0lPX3Jl YWRfYmFzZTsgfQogICAgIAogICAgY2hhciAqZUdwdHIoKSB7IHJldHVybiBpbl9iYWNrdXAoKSA/ IF9JT19zYXZlX2VuZCA6IF9JT19yZWFkX2VuZDsgfQogICAgIAogICAgY2hhciAqQmJhc2UoKSB7 IHJldHVybiBpbl9iYWNrdXAoKSA/IF9JT19yZWFkX2Jhc2UgOiBfSU9fc2F2ZV9iYXNlOyB9CiAg ICBjaGFyICpCcHRyKCkgeyByZXR1cm4gX0lPX2JhY2t1cF9iYXNlOyB9CiAgICAgCiAgICBjaGFy ICplQnB0cigpIHsgcmV0dXJuIGluX2JhY2t1cCgpID8gX0lPX3JlYWRfZW5kIDogX0lPX3NhdmVf ZW5kOyB9CiAgICBjaGFyICpOYmFzZSgpIHsgcmV0dXJuIF9JT19zYXZlX2Jhc2U7IH0KICAgIGNo YXIgKmVOcHRyKCkgeyByZXR1cm4gX0lPX3NhdmVfZW5kOyB9CiAgICBpbnQgaGF2ZV9iYWNrdXAo KSB7IHJldHVybiBfSU9fc2F2ZV9iYXNlICE9IF9fbnVsbCA7IH0KICAgIGludCBoYXZlX21hcmtl cnMoKSB7IHJldHVybiBfbWFya2VycyAhPSBfX251bGwgOyB9CiAgICB2b2lkIGZyZWVfYmFja3Vw X2FyZWEoKTsKICAgIHZvaWQgdW5zYXZlX21hcmtlcnMoKTsgIAogICAgaW50IHB1dF9tb2RlKCkg eyByZXR1cm4gX2ZsYWdzICYgMHg4MDAgOyB9CiAgICBpbnQgc3dpdGNoX3RvX2dldF9tb2RlKCk7 CiAgICAKICAgIHN0cmVhbWJ1ZihpbnQgZmxhZ3M9MCk7CiAgcHVibGljOgogICAgc3RhdGljIGlu dCBmbHVzaF9hbGwoKTsKICAgIHN0YXRpYyB2b2lkIGZsdXNoX2FsbF9saW5lYnVmZmVyZWQoKTsg IAogICAgdmlydHVhbCB+c3RyZWFtYnVmKCk7CiAgICB2aXJ0dWFsIGludCBvdmVyZmxvdyhpbnQg YyA9ICgtMSkgKTsgIAogICAgdmlydHVhbCBpbnQgdW5kZXJmbG93KCk7ICAKICAgIHZpcnR1YWwg aW50IHVmbG93KCk7ICAKICAgIHZpcnR1YWwgaW50IHBiYWNrZmFpbChpbnQgYyk7CiAKICAgIHZp cnR1YWwgc3RyZWFtc2l6ZSB4c3B1dG4oY29uc3QgY2hhciogcywgc3RyZWFtc2l6ZSBuKTsKICAg IHZpcnR1YWwgc3RyZWFtc2l6ZSB4c2dldG4oY2hhciogcywgc3RyZWFtc2l6ZSBuKTsKICAgIHZp cnR1YWwgc3RyZWFtcG9zIHNlZWtvZmYoc3RyZWFtb2ZmLCBfc2Vla19kaXIsIGludCBtb2RlPWlv czo6aW58aW9zOjpvdXQpOwogICAgdmlydHVhbCBzdHJlYW1wb3Mgc2Vla3BvcyhzdHJlYW1wb3Mg cG9zLCBpbnQgbW9kZSA9IGlvczo6aW58aW9zOjpvdXQpOwoKICAgIHN0cmVhbXBvcyBwdWJzZWVr b2ZmKHN0cmVhbW9mZiBvLCBfc2Vla19kaXIgZCwgaW50IG1vZGU9aW9zOjppbnxpb3M6Om91dCkK ICAgICAgeyByZXR1cm4gX0lPX3NlZWtvZmYgKHRoaXMsIG8sIGQsIG1vZGUpOyB9CiAgICBzdHJl YW1wb3MgcHVic2Vla3BvcyhzdHJlYW1wb3MgcG9zLCBpbnQgbW9kZSA9IGlvczo6aW58aW9zOjpv dXQpCiAgICAgIHsgcmV0dXJuIF9JT19zZWVrcG9zICh0aGlzLCBwb3MsIG1vZGUpOyB9CiAgICBz dHJlYW1wb3Mgc3NlZWtvZmYoc3RyZWFtb2ZmLCBfc2Vla19kaXIsIGludCBtb2RlPWlvczo6aW58 aW9zOjpvdXQpOwogICAgc3RyZWFtcG9zIHNzZWVrcG9zKHN0cmVhbXBvcyBwb3MsIGludCBtb2Rl ID0gaW9zOjppbnxpb3M6Om91dCk7CiAgICB2aXJ0dWFsIHN0cmVhbWJ1Ziogc2V0YnVmKGNoYXIq IHAsIGludCBsZW4pOwogICAgdmlydHVhbCBpbnQgc3luYygpOwogICAgdmlydHVhbCBpbnQgZG9h bGxvY2F0ZSgpOwoKICAgIGludCBzZWVrbWFyayhzdHJlYW1tYXJrZXImIG1hcmssIGludCBkZWx0 YSA9IDApOwogICAgaW50IHNwdXRiYWNrYyhjaGFyIGMpOwogICAgaW50IHN1bmdldGMoKTsKICAg IGludCB1bmJ1ZmZlcmVkKCkgeyByZXR1cm4gX2ZsYWdzICYgMiAgPyAxIDogMDsgfQogICAgaW50 IGxpbmVidWZmZXJlZCgpIHsgcmV0dXJuIF9mbGFncyAmIDB4MjAwICA/IDEgOiAwOyB9CiAgICB2 b2lkIHVuYnVmZmVyZWQoaW50IGkpCgl7IGlmIChpKSBfZmxhZ3MgfD0gMiA7IGVsc2UgX2ZsYWdz ICY9IH4yIDsgfQogICAgdm9pZCBsaW5lYnVmZmVyZWQoaW50IGkpCgl7IGlmIChpKSBfZmxhZ3Mg fD0gMHgyMDAgOyBlbHNlIF9mbGFncyAmPSB+MHgyMDAgOyB9CiAgICBpbnQgYWxsb2NhdGUoKSB7 ICAKCWlmIChiYXNlKCkgfHwgdW5idWZmZXJlZCgpKSByZXR1cm4gMDsKCWVsc2UgcmV0dXJuIGRv YWxsb2NhdGUoKTsgfQogICAgIAogICAgdm9pZCBhbGxvY2J1ZigpIHsgaWYgKGJhc2UoKSA9PSBf X251bGwgKSBkb2FsbG9jYnVmKCk7IH0KICAgIHZvaWQgZG9hbGxvY2J1ZigpOwogICAgaW50IGlu X2F2YWlsKCkgeyByZXR1cm4gX0lPX3JlYWRfZW5kIC0gX0lPX3JlYWRfcHRyOyB9CiAgICBpbnQg b3V0X3dhaXRpbmcoKSB7IHJldHVybiBfSU9fd3JpdGVfcHRyIC0gX0lPX3dyaXRlX2Jhc2U7IH0K ICAgIHN0cmVhbXNpemUgc3B1dG4oY29uc3QgY2hhciogcywgc3RyZWFtc2l6ZSBuKSB7IHJldHVy biB4c3B1dG4ocywgbik7IH0KICAgIHN0cmVhbXNpemUgcGFkbihjaGFyIHBhZCwgc3RyZWFtc2l6 ZSBuKSB7IHJldHVybiBfSU9fcGFkbih0aGlzLCBwYWQsIG4pOyB9CiAgICBzdHJlYW1zaXplIHNn ZXRuKGNoYXIqIHMsIHN0cmVhbXNpemUgbikgeyByZXR1cm4gX0lPX3NnZXRuKHRoaXMsIHMsIG4p OyB9CiAgICBpbnQgaWdub3JlKGludCk7CiAgICBpbnQgZ2V0X2NvbHVtbigpOwogICAgaW50IHNl dF9jb2x1bW4oaW50KTsKICAgIGxvbmcgc2dldGxpbmUoY2hhciogYnVmLCBzaXplX3QgICBuLCBj aGFyIGRlbGltLCBpbnQgcHV0YmFja19kZWxpbSk7CiAgICBpbnQgc3B1dGMoaW50IGMpIHsgcmV0 dXJuIF9JT19wdXRjKGMsIHRoaXMpOyB9CiAgICBpbnQgc2J1bXBjKCkgeyByZXR1cm4gX0lPX2dl dGModGhpcyk7IH0KICAgIGludCBzZ2V0YygpIHsgcmV0dXJuICgoICB0aGlzICApLT5fSU9fcmVh ZF9wdHIgPj0gKCAgdGhpcyAgKS0+X0lPX3JlYWRfZW5kICYmIF9fdW5kZXJmbG93ICggIHRoaXMg ICkgPT0gKC0xKSAgPyAoLTEpICA6ICoodW5zaWduZWQgY2hhciAqKSAoICB0aGlzICApLT5fSU9f cmVhZF9wdHIpICA7IH0KICAgIGludCBzbmV4dGMoKSB7CglpZiAoX0lPX3JlYWRfcHRyID49IF9J T19yZWFkX2VuZCAmJiBfX3VuZGVyZmxvdyh0aGlzKSA9PSAoLTEpICkKCSAgcmV0dXJuICgtMSkg OwoJZWxzZSByZXR1cm4gX0lPX3JlYWRfcHRyKyssIHNnZXRjKCk7IH0KICAgIHZvaWQgc3Rvc3Nj KCkgeyBpZiAoX0lPX3JlYWRfcHRyIDwgX0lPX3JlYWRfZW5kKSBfSU9fcmVhZF9wdHIrKzsgfQog ICAgaW50IHZzY2FuKGNoYXIgY29uc3QgKmZtdDAsIF9fZ251Y192YV9saXN0ICBhcCwgaW9zKiBz dHJlYW0gPSBfX251bGwgKTsKICAgIGludCBzY2FuKGNoYXIgY29uc3QgKmZtdDAgLi4uKTsKICAg IGludCB2Zm9ybShjaGFyIGNvbnN0ICpmbXQwLCBfX2dudWNfdmFfbGlzdCAgYXApOwogICAgaW50 IGZvcm0oY2hhciBjb25zdCAqZm10MCAuLi4pOwoKCgoKICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSBz eXNfcmVhZChjaGFyKiBidWYsIHN0cmVhbXNpemUgc2l6ZSk7CiAgICB2aXJ0dWFsIHN0cmVhbXNp emUgc3lzX3dyaXRlKGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplKTsKICAgIHZpcnR1YWwgc3RyZWFt cG9zIHN5c19zZWVrKHN0cmVhbW9mZiwgX3NlZWtfZGlyKTsKICAgIHZpcnR1YWwgaW50IHN5c19j bG9zZSgpOwogICAgdmlydHVhbCBpbnQgc3lzX3N0YXQodm9pZCopOyAgCgogICAgdmlydHVhbCBp bnQgc2hvd21hbnljKCk7CiAgICB2aXJ0dWFsIHZvaWQgaW1idWUodm9pZCAqKTsKCn07CgogCiAK CmNsYXNzIGZpbGVidWYgOiBwdWJsaWMgc3RyZWFtYnVmIHsKICBwcm90ZWN0ZWQ6CiAgICB2b2lk IGluaXQoKTsKICBwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50IG9wZW5wcm90OyAgCiAgICBm aWxlYnVmKCk7CiAgICBmaWxlYnVmKGludCBmZCk7CiAgICBmaWxlYnVmKGludCBmZCwgY2hhciog cCwgaW50IGxlbik7CgoKCiAgICB+ZmlsZWJ1ZigpOwogICAgZmlsZWJ1ZiogYXR0YWNoKGludCBm ZCk7CiAgICBmaWxlYnVmKiBvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpt b2RlKTsKICAgIGZpbGVidWYqIG9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGlvczo6b3Blbm1v ZGUgbW9kZSwgaW50IHByb3QgPSAwNjY0KTsKICAgIHZpcnR1YWwgaW50IHVuZGVyZmxvdygpOwog ICAgdmlydHVhbCBpbnQgb3ZlcmZsb3coaW50IGMgPSAoLTEpICk7CiAgICBpbnQgaXNfb3Blbigp IGNvbnN0IHsgcmV0dXJuIF9maWxlbm8gPj0gMDsgfQogICAgaW50IGZkKCkgY29uc3QgeyByZXR1 cm4gaXNfb3BlbigpID8gX2ZpbGVubyA6ICgtMSkgOyB9CiAgICBmaWxlYnVmKiBjbG9zZSgpOwog ICAgdmlydHVhbCBpbnQgZG9hbGxvY2F0ZSgpOwogICAgdmlydHVhbCBzdHJlYW1wb3Mgc2Vla29m ZihzdHJlYW1vZmYsIF9zZWVrX2RpciwgaW50IG1vZGU9aW9zOjppbnxpb3M6Om91dCk7CiAgICB2 aXJ0dWFsIHN0cmVhbWJ1Ziogc2V0YnVmKGNoYXIqIHAsIGludCBsZW4pOwogICAgc3RyZWFtc2l6 ZSB4c3B1dG4oY29uc3QgY2hhciogcywgc3RyZWFtc2l6ZSBuKTsKICAgIHN0cmVhbXNpemUgeHNn ZXRuKGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CiAgICB2aXJ0dWFsIGludCBzeW5jKCk7CiAgcHJv dGVjdGVkOiAgCiAKICAgIGludCBpc19yZWFkaW5nKCkgeyByZXR1cm4gZWJhY2soKSAhPSBlZ3B0 cigpOyB9CiAgICBjaGFyKiBjdXJfcHRyKCkgeyByZXR1cm4gaXNfcmVhZGluZygpID8gIGdwdHIo KSA6IHBwdHIoKTsgfQogICAgIAogICAgY2hhciogZmlsZV9wdHIoKSB7IHJldHVybiBlR3B0cigp OyB9CiAgICAgCiAgICB2aXJ0dWFsIHN0cmVhbXNpemUgc3lzX3JlYWQoY2hhciogYnVmLCBzdHJl YW1zaXplIHNpemUpOwogICAgdmlydHVhbCBzdHJlYW1wb3Mgc3lzX3NlZWsoc3RyZWFtb2ZmLCBf c2Vla19kaXIpOwogICAgdmlydHVhbCBzdHJlYW1zaXplIHN5c193cml0ZShjb25zdCBjaGFyKiwg c3RyZWFtc2l6ZSk7CiAgICB2aXJ0dWFsIGludCBzeXNfc3RhdCh2b2lkKik7ICAKICAgIHZpcnR1 YWwgaW50IHN5c19jbG9zZSgpOwoKCgoKfTsKCmlubGluZSB2b2lkIGlvczo6aW5pdChzdHJlYW1i dWYqIHNiLCBvc3RyZWFtKiB0aWVfdG8pIHsKCQlfc3RhdGUgPSBzYiA/IGlvczo6Z29vZGJpdCA6 IGlvczo6YmFkYml0OyBfZXhjZXB0aW9ucz0wOwoJCV9zdHJidWY9c2I7IF90aWUgPSB0aWVfdG87 IF93aWR0aD0wOyBfZmlsbD0nICc7CgoJCV9mbGFncz1pb3M6OnNraXB3c3xpb3M6OmRlYzsKCgoK CQlfcHJlY2lzaW9uPTY7IF9hcnJheXMgPSAwOyB9CgppbmxpbmUgaW9zOjppb3Moc3RyZWFtYnVm KiBzYiwgb3N0cmVhbSogdGllX3RvKSB7IGluaXQoc2IsIHRpZV90byk7IH0KCmlubGluZSBpb3M6 On5pb3MoKSB7CgoKCiAgICAgCiAgICAgCiAgICBvcGVyYXRvciBkZWxldGVbXSAoX2FycmF5cyk7 Cn0KfSAgCgojIDMxICIvdXNyL2luY2x1ZGUvZysrL2lvc3RyZWFtLmgiIDIgMwoKCmV4dGVybiAi QysrIiB7CmNsYXNzIGlzdHJlYW07IGNsYXNzIG9zdHJlYW07CnR5cGVkZWYgaW9zJiAoKl9fbWFu aXApKGlvcyYpOwp0eXBlZGVmIGlzdHJlYW0mICgqX19pbWFuaXApKGlzdHJlYW0mKTsKdHlwZWRl ZiBvc3RyZWFtJiAoKl9fb21hbmlwKShvc3RyZWFtJik7CgpleHRlcm4gaXN0cmVhbSYgd3MoaXN0 cmVhbSYgaW5zKTsKZXh0ZXJuIG9zdHJlYW0mIGZsdXNoKG9zdHJlYW0mIG91dHMpOwpleHRlcm4g b3N0cmVhbSYgZW5kbChvc3RyZWFtJiBvdXRzKTsKZXh0ZXJuIG9zdHJlYW0mIGVuZHMob3N0cmVh bSYgb3V0cyk7CgpjbGFzcyBvc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgaW9zCnsKICAgICAKICAg IHZvaWQgZG9fb3NmeCgpOwogIHB1YmxpYzoKICAgIG9zdHJlYW0oKSB7IH0KICAgIG9zdHJlYW0o c3RyZWFtYnVmKiBzYiwgb3N0cmVhbSogdGllZD0gX19udWxsICk7CiAgICBpbnQgb3BmeCgpIHsK CWlmICghZ29vZCgpKSByZXR1cm4gMDsKCWVsc2UgeyBpZiAoX3RpZSkgX3RpZS0+Zmx1c2goKTsg IDsgcmV0dXJuIDE7fSB9CiAgICB2b2lkIG9zZngoKSB7ICA7CgkJICBpZiAoZmxhZ3MoKSAmIChp b3M6OnVuaXRidWZ8aW9zOjpzdGRpbykpCgkJICAgICAgZG9fb3NmeCgpOyB9CiAgICBvc3RyZWFt JiBmbHVzaCgpOwogICAgb3N0cmVhbSYgcHV0KGNoYXIgYykgeyBfc3RyYnVmLT5zcHV0YyhjKTsg cmV0dXJuICp0aGlzOyB9CgoKCgoKICAgIG9zdHJlYW0mIHdyaXRlKGNvbnN0IGNoYXIgKnMsIHN0 cmVhbXNpemUgbik7CiAgICBvc3RyZWFtJiB3cml0ZShjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBz dHJlYW1zaXplIG4pCiAgICAgIHsgcmV0dXJuIHdyaXRlKChjb25zdCBjaGFyKilzLCBuKTt9CiAg ICBvc3RyZWFtJiB3cml0ZShjb25zdCBzaWduZWQgY2hhciAqcywgc3RyZWFtc2l6ZSBuKQogICAg ICB7IHJldHVybiB3cml0ZSgoY29uc3QgY2hhciopcywgbik7fQogICAgb3N0cmVhbSYgd3JpdGUo Y29uc3Qgdm9pZCAqcywgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJldHVybiB3cml0ZSgoY29uc3Qg Y2hhciopcywgbik7fQogICAgb3N0cmVhbSYgc2Vla3Aoc3RyZWFtcG9zKTsKICAgIG9zdHJlYW0m IHNlZWtwKHN0cmVhbW9mZiwgX3NlZWtfZGlyKTsKICAgIHN0cmVhbXBvcyB0ZWxscCgpOwogICAg b3N0cmVhbSYgZm9ybShjb25zdCBjaGFyICpmb3JtYXQgLi4uKTsKICAgIG9zdHJlYW0mIHZmb3Jt KGNvbnN0IGNoYXIgKmZvcm1hdCwgX19nbnVjX3ZhX2xpc3QgIGFyZ3MpOwoKICAgIG9zdHJlYW0m IG9wZXJhdG9yPDwoY2hhciBjKTsKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgY2hh ciBjKSB7IHJldHVybiAoKnRoaXMpIDw8IChjaGFyKWM7IH0KICAgIG9zdHJlYW0mIG9wZXJhdG9y PDwoc2lnbmVkIGNoYXIgYykgeyByZXR1cm4gKCp0aGlzKSA8PCAoY2hhciljOyB9CiAgICBvc3Ry ZWFtJiBvcGVyYXRvcjw8KGNvbnN0IGNoYXIgKnMpOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChj b25zdCB1bnNpZ25lZCBjaGFyICpzKQoJeyByZXR1cm4gKCp0aGlzKSA8PCAoY29uc3QgY2hhciop czsgfQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCBzaWduZWQgY2hhciAqcykKCXsgcmV0 dXJuICgqdGhpcykgPDwgKGNvbnN0IGNoYXIqKXM7IH0KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwo Y29uc3Qgdm9pZCAqcCk7CiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGludCBuKTsKICAgIG9zdHJl YW0mIG9wZXJhdG9yPDwodW5zaWduZWQgaW50IG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChs b25nIG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIG4pOwoKICAgIF9f ZXh0ZW5zaW9uX18gb3N0cmVhbSYgb3BlcmF0b3I8PChsb25nIGxvbmcgbik7CiAgICBfX2V4dGVu c2lvbl9fIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBsb25nIG4pOwoKICAgIG9z dHJlYW0mIG9wZXJhdG9yPDwoc2hvcnQgbikge3JldHVybiBvcGVyYXRvcjw8KChpbnQpbik7fQog ICAgb3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBzaG9ydCBuKSB7cmV0dXJuIG9wZXJhdG9y PDwoKHVuc2lnbmVkIGludCluKTt9CgogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChib29sIGIpIHsg cmV0dXJuIG9wZXJhdG9yPDwoKGludCliKTsgfQoKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoZG91 YmxlIG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChmbG9hdCBuKSB7IHJldHVybiBvcGVyYXRv cjw8KChkb3VibGUpbik7IH0KCiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGxvbmcgZG91YmxlIG4p OwoKCgogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChfX29tYW5pcCBmdW5jKSB7IHJldHVybiAoKmZ1 bmMpKCp0aGlzKTsgfQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChfX21hbmlwIGZ1bmMpIHsoKmZ1 bmMpKCp0aGlzKTsgcmV0dXJuICp0aGlzO30KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoc3RyZWFt YnVmKik7CgoKCn07CgpjbGFzcyBpc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgaW9zCnsKICAgICAK cHJvdGVjdGVkOgogICAgc2l6ZV90ICAgX2djb3VudDsKCiAgICBpbnQgX3NraXBfd3MoKTsKICBw dWJsaWM6CiAgICBpc3RyZWFtKCk6IF9nY291bnQgKDApIHsgfQogICAgaXN0cmVhbShzdHJlYW1i dWYqIHNiLCBvc3RyZWFtKnRpZWQ9IF9fbnVsbCApOwogICAgaXN0cmVhbSYgZ2V0KGNoYXIqIHB0 ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpOwogICAgaXN0cmVhbSYgZ2V0KHVuc2lnbmVk IGNoYXIqIHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpCgl7IHJldHVybiBnZXQoKGNo YXIqKXB0ciwgbGVuLCBkZWxpbSk7IH0KICAgIGlzdHJlYW0mIGdldChjaGFyJiBjKTsKICAgIGlz dHJlYW0mIGdldCh1bnNpZ25lZCBjaGFyJiBjKSB7IHJldHVybiBnZXQoKGNoYXImKWMpOyB9CiAg ICBpc3RyZWFtJiBnZXRsaW5lKGNoYXIqIHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicp OwogICAgaXN0cmVhbSYgZ2V0bGluZSh1bnNpZ25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIg ZGVsaW0gPSAnXG4nKQoJeyByZXR1cm4gZ2V0bGluZSgoY2hhciopcHRyLCBsZW4sIGRlbGltKTsg fQogICAgaXN0cmVhbSYgZ2V0KHNpZ25lZCBjaGFyJiBjKSAgeyByZXR1cm4gZ2V0KChjaGFyJilj KTsgfQogICAgaXN0cmVhbSYgZ2V0KHNpZ25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVs aW0gPSAnXG4nKQoJeyByZXR1cm4gZ2V0KChjaGFyKilwdHIsIGxlbiwgZGVsaW0pOyB9CiAgICBp c3RyZWFtJiBnZXRsaW5lKHNpZ25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0gPSAn XG4nKQoJeyByZXR1cm4gZ2V0bGluZSgoY2hhciopcHRyLCBsZW4sIGRlbGltKTsgfQogICAgaXN0 cmVhbSYgcmVhZChjaGFyICpwdHIsIHN0cmVhbXNpemUgbik7CiAgICBpc3RyZWFtJiByZWFkKHVu c2lnbmVkIGNoYXIgKnB0ciwgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJldHVybiByZWFkKChjaGFy KilwdHIsIG4pOyB9CiAgICBpc3RyZWFtJiByZWFkKHNpZ25lZCBjaGFyICpwdHIsIHN0cmVhbXNp emUgbikKICAgICAgeyByZXR1cm4gcmVhZCgoY2hhciopcHRyLCBuKTsgfQogICAgaXN0cmVhbSYg cmVhZCh2b2lkICpwdHIsIHN0cmVhbXNpemUgbikKICAgICAgeyByZXR1cm4gcmVhZCgoY2hhciop cHRyLCBuKTsgfQogICAgaXN0cmVhbSYgZ2V0KHN0cmVhbWJ1ZiYgc2IsIGNoYXIgZGVsaW0gPSAn XG4nKTsKICAgIGlzdHJlYW0mIGdldHMoY2hhciAqKnMsIGNoYXIgZGVsaW0gPSAnXG4nKTsKICAg IGludCBpcGZ4KGludCBuZWVkID0gMCkgewoJaWYgKCFnb29kKCkpIHsgc2V0KGlvczo6ZmFpbGJp dCk7IHJldHVybiAwOyB9CgllbHNlIHsKCSAgIDsKCSAgaWYgKF90aWUgJiYgKG5lZWQgPT0gMCB8 fCByZGJ1ZigpLT5pbl9hdmFpbCgpIDwgbmVlZCkpIF90aWUtPmZsdXNoKCk7CgkgIGlmICghbmVl ZCAmJiAoZmxhZ3MoKSAmIGlvczo6c2tpcHdzKSkgcmV0dXJuIF9za2lwX3dzKCk7CgkgIGVsc2Ug cmV0dXJuIDE7Cgl9CiAgICB9CiAgICBpbnQgaXBmeDAoKSB7ICAKCWlmICghZ29vZCgpKSB7IHNl dChpb3M6OmZhaWxiaXQpOyByZXR1cm4gMDsgfQoJZWxzZSB7CgkgICA7CgkgIGlmIChfdGllKSBf dGllLT5mbHVzaCgpOwoJICBpZiAoZmxhZ3MoKSAmIGlvczo6c2tpcHdzKSByZXR1cm4gX3NraXBf d3MoKTsKCSAgZWxzZSByZXR1cm4gMTsKCX0KICAgIH0KICAgIGludCBpcGZ4MSgpIHsgIAoJaWYg KCFnb29kKCkpIHsgc2V0KGlvczo6ZmFpbGJpdCk7IHJldHVybiAwOyB9CgllbHNlIHsKCSAgIDsK CSAgaWYgKF90aWUgJiYgcmRidWYoKS0+aW5fYXZhaWwoKSA9PSAwKSBfdGllLT5mbHVzaCgpOwoJ ICByZXR1cm4gMTsKCX0KICAgIH0KICAgIHZvaWQgaXNmeCgpIHsgIDsgfQogICAgaW50IGdldCgp IHsgaWYgKCFpcGZ4MSgpKSByZXR1cm4gKC0xKSA7CgkJZWxzZSB7IGludCBjaCA9IF9zdHJidWYt PnNidW1wYygpOwoJCSAgICAgICBpZiAoY2ggPT0gKC0xKSApIHNldChpb3M6OmVvZmJpdCk7CgkJ ICAgICAgIGlzZngoKTsKCQkgICAgICAgcmV0dXJuIGNoOwoJCSAgICAgfSB9CiAgICBpbnQgcGVl aygpOwogICAgc2l6ZV90ICAgZ2NvdW50KCkgeyByZXR1cm4gX2djb3VudDsgfQogICAgaXN0cmVh bSYgaWdub3JlKGludCBuPTEsIGludCBkZWxpbSA9ICgtMSkgKTsKICAgIGludCBzeW5jICgpOwog ICAgaXN0cmVhbSYgc2Vla2coc3RyZWFtcG9zKTsKICAgIGlzdHJlYW0mIHNlZWtnKHN0cmVhbW9m ZiwgX3NlZWtfZGlyKTsKICAgIHN0cmVhbXBvcyB0ZWxsZygpOwogICAgaXN0cmVhbSYgcHV0YmFj ayhjaGFyIGNoKSB7CglpZiAoZ29vZCgpICYmIF9zdHJidWYtPnNwdXRiYWNrYyhjaCkgPT0gKC0x KSApIGNsZWFyKGlvczo6YmFkYml0KTsKCXJldHVybiAqdGhpczt9CiAgICBpc3RyZWFtJiB1bmdl dCgpIHsKCWlmIChnb29kKCkgJiYgX3N0cmJ1Zi0+c3VuZ2V0YygpID09ICgtMSkgKSBjbGVhcihp b3M6OmJhZGJpdCk7CglyZXR1cm4gKnRoaXM7fQogICAgaXN0cmVhbSYgc2Nhbihjb25zdCBjaGFy ICpmb3JtYXQgLi4uKTsKICAgIGlzdHJlYW0mIHZzY2FuKGNvbnN0IGNoYXIgKmZvcm1hdCwgX19n bnVjX3ZhX2xpc3QgIGFyZ3MpOwoKCgoKCgogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihjaGFyKik7 CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIGNoYXIqIHApIHsgcmV0dXJuIG9wZXJh dG9yPj4oKGNoYXIqKXApOyB9CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHNpZ25lZCBjaGFyKnAp IHsgcmV0dXJuIG9wZXJhdG9yPj4oKGNoYXIqKXApOyB9CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+ KGNoYXImIGMpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBjaGFyJiBjKSB7cmV0 dXJuIG9wZXJhdG9yPj4oKGNoYXImKWMpO30KICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4oc2lnbmVk IGNoYXImIGMpIHtyZXR1cm4gb3BlcmF0b3I+PigoY2hhciYpYyk7fQogICAgaXN0cmVhbSYgb3Bl cmF0b3I+PihpbnQmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4obG9uZyYpOwoKICAgIF9fZXh0 ZW5zaW9uX18gaXN0cmVhbSYgb3BlcmF0b3I+Pihsb25nIGxvbmcmKTsKICAgIF9fZXh0ZW5zaW9u X18gaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nIGxvbmcmKTsKCiAgICBpc3RyZWFt JiBvcGVyYXRvcj4+KHNob3J0Jik7CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIGlu dCYpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nJik7CiAgICBpc3RyZWFt JiBvcGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0Jik7CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pihi b29sJik7CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihmbG9hdCYpOwogICAgaXN0cmVhbSYgb3Bl cmF0b3I+Pihkb3VibGUmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4obG9uZyBkb3VibGUmKTsK ICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4oIF9fbWFuaXAgZnVuYykgeygqZnVuYykoKnRoaXMpOyBy ZXR1cm4gKnRoaXM7fQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihfX2ltYW5pcCBmdW5jKSB7IHJl dHVybiAoKmZ1bmMpKCp0aGlzKTsgfQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihzdHJlYW1idWYq KTsKfTsKCmNsYXNzIGlvc3RyZWFtIDogcHVibGljIGlzdHJlYW0sIHB1YmxpYyBvc3RyZWFtCnsK ICBwdWJsaWM6CiAgICBpb3N0cmVhbSgpIHsgfQogICAgaW9zdHJlYW0oc3RyZWFtYnVmKiBzYiwg b3N0cmVhbSp0aWVkPSBfX251bGwgKTsKfTsKCmNsYXNzIF9JT19pc3RyZWFtX3dpdGhhc3NpZ24g OiBwdWJsaWMgaXN0cmVhbSB7CnB1YmxpYzoKICBfSU9faXN0cmVhbV93aXRoYXNzaWduJiBvcGVy YXRvcj0oaXN0cmVhbSYpOwogIF9JT19pc3RyZWFtX3dpdGhhc3NpZ24mIG9wZXJhdG9yPShfSU9f aXN0cmVhbV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJldHVybiBvcGVyYXRvcj0gKHN0YXRpY19j YXN0PGlzdHJlYW0mPiAocmhzKSk7IH0KfTsKCmNsYXNzIF9JT19vc3RyZWFtX3dpdGhhc3NpZ24g OiBwdWJsaWMgb3N0cmVhbSB7CnB1YmxpYzoKICBfSU9fb3N0cmVhbV93aXRoYXNzaWduJiBvcGVy YXRvcj0ob3N0cmVhbSYpOwogIF9JT19vc3RyZWFtX3dpdGhhc3NpZ24mIG9wZXJhdG9yPShfSU9f b3N0cmVhbV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJldHVybiBvcGVyYXRvcj0gKHN0YXRpY19j YXN0PG9zdHJlYW0mPiAocmhzKSk7IH0KfTsKCmV4dGVybiBfSU9faXN0cmVhbV93aXRoYXNzaWdu IGNpbjsKIApleHRlcm4gX0lPX29zdHJlYW1fd2l0aGFzc2lnbiBjb3V0LCBjZXJyOwoKZXh0ZXJu IF9JT19vc3RyZWFtX3dpdGhhc3NpZ24gY2xvZwoKCgo7CgpleHRlcm4gaXN0cmVhbSYgbG9jayhp c3RyZWFtJiBpbnMpOwpleHRlcm4gaXN0cmVhbSYgdW5sb2NrKGlzdHJlYW0mIGlucyk7CmV4dGVy biBvc3RyZWFtJiBsb2NrKG9zdHJlYW0mIG91dHMpOwpleHRlcm4gb3N0cmVhbSYgdW5sb2NrKG9z dHJlYW0mIG91dHMpOwoKc3RydWN0IElvc3RyZWFtX2luaXQgeyB9IDsgICAKCmlubGluZSBpb3Mm IGRlYyhpb3MmIGkpCnsgaS5zZXRmKGlvczo6ZGVjLCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9j dCk7IHJldHVybiBpOyB9CmlubGluZSBpb3MmIGhleChpb3MmIGkpCnsgaS5zZXRmKGlvczo6aGV4 LCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJldHVybiBpOyB9CmlubGluZSBpb3MmIG9j dChpb3MmIGkpCnsgaS5zZXRmKGlvczo6b2N0LCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7 IHJldHVybiBpOyB9Cn0gIAoKCiMgNiAiL3Vzci9pbmNsdWRlL2crKy9pb3N0cmVhbSIgMiAzCgoK IyA4ICIuLi9pbmNsdWRlL1RhYmxlLmgiIDIKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBj LWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCiMgMzQyICIvdXNyL2xpYi9n Y2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgojIDkg Ii4uL2luY2x1ZGUvVGFibGUuaCIgMgoKIyAxICIuLi9pbmNsdWRlL3N1cHBvcnQuaCIgMQogCgoK CgoKCgoKCnR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICBieXRlOwp0eXBlZGVmIHNob3J0IHVu c2lnbmVkIGludCAgd29yZDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIHVpbnQ7CgoKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKY2xhc3MgRGF0YQp7 CnB1YmxpYzoKCXZpcnR1YWwgfkRhdGEoKTsKCgl2aXJ0dWFsIHZvaWQgUmVjZWl2ZSh2b2lkKiwg dWludCk7Cgl2aXJ0dWFsIHZvaWQgRmVlZFRvKERhdGEgKik7Cgl2aXJ0dWFsIHZvaWQgU3RvcFJl Y2VpdmluZygpOwoJdmlydHVhbCB2b2lkIEJyZWFrKCk7Cn07Cgp0eXBlZGVmIERhdGEgTnVsbDsK Cgpib29sIElzV2hpdGVTcGFjZShjaGFyIGMpOwpjaGFyICpTdHJpbmdOZXdlZFVwKGNoYXIgKnNy Yyk7Cgp2b2lkICpBbGxvY01lbShzaXplX3Qgc2l6ZSk7CnZvaWQgRnJlZU1lbSh2b2lkICpkYXRh KTsKdm9pZCAqUmVhbGxvY01lbSh2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CgoKIAoKCgoKCmNs YXNzIEZlZWRlckJhc2UgCnsKcHVibGljOgoJRmVlZGVyQmFzZSh1aW50IGJ1ZnNpemUgPSA0MDAg KTsKCX5GZWVkZXJCYXNlKCk7CgkKCXZvaWQgU2V0RGVzdGluYXRpb24oRGF0YSAqZGF0YWMpCgkJ e0Rlc3RpbmF0aW9uID0gZGF0YWM7fQoKcHJvdGVjdGVkOgkJCgl2b2lkIFNlbmRDaGFyKGNoYXIg Yyk7Cgl2b2lkIER1bXBCdWZmZXJlZERhdGEoKTsKCiAgYnl0ZSAqRHN0OwogIHVpbnQgQnVmTGVu OwogIHZvaWQgKkJ1ZmZlcjsKICBEYXRhICpEZXN0aW5hdGlvbjsKfTsKCgoKIAoKCmNsYXNzIEJ5 dGVEdW1wZXIgOiBwdWJsaWMgRmVlZGVyQmFzZSwgcHVibGljIERhdGEKewpwdWJsaWM6CglCeXRl RHVtcGVyKERhdGEgKmRhdGFjID0gMCkKCQl7RGVzdGluYXRpb24gPSBkYXRhYzt9CgoJdm9pZCBS ZWNlaXZlKHZvaWQgKmRhdGEsIHVpbnQgbGVuKTsKCXZvaWQgU3RvcFJlY2VpdmluZygpOwp9OwoK CiMgMTAgIi4uL2luY2x1ZGUvVGFibGUuaCIgMgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2 LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9uZXciIDEgMwogCiAKCgoKCiNwcmFnbWEgaW50 ZXJmYWNlICJuZXciCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1 LjIvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCiMgMzQyICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMt bGludXgtZ251LzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzCgojIDggIi91c3IvbGliL2djYy1s aWIvaTU4Ni1wYy1saW51eC1nbnUvMi45NS4yL2luY2x1ZGUvbmV3IiAyIDMKCiMgMSAiL3Vzci9s aWIvZ2NjLWxpYi9pNTg2LXBjLWxpbnV4LWdudS8yLjk1LjIvaW5jbHVkZS9leGNlcHRpb24iIDEg MwogCiAKCgoKCiNwcmFnbWEgaW50ZXJmYWNlICJleGNlcHRpb24iCgpleHRlcm4gIkMrKyIgewoK bmFtZXNwYWNlIHN0ZCB7CgpjbGFzcyBleGNlcHRpb24gewpwdWJsaWM6CiAgZXhjZXB0aW9uICgp IHsgfQogIHZpcnR1YWwgfmV4Y2VwdGlvbiAoKSB7IH0KICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdo YXQgKCkgY29uc3Q7Cn07CgpjbGFzcyBiYWRfZXhjZXB0aW9uIDogcHVibGljIGV4Y2VwdGlvbiB7 CnB1YmxpYzoKICBiYWRfZXhjZXB0aW9uICgpIHsgfQogIHZpcnR1YWwgfmJhZF9leGNlcHRpb24g KCkgeyB9Cn07Cgp0eXBlZGVmIHZvaWQgKCp0ZXJtaW5hdGVfaGFuZGxlcikgKCk7CnR5cGVkZWYg dm9pZCAoKnVuZXhwZWN0ZWRfaGFuZGxlcikgKCk7Cgp0ZXJtaW5hdGVfaGFuZGxlciBzZXRfdGVy bWluYXRlICh0ZXJtaW5hdGVfaGFuZGxlcik7CnZvaWQgdGVybWluYXRlICgpIF9fYXR0cmlidXRl X18gKChfX25vcmV0dXJuX18pKTsKdW5leHBlY3RlZF9oYW5kbGVyIHNldF91bmV4cGVjdGVkICh1 bmV4cGVjdGVkX2hhbmRsZXIpOwp2b2lkIHVuZXhwZWN0ZWQgKCkgX19hdHRyaWJ1dGVfXyAoKF9f bm9yZXR1cm5fXykpOwpib29sIHVuY2F1Z2h0X2V4Y2VwdGlvbiAoKTsKCn0gIAoKfSAgCgoKIyA5 ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtcGMtbGludXgtZ251LzIuOTUuMi9pbmNsdWRlL25ldyIg MiAzCgoKZXh0ZXJuICJDKysiIHsKCm5hbWVzcGFjZSBzdGQgewoKICBjbGFzcyBiYWRfYWxsb2Mg OiBwdWJsaWMgZXhjZXB0aW9uIHsKICBwdWJsaWM6CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdo YXQoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuICJiYWRfYWxsb2MiOyB9CiAgfTsKCiAgc3RydWN0 IG5vdGhyb3dfdCB7fTsKICBleHRlcm4gY29uc3Qgbm90aHJvd190IG5vdGhyb3c7CiAgdHlwZWRl ZiB2b2lkICgqbmV3X2hhbmRsZXIpKCk7CiAgbmV3X2hhbmRsZXIgc2V0X25ld19oYW5kbGVyIChu ZXdfaGFuZGxlcik7Cgp9ICAKCiAKdm9pZCAqb3BlcmF0b3IgbmV3IChzaXplX3QpIHRocm93IChz dGQ6OmJhZF9hbGxvYyk7CnZvaWQgKm9wZXJhdG9yIG5ld1tdIChzaXplX3QpIHRocm93IChzdGQ6 OmJhZF9hbGxvYyk7CnZvaWQgb3BlcmF0b3IgZGVsZXRlICh2b2lkICopIHRocm93KCk7CnZvaWQg b3BlcmF0b3IgZGVsZXRlW10gKHZvaWQgKikgdGhyb3coKTsKdm9pZCAqb3BlcmF0b3IgbmV3IChz aXplX3QsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKTsKdm9pZCAqb3BlcmF0b3IgbmV3 W10gKHNpemVfdCwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpOwp2b2lkIG9wZXJhdG9y IGRlbGV0ZSAodm9pZCAqLCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCk7CnZvaWQgb3Bl cmF0b3IgZGVsZXRlW10gKHZvaWQgKiwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpOwoK IAppbmxpbmUgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgdm9pZCAqcGxhY2UpIHRocm93KCkg eyByZXR1cm4gcGxhY2U7IH0KaW5saW5lIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHNpemVfdCwgdm9p ZCAqcGxhY2UpIHRocm93KCkgeyByZXR1cm4gcGxhY2U7IH0KfSAgCgoKIyAxMiAiLi4vaW5jbHVk ZS9UYWJsZS5oIiAyCgogCgp0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBCYXNlVGFibGUKewpwdWJs aWM6CgkgCglCYXNlVGFibGUoKSAKCQk6IFRhYmxlKDApLCBUYWJsZUxlbmd0aCgwKSwgQWxsb2Nh dGVkTGVuZ3RoKDApIHsgfQoKCVQgKlRhYmxlOwoJaW50IFRhYmxlTGVuZ3RoOwoJaW50IEFsbG9j YXRlZExlbmd0aDsKfTsKCnRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEV4cG5UYWJsZSA6IHB1Ymxp YyBCYXNlVGFibGU8VD4KewpwdWJsaWM6IAoJdm9pZCBVcFJlc2l6ZVRvRml0KGludCBsZW4pOwoJ dm9pZCBEb3duUmVzaXplVG9GaXQoKTsKfTsKCnRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgRXhwblRh YmxlPFQ+OjpVcFJlc2l6ZVRvRml0KGludCBsZW4pCnsKCSAKCWlmICggbGVuID4gQWxsb2NhdGVk TGVuZ3RoICkKCXsKCQkgCgkJQWxsb2NhdGVkTGVuZ3RoID0gbGVuICogMjsKCQlpZiAoVGFibGUp IHsKCQkJIAoJCQlUICpuZXdUYWJsZSA9IChUKikgbWFsbG9jKHNpemVvZihUKSpBbGxvY2F0ZWRM ZW5ndGgpOwoJCQltZW1jcHkobmV3VGFibGUsIFRhYmxlLCBzaXplb2YoVCkqVGFibGVMZW5ndGgp OwoKCQkJIAoJCQlmcmVlKFRhYmxlKTsKCQkJVGFibGUgPSBuZXdUYWJsZTsKCQl9CgkJZWxzZSB7 CgkJCSAKCQkJVGFibGUgPSAoVCopIG1hbGxvYyhzaXplb2YoVCkqQWxsb2NhdGVkTGVuZ3RoKTsK CQl9Cgl9Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgRXhwblRhYmxlPFQ+OjpEb3duUmVzaXpl VG9GaXQoKQp7CgkgCgoJaWYgKCBUYWJsZUxlbmd0aCA8IEFsbG9jYXRlZExlbmd0aCAvIDQgKSB7 CgkJaWYgKCBUYWJsZUxlbmd0aCA9PSAwICkgewoJCQkgCgkJCUFsbG9jYXRlZExlbmd0aCA9IDA7 CgkJCWZyZWUoVGFibGUpOwoJCQlUYWJsZSA9IDA7CgkJfQoJCWVsc2UgewoJCQkgCgkJCUFsbG9j YXRlZExlbmd0aCA9IFRhYmxlTGVuZ3RoICogMjsKCgkJCSAKCQkJVCAqbmV3VGFibGUgPSAoVCop IG1hbGxvYyhzaXplb2YoVCkqQWxsb2NhdGVkTGVuZ3RoKTsKCQkJbWVtY3B5KG5ld1RhYmxlLCBU YWJsZSwgc2l6ZW9mKFQpKlRhYmxlTGVuZ3RoKTsKCgkJCSAKCQkJZnJlZShUYWJsZSk7CgkJCVRh YmxlID0gbmV3VGFibGU7CgkJfQoJfQp9Cgp0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBMaW5lYXJU YWJsZSA6IHB1YmxpYyBCYXNlVGFibGU8VD4KewpwdWJsaWM6IAoJdm9pZCBVcFJlc2l6ZVRvRml0 KGludCBsZW4pOwoJdm9pZCBEb3duUmVzaXplVG9GaXQoKTsKfTsKCnRlbXBsYXRlPGNsYXNzIFQ+ IHZvaWQgTGluZWFyVGFibGU8VD46OlVwUmVzaXplVG9GaXQoaW50IGxlbikKewoJaWYgKFRhYmxl KSB7CgkJIAoJCUFsbG9jYXRlZExlbmd0aCA9IGxlbjsKCgkJIAoJCVQgKm5ld1RhYmxlID0gKFQq KSBtYWxsb2Moc2l6ZW9mKFQpKkFsbG9jYXRlZExlbmd0aCk7CgkJbWVtY3B5KG5ld1RhYmxlLCBU YWJsZSwgc2l6ZW9mKFQpKlRhYmxlTGVuZ3RoKTsKCgkJIAoJCWZyZWUoVGFibGUpOwoJCVRhYmxl ID0gbmV3VGFibGU7Cgl9CgllbHNlIHsKCQkgCgkJQWxsb2NhdGVkTGVuZ3RoID0gbGVuOwoKCQkg CgkJVGFibGUgPSAoVCopIG1hbGxvYyhzaXplb2YoVCkqQWxsb2NhdGVkTGVuZ3RoKTsKCX0KfQoK dGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBMaW5lYXJUYWJsZTxUPjo6RG93blJlc2l6ZVRvRml0KCkK ewoJaWYgKCBUYWJsZUxlbmd0aCA9PSAwICkgewoJCSAKCQlBbGxvY2F0ZWRMZW5ndGggPSAwOwoJ CSAKCQlmcmVlKFRhYmxlKTsKCQlUYWJsZSA9IDA7Cgl9CgllbHNlIHsKCQkgCgkJQWxsb2NhdGVk TGVuZ3RoID0gVGFibGVMZW5ndGg7CgoJCSAKCQlUICpuZXdUYWJsZSA9IChUKikgbWFsbG9jKHNp emVvZihUKSpBbGxvY2F0ZWRMZW5ndGgpOwoJCW1lbWNweShuZXdUYWJsZSwgVGFibGUsIHNpemVv ZihUKSpUYWJsZUxlbmd0aCk7CgkJCgkJIAoJCWZyZWUoVGFibGUpOwoJCVRhYmxlID0gbmV3VGFi bGU7Cgl9Cn0KCnRlbXBsYXRlPGNsYXNzIFQsIGludCBGaXhlZFNpemU+IGNsYXNzIENvbnN0VGFi bGUgOiBwdWJsaWMgQmFzZVRhYmxlPFQ+CnsKcHVibGljOiAKCXZvaWQgVXBSZXNpemVUb0ZpdChp bnQgbGVuKTsKCXZvaWQgRG93blJlc2l6ZVRvRml0KCkge307Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBU LCBpbnQgRml4ZWRTaXplPiB2b2lkIENvbnN0VGFibGU8VCwgRml4ZWRTaXplPjo6VXBSZXNpemVU b0ZpdChpbnQgbGVuKSAKewoJaWYgKCEoICBsZW4gPD0gRml4ZWRTaXplICApKSB7IGNlcnIgPDwg IkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgIiA8PCAxNDUgPDwgIiBmaWxlICIgPDwgIi4uL2luY2x1 ZGUvVGFibGUuaCIgPDwgIlxuIjsgYWJvcnQoKTsgfSA7CglpZiAoIFRhYmxlID09IDAgKSB7CgkJ VGFibGUgPSAoVCopIG1hbGxvYyggc2l6ZW9mKFQpICogRml4ZWRTaXplICk7CgkJQWxsb2NhdGVk TGVuZ3RoID0gRml4ZWRTaXplOwoJfQp9CgoKCiMgNyAiLi4vaW5jbHVkZS9Db21wYXJlLmgiIDIK CgogCgoKc3RydWN0IFN0cmluZ0NvbXBhcmUKewoJc3RhdGljIGlubGluZSBpbnQgQ29tcGFyZShj b25zdCBjaGFyICprMSwgY29uc3QgY2hhciAqazIpCgkJeyByZXR1cm4gc3RyY21wKGsxLCBrMik7 IH0KfTsKCiAKCgp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgT3JkaW5hbENvbXBhcmUKewoJc3Rh dGljIGlubGluZSBpbnQgQ29tcGFyZShjb25zdCBUIGsxLCBjb25zdCBUIGsyKQoJewoJCWlmIChr MSA8IGsyKQoJCQlyZXR1cm4gLTE7CgkJZWxzZSBpZiAoazEgPiBrMikKCQkJcmV0dXJuIDE7CgkJ ZWxzZQoJCQlyZXR1cm4gMDsKCX0KfTsKCiAKCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBDb21w YXJlQ2xhc3M+IHN0cnVjdCBUYWJsZUNvbXBhcmUKewoJc3RhdGljIGlubGluZSBpbnQgQ29tcGFy ZShjb25zdCBCYXNlVGFibGU8VD4gJnQxLCBjb25zdCBCYXNlVGFibGU8VD4gJnQyKQoJewoJCWlm ICggdDEuVGFibGVMZW5ndGggPCB0Mi5UYWJsZUxlbmd0aCApCgkJCXJldHVybiAtMTsKCQllbHNl IGlmICggdDEuVGFibGVMZW5ndGggPiB0Mi5UYWJsZUxlbmd0aCApCgkJCXJldHVybiAxOwoJCWVs c2UKCQl7CgkJCVQgKmkxID0gdDEuVGFibGUsICppMiA9IHQyLlRhYmxlOwoJCQlpbnQgbGVuID0g dDEuVGFibGVMZW5ndGgsIGNtcFJlc3VsdDsKCQkJZm9yICggaW50IHBvcyA9IDA7IHBvcyA8IGxl bjsKCQkJCQlwb3MgKz0gMSwgaTEgKz0gMSwgaTIgKz0gMSApCgkJCXsKCQkJCWNtcFJlc3VsdCA9 IENvbXBhcmVDbGFzczo6Q29tcGFyZSgqaTEsICppMik7CgkJCQlpZiAoIGNtcFJlc3VsdCAhPSAw ICkKCQkJCQlyZXR1cm4gY21wUmVzdWx0OwoJCQl9CgkJCXJldHVybiAwOwoJCX0KCX0KfTsKCgoj IDEwICIuLi9pbmNsdWRlL1ZlY3RvclNldC5oIiAyCgojIDEgIi4uL2luY2x1ZGUvVmVjdG9yLmgi IDEKIAoKCgoKCgoKCgoKIAoKCnRlbXBsYXRlIDwKCQkJY2xhc3MgVCwKCQkJY2xhc3MgVGFibGVU ID0gRXhwblRhYmxlPFQ+CgkJPiBjbGFzcyBWZWN0b3IgOiBwdWJsaWMgVGFibGVUCnsKcHVibGlj OgoJIAoJVmVjdG9yKCkge30KCgkgCglWZWN0b3IoY29uc3QgVmVjdG9yICZ2KTsKCgkgCglWZWN0 b3IoIGludCBzaXplICkgeyBTZXRBcyggMCwgc2l6ZSApOyB9CgoJIAoJflZlY3RvcigpIHsgRW1w dHkoKTsgfQoKCSAKCXZvaWQgRW1wdHkoKTsKCgkgCiAJaW50IE1ha2VSYXdTcGFjZUZvcihpbnQg cG9zLCBpbnQgbGVuKTsKCXZvaWQgSW5zZXJ0KGludCBwb3MsIGNvbnN0IFQgJnZhbCkgICB7IElu c2VydChwb3MsICZ2YWwsIDEpOyB9CgkgCgl2b2lkIEluc2VydChpbnQgcG9zLCBjb25zdCBUICp2 YWwsIGludCBsZW4pOwoJdm9pZCBJbnNlcnQoaW50IHBvcywgY29uc3QgVmVjdG9yICZ2KSAgIHsg SW5zZXJ0KHBvcywgdi5UYWJsZSwgdi5UYWJsZUxlbmd0aCk7IH0KCgkgCgl2b2lkIERlbGV0ZShp bnQgcG9zKSAgICAgICAgICAgICAgeyBEZWxldGUocG9zLCAxKTsgfQoJdm9pZCBEZWxldGUoaW50 IHBvcywgaW50IGxlbik7CgoJIAoJdm9pZCBPdmVyd3JpdGUoaW50IHBvcywgY29uc3QgVCAmdmFs KSAgIHsgT3ZlcndyaXRlKHBvcywgJnZhbCwgMSk7IH0KCSAKCXZvaWQgT3ZlcndyaXRlKGludCBw b3MsIGNvbnN0IFQgKnZhbCwgaW50IGxlbik7Cgl2b2lkIE92ZXJ3cml0ZShpbnQgcG9zLCBjb25z dCBWZWN0b3IgJnYpCgkJCXsgT3ZlcndyaXRlKCBwb3MsIHYuVGFibGUsIHYuVGFibGVMZW5ndGgg KTsgfQoKCSAKCXZvaWQgU2V0QXMoY29uc3QgVCAmdmFsKSAgICAgICAgICAgICAgICB7IFNldEFz KCZ2YWwsIDEpOyB9CgkgCgl2b2lkIFNldEFzKGNvbnN0IFQgKnZhbCwgaW50IGxlbik7Cgl2b2lk IFNldEFzKGNvbnN0IFZlY3RvciAmdikgICAgICAgICAgICAgeyBTZXRBcyh2LlRhYmxlLCB2LlRh YmxlTGVuZ3RoKTsgfQoKCSAKCXZvaWQgQXBwZW5kKGNvbnN0IFQgJnZhbCkgICAgICAgICAgICAg ICB7IE92ZXJ3cml0ZShUYWJsZUxlbmd0aCwgJnZhbCwgMSk7IH0KCSAKCXZvaWQgQXBwZW5kKGNv bnN0IFQgKnZhbCwgaW50IGxlbikgICAgICB7IE92ZXJ3cml0ZShUYWJsZUxlbmd0aCwgdmFsLCBs ZW4pOyB9Cgl2b2lkIEFwcGVuZChjb25zdCBWZWN0b3IgJnYpICAgICAgICAgIAoJCQl7IE92ZXJ3 cml0ZShUYWJsZUxlbmd0aCwgdi5UYWJsZSwgdi5UYWJsZUxlbmd0aCk7IH0KCn07CgogCgoKCgoK CnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFRhYmxlVD4gVmVjdG9yPFQsIFRhYmxlVD46OgoJCQlW ZWN0b3IoY29uc3QgVmVjdG9yICZ2KQp7CglUYWJsZUxlbmd0aCA9IHYuVGFibGVMZW5ndGg7CglB bGxvY2F0ZWRMZW5ndGggPSB2LkFsbG9jYXRlZExlbmd0aDsKCWlmICggQWxsb2NhdGVkTGVuZ3Ro ID4gMCApCgl7CgkJVGFibGUgPSAoVCopbWFsbG9jKCBzaXplb2YoVCkgKiBBbGxvY2F0ZWRMZW5n dGggKTsKCQlUICpkc3QgPSBUYWJsZSwgKnNyYyA9IHYuVGFibGU7CgkJZm9yIChpbnQgcG9zID0g MDsgcG9zIDwgVGFibGVMZW5ndGg7CgkJCQlwb3MgKz0gMSwgZHN0ICs9IDEsIHNyYyArPSAxICkK CQkJbmV3KGRzdCkgVCgqc3JjKTsKCX0KCWVsc2UKCQlUYWJsZSA9IDA7Cn0KCiAKCgoKCgp0ZW1w bGF0ZTxjbGFzcyBULCBjbGFzcyBUYWJsZVQ+IHZvaWQgVmVjdG9yPFQsIFRhYmxlVD46OgoJCQlF bXB0eSgpCnsKCWlmIChUYWJsZSkgewoJCSAKCQlUICpwb3MgPSBUYWJsZTsKCQlmb3IgKCBpbnQg aSA9IDA7IGkgPCBUYWJsZUxlbmd0aDsgcG9zKyssIGkrKyApCgkJCXBvcy0+flQoKTsKCgkJIAoJ CWZyZWUoVGFibGUpOwoJCVRhYmxlID0gMDsKCQlUYWJsZUxlbmd0aCA9IEFsbG9jYXRlZExlbmd0 aCA9IDA7Cgl9Cn0KCiAKCgoKCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBUYWJsZVQ+IHZvaWQg VmVjdG9yPFQsIFRhYmxlVD46OgoJCQlTZXRBcyhjb25zdCBUICpkYXRhLCBpbnQgbGVuKQp7Cgkg CglUICpwb3MgPSBUYWJsZTsKCWZvciAoIGludCBpID0gMDsgaSA8IFRhYmxlTGVuZ3RoOyBwb3Mr KywgaSsrICkKCQlwb3MtPn5UKCk7CgoJIAoJaWYgKCBsZW4gPCBUYWJsZUxlbmd0aCApIHsKCQlU YWJsZUxlbmd0aCA9IGxlbjsJCgkJRG93blJlc2l6ZVRvRml0KCk7Cgl9CgkgCgllbHNlIGlmICgg bGVuID4gVGFibGVMZW5ndGggKSB7CgkJVXBSZXNpemVUb0ZpdChsZW4pOwoJCVRhYmxlTGVuZ3Ro ID0gbGVuOwoJfQoJCgkgCglUICpkc3QgPSBUYWJsZTsKCWNvbnN0IFQgKnNyYyA9IGRhdGE7Cglp ZiAoIHNyYyA9PSAwICkgewoJCSAKCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBsZW47IGkrKywgZHN0 KysgKQoJCQluZXcoZHN0KSBUKCk7Cgl9CgllbHNlIHsKCQkgCgkJZm9yICggaW50IGkgPSAwOyBp IDwgbGVuOyBpKyssIGRzdCsrLCBzcmMrKyApCgkJCW5ldyhkc3QpIFQoKnNyYyk7Cgl9Cn0KCiAK CgoKCgoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVGFibGVUPiB2b2lkIFZlY3RvcjxULCBUYWJs ZVQ+OjoKCQlPdmVyd3JpdGUoaW50IHBvcywgY29uc3QgVCAqZGF0YSwgaW50IGxlbikKewoJaW50 IGVuZFBvczsKCVQgKml0ZW07CgoJIAoKCglpZiAocG9zIDwgMCkKCQlwb3MgPSBUYWJsZUxlbmd0 aCArIHBvczsKCgkgCgoJZW5kUG9zID0gcG9zICsgbGVuOwoKCSAKCWlmICggZW5kUG9zID4gVGFi bGVMZW5ndGggKQoJCVVwUmVzaXplVG9GaXQoZW5kUG9zKTsKCgkgCglpdGVtID0gVGFibGUgKyBw b3M7Cglmb3IgKCBpbnQgaSA9IHBvczsgaSA8IFRhYmxlTGVuZ3RoICYmIGkgPCBlbmRQb3M7IGkg Kz0gMSwgaXRlbSArPSAxICkKCQlpdGVtLT5+VCgpOwoJCQoJIAoJaXRlbSA9IFRhYmxlICsgVGFi bGVMZW5ndGg7Cglmb3IgKCBpbnQgaSA9IFRhYmxlTGVuZ3RoOyBpIDwgcG9zOyBpICs9IDEsIGl0 ZW0gKz0gMSApCgkJbmV3KGl0ZW0pIFQoKTsKCgkgCglUYWJsZUxlbmd0aCA9IGVuZFBvczsKCQoJ IAoJVCAqZHN0ID0gVGFibGUgKyBwb3M7Cgljb25zdCBUICpzcmMgPSBkYXRhOwoJaWYgKCBzcmMg PT0gMCApIHsKCQkgCgkJZm9yICggaW50IGkgPSAwOyBpIDwgbGVuOyBpKyssIGRzdCsrICkKCQkJ bmV3KGRzdCkgVCgpOwoJfQoJZWxzZSB7CgkJIAoJCWZvciAoIGludCBpID0gMDsgaSA8IGxlbjsg aSsrLCBkc3QrKywgc3JjKysgKQoJCQluZXcoZHN0KSBUKCpzcmMpOwoJfQp9CgoKIAoKCgoKCnRl bXBsYXRlPGNsYXNzIFQsIGNsYXNzIFRhYmxlVD4gdm9pZCBWZWN0b3I8VCwgVGFibGVUPjo6CgkJ RGVsZXRlKGludCBwb3MsIGludCBsZW4pCnsKCWludCBuZXdMZW4sIGxlblRvU2xpZGVPdmVyLCBl bmRQb3M7CglUICpkc3QsICppdGVtOwoKCSAKCgoJaWYgKHBvcyA8IDApCgkJcG9zID0gVGFibGVM ZW5ndGggKyBwb3M7CgoJIAoJZW5kUG9zID0gcG9zICsgbGVuOwoKCSAKCW5ld0xlbiA9IFRhYmxl TGVuZ3RoIC0gbGVuOwoKCSAKCWRzdCA9IFRhYmxlICsgcG9zOwoKCSAKCWl0ZW0gPSBkc3Q7Cglm b3IgKCBpbnQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSwgaXRlbSArPSAxICkKCQlpdGVtLT5+VCgp OwoJCgkgCglsZW5Ub1NsaWRlT3ZlciA9IFRhYmxlTGVuZ3RoIC0gZW5kUG9zOwkKCWlmICggbGVu ID4gMCAmJiBsZW5Ub1NsaWRlT3ZlciA+IDAgKQoJCW1lbW1vdmUoZHN0LCBkc3QgKyBsZW4sIHNp emVvZihUKSpsZW5Ub1NsaWRlT3Zlcik7CgoJIAoJVGFibGVMZW5ndGggPSBuZXdMZW47CgoJIAoJ RG93blJlc2l6ZVRvRml0KCApOwp9CgoKIAoKCgoKCgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBU YWJsZVQ+IHZvaWQgVmVjdG9yPFQsIFRhYmxlVD46OgoJCUluc2VydChpbnQgcG9zLCBjb25zdCBU ICpkYXRhLCBpbnQgbGVuKQp7CgkgCgoKCWlmIChwb3MgPCAwKQoJCXBvcyA9IFRhYmxlTGVuZ3Ro ICsgcG9zOwoJCglpbnQgbmV3TGVuID0gTWFrZVJhd1NwYWNlRm9yKHBvcywgbGVuKTsKCgkgCglU ICpkc3QgPSBUYWJsZSArIHBvczsKCWNvbnN0IFQgKnNyYyA9IGRhdGE7CglpZiAoIHNyYyA9PSAw ICkgewoJCSAKCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBsZW47IGkrKywgZHN0KysgKQoJCQluZXco ZHN0KSBUKCk7Cgl9CgllbHNlIHsKCQkgCgkJZm9yICggaW50IGkgPSAwOyBpIDwgbGVuOyBpKyss IGRzdCsrLCBzcmMrKyApCgkJCW5ldyhkc3QpIFQoKnNyYyk7Cgl9CgoJIAoJVGFibGVMZW5ndGgg PSBuZXdMZW47Cn0KCiAKCgoKCgoKCgoKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFRhYmxlVD4g aW50IFZlY3RvcjxULCBUYWJsZVQ+OjoKCQlNYWtlUmF3U3BhY2VGb3IoaW50IHBvcywgaW50IGxl bikKewoJIAoJaW50IG5ld0xlbjsKCWlmIChwb3MgPj0gVGFibGVMZW5ndGgpCgkJbmV3TGVuID0g cG9zICsgbGVuOwoJZWxzZQoJCW5ld0xlbiA9IFRhYmxlTGVuZ3RoICsgbGVuOwoJVXBSZXNpemVU b0ZpdCggbmV3TGVuICk7CgoJIAoJVCAqaXRlbSA9IFRhYmxlICsgVGFibGVMZW5ndGg7Cglmb3Ig KCBpbnQgaSA9IFRhYmxlTGVuZ3RoOyBpIDwgcG9zOyBpICs9IDEsIGl0ZW0gKz0gMSApCgkJbmV3 KGl0ZW0pIFQoKTsKCgkgCglpZiAoIGxlbiA+IDAgJiYgcG9zIDwgVGFibGVMZW5ndGggKSB7CgkJ bWVtbW92ZShUYWJsZSArIHBvcyArIGxlbiwgVGFibGUgKyBwb3MsCgkJCXNpemVvZihUKSooVGFi bGVMZW5ndGgtcG9zKSk7Cgl9CgoJcmV0dXJuIG5ld0xlbjsKfQoJCgoKCiMgMTEgIi4uL2luY2x1 ZGUvVmVjdG9yU2V0LmgiIDIKCgoKdGVtcGxhdGUKCQk8CgkJCWNsYXNzIEtleVQsCgkJCWNsYXNz IENvbXBhcmUsCgkJCWNsYXNzIFRhYmxlVCA9IEV4cG5UYWJsZTxLZXlUPgoJCT4KCQljbGFzcyBW ZWN0b3JTZXQKCQkJCTogcHVibGljIFZlY3RvcjxLZXlULCBUYWJsZVQ+CnsKcHVibGljOgoJdHlw ZWRlZiBWZWN0b3I8S2V5VCwgVGFibGVUPiBCYXNlVHlwZTsKCglpbnQgSW5zZXJ0KGNvbnN0IEtl eVQgJnZhbCkgeyByZXR1cm4gU2V0KHZhbCk7IH0KCUtleVQgKkZpbmQoY29uc3QgS2V5VCAmdmFs KSB7IHJldHVybiBkb0ZpbmQodmFsKTsgfQoKCWludCBTZXQoY29uc3QgVmVjdG9yU2V0PEtleVQs IENvbXBhcmUsIFRhYmxlVD4gJm90aGVyU2V0KTsKCWludCBTZXQoY29uc3QgS2V5VCAmdmFsKTsK CWludCBVblNldChjb25zdCBLZXlUICZ2YWwpOwoJaW50IElzU2V0KGNvbnN0IEtleVQgJnZhbCk7 CgoJdm9pZCBVblNldEFsbCgpCgkJeyBCYXNlVHlwZTo6RW1wdHkoKTsgfQoKCUtleVQgKkxhc3RG b3VuZDsKcHJpdmF0ZToKCUtleVQgKmRvRmluZChjb25zdCBLZXlUICZ2YWwpOwp9OwoKdGVtcGxh dGU8IGNsYXNzIEtleVQsCgkJCWNsYXNzIENvbXBhcmUsCgkJCWNsYXNzIFRhYmxlVCA+CktleVQg KlZlY3RvclNldDxLZXlULCBDb21wYXJlLCBUYWJsZVQ+Ojpkb0ZpbmQoY29uc3QgS2V5VCAmdmFs KQp7CglLZXlUICpsb3dlciwgKm1pZCwgKnVwcGVyOwoJaW50IGtleVJlbGF0aW9uOwoKCWlmICgh IFRhYmxlKQoJCXJldHVybiAwOwoKCWxvd2VyID0gVGFibGU7Cgl1cHBlciA9IFRhYmxlICsgVGFi bGVMZW5ndGggLSAxOwoJd2hpbGUgKDEpIHsKCQlpZiAoIHVwcGVyIDwgbG93ZXIgKQoJCQlyZXR1 cm4gMDsKCgkJbWlkID0gbG93ZXIgKyAoICh1cHBlci1sb3dlcikgLyAyKTsKCQkKCQlrZXlSZWxh dGlvbiA9IENvbXBhcmU6OkNvbXBhcmUoIHZhbCwgKm1pZCApOwoJCWlmICgga2V5UmVsYXRpb24g PCAwICkKCQkJdXBwZXIgPSBtaWQgLSAxOwoJCWVsc2UgaWYgKCBrZXlSZWxhdGlvbiA+IDAgKQoJ CQlsb3dlciA9IG1pZCArIDE7CgkJZWxzZSAgIHsKCQkJTGFzdEZvdW5kID0gbWlkOwoJCQlyZXR1 cm4gbWlkOwoJCX0KCX0KfQoKCnRlbXBsYXRlPCBjbGFzcyBLZXlULAoJCQljbGFzcyBDb21wYXJl LAoJCQljbGFzcyBUYWJsZVQgPgppbnQgVmVjdG9yU2V0PEtleVQsIENvbXBhcmUsIFRhYmxlVD46 OklzU2V0KGNvbnN0IEtleVQgJnZhbCkKewoJS2V5VCAqcG9zID0gZG9GaW5kKHZhbCk7CgoJaWYg KHBvcyAhPSAwKQoJCXJldHVybiAxIDsKCWVsc2UKCQlyZXR1cm4gMCA7Cn0KCnRlbXBsYXRlPCBj bGFzcyBLZXlULAoJCQljbGFzcyBDb21wYXJlLAoJCQljbGFzcyBUYWJsZVQgPgppbnQgVmVjdG9y U2V0PEtleVQsIENvbXBhcmUsIFRhYmxlVD46OlVuU2V0KGNvbnN0IEtleVQgJnZhbCkKewoJS2V5 VCAqcG9zID0gZG9GaW5kKHZhbCk7CglpZiAocG9zICE9IDApIHsKCQlCYXNlVHlwZTo6RGVsZXRl KHBvcyAtIFRhYmxlKTsKCQlyZXR1cm4gMSA7Cgl9CgllbHNlCgkJcmV0dXJuIDAgOwp9Cgp0ZW1w bGF0ZTwgY2xhc3MgS2V5VCwKCQkJY2xhc3MgQ29tcGFyZSwKCQkJY2xhc3MgVGFibGVUID4KaW50 IFZlY3RvclNldDxLZXlULCBDb21wYXJlLCBUYWJsZVQ+OjpTZXQoY29uc3QgS2V5VCAmdmFsKQp7 CglLZXlUICpsb3dlciwgKm1pZCwgKnVwcGVyOwoJaW50IGtleVJlbGF0aW9uLCBpbnNlcnRQb3M7 CgoJaWYgKCEgVGFibGUpIHsKCQkgCgkJbG93ZXIgPSBUYWJsZTsKCQlnb3RvIEluc2VydDsKCX0K Cglsb3dlciA9IFRhYmxlOwoJdXBwZXIgPSBUYWJsZSArIFRhYmxlTGVuZ3RoIC0gMTsKCXdoaWxl ICgxKQoJewoJCWlmICggdXBwZXIgPCBsb3dlciApIHsKCQkJIAoJCQlnb3RvIEluc2VydDsKCQl9 CgoJCW1pZCA9IGxvd2VyICsgKCAodXBwZXItbG93ZXIpIC8gMik7CgkJCgkJa2V5UmVsYXRpb24g PSBDb21wYXJlOjpDb21wYXJlKCB2YWwsICptaWQgKTsKCQlpZiAoIGtleVJlbGF0aW9uIDwgMCAp CgkJCXVwcGVyID0gbWlkIC0gMTsKCQllbHNlIGlmICgga2V5UmVsYXRpb24gPiAwICkKCQkJbG93 ZXIgPSBtaWQgKyAxOwoJCWVsc2UgICB7CgkJCUxhc3RGb3VuZCA9IG1pZDsKCQkJcmV0dXJuIDAg OwoJCX0KCX0KCkluc2VydDoKICAgICAKICAgIGluc2VydFBvcyA9IGxvd2VyIC0gVGFibGU7Cgog ICAgIAogICAgQmFzZVR5cGU6Okluc2VydChpbnNlcnRQb3MsIHZhbCk7CgoJIAoJTGFzdEZvdW5k ID0gVGFibGUgKyBpbnNlcnRQb3M7CiAgICAKICAgIHJldHVybiAxIDsgCn0KCnRlbXBsYXRlPCBj bGFzcyBLZXlULAoJCQljbGFzcyBDb21wYXJlLAoJCQljbGFzcyBUYWJsZVQgPgppbnQgVmVjdG9y U2V0PEtleVQsIENvbXBhcmUsIFRhYmxlVD46OgoJCVNldChjb25zdCBWZWN0b3JTZXQ8S2V5VCwg Q29tcGFyZSwgVGFibGVUPiAmb3RoZXJTZXQpCnsKCUtleVQgKm90aGVySXRlbSA9IG90aGVyU2V0 LlRhYmxlOwoJaW50IG90aGVyTGVuID0gb3RoZXJTZXQuVGFibGVMZW5ndGg7CgoKCWZvciAoaW50 IGkgPSAwOyBpIDwgb3RoZXJMZW47IGkrKywgb3RoZXJJdGVtKyspCgkJU2V0KCpvdGhlckl0ZW0p OwoKCXJldHVybiAxIDsKfQoKCiMgNyAiLi4vaW5jbHVkZS9Gc21CYXNlVmsuaCIgMgoKCiMgMSAi Li4vaW5jbHVkZS9BVkxUcmVlLmgiIDEKIAoKCgoKCgoKCgogCgoKdGVtcGxhdGU8Y2xhc3MgS2V5 VCwgY2xhc3MgVmFsdWVUPiBzdHJ1Y3QgQVZMTm9kZQp7CglBVkxOb2RlKEFWTE5vZGUgKnBhcmVu dCwgS2V5VCAma2V5LCBWYWx1ZVQgJnZhbCkgOgoJCUxlZnQoMCksIFJpZ2h0KDApLCBQYXJlbnQo MCksIEhlaWdodCgxKSwKCQlLZXkoa2V5KSwgVmFsdWUodmFsKSB7IH0KCglBVkxOb2RlICpMZWZ0 LCAqUmlnaHQsICpQYXJlbnQ7CglpbnQgSGVpZ2h0OwoJS2V5VCBLZXk7CglWYWx1ZVQgVmFsdWU7 Cn07CgogCgoKdGVtcGxhdGU8Y2xhc3MgS2V5VCwgY2xhc3MgVmFsdWVULCBjbGFzcyBDb21wYXJl PiBjbGFzcyBBVkxUcmVlCnsKcHVibGljOgoJdHlwZWRlZiBBVkxOb2RlPEtleVQsIFZhbHVlVD4g Tm9kZVR5cGU7CglBVkxUcmVlKCkKCQl7IEhlYWQgPSBMYXN0Rm91bmQgPSAwOyBOb2RlQ291bnQg PSAwOyB9CgoJfkFWTFRyZWUoKQoJCXsgRW1wdHkoKTsgfQoKCXZvaWQgUHJpbnQoKQoJCXtkb1By aW50VHJlZShIZWFkLCAwKTt9CgoJaW50IEluc2VydChLZXlUICZrZXksIFZhbHVlVCAmdmFsKTsK CWludCBGaW5kKEtleVQgJmtleSwgVmFsdWVUICZyZXN1bHQpOwoJaW50IEZpbmQoS2V5VCAma2V5 KTsKCglpbnQgU2V0TGFzdEZvdW5kKFZhbHVlVCAmdmFsKTsKCWludCBHZXRMYXN0Rm91bmQoVmFs dWVUICZyZXN1bHQpOwoKCWludCBSZW1vdmUoS2V5VCAma2V5KTsKCWludCBSZW1vdmVMYXN0Rm91 bmQoKTsKCgl2b2lkIEVtcHR5KCk7CgoJIAoJIAoJIAoJIAoJdm9pZCBGcmVlQ2hpbGRyZW5PZihO b2RlVHlwZSAqbik7CgoJTm9kZVR5cGUgKlJlYmFsYW5jZShOb2RlVHlwZSAqc3RhcnQpOwoJdm9p ZCBSZWNhbGN1bGF0ZUhlaWdodHMoTm9kZVR5cGUgKnN0YXJ0KTsKCU5vZGVUeXBlICpkb0ZpbmQo S2V5VCAma2V5KTsKCU5vZGVUeXBlICpGaW5kRmlyc3RVbmJhbGFuY2VkR1AoTm9kZVR5cGUgKnN0 YXJ0KTsKCU5vZGVUeXBlICpGaW5kRmlyc3RVbmJhbGFuY2VkTm9kZShOb2RlVHlwZSAqc3RhcnQp OwoJdm9pZCBkb1JlbW92ZShOb2RlVHlwZSAqbm9kZSk7Cgl2b2lkIFJlcGxhY2VOb2RlKE5vZGVU eXBlICpub2RlLCBOb2RlVHlwZSAqcmVwbGFjZW1lbnQpOwoJdm9pZCBSZW1vdmVOb2RlKE5vZGVU eXBlICpub2RlLCBOb2RlVHlwZSAqZmlsbGVyKTsKCglpbnQgTm9kZUNvdW50OwoJTm9kZVR5cGUg KkhlYWQ7CglOb2RlVHlwZSAqTGFzdEZvdW5kOwp9OwoKdGVtcGxhdGU8Y2xhc3MgS2V5VCwKCQkJ Y2xhc3MgVmFsdWVULCBjbGFzcyBDb21wYXJlPgppbnQgQVZMVHJlZTxLZXlULCBWYWx1ZVQsIENv bXBhcmU+OjpGaW5kKEtleVQgJmtleSkKewoJcmV0dXJuIGRvRmluZChrZXkpICE9IDA7Cn0KCnRl bXBsYXRlPGNsYXNzIEtleVQsCgkJCWNsYXNzIFZhbHVlVCwgY2xhc3MgQ29tcGFyZT4KaW50IEFW TFRyZWU8S2V5VCwgVmFsdWVULCBDb21wYXJlPjo6RmluZChLZXlUICZrZXksIFZhbHVlVCAmcmVz dWx0KQp7CglOb2RlVHlwZSAqZmluZCA9IGRvRmluZChrZXkpOwoJaWYgKGZpbmQgIT0gMCkKCXsK CQlyZXN1bHQgPSBmaW5kLT5WYWx1ZTsKCQlyZXR1cm4gMTsKCX0KCWVsc2UKCQlyZXR1cm4gMDsK fQoKdGVtcGxhdGU8Y2xhc3MgS2V5VCwKCQkJY2xhc3MgVmFsdWVULCBjbGFzcyBDb21wYXJlPgpp bnQgQVZMVHJlZTxLZXlULCBWYWx1ZVQsIENvbXBhcmU+OjpSZW1vdmUoS2V5VCAma2V5KQp7CglO b2RlVHlwZSAqbm9kZSA9IGRvRmluZChrZXkpOwoJaWYgKG5vZGUpCgl7CgkJZG9SZW1vdmUobm9k ZSk7CgkJTGFzdEZvdW5kID0gMDsKCQlyZXR1cm4gMSA7Cgl9CgllbHNlCgkJcmV0dXJuIDAgOwp9 Cgp0ZW1wbGF0ZTxjbGFzcyBLZXlULAoJCQljbGFzcyBWYWx1ZVQsIGNsYXNzIENvbXBhcmU+CnZv aWQgQVZMVHJlZTxLZXlULCBWYWx1ZVQsIENvbXBhcmU+OjpFbXB0eSgpCnsKCWlmIChIZWFkKQoJ ewoJCUZyZWVDaGlsZHJlbk9mKEhlYWQpOwoJCWRlbGV0ZSBIZWFkOwoJCUhlYWQgPSBMYXN0Rm91 bmQgPSAwOwoJCU5vZGVDb3VudCA9IDA7Cgl9Cn0KCnRlbXBsYXRlPGNsYXNzIEtleVQsCgkJCWNs YXNzIFZhbHVlVCwgY2xhc3MgQ29tcGFyZT4KaW50IEFWTFRyZWU8S2V5VCwgVmFsdWVULCBDb21w YXJlPjo6UmVtb3ZlTGFzdEZvdW5kKCkKewoJaWYgKExhc3RGb3VuZCkKCXsKCQlkb1JlbW92ZShM YXN0Rm91bmQpOwoJCUxhc3RGb3VuZCA9IDA7CgkJcmV0dXJuIDEgOwoJfQoJZWxzZQoJCXJldHVy biAwIDsKfQoKdGVtcGxhdGU8Y2xhc3MgS2V5VCwKCQkJY2xhc3MgVmFsdWVULCBjbGFzcyBDb21w YXJlPgp2b2lkIEFWTFRyZWU8S2V5VCwgVmFsdWVULCBDb21wYXJlPjo6CgkJUmVjYWxjdWxhdGVI ZWlnaHRzKE5vZGVUeXBlICpub2RlKQogCnsKCWludCBsaGVpZ2h0LCByaGVpZ2h0LCBuZXdfaGVp Z2h0OwoJd2hpbGUgKCBub2RlICE9IDAgKQoJewoJCWxoZWlnaHQgPSBub2RlLT5MZWZ0ID8gbm9k ZS0+TGVmdC0+SGVpZ2h0IDogMDsKCQlyaGVpZ2h0ID0gbm9kZS0+UmlnaHQgPyBub2RlLT5SaWdo dC0+SGVpZ2h0IDogMDsKCgkJbmV3X2hlaWdodCA9IChsaGVpZ2h0ID4gcmhlaWdodCA/IGxoZWln aHQgOiByaGVpZ2h0KSArIDE7CgoJCSAKCgoJCWlmIChuZXdfaGVpZ2h0ID09IG5vZGUtPkhlaWdo dCkKCQkJcmV0dXJuOwoJCWVsc2UKCQkJbm9kZS0+SGVpZ2h0ID0gbmV3X2hlaWdodDsKCgkJbm9k ZSA9IG5vZGUtPlBhcmVudDsKCX0KfQoKdGVtcGxhdGU8Y2xhc3MgS2V5VCwKCQkJY2xhc3MgVmFs dWVULCBjbGFzcyBDb21wYXJlPgpBVkxOb2RlPEtleVQsIFZhbHVlVD4gKkFWTFRyZWU8S2V5VCwg VmFsdWVULCBDb21wYXJlPjo6UmViYWxhbmNlKE5vZGVUeXBlICpuKQogCnsKCWludCBsaGVpZ2h0 LCByaGVpZ2h0OwoJTm9kZVR5cGUgKmEsICpiLCAqYzsKCU5vZGVUeXBlICp0MSwgKnQyLCAqdDMs ICp0NDsKCglOb2RlVHlwZSAqcCA9IG4tPlBhcmVudDsgICAgICAgCglOb2RlVHlwZSAqZ3AgPSBw LT5QYXJlbnQ7ICAgICAgCglOb2RlVHlwZSAqZ2dwID0gZ3AtPlBhcmVudDsgICAgCgoJaWYgKGdw LT5SaWdodCA9PSBwKQoJewoJCSAKCgoKCQlpZiAocC0+UmlnaHQgPT0gbikKCQl7CgkJCSAKCgoK CgoJCQlhID0gZ3A7CgkJCWIgPSBwOwoJCQljID0gbjsKCQkJdDEgPSBncC0+TGVmdDsKCQkJdDIg PSBwLT5MZWZ0OwoJCQl0MyA9IG4tPkxlZnQ7CgkJCXQ0ID0gbi0+UmlnaHQ7CgkJfQoJCWVsc2UK CQl7CgkJCSAKCgoKCgoJCQlhID0gZ3A7CgkJCWIgPSBuOwoJCQljID0gcDsKCQkJdDEgPSBncC0+ TGVmdDsKCQkJdDIgPSBuLT5MZWZ0OwoJCQl0MyA9IG4tPlJpZ2h0OwoJCQl0NCA9IHAtPlJpZ2h0 OwoJCX0KCX0KCWVsc2UKCXsKCQkgCgoKCgkJaWYgKHAtPlJpZ2h0ID09IG4pCgkJewoJCQkgCgoK CgoKCQkJYSA9IHA7CgkJCWIgPSBuOwoJCQljID0gZ3A7CgkJCXQxID0gcC0+TGVmdDsKCQkJdDIg PSBuLT5MZWZ0OwoJCQl0MyA9IG4tPlJpZ2h0OwoJCQl0NCA9IGdwLT5SaWdodDsKCQl9CgkJZWxz ZQoJCXsKCQkJIAoKCgoKCgkJCWEgPSBuOwoJCQliID0gcDsKCQkJYyA9IGdwOwoJCQl0MSA9IG4t PkxlZnQ7CgkJCXQyID0gbi0+UmlnaHQ7CgkJCXQzID0gcC0+UmlnaHQ7CgkJCXQ0ID0gZ3AtPlJp Z2h0OwoJCX0KCX0KCgkgCgoKCSAKCWlmICggZ2dwID09IDAgKQoJCUhlYWQgPSBiOwoJZWxzZSBp ZiAoIGdncC0+TGVmdCA9PSBncCApCgkJZ2dwLT5MZWZ0ID0gYjsKCWVsc2UKCQlnZ3AtPlJpZ2h0 ID0gYjsKCWItPlBhcmVudCA9IGdncDsKCgkgCgliLT5MZWZ0ID0gYTsKCWEtPlBhcmVudCA9IGI7 CgoJIAoJYi0+UmlnaHQgPSBjOwoJYy0+UGFyZW50ID0gYjsKCgkgCglhLT5MZWZ0ID0gdDE7Cglp ZiAoIHQxICE9IDAgKSB0MS0+UGFyZW50ID0gYTsKCgkgCglhLT5SaWdodCA9IHQyOwoJaWYgKCB0 MiAhPSAwICkgdDItPlBhcmVudCA9IGE7CgoJIAoJYy0+TGVmdCA9IHQzOwoJaWYgKCB0MyAhPSAw ICkgdDMtPlBhcmVudCA9IGM7CgoJIAoJYy0+UmlnaHQgPSB0NDsKCWlmICggdDQgIT0gMCApIHQ0 LT5QYXJlbnQgPSBjOwoKCSAKCgoKCgoKCgoKCSAKCWxoZWlnaHQgPSBhLT5MZWZ0ID8gYS0+TGVm dC0+SGVpZ2h0IDogMDsKCXJoZWlnaHQgPSBhLT5SaWdodCA/IGEtPlJpZ2h0LT5IZWlnaHQgOiAw OwoJYS0+SGVpZ2h0ID0gKGxoZWlnaHQgPiByaGVpZ2h0ID8gbGhlaWdodCA6IHJoZWlnaHQpICsg MTsKCgkgCglsaGVpZ2h0ID0gYy0+TGVmdCA/IGMtPkxlZnQtPkhlaWdodCA6IDA7CglyaGVpZ2h0 ID0gYy0+UmlnaHQgPyBjLT5SaWdodC0+SGVpZ2h0IDogMDsKCWMtPkhlaWdodCA9IChsaGVpZ2h0 ID4gcmhlaWdodCA/IGxoZWlnaHQgOiByaGVpZ2h0KSArIDE7CgoJIAoJbGhlaWdodCA9IGEtPkhl aWdodDsKCXJoZWlnaHQgPSBjLT5IZWlnaHQ7CgliLT5IZWlnaHQgPSAobGhlaWdodCA+IHJoZWln aHQgPyBsaGVpZ2h0IDogcmhlaWdodCkgKyAxOwoKCSAKCVJlY2FsY3VsYXRlSGVpZ2h0cyhnZ3Ap OwoJcmV0dXJuIGdncDsKfQoKdGVtcGxhdGU8Y2xhc3MgS2V5VCwKCQkJY2xhc3MgVmFsdWVULCBj bGFzcyBDb21wYXJlPgpBVkxOb2RlPEtleVQsIFZhbHVlVD4gKkFWTFRyZWU8S2V5VCwgVmFsdWVU LCBDb21wYXJlPjo6CgkJRmluZEZpcnN0VW5iYWxhbmNlZEdQKE5vZGVUeXBlICpub2RlKQp7Cglp bnQgbGhlaWdodCwgcmhlaWdodCwgYmFsYW5jZVByb3A7CglOb2RlVHlwZSAqZ3A7CgoJaWYgKCBu b2RlID09IDAgfHwgbm9kZS0+UGFyZW50ID09IDAgfHwKCQkJbm9kZS0+UGFyZW50LT5QYXJlbnQg PT0gMCApCgkJcmV0dXJuIDA7CgkKCSAKCWdwID0gbm9kZS0+UGFyZW50LT5QYXJlbnQ7Cgl3aGls ZSAoIGdwICE9IDAgKQoJewoJCWxoZWlnaHQgPSBncC0+TGVmdCA/IGdwLT5MZWZ0LT5IZWlnaHQg OiAwOwoJCXJoZWlnaHQgPSBncC0+UmlnaHQgPyBncC0+UmlnaHQtPkhlaWdodCA6IDA7CgkJYmFs YW5jZVByb3AgPSBsaGVpZ2h0IC0gcmhlaWdodDsKCgkJaWYgKCBiYWxhbmNlUHJvcCA8IC0xIHx8 IGJhbGFuY2VQcm9wID4gMSApCgkJCXJldHVybiBub2RlOwoKCQlub2RlID0gbm9kZS0+UGFyZW50 OwoJCWdwID0gZ3AtPlBhcmVudDsKCX0KCXJldHVybiAwOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBLZXlU LAoJCQljbGFzcyBWYWx1ZVQsIGNsYXNzIENvbXBhcmU+CkFWTE5vZGU8S2V5VCwgVmFsdWVUPiAq QVZMVHJlZTxLZXlULCBWYWx1ZVQsIENvbXBhcmU+OjoKCQlGaW5kRmlyc3RVbmJhbGFuY2VkTm9k ZShOb2RlVHlwZSAqbm9kZSkKewoJaWYgKCBub2RlID09IDAgKQoJCXJldHVybiAwOwoJCgl3aGls ZSAoIG5vZGUgIT0gMCApCgl7CgkJaW50IGxoZWlnaHQgPSBub2RlLT5MZWZ0ID8gbm9kZS0+TGVm dC0+SGVpZ2h0IDogMDsKCQlpbnQgcmhlaWdodCA9IG5vZGUtPlJpZ2h0ID8gbm9kZS0+UmlnaHQt PkhlaWdodCA6IDA7CgkJaW50IGJhbGFuY2VQcm9wID0gbGhlaWdodCAtIHJoZWlnaHQ7CgoJCWlm ICggYmFsYW5jZVByb3AgPCAtMSB8fCBiYWxhbmNlUHJvcCA+IDEgKQoJCQlyZXR1cm4gbm9kZTsK CgkJbm9kZSA9IG5vZGUtPlBhcmVudDsKCX0KCXJldHVybiAwOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBL ZXlULAoJCQljbGFzcyBWYWx1ZVQsIGNsYXNzIENvbXBhcmU+CkFWTE5vZGU8S2V5VCwgVmFsdWVU PiAqQVZMVHJlZTxLZXlULCBWYWx1ZVQsIENvbXBhcmU+Ojpkb0ZpbmQoS2V5VCAma2V5KQp7Cgkg CgoKCgoJTm9kZVR5cGUgKmN1ck5vZGUgPSBIZWFkOwoJaW50IGtleVJlbGF0aW9uOwoKCXdoaWxl IChjdXJOb2RlKQoJewoJCWtleVJlbGF0aW9uID0gQ29tcGFyZTo6Q29tcGFyZShrZXksIGN1ck5v ZGUtPktleSk7CgoJCSAKCQlpZiAoIGtleVJlbGF0aW9uIDwgMCApCgkJCWN1ck5vZGUgPSBjdXJO b2RlLT5MZWZ0OwoJCSAKCQllbHNlIGlmICgga2V5UmVsYXRpb24gPiAwICkKCQkJY3VyTm9kZSA9 IGN1ck5vZGUtPlJpZ2h0OwoJCSAKCQllbHNlCgkJewoJCQlMYXN0Rm91bmQgPSBjdXJOb2RlOwoJ CQlyZXR1cm4gY3VyTm9kZTsKCQl9Cgl9CglMYXN0Rm91bmQgPSAwOwoJcmV0dXJuIDA7Cn0KCnRl bXBsYXRlPGNsYXNzIEtleVQsCgkJCWNsYXNzIFZhbHVlVCwgY2xhc3MgQ29tcGFyZT4KaW50IEFW TFRyZWU8S2V5VCwgVmFsdWVULCBDb21wYXJlPjo6R2V0TGFzdEZvdW5kKFZhbHVlVCAmcmVzdWx0 KQp7CglpZiAoIExhc3RGb3VuZCAhPSAwICkKCXsKCQlyZXN1bHQgPSBMYXN0Rm91bmQtPlZhbHVl OwoJCXJldHVybiAxIDsKCX0KCWVsc2UKCQlyZXR1cm4gMCA7Cn0KCnRlbXBsYXRlPGNsYXNzIEtl eVQsCgkJCWNsYXNzIFZhbHVlVCwgY2xhc3MgQ29tcGFyZT4KaW50IEFWTFRyZWU8S2V5VCwgVmFs dWVULCBDb21wYXJlPjo6U2V0TGFzdEZvdW5kKFZhbHVlVCAmdmFsKQp7CglpZiAoIExhc3RGb3Vu ZCAhPSAwICkKCXsKCQlMYXN0Rm91bmQtPlZhbHVlID0gdmFsOwoJCXJldHVybiAxIDsKCX0KCWVs c2UKCQlyZXR1cm4gMCA7Cn0KCnRlbXBsYXRlPGNsYXNzIEtleVQsCgkJCWNsYXNzIFZhbHVlVCwg Y2xhc3MgQ29tcGFyZT4Kdm9pZCBBVkxUcmVlPEtleVQsIFZhbHVlVCwgQ29tcGFyZT46OgoJCVJl bW92ZU5vZGUoTm9kZVR5cGUgKm5vZGUsIE5vZGVUeXBlICpmaWxsZXIpCiAKCgp7CglOb2RlVHlw ZSAqcGFyZW50ID0gbm9kZS0+UGFyZW50OwoKCWlmIChwYXJlbnQpCgl7CgkJaWYgKHBhcmVudC0+ TGVmdCA9PSBub2RlKQoJCQlwYXJlbnQtPkxlZnQgPSBmaWxsZXI7CgkJZWxzZQoJCQlwYXJlbnQt PlJpZ2h0ID0gZmlsbGVyOwoJfQoJZWxzZQoJCUhlYWQgPSBmaWxsZXI7CgkKCWlmIChmaWxsZXIp CgkJZmlsbGVyLT5QYXJlbnQgPSBwYXJlbnQ7CgoJcmV0dXJuOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBL ZXlULAoJCQljbGFzcyBWYWx1ZVQsIGNsYXNzIENvbXBhcmU+CnZvaWQgQVZMVHJlZTxLZXlULCBW YWx1ZVQsIENvbXBhcmU+OjoKCQlSZXBsYWNlTm9kZShOb2RlVHlwZSAqbm9kZSwgTm9kZVR5cGUg KnJlcGxhY2VtZW50KQp7CglOb2RlVHlwZSAqcGFyZW50ID0gbm9kZS0+UGFyZW50LAoJCSpsZWZ0 ID0gbm9kZS0+TGVmdCwKCQkqcmlnaHQgPSBub2RlLT5SaWdodDsKCglyZXBsYWNlbWVudC0+TGVm dCA9IGxlZnQ7CglpZiAobGVmdCkKCQlsZWZ0LT5QYXJlbnQgPSByZXBsYWNlbWVudDsKCXJlcGxh Y2VtZW50LT5SaWdodCA9IHJpZ2h0OwoJaWYgKHJpZ2h0KQoJCXJpZ2h0LT5QYXJlbnQgPSByZXBs YWNlbWVudDsKCglyZXBsYWNlbWVudC0+UGFyZW50ID0gcGFyZW50OwoJaWYgKHBhcmVudCkKCXsK CQlpZiAocGFyZW50LT5MZWZ0ID09IG5vZGUpCgkJCXBhcmVudC0+TGVmdCA9IHJlcGxhY2VtZW50 OwoJCWVsc2UKCQkJcGFyZW50LT5SaWdodCA9IHJlcGxhY2VtZW50OwoJfQoJZWxzZQoJCUhlYWQg PSByZXBsYWNlbWVudDsKCglyZXBsYWNlbWVudC0+SGVpZ2h0ID0gbm9kZS0+SGVpZ2h0Owp9Cgp0 ZW1wbGF0ZTxjbGFzcyBLZXlULAoJCQljbGFzcyBWYWx1ZVQsIGNsYXNzIENvbXBhcmU+CnZvaWQg QVZMVHJlZTxLZXlULCBWYWx1ZVQsIENvbXBhcmU+Ojpkb1JlbW92ZShOb2RlVHlwZSAqbm9kZSkK ewoJTm9kZVR5cGUgKnJlcGxhY2VtZW50LCAqZml4ZnJvbTsKCWludCBsaGVpZ2h0LCByaGVpZ2h0 OwoJTm9kZUNvdW50LS07CgoJIAoJaWYgKG5vZGUtPlJpZ2h0KQoJewoJCSAKCQlyZXBsYWNlbWVu dCA9IG5vZGUtPlJpZ2h0OwoJCXdoaWxlIChyZXBsYWNlbWVudC0+TGVmdCkKCQkJcmVwbGFjZW1l bnQgPSByZXBsYWNlbWVudC0+TGVmdDsKCgkJIAoKCgoJCWlmIChyZXBsYWNlbWVudC0+UGFyZW50 ID09IG5vZGUpCgkJCWZpeGZyb20gPSByZXBsYWNlbWVudDsKCQllbHNlCgkJCWZpeGZyb20gPSBy ZXBsYWNlbWVudC0+UGFyZW50OwoKCQlSZW1vdmVOb2RlKHJlcGxhY2VtZW50LCByZXBsYWNlbWVu dC0+UmlnaHQpOwoJCVJlcGxhY2VOb2RlKG5vZGUsIHJlcGxhY2VtZW50KTsKCX0KCWVsc2UgaWYg KG5vZGUtPkxlZnQpCgl7CgkJIAoJCXJlcGxhY2VtZW50ID0gbm9kZS0+TGVmdDsKCQl3aGlsZSAo cmVwbGFjZW1lbnQtPlJpZ2h0KQoJCQlyZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LT5SaWdodDsK CgkJIAoKCgoJCWlmIChyZXBsYWNlbWVudC0+UGFyZW50ID09IG5vZGUpCgkJCWZpeGZyb20gPSBy ZXBsYWNlbWVudDsKCQllbHNlCgkJCWZpeGZyb20gPSByZXBsYWNlbWVudC0+UGFyZW50OwoKCQlS ZW1vdmVOb2RlKHJlcGxhY2VtZW50LCByZXBsYWNlbWVudC0+TGVmdCk7CgkJUmVwbGFjZU5vZGUo bm9kZSwgcmVwbGFjZW1lbnQpOwoJfQoJZWxzZQoJewoJCSAKCQlmaXhmcm9tID0gbm9kZS0+UGFy ZW50OwoKCQkgCgkJUmVtb3ZlTm9kZShub2RlLCAwKTsKCX0KCglmcmVlKG5vZGUpOwoKCSAKCglp ZiAoISBmaXhmcm9tKQoJCXJldHVybjsKCgkgCglSZWNhbGN1bGF0ZUhlaWdodHMoZml4ZnJvbSk7 CgoJIAoJTm9kZVR5cGUgKnViID0gRmluZEZpcnN0VW5iYWxhbmNlZE5vZGUoZml4ZnJvbSk7Cgl3 aGlsZSAoIHViICkKCXsKCQkgCgoKCgoKCQlsaGVpZ2h0ID0gdWItPkxlZnQgPyB1Yi0+TGVmdC0+ SGVpZ2h0IDogMDsKCQlyaGVpZ2h0ID0gdWItPlJpZ2h0ID8gdWItPlJpZ2h0LT5IZWlnaHQgOiAw OwoJCWlmIChyaGVpZ2h0ID4gbGhlaWdodCkKCQl7CgkJCXViID0gdWItPlJpZ2h0OwoJCQlsaGVp Z2h0ID0gdWItPkxlZnQgPyB1Yi0+TGVmdC0+SGVpZ2h0IDogMDsKCQkJcmhlaWdodCA9IHViLT5S aWdodCA/IHViLT5SaWdodC0+SGVpZ2h0IDogMDsKCQkJaWYgKHJoZWlnaHQgPiBsaGVpZ2h0KQoJ CQkJdWIgPSB1Yi0+UmlnaHQ7CgkJCWVsc2UgaWYgKHJoZWlnaHQgPCBsaGVpZ2h0KQoJCQkJdWIg PSB1Yi0+TGVmdDsKCQkJZWxzZQoJCQkJdWIgPSB1Yi0+UmlnaHQ7CgkJfQoJCWVsc2UKCQl7CgkJ CXViID0gdWItPkxlZnQ7CgkJCWxoZWlnaHQgPSB1Yi0+TGVmdCA/IHViLT5MZWZ0LT5IZWlnaHQg OiAwOwoJCQlyaGVpZ2h0ID0gdWItPlJpZ2h0ID8gdWItPlJpZ2h0LT5IZWlnaHQgOiAwOwoJCQlp ZiAocmhlaWdodCA+IGxoZWlnaHQpCgkJCQl1YiA9IHViLT5SaWdodDsKCQkJZWxzZSBpZiAocmhl aWdodCA8IGxoZWlnaHQpCgkJCQl1YiA9IHViLT5MZWZ0OwoJCQllbHNlCgkJCQl1YiA9IHViLT5M ZWZ0OwoJCX0KCgoJCSAKCgoJCWZpeGZyb20gPSBSZWJhbGFuY2UodWIpOwoKCQkgCgkJdWIgPSBG aW5kRmlyc3RVbmJhbGFuY2VkTm9kZShmaXhmcm9tKTsKCX0KCXJldHVybjsKfQoKIyA2MzQgIi4u L2luY2x1ZGUvQVZMVHJlZS5oIgoKCnRlbXBsYXRlPGNsYXNzIEtleVQsCgkJCWNsYXNzIFZhbHVl VCwgY2xhc3MgQ29tcGFyZT4KaW50IEFWTFRyZWU8S2V5VCwgVmFsdWVULCBDb21wYXJlPjo6SW5z ZXJ0KEtleVQgJmtleSwgVmFsdWVUICZ2YWwpCnsKCWludCBrZXlSZWxhdGlvbjsKCU5vZGVUeXBl ICpjdXJOb2RlID0gSGVhZCwgKnBhcmVudE5vZGUgPSAwOwoJZW51bSB7IGxlZnQsIHJpZ2h0IH0g ZGlyZWN0aW9uID0gbGVmdDsKCgl3aGlsZSAoMSApCgl7CgkJaWYgKCBjdXJOb2RlID09IDAgKQoJ CXsKCQkJIAoKCgkJCWN1ck5vZGUgPSBuZXcgTm9kZVR5cGUocGFyZW50Tm9kZSwga2V5LCB2YWwp OwoJCQlOb2RlQ291bnQrKzsKCgkJCSAKCQkJaWYgKHBhcmVudE5vZGUpCgkJCXsKCQkJCWlmIChk aXJlY3Rpb24gPT0gbGVmdCkKCQkJCQlwYXJlbnROb2RlLT5MZWZ0ID0gY3VyTm9kZTsKCQkJCWVs c2UKCQkJCQlwYXJlbnROb2RlLT5SaWdodCA9IGN1ck5vZGU7CgkJCX0KCQkJZWxzZQoJCQkJSGVh ZCA9IGN1ck5vZGU7CgoJCQkgCgkJCVJlY2FsY3VsYXRlSGVpZ2h0cyhwYXJlbnROb2RlKTsKCgkJ CSAKCQkJTm9kZVR5cGUgKnViID0gRmluZEZpcnN0VW5iYWxhbmNlZEdQKGN1ck5vZGUpOwoKCQkJ IAoJCQlpZiAoIHViICE9IDAgKQoJCQl7CgkJCQkgCgoJCQkJUmViYWxhbmNlKHViKTsKCQkJfQoK CQkJTGFzdEZvdW5kID0gY3VyTm9kZTsKCQkJcmV0dXJuIDEgOwoJCX0KCgkJa2V5UmVsYXRpb24g PSBDb21wYXJlOjpDb21wYXJlKGtleSwgY3VyTm9kZS0+S2V5KTsKCgkJIAoJCWlmICgga2V5UmVs YXRpb24gPCAwICkKCQl7CgkJCWRpcmVjdGlvbiA9IGxlZnQ7CgkJCXBhcmVudE5vZGUgPSBjdXJO b2RlOwoJCQljdXJOb2RlID0gY3VyTm9kZS0+TGVmdDsKCQl9CgkJIAoJCWVsc2UgaWYgKCBrZXlS ZWxhdGlvbiA+IDAgKQoJCXsKCQkJZGlyZWN0aW9uID0gcmlnaHQ7CgkJCXBhcmVudE5vZGUgPSBj dXJOb2RlOwoJCQljdXJOb2RlID0gY3VyTm9kZS0+UmlnaHQ7CgkJfQoJCSAKCQllbHNlCgkJewoJ CQlMYXN0Rm91bmQgPSBjdXJOb2RlOwoJCQlyZXR1cm4gMCA7CgkJfQoJfQp9Cgp0ZW1wbGF0ZTxj bGFzcyBLZXlULAoJCQljbGFzcyBWYWx1ZVQsIGNsYXNzIENvbXBhcmU+CnZvaWQgQVZMVHJlZTxL ZXlULCBWYWx1ZVQsIENvbXBhcmU+OjpGcmVlQ2hpbGRyZW5PZihOb2RlVHlwZSAqbikKewoJIAoK CgoJaWYgKG4tPkxlZnQpCgl7CgkJRnJlZUNoaWxkcmVuT2Yobi0+TGVmdCk7CgkJZGVsZXRlIG4t PkxlZnQ7CgkJbi0+TGVmdCA9IDA7Cgl9CgoJaWYgKG4tPlJpZ2h0KQoJewoJCUZyZWVDaGlsZHJl bk9mKG4tPlJpZ2h0KTsKCQlkZWxldGUgbi0+UmlnaHQ7CgkJbi0+TGVmdCA9IDA7Cgl9Cn0KCiMg NzY0ICIuLi9pbmNsdWRlL0FWTFRyZWUuaCIKCgojIDkgIi4uL2luY2x1ZGUvRnNtQmFzZVZrLmgi IDIKCiMgMSAiLi4vaW5jbHVkZS9Eb3VibGVMaXN0LmgiIDEKIAoKCgoKCgp0ZW1wbGF0ZTxjbGFz cyBFbGVtZW50PiBzdHJ1Y3QgRG91YmxlTGlzdEVsIHsgRWxlbWVudCAqUHJldiwgKk5leHQ7IH07 CgoKIAoKCnRlbXBsYXRlIDwgY2xhc3MgRWxlbWVudCwgY2xhc3MgRExFbGVtZW50ID0gRG91Ymxl TGlzdEVsPEVsZW1lbnQ+ID4KCQljbGFzcyBEb3VibGVMaXN0CnsKcHVibGljOgoJRG91YmxlTGlz dChEb3VibGVMaXN0ICZvdGhlcik7CglEb3VibGVMaXN0KCkgOiBIZWFkKDApLCBUYWlsKDApLCBM aXN0TGVuZ3RoKDApIHt9Cgl+RG91YmxlTGlzdCgpIHtFbXB0eSgpO30KCgl2b2lkIEFkZEZyb250 KEVsZW1lbnQgKm5ld19lbCkKCQl7QWRkQmVmb3JlKEhlYWQsIG5ld19lbCk7fQoJdm9pZCBBZGRF bmQoRWxlbWVudCAqbmV3X2VsKQoJCXtBZGRBZnRlcihUYWlsLCBuZXdfZWwpO30KCgl2b2lkIEFk ZEVuZCggRG91YmxlTGlzdCAmZGwgKTsKCXZvaWQgQWRkRnJvbnQoIERvdWJsZUxpc3QgJmRsICk7 CgoJRWxlbWVudCAqRGV0YWNoRnJvbnQoKQoJCXtyZXR1cm4gRGV0YWNoTGlzdEVsKEhlYWQpO30K CUVsZW1lbnQgKkRldGFjaEVuZCgpCgkJe3JldHVybiBEZXRhY2hMaXN0RWwoVGFpbCk7fQoKCXZv aWQgRW1wdHkoKTsKCQoJdm9pZCBBZGRBZnRlcihFbGVtZW50ICpwcmV2X2VsLCBFbGVtZW50ICpu ZXdfZWwpOwoJdm9pZCBBZGRCZWZvcmUoRWxlbWVudCAqbmV4dF9lbCwgRWxlbWVudCAqbmV3X2Vs KTsKCSAKCUVsZW1lbnQgKkRldGFjaExpc3RFbChFbGVtZW50ICplbCk7CgoJRWxlbWVudCAqSGVh ZCwgKlRhaWw7CglpbnQgTGlzdExlbmd0aDsKfTsKCnRlbXBsYXRlPGNsYXNzIEVsZW1lbnQsIGNs YXNzIERMRWxlbWVudD4KCQlEb3VibGVMaXN0PEVsZW1lbnQsIERMRWxlbWVudD46OkRvdWJsZUxp c3QoRG91YmxlTGlzdCAmb3RoZXIpIDoKCQlIZWFkKDApLCBUYWlsKDApLCBMaXN0TGVuZ3RoKDAp CnsKCUVsZW1lbnQgKmVsID0gb3RoZXIuSGVhZDsKCXdoaWxlKCBlbCAhPSAwICkgewoJCUFkZEVu ZCggbmV3IEVsZW1lbnQoKmVsKSApOwoJCWVsID0gZWwtPk5leHQ7Cgl9Cn0KCnRlbXBsYXRlPGNs YXNzIEVsZW1lbnQsIGNsYXNzIERMRWxlbWVudD4KCQl2b2lkIERvdWJsZUxpc3Q8RWxlbWVudCwg RExFbGVtZW50Pjo6QWRkRW5kKCBEb3VibGVMaXN0ICZkbCApCnsKCWlmICggZGwuTGlzdExlbmd0 aCA9PSAwICkKCQlyZXR1cm47CgoJaWYgKCBMaXN0TGVuZ3RoID09IDAgKSB7CgkJSGVhZCA9IGRs LkhlYWQ7CgkJVGFpbCA9IGRsLlRhaWw7CgkJTGlzdExlbmd0aCA9IGRsLkxpc3RMZW5ndGg7Cgl9 CgllbHNlIHsKCQlUYWlsLT5ETEVsZW1lbnQ6Ok5leHQgPSBkbC5IZWFkOwoJCWRsLkhlYWQtPkRM RWxlbWVudDo6UHJldiA9IFRhaWw7CgkJVGFpbCA9IGRsLlRhaWw7CgkJTGlzdExlbmd0aCArPSBk bC5MaXN0TGVuZ3RoOwoJfQoJZGwuSGVhZCA9IGRsLlRhaWwgPSAwOwoJZGwuTGlzdExlbmd0aCA9 IDA7Cn0KCnRlbXBsYXRlPGNsYXNzIEVsZW1lbnQsIGNsYXNzIERMRWxlbWVudD4KCQl2b2lkIERv dWJsZUxpc3Q8RWxlbWVudCwgRExFbGVtZW50Pjo6QWRkRnJvbnQoIERvdWJsZUxpc3QgJmRsICkK ewoJaWYgKCBkbC5MaXN0TGVuZ3RoID09IDAgKQoJCXJldHVybjsKCglpZiAoIExpc3RMZW5ndGgg PT0gMCApIHsKCQlIZWFkID0gZGwuSGVhZDsKCQlUYWlsID0gZGwuVGFpbDsKCQlMaXN0TGVuZ3Ro ID0gZGwuTGlzdExlbmd0aDsKCX0KCWVsc2UgewoJCUhlYWQtPkRMRWxlbWVudDo6UHJldiA9IGRs LlRhaWw7CgkJZGwuVGFpbC0+RExFbGVtZW50OjpOZXh0ID0gSGVhZDsKCQlIZWFkID0gZGwuSGVh ZDsKCQlMaXN0TGVuZ3RoICs9IGRsLkxpc3RMZW5ndGg7Cgl9CgoJZGwuSGVhZCA9IGRsLlRhaWwg PSAwOwoJZGwuTGlzdExlbmd0aCA9IDA7Cn0KCnRlbXBsYXRlPGNsYXNzIEVsZW1lbnQsIGNsYXNz IERMRWxlbWVudD4KCQl2b2lkIERvdWJsZUxpc3Q8RWxlbWVudCwgRExFbGVtZW50Pjo6CgkJQWRk QWZ0ZXIoRWxlbWVudCAqcHJldl9lbCwgRWxlbWVudCAqbmV3X2VsKQp7CgluZXdfZWwtPkRMRWxl bWVudDo6UHJldiA9IHByZXZfZWw7IAoJaWYgKHByZXZfZWwgPT0gMCkgCgl7CgkJbmV3X2VsLT5E TEVsZW1lbnQ6Ok5leHQgPSBIZWFkOwoJCUhlYWQgPSBuZXdfZWw7Cgl9IAoJZWxzZSAKCXsKCQlu ZXdfZWwtPkRMRWxlbWVudDo6TmV4dCA9IHByZXZfZWwtPkRMRWxlbWVudDo6TmV4dDsKCQlwcmV2 X2VsLT5ETEVsZW1lbnQ6Ok5leHQgPSBuZXdfZWw7Cgl9IAoKCWlmIChuZXdfZWwtPkRMRWxlbWVu dDo6TmV4dCA9PSAwKSAKCQlUYWlsID0gbmV3X2VsOwoJZWxzZSAKCQluZXdfZWwtPkRMRWxlbWVu dDo6TmV4dC0+RExFbGVtZW50OjpQcmV2ID0gbmV3X2VsOwoKCUxpc3RMZW5ndGgrKzsKfQoKdGVt cGxhdGU8Y2xhc3MgRWxlbWVudCwgY2xhc3MgRExFbGVtZW50PgoJCXZvaWQgRG91YmxlTGlzdDxF bGVtZW50LCBETEVsZW1lbnQ+OjoKCQlBZGRCZWZvcmUoRWxlbWVudCAqbmV4dF9lbCwgRWxlbWVu dCAqbmV3X2VsKQp7CgluZXdfZWwtPkRMRWxlbWVudDo6TmV4dCA9IG5leHRfZWw7IAoJaWYgKG5l eHRfZWwgPT0gMCkgCgl7CgkJbmV3X2VsLT5ETEVsZW1lbnQ6OlByZXYgPSBUYWlsOwoJCVRhaWwg PSBuZXdfZWw7Cgl9IAoJZWxzZSAKCXsKCQluZXdfZWwtPkRMRWxlbWVudDo6UHJldiA9IG5leHRf ZWwtPkRMRWxlbWVudDo6UHJldjsKCQluZXh0X2VsLT5ETEVsZW1lbnQ6OlByZXYgPSBuZXdfZWw7 Cgl9IAoKCWlmIChuZXdfZWwtPkRMRWxlbWVudDo6UHJldiA9PSAwKSAKCQlIZWFkID0gbmV3X2Vs OwoJZWxzZSAKCQluZXdfZWwtPkRMRWxlbWVudDo6UHJldi0+RExFbGVtZW50OjpOZXh0ID0gbmV3 X2VsOwoKCUxpc3RMZW5ndGgrKzsKfQoKdGVtcGxhdGU8Y2xhc3MgRWxlbWVudCwgY2xhc3MgRExF bGVtZW50PgoJCUVsZW1lbnQgKkRvdWJsZUxpc3Q8RWxlbWVudCwgRExFbGVtZW50Pjo6RGV0YWNo TGlzdEVsKEVsZW1lbnQgKmVsKQp7CglpZiAoZWwtPkRMRWxlbWVudDo6UHJldiA9PSAwKSAKCQlI ZWFkID0gZWwtPkRMRWxlbWVudDo6TmV4dDsgCgllbHNlIHsKCQllbC0+RExFbGVtZW50OjpQcmV2 LT5ETEVsZW1lbnQ6Ok5leHQgPQoJCQkJZWwtPkRMRWxlbWVudDo6TmV4dDsgCgl9CgoJaWYgKGVs LT5ETEVsZW1lbnQ6Ok5leHQgPT0gMCkgCgkJVGFpbCA9IGVsLT5ETEVsZW1lbnQ6OlByZXY7IAoJ ZWxzZSB7CgkJZWwtPkRMRWxlbWVudDo6TmV4dC0+RExFbGVtZW50OjpQcmV2ID0KCQkJCWVsLT5E TEVsZW1lbnQ6OlByZXY7IAoJfQoKCUxpc3RMZW5ndGgtLTsKCglyZXR1cm4gZWw7Cn0KCnRlbXBs YXRlPGNsYXNzIEVsZW1lbnQsIGNsYXNzIERMRWxlbWVudD4KCQl2b2lkIERvdWJsZUxpc3Q8RWxl bWVudCwgRExFbGVtZW50Pjo6RW1wdHkoKQp7CglFbGVtZW50ICpuZXh0VG9HbyA9IDAsICpjdXIg PSBIZWFkOwoJCgl3aGlsZSAoY3VyICE9IDApCgl7CgkJbmV4dFRvR28gPSBjdXItPkRMRWxlbWVu dDo6TmV4dDsKCQlkZWxldGUgY3VyOwoJCWN1ciA9IG5leHRUb0dvOwoJfQoJSGVhZCA9IFRhaWwg PSAwOyBMaXN0TGVuZ3RoID0gMDsKfQoKCgojIDEwICIuLi9pbmNsdWRlL0ZzbUJhc2VWay5oIiAy CgojIDEgIi4uL2luY2x1ZGUvRnNtQ29tbW9uLmgiIDEKIAoKCgoKCgoKIAoKCgoKCgoKCgoKCnRl bXBsYXRlIDxjbGFzcyBTdGF0ZT4gc3RydWN0IE1hcmtJbmRleFRtcGwKewoJc3RydWN0IFN0YXRl UGFpciA6IHB1YmxpYyBEb3VibGVMaXN0RWw8U3RhdGVQYWlyPgoJewoJCWJvb2wgaXNNYXJrZWQ7 CgkJU3RhdGUgKnAsICpxOwoJfTsKCglpbnQgbnVtU3RhdGVzOwoJU3RhdGVQYWlyICphcnJheTsK CglNYXJrSW5kZXhUbXBsKGludCBzdGF0ZXMpOwoJfk1hcmtJbmRleFRtcGwoKTsKCXZvaWQgTWFy a1BhaXIoaW50IHN0YXRlMSwgaW50IHN0YXRlMik7Cglib29sIElzUGFpck1hcmtlZChpbnQgc3Rh dGUxLCBpbnQgc3RhdGUyKTsKCglEb3VibGVMaXN0PFN0YXRlUGFpcj4gbWFya2VkTGlzdCwgdW5t YXJrZWRMaXN0Owp9OwoKdGVtcGxhdGUgPCBjbGFzcyBTdGF0ZSwKCQkJY2xhc3MgVHJhbnNpdGlv biwKCQkJY2xhc3MgVHJhbnNpdGlvbkZ1bmMsCgkJCWNsYXNzIFRyYW5zaXRpb25GdW5jQ29tcGFy ZSA+IHN0cnVjdCBGc21UcmFuc2l0aW9uCnsKCUZzbVRyYW5zaXRpb24oICkgOiBmcm9tU3RhdGUo MCksIHRvU3RhdGUoMCksIHByaW9yaXR5KDApIHt9CgoJVHJhbnNpdGlvbiAqTmV4dCwgKlByZXY7 CglTdGF0ZSAqZnJvbVN0YXRlOwoJU3RhdGUgKnRvU3RhdGU7CgoJdHlwZWRlZiBWZWN0b3I8VHJh bnNpdGlvbkZ1bmM+IFRyYW5zaXRpb25GdW5jTGlzdDsKCXR5cGVkZWYgVGFibGVDb21wYXJlPFRy YW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uRnVuY0NvbXBhcmU+IFRyYW5zRnVuY0xpc3RDb21wYXJl OwoKCVRyYW5zaXRpb25GdW5jTGlzdCB0cmFuc0Z1bmNMaXN0OwoJaW50IHByaW9yaXR5OwoKCXN0 YXRpYyBpbnQgQ29tcGFyZSggY29uc3QgRnNtVHJhbnNpdGlvbiAmdHJhbnMxLCBjb25zdCBGc21U cmFuc2l0aW9uICZ0cmFuczIgKQoJewoJCWlmICggdHJhbnMxLnByaW9yaXR5IDwgdHJhbnMyLnBy aW9yaXR5ICkKCQkJcmV0dXJuIC0xOwoJCWVsc2UgaWYgKCB0cmFuczEucHJpb3JpdHkgPiB0cmFu czIucHJpb3JpdHkgKQoJCQlyZXR1cm4gMTsKCQllbHNlCgkJewoJCQlpbnQgY21wUmVzdWx0ID0g VHJhbnNGdW5jTGlzdENvbXBhcmU6OgoJCQkJCUNvbXBhcmUodHJhbnMxLnRyYW5zRnVuY0xpc3Qs IHRyYW5zMi50cmFuc0Z1bmNMaXN0KTsKCQkJaWYgKCBjbXBSZXN1bHQgIT0gMCApCgkJCQlyZXR1 cm4gY21wUmVzdWx0OwoJCX0KCQlyZXR1cm4gMDsKCX0KCgkgCgl2b2lkIE1lcmdlVHJhbnNpdGlv biggRnNtVHJhbnNpdGlvbiAqb3RoZXJUcmFucyApIHsgfQoJdm9pZCBJbnNlcnRUcmFuc2l0aW9u KCBGc21UcmFuc2l0aW9uICpvdGhlclRyYW5zICkgeyB9Cn07CgoKIAoKCnRlbXBsYXRlIDwgY2xh c3MgU3RhdGUgPiBNYXJrSW5kZXhUbXBsPFN0YXRlPjo6CgkJTWFya0luZGV4VG1wbCggaW50IHN0 YXRlcyApIDogbnVtU3RhdGVzKHN0YXRlcykKewoJaW50IHRvdGFsID0gc3RhdGVzICogc3RhdGVz OwoJYXJyYXkgPSAoU3RhdGVQYWlyKikgbWFsbG9jKCBzaXplb2YoU3RhdGVQYWlyKSAqIHRvdGFs ICk7CgltZW1zZXQoIGFycmF5LCAwLCBzaXplb2YoU3RhdGVQYWlyKSAqIHRvdGFsICk7Cn0KCiAK Cgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlID5NYXJrSW5kZXhUbXBsPFN0YXRlPjo6fk1hcmtJbmRl eFRtcGwoKQp7CgltYXJrZWRMaXN0Lkxpc3RMZW5ndGggPSAwOwoJbWFya2VkTGlzdC5IZWFkID0g MDsKCW1hcmtlZExpc3QuVGFpbCA9IDA7CgoJdW5tYXJrZWRMaXN0Lkxpc3RMZW5ndGggPSAwOwoJ dW5tYXJrZWRMaXN0LkhlYWQgPSAwOwoJdW5tYXJrZWRMaXN0LlRhaWwgPSAwOwoKCWZyZWUoIGFy cmF5ICk7Cn0KCiAKCgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlID4gdm9pZCBNYXJrSW5kZXhUbXBs PFN0YXRlPjo6CgkJTWFya1BhaXIoaW50IHN0YXRlMSwgaW50IHN0YXRlMikKewoJaW50IHBvczsK CWlmICggc3RhdGUxID49IHN0YXRlMiApCgkJcG9zID0gKCBzdGF0ZTEgKiBudW1TdGF0ZXMgKSAr IHN0YXRlMjsKCWVsc2UKCQlwb3MgPSAoIHN0YXRlMiAqIG51bVN0YXRlcyApICsgc3RhdGUxOwoK CWlmICghKCAgISBhcnJheVtwb3NdLmlzTWFya2VkICApKSB7IGNlcnIgPDwgIkFzc2VydGlvbiBm YWlsZWQ6IGxpbmUgIiA8PCAxMTggPDwgIiBmaWxlICIgPDwgIi4uL2luY2x1ZGUvRnNtQ29tbW9u LmgiIDw8ICJcbiI7IGFib3J0KCk7IH0gOwoJYXJyYXlbcG9zXS5pc01hcmtlZCA9IDEgOwoJbWFy a2VkTGlzdC5BZGRFbmQoIHVubWFya2VkTGlzdC5EZXRhY2hMaXN0RWwoICZhcnJheVtwb3NdICkg KTsKfQoKIAoKCnRlbXBsYXRlIDwgY2xhc3MgU3RhdGUgPiBib29sIE1hcmtJbmRleFRtcGw8U3Rh dGU+OjoKCQlJc1BhaXJNYXJrZWQoaW50IHN0YXRlMSwgaW50IHN0YXRlMikKewoJaW50IHBvczsK CWlmICggc3RhdGUxID49IHN0YXRlMiApCgkJcG9zID0gKCBzdGF0ZTEgKiBudW1TdGF0ZXMgKSAr IHN0YXRlMjsKCWVsc2UKCQlwb3MgPSAoIHN0YXRlMiAqIG51bVN0YXRlcyApICsgc3RhdGUxOwoK CXJldHVybiBhcnJheVtwb3NdLmlzTWFya2VkOwp9CgoKIyAxMSAiLi4vaW5jbHVkZS9Gc21CYXNl VmsuaCIgMgoKIyAxICIuLi9pbmNsdWRlL0JTVGFibGUuaCIgMQogCgoKCgoKCgoKCgoKCnRlbXBs YXRlPGNsYXNzIEtleVQsIGNsYXNzIFZhbHVlVD4gc3RydWN0IEJTRWxlbWVudAp7CglCU0VsZW1l bnQoKSB7fQoJQlNFbGVtZW50KGNvbnN0IEtleVQgJmtleSkgOiBLZXkoa2V5KSwgVmFsdWUoKSB7 fQoJQlNFbGVtZW50KGNvbnN0IEtleVQgJmtleSwgY29uc3QgVmFsdWVUICZ2YWwpIDogS2V5KGtl eSksIFZhbHVlKHZhbCkge30KCUtleVQgS2V5OwoJVmFsdWVUIFZhbHVlOwp9OwoKdGVtcGxhdGUK CQk8CgkJCWNsYXNzIEtleVQsCgkJCWNsYXNzIFZhbHVlVCwKCQkJY2xhc3MgQ29tcGFyZSwKCQkJ Y2xhc3MgVGFibGVUID0gRXhwblRhYmxlPCBCU0VsZW1lbnQ8S2V5VCxWYWx1ZVQ+ID4KCQk+CgkJ Y2xhc3MgQlNUYWJsZSA6IHB1YmxpYyBWZWN0b3I8IEJTRWxlbWVudDxLZXlULFZhbHVlVD4sIFRh YmxlVCA+CnsKcHVibGljOgoJdHlwZWRlZiBCU0VsZW1lbnQ8S2V5VCwgVmFsdWVUPiBFbGVtZW50 VHlwZTsKCXR5cGVkZWYgVmVjdG9yPEVsZW1lbnRUeXBlLCBUYWJsZVQ+IEJhc2VUeXBlOwoKCUJT VGFibGUoKSA6IExhc3RGb3VuZCgwKSB7IH0KCUJTVGFibGUoIGNvbnN0IEJTVGFibGUgJnQgKTsK CglFbGVtZW50VHlwZSAqSW5zZXJ0KGNvbnN0IEtleVQgJmtleSk7CglFbGVtZW50VHlwZSAqSW5z ZXJ0KGNvbnN0IEtleVQgJmtleSwgY29uc3QgVmFsdWVUICZ2YWwpOwoJRWxlbWVudFR5cGUgKklu c2VydChjb25zdCBFbGVtZW50VHlwZSAmZWwpIHsgcmV0dXJuIEluc2VydChlbC5LZXksIGVsLlZh bHVlKTsgfQoKCUVsZW1lbnRUeXBlICpJbnNlcnRNdWx0aShjb25zdCBLZXlUICZrZXksIGNvbnN0 IFZhbHVlVCAmdmFsKTsKCUVsZW1lbnRUeXBlICpJbnNlcnRNdWx0aShjb25zdCBFbGVtZW50VHlw ZSAmZWwpIHsgcmV0dXJuIEluc2VydE11bHRpKGVsLktleSwgZWwuVmFsdWUpOyB9CgoJRWxlbWVu dFR5cGUgKkZpbmQoY29uc3QgS2V5VCAma2V5KTsKCWJvb2wgRmluZE11bHRpKCBjb25zdCBLZXlU ICZrZXksIEVsZW1lbnRUeXBlICombG93ZXIsIEVsZW1lbnRUeXBlIComdXBwZXIgKTsKCglpbnQg UmVtb3ZlKGNvbnN0IEtleVQgJmtleSk7CglpbnQgUmVtb3ZlTXVsdGkoY29uc3QgS2V5VCAma2V5 KTsKCWludCBSZW1vdmVMYXN0Rm91bmQoKTsKCglFbGVtZW50VHlwZSAqTGFzdEZvdW5kOwp9OwoK dGVtcGxhdGU8IGNsYXNzIEtleVQsIGNsYXNzIFZhbHVlVCwKCQkJY2xhc3MgQ29tcGFyZSwKCQkJ Y2xhc3MgVGFibGVUPgpCU1RhYmxlPEtleVQsIFZhbHVlVCwgQ29tcGFyZSwgVGFibGVUPjo6QlNU YWJsZShjb25zdCBCU1RhYmxlICZ0KSA6IEJhc2VUeXBlKCB0ICkKewoJaWYgKCB0Lkxhc3RGb3Vu ZCA9PSAwICkKCQlMYXN0Rm91bmQgPSAwOwoJZWxzZQoJCUxhc3RGb3VuZCA9IFRhYmxlICsgKCB0 Lkxhc3RGb3VuZCAtIHQuVGFibGUgKTsKfQoKIyA5MCAiLi4vaW5jbHVkZS9CU1RhYmxlLmgiCgoK dGVtcGxhdGU8IGNsYXNzIEtleVQsIGNsYXNzIFZhbHVlVCwKCQkJY2xhc3MgQ29tcGFyZSwKCQkJ Y2xhc3MgVGFibGVUPgppbnQgQlNUYWJsZTxLZXlULCBWYWx1ZVQsIENvbXBhcmUsIFRhYmxlVD46 OlJlbW92ZU11bHRpKGNvbnN0IEtleVQgJmtleSkKewoJRWxlbWVudFR5cGUgKmxvdywgKmhpZ2g7 CglpZiAoIEZpbmRNdWx0aShrZXksIGxvdywgaGlnaCkgKQoJewoJCWludCBudW0gPSBoaWdoIC0g bG93ICsgMTsKCQlCYXNlVHlwZTo6RGVsZXRlKGxvdyAtIFRhYmxlLCBoaWdoIC0gbG93ICsgMSk7 CgkJTGFzdEZvdW5kID0gMDsKCQlyZXR1cm4gbnVtOwoJfQoJZWxzZQoJCXJldHVybiAwOwp9CgoK dGVtcGxhdGU8IGNsYXNzIEtleVQsIGNsYXNzIFZhbHVlVCwKCQkJY2xhc3MgQ29tcGFyZSwKCQkJ Y2xhc3MgVGFibGVUPgppbnQgQlNUYWJsZTxLZXlULCBWYWx1ZVQsIENvbXBhcmUsIFRhYmxlVD46 OlJlbW92ZShjb25zdCBLZXlUICZrZXkpCnsKCUVsZW1lbnRUeXBlICplbCA9IEZpbmQoa2V5KTsK CWlmIChlbCkKCXsKCQlCYXNlVHlwZTo6RGVsZXRlKGVsIC0gVGFibGUpOwoJCUxhc3RGb3VuZCA9 IDA7CgkJcmV0dXJuIDEgOwoJfQoJZWxzZQoJCXJldHVybiAwIDsKfQoKdGVtcGxhdGU8Y2xhc3Mg S2V5VCwgY2xhc3MgVmFsdWVULAoJCQljbGFzcyBDb21wYXJlLAoJCQljbGFzcyBUYWJsZVQ+CmJv b2wgQlNUYWJsZTxLZXlULCBWYWx1ZVQsIENvbXBhcmUsIFRhYmxlVD46OkZpbmRNdWx0aShjb25z dCBLZXlUICZrZXksCglFbGVtZW50VHlwZSAqJmxvdywgRWxlbWVudFR5cGUgKiZoaWdoICkKewoJ RWxlbWVudFR5cGUgKmxvd2VyLCAqbWlkLCAqdXBwZXI7CglpbnQga2V5UmVsYXRpb247CgoJaWYg KCEgVGFibGUpCgl7CgkJTGFzdEZvdW5kID0gMDsKCQlyZXR1cm4gMCA7Cgl9CgoJbG93ZXIgPSBU YWJsZTsKCXVwcGVyID0gVGFibGUgKyBUYWJsZUxlbmd0aCAtIDE7Cgl3aGlsZSAoMSkKCXsKCQlp ZiAoIHVwcGVyIDwgbG93ZXIgKQoJCXsKCQkJIAoJCQlMYXN0Rm91bmQgPSAwOwoJCQlyZXR1cm4g MCA7CgkJfQoKCQltaWQgPSBsb3dlciArICggKHVwcGVyLWxvd2VyKSAvIDIpOwoJCWtleVJlbGF0 aW9uID0gQ29tcGFyZTo6Q29tcGFyZShrZXksIG1pZC0+S2V5KTsKCgkJaWYgKCBrZXlSZWxhdGlv biA8IDAgKQoJCQl1cHBlciA9IG1pZCAtIDE7CgkJZWxzZSBpZiAoIGtleVJlbGF0aW9uID4gMCAp CgkJCWxvd2VyID0gbWlkICsgMTsKCQllbHNlICAKCQl7CgkJCUVsZW1lbnRUeXBlICpsb3dFbmQg PSBUYWJsZSAtIDE7CgkJCUVsZW1lbnRUeXBlICpoaWdoRW5kID0gVGFibGUgKyBUYWJsZUxlbmd0 aDsKCgkJCWxvd2VyID0gbWlkIC0gMTsKCQkJd2hpbGUgKCBsb3dlciAhPSBsb3dFbmQgJiYgQ29t cGFyZTo6Q29tcGFyZShrZXksIGxvd2VyLT5LZXkpID09IDAgKQoJCQkJbG93ZXItLTsKCgkJCXVw cGVyID0gbWlkICsgMTsKCQkJd2hpbGUgKCB1cHBlciAhPSBoaWdoRW5kICYmIENvbXBhcmU6OkNv bXBhcmUoa2V5LCB1cHBlci0+S2V5KSA9PSAwICkKCQkJCXVwcGVyKys7CgkJCQoJCQlsb3cgPSBs b3dlciArIDE7CgkJCWhpZ2ggPSB1cHBlciAtIDE7CgkJCXJldHVybiAxIDsKCQl9Cgl9Cn0KCnRl bXBsYXRlPGNsYXNzIEtleVQsIGNsYXNzIFZhbHVlVCwKCQkJY2xhc3MgQ29tcGFyZSwKCQkJY2xh c3MgVGFibGVUPgpCU0VsZW1lbnQ8S2V5VCwgVmFsdWVUPiAqQlNUYWJsZTxLZXlULCBWYWx1ZVQs IENvbXBhcmUsIFRhYmxlVD46OkZpbmQoY29uc3QgS2V5VCAma2V5KQp7CglFbGVtZW50VHlwZSAq bG93ZXIsICptaWQsICp1cHBlcjsKCWludCBrZXlSZWxhdGlvbjsKCglpZiAoISBUYWJsZSkKCXsK CQlMYXN0Rm91bmQgPSAwOwoJCXJldHVybiAwOwoJfQoKCWxvd2VyID0gVGFibGU7Cgl1cHBlciA9 IFRhYmxlICsgVGFibGVMZW5ndGggLSAxOwoJd2hpbGUgKDEpCgl7CgkJaWYgKCB1cHBlciA8IGxv d2VyICkKCQl7CgkJCSAKCQkJTGFzdEZvdW5kID0gMDsKCQkJcmV0dXJuIDA7CgkJfQoKCQltaWQg PSBsb3dlciArICggKHVwcGVyLWxvd2VyKSAvIDIpOwoJCWtleVJlbGF0aW9uID0gQ29tcGFyZTo6 Q29tcGFyZShrZXksIG1pZC0+S2V5KTsKCgkJaWYgKCBrZXlSZWxhdGlvbiA8IDAgKQoJCQl1cHBl ciA9IG1pZCAtIDE7CgkJZWxzZSBpZiAoIGtleVJlbGF0aW9uID4gMCApCgkJCWxvd2VyID0gbWlk ICsgMTsKCQllbHNlICAKCQl7CgkJCUxhc3RGb3VuZCA9IG1pZDsKCQkJcmV0dXJuIG1pZDsKCQl9 Cgl9Cn0KCiMgMjQ3ICIuLi9pbmNsdWRlL0JTVGFibGUuaCIKCgp0ZW1wbGF0ZTwgY2xhc3MgS2V5 VCwgY2xhc3MgVmFsdWVULAoJCQljbGFzcyBDb21wYXJlLAoJCQljbGFzcyBUYWJsZVQ+CmludCBC U1RhYmxlPEtleVQsIFZhbHVlVCwgQ29tcGFyZSwgVGFibGVUPjo6UmVtb3ZlTGFzdEZvdW5kKCkK ewoJaWYgKExhc3RGb3VuZCkKCXsKCQlCYXNlVHlwZTo6RGVsZXRlKExhc3RGb3VuZCAtIFRhYmxl KTsKCQlMYXN0Rm91bmQgPSAwOwoJCXJldHVybiAxIDsKCX0KCWVsc2UKCQlyZXR1cm4gMCA7Cn0K CnRlbXBsYXRlPCBjbGFzcyBLZXlULCBjbGFzcyBWYWx1ZVQsCgkJCWNsYXNzIENvbXBhcmUsCgkJ CWNsYXNzIFRhYmxlVD4KQlNUYWJsZTxLZXlULCBWYWx1ZVQsIENvbXBhcmUsIFRhYmxlVD46OgoJ CUVsZW1lbnRUeXBlICpCU1RhYmxlPEtleVQsIFZhbHVlVCwgQ29tcGFyZSwgVGFibGVUPjo6CgkJ SW5zZXJ0TXVsdGkoY29uc3QgS2V5VCAma2V5LCBjb25zdCBWYWx1ZVQgJnZhbCkKewoJRWxlbWVu dFR5cGUgKmxvd2VyLCAqbWlkLCAqdXBwZXI7CglpbnQga2V5UmVsYXRpb24sIGluc2VydFBvczsK CgoJaWYgKFRhYmxlTGVuZ3RoID09IDApCgl7CgkJIAoKCQlsb3dlciA9IFRhYmxlOwoJCWdvdG8g SW5zZXJ0OwoJfQoKCWxvd2VyID0gVGFibGU7Cgl1cHBlciA9IFRhYmxlICsgVGFibGVMZW5ndGgg LSAxOwoJd2hpbGUgKDEpCgl7CgkJaWYgKCB1cHBlciA8IGxvd2VyICkKCQl7CgkJCSAKCgkJCWdv dG8gSW5zZXJ0OwoJCX0KCgkJbWlkID0gbG93ZXIgKyAoICh1cHBlci1sb3dlcikgLyAyKTsKCQlr ZXlSZWxhdGlvbiA9IENvbXBhcmU6OkNvbXBhcmUoa2V5LCBtaWQtPktleSk7CgoJCWlmICgga2V5 UmVsYXRpb24gPCAwICkKCQkJdXBwZXIgPSBtaWQgLSAxOwoJCWVsc2UgaWYgKCBrZXlSZWxhdGlv biA+IDAgKQoJCQlsb3dlciA9IG1pZCArIDE7CgkJZWxzZSAgCgkJewoJCQlsb3dlciA9IG1pZDsK CQkJZ290byBJbnNlcnQ7CgkJfQoJfQoKSW5zZXJ0OgoJIAoJaW5zZXJ0UG9zID0gbG93ZXIgLSBU YWJsZTsKCgkgCglUYWJsZUxlbmd0aCA9IE1ha2VSYXdTcGFjZUZvcihpbnNlcnRQb3MsIDEpOwoJ bmV3KFRhYmxlICsgaW5zZXJ0UG9zKSBFbGVtZW50VHlwZShrZXksIHZhbCk7CgoJIAoJTGFzdEZv dW5kID0gVGFibGUgKyBpbnNlcnRQb3M7CglyZXR1cm4gTGFzdEZvdW5kOwp9CgoKdGVtcGxhdGU8 IGNsYXNzIEtleVQsIGNsYXNzIFZhbHVlVCwKCQkJY2xhc3MgQ29tcGFyZSwKCQkJY2xhc3MgVGFi bGVUPgpCU1RhYmxlPEtleVQsIFZhbHVlVCwgQ29tcGFyZSwgVGFibGVUPjo6CgkJRWxlbWVudFR5 cGUgKkJTVGFibGU8S2V5VCwgVmFsdWVULCBDb21wYXJlLCBUYWJsZVQ+OjoKCQlJbnNlcnQoY29u c3QgS2V5VCAma2V5LCBjb25zdCBWYWx1ZVQgJnZhbCkKewoJRWxlbWVudFR5cGUgKmxvd2VyLCAq bWlkLCAqdXBwZXI7CglpbnQga2V5UmVsYXRpb24sIGluc2VydFBvczsKCgoJaWYgKFRhYmxlTGVu Z3RoID09IDApCgl7CgkJIAoKCQlsb3dlciA9IFRhYmxlOwoJCWdvdG8gSW5zZXJ0OwoJfQoKCWxv d2VyID0gVGFibGU7Cgl1cHBlciA9IFRhYmxlICsgVGFibGVMZW5ndGggLSAxOwoJd2hpbGUgKDEp Cgl7CgkJaWYgKCB1cHBlciA8IGxvd2VyICkKCQl7CgkJCSAKCgkJCWdvdG8gSW5zZXJ0OwoJCX0K CgkJbWlkID0gbG93ZXIgKyAoICh1cHBlci1sb3dlcikgLyAyKTsKCQlrZXlSZWxhdGlvbiA9IENv bXBhcmU6OkNvbXBhcmUoa2V5LCBtaWQtPktleSk7CgoJCWlmICgga2V5UmVsYXRpb24gPCAwICkK CQkJdXBwZXIgPSBtaWQgLSAxOwoJCWVsc2UgaWYgKCBrZXlSZWxhdGlvbiA+IDAgKQoJCQlsb3dl ciA9IG1pZCArIDE7CgkJZWxzZSAgCgkJewoJCQlMYXN0Rm91bmQgPSBtaWQ7CgkJCXJldHVybiAw OwoJCX0KCX0KCkluc2VydDoKCSAKCWluc2VydFBvcyA9IGxvd2VyIC0gVGFibGU7CgoJIAoJVGFi bGVMZW5ndGggPSBNYWtlUmF3U3BhY2VGb3IoaW5zZXJ0UG9zLCAxKTsKCW5ldyhUYWJsZSArIGlu c2VydFBvcykgRWxlbWVudFR5cGUoa2V5LCB2YWwpOwoKCSAKCUxhc3RGb3VuZCA9IFRhYmxlICsg aW5zZXJ0UG9zOwoJcmV0dXJuIExhc3RGb3VuZDsKfQoKCnRlbXBsYXRlPCBjbGFzcyBLZXlULCBj bGFzcyBWYWx1ZVQsCgkJCWNsYXNzIENvbXBhcmUsCgkJCWNsYXNzIFRhYmxlVD4KQlNUYWJsZTxL ZXlULCBWYWx1ZVQsIENvbXBhcmUsIFRhYmxlVD46OgoJCUVsZW1lbnRUeXBlICpCU1RhYmxlPEtl eVQsIFZhbHVlVCwgQ29tcGFyZSwgVGFibGVUPjo6CgkJSW5zZXJ0KGNvbnN0IEtleVQgJmtleSkK ewoJRWxlbWVudFR5cGUgKmxvd2VyLCAqbWlkLCAqdXBwZXI7CglpbnQga2V5UmVsYXRpb24sIGlu c2VydFBvczsKCgoJaWYgKFRhYmxlTGVuZ3RoID09IDApCgl7CgkJIAoKCQlsb3dlciA9IFRhYmxl OwoJCWdvdG8gSW5zZXJ0OwoJfQoKCWxvd2VyID0gVGFibGU7Cgl1cHBlciA9IFRhYmxlICsgVGFi bGVMZW5ndGggLSAxOwoJd2hpbGUgKDEpCgl7CgkJaWYgKCB1cHBlciA8IGxvd2VyICkKCQl7CgkJ CSAKCgkJCWdvdG8gSW5zZXJ0OwoJCX0KCgkJbWlkID0gbG93ZXIgKyAoICh1cHBlci1sb3dlcikg LyAyKTsKCQlrZXlSZWxhdGlvbiA9IENvbXBhcmU6OkNvbXBhcmUoa2V5LCBtaWQtPktleSk7CgoJ CWlmICgga2V5UmVsYXRpb24gPCAwICkKCQkJdXBwZXIgPSBtaWQgLSAxOwoJCWVsc2UgaWYgKCBr ZXlSZWxhdGlvbiA+IDAgKQoJCQlsb3dlciA9IG1pZCArIDE7CgkJZWxzZSAgCgkJewoJCQlMYXN0 Rm91bmQgPSBtaWQ7CgkJCXJldHVybiAwOwoJCX0KCX0KCkluc2VydDoKCSAKCWluc2VydFBvcyA9 IGxvd2VyIC0gVGFibGU7CgoJIAoJVGFibGVMZW5ndGggPSBNYWtlUmF3U3BhY2VGb3IoaW5zZXJ0 UG9zLCAxKTsKCW5ldyhUYWJsZSArIGluc2VydFBvcykgRWxlbWVudFR5cGUoa2V5KTsKCgkgCglM YXN0Rm91bmQgPSBUYWJsZSArIGluc2VydFBvczsKCXJldHVybiBMYXN0Rm91bmQ7Cn0KCgojIDEy ICIuLi9pbmNsdWRlL0ZzbUJhc2VWay5oIiAyCgoKdGVtcGxhdGUgPCBjbGFzcyBTdGF0ZSwgCgkJ CWNsYXNzIFRyYW5zaXRpb25GdW5jLAoJCQljbGFzcyBUcmFuc2l0aW9uID4gc3RydWN0IEZzbVN0 YXRlVmsKCQk6IHB1YmxpYyBEb3VibGVMaXN0RWw8U3RhdGU+CnsKCUZzbVN0YXRlVmsoKTsKCUZz bVN0YXRlVmsoRnNtU3RhdGVWayAmb3RoZXIpOwoKCXR5cGVkZWYgQlNUYWJsZTwgaW50LCBUcmFu c2l0aW9uKiwgT3JkaW5hbENvbXBhcmU8aW50PiA+IFRyYW5zTGlzdFR5cGU7CgoJVHJhbnNMaXN0 VHlwZSBPdXRMaXN0OwoJVHJhbnNMaXN0VHlwZSBJbkxpc3Q7CgoJaW50IE51bTsKCgkgCglTdGF0 ZSAqc3RhdGVNYXA7CgoJIAoJaW50IGluVHJhbnNDb3VudCwgb3V0VHJhbnNDb3VudDsKCgkgCgli b29sIElzRmluU3RhdGU7CgoJIAoJYm9vbCBJc01hcmtlZDsKCgkgCglpbnQgU3RhdGVCaXRzOwoK CSAKCVRyYW5zaXRpb24gb3V0VHJhbnNpdGlvbjsKCgkgCgoKCXR5cGVkZWYgVmVjdG9yU2V0PCBT dGF0ZSosIE9yZGluYWxDb21wYXJlPFN0YXRlKj4gPiBTdGF0ZVNldDsKCgkgCglTdGF0ZVNldCAq c3RhdGVTZXQ7CgoJIAoJdm9pZCBGdXNlU3RhdGUoIFN0YXRlICpvdGhlclN0YXRlICkgeyB9Cgl2 b2lkIE1lcmdlU3RhdGUoIFN0YXRlICpvdGhlclN0YXRlICkgeyB9Cn07CgogCgoKdGVtcGxhdGUg PCBjbGFzcyBTdGF0ZSwgY2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRpb24gPgoJ CXN0cnVjdCBGc21CYXNlVmsgOiBwdWJsaWMgRG91YmxlTGlzdDwgU3RhdGUgPgp7CnB1YmxpYzoK CSAKCXR5cGVkZWYgRG91YmxlTGlzdDwgU3RhdGUgPiBCYXNlTGlzdFR5cGU7Cgl0eXBlZGVmIEJT VGFibGU8IGludCwgVHJhbnNpdGlvbiosIE9yZGluYWxDb21wYXJlPGludD4gPiBUcmFuc0xpc3RU eXBlOwoJdHlwZWRlZiBCU0VsZW1lbnQ8IGludCwgVHJhbnNpdGlvbiogPiBUcmFuc0VsOwoKCSAK CglzdHJ1Y3QgUFN0YXRlU2V0Q29tcGFyZSA6IHB1YmxpYyBUYWJsZUNvbXBhcmU8IFN0YXRlKiwg T3JkaW5hbENvbXBhcmU8U3RhdGUqPiA+Cgl7CgkJdHlwZWRlZiBUYWJsZUNvbXBhcmU8IFN0YXRl KiwgT3JkaW5hbENvbXBhcmU8U3RhdGUqPiA+IEJhc2VUeXBlOwoJCXN0YXRpYyBpbnQgQ29tcGFy ZSh0eXBlbmFtZSBTdGF0ZTo6U3RhdGVTZXQgKnNldDEsCgkJCQkJdHlwZW5hbWUgU3RhdGU6OlN0 YXRlU2V0ICpzZXQyKSB7CgkJCXJldHVybiBCYXNlVHlwZTo6Q29tcGFyZSgqc2V0MSwgKnNldDIp OwoJCX0KCX07CgoJIAoKCXR5cGVkZWYgQVZMVHJlZTx0eXBlbmFtZSBTdGF0ZTo6U3RhdGVTZXQq LCBTdGF0ZSosCgkJCVBTdGF0ZVNldENvbXBhcmU+IFN0YXRlRGljdDsKCgkgCgl0eXBlZGVmIERv dWJsZUxpc3Q8IFN0YXRlID4gU3RhdGVGaWxsSW5MaXN0OwoKCXR5cGVkZWYgTWFya0luZGV4VG1w bDwgU3RhdGUgPiBNYXJrSW5kZXg7CgoJIAoJU3RhdGUgKlN0YXJ0U3RhdGU7Cgl0eXBlbmFtZSBT dGF0ZTo6U3RhdGVTZXQgRmluU3RhdGVTZXQ7CgoJRnNtQmFzZVZrKCkge30KCUZzbUJhc2VWayhG c21CYXNlVmsgJmdyYXBoKTsKCgl2b2lkIEF0dGFjaFN0YXRlcyhTdGF0ZSAqZnJvbSwgU3RhdGUg KnRvLCBpbnQgb25DaGFyKTsKCXZvaWQgQXR0YWNoU3RhdGVzKFN0YXRlICpmcm9tLCBTdGF0ZSAq dG8sIFRyYW5zaXRpb24gKnRyYW5zLCBpbnQgb25DaGFyKTsKCXZvaWQgRGV0YWNoU3RhdGVzKFN0 YXRlICpmcm9tLCBTdGF0ZSAqdG8sIFRyYW5zaXRpb24gKnRyYW5zLCBpbnQgb25DaGFyKTsKCgkg CglTdGF0ZSAqRGV0YWNoU3RhdGUoIFN0YXRlICpzdGF0ZSApOwoKCXZvaWQgRHVtcFRyYW5zaXRp b24oIEZJTEUgKmZpbGUsIGludCBvbkNoYXIsIFRyYW5zaXRpb24gKnRyYW5zICk7Cgl2b2lkIER1 bXBUcmFuc2l0aW9ucyggRklMRSAqZmlsZSwgdHlwZW5hbWUgU3RhdGU6Ok91dExpc3RUeXBlICps aXN0ICk7CgoJIAoJdm9pZCBTZXRGaW5TdGF0ZShTdGF0ZSAqc3RhdGUpOwoJdm9pZCBVbnNldEZp blN0YXRlKFN0YXRlICpzdGF0ZSk7CgoJIAoJdm9pZCBBbGxUcmFuc1ByaW9yKCBpbnQgZGVsdGEg KTsKCgkgCgl2b2lkIEZpbkZTTVByaW9yKCBpbnQgZGVsdGEgKTsKCgkgCgl2b2lkIExlYXZlRlNN UHJpb3IoIGludCBkZWx0YSApOwoKCSAKCXZvaWQgQWxsVHJhbnNGdW5jKCBUcmFuc2l0aW9uRnVu YyAqZnVuY3MsIGludCBudW1GdW5jcyApOwoKCSAKCXZvaWQgRmluRlNNRnVuYyggVHJhbnNpdGlv bkZ1bmMgKmZ1bmNzLCBpbnQgbnVtRnVuY3MgKTsKCgkgCgl2b2lkIExlYXZlRlNNRnVuYyggVHJh bnNpdGlvbkZ1bmMgKmZ1bmNzLCBpbnQgbnVtRnVuY3MgKTsKCgkgCgl2b2lkIFN0cmlwQWxsRnVu Y3Rpb25zKCk7CgoJIAoJdm9pZCBGU01BdHRhY2hTdGF0ZXMoIFN0YXRlRGljdCAmc3RhdGVEaWN0 LCBTdGF0ZUZpbGxJbkxpc3QgJnN0ZmlsLAoJCQlTdGF0ZSAqZnJvbSwgU3RhdGUgKnRvLCBpbnQg b25DaGFyLAoJCQlUcmFuc2l0aW9uICpzcmNUcmFucywKCQkJYm9vbCBsZWF2aW5nRlNNICk7CgoJ IAoJdm9pZCBPdXRUcmFuc0NvcHkoU3RhdGVEaWN0ICZzdGF0ZURpY3QsIFN0YXRlRmlsbEluTGlz dCAmc3RmaWwsCgkJCVN0YXRlICpkZXN0LCB0eXBlbmFtZSBTdGF0ZTo6VHJhbnNMaXN0VHlwZSAq c3JjTGlzdCwgYm9vbCBsZWF2aW5nRlNNKTsKCXZvaWQgT3V0VHJhbnNDb3B5KFN0YXRlRGljdCAm c3RhdGVEaWN0LCBTdGF0ZUZpbGxJbkxpc3QgJnN0ZmlsLAoJCQlTdGF0ZSAqZGVzdCwgU3RhdGUg KnNyYywgYm9vbCBsZWF2aW5nRlNNKTsKCgkgCgl2b2lkIEluVHJhbnNNb3ZlKFN0YXRlICpkZXN0 LCBTdGF0ZSAqc3JjKTsKCgkgCgl2b2lkIE1hcmtQYWlyc09uSW4oIE1hcmtJbmRleCAmbWFya0lu ZGV4LCBTdGF0ZSAqciwgU3RhdGUgKnMgKTsKCgkgCglib29sIFNob3VsZE1hcmtQYWlyVHJhbnNE YXRhKE1hcmtJbmRleCAmbWFya0luZGV4LCBTdGF0ZSAqciwgU3RhdGUgKnMpOwoKCSAKCXZvaWQg TWFya1JlYWNoYWJsZUZyb21IZXJlUmV2ZXJzZSggU3RhdGUgKnN0YXRlICk7CgoJIAoJdm9pZCBN YXJrUmVhY2hhYmxlRnJvbUhlcmUoIFN0YXRlICpzdGF0ZSApOwp9OwoKCiMgNyAidGVzdEZzbUdy YXBoLmNwcCIgMgoKIyAxICIuLi9pbmNsdWRlL0ZzbUJhc2VWa0ltcC5oIiAxCiAKCgoKCgoKCgoK CiAKCgp0ZW1wbGF0ZTwgY2xhc3MgU3RhdGUsIGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFzcyBU cmFuc2l0aW9uID4KCQlGc21TdGF0ZVZrPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlv bj46OkZzbVN0YXRlVmsoKSA6CgkJT3V0TGlzdCgpLCBJbkxpc3QoKSwKCQlvdXRUcmFuc2l0aW9u KCkKewoJIAoJTnVtID0gMDsKCXN0YXRlTWFwID0gMDsKCWluVHJhbnNDb3VudCA9IDA7CglvdXRU cmFuc0NvdW50ID0gMDsKCgkgCglJc0ZpblN0YXRlID0gMCA7CglJc01hcmtlZCA9IDAgOwoJU3Rh dGVCaXRzID0gMDsKCXN0YXRlU2V0ID0gMDsKfQoKIAoKCnRlbXBsYXRlPCBjbGFzcyBTdGF0ZSwg Y2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRpb24gPgoJCUZzbVN0YXRlVms8U3Rh dGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uPjo6CgkJRnNtU3RhdGVWayhGc21TdGF0ZVZr ICZvdGhlcikgOgoJCU91dExpc3Qob3RoZXIuT3V0TGlzdCksIEluTGlzdChvdGhlci5Jbkxpc3Qp LAoJCW91dFRyYW5zaXRpb24ob3RoZXIub3V0VHJhbnNpdGlvbikKCQkKewoJIAoKCSAKCU51bSA9 IG90aGVyLk51bTsKCXN0YXRlTWFwID0gMDsKCWluVHJhbnNDb3VudCA9IG90aGVyLmluVHJhbnND b3VudDsKCW91dFRyYW5zQ291bnQgPSBvdGhlci5vdXRUcmFuc0NvdW50OwoKCSAKCUlzRmluU3Rh dGUgPSBvdGhlci5Jc0ZpblN0YXRlOwoJSXNNYXJrZWQgPSBvdGhlci5Jc01hcmtlZDsKCVN0YXRl Qml0cyA9IG90aGVyLlN0YXRlQml0czsKCXN0YXRlU2V0ID0gb3RoZXIuc3RhdGVTZXQ7CgoJIAoJ VHJhbnNFbCAqdGVsID0gSW5MaXN0LlRhYmxlOwoJaW50IG50ZWwgPSBJbkxpc3QuVGFibGVMZW5n dGg7Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBudGVsOyBpKyssIHRlbCsrICkKCQl0ZWwtPlZhbHVl ID0gMDsKfQoKIAoKCnRlbXBsYXRlIDwgY2xhc3MgU3RhdGUsIGNsYXNzIFRyYW5zaXRpb25GdW5j LCBjbGFzcyBUcmFuc2l0aW9uID4KCQlGc21CYXNlVms8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBU cmFuc2l0aW9uPjo6CgkJRnNtQmFzZVZrKEZzbUJhc2VWayAmZ3JhcGgpIDoKCQlTdGFydFN0YXRl KDApLCBGaW5TdGF0ZVNldCgpCnsKCSAKCVN0YXRlICpvcmlnU3RhdGUgPSBncmFwaC5IZWFkOwoJ d2hpbGUgKCBvcmlnU3RhdGUgIT0gMCApIHsKCQkgCgkJU3RhdGUgKm5ld1N0YXRlID0gbmV3IFN0 YXRlKCpvcmlnU3RhdGUpOwoKCQkgCgkJQmFzZUxpc3RUeXBlOjpBZGRFbmQoIG5ld1N0YXRlICk7 CgoJCSAKCQlvcmlnU3RhdGUtPnN0YXRlTWFwID0gbmV3U3RhdGU7CgoJCSAKCQlvcmlnU3RhdGUg PSBvcmlnU3RhdGUtPk5leHQ7Cgl9CgkKCSAKCVN0YXRlICpzdGF0ZSA9IEhlYWQ7Cgl3aGlsZSAo IHN0YXRlICE9IDAgKSB7CgkJIAoKCQlUcmFuc0VsICp0ZWwgPSBzdGF0ZS0+T3V0TGlzdC5UYWJs ZTsKCQlpbnQgbnRlbCA9IHN0YXRlLT5PdXRMaXN0LlRhYmxlTGVuZ3RoOwoJCWZvciAoaW50IGkg PSAwOyBpIDwgbnRlbDsgaSsrLCB0ZWwrKyApIHsKCQkJIAoJCQlUcmFuc2l0aW9uICp0cmFucyA9 IHRlbC0+VmFsdWU7CgkJCVN0YXRlICp0byA9IHRyYW5zLT50b1N0YXRlLT5zdGF0ZU1hcDsKCgkJ CSAKCQkJdHJhbnMgPSBuZXcgVHJhbnNpdGlvbigqdHJhbnMpOwoKCQkJIAoJCQl0cmFucy0+ZnJv bVN0YXRlID0gMDsKCQkJdHJhbnMtPnRvU3RhdGUgPSAwOwoJCQlBdHRhY2hTdGF0ZXMoIHN0YXRl LCB0bywgdHJhbnMsIHRlbC0+S2V5ICk7CgkJfQoJCXN0YXRlID0gc3RhdGUtPk5leHQ7Cgl9CgoJ IAoJU3RhcnRTdGF0ZSA9IGdyYXBoLlN0YXJ0U3RhdGUtPnN0YXRlTWFwOwoJCgkgCglTdGF0ZSAq KnN0ID0gZ3JhcGguRmluU3RhdGVTZXQuVGFibGU7CglpbnQgbnN0ID0gZ3JhcGguRmluU3RhdGVT ZXQuVGFibGVMZW5ndGg7Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBuc3Q7IGkrKywgc3QrKyApCgkJ RmluU3RhdGVTZXQuU2V0KCgqc3QpLT5zdGF0ZU1hcCk7Cn0KCnRlbXBsYXRlIDwgY2xhc3MgU3Rh dGUsIGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFzcyBUcmFuc2l0aW9uID4KCQl2b2lkIEZzbUJh c2VWazxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24+OjoKCQlBdHRhY2hTdGF0ZXMo IFN0YXRlICpmcm9tLCBTdGF0ZSAqdG8sIGludCBvbkNoYXIgKQp7CgkgCglpZiAoIGZyb20tPk91 dExpc3QuSW5zZXJ0KCBvbkNoYXIsIDAgKSApCgkJVHJhbnNFbCAqdGVsID0gZnJvbS0+T3V0TGlz dC5MYXN0Rm91bmQ7CgkJdGVsLT5WYWx1ZSA9IG5ldyBUcmFuc2l0aW9uKCk7Cgl9CglUcmFuc2l0 aW9uICp0cmFucyA9IGZyb20tPk91dExpc3QuTGFzdEZvdW5kLT5WYWx1ZTsKCglBdHRhY2hTdGF0 ZXMoIGZyb20sIHRvLCB0cmFucywgb25DaGFyICk7Cn07CgoKdGVtcGxhdGUgPCBjbGFzcyBTdGF0 ZSwgY2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRpb24gPgoJCXZvaWQgRnNtQmFz ZVZrPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbj46OgoJCUF0dGFjaFN0YXRlcygg U3RhdGUgKmZyb20sIFN0YXRlICp0bywgVHJhbnNpdGlvbiAqdHJhbnMsIGludCBvbkNoYXIgKQp7 CgkgCglpZiAoISggIHRyYW5zLT50b1N0YXRlID09IF9fbnVsbCAgICkpIHsgY2VyciA8PCAiQXNz ZXJ0aW9uIGZhaWxlZDogbGluZSAiIDw8IDE0MSA8PCAiIGZpbGUgIiA8PCAiLi4vaW5jbHVkZS9G c21CYXNlVmtJbXAuaCIgPDwgIlxuIjsgYWJvcnQoKTsgfSA7CglpZiAoISggIHRyYW5zLT5mcm9t U3RhdGUgPT0gX19udWxsICAgKSkgeyBjZXJyIDw8ICJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICIg PDwgMTQyIDw8ICIgZmlsZSAiIDw8ICIuLi9pbmNsdWRlL0ZzbUJhc2VWa0ltcC5oIiA8PCAiXG4i OyBhYm9ydCgpOyB9IDsKCgkgCgl0by0+SW5MaXN0Lkluc2VydCggb25DaGFyLCAwICk7CgoJIAoJ VHJhbnNpdGlvbiAqJmluVHJhbnNQdHIgPSB0by0+SW5MaXN0Lkxhc3RGb3VuZC0+VmFsdWU7CgoJ IAoJdHJhbnMtPmZyb21TdGF0ZSA9IGZyb207Cgl0cmFucy0+dG9TdGF0ZSA9IHRvOwoKCXRyYW5z LT5OZXh0ID0gaW5UcmFuc1B0cjsKCXRyYW5zLT5QcmV2ID0gMDsKCgkgCglpZiAoIGluVHJhbnNQ dHIgKQoJCWluVHJhbnNQdHItPlByZXYgPSB0cmFuczsKCgkgCglpblRyYW5zUHRyID0gdHJhbnM7 CgoJIAoJZnJvbS0+b3V0VHJhbnNDb3VudCArPSAxOwoJdG8tPmluVHJhbnNDb3VudCArPSAxOwp9 OwoKdGVtcGxhdGUgPCBjbGFzcyBTdGF0ZSwgY2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRy YW5zaXRpb24gPgoJCXZvaWQgRnNtQmFzZVZrPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNp dGlvbj46OgoJCURldGFjaFN0YXRlcyhTdGF0ZSAqZnJvbSwgU3RhdGUgKnRvLCBUcmFuc2l0aW9u ICp0cmFucywgaW50IG9uQ2hhcikKewoJIAoJaWYgKCEoICB0cmFucy0+dG9TdGF0ZSA9PSB0byAg KSkgeyBjZXJyIDw8ICJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICIgPDwgMTc0IDw8ICIgZmlsZSAi IDw8ICIuLi9pbmNsdWRlL0ZzbUJhc2VWa0ltcC5oIiA8PCAiXG4iOyBhYm9ydCgpOyB9IDsKCgkg CglUcmFuc0VsICp0ZWwgPSB0by0+SW5MaXN0LkZpbmQoIG9uQ2hhciApOwoJaWYgKCEoICB0ZWwg IT0gX19udWxsICAgKSkgeyBjZXJyIDw8ICJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICIgPDwgMTc4 IDw8ICIgZmlsZSAiIDw8ICIuLi9pbmNsdWRlL0ZzbUJhc2VWa0ltcC5oIiA8PCAiXG4iOyBhYm9y dCgpOyB9IDsKCVRyYW5zaXRpb24gKiZpblRyYW5zUHRyID0gdGVsLT5WYWx1ZTsKCgkgCglpZiAo dHJhbnMtPlByZXYgPT0gMCkgCgkJaW5UcmFuc1B0ciA9IHRyYW5zLT5OZXh0OyAKCWVsc2UKCQl0 cmFucy0+UHJldi0+TmV4dCA9IHRyYW5zLT5OZXh0OyAKCglpZiAodHJhbnMtPk5leHQgIT0gMCkg CgkJdHJhbnMtPk5leHQtPlByZXYgPSB0cmFucy0+UHJldjsgCgkKCXRyYW5zLT5mcm9tU3RhdGUg PSAwOwoJdHJhbnMtPnRvU3RhdGUgPSAwOwoKCSAKCWZyb20tPm91dFRyYW5zQ291bnQgLT0gMTsK CXRvLT5pblRyYW5zQ291bnQgLT0gMTsKfQoKdGVtcGxhdGUgPCBjbGFzcyBTdGF0ZSwgY2xhc3Mg VHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRpb24gPgoJCVN0YXRlICpGc21CYXNlVms8U3Rh dGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uPjo6CgkJRGV0YWNoU3RhdGUoIFN0YXRlICpz dGF0ZSApCnsKCSAKCVRyYW5zRWwgKnRlbCA9IHN0YXRlLT5Jbkxpc3QuVGFibGU7CglpbnQgbnRl bCA9IHN0YXRlLT5Jbkxpc3QuVGFibGVMZW5ndGg7Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBudGVs OyBpKyssIHRlbCsrICkgewoJCXdoaWxlICggdGVsLT5WYWx1ZSApIHsKCQkJIAoJCQlUcmFuc2l0 aW9uICp0cmFucyA9IHRlbC0+VmFsdWU7CgkJCVN0YXRlICpmcm9tU3RhdGUgPSB0cmFucy0+ZnJv bVN0YXRlOwoJCQkgCgkJCURldGFjaFN0YXRlcyggZnJvbVN0YXRlLCBzdGF0ZSwgdHJhbnMsIGlu VGVsLT5LZXkgKTsKCQkJIAoJCQlmcm9tU3RhdGUtPk91dExpc3QuUmVtb3ZlKCBpblRlbC0+S2V5 ICk7CgkJfQoJfQoKCSAKCVRyYW5zRWwgKnRlbCA9IHN0YXRlLT5PdXRMaXN0LlRhYmxlOwoJaW50 IG50ZWwgPSBzdGF0ZS0+T3V0TGlzdC5UYWJsZUxlbmd0aDsKCWZvciAoIGludCBpID0gMDsgaSA8 IG50ZWw7IGkrKywgdGVsKysgKSB7CgkJRGV0YWNoU3RhdGVzKCBzdGF0ZSwgdGVsLT5WYWx1ZS50 b1N0YXRlLCB0ZWwtPlZhbHVlLCBvdXRUZWwtPktleSApOwoJCWRlbGV0ZSB0ZWwtPlZhbHVlOwoJ fQoKCSAKCXN0YXRlLT5PdXRMaXN0LkVtcHR5KCk7CgoJIAoJaWYgKCBzdGF0ZS0+SXNGaW5TdGF0 ZSApCgkJVW5zZXRGaW5TdGF0ZShzdGF0ZSk7CgoJRGV0YWNoTGlzdEVsKCBzdGF0ZSApOwoJcmV0 dXJuIHN0YXRlOwp9Cgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9uRnVu YywgY2xhc3MgVHJhbnNpdGlvbiA+CgkJdm9pZCBGc21CYXNlVms8U3RhdGUsIFRyYW5zaXRpb25G dW5jLCBUcmFuc2l0aW9uPjo6CgkJRHVtcFRyYW5zaXRpb24oIEZJTEUgKmZpbGUsIGludCBvbkNo YXIsIFRyYW5zaXRpb24gKnRyYW5zICkKewoJZnByaW50ZihmaWxlLCAiICUuMmkgJS4yeCBbJWld KCIsIHRyYW5zLT50b1N0YXRlLT5OdW0sCgkJCW9uQ2hhciwgdHJhbnMtPnByaW9yaXR5ICk7CgoJ VHJhbnNpdGlvbkZ1bmMgKnRmdW5jID0gdHJhbnMtPnRyYW5zRnVuY0xpc3QuVGFibGU7CglpbnQg dGZ1bmNsZW4gPSB0cmFucy0+dHJhbnNGdW5jTGlzdC5UYWJsZUxlbmd0aDsKCWZvciAoIGludCBp ID0gMDsgaSA8IHRmdW5jbGVuOyBpKyssIHRmdW5jKysgKQoJCWZwcmludGYoZmlsZSwgIiV4LCIs ICp0ZnVuYyk7CgkJCglmcHJpbnRmKGZpbGUsICIpIHwiICk7Cn0KCnRlbXBsYXRlIDwgY2xhc3Mg U3RhdGUsIGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFzcyBUcmFuc2l0aW9uID4KCQl2b2lkIEZz bUJhc2VWazxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24+OjoKCQlEdW1wVHJhbnNp dGlvbnMoIEZJTEUgKmZpbGUsIHR5cGVuYW1lIFN0YXRlOjpUcmFuc0xpc3RUeXBlICpsaXN0ICAp CnsKCVRyYW5zRWwgKnRlbCA9IGxpc3QtPlRhYmxlOwoJaW50IG50ZWwgPSBsaXN0LT5UYWJsZUxl bmd0aDsKCWZvciAoIGludCBpID0gMDsgaSA8IG50ZWw7IGkrKywgdGVsKysgKQoJCUR1bXBUcmFu c2l0aW9uKCBmaWxlLCB0ZWwtPktleSwgdGVsLT5WYWx1ZSApOwoKCWZwcmludGYoZmlsZSwgIlxu Iik7Cn0KCnRlbXBsYXRlIDwgY2xhc3MgU3RhdGUsIGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFz cyBUcmFuc2l0aW9uID4KCQl2b2lkIEZzbUJhc2VWazxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRy YW5zaXRpb24+OjoKCQlTZXRGaW5TdGF0ZShTdGF0ZSAqc3RhdGUpCnsKCSAKCWlmIChzdGF0ZS0+ SXNGaW5TdGF0ZSkKCQlyZXR1cm47CgkKCXN0YXRlLT5Jc0ZpblN0YXRlID0gMSA7CglGaW5TdGF0 ZVNldC5TZXQoIHN0YXRlICk7Cn0KCgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFu c2l0aW9uRnVuYywgY2xhc3MgVHJhbnNpdGlvbiA+CgkJdm9pZCBGc21CYXNlVms8U3RhdGUsIFRy YW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uPjo6CgkJVW5zZXRGaW5TdGF0ZShTdGF0ZSAqc3RhdGUp CnsKCSAKCWlmICghIHN0YXRlLT5Jc0ZpblN0YXRlKQoJCXJldHVybjsKCglzdGF0ZS0+SXNGaW5T dGF0ZSA9IDAgOwoJRmluU3RhdGVTZXQuVW5TZXQoIHN0YXRlICk7Cn0KCgp0ZW1wbGF0ZSA8IGNs YXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9uRnVuYywgY2xhc3MgVHJhbnNpdGlvbiA+CgkJdm9p ZCBGc21CYXNlVms8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uPjo6CgkJQWxsVHJh bnNQcmlvciggaW50IGRlbHRhICkKewoJU3RhdGUgKnN0YXRlID0gSGVhZDsKCXdoaWxlICggc3Rh dGUgIT0gX19udWxsICApIHsKCQlUcmFuc0VsICp0ZWwgPSBzdGF0ZS0+T3V0TGlzdC5UYWJsZTsK CQlpbnQgbnRlbCA9IHN0YXRlLT5PdXRMaXN0LlRhYmxlTGVuZ3RoOwoJCWZvciAoaW50IGkgPSAw OyBpIDwgbnRlbDsgaSsrLCB0ZWwrKykKCQkJdGVsLT5WYWx1ZS0+cHJpb3JpdHkgKz0gZGVsdGE7 CgoJCXN0YXRlID0gc3RhdGUtPk5leHQ7Cgl9Cn0KCnRlbXBsYXRlIDwgY2xhc3MgU3RhdGUsIGNs YXNzIFRyYW5zaXRpb25GdW5jLCBjbGFzcyBUcmFuc2l0aW9uID4KCQl2b2lkIEZzbUJhc2VWazxT dGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24+OjoKCQlGaW5GU01QcmlvciggaW50IGRl bHRhICkKewoJU3RhdGUgKipzdCA9IEZpblN0YXRlU2V0LlRhYmxlOwoJaW50IG5zdCA9IEZpblN0 YXRlU2V0LlRhYmxlTGVuZ3RoOwoKCWZvciAoaW50IGkgPSAwOyBpIDwgbnN0OyBpKyssIHN0Kysp IHsKCQlTdGF0ZSAqdGFyZyA9ICpzdDsKCQlUcmFuc0VsICp0ZWwgPSB0YXJnLT5Jbkxpc3QuVGFi bGU7CgkJaW50IG50ZWwgPSB0YXJnLT5Jbkxpc3QuVGFibGVMZW5ndGg7CgkJZm9yIChpbnQgaiA9 IDA7IGogPCBudGVsOyBqKyssIHRlbCsrKSB7CgkJCVRyYW5zaXRpb24gKnRyYW5zID0gdGVsLT5W YWx1ZTsKCQkJd2hpbGUgKCB0cmFucyAhPSAwICkgewoJCQkJdHJhbnMtPnByaW9yaXR5ICs9IGRl bHRhOwoJCQkJdHJhbnMgPSB0cmFucy0+TmV4dDsKCQkJfQoJCX0KCX0KfQoKdGVtcGxhdGUgPCBj bGFzcyBTdGF0ZSwgY2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRpb24gPgoJCXZv aWQgRnNtQmFzZVZrPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbj46OgoJCUxlYXZl RlNNUHJpb3IoIGludCBkZWx0YSApCnsKCVN0YXRlICoqc3QgPSBGaW5TdGF0ZVNldC5UYWJsZTsK CWludCBuc3QgPSBGaW5TdGF0ZVNldC5UYWJsZUxlbmd0aDsKCglmb3IgKGludCBpID0gMDsgaSA8 IG5zdDsgaSsrLCBzdCsrKQoJCSgqc3QpLT5vdXRUcmFuc2l0aW9uLnByaW9yaXR5ICs9IGRlbHRh Owp9Cgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9uRnVuYywgY2xhc3Mg VHJhbnNpdGlvbiA+CgkJdm9pZCBGc21CYXNlVms8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFu c2l0aW9uPjo6CgkJQWxsVHJhbnNGdW5jKCBUcmFuc2l0aW9uRnVuYyAqZnVuY3MsIGludCBudW1G dW5jcyApCnsKCVN0YXRlICpzdGF0ZSA9IEhlYWQ7Cgl3aGlsZSAoIHN0YXRlICE9IF9fbnVsbCAg KSB7CgkJVHJhbnNFbCAqdGVsID0gc3RhdGUtPk91dExpc3QuVGFibGU7CgkJaW50IG50ZWwgPSBz dGF0ZS0+T3V0TGlzdC5UYWJsZUxlbmd0aDsKCQlmb3IgKGludCBpID0gMDsgaSA8IG50ZWw7IGkr KywgdGVsKyspCgkJCXRlbC0+VmFsdWUtPnRyYW5zRnVuY0xpc3QuQXBwZW5kKGZ1bmNzLCBudW1G dW5jcyk7CgoJCXN0YXRlID0gc3RhdGUtPk5leHQ7Cgl9Cn0KCnRlbXBsYXRlIDwgY2xhc3MgU3Rh dGUsIGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFzcyBUcmFuc2l0aW9uID4KCQl2b2lkIEZzbUJh c2VWazxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24+OjoKCQlGaW5GU01GdW5jKCBU cmFuc2l0aW9uRnVuYyAqZnVuY3MsIGludCBudW1GdW5jcyApCnsKCVN0YXRlICoqc3QgPSBGaW5T dGF0ZVNldC5UYWJsZTsKCWludCBuc3QgPSBGaW5TdGF0ZVNldC5UYWJsZUxlbmd0aDsKCglmb3Ig KGludCBpID0gMDsgaSA8IG5zdDsgaSsrLCBzdCsrKSB7CgkJU3RhdGUgKnRhcmcgPSAqc3Q7CgkJ VHJhbnNFbCAqdGVsID0gdGFyZy0+SW5MaXN0LlRhYmxlOwoJCWludCBudGVsID0gdGFyZy0+SW5M aXN0LlRhYmxlTGVuZ3RoOwoJCWZvciAoaW50IGogPSAwOyBqIDwgbnRlbDsgaisrLCB0ZWwrKykg ewoJCQlUcmFuc2l0aW9uICp0cmFucyA9IHRlbC0+VmFsdWU7CgkJCXdoaWxlICggdHJhbnMgIT0g MCApIHsKCQkJCXRyYW5zLT50cmFuc0Z1bmNMaXN0LkFwcGVuZChmdW5jcywgbnVtRnVuY3MpOwoJ CQkJdHJhbnMgPSB0cmFucy0+TmV4dDsKCQkJfQoJCX0KCX0KfQoKdGVtcGxhdGUgPCBjbGFzcyBT dGF0ZSwgY2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRpb24gPgoJCXZvaWQgRnNt QmFzZVZrPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbj46OgoJCUxlYXZlRlNNRnVu YyggVHJhbnNpdGlvbkZ1bmMgKmZ1bmNzLCBpbnQgbnVtRnVuY3MgKQp7CglTdGF0ZSAqKnN0ID0g RmluU3RhdGVTZXQuVGFibGU7CglpbnQgbnN0ID0gRmluU3RhdGVTZXQuVGFibGVMZW5ndGg7Cglm b3IgKGludCBpID0gMDsgaSA8IG5zdDsgaSsrLCBzdCsrKQoJCSgqc3QpLT5vdXRUcmFuc2l0aW9u LnRyYW5zRnVuY0xpc3QuQXBwZW5kKGZ1bmNzLCBudW1GdW5jcyk7Cn0KCgp0ZW1wbGF0ZSA8IGNs YXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9uRnVuYywgY2xhc3MgVHJhbnNpdGlvbiA+CgkJdm9p ZCBGc21CYXNlVms8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uPjo6U3RyaXBBbGxG dW5jdGlvbnMoKQp7CglTdGF0ZSAqc3RhdGUgPSBIZWFkOwoJd2hpbGUgKCBzdGF0ZSApIHsKCQlz dGF0ZS0+b3V0VHJhbnNpdGlvbi50cmFuc0Z1bmNMaXN0LkVtcHR5KCk7CgoJCVRyYW5zRWwgKnRl bCA9IHN0YXRlLT5PdXRMaXN0LlRhYmxlOwoJCWludCBudGVsID0gc3RhdGUtPk91dExpc3QuVGFi bGVMZW5ndGg7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBudGVsOyBpKyssIHRlbCsrKQoJCQl0ZWwt PlZhbHVlLT50cmFuc0Z1bmNMaXN0LkVtcHR5KCk7CgoJCXN0YXRlID0gc3RhdGUtPk5leHQ7Cgl9 Cn0KCiAKCgoKCgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9uRnVuYywg Y2xhc3MgVHJhbnNpdGlvbiA+CgkJdm9pZCBGc21CYXNlVms8U3RhdGUsIFRyYW5zaXRpb25GdW5j LCBUcmFuc2l0aW9uPjo6CgkJRlNNQXR0YWNoU3RhdGVzKCBTdGF0ZURpY3QgJnN0YXRlRGljdCwg U3RhdGVGaWxsSW5MaXN0ICZzdGZpbCwKCQkJU3RhdGUgKmZyb20sIFN0YXRlICp0bywgCgkJCWlu dCBvbkNoYXIsIFRyYW5zaXRpb24gKnNyY1RyYW5zLCBib29sIGxlYXZpbmdGU00gKQp7CglpbnQg bmV3VHJhbnNQcmlvciA9IHNyY1RyYW5zLT5wcmlvcml0eTsKCWlmICggbGVhdmluZ0ZTTSApCgkJ bmV3VHJhbnNQcmlvciArPSBmcm9tLT5vdXRUcmFuc2l0aW9uLnByaW9yaXR5OwoKCSAKCWlmICgg ZnJvbS0+T3V0TGlzdC5JbnNlcnQoIG9uQ2hhciwgMCApICkKCQlUcmFuc0VsICp0ZWwgPSBmcm9t LT5PdXRMaXN0Lkxhc3RGb3VuZDsKCQl0ZWwtPlZhbHVlID0gbmV3IFRyYW5zaXRpb24oKTsKCX0K CVRyYW5zaXRpb24gKnRyYW5zID0gZnJvbS0+T3V0TGlzdC5MYXN0Rm91bmQtPlZhbHVlOwoKCSAK CWlmICggdHJhbnMtPnRvU3RhdGUgICkgewoJCSAKCQlTdGF0ZSAqZXhpc3RpbmdTdGF0ZSA9IHRy YW5zLT50b1N0YXRlOwoJCQoJCWlmICggdHJhbnMtPnByaW9yaXR5ID4gbmV3VHJhbnNQcmlvciAp IHsKCQkJIAoKCgkJCXJldHVybjsKCQl9CgkJZWxzZSBpZiAoIHRyYW5zLT5wcmlvcml0eSA8IG5l d1RyYW5zUHJpb3IgKSB7CgkJCSAKCQkJRGV0YWNoU3RhdGVzKCBmcm9tLCB0cmFucy0+dG9TdGF0 ZSwgdHJhbnMsIG9uQ2hhciApOwoKCQkJIAoJCQlBdHRhY2hTdGF0ZXMoIGZyb20sIHRvLCB0cmFu cywgb25DaGFyICk7CgkJCgkJCSAKCQkJdG8tPlN0YXRlQml0cyB8PSAweDQwIDsKCgkJCSAKCQkJ dHJhbnMtPnByaW9yaXR5ID0gc3JjVHJhbnMtPnByaW9yaXR5OwoJCQl0cmFucy0+dHJhbnNGdW5j TGlzdC5TZXRBcyggc3JjVHJhbnMtPnRyYW5zRnVuY0xpc3QgKTsKCgkJCSAKCQkJdHJhbnMtPk1l cmdlVHJhbnNpdGlvbihzcmNUcmFucyk7CgkJfQoJCWVsc2UgewoJCQkgCgoKCQkJaWYgKCBleGlz dGluZ1N0YXRlID09IHRvICkgewoJCQkJIAoJCQkJdHJhbnMtPnRyYW5zRnVuY0xpc3QuQXBwZW5k KCBzcmNUcmFucy0+dHJhbnNGdW5jTGlzdCApOwoJCQl9CgkJCWVsc2UgewoJCQkJIAoJCQkJdHlw ZW5hbWUgU3RhdGU6OlN0YXRlU2V0ICpzdGF0ZVNldCA9IG5ldyB0eXBlbmFtZSBTdGF0ZTo6U3Rh dGVTZXQ7CgkJCQlpZiAoIGV4aXN0aW5nU3RhdGUtPnN0YXRlU2V0ID09IF9fbnVsbCAgKQoJCQkJ CXN0YXRlU2V0LT5TZXQoIGV4aXN0aW5nU3RhdGUgKTsKCQkJCWVsc2UKCQkJCQlzdGF0ZVNldC0+ U2V0KCAqZXhpc3RpbmdTdGF0ZS0+c3RhdGVTZXQgKTsKCQkJCXN0YXRlU2V0LT5TZXQoIHRvICk7 CgoJCQkJIAoJCQkJU3RhdGUgKnRhcmc7CgkJCQlpZiAoIHN0YXRlRGljdC5GaW5kKCBzdGF0ZVNl dCApICkgewoJCQkJCXRhcmcgPSBzdGF0ZURpY3QuTGFzdEZvdW5kLT5WYWx1ZTsJCgkJCQkJZGVs ZXRlIHN0YXRlU2V0OwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkJIAoKCgoJCQkJCXRhcmcgPSBuZXcg U3RhdGUoKTsKCQkJCQlzdGZpbC5BZGRFbmQoIHRhcmcgKTsKCQkJCQl0YXJnLT5zdGF0ZVNldCA9 IHN0YXRlU2V0OwoJCQkJCXN0YXRlRGljdC5JbnNlcnQoIHN0YXRlU2V0LCB0YXJnICk7CgkJCQl9 CgoJCQkJIAoJCQkJRGV0YWNoU3RhdGVzKCBmcm9tLCBleGlzdGluZ1N0YXRlLCB0cmFucywgb25D aGFyICk7CgoJCQkJIAoJCQkJQXR0YWNoU3RhdGVzKCBmcm9tLCB0YXJnLCB0cmFucywgb25DaGFy ICk7CgoJCQkJIAoJCQkJdGFyZy0+U3RhdGVCaXRzIHw9IDB4NDAgOwoJCQl9CgkJfQoJfQoJZWxz ZSB7CgkJIAoJCUF0dGFjaFN0YXRlcyggZnJvbSwgdG8sIHRyYW5zLCBvbkNoYXIgKTsKCQkKCQkg CgkJdG8tPlN0YXRlQml0cyB8PSAweDQwIDsKCgkJIAoJCXRyYW5zLT5wcmlvcml0eSA9IHNyY1Ry YW5zLT5wcmlvcml0eTsKCQl0cmFucy0+dHJhbnNGdW5jTGlzdC5TZXRBcyggc3JjVHJhbnMtPnRy YW5zRnVuY0xpc3QgKTsKCgkJIAoJCXRyYW5zLT5NZXJnZVRyYW5zaXRpb24oc3JjVHJhbnMpOwoJ fQoKCSAKCglpZiAoIGxlYXZpbmdGU00gKSB7CgkJIAoJCXRyYW5zLT50cmFuc0Z1bmNMaXN0Lklu c2VydCggMCwgZnJvbS0+b3V0VHJhbnNpdGlvbi50cmFuc0Z1bmNMaXN0ICk7CgkJdHJhbnMtPnBy aW9yaXR5ICs9IGZyb20tPm91dFRyYW5zaXRpb24ucHJpb3JpdHk7CgoJCSAKCQl0cmFucy0+SW5z ZXJ0VHJhbnNpdGlvbiggJmZyb20tPm91dFRyYW5zaXRpb24gKTsKCX0KfQoKCnRlbXBsYXRlIDwg Y2xhc3MgU3RhdGUsIGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFzcyBUcmFuc2l0aW9uID4KCQl2 b2lkIEZzbUJhc2VWazxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24+OjoKCQlPdXRU cmFuc0NvcHkoIFN0YXRlRGljdCAmc3RhdGVEaWN0LCBTdGF0ZUZpbGxJbkxpc3QgJnN0ZmlsLCAK CQkJCVN0YXRlICpkZXN0LCBTdGF0ZSAqc3JjLCBib29sIGxlYXZpbmdGU00gKQp7CgkgCgoJaWYg KCBzcmMgPT0gZGVzdCApIHsKCQl0eXBlbmFtZSBTdGF0ZTo6VHJhbnNMaXN0VHlwZSBsaXN0Q29w eShzcmMtPk91dExpc3QpOwoJCU91dFRyYW5zQ29weShzdGF0ZURpY3QsIHN0ZmlsLCBkZXN0LCBs aXN0Q29weSwgbGVhdmluZ0ZTTSApOwoJfQoJZWxzZQoJCU91dFRyYW5zQ29weShzdGF0ZURpY3Qs IHN0ZmlsLCBkZXN0LCBzcmMtPk91dExpc3QsIGxlYXZpbmdGU00gKTsKfQoKdGVtcGxhdGUgPCBj bGFzcyBTdGF0ZSwgY2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRpb24gPgoJCXZv aWQgRnNtQmFzZVZrPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbj46OgoJCU91dFRy YW5zQ29weSggU3RhdGVEaWN0ICZzdGF0ZURpY3QsIFN0YXRlRmlsbEluTGlzdCAmc3RmaWwsIAoJ CQkJU3RhdGUgKmRlc3QsIHR5cGVuYW1lIFN0YXRlOjpUcmFuc0xpc3RUeXBlICZzcmNMaXN0LCBi b29sIGxlYXZpbmdGU00gKQp7CgkgCglUcmFuc0VsICp0ZWwgPSBzcmNMaXN0LlRhYmxlOwoJaW50 IG50ZWwgPSBzcmNMaXN0LlRhYmxlTGVuZ3RoOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBudGVsOyBp KyssIHRlbCsrKSB7CgkJVHJhbnNpdGlvbiAqdHJhbnMgPSB0ZWwtPlZhbHVlOwoJCUZTTUF0dGFj aFN0YXRlcyggc3RhdGVEaWN0LCBzdGZpbCwgZGVzdCwgdHJhbnMtPnRvU3RhdGUsIHRlbC0+S2V5 LAoJCQkJdHJhbnMsIGxlYXZpbmdGU00gKTsKCX0KfQoKCnRlbXBsYXRlIDwgY2xhc3MgU3RhdGUs IGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFzcyBUcmFuc2l0aW9uID4KCQl2b2lkIEZzbUJhc2VW azxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24+OjoKCQlJblRyYW5zTW92ZShTdGF0 ZSAqZGVzdCwgU3RhdGUgKnNyYykKewoJIAoJaWYgKCEoICBkZXN0ICE9IHNyYyAgKSkgeyBjZXJy IDw8ICJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICIgPDwgNTU5IDw8ICIgZmlsZSAiIDw8ICIuLi9p bmNsdWRlL0ZzbUJhc2VWa0ltcC5oIiA8PCAiXG4iOyBhYm9ydCgpOyB9IDsKCglUcmFuc0VsICp0 ZWwgPSBzcmMtPkluTGlzdC5UYWJsZTsKCWludCBudGVsID0gc3JjLT5Jbkxpc3QuVGFibGVMZW5n dGg7Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBudGVsOyBpKyssIHRlbCsrICkgewoJCXdoaWxlICgg dGVsLT5WYWx1ZSAhPSBfX251bGwgICkgewoJCQlUcmFuc2l0aW9uICp0cmFucyA9IHRlbC0+VmFs dWU7CgkJCVN0YXRlICpmcm9tU3RhdGUgPSB0cmFucy0+ZnJvbVN0YXRlOwoJCQlEZXRhY2hTdGF0 ZXMoIGZyb21TdGF0ZSwgc3JjLCB0cmFucywgdGVsLT5LZXkgKTsKCQkJQXR0YWNoU3RhdGVzKCBm cm9tU3RhdGUsIGRlc3QsIHRyYW5zLCB0ZWwtPktleSApOwoJCX0KCX0KfQoKdGVtcGxhdGUgPCBj bGFzcyBTdGF0ZSwgY2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRpb24gPgoJCXZv aWQgRnNtQmFzZVZrPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbj46OgoJCU1hcmtQ YWlyc09uSW4oIE1hcmtJbmRleCAmbWFya0luZGV4LCBTdGF0ZSAqciwgU3RhdGUgKnMgKQp7Cgkg CglUcmFuc0VsICpyVHJhbnNFbCA9IHItPkluTGlzdC5UYWJsZTsKCVRyYW5zRWwgKnJFbmRUcmFu c0VsID0gclRyYW5zRWwgKyByLT5Jbkxpc3QuVGFibGVMZW5ndGg7CglUcmFuc0VsICpzVHJhbnNF bCA9IHMtPkluTGlzdC5UYWJsZTsKCVRyYW5zRWwgKnNFbmRUcmFuc0VsID0gc1RyYW5zRWwgKyBz LT5Jbkxpc3QuVGFibGVMZW5ndGg7CgoJIAoJaW50IHJJdGVtLCBzSXRlbTsKCgl3aGlsZSAoIDEg ICkgewoJCSAKCQlpZiAoIHJUcmFuc0VsID09IHJFbmRUcmFuc0VsIHx8IHNUcmFuc0VsID09IHNF bmRUcmFuc0VsICkgewoJCQkgCgkJCWJyZWFrOwoJCX0KCQllbHNlIHsKCQkJIAoKCQkJckl0ZW0g PSByVHJhbnNFbC0+S2V5OwoJCQlzSXRlbSA9IHNUcmFuc0VsLT5LZXk7CgkJCWlmICggckl0ZW0g PCBzSXRlbSApIHsKCQkJCSAKCQkJCXJUcmFuc0VsKys7CgkJCX0KCQkJZWxzZSBpZiAoIHNJdGVt IDwgckl0ZW0gKSB7CgkJCQkgCgkJCQlzVHJhbnNFbCsrOwoJCQl9CgkJCWVsc2UgewoJCQkJIAoK CQkJCWlmICggclRyYW5zRWwtPlZhbHVlID09IF9fbnVsbCAgfHwgc1RyYW5zRWwtPlZhbHVlID09 IF9fbnVsbCAgKQoJCQkJCWNvbnRpbnVlOwoKCQkJCSAKCQkJCVRyYW5zaXRpb24gKnJUcmFucyA9 IHJUcmFuc0VsLT5WYWx1ZTsKCQkJCXdoaWxlICggclRyYW5zICE9IF9fbnVsbCAgKSB7CgkJCQkJ U3RhdGUgKnAgPSByVHJhbnMtPmZyb21TdGF0ZTsKCgkJCQkJIAoJCQkJCVRyYW5zaXRpb24gKnNU cmFucyA9IHNUcmFuc0VsLT5WYWx1ZTsKCQkJCQl3aGlsZSAoIHNUcmFucyAhPSBfX251bGwgICkg ewoJCQkJCQlTdGF0ZSAqcSA9IHNUcmFucy0+ZnJvbVN0YXRlOwoKCQkJCQkJIAoJCQkJCQlpZiAo IHAgIT0gcSAmJiAhIG1hcmtJbmRleC5Jc1BhaXJNYXJrZWQocC0+TnVtLCBxLT5OdW0pICkKCQkJ CQkJCW1hcmtJbmRleC5NYXJrUGFpcihwLT5OdW0sIHEtPk51bSk7CgkJCQkKCQkJCQkJc1RyYW5z ID0gc1RyYW5zLT5OZXh0OwoJCQkJCX0KCQkJCQlyVHJhbnMgPSByVHJhbnMtPk5leHQ7CgkJCQl9 CgkJCQlyVHJhbnNFbCsrOwoJCQkJc1RyYW5zRWwrKzsgCgkJCX0KCQl9Cgl9Cn0KCnRlbXBsYXRl IDwgY2xhc3MgU3RhdGUsIGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFzcyBUcmFuc2l0aW9uID4K CQlib29sIEZzbUJhc2VWazxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24+OjoKCQlT aG91bGRNYXJrUGFpclRyYW5zRGF0YShNYXJrSW5kZXggJm1hcmtJbmRleCwgU3RhdGUgKnIsIFN0 YXRlICpzKQp7Cglib29sIHNob3VsZE1hcmtQYWlyID0gMCA7CgoJIAoJVHJhbnNFbCAqclRyYW5z RWwgPSByLT5PdXRMaXN0LlRhYmxlOwoJVHJhbnNFbCAqckVuZFRyYW5zRWwgPSByVHJhbnNFbCAr IHItPk91dExpc3QuVGFibGVMZW5ndGg7CglUcmFuc0VsICpzVHJhbnNFbCA9IHMtPk91dExpc3Qu VGFibGU7CglUcmFuc0VsICpzRW5kVHJhbnNFbCA9IHNUcmFuc0VsICsgcy0+T3V0TGlzdC5UYWJs ZUxlbmd0aDsKCgkgCglpbnQgckl0ZW0sIHNJdGVtOwoKCXdoaWxlICggMSAgKSB7CgkJIAoJCWlm ICggclRyYW5zRWwgPT0gckVuZFRyYW5zRWwgKSB7CgkJCSAKCgkJCWlmICAoIHNUcmFuc0VsICE9 IHNFbmRUcmFuc0VsICkKCQkJCXNob3VsZE1hcmtQYWlyID0gMSA7CgkJCWJyZWFrOwoJCX0KCQkg CgkJZWxzZSBpZiAoIHNUcmFuc0VsID09IHNFbmRUcmFuc0VsICkgewoJCQkgCgoJCQlzaG91bGRN YXJrUGFpciA9IDEgOwoJCQlicmVhazsKCQl9CgkJZWxzZSB7CgkJCSAKCgkJCXJJdGVtID0gclRy YW5zRWwtPktleTsKCQkJc0l0ZW0gPSBzVHJhbnNFbC0+S2V5OwoJCQlpZiAoIHJJdGVtIDwgc0l0 ZW0gKSB7CgkJCQkgCgkJCQlzaG91bGRNYXJrUGFpciA9IDEgOwoJCQkJYnJlYWs7CgkJCX0KCQkJ ZWxzZSBpZiAoIHNJdGVtIDwgckl0ZW0gKSB7CgkJCQkgCgkJCQlzaG91bGRNYXJrUGFpciA9IDEg OwoJCQkJYnJlYWs7CgkJCX0KCQkJZWxzZSB7CgkJCQlpZiAoIG1hcmtJbmRleC5Jc1BhaXJNYXJr ZWQoIHJUcmFuc0VsLT5WYWx1ZS0+dG9TdGF0ZS0+TnVtLAoJCQkJCQkJc1RyYW5zRWwtPlZhbHVl LT50b1N0YXRlLT5OdW0gKSApCgkJCQkJc2hvdWxkTWFya1BhaXIgPSAxIDsKCQkJCWVsc2UgaWYg KCBUcmFuc2l0aW9uOjpDb21wYXJlKCooclRyYW5zRWwtPlZhbHVlKSwgKihzVHJhbnNFbC0+VmFs dWUpKSAhPSAwICkKCQkJCQlzaG91bGRNYXJrUGFpciA9IDEgOwoKCQkJCXJUcmFuc0VsKys7CgkJ CQlzVHJhbnNFbCsrOyAKCQkJfQoJCX0KCX0KCXJldHVybiBzaG91bGRNYXJrUGFpcjsKfQoKdGVt cGxhdGUgPCBjbGFzcyBTdGF0ZSwgY2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRp b24gPgoJCXZvaWQgRnNtQmFzZVZrPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbj46 OgoJCU1hcmtSZWFjaGFibGVGcm9tSGVyZVJldmVyc2UoIFN0YXRlICpzdGF0ZSApCnsKCSAKCWlm IChzdGF0ZS0+SXNNYXJrZWQpIHJldHVybjsKCQoJIAoJc3RhdGUtPklzTWFya2VkID0gMSA7CgoJ IAoJVHJhbnNFbCAqdGVsID0gc3RhdGUtPkluTGlzdC5UYWJsZTsKCWludCBudGVsID0gc3RhdGUt PkluTGlzdC5UYWJsZUxlbmd0aDsKCWZvciAoaW50IGkgPSAwOyBpIDwgbnRlbDsgaSsrLCB0ZWwr KykgewoJCVRyYW5zaXRpb24gKnRyYW5zID0gdGVsLT5WYWx1ZTsKCQl3aGlsZSAoIHRyYW5zICkg ewoJCQlNYXJrUmVhY2hhYmxlRnJvbUhlcmVSZXZlcnNlKCB0cmFucy0+ZnJvbVN0YXRlICk7CgkJ CXRyYW5zID0gdHJhbnMtPk5leHQ7CgkJfQoJfQp9Cgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBj bGFzcyBUcmFuc2l0aW9uRnVuYywgY2xhc3MgVHJhbnNpdGlvbiA+CgkJdm9pZCBGc21CYXNlVms8 U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uPjo6CgkJTWFya1JlYWNoYWJsZUZyb21I ZXJlKCBTdGF0ZSAqc3RhdGUgKQp7CgkgCglpZiAoc3RhdGUtPklzTWFya2VkKSByZXR1cm47CgkK CSAKCXN0YXRlLT5Jc01hcmtlZCA9IDEgOwoKCSAKCVRyYW5zRWwgKnRlbCA9IHN0YXRlLT5PdXRM aXN0LlRhYmxlOwoJaW50IG50ZWwgPSBzdGF0ZS0+T3V0TGlzdC5UYWJsZUxlbmd0aDsKCWZvciAo aW50IGkgPSAwOyBpIDwgbnRlbDsgaSsrLCB0ZWwrKykKCQlNYXJrUmVhY2hhYmxlRnJvbUhlcmUo IHRlbC0+VmFsdWUtPnRvU3RhdGUgKTsKfQoKCgojIDggInRlc3RGc21HcmFwaC5jcHAiIDIKCiMg MSAiLi4vaW5jbHVkZS9Gc21HcmFwaC5oIiAxCiAKCgoKCgoKCgojIDEgIi4uL2luY2x1ZGUvY2hh cnNldC5oIiAxCgoKCnR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7CnR5cGVkZWYgdW5zaWduZWQg Y2hhciBieXRlOwoKY2xhc3MgQnl0ZVNldAp7CnB1YmxpYzoKCWVudW0gQ2hhclNldCB7CgkJYXNj aWksCgkJZXh0ZW5kLAoJCWFsbnVtLAoJCWFscGhhLAoJCWNudHJsLAoJCWRpZ2l0LAoJCWdyYXBo LAoJCWxvd2VyLAoJCXByaW50LAoJCXB1bmN0LAoJCXNwYWNlLAoJCXVwcGVyLAoJCXhkaWdpdCwK CX07CgoJQnl0ZVNldCgpCgkJeyBFbXB0eSgpOyB9CgoJQnl0ZVNldChieXRlICpzZXQsIGludCBs ZW4pCgkJeyBFbXB0eSgpOyBTZXRCeXRlcyhzZXQsIGxlbik7IH0KCglCeXRlU2V0KENoYXJTZXQg Y3MpCgkJeyBFbXB0eSgpOyBTZXRDaGFyU2V0KGNzKTsgfQoKCXZvaWQgRW1wdHkoKTsKCgl2b2lk IFNldEJ5dGUodWludCBjKQoJCXsgZGF0YVtjID4+IDVdIHw9IDB4ODAwMDAwMDAgPj4gKGMgJiAw eDFmKTsgfQoJdm9pZCBTZXRCeXRlcyhieXRlICpzZXQsIGludCBsZW4pOwoJdm9pZCBTZXRDaGFy U2V0KENoYXJTZXQgY3MpOwoKCXZvaWQgVW5zZXRCeXRlKHVpbnQgYykKCQl7IGRhdGFbYyA+PiA1 XSAmPSB+ICgweDgwMDAwMDAwID4+IChjICYgMHgxZikpOyB9Cgl2b2lkIFVuc2V0Qnl0ZXMoYnl0 ZSAqc2V0LCBpbnQgbGVuKTsKCXZvaWQgVW5zZXRDaGFyU2V0KENoYXJTZXQgY3MpOwoKCXZvaWQg VG9nZ2xlQnl0ZSh1aW50IGMpCgkJeyBkYXRhW2MgPj4gNV0gXj0gMHg4MDAwMDAwMCA+PiAoYyAm IDB4MWYpOyB9Cgl2b2lkIFRvZ2dsZUJ5dGVzKGJ5dGUgKnNldCwgaW50IGxlbik7Cgl2b2lkIFRv Z2dsZUNoYXJTZXQoQ2hhclNldCBjcyk7CgoJdm9pZCBvcGVyYXRvciA9IChCeXRlU2V0ICZzZXQp Cgl7CgkJZGF0YVswXSA9IHNldC5kYXRhWzBdOyBkYXRhWzFdID0gc2V0LmRhdGFbMV07CgkJZGF0 YVsyXSA9IHNldC5kYXRhWzJdOyBkYXRhWzNdID0gc2V0LmRhdGFbM107CgkJZGF0YVs0XSA9IHNl dC5kYXRhWzRdOyBkYXRhWzVdID0gc2V0LmRhdGFbNV07CgkJZGF0YVs2XSA9IHNldC5kYXRhWzZd OyBkYXRhWzddID0gc2V0LmRhdGFbN107Cgl9CgoJaW50IElzU2V0KHVpbnQgYykKCQl7IHJldHVy biBkYXRhW2MgPj4gNV0gJiAoIDB4ODAwMDAwMDAgPj4gKGMgJiAweDFmKSApOyB9CgoJdm9pZCBQ cmludFRob3NlU2V0KCk7CgkKCXVpbnQgZGF0YVs4XTsKfTsKCgoKIyAxMCAiLi4vaW5jbHVkZS9G c21HcmFwaC5oIiAyCgoKCgoKCiAKCgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLAoJCQljbGFzcyBU cmFuc2l0aW9uRnVuYywKCQkJY2xhc3MgVHJhbnNpdGlvbiwKCQkJY2xhc3MgQmFzZUZzbUdyYXBo ID4KCQlzdHJ1Y3QgRnNtR3JhcGggOiBwdWJsaWMgQmFzZUZzbUdyYXBoCnsKcHVibGljOgoJRnNt R3JhcGgoKSB7fQoJRnNtR3JhcGgoRnNtR3JhcGggJmdyYXBoKSA6IEJhc2VGc21HcmFwaChncmFw aCkge30KCgkgCgl0eXBlZGVmIERvdWJsZUxpc3Q8IFN0YXRlID4gQmFzZUxpc3RUeXBlOwoKCSAK CVN0YXRlICpOZXdTdGF0ZShib29sIGlzRmluU3RhdGUgPSAwICk7CgoJIAoJc3RhdGljIEZzbUdy YXBoICpBbmRGU00oIGNoYXIgKnNldCApOwoJc3RhdGljIEZzbUdyYXBoICpPckZTTSggY2hhciAq c2V0ICk7CglzdGF0aWMgRnNtR3JhcGggKk9yRlNNKCBCeXRlU2V0IHNldCApOwoJc3RhdGljIEZz bUdyYXBoICpEb3RGU00oICk7CglzdGF0aWMgRnNtR3JhcGggKk51bGxGU00oICk7CgoJIAoJc3Rh dGljIEZzbUdyYXBoICpTdGFyKEZzbUdyYXBoICpmc20pOwoJc3RhdGljIEZzbUdyYXBoICpOb3Qo RnNtR3JhcGggKmZzbSk7CglzdGF0aWMgRnNtR3JhcGggKkFuZChGc21HcmFwaCAqZnNtMSwgRnNt R3JhcGggKmZzbTIpOwoJc3RhdGljIEZzbUdyYXBoICpEb09yKEZzbUdyYXBoICpnMSwgRnNtR3Jh cGggKmcyKTsKCXN0YXRpYyBGc21HcmFwaCAqT3IoRnNtR3JhcGggKmZzbTEsIEZzbUdyYXBoICpm c20yKTsKCXN0YXRpYyBGc21HcmFwaCAqSW50ZXJzZWN0KEZzbUdyYXBoICpmc20xLCBGc21HcmFw aCAqZnNtMik7CglzdGF0aWMgRnNtR3JhcGggKlN1YnRyYWN0KEZzbUdyYXBoICpmc20xLCBGc21H cmFwaCAqZnNtMik7CgoJIAoJdm9pZCBTZXRTdGF0ZU51bWJlcnMoKTsKCgkgCgl2b2lkIFVuc2V0 QWxsRmluU3RhdGVzKCk7CgoJIAoJdm9pZCBTZXRGaW5CaXRzKCBpbnQgYWxsU3RhdGVCaXRzLCBp bnQgZmluU3RhdGVCaXRzICk7CgoJIAoJdm9pZCBNZXJnZVN0YXRlcyggdHlwZW5hbWUgQmFzZUZz bUdyYXBoOjpTdGF0ZURpY3QgJnN0YXRlRGljdCwKCQkJdHlwZW5hbWUgQmFzZUZzbUdyYXBoOjpT dGF0ZUZpbGxJbkxpc3QgJnN0ZmlsLAoJCQlTdGF0ZSAqbmV3U3RhdGUsIHR5cGVuYW1lIFN0YXRl OjpTdGF0ZVNldCAmc3RhdGVTZXQsCgkJCWJvb2wgbGVhdmluZ0ZTTSApOwoKCSAKCgl2b2lkIEZp bGxJblN0YXRlcyggdHlwZW5hbWUgQmFzZUZzbUdyYXBoOjpTdGF0ZURpY3QgJnN0YXRlRGljdCwK CQkJdHlwZW5hbWUgQmFzZUZzbUdyYXBoOjpTdGF0ZUZpbGxJbkxpc3QgJnN0ZmlsICk7CgoJIAoK CSAKCgoJdm9pZCBDb25kZW5zZSgpOwoKCSAKCXZvaWQgRXhoYXVzdEFsbCggdHlwZW5hbWUgQmFz ZUZzbUdyYXBoOjpNYXJrSW5kZXggJm1hcmtJbmRleCApOwoKCSAKCgl2b2lkIFJlbW92ZURlYWRF bmRTdGF0ZXMoKTsKCgkgCgoJdm9pZCBSZW1vdmVPYmxpdmlvdXNTdGF0ZXMoKTsKCQoJIAoJdm9p ZCBNZXJnZVBJbnRvUShTdGF0ZSAqcCwgU3RhdGUgKnEpOwoKCSAKCgl2b2lkIE1lcmdlVW5tYXJr ZWRQYWlycyggdHlwZW5hbWUgQmFzZUZzbUdyYXBoOjpNYXJrSW5kZXggJm1hcmtJbmRleCApOwoK CSAKCXZvaWQgRHVtcCggRklMRSAqZmlsZSApOwp9OwoKCiMgOSAidGVzdEZzbUdyYXBoLmNwcCIg MgoKIyAxICIuLi9pbmNsdWRlL0ZzbUdyYXBoSW1wLmgiIDEKIAoKCgoKCgoKCgoKCnRlbXBsYXRl IDwgY2xhc3MgU3RhdGUsIGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFzcyBUcmFuc2l0aW9uLCBj bGFzcyBCYXNlRnNtR3JhcGggPgoJCVN0YXRlICpGc21HcmFwaDxTdGF0ZSwgVHJhbnNpdGlvbkZ1 bmMsIFRyYW5zaXRpb24sIEJhc2VGc21HcmFwaD46OgoJCU5ld1N0YXRlKGJvb2wgaXNGaW5TdGF0 ZSkKewoJIAoJQmFzZUxpc3RUeXBlOjpBZGRFbmQobmV3IFN0YXRlKCkpOwoKCSAKCWlmIChpc0Zp blN0YXRlKQoJCVNldEZpblN0YXRlKFRhaWwpOwoKCSAKCXJldHVybiBUYWlsOwp9Cgp0ZW1wbGF0 ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9uRnVuYywgY2xhc3MgVHJhbnNpdGlvbiwg Y2xhc3MgQmFzZUZzbUdyYXBoID4KCQlGc21HcmFwaDxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRy YW5zaXRpb24sIEJhc2VGc21HcmFwaD4qCgkJRnNtR3JhcGg8U3RhdGUsIFRyYW5zaXRpb25GdW5j LCBUcmFuc2l0aW9uLCBCYXNlRnNtR3JhcGg+OjoKCQlBbmRGU00oIGNoYXIgKnNldCApCnsKCSAK CUZzbUdyYXBoICpyZXRWYWwgPSBuZXcgRnNtR3JhcGg7CgoJIAoJU3RhdGUgKmxhc3QgPSByZXRW YWwtPk5ld1N0YXRlKCk7CglTdGF0ZSAqbmV3U3RhdGU7CgoJIAoJcmV0VmFsLT5TdGFydFN0YXRl ID0gbGFzdDsKCXdoaWxlICgqc2V0KSB7CgkJbmV3U3RhdGUgPSByZXRWYWwtPk5ld1N0YXRlKCk7 CgkJcmV0VmFsLT5BdHRhY2hTdGF0ZXMobGFzdCwgbmV3U3RhdGUsICpzZXQpOwoJCWxhc3QgPSBu ZXdTdGF0ZTsKCQlzZXQrKzsKCX0KCgkgCglyZXRWYWwtPlNldEZpblN0YXRlKGxhc3QpOwoKCXJl dHVybiByZXRWYWw7Cn0KCgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9u RnVuYywgY2xhc3MgVHJhbnNpdGlvbiwgY2xhc3MgQmFzZUZzbUdyYXBoID4KCQlGc21HcmFwaDxT dGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24sIEJhc2VGc21HcmFwaD4qCgkJRnNtR3Jh cGg8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uLCBCYXNlRnNtR3JhcGg+OjoKCQlP ckZTTSggY2hhciAqc2V0ICkKewoJIAoKCUJ5dGVTZXQgYnM7CgoJIAoJRnNtR3JhcGggKnJldFZh bCA9IG5ldyBGc21HcmFwaDsKCgkgCglTdGF0ZSAqc3RhcnQgPSByZXRWYWwtPk5ld1N0YXRlKCk7 CglTdGF0ZSAqZW5kID0gcmV0VmFsLT5OZXdTdGF0ZSgxICk7CgoJcmV0VmFsLT5TdGFydFN0YXRl ID0gc3RhcnQ7Cgl3aGlsZSAoKnNldCkgewoJCWlmICggISBicy5Jc1NldCggKnNldCApICkgewoJ CQlyZXRWYWwtPkF0dGFjaFN0YXRlcyhzdGFydCwgZW5kLCAqc2V0KTsKCQkJYnMuU2V0Qnl0ZSgg KnNldCApOwoJCX0KCQlzZXQrKzsKCX0KCglyZXR1cm4gcmV0VmFsOwp9Cgp0ZW1wbGF0ZSA8IGNs YXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9uRnVuYywgY2xhc3MgVHJhbnNpdGlvbiwgY2xhc3Mg QmFzZUZzbUdyYXBoID4KCQlGc21HcmFwaDxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRp b24sIEJhc2VGc21HcmFwaD4qCgkJRnNtR3JhcGg8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFu c2l0aW9uLCBCYXNlRnNtR3JhcGg+OjoKCQlPckZTTSggQnl0ZVNldCBicyApCnsKCSAKCUZzbUdy YXBoICpyZXRWYWwgPSBuZXcgRnNtR3JhcGg7CgoJIAoJU3RhdGUgKnN0YXJ0ID0gcmV0VmFsLT5O ZXdTdGF0ZSgpOwoJU3RhdGUgKmVuZCA9IHJldFZhbC0+TmV3U3RhdGUoMSApOwoKCSAKCXJldFZh bC0+U3RhcnRTdGF0ZSA9IHN0YXJ0OwoJZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewoJ CWlmICggYnMuSXNTZXQoaSkgKSB7CgkJCSAKCQkJcmV0VmFsLT5BdHRhY2hTdGF0ZXMoIHN0YXJ0 LCBlbmQsIGkgKTsKCQl9Cgl9CgoJcmV0dXJuIHJldFZhbDsKfQoKdGVtcGxhdGUgPCBjbGFzcyBT dGF0ZSwgY2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRpb24sIGNsYXNzIEJhc2VG c21HcmFwaCA+CgkJRnNtR3JhcGg8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uLCBC YXNlRnNtR3JhcGg+KgoJCUZzbUdyYXBoPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlv biwgQmFzZUZzbUdyYXBoPjo6CgkJRG90RlNNKCApCnsKCUJ5dGVTZXQgYnMoQnl0ZVNldDo6YXNj aWkpOwoJcmV0dXJuIE9yRlNNKGJzKTsKfQoKdGVtcGxhdGUgPCBjbGFzcyBTdGF0ZSwgY2xhc3Mg VHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRpb24sIGNsYXNzIEJhc2VGc21HcmFwaCA+CgkJ RnNtR3JhcGg8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uLCBCYXNlRnNtR3JhcGg+ KgoJCUZzbUdyYXBoPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbiwgQmFzZUZzbUdy YXBoPjo6CgkJTnVsbEZTTSgpCnsKCSAKCUZzbUdyYXBoICpyZXRWYWwgPSBuZXcgRnNtR3JhcGg7 CgoJIAoKCXJldFZhbC0+U3RhcnRTdGF0ZSA9IHJldFZhbC0+TmV3U3RhdGUoMSApOwoKCSAKCXJl dHVybiByZXRWYWw7Cn0KCnRlbXBsYXRlIDwgY2xhc3MgU3RhdGUsIGNsYXNzIFRyYW5zaXRpb25G dW5jLCBjbGFzcyBUcmFuc2l0aW9uLCBjbGFzcyBCYXNlRnNtR3JhcGggPgoJCUZzbUdyYXBoPFN0 YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbiwgQmFzZUZzbUdyYXBoPioKCQlGc21HcmFw aDxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24sIEJhc2VGc21HcmFwaD46OgoJCVN0 YXIoRnNtR3JhcGggKmcxKQp7CglnMS0+U2V0RmluQml0cygweDA4ICwgMCk7CgoJIAoJdHlwZW5h bWUgU3RhdGU6OlN0YXRlU2V0IHN0YXJ0U3RhdGVTZXQ7CglzdGFydFN0YXRlU2V0LlNldCggZzEt PlN0YXJ0U3RhdGUgKTsKCgkgCgl0eXBlbmFtZSBCYXNlRnNtR3JhcGg6OlN0YXRlRmlsbEluTGlz dCBzdGZpbDsKCXR5cGVuYW1lIEJhc2VGc21HcmFwaDo6U3RhdGVEaWN0IHN0YXRlRGljdDsKCgkg Cgl0eXBlbmFtZSBTdGF0ZTo6U3RhdGVTZXQgZmluU3RhdGVTZXQoZzEtPkZpblN0YXRlU2V0KTsK CVN0YXRlICoqc3QgPSBmaW5TdGF0ZVNldC5UYWJsZTsKCWludCBuc3QgPSBmaW5TdGF0ZVNldC5U YWJsZUxlbmd0aDsKCWZvciAoaW50IGkgPSAwOyBpIDwgbnN0OyBpKyssIHN0KyspCgkJZzEtPk1l cmdlU3RhdGVzKCBzdGF0ZURpY3QsIHN0ZmlsLCAqc3QsIHN0YXJ0U3RhdGVTZXQsIDEgICk7CgoJ ZzEtPlNldEZpblN0YXRlKGcxLT5TdGFydFN0YXRlKTsKCglnMS0+RmlsbEluU3RhdGVzKCBzdGF0 ZURpY3QsIHN0ZmlsICk7CgoJZzEtPlJlbW92ZU9ibGl2aW91c1N0YXRlcygpOwoJZzEtPkNvbmRl bnNlKCk7CgoJcmV0dXJuIGcxOwp9Cgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFu c2l0aW9uRnVuYywgY2xhc3MgVHJhbnNpdGlvbiwgY2xhc3MgQmFzZUZzbUdyYXBoID4KCQlGc21H cmFwaDxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24sIEJhc2VGc21HcmFwaD4qCgkJ RnNtR3JhcGg8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uLCBCYXNlRnNtR3JhcGg+ OjoKCQlOb3QoRnNtR3JhcGggKmcxKQp7CglGc21HcmFwaCAqZyA9IERvdEZTTSgpOwkKCWcgPSBT dGFyKGcpOwoJcmV0dXJuIFN1YnRyYWN0KGcsIGcxKTsKfQoKdGVtcGxhdGUgPCBjbGFzcyBTdGF0 ZSwgY2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRpb24sIGNsYXNzIEJhc2VGc21H cmFwaCA+CgkJRnNtR3JhcGg8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uLCBCYXNl RnNtR3JhcGg+KgoJCUZzbUdyYXBoPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbiwg QmFzZUZzbUdyYXBoPjo6CgkJQW5kKEZzbUdyYXBoICpnMSwgRnNtR3JhcGggKmcyKQp7CgkgCgoJ ZzEtPlNldEZpbkJpdHMoMHgwOCAsIDApOwoJZzItPlNldEZpbkJpdHMoMHgxMCAsIDApOwoKCSAK CXR5cGVuYW1lIFN0YXRlOjpTdGF0ZVNldCBzdGFydFN0YXRlU2V0OwoJc3RhcnRTdGF0ZVNldC5T ZXQoIGcyLT5TdGFydFN0YXRlICk7CgoJIAoJdHlwZW5hbWUgQmFzZUZzbUdyYXBoOjpTdGF0ZUZp bGxJbkxpc3Qgc3RmaWw7Cgl0eXBlbmFtZSBCYXNlRnNtR3JhcGg6OlN0YXRlRGljdCBzdGF0ZURp Y3Q7CgoJIAoKCXR5cGVuYW1lIFN0YXRlOjpTdGF0ZVNldCBmaW5TdGF0ZVNldChnMS0+RmluU3Rh dGVTZXQpOwoKCSAKCWcxLT5VbnNldEFsbEZpblN0YXRlcygpOwoKCSAKCWcxLT5BZGRFbmQoICpn MiApOwoJZzEtPkZpblN0YXRlU2V0LlNldCggZzItPkZpblN0YXRlU2V0ICk7CgkKCSAKCglkZWxl dGUgZzI7CgoJIAoJU3RhdGUgKipzdCA9IGZpblN0YXRlU2V0LlRhYmxlOwoJaW50IG5zdCA9IGZp blN0YXRlU2V0LlRhYmxlTGVuZ3RoOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBuc3Q7IGkrKywgc3Qr KykKCQlnMS0+TWVyZ2VTdGF0ZXMoIHN0YXRlRGljdCwgc3RmaWwsICpzdCwgc3RhcnRTdGF0ZVNl dCwgMSAgKTsKCgkgCglnMS0+RmlsbEluU3RhdGVzKCBzdGF0ZURpY3QsIHN0ZmlsICk7CgoJZzEt PlJlbW92ZU9ibGl2aW91c1N0YXRlcygpOwoJZzEtPkNvbmRlbnNlKCk7CgoJcmV0dXJuIGcxOwp9 CgoKdGVtcGxhdGUgPCBjbGFzcyBTdGF0ZSwgY2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNzIFRy YW5zaXRpb24sIGNsYXNzIEJhc2VGc21HcmFwaCA+CgkJRnNtR3JhcGg8U3RhdGUsIFRyYW5zaXRp b25GdW5jLCBUcmFuc2l0aW9uLCBCYXNlRnNtR3JhcGg+KgoJCUZzbUdyYXBoPFN0YXRlLCBUcmFu c2l0aW9uRnVuYywgVHJhbnNpdGlvbiwgQmFzZUZzbUdyYXBoPjo6CgkJRG9PcihGc21HcmFwaCAq ZzEsIEZzbUdyYXBoICpnMikKewoJIAoJdHlwZW5hbWUgU3RhdGU6OlN0YXRlU2V0IHN0YXJ0U3Rh dGVTZXQ7CglzdGFydFN0YXRlU2V0LlNldCggZzEtPlN0YXJ0U3RhdGUgKTsKCXN0YXJ0U3RhdGVT ZXQuU2V0KCBnMi0+U3RhcnRTdGF0ZSApOwoKCSAKCXR5cGVuYW1lIEJhc2VGc21HcmFwaDo6U3Rh dGVGaWxsSW5MaXN0IHN0ZmlsOwoJdHlwZW5hbWUgQmFzZUZzbUdyYXBoOjpTdGF0ZURpY3Qgc3Rh dGVEaWN0OwoKCSAKCglnMS0+QWRkRW5kKCAqZzIgKTsKCgkgCglnMS0+RmluU3RhdGVTZXQuU2V0 KGcyLT5GaW5TdGF0ZVNldCk7CglnMi0+RmluU3RhdGVTZXQuRW1wdHkoKTsKCgkgCgoJZGVsZXRl IGcyOwoKCSAKCVN0YXRlICpuZXdTdGFydFN0YXRlID0gZzEtPk5ld1N0YXRlKCk7CglnMS0+U3Rh cnRTdGF0ZSA9IG5ld1N0YXJ0U3RhdGU7CgoJIAoJZzEtPk1lcmdlU3RhdGVzKCBzdGF0ZURpY3Qs IHN0ZmlsLCBuZXdTdGFydFN0YXRlLCBzdGFydFN0YXRlU2V0LCAwICApOwoKCSAKCWcxLT5GaWxs SW5TdGF0ZXMoIHN0YXRlRGljdCwgc3RmaWwgKTsKCglyZXR1cm4gZzE7Cn0KCnRlbXBsYXRlIDwg Y2xhc3MgU3RhdGUsIGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFzcyBUcmFuc2l0aW9uLCBjbGFz cyBCYXNlRnNtR3JhcGggPgoJCUZzbUdyYXBoPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNp dGlvbiwgQmFzZUZzbUdyYXBoPioKCQlGc21HcmFwaDxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRy YW5zaXRpb24sIEJhc2VGc21HcmFwaD46OgoJCU9yKEZzbUdyYXBoICpnMSwgRnNtR3JhcGggKmcy KQp7CglnMS0+U2V0RmluQml0cygweDA4ICwgMCk7CglnMi0+U2V0RmluQml0cygweDEwICwgMCk7 CgoJRnNtR3JhcGggKnJldFZhbCA9IERvT3IoZzEsIGcyKTsKCglnMS0+UmVtb3ZlT2JsaXZpb3Vz U3RhdGVzKCk7CglnMS0+Q29uZGVuc2UoKTsKCglyZXR1cm4gcmV0VmFsOwp9Cgp0ZW1wbGF0ZSA8 IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9uRnVuYywgY2xhc3MgVHJhbnNpdGlvbiwgY2xh c3MgQmFzZUZzbUdyYXBoID4KCQlGc21HcmFwaDxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5z aXRpb24sIEJhc2VGc21HcmFwaD4qCgkJRnNtR3JhcGg8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBU cmFuc2l0aW9uLCBCYXNlRnNtR3JhcGg+OjoKCQlJbnRlcnNlY3QoRnNtR3JhcGggKmcxLCBGc21H cmFwaCAqZzIpCnsKCWcxLT5TZXRGaW5CaXRzKDB4MDggLCAweDAyICk7CglnMi0+U2V0RmluQml0 cygweDEwICwgMHgwNCApOwoJZzEtPlVuc2V0QWxsRmluU3RhdGVzKCk7CglnMi0+VW5zZXRBbGxG aW5TdGF0ZXMoKTsKCglGc21HcmFwaCAqcmV0VmFsID0gRG9PcihnMSwgZzIpOwoKCWcxLT5SZW1v dmVPYmxpdmlvdXNTdGF0ZXMoKTsKCWcxLT5SZW1vdmVEZWFkRW5kU3RhdGVzKCk7CglnMS0+Q29u ZGVuc2UoKTsKCglyZXR1cm4gcmV0VmFsOwp9Cgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFz cyBUcmFuc2l0aW9uRnVuYywgY2xhc3MgVHJhbnNpdGlvbiwgY2xhc3MgQmFzZUZzbUdyYXBoID4K CQlGc21HcmFwaDxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24sIEJhc2VGc21HcmFw aD4qCgkJRnNtR3JhcGg8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uLCBCYXNlRnNt R3JhcGg+OjoKCQlTdWJ0cmFjdChGc21HcmFwaCAqZzEsIEZzbUdyYXBoICpnMikKewoJZzEtPlNl dEZpbkJpdHMoMHgwOCAsIDApOwoJZzItPlNldEZpbkJpdHMoMHgxMCAsIDB4MDEgKTsKCWcyLT5V bnNldEFsbEZpblN0YXRlcygpOwoJZzItPlN0cmlwQWxsRnVuY3Rpb25zKCk7CgoJRnNtR3JhcGgg KnJldFZhbCA9IERvT3IoZzEsIGcyKTsKCglnMS0+UmVtb3ZlT2JsaXZpb3VzU3RhdGVzKCk7Cgln MS0+UmVtb3ZlRGVhZEVuZFN0YXRlcygpOwoJZzEtPkNvbmRlbnNlKCk7CgoJcmV0dXJuIHJldFZh bDsKfQoKdGVtcGxhdGUgPCBjbGFzcyBTdGF0ZSwgY2xhc3MgVHJhbnNpdGlvbkZ1bmMsIGNsYXNz IFRyYW5zaXRpb24sIGNsYXNzIEJhc2VGc21HcmFwaCA+CgkJdm9pZCBGc21HcmFwaDxTdGF0ZSwg VHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24sIEJhc2VGc21HcmFwaD46OgoJCVNldFN0YXRlTnVt YmVycygpCnsKCWludCBjdXJOdW0gPSAwOwoJU3RhdGUgKnN0YXRlID0gSGVhZDsKCXdoaWxlIChz dGF0ZSAhPSAwKSB7CgkJc3RhdGUtPk51bSA9IGN1ck51bTsKCQljdXJOdW0rKzsKCQlzdGF0ZSA9 IHN0YXRlLT5OZXh0OwoJfQp9CgoKdGVtcGxhdGUgPCBjbGFzcyBTdGF0ZSwgY2xhc3MgVHJhbnNp dGlvbkZ1bmMsIGNsYXNzIFRyYW5zaXRpb24sIGNsYXNzIEJhc2VGc21HcmFwaCA+CgkJdm9pZCBG c21HcmFwaDxTdGF0ZSwgVHJhbnNpdGlvbkZ1bmMsIFRyYW5zaXRpb24sIEJhc2VGc21HcmFwaD46 OgoJCVVuc2V0QWxsRmluU3RhdGVzKCkKewoJU3RhdGUgKipzdCA9IEZpblN0YXRlU2V0LlRhYmxl OwoJaW50IG5zdCA9IEZpblN0YXRlU2V0LlRhYmxlTGVuZ3RoOwoJZm9yICggaW50IGkgPSAwOyBp IDwgbnN0OyBpKyssIHN0KysgKQoJCSgqc3QpLT5Jc0ZpblN0YXRlID0gMCA7CglGaW5TdGF0ZVNl dC5FbXB0eSgpOwp9Cgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9uRnVu YywgY2xhc3MgVHJhbnNpdGlvbiwgY2xhc3MgQmFzZUZzbUdyYXBoID4KCQl2b2lkIEZzbUdyYXBo PFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbiwgQmFzZUZzbUdyYXBoPjo6CgkJU2V0 RmluQml0cyggaW50IGFsbFN0YXRlQml0cywgaW50IGZpblN0YXRlQml0cyApCnsKCVN0YXRlICpz dGF0ZSA9IEhlYWQ7Cgl3aGlsZSAoIHN0YXRlICE9IDAgKSB7CgkJaWYgKCBzdGF0ZS0+SXNGaW5T dGF0ZSApCgkJCXN0YXRlLT5TdGF0ZUJpdHMgPSBhbGxTdGF0ZUJpdHMgfCBmaW5TdGF0ZUJpdHM7 CgkJZWxzZQoJCQlzdGF0ZS0+U3RhdGVCaXRzID0gYWxsU3RhdGVCaXRzOwoKCQlzdGF0ZSA9IHN0 YXRlLT5OZXh0OwoJfQp9Cgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9u RnVuYywgY2xhc3MgVHJhbnNpdGlvbiwgY2xhc3MgQmFzZUZzbUdyYXBoID4KCQl2b2lkIEZzbUdy YXBoPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbiwgQmFzZUZzbUdyYXBoPjo6CgkJ TWVyZ2VTdGF0ZXMoIHR5cGVuYW1lIEJhc2VGc21HcmFwaDo6U3RhdGVEaWN0ICZzdGF0ZURpY3Qs IAoJCQkJdHlwZW5hbWUgQmFzZUZzbUdyYXBoOjpTdGF0ZUZpbGxJbkxpc3QgJnN0ZmlsLAoJCQkJ U3RhdGUgKm5ld1N0YXRlLCB0eXBlbmFtZSBTdGF0ZTo6U3RhdGVTZXQgJnN0YXRlU2V0LAoJCQkJ Ym9vbCBsZWF2aW5nRlNNICkKewoJaW50IGJpdHMgPSBuZXdTdGF0ZS0+U3RhdGVCaXRzIHwgMHgy MCA7Cglib29sIGZpblN0YXRlID0gbmV3U3RhdGUtPklzRmluU3RhdGU7CgoJU3RhdGUgKipzdHAg PSBzdGF0ZVNldC5UYWJsZTsKCWludCBuc3QgPSBzdGF0ZVNldC5UYWJsZUxlbmd0aDsKCWZvciAo IGludCBpID0gMDsgaSA8IG5zdDsgaSsrLCBzdHArKyApIHsKCQlTdGF0ZSAqc3JjID0gKnN0cDsK CgkJIAoJCU91dFRyYW5zQ29weShzdGF0ZURpY3QsIHN0ZmlsLCBuZXdTdGF0ZSwgc3JjLCBsZWF2 aW5nRlNNKTsKCgkJIAoJCWJpdHMgfD0gc3JjLT5TdGF0ZUJpdHM7CgkJaWYgKCBzcmMtPklzRmlu U3RhdGUgKQoJCQlmaW5TdGF0ZSA9IDEgOwoKCQkgCgkJbmV3U3RhdGUtPm91dFRyYW5zaXRpb24u dHJhbnNGdW5jTGlzdC5BcHBlbmQoCgkJCXNyYy0+b3V0VHJhbnNpdGlvbi50cmFuc0Z1bmNMaXN0 ICk7CgkJbmV3U3RhdGUtPm91dFRyYW5zaXRpb24ucHJpb3JpdHkgKz0gc3JjLT5vdXRUcmFuc2l0 aW9uLnByaW9yaXR5OwoKCQkgCgkJbmV3U3RhdGUtPk1lcmdlU3RhdGUoIHNyYyApOwoJfQoKCWlm ICggYml0cyYgMHgwMSAgKSB7CgkJIAoJCWZpblN0YXRlID0gMCA7Cgl9CgoJaWYgKCAoYml0cyYg MHgwNiApID09IDB4MDYgICkgewoJCSAKCQlmaW5TdGF0ZSA9IDEgOwoJfQoKCW5ld1N0YXRlLT5T dGF0ZUJpdHMgPSBiaXRzOwoJaWYgKCBmaW5TdGF0ZSApCgkJU2V0RmluU3RhdGUoIG5ld1N0YXRl ICk7Cn0KCnRlbXBsYXRlIDwgY2xhc3MgU3RhdGUsIGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFz cyBUcmFuc2l0aW9uLCBjbGFzcyBCYXNlRnNtR3JhcGggPgoJCXZvaWQgRnNtR3JhcGg8U3RhdGUs IFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uLCBCYXNlRnNtR3JhcGg+OjoKCQlGaWxsSW5TdGF0 ZXMoIHR5cGVuYW1lIEJhc2VGc21HcmFwaDo6U3RhdGVEaWN0ICZzdGF0ZURpY3QsCgkJCXR5cGVu YW1lIEJhc2VGc21HcmFwaDo6U3RhdGVGaWxsSW5MaXN0ICZzdGZpbCApCnsKCVN0YXRlICpzdGF0 ZSA9IHN0ZmlsLkhlYWQ7Cgl3aGlsZSAoIHN0YXRlICE9IDAgKSB7CgkJTWVyZ2VTdGF0ZXMoIHN0 YXRlRGljdCwgc3RmaWwsIHN0YXRlLCAqc3RhdGUtPnN0YXRlU2V0LCAwICApOwoJCXN0YXRlID0g c3RhdGUtPk5leHQ7Cgl9CgoJd2hpbGUgKCBzdGZpbC5MaXN0TGVuZ3RoID4gMCApIHsKCQkgCgkJ U3RhdGUgKnN0YXRlID0gc3RmaWwuSGVhZDsKCQlkZWxldGUgc3RhdGUtPnN0YXRlU2V0OwoJCXN0 YXRlLT5zdGF0ZVNldCA9IDA7CgoJCSAKCQlzdGZpbC5EZXRhY2hMaXN0RWwoIHN0YXRlICk7CgkJ QmFzZUxpc3RUeXBlOjpBZGRFbmQoIHN0YXRlICk7Cgl9Cn0KCnRlbXBsYXRlIDwgY2xhc3MgU3Rh dGUsIGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFzcyBUcmFuc2l0aW9uLCBjbGFzcyBCYXNlRnNt R3JhcGggPgoJCXZvaWQgRnNtR3JhcGg8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9u LCBCYXNlRnNtR3JhcGg+OjoKCQlDb25kZW5zZSgpCnsKCSAKCVNldFN0YXRlTnVtYmVycygpOwoK CSAKCXR5cGVuYW1lIEJhc2VGc21HcmFwaDo6TWFya0luZGV4IG1hcmtJbmRleChMaXN0TGVuZ3Ro KTsKCgkgCgoKCVN0YXRlICpwID0gSGVhZDsKCWZvciAoIGludCBpID0gMDsgaSA8IExpc3RMZW5n dGg7IGkrKywgcCA9IHAtPk5leHQgKSB7CgkJU3RhdGUgKnEgPSBIZWFkOwoJCWZvciAoIGludCBq ID0gMDsgaiA8IGk7IGorKywgcSA9IHEtPk5leHQgKSB7CgkJCXR5cGVuYW1lIEJhc2VGc21HcmFw aDo6TWFya0luZGV4OjpTdGF0ZVBhaXIgKnBhaXIgPSAKCQkJCQkmbWFya0luZGV4LmFycmF5W2kq TGlzdExlbmd0aCtqXTsKCQkJcGFpci0+cCA9IHA7CgkJCXBhaXItPnEgPSBxOwoKCQkJaW50IGNv bWJpbmVkQml0cyA9IHAtPlN0YXRlQml0cyB8IHEtPlN0YXRlQml0czsKCQkKCQkJIAoJCQlpZiAo IGNvbWJpbmVkQml0cyAmIDB4MjAgIHx8CgkJCQkJKGNvbWJpbmVkQml0cyYgMHgxOCApID09IDB4 MTggICkgewoJCQkJIAoJCQkJIAoJCQkJaWYgKCBwLT5Jc0ZpblN0YXRlIF4gcS0+SXNGaW5TdGF0 ZSApCgkJCQkJcGFpci0+aXNNYXJrZWQgPSAxIDsKCQkJCSAKCQkJCWVsc2UgaWYgKCBUcmFuc2l0 aW9uOjpDb21wYXJlKCBwLT5vdXRUcmFuc2l0aW9uLAoJCQkJCQkJcS0+b3V0VHJhbnNpdGlvbikg IT0gMCkKCQkJCQlwYWlyLT5pc01hcmtlZCA9IDEgOwoJCQkJIAoJCQkJZWxzZSBpZiAoIFNob3Vs ZE1hcmtQYWlyVHJhbnNEYXRhKG1hcmtJbmRleCwgcCwgcSkgKQoJCQkJCXBhaXItPmlzTWFya2Vk ID0gMSA7CgkJCQkKCQkJCSAKCQkJCWlmICggcGFpci0+aXNNYXJrZWQgKQoJCQkJCW1hcmtJbmRl eC5tYXJrZWRMaXN0LkFkZEVuZCggcGFpciApOwoJCQkJZWxzZQoJCQkJCW1hcmtJbmRleC51bm1h cmtlZExpc3QuQWRkRW5kKCBwYWlyICk7CgkJCX0KCQkJZWxzZSBpZiAoIHAtPlN0YXRlQml0cyAm IDB4NDAgIHx8CgkJCQkJCXEtPlN0YXRlQml0cyAmIDB4NDAgICkgewoJCQkJIAoKCgkJCQlwYWly LT5pc01hcmtlZCA9IDEgOwoJCQkJbWFya0luZGV4Lm1hcmtlZExpc3QuQWRkRW5kKCBwYWlyICk7 CgkJCX0KCQkJZWxzZSB7CgkJCQkgCgoKCgkJCQlwYWlyLT5pc01hcmtlZCA9IDEgOwoJCQl9CgkJ fQoJfQoKCSAKCglFeGhhdXN0QWxsKCBtYXJrSW5kZXggKTsKCgkgCglNZXJnZVVubWFya2VkUGFp cnMoIG1hcmtJbmRleCApOwp9Cgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0 aW9uRnVuYywgY2xhc3MgVHJhbnNpdGlvbiwgY2xhc3MgQmFzZUZzbUdyYXBoID4KCQl2b2lkIEZz bUdyYXBoPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbiwgQmFzZUZzbUdyYXBoPjo6 CgkJRXhoYXVzdEFsbCggdHlwZW5hbWUgQmFzZUZzbUdyYXBoOjpNYXJrSW5kZXggJm1hcmtJbmRl eCApCnsKCXR5cGVuYW1lIEJhc2VGc21HcmFwaDo6TWFya0luZGV4OjpTdGF0ZVBhaXIgKnBhaXIg PSBtYXJrSW5kZXgubWFya2VkTGlzdC5IZWFkOwoKCXdoaWxlICggcGFpciAhPSBfX251bGwgICkg ewoJCU1hcmtQYWlyc09uSW4oIG1hcmtJbmRleCwgcGFpci0+cCwgcGFpci0+cSApOwoJCXBhaXIg PSBwYWlyLT5OZXh0OwoJfQp9Cgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0 aW9uRnVuYywgY2xhc3MgVHJhbnNpdGlvbiwgY2xhc3MgQmFzZUZzbUdyYXBoID4KCQl2b2lkIEZz bUdyYXBoPFN0YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbiwgQmFzZUZzbUdyYXBoPjo6 CgkJUmVtb3ZlRGVhZEVuZFN0YXRlcygpCnsKCVN0YXRlICpzdGF0ZSwgKm5leHQ7CgoJIAoKCVN0 YXJ0U3RhdGUtPklzTWFya2VkID0gMSA7CgoJIAoJU3RhdGUgKipzdCA9IEZpblN0YXRlU2V0LlRh YmxlOwoJaW50IG5zdCA9IEZpblN0YXRlU2V0LlRhYmxlTGVuZ3RoOwoJZm9yICggaW50IGkgPSAw OyBpIDwgbnN0OyBpKyssIHN0KysgKQoJCU1hcmtSZWFjaGFibGVGcm9tSGVyZVJldmVyc2UoICpz dCApOwoKCSAKCglzdGF0ZSA9IEhlYWQ7Cgl3aGlsZSAoc3RhdGUpIHsKCQluZXh0ID0gc3RhdGUt Pk5leHQ7CgoJCWlmIChzdGF0ZS0+SXNNYXJrZWQpCgkJCXN0YXRlLT5Jc01hcmtlZCA9IDAgOwoJ CWVsc2UKCQkJZGVsZXRlIERldGFjaFN0YXRlKHN0YXRlKTsKCQkKCQlzdGF0ZSA9IG5leHQ7Cgl9 Cn0KCnRlbXBsYXRlIDwgY2xhc3MgU3RhdGUsIGNsYXNzIFRyYW5zaXRpb25GdW5jLCBjbGFzcyBU cmFuc2l0aW9uLCBjbGFzcyBCYXNlRnNtR3JhcGggPgoJCXZvaWQgRnNtR3JhcGg8U3RhdGUsIFRy YW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uLCBCYXNlRnNtR3JhcGg+OjoKCQlSZW1vdmVPYmxpdmlv dXNTdGF0ZXMoKQp7CglTdGF0ZSAqc3RhdGUsICpuZXh0OwoKCSAKCglNYXJrUmVhY2hhYmxlRnJv bUhlcmUoU3RhcnRTdGF0ZSk7CgoJIAoKCXN0YXRlID0gSGVhZDsKCXdoaWxlIChzdGF0ZSkgewoJ CW5leHQgPSBzdGF0ZS0+TmV4dDsKCgkJaWYgKHN0YXRlLT5Jc01hcmtlZCkKCQkJc3RhdGUtPklz TWFya2VkID0gMCA7CgkJZWxzZQoJCQlkZWxldGUgRGV0YWNoU3RhdGUoc3RhdGUpOwoJCQoKCQlz dGF0ZSA9IG5leHQ7Cgl9Cn0KCnRlbXBsYXRlIDwgY2xhc3MgU3RhdGUsIGNsYXNzIFRyYW5zaXRp b25GdW5jLCBjbGFzcyBUcmFuc2l0aW9uLCBjbGFzcyBCYXNlRnNtR3JhcGggPgoJCXZvaWQgRnNt R3JhcGg8U3RhdGUsIFRyYW5zaXRpb25GdW5jLCBUcmFuc2l0aW9uLCBCYXNlRnNtR3JhcGg+OjoK CQlNZXJnZVBJbnRvUShTdGF0ZSAqcCwgU3RhdGUgKnEpCnsKCSAKCgoKCgkgCgoKCgoKCgoKCgoJ IAoJSW5UcmFuc01vdmUocSwgcCk7CgoJaWYgKHAgPT0gU3RhcnRTdGF0ZSkKCQlTdGFydFN0YXRl ID0gcTsKCgkgCglxLT5GdXNlU3RhdGUocCk7CgoJZGVsZXRlIERldGFjaFN0YXRlKHApOwp9Cgp0 ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9uRnVuYywgY2xhc3MgVHJhbnNp dGlvbiwgY2xhc3MgQmFzZUZzbUdyYXBoID4KCQl2b2lkIEZzbUdyYXBoPFN0YXRlLCBUcmFuc2l0 aW9uRnVuYywgVHJhbnNpdGlvbiwgQmFzZUZzbUdyYXBoPjo6CgkJTWVyZ2VVbm1hcmtlZFBhaXJz KCB0eXBlbmFtZSBCYXNlRnNtR3JhcGg6Ok1hcmtJbmRleCAmbWFya0luZGV4ICkKewoJU3RhdGUg KnAgPSBIZWFkLCAqbmV4dFAsICpxOwoKCSAKCgoJd2hpbGUgKCBwICE9IDAgKSB7CgkJbmV4dFAg PSBwLT5OZXh0OwoKCQlxID0gSGVhZDsKCQl3aGlsZSAoIHEgIT0gcCApIHsKCQkJIAoJCQlpZiAo ICEgbWFya0luZGV4LklzUGFpck1hcmtlZChwLT5OdW0sIHEtPk51bSkgKSB7CgoJCQkJTWVyZ2VQ SW50b1EocCwgcSk7CgkJCQlicmVhazsKCQkJfQoJCQlxID0gcS0+TmV4dDsKCQl9CgkJcCA9IG5l eHRQOwoJfQp9Cgp0ZW1wbGF0ZSA8IGNsYXNzIFN0YXRlLCBjbGFzcyBUcmFuc2l0aW9uRnVuYywg Y2xhc3MgVHJhbnNpdGlvbiwgY2xhc3MgQmFzZUZzbUdyYXBoID4KCQl2b2lkIEZzbUdyYXBoPFN0 YXRlLCBUcmFuc2l0aW9uRnVuYywgVHJhbnNpdGlvbiwgQmFzZUZzbUdyYXBoPjo6CgkJRHVtcCgg RklMRSAqZmlsZSApCnsKCSAKCVNldFN0YXRlTnVtYmVycygpOwoKCSAKCWZwcmludGYoZmlsZSwg IlN0YXJ0U3RhdGU6ICUuMmkgICIsIFN0YXJ0U3RhdGUtPk51bSk7CglmcHJpbnRmKGZpbGUsICJG aW5hbCBTdGF0ZXM6Iik7CgoJIAoJU3RhdGUgKipzdCA9IEZpblN0YXRlU2V0LlRhYmxlOwoJaW50 IG5zdCA9IEZpblN0YXRlU2V0LlRhYmxlTGVuZ3RoOwoJZm9yICggaW50IGkgPSAwOyBpIDwgbnN0 OyBpKyssIHN0KysgKQoJCWZwcmludGYoIGZpbGUsICIgJS4yaSB8IiwgKCpzdCktPk51bSApOwoJ ZnByaW50ZiggZmlsZSwgIlxuIiApOwoKCSAKCVN0YXRlICpzdGF0ZSA9IEhlYWQ7Cgl3aGlsZSAo c3RhdGUpIHsKCQlmcHJpbnRmKCBmaWxlLCAiJS4yaSBbJWldICgiLCBzdGF0ZS0+TnVtLCBzdGF0 ZS0+b3V0VHJhbnNpdGlvbi5wcmlvcml0eSApOwoKCQlUcmFuc2l0aW9uRnVuYyAqdGZ1bmMgPSBz dGF0ZS0+b3V0VHJhbnNpdGlvbi50cmFuc0Z1bmNMaXN0LlRhYmxlOwoJCWludCB0ZnVuY2xlbiA9 IHN0YXRlLT5vdXRUcmFuc2l0aW9uLnRyYW5zRnVuY0xpc3QuVGFibGVMZW5ndGg7CgkJZm9yICgg aW50IGkgPSAwOyBpIDwgdGZ1bmNsZW47IGkrKywgdGZ1bmMrKyApCgkJCWZwcmludGYoZmlsZSwg IiV4LCIsICp0ZnVuYyk7CgoJCWZwcmludGYoIGZpbGUsICIpXG4tPiIgKTsKCgkJRHVtcFRyYW5z aXRpb25zKGZpbGUsICZzdGF0ZS0+T3V0TGlzdCk7CgkJc3RhdGUgPSBzdGF0ZS0+TmV4dDsKCX0K fQoKCiMgMTAgInRlc3RGc21HcmFwaC5jcHAiIDIKCgoKCnN0cnVjdCBNeVN0YXRlOwoKc3RydWN0 IE15VHJhbnNpdGlvbiA6IAoJcHVibGljIEZzbVRyYW5zaXRpb248IE15U3RhdGUsIE15VHJhbnNp dGlvbiwgaW50LCBPcmRpbmFsQ29tcGFyZTxpbnQ+ID4gCnsKCWludCBUaGlzSXNUcmFuc2l0aW9u RGF0YTsKfTsKCgpzdHJ1Y3QgTXlTdGF0ZSA6IHB1YmxpYyBGc21TdGF0ZVZrPE15U3RhdGUsIGlu dCwgTXlUcmFuc2l0aW9uPgp7CglpbnQgVGhpc0lzU3RhdGVEYXRhOwp9OwoKdHlwZWRlZiBGc21C YXNlVms8TXlTdGF0ZSwgaW50LCBNeVRyYW5zaXRpb24+IEZzbUJhc2U7Cgp0ZW1wbGF0ZSBjbGFz cyBGc21CYXNlVms8TXlTdGF0ZSwgaW50LCBNeVRyYW5zaXRpb24+Owp0ZW1wbGF0ZSBjbGFzcyBG c21HcmFwaDxNeVN0YXRlLCBpbnQsIE15VHJhbnNpdGlvbiwgRnNtQmFzZT47Cgp0ZW1wbGF0ZTxj bGFzcyBTdGF0ZT4gc3RydWN0IE1hcmtJbmRleDsKCmludCB0ZXN0R3JhcGgxKCkKewoJTXlTdGF0 ZSBzdDsKCU15VHJhbnNpdGlvbiB0cjsKCXJldHVybiAwOwp9CgoKaW50IG1haW4oKQp7CglyZXR1 cm4gdGVzdEdyYXBoMSgpOwp9Cg==
next reply other threads:[~2001-06-27 21:26 UTC|newest] Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2001-06-27 21:26 athurston [this message] 2001-07-09 6:51 lerdsuwa 2001-12-11 22:29 rodrigc 2001-12-11 22:36 rodrigc
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20010628041948.19593.qmail@sourceware.cygnus.com \ --to=athurston@bigfoot.com \ --cc=gcc-gnats@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).