From mboxrd@z Thu Jan 1 00:00:00 1970 From: jikes@cabbey.net To: gcc-gnats@gcc.gnu.org Cc: jikes-dev@www-124.ibm.com Subject: c++/4305: optimizer ICE on seemingly unrelated code changes Date: Tue, 11 Sep 2001 23:16:00 -0000 Message-id: <20010912060711.25743.qmail@sourceware.cygnus.com> X-SW-Source: 2001-09/msg00245.html List-Id: >Number: 4305 >Category: c++ >Synopsis: optimizer ICE on seemingly unrelated code changes >Confidential: no >Severity: serious >Priority: low >Responsible: unassigned >State: open >Class: ice-on-legal-code >Submitter-Id: net >Arrival-Date: Tue Sep 11 23:16:01 PDT 2001 >Closed-Date: >Last-Modified: >Originator: Jikes project >Release: gcc version 2.95.3 20010315 (SuSE) >Organization: >Environment: Stock SuSE 7.2 x86 install running on SMP Pentium II system, kernel updated to 2.4.9 preview kernel from SuSE. We have intermittent reports of the same failure from Cygwin users as well: Fails: Win98, cygwin 1.3.2-1, gcc 2.95.3-5 Does not fail: WinNT, cygwin 1.3.1-1, gcc 2.95.3-4 >Description: Seemingly unrelated changes commited to our cvs tree cause an internal compiler error as such: g++ -v -save-temps -DHAVE_CONFIG_H -I. -I../../jikes/src -I. -g -O2 -c -o expr.o ../../jikes/src/expr.cpp Reading specs from /usr/lib/gcc-lib/i486-suse-linux/2.95.3/specs gcc version 2.95.3 20010315 (SuSE) /usr/lib/gcc-lib/i486-suse-linux/2.95.3/cpp0 -lang-c++ -v -I. -I../../jikes/src -I. -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__EXCEPTIONS -D__OPTIMIZE__ -g -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -Di486 -D__i486 -D__i486__ -DHAVE_CONFIG_H ../../jikes/src/expr.cpp expr.ii GNU CPP version 2.95.3 20010315 (SuSE) (i386 Linux/ELF) #include "..." search starts here: #include <...> search starts here: . ../../jikes/src . /usr/include/g++ /usr/local/include /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include /usr/include End of search list. The following default directories have been omitted from the search path: /usr/lib/gcc-lib/i486-suse-linux/2.95.3/../../../../i486-suse-linux/include End of omitted list. /usr/lib/gcc-lib/i486-suse-linux/2.95.3/cc1plus expr.ii -quiet -dumpbase expr.cc -g -O2 -version -o expr.s GNU C++ version 2.95.3 20010315 (SuSE) (i486-suse-linux) compiled by GNU C version 2.95.3 20010315 (SuSE). In file included from ../../jikes/src/expr.cpp:14: ../../jikes/src/tuple.h: In method `void Tuple >::AllocateMoreSpace()': ../../jikes/src/tuple.h:194: instantiated from `Tuple >::NextIndex()' ../../jikes/src/tuple.h:208: instantiated from `Tuple >::Next()' ../../jikes/src/semantic.h:186: instantiated from here ../../jikes/src/tuple.h:94: Internal compiler error. ../../jikes/src/tuple.h:94: Please submit a full bug report. ../../jikes/src/tuple.h:94: See for instructions. Reducing the optimization to -O1 prevents the problem, similarly some additional commits which don't appear to be related to the point of failure also correct/bypass the failure. cvs timestamps of relevance: good : "sep 8 05:00:00 utc" bad : "sep 8 06:00:00 utc" good : "sep 8 21:00:00 utc" We've not found anything in the changes that seem to interact with the code that is failing. >How-To-Repeat: 1. recreation from attached .ii: cc1plus expr.ii -quiet -dumpbase expr.cc -g -O2 -version -o expr.s 2. recreation from sources: full sources from cvs can be used to recreate this, but given the attached .ii file I doubt anyone will want to do that. If so either pull from cvs or ask for a tarball and we'll produce one. cvs root :pserver:anoncvs@www-214.ibm.com:/usr/cvs/jikes password: anoncvs module: jikes directions: checkout module, ./configure && make >Fix: use -O1 instead of -O2, or apply seemingly unrelated changes that either undo a set of previous changes or apply a new set. The second of these leaves open a possibility for this to reappear at any unexpected moment. >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="expr.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="expr.ii" IyAxICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiCiAKIAogCiAKIAogCiAKIAogCgojIDEgIi4u Ly4uL2ppa2VzL3NyYy9wbGF0Zm9ybS5oIiAxCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCgoKCgoKIyAxICJjb25m aWcuaCIgMQogCiAKCiAKCgoKCgoKIAoKCiAKCgogCgoKIAogCgogCgoKIAoKCiAKIAoKIAogCgog CgoKIAoKCiAKCgoKCiAKCiAKCiAKCgogCgoKIAoKCiAKCgogCiAKCiAKCgogCiAKCiAKCgogCiAK CiAKCgogCiAKCiAKIAoKIAogCgogCiAKCiAKCgogCgoKIAogCgogCgoKIAoKCiAKCgogCgoKIAoK CiAKCgogCiAKCiAKCgogCiAKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCiAKCiAKCgog CgoKIAoKCiAKCgogCgoKIAogCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAogCgogCiAK CiAKCgogCiAKCiAKCgoKIAoKIAoKIAoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCiAK CiAKCiAKIyA0MiAiLi4vLi4vamlrZXMvc3JjL3BsYXRmb3JtLmgiIDIKCgogCgoKCgoKCgoKIAoK IyAxICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoK CgoKCgojIDEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoK CgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCiAKCgoKIAoKCgoKCgoKIAoj IDE0MiAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDMKCgogCgoKCgoKCgoKCiAKCgoKCgoKCgog CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMjA4ICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMu aCIgMwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgogCgoKIAoKCgoKCgoK CiAKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCiAKCgojIDEgIi91c3IvaW5jbHVkZS9zeXMvY2RlZnMu aCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgogCgoKCgoKCiAKCgoKCgogCgoKCgoK CgoKIAoKCgojIDY1ICIvdXNyL2luY2x1ZGUvc3lzL2NkZWZzLmgiIDMKCgogCgoKCgoKIAoKCgoK IAoKCgoKCgoKCgogCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgog CgoKCgoKCgogCgoKCgoKCiAKCgoKCgoKCgogCgoKCgoKCgoKIAoKCgoKCgoKCiAKCgoKCgoKCgoK CiAKCgoKCgoKCiAKCgoKCiAKCgoKCgoKIyAyODMgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAy IDMKCgoKIAoKCgoKCgoKCiAKCgoKCiAKCiAKCgoKCgoKCgojIDEgIi91c3IvaW5jbHVkZS9nbnUv c3R1YnMuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMzExICIvdXNy L2luY2x1ZGUvZmVhdHVyZXMuaCIgMiAzCgoKCgojIDI2ICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVz LmgiIDIgMwoKCmV4dGVybiAiQyIgeyAKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIg MSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9p NDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAx OSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVm LmgiIDMKCgoKIAoKCiAKCgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2Ut bGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoK CgoKCgogCgoKCgoKIAoKIAoKIyAxMzEgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4 LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OwoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKIAoKCgoKIAoKIyAyNzEgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIu OTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIyAyODMgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1z dXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKIyAzMTcgIi91c3Iv bGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoK CgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMjkgIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgi IDIgMwoKCiAKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdV9jaGFyOwp0eXBlZGVmIHVuc2lnbmVk IHNob3J0IF9fdV9zaG9ydDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX191X2ludDsKdHlwZWRlZiB1 bnNpZ25lZCBsb25nIF9fdV9sb25nOwoKX19leHRlbnNpb25fXyB0eXBlZGVmIHVuc2lnbmVkIGxv bmcgbG9uZyBpbnQgX191X3F1YWRfdDsKX19leHRlbnNpb25fXyB0eXBlZGVmIGxvbmcgbG9uZyBp bnQgX19xdWFkX3Q7CiMgNDggIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgiIDMKCnR5cGVkZWYg c2lnbmVkIGNoYXIgX19pbnQ4X3Q7CnR5cGVkZWYgdW5zaWduZWQgY2hhciBfX3VpbnQ4X3Q7CnR5 cGVkZWYgc2lnbmVkIHNob3J0IGludCBfX2ludDE2X3Q7CnR5cGVkZWYgdW5zaWduZWQgc2hvcnQg aW50IF9fdWludDE2X3Q7CnR5cGVkZWYgc2lnbmVkIGludCBfX2ludDMyX3Q7CnR5cGVkZWYgdW5z aWduZWQgaW50IF9fdWludDMyX3Q7CgpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgc2lnbmVkIGxvbmcg bG9uZyBpbnQgX19pbnQ2NF90OwpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBs b25nIGludCBfX3VpbnQ2NF90OwoKdHlwZWRlZiBfX3F1YWRfdCAqX19xYWRkcl90OwoKdHlwZWRl ZiBfX3VfcXVhZF90IF9fZGV2X3Q7CQkgCnR5cGVkZWYgX191X2ludCBfX3VpZF90OwkJIAp0eXBl ZGVmIF9fdV9pbnQgX19naWRfdDsJCSAKdHlwZWRlZiBfX3VfbG9uZyBfX2lub190OwkJIAp0eXBl ZGVmIF9fdV9pbnQgX19tb2RlX3Q7CQkgCnR5cGVkZWYgX191X2ludCBfX25saW5rX3Q7IAkJIAp0 eXBlZGVmIGxvbmcgaW50IF9fb2ZmX3Q7CQkgCnR5cGVkZWYgX19xdWFkX3QgX19sb2ZmX3Q7CQkg CnR5cGVkZWYgaW50IF9fcGlkX3Q7CQkJIAp0eXBlZGVmIGludCBfX3NzaXplX3Q7CQkJIAp0eXBl ZGVmIF9fdV9sb25nIF9fcmxpbV90OwkJIAp0eXBlZGVmIF9fdV9xdWFkX3QgX19ybGltNjRfdDsJ CSAKdHlwZWRlZiBfX3VfaW50IF9faWRfdDsJCQkgCgp0eXBlZGVmIHN0cnVjdAogIHsKICAgIGlu dCBfX3ZhbFsyXTsKICB9IF9fZnNpZF90OwkJCQkgCgogCnR5cGVkZWYgaW50IF9fZGFkZHJfdDsJ CQkgCnR5cGVkZWYgY2hhciAqX19jYWRkcl90Owp0eXBlZGVmIGxvbmcgaW50IF9fdGltZV90Owp0 eXBlZGVmIHVuc2lnbmVkIGludCBfX3VzZWNvbmRzX3Q7CnR5cGVkZWYgbG9uZyBpbnQgX19zdXNl Y29uZHNfdDsKdHlwZWRlZiBsb25nIGludCBfX3N3YmxrX3Q7CQkgCgwKdHlwZWRlZiBsb25nIGlu dCBfX2Nsb2NrX3Q7CgogCnR5cGVkZWYgaW50IF9fY2xvY2tpZF90OwoKIAp0eXBlZGVmIGludCBf X3RpbWVyX3Q7CgoKIAoKCgp0eXBlZGVmIGludCBfX2tleV90OwoKIAp0eXBlZGVmIHVuc2lnbmVk IHNob3J0IGludCBfX2lwY19waWRfdDsKCgogCnR5cGVkZWYgbG9uZyBpbnQgX19ibGtzaXplX3Q7 CgogCgogCnR5cGVkZWYgbG9uZyBpbnQgX19ibGtjbnRfdDsKdHlwZWRlZiBfX3F1YWRfdCBfX2Js a2NudDY0X3Q7CgogCnR5cGVkZWYgX191X2xvbmcgX19mc2Jsa2NudF90Owp0eXBlZGVmIF9fdV9x dWFkX3QgX19mc2Jsa2NudDY0X3Q7CgogCnR5cGVkZWYgX191X2xvbmcgX19mc2ZpbGNudF90Owp0 eXBlZGVmIF9fdV9xdWFkX3QgX19mc2ZpbGNudDY0X3Q7CgogCnR5cGVkZWYgX191X3F1YWRfdCBf X2lubzY0X3Q7CgogCnR5cGVkZWYgX19sb2ZmX3QgX19vZmY2NF90OwoKIAp0eXBlZGVmIGxvbmcg aW50IF9fdF9zY2FsYXJfdDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX3RfdXNjYWxhcl90 OwoKIAp0eXBlZGVmIGludCBfX2ludHB0cl90OwoKIAp0eXBlZGVmIHVuc2lnbmVkIGludCBfX3Nv Y2tsZW5fdDsKCgogCgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oIiAxIDMK IAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCgoKCgoKCgojIDEgIi91c3IvaW5jbHVkZS9iaXRz L3NjaGVkLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgojIDYyICIvdXNyL2luY2x1ZGUvYml0 cy9zY2hlZC5oIiAzCgoKCgoKIApzdHJ1Y3QgX19zY2hlZF9wYXJhbQogIHsKICAgIGludCBfX3Nj aGVkX3ByaW9yaXR5OwogIH07CgoKIyAyMyAiL3Vzci9pbmNsdWRlL2JpdHMvcHRocmVhZHR5cGVz LmgiIDIgMwoKCiAKc3RydWN0IF9wdGhyZWFkX2Zhc3Rsb2NrCnsKICBsb25nIGludCBfX3N0YXR1 czsgICAgCiAgaW50IF9fc3BpbmxvY2s7ICAgICAgIAoKfTsKCgogCnR5cGVkZWYgc3RydWN0IF9w dGhyZWFkX2Rlc2NyX3N0cnVjdCAqX3B0aHJlYWRfZGVzY3I7CgoKCgogCnR5cGVkZWYgc3RydWN0 IF9fcHRocmVhZF9hdHRyX3MKewogIGludCBfX2RldGFjaHN0YXRlOwogIGludCBfX3NjaGVkcG9s aWN5OwogIHN0cnVjdCBfX3NjaGVkX3BhcmFtIF9fc2NoZWRwYXJhbTsKICBpbnQgX19pbmhlcml0 c2NoZWQ7CiAgaW50IF9fc2NvcGU7CiAgc2l6ZV90IF9fZ3VhcmRzaXplOwogIGludCBfX3N0YWNr YWRkcl9zZXQ7CiAgdm9pZCAqX19zdGFja2FkZHI7CiAgc2l6ZV90IF9fc3RhY2tzaXplOwp9IHB0 aHJlYWRfYXR0cl90OwoKCiAKdHlwZWRlZiBzdHJ1Y3QKewogIHN0cnVjdCBfcHRocmVhZF9mYXN0 bG9jayBfX2NfbG9jazsgIAogIF9wdGhyZWFkX2Rlc2NyIF9fY193YWl0aW5nOyAgICAgICAgIAp9 IHB0aHJlYWRfY29uZF90OwoKCiAKdHlwZWRlZiBzdHJ1Y3QKewogIGludCBfX2R1bW15Owp9IHB0 aHJlYWRfY29uZGF0dHJfdDsKCiAKdHlwZWRlZiB1bnNpZ25lZCBpbnQgcHRocmVhZF9rZXlfdDsK CgogCiAKCnR5cGVkZWYgc3RydWN0CnsKICBpbnQgX19tX3Jlc2VydmVkOyAgICAgICAgICAgICAg ICAKICBpbnQgX19tX2NvdW50OyAgICAgICAgICAgICAgICAgICAKICBfcHRocmVhZF9kZXNjciBf X21fb3duZXI7ICAgICAgICAKICBpbnQgX19tX2tpbmQ7ICAgICAgICAgICAgICAgICAgICAKICBz dHJ1Y3QgX3B0aHJlYWRfZmFzdGxvY2sgX19tX2xvY2s7ICAKfSBwdGhyZWFkX211dGV4X3Q7CgoK IAp0eXBlZGVmIHN0cnVjdAp7CiAgaW50IF9fbXV0ZXhraW5kOwp9IHB0aHJlYWRfbXV0ZXhhdHRy X3Q7CgoKIAp0eXBlZGVmIGludCBwdGhyZWFkX29uY2VfdDsKCgojIDExNyAiL3Vzci9pbmNsdWRl L2JpdHMvcHRocmVhZHR5cGVzLmgiIDMKCgojIDEzNiAiL3Vzci9pbmNsdWRlL2JpdHMvcHRocmVh ZHR5cGVzLmgiIDMKCgoKIAp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHB0aHJlYWRfdDsKCgoj IDE0MyAiL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIgMiAzCgoKCgojIDMwICIvdXNyL2luY2x1 ZGUvc3lzL3R5cGVzLmgiIDIgMwoKCgp0eXBlZGVmIF9fdV9jaGFyIHVfY2hhcjsKdHlwZWRlZiBf X3Vfc2hvcnQgdV9zaG9ydDsKdHlwZWRlZiBfX3VfaW50IHVfaW50Owp0eXBlZGVmIF9fdV9sb25n IHVfbG9uZzsKdHlwZWRlZiBfX3F1YWRfdCBxdWFkX3Q7CnR5cGVkZWYgX191X3F1YWRfdCB1X3F1 YWRfdDsKdHlwZWRlZiBfX2ZzaWRfdCBmc2lkX3Q7CgoKdHlwZWRlZiBfX2xvZmZfdCBsb2ZmX3Q7 CgoKCnR5cGVkZWYgX19pbm9fdCBpbm9fdDsKCgoKCgoKCgoKCgp0eXBlZGVmIF9fZGV2X3QgZGV2 X3Q7CgoKCgp0eXBlZGVmIF9fZ2lkX3QgZ2lkX3Q7CgoKCgp0eXBlZGVmIF9fbW9kZV90IG1vZGVf dDsKCgoKCnR5cGVkZWYgX19ubGlua190IG5saW5rX3Q7CgoKCgp0eXBlZGVmIF9fdWlkX3QgdWlk X3Q7CgoKCgoKdHlwZWRlZiBfX29mZl90IG9mZl90OwoKCgoKCgoKCgoKCnR5cGVkZWYgX19waWRf dCBwaWRfdDsKCgoKCnR5cGVkZWYgX19pZF90IGlkX3Q7CgoKCgp0eXBlZGVmIF9fc3NpemVfdCBz c2l6ZV90OwoKCgoKdHlwZWRlZiBfX2RhZGRyX3QgZGFkZHJfdDsKdHlwZWRlZiBfX2NhZGRyX3Qg Y2FkZHJfdDsKCgoKdHlwZWRlZiBfX2tleV90IGtleV90OwoKCgoKCgoKCgojIDEgIi91c3IvaW5j bHVkZS90aW1lLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCiMgNTEg Ii91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgojIDYxICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoK CgoKCgoKIAp0eXBlZGVmIF9fdGltZV90IHRpbWVfdDsKCgoKCgoKCgoKCiAKdHlwZWRlZiBfX2Ns b2NraWRfdCBjbG9ja2lkX3Q7CgoKCgoKCgoKCgogCnR5cGVkZWYgX190aW1lcl90IHRpbWVyX3Q7 CgoKCgoKIyAxMTIgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgoKCiMgMzY0ICIvdXNyL2luY2x1 ZGUvdGltZS5oIiAzCgoKCiMgMTI2ICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDIgMwoKCiMg MTM3ICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDMKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGli L2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCgoKCgoKCiAKCgoj IDE5ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRk ZWYuaCIgMwoKCgogCgoKIAoKCgoKCiAKCgojIDYxICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3Vz ZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoK CgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGlu dXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgogCgoKIyAxODggIi91c3IvbGliL2dj Yy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKIAoK CgoKIAoKIyAyNzEgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNs dWRlL3N0ZGRlZi5oIiAzCgoKIyAyODMgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4 LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKIyAzMTcgIi91c3IvbGliL2djYy1s aWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiMgMTQwICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDIgMwoKCgog CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmc7CnR5cGVkZWYgdW5zaWduZWQgc2hvcnQg aW50IHVzaG9ydDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKCgogCgojIDE3NCAiL3Vzci9p bmNsdWRlL3N5cy90eXBlcy5oIiAzCgoKIAoKCgoKCgoKdHlwZWRlZiBpbnQgaW50OF90IF9fYXR0 cmlidXRlX18gKChfX21vZGVfXyAoICBfX1FJX18gKSkpIDsKdHlwZWRlZiBpbnQgaW50MTZfdCBf X2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKCAgX19ISV9fICkpKSA7CnR5cGVkZWYgaW50IGludDMy X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fICggIF9fU0lfXyApKSkgOwp0eXBlZGVmIGludCBp bnQ2NF90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoICBfX0RJX18gKSkpIDsKCgp0eXBlZGVm IHVuc2lnbmVkIGludCB1X2ludDhfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKCAgX19RSV9f ICkpKSA7CnR5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50MTZfdCBfX2F0dHJpYnV0ZV9fICgoX19t b2RlX18gKCAgX19ISV9fICkpKSA7CnR5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50MzJfdCBfX2F0 dHJpYnV0ZV9fICgoX19tb2RlX18gKCAgX19TSV9fICkpKSA7CnR5cGVkZWYgdW5zaWduZWQgaW50 IHVfaW50NjRfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2RlX18gKCAgX19ESV9fICkpKSA7Cgp0eXBl ZGVmIGludCByZWdpc3Rlcl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX193b3JkX18pKSk7 CgoKIAoKCgoKCgogCiMgMSAiL3Vzci9pbmNsdWRlL2VuZGlhbi5oIiAxIDMKIAoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCiAKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9lbmRpYW4u aCIgMSAzCiAKCgoKCgoKIyAzNyAiL3Vzci9pbmNsdWRlL2VuZGlhbi5oIiAyIDMKCgogCgoKCgoK CgoKCgoKCgoKCgoKCgojIDIwNiAiL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIiAyIDMKCgogCiMg MSAiL3Vzci9pbmNsdWRlL3N5cy9zZWxlY3QuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoK CgoKCgogCgoKIAojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3NlbGVjdC5oIiAxIDMKIAoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKIyAzNiAiL3Vzci9pbmNsdWRlL2JpdHMvc2VsZWN0LmgiIDMKCgoK CgoKCgoKCgoKIyA1NiAiL3Vzci9pbmNsdWRlL2JpdHMvc2VsZWN0LmgiIDMKCiMgNzIgIi91c3Iv aW5jbHVkZS9iaXRzL3NlbGVjdC5oIiAzCgojIDMxICIvdXNyL2luY2x1ZGUvc3lzL3NlbGVjdC5o IiAyIDMKCgogCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMvc2lnc2V0LmgiIDEgMwogCgoKCgoKCgoK CgoKCgoKCgoKCgoKCnR5cGVkZWYgaW50IF9fc2lnX2F0b21pY190OwoKIAoKCnR5cGVkZWYgc3Ry dWN0CiAgewogICAgdW5zaWduZWQgbG9uZyBpbnQgX192YWxbKDEwMjQgLyAoOCAqIHNpemVvZiAo dW5zaWduZWQgbG9uZyBpbnQpKSkgXTsKICB9IF9fc2lnc2V0X3Q7CgoKCgogCgoKCgoKIyAxMjUg Ii91c3IvaW5jbHVkZS9iaXRzL3NpZ3NldC5oIiAzCgojIDM0ICIvdXNyL2luY2x1ZGUvc3lzL3Nl bGVjdC5oIiAyIDMKCgoKCnR5cGVkZWYgX19zaWdzZXRfdCBzaWdzZXRfdDsKCgogCgojIDEgIi91 c3IvaW5jbHVkZS90aW1lLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoK CiMgNTEgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgojIDYxICIvdXNyL2luY2x1ZGUvdGltZS5o IiAzCgoKCiMgNzIgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgoKIyA4NCAiL3Vzci9pbmNsdWRl L3RpbWUuaCIgMwoKCgojIDk2ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCgoKCgoKIAoKc3Ry dWN0IHRpbWVzcGVjCiAgewogICAgbG9uZyBpbnQgdHZfc2VjOwkJIAogICAgbG9uZyBpbnQgdHZf bnNlYzsJCSAKICB9OwoKCgoKCiMgMzY0ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCiMgNDMg Ii91c3IvaW5jbHVkZS9zeXMvc2VsZWN0LmgiIDIgMwoKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMv dGltZS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCiMgNTcgIi91c3IvaW5jbHVkZS9i aXRzL3RpbWUuaCIgMwoKCgoKCgoKCiAKCnN0cnVjdCB0aW1ldmFsCiAgewogICAgX190aW1lX3Qg dHZfc2VjOwkJIAogICAgX19zdXNlY29uZHNfdCB0dl91c2VjOwkgCiAgfTsKCgojIDQ1ICIvdXNy L2luY2x1ZGUvc3lzL3NlbGVjdC5oIiAyIDMKCgoKIAp0eXBlZGVmIGxvbmcgaW50IF9fZmRfbWFz azsKCiAKCgoKCiAKdHlwZWRlZiBzdHJ1Y3QKICB7CiAgICAgCgoKCgoKICAgIF9fZmRfbWFzayBf X2Zkc19iaXRzWzEwMjQgIC8gKDggKiBzaXplb2YgKF9fZmRfbWFzaykpIF07CgoKICB9IGZkX3Nl dDsKCiAKCgoKIAp0eXBlZGVmIF9fZmRfbWFzayBmZF9tYXNrOwoKIAoKCgoKIAoKCgoKCgpleHRl cm4gIkMiIHsgCgogCgoKCgpleHRlcm4gaW50IHNlbGVjdCAoaW50IF9fbmZkcywgZmRfc2V0ICpf X3Jlc3RyaWN0IF9fcmVhZGZkcywKCQkgICBmZF9zZXQgKl9fcmVzdHJpY3QgX193cml0ZWZkcywK CQkgICBmZF9zZXQgKl9fcmVzdHJpY3QgX19leGNlcHRmZHMsCgkJICAgc3RydWN0IHRpbWV2YWwg Kl9fcmVzdHJpY3QgX190aW1lb3V0KSB0aHJvdyAoKSA7CgojIDExMCAiL3Vzci9pbmNsdWRlL3N5 cy9zZWxlY3QuaCIgMwoKCn0gCgoKIyAyMDkgIi91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCIgMiAz CgoKIAojIDEgIi91c3IvaW5jbHVkZS9zeXMvc3lzbWFjcm9zLmgiIDEgMwogCgoKCgoKCgoKCgoK CgoKCgoKCgoKCiAKCgoKCgoKCgojIDQ3ICIvdXNyL2luY2x1ZGUvc3lzL3N5c21hY3Jvcy5oIiAz CgoKCiMgMjEyICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDIgMwoKCgoKCgoKCgogCgoKdHlw ZWRlZiBfX2Jsa2NudF90IGJsa2NudF90OwkgIAoKCgp0eXBlZGVmIF9fZnNibGtjbnRfdCBmc2Js a2NudF90OyAgCgoKCnR5cGVkZWYgX19mc2ZpbGNudF90IGZzZmlsY250X3Q7ICAKCgojIDI0OCAi L3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIiAzCgoKCgoKCgoKfSAKCgojIDU1ICIuLi8uLi9qaWtl cy9zcmMvcGxhdGZvcm0uaCIgMgoKIAojIDEgIi91c3IvaW5jbHVkZS9zeXMvc3RhdC5oIiAxIDMK IAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCiMgNzggIi91c3IvaW5jbHVkZS9zeXMvc3Rh dC5oIiAzCgoKIyA5NCAiL3Vzci9pbmNsdWRlL3N5cy9zdGF0LmgiIDMKCgpleHRlcm4gIkMiIHsg CgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3N0YXQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKIAoKCgoKCgogCgoKCgoKc3RydWN0IHN0YXQKICB7CiAgICBfX2Rldl90IHN0X2RldjsJCQkg CiAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19wYWQxOwoKICAgIF9faW5vX3Qgc3RfaW5vOwkJCSAK CgoKICAgIF9fbW9kZV90IHN0X21vZGU7CQkJIAogICAgX19ubGlua190IHN0X25saW5rOwkJCSAK ICAgIF9fdWlkX3Qgc3RfdWlkOwkJCSAKICAgIF9fZ2lkX3Qgc3RfZ2lkOwkJCSAKICAgIF9fZGV2 X3Qgc3RfcmRldjsJCQkgCiAgICB1bnNpZ25lZCBzaG9ydCBpbnQgX19wYWQyOwoKICAgIF9fb2Zm X3Qgc3Rfc2l6ZTsJCQkgCgoKCiAgICBfX2Jsa3NpemVfdCBzdF9ibGtzaXplOwkJIAoKCiAgICBf X2Jsa2NudF90IHN0X2Jsb2NrczsJCSAKCgoKICAgIF9fdGltZV90IHN0X2F0aW1lOwkJCSAKICAg IHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMTsKICAgIF9fdGltZV90IHN0X210aW1lOwkJCSAK ICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMjsKICAgIF9fdGltZV90IHN0X2N0aW1lOwkJ CSAKICAgIHVuc2lnbmVkIGxvbmcgaW50IF9fdW51c2VkMzsKCiAgICB1bnNpZ25lZCBsb25nIGlu dCBfX3VudXNlZDQ7CiAgICB1bnNpZ25lZCBsb25nIGludCBfX3VudXNlZDU7CgoKCiAgfTsKCiMg MTAyICIvdXNyL2luY2x1ZGUvYml0cy9zdGF0LmgiIDMKCgogCgoKCiAKCgoKIAoKCgoKCgoKCiAK CgoKCiAKCgoKCgoKCiMgOTggIi91c3IvaW5jbHVkZS9zeXMvc3RhdC5oIiAyIDMKCgoKCgoKCgoK CgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKIAoKCgoKCiAK CgoKCgoKIAoKCgoKCgoKCgoKCiAKCgoKCgogCgoKCgogCgoKCgoKCgoKCiAKZXh0ZXJuIGludCBz dGF0IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlLAoJCSBzdHJ1Y3Qgc3RhdCAqX19y ZXN0cmljdCBfX2J1ZikgdGhyb3cgKCkgOwoKIAoKZXh0ZXJuIGludCBmc3RhdCAoaW50IF9fZmQs IHN0cnVjdCBzdGF0ICpfX2J1ZikgdGhyb3cgKCkgOwojIDIxNyAiL3Vzci9pbmNsdWRlL3N5cy9z dGF0LmgiIDMKCgoKCgoKCgoKIAoKZXh0ZXJuIGludCBsc3RhdCAoX19jb25zdCBjaGFyICpfX3Jl c3RyaWN0IF9fZmlsZSwKCQkgIHN0cnVjdCBzdGF0ICpfX3Jlc3RyaWN0IF9fYnVmKSB0aHJvdyAo KSA7CiMgMjM5ICIvdXNyL2luY2x1ZGUvc3lzL3N0YXQuaCIgMwoKCgoKCgoKIAoKCmV4dGVybiBp bnQgY2htb2QgKF9fY29uc3QgY2hhciAqX19maWxlLCBfX21vZGVfdCBfX21vZGUpIHRocm93ICgp IDsKCiAKCmV4dGVybiBpbnQgZmNobW9kIChpbnQgX19mZCwgX19tb2RlX3QgX19tb2RlKSB0aHJv dyAoKSA7CgoKCiAKCmV4dGVybiBfX21vZGVfdCB1bWFzayAoX19tb2RlX3QgX19tYXNrKSB0aHJv dyAoKSA7CgoKCgoKCgogCmV4dGVybiBpbnQgbWtkaXIgKF9fY29uc3QgY2hhciAqX19wYXRoLCBf X21vZGVfdCBfX21vZGUpIHRocm93ICgpIDsKCiAKCgoKZXh0ZXJuIGludCBta25vZCAoX19jb25z dCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSwgX19kZXZfdCBfX2RldikKICAgICB0aHJv dyAoKSA7CgoKCiAKZXh0ZXJuIGludCBta2ZpZm8gKF9fY29uc3QgY2hhciAqX19wYXRoLCBfX21v ZGVfdCBfX21vZGUpIHRocm93ICgpIDsKDAogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCmV4dGVy biBpbnQgX19meHN0YXQgKGludCBfX3ZlciwgaW50IF9fZmlsZGVzLCBzdHJ1Y3Qgc3RhdCAqX19z dGF0X2J1ZikgdGhyb3cgKCkgOwpleHRlcm4gaW50IF9feHN0YXQgKGludCBfX3ZlciwgX19jb25z dCBjaGFyICpfX2ZpbGVuYW1lLAoJCSAgICBzdHJ1Y3Qgc3RhdCAqX19zdGF0X2J1ZikgdGhyb3cg KCkgOwpleHRlcm4gaW50IF9fbHhzdGF0IChpbnQgX192ZXIsIF9fY29uc3QgY2hhciAqX19maWxl bmFtZSwKCQkgICAgIHN0cnVjdCBzdGF0ICpfX3N0YXRfYnVmKSB0aHJvdyAoKSA7CiMgMzI3ICIv dXNyL2luY2x1ZGUvc3lzL3N0YXQuaCIgMwoKCgoKCgoKCgoKZXh0ZXJuIGludCBfX3hta25vZCAo aW50IF9fdmVyLCBfX2NvbnN0IGNoYXIgKl9fcGF0aCwgX19tb2RlX3QgX19tb2RlLAoJCSAgICAg X19kZXZfdCAqX19kZXYpIHRocm93ICgpIDsKCgogCgpleHRlcm4gX19pbmxpbmVfXyBpbnQgc3Rh dCAoX19jb25zdCBjaGFyICpfX3BhdGgsCgkJCSAgICBzdHJ1Y3Qgc3RhdCAqX19zdGF0YnVmKSB0 aHJvdyAoKSAKewogIHJldHVybiBfX3hzdGF0ICgzICAsIF9fcGF0aCwgX19zdGF0YnVmKTsKfQoK CmV4dGVybiBfX2lubGluZV9fIGludCBsc3RhdCAoX19jb25zdCBjaGFyICpfX3BhdGgsCgkJCSAg ICAgc3RydWN0IHN0YXQgKl9fc3RhdGJ1ZikgdGhyb3cgKCkgCnsKICByZXR1cm4gX19seHN0YXQg KDMgICwgX19wYXRoLCBfX3N0YXRidWYpOwp9CgoKZXh0ZXJuIF9faW5saW5lX18gaW50IGZzdGF0 IChpbnQgX19mZCwgc3RydWN0IHN0YXQgKl9fc3RhdGJ1ZikgdGhyb3cgKCkgCnsKICByZXR1cm4g X19meHN0YXQgKDMgICwgX19mZCwgX19zdGF0YnVmKTsKfQoKCmV4dGVybiBfX2lubGluZV9fIGlu dCBta25vZCAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fbW9kZV90IF9fbW9kZSwKCQkJICAgICBf X2Rldl90IF9fZGV2KSB0aHJvdyAoKSAKewogIHJldHVybiBfX3hta25vZCAoMSAgLCBfX3BhdGgs IF9fbW9kZSwgJl9fZGV2KTsKfQoKCiMgMzkxICIvdXNyL2luY2x1ZGUvc3lzL3N0YXQuaCIgMwoK CgoKfSAKCgoKIyA1NyAiLi4vLi4vamlrZXMvc3JjL3BsYXRmb3JtLmgiIDIKCgojIDEgIi91c3Iv aW5jbHVkZS9zdGRsaWIuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgogCgoKCgoK IyAxICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRk ZWYuaCIgMSAzCgoKCgoKCiAKCgojIDE5ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51 eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgogCgoKIAoKCgoKCiAKCgojIDYxICIvdXNy L2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoK CiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIv Z2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgog CgoKIyAxODggIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKCgoKIAoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDI4MyAiL3Vzci9s aWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgog CgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1 ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAzMyAiL3Vzci9pbmNs dWRlL3N0ZGxpYi5oIiAyIDMKCgpleHRlcm4gIkMiIHsgCgoKCgojIDkxICIvdXNyL2luY2x1ZGUv c3RkbGliLmgiIDMKCgogCnR5cGVkZWYgc3RydWN0CiAgewogICAgaW50IHF1b3Q7CQkJIAogICAg aW50IHJlbTsJCQkgCiAgfSBkaXZfdDsKCiAKCnR5cGVkZWYgc3RydWN0CiAgewogICAgbG9uZyBp bnQgcXVvdDsJCSAKICAgIGxvbmcgaW50IHJlbTsJCSAKICB9IGxkaXZfdDsKCgoKIyAxMTggIi91 c3IvaW5jbHVkZS9zdGRsaWIuaCIgMwoKCgogCgoKCiAKCgoKCgogCgpleHRlcm4gc2l6ZV90IF9f Y3R5cGVfZ2V0X21iX2N1cl9tYXggKHZvaWQpIHRocm93ICgpIDsKCgogCmV4dGVybiBkb3VibGUg YXRvZiAoX19jb25zdCBjaGFyICpfX25wdHIpIHRocm93ICgpICAgOwogCmV4dGVybiBpbnQgYXRv aSAoX19jb25zdCBjaGFyICpfX25wdHIpIHRocm93ICgpICAgOwogCmV4dGVybiBsb25nIGludCBh dG9sIChfX2NvbnN0IGNoYXIgKl9fbnB0cikgdGhyb3cgKCkgICA7CgoKIApfX2V4dGVuc2lvbl9f IGV4dGVybiBsb25nIGxvbmcgaW50IGF0b2xsIChfX2NvbnN0IGNoYXIgKl9fbnB0cikKICAgICB0 aHJvdyAoKSAgIDsKCgogCmV4dGVybiBkb3VibGUgc3RydG9kIChfX2NvbnN0IGNoYXIgKl9fcmVz dHJpY3QgX19ucHRyLAoJCSAgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyKSB0aHJvdyAo KSA7CgoKCgoKCgoKCgogCmV4dGVybiBsb25nIGludCBzdHJ0b2wgKF9fY29uc3QgY2hhciAqX19y ZXN0cmljdCBfX25wdHIsCgkJCWNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNl KSB0aHJvdyAoKSA7CiAKZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHN0cnRvdWwgKF9fY29uc3Qg Y2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCQkgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRy LCBpbnQgX19iYXNlKQogICAgIHRocm93ICgpIDsKCgogCl9fZXh0ZW5zaW9uX18KZXh0ZXJuIGxv bmcgbG9uZyBpbnQgc3RydG9xIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAoJCQkg ICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNlKSB0aHJvdyAoKSA7CiAK X19leHRlbnNpb25fXwpleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGludCBzdHJ0b3VxIChfX2Nv bnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAoJCQkJICAgICAgIGNoYXIgKipfX3Jlc3RyaWN0 IF9fZW5kcHRyLCBpbnQgX19iYXNlKQogICAgIHRocm93ICgpIDsKCgoKIAoKIApfX2V4dGVuc2lv bl9fCmV4dGVybiBsb25nIGxvbmcgaW50IHN0cnRvbGwgKF9fY29uc3QgY2hhciAqX19yZXN0cmlj dCBfX25wdHIsCgkJCSAgICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLCBpbnQgX19iYXNl KSB0aHJvdyAoKSA7CiAKX19leHRlbnNpb25fXwpleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGlu dCBzdHJ0b3VsbCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKCQkJCQljaGFyICoq X19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkKICAgICB0aHJvdyAoKSA7CgoKCiMgMjQ0 ICIvdXNyL2luY2x1ZGUvc3RkbGliLmgiIDMKCgoKIAoKCmV4dGVybiBkb3VibGUgX19zdHJ0b2Rf aW50ZXJuYWwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCQkgY2hhciAqKl9f cmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2dyb3VwKQogICAgIHRocm93ICgpIDsKZXh0ZXJuIGZs b2F0IF9fc3RydG9mX2ludGVybmFsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAoJ CQkJY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2dyb3VwKQogICAgIHRocm93ICgp IDsKZXh0ZXJuIGxvbmcgZG91YmxlIF9fc3RydG9sZF9pbnRlcm5hbCAoX19jb25zdCBjaGFyICpf X3Jlc3RyaWN0IF9fbnB0ciwKCQkJCSAgICAgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwK CQkJCSAgICAgICBpbnQgX19ncm91cCkgdGhyb3cgKCkgOwoKZXh0ZXJuIGxvbmcgaW50IF9fc3Ry dG9sX2ludGVybmFsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAoJCQkJICAgY2hh ciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCgkJCQkgICBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkg dGhyb3cgKCkgOwoKCgpleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgX19zdHJ0b3VsX2ludGVybmFs IChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAoJCQkJCSAgICAgY2hhciAqKl9fcmVz dHJpY3QgX19lbmRwdHIsCgkJCQkJICAgICBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkgdGhyb3cg KCkgOwoKCgoKX19leHRlbnNpb25fXwpleHRlcm4gbG9uZyBsb25nIGludCBfX3N0cnRvbGxfaW50 ZXJuYWwgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCQkJIGNoYXIgKipfX3Jl c3RyaWN0IF9fZW5kcHRyLAoJCQkJCSBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkgdGhyb3cgKCkg OwoKCgpfX2V4dGVuc2lvbl9fCmV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fc3RydG91 bGxfaW50ZXJuYWwgKF9fY29uc3QgY2hhciAqCgkJCQkJCSAgIF9fcmVzdHJpY3QgX19ucHRyLAoJ CQkJCQkgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKCQkJCQkJICAgaW50IF9fYmFzZSwg aW50IF9fZ3JvdXApCiAgICAgdGhyb3cgKCkgOwoKCgoKCgogCgpleHRlcm4gX19pbmxpbmUgZG91 YmxlCnN0cnRvZCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwgY2hhciAqKl9fcmVz dHJpY3QgX19lbmRwdHIpIHRocm93ICgpIAp7CiAgcmV0dXJuIF9fc3RydG9kX2ludGVybmFsIChf X25wdHIsIF9fZW5kcHRyLCAwKTsKfQpleHRlcm4gX19pbmxpbmUgbG9uZyBpbnQKc3RydG9sIChf X2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLCBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0 ciwKCWludCBfX2Jhc2UpIHRocm93ICgpIAp7CiAgcmV0dXJuIF9fc3RydG9sX2ludGVybmFsIChf X25wdHIsIF9fZW5kcHRyLCBfX2Jhc2UsIDApOwp9CmV4dGVybiBfX2lubGluZSB1bnNpZ25lZCBs b25nIGludApzdHJ0b3VsIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLCBjaGFyICoq X19yZXN0cmljdCBfX2VuZHB0ciwKCSBpbnQgX19iYXNlKSB0aHJvdyAoKSAKewogIHJldHVybiBf X3N0cnRvdWxfaW50ZXJuYWwgKF9fbnB0ciwgX19lbmRwdHIsIF9fYmFzZSwgMCk7Cn0KCiMgMzIz ICIvdXNyL2luY2x1ZGUvc3RkbGliLmgiIDMKCgoKX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxp bmUgbG9uZyBsb25nIGludApzdHJ0b3EgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIs IGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAoJaW50IF9fYmFzZSkgdGhyb3cgKCkgCnsKICBy ZXR1cm4gX19zdHJ0b2xsX2ludGVybmFsIChfX25wdHIsIF9fZW5kcHRyLCBfX2Jhc2UsIDApOwp9 Cl9fZXh0ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKc3Ry dG91cSAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwgY2hhciAqKl9fcmVzdHJpY3Qg X19lbmRwdHIsCgkgaW50IF9fYmFzZSkgdGhyb3cgKCkgCnsKICByZXR1cm4gX19zdHJ0b3VsbF9p bnRlcm5hbCAoX19ucHRyLCBfX2VuZHB0ciwgX19iYXNlLCAwKTsKfQoKCgpfX2V4dGVuc2lvbl9f IGV4dGVybiBfX2lubGluZSBsb25nIGxvbmcgaW50CnN0cnRvbGwgKF9fY29uc3QgY2hhciAqX19y ZXN0cmljdCBfX25wdHIsIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAoJIGludCBfX2Jhc2Up IHRocm93ICgpIAp7CiAgcmV0dXJuIF9fc3RydG9sbF9pbnRlcm5hbCAoX19ucHRyLCBfX2VuZHB0 ciwgX19iYXNlLCAwKTsKfQpfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSB1bnNpZ25lZCBs b25nIGxvbmcgaW50CnN0cnRvdWxsIChfX2NvbnN0IGNoYXIgKiBfX3Jlc3RyaWN0IF9fbnB0ciwg Y2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCgkgIGludCBfX2Jhc2UpIHRocm93ICgpIAp7CiAg cmV0dXJuIF9fc3RydG91bGxfaW50ZXJuYWwgKF9fbnB0ciwgX19lbmRwdHIsIF9fYmFzZSwgMCk7 Cn0KCgpleHRlcm4gX19pbmxpbmUgZG91YmxlCmF0b2YgKF9fY29uc3QgY2hhciAqX19ucHRyKSB0 aHJvdyAoKSAKewogIHJldHVybiBzdHJ0b2QgKF9fbnB0ciwgKGNoYXIgKiopIF9fbnVsbCApOwp9 CmV4dGVybiBfX2lubGluZSBpbnQKYXRvaSAoX19jb25zdCBjaGFyICpfX25wdHIpIHRocm93ICgp IAp7CiAgcmV0dXJuIChpbnQpIHN0cnRvbCAoX19ucHRyLCAoY2hhciAqKikgX19udWxsICwgMTAp Owp9CmV4dGVybiBfX2lubGluZSBsb25nIGludAphdG9sIChfX2NvbnN0IGNoYXIgKl9fbnB0cikg dGhyb3cgKCkgCnsKICByZXR1cm4gc3RydG9sIChfX25wdHIsIChjaGFyICoqKSBfX251bGwgLCAx MCk7Cn0KCgpfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSBsb25nIGxvbmcgaW50CmF0b2xs IChfX2NvbnN0IGNoYXIgKl9fbnB0cikgdGhyb3cgKCkgCnsKICByZXR1cm4gc3RydG9sbCAoX19u cHRyLCAoY2hhciAqKikgX19udWxsICwgMTApOwp9CgoKCgoKIAoKCmV4dGVybiBjaGFyICpsNjRh IChsb25nIGludCBfX24pIHRocm93ICgpIDsKCiAKZXh0ZXJuIGxvbmcgaW50IGE2NGwgKF9fY29u c3QgY2hhciAqX19zKSB0aHJvdyAoKSAgIDsKCgoKCiAKCgoKIApleHRlcm4gbG9uZyBpbnQgcmFu ZG9tICh2b2lkKSB0aHJvdyAoKSA7CgogCmV4dGVybiB2b2lkIHNyYW5kb20gKHVuc2lnbmVkIGlu dCBfX3NlZWQpIHRocm93ICgpIDsKCiAKCgoKZXh0ZXJuIGNoYXIgKmluaXRzdGF0ZSAodW5zaWdu ZWQgaW50IF9fc2VlZCwgY2hhciAqX19zdGF0ZWJ1ZiwKCQkJc2l6ZV90IF9fc3RhdGVsZW4pIHRo cm93ICgpIDsKCiAKCmV4dGVybiBjaGFyICpzZXRzdGF0ZSAoY2hhciAqX19zdGF0ZWJ1ZikgdGhy b3cgKCkgOwoKCgogCgoKCnN0cnVjdCByYW5kb21fZGF0YQogIHsKICAgIGludDMyX3QgKmZwdHI7 CQkgCiAgICBpbnQzMl90ICpycHRyOwkJIAogICAgaW50MzJfdCAqc3RhdGU7CQkgCiAgICBpbnQg cmFuZF90eXBlOwkJIAogICAgaW50IHJhbmRfZGVnOwkJIAogICAgaW50IHJhbmRfc2VwOwkJIAog ICAgaW50MzJfdCAqZW5kX3B0cjsJCSAKICB9OwoKZXh0ZXJuIGludCByYW5kb21fciAoc3RydWN0 IHJhbmRvbV9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmLAoJCSAgICAgaW50MzJfdCAqX19yZXN0cmlj dCBfX3Jlc3VsdCkgdGhyb3cgKCkgOwoKZXh0ZXJuIGludCBzcmFuZG9tX3IgKHVuc2lnbmVkIGlu dCBfX3NlZWQsIHN0cnVjdCByYW5kb21fZGF0YSAqX19idWYpIHRocm93ICgpIDsKCmV4dGVybiBp bnQgaW5pdHN0YXRlX3IgKHVuc2lnbmVkIGludCBfX3NlZWQsIGNoYXIgKl9fcmVzdHJpY3QgX19z dGF0ZWJ1ZiwKCQkJc2l6ZV90IF9fc3RhdGVsZW4sCgkJCXN0cnVjdCByYW5kb21fZGF0YSAqX19y ZXN0cmljdCBfX2J1ZikgdGhyb3cgKCkgOwoKZXh0ZXJuIGludCBzZXRzdGF0ZV9yIChjaGFyICpf X3Jlc3RyaWN0IF9fc3RhdGVidWYsCgkJICAgICAgIHN0cnVjdCByYW5kb21fZGF0YSAqX19yZXN0 cmljdCBfX2J1ZikgdGhyb3cgKCkgOwoKCgoKIApleHRlcm4gaW50IHJhbmQgKHZvaWQpIHRocm93 ICgpIDsKIApleHRlcm4gdm9pZCBzcmFuZCAodW5zaWduZWQgaW50IF9fc2VlZCkgdGhyb3cgKCkg OwoKCiAKZXh0ZXJuIGludCByYW5kX3IgKHVuc2lnbmVkIGludCAqX19zZWVkKSB0aHJvdyAoKSA7 CgoKCgogCgogCmV4dGVybiBkb3VibGUgZHJhbmQ0OCAodm9pZCkgdGhyb3cgKCkgOwpleHRlcm4g ZG91YmxlIGVyYW5kNDggKHVuc2lnbmVkIHNob3J0IGludCBfX3hzdWJpWzNdKSB0aHJvdyAoKSA7 CgogCmV4dGVybiBsb25nIGludCBscmFuZDQ4ICh2b2lkKSB0aHJvdyAoKSA7CmV4dGVybiBsb25n IGludCBucmFuZDQ4ICh1bnNpZ25lZCBzaG9ydCBpbnQgX194c3ViaVszXSkgdGhyb3cgKCkgOwoK IApleHRlcm4gbG9uZyBpbnQgbXJhbmQ0OCAodm9pZCkgdGhyb3cgKCkgOwpleHRlcm4gbG9uZyBp bnQganJhbmQ0OCAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10pIHRocm93ICgpIDsKCiAK ZXh0ZXJuIHZvaWQgc3JhbmQ0OCAobG9uZyBpbnQgX19zZWVkdmFsKSB0aHJvdyAoKSA7CmV4dGVy biB1bnNpZ25lZCBzaG9ydCBpbnQgKnNlZWQ0OCAodW5zaWduZWQgc2hvcnQgaW50IF9fc2VlZDE2 dlszXSkgdGhyb3cgKCkgOwpleHRlcm4gdm9pZCBsY29uZzQ4ICh1bnNpZ25lZCBzaG9ydCBpbnQg X19wYXJhbVs3XSkgdGhyb3cgKCkgOwoKCiAKCgpzdHJ1Y3QgZHJhbmQ0OF9kYXRhCiAgewogICAg dW5zaWduZWQgc2hvcnQgaW50IF9feFszXTsJIAogICAgdW5zaWduZWQgc2hvcnQgaW50IF9fb2xk X3hbM107ICAKICAgIHVuc2lnbmVkIHNob3J0IGludCBfX2M7CSAKICAgIHVuc2lnbmVkIHNob3J0 IGludCBfX2luaXQ7CSAKICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX19hOwkgCiAgfTsKCiAK ZXh0ZXJuIGludCBkcmFuZDQ4X3IgKHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fcmVzdHJpY3QgX19i dWZmZXIsCgkJICAgICAgZG91YmxlICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSB0aHJvdyAoKSA7CmV4 dGVybiBpbnQgZXJhbmQ0OF9yICh1bnNpZ25lZCBzaG9ydCBpbnQgX194c3ViaVszXSwKCQkgICAg ICBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAoJCSAgICAgIGRvdWJs ZSAqX19yZXN0cmljdCBfX3Jlc3VsdCkgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IGxyYW5kNDhf ciAoc3RydWN0IGRyYW5kNDhfZGF0YSAqX19yZXN0cmljdCBfX2J1ZmZlciwKCQkgICAgICBsb25n IGludCAqX19yZXN0cmljdCBfX3Jlc3VsdCkgdGhyb3cgKCkgOwpleHRlcm4gaW50IG5yYW5kNDhf ciAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10sCgkJICAgICAgc3RydWN0IGRyYW5kNDhf ZGF0YSAqX19yZXN0cmljdCBfX2J1ZmZlciwKCQkgICAgICBsb25nIGludCAqX19yZXN0cmljdCBf X3Jlc3VsdCkgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IG1yYW5kNDhfciAoc3RydWN0IGRyYW5k NDhfZGF0YSAqX19yZXN0cmljdCBfX2J1ZmZlciwKCQkgICAgICBsb25nIGludCAqX19yZXN0cmlj dCBfX3Jlc3VsdCkgdGhyb3cgKCkgOwpleHRlcm4gaW50IGpyYW5kNDhfciAodW5zaWduZWQgc2hv cnQgaW50IF9feHN1YmlbM10sCgkJICAgICAgc3RydWN0IGRyYW5kNDhfZGF0YSAqX19yZXN0cmlj dCBfX2J1ZmZlciwKCQkgICAgICBsb25nIGludCAqX19yZXN0cmljdCBfX3Jlc3VsdCkgdGhyb3cg KCkgOwoKIApleHRlcm4gaW50IHNyYW5kNDhfciAobG9uZyBpbnQgX19zZWVkdmFsLCBzdHJ1Y3Qg ZHJhbmQ0OF9kYXRhICpfX2J1ZmZlcikKICAgICB0aHJvdyAoKSA7CgpleHRlcm4gaW50IHNlZWQ0 OF9yICh1bnNpZ25lZCBzaG9ydCBpbnQgX19zZWVkMTZ2WzNdLAoJCSAgICAgc3RydWN0IGRyYW5k NDhfZGF0YSAqX19idWZmZXIpIHRocm93ICgpIDsKCmV4dGVybiBpbnQgbGNvbmc0OF9yICh1bnNp Z25lZCBzaG9ydCBpbnQgX19wYXJhbVs3XSwKCQkgICAgICBzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpf X2J1ZmZlcikgdGhyb3cgKCkgOwoKCgoKCgoKIApleHRlcm4gdm9pZCAqbWFsbG9jIChzaXplX3Qg X19zaXplKSB0aHJvdyAoKSAgIDsKIApleHRlcm4gdm9pZCAqY2FsbG9jIChzaXplX3QgX19ubWVt Yiwgc2l6ZV90IF9fc2l6ZSkKICAgICB0aHJvdyAoKSAgIDsKCgoKIAoKZXh0ZXJuIHZvaWQgKnJl YWxsb2MgKHZvaWQgKl9fcHRyLCBzaXplX3QgX19zaXplKSB0aHJvdyAoKSAgIDsKIApleHRlcm4g dm9pZCBmcmVlICh2b2lkICpfX3B0cikgdGhyb3cgKCkgOwoKCiAKZXh0ZXJuIHZvaWQgY2ZyZWUg KHZvaWQgKl9fcHRyKSB0aHJvdyAoKSA7CgoKCiMgMSAiL3Vzci9pbmNsdWRlL2FsbG9jYS5oIiAx IDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1 c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vz ci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMK CgoKIAoKCiAKCgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgv Mi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgog CgoKCgoKIAoKIAoKIyAxMzEgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUu My9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9nY2MtbGliL2k0 ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKCiAKCgoKCiAKCiMg MjcxICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRk ZWYuaCIgMwoKCiMgMjgzICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMv aW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYt c3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoKCgoKCgoKCgoK CgoKCgoKCgojIDI1ICIvdXNyL2luY2x1ZGUvYWxsb2NhLmgiIDIgMwoKCmV4dGVybiAiQyIgeyAK CiAKCgogCmV4dGVybiB2b2lkICphbGxvY2EgKHNpemVfdCBfX3NpemUpIHRocm93ICgpIDsKCgoK Cgp9IAoKCiMgNTQ3ICIvdXNyL2luY2x1ZGUvc3RkbGliLmgiIDIgMwoKCgoKIApleHRlcm4gdm9p ZCAqdmFsbG9jIChzaXplX3QgX19zaXplKSB0aHJvdyAoKSAgIDsKCgoKCgoKCgogCmV4dGVybiB2 b2lkIGFib3J0ICh2b2lkKSB0aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykp OwoKCiAKZXh0ZXJuIGludCBhdGV4aXQgKHZvaWQgKCpfX2Z1bmMpICh2b2lkKSkgdGhyb3cgKCkg OwoKCiAKCmV4dGVybiBpbnQgb25fZXhpdCAodm9pZCAoKl9fZnVuYykgKGludCBfX3N0YXR1cywg dm9pZCAqX19hcmcpLCB2b2lkICpfX2FyZykKICAgICB0aHJvdyAoKSA7CgoKIAoKCmV4dGVybiB2 b2lkIGV4aXQgKGludCBfX3N0YXR1cykgdGhyb3cgKCkgIF9fYXR0cmlidXRlX18gKChfX25vcmV0 dXJuX18pKTsKCgoKCgoKCgogCmV4dGVybiBjaGFyICpnZXRlbnYgKF9fY29uc3QgY2hhciAqX19u YW1lKSB0aHJvdyAoKSA7CgogCgpleHRlcm4gY2hhciAqX19zZWN1cmVfZ2V0ZW52IChfX2NvbnN0 IGNoYXIgKl9fbmFtZSkgdGhyb3cgKCkgOwoKCiAKIAoKZXh0ZXJuIGludCBwdXRlbnYgKGNoYXIg Kl9fc3RyaW5nKSB0aHJvdyAoKSA7CgoKCiAKCmV4dGVybiBpbnQgc2V0ZW52IChfX2NvbnN0IGNo YXIgKl9fbmFtZSwgX19jb25zdCBjaGFyICpfX3ZhbHVlLCBpbnQgX19yZXBsYWNlKQogICAgIHRo cm93ICgpIDsKCiAKZXh0ZXJuIGludCB1bnNldGVudiAoX19jb25zdCBjaGFyICpfX25hbWUpIHRo cm93ICgpIDsKCgoKIAoKCmV4dGVybiBpbnQgY2xlYXJlbnYgKHZvaWQpIHRocm93ICgpIDsKCgoK CiAKCgoKZXh0ZXJuIGNoYXIgKm1rdGVtcCAoY2hhciAqX190ZW1wbGF0ZSkgdGhyb3cgKCkgOwoK IAoKCgoKCmV4dGVybiBpbnQgbWtzdGVtcCAoY2hhciAqX190ZW1wbGF0ZSkgdGhyb3cgKCkgOwoK CgoKCgoKCgoKCgoKIAoKCgoKZXh0ZXJuIGNoYXIgKm1rZHRlbXAgKGNoYXIgKl9fdGVtcGxhdGUp IHRocm93ICgpIDsKCgoKIApleHRlcm4gaW50IHN5c3RlbSAoX19jb25zdCBjaGFyICpfX2NvbW1h bmQpIHRocm93ICgpIDsKCgoKCgoKCgoKCiAKCgoKCgpleHRlcm4gY2hhciAqcmVhbHBhdGggKF9f Y29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCgkJICAgICAgIGNoYXIgKl9fcmVzdHJpY3Qg X19yZXNvbHZlZCkgdGhyb3cgKCkgOwoKCgogCgoKdHlwZWRlZiBpbnQgKCpfX2NvbXBhcl9mbl90 KSAoX19jb25zdCB2b2lkICosIF9fY29uc3Qgdm9pZCAqKTsKCgoKCgoKIAoKZXh0ZXJuIHZvaWQg KmJzZWFyY2ggKF9fY29uc3Qgdm9pZCAqX19rZXksIF9fY29uc3Qgdm9pZCAqX19iYXNlLAoJCSAg ICAgIHNpemVfdCBfX25tZW1iLCBzaXplX3QgX19zaXplLCBfX2NvbXBhcl9mbl90IF9fY29tcGFy KTsKCiAKCmV4dGVybiB2b2lkIHFzb3J0ICh2b2lkICpfX2Jhc2UsIHNpemVfdCBfX25tZW1iLCBz aXplX3QgX19zaXplLAoJCSAgIF9fY29tcGFyX2ZuX3QgX19jb21wYXIpOwoKCiAKZXh0ZXJuIGlu dCBhYnMgKGludCBfX3gpIHRocm93ICgpICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CmV4 dGVybiBsb25nIGludCBsYWJzIChsb25nIGludCBfX3gpIHRocm93ICgpICBfX2F0dHJpYnV0ZV9f ICgoX19jb25zdF9fKSk7CgoKCgoKCiAKCiAKZXh0ZXJuIGRpdl90IGRpdiAoaW50IF9fbnVtZXIs IGludCBfX2Rlbm9tKQogICAgIHRocm93ICgpICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7 CmV4dGVybiBsZGl2X3QgbGRpdiAobG9uZyBpbnQgX19udW1lciwgbG9uZyBpbnQgX19kZW5vbSkK ICAgICB0aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKCgoKCgoKCiAKCgog CgoKZXh0ZXJuIGNoYXIgKmVjdnQgKGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGludCAq X19yZXN0cmljdCBfX2RlY3B0LAoJCSAgIGludCAqX19yZXN0cmljdCBfX3NpZ24pIHRocm93ICgp IDsKCiAKCgpleHRlcm4gY2hhciAqZmN2dCAoZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwg aW50ICpfX3Jlc3RyaWN0IF9fZGVjcHQsCgkJICAgaW50ICpfX3Jlc3RyaWN0IF9fc2lnbikgdGhy b3cgKCkgOwoKIAoKCmV4dGVybiBjaGFyICpnY3Z0IChkb3VibGUgX192YWx1ZSwgaW50IF9fbmRp Z2l0LCBjaGFyICpfX2J1ZikgdGhyb3cgKCkgOwoKCgogCmV4dGVybiBjaGFyICpxZWN2dCAobG9u ZyBkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LAoJCSAgICBpbnQgKl9fcmVzdHJpY3QgX19k ZWNwdCwgaW50ICpfX3Jlc3RyaWN0IF9fc2lnbikgdGhyb3cgKCkgOwpleHRlcm4gY2hhciAqcWZj dnQgKGxvbmcgZG91YmxlIF9fdmFsdWUsIGludCBfX25kaWdpdCwKCQkgICAgaW50ICpfX3Jlc3Ry aWN0IF9fZGVjcHQsIGludCAqX19yZXN0cmljdCBfX3NpZ24pIHRocm93ICgpIDsKZXh0ZXJuIGNo YXIgKnFnY3Z0IChsb25nIGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGNoYXIgKl9fYnVm KSB0aHJvdyAoKSA7CgoKIAoKZXh0ZXJuIGludCBlY3Z0X3IgKGRvdWJsZSBfX3ZhbHVlLCBpbnQg X19uZGlnaXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAoJCSAgIGludCAqX19yZXN0cmljdCBf X3NpZ24sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCgkJICAgc2l6ZV90IF9fbGVuKSB0aHJvdyAo KSA7CmV4dGVybiBpbnQgZmN2dF9yIChkb3VibGUgX192YWx1ZSwgaW50IF9fbmRpZ2l0LCBpbnQg Kl9fcmVzdHJpY3QgX19kZWNwdCwKCQkgICBpbnQgKl9fcmVzdHJpY3QgX19zaWduLCBjaGFyICpf X3Jlc3RyaWN0IF9fYnVmLAoJCSAgIHNpemVfdCBfX2xlbikgdGhyb3cgKCkgOwoKZXh0ZXJuIGlu dCBxZWN2dF9yIChsb25nIGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsCgkJICAgIGludCAq X19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduLAoJCSAgICBjaGFyICpf X3Jlc3RyaWN0IF9fYnVmLCBzaXplX3QgX19sZW4pIHRocm93ICgpIDsKZXh0ZXJuIGludCBxZmN2 dF9yIChsb25nIGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsCgkJICAgIGludCAqX19yZXN0 cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduLAoJCSAgICBjaGFyICpfX3Jlc3Ry aWN0IF9fYnVmLCBzaXplX3QgX19sZW4pIHRocm93ICgpIDsKCgoKCiAKCmV4dGVybiBpbnQgbWJs ZW4gKF9fY29uc3QgY2hhciAqX19zLCBzaXplX3QgX19uKSB0aHJvdyAoKSA7CiAKCmV4dGVybiBp bnQgbWJ0b3djICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcHdjLAoJCSAgIF9fY29uc3QgY2hhciAq X19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24pIHRocm93ICgpIDsKIAoKZXh0ZXJuIGludCB3Y3Rv bWIgKGNoYXIgKl9fcywgd2NoYXJfdCBfX3djaGFyKSB0aHJvdyAoKSA7CgoKIApleHRlcm4gc2l6 ZV90IG1ic3Rvd2NzICh3Y2hhcl90ICpfX3Jlc3RyaWN0ICBfX3B3Y3MsCgkJCV9fY29uc3QgY2hh ciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24pIHRocm93ICgpIDsKIApleHRlcm4gc2l6ZV90 IHdjc3RvbWJzIChjaGFyICpfX3Jlc3RyaWN0IF9fcywKCQkJX19jb25zdCB3Y2hhcl90ICpfX3Jl c3RyaWN0IF9fcHdjcywgc2l6ZV90IF9fbikKICAgICB0aHJvdyAoKSA7CgoKCiAKCgoKZXh0ZXJu IGludCBycG1hdGNoIChfX2NvbnN0IGNoYXIgKl9fcmVzcG9uc2UpIHRocm93ICgpIDsKCgoKIyA4 MTIgIi91c3IvaW5jbHVkZS9zdGRsaWIuaCIgMwoKCgoKCgoKCgogCgoKCgoKCiMgODQzICIvdXNy L2luY2x1ZGUvc3RkbGliLmgiIDMKCgojIDg1MyAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCgoK CiAKCgpleHRlcm4gaW50IGdldGxvYWRhdmcgKGRvdWJsZSBfX2xvYWRhdmdbXSwgaW50IF9fbmVs ZW0pIHRocm93ICgpIDsKCgoKCgp9IAoKCiMgNTkgIi4uLy4uL2ppa2VzL3NyYy9wbGF0Zm9ybS5o IiAyCgojIDEgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRl L3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCgoKCgoKIAoKIAoKCgoKIAoKCiAKCgoKCgogCgoKIyA2 MSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVm LmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKCgoKCgoKCgoK CgoKCgoKCgoKCgp0eXBlZGVmIGludCBwdHJkaWZmX3Q7CgoKCgoKCgoKCiAKCgoKCiAKCiAKCgoj IDE4OCAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3Rk ZGVmLmgiIDMKCgoKCgogCgoKCgogCgoKIyAyNjkgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNl LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKCgoKCgoKdHlwZWRlZiB1bnNp Z25lZCBpbnQgIHdpbnRfdDsKCgoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYt c3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoKCgoKCgoKCgoK IAoKCgoKCgoKIyA2MCAiLi4vLi4vamlrZXMvc3JjL3BsYXRmb3JtLmgiIDIKCgoKCgoKCgoKCgoK IyAxICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoK CgoKCmV4dGVybiAiQyIgeyAKCiAKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxp bnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkgIi91c3IvbGli L2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAK CgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUu My9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoK CiAKCiAKCgojIDEyNiAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2lu Y2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgogCgogCgoKIyAxODggIi91c3IvbGliL2djYy1saWIv aTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKIAoKCgoKIAoK CiMgMjY5ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9z dGRkZWYuaCIgMwoKCgoKCgoKCgoKCgoKCgoKIAoKIAoKIyAzMTcgIi91c3IvbGliL2djYy1saWIv aTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoK CgoKCgogCgoKCgoKCgojIDMzICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDIgMwoKCgogCmV4dGVy biB2b2lkICptZW1jcHkgKHZvaWQgKl9fcmVzdHJpY3QgX19kZXN0LAoJCSAgICAgX19jb25zdCB2 b2lkICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKSB0aHJvdyAoKSA7CiAKCmV4dGVybiB2 b2lkICptZW1tb3ZlICh2b2lkICpfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19zcmMsIHNpemVfdCBf X24pCiAgICAgdGhyb3cgKCkgOwoKIAoKCgpleHRlcm4gdm9pZCAqbWVtY2NweSAodm9pZCAqX19y ZXN0cmljdCBfX2Rlc3QsIF9fY29uc3Qgdm9pZCAqX19yZXN0cmljdCBfX3NyYywKCQkgICAgICBp bnQgX19jLCBzaXplX3QgX19uKQogICAgIHRocm93ICgpIDsKCgoKIApleHRlcm4gdm9pZCAqbWVt c2V0ICh2b2lkICpfX3MsIGludCBfX2MsIHNpemVfdCBfX24pIHRocm93ICgpIDsKCiAKZXh0ZXJu IGludCBtZW1jbXAgKF9fY29uc3Qgdm9pZCAqX19zMSwgX19jb25zdCB2b2lkICpfX3MyLCBzaXpl X3QgX19uKQogICAgIHRocm93ICgpICAgOwoKIApleHRlcm4gdm9pZCAqbWVtY2hyIChfX2NvbnN0 IHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fbikKICAgICAgdGhyb3cgKCkgICA7CgojIDcz ICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDMKCgoKIApleHRlcm4gY2hhciAqc3RyY3B5IChjaGFy ICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjKQogICAg IHRocm93ICgpIDsKIApleHRlcm4gY2hhciAqc3RybmNweSAoY2hhciAqX19yZXN0cmljdCBfX2Rl c3QsCgkJICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKSB0 aHJvdyAoKSA7CgogCmV4dGVybiBjaGFyICpzdHJjYXQgKGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0 LCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMpCiAgICAgdGhyb3cgKCkgOwogCmV4dGVy biBjaGFyICpzdHJuY2F0IChjaGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwgX19jb25zdCBjaGFyICpf X3Jlc3RyaWN0IF9fc3JjLAoJCSAgICAgIHNpemVfdCBfX24pIHRocm93ICgpIDsKCiAKZXh0ZXJu IGludCBzdHJjbXAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKQogICAg IHRocm93ICgpICAgOwogCmV4dGVybiBpbnQgc3RybmNtcCAoX19jb25zdCBjaGFyICpfX3MxLCBf X2NvbnN0IGNoYXIgKl9fczIsIHNpemVfdCBfX24pCiAgICAgdGhyb3cgKCkgICA7CgogCmV4dGVy biBpbnQgc3RyY29sbCAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpCiAg ICAgdGhyb3cgKCkgICA7CiAKZXh0ZXJuIHNpemVfdCBzdHJ4ZnJtIChjaGFyICpfX3Jlc3RyaWN0 IF9fZGVzdCwKCQkgICAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3Qg X19uKSB0aHJvdyAoKSA7CgojIDExNiAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAzCgoKCiAKZXh0 ZXJuIGNoYXIgKnN0cmR1cCAoX19jb25zdCBjaGFyICpfX3MpIHRocm93ICgpICAgOwoKCiAKCgoK CgoKCiMgMTUyICIvdXNyL2luY2x1ZGUvc3RyaW5nLmgiIDMKCgogCmV4dGVybiBjaGFyICpzdHJj aHIgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKSB0aHJvdyAoKSAgIDsKIApleHRlcm4gY2hh ciAqc3RycmNociAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIHRocm93ICgpICAgOwoKCgoK CgoKIAoKZXh0ZXJuIHNpemVfdCBzdHJjc3BuIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBj aGFyICpfX3JlamVjdCkKICAgICB0aHJvdyAoKSAgIDsKIAoKZXh0ZXJuIHNpemVfdCBzdHJzcG4g KF9fY29uc3QgY2hhciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fYWNjZXB0KQogICAgIHRocm93ICgp ICAgOwogCmV4dGVybiBjaGFyICpzdHJwYnJrIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBj aGFyICpfX2FjY2VwdCkKICAgICB0aHJvdyAoKSAgIDsKIApleHRlcm4gY2hhciAqc3Ryc3RyIChf X2NvbnN0IGNoYXIgKl9faGF5c3RhY2ssIF9fY29uc3QgY2hhciAqX19uZWVkbGUpCiAgICAgdGhy b3cgKCkgICA7CgoKCgoKCgogCmV4dGVybiBjaGFyICpzdHJ0b2sgKGNoYXIgKl9fcmVzdHJpY3Qg X19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19kZWxpbSkKICAgICB0aHJvdyAoKSA7Cgog CgpleHRlcm4gY2hhciAqX19zdHJ0b2tfciAoY2hhciAqX19yZXN0cmljdCBfX3MsCgkJCSBfX2Nv bnN0IGNoYXIgKl9fcmVzdHJpY3QgX19kZWxpbSwKCQkJIGNoYXIgKipfX3Jlc3RyaWN0IF9fc2F2 ZV9wdHIpIHRocm93ICgpIDsKCmV4dGVybiBjaGFyICpzdHJ0b2tfciAoY2hhciAqX19yZXN0cmlj dCBfX3MsIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltLAoJCSAgICAgICBjaGFyICoq X19yZXN0cmljdCBfX3NhdmVfcHRyKSB0aHJvdyAoKSA7CgoKIyAyMTQgIi91c3IvaW5jbHVkZS9z dHJpbmcuaCIgMwoKCgogCmV4dGVybiBzaXplX3Qgc3RybGVuIChfX2NvbnN0IGNoYXIgKl9fcykg dGhyb3cgKCkgICA7CgoKCgoKCgoKCiAKZXh0ZXJuIGNoYXIgKnN0cmVycm9yIChpbnQgX19lcnJu dW0pIHRocm93ICgpIDsKCiAKCmV4dGVybiBjaGFyICpzdHJlcnJvcl9yIChpbnQgX19lcnJudW0s IGNoYXIgKl9fYnVmLCBzaXplX3QgX19idWZsZW4pIHRocm93ICgpIDsKCgogCgpleHRlcm4gdm9p ZCBfX2J6ZXJvICh2b2lkICpfX3MsIHNpemVfdCBfX24pIHRocm93ICgpIDsKCgogCmV4dGVybiB2 b2lkIGJjb3B5IChfX2NvbnN0IHZvaWQgKl9fc3JjLCB2b2lkICpfX2Rlc3QsIHNpemVfdCBfX24p IHRocm93ICgpIDsKCiAKZXh0ZXJuIHZvaWQgYnplcm8gKHZvaWQgKl9fcywgc2l6ZV90IF9fbikg dGhyb3cgKCkgOwoKIApleHRlcm4gaW50IGJjbXAgKF9fY29uc3Qgdm9pZCAqX19zMSwgX19jb25z dCB2b2lkICpfX3MyLCBzaXplX3QgX19uKQogICAgIHRocm93ICgpICAgOwoKIApleHRlcm4gY2hh ciAqaW5kZXggKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKSB0aHJvdyAoKSAgIDsKCiAKZXh0 ZXJuIGNoYXIgKnJpbmRleCAoX19jb25zdCBjaGFyICpfX3MsIGludCBfX2MpIHRocm93ICgpICAg OwoKIAoKZXh0ZXJuIGludCBmZnMgKGludCBfX2kpIHRocm93ICgpICBfX2F0dHJpYnV0ZV9fICgo Y29uc3QpKTsKCiAKCgoKCgoKCgoKIApleHRlcm4gaW50IHN0cmNhc2VjbXAgKF9fY29uc3QgY2hh ciAqX19zMSwgX19jb25zdCBjaGFyICpfX3MyKQogICAgIHRocm93ICgpICAgOwoKIApleHRlcm4g aW50IHN0cm5jYXNlY21wIChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwg c2l6ZV90IF9fbikKICAgICB0aHJvdyAoKSAgIDsKCgojIDI4OSAiL3Vzci9pbmNsdWRlL3N0cmlu Zy5oIiAzCgoKCiAKCmV4dGVybiBjaGFyICpzdHJzZXAgKGNoYXIgKipfX3Jlc3RyaWN0IF9fc3Ry aW5ncCwKCQkgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltKSB0aHJvdyAoKSA7 CgoKIyAzMzIgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMwoKCgoKIyAzNjAgIi91c3IvaW5jbHVk ZS9zdHJpbmcuaCIgMwoKCgp9IAoKCiMgNzIgIi4uLy4uL2ppa2VzL3NyYy9wbGF0Zm9ybS5oIiAy CgoKCgoKCgogCgoKCgoKCgojIDEgIi91c3IvaW5jbHVkZS91bmlzdGQuaCIgMSAzCiAKCgoKCgoK CgoKCgoKCgoKCgogCgoKCgoKCgoKZXh0ZXJuICJDIiB7IAoKIAoKCiAKCgoKIAoKCiAKCgogCgoK IAoKCgogCgoKCiAKCgoKIAoKCgogCgoKCgoKCiAKCgogCgoKCgogCgoKIAoKCiAKCgoKIAoKCgog CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9wb3NpeF9v cHQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCgoK IAoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgoKIAoK CiAKCgogCgoKIAoKCiAKCgogCgogCgoKIAoKCiAKCgoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoK CiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCgojIDE3NSAiL3Vzci9pbmNsdWRlL3VuaXN0ZC5oIiAy IDMKCgogCgoKCgogCgoKCgoKIAoKCgoKCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k0ODYt c3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCgoKCgoKCiAKCgojIDE5ICIv dXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIg MwoKCgogCgoKIAoKCgoKCiAKCgojIDYxICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51 eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoK CiAKCgoKCgogCgogCgoKIyAxMjYgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIu OTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9n Y2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKCiAK CgoKCiAKCgojIDI2OSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2lu Y2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgoKCgoKCgoKCgoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9n Y2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoK CgoKCgoKCgoKCgoKIAoKCgoKCgoKIyAxOTkgIi91c3IvaW5jbHVkZS91bmlzdGQuaCIgMiAzCgoK IyAyMzYgIi91c3IvaW5jbHVkZS91bmlzdGQuaCIgMwoKCgoKdHlwZWRlZiBfX2ludHB0cl90IGlu dHB0cl90OwoKCgoKCgp0eXBlZGVmIF9fc29ja2xlbl90IHNvY2tsZW5fdDsKCgoKCiAKCgoKCgoK IApleHRlcm4gaW50IGFjY2VzcyAoX19jb25zdCBjaGFyICpfX25hbWUsIGludCBfX3R5cGUpIHRo cm93ICgpIDsKCgoKCgoKCgogCgoKCgoKCgogCgoKCgoKCiAKCgoKCgpleHRlcm4gX19vZmZfdCBs c2VlayAoaW50IF9fZmQsIF9fb2ZmX3QgX19vZmZzZXQsIGludCBfX3doZW5jZSkgdGhyb3cgKCkg OwojIDMwMCAiL3Vzci9pbmNsdWRlL3VuaXN0ZC5oIiAzCgoKCgoKIApleHRlcm4gaW50IGNsb3Nl IChpbnQgX19mZCkgdGhyb3cgKCkgOwoKIAoKZXh0ZXJuIHNzaXplX3QgcmVhZCAoaW50IF9fZmQs IHZvaWQgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMpIHRocm93ICgpIDsKCiAKZXh0ZXJuIHNzaXpl X3Qgd3JpdGUgKGludCBfX2ZkLCBfX2NvbnN0IHZvaWQgKl9fYnVmLCBzaXplX3QgX19uKSB0aHJv dyAoKSA7CgojIDM0NyAiL3Vzci9pbmNsdWRlL3VuaXN0ZC5oIiAzCgoKIAoKCgpleHRlcm4gaW50 IHBpcGUgKGludCBfX3BpcGVkZXNbMl0pIHRocm93ICgpIDsKCiAKCgoKCgoKZXh0ZXJuIHVuc2ln bmVkIGludCBhbGFybSAodW5zaWduZWQgaW50IF9fc2Vjb25kcykgdGhyb3cgKCkgOwoKIAoKCgoK CgpleHRlcm4gdW5zaWduZWQgaW50IHNsZWVwICh1bnNpZ25lZCBpbnQgX19zZWNvbmRzKSB0aHJv dyAoKSA7CgoKIAoKCgpleHRlcm4gX191c2Vjb25kc190IHVhbGFybSAoX191c2Vjb25kc190IF9f dmFsdWUsIF9fdXNlY29uZHNfdCBfX2ludGVydmFsKQogICAgIHRocm93ICgpIDsKCiAKCmV4dGVy biBpbnQgdXNsZWVwIChfX3VzZWNvbmRzX3QgX191c2Vjb25kcykgdGhyb3cgKCkgOwoKCgogCgpl eHRlcm4gaW50IHBhdXNlICh2b2lkKSB0aHJvdyAoKSA7CgoKIApleHRlcm4gaW50IGNob3duIChf X2NvbnN0IGNoYXIgKl9fZmlsZSwgX191aWRfdCBfX293bmVyLCBfX2dpZF90IF9fZ3JvdXApCiAg ICAgdGhyb3cgKCkgOwoKCiAKZXh0ZXJuIGludCBmY2hvd24gKGludCBfX2ZkLCBfX3VpZF90IF9f b3duZXIsIF9fZ2lkX3QgX19ncm91cCkgdGhyb3cgKCkgOwoKCiAKCmV4dGVybiBpbnQgbGNob3du IChfX2NvbnN0IGNoYXIgKl9fZmlsZSwgX191aWRfdCBfX293bmVyLCBfX2dpZF90IF9fZ3JvdXAp CiAgICAgdGhyb3cgKCkgOwoKCgogCmV4dGVybiBpbnQgY2hkaXIgKF9fY29uc3QgY2hhciAqX19w YXRoKSB0aHJvdyAoKSA7CgoKIApleHRlcm4gaW50IGZjaGRpciAoaW50IF9fZmQpIHRocm93ICgp IDsKCgogCgoKCgoKCmV4dGVybiBjaGFyICpnZXRjd2QgKGNoYXIgKl9fYnVmLCBzaXplX3QgX19z aXplKSB0aHJvdyAoKSA7CgoKCgoKCgoKCiAKCgpleHRlcm4gY2hhciAqZ2V0d2QgKGNoYXIgKl9f YnVmKSB0aHJvdyAoKSA7CgoKCiAKZXh0ZXJuIGludCBkdXAgKGludCBfX2ZkKSB0aHJvdyAoKSA7 CgogCmV4dGVybiBpbnQgZHVwMiAoaW50IF9fZmQsIGludCBfX2ZkMikgdGhyb3cgKCkgOwoKIApl eHRlcm4gY2hhciAqKl9fZW52aXJvbjsKCgoKCgogCgpleHRlcm4gaW50IGV4ZWN2ZSAoX19jb25z dCBjaGFyICpfX3BhdGgsIGNoYXIgKl9fY29uc3QgX19hcmd2W10sCgkJICAgY2hhciAqX19jb25z dCBfX2VudnBbXSkgdGhyb3cgKCkgOwoKCgoKCgoKCgogCmV4dGVybiBpbnQgZXhlY3YgKF9fY29u c3QgY2hhciAqX19wYXRoLCBjaGFyICpfX2NvbnN0IF9fYXJndltdKSB0aHJvdyAoKSA7CgogCgpl eHRlcm4gaW50IGV4ZWNsZSAoX19jb25zdCBjaGFyICpfX3BhdGgsIF9fY29uc3QgY2hhciAqX19h cmcsIC4uLikgdGhyb3cgKCkgOwoKIAoKZXh0ZXJuIGludCBleGVjbCAoX19jb25zdCBjaGFyICpf X3BhdGgsIF9fY29uc3QgY2hhciAqX19hcmcsIC4uLikgdGhyb3cgKCkgOwoKIAoKZXh0ZXJuIGlu dCBleGVjdnAgKF9fY29uc3QgY2hhciAqX19maWxlLCBjaGFyICpfX2NvbnN0IF9fYXJndltdKSB0 aHJvdyAoKSA7CgogCgoKZXh0ZXJuIGludCBleGVjbHAgKF9fY29uc3QgY2hhciAqX19maWxlLCBf X2NvbnN0IGNoYXIgKl9fYXJnLCAuLi4pIHRocm93ICgpIDsKCgoKIApleHRlcm4gaW50IG5pY2Ug KGludCBfX2luYykgdGhyb3cgKCkgOwoKCgogCmV4dGVybiB2b2lkIF9leGl0IChpbnQgX19zdGF0 dXMpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKCgogCgoKIyAxICIvdXNyL2luY2x1 ZGUvYml0cy9jb25mbmFtZS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAplbnVtCiAg ewogICAgX1BDX0xJTktfTUFYLAoKICAgIF9QQ19NQVhfQ0FOT04sCgogICAgX1BDX01BWF9JTlBV VCwKCiAgICBfUENfTkFNRV9NQVgsCgogICAgX1BDX1BBVEhfTUFYLAoKICAgIF9QQ19QSVBFX0JV RiwKCiAgICBfUENfQ0hPV05fUkVTVFJJQ1RFRCwKCiAgICBfUENfTk9fVFJVTkMsCgogICAgX1BD X1ZESVNBQkxFLAoKICAgIF9QQ19TWU5DX0lPLAoKICAgIF9QQ19BU1lOQ19JTywKCiAgICBfUENf UFJJT19JTywKCiAgICBfUENfU09DS19NQVhCVUYsCgogICAgX1BDX0ZJTEVTSVpFQklUUywKCiAg ICBfUENfUkVDX0lOQ1JfWEZFUl9TSVpFLAoKICAgIF9QQ19SRUNfTUFYX1hGRVJfU0laRSwKCiAg ICBfUENfUkVDX01JTl9YRkVSX1NJWkUsCgogICAgX1BDX1JFQ19YRkVSX0FMSUdOCgogIH07Cgog CmVudW0KICB7CiAgICBfU0NfQVJHX01BWCwKCiAgICBfU0NfQ0hJTERfTUFYLAoKICAgIF9TQ19D TEtfVENLLAoKICAgIF9TQ19OR1JPVVBTX01BWCwKCiAgICBfU0NfT1BFTl9NQVgsCgogICAgX1ND X1NUUkVBTV9NQVgsCgogICAgX1NDX1RaTkFNRV9NQVgsCgogICAgX1NDX0pPQl9DT05UUk9MLAoK ICAgIF9TQ19TQVZFRF9JRFMsCgogICAgX1NDX1JFQUxUSU1FX1NJR05BTFMsCgogICAgX1NDX1BS SU9SSVRZX1NDSEVEVUxJTkcsCgogICAgX1NDX1RJTUVSUywKCiAgICBfU0NfQVNZTkNIUk9OT1VT X0lPLAoKICAgIF9TQ19QUklPUklUSVpFRF9JTywKCiAgICBfU0NfU1lOQ0hST05JWkVEX0lPLAoK ICAgIF9TQ19GU1lOQywKCiAgICBfU0NfTUFQUEVEX0ZJTEVTLAoKICAgIF9TQ19NRU1MT0NLLAoK ICAgIF9TQ19NRU1MT0NLX1JBTkdFLAoKICAgIF9TQ19NRU1PUllfUFJPVEVDVElPTiwKCiAgICBf U0NfTUVTU0FHRV9QQVNTSU5HLAoKICAgIF9TQ19TRU1BUEhPUkVTLAoKICAgIF9TQ19TSEFSRURf TUVNT1JZX09CSkVDVFMsCgogICAgX1NDX0FJT19MSVNUSU9fTUFYLAoKICAgIF9TQ19BSU9fTUFY LAoKICAgIF9TQ19BSU9fUFJJT19ERUxUQV9NQVgsCgogICAgX1NDX0RFTEFZVElNRVJfTUFYLAoK ICAgIF9TQ19NUV9PUEVOX01BWCwKCiAgICBfU0NfTVFfUFJJT19NQVgsCgogICAgX1NDX1ZFUlNJ T04sCgogICAgX1NDX1BBR0VTSVpFLAoKCiAgICBfU0NfUlRTSUdfTUFYLAoKICAgIF9TQ19TRU1f TlNFTVNfTUFYLAoKICAgIF9TQ19TRU1fVkFMVUVfTUFYLAoKICAgIF9TQ19TSUdRVUVVRV9NQVgs CgogICAgX1NDX1RJTUVSX01BWCwKCgogICAgIAoKICAgIF9TQ19CQ19CQVNFX01BWCwKCiAgICBf U0NfQkNfRElNX01BWCwKCiAgICBfU0NfQkNfU0NBTEVfTUFYLAoKICAgIF9TQ19CQ19TVFJJTkdf TUFYLAoKICAgIF9TQ19DT0xMX1dFSUdIVFNfTUFYLAoKICAgIF9TQ19FUVVJVl9DTEFTU19NQVgs CgogICAgX1NDX0VYUFJfTkVTVF9NQVgsCgogICAgX1NDX0xJTkVfTUFYLAoKICAgIF9TQ19SRV9E VVBfTUFYLAoKICAgIF9TQ19DSEFSQ0xBU1NfTkFNRV9NQVgsCgoKICAgIF9TQ18yX1ZFUlNJT04s CgogICAgX1NDXzJfQ19CSU5ELAoKICAgIF9TQ18yX0NfREVWLAoKICAgIF9TQ18yX0ZPUlRfREVW LAoKICAgIF9TQ18yX0ZPUlRfUlVOLAoKICAgIF9TQ18yX1NXX0RFViwKCiAgICBfU0NfMl9MT0NB TEVERUYsCgoKICAgIF9TQ19QSUksCgogICAgX1NDX1BJSV9YVEksCgogICAgX1NDX1BJSV9TT0NL RVQsCgogICAgX1NDX1BJSV9JTlRFUk5FVCwKCiAgICBfU0NfUElJX09TSSwKCiAgICBfU0NfUE9M TCwKCiAgICBfU0NfU0VMRUNULAoKICAgIF9TQ19VSU9fTUFYSU9WLAoKICAgIF9TQ19JT1ZfTUFY ID0gX1NDX1VJT19NQVhJT1YgLAoKICAgIF9TQ19QSUlfSU5URVJORVRfU1RSRUFNLAoKICAgIF9T Q19QSUlfSU5URVJORVRfREdSQU0sCgogICAgX1NDX1BJSV9PU0lfQ09UUywKCiAgICBfU0NfUElJ X09TSV9DTFRTLAoKICAgIF9TQ19QSUlfT1NJX00sCgogICAgX1NDX1RfSU9WX01BWCwKCgogICAg IAogICAgX1NDX1RIUkVBRFMsCgogICAgX1NDX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUywKCiAgICBf U0NfR0VUR1JfUl9TSVpFX01BWCwKCiAgICBfU0NfR0VUUFdfUl9TSVpFX01BWCwKCiAgICBfU0Nf TE9HSU5fTkFNRV9NQVgsCgogICAgX1NDX1RUWV9OQU1FX01BWCwKCiAgICBfU0NfVEhSRUFEX0RF U1RSVUNUT1JfSVRFUkFUSU9OUywKCiAgICBfU0NfVEhSRUFEX0tFWVNfTUFYLAoKICAgIF9TQ19U SFJFQURfU1RBQ0tfTUlOLAoKICAgIF9TQ19USFJFQURfVEhSRUFEU19NQVgsCgogICAgX1NDX1RI UkVBRF9BVFRSX1NUQUNLQUREUiwKCiAgICBfU0NfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFLAoKICAg IF9TQ19USFJFQURfUFJJT1JJVFlfU0NIRURVTElORywKCiAgICBfU0NfVEhSRUFEX1BSSU9fSU5I RVJJVCwKCiAgICBfU0NfVEhSRUFEX1BSSU9fUFJPVEVDVCwKCiAgICBfU0NfVEhSRUFEX1BST0NF U1NfU0hBUkVELAoKCiAgICBfU0NfTlBST0NFU1NPUlNfQ09ORiwKCiAgICBfU0NfTlBST0NFU1NP UlNfT05MTiwKCiAgICBfU0NfUEhZU19QQUdFUywKCiAgICBfU0NfQVZQSFlTX1BBR0VTLAoKICAg IF9TQ19BVEVYSVRfTUFYLAoKICAgIF9TQ19QQVNTX01BWCwKCgogICAgX1NDX1hPUEVOX1ZFUlNJ T04sCgogICAgX1NDX1hPUEVOX1hDVV9WRVJTSU9OLAoKICAgIF9TQ19YT1BFTl9VTklYLAoKICAg IF9TQ19YT1BFTl9DUllQVCwKCiAgICBfU0NfWE9QRU5fRU5IX0kxOE4sCgogICAgX1NDX1hPUEVO X1NITSwKCgogICAgX1NDXzJfQ0hBUl9URVJNLAoKICAgIF9TQ18yX0NfVkVSU0lPTiwKCiAgICBf U0NfMl9VUEUsCgoKICAgIF9TQ19YT1BFTl9YUEcyLAoKICAgIF9TQ19YT1BFTl9YUEczLAoKICAg IF9TQ19YT1BFTl9YUEc0LAoKCiAgICBfU0NfQ0hBUl9CSVQsCgogICAgX1NDX0NIQVJfTUFYLAoK ICAgIF9TQ19DSEFSX01JTiwKCiAgICBfU0NfSU5UX01BWCwKCiAgICBfU0NfSU5UX01JTiwKCiAg ICBfU0NfTE9OR19CSVQsCgogICAgX1NDX1dPUkRfQklULAoKICAgIF9TQ19NQl9MRU5fTUFYLAoK ICAgIF9TQ19OWkVSTywKCiAgICBfU0NfU1NJWkVfTUFYLAoKICAgIF9TQ19TQ0hBUl9NQVgsCgog ICAgX1NDX1NDSEFSX01JTiwKCiAgICBfU0NfU0hSVF9NQVgsCgogICAgX1NDX1NIUlRfTUlOLAoK ICAgIF9TQ19VQ0hBUl9NQVgsCgogICAgX1NDX1VJTlRfTUFYLAoKICAgIF9TQ19VTE9OR19NQVgs CgogICAgX1NDX1VTSFJUX01BWCwKCgogICAgX1NDX05MX0FSR01BWCwKCiAgICBfU0NfTkxfTEFO R01BWCwKCiAgICBfU0NfTkxfTVNHTUFYLAoKICAgIF9TQ19OTF9OTUFYLAoKICAgIF9TQ19OTF9T RVRNQVgsCgogICAgX1NDX05MX1RFWFRNQVgsCgoKICAgIF9TQ19YQlM1X0lMUDMyX09GRjMyLAoK ICAgIF9TQ19YQlM1X0lMUDMyX09GRkJJRywKCiAgICBfU0NfWEJTNV9MUDY0X09GRjY0LAoKICAg IF9TQ19YQlM1X0xQQklHX09GRkJJRywKCgogICAgX1NDX1hPUEVOX0xFR0FDWSwKCiAgICBfU0Nf WE9QRU5fUkVBTFRJTUUsCgogICAgX1NDX1hPUEVOX1JFQUxUSU1FX1RIUkVBRFMsCgoKICAgIF9T Q19BRFZJU09SWV9JTkZPLAoKICAgIF9TQ19CQVJSSUVSUywKCiAgICBfU0NfQkFTRSwKCiAgICBf U0NfQ19MQU5HX1NVUFBPUlQsCgogICAgX1NDX0NfTEFOR19TVVBQT1JUX1IsCgogICAgX1NDX0NM T0NLX1NFTEVDVElPTiwKCiAgICBfU0NfQ1BVVElNRSwKCiAgICBfU0NfVEhSRUFEX0NQVVRJTUUs CgogICAgX1NDX0RFVklDRV9JTywKCiAgICBfU0NfREVWSUNFX1NQRUNJRklDLAoKICAgIF9TQ19E RVZJQ0VfU1BFQ0lGSUNfUiwKCiAgICBfU0NfRkRfTUdNVCwKCiAgICBfU0NfRklGTywKCiAgICBf U0NfUElQRSwKCiAgICBfU0NfRklMRV9BVFRSSUJVVEVTLAoKICAgIF9TQ19GSUxFX0xPQ0tJTkcs CgogICAgX1NDX0ZJTEVfU1lTVEVNLAoKICAgIF9TQ19NT05PVE9OSUNfQ0xPQ0ssCgogICAgX1ND X01VTFRJUExFX1BST0NFU1MsCgogICAgX1NDX1NJTkdMRV9QUk9DRVNTLAoKICAgIF9TQ19ORVRX T1JLSU5HLAoKICAgIF9TQ19SRUFERVJfV1JJVEVSX0xPQ0tTLAoKICAgIF9TQ19TUElOX0xPQ0tT LAoKICAgIF9TQ19SRUdFWFAsCgogICAgX1NDX1JFR0VYX1ZFUlNJT04sCgogICAgX1NDX1NIRUxM LAoKICAgIF9TQ19TSUdOQUxTLAoKICAgIF9TQ19TUEFXTiwKCiAgICBfU0NfU1BPUkFESUNfU0VS VkVSLAoKICAgIF9TQ19USFJFQURfU1BPUkFESUNfU0VSVkVSLAoKICAgIF9TQ19TWVNURU1fREFU QUJBU0UsCgogICAgX1NDX1NZU1RFTV9EQVRBQkFTRV9SLAoKICAgIF9TQ19USU1FT1VUUywKCiAg ICBfU0NfVFlQRURfTUVNT1JZX09CSkVDVFMsCgogICAgX1NDX1VTRVJfR1JPVVBTLAoKICAgIF9T Q19VU0VSX0dST1VQU19SLAoKICAgIF9TQ18yX1BCUywKCiAgICBfU0NfMl9QQlNfQUNDT1VOVElO RywKCiAgICBfU0NfMl9QQlNfTE9DQVRFLAoKICAgIF9TQ18yX1BCU19NRVNTQUdFLAoKICAgIF9T Q18yX1BCU19UUkFDSywKCiAgICBfU0NfU1lNTE9PUCwKCiAgICBfU0NfU1RSRUFNUywKCiAgICBf U0NfMl9QQlNfQ0hFQ0tQT0lOVAoKICB9OwoKCgoKIAplbnVtCiAgewogICAgX0NTX1BBVEgJCQkg CgoKIyA0NjkgIi91c3IvaW5jbHVkZS9iaXRzL2NvbmZuYW1lLmgiIDMKCgojIDUwNSAiL3Vzci9p bmNsdWRlL2JpdHMvY29uZm5hbWUuaCIgMwoKICB9OwoKIyA1MDAgIi91c3IvaW5jbHVkZS91bmlz dGQuaCIgMiAzCgoKIApleHRlcm4gbG9uZyBpbnQgcGF0aGNvbmYgKF9fY29uc3QgY2hhciAqX19w YXRoLCBpbnQgX19uYW1lKSB0aHJvdyAoKSA7CgogCmV4dGVybiBsb25nIGludCBmcGF0aGNvbmYg KGludCBfX2ZkLCBpbnQgX19uYW1lKSB0aHJvdyAoKSA7CgogCmV4dGVybiBsb25nIGludCBzeXNj b25mIChpbnQgX19uYW1lKSB0aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwoK CiAKZXh0ZXJuIHNpemVfdCBjb25mc3RyIChpbnQgX19uYW1lLCBjaGFyICpfX2J1Ziwgc2l6ZV90 IF9fbGVuKSB0aHJvdyAoKSA7CgoKCiAKZXh0ZXJuIF9fcGlkX3QgZ2V0cGlkICh2b2lkKSB0aHJv dyAoKSA7CgogCmV4dGVybiBfX3BpZF90IGdldHBwaWQgKHZvaWQpIHRocm93ICgpIDsKCiAKCgpl eHRlcm4gX19waWRfdCBnZXRwZ3JwICh2b2lkKSB0aHJvdyAoKSA7CgoKCgoKCgoKIApleHRlcm4g X19waWRfdCBfX2dldHBnaWQgKF9fcGlkX3QgX19waWQpIHRocm93ICgpIDsKCgoKCgogCgoKZXh0 ZXJuIGludCBzZXRwZ2lkIChfX3BpZF90IF9fcGlkLCBfX3BpZF90IF9fcGdpZCkgdGhyb3cgKCkg OwoKCiAKCgoKCgoKCgoKCgogCgpleHRlcm4gaW50IHNldHBncnAgKHZvaWQpIHRocm93ICgpIDsK CiMgNTc0ICIvdXNyL2luY2x1ZGUvdW5pc3RkLmgiIDMKCgoKIAoKCmV4dGVybiBfX3BpZF90IHNl dHNpZCAodm9pZCkgdGhyb3cgKCkgOwoKCgoKCgogCmV4dGVybiBfX3VpZF90IGdldHVpZCAodm9p ZCkgdGhyb3cgKCkgOwoKIApleHRlcm4gX191aWRfdCBnZXRldWlkICh2b2lkKSB0aHJvdyAoKSA7 CgogCmV4dGVybiBfX2dpZF90IGdldGdpZCAodm9pZCkgdGhyb3cgKCkgOwoKIApleHRlcm4gX19n aWRfdCBnZXRlZ2lkICh2b2lkKSB0aHJvdyAoKSA7CgogCgoKZXh0ZXJuIGludCBnZXRncm91cHMg KGludCBfX3NpemUsIF9fZ2lkX3QgX19saXN0W10pIHRocm93ICgpIDsKCgoKCgoKIAoKCgpleHRl cm4gaW50IHNldHVpZCAoX191aWRfdCBfX3VpZCkgdGhyb3cgKCkgOwoKCiAKCmV4dGVybiBpbnQg c2V0cmV1aWQgKF9fdWlkX3QgX19ydWlkLCBfX3VpZF90IF9fZXVpZCkgdGhyb3cgKCkgOwoKCgog CmV4dGVybiBpbnQgc2V0ZXVpZCAoX191aWRfdCBfX3VpZCkgdGhyb3cgKCkgOwoKCiAKCgoKZXh0 ZXJuIGludCBzZXRnaWQgKF9fZ2lkX3QgX19naWQpIHRocm93ICgpIDsKCgogCgpleHRlcm4gaW50 IHNldHJlZ2lkIChfX2dpZF90IF9fcmdpZCwgX19naWRfdCBfX2VnaWQpIHRocm93ICgpIDsKCgoK IApleHRlcm4gaW50IHNldGVnaWQgKF9fZ2lkX3QgX19naWQpIHRocm93ICgpIDsKCgoKIAoKCmV4 dGVybiBfX3BpZF90IGZvcmsgKHZvaWQpIHRocm93ICgpIDsKCgogCgoKCmV4dGVybiBfX3BpZF90 IHZmb3JrICh2b2lkKSB0aHJvdyAoKSA7CgoKCiAKCmV4dGVybiBjaGFyICp0dHluYW1lIChpbnQg X19mZCkgdGhyb3cgKCkgOwoKIAoKZXh0ZXJuIGludCB0dHluYW1lX3IgKGludCBfX2ZkLCBjaGFy ICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSB0aHJvdyAoKSA7CgogCgpleHRlcm4gaW50IGlzYXR0 eSAoaW50IF9fZmQpIHRocm93ICgpIDsKCgoKIAoKZXh0ZXJuIGludCB0dHlzbG90ICh2b2lkKSB0 aHJvdyAoKSA7CgoKCiAKZXh0ZXJuIGludCBsaW5rIChfX2NvbnN0IGNoYXIgKl9fZnJvbSwgX19j b25zdCBjaGFyICpfX3RvKSB0aHJvdyAoKSA7CgoKIApleHRlcm4gaW50IHN5bWxpbmsgKF9fY29u c3QgY2hhciAqX19mcm9tLCBfX2NvbnN0IGNoYXIgKl9fdG8pIHRocm93ICgpIDsKCiAKCgpleHRl cm4gaW50IHJlYWRsaW5rIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19wYXRoLCBjaGFyICpf X3Jlc3RyaWN0IF9fYnVmLAoJCSAgICAgc2l6ZV90IF9fbGVuKSB0aHJvdyAoKSA7CgoKIApleHRl cm4gaW50IHVubGluayAoX19jb25zdCBjaGFyICpfX25hbWUpIHRocm93ICgpIDsKCiAKZXh0ZXJu IGludCBybWRpciAoX19jb25zdCBjaGFyICpfX3BhdGgpIHRocm93ICgpIDsKCgogCmV4dGVybiBf X3BpZF90IHRjZ2V0cGdycCAoaW50IF9fZmQpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCB0Y3Nl dHBncnAgKGludCBfX2ZkLCBfX3BpZF90IF9fcGdycF9pZCkgdGhyb3cgKCkgOwoKCiAKZXh0ZXJu IGNoYXIgKmdldGxvZ2luICh2b2lkKSB0aHJvdyAoKSA7CgoKCgoKCgoKIApleHRlcm4gaW50IHNl dGxvZ2luIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgdGhyb3cgKCkgOwoKCgoKIAoKCgojIDEgIi91 c3IvaW5jbHVkZS9nZXRvcHQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoK CgoKCgoKCmV4dGVybiAiQyIgewoKCiAKCgoKCgpleHRlcm4gY2hhciAqb3B0YXJnOwoKIAoKCgoK CgoKCgoKCmV4dGVybiBpbnQgb3B0aW5kOwoKIAoKCmV4dGVybiBpbnQgb3B0ZXJyOwoKIAoKZXh0 ZXJuIGludCBvcHRvcHQ7CgojIDExMyAiL3Vzci9pbmNsdWRlL2dldG9wdC5oIiAzCgoKCiAKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgpleHRlcm4gaW50IGdldG9wdCAoaW50IF9fYXJnYywg Y2hhciAqY29uc3QgKl9fYXJndiwgY29uc3QgY2hhciAqX19zaG9ydG9wdHMpOwoKCgoKIyAxNjIg Ii91c3IvaW5jbHVkZS9nZXRvcHQuaCIgMwoKIyAxNzEgIi91c3IvaW5jbHVkZS9nZXRvcHQuaCIg MwoKCgp9CgoKIAoKCgojIDcyNiAiL3Vzci9pbmNsdWRlL3VuaXN0ZC5oIiAyIDMKCgoKCgoKIAoK CmV4dGVybiBpbnQgZ2V0aG9zdG5hbWUgKGNoYXIgKl9fbmFtZSwgc29ja2xlbl90IF9fbGVuKSB0 aHJvdyAoKSA7CgogCgpleHRlcm4gaW50IHNldGhvc3RuYW1lIChfX2NvbnN0IGNoYXIgKl9fbmFt ZSwgc2l6ZV90IF9fbGVuKSB0aHJvdyAoKSA7CgogCgpleHRlcm4gaW50IHNldGhvc3RpZCAobG9u ZyBpbnQgX19pZCkgdGhyb3cgKCkgOwoKCiAKCgpleHRlcm4gaW50IGdldGRvbWFpbm5hbWUgKGNo YXIgKl9fbmFtZSwgc2l6ZV90IF9fbGVuKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQgc2V0ZG9tYWlu bmFtZSAoX19jb25zdCBjaGFyICpfX25hbWUsIHNpemVfdCBfX2xlbikgdGhyb3cgKCkgOwoKCiAK CgpleHRlcm4gaW50IHZoYW5ndXAgKHZvaWQpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCByZXZv a2UgKF9fY29uc3QgY2hhciAqX19maWxlKSB0aHJvdyAoKSA7CgoKIAoKCgoKZXh0ZXJuIGludCBw cm9maWwgKHVuc2lnbmVkIHNob3J0IGludCAqX19zYW1wbGVfYnVmZmVyLCBzaXplX3QgX19zaXpl LAoJCSAgIHNpemVfdCBfX29mZnNldCwgdW5zaWduZWQgaW50IF9fc2NhbGUpIHRocm93ICgpIDsK CgogCgoKZXh0ZXJuIGludCBhY2N0IChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgdGhyb3cgKCkgOwoK CiAKZXh0ZXJuIGNoYXIgKmdldHVzZXJzaGVsbCAodm9pZCkgdGhyb3cgKCkgOwpleHRlcm4gdm9p ZCBlbmR1c2Vyc2hlbGwgKHZvaWQpIHRocm93ICgpIDsgIApleHRlcm4gdm9pZCBzZXR1c2Vyc2hl bGwgKHZvaWQpIHRocm93ICgpIDsgIAoKCiAKCgpleHRlcm4gaW50IGRhZW1vbiAoaW50IF9fbm9j aGRpciwgaW50IF9fbm9jbG9zZSkgdGhyb3cgKCkgOwoKCgoKCiAKCmV4dGVybiBpbnQgY2hyb290 IChfX2NvbnN0IGNoYXIgKl9fcGF0aCkgdGhyb3cgKCkgOwoKIAoKZXh0ZXJuIGNoYXIgKmdldHBh c3MgKF9fY29uc3QgY2hhciAqX19wcm9tcHQpIHRocm93ICgpIDsKCgoKCiAKZXh0ZXJuIGludCBm c3luYyAoaW50IF9fZmQpIHRocm93ICgpIDsKCgoKCgogCmV4dGVybiBsb25nIGludCBnZXRob3N0 aWQgKHZvaWQpIHRocm93ICgpIDsKCiAKZXh0ZXJuIHZvaWQgc3luYyAodm9pZCkgdGhyb3cgKCkg OwoKCiAKCmV4dGVybiBpbnQgZ2V0cGFnZXNpemUgKHZvaWQpICB0aHJvdyAoKSAgX19hdHRyaWJ1 dGVfXyAoKF9fY29uc3RfXykpOwoKCiAKCmV4dGVybiBpbnQgdHJ1bmNhdGUgKF9fY29uc3QgY2hh ciAqX19maWxlLCBfX29mZl90IF9fbGVuZ3RoKSB0aHJvdyAoKSA7CiMgODMzICIvdXNyL2luY2x1 ZGUvdW5pc3RkLmgiIDMKCgoKCgogCgpleHRlcm4gaW50IGZ0cnVuY2F0ZSAoaW50IF9fZmQsIF9f b2ZmX3QgX19sZW5ndGgpIHRocm93ICgpIDsKCgoKCgoKCgoKCgoKCiAKCmV4dGVybiBpbnQgZ2V0 ZHRhYmxlc2l6ZSAodm9pZCkgdGhyb3cgKCkgOwoKCgoKCgogCgpleHRlcm4gaW50IGJyayAodm9p ZCAqX19hZGRyKSB0aHJvdyAoKSA7CgogCgoKCmV4dGVybiB2b2lkICpzYnJrIChpbnRwdHJfdCBf X2RlbHRhKSB0aHJvdyAoKSA7CgoKCgogCgoKCgoKCgoKCmV4dGVybiBsb25nIGludCBzeXNjYWxs IChsb25nIGludCBfX3N5c25vLCAuLi4pIHRocm93ICgpIDsKCgoKCgogCgoKCiAKCgoKCgoKCgoK ZXh0ZXJuIGludCBsb2NrZiAoaW50IF9fZmQsIGludCBfX2NtZCwgX19vZmZfdCBfX2xlbikgdGhy b3cgKCkgOwoKCgoKCgoKCgoKCgoKCiMgOTMyICIvdXNyL2luY2x1ZGUvdW5pc3RkLmgiIDMKCgoK IAoKZXh0ZXJuIGludCBmZGF0YXN5bmMgKGludCBfX2ZpbGRlcykgdGhyb3cgKCkgOwoKCgogCgoj IDk1OCAiL3Vzci9pbmNsdWRlL3VuaXN0ZC5oIiAzCgoKCiAKCgoKCgoKCgogCgogCgoKCgoKCgoK CmV4dGVybiBpbnQgcHRocmVhZF9hdGZvcmsgKHZvaWQgKCpfX3ByZXBhcmUpICh2b2lkKSwKCQkJ ICAgdm9pZCAoKl9fcGFyZW50KSAodm9pZCksCgkJCSAgIHZvaWQgKCpfX2NoaWxkKSAodm9pZCkp IHRocm93ICgpIDsKCgp9IAoKCiMgODcgIi4uLy4uL2ppa2VzL3NyYy9wbGF0Zm9ybS5oIiAyCgoK CgoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2RpcmVudC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoK CgoKCiAKCgoKCgoKCgpleHRlcm4gIkMiIHsgCgoKCiMgNDUgIi91c3IvaW5jbHVkZS9kaXJlbnQu aCIgMwoKCiAKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL2RpcmVudC5oIiAx IDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgpzdHJ1Y3QgZGlyZW50CiAgewoKICAgIF9faW5vX3Qg ZF9pbm87CiAgICBfX29mZl90IGRfb2ZmOwoKCgoKICAgIHVuc2lnbmVkIHNob3J0IGludCBkX3Jl Y2xlbjsKICAgIHVuc2lnbmVkIGNoYXIgZF90eXBlOwogICAgY2hhciBkX25hbWVbMjU2XTsJCSAK ICB9OwoKIyA0NiAiL3Vzci9pbmNsdWRlL2JpdHMvZGlyZW50LmgiIDMKCgoKCgoKCgojIDYyICIv dXNyL2luY2x1ZGUvZGlyZW50LmgiIDIgMwoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgogCmVudW0KICB7CiAgICBEVF9VTktOT1dOID0gMCwKCiAgICBEVF9GSUZPID0gMSwKCiAg ICBEVF9DSFIgPSAyLAoKICAgIERUX0RJUiA9IDQsCgogICAgRFRfQkxLID0gNiwKCiAgICBEVF9S RUcgPSA4LAoKICAgIERUX0xOSyA9IDEwLAoKICAgIERUX1NPQ0sgPSAxMiwKCiAgICBEVF9XSFQg PSAxNAoKICB9OwoKIAoKCgoKCiAKCnR5cGVkZWYgc3RydWN0IF9fZGlyc3RyZWFtIERJUjsKCiAK CmV4dGVybiBESVIgKm9wZW5kaXIgKF9fY29uc3QgY2hhciAqX19uYW1lKSB0aHJvdyAoKSA7Cgog CgpleHRlcm4gaW50IGNsb3NlZGlyIChESVIgKl9fZGlycCkgdGhyb3cgKCkgOwoKIAoKCgoKCgoK ZXh0ZXJuIHN0cnVjdCBkaXJlbnQgKnJlYWRkaXIgKERJUiAqX19kaXJwKSB0aHJvdyAoKSA7CgoK CgoKCgoKCgoKCgogCgoKZXh0ZXJuIGludCByZWFkZGlyX3IgKERJUiAqX19yZXN0cmljdCBfX2Rp cnAsCgkJICAgICAgc3RydWN0IGRpcmVudCAqX19yZXN0cmljdCBfX2VudHJ5LAoJCSAgICAgIHN0 cnVjdCBkaXJlbnQgKipfX3Jlc3RyaWN0IF9fcmVzdWx0KSB0aHJvdyAoKSA7CiMgMTc2ICIvdXNy L2luY2x1ZGUvZGlyZW50LmgiIDMKCgoKCgoKCgoKIApleHRlcm4gdm9pZCByZXdpbmRkaXIgKERJ UiAqX19kaXJwKSB0aHJvdyAoKSA7CgoKCgogCmV4dGVybiB2b2lkIHNlZWtkaXIgKERJUiAqX19k aXJwLCBsb25nIGludCBfX3BvcykgdGhyb3cgKCkgOwoKIApleHRlcm4gbG9uZyBpbnQgdGVsbGRp ciAoRElSICpfX2RpcnApIHRocm93ICgpIDsKCgoKCiAKZXh0ZXJuIGludCBkaXJmZCAoRElSICpf X2RpcnApIHRocm93ICgpIDsKCgoKCgoKIAojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3Bvc2l4MV9s aW0uaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCiAKCiAKCgogCgoKIAoKCiAK CgogCgoKIAoKCiAKCgogCgoKCiAKCgogCgoKIAoKCiAKCgogCgoKCiAKCgogCgoKIAoKCiAKCgog CgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCgogCgoKIAoKCiAKCgogCgoKIAoKCgogCiMg MSAiL3Vzci9pbmNsdWRlL2JpdHMvbG9jYWxfbGltLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoK CiAKCgoKCgoKCgoKCgoKCgogCiMgMSAiL3Vzci9pbmNsdWRlL2xpbnV4L2xpbWl0cy5oIiAxIDMK CgoKCgoKCgoKCgoKCgoKCgoKCiMgMzYgIi91c3IvaW5jbHVkZS9iaXRzL2xvY2FsX2xpbS5oIiAy IDMKCgogCgoKCgogCgoKCgogCgoKCgoKIAoKIAoKCiAKCiAKCgogCgogCgoKIAoKCgogCgoKIAoK IyAxMjYgIi91c3IvaW5jbHVkZS9iaXRzL3Bvc2l4MV9saW0uaCIgMiAzCgoKCgoKCgoKIAoKCgoK CgoKIyAyMDkgIi91c3IvaW5jbHVkZS9kaXJlbnQuaCIgMiAzCgoKIAoKCgoKCgoKCiMgMSAiL3Vz ci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEg MwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4z L2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCiAKCgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2Nj LWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoK IAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKCiMgMTI2ICIvdXNyL2xpYi9nY2MtbGli L2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCiAKCiAK CgojIDE4OCAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUv c3RkZGVmLmgiIDMKCgoKCgogCgoKCgogCgoKIyAyNjkgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1z dXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKCgoKCgoKCgoKCgogCgog CgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUv c3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCiMgMjIwICIvdXNyL2luY2x1 ZGUvZGlyZW50LmgiIDIgMwoKCiAKCgoKCmV4dGVybiBpbnQgc2NhbmRpciAoX19jb25zdCBjaGFy ICpfX3Jlc3RyaWN0IF9fZGlyLAoJCSAgICBzdHJ1Y3QgZGlyZW50ICoqKl9fcmVzdHJpY3QgX19u YW1lbGlzdCwKCQkgICAgaW50ICgqX19zZWxlY3RvcikgKF9fY29uc3Qgc3RydWN0IGRpcmVudCAq KSwKCQkgICAgaW50ICgqX19jbXApIChfX2NvbnN0IHZvaWQgKiwgX19jb25zdCB2b2lkICopKSB0 aHJvdyAoKSA7CiMgMjQyICIvdXNyL2luY2x1ZGUvZGlyZW50LmgiIDMKCgoKCgoKCgoKCgogCgpl eHRlcm4gaW50IGFscGhhc29ydCAoX19jb25zdCB2b2lkICpfX2UxLCBfX2NvbnN0IHZvaWQgKl9f ZTIpCiAgICAgdGhyb3cgKCkgICA7CiMgMjY2ICIvdXNyL2luY2x1ZGUvZGlyZW50LmgiIDMKCgoK CgoKCiMgMjkzICIvdXNyL2luY2x1ZGUvZGlyZW50LmgiIDMKCgogCgoKCgpleHRlcm4gX19zc2l6 ZV90IGdldGRpcmVudHJpZXMgKGludCBfX2ZkLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLAoJCQkJ c2l6ZV90IF9fbmJ5dGVzLAoJCQkJX19vZmZfdCAqX19yZXN0cmljdCBfX2Jhc2VwKSB0aHJvdyAo KSA7CiMgMzEzICIvdXNyL2luY2x1ZGUvZGlyZW50LmgiIDMKCgoKCgoKCgoKCn0gCgoKIyA5OSAi Li4vLi4vamlrZXMvc3JjL3BsYXRmb3JtLmgiIDIKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUv d2NoYXIuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCiAKCgoKCiMgMSAi L3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCiMgMzgg Ii91c3IvaW5jbHVkZS9zdGRpby5oIiAzCgoKCgoKCgoKCgoKCgoKCiAKdHlwZWRlZiBzdHJ1Y3Qg X0lPX0ZJTEUgX19GSUxFOwoKCgoKCgojIDYzNCAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoK IyAzNyAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDIgMwoKIAoKIyAxICIvdXNyL2xpYi9nY2MtbGli L2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRhcmcuaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAK CgoKCgoKdHlwZWRlZiB2b2lkICpfX2dudWNfdmFfbGlzdDsKCgoKIAoKIyAxMjIgIi91c3IvbGli L2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGFyZy5oIiAzCgoKCgoK CgoKCgoKCgoKCgoKCgoKIyAyMDkgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIu OTUuMy9pbmNsdWRlL3N0ZGFyZy5oIiAzCgoKCgojIDQwICIvdXNyL2luY2x1ZGUvd2NoYXIuaCIg MiAzCgoKIAoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4z L2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9p NDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCiAKCgoKCgog CgoKIyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUv c3RkZGVmLmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKCiMg MTI2ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRk ZWYuaCIgMwoKCiAKCgoKCiAKCiAKCgojIDE4OCAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2Ut bGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgogCgoKCgogCgoKIyAyNjkgIi91 c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAz CgoKCgoKCgoKCgoKCgoKCgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2Ut bGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCiAKCgoK CgoKCiMgNDggIi91c3IvaW5jbHVkZS93Y2hhci5oIiAyIDMKCgojIDEgIi91c3IvaW5jbHVkZS9i aXRzL3djaGFyLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDUwICIvdXNyL2lu Y2x1ZGUvd2NoYXIuaCIgMiAzCgoKIAoKCgoKCgoKCgoKCgoKIAp0eXBlZGVmIHN0cnVjdAp7CiAg aW50IF9fY291bnQ7CiAgdW5pb24KICB7CiAgICB3aW50X3QgX193Y2g7CiAgICBjaGFyIF9fd2No Yls0XTsKICB9IF9fdmFsdWU7CQkgCn0gX19tYnN0YXRlX3Q7CgoKCgogCgoKCiAKdHlwZWRlZiBf X21ic3RhdGVfdCBtYnN0YXRlX3Q7CgoKIAoKCgoKCgoKCiAKCgoKCgogCgpzdHJ1Y3QgdG07CgoK ZXh0ZXJuICJDIiB7IAoKIApleHRlcm4gd2NoYXJfdCAqd2NzY3B5ICh3Y2hhcl90ICpfX3Jlc3Ry aWN0IF9fZGVzdCwKCQkJX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjKSB0aHJvdyAo KSA7CiAKZXh0ZXJuIHdjaGFyX3QgKndjc25jcHkgKHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kZXN0 LAoJCQkgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19uKQogICAg IHRocm93ICgpIDsKCiAKZXh0ZXJuIHdjaGFyX3QgKndjc2NhdCAod2NoYXJfdCAqX19yZXN0cmlj dCBfX2Rlc3QsCgkJCV9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYykgdGhyb3cgKCkg OwogCmV4dGVybiB3Y2hhcl90ICp3Y3NuY2F0ICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVzdCwK CQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3NyYywgc2l6ZV90IF9fbikKICAgICB0 aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgd2NzY21wIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9f Y29uc3Qgd2NoYXJfdCAqX19zMikKICAgICB0aHJvdyAoKSAgIDsKIApleHRlcm4gaW50IHdjc25j bXAgKF9fY29uc3Qgd2NoYXJfdCAqX19zMSwgX19jb25zdCB3Y2hhcl90ICpfX3MyLCBzaXplX3Qg X19uKQogICAgIHRocm93ICgpICAgOwoKIyAxNTAgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAzCgoK IAoKZXh0ZXJuIGludCB3Y3Njb2xsIChfX2NvbnN0IHdjaGFyX3QgKl9fczEsIF9fY29uc3Qgd2No YXJfdCAqX19zMikgdGhyb3cgKCkgOwogCgoKZXh0ZXJuIHNpemVfdCB3Y3N4ZnJtICh3Y2hhcl90 ICpfX3Jlc3RyaWN0IF9fczEsCgkJICAgICAgIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBf X3MyLCBzaXplX3QgX19uKSB0aHJvdyAoKSA7CgojIDE3NyAiL3Vzci9pbmNsdWRlL3djaGFyLmgi IDMKCgogCmV4dGVybiB3Y2hhcl90ICp3Y3NjaHIgKF9fY29uc3Qgd2NoYXJfdCAqX193Y3MsIHdj aGFyX3QgX193YykKICAgICB0aHJvdyAoKSAgIDsKIApleHRlcm4gd2NoYXJfdCAqd2NzcmNociAo X19jb25zdCB3Y2hhcl90ICpfX3djcywgd2NoYXJfdCBfX3djKQogICAgIHRocm93ICgpICAgOwoK CgoKCgoKCiAKCmV4dGVybiBzaXplX3Qgd2NzY3NwbiAoX19jb25zdCB3Y2hhcl90ICpfX3djcywg X19jb25zdCB3Y2hhcl90ICpfX3JlamVjdCkKICAgICB0aHJvdyAoKSAgIDsKIAoKZXh0ZXJuIHNp emVfdCB3Y3NzcG4gKF9fY29uc3Qgd2NoYXJfdCAqX193Y3MsIF9fY29uc3Qgd2NoYXJfdCAqX19h Y2NlcHQpCiAgICAgdGhyb3cgKCkgICA7CiAKZXh0ZXJuIHdjaGFyX3QgKndjc3BicmsgKF9fY29u c3Qgd2NoYXJfdCAqX193Y3MsIF9fY29uc3Qgd2NoYXJfdCAqX19hY2NlcHQpCiAgICAgdGhyb3cg KCkgICA7CiAKZXh0ZXJuIHdjaGFyX3QgKndjc3N0ciAoX19jb25zdCB3Y2hhcl90ICpfX2hheXN0 YWNrLCBfX2NvbnN0IHdjaGFyX3QgKl9fbmVlZGxlKQogICAgIHRocm93ICgpICAgOwoKCgoKCgoK IApleHRlcm4gd2NoYXJfdCAqd2NzdG9rICh3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcywKCQkJX19j b25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fZGVsaW0sCgkJCXdjaGFyX3QgKipfX3Jlc3RyaWN0 IF9fcHRyKSB0aHJvdyAoKSA7CgogCmV4dGVybiBzaXplX3Qgd2NzbGVuIChfX2NvbnN0IHdjaGFy X3QgKl9fcykgdGhyb3cgKCkgICA7CgoKCgoKCgoKIApleHRlcm4gd2NoYXJfdCAqd21lbWNociAo X19jb25zdCB3Y2hhcl90ICpfX3MsIHdjaGFyX3QgX19jLCBzaXplX3QgX19uKQogICAgIHRocm93 ICgpICAgOwoKIApleHRlcm4gaW50IHdtZW1jbXAgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmlj dCBfX3MxLAoJCSAgICBfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19zMiwgc2l6ZV90IF9f bikKICAgICB0aHJvdyAoKSAgIDsKCiAKZXh0ZXJuIHdjaGFyX3QgKndtZW1jcHkgKHdjaGFyX3Qg Kl9fcmVzdHJpY3QgX19zMSwKCQkJIF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX3MyLCBz aXplX3QgX19uKSB0aHJvdyAoKSA7CgogCgpleHRlcm4gd2NoYXJfdCAqd21lbW1vdmUgKHdjaGFy X3QgKl9fczEsIF9fY29uc3Qgd2NoYXJfdCAqX19zMiwgc2l6ZV90IF9fbikKICAgICB0aHJvdyAo KSA7CgogCmV4dGVybiB3Y2hhcl90ICp3bWVtc2V0ICh3Y2hhcl90ICpfX3MsIHdjaGFyX3QgX19j LCBzaXplX3QgX19uKSB0aHJvdyAoKSA7CgoKCgoKCgoKCgogCgpleHRlcm4gd2ludF90IGJ0b3dj IChpbnQgX19jKSB0aHJvdyAoKSA7CgogCgpleHRlcm4gaW50IHdjdG9iICh3aW50X3QgX19jKSB0 aHJvdyAoKSA7CgogCgpleHRlcm4gaW50IG1ic2luaXQgKF9fY29uc3QgbWJzdGF0ZV90ICpfX3Bz KSB0aHJvdyAoKSA7CgogCgpleHRlcm4gc2l6ZV90IG1icnRvd2MgKHdjaGFyX3QgKl9fcmVzdHJp Y3QgX19wd2MsCgkJICAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBf X24sCgkJICAgICAgIG1ic3RhdGVfdCAqX19wKSB0aHJvdyAoKSA7CgogCmV4dGVybiBzaXplX3Qg d2NydG9tYiAoY2hhciAqX19yZXN0cmljdCBfX3MsIHdjaGFyX3QgX193YywKCQkgICAgICAgbWJz dGF0ZV90ICpfX3Jlc3RyaWN0IF9fcHMpIHRocm93ICgpIDsKCiAKZXh0ZXJuIHNpemVfdCBfX21i cmxlbiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKCQkJbWJzdGF0 ZV90ICpfX3Jlc3RyaWN0IF9fcHMpIHRocm93ICgpIDsKZXh0ZXJuIHNpemVfdCBtYnJsZW4gKF9f Y29uc3QgY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBfX24sCgkJICAgICAgbWJzdGF0ZV90 ICpfX3Jlc3RyaWN0IF9fcHMpIHRocm93ICgpIDsKCgoKIApleHRlcm4gX19pbmxpbmUgc2l6ZV90 IG1icmxlbiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbiwKCQkJICAg ICAgIG1ic3RhdGVfdCAqX19yZXN0cmljdCBfX3BzKSB0aHJvdyAoKSAKeyByZXR1cm4gKF9fcHMg IT0gX19udWxsIAoJICA/IG1icnRvd2MgKF9fbnVsbCAsIF9fcywgX19uLCBfX3BzKSA6IF9fbWJy bGVuIChfX3MsIF9fbiwgX19udWxsICkpOyB9CgoKIAoKZXh0ZXJuIHNpemVfdCBtYnNydG93Y3Mg KHdjaGFyX3QgKl9fcmVzdHJpY3QgX19kc3QsCgkJCSBfX2NvbnN0IGNoYXIgKipfX3Jlc3RyaWN0 IF9fc3JjLCBzaXplX3QgX19sZW4sCgkJCSBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgdGhy b3cgKCkgOwoKIAoKZXh0ZXJuIHNpemVfdCB3Y3NydG9tYnMgKGNoYXIgKl9fcmVzdHJpY3QgX19k c3QsCgkJCSBfX2NvbnN0IHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fc3JjLCBzaXplX3QgX19sZW4s CgkJCSBtYnN0YXRlX3QgKl9fcmVzdHJpY3QgX19wcykgdGhyb3cgKCkgOwoKCiMgMzIyICIvdXNy L2luY2x1ZGUvd2NoYXIuaCIgMwoKCgogCgoKCgoKCgoKCgogCgpleHRlcm4gZG91YmxlIHdjc3Rv ZCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKCQkgICAgICB3Y2hhcl90ICoq X19yZXN0cmljdCBfX2VuZHB0cikgdGhyb3cgKCkgOwoKCgoKCgoKCgoKIAoKZXh0ZXJuIGxvbmcg aW50IHdjc3RvbCAoX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fbnB0ciwKCQkJd2NoYXJf dCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpIHRocm93ICgpIDsKCiAKCmV4dGVy biB1bnNpZ25lZCBsb25nIGludCB3Y3N0b3VsIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3Qg X19ucHRyLAoJCQkJICB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50IF9fYmFzZSkK ICAgICB0aHJvdyAoKSA7CgojIDM3NSAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDMKCgojIDM5MSAi L3Vzci9pbmNsdWRlL3djaGFyLmgiIDMKCgojIDQ0MSAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDMK CgoKIAoKZXh0ZXJuIGRvdWJsZSBfX3djc3RvZF9pbnRlcm5hbCAoX19jb25zdCB3Y2hhcl90ICpf X3Jlc3RyaWN0IF9fbnB0ciwKCQkJCSB3Y2hhcl90ICoqX19yZXN0cmljdCBfX2VuZHB0ciwgaW50 IF9fZ3JvdXApCiAgICAgdGhyb3cgKCkgOwpleHRlcm4gZmxvYXQgX193Y3N0b2ZfaW50ZXJuYWwg KF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmljdCBfX25wdHIsCgkJCQl3Y2hhcl90ICoqX19yZXN0 cmljdCBfX2VuZHB0ciwgaW50IF9fZ3JvdXApCiAgICAgdGhyb3cgKCkgOwpleHRlcm4gbG9uZyBk b3VibGUgX193Y3N0b2xkX2ludGVybmFsIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19u cHRyLAoJCQkJICAgICAgIHdjaGFyX3QgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAoJCQkJICAgICAg IGludCBfX2dyb3VwKSB0aHJvdyAoKSA7CgoKZXh0ZXJuIGxvbmcgaW50IF9fd2NzdG9sX2ludGVy bmFsIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAoJCQkJICAgd2NoYXJfdCAq Kl9fcmVzdHJpY3QgX19lbmRwdHIsCgkJCQkgICBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkgdGhy b3cgKCkgOwoKCgpleHRlcm4gdW5zaWduZWQgbG9uZyBpbnQgX193Y3N0b3VsX2ludGVybmFsIChf X2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHQsCgkJCQkJICAgICB3Y2hhcl90ICoqX19y ZXN0cmljdCBfX2VuZHB0ciwKCQkJCQkgICAgIGludCBfX2Jhc2UsIGludCBfX2dyb3VwKSB0aHJv dyAoKSA7CgoKCl9fZXh0ZW5zaW9uX18KZXh0ZXJuIGxvbmcgbG9uZyBpbnQgX193Y3N0b2xsX2lu dGVybmFsIChfX2NvbnN0IHdjaGFyX3QgKl9fcmVzdHJpY3QgX19ucHRyLAoJCQkJCSB3Y2hhcl90 ICoqX19yZXN0cmljdCBfX2VuZHB0ciwKCQkJCQkgaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApIHRo cm93ICgpIDsKCgoKX19leHRlbnNpb25fXwpleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGludCBf X3djc3RvdWxsX2ludGVybmFsIChfX2NvbnN0IHdjaGFyX3QgKgoJCQkJCQkgICBfX3Jlc3RyaWN0 IF9fbnB0ciwKCQkJCQkJICAgd2NoYXJfdCAqKgoJCQkJCQkgICBfX3Jlc3RyaWN0IF9fZW5kcHRy LAoJCQkJCQkgICBpbnQgX19iYXNlLAoJCQkJCQkgICBpbnQgX19ncm91cCkgdGhyb3cgKCkgOwoK CgoKCiAKCmV4dGVybiBfX2lubGluZSBkb3VibGUgd2NzdG9kIChfX2NvbnN0IHdjaGFyX3QgKl9f cmVzdHJpY3QgX19ucHRyLAoJCQkgICAgICAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIp IHRocm93ICgpIAp7IHJldHVybiBfX3djc3RvZF9pbnRlcm5hbCAoX19ucHRyLCBfX2VuZHB0ciwg MCk7IH0KZXh0ZXJuIF9faW5saW5lIGxvbmcgaW50IHdjc3RvbCAoX19jb25zdCB3Y2hhcl90ICpf X3Jlc3RyaWN0IF9fbnB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJf dCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCgkJCQkgaW50IF9fYmFzZSkgdGhyb3cgKCkgCnsgcmV0 dXJuIF9fd2NzdG9sX2ludGVybmFsIChfX25wdHIsIF9fZW5kcHRyLCBfX2Jhc2UsIDApOyB9CmV4 dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGludCB3Y3N0b3VsIChfX2NvbnN0IHdjaGFyX3Qg Kl9fcmVzdHJpY3QgX19ucHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgd2NoYXJfdCAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCgkJCQkJICAgaW50IF9fYmFzZSkg dGhyb3cgKCkgCnsgcmV0dXJuIF9fd2NzdG91bF9pbnRlcm5hbCAoX19ucHRyLCBfX2VuZHB0ciwg X19iYXNlLCAwKTsgfQoKIyA1MjIgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAzCgoKCgojIDUzNSAi L3Vzci9pbmNsdWRlL3djaGFyLmgiIDMKCgoKIAojIDU4NSAiL3Vzci9pbmNsdWRlL3djaGFyLmgi IDMKCgojIDYwMiAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDMKCgoKIApleHRlcm4gd2ludF90IGZn ZXR3YyAoX19GSUxFICpfX3N0cmVhbSk7CmV4dGVybiB3aW50X3QgZ2V0d2MgKF9fRklMRSAqX19z dHJlYW0pOwoKIApleHRlcm4gd2ludF90IGdldHdjaGFyICh2b2lkKTsKCgogCmV4dGVybiB3aW50 X3QgZnB1dHdjICh3Y2hhcl90IF9fd2MsIF9fRklMRSAqX19zdHJlYW0pOwpleHRlcm4gd2ludF90 IHB1dHdjICh3Y2hhcl90IF9fd2MsIF9fRklMRSAqX19zdHJlYW0pOwoKIApleHRlcm4gd2ludF90 IHB1dHdjaGFyICh3Y2hhcl90IF9fd2MpOwoKCiAKCmV4dGVybiB3Y2hhcl90ICpmZ2V0d3MgKHdj aGFyX3QgKl9fcmVzdHJpY3QgX193cywgaW50IF9fbiwKCQkJX19GSUxFICpfX3Jlc3RyaWN0IF9f c3RyZWFtKTsKCiAKZXh0ZXJuIGludCBmcHV0d3MgKF9fY29uc3Qgd2NoYXJfdCAqX19yZXN0cmlj dCBfX3dzLAoJCSAgIF9fRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSk7CgoKIApleHRlcm4gd2lu dF90IHVuZ2V0d2MgKHdpbnRfdCBfX3djLCBfX0ZJTEUgKl9fc3RyZWFtKTsKCgojIDY2MCAiL3Vz ci9pbmNsdWRlL3djaGFyLmgiIDMKCgoKIAoKCmV4dGVybiBzaXplX3Qgd2NzZnRpbWUgKHdjaGFy X3QgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhzaXplLAoJCQlfX2NvbnN0IHdjaGFyX3Qg Kl9fcmVzdHJpY3QgX19mb3JtYXQsCgkJCV9fY29uc3Qgc3RydWN0IHRtICpfX3Jlc3RyaWN0IF9f dHApOwoKIAoKCgoKCgoKCgoKfSAKCgoKCiMgMTA4ICIuLi8uLi9qaWtlcy9zcmMvcGxhdGZvcm0u aCIgMgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvY3R5cGUuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoK CgogCgoKCgoKCgoKCmV4dGVybiAiQyIgeyAKCgogCgoKCgoKCgoKCgoKCgoKZW51bQp7CiAgX0lT dXBwZXIgPSAoKCAwICkgPCA4ID8gKCgxIDw8ICggMCApKSA8PCA4KSA6ICgoMSA8PCAoIDAgKSkg Pj4gOCkpICwJIAogIF9JU2xvd2VyID0gKCggMSApIDwgOCA/ICgoMSA8PCAoIDEgKSkgPDwgOCkg OiAoKDEgPDwgKCAxICkpID4+IDgpKSAsCSAKICBfSVNhbHBoYSA9ICgoIDIgKSA8IDggPyAoKDEg PDwgKCAyICkpIDw8IDgpIDogKCgxIDw8ICggMiApKSA+PiA4KSkgLAkgCiAgX0lTZGlnaXQgPSAo KCAzICkgPCA4ID8gKCgxIDw8ICggMyApKSA8PCA4KSA6ICgoMSA8PCAoIDMgKSkgPj4gOCkpICwJ IAogIF9JU3hkaWdpdCA9ICgoIDQgKSA8IDggPyAoKDEgPDwgKCA0ICkpIDw8IDgpIDogKCgxIDw8 ICggNCApKSA+PiA4KSkgLAkgCiAgX0lTc3BhY2UgPSAoKCA1ICkgPCA4ID8gKCgxIDw8ICggNSAp KSA8PCA4KSA6ICgoMSA8PCAoIDUgKSkgPj4gOCkpICwJIAogIF9JU3ByaW50ID0gKCggNiApIDwg OCA/ICgoMSA8PCAoIDYgKSkgPDwgOCkgOiAoKDEgPDwgKCA2ICkpID4+IDgpKSAsCSAKICBfSVNn cmFwaCA9ICgoIDcgKSA8IDggPyAoKDEgPDwgKCA3ICkpIDw8IDgpIDogKCgxIDw8ICggNyApKSA+ PiA4KSkgLAkgCiAgX0lTYmxhbmsgPSAoKCA4ICkgPCA4ID8gKCgxIDw8ICggOCApKSA8PCA4KSA6 ICgoMSA8PCAoIDggKSkgPj4gOCkpICwJIAogIF9JU2NudHJsID0gKCggOSApIDwgOCA/ICgoMSA8 PCAoIDkgKSkgPDwgOCkgOiAoKDEgPDwgKCA5ICkpID4+IDgpKSAsCSAKICBfSVNwdW5jdCA9ICgo IDEwICkgPCA4ID8gKCgxIDw8ICggMTAgKSkgPDwgOCkgOiAoKDEgPDwgKCAxMCApKSA+PiA4KSkg LAkgCiAgX0lTYWxudW0gPSAoKCAxMSApIDwgOCA/ICgoMSA8PCAoIDExICkpIDw8IDgpIDogKCgx IDw8ICggMTEgKSkgPj4gOCkpIAkgCn07CgoKIAoKCgoKCgoKCgoKZXh0ZXJuIF9fY29uc3QgdW5z aWduZWQgc2hvcnQgaW50ICpfX2N0eXBlX2I7CSAKZXh0ZXJuIF9fY29uc3QgX19pbnQzMl90ICpf X2N0eXBlX3RvbG93ZXI7ICAKZXh0ZXJuIF9fY29uc3QgX19pbnQzMl90ICpfX2N0eXBlX3RvdXBw ZXI7ICAKCgoKCgoKCgoKIAoKCgpleHRlcm4gaW50ICBpc2FsbnVtICAoaW50KSB0aHJvdyAoKSAg OwpleHRlcm4gaW50ICBpc2FscGhhICAoaW50KSB0aHJvdyAoKSAgOwpleHRlcm4gaW50ICBpc2Nu dHJsICAoaW50KSB0aHJvdyAoKSAgOwpleHRlcm4gaW50ICBpc2RpZ2l0ICAoaW50KSB0aHJvdyAo KSAgOwpleHRlcm4gaW50ICBpc2xvd2VyICAoaW50KSB0aHJvdyAoKSAgOwpleHRlcm4gaW50ICBp c2dyYXBoICAoaW50KSB0aHJvdyAoKSAgOwpleHRlcm4gaW50ICBpc3ByaW50ICAoaW50KSB0aHJv dyAoKSAgOwpleHRlcm4gaW50ICBpc3B1bmN0ICAoaW50KSB0aHJvdyAoKSAgOwpleHRlcm4gaW50 ICBpc3NwYWNlICAoaW50KSB0aHJvdyAoKSAgOwpleHRlcm4gaW50ICBpc3VwcGVyICAoaW50KSB0 aHJvdyAoKSAgOwpleHRlcm4gaW50ICBpc3hkaWdpdCAgKGludCkgdGhyb3cgKCkgIDsKCgoKCgoK IApleHRlcm4gaW50IHRvbG93ZXIgKGludCBfX2MpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCB0 b3VwcGVyIChpbnQgX19jKSB0aHJvdyAoKSA7CgoKCgogCgpleHRlcm4gaW50IGlzYXNjaWkgKGlu dCBfX2MpIHRocm93ICgpIDsKCiAKCmV4dGVybiBpbnQgdG9hc2NpaSAoaW50IF9fYykgdGhyb3cg KCkgOwoKIAoKZXh0ZXJuIGludCAgX3RvdXBwZXIgIChpbnQpIHRocm93ICgpICA7CmV4dGVybiBp bnQgIF90b2xvd2VyICAoaW50KSB0aHJvdyAoKSAgOwoKCiAKCiMgMTQ4ICIvdXNyL2luY2x1ZGUv Y3R5cGUuaCIgMwoKCgoKCgoKCgoKCgoKCgoKCgoKCmV4dGVybiBfX2lubGluZSBpbnQKdG9sb3dl ciAoaW50IF9fYykgdGhyb3cgKCkgCnsKICByZXR1cm4gX19jID49IC0xMjggJiYgX19jIDwgMjU2 ID8gX19jdHlwZV90b2xvd2VyW19fY10gOiBfX2M7Cn0KCmV4dGVybiBfX2lubGluZSBpbnQKdG91 cHBlciAoaW50IF9fYykgdGhyb3cgKCkgCnsKICByZXR1cm4gX19jID49IC0xMjggJiYgX19jIDwg MjU2ID8gX19jdHlwZV90b3VwcGVyW19fY10gOiBfX2M7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKIyAy NzUgIi91c3IvaW5jbHVkZS9jdHlwZS5oIiAzCgoKfSAKCgojIDExMiAiLi4vLi4vamlrZXMvc3Jj L3BsYXRmb3JtLmgiIDIKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2Fzc2VydC5oIiAxIDMKIAoKCgoK CgoKCgoKCgoKCgoKCiAKCgoKIyAzMyAiL3Vzci9pbmNsdWRlL2Fzc2VydC5oIiAzCgoKCgoKCgoK CgoKIAoKCgoKIyA2MyAiL3Vzci9pbmNsdWRlL2Fzc2VydC5oIiAzCgoKZXh0ZXJuICJDIiB7IAoK IApleHRlcm4gdm9pZCBfX2Fzc2VydF9mYWlsIChfX2NvbnN0IGNoYXIgKl9fYXNzZXJ0aW9uLCBf X2NvbnN0IGNoYXIgKl9fZmlsZSwKCQkJICAgdW5zaWduZWQgaW50IF9fbGluZSwgX19jb25zdCBj aGFyICpfX2Z1bmN0aW9uKQogICAgIHRocm93ICgpICBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVy bl9fKSk7CgogCmV4dGVybiB2b2lkIF9fYXNzZXJ0X3BlcnJvcl9mYWlsIChpbnQgX19lcnJudW0s IF9fY29uc3QgY2hhciAqX19maWxlLAoJCQkJICB1bnNpZ25lZCBpbnQgX19saW5lLAoJCQkJICBf X2NvbnN0IGNoYXIgKl9fZnVuY3Rpb24pCiAgICAgdGhyb3cgKCkgIF9fYXR0cmlidXRlX18gKChf X25vcmV0dXJuX18pKTsKCgogCgpleHRlcm4gdm9pZCBfX2Fzc2VydCAoY29uc3QgY2hhciAqX19h c3NlcnRpb24sIGNvbnN0IGNoYXIgKl9fZmlsZSwgaW50IF9fbGluZSkKICAgICB0aHJvdyAoKSAg X19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwoKCn0gCgoKCgoKCgoKCgoKCgogCgoKCgoK CgoKCgoKCgoKCiMgMTE2ICIuLi8uLi9qaWtlcy9zcmMvcGxhdGZvcm0uaCIgMgoKCgoKIyAxICIv dXNyL2luY2x1ZGUvc3RkaW8uaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCmV4 dGVybiAiQyIgeyAKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1 LjMvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCgoKCgoKCiAKCgojIDE5ICIvdXNyL2xpYi9nY2MtbGli L2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgogCgoKIAoKCgoK CiAKCgojIDYxICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVk ZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgoK IyAxMjYgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0 ZGRlZi5oIiAzCgoKIAoKCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3Vz ZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKCiAKCgoKCiAKCgojIDI2OSAi L3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgi IDMKCgoKCgoKCgoKCgoKCgoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3Vz ZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoKCgoKCgoKCgoKIAoK CgoKCgoKIyAzMyAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDIgMwoKCgoKCgoKCgoKIAp0eXBlZGVm IHN0cnVjdCBfSU9fRklMRSBGSUxFOwoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1 ZGUvbGliaW8uaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9p bmNsdWRlL19HX2NvbmZpZy5oIiAxIDMKIAoKCgoKCiAKCgoKCgoKIyAxICIvdXNyL2xpYi9nY2Mt bGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCgoKCgoKCiAK CgojIDE5ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9z dGRkZWYuaCIgMwoKCgogCgoKIAoKCgoKCiAKCgojIDYxICIvdXNyL2xpYi9nY2MtbGliL2k0ODYt c3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoK CgoKCgoKCgoKCiAKCgoKCgogCgogCgoKIyAxMjYgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNl LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKIAoKIAoKCiMgMTg4ICIv dXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIg MwoKCgoKCiAKCgoKCiAKCgojIDI2OSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgv Mi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgoKCgoKCgoKCgoKCiAKCiAKCiMgMzE3ICIv dXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIg MwoKCgoKIAoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKIyAxNCAiL3Vzci9pbmNsdWRlL19HX2NvbmZp Zy5oIiAyIDMKCgoKCgoKCgoKCgoKdHlwZWRlZiBzdHJ1Y3QKewogIF9fb2ZmX3QgX19wb3M7CiAg X19tYnN0YXRlX3QgX19zdGF0ZTsKfSBfR19mcG9zX3Q7CnR5cGVkZWYgc3RydWN0CnsKICBfX29m ZjY0X3QgX19wb3M7CiAgX19tYnN0YXRlX3QgX19zdGF0ZTsKfSBfR19mcG9zNjRfdDsKCgoKCgoK CgojIDEgIi91c3IvaW5jbHVkZS9nY29udi5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoK CgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1 ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1 c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCiAKCgoKCgogCgoKIyA2 MSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVm LmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKCiMgMTI2ICIv dXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIg MwoKCiAKCgoKCiAKCiAKCgojIDE4OCAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgv Mi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgogCgoKCgogCgoKIyAyNjkgIi91c3IvbGli L2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoK CgoKCgoKCgoKCgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgv Mi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCiMg MzAgIi91c3IvaW5jbHVkZS9nY29udi5oIiAyIDMKCgogCgoKIAplbnVtCnsKICBfX0dDT05WX09L ID0gMCwKICBfX0dDT05WX05PQ09OViwKICBfX0dDT05WX05PREIsCiAgX19HQ09OVl9OT01FTSwK CiAgX19HQ09OVl9FTVBUWV9JTlBVVCwKICBfX0dDT05WX0ZVTExfT1VUUFVULAogIF9fR0NPTlZf SUxMRUdBTF9JTlBVVCwKICBfX0dDT05WX0lOQ09NUExFVEVfSU5QVVQsCgogIF9fR0NPTlZfSUxM RUdBTF9ERVNDUklQVE9SLAogIF9fR0NPTlZfSU5URVJOQUxfRVJST1IKfTsKCgogCmVudW0Kewog IF9fR0NPTlZfSVNfTEFTVCA9IDB4MDAwMSwKICBfX0dDT05WX0lHTk9SRV9FUlJPUlMgPSAweDAw MDIKfTsKCgogCnN0cnVjdCBfX2djb252X3N0ZXA7CnN0cnVjdCBfX2djb252X3N0ZXBfZGF0YTsK c3RydWN0IF9fZ2NvbnZfbG9hZGVkX29iamVjdDsKc3RydWN0IF9fZ2NvbnZfdHJhbnNfZGF0YTsK CgogCnR5cGVkZWYgaW50ICgqX19nY29udl9mY3QpIChzdHJ1Y3QgX19nY29udl9zdGVwICosIHN0 cnVjdCBfX2djb252X3N0ZXBfZGF0YSAqLAoJCQkgICAgX19jb25zdCB1bnNpZ25lZCBjaGFyICoq LCBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwKCQkJICAgIHVuc2lnbmVkIGNoYXIgKiosIHNpemVf dCAqLCBpbnQsIGludCk7CgogCnR5cGVkZWYgaW50ICgqX19nY29udl9pbml0X2ZjdCkgKHN0cnVj dCBfX2djb252X3N0ZXAgKik7CnR5cGVkZWYgdm9pZCAoKl9fZ2NvbnZfZW5kX2ZjdCkgKHN0cnVj dCBfX2djb252X3N0ZXAgKik7CgoKIAp0eXBlZGVmIGludCAoKl9fZ2NvbnZfdHJhbnNfZmN0KSAo c3RydWN0IF9fZ2NvbnZfc3RlcCAqLAoJCQkJICBzdHJ1Y3QgX19nY29udl9zdGVwX2RhdGEgKiwg dm9pZCAqLAoJCQkJICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwKCQkJCSAgX19jb25zdCB1bnNp Z25lZCBjaGFyICoqLAoJCQkJICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hh ciAqKiwKCQkJCSAgc2l6ZV90ICopOwoKIAp0eXBlZGVmIGludCAoKl9fZ2NvbnZfdHJhbnNfY29u dGV4dF9mY3QpICh2b2lkICosIF9fY29uc3QgdW5zaWduZWQgY2hhciAqLAoJCQkJCSAgX19jb25z dCB1bnNpZ25lZCBjaGFyICosCgkJCQkJICB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIg Kik7CgogCnR5cGVkZWYgaW50ICgqX19nY29udl90cmFuc19xdWVyeV9mY3QpIChfX2NvbnN0IGNo YXIgKiwgX19jb25zdCBjaGFyICoqKiwKCQkJCQlzaXplX3QgKik7CgogCnR5cGVkZWYgaW50ICgq X19nY29udl90cmFuc19pbml0X2ZjdCkgKHZvaWQgKiosIGNvbnN0IGNoYXIgKik7CnR5cGVkZWYg dm9pZCAoKl9fZ2NvbnZfdHJhbnNfZW5kX2ZjdCkgKHZvaWQgKik7CgpzdHJ1Y3QgX19nY29udl90 cmFuc19kYXRhCnsKICAgCiAgX19nY29udl90cmFuc19mY3QgX190cmFuc19mY3Q7CiAgX19nY29u dl90cmFuc19jb250ZXh0X2ZjdCBfX3RyYW5zX2NvbnRleHRfZmN0OwogIF9fZ2NvbnZfdHJhbnNf ZW5kX2ZjdCBfX3RyYW5zX2VuZF9mY3Q7CiAgdm9pZCAqX19kYXRhOwogIHN0cnVjdCBfX2djb252 X3RyYW5zX2RhdGEgKl9fbmV4dDsKfTsKCgogCnN0cnVjdCBfX2djb252X3N0ZXAKewogIHN0cnVj dCBfX2djb252X2xvYWRlZF9vYmplY3QgKl9fc2hsaWJfaGFuZGxlOwogIF9fY29uc3QgY2hhciAq X19tb2RuYW1lOwoKICBpbnQgX19jb3VudGVyOwoKICBjaGFyICpfX2Zyb21fbmFtZTsKICBjaGFy ICpfX3RvX25hbWU7CgogIF9fZ2NvbnZfZmN0IF9fZmN0OwogIF9fZ2NvbnZfaW5pdF9mY3QgX19p bml0X2ZjdDsKICBfX2djb252X2VuZF9mY3QgX19lbmRfZmN0OwoKICAgCgogIGludCBfX21pbl9u ZWVkZWRfZnJvbTsKICBpbnQgX19tYXhfbmVlZGVkX2Zyb207CiAgaW50IF9fbWluX25lZWRlZF90 bzsKICBpbnQgX19tYXhfbmVlZGVkX3RvOwoKICAgCiAgaW50IF9fc3RhdGVmdWw7CgogIHZvaWQg Kl9fZGF0YTsJCSAKfTsKCiAKCnN0cnVjdCBfX2djb252X3N0ZXBfZGF0YQp7CiAgdW5zaWduZWQg Y2hhciAqX19vdXRidWY7ICAgICAKICB1bnNpZ25lZCBjaGFyICpfX291dGJ1ZmVuZDsgIAoKCiAg IAogIGludCBfX2ZsYWdzOwoKICAgCgogIGludCBfX2ludm9jYXRpb25fY291bnRlcjsKCiAgIAoK ICBpbnQgX19pbnRlcm5hbF91c2U7CgogIF9fbWJzdGF0ZV90ICpfX3N0YXRlcDsKICBfX21ic3Rh dGVfdCBfX3N0YXRlOwkgCgoKICAgCiAgc3RydWN0IF9fZ2NvbnZfdHJhbnNfZGF0YSAqX190cmFu czsKfTsKCgogCnR5cGVkZWYgc3RydWN0IF9fZ2NvbnZfaW5mbwp7CiAgc2l6ZV90IF9fbnN0ZXBz OwogIHN0cnVjdCBfX2djb252X3N0ZXAgKl9fc3RlcHM7CiAgX19leHRlbnNpb25fXyBzdHJ1Y3Qg X19nY29udl9zdGVwX2RhdGEgX19kYXRhIFswXSA7Cn0gKl9fZ2NvbnZfdDsKCgojIDQ0ICIvdXNy L2luY2x1ZGUvX0dfY29uZmlnLmgiIDIgMwoKdHlwZWRlZiB1bmlvbgp7CiAgc3RydWN0IF9fZ2Nv bnZfaW5mbyBfX2NkOwogIHN0cnVjdAogIHsKICAgIHN0cnVjdCBfX2djb252X2luZm8gX19jZDsK ICAgIHN0cnVjdCBfX2djb252X3N0ZXBfZGF0YSBfX2RhdGE7CiAgfSBfX2NvbWJpbmVkOwp9IF9H X2ljb252X3Q7Cgp0eXBlZGVmIGludCBfR19pbnQxNl90IF9fYXR0cmlidXRlX18gKChfX21vZGVf XyAoX19ISV9fKSkpOwp0eXBlZGVmIGludCBfR19pbnQzMl90IF9fYXR0cmlidXRlX18gKChfX21v ZGVfXyAoX19TSV9fKSkpOwp0eXBlZGVmIHVuc2lnbmVkIGludCBfR191aW50MTZfdCBfX2F0dHJp YnV0ZV9fICgoX19tb2RlX18gKF9fSElfXykpKTsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX0dfdWlu dDMyX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX1NJX18pKSk7CgoKCgogCgoKCgoKCgoK CgoKCgoKCgoKCiAKCgoKCiAKCgoKCgoKCgoKCgoKCgojIDMwICIvdXNyL2luY2x1ZGUvbGliaW8u aCIgMiAzCgogCgoKCgoKCgoKCgoKCgoKCgoKIAoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k0ODYt c3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRhcmcuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoK CgoKCiAKCiMgMTIyICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5j bHVkZS9zdGRhcmcuaCIgMwoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMjA5ICIvdXNyL2xpYi9nY2Mt bGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRhcmcuaCIgMwoKCgoKIyA1MSAi L3Vzci9pbmNsdWRlL2xpYmlvLmgiIDIgMwoKCgoKCgoKIyA3MCAiL3Vzci9pbmNsdWRlL2xpYmlv LmgiIDMKCgogCgoKCgoKCgoKCgoKCgoKCgoKIyAxMDEgIi91c3IvaW5jbHVkZS9saWJpby5oIiAz CgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoK CgoKc3RydWN0IF9JT19qdW1wX3Q7ICBzdHJ1Y3QgX0lPX0ZJTEU7CgogCgoKCgoKCgp0eXBlZGVm IHZvaWQgX0lPX2xvY2tfdDsKCgoKIAoKc3RydWN0IF9JT19tYXJrZXIgewogIHN0cnVjdCBfSU9f bWFya2VyICpfbmV4dDsKICBzdHJ1Y3QgX0lPX0ZJTEUgKl9zYnVmOwogICAKCiAgIAogIGludCBf cG9zOwojIDE5MCAiL3Vzci9pbmNsdWRlL2xpYmlvLmgiIDMKCn07CgogCmVudW0gX19jb2RlY3Z0 X3Jlc3VsdAp7CiAgX19jb2RlY3Z0X29rLAogIF9fY29kZWN2dF9wYXJ0aWFsLAogIF9fY29kZWN2 dF9lcnJvciwKICBfX2NvZGVjdnRfbm9jb252Cn07CgojIDI1NyAiL3Vzci9pbmNsdWRlL2xpYmlv LmgiIDMKCgpzdHJ1Y3QgX0lPX0ZJTEUgewogIGludCBfZmxhZ3M7CQkgCgoKICAgCiAgIAogIGNo YXIqIF9JT19yZWFkX3B0cjsJIAogIGNoYXIqIF9JT19yZWFkX2VuZDsJIAogIGNoYXIqIF9JT19y ZWFkX2Jhc2U7CSAKICBjaGFyKiBfSU9fd3JpdGVfYmFzZTsJIAogIGNoYXIqIF9JT193cml0ZV9w dHI7CSAKICBjaGFyKiBfSU9fd3JpdGVfZW5kOwkgCiAgY2hhciogX0lPX2J1Zl9iYXNlOwkgCiAg Y2hhciogX0lPX2J1Zl9lbmQ7CSAKICAgCiAgY2hhciAqX0lPX3NhdmVfYmFzZTsgIAogIGNoYXIg Kl9JT19iYWNrdXBfYmFzZTsgICAKICBjaGFyICpfSU9fc2F2ZV9lbmQ7ICAKCiAgc3RydWN0IF9J T19tYXJrZXIgKl9tYXJrZXJzOwoKICBzdHJ1Y3QgX0lPX0ZJTEUgKl9jaGFpbjsKCiAgaW50IF9m aWxlbm87CiAgaW50IF9ibGtzaXplOwogIF9fb2ZmX3QgICBfb2xkX29mZnNldDsgIAoKCiAgIAog IHVuc2lnbmVkIHNob3J0IF9jdXJfY29sdW1uOwogIHNpZ25lZCBjaGFyIF92dGFibGVfb2Zmc2V0 OwogIGNoYXIgX3Nob3J0YnVmWzFdOwoKICAgCgogIF9JT19sb2NrX3QgKl9sb2NrOwoKCgoKCgoK CiAgX19vZmY2NF90ICAgX29mZnNldDsKCgoKCgogIHZvaWQgKl9fcGFkMTsKICB2b2lkICpfX3Bh ZDI7CgogIGludCBfbW9kZTsKICAgCiAgY2hhciBfdW51c2VkMlsxNSAqIHNpemVvZiAoaW50KSAt IDIgKiBzaXplb2YgKHZvaWQgKildOwoKfTsKCgoKCgpzdHJ1Y3QgX0lPX0ZJTEVfcGx1czsKCmV4 dGVybiBzdHJ1Y3QgX0lPX0ZJTEVfcGx1cyBfSU9fMl8xX3N0ZGluXzsKZXh0ZXJuIHN0cnVjdCBf SU9fRklMRV9wbHVzIF9JT18yXzFfc3Rkb3V0XzsKZXh0ZXJuIHN0cnVjdCBfSU9fRklMRV9wbHVz IF9JT18yXzFfc3RkZXJyXzsKCgoKCgoKCgoKCgogCgogCgp0eXBlZGVmIF9fc3NpemVfdCBfX2lv X3JlYWRfZm4gKHZvaWQgKl9fY29va2llLCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fbmJ5dGVzKTsK CiAKCgoKCgp0eXBlZGVmIF9fc3NpemVfdCBfX2lvX3dyaXRlX2ZuICh2b2lkICpfX2Nvb2tpZSwg X19jb25zdCBjaGFyICpfX2J1ZiwKCQkJCSBzaXplX3QgX19uKTsKCiAKCgoKCgp0eXBlZGVmIGlu dCBfX2lvX3NlZWtfZm4gKHZvaWQgKl9fY29va2llLCBfX29mZjY0X3QgICAqX19wb3MsIGludCBf X3cpOwoKIAp0eXBlZGVmIGludCBfX2lvX2Nsb3NlX2ZuICh2b2lkICpfX2Nvb2tpZSk7CgoKIyAz ODcgIi91c3IvaW5jbHVkZS9saWJpby5oIiAzCgoKCgpleHRlcm4gIkMiIHsKCgpleHRlcm4gaW50 IF9fdW5kZXJmbG93IChfSU9fRklMRSAqKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQgX191ZmxvdyAo X0lPX0ZJTEUgKikgdGhyb3cgKCkgOwpleHRlcm4gaW50IF9fb3ZlcmZsb3cgKF9JT19GSUxFICos IGludCkgdGhyb3cgKCkgOwpleHRlcm4gd2ludF90ICAgX193dW5kZXJmbG93IChfSU9fRklMRSAq KSB0aHJvdyAoKSA7CmV4dGVybiB3aW50X3QgICBfX3d1ZmxvdyAoX0lPX0ZJTEUgKikgdGhyb3cg KCkgOwpleHRlcm4gd2ludF90ICAgX193b3ZlcmZsb3cgKF9JT19GSUxFICosIHdpbnRfdCAgKSB0 aHJvdyAoKSA7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmV4dGVybiBpbnQgX0lPX2dldGMgKF9J T19GSUxFICpfX2ZwKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQgX0lPX3B1dGMgKGludCBfX2MsIF9J T19GSUxFICpfX2ZwKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQgX0lPX2Zlb2YgKF9JT19GSUxFICpf X2ZwKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQgX0lPX2ZlcnJvciAoX0lPX0ZJTEUgKl9fZnApIHRo cm93ICgpIDsKCmV4dGVybiBpbnQgX0lPX3BlZWtjX2xvY2tlZCAoX0lPX0ZJTEUgKl9fZnApIHRo cm93ICgpIDsKCiAKCgoKZXh0ZXJuIHZvaWQgX0lPX2Zsb2NrZmlsZSAoX0lPX0ZJTEUgKikgdGhy b3cgKCkgOwpleHRlcm4gdm9pZCBfSU9fZnVubG9ja2ZpbGUgKF9JT19GSUxFICopIHRocm93ICgp IDsKZXh0ZXJuIGludCBfSU9fZnRyeWxvY2tmaWxlIChfSU9fRklMRSAqKSB0aHJvdyAoKSA7CgoK CgoKCgoKCgoKCgoKCgpleHRlcm4gaW50IF9JT192ZnNjYW5mIChfSU9fRklMRSAqIF9fcmVzdHJp Y3QsIGNvbnN0IGNoYXIgKiBfX3Jlc3RyaWN0LAoJCQlfX2dudWNfdmFfbGlzdCAsIGludCAqX19y ZXN0cmljdCkgdGhyb3cgKCkgOwpleHRlcm4gaW50IF9JT192ZnByaW50ZiAoX0lPX0ZJTEUgKl9f cmVzdHJpY3QsIGNvbnN0IGNoYXIgKl9fcmVzdHJpY3QsCgkJCSBfX2dudWNfdmFfbGlzdCApIHRo cm93ICgpIDsKZXh0ZXJuIF9fc3NpemVfdCAgIF9JT19wYWRuIChfSU9fRklMRSAqLCBpbnQsIF9f c3NpemVfdCAgKSB0aHJvdyAoKSA7CmV4dGVybiBzaXplX3QgICBfSU9fc2dldG4gKF9JT19GSUxF ICosIHZvaWQgKiwgc2l6ZV90ICApIHRocm93ICgpIDsKCmV4dGVybiBfX29mZjY0X3QgICBfSU9f c2Vla29mZiAoX0lPX0ZJTEUgKiwgX19vZmY2NF90ICAsIGludCwgaW50KSB0aHJvdyAoKSA7CmV4 dGVybiBfX29mZjY0X3QgICBfSU9fc2Vla3BvcyAoX0lPX0ZJTEUgKiwgX19vZmY2NF90ICAsIGlu dCkgdGhyb3cgKCkgOwoKZXh0ZXJuIHZvaWQgX0lPX2ZyZWVfYmFja3VwX2FyZWEgKF9JT19GSUxF ICopIHRocm93ICgpIDsKCiMgNTA3ICIvdXNyL2luY2x1ZGUvbGliaW8uaCIgMwoKCgp9CgoKCiMg NjQgIi91c3IvaW5jbHVkZS9zdGRpby5oIiAyIDMKCgojIDc1ICIvdXNyL2luY2x1ZGUvc3RkaW8u aCIgMwoKCiAKCnR5cGVkZWYgX0dfZnBvc190IGZwb3NfdDsKCgoKCgoKCiAKCgoKCgogCgoKCgoK IAoKCgoKCgogCgoKCgoKCgogCgoKCgogCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9z dGRpb19saW0uaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CiMgMTI4ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMiAzCgoKCiAKZXh0ZXJuIEZJTEUgKnN0ZGlu OwkJIApleHRlcm4gRklMRSAqc3Rkb3V0OwkJIApleHRlcm4gRklMRSAqc3RkZXJyOwkJIAogCgoK CgogCmV4dGVybiBpbnQgcmVtb3ZlIChfX2NvbnN0IGNoYXIgKl9fZmlsZW5hbWUpIHRocm93ICgp IDsKIApleHRlcm4gaW50IHJlbmFtZSAoX19jb25zdCBjaGFyICpfX29sZCwgX19jb25zdCBjaGFy ICpfX25ldykgdGhyb3cgKCkgOwoKCiAKCmV4dGVybiBGSUxFICp0bXBmaWxlICh2b2lkKSB0aHJv dyAoKSA7CgoKCgoKCgoKCgogCmV4dGVybiBjaGFyICp0bXBuYW0gKGNoYXIgKl9fcykgdGhyb3cg KCkgOwoKCiAKCmV4dGVybiBjaGFyICp0bXBuYW1fciAoY2hhciAqX19zKSB0aHJvdyAoKSA7CgoK CgogCgoKCgoKCmV4dGVybiBjaGFyICp0ZW1wbmFtIChfX2NvbnN0IGNoYXIgKl9fZGlyLCBfX2Nv bnN0IGNoYXIgKl9fcGZ4KQogICAgIHRocm93ICgpICAgOwoKCgogCmV4dGVybiBpbnQgZmNsb3Nl IChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwogCmV4dGVybiBpbnQgZmZsdXNoIChGSUxFICpf X3N0cmVhbSkgdGhyb3cgKCkgOwoKCiAKZXh0ZXJuIGludCBmZmx1c2hfdW5sb2NrZWQgKEZJTEUg Kl9fc3RyZWFtKSB0aHJvdyAoKSA7CgoKCgoKCgoKCiAKZXh0ZXJuIEZJTEUgKmZvcGVuIChfX2Nv bnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwKCQkgICAgX19jb25zdCBjaGFyICpfX3Jl c3RyaWN0IF9fbW9kZXMpIHRocm93ICgpIDsKIApleHRlcm4gRklMRSAqZnJlb3BlbiAoX19jb25z dCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZW5hbWUsCgkJICAgICAgX19jb25zdCBjaGFyICpfX3Jl c3RyaWN0IF9fbW9kZXMsCgkJICAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cg KCkgOwojIDIxOSAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoKCgoKCgoKCiAKZXh0ZXJuIEZJ TEUgKmZkb3BlbiAoaW50IF9fZmQsIF9fY29uc3QgY2hhciAqX19tb2RlcykgdGhyb3cgKCkgOwoK CiMgMjQ4ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMwoKCgogCgpleHRlcm4gdm9pZCBzZXRidWYg KEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYpIHRocm93 ICgpIDsKIAoKCmV4dGVybiBpbnQgc2V0dmJ1ZiAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwg Y2hhciAqX19yZXN0cmljdCBfX2J1ZiwKCQkgICAgaW50IF9fbW9kZXMsIHNpemVfdCBfX24pIHRo cm93ICgpIDsKCgogCgpleHRlcm4gdm9pZCBzZXRidWZmZXIgKEZJTEUgKl9fcmVzdHJpY3QgX19z dHJlYW0sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCgkJICAgICAgIHNpemVfdCBfX3NpemUpIHRo cm93ICgpIDsKCiAKZXh0ZXJuIHZvaWQgc2V0bGluZWJ1ZiAoRklMRSAqX19zdHJlYW0pIHRocm93 ICgpIDsKCgoKIApleHRlcm4gaW50IGZwcmludGYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0s CgkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSB0aHJvdyAoKSA7 CiAKZXh0ZXJuIGludCBwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwg Li4uKSB0aHJvdyAoKSA7CiAKZXh0ZXJuIGludCBzcHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9f cywKCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIHRocm93ICgp IDsKCiAKZXh0ZXJuIGludCB2ZnByaW50ZiAoRklMRSAqX19yZXN0cmljdCBfX3MsIF9fY29uc3Qg Y2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwKCQkgICAgIF9fZ251Y192YV9saXN0ICBfX2FyZykg dGhyb3cgKCkgOwogCmV4dGVybiBpbnQgdnByaW50ZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0 IF9fZm9ybWF0LCBfX2dudWNfdmFfbGlzdCAgX19hcmcpCiAgICAgdGhyb3cgKCkgOwogCmV4dGVy biBpbnQgdnNwcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVz dHJpY3QgX19mb3JtYXQsCgkJICAgICBfX2dudWNfdmFfbGlzdCAgX19hcmcpIHRocm93ICgpIDsK CgogCmV4dGVybiBpbnQgc25wcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19t YXhsZW4sCgkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikKICAg ICB0aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQp KSk7CgpleHRlcm4gaW50IHZzbnByaW50ZiAoY2hhciAqX19yZXN0cmljdCBfX3MsIHNpemVfdCBf X21heGxlbiwKCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIF9fZ251 Y192YV9saXN0ICBfX2FyZykKICAgICB0aHJvdyAoKSAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0 X18gKF9fcHJpbnRmX18sIDMsIDApKSk7CgoKIyAzMjAgIi91c3IvaW5jbHVkZS9zdGRpby5oIiAz CgoKCiAKZXh0ZXJuIGludCBmc2NhbmYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCgkJICAg X19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIHRocm93ICgpIDsKIApleHRl cm4gaW50IHNjYW5mIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgdGhy b3cgKCkgOwogCmV4dGVybiBpbnQgc3NjYW5mIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19z LAoJCSAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSB0aHJvdyAoKSA7 CgojIDM0NiAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoKIApleHRlcm4gaW50IGZnZXRjIChG SUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwpleHRlcm4gaW50IGdldGMgKEZJTEUgKl9fc3RyZWFt KSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgZ2V0Y2hhciAodm9pZCkgdGhyb3cgKCkgOwoKIAoK CgoKIApleHRlcm4gaW50IGdldGNfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7 CmV4dGVybiBpbnQgZ2V0Y2hhcl91bmxvY2tlZCAodm9pZCkgdGhyb3cgKCkgOwoKCgogCmV4dGVy biBpbnQgZmdldGNfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CgoKCiAKZXh0 ZXJuIGludCBmcHV0YyAoaW50IF9fYywgRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKZXh0ZXJu IGludCBwdXRjIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoKIApleHRlcm4g aW50IHB1dGNoYXIgKGludCBfX2MpIHRocm93ICgpIDsKCiAKCgoKCiAKZXh0ZXJuIGludCBmcHV0 Y191bmxvY2tlZCAoaW50IF9fYywgRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKCgoKIApleHRl cm4gaW50IHB1dGNfdW5sb2NrZWQgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7 CmV4dGVybiBpbnQgcHV0Y2hhcl91bmxvY2tlZCAoaW50IF9fYykgdGhyb3cgKCkgOwoKCgoKIApl eHRlcm4gaW50IGdldHcgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQg cHV0dyAoaW50IF9fdywgRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKCgoKIApleHRlcm4gY2hh ciAqZmdldHMgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBpbnQgX19uLCBGSUxFICpfX3Jlc3RyaWN0 IF9fc3RyZWFtKQogICAgIHRocm93ICgpIDsKCgoKCgoKCiAKCmV4dGVybiBjaGFyICpnZXRzIChj aGFyICpfX3MpIHRocm93ICgpIDsKCgojIDQzNiAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoK IApleHRlcm4gaW50IGZwdXRzIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLCBGSUxFICpf X3Jlc3RyaWN0IF9fc3RyZWFtKQogICAgIHRocm93ICgpIDsKCgoKCgoKCiAKZXh0ZXJuIGludCBw dXRzIChfX2NvbnN0IGNoYXIgKl9fcykgdGhyb3cgKCkgOwoKCiAKZXh0ZXJuIGludCB1bmdldGMg KGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CgoKIApleHRlcm4gc2l6ZV90IGZy ZWFkICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLAoJCSAgICAgc2l6ZV90 IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgdGhyb3cgKCkgOwogCmV4dGVybiBzaXpl X3QgZndyaXRlIChfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUs CgkJICAgICAgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3MpIHRocm93ICgpIDsKCgog CmV4dGVybiBzaXplX3QgZnJlYWRfdW5sb2NrZWQgKHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNp emVfdCBfX3NpemUsCgkJCSAgICAgIHNpemVfdCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJl YW0pIHRocm93ICgpIDsKZXh0ZXJuIHNpemVfdCBmd3JpdGVfdW5sb2NrZWQgKF9fY29uc3Qgdm9p ZCAqX19yZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKCQkJICAgICAgIHNpemVfdCBfX24s IEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIHRocm93ICgpIDsKCgoKIApleHRlcm4gaW50IGZz ZWVrIChGSUxFICpfX3N0cmVhbSwgbG9uZyBpbnQgX19vZmYsIGludCBfX3doZW5jZSkgdGhyb3cg KCkgOwogCmV4dGVybiBsb25nIGludCBmdGVsbCAoRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsK IApleHRlcm4gdm9pZCByZXdpbmQgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CgogCgoKCgoK CgoKCgoKCiAKZXh0ZXJuIGludCBmZ2V0cG9zIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBm cG9zX3QgKl9fcmVzdHJpY3QgX19wb3MpCiAgICAgdGhyb3cgKCkgOwogCmV4dGVybiBpbnQgZnNl dHBvcyAoRklMRSAqX19zdHJlYW0sIF9fY29uc3QgZnBvc190ICpfX3BvcykgdGhyb3cgKCkgOwoj IDUxOSAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoKCgoKCgoKCiAKZXh0ZXJuIHZvaWQgY2xl YXJlcnIgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CiAKZXh0ZXJuIGludCBmZW9mIChGSUxF ICpfX3N0cmVhbSkgdGhyb3cgKCkgOwogCmV4dGVybiBpbnQgZmVycm9yIChGSUxFICpfX3N0cmVh bSkgdGhyb3cgKCkgOwoKCiAKZXh0ZXJuIHZvaWQgY2xlYXJlcnJfdW5sb2NrZWQgKEZJTEUgKl9f c3RyZWFtKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQgZmVvZl91bmxvY2tlZCAoRklMRSAqX19zdHJl YW0pIHRocm93ICgpIDsKZXh0ZXJuIGludCBmZXJyb3JfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFt KSB0aHJvdyAoKSA7CgoKCiAKZXh0ZXJuIHZvaWQgcGVycm9yIChfX2NvbnN0IGNoYXIgKl9fcykg dGhyb3cgKCkgOwoKIAoKCmV4dGVybiBpbnQgc3lzX25lcnI7CmV4dGVybiBfX2NvbnN0IGNoYXIg Kl9fY29uc3Qgc3lzX2Vycmxpc3RbXTsKCgoKCgoKCgogCmV4dGVybiBpbnQgZmlsZW5vIChGSUxF ICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoKCgogCmV4dGVybiBpbnQgZmlsZW5vX3VubG9ja2VkIChG SUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoKCgoKCiAKZXh0ZXJuIEZJTEUgKnBvcGVuIChfX2Nv bnN0IGNoYXIgKl9fY29tbWFuZCwgX19jb25zdCBjaGFyICpfX21vZGVzKSB0aHJvdyAoKSA7Cgog CmV4dGVybiBpbnQgcGNsb3NlIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoKCgoKIApleHRl cm4gY2hhciAqY3Rlcm1pZCAoY2hhciAqX19zKSB0aHJvdyAoKSA7CgoKCgoKCgoKCiMgNjAxICIv dXNyL2luY2x1ZGUvc3RkaW8uaCIgMwoKCgoKIAoKIApleHRlcm4gdm9pZCBmbG9ja2ZpbGUgKEZJ TEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CgogCgpleHRlcm4gaW50IGZ0cnlsb2NrZmlsZSAoRklM RSAqX19zdHJlYW0pIHRocm93ICgpIDsKCiAKZXh0ZXJuIHZvaWQgZnVubG9ja2ZpbGUgKEZJTEUg Kl9fc3RyZWFtKSB0aHJvdyAoKSA7CgoKCgoKCgoKCgogCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0 cy9zdGRpby5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKIApp bmxpbmUgIGludAp2cHJpbnRmIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mbXQsIF9fZ251 Y192YV9saXN0ICBfX2FyZykgdGhyb3cgKCkgCnsKICByZXR1cm4gdmZwcmludGYgKHN0ZG91dCAs IF9fZm10LCBfX2FyZyk7Cn0KCiAKaW5saW5lICBpbnQKZ2V0Y2hhciAodm9pZCkgdGhyb3cgKCkg CnsKICByZXR1cm4gX0lPX2dldGMgKHN0ZGluICk7Cn0KCgoKIAppbmxpbmUgIGludApnZXRjX3Vu bG9ja2VkIChGSUxFICpfX2ZwKSB0aHJvdyAoKSAKewogIHJldHVybiAoKCBfX2ZwICktPl9JT19y ZWFkX3B0ciA+PSAoIF9fZnAgKS0+X0lPX3JlYWRfZW5kID8gX191ZmxvdyAoIF9fZnAgKSA6ICoo dW5zaWduZWQgY2hhciAqKSAoIF9fZnAgKS0+X0lPX3JlYWRfcHRyKyspIDsKfQoKIAppbmxpbmUg IGludApnZXRjaGFyX3VubG9ja2VkICh2b2lkKSB0aHJvdyAoKSAKewogIHJldHVybiAoKCBzdGRp biAgKS0+X0lPX3JlYWRfcHRyID49ICggc3RkaW4gICktPl9JT19yZWFkX2VuZCA/IF9fdWZsb3cg KCBzdGRpbiAgKSA6ICoodW5zaWduZWQgY2hhciAqKSAoIHN0ZGluICApLT5fSU9fcmVhZF9wdHIr KykgOwp9CgoKCiAKaW5saW5lICBpbnQKcHV0Y2hhciAoaW50IF9fYykgdGhyb3cgKCkgCnsKICBy ZXR1cm4gX0lPX3B1dGMgKF9fYywgc3Rkb3V0ICk7Cn0KCgoKIAppbmxpbmUgIGludApmcHV0Y191 bmxvY2tlZCAoaW50IF9fYywgRklMRSAqX19zdHJlYW0pIHRocm93ICgpIAp7CiAgcmV0dXJuICgo KCAgX19zdHJlYW0gKS0+X0lPX3dyaXRlX3B0ciA+PSAoICBfX3N0cmVhbSApLT5fSU9fd3JpdGVf ZW5kKSA/IF9fb3ZlcmZsb3cgKCAgX19zdHJlYW0gLCAodW5zaWduZWQgY2hhcikgKCBfX2MgKSkg OiAodW5zaWduZWQgY2hhcikgKCooICBfX3N0cmVhbSApLT5fSU9fd3JpdGVfcHRyKysgPSAoIF9f YyApKSkgOwp9CgoKCgogCmlubGluZSAgaW50CnB1dGNfdW5sb2NrZWQgKGludCBfX2MsIEZJTEUg Kl9fc3RyZWFtKSB0aHJvdyAoKSAKewogIHJldHVybiAoKCggIF9fc3RyZWFtICktPl9JT193cml0 ZV9wdHIgPj0gKCAgX19zdHJlYW0gKS0+X0lPX3dyaXRlX2VuZCkgPyBfX292ZXJmbG93ICggIF9f c3RyZWFtICwgKHVuc2lnbmVkIGNoYXIpICggX19jICkpIDogKHVuc2lnbmVkIGNoYXIpICgqKCAg X19zdHJlYW0gKS0+X0lPX3dyaXRlX3B0cisrID0gKCBfX2MgKSkpIDsKfQoKIAppbmxpbmUgIGlu dApwdXRjaGFyX3VubG9ja2VkIChpbnQgX19jKSB0aHJvdyAoKSAKewogIHJldHVybiAoKCggIHN0 ZG91dCAgKS0+X0lPX3dyaXRlX3B0ciA+PSAoICBzdGRvdXQgICktPl9JT193cml0ZV9lbmQpID8g X19vdmVyZmxvdyAoICBzdGRvdXQgICwgKHVuc2lnbmVkIGNoYXIpICggX19jICkpIDogKHVuc2ln bmVkIGNoYXIpICgqKCAgc3Rkb3V0ICApLT5fSU9fd3JpdGVfcHRyKysgPSAoIF9fYyApKSkgOwp9 CgoKCgoKCgoKCgoKCgoKIAppbmxpbmUgIGludApmZW9mX3VubG9ja2VkIChGSUxFICpfX3N0cmVh bSkgdGhyb3cgKCkgCnsKICByZXR1cm4gKCgoIF9fc3RyZWFtICktPl9mbGFncyAmIDB4MTAgKSAh PSAwKSA7Cn0KCiAKaW5saW5lICBpbnQKZmVycm9yX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkg dGhyb3cgKCkgCnsKICByZXR1cm4gKCgoIF9fc3RyZWFtICktPl9mbGFncyAmIDB4MjAgKSAhPSAw KSA7Cn0KCgoKCgoKIAoKIyAxNTYgIi91c3IvaW5jbHVkZS9iaXRzL3N0ZGlvLmgiIDMKCgojIDE3 MiAiL3Vzci9pbmNsdWRlL2JpdHMvc3RkaW8uaCIgMwoKCiAKCiMgNjI5ICIvdXNyL2luY2x1ZGUv c3RkaW8uaCIgMiAzCgoKCn0gCgoKCgojIDEyMCAiLi4vLi4vamlrZXMvc3JjL3BsYXRmb3JtLmgi IDIKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1 ZGUvbGltaXRzLmgiIDEgMwogCgoKIAoKCgoKCiAKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k0ODYt c3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zeXNsaW1pdHMuaCIgMSAzCiAKCgoKCgojIDEgIi91 c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL2xpbWl0cy5oIiAx IDMKIAoKCiAKCiMgMTE0ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMv aW5jbHVkZS9saW1pdHMuaCIgMwoKCgojIDEgIi91c3IvaW5jbHVkZS9saW1pdHMuaCIgMSAzCiAK CgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCiAKCgoKCgogCgojIDExMyAiL3Vzci9pbmNsdWRl L2xpbWl0cy5oIiAzCgoKCgogIAoKCgoKIyAxNDAgIi91c3IvaW5jbHVkZS9saW1pdHMuaCIgMwoK CgogCgoKCgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3Bvc2l4Ml9saW0uaCIgMSAzCiAKCgoKCgoK CgoKCgoKCgoKCgogCgoKCgoKCgogCgoKIAoKCiAKCgogCgoKIAoKCgogCgoKCiAKCgogCgoKCiAK CgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKIyAxNDggIi91c3IvaW5jbHVk ZS9saW1pdHMuaCIgMiAzCgoKCgoKCiMgMTE3ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1s aW51eC8yLjk1LjMvaW5jbHVkZS9saW1pdHMuaCIgMiAzCgoKCgojIDcgIi91c3IvbGliL2djYy1s aWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N5c2xpbWl0cy5oIiAyIDMKCgojIDEx ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9saW1pdHMu aCIgMiAzCgoKCgoKIAoKCgogCgoKCiAKCgoKCiAKCgoKCgogCgoKCiAKCgoKCgoKCgoKCgoKIAoK IAoKCgoKIAoKCgogCgoKCgoKCgoKIAoKCgogCgoKCgoKCgoKCgoKCgogCgoKCiMgMTA3ICIvdXNy L2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9saW1pdHMuaCIgMwoK CgoKIAoKCgoKCgoKCgojIDEyNCAiLi4vLi4vamlrZXMvc3JjL3BsYXRmb3JtLmgiIDIKCgoKCiMg MSAiL3Vzci9pbmNsdWRlL21hdGguaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoK CmV4dGVybiAiQyIgeyAKCiAKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMvaHVnZV92YWwuaCIgMSAz CiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgogCgojIDgxICIv dXNyL2luY2x1ZGUvYml0cy9odWdlX3ZhbC5oIiAzCgojIDMzICIvdXNyL2luY2x1ZGUvbWF0aC5o IiAyIDMKCgogCgoKCiAKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9tYXRoZGVmLmgiIDEgMwogCgoK CgoKCgoKCgoKCgoKCgoKCgoKCiMgNDEgIi91c3IvaW5jbHVkZS9iaXRzL21hdGhkZWYuaCIgMwoK IyA0MCAiL3Vzci9pbmNsdWRlL21hdGguaCIgMiAzCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCiMg MSAiL3Vzci9pbmNsdWRlL2JpdHMvbWF0aGNhbGxzLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoK CiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKIApleHRlcm4gICBkb3VibGUgICAg ICAgICAgYWNvcyAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAg IGRvdWJsZSAgICAgICAgIF9fYWNvcyAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgp ICAgIDsKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgYXNpbiAgICAgICAgICAoZG91YmxlICBf X3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fYXNpbiAgICAgICAg ICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBkb3VibGUgICAgICAg ICAgYXRhbiAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRv dWJsZSAgICAgICAgIF9fYXRhbiAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAg IDsKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgYXRhbjIgICAgICAgICAgKGRvdWJsZSAgX195 LCBkb3VibGUgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19h dGFuMiAgICAgICAgICAoZG91YmxlICBfX3ksIGRvdWJsZSAgX194KSAgICB0aHJvdyAoKSAgICA7 CgogCmV4dGVybiAgIGRvdWJsZSAgICAgICAgICBjb3MgICAgICAgICAgKGRvdWJsZSAgX194KSAg ICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2NvcyAgICAgICAgICAoZG91 YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgc2lu ICAgICAgICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAg ICAgICAgX19zaW4gICAgICAgICAgKGRvdWJsZSAgX194KSAgICB0aHJvdyAoKSAgICA7CiAKZXh0 ZXJuICAgZG91YmxlICAgICAgICAgIHRhbiAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93 ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fdGFuICAgICAgICAgIChkb3VibGUgIF9f eCkgICAgdGhyb3cgKCkgICAgOwoKCgoKCgoKIAoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAg Y29zaCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJs ZSAgICAgICAgIF9fY29zaCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsK IApleHRlcm4gICBkb3VibGUgICAgICAgICAgc2luaCAgICAgICAgICAoZG91YmxlICBfX3gpICAg IHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fc2luaCAgICAgICAgICAoZG91 YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgdGFu aCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAg ICAgICAgIF9fdGFuaCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKCgog CmV4dGVybiAgIGRvdWJsZSAgICAgICAgICBhY29zaCAgICAgICAgICAoZG91YmxlICBfX3gpICAg IHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fYWNvc2ggICAgICAgICAgKGRv dWJsZSAgX194KSAgICB0aHJvdyAoKSAgICA7CiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGFz aW5oICAgICAgICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91Ymxl ICAgICAgICAgX19hc2luaCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsK IApleHRlcm4gICBkb3VibGUgICAgICAgICAgYXRhbmggICAgICAgICAgKGRvdWJsZSAgX194KSAg ICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2F0YW5oICAgICAgICAgIChk b3VibGUgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKCiAKCiAKZXh0ZXJuICAgZG91YmxlICAgICAg ICAgIGV4cCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRv dWJsZSAgICAgICAgIF9fZXhwICAgICAgICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cgKCkgICAg OwoKCgoKCgoKCiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGZyZXhwICAgICAgICAgIChkb3Vi bGUgIF9feCwgaW50ICpfX2V4cG9uZW50KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUg ICAgICAgICBfX2ZyZXhwICAgICAgICAgIChkb3VibGUgIF9feCwgaW50ICpfX2V4cG9uZW50KSAg ICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGRvdWJsZSAgICAgICAgICBsZGV4cCAgICAgICAg ICAoZG91YmxlICBfX3gsIGludCBfX2V4cG9uZW50KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBk b3VibGUgICAgICAgICBfX2xkZXhwICAgICAgICAgIChkb3VibGUgIF9feCwgaW50IF9fZXhwb25l bnQpICAgIHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGxvZyAgICAg ICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAg IF9fbG9nICAgICAgICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4g ICBkb3VibGUgICAgICAgICAgbG9nMTAgICAgICAgICAgKGRvdWJsZSAgX194KSAgICB0aHJvdyAo KSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2xvZzEwICAgICAgICAgIChkb3VibGUgIF9f eCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgbW9kZiAgICAg ICAgICAoZG91YmxlICBfX3gsIGRvdWJsZSAgKl9faXB0cikgICAgdGhyb3cgKCkgIDsgZXh0ZXJu ICAgZG91YmxlICAgICAgICAgX19tb2RmICAgICAgICAgIChkb3VibGUgIF9feCwgZG91YmxlICAq X19pcHRyKSAgICB0aHJvdyAoKSAgICA7CgoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgZXhw bTEgICAgICAgICAgKGRvdWJsZSAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUg ICAgICAgICBfX2V4cG0xICAgICAgICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cgKCkgICAgOwoK IApleHRlcm4gICBkb3VibGUgICAgICAgICAgbG9nMXAgICAgICAgICAgKGRvdWJsZSAgX194KSAg ICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2xvZzFwICAgICAgICAgIChk b3VibGUgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAg bG9nYiAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJs ZSAgICAgICAgIF9fbG9nYiAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsK CgoKCgoKCgoKCgogCgogCmV4dGVybiAgIGRvdWJsZSAgICAgICAgICBwb3cgICAgICAgICAgKGRv dWJsZSAgX194LCBkb3VibGUgIF9feSkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAg ICAgICAgX19wb3cgICAgICAgICAgKGRvdWJsZSAgX194LCBkb3VibGUgIF9feSkgICAgdGhyb3cg KCkgICAgOwoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgc3FydCAgICAgICAgICAoZG91Ymxl ICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fc3FydCAgICAg ICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKCgogCmV4dGVybiAgIGRvdWJsZSAg ICAgICAgICBoeXBvdCAgICAgICAgICAoZG91YmxlICBfX3gsIGRvdWJsZSAgX195KSAgICB0aHJv dyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2h5cG90ICAgICAgICAgIChkb3VibGUg IF9feCwgZG91YmxlICBfX3kpICAgIHRocm93ICgpICAgIDsKCgoKIApleHRlcm4gICBkb3VibGUg ICAgICAgICAgY2JydCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVy biAgIGRvdWJsZSAgICAgICAgIF9fY2JydCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93 ICgpICAgIDsKCgoKIAoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgY2VpbCAgICAgICAgICAo ZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fY2Vp bCAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAgZG91 YmxlICAgICAgICAgIGZhYnMgICAgICAgICAgKGRvdWJsZSAgX194KSAgICB0aHJvdyAoKSAgIF9f YXR0cmlidXRlX18gKCAgICAoX19jb25zdF9fKSAgKTsgZXh0ZXJuICAgZG91YmxlICAgICAgICAg X19mYWJzICAgICAgICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9f ICggICAgKF9fY29uc3RfXykgICkgIDsKCiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGZsb29y ICAgICAgICAgIChkb3VibGUgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAg ICAgICAgX19mbG9vciAgICAgICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKCiAK ZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGZtb2QgICAgICAgICAgKGRvdWJsZSAgX194LCBkb3Vi bGUgIF9feSkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19mbW9kICAg ICAgICAgIChkb3VibGUgIF9feCwgZG91YmxlICBfX3kpICAgIHRocm93ICgpICAgIDsKCgogCgpl eHRlcm4gIGludCAgICAgX19pc2luZiAgICAgIChkb3VibGUgIF9fdmFsdWUpICB0aHJvdyAoKSAg IF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKCiAKZXh0ZXJuICBpbnQgICAgIF9fZmluaXRl ICAgICAgKGRvdWJsZSAgX192YWx1ZSkgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoKF9fY29u c3RfXykpOwoKCiAKCmV4dGVybiAgaW50ICAgICBpc2luZiAgICAgIChkb3VibGUgIF9fdmFsdWUp ICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKCiAKZXh0ZXJuICBpbnQg ICAgIGZpbml0ZSAgICAgIChkb3VibGUgIF9fdmFsdWUpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRl X18gKChfX2NvbnN0X18pKTsKCiAKCgoKCgpleHRlcm4gICBkb3VibGUgICAgICAgICAgaW5mbmFu ICAgICAgICAgIChpbnQgX19lcnJvcikgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAg KF9fY29uc3RfXykgICk7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9faW5mbmFuICAgICAgICAg IChpbnQgX19lcnJvcikgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3Rf XykgICkgIDsKCiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGRyZW0gICAgICAgICAgKGRvdWJs ZSAgX194LCBkb3VibGUgIF9feSkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAg ICAgX19kcmVtICAgICAgICAgIChkb3VibGUgIF9feCwgZG91YmxlICBfX3kpICAgIHRocm93ICgp ICAgIDsKCgogCmV4dGVybiAgIGRvdWJsZSAgICAgICAgICBzaWduaWZpY2FuZCAgICAgICAgICAo ZG91YmxlICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fc2ln bmlmaWNhbmQgICAgICAgICAgKGRvdWJsZSAgX194KSAgICB0aHJvdyAoKSAgICA7CgoKCiAKZXh0 ZXJuICAgZG91YmxlICAgICAgICAgIGNvcHlzaWduICAgICAgICAgIChkb3VibGUgIF9feCwgZG91 YmxlICBfX3kpICAgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoICAgIChfX2NvbnN0X18pICAp OyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2NvcHlzaWduICAgICAgICAgIChkb3VibGUgIF9f eCwgZG91YmxlICBfX3kpICAgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoICAgIChfX2NvbnN0 X18pICApICA7CgoKCgoKCgoKIApleHRlcm4gIGludCAgICAgX19pc25hbiAgICAgIChkb3VibGUg IF9fdmFsdWUpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKCgogCmV4 dGVybiAgaW50ICAgICBpc25hbiAgICAgIChkb3VibGUgIF9fdmFsdWUpICB0aHJvdyAoKSAgIF9f YXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKCiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIGow ICAgICAgICAgIChkb3VibGUgKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAg ICBfX2owICAgICAgICAgIChkb3VibGUgKSAgICB0aHJvdyAoKSAgICA7CmV4dGVybiAgIGRvdWJs ZSAgICAgICAgICBqMSAgICAgICAgICAoZG91YmxlICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAg ZG91YmxlICAgICAgICAgX19qMSAgICAgICAgICAoZG91YmxlICkgICAgdGhyb3cgKCkgICAgOwpl eHRlcm4gICBkb3VibGUgICAgICAgICAgam4gICAgICAgICAgKGludCwgZG91YmxlICkgICAgdGhy b3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX19qbiAgICAgICAgICAoaW50LCBkb3Vi bGUgKSAgICB0aHJvdyAoKSAgICA7CmV4dGVybiAgIGRvdWJsZSAgICAgICAgICB5MCAgICAgICAg ICAoZG91YmxlICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAgX195MCAg ICAgICAgICAoZG91YmxlICkgICAgdGhyb3cgKCkgICAgOwpleHRlcm4gICBkb3VibGUgICAgICAg ICAgeTEgICAgICAgICAgKGRvdWJsZSApICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAg ICAgICAgIF9feTEgICAgICAgICAgKGRvdWJsZSApICAgIHRocm93ICgpICAgIDsKZXh0ZXJuICAg ZG91YmxlICAgICAgICAgIHluICAgICAgICAgIChpbnQsIGRvdWJsZSApICAgIHRocm93ICgpICA7 IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9feW4gICAgICAgICAgKGludCwgZG91YmxlICkgICAg dGhyb3cgKCkgICAgOwoKCgoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgZXJmICAgICAgICAg IChkb3VibGUgKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2VyZiAg ICAgICAgICAoZG91YmxlICkgICAgdGhyb3cgKCkgICAgOwpleHRlcm4gICBkb3VibGUgICAgICAg ICAgZXJmYyAgICAgICAgICAoZG91YmxlICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91Ymxl ICAgICAgICAgX19lcmZjICAgICAgICAgIChkb3VibGUgKSAgICB0aHJvdyAoKSAgICA7CmV4dGVy biAgIGRvdWJsZSAgICAgICAgICBsZ2FtbWEgICAgICAgICAgKGRvdWJsZSApICAgIHRocm93ICgp ICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fbGdhbW1hICAgICAgICAgIChkb3VibGUgKSAg ICB0aHJvdyAoKSAgICA7CgoKCgoKCgogCmV4dGVybiAgIGRvdWJsZSAgICAgICAgICBnYW1tYSAg ICAgICAgICAoZG91YmxlICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAgICAg X19nYW1tYSAgICAgICAgICAoZG91YmxlICkgICAgdGhyb3cgKCkgICAgOwoKCgogCgoKZXh0ZXJu ICAgZG91YmxlICAgICAgICAgIGxnYW1tYV9yICAgICAgICAgICAgICAoZG91YmxlICwgaW50ICpf X3NpZ25nYW1wKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBfX2xnYW1t YV9yICAgICAgICAgICAgICAoZG91YmxlICwgaW50ICpfX3NpZ25nYW1wKSAgICB0aHJvdyAoKSAg ICA7CgoKCgogCgpleHRlcm4gICBkb3VibGUgICAgICAgICAgcmludCAgICAgICAgICAoZG91Ymxl ICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAgIF9fcmludCAgICAg ICAgICAoZG91YmxlICBfX3gpICAgIHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAgZG91YmxlICAg ICAgICAgIG5leHRhZnRlciAgICAgICAgICAoZG91YmxlICBfX3gsIGRvdWJsZSAgX195KSAgICB0 aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKCAgICAoX19jb25zdF9fKSAgKTsgZXh0ZXJuICAgZG91 YmxlICAgICAgICAgX19uZXh0YWZ0ZXIgICAgICAgICAgKGRvdWJsZSAgX194LCBkb3VibGUgIF9f eSkgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICkgIDsKCgoK CiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIHJlbWFpbmRlciAgICAgICAgICAoZG91YmxlICBf X3gsIGRvdWJsZSAgX195KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBkb3VibGUgICAgICAgICBf X3JlbWFpbmRlciAgICAgICAgICAoZG91YmxlICBfX3gsIGRvdWJsZSAgX195KSAgICB0aHJvdyAo KSAgICA7CgoKIApleHRlcm4gICBkb3VibGUgICAgICAgICAgc2NhbGIgICAgICAgICAgKGRvdWJs ZSAgX194LCBkb3VibGUgIF9fbikgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZG91YmxlICAgICAg ICAgX19zY2FsYiAgICAgICAgICAoZG91YmxlICBfX3gsIGRvdWJsZSAgX19uKSAgICB0aHJvdyAo KSAgICA7CgoKCiAKZXh0ZXJuICAgZG91YmxlICAgICAgICAgIHNjYWxibiAgICAgICAgICAoZG91 YmxlICBfX3gsIGludCBfX24pICAgIHRocm93ICgpICA7IGV4dGVybiAgIGRvdWJsZSAgICAgICAg IF9fc2NhbGJuICAgICAgICAgIChkb3VibGUgIF9feCwgaW50IF9fbikgICAgdGhyb3cgKCkgICAg OwoKCiAKZXh0ZXJuICAgaW50ICAgICAgICBpbG9nYiAgICAgICAgKGRvdWJsZSAgX194KSAgIHRo cm93ICgpICA7IGV4dGVybiAgIGludCAgICAgICAgX19pbG9nYiAgICAgICAgKGRvdWJsZSAgX194 KSAgIHRocm93ICgpICAgOwoKCiMgMzQxICIvdXNyL2luY2x1ZGUvYml0cy9tYXRoY2FsbHMuaCIg MwoKIyA2MyAiL3Vzci9pbmNsdWRlL21hdGguaCIgMiAzCgoKCgoKCgogCgoKCgoKCgoKCgoKIyAx ICIvdXNyL2luY2x1ZGUvYml0cy9tYXRoY2FsbHMuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoK IAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgogCmV4dGVybiAgIGZsb2F0ICAgICAg ICAgIGFjb3NmICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBm bG9hdCAgICAgICAgIF9fYWNvc2YgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICAg IDsKIApleHRlcm4gICBmbG9hdCAgICAgICAgICBhc2luZiAgICAgICAgIChmbG9hdCAgIF9feCkg ICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2FzaW5mICAgICAgICAgKGZs b2F0ICAgX194KSAgICB0aHJvdyAoKSAgICA7CiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgYXRh bmYgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAg ICAgICAgX19hdGFuZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICAgOwogCmV4 dGVybiAgIGZsb2F0ICAgICAgICAgIGF0YW4yZiAgICAgICAgIChmbG9hdCAgIF9feSwgZmxvYXQg ICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19hdGFuMmYgICAg ICAgICAoZmxvYXQgICBfX3ksIGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVy biAgIGZsb2F0ICAgICAgICAgIGNvc2YgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgp ICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19jb3NmICAgICAgICAgKGZsb2F0ICAgX194KSAg ICB0aHJvdyAoKSAgICA7CiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgc2luZiAgICAgICAgIChm bG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX3NpbmYg ICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4gICBmbG9hdCAg ICAgICAgICB0YW5mICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4g ICBmbG9hdCAgICAgICAgIF9fdGFuZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkg ICAgOwoKCgoKCgoKIAoKIApleHRlcm4gICBmbG9hdCAgICAgICAgICBjb3NoZiAgICAgICAgIChm bG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2Nvc2hm ICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgICA7CiAKZXh0ZXJuICAgZmxvYXQg ICAgICAgICAgc2luaGYgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVy biAgIGZsb2F0ICAgICAgICAgX19zaW5oZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cg KCkgICAgOwogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIHRhbmhmICAgICAgICAgKGZsb2F0ICAg X194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fdGFuaGYgICAgICAg ICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICAgIDsKCgogCmV4dGVybiAgIGZsb2F0ICAgICAg ICAgIGFjb3NoZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAg ZmxvYXQgICAgICAgICBfX2Fjb3NoZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkg ICAgOwogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIGFzaW5oZiAgICAgICAgIChmbG9hdCAgIF9f eCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2FzaW5oZiAgICAgICAg IChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICAgOwogCmV4dGVybiAgIGZsb2F0ICAgICAgICAg IGF0YW5oZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxv YXQgICAgICAgICBfX2F0YW5oZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICAg OwoKCiAKCiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgZXhwZiAgICAgICAgIChmbG9hdCAgIF9f eCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2V4cGYgICAgICAgICAo ZmxvYXQgICBfX3gpICAgIHRocm93ICgpICAgIDsKCgoKCgoKCgogCmV4dGVybiAgIGZsb2F0ICAg ICAgICAgIGZyZXhwZiAgICAgICAgIChmbG9hdCAgIF9feCwgaW50ICpfX2V4cG9uZW50KSAgICB0 aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fZnJleHBmICAgICAgICAgKGZsb2F0 ICAgX194LCBpbnQgKl9fZXhwb25lbnQpICAgIHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAgZmxv YXQgICAgICAgICAgbGRleHBmICAgICAgICAgKGZsb2F0ICAgX194LCBpbnQgX19leHBvbmVudCkg ICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2xkZXhwZiAgICAgICAgIChm bG9hdCAgIF9feCwgaW50IF9fZXhwb25lbnQpICAgIHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAg ZmxvYXQgICAgICAgICAgbG9nZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsg ZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2xvZ2YgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRo cm93ICgpICAgIDsKCiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgbG9nMTBmICAgICAgICAgKGZs b2F0ICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fbG9nMTBm ICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGZsb2F0 ICAgICAgICAgIG1vZGZmICAgICAgICAgKGZsb2F0ICAgX194LCBmbG9hdCAgICpfX2lwdHIpICAg IHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19tb2RmZiAgICAgICAgIChmbG9h dCAgIF9feCwgZmxvYXQgICAqX19pcHRyKSAgICB0aHJvdyAoKSAgICA7CgoKIApleHRlcm4gICBm bG9hdCAgICAgICAgICBleHBtMWYgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICA7 IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19leHBtMWYgICAgICAgICAoZmxvYXQgICBfX3gpICAg IHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgbG9nMXBmICAgICAgICAg KGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fbG9n MXBmICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGZs b2F0ICAgICAgICAgIGxvZ2JmICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgOyBl eHRlcm4gICBmbG9hdCAgICAgICAgIF9fbG9nYmYgICAgICAgICAoZmxvYXQgICBfX3gpICAgIHRo cm93ICgpICAgIDsKCgoKCgoKCgoKCgogCgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIHBvd2Yg ICAgICAgICAoZmxvYXQgICBfX3gsIGZsb2F0ICAgX195KSAgICB0aHJvdyAoKSAgOyBleHRlcm4g ICBmbG9hdCAgICAgICAgIF9fcG93ZiAgICAgICAgIChmbG9hdCAgIF9feCwgZmxvYXQgICBfX3kp ICAgIHRocm93ICgpICAgIDsKCiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgc3FydGYgICAgICAg ICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19z cXJ0ZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKCiAKZXh0ZXJuICAg ZmxvYXQgICAgICAgICAgaHlwb3RmICAgICAgICAgKGZsb2F0ICAgX194LCBmbG9hdCAgIF9feSkg ICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2h5cG90ZiAgICAgICAgIChm bG9hdCAgIF9feCwgZmxvYXQgICBfX3kpICAgIHRocm93ICgpICAgIDsKCgoKIApleHRlcm4gICBm bG9hdCAgICAgICAgICBjYnJ0ZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsg ZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2NicnRmICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0 aHJvdyAoKSAgICA7CgoKCiAKCiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgY2VpbGYgICAgICAg ICAoZmxvYXQgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19j ZWlsZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBm bG9hdCAgICAgICAgICBmYWJzZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICBf X2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICk7IGV4dGVybiAgIGZsb2F0ICAgICAgICAg X19mYWJzZiAgICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9f ICggICAgKF9fY29uc3RfXykgICkgIDsKCiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgZmxvb3Jm ICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAg ICAgIF9fZmxvb3JmICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgICA7CgogCmV4 dGVybiAgIGZsb2F0ICAgICAgICAgIGZtb2RmICAgICAgICAgKGZsb2F0ICAgX194LCBmbG9hdCAg IF9feSkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2Ztb2RmICAgICAg ICAgKGZsb2F0ICAgX194LCBmbG9hdCAgIF9feSkgICAgdGhyb3cgKCkgICAgOwoKCiAKCmV4dGVy biAgaW50ICAgIF9faXNpbmZmICAgICAoZmxvYXQgICBfX3ZhbHVlKSAgdGhyb3cgKCkgICBfX2F0 dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CgogCmV4dGVybiAgaW50ICAgIF9fZmluaXRlZiAgICAg KGZsb2F0ICAgX192YWx1ZSkgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykp OwoKCiAKCmV4dGVybiAgaW50ICAgIGlzaW5mZiAgICAgKGZsb2F0ICAgX192YWx1ZSkgIHRocm93 ICgpICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKIApleHRlcm4gIGludCAgICBmaW5p dGVmICAgICAoZmxvYXQgICBfX3ZhbHVlKSAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICgoX19j b25zdF9fKSk7CgogCgoKCgoKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgaW5mbmFuZiAgICAgICAg IChpbnQgX19lcnJvcikgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3Rf XykgICk7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19pbmZuYW5mICAgICAgICAgKGludCBfX2Vy cm9yKSAgICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKCAgICAoX19jb25zdF9fKSAgKSAgOwoK IApleHRlcm4gICBmbG9hdCAgICAgICAgICBkcmVtZiAgICAgICAgIChmbG9hdCAgIF9feCwgZmxv YXQgICBfX3kpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19kcmVtZiAg ICAgICAgIChmbG9hdCAgIF9feCwgZmxvYXQgICBfX3kpICAgIHRocm93ICgpICAgIDsKCgogCmV4 dGVybiAgIGZsb2F0ICAgICAgICAgIHNpZ25pZmljYW5kZiAgICAgICAgIChmbG9hdCAgIF9feCkg ICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX3NpZ25pZmljYW5kZiAgICAg ICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKCgogCmV4dGVybiAgIGZsb2F0ICAg ICAgICAgIGNvcHlzaWduZiAgICAgICAgIChmbG9hdCAgIF9feCwgZmxvYXQgICBfX3kpICAgIHRo cm93ICgpICAgX19hdHRyaWJ1dGVfXyAoICAgIChfX2NvbnN0X18pICApOyBleHRlcm4gICBmbG9h dCAgICAgICAgIF9fY29weXNpZ25mICAgICAgICAgKGZsb2F0ICAgX194LCBmbG9hdCAgIF9feSkg ICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICkgIDsKCgoKCgoK CgogCmV4dGVybiAgaW50ICAgIF9faXNuYW5mICAgICAoZmxvYXQgICBfX3ZhbHVlKSAgdGhyb3cg KCkgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CgoKIApleHRlcm4gIGludCAgICBpc25h bmYgICAgIChmbG9hdCAgIF9fdmFsdWUpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChfX2Nv bnN0X18pKTsKCiAKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgajBmICAgICAgICAgKGZsb2F0ICAp ICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX19qMGYgICAgICAgICAoZmxv YXQgICkgICAgdGhyb3cgKCkgICAgOwpleHRlcm4gICBmbG9hdCAgICAgICAgICBqMWYgICAgICAg ICAoZmxvYXQgICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2oxZiAg ICAgICAgIChmbG9hdCAgKSAgICB0aHJvdyAoKSAgICA7CmV4dGVybiAgIGZsb2F0ICAgICAgICAg IGpuZiAgICAgICAgIChpbnQsIGZsb2F0ICApICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0 ICAgICAgICAgX19qbmYgICAgICAgICAoaW50LCBmbG9hdCAgKSAgICB0aHJvdyAoKSAgICA7CmV4 dGVybiAgIGZsb2F0ICAgICAgICAgIHkwZiAgICAgICAgIChmbG9hdCAgKSAgICB0aHJvdyAoKSAg OyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9feTBmICAgICAgICAgKGZsb2F0ICApICAgIHRocm93 ICgpICAgIDsKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgeTFmICAgICAgICAgKGZsb2F0ICApICAg IHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAgICAgICAgX195MWYgICAgICAgICAoZmxvYXQg ICkgICAgdGhyb3cgKCkgICAgOwpleHRlcm4gICBmbG9hdCAgICAgICAgICB5bmYgICAgICAgICAo aW50LCBmbG9hdCAgKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9feW5m ICAgICAgICAgKGludCwgZmxvYXQgICkgICAgdGhyb3cgKCkgICAgOwoKCgoKIApleHRlcm4gICBm bG9hdCAgICAgICAgICBlcmZmICAgICAgICAgKGZsb2F0ICApICAgIHRocm93ICgpICA7IGV4dGVy biAgIGZsb2F0ICAgICAgICAgX19lcmZmICAgICAgICAgKGZsb2F0ICApICAgIHRocm93ICgpICAg IDsKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgZXJmY2YgICAgICAgICAoZmxvYXQgICkgICAgdGhy b3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX2VyZmNmICAgICAgICAgKGZsb2F0ICAp ICAgIHRocm93ICgpICAgIDsKZXh0ZXJuICAgZmxvYXQgICAgICAgICAgbGdhbW1hZiAgICAgICAg IChmbG9hdCAgKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9hdCAgICAgICAgIF9fbGdhbW1h ZiAgICAgICAgIChmbG9hdCAgKSAgICB0aHJvdyAoKSAgICA7CgoKCgoKCgogCmV4dGVybiAgIGZs b2F0ICAgICAgICAgIGdhbW1hZiAgICAgICAgIChmbG9hdCAgKSAgICB0aHJvdyAoKSAgOyBleHRl cm4gICBmbG9hdCAgICAgICAgIF9fZ2FtbWFmICAgICAgICAgKGZsb2F0ICApICAgIHRocm93ICgp ICAgIDsKCgoKIAoKCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIGxnYW1tYWZfciAgICAgICAgICAg IChmbG9hdCAgLCBpbnQgKl9fc2lnbmdhbXApICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0 ICAgICAgICAgX19sZ2FtbWFmX3IgICAgICAgICAgICAoZmxvYXQgICwgaW50ICpfX3NpZ25nYW1w KSAgICB0aHJvdyAoKSAgICA7CgoKCgogCgpleHRlcm4gICBmbG9hdCAgICAgICAgICByaW50ZiAg ICAgICAgIChmbG9hdCAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQgICAgICAg ICBfX3JpbnRmICAgICAgICAgKGZsb2F0ICAgX194KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVy biAgIGZsb2F0ICAgICAgICAgIG5leHRhZnRlcmYgICAgICAgICAoZmxvYXQgICBfX3gsIGZsb2F0 ICAgX195KSAgICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKCAgICAoX19jb25zdF9fKSAgKTsg ZXh0ZXJuICAgZmxvYXQgICAgICAgICBfX25leHRhZnRlcmYgICAgICAgICAoZmxvYXQgICBfX3gs IGZsb2F0ICAgX195KSAgICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKCAgICAoX19jb25zdF9f KSAgKSAgOwoKCgoKIApleHRlcm4gICBmbG9hdCAgICAgICAgICByZW1haW5kZXJmICAgICAgICAg KGZsb2F0ICAgX194LCBmbG9hdCAgIF9feSkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgZmxvYXQg ICAgICAgICBfX3JlbWFpbmRlcmYgICAgICAgICAoZmxvYXQgICBfX3gsIGZsb2F0ICAgX195KSAg ICB0aHJvdyAoKSAgICA7CgoKIApleHRlcm4gICBmbG9hdCAgICAgICAgICBzY2FsYmYgICAgICAg ICAoZmxvYXQgICBfX3gsIGZsb2F0ICAgX19uKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBmbG9h dCAgICAgICAgIF9fc2NhbGJmICAgICAgICAgKGZsb2F0ICAgX194LCBmbG9hdCAgIF9fbikgICAg dGhyb3cgKCkgICAgOwoKCgogCmV4dGVybiAgIGZsb2F0ICAgICAgICAgIHNjYWxibmYgICAgICAg ICAoZmxvYXQgICBfX3gsIGludCBfX24pICAgIHRocm93ICgpICA7IGV4dGVybiAgIGZsb2F0ICAg ICAgICAgX19zY2FsYm5mICAgICAgICAgKGZsb2F0ICAgX194LCBpbnQgX19uKSAgICB0aHJvdyAo KSAgICA7CgoKIApleHRlcm4gICBpbnQgICAgICAgaWxvZ2JmICAgICAgIChmbG9hdCAgIF9feCkg ICB0aHJvdyAoKSAgOyBleHRlcm4gICBpbnQgICAgICAgX19pbG9nYmYgICAgICAgKGZsb2F0ICAg X194KSAgIHRocm93ICgpICAgOwoKCiMgMzQxICIvdXNyL2luY2x1ZGUvYml0cy9tYXRoY2FsbHMu aCIgMwoKIyA4MiAiL3Vzci9pbmNsdWRlL21hdGguaCIgMiAzCgoKCgoKIAoKCgoKCgoKCgoKCiMg MSAiL3Vzci9pbmNsdWRlL2JpdHMvbWF0aGNhbGxzLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoK CiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKIApleHRlcm4gICBsb25nIGRvdWJs ZSAgICAgICAgICBhY29zbCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkg IDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX2Fjb3NsICAgICAgICAgKGxvbmcgZG91 YmxlICAgX194KSAgICB0aHJvdyAoKSAgICA7CiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAg ICAgYXNpbmwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVy biAgIGxvbmcgZG91YmxlICAgICAgICAgX19hc2lubCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9f eCkgICAgdGhyb3cgKCkgICAgOwogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGF0YW5s ICAgICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25n IGRvdWJsZSAgICAgICAgIF9fYXRhbmwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRo cm93ICgpICAgIDsKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBhdGFuMmwgICAgICAg ICAobG9uZyBkb3VibGUgICBfX3ksIGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgOyBl eHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fYXRhbjJsICAgICAgICAgKGxvbmcgZG91Ymxl ICAgX195LCBsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBs b25nIGRvdWJsZSAgICAgICAgICBjb3NsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0 aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fY29zbCAgICAgICAgIChs b25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgICAgOwogCmV4dGVybiAgIGxvbmcgZG91Ymxl ICAgICAgICAgIHNpbmwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICA7 IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19zaW5sICAgICAgICAgKGxvbmcgZG91Ymxl ICAgX194KSAgICB0aHJvdyAoKSAgICA7CiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAg dGFubCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAg bG9uZyBkb3VibGUgICAgICAgICBfX3RhbmwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAg IHRocm93ICgpICAgIDsKCgoKCgoKCiAKCiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAg Y29zaGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAg IGxvbmcgZG91YmxlICAgICAgICAgX19jb3NobCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkg ICAgdGhyb3cgKCkgICAgOwogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIHNpbmhsICAg ICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRv dWJsZSAgICAgICAgIF9fc2luaGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93 ICgpICAgIDsKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICB0YW5obCAgICAgICAgIChs b25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAg ICAgICBfX3RhbmhsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgICA7 CgoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBhY29zaGwgICAgICAgICAobG9uZyBk b3VibGUgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAg X19hY29zaGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICAgIDsKIApl eHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBhc2luaGwgICAgICAgICAobG9uZyBkb3VibGUg ICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19hc2lu aGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICAgIDsKIApleHRlcm4g ICBsb25nIGRvdWJsZSAgICAgICAgICBhdGFuaGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gp ICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19hdGFuaGwgICAg ICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICAgIDsKCgogCgogCmV4dGVybiAg IGxvbmcgZG91YmxlICAgICAgICAgIGV4cGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAg IHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19leHBsICAgICAgICAg KGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgICA7CgoKCgoKCgoKIApleHRlcm4gICBs b25nIGRvdWJsZSAgICAgICAgICBmcmV4cGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gsIGlu dCAqX19leHBvbmVudCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAg ICBfX2ZyZXhwbCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCwgaW50ICpfX2V4cG9uZW50KSAg ICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGxkZXhwbCAg ICAgICAgIChsb25nIGRvdWJsZSAgIF9feCwgaW50IF9fZXhwb25lbnQpICAgIHRocm93ICgpICA7 IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19sZGV4cGwgICAgICAgICAobG9uZyBkb3Vi bGUgICBfX3gsIGludCBfX2V4cG9uZW50KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGxv bmcgZG91YmxlICAgICAgICAgIGxvZ2wgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRo cm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19sb2dsICAgICAgICAgKGxv bmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGxvbmcgZG91Ymxl ICAgICAgICAgIGxvZzEwbCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkg IDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX2xvZzEwbCAgICAgICAgIChsb25nIGRv dWJsZSAgIF9feCkgICAgdGhyb3cgKCkgICAgOwoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAg ICAgICBtb2RmbCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCwgbG9uZyBkb3VibGUgICAqX19p cHRyKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fbW9kZmwg ICAgICAgICAobG9uZyBkb3VibGUgICBfX3gsIGxvbmcgZG91YmxlICAgKl9faXB0cikgICAgdGhy b3cgKCkgICAgOwoKCiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgZXhwbTFsICAgICAg ICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJs ZSAgICAgICAgIF9fZXhwbTFsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAo KSAgICA7CgogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGxvZzFwbCAgICAgICAgIChs b25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAg ICAgICBfX2xvZzFwbCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgICAg OwoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBsb2dibCAgICAgICAgIChsb25nIGRv dWJsZSAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBf X2xvZ2JsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgICA7CgoKCgoK CgoKCgoKIAoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBwb3dsICAgICAgICAgKGxv bmcgZG91YmxlICAgX194LCBsb25nIGRvdWJsZSAgIF9feSkgICAgdGhyb3cgKCkgIDsgZXh0ZXJu ICAgbG9uZyBkb3VibGUgICAgICAgICBfX3Bvd2wgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gs IGxvbmcgZG91YmxlICAgX195KSAgICB0aHJvdyAoKSAgICA7CgogCmV4dGVybiAgIGxvbmcgZG91 YmxlICAgICAgICAgIHNxcnRsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194KSAgICB0aHJvdyAo KSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fc3FydGwgICAgICAgICAobG9uZyBk b3VibGUgICBfX3gpICAgIHRocm93ICgpICAgIDsKCgogCmV4dGVybiAgIGxvbmcgZG91YmxlICAg ICAgICAgIGh5cG90bCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCwgbG9uZyBkb3VibGUgICBf X3kpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19oeXBvdGwg ICAgICAgICAobG9uZyBkb3VibGUgICBfX3gsIGxvbmcgZG91YmxlICAgX195KSAgICB0aHJvdyAo KSAgICA7CgoKCiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgY2JydGwgICAgICAgICAo bG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAg ICAgICAgX19jYnJ0bCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgICAg OwoKCgogCgogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGNlaWxsICAgICAgICAgKGxv bmcgZG91YmxlICAgX194KSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAg ICAgIF9fY2VpbGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICAgIDsK CiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgZmFic2wgICAgICAgICAobG9uZyBkb3Vi bGUgICBfX3gpICAgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoICAgIChfX2NvbnN0X18pICAp OyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fZmFic2wgICAgICAgICAobG9uZyBkb3Vi bGUgICBfX3gpICAgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoICAgIChfX2NvbnN0X18pICAp ICA7CgogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGZsb29ybCAgICAgICAgIChsb25n IGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAg ICBfX2Zsb29ybCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cgKCkgICAgOwoK IApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBmbW9kbCAgICAgICAgIChsb25nIGRvdWJs ZSAgIF9feCwgbG9uZyBkb3VibGUgICBfX3kpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcg ZG91YmxlICAgICAgICAgX19mbW9kbCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCwgbG9uZyBk b3VibGUgICBfX3kpICAgIHRocm93ICgpICAgIDsKCgogCgpleHRlcm4gIGludCAgICBfX2lzaW5m bCAgICAgKGxvbmcgZG91YmxlICAgX192YWx1ZSkgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAo KF9fY29uc3RfXykpOwoKIApleHRlcm4gIGludCAgICBfX2Zpbml0ZWwgICAgIChsb25nIGRvdWJs ZSAgIF9fdmFsdWUpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKCgog CgpleHRlcm4gIGludCAgICBpc2luZmwgICAgIChsb25nIGRvdWJsZSAgIF9fdmFsdWUpICB0aHJv dyAoKSAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0X18pKTsKCiAKZXh0ZXJuICBpbnQgICAgZmlu aXRlbCAgICAgKGxvbmcgZG91YmxlICAgX192YWx1ZSkgIHRocm93ICgpICAgX19hdHRyaWJ1dGVf XyAoKF9fY29uc3RfXykpOwoKIAoKCgoKCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGlu Zm5hbmwgICAgICAgICAoaW50IF9fZXJyb3IpICAgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAo ICAgIChfX2NvbnN0X18pICApOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9faW5mbmFu bCAgICAgICAgIChpbnQgX19lcnJvcikgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAg KF9fY29uc3RfXykgICkgIDsKCiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgZHJlbWwg ICAgICAgICAobG9uZyBkb3VibGUgICBfX3gsIGxvbmcgZG91YmxlICAgX195KSAgICB0aHJvdyAo KSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fZHJlbWwgICAgICAgICAobG9uZyBk b3VibGUgICBfX3gsIGxvbmcgZG91YmxlICAgX195KSAgICB0aHJvdyAoKSAgICA7CgoKIApleHRl cm4gICBsb25nIGRvdWJsZSAgICAgICAgICBzaWduaWZpY2FuZGwgICAgICAgICAobG9uZyBkb3Vi bGUgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19z aWduaWZpY2FuZGwgICAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICAgIDsK CgoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBjb3B5c2lnbmwgICAgICAgICAobG9u ZyBkb3VibGUgICBfX3gsIGxvbmcgZG91YmxlICAgX195KSAgICB0aHJvdyAoKSAgIF9fYXR0cmli dXRlX18gKCAgICAoX19jb25zdF9fKSAgKTsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBf X2NvcHlzaWdubCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCwgbG9uZyBkb3VibGUgICBfX3kp ICAgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoICAgIChfX2NvbnN0X18pICApICA7CgoKCgoK CgoKIApleHRlcm4gIGludCAgICBfX2lzbmFubCAgICAgKGxvbmcgZG91YmxlICAgX192YWx1ZSkg IHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKCiAKZXh0ZXJuICBpbnQg ICAgaXNuYW5sICAgICAobG9uZyBkb3VibGUgICBfX3ZhbHVlKSAgdGhyb3cgKCkgICBfX2F0dHJp YnV0ZV9fICgoX19jb25zdF9fKSk7CgogCmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGow bCAgICAgICAgIChsb25nIGRvdWJsZSAgKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRv dWJsZSAgICAgICAgIF9fajBsICAgICAgICAgKGxvbmcgZG91YmxlICApICAgIHRocm93ICgpICAg IDsKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgajFsICAgICAgICAgKGxvbmcgZG91Ymxl ICApICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19qMWwgICAg ICAgICAobG9uZyBkb3VibGUgICkgICAgdGhyb3cgKCkgICAgOwpleHRlcm4gICBsb25nIGRvdWJs ZSAgICAgICAgICBqbmwgICAgICAgICAoaW50LCBsb25nIGRvdWJsZSAgKSAgICB0aHJvdyAoKSAg OyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fam5sICAgICAgICAgKGludCwgbG9uZyBk b3VibGUgICkgICAgdGhyb3cgKCkgICAgOwpleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICB5 MGwgICAgICAgICAobG9uZyBkb3VibGUgICkgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBk b3VibGUgICAgICAgICBfX3kwbCAgICAgICAgIChsb25nIGRvdWJsZSAgKSAgICB0aHJvdyAoKSAg ICA7CmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIHkxbCAgICAgICAgIChsb25nIGRvdWJs ZSAgKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9feTFsICAg ICAgICAgKGxvbmcgZG91YmxlICApICAgIHRocm93ICgpICAgIDsKZXh0ZXJuICAgbG9uZyBkb3Vi bGUgICAgICAgICAgeW5sICAgICAgICAgKGludCwgbG9uZyBkb3VibGUgICkgICAgdGhyb3cgKCkg IDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX3lubCAgICAgICAgIChpbnQsIGxvbmcg ZG91YmxlICApICAgIHRocm93ICgpICAgIDsKCgoKCiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAg ICAgICAgZXJmbCAgICAgICAgIChsb25nIGRvdWJsZSAgKSAgICB0aHJvdyAoKSAgOyBleHRlcm4g ICBsb25nIGRvdWJsZSAgICAgICAgIF9fZXJmbCAgICAgICAgIChsb25nIGRvdWJsZSAgKSAgICB0 aHJvdyAoKSAgICA7CmV4dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgIGVyZmNsICAgICAgICAg KGxvbmcgZG91YmxlICApICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91YmxlICAgICAg ICAgX19lcmZjbCAgICAgICAgIChsb25nIGRvdWJsZSAgKSAgICB0aHJvdyAoKSAgICA7CmV4dGVy biAgIGxvbmcgZG91YmxlICAgICAgICAgIGxnYW1tYWwgICAgICAgICAobG9uZyBkb3VibGUgICkg ICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX2xnYW1tYWwgICAg ICAgICAobG9uZyBkb3VibGUgICkgICAgdGhyb3cgKCkgICAgOwoKCgoKCgoKIApleHRlcm4gICBs b25nIGRvdWJsZSAgICAgICAgICBnYW1tYWwgICAgICAgICAobG9uZyBkb3VibGUgICkgICAgdGhy b3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICBfX2dhbW1hbCAgICAgICAgIChs b25nIGRvdWJsZSAgKSAgICB0aHJvdyAoKSAgICA7CgoKCiAKCgpleHRlcm4gICBsb25nIGRvdWJs ZSAgICAgICAgICBsZ2FtbWFsX3IgICAgICAgICAgICAobG9uZyBkb3VibGUgICwgaW50ICpfX3Np Z25nYW1wKSAgICB0aHJvdyAoKSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fbGdh bW1hbF9yICAgICAgICAgICAgKGxvbmcgZG91YmxlICAsIGludCAqX19zaWduZ2FtcCkgICAgdGhy b3cgKCkgICAgOwoKCgoKIAoKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgcmludGwgICAg ICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgIHRocm93ICgpICA7IGV4dGVybiAgIGxvbmcgZG91 YmxlICAgICAgICAgX19yaW50bCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICAgdGhyb3cg KCkgICAgOwoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgICBuZXh0YWZ0ZXJsICAgICAg ICAgKGxvbmcgZG91YmxlICAgX194LCBsb25nIGRvdWJsZSAgIF9feSkgICAgdGhyb3cgKCkgICBf X2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICk7IGV4dGVybiAgIGxvbmcgZG91YmxlICAg ICAgICAgX19uZXh0YWZ0ZXJsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194LCBsb25nIGRvdWJs ZSAgIF9feSkgICAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICggICAgKF9fY29uc3RfXykgICkg IDsKCgoKCiAKZXh0ZXJuICAgbG9uZyBkb3VibGUgICAgICAgICAgcmVtYWluZGVybCAgICAgICAg IChsb25nIGRvdWJsZSAgIF9feCwgbG9uZyBkb3VibGUgICBfX3kpICAgIHRocm93ICgpICA7IGV4 dGVybiAgIGxvbmcgZG91YmxlICAgICAgICAgX19yZW1haW5kZXJsICAgICAgICAgKGxvbmcgZG91 YmxlICAgX194LCBsb25nIGRvdWJsZSAgIF9feSkgICAgdGhyb3cgKCkgICAgOwoKCiAKZXh0ZXJu ICAgbG9uZyBkb3VibGUgICAgICAgICAgc2NhbGJsICAgICAgICAgKGxvbmcgZG91YmxlICAgX194 LCBsb25nIGRvdWJsZSAgIF9fbikgICAgdGhyb3cgKCkgIDsgZXh0ZXJuICAgbG9uZyBkb3VibGUg ICAgICAgICBfX3NjYWxibCAgICAgICAgIChsb25nIGRvdWJsZSAgIF9feCwgbG9uZyBkb3VibGUg ICBfX24pICAgIHRocm93ICgpICAgIDsKCgoKIApleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAg ICBzY2FsYm5sICAgICAgICAgKGxvbmcgZG91YmxlICAgX194LCBpbnQgX19uKSAgICB0aHJvdyAo KSAgOyBleHRlcm4gICBsb25nIGRvdWJsZSAgICAgICAgIF9fc2NhbGJubCAgICAgICAgIChsb25n IGRvdWJsZSAgIF9feCwgaW50IF9fbikgICAgdGhyb3cgKCkgICAgOwoKCiAKZXh0ZXJuICAgaW50 ICAgICAgIGlsb2dibCAgICAgICAobG9uZyBkb3VibGUgICBfX3gpICAgdGhyb3cgKCkgIDsgZXh0 ZXJuICAgaW50ICAgICAgIF9faWxvZ2JsICAgICAgIChsb25nIGRvdWJsZSAgIF9feCkgICB0aHJv dyAoKSAgIDsKCgojIDM0MSAiL3Vzci9pbmNsdWRlL2JpdHMvbWF0aGNhbGxzLmgiIDMKCiMgOTkg Ii91c3IvaW5jbHVkZS9tYXRoLmgiIDIgMwoKCgoKCgoKCgoKCgoKIApleHRlcm4gaW50IHNpZ25n YW07CgoKCiAKIyAyMzYgIi91c3IvaW5jbHVkZS9tYXRoLmgiIDMKCgoKIAp0eXBlZGVmIGVudW0K ewogIF9JRUVFXyA9IC0xLAkgCiAgX1NWSURfLAkgCiAgX1hPUEVOXywJIAogIF9QT1NJWF8sCiAg X0lTT0NfCSAKfSBfTElCX1ZFUlNJT05fVFlQRTsKCiAKCgpleHRlcm4gX0xJQl9WRVJTSU9OX1RZ UEUgX0xJQl9WRVJTSU9OOwoKCgoKIAoKCgoKCnN0cnVjdCBfX2V4Y2VwdGlvbgoKCgogIHsKICAg IGludCB0eXBlOwogICAgY2hhciAqbmFtZTsKICAgIGRvdWJsZSBhcmcxOwogICAgZG91YmxlIGFy ZzI7CiAgICBkb3VibGUgcmV0dmFsOwogIH07CgoKZXh0ZXJuIGludCBtYXRoZXJyIChzdHJ1Y3Qg X19leGNlcHRpb24gKl9fZXhjKSB0aHJvdyAoKTsKCgoKCgoKIAoKCgoKCgoKIAoKCgoKCgoKCgoK CgogCgoKCgoKCgoKCgoKCgoKCgogCgoKIyAzMzggIi91c3IvaW5jbHVkZS9tYXRoLmgiIDMKCgoK IAoKCgoKCgogCgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL21hdGhpbmxpbmUuaCIgMSAzCiAKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxNDYgIi91c3IvaW5jbHVkZS9iaXRzL21hdGhp bmxpbmUuaCIgMwoKCgogCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMjUyICIv dXNyL2luY2x1ZGUvYml0cy9tYXRoaW5saW5lLmgiIDMKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCiAKCl9faW5saW5lICAgZG91YmxlICAgICBfX3NnbiAgICggZG91YmxlICkg dGhyb3cgKCkgOwlfX2lubGluZSAgICBkb3VibGUgICAgICAgIF9fc2duICAgICggIGRvdWJsZSAg ICAgICAgIF9feCAgICkgdGhyb3cgKCkgCXsJICAgICAgICByZXR1cm4gX194ID09IDAuMCA/IDAu MCA6IChfX3ggPiAwLjAgPyAxLjAgOiAtMS4wKSAgIDsJfSAgCV9faW5saW5lICAgZmxvYXQgICAg ICBfX3NnbmYgICAgKCBmbG9hdCApIHRocm93ICgpIDsJX19pbmxpbmUgICAgZmxvYXQgICAgICAg ICBfX3NnbmYgICAgICggIGZsb2F0ICAgICAgICAgX194ICAgKSB0aHJvdyAoKSAJewkgICAgICAg IHJldHVybiBfX3ggPT0gMC4wID8gMC4wIDogKF9feCA+IDAuMCA/IDEuMCA6IC0xLjApICAgOwl9 ICAJX19pbmxpbmUgICBsb25nIGRvdWJsZSAgICAgIF9fc2dubCAgICAoIGxvbmcgZG91YmxlICkg dGhyb3cgKCkgOwlfX2lubGluZSAgICBsb25nIGRvdWJsZSAgICAgICAgIF9fc2dubCAgICAgKCAg bG9uZyBkb3VibGUgICAgICAgICBfX3ggICApIHRocm93ICgpIAl7CSAgICAgICAgcmV0dXJuIF9f eCA9PSAwLjAgPyAwLjAgOiAoX194ID4gMC4wID8gMS4wIDogLTEuMCkgICA7CX0gICAKCgogCiMg NDY2ICIvdXNyL2luY2x1ZGUvYml0cy9tYXRoaW5saW5lLmgiIDMKCgoKCgoKCgoKX19pbmxpbmUg ICBkb3VibGUgICAgIGF0YW4yICAgKCBkb3VibGUgICAgICBfX3kgICwgIGRvdWJsZSAgICAgIF9f eCAgKSB0aHJvdyAoKSAgewkgICAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJX19hc20g X192b2xhdGlsZV9fCSgiZnBhdGFuIgk6ICI9dCIgKF9fdmFsdWUpIDogIjAiIChfX3gpLCAidSIg KF9feSkgOiAic3QoMSkiKTsJcmV0dXJuIF9fdmFsdWUgICA7CX0gCV9faW5saW5lICAgZmxvYXQg ICAgICBhdGFuMmYgICAgKCBmbG9hdCAgICAgIF9feSAgLCAgZmxvYXQgICAgICBfX3ggICkgdGhy b3cgKCkgIHsJICAgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdmFsdWU7CV9fYXNtIF9fdm9sYXRp bGVfXwkoImZwYXRhbiIJOiAiPXQiIChfX3ZhbHVlKSA6ICIwIiAoX194KSwgInUiIChfX3kpIDog InN0KDEpIik7CXJldHVybiBfX3ZhbHVlICAgOwl9IAlfX2lubGluZSAgIGxvbmcgZG91YmxlICAg ICAgYXRhbjJsICAgICggbG9uZyBkb3VibGUgICAgICBfX3kgICwgIGxvbmcgZG91YmxlICAgICAg X194ICApIHRocm93ICgpICB7CSAgICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwlfX2Fz bSBfX3ZvbGF0aWxlX18JKCJmcGF0YW4iCTogIj10IiAoX192YWx1ZSkgOiAiMCIgKF9feCksICJ1 IiAoX195KSA6ICJzdCgxKSIpOwlyZXR1cm4gX192YWx1ZSAgIDsJfSAgCl9faW5saW5lICAgbG9u ZyBkb3VibGUgICAgX19hdGFuMmwgICggbG9uZyBkb3VibGUgICAgX195ICwgIGxvbmcgZG91Ymxl ICAgIF9feCApIHRocm93ICgpICB7CSAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJX19h c20gX192b2xhdGlsZV9fCSgiZnBhdGFuIgk6ICI9dCIgKF9fdmFsdWUpIDogIjAiIChfX3gpLCAi dSIgKF9feSkgOiAic3QoMSkiKTsJcmV0dXJuIF9fdmFsdWUgIDsJfSAKCgpfX2lubGluZSAgIGRv dWJsZSAgICAgZm1vZCAgICggZG91YmxlICAgICAgX194ICAsICBkb3VibGUgICAgICBfX3kgICkg dGhyb3cgKCkgIHsJICAgICAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJCQkJCQkgICAg ICAgIF9fYXNtIF9fdm9sYXRpbGVfXwkJCQkJCQkgICAgICAgICAgKCIxOglmcHJlbVxuXHQiCQkJ CQkJICAgICAgICAgICAiZm5zdHN3CSUlYXhcblx0IgkJCQkJCSAgICAgICAgICAgInNhaGZcblx0 IgkJCQkJCQkJICAgICAgICAgICAianAJMWIiCQkJCQkJCSAgICAgICAgICAgOiAiPXQiIChfX3Zh bHVlKSA6ICIwIiAoX194KSwgInUiIChfX3kpIDogImF4IiwgImNjIik7CQkgICAgICAgIHJldHVy biBfX3ZhbHVlICA7CX0gCV9faW5saW5lICAgZmxvYXQgICAgICBmbW9kZiAgICAoIGZsb2F0ICAg ICAgX194ICAsICBmbG9hdCAgICAgIF9feSAgKSB0aHJvdyAoKSAgewkgICAgICByZWdpc3RlciBs b25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgICAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJ CSAgICAgICAgICAoIjE6CWZwcmVtXG5cdCIJCQkJCQkgICAgICAgICAgICJmbnN0c3cJJSVheFxu XHQiCQkJCQkJICAgICAgICAgICAic2FoZlxuXHQiCQkJCQkJCQkgICAgICAgICAgICJqcAkxYiIJ CQkJCQkJICAgICAgICAgICA6ICI9dCIgKF9fdmFsdWUpIDogIjAiIChfX3gpLCAidSIgKF9feSkg OiAiYXgiLCAiY2MiKTsJCSAgICAgICAgcmV0dXJuIF9fdmFsdWUgIDsJfSAJX19pbmxpbmUgICBs b25nIGRvdWJsZSAgICAgIGZtb2RsICAgICggbG9uZyBkb3VibGUgICAgICBfX3ggICwgIGxvbmcg ZG91YmxlICAgICAgX195ICApIHRocm93ICgpICB7CSAgICAgIHJlZ2lzdGVyIGxvbmcgZG91Ymxl IF9fdmFsdWU7CQkJCQkJICAgICAgICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgICAg ICgiMToJZnByZW1cblx0IgkJCQkJCSAgICAgICAgICAgImZuc3RzdwklJWF4XG5cdCIJCQkJCQkg ICAgICAgICAgICJzYWhmXG5cdCIJCQkJCQkJCSAgICAgICAgICAgImpwCTFiIgkJCQkJCQkgICAg ICAgICAgIDogIj10IiAoX192YWx1ZSkgOiAiMCIgKF9feCksICJ1IiAoX195KSA6ICJheCIsICJj YyIpOwkJICAgICAgICByZXR1cm4gX192YWx1ZSAgOwl9ICAKIyA0ODggIi91c3IvaW5jbHVkZS9i aXRzL21hdGhpbmxpbmUuaCIgMwoKCl9faW5saW5lICAgIGRvdWJsZSAgICAgICAgc3FydCAgICAo ICBkb3VibGUgICBfX3gpIHRocm93ICgpIAl7CXJlZ2lzdGVyICAgZG91YmxlICAgX19yZXN1bHQ7 CV9fYXNtIF9fdm9sYXRpbGVfXyAoICAgICAgImZzcXJ0IiAgICA6ICI9dCIgKF9fcmVzdWx0KSA6 ICAgIjAiIChfX3gpICk7CXJldHVybiBfX3Jlc3VsdDsJfSAgCV9faW5saW5lICAgIGZsb2F0ICAg ICAgICAgc3FydGYgICAgICggIGZsb2F0ICAgX194KSB0aHJvdyAoKSAJewlyZWdpc3RlciAgIGZs b2F0ICAgX19yZXN1bHQ7CV9fYXNtIF9fdm9sYXRpbGVfXyAoICAgICAgImZzcXJ0IiAgICA6ICI9 dCIgKF9fcmVzdWx0KSA6ICAgIjAiIChfX3gpICk7CXJldHVybiBfX3Jlc3VsdDsJfSAgCV9faW5s aW5lICAgIGxvbmcgZG91YmxlICAgICAgICAgc3FydGwgICAgICggIGxvbmcgZG91YmxlICAgX194 KSB0aHJvdyAoKSAJewlyZWdpc3RlciAgIGxvbmcgZG91YmxlICAgX19yZXN1bHQ7CV9fYXNtIF9f dm9sYXRpbGVfXyAoICAgICAgImZzcXJ0IiAgICA6ICI9dCIgKF9fcmVzdWx0KSA6ICAgIjAiIChf X3gpICk7CXJldHVybiBfX3Jlc3VsdDsJfSAgIApfX2lubGluZSAgICBsb25nIGRvdWJsZSAgICAg ICBfX3NxcnRsICAgKCAgbG9uZyBkb3VibGUgICBfX3gpIHRocm93ICgpIAl7CXJlZ2lzdGVyICAg bG9uZyBkb3VibGUgICBfX3Jlc3VsdDsJX19hc20gX192b2xhdGlsZV9fICggICAgImZzcXJ0IiAg IDogIj10IiAoX19yZXN1bHQpIDogICAiMCIgKF9feCkgKTsJcmV0dXJuIF9fcmVzdWx0Owl9ICAK CgpfX2lubGluZSAgIGRvdWJsZSAgICBmYWJzICAoIGRvdWJsZSAgICBfX3ggKSB0aHJvdyAoKSAJ ewkgIHJldHVybiBfX2J1aWx0aW5fZmFicyAoX194KSA7CX0gCl9faW5saW5lICAgZmxvYXQgICAg ZmFic2YgICggZmxvYXQgICAgX194ICkgdGhyb3cgKCkgCXsJICByZXR1cm4gX19idWlsdGluX2Zh YnNmIChfX3gpIDsJfSAKX19pbmxpbmUgICBsb25nIGRvdWJsZSAgICBmYWJzbCAgKCBsb25nIGRv dWJsZSAgICBfX3ggKSB0aHJvdyAoKSAJewkgIHJldHVybiBfX2J1aWx0aW5fZmFic2wgKF9feCkg Owl9IApfX2lubGluZSAgIGxvbmcgZG91YmxlICAgIF9fZmFic2wgICggbG9uZyBkb3VibGUgICAg X194ICkgdGhyb3cgKCkgCXsJICByZXR1cm4gX19idWlsdGluX2ZhYnNsIChfX3gpIDsJfSAKCgoK CgojIDUxNCAiL3Vzci9pbmNsdWRlL2JpdHMvbWF0aGlubGluZS5oIiAzCgoKX19pbmxpbmUgICBk b3VibGUgICAgIGF0YW4gICAoIGRvdWJsZSAgX194KSB0aHJvdyAoKSAJewlyZWdpc3RlciAgZG91 YmxlICBfX3Jlc3VsdDsJX19hc20gX192b2xhdGlsZV9fICggICAgImZsZDE7IGZwYXRhbiIgICA6 ICI9dCIgKF9fcmVzdWx0KSA6ICAgICAiMCIgKF9feCkgOiAic3QoMSkiICApOwlyZXR1cm4gX19y ZXN1bHQ7CX0gCV9faW5saW5lICAgZmxvYXQgICAgICBhdGFuZiAgICAoIGZsb2F0ICBfX3gpIHRo cm93ICgpIAl7CXJlZ2lzdGVyICBmbG9hdCAgX19yZXN1bHQ7CV9fYXNtIF9fdm9sYXRpbGVfXyAo ICAgICJmbGQxOyBmcGF0YW4iICAgOiAiPXQiIChfX3Jlc3VsdCkgOiAgICAgIjAiIChfX3gpIDog InN0KDEpIiAgKTsJcmV0dXJuIF9fcmVzdWx0Owl9IAlfX2lubGluZSAgIGxvbmcgZG91YmxlICAg ICAgYXRhbmwgICAgKCBsb25nIGRvdWJsZSAgX194KSB0aHJvdyAoKSAJewlyZWdpc3RlciAgbG9u ZyBkb3VibGUgIF9fcmVzdWx0OwlfX2FzbSBfX3ZvbGF0aWxlX18gKCAgICAiZmxkMTsgZnBhdGFu IiAgIDogIj10IiAoX19yZXN1bHQpIDogICAgICIwIiAoX194KSA6ICJzdCgxKSIgICk7CXJldHVy biBfX3Jlc3VsdDsJfSAgCgpfX2lubGluZSAgIGxvbmcgZG91YmxlICAgIF9fc2duMWwgICggbG9u ZyBkb3VibGUgKSB0aHJvdyAoKSA7CV9faW5saW5lICAgIGxvbmcgZG91YmxlICAgICAgIF9fc2du MWwgICAoICBsb25nIGRvdWJsZSAgICAgICBfX3ggICkgdGhyb3cgKCkgCXsJICAgICAgX19leHRl bnNpb25fXyB1bmlvbiB7IGxvbmcgZG91YmxlIF9feGxkOyB1bnNpZ25lZCBpbnQgX194aVszXTsg fSBfX24gPSAgICAgICAgICB7IF9feGxkOiBfX3ggfTsJCQkJCQkJICAgICAgICBfX24uX194aVsy XSA9IChfX24uX194aVsyXSAmIDB4ODAwMCkgfCAweDNmZmY7CQkJICAgICAgICBfX24uX194aVsx XSA9IDB4ODAwMDAwMDA7CQkJCQkJICAgICAgICBfX24uX194aVswXSA9IDA7CQkJCQkJCSAgICAg ICAgcmV0dXJuIF9fbi5fX3hsZCAgOwl9ICAKCgoKCgoKCgojIDU0MCAiL3Vzci9pbmNsdWRlL2Jp dHMvbWF0aGlubGluZS5oIiAzCgoKX19pbmxpbmUgICBkb3VibGUgICAgIGZsb29yICAgKCBkb3Vi bGUgICAgICBfX3ggICkgdGhyb3cgKCkgCXsJICAgICAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192 YWx1ZTsJCQkJCQkgICAgICAgIF9fdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgaW50IF9fY3c7CQkJ CQkgICAgICAgIF9fdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgaW50IF9fY3d0bXA7CQkJCSAgICAg ICAgX19hc20gX192b2xhdGlsZSAoImZuc3RjdyAlMCIgOiAiPW0iIChfX2N3KSk7CQkJCSAgICAg ICAgX19jd3RtcCA9IChfX2N3ICYgMHhmM2ZmKSB8IDB4MDQwMDsgIAkJICAgICAgICBfX2FzbSBf X3ZvbGF0aWxlICgiZmxkY3cgJTAiIDogOiAibSIgKF9fY3d0bXApKTsJCQkgICAgICAgIF9fYXNt IF9fdm9sYXRpbGUgKCJmcm5kaW50IiA6ICI9dCIgKF9fdmFsdWUpIDogIjAiIChfX3gpKTsJCSAg ICAgICAgX19hc20gX192b2xhdGlsZSAoImZsZGN3ICUwIiA6IDogIm0iIChfX2N3KSk7CQkJCSAg ICAgICAgcmV0dXJuIF9fdmFsdWUgIDsJfSAJX19pbmxpbmUgICBmbG9hdCAgICAgIGZsb29yZiAg ICAoIGZsb2F0ICAgICAgX194ICApIHRocm93ICgpIAl7CSAgICAgIHJlZ2lzdGVyIGxvbmcgZG91 YmxlIF9fdmFsdWU7CQkJCQkJICAgICAgICBfX3ZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGludCBf X2N3OwkJCQkJICAgICAgICBfX3ZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGludCBfX2N3dG1wOwkJ CQkgICAgICAgIF9fYXNtIF9fdm9sYXRpbGUgKCJmbnN0Y3cgJTAiIDogIj1tIiAoX19jdykpOwkJ CQkgICAgICAgIF9fY3d0bXAgPSAoX19jdyAmIDB4ZjNmZikgfCAweDA0MDA7ICAJCSAgICAgICAg X19hc20gX192b2xhdGlsZSAoImZsZGN3ICUwIiA6IDogIm0iIChfX2N3dG1wKSk7CQkJICAgICAg ICBfX2FzbSBfX3ZvbGF0aWxlICgiZnJuZGludCIgOiAiPXQiIChfX3ZhbHVlKSA6ICIwIiAoX194 KSk7CQkgICAgICAgIF9fYXNtIF9fdm9sYXRpbGUgKCJmbGRjdyAlMCIgOiA6ICJtIiAoX19jdykp OwkJCQkgICAgICAgIHJldHVybiBfX3ZhbHVlICA7CX0gCV9faW5saW5lICAgbG9uZyBkb3VibGUg ICAgICBmbG9vcmwgICAgKCBsb25nIGRvdWJsZSAgICAgIF9feCAgKSB0aHJvdyAoKSAJewkgICAg ICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgICAgX192b2xhdGlsZSB1 bnNpZ25lZCBzaG9ydCBpbnQgX19jdzsJCQkJCSAgICAgICAgX192b2xhdGlsZSB1bnNpZ25lZCBz aG9ydCBpbnQgX19jd3RtcDsJCQkJICAgICAgICBfX2FzbSBfX3ZvbGF0aWxlICgiZm5zdGN3ICUw IiA6ICI9bSIgKF9fY3cpKTsJCQkJICAgICAgICBfX2N3dG1wID0gKF9fY3cgJiAweGYzZmYpIHwg MHgwNDAwOyAgCQkgICAgICAgIF9fYXNtIF9fdm9sYXRpbGUgKCJmbGRjdyAlMCIgOiA6ICJtIiAo X19jd3RtcCkpOwkJCSAgICAgICAgX19hc20gX192b2xhdGlsZSAoImZybmRpbnQiIDogIj10IiAo X192YWx1ZSkgOiAiMCIgKF9feCkpOwkJICAgICAgICBfX2FzbSBfX3ZvbGF0aWxlICgiZmxkY3cg JTAiIDogOiAibSIgKF9fY3cpKTsJCQkJICAgICAgICByZXR1cm4gX192YWx1ZSAgOwl9ICAKIyA1 NTIgIi91c3IvaW5jbHVkZS9iaXRzL21hdGhpbmxpbmUuaCIgMwoKX19pbmxpbmUgICBkb3VibGUg ICAgIGNlaWwgICAoIGRvdWJsZSAgICAgIF9feCAgKSB0aHJvdyAoKSAJewkgICAgICByZWdpc3Rl ciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgICAgX192b2xhdGlsZSB1bnNpZ25lZCBz aG9ydCBpbnQgX19jdzsJCQkJCSAgICAgICAgX192b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBpbnQg X19jd3RtcDsJCQkJICAgICAgICBfX2FzbSBfX3ZvbGF0aWxlICgiZm5zdGN3ICUwIiA6ICI9bSIg KF9fY3cpKTsJCQkJICAgICAgICBfX2N3dG1wID0gKF9fY3cgJiAweGYzZmYpIHwgMHgwODAwOyAg CQkJICAgICAgICBfX2FzbSBfX3ZvbGF0aWxlICgiZmxkY3cgJTAiIDogOiAibSIgKF9fY3d0bXAp KTsJCQkgICAgICAgIF9fYXNtIF9fdm9sYXRpbGUgKCJmcm5kaW50IiA6ICI9dCIgKF9fdmFsdWUp IDogIjAiIChfX3gpKTsJCSAgICAgICAgX19hc20gX192b2xhdGlsZSAoImZsZGN3ICUwIiA6IDog Im0iIChfX2N3KSk7CQkJCSAgICAgICAgcmV0dXJuIF9fdmFsdWUgIDsJfSAJX19pbmxpbmUgICBm bG9hdCAgICAgIGNlaWxmICAgICggZmxvYXQgICAgICBfX3ggICkgdGhyb3cgKCkgCXsJICAgICAg cmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJCQkJCQkgICAgICAgIF9fdm9sYXRpbGUgdW5z aWduZWQgc2hvcnQgaW50IF9fY3c7CQkJCQkgICAgICAgIF9fdm9sYXRpbGUgdW5zaWduZWQgc2hv cnQgaW50IF9fY3d0bXA7CQkJCSAgICAgICAgX19hc20gX192b2xhdGlsZSAoImZuc3RjdyAlMCIg OiAiPW0iIChfX2N3KSk7CQkJCSAgICAgICAgX19jd3RtcCA9IChfX2N3ICYgMHhmM2ZmKSB8IDB4 MDgwMDsgIAkJCSAgICAgICAgX19hc20gX192b2xhdGlsZSAoImZsZGN3ICUwIiA6IDogIm0iIChf X2N3dG1wKSk7CQkJICAgICAgICBfX2FzbSBfX3ZvbGF0aWxlICgiZnJuZGludCIgOiAiPXQiIChf X3ZhbHVlKSA6ICIwIiAoX194KSk7CQkgICAgICAgIF9fYXNtIF9fdm9sYXRpbGUgKCJmbGRjdyAl MCIgOiA6ICJtIiAoX19jdykpOwkJCQkgICAgICAgIHJldHVybiBfX3ZhbHVlICA7CX0gCV9faW5s aW5lICAgbG9uZyBkb3VibGUgICAgICBjZWlsbCAgICAoIGxvbmcgZG91YmxlICAgICAgX194ICAp IHRocm93ICgpIAl7CSAgICAgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdmFsdWU7CQkJCQkJICAg ICAgICBfX3ZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IGludCBfX2N3OwkJCQkJICAgICAgICBfX3Zv bGF0aWxlIHVuc2lnbmVkIHNob3J0IGludCBfX2N3dG1wOwkJCQkgICAgICAgIF9fYXNtIF9fdm9s YXRpbGUgKCJmbnN0Y3cgJTAiIDogIj1tIiAoX19jdykpOwkJCQkgICAgICAgIF9fY3d0bXAgPSAo X19jdyAmIDB4ZjNmZikgfCAweDA4MDA7ICAJCQkgICAgICAgIF9fYXNtIF9fdm9sYXRpbGUgKCJm bGRjdyAlMCIgOiA6ICJtIiAoX19jd3RtcCkpOwkJCSAgICAgICAgX19hc20gX192b2xhdGlsZSAo ImZybmRpbnQiIDogIj10IiAoX192YWx1ZSkgOiAiMCIgKF9feCkpOwkJICAgICAgICBfX2FzbSBf X3ZvbGF0aWxlICgiZmxkY3cgJTAiIDogOiAibSIgKF9fY3cpKTsJCQkJICAgICAgICByZXR1cm4g X192YWx1ZSAgOwl9ICAKIyA1NjMgIi91c3IvaW5jbHVkZS9iaXRzL21hdGhpbmxpbmUuaCIgMwoK CgoKCgoKCl9faW5saW5lICBkb3VibGUKbGRleHAgKGRvdWJsZSBfX3gsIGludCBfX3kpIHRocm93 ICgpIAp7CiAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJX19hc20gX192b2xhdGlsZV9f CSgiZnNjYWxlIgk6ICI9dCIgKF9fdmFsdWUpIDogIjAiIChfX3gpLCAidSIgKChsb25nIGRvdWJs ZSkgX195KSk7CXJldHVybiBfX3ZhbHVlIDsKfQoKCiAKCgoKCgoKIAoKCgpfX2lubGluZSAgIGRv dWJsZSAgICAgbG9nMXAgICAoIGRvdWJsZSAgICAgIF9feCAgKSB0aHJvdyAoKSAJewkgICAgICBy ZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgICAgaWYgKF9fZmFic2wgKF9f eCkgPj0gMS4wIC0gMC41ICogMS40MTQyMTM1NjIzNzMwOTUwNDg4MEwgKQkJCQkgICAgICAgICAg X192YWx1ZSA9IGxvZ2wgKDEuMCArIF9feCk7CQkJCQkJICAgICAgICBlbHNlCQkJCQkJCQkJICAg ICAgICAgIF9fYXNtIF9fdm9sYXRpbGVfXwkJCQkJCQkgICAgICAgICAgICAoImZsZGxuMlxuXHQi CQkJCQkJCSAgICAgICAgICAgICAiZnhjaFxuXHQiCQkJCQkJCSAgICAgICAgICAgICAiZnlsMnhw MSIJCQkJCQkJICAgICAgICAgICAgIDogIj10IiAoX192YWx1ZSkgOiAiMCIgKF9feCkgOiAic3Qo MSkiKTsJCQkJICAgICAgICByZXR1cm4gX192YWx1ZSAgOwl9IAlfX2lubGluZSAgIGZsb2F0ICAg ICAgbG9nMXBmICAgICggZmxvYXQgICAgICBfX3ggICkgdGhyb3cgKCkgCXsJICAgICAgcmVnaXN0 ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJCQkJCQkgICAgICAgIGlmIChfX2ZhYnNsIChfX3gpID49 IDEuMCAtIDAuNSAqIDEuNDE0MjEzNTYyMzczMDk1MDQ4ODBMICkJCQkJICAgICAgICAgIF9fdmFs dWUgPSBsb2dsICgxLjAgKyBfX3gpOwkJCQkJCSAgICAgICAgZWxzZQkJCQkJCQkJCSAgICAgICAg ICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgICAgICAgKCJmbGRsbjJcblx0IgkJCQkJ CQkgICAgICAgICAgICAgImZ4Y2hcblx0IgkJCQkJCQkgICAgICAgICAgICAgImZ5bDJ4cDEiCQkJ CQkJCSAgICAgICAgICAgICA6ICI9dCIgKF9fdmFsdWUpIDogIjAiIChfX3gpIDogInN0KDEpIik7 CQkJCSAgICAgICAgcmV0dXJuIF9fdmFsdWUgIDsJfSAJX19pbmxpbmUgICBsb25nIGRvdWJsZSAg ICAgIGxvZzFwbCAgICAoIGxvbmcgZG91YmxlICAgICAgX194ICApIHRocm93ICgpIAl7CSAgICAg IHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fdmFsdWU7CQkJCQkJICAgICAgICBpZiAoX19mYWJzbCAo X194KSA+PSAxLjAgLSAwLjUgKiAxLjQxNDIxMzU2MjM3MzA5NTA0ODgwTCApCQkJCSAgICAgICAg ICBfX3ZhbHVlID0gbG9nbCAoMS4wICsgX194KTsJCQkJCQkgICAgICAgIGVsc2UJCQkJCQkJCQkg ICAgICAgICAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJCSAgICAgICAgICAgICgiZmxkbG4yXG5c dCIJCQkJCQkJICAgICAgICAgICAgICJmeGNoXG5cdCIJCQkJCQkJICAgICAgICAgICAgICJmeWwy eHAxIgkJCQkJCQkgICAgICAgICAgICAgOiAiPXQiIChfX3ZhbHVlKSA6ICIwIiAoX194KSA6ICJz dCgxKSIpOwkJCQkgICAgICAgIHJldHVybiBfX3ZhbHVlICA7CX0gIAojIDYwMCAiL3Vzci9pbmNs dWRlL2JpdHMvbWF0aGlubGluZS5oIiAzCgoKIApfX2lubGluZSAgIGRvdWJsZSAgICAgYXNpbmgg ICAoIGRvdWJsZSAgICAgIF9feCAgKSB0aHJvdyAoKSAJewkgICAgICByZWdpc3RlciBsb25nIGRv dWJsZSAgX195ID0gX19mYWJzbCAoX194KTsJCQkJICAgICAgICByZXR1cm4gKGxvZzFwbCAoX195 ICogX195IC8gKF9fc3FydGwgKF9feSAqIF9feSArIDEuMCkgKyAxLjApICsgX195KQkgICAgICAJ ICAqIF9fc2duMWwgKF9feCkpICA7CX0gCV9faW5saW5lICAgZmxvYXQgICAgICBhc2luaGYgICAg KCBmbG9hdCAgICAgIF9feCAgKSB0aHJvdyAoKSAJewkgICAgICByZWdpc3RlciBsb25nIGRvdWJs ZSAgX195ID0gX19mYWJzbCAoX194KTsJCQkJICAgICAgICByZXR1cm4gKGxvZzFwbCAoX195ICog X195IC8gKF9fc3FydGwgKF9feSAqIF9feSArIDEuMCkgKyAxLjApICsgX195KQkgICAgICAJICAq IF9fc2duMWwgKF9feCkpICA7CX0gCV9faW5saW5lICAgbG9uZyBkb3VibGUgICAgICBhc2luaGwg ICAgKCBsb25nIGRvdWJsZSAgICAgIF9feCAgKSB0aHJvdyAoKSAJewkgICAgICByZWdpc3RlciBs b25nIGRvdWJsZSAgX195ID0gX19mYWJzbCAoX194KTsJCQkJICAgICAgICByZXR1cm4gKGxvZzFw bCAoX195ICogX195IC8gKF9fc3FydGwgKF9feSAqIF9feSArIDEuMCkgKyAxLjApICsgX195KQkg ICAgICAJICAqIF9fc2duMWwgKF9feCkpICA7CX0gIAoKCgoKX19pbmxpbmUgICBkb3VibGUgICAg IGFjb3NoICAgKCBkb3VibGUgICAgICBfX3ggICkgdGhyb3cgKCkgCXsJICAgICAgcmV0dXJuIGxv Z2wgKF9feCArIF9fc3FydGwgKF9feCAtIDEuMCkgKiBfX3NxcnRsIChfX3ggKyAxLjApKSAgOwl9 IAlfX2lubGluZSAgIGZsb2F0ICAgICAgYWNvc2hmICAgICggZmxvYXQgICAgICBfX3ggICkgdGhy b3cgKCkgCXsJICAgICAgcmV0dXJuIGxvZ2wgKF9feCArIF9fc3FydGwgKF9feCAtIDEuMCkgKiBf X3NxcnRsIChfX3ggKyAxLjApKSAgOwl9IAlfX2lubGluZSAgIGxvbmcgZG91YmxlICAgICAgYWNv c2hsICAgICggbG9uZyBkb3VibGUgICAgICBfX3ggICkgdGhyb3cgKCkgCXsJICAgICAgcmV0dXJu IGxvZ2wgKF9feCArIF9fc3FydGwgKF9feCAtIDEuMCkgKiBfX3NxcnRsIChfX3ggKyAxLjApKSAg Owl9ICAKCgpfX2lubGluZSAgIGRvdWJsZSAgICAgYXRhbmggICAoIGRvdWJsZSAgICAgIF9feCAg KSB0aHJvdyAoKSAJewkgICAgICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3kgPSBfX2ZhYnNsIChf X3gpOwkJCQkgICAgICAgIHJldHVybiAtMC41ICogbG9nMXBsICgtKF9feSArIF9feSkgLyAoMS4w ICsgX195KSkgKiBfX3NnbjFsIChfX3gpICA7CX0gCV9faW5saW5lICAgZmxvYXQgICAgICBhdGFu aGYgICAgKCBmbG9hdCAgICAgIF9feCAgKSB0aHJvdyAoKSAJewkgICAgICByZWdpc3RlciBsb25n IGRvdWJsZSBfX3kgPSBfX2ZhYnNsIChfX3gpOwkJCQkgICAgICAgIHJldHVybiAtMC41ICogbG9n MXBsICgtKF9feSArIF9feSkgLyAoMS4wICsgX195KSkgKiBfX3NnbjFsIChfX3gpICA7CX0gCV9f aW5saW5lICAgbG9uZyBkb3VibGUgICAgICBhdGFuaGwgICAgKCBsb25nIGRvdWJsZSAgICAgIF9f eCAgKSB0aHJvdyAoKSAJewkgICAgICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3kgPSBfX2ZhYnNs IChfX3gpOwkJCQkgICAgICAgIHJldHVybiAtMC41ICogbG9nMXBsICgtKF9feSArIF9feSkgLyAo MS4wICsgX195KSkgKiBfX3NnbjFsIChfX3gpICA7CX0gIAoKCgogCl9faW5saW5lICAgZG91Ymxl ICAgICBoeXBvdCAgICggZG91YmxlICAgICAgX194ICAsICBkb3VibGUgICAgICBfX3kgICkgdGhy b3cgKCkgIHsJICAgIHJldHVybiBfX3NxcnRsIChfX3ggKiBfX3ggKyBfX3kgKiBfX3kpICA7CX0g CV9faW5saW5lICAgZmxvYXQgICAgICBoeXBvdGYgICAgKCBmbG9hdCAgICAgIF9feCAgLCAgZmxv YXQgICAgICBfX3kgICkgdGhyb3cgKCkgIHsJICAgIHJldHVybiBfX3NxcnRsIChfX3ggKiBfX3gg KyBfX3kgKiBfX3kpICA7CX0gCV9faW5saW5lICAgbG9uZyBkb3VibGUgICAgICBoeXBvdGwgICAg KCBsb25nIGRvdWJsZSAgICAgIF9feCAgLCAgbG9uZyBkb3VibGUgICAgICBfX3kgICkgdGhyb3cg KCkgIHsJICAgIHJldHVybiBfX3NxcnRsIChfX3ggKiBfX3ggKyBfX3kgKiBfX3kpICA7CX0gIAoK X19pbmxpbmUgICBkb3VibGUgICAgIGxvZ2IgICAoIGRvdWJsZSAgICAgIF9feCAgKSB0aHJvdyAo KSAJewkgICAgICByZWdpc3RlciBsb25nIGRvdWJsZSBfX3ZhbHVlOwkJCQkJCSAgICAgICAgcmVn aXN0ZXIgbG9uZyBkb3VibGUgX19qdW5rOwkJCQkJCSAgICAgICAgX19hc20gX192b2xhdGlsZV9f CQkJCQkJCSAgICAgICAgICAoImZ4dHJhY3Rcblx0IgkJCQkJCQkgICAgICAgICAgIDogIj10IiAo X19qdW5rKSwgIj11IiAoX192YWx1ZSkgOiAiMCIgKF9feCkpOwkJCSAgICAgICAgcmV0dXJuIF9f dmFsdWUgIDsJfSAJX19pbmxpbmUgICBmbG9hdCAgICAgIGxvZ2JmICAgICggZmxvYXQgICAgICBf X3ggICkgdGhyb3cgKCkgCXsJICAgICAgcmVnaXN0ZXIgbG9uZyBkb3VibGUgX192YWx1ZTsJCQkJ CQkgICAgICAgIHJlZ2lzdGVyIGxvbmcgZG91YmxlIF9fanVuazsJCQkJCQkgICAgICAgIF9fYXNt IF9fdm9sYXRpbGVfXwkJCQkJCQkgICAgICAgICAgKCJmeHRyYWN0XG5cdCIJCQkJCQkJICAgICAg ICAgICA6ICI9dCIgKF9fanVuayksICI9dSIgKF9fdmFsdWUpIDogIjAiIChfX3gpKTsJCQkgICAg ICAgIHJldHVybiBfX3ZhbHVlICA7CX0gCV9faW5saW5lICAgbG9uZyBkb3VibGUgICAgICBsb2di bCAgICAoIGxvbmcgZG91YmxlICAgICAgX194ICApIHRocm93ICgpIAl7CSAgICAgIHJlZ2lzdGVy IGxvbmcgZG91YmxlIF9fdmFsdWU7CQkJCQkJICAgICAgICByZWdpc3RlciBsb25nIGRvdWJsZSBf X2p1bms7CQkJCQkJICAgICAgICBfX2FzbSBfX3ZvbGF0aWxlX18JCQkJCQkJICAgICAgICAgICgi Znh0cmFjdFxuXHQiCQkJCQkJCSAgICAgICAgICAgOiAiPXQiIChfX2p1bmspLCAiPXUiIChfX3Zh bHVlKSA6ICIwIiAoX194KSk7CQkJICAgICAgICByZXR1cm4gX192YWx1ZSAgOwl9ICAKCgoKCgoK CgoKIyA2OTcgIi91c3IvaW5jbHVkZS9iaXRzL21hdGhpbmxpbmUuaCIgMwoKCgoKCl9faW5saW5l ICAgZG91YmxlICAgICBkcmVtICAgKCBkb3VibGUgICAgICBfX3ggICwgIGRvdWJsZSAgICAgIF9f eSAgKSB0aHJvdyAoKSAgewkgICAgICByZWdpc3RlciBkb3VibGUgX192YWx1ZTsJCQkJCQkgICAg ICAgIHJlZ2lzdGVyIGludCBfX2Nsb2JiZXJlZDsJCQkJCQkgICAgICAgIF9fYXNtIF9fdm9sYXRp bGVfXwkJCQkJCQkgICAgICAgICAgKCIxOglmcHJlbTFcblx0IgkJCQkJCSAgICAgICAgICAgImZz dHN3CSUlYXhcblx0IgkJCQkJCSAgICAgICAgICAgInNhaGZcblx0IgkJCQkJCQkJICAgICAgICAg ICAianAJMWIiCQkJCQkJCSAgICAgICAgICAgOiAiPXQiIChfX3ZhbHVlKSwgIj0mYSIgKF9fY2xv YmJlcmVkKSA6ICIwIiAoX194KSwgInUiIChfX3kpIDogImNjIik7ICAgICAgcmV0dXJuIF9fdmFs dWUgIDsJfSAJX19pbmxpbmUgICBmbG9hdCAgICAgIGRyZW1mICAgICggZmxvYXQgICAgICBfX3gg ICwgIGZsb2F0ICAgICAgX195ICApIHRocm93ICgpICB7CSAgICAgIHJlZ2lzdGVyIGRvdWJsZSBf X3ZhbHVlOwkJCQkJCSAgICAgICAgcmVnaXN0ZXIgaW50IF9fY2xvYmJlcmVkOwkJCQkJCSAgICAg ICAgX19hc20gX192b2xhdGlsZV9fCQkJCQkJCSAgICAgICAgICAoIjE6CWZwcmVtMVxuXHQiCQkJ CQkJICAgICAgICAgICAiZnN0c3cJJSVheFxuXHQiCQkJCQkJICAgICAgICAgICAic2FoZlxuXHQi CQkJCQkJCQkgICAgICAgICAgICJqcAkxYiIJCQkJCQkJICAgICAgICAgICA6ICI9dCIgKF9fdmFs dWUpLCAiPSZhIiAoX19jbG9iYmVyZWQpIDogIjAiIChfX3gpLCAidSIgKF9feSkgOiAiY2MiKTsg ICAgICByZXR1cm4gX192YWx1ZSAgOwl9IAlfX2lubGluZSAgIGxvbmcgZG91YmxlICAgICAgZHJl bWwgICAgKCBsb25nIGRvdWJsZSAgICAgIF9feCAgLCAgbG9uZyBkb3VibGUgICAgICBfX3kgICkg dGhyb3cgKCkgIHsJICAgICAgcmVnaXN0ZXIgZG91YmxlIF9fdmFsdWU7CQkJCQkJICAgICAgICBy ZWdpc3RlciBpbnQgX19jbG9iYmVyZWQ7CQkJCQkJICAgICAgICBfX2FzbSBfX3ZvbGF0aWxlX18J CQkJCQkJICAgICAgICAgICgiMToJZnByZW0xXG5cdCIJCQkJCQkgICAgICAgICAgICJmc3Rzdwkl JWF4XG5cdCIJCQkJCQkgICAgICAgICAgICJzYWhmXG5cdCIJCQkJCQkJCSAgICAgICAgICAgImpw CTFiIgkJCQkJCQkgICAgICAgICAgIDogIj10IiAoX192YWx1ZSksICI9JmEiIChfX2Nsb2JiZXJl ZCkgOiAiMCIgKF9feCksICJ1IiAoX195KSA6ICJjYyIpOyAgICAgIHJldHVybiBfX3ZhbHVlICA7 CX0gIAojIDcxMiAiL3Vzci9pbmNsdWRlL2JpdHMvbWF0aGlubGluZS5oIiAzCgoKIApfX2lubGlu ZSAgaW50Cl9fZmluaXRlIChkb3VibGUgX194KSB0aHJvdyAoKSAKewogIHJldHVybiAoX19leHRl bnNpb25fXwoJICAoKCgoKHVuaW9uIHsgZG91YmxlIF9fZDsgaW50IF9faVsyXTsgfSkge19fZDog X194fSkuX19pWzFdCgkgICAgIHwgMHg4MDBmZmZmZnUpICsgMSkgPj4gMzEpKTsKfQoKIAojIDcz MiAiL3Vzci9pbmNsdWRlL2JpdHMvbWF0aGlubGluZS5oIiAzCgoKCiAKCgoKCgoKCgoKCiAKIyA3 NTUgIi91c3IvaW5jbHVkZS9iaXRzL21hdGhpbmxpbmUuaCIgMwoKCgojIDM1MCAiL3Vzci9pbmNs dWRlL21hdGguaCIgMiAzCgoKCgojIDQwOSAiL3Vzci9pbmNsdWRlL21hdGguaCIgMwoKCn0gCgoK CiMgMTI4ICIuLi8uLi9qaWtlcy9zcmMvcGxhdGZvcm0uaCIgMgoKCgoKIyAxICIvdXNyL2xpYi9n Y2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9mbG9hdC5oIiAxIDMKIAoKCgog CgogICAgCgoKICAgIAoKCiAgICAKCgogICAgCgoKICAgIAoKCiAgICAKCgogICAgCgoKICAgIAoK CiAgICAKCgogICAgCgoKICAgIAoKCgogICAgCgoKICAgIAoKCiAgICAKCgogICAgCgoKICAgIAoK CiAgICAKCgogICAgCgoKICAgIAoKCiAgICAKCgoKICAgIAoKCiAgICAKCgogICAgCgoKCnVuaW9u IF9fY29udmVydF9sb25nX2RvdWJsZSB7CiAgdW5zaWduZWQgX19jb252ZXJ0X2xvbmdfZG91Ymxl X2lbNF07CiAgbG9uZyBkb3VibGUgX19jb252ZXJ0X2xvbmdfZG91YmxlX2Q7Cn07CgoKICAgIAoK CiAgICAKCgogICAgCgoKICAgIAoKCiAgICAKCgogICAgCgoKCgojIDEzMiAiLi4vLi4vamlrZXMv c3JjL3BsYXRmb3JtLmgiIDIKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2xhbmdpbmZvLmgiIDEgMwog CgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKIyAxICIvdXNyL2luY2x1ZGUvbmxfdHlwZXMuaCIgMSAz CiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgogCgoKCmV4dGVybiAiQyIgeyAKCiAKdHlwZWRl ZiB2b2lkICpubF9jYXRkOwoKIAp0eXBlZGVmIGludCBubF9pdGVtOwoKIApleHRlcm4gbmxfY2F0 ZCBjYXRvcGVuIChfX2NvbnN0IGNoYXIgKl9fY2F0X25hbWUsIGludCBfX2ZsYWcpIHRocm93ICgp IDsKCiAKCmV4dGVybiBjaGFyICpjYXRnZXRzIChubF9jYXRkIF9fY2F0YWxvZywgaW50IF9fc2V0 LCBpbnQgX19udW1iZXIsCgkJICAgICAgX19jb25zdCBjaGFyICpfX3N0cmluZykgdGhyb3cgKCkg OwoKIApleHRlcm4gaW50IGNhdGNsb3NlIChubF9jYXRkIF9fY2F0YWxvZykgdGhyb3cgKCkgOwoK fSAKCgojIDI0ICIvdXNyL2luY2x1ZGUvbGFuZ2luZm8uaCIgMiAzCgoKIyAxICIvdXNyL2luY2x1 ZGUvYml0cy9sb2NhbGUuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmVudW0Kewog IF9fTENfQ1RZUEUgPSAwLAogIF9fTENfTlVNRVJJQyA9IDEsCiAgX19MQ19USU1FID0gMiwKICBf X0xDX0NPTExBVEUgPSAzLAogIF9fTENfTU9ORVRBUlkgPSA0LAogIF9fTENfTUVTU0FHRVMgPSA1 LAogIF9fTENfQUxMID0gNiwKICBfX0xDX1BBUEVSID0gNywKICBfX0xDX05BTUUgPSA4LAogIF9f TENfQUREUkVTUyA9IDksCiAgX19MQ19URUxFUEhPTkUgPSAxMCwKICBfX0xDX01FQVNVUkVNRU5U ID0gMTEsCiAgX19MQ19JREVOVElGSUNBVElPTiA9IDEyCn07CgoKIyAyNiAiL3Vzci9pbmNsdWRl L2xhbmdpbmZvLmgiIDIgMwoKCgpleHRlcm4gIkMiIHsgCgogCgoKCgoKIAoKCgoKIAplbnVtCnsK ICAgCgogICAKICBBQkRBWV8xID0gKCgoIF9fTENfVElNRSApIDw8IDE2KSB8ICggIDAgKSkgLCAg CgogIEFCREFZXzIsCgogIEFCREFZXzMsCgogIEFCREFZXzQsCgogIEFCREFZXzUsCgogIEFCREFZ XzYsCgogIEFCREFZXzcsCgoKICAgCiAgREFZXzEsCQkJIAoKICBEQVlfMiwJCQkgCgogIERBWV8z LAkJCSAKCiAgREFZXzQsCQkJIAoKICBEQVlfNSwJCQkgCgogIERBWV82LAkJCSAKCiAgREFZXzcs CQkJIAoKCiAgIAogIEFCTU9OXzEsCQkJIAoKICBBQk1PTl8yLAoKICBBQk1PTl8zLAoKICBBQk1P Tl80LAoKICBBQk1PTl81LAoKICBBQk1PTl82LAoKICBBQk1PTl83LAoKICBBQk1PTl84LAoKICBB Qk1PTl85LAoKICBBQk1PTl8xMCwKCiAgQUJNT05fMTEsCgogIEFCTU9OXzEyLAoKCiAgIAogIE1P Tl8xLAkJCSAKCiAgTU9OXzIsCgogIE1PTl8zLAoKICBNT05fNCwKCiAgTU9OXzUsCgogIE1PTl82 LAoKICBNT05fNywKCiAgTU9OXzgsCgogIE1PTl85LAoKICBNT05fMTAsCgogIE1PTl8xMSwKCiAg TU9OXzEyLAoKCiAgQU1fU1RSLAkJCSAKCiAgUE1fU1RSLAkJCSAKCgogIERfVF9GTVQsCQkJIAoK ICBEX0ZNVCwJCQkgCgogIFRfRk1ULAkJCSAKCiAgVF9GTVRfQU1QTSwJCQkgCgoKICBFUkEsCQkJ CSAKCiAgX19FUkFfWUVBUiwJCQkgCgoKCiAgRVJBX0RfRk1ULAkJCSAKCiAgQUxUX0RJR0lUUywJ CQkgCgogIEVSQV9EX1RfRk1ULAkJCSAKCiAgRVJBX1RfRk1ULAkJCSAKCgogIF9OTF9USU1FX0VS QV9OVU1fRU5UUklFUywJIAogIF9OTF9USU1FX0VSQV9FTlRSSUVTLAkJIAoKICBfTkxfV0FCREFZ XzEsCQkgCiAgX05MX1dBQkRBWV8yLAogIF9OTF9XQUJEQVlfMywKICBfTkxfV0FCREFZXzQsCiAg X05MX1dBQkRBWV81LAogIF9OTF9XQUJEQVlfNiwKICBfTkxfV0FCREFZXzcsCgogICAKICBfTkxf V0RBWV8xLAkJIAogIF9OTF9XREFZXzIsCQkgCiAgX05MX1dEQVlfMywJCSAKICBfTkxfV0RBWV80 LAkJIAogIF9OTF9XREFZXzUsCQkgCiAgX05MX1dEQVlfNiwJCSAKICBfTkxfV0RBWV83LAkJIAoK ICAgCiAgX05MX1dBQk1PTl8xLAkJIAogIF9OTF9XQUJNT05fMiwKICBfTkxfV0FCTU9OXzMsCiAg X05MX1dBQk1PTl80LAogIF9OTF9XQUJNT05fNSwKICBfTkxfV0FCTU9OXzYsCiAgX05MX1dBQk1P Tl83LAogIF9OTF9XQUJNT05fOCwKICBfTkxfV0FCTU9OXzksCiAgX05MX1dBQk1PTl8xMCwKICBf TkxfV0FCTU9OXzExLAogIF9OTF9XQUJNT05fMTIsCgogICAKICBfTkxfV01PTl8xLAkJIAogIF9O TF9XTU9OXzIsCiAgX05MX1dNT05fMywKICBfTkxfV01PTl80LAogIF9OTF9XTU9OXzUsCiAgX05M X1dNT05fNiwKICBfTkxfV01PTl83LAogIF9OTF9XTU9OXzgsCiAgX05MX1dNT05fOSwKICBfTkxf V01PTl8xMCwKICBfTkxfV01PTl8xMSwKICBfTkxfV01PTl8xMiwKCiAgX05MX1dBTV9TVFIsCQkg CiAgX05MX1dQTV9TVFIsCQkgCgogIF9OTF9XRF9UX0ZNVCwJCSAKICBfTkxfV0RfRk1ULAkJIAog IF9OTF9XVF9GTVQsCQkgCiAgX05MX1dUX0ZNVF9BTVBNLAkgCgogIF9OTF9XRVJBX1lFQVIsCSAK ICBfTkxfV0VSQV9EX0ZNVCwJIAogIF9OTF9XQUxUX0RJR0lUUywJIAogIF9OTF9XRVJBX0RfVF9G TVQsCSAKICBfTkxfV0VSQV9UX0ZNVCwJIAoKICBfTkxfVElNRV9XRUVLX05EQVlTLAogIF9OTF9U SU1FX1dFRUtfMVNUREFZLAogIF9OTF9USU1FX1dFRUtfMVNUV0VFSywKICBfTkxfVElNRV9GSVJT VF9XRUVLREFZLAogIF9OTF9USU1FX0ZJUlNUX1dPUktEQVksCiAgX05MX1RJTUVfQ0FMX0RJUkVD VElPTiwKICBfTkxfVElNRV9USU1FWk9ORSwKCiAgX0RBVEVfRk1ULAkJIAoKICBfTkxfV19EQVRF X0ZNVCwKCiAgX05MX05VTV9MQ19USU1FLAkgCgogICAKCgogIF9OTF9DT0xMQVRFX05SVUxFUyA9 ICgoKCBfX0xDX0NPTExBVEUgKSA8PCAxNikgfCAoICAwICkpICwKICBfTkxfQ09MTEFURV9SVUxF U0VUUywKICBfTkxfQ09MTEFURV9UQUJMRU1CLAogIF9OTF9DT0xMQVRFX1dFSUdIVE1CLAogIF9O TF9DT0xMQVRFX0VYVFJBTUIsCiAgX05MX0NPTExBVEVfSU5ESVJFQ1RNQiwKICBfTkxfQ09MTEFU RV9HQVAxLAogIF9OTF9DT0xMQVRFX0dBUDIsCiAgX05MX0NPTExBVEVfR0FQMywKICBfTkxfQ09M TEFURV9UQUJMRVdDLAogIF9OTF9DT0xMQVRFX1dFSUdIVFdDLAogIF9OTF9DT0xMQVRFX0VYVFJB V0MsCiAgX05MX0NPTExBVEVfSU5ESVJFQ1RXQywKICBfTkxfQ09MTEFURV9TWU1CX0hBU0hfU0la RU1CLAogIF9OTF9DT0xMQVRFX1NZTUJfVEFCTEVNQiwKICBfTkxfQ09MTEFURV9TWU1CX0VYVFJB TUIsCiAgX05MX0NPTExBVEVfQ09MTFNFUU1CLAogIF9OTF9DT0xMQVRFX0NPTExTRVFXQywKICBf TkxfTlVNX0xDX0NPTExBVEUsCgogICAKCgogIF9OTF9DVFlQRV9DTEFTUyA9ICgoKCBfX0xDX0NU WVBFICkgPDwgMTYpIHwgKCAgMCApKSAsCiAgX05MX0NUWVBFX1RPVVBQRVIsCiAgX05MX0NUWVBF X0dBUDEsCiAgX05MX0NUWVBFX1RPTE9XRVIsCiAgX05MX0NUWVBFX0dBUDIsCiAgX05MX0NUWVBF X0NMQVNTMzIsCiAgX05MX0NUWVBFX0dBUDMsCiAgX05MX0NUWVBFX0dBUDQsCiAgX05MX0NUWVBF X0dBUDUsCiAgX05MX0NUWVBFX0dBUDYsCiAgX05MX0NUWVBFX0NMQVNTX05BTUVTLAogIF9OTF9D VFlQRV9NQVBfTkFNRVMsCiAgX05MX0NUWVBFX1dJRFRILAogIF9OTF9DVFlQRV9NQl9DVVJfTUFY LAogIF9OTF9DVFlQRV9DT0RFU0VUX05BTUUsCiAgQ09ERVNFVCA9IF9OTF9DVFlQRV9DT0RFU0VU X05BTUUsCgogIF9OTF9DVFlQRV9UT1VQUEVSMzIsCiAgX05MX0NUWVBFX1RPTE9XRVIzMiwKICBf TkxfQ1RZUEVfQ0xBU1NfT0ZGU0VULAogIF9OTF9DVFlQRV9NQVBfT0ZGU0VULAogIF9OTF9DVFlQ RV9JTkRJR0lUU19NQl9MRU4sCiAgX05MX0NUWVBFX0lORElHSVRTMF9NQiwKICBfTkxfQ1RZUEVf SU5ESUdJVFMxX01CLAogIF9OTF9DVFlQRV9JTkRJR0lUUzJfTUIsCiAgX05MX0NUWVBFX0lORElH SVRTM19NQiwKICBfTkxfQ1RZUEVfSU5ESUdJVFM0X01CLAogIF9OTF9DVFlQRV9JTkRJR0lUUzVf TUIsCiAgX05MX0NUWVBFX0lORElHSVRTNl9NQiwKICBfTkxfQ1RZUEVfSU5ESUdJVFM3X01CLAog IF9OTF9DVFlQRV9JTkRJR0lUUzhfTUIsCiAgX05MX0NUWVBFX0lORElHSVRTOV9NQiwKICBfTkxf Q1RZUEVfSU5ESUdJVFNfV0NfTEVOLAogIF9OTF9DVFlQRV9JTkRJR0lUUzBfV0MsCiAgX05MX0NU WVBFX0lORElHSVRTMV9XQywKICBfTkxfQ1RZUEVfSU5ESUdJVFMyX1dDLAogIF9OTF9DVFlQRV9J TkRJR0lUUzNfV0MsCiAgX05MX0NUWVBFX0lORElHSVRTNF9XQywKICBfTkxfQ1RZUEVfSU5ESUdJ VFM1X1dDLAogIF9OTF9DVFlQRV9JTkRJR0lUUzZfV0MsCiAgX05MX0NUWVBFX0lORElHSVRTN19X QywKICBfTkxfQ1RZUEVfSU5ESUdJVFM4X1dDLAogIF9OTF9DVFlQRV9JTkRJR0lUUzlfV0MsCiAg X05MX0NUWVBFX09VVERJR0lUMF9NQiwKICBfTkxfQ1RZUEVfT1VURElHSVQxX01CLAogIF9OTF9D VFlQRV9PVVRESUdJVDJfTUIsCiAgX05MX0NUWVBFX09VVERJR0lUM19NQiwKICBfTkxfQ1RZUEVf T1VURElHSVQ0X01CLAogIF9OTF9DVFlQRV9PVVRESUdJVDVfTUIsCiAgX05MX0NUWVBFX09VVERJ R0lUNl9NQiwKICBfTkxfQ1RZUEVfT1VURElHSVQ3X01CLAogIF9OTF9DVFlQRV9PVVRESUdJVDhf TUIsCiAgX05MX0NUWVBFX09VVERJR0lUOV9NQiwKICBfTkxfQ1RZUEVfT1VURElHSVQwX1dDLAog IF9OTF9DVFlQRV9PVVRESUdJVDFfV0MsCiAgX05MX0NUWVBFX09VVERJR0lUMl9XQywKICBfTkxf Q1RZUEVfT1VURElHSVQzX1dDLAogIF9OTF9DVFlQRV9PVVRESUdJVDRfV0MsCiAgX05MX0NUWVBF X09VVERJR0lUNV9XQywKICBfTkxfQ1RZUEVfT1VURElHSVQ2X1dDLAogIF9OTF9DVFlQRV9PVVRE SUdJVDdfV0MsCiAgX05MX0NUWVBFX09VVERJR0lUOF9XQywKICBfTkxfQ1RZUEVfT1VURElHSVQ5 X1dDLAogIF9OTF9DVFlQRV9UUkFOU0xJVF9UQUJfU0laRSwKICBfTkxfQ1RZUEVfVFJBTlNMSVRf RlJPTV9JRFgsCiAgX05MX0NUWVBFX1RSQU5TTElUX0ZST01fVEJMLAogIF9OTF9DVFlQRV9UUkFO U0xJVF9UT19JRFgsCiAgX05MX0NUWVBFX1RSQU5TTElUX1RPX1RCTCwKICBfTkxfQ1RZUEVfVFJB TlNMSVRfREVGQVVMVF9NSVNTSU5HX0xFTiwKICBfTkxfQ1RZUEVfVFJBTlNMSVRfREVGQVVMVF9N SVNTSU5HLAogIF9OTF9DVFlQRV9UUkFOU0xJVF9JR05PUkVfTEVOLAogIF9OTF9DVFlQRV9UUkFO U0xJVF9JR05PUkUsCiAgX05MX0NUWVBFX0VYVFJBX01BUF8xLAogIF9OTF9DVFlQRV9FWFRSQV9N QVBfMiwKICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzMsCiAgX05MX0NUWVBFX0VYVFJBX01BUF80LAog IF9OTF9DVFlQRV9FWFRSQV9NQVBfNSwKICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzYsCiAgX05MX0NU WVBFX0VYVFJBX01BUF83LAogIF9OTF9DVFlQRV9FWFRSQV9NQVBfOCwKICBfTkxfQ1RZUEVfRVhU UkFfTUFQXzksCiAgX05MX0NUWVBFX0VYVFJBX01BUF8xMCwKICBfTkxfQ1RZUEVfRVhUUkFfTUFQ XzExLAogIF9OTF9DVFlQRV9FWFRSQV9NQVBfMTIsCiAgX05MX0NUWVBFX0VYVFJBX01BUF8xMywK ICBfTkxfQ1RZUEVfRVhUUkFfTUFQXzE0LAogIF9OTF9OVU1fTENfQ1RZUEUsCgogICAKCgogIF9f SU5UX0NVUlJfU1lNQk9MID0gKCgoIF9fTENfTU9ORVRBUlkgKSA8PCAxNikgfCAoICAwICkpICwK CgoKICBfX0NVUlJFTkNZX1NZTUJPTCwKCgoKICBfX01PTl9ERUNJTUFMX1BPSU5ULAoKCgogIF9f TU9OX1RIT1VTQU5EU19TRVAsCgoKCiAgX19NT05fR1JPVVBJTkcsCgoKCiAgX19QT1NJVElWRV9T SUdOLAoKCgogIF9fTkVHQVRJVkVfU0lHTiwKCgoKICBfX0lOVF9GUkFDX0RJR0lUUywKCgoKICBf X0ZSQUNfRElHSVRTLAoKCgogIF9fUF9DU19QUkVDRURFUywKCgoKICBfX1BfU0VQX0JZX1NQQUNF LAoKCgogIF9fTl9DU19QUkVDRURFUywKCgoKICBfX05fU0VQX0JZX1NQQUNFLAoKCgogIF9fUF9T SUdOX1BPU04sCgoKCiAgX19OX1NJR05fUE9TTiwKCgoKICBfTkxfTU9ORVRBUllfQ1JOQ1lTVFIs CgogIF9fSU5UX1BfQ1NfUFJFQ0VERVMsCgoKCiAgX19JTlRfUF9TRVBfQllfU1BBQ0UsCgoKCiAg X19JTlRfTl9DU19QUkVDRURFUywKCgoKICBfX0lOVF9OX1NFUF9CWV9TUEFDRSwKCgoKICBfX0lO VF9QX1NJR05fUE9TTiwKCgoKICBfX0lOVF9OX1NJR05fUE9TTiwKCgoKICBfTkxfTU9ORVRBUllf RFVPX0lOVF9DVVJSX1NZTUJPTCwKICBfTkxfTU9ORVRBUllfRFVPX0NVUlJFTkNZX1NZTUJPTCwK ICBfTkxfTU9ORVRBUllfRFVPX0lOVF9GUkFDX0RJR0lUUywKICBfTkxfTU9ORVRBUllfRFVPX0ZS QUNfRElHSVRTLAogIF9OTF9NT05FVEFSWV9EVU9fUF9DU19QUkVDRURFUywKICBfTkxfTU9ORVRB UllfRFVPX1BfU0VQX0JZX1NQQUNFLAogIF9OTF9NT05FVEFSWV9EVU9fTl9DU19QUkVDRURFUywK ICBfTkxfTU9ORVRBUllfRFVPX05fU0VQX0JZX1NQQUNFLAogIF9OTF9NT05FVEFSWV9EVU9fSU5U X1BfQ1NfUFJFQ0VERVMsCiAgX05MX01PTkVUQVJZX0RVT19JTlRfUF9TRVBfQllfU1BBQ0UsCiAg X05MX01PTkVUQVJZX0RVT19JTlRfTl9DU19QUkVDRURFUywKICBfTkxfTU9ORVRBUllfRFVPX0lO VF9OX1NFUF9CWV9TUEFDRSwKICBfTkxfTU9ORVRBUllfRFVPX1BfU0lHTl9QT1NOLAogIF9OTF9N T05FVEFSWV9EVU9fTl9TSUdOX1BPU04sCiAgX05MX01PTkVUQVJZX0RVT19JTlRfUF9TSUdOX1BP U04sCiAgX05MX01PTkVUQVJZX0RVT19JTlRfTl9TSUdOX1BPU04sCiAgX05MX01PTkVUQVJZX1VO T19WQUxJRF9GUk9NLAogIF9OTF9NT05FVEFSWV9VTk9fVkFMSURfVE8sCiAgX05MX01PTkVUQVJZ X0RVT19WQUxJRF9GUk9NLAogIF9OTF9NT05FVEFSWV9EVU9fVkFMSURfVE8sCiAgX05MX01PTkVU QVJZX0NPTlZFUlNJT05fUkFURSwKICBfTkxfTU9ORVRBUllfREVDSU1BTF9QT0lOVF9XQywKICBf TkxfTU9ORVRBUllfVEhPVVNBTkRTX1NFUF9XQywKICBfTkxfTlVNX0xDX01PTkVUQVJZLAoKICAg CgogIF9fREVDSU1BTF9QT0lOVCA9ICgoKCBfX0xDX05VTUVSSUMgKSA8PCAxNikgfCAoICAwICkp ICwKCgoKICBSQURJWENIQVIgPSBfX0RFQ0lNQUxfUE9JTlQsCgogIF9fVEhPVVNBTkRTX1NFUCwK CgoKICBUSE9VU0VQID0gX19USE9VU0FORFNfU0VQLAoKICBfX0dST1VQSU5HLAoKCgogIF9OTF9O VU1FUklDX0RFQ0lNQUxfUE9JTlRfV0MsCiAgX05MX05VTUVSSUNfVEhPVVNBTkRTX1NFUF9XQywK ICBfTkxfTlVNX0xDX05VTUVSSUMsCgogIF9fWUVTRVhQUiA9ICgoKCBfX0xDX01FU1NBR0VTICkg PDwgMTYpIHwgKCAgMCApKSAsICAKCiAgX19OT0VYUFIsCQkJIAoKICBfX1lFU1NUUiwJCQkgCgoK CiAgX19OT1NUUiwJCQkgCgoKCiAgX05MX05VTV9MQ19NRVNTQUdFUywKCiAgX05MX1BBUEVSX0hF SUdIVCA9ICgoKCBfX0xDX1BBUEVSICkgPDwgMTYpIHwgKCAgMCApKSAsCiAgX05MX1BBUEVSX1dJ RFRILAogIF9OTF9OVU1fTENfUEFQRVIsCgogIF9OTF9OQU1FX05BTUVfRk1UID0gKCgoIF9fTENf TkFNRSApIDw8IDE2KSB8ICggIDAgKSkgLAogIF9OTF9OQU1FX05BTUVfR0VOLAogIF9OTF9OQU1F X05BTUVfTVIsCiAgX05MX05BTUVfTkFNRV9NUlMsCiAgX05MX05BTUVfTkFNRV9NSVNTLAogIF9O TF9OQU1FX05BTUVfTVMsCiAgX05MX05VTV9MQ19OQU1FLAoKICBfTkxfQUREUkVTU19QT1NUQUxf Rk1UID0gKCgoIF9fTENfQUREUkVTUyApIDw8IDE2KSB8ICggIDAgKSkgLAogIF9OTF9BRERSRVNT X0NPVU5UUllfTkFNRSwKICBfTkxfQUREUkVTU19DT1VOVFJZX1BPU1QsCiAgX05MX0FERFJFU1Nf Q09VTlRSWV9BQjIsCiAgX05MX0FERFJFU1NfQ09VTlRSWV9BQjMsCiAgX05MX0FERFJFU1NfQ09V TlRSWV9DQVIsCiAgX05MX0FERFJFU1NfQ09VTlRSWV9OVU0sCiAgX05MX0FERFJFU1NfQ09VTlRS WV9JU0JOLAogIF9OTF9BRERSRVNTX0xBTkdfTkFNRSwKICBfTkxfQUREUkVTU19MQU5HX0FCLAog IF9OTF9BRERSRVNTX0xBTkdfVEVSTSwKICBfTkxfQUREUkVTU19MQU5HX0xJQiwKICBfTkxfTlVN X0xDX0FERFJFU1MsCgogIF9OTF9URUxFUEhPTkVfVEVMX0lOVF9GTVQgPSAoKCggX19MQ19URUxF UEhPTkUgKSA8PCAxNikgfCAoICAwICkpICwKICBfTkxfVEVMRVBIT05FX1RFTF9ET01fRk1ULAog IF9OTF9URUxFUEhPTkVfSU5UX1NFTEVDVCwKICBfTkxfVEVMRVBIT05FX0lOVF9QUkVGSVgsCiAg X05MX05VTV9MQ19URUxFUEhPTkUsCgogIF9OTF9NRUFTVVJFTUVOVF9NRUFTVVJFTUVOVCA9ICgo KCBfX0xDX01FQVNVUkVNRU5UICkgPDwgMTYpIHwgKCAgMCApKSAsCiAgX05MX05VTV9MQ19NRUFT VVJFTUVOVCwKCiAgX05MX0lERU5USUZJQ0FUSU9OX1RJVExFID0gKCgoIF9fTENfSURFTlRJRklD QVRJT04gKSA8PCAxNikgfCAoICAwICkpICwKICBfTkxfSURFTlRJRklDQVRJT05fU09VUkNFLAog IF9OTF9JREVOVElGSUNBVElPTl9BRERSRVNTLAogIF9OTF9JREVOVElGSUNBVElPTl9DT05UQUNU LAogIF9OTF9JREVOVElGSUNBVElPTl9FTUFJTCwKICBfTkxfSURFTlRJRklDQVRJT05fVEVMLAog IF9OTF9JREVOVElGSUNBVElPTl9GQVgsCiAgX05MX0lERU5USUZJQ0FUSU9OX0xBTkdVQUdFLAog IF9OTF9JREVOVElGSUNBVElPTl9URVJSSVRPUlksCiAgX05MX0lERU5USUZJQ0FUSU9OX0FVRElF TkNFLAogIF9OTF9JREVOVElGSUNBVElPTl9BUFBMSUNBVElPTiwKICBfTkxfSURFTlRJRklDQVRJ T05fQUJCUkVWSUFUSU9OLAogIF9OTF9JREVOVElGSUNBVElPTl9SRVZJU0lPTiwKICBfTkxfSURF TlRJRklDQVRJT05fREFURSwKICBfTkxfSURFTlRJRklDQVRJT05fQ0FURUdPUlksCiAgX05MX05V TV9MQ19JREVOVElGSUNBVElPTiwKCiAgIAogIF9OTF9OVU0KfTsKCgogCgoKCgoKZXh0ZXJuIGNo YXIgKm5sX2xhbmdpbmZvIChubF9pdGVtIF9faXRlbSkgdGhyb3cgKCkgOwoKCiMgNTc1ICIvdXNy L2luY2x1ZGUvbGFuZ2luZm8uaCIgMwoKCn0gCgoKIyAxMzYgIi4uLy4uL2ppa2VzL3NyYy9wbGF0 Zm9ybS5oIiAyCgoKCgojIDEgIi91c3IvaW5jbHVkZS9sb2NhbGUuaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgogCgoKCgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgv Mi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2Nj LWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCiAK CgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2lu Y2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoK IAoKCiMgMTI2ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVk ZS9zdGRkZWYuaCIgMwoKCiAKCgoKCiAKCiAKCgojIDE4OCAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2 LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgogCgoKCgogCgoKIyAy NjkgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRl Zi5oIiAzCgoKCgoKCgoKCgoKCgoKCgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2 LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoK CiAKCgoKCgoKCiMgMjkgIi91c3IvaW5jbHVkZS9sb2NhbGUuaCIgMiAzCgojIDEgIi91c3IvaW5j bHVkZS9iaXRzL2xvY2FsZS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyA0NCAiL3Vz ci9pbmNsdWRlL2JpdHMvbG9jYWxlLmgiIDMKCiMgMzAgIi91c3IvaW5jbHVkZS9sb2NhbGUuaCIg MiAzCgoKZXh0ZXJuICJDIiB7IAoKIAoKCgoKCgoKCgoKCgoKCgoKIApzdHJ1Y3QgbGNvbnYKewog ICAKCiAgY2hhciAqZGVjaW1hbF9wb2ludDsJCSAKICBjaGFyICp0aG91c2FuZHNfc2VwOwkJIAog ICAKCgoKCiAgY2hhciAqZ3JvdXBpbmc7CgogICAKCiAgIAoKICBjaGFyICppbnRfY3Vycl9zeW1i b2w7CiAgY2hhciAqY3VycmVuY3lfc3ltYm9sOwkgCiAgY2hhciAqbW9uX2RlY2ltYWxfcG9pbnQ7 CSAKICBjaGFyICptb25fdGhvdXNhbmRzX3NlcDsJIAogIGNoYXIgKm1vbl9ncm91cGluZzsJCSAK ICBjaGFyICpwb3NpdGl2ZV9zaWduOwkJIAogIGNoYXIgKm5lZ2F0aXZlX3NpZ247CQkgCiAgY2hh ciBpbnRfZnJhY19kaWdpdHM7CQkgCiAgY2hhciBmcmFjX2RpZ2l0czsJCSAKICAgCiAgY2hhciBw X2NzX3ByZWNlZGVzOwogICAKICBjaGFyIHBfc2VwX2J5X3NwYWNlOwogICAKICBjaGFyIG5fY3Nf cHJlY2VkZXM7CiAgIAogIGNoYXIgbl9zZXBfYnlfc3BhY2U7CiAgIAoKCgoKCiAgY2hhciBwX3Np Z25fcG9zbjsKICBjaGFyIG5fc2lnbl9wb3NuOwojIDExMSAiL3Vzci9pbmNsdWRlL2xvY2FsZS5o IiAzCgogIGNoYXIgX19pbnRfcF9jc19wcmVjZWRlczsKICBjaGFyIF9faW50X3Bfc2VwX2J5X3Nw YWNlOwogIGNoYXIgX19pbnRfbl9jc19wcmVjZWRlczsKICBjaGFyIF9faW50X25fc2VwX2J5X3Nw YWNlOwogIGNoYXIgX19pbnRfcF9zaWduX3Bvc247CiAgY2hhciBfX2ludF9uX3NpZ25fcG9zbjsK Cn07CgoKIApleHRlcm4gY2hhciAqc2V0bG9jYWxlIChpbnQgX19jYXRlZ29yeSwgX19jb25zdCBj aGFyICpfX2xvY2FsZSkgdGhyb3cgKCkgOwoKIApleHRlcm4gc3RydWN0IGxjb252ICpsb2NhbGVj b252ICh2b2lkKSB0aHJvdyAoKSA7CgojIDE1OSAiL3Vzci9pbmNsdWRlL2xvY2FsZS5oIiAzCgoK fSAKCgojIDE0MCAiLi4vLi4vamlrZXMvc3JjL3BsYXRmb3JtLmgiIDIKCgoKIAoKCiMgMSAiL3Vz ci9pbmNsdWRlL2crKy9pb3N0cmVhbSIgMSAzCiAKIAoKCgojIDEgIi91c3IvaW5jbHVkZS9nKysv aW9zdHJlYW0uaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaW50ZXJm YWNlCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2crKy9zdHJlYW1idWYuaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgojcHJhZ21hIGludGVyZmFjZQoKCiAgIAoKCgpleHRlcm4gIkMiIHsK Cn0KIAoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVk ZS9zdGRhcmcuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCiAKCgoKIAoKCgoKCgoKCgoKCgoK CgoKCnZvaWQgdmFfZW5kIChfX2dudWNfdmFfbGlzdCk7CQkgCgoKIAoKCgogCgoKCgoKCgoKCgoK CiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCiAKCgoKCgoKCgoKCgoKCiMgMTc1ICIvdXNyL2xp Yi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRhcmcuaCIgMwoKCiAK CgoKCiAKCiAKCiAKCnR5cGVkZWYgX19nbnVjX3ZhX2xpc3QgdmFfbGlzdDsKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKIyA0MCAiL3Vzci9pbmNsdWRlL2crKy9zdHJlYW1idWYuaCIgMiAzCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgpleHRlcm4gIkMrKyIgewpjbGFzcyBpc3RyZWFtOyAgCmNsYXNz IG9zdHJlYW07IGNsYXNzIHN0cmVhbWJ1ZjsKCiAKCgoKCnR5cGVkZWYgX19vZmY2NF90ICAgc3Ry ZWFtb2ZmOwp0eXBlZGVmIF9fb2ZmNjRfdCAgIHN0cmVhbXBvczsKCgoKCnR5cGVkZWYgX19zc2l6 ZV90ICAgc3RyZWFtc2l6ZTsKCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBfX2ZtdGZsYWdzOwp0eXBl ZGVmIHVuc2lnbmVkIGNoYXIgX19pb3N0YXRlOwoKc3RydWN0IF9pb3NfZmllbGRzCnsgIAogICAg c3RyZWFtYnVmICpfc3RyYnVmOwogICAgb3N0cmVhbSogX3RpZTsKICAgIGludCBfd2lkdGg7CiAg ICBfX2ZtdGZsYWdzIF9mbGFnczsKICAgIHdjaGFyX3QgICBfZmlsbDsKICAgIF9faW9zdGF0ZSBf c3RhdGU7CiAgICBfX2lvc3RhdGUgX2V4Y2VwdGlvbnM7CiAgICBpbnQgX3ByZWNpc2lvbjsKCiAg ICB2b2lkICpfYXJyYXlzOyAgCn07CgoKCgoKCgoKCgoKCgoKCiMgMTI0ICIvdXNyL2luY2x1ZGUv ZysrL3N0cmVhbWJ1Zi5oIiAzCgoKY2xhc3MgaW9zIDogcHVibGljIF9pb3NfZmllbGRzIHsKICBp b3MmIG9wZXJhdG9yPShpb3MmKTsgICAKICBpb3MgKGNvbnN0IGlvcyYpOyAgCiAgcHVibGljOgog ICAgdHlwZWRlZiBfX2ZtdGZsYWdzIGZtdGZsYWdzOwogICAgdHlwZWRlZiBpbnQgaW9zdGF0ZTsK ICAgIHR5cGVkZWYgaW50IG9wZW5tb2RlOwogICAgdHlwZWRlZiBfX3NzaXplX3QgICBzdHJlYW1z aXplOwogICAgZW51bSBpb19zdGF0ZSB7Cglnb29kYml0ID0gMCAsCgllb2ZiaXQgPSAxICwKCWZh aWxiaXQgPSAyICwKCWJhZGJpdCA9IDQgIH07CiAgICBlbnVtIG9wZW5fbW9kZSB7CglpbiA9IDEg LAoJb3V0ID0gMiAsCglhdGUgPSA0ICwKCWFwcCA9IDggLAoJdHJ1bmMgPSAxNiAsCglub2NyZWF0 ZSA9IDMyICwKCW5vcmVwbGFjZSA9IDY0ICwKCWJpbiA9IDEyOCAsICAKCWJpbmFyeSA9IDEyOCAg fTsKICAgIGVudW0gc2Vla19kaXIgeyBiZWcsIGN1ciwgZW5kfTsKICAgIHR5cGVkZWYgZW51bSBz ZWVrX2RpciBzZWVrZGlyOwogICAgIAogICAgZW51bSB7IHNraXB3cz0gMDEgLAoJICAgbGVmdD0g MDIgLCByaWdodD0gMDQgLCBpbnRlcm5hbD0gMDEwICwKCSAgIGRlYz0gMDIwICwgb2N0PSAwNDAg LCBoZXg9IDAxMDAgLAoJICAgc2hvd2Jhc2U9IDAyMDAgLCBzaG93cG9pbnQ9IDA0MDAgLAoJICAg dXBwZXJjYXNlPSAwMTAwMCAsIHNob3dwb3M9IDAyMDAwICwKCSAgIHNjaWVudGlmaWM9IDA0MDAw ICwgZml4ZWQ9IDAxMDAwMCAsCgkgICB1bml0YnVmPSAwMjAwMDAgLCBzdGRpbz0gMDQwMDAwIAoK CgoJICAgfTsKICAgIGVudW0geyAgCgliYXNlZmllbGQ9ZGVjK29jdCtoZXgsCglmbG9hdGZpZWxk ID0gc2NpZW50aWZpYytmaXhlZCwKCWFkanVzdGZpZWxkID0gbGVmdCtyaWdodCtpbnRlcm5hbAog ICAgfTsKCiMgMTc3ICIvdXNyL2luY2x1ZGUvZysrL3N0cmVhbWJ1Zi5oIiAzCgoKICAgIG9zdHJl YW0qIHRpZSgpIGNvbnN0IHsgcmV0dXJuIF90aWU7IH0KICAgIG9zdHJlYW0qIHRpZShvc3RyZWFt KiB2YWwpIHsgb3N0cmVhbSogc2F2ZT1fdGllOyBfdGllPXZhbDsgcmV0dXJuIHNhdmU7IH0KCiAg ICAgCiAgICB3Y2hhcl90ICAgZmlsbCgpIGNvbnN0IHsgcmV0dXJuIF9maWxsOyB9CiAgICB3Y2hh cl90ICAgZmlsbCh3Y2hhcl90ICAgbmV3ZikKCXt3Y2hhcl90ICAgb2xkZiA9IF9maWxsOyBfZmls bCA9IG5ld2Y7IHJldHVybiBvbGRmO30KICAgIGZtdGZsYWdzIGZsYWdzKCkgY29uc3QgeyByZXR1 cm4gX2ZsYWdzOyB9CiAgICBmbXRmbGFncyBmbGFncyhmbXRmbGFncyBuZXdfdmFsKSB7CglmbXRm bGFncyBvbGRfdmFsID0gX2ZsYWdzOyBfZmxhZ3MgPSBuZXdfdmFsOyByZXR1cm4gb2xkX3ZhbDsg fQogICAgaW50IHByZWNpc2lvbigpIGNvbnN0IHsgcmV0dXJuIF9wcmVjaXNpb247IH0KICAgIGlu dCBwcmVjaXNpb24oaW50IG5ld3ApIHsKCXVuc2lnbmVkIHNob3J0IG9sZHAgPSBfcHJlY2lzaW9u OyBfcHJlY2lzaW9uID0gKHVuc2lnbmVkIHNob3J0KW5ld3A7CglyZXR1cm4gb2xkcDsgfQogICAg Zm10ZmxhZ3Mgc2V0ZihmbXRmbGFncyB2YWwpIHsKCWZtdGZsYWdzIG9sZGJpdHMgPSBfZmxhZ3M7 CglfZmxhZ3MgfD0gdmFsOyByZXR1cm4gb2xkYml0czsgfQogICAgZm10ZmxhZ3Mgc2V0ZihmbXRm bGFncyB2YWwsIGZtdGZsYWdzIG1hc2spIHsKCWZtdGZsYWdzIG9sZGJpdHMgPSBfZmxhZ3M7Cglf ZmxhZ3MgPSAoX2ZsYWdzICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOyByZXR1cm4gb2xkYml0czsg fQogICAgZm10ZmxhZ3MgdW5zZXRmKGZtdGZsYWdzIG1hc2spIHsKCWZtdGZsYWdzIG9sZGJpdHMg PSBfZmxhZ3M7CglfZmxhZ3MgJj0gfm1hc2s7IHJldHVybiBvbGRiaXRzOyB9CiAgICBpbnQgd2lk dGgoKSBjb25zdCB7IHJldHVybiBfd2lkdGg7IH0KICAgIGludCB3aWR0aChpbnQgdmFsKSB7IGlu dCBzYXZlID0gX3dpZHRoOyBfd2lkdGggPSB2YWw7IHJldHVybiBzYXZlOyB9CgoKCgogICAgdm9p ZCBfdGhyb3dfZmFpbHVyZSgpIGNvbnN0IHsgfQoKICAgIHZvaWQgY2xlYXIoaW9zdGF0ZSBzdGF0 ZSA9IDApIHsKCV9zdGF0ZSA9IF9zdHJidWYgPyBzdGF0ZSA6IHN0YXRlfGJhZGJpdDsKCWlmIChf c3RhdGUgJiBfZXhjZXB0aW9ucykgX3Rocm93X2ZhaWx1cmUoKTsgfQogICAgdm9pZCBzZXQoaW9z dGF0ZSBmbGFnKSB7IF9zdGF0ZSB8PSBmbGFnOwoJaWYgKF9zdGF0ZSAmIF9leGNlcHRpb25zKSBf dGhyb3dfZmFpbHVyZSgpOyB9CiAgICB2b2lkIHNldHN0YXRlKGlvc3RhdGUgZmxhZykgeyBfc3Rh dGUgfD0gZmxhZzsgIAoJaWYgKF9zdGF0ZSAmIF9leGNlcHRpb25zKSBfdGhyb3dfZmFpbHVyZSgp OyB9CiAgICBpbnQgZ29vZCgpIGNvbnN0IHsgcmV0dXJuIF9zdGF0ZSA9PSAwOyB9CiAgICBpbnQg ZW9mKCkgY29uc3QgeyByZXR1cm4gX3N0YXRlICYgaW9zOjplb2ZiaXQ7IH0KICAgIGludCBmYWls KCkgY29uc3QgeyByZXR1cm4gX3N0YXRlICYgKGlvczo6YmFkYml0fGlvczo6ZmFpbGJpdCk7IH0K ICAgIGludCBiYWQoKSBjb25zdCB7IHJldHVybiBfc3RhdGUgJiBpb3M6OmJhZGJpdDsgfQogICAg aW9zdGF0ZSByZHN0YXRlKCkgY29uc3QgeyByZXR1cm4gX3N0YXRlOyB9CiAgICBvcGVyYXRvciB2 b2lkKigpIGNvbnN0IHsgcmV0dXJuIGZhaWwoKSA/ICh2b2lkKikwIDogKHZvaWQqKSgtMSk7IH0K ICAgIGludCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiBmYWlsKCk7IH0KICAgIGlvc3RhdGUg ZXhjZXB0aW9ucygpIGNvbnN0IHsgcmV0dXJuIF9leGNlcHRpb25zOyB9CiAgICB2b2lkIGV4Y2Vw dGlvbnMoaW9zdGF0ZSBlbmFibGUpIHsKCV9leGNlcHRpb25zID0gZW5hYmxlOwoJaWYgKF9zdGF0 ZSAmIF9leGNlcHRpb25zKSBfdGhyb3dfZmFpbHVyZSgpOyB9CgogICAgc3RyZWFtYnVmKiByZGJ1 ZigpIGNvbnN0IHsgcmV0dXJuIF9zdHJidWY7IH0KICAgIHN0cmVhbWJ1ZiogcmRidWYoc3RyZWFt YnVmICpfcykgewogICAgICBzdHJlYW1idWYgKl9vbGQgPSBfc3RyYnVmOyBfc3RyYnVmID0gX3M7 IGNsZWFyICgpOyByZXR1cm4gX29sZDsgfQoKICAgIHN0YXRpYyBpbnQgc3luY193aXRoX3N0ZGlv KGludCBvbik7CiAgICBzdGF0aWMgdm9pZCBzeW5jX3dpdGhfc3RkaW8oKSB7IHN5bmNfd2l0aF9z dGRpbygxKTsgfQogICAgc3RhdGljIGZtdGZsYWdzIGJpdGFsbG9jKCk7CiAgICBzdGF0aWMgaW50 IHhhbGxvYygpOwogICAgdm9pZComIHB3b3JkKGludCk7CiAgICB2b2lkKiBwd29yZChpbnQpIGNv bnN0OwogICAgbG9uZyYgaXdvcmQoaW50KTsKICAgIGxvbmcgaXdvcmQoaW50KSBjb25zdDsKCgoK CgoKCgoKICAgICAKICAgIGNsYXNzIEluaXQgewogICAgcHVibGljOgogICAgICBJbml0ICgpIHsg fQogICAgfTsKCiAgcHJvdGVjdGVkOgogICAgaW5saW5lIGlvcyhzdHJlYW1idWYqIHNiID0gMCwg b3N0cmVhbSogdGllX3RvID0gMCk7CiAgICBpbmxpbmUgdmlydHVhbCB+aW9zKCk7CiAgICBpbmxp bmUgdm9pZCBpbml0KHN0cmVhbWJ1Ziogc2IsIG9zdHJlYW0qIHRpZSA9IDApOwp9OwoKCgoKdHlw ZWRlZiBpb3M6OnNlZWtfZGlyIF9zZWVrX2RpcjsKCgogCiAKIAogCiAKCiAKIApjbGFzcyBzdHJl YW1tYXJrZXIgOiBwcml2YXRlIF9JT19tYXJrZXIgewogICAgZnJpZW5kIGNsYXNzIHN0cmVhbWJ1 ZjsKICAgIHZvaWQgc2V0X29mZnNldChpbnQgb2Zmc2V0KSB7IF9wb3MgPSBvZmZzZXQ7IH0KICBw dWJsaWM6CiAgICBzdHJlYW1tYXJrZXIoc3RyZWFtYnVmICpzYik7CiAgICB+c3RyZWFtbWFya2Vy KCk7CiAgICBpbnQgc2F2aW5nKCkgeyByZXR1cm4gIDE7IH0KICAgIGludCBkZWx0YShzdHJlYW1t YXJrZXImKTsKICAgIGludCBkZWx0YSgpOwp9OwoKc3RydWN0IHN0cmVhbWJ1ZiA6IHB1YmxpYyBf SU9fRklMRSB7ICAKICAgIGZyaWVuZCBjbGFzcyBpb3M7CiAgICBmcmllbmQgY2xhc3MgaXN0cmVh bTsKICAgIGZyaWVuZCBjbGFzcyBvc3RyZWFtOwogICAgZnJpZW5kIGNsYXNzIHN0cmVhbW1hcmtl cjsKICAgIGNvbnN0IHZvaWQgKiZfdnRhYmxlKCkgeyByZXR1cm4gKihjb25zdCB2b2lkKiopKChf SU9fRklMRSopdGhpcyArIDEpOyB9CiAgcHJvdGVjdGVkOgogICAgc3RhdGljIHN0cmVhbWJ1Ziog X2xpc3RfYWxsOyAgCiAgICBfSU9fRklMRSomIHhjaGFpbigpIHsgcmV0dXJuIF9jaGFpbjsgfQog ICAgdm9pZCBfdW5fbGluaygpOwogICAgdm9pZCBfbGlua19pbigpOwogICAgY2hhciogZ3B0cigp IGNvbnN0CiAgICAgIHsgcmV0dXJuIF9mbGFncyAgJiAweDEwMCAgPyBfSU9fc2F2ZV9iYXNlIDog X0lPX3JlYWRfcHRyOyB9CiAgICBjaGFyKiBwcHRyKCkgY29uc3QgeyByZXR1cm4gX0lPX3dyaXRl X3B0cjsgfQogICAgY2hhciogZWdwdHIoKSBjb25zdAogICAgICB7IHJldHVybiBfZmxhZ3MgICYg MHgxMDAgID8gX0lPX3NhdmVfZW5kIDogX0lPX3JlYWRfZW5kOyB9CiAgICBjaGFyKiBlcHB0cigp IGNvbnN0IHsgcmV0dXJuIF9JT193cml0ZV9lbmQ7IH0KICAgIGNoYXIqIHBiYXNlKCkgY29uc3Qg eyByZXR1cm4gX0lPX3dyaXRlX2Jhc2U7IH0KICAgIGNoYXIqIGViYWNrKCkgY29uc3QKICAgICAg eyByZXR1cm4gX2ZsYWdzICAmIDB4MTAwICA/IF9JT19zYXZlX2Jhc2UgOiBfSU9fcmVhZF9iYXNl O30KICAgIGNoYXIqIGJhc2UoKSBjb25zdCB7IHJldHVybiBfSU9fYnVmX2Jhc2U7IH0KICAgIGNo YXIqIGVidWYoKSBjb25zdCB7IHJldHVybiBfSU9fYnVmX2VuZDsgfQogICAgaW50IGJsZW4oKSBj b25zdCB7IHJldHVybiBfSU9fYnVmX2VuZCAtIF9JT19idWZfYmFzZTsgfQogICAgdm9pZCB4cHV0 X2NoYXIoY2hhciBjKSB7ICpfSU9fd3JpdGVfcHRyKysgPSBjOyB9CiAgICBpbnQgeGZsYWdzKCkg eyByZXR1cm4gX2ZsYWdzIDsgfQogICAgaW50IHhmbGFncyhpbnQgZikge2ludCBmbCA9IF9mbGFn cyA7IF9mbGFncyAgPSBmOyByZXR1cm4gZmw7fQogICAgdm9pZCB4c2V0ZmxhZ3MoaW50IGYpIHsg X2ZsYWdzICB8PSBmOyB9CiAgICB2b2lkIHhzZXRmbGFncyhpbnQgZiwgaW50IG1hc2spCiAgICAg IHsgX2ZsYWdzICA9IChfZmxhZ3MgICYgfm1hc2spIHwgKGYgJiBtYXNrKTsgfQogICAgdm9pZCBn YnVtcChpbnQgbikKICAgICAgeyBfZmxhZ3MgICYgMHgxMDAgID8gKF9JT19zYXZlX2Jhc2UrPW4p OihfSU9fcmVhZF9wdHIrPW4pO30KICAgIHZvaWQgcGJ1bXAoaW50IG4pIHsgX0lPX3dyaXRlX3B0 ciArPSBuOyB9CiAgICB2b2lkIHNldGIoY2hhciogYiwgY2hhciogZWIsIGludCBhPTApOwogICAg dm9pZCBzZXRwKGNoYXIqIHAsIGNoYXIqIGVwKQogICAgICB7IF9JT193cml0ZV9iYXNlPV9JT193 cml0ZV9wdHI9cDsgX0lPX3dyaXRlX2VuZD1lcDsgfQogICAgdm9pZCBzZXRnKGNoYXIqIGViLCBj aGFyKiBnLCBjaGFyICplZykgewogICAgICBpZiAoX2ZsYWdzICAmIDB4MTAwICkgX0lPX2ZyZWVf YmFja3VwX2FyZWEodGhpcyk7IAogICAgICBfSU9fcmVhZF9iYXNlID0gZWI7IF9JT19yZWFkX3B0 ciA9IGc7IF9JT19yZWFkX2VuZCA9IGVnOyB9CiAgICBjaGFyICpzaG9ydGJ1ZigpIHsgcmV0dXJu IF9zaG9ydGJ1ZjsgfQoKICAgIGludCBpbl9iYWNrdXAoKSB7IHJldHVybiBfZmxhZ3MgJiAweDEw MCA7IH0KICAgICAKICAgIGNoYXIgKkdiYXNlKCkgeyByZXR1cm4gaW5fYmFja3VwKCkgPyBfSU9f c2F2ZV9iYXNlIDogX0lPX3JlYWRfYmFzZTsgfQogICAgIAogICAgY2hhciAqZUdwdHIoKSB7IHJl dHVybiBpbl9iYWNrdXAoKSA/IF9JT19zYXZlX2VuZCA6IF9JT19yZWFkX2VuZDsgfQogICAgIAog ICAgY2hhciAqQmJhc2UoKSB7IHJldHVybiBpbl9iYWNrdXAoKSA/IF9JT19yZWFkX2Jhc2UgOiBf SU9fc2F2ZV9iYXNlOyB9CiAgICBjaGFyICpCcHRyKCkgeyByZXR1cm4gX0lPX2JhY2t1cF9iYXNl OyB9CiAgICAgCiAgICBjaGFyICplQnB0cigpIHsgcmV0dXJuIGluX2JhY2t1cCgpID8gX0lPX3Jl YWRfZW5kIDogX0lPX3NhdmVfZW5kOyB9CiAgICBjaGFyICpOYmFzZSgpIHsgcmV0dXJuIF9JT19z YXZlX2Jhc2U7IH0KICAgIGNoYXIgKmVOcHRyKCkgeyByZXR1cm4gX0lPX3NhdmVfZW5kOyB9CiAg ICBpbnQgaGF2ZV9iYWNrdXAoKSB7IHJldHVybiBfSU9fc2F2ZV9iYXNlICE9IF9fbnVsbCA7IH0K ICAgIGludCBoYXZlX21hcmtlcnMoKSB7IHJldHVybiBfbWFya2VycyAhPSBfX251bGwgOyB9CiAg ICB2b2lkIGZyZWVfYmFja3VwX2FyZWEoKTsKICAgIHZvaWQgdW5zYXZlX21hcmtlcnMoKTsgIAog ICAgaW50IHB1dF9tb2RlKCkgeyByZXR1cm4gX2ZsYWdzICYgMHg4MDAgOyB9CiAgICBpbnQgc3dp dGNoX3RvX2dldF9tb2RlKCk7CiAgICAKICAgIHN0cmVhbWJ1ZihpbnQgZmxhZ3M9MCk7CiAgcHVi bGljOgogICAgc3RhdGljIGludCBmbHVzaF9hbGwoKTsKICAgIHN0YXRpYyB2b2lkIGZsdXNoX2Fs bF9saW5lYnVmZmVyZWQoKTsgIAogICAgdmlydHVhbCB+c3RyZWFtYnVmKCk7CiAgICB2aXJ0dWFs IGludCBvdmVyZmxvdyhpbnQgYyA9ICgtMSkgKTsgIAogICAgdmlydHVhbCBpbnQgdW5kZXJmbG93 KCk7ICAKICAgIHZpcnR1YWwgaW50IHVmbG93KCk7ICAKICAgIHZpcnR1YWwgaW50IHBiYWNrZmFp bChpbnQgYyk7CiAKICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSB4c3B1dG4oY29uc3QgY2hhciogcywg c3RyZWFtc2l6ZSBuKTsKICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSB4c2dldG4oY2hhciogcywgc3Ry ZWFtc2l6ZSBuKTsKICAgIHZpcnR1YWwgc3RyZWFtcG9zIHNlZWtvZmYoc3RyZWFtb2ZmLCBfc2Vl a19kaXIsIGludCBtb2RlPWlvczo6aW58aW9zOjpvdXQpOwogICAgdmlydHVhbCBzdHJlYW1wb3Mg c2Vla3BvcyhzdHJlYW1wb3MgcG9zLCBpbnQgbW9kZSA9IGlvczo6aW58aW9zOjpvdXQpOwoKICAg IHN0cmVhbXBvcyBwdWJzZWVrb2ZmKHN0cmVhbW9mZiBvLCBfc2Vla19kaXIgZCwgaW50IG1vZGU9 aW9zOjppbnxpb3M6Om91dCkKICAgICAgeyByZXR1cm4gX0lPX3NlZWtvZmYgKHRoaXMsIG8sIGQs IG1vZGUpOyB9CiAgICBzdHJlYW1wb3MgcHVic2Vla3BvcyhzdHJlYW1wb3MgcG9zLCBpbnQgbW9k ZSA9IGlvczo6aW58aW9zOjpvdXQpCiAgICAgIHsgcmV0dXJuIF9JT19zZWVrcG9zICh0aGlzLCBw b3MsIG1vZGUpOyB9CiAgICBzdHJlYW1wb3Mgc3NlZWtvZmYoc3RyZWFtb2ZmLCBfc2Vla19kaXIs IGludCBtb2RlPWlvczo6aW58aW9zOjpvdXQpOwogICAgc3RyZWFtcG9zIHNzZWVrcG9zKHN0cmVh bXBvcyBwb3MsIGludCBtb2RlID0gaW9zOjppbnxpb3M6Om91dCk7CiAgICB2aXJ0dWFsIHN0cmVh bWJ1Ziogc2V0YnVmKGNoYXIqIHAsIGludCBsZW4pOwogICAgdmlydHVhbCBpbnQgc3luYygpOwog ICAgdmlydHVhbCBpbnQgZG9hbGxvY2F0ZSgpOwoKICAgIGludCBzZWVrbWFyayhzdHJlYW1tYXJr ZXImIG1hcmssIGludCBkZWx0YSA9IDApOwogICAgaW50IHNwdXRiYWNrYyhjaGFyIGMpOwogICAg aW50IHN1bmdldGMoKTsKICAgIGludCB1bmJ1ZmZlcmVkKCkgeyByZXR1cm4gX2ZsYWdzICYgMiAg PyAxIDogMDsgfQogICAgaW50IGxpbmVidWZmZXJlZCgpIHsgcmV0dXJuIF9mbGFncyAmIDB4MjAw ICA/IDEgOiAwOyB9CiAgICB2b2lkIHVuYnVmZmVyZWQoaW50IGkpCgl7IGlmIChpKSBfZmxhZ3Mg fD0gMiA7IGVsc2UgX2ZsYWdzICY9IH4yIDsgfQogICAgdm9pZCBsaW5lYnVmZmVyZWQoaW50IGkp Cgl7IGlmIChpKSBfZmxhZ3MgfD0gMHgyMDAgOyBlbHNlIF9mbGFncyAmPSB+MHgyMDAgOyB9CiAg ICBpbnQgYWxsb2NhdGUoKSB7ICAKCWlmIChiYXNlKCkgfHwgdW5idWZmZXJlZCgpKSByZXR1cm4g MDsKCWVsc2UgcmV0dXJuIGRvYWxsb2NhdGUoKTsgfQogICAgIAogICAgdm9pZCBhbGxvY2J1Zigp IHsgaWYgKGJhc2UoKSA9PSBfX251bGwgKSBkb2FsbG9jYnVmKCk7IH0KICAgIHZvaWQgZG9hbGxv Y2J1ZigpOwogICAgaW50IGluX2F2YWlsKCkgeyByZXR1cm4gX0lPX3JlYWRfZW5kIC0gX0lPX3Jl YWRfcHRyOyB9CiAgICBpbnQgb3V0X3dhaXRpbmcoKSB7IHJldHVybiBfSU9fd3JpdGVfcHRyIC0g X0lPX3dyaXRlX2Jhc2U7IH0KICAgIHN0cmVhbXNpemUgc3B1dG4oY29uc3QgY2hhciogcywgc3Ry ZWFtc2l6ZSBuKSB7IHJldHVybiB4c3B1dG4ocywgbik7IH0KICAgIHN0cmVhbXNpemUgcGFkbihj aGFyIHBhZCwgc3RyZWFtc2l6ZSBuKSB7IHJldHVybiBfSU9fcGFkbih0aGlzLCBwYWQsIG4pOyB9 CiAgICBzdHJlYW1zaXplIHNnZXRuKGNoYXIqIHMsIHN0cmVhbXNpemUgbikgeyByZXR1cm4gX0lP X3NnZXRuKHRoaXMsIHMsIG4pOyB9CiAgICBpbnQgaWdub3JlKGludCk7CiAgICBpbnQgZ2V0X2Nv bHVtbigpOwogICAgaW50IHNldF9jb2x1bW4oaW50KTsKICAgIGxvbmcgc2dldGxpbmUoY2hhciog YnVmLCBzaXplX3QgICBuLCBjaGFyIGRlbGltLCBpbnQgcHV0YmFja19kZWxpbSk7CiAgICBpbnQg c3B1dGMoaW50IGMpIHsgcmV0dXJuIF9JT19wdXRjKGMsIHRoaXMpOyB9CiAgICBpbnQgc2J1bXBj KCkgeyByZXR1cm4gX0lPX2dldGModGhpcyk7IH0KICAgIGludCBzZ2V0YygpIHsgcmV0dXJuICgo ICB0aGlzICApLT5fSU9fcmVhZF9wdHIgPj0gKCAgdGhpcyAgKS0+X0lPX3JlYWRfZW5kICYmIF9f dW5kZXJmbG93ICggIHRoaXMgICkgPT0gKC0xKSAgPyAoLTEpICA6ICoodW5zaWduZWQgY2hhciAq KSAoICB0aGlzICApLT5fSU9fcmVhZF9wdHIpICA7IH0KICAgIGludCBzbmV4dGMoKSB7CglpZiAo X0lPX3JlYWRfcHRyID49IF9JT19yZWFkX2VuZCAmJiBfX3VuZGVyZmxvdyh0aGlzKSA9PSAoLTEp ICkKCSAgcmV0dXJuICgtMSkgOwoJZWxzZSByZXR1cm4gX0lPX3JlYWRfcHRyKyssIHNnZXRjKCk7 IH0KICAgIHZvaWQgc3Rvc3NjKCkgeyBpZiAoX0lPX3JlYWRfcHRyIDwgX0lPX3JlYWRfZW5kKSBf SU9fcmVhZF9wdHIrKzsgfQogICAgaW50IHZzY2FuKGNoYXIgY29uc3QgKmZtdDAsIF9fZ251Y192 YV9saXN0ICBhcCwgaW9zKiBzdHJlYW0gPSBfX251bGwgKTsKICAgIGludCBzY2FuKGNoYXIgY29u c3QgKmZtdDAgLi4uKTsKICAgIGludCB2Zm9ybShjaGFyIGNvbnN0ICpmbXQwLCBfX2dudWNfdmFf bGlzdCAgYXApOwogICAgaW50IGZvcm0oY2hhciBjb25zdCAqZm10MCAuLi4pOwoKCgoKICAgIHZp cnR1YWwgc3RyZWFtc2l6ZSBzeXNfcmVhZChjaGFyKiBidWYsIHN0cmVhbXNpemUgc2l6ZSk7CiAg ICB2aXJ0dWFsIHN0cmVhbXNpemUgc3lzX3dyaXRlKGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplKTsK ICAgIHZpcnR1YWwgc3RyZWFtcG9zIHN5c19zZWVrKHN0cmVhbW9mZiwgX3NlZWtfZGlyKTsKICAg IHZpcnR1YWwgaW50IHN5c19jbG9zZSgpOwogICAgdmlydHVhbCBpbnQgc3lzX3N0YXQodm9pZCop OyAgCgogICAgdmlydHVhbCBpbnQgc2hvd21hbnljKCk7CiAgICB2aXJ0dWFsIHZvaWQgaW1idWUo dm9pZCAqKTsKCn07CgogCiAKCmNsYXNzIGZpbGVidWYgOiBwdWJsaWMgc3RyZWFtYnVmIHsKICBw cm90ZWN0ZWQ6CiAgICB2b2lkIGluaXQoKTsKICBwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50 IG9wZW5wcm90OyAgCiAgICBmaWxlYnVmKCk7CiAgICBmaWxlYnVmKGludCBmZCk7CiAgICBmaWxl YnVmKGludCBmZCwgY2hhciogcCwgaW50IGxlbik7CgoKCiAgICB+ZmlsZWJ1ZigpOwogICAgZmls ZWJ1ZiogYXR0YWNoKGludCBmZCk7CiAgICBmaWxlYnVmKiBvcGVuKGNvbnN0IGNoYXIgKmZpbGVu YW1lLCBjb25zdCBjaGFyICptb2RlKTsKICAgIGZpbGVidWYqIG9wZW4oY29uc3QgY2hhciAqZmls ZW5hbWUsIGlvczo6b3Blbm1vZGUgbW9kZSwgaW50IHByb3QgPSAwNjY0KTsKICAgIHZpcnR1YWwg aW50IHVuZGVyZmxvdygpOwogICAgdmlydHVhbCBpbnQgb3ZlcmZsb3coaW50IGMgPSAoLTEpICk7 CiAgICBpbnQgaXNfb3BlbigpIGNvbnN0IHsgcmV0dXJuIF9maWxlbm8gPj0gMDsgfQogICAgaW50 IGZkKCkgY29uc3QgeyByZXR1cm4gaXNfb3BlbigpID8gX2ZpbGVubyA6ICgtMSkgOyB9CiAgICBm aWxlYnVmKiBjbG9zZSgpOwogICAgdmlydHVhbCBpbnQgZG9hbGxvY2F0ZSgpOwogICAgdmlydHVh bCBzdHJlYW1wb3Mgc2Vla29mZihzdHJlYW1vZmYsIF9zZWVrX2RpciwgaW50IG1vZGU9aW9zOjpp bnxpb3M6Om91dCk7CiAgICB2aXJ0dWFsIHN0cmVhbWJ1Ziogc2V0YnVmKGNoYXIqIHAsIGludCBs ZW4pOwogICAgc3RyZWFtc2l6ZSB4c3B1dG4oY29uc3QgY2hhciogcywgc3RyZWFtc2l6ZSBuKTsK ICAgIHN0cmVhbXNpemUgeHNnZXRuKGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CiAgICB2aXJ0dWFs IGludCBzeW5jKCk7CiAgcHJvdGVjdGVkOiAgCiAKICAgIGludCBpc19yZWFkaW5nKCkgeyByZXR1 cm4gZWJhY2soKSAhPSBlZ3B0cigpOyB9CiAgICBjaGFyKiBjdXJfcHRyKCkgeyByZXR1cm4gaXNf cmVhZGluZygpID8gIGdwdHIoKSA6IHBwdHIoKTsgfQogICAgIAogICAgY2hhciogZmlsZV9wdHIo KSB7IHJldHVybiBlR3B0cigpOyB9CiAgICAgCiAgICB2aXJ0dWFsIHN0cmVhbXNpemUgc3lzX3Jl YWQoY2hhciogYnVmLCBzdHJlYW1zaXplIHNpemUpOwogICAgdmlydHVhbCBzdHJlYW1wb3Mgc3lz X3NlZWsoc3RyZWFtb2ZmLCBfc2Vla19kaXIpOwogICAgdmlydHVhbCBzdHJlYW1zaXplIHN5c193 cml0ZShjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZSk7CiAgICB2aXJ0dWFsIGludCBzeXNfc3RhdCh2 b2lkKik7ICAKICAgIHZpcnR1YWwgaW50IHN5c19jbG9zZSgpOwoKCgoKfTsKCmlubGluZSB2b2lk IGlvczo6aW5pdChzdHJlYW1idWYqIHNiLCBvc3RyZWFtKiB0aWVfdG8pIHsKCQlfc3RhdGUgPSBz YiA/IGlvczo6Z29vZGJpdCA6IGlvczo6YmFkYml0OyBfZXhjZXB0aW9ucz0wOwoJCV9zdHJidWY9 c2I7IF90aWUgPSB0aWVfdG87IF93aWR0aD0wOyBfZmlsbD0nICc7CgoJCV9mbGFncz1pb3M6OnNr aXB3c3xpb3M6OmRlYzsKCgoKCQlfcHJlY2lzaW9uPTY7IF9hcnJheXMgPSAwOyB9CgppbmxpbmUg aW9zOjppb3Moc3RyZWFtYnVmKiBzYiwgb3N0cmVhbSogdGllX3RvKSB7IGluaXQoc2IsIHRpZV90 byk7IH0KCmlubGluZSBpb3M6On5pb3MoKSB7CgoKCiAgICAgCiAgICAgCiAgICBvcGVyYXRvciBk ZWxldGVbXSAoX2FycmF5cyk7Cn0KfSAgCgojIDMxICIvdXNyL2luY2x1ZGUvZysrL2lvc3RyZWFt LmgiIDIgMwoKCmV4dGVybiAiQysrIiB7CmNsYXNzIGlzdHJlYW07IGNsYXNzIG9zdHJlYW07CnR5 cGVkZWYgaW9zJiAoKl9fbWFuaXApKGlvcyYpOwp0eXBlZGVmIGlzdHJlYW0mICgqX19pbWFuaXAp KGlzdHJlYW0mKTsKdHlwZWRlZiBvc3RyZWFtJiAoKl9fb21hbmlwKShvc3RyZWFtJik7CgpleHRl cm4gaXN0cmVhbSYgd3MoaXN0cmVhbSYgaW5zKTsKZXh0ZXJuIG9zdHJlYW0mIGZsdXNoKG9zdHJl YW0mIG91dHMpOwpleHRlcm4gb3N0cmVhbSYgZW5kbChvc3RyZWFtJiBvdXRzKTsKZXh0ZXJuIG9z dHJlYW0mIGVuZHMob3N0cmVhbSYgb3V0cyk7CgpjbGFzcyBvc3RyZWFtIDogdmlydHVhbCBwdWJs aWMgaW9zCnsKICAgICAKICAgIHZvaWQgZG9fb3NmeCgpOwogIHB1YmxpYzoKICAgIG9zdHJlYW0o KSB7IH0KICAgIG9zdHJlYW0oc3RyZWFtYnVmKiBzYiwgb3N0cmVhbSogdGllZD0gX19udWxsICk7 CiAgICBpbnQgb3BmeCgpIHsKCWlmICghZ29vZCgpKSByZXR1cm4gMDsKCWVsc2UgeyBpZiAoX3Rp ZSkgX3RpZS0+Zmx1c2goKTsgIDsgcmV0dXJuIDE7fSB9CiAgICB2b2lkIG9zZngoKSB7ICA7CgkJ ICBpZiAoZmxhZ3MoKSAmIChpb3M6OnVuaXRidWZ8aW9zOjpzdGRpbykpCgkJICAgICAgZG9fb3Nm eCgpOyB9CiAgICBvc3RyZWFtJiBmbHVzaCgpOwogICAgb3N0cmVhbSYgcHV0KGNoYXIgYykgeyBf c3RyYnVmLT5zcHV0YyhjKTsgcmV0dXJuICp0aGlzOyB9CgoKCgoKICAgIG9zdHJlYW0mIHdyaXRl KGNvbnN0IGNoYXIgKnMsIHN0cmVhbXNpemUgbik7CiAgICBvc3RyZWFtJiB3cml0ZShjb25zdCB1 bnNpZ25lZCBjaGFyICpzLCBzdHJlYW1zaXplIG4pCiAgICAgIHsgcmV0dXJuIHdyaXRlKChjb25z dCBjaGFyKilzLCBuKTt9CiAgICBvc3RyZWFtJiB3cml0ZShjb25zdCBzaWduZWQgY2hhciAqcywg c3RyZWFtc2l6ZSBuKQogICAgICB7IHJldHVybiB3cml0ZSgoY29uc3QgY2hhciopcywgbik7fQog ICAgb3N0cmVhbSYgd3JpdGUoY29uc3Qgdm9pZCAqcywgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJl dHVybiB3cml0ZSgoY29uc3QgY2hhciopcywgbik7fQogICAgb3N0cmVhbSYgc2Vla3Aoc3RyZWFt cG9zKTsKICAgIG9zdHJlYW0mIHNlZWtwKHN0cmVhbW9mZiwgX3NlZWtfZGlyKTsKICAgIHN0cmVh bXBvcyB0ZWxscCgpOwogICAgb3N0cmVhbSYgZm9ybShjb25zdCBjaGFyICpmb3JtYXQgLi4uKTsK ICAgIG9zdHJlYW0mIHZmb3JtKGNvbnN0IGNoYXIgKmZvcm1hdCwgX19nbnVjX3ZhX2xpc3QgIGFy Z3MpOwoKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoY2hhciBjKTsKICAgIG9zdHJlYW0mIG9wZXJh dG9yPDwodW5zaWduZWQgY2hhciBjKSB7IHJldHVybiAoKnRoaXMpIDw8IChjaGFyKWM7IH0KICAg IG9zdHJlYW0mIG9wZXJhdG9yPDwoc2lnbmVkIGNoYXIgYykgeyByZXR1cm4gKCp0aGlzKSA8PCAo Y2hhciljOyB9CiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGNvbnN0IGNoYXIgKnMpOwogICAgb3N0 cmVhbSYgb3BlcmF0b3I8PChjb25zdCB1bnNpZ25lZCBjaGFyICpzKQoJeyByZXR1cm4gKCp0aGlz KSA8PCAoY29uc3QgY2hhciopczsgfQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCBzaWdu ZWQgY2hhciAqcykKCXsgcmV0dXJuICgqdGhpcykgPDwgKGNvbnN0IGNoYXIqKXM7IH0KICAgIG9z dHJlYW0mIG9wZXJhdG9yPDwoY29uc3Qgdm9pZCAqcCk7CiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8 KGludCBuKTsKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgaW50IG4pOwogICAgb3N0 cmVhbSYgb3BlcmF0b3I8PChsb25nIG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25l ZCBsb25nIG4pOwoKICAgIF9fZXh0ZW5zaW9uX18gb3N0cmVhbSYgb3BlcmF0b3I8PChsb25nIGxv bmcgbik7CiAgICBfX2V4dGVuc2lvbl9fIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgbG9u ZyBsb25nIG4pOwoKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoc2hvcnQgbikge3JldHVybiBvcGVy YXRvcjw8KChpbnQpbik7fQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBzaG9ydCBu KSB7cmV0dXJuIG9wZXJhdG9yPDwoKHVuc2lnbmVkIGludCluKTt9CgogICAgb3N0cmVhbSYgb3Bl cmF0b3I8PChib29sIGIpIHsgcmV0dXJuIG9wZXJhdG9yPDwoKGludCliKTsgfQoKICAgIG9zdHJl YW0mIG9wZXJhdG9yPDwoZG91YmxlIG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChmbG9hdCBu KSB7IHJldHVybiBvcGVyYXRvcjw8KChkb3VibGUpbik7IH0KCiAgICBvc3RyZWFtJiBvcGVyYXRv cjw8KGxvbmcgZG91YmxlIG4pOwoKCgogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChfX29tYW5pcCBm dW5jKSB7IHJldHVybiAoKmZ1bmMpKCp0aGlzKTsgfQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChf X21hbmlwIGZ1bmMpIHsoKmZ1bmMpKCp0aGlzKTsgcmV0dXJuICp0aGlzO30KICAgIG9zdHJlYW0m IG9wZXJhdG9yPDwoc3RyZWFtYnVmKik7CgoKCn07CgpjbGFzcyBpc3RyZWFtIDogdmlydHVhbCBw dWJsaWMgaW9zCnsKICAgICAKcHJvdGVjdGVkOgogICAgc2l6ZV90ICAgX2djb3VudDsKCiAgICBp bnQgX3NraXBfd3MoKTsKICBwdWJsaWM6CiAgICBpc3RyZWFtKCk6IF9nY291bnQgKDApIHsgfQog ICAgaXN0cmVhbShzdHJlYW1idWYqIHNiLCBvc3RyZWFtKnRpZWQ9IF9fbnVsbCApOwogICAgaXN0 cmVhbSYgZ2V0KGNoYXIqIHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpOwogICAgaXN0 cmVhbSYgZ2V0KHVuc2lnbmVkIGNoYXIqIHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicp Cgl7IHJldHVybiBnZXQoKGNoYXIqKXB0ciwgbGVuLCBkZWxpbSk7IH0KICAgIGlzdHJlYW0mIGdl dChjaGFyJiBjKTsKICAgIGlzdHJlYW0mIGdldCh1bnNpZ25lZCBjaGFyJiBjKSB7IHJldHVybiBn ZXQoKGNoYXImKWMpOyB9CiAgICBpc3RyZWFtJiBnZXRsaW5lKGNoYXIqIHB0ciwgaW50IGxlbiwg Y2hhciBkZWxpbSA9ICdcbicpOwogICAgaXN0cmVhbSYgZ2V0bGluZSh1bnNpZ25lZCBjaGFyKiBw dHIsIGludCBsZW4sIGNoYXIgZGVsaW0gPSAnXG4nKQoJeyByZXR1cm4gZ2V0bGluZSgoY2hhciop cHRyLCBsZW4sIGRlbGltKTsgfQogICAgaXN0cmVhbSYgZ2V0KHNpZ25lZCBjaGFyJiBjKSAgeyBy ZXR1cm4gZ2V0KChjaGFyJiljKTsgfQogICAgaXN0cmVhbSYgZ2V0KHNpZ25lZCBjaGFyKiBwdHIs IGludCBsZW4sIGNoYXIgZGVsaW0gPSAnXG4nKQoJeyByZXR1cm4gZ2V0KChjaGFyKilwdHIsIGxl biwgZGVsaW0pOyB9CiAgICBpc3RyZWFtJiBnZXRsaW5lKHNpZ25lZCBjaGFyKiBwdHIsIGludCBs ZW4sIGNoYXIgZGVsaW0gPSAnXG4nKQoJeyByZXR1cm4gZ2V0bGluZSgoY2hhciopcHRyLCBsZW4s IGRlbGltKTsgfQogICAgaXN0cmVhbSYgcmVhZChjaGFyICpwdHIsIHN0cmVhbXNpemUgbik7CiAg ICBpc3RyZWFtJiByZWFkKHVuc2lnbmVkIGNoYXIgKnB0ciwgc3RyZWFtc2l6ZSBuKQogICAgICB7 IHJldHVybiByZWFkKChjaGFyKilwdHIsIG4pOyB9CiAgICBpc3RyZWFtJiByZWFkKHNpZ25lZCBj aGFyICpwdHIsIHN0cmVhbXNpemUgbikKICAgICAgeyByZXR1cm4gcmVhZCgoY2hhciopcHRyLCBu KTsgfQogICAgaXN0cmVhbSYgcmVhZCh2b2lkICpwdHIsIHN0cmVhbXNpemUgbikKICAgICAgeyBy ZXR1cm4gcmVhZCgoY2hhciopcHRyLCBuKTsgfQogICAgaXN0cmVhbSYgZ2V0KHN0cmVhbWJ1ZiYg c2IsIGNoYXIgZGVsaW0gPSAnXG4nKTsKICAgIGlzdHJlYW0mIGdldHMoY2hhciAqKnMsIGNoYXIg ZGVsaW0gPSAnXG4nKTsKICAgIGludCBpcGZ4KGludCBuZWVkID0gMCkgewoJaWYgKCFnb29kKCkp IHsgc2V0KGlvczo6ZmFpbGJpdCk7IHJldHVybiAwOyB9CgllbHNlIHsKCSAgIDsKCSAgaWYgKF90 aWUgJiYgKG5lZWQgPT0gMCB8fCByZGJ1ZigpLT5pbl9hdmFpbCgpIDwgbmVlZCkpIF90aWUtPmZs dXNoKCk7CgkgIGlmICghbmVlZCAmJiAoZmxhZ3MoKSAmIGlvczo6c2tpcHdzKSkgcmV0dXJuIF9z a2lwX3dzKCk7CgkgIGVsc2UgcmV0dXJuIDE7Cgl9CiAgICB9CiAgICBpbnQgaXBmeDAoKSB7ICAK CWlmICghZ29vZCgpKSB7IHNldChpb3M6OmZhaWxiaXQpOyByZXR1cm4gMDsgfQoJZWxzZSB7Cgkg ICA7CgkgIGlmIChfdGllKSBfdGllLT5mbHVzaCgpOwoJICBpZiAoZmxhZ3MoKSAmIGlvczo6c2tp cHdzKSByZXR1cm4gX3NraXBfd3MoKTsKCSAgZWxzZSByZXR1cm4gMTsKCX0KICAgIH0KICAgIGlu dCBpcGZ4MSgpIHsgIAoJaWYgKCFnb29kKCkpIHsgc2V0KGlvczo6ZmFpbGJpdCk7IHJldHVybiAw OyB9CgllbHNlIHsKCSAgIDsKCSAgaWYgKF90aWUgJiYgcmRidWYoKS0+aW5fYXZhaWwoKSA9PSAw KSBfdGllLT5mbHVzaCgpOwoJICByZXR1cm4gMTsKCX0KICAgIH0KICAgIHZvaWQgaXNmeCgpIHsg IDsgfQogICAgaW50IGdldCgpIHsgaWYgKCFpcGZ4MSgpKSByZXR1cm4gKC0xKSA7CgkJZWxzZSB7 IGludCBjaCA9IF9zdHJidWYtPnNidW1wYygpOwoJCSAgICAgICBpZiAoY2ggPT0gKC0xKSApIHNl dChpb3M6OmVvZmJpdCk7CgkJICAgICAgIGlzZngoKTsKCQkgICAgICAgcmV0dXJuIGNoOwoJCSAg ICAgfSB9CiAgICBpbnQgcGVlaygpOwogICAgc2l6ZV90ICAgZ2NvdW50KCkgeyByZXR1cm4gX2dj b3VudDsgfQogICAgaXN0cmVhbSYgaWdub3JlKGludCBuPTEsIGludCBkZWxpbSA9ICgtMSkgKTsK ICAgIGludCBzeW5jICgpOwogICAgaXN0cmVhbSYgc2Vla2coc3RyZWFtcG9zKTsKICAgIGlzdHJl YW0mIHNlZWtnKHN0cmVhbW9mZiwgX3NlZWtfZGlyKTsKICAgIHN0cmVhbXBvcyB0ZWxsZygpOwog ICAgaXN0cmVhbSYgcHV0YmFjayhjaGFyIGNoKSB7CglpZiAoZ29vZCgpICYmIF9zdHJidWYtPnNw dXRiYWNrYyhjaCkgPT0gKC0xKSApIGNsZWFyKGlvczo6YmFkYml0KTsKCXJldHVybiAqdGhpczt9 CiAgICBpc3RyZWFtJiB1bmdldCgpIHsKCWlmIChnb29kKCkgJiYgX3N0cmJ1Zi0+c3VuZ2V0Yygp ID09ICgtMSkgKSBjbGVhcihpb3M6OmJhZGJpdCk7CglyZXR1cm4gKnRoaXM7fQogICAgaXN0cmVh bSYgc2Nhbihjb25zdCBjaGFyICpmb3JtYXQgLi4uKTsKICAgIGlzdHJlYW0mIHZzY2FuKGNvbnN0 IGNoYXIgKmZvcm1hdCwgX19nbnVjX3ZhX2xpc3QgIGFyZ3MpOwoKCgoKCgogICAgaXN0cmVhbSYg b3BlcmF0b3I+PihjaGFyKik7CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIGNoYXIq IHApIHsgcmV0dXJuIG9wZXJhdG9yPj4oKGNoYXIqKXApOyB9CiAgICBpc3RyZWFtJiBvcGVyYXRv cj4+KHNpZ25lZCBjaGFyKnApIHsgcmV0dXJuIG9wZXJhdG9yPj4oKGNoYXIqKXApOyB9CiAgICBp c3RyZWFtJiBvcGVyYXRvcj4+KGNoYXImIGMpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNp Z25lZCBjaGFyJiBjKSB7cmV0dXJuIG9wZXJhdG9yPj4oKGNoYXImKWMpO30KICAgIGlzdHJlYW0m IG9wZXJhdG9yPj4oc2lnbmVkIGNoYXImIGMpIHtyZXR1cm4gb3BlcmF0b3I+PigoY2hhciYpYyk7 fQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihpbnQmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4o bG9uZyYpOwoKICAgIF9fZXh0ZW5zaW9uX18gaXN0cmVhbSYgb3BlcmF0b3I+Pihsb25nIGxvbmcm KTsKICAgIF9fZXh0ZW5zaW9uX18gaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nIGxv bmcmKTsKCiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHNob3J0Jik7CiAgICBpc3RyZWFtJiBvcGVy YXRvcj4+KHVuc2lnbmVkIGludCYpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBs b25nJik7CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0Jik7CgogICAgaXN0 cmVhbSYgb3BlcmF0b3I+Pihib29sJik7CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihmbG9hdCYp OwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pihkb3VibGUmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9y Pj4obG9uZyBkb3VibGUmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4oIF9fbWFuaXAgZnVuYykg eygqZnVuYykoKnRoaXMpOyByZXR1cm4gKnRoaXM7fQogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pihf X2ltYW5pcCBmdW5jKSB7IHJldHVybiAoKmZ1bmMpKCp0aGlzKTsgfQogICAgaXN0cmVhbSYgb3Bl cmF0b3I+PihzdHJlYW1idWYqKTsKfTsKCmNsYXNzIGlvc3RyZWFtIDogcHVibGljIGlzdHJlYW0s IHB1YmxpYyBvc3RyZWFtCnsKICBwdWJsaWM6CiAgICBpb3N0cmVhbSgpIHsgfQogICAgaW9zdHJl YW0oc3RyZWFtYnVmKiBzYiwgb3N0cmVhbSp0aWVkPSBfX251bGwgKTsKfTsKCmNsYXNzIF9JT19p c3RyZWFtX3dpdGhhc3NpZ24gOiBwdWJsaWMgaXN0cmVhbSB7CnB1YmxpYzoKICBfSU9faXN0cmVh bV93aXRoYXNzaWduJiBvcGVyYXRvcj0oaXN0cmVhbSYpOwogIF9JT19pc3RyZWFtX3dpdGhhc3Np Z24mIG9wZXJhdG9yPShfSU9faXN0cmVhbV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJldHVybiBv cGVyYXRvcj0gKHN0YXRpY19jYXN0PGlzdHJlYW0mPiAocmhzKSk7IH0KfTsKCmNsYXNzIF9JT19v c3RyZWFtX3dpdGhhc3NpZ24gOiBwdWJsaWMgb3N0cmVhbSB7CnB1YmxpYzoKICBfSU9fb3N0cmVh bV93aXRoYXNzaWduJiBvcGVyYXRvcj0ob3N0cmVhbSYpOwogIF9JT19vc3RyZWFtX3dpdGhhc3Np Z24mIG9wZXJhdG9yPShfSU9fb3N0cmVhbV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJldHVybiBv cGVyYXRvcj0gKHN0YXRpY19jYXN0PG9zdHJlYW0mPiAocmhzKSk7IH0KfTsKCmV4dGVybiBfSU9f aXN0cmVhbV93aXRoYXNzaWduIGNpbjsKIApleHRlcm4gX0lPX29zdHJlYW1fd2l0aGFzc2lnbiBj b3V0LCBjZXJyOwoKZXh0ZXJuIF9JT19vc3RyZWFtX3dpdGhhc3NpZ24gY2xvZwoKCgo7CgpleHRl cm4gaXN0cmVhbSYgbG9jayhpc3RyZWFtJiBpbnMpOwpleHRlcm4gaXN0cmVhbSYgdW5sb2NrKGlz dHJlYW0mIGlucyk7CmV4dGVybiBvc3RyZWFtJiBsb2NrKG9zdHJlYW0mIG91dHMpOwpleHRlcm4g b3N0cmVhbSYgdW5sb2NrKG9zdHJlYW0mIG91dHMpOwoKc3RydWN0IElvc3RyZWFtX2luaXQgeyB9 IDsgICAKCmlubGluZSBpb3MmIGRlYyhpb3MmIGkpCnsgaS5zZXRmKGlvczo6ZGVjLCBpb3M6OmRl Y3xpb3M6OmhleHxpb3M6Om9jdCk7IHJldHVybiBpOyB9CmlubGluZSBpb3MmIGhleChpb3MmIGkp CnsgaS5zZXRmKGlvczo6aGV4LCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJldHVybiBp OyB9CmlubGluZSBpb3MmIG9jdChpb3MmIGkpCnsgaS5zZXRmKGlvczo6b2N0LCBpb3M6OmRlY3xp b3M6OmhleHxpb3M6Om9jdCk7IHJldHVybiBpOyB9Cn0gIAoKCiMgNiAiL3Vzci9pbmNsdWRlL2cr Ky9pb3N0cmVhbSIgMiAzCgoKIyAxNDYgIi4uLy4uL2ppa2VzL3NyYy9wbGF0Zm9ybS5oIiAyCgoj IDEgIi91c3IvaW5jbHVkZS9nKysvZnN0cmVhbSIgMSAzCiAKIAoKCgojIDEgIi91c3IvaW5jbHVk ZS9nKysvZnN0cmVhbS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiNwcmFnbWEg aW50ZXJmYWNlCgoKCmV4dGVybiAiQysrIiB7CmNsYXNzIGZzdHJlYW1iYXNlIDogdmlydHVhbCBw dWJsaWMgaW9zIHsKCiAgICBtdXRhYmxlIGZpbGVidWYgX19teV9mYjsgIAoKICAgIHZvaWQgX19m Yl9pbml0ICgpOwogIHB1YmxpYzoKICAgIGZzdHJlYW1iYXNlKCk7CiAgICBmc3RyZWFtYmFzZShp bnQgZmQpOwogICAgZnN0cmVhbWJhc2UoaW50IGZkLCBjaGFyICpwLCBpbnQgbCk7ICAKICAgIGZz dHJlYW1iYXNlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlLCBpbnQgcHJvdD0wNjY0KTsKICAg IHZvaWQgY2xvc2UoKTsKCiAgICBmaWxlYnVmKiByZGJ1ZigpIGNvbnN0IHsgcmV0dXJuICZfX215 X2ZiOyB9CgoKCiAgICB2b2lkIG9wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IG1vZGUsIGludCBw cm90PTA2NjQpOwogICAgaW50IGlzX29wZW4oKSBjb25zdCB7IHJldHVybiByZGJ1ZigpLT5pc19v cGVuKCk7IH0KICAgIHZvaWQgc2V0YnVmKGNoYXIgKnB0ciwgaW50IGxlbikgeyByZGJ1ZigpLT5z ZXRidWYocHRyLCBsZW4pOyB9CiAgICB2b2lkIGF0dGFjaChpbnQgZmQpOwoKCgoKfTsKCmNsYXNz IGlmc3RyZWFtIDogcHVibGljIGZzdHJlYW1iYXNlLCBwdWJsaWMgaXN0cmVhbSB7CiAgcHVibGlj OgogICAgaWZzdHJlYW0oKSA6IGZzdHJlYW1iYXNlKCkgeyB9CiAgICBpZnN0cmVhbShpbnQgZmQp IDogZnN0cmVhbWJhc2UoZmQpIHsgfQogICAgaWZzdHJlYW0oaW50IGZkLCBjaGFyICpwLCBpbnQg bCkgOiBmc3RyZWFtYmFzZShmZCwgcCwgbCkgeyB9ICAKICAgIGlmc3RyZWFtKGNvbnN0IGNoYXIg Km5hbWUsIGludCBtb2RlPWlvczo6aW4sIGludCBwcm90PTA2NjQpCgk6IGZzdHJlYW1iYXNlKG5h bWUsIG1vZGUgfCBpb3M6OmluLCBwcm90KSB7IH0KICAgIHZvaWQgb3Blbihjb25zdCBjaGFyICpu YW1lLCBpbnQgbW9kZT1pb3M6OmluLCBpbnQgcHJvdD0wNjY0KQoJeyBmc3RyZWFtYmFzZTo6b3Bl bihuYW1lLCBtb2RlIHwgaW9zOjppbiwgcHJvdCk7IH0KfTsKCmNsYXNzIG9mc3RyZWFtIDogcHVi bGljIGZzdHJlYW1iYXNlLCBwdWJsaWMgb3N0cmVhbSB7CiAgcHVibGljOgogICAgb2ZzdHJlYW0o KSA6IGZzdHJlYW1iYXNlKCkgeyB9CiAgICBvZnN0cmVhbShpbnQgZmQpIDogZnN0cmVhbWJhc2Uo ZmQpIHsgfQogICAgb2ZzdHJlYW0oaW50IGZkLCBjaGFyICpwLCBpbnQgbCkgOiBmc3RyZWFtYmFz ZShmZCwgcCwgbCkgeyB9ICAKICAgIG9mc3RyZWFtKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2Rl PWlvczo6b3V0LCBpbnQgcHJvdD0wNjY0KQoJOiBmc3RyZWFtYmFzZShuYW1lLCBtb2RlIHwgaW9z OjpvdXQsIHByb3QpIHsgfQogICAgdm9pZCBvcGVuKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2Rl PWlvczo6b3V0LCBpbnQgcHJvdD0wNjY0KQoJeyBmc3RyZWFtYmFzZTo6b3BlbihuYW1lLCBtb2Rl IHwgaW9zOjpvdXQsIHByb3QpOyB9Cn07CgpjbGFzcyBmc3RyZWFtIDogcHVibGljIGZzdHJlYW1i YXNlLCBwdWJsaWMgaW9zdHJlYW0gewogIHB1YmxpYzoKICAgIGZzdHJlYW0oKSA6IGZzdHJlYW1i YXNlKCkgeyB9CiAgICBmc3RyZWFtKGludCBmZCkgOiBmc3RyZWFtYmFzZShmZCkgeyB9CiAgICBm c3RyZWFtKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RlLCBpbnQgcHJvdD0wNjY0KQoJOiBmc3Ry ZWFtYmFzZShuYW1lLCBtb2RlLCBwcm90KSB7IH0KICAgIGZzdHJlYW0oaW50IGZkLCBjaGFyICpw LCBpbnQgbCkgOiBmc3RyZWFtYmFzZShmZCwgcCwgbCkgeyB9ICAKICAgIHZvaWQgb3Blbihjb25z dCBjaGFyICpuYW1lLCBpbnQgbW9kZSwgaW50IHByb3Q9MDY2NCkKCXsgZnN0cmVhbWJhc2U6Om9w ZW4obmFtZSwgbW9kZSwgcHJvdCk7IH0KfTsKfSAgCgojIDYgIi91c3IvaW5jbHVkZS9nKysvZnN0 cmVhbSIgMiAzCgoKIyAxNDcgIi4uLy4uL2ppa2VzL3NyYy9wbGF0Zm9ybS5oIiAyCgoKCgoKCiAK IAogCiAKIAogCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1 LjMvaW5jbHVkZS9uZXciIDEgMwogCiAKCgoKCiNwcmFnbWEgaW50ZXJmYWNlICJuZXciCiMgMSAi L3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgi IDEgMwojIDM0MiAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1 ZGUvc3RkZGVmLmgiIDMKCiMgOCAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45 NS4zL2luY2x1ZGUvbmV3IiAyIDMKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGlu dXgvMi45NS4zL2luY2x1ZGUvZXhjZXB0aW9uIiAxIDMKIAogCgoKCgojcHJhZ21hIGludGVyZmFj ZSAiZXhjZXB0aW9uIgoKZXh0ZXJuICJDKysiIHsKCm5hbWVzcGFjZSBzdGQgewoKY2xhc3MgZXhj ZXB0aW9uIHsKcHVibGljOgogIGV4Y2VwdGlvbiAoKSB7IH0KICB2aXJ0dWFsIH5leGNlcHRpb24g KCkgeyB9CiAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0ICgpIGNvbnN0Owp9OwoKY2xhc3MgYmFk X2V4Y2VwdGlvbiA6IHB1YmxpYyBleGNlcHRpb24gewpwdWJsaWM6CiAgYmFkX2V4Y2VwdGlvbiAo KSB7IH0KICB2aXJ0dWFsIH5iYWRfZXhjZXB0aW9uICgpIHsgfQp9OwoKdHlwZWRlZiB2b2lkICgq dGVybWluYXRlX2hhbmRsZXIpICgpOwp0eXBlZGVmIHZvaWQgKCp1bmV4cGVjdGVkX2hhbmRsZXIp ICgpOwoKdGVybWluYXRlX2hhbmRsZXIgc2V0X3Rlcm1pbmF0ZSAodGVybWluYXRlX2hhbmRsZXIp Owp2b2lkIHRlcm1pbmF0ZSAoKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSk7CnVuZXhw ZWN0ZWRfaGFuZGxlciBzZXRfdW5leHBlY3RlZCAodW5leHBlY3RlZF9oYW5kbGVyKTsKdm9pZCB1 bmV4cGVjdGVkICgpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKYm9vbCB1bmNhdWdo dF9leGNlcHRpb24gKCk7Cgp9ICAKCn0gIAoKCiMgOSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1 c2UtbGludXgvMi45NS4zL2luY2x1ZGUvbmV3IiAyIDMKCgpleHRlcm4gIkMrKyIgewoKbmFtZXNw YWNlIHN0ZCB7CgogIGNsYXNzIGJhZF9hbGxvYyA6IHB1YmxpYyBleGNlcHRpb24gewogIHB1Ymxp YzoKICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeyByZXR1cm4g ImJhZF9hbGxvYyI7IH0KICB9OwoKICBzdHJ1Y3Qgbm90aHJvd190IHt9OwogIGV4dGVybiBjb25z dCBub3Rocm93X3Qgbm90aHJvdzsKICB0eXBlZGVmIHZvaWQgKCpuZXdfaGFuZGxlcikoKTsKICBu ZXdfaGFuZGxlciBzZXRfbmV3X2hhbmRsZXIgKG5ld19oYW5kbGVyKTsKCn0gIAoKIAp2b2lkICpv cGVyYXRvciBuZXcgKHNpemVfdCkgdGhyb3cgKHN0ZDo6YmFkX2FsbG9jKTsKdm9pZCAqb3BlcmF0 b3IgbmV3W10gKHNpemVfdCkgdGhyb3cgKHN0ZDo6YmFkX2FsbG9jKTsKdm9pZCBvcGVyYXRvciBk ZWxldGUgKHZvaWQgKikgdGhyb3coKTsKdm9pZCBvcGVyYXRvciBkZWxldGVbXSAodm9pZCAqKSB0 aHJvdygpOwp2b2lkICpvcGVyYXRvciBuZXcgKHNpemVfdCwgY29uc3Qgc3RkOjpub3Rocm93X3Qm KSB0aHJvdygpOwp2b2lkICpvcGVyYXRvciBuZXdbXSAoc2l6ZV90LCBjb25zdCBzdGQ6Om5vdGhy b3dfdCYpIHRocm93KCk7CnZvaWQgb3BlcmF0b3IgZGVsZXRlICh2b2lkICosIGNvbnN0IHN0ZDo6 bm90aHJvd190JikgdGhyb3coKTsKdm9pZCBvcGVyYXRvciBkZWxldGVbXSAodm9pZCAqLCBjb25z dCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCk7CgogCmlubGluZSB2b2lkICpvcGVyYXRvciBuZXco c2l6ZV90LCB2b2lkICpwbGFjZSkgdGhyb3coKSB7IHJldHVybiBwbGFjZTsgfQppbmxpbmUgdm9p ZCAqb3BlcmF0b3IgbmV3W10oc2l6ZV90LCB2b2lkICpwbGFjZSkgdGhyb3coKSB7IHJldHVybiBw bGFjZTsgfQp9ICAKCgojIDE2NCAiLi4vLi4vamlrZXMvc3JjL3BsYXRmb3JtLmgiIDIKCgoKCgoK CgogICB1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCgoKIyAxODUgIi4uLy4uL2ppa2VzL3NyYy9wbGF0 Zm9ybS5oIgoKCgogCiAKIAogCiAKCgoKIAogCiAKCgogCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBs b25nIHU4OwoKIAp0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaTg7CgoKCiAKdHlwZWRlZiB1bnNp Z25lZCBpbnQgdTQ7CgogCnR5cGVkZWYgc2lnbmVkIGludCBpNDsKCiAKdHlwZWRlZiB1bnNpZ25l ZCBzaG9ydCB1MjsKCiAKdHlwZWRlZiBzaWduZWQgc2hvcnQgaTI7CgogCnR5cGVkZWYgdW5zaWdu ZWQgY2hhciB1MTsKCiAKdHlwZWRlZiBzaWduZWQgY2hhciBpMTsKCgoKCiAKIAogCiAKIyAyNDMg Ii4uLy4uL2ppa2VzL3NyYy9wbGF0Zm9ybS5oIgoKCgogCiAKIAojIDEgIi4uLy4uL2ppa2VzL3Ny Yy90dXBsZS5oIiAxCiAKIAogCiAKIAogCiAKIAogCgoKCiMgMSAiLi4vLi4vamlrZXMvc3JjL2pp a2VzYXBpLmgiIDEKIAoKCgoKCgpjbGFzcyBKaWtlc09wdGlvbgp7ICAgIAogcHVibGljOgogICAg CiAgICBjaGFyICpib290Y2xhc3NwYXRoOwogICAgY2hhciAqZXh0ZGlyczsKICAgIGNoYXIgKmNs YXNzcGF0aDsKICAgIGNoYXIgKnNvdXJjZXBhdGg7CiAgICBjaGFyICpkaXJlY3Rvcnk7CiAgICBj aGFyICplbmNvZGluZzsKCiAgICAgCiAgICAgCiAgICBpbnQgbm93cml0ZTsKICAgIGludCBkZXBy ZWNhdGlvbjsKICAgIGludCBPOwogICAgaW50IGc7CiAgICBpbnQgdmVyYm9zZTsKICAgIGludCBk ZXBlbmQ7CiAgICBpbnQgbm93YXJuOwogICAgaW50IG9sZF9jbGFzc3BhdGhfc2VhcmNoX29yZGVy OwogICAgaW50IHplcm9fZGVmZWN0OwoKICAgIHZpcnR1YWwgfkppa2VzT3B0aW9uKCk7CgogcHJv dGVjdGVkOgogICAgCiAgICBKaWtlc09wdGlvbigpOwp9OwoKY2xhc3MgSmlrZXNFcnJvcgp7CiBw dWJsaWM6CgogICAgZW51bSBKaWtlc0Vycm9yU2V2ZXJpdHkKICAgIHsKICAgICAgICBKSUtFU19F UlJPUiwKICAgICAgICBKSUtFU19DQVVUSU9OLAogICAgICAgIEpJS0VTX1dBUk5JTkcKICAgIH0g OwogICAgICAgIAogICAgdmlydHVhbCBKaWtlc0Vycm9yU2V2ZXJpdHkgZ2V0U2V2ZXJpdHkoKSA9 IDAgOwogICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXRGaWxlTmFtZSgpID0gMCA7CiAgICAKICAg IHZpcnR1YWwgaW50IGdldExlZnRMaW5lTm8gICAgICAoKSA9IDAgOwogICAgdmlydHVhbCBpbnQg Z2V0TGVmdENvbHVtbk5vICAgICgpID0gMCA7CiAgICB2aXJ0dWFsIGludCBnZXRSaWdodExpbmVO byAgICAgKCkgPSAwIDsKICAgIHZpcnR1YWwgaW50IGdldFJpZ2h0Q29sdW1uTm8gICAoKSA9IDAg OwoKICAgICAKCgogICAgdmlydHVhbCBjb25zdCB3Y2hhcl90ICpnZXRFcnJvck1lc3NhZ2UoKSA9 IDA7CgogICAgIAoKCiAgICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QgKmdldEVycm9yUmVwb3J0KCkg PSAwOwoKIHByb3RlY3RlZDoKCiAgICBjb25zdCBjaGFyICpnZXRTZXZlcml0eVN0cmluZygpOwp9 OwoKIAoKCmNsYXNzIEppa2VzQVBJCnsKIHB1YmxpYzoKCiAgICBKaWtlc0FQSSgpOwogICAgCiAg ICB2aXJ0dWFsIH5KaWtlc0FQSSgpOwogICAgICAgCiAgICAgCgoKCgogICAgdmlydHVhbCBKaWtl c09wdGlvbiAqZ2V0T3B0aW9ucygpOwogICAgCiAgICAgCgoKCgoKCgoKICAgIHZpcnR1YWwgY2hh cioqIHBhcnNlT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIDsKCiAgICAgCgoKICAgIHZp cnR1YWwgaW50IGNvbXBpbGUoY2hhciAqKiBmaWxlbmFtZXMpOwoKICAgICAKCgoKICAgIHN0YXRp YyBKaWtlc0FQSSAqIGdldEluc3RhbmNlKCk7CgogICAgIAoKCiAgICB2aXJ0dWFsIHZvaWQgcmVw b3J0RXJyb3IoSmlrZXNFcnJvciAqZXJyb3IpOwogICAgCiAgICAKICAgICAKCgoKICAgIGNsYXNz IEZpbGVSZWFkZXIKICAgICAgICB7CiAgICBwdWJsaWM6CiAgICAgICAgICAgIHZpcnR1YWwgIH5G aWxlUmVhZGVyKCkgIHt9CiAgICAgICAgICAgIAogICAgICAgICAgICB2aXJ0dWFsIGNvbnN0IGNo YXIgICAgICpnZXRCdWZmZXIoKSAgICAgID0gMDsJIAogICAgICAgICAgICB2aXJ0dWFsICAgICAg IHNpemVfdCAgICBnZXRCdWZmZXJTaXplKCkgID0gMDsJIAogICAgICAgIH07CgogICAgIAoKCgog ICAgY2xhc3MgRmlsZVdyaXRlcgogICAgICAgIHsKICAgIHB1YmxpYzoKICAgICAgICAgICAgRmls ZVdyaXRlcihzaXplX3QgbVMpOiAgIG1heFNpemUobVMpIHt9IAogICAgICAgICAgICB2aXJ0dWFs ICB+RmlsZVdyaXRlcigpIHt9CiAgICAgICAgICAgIAogICAgICAgICAgICBzaXplX3QgICAgd3Jp dGUoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgICAgICAgICB2 aXJ0dWFsICBpbnQgICAgICBpc1ZhbGlkKCkgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOwog ICAgICAgICAgICAKICAgIHByaXZhdGU6CiAgICAgICAgICAgIAogICAgICAgICAgICB2aXJ0dWFs ICBzaXplX3QgICAgZG9Xcml0ZShjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6 ZSkgICA9IDA7CSAKICAgICAgICAgICAgc2l6ZV90ICAgbWF4U2l6ZTsKICAgICAgICB9OwogICAg ICAgIAogICAgdmlydHVhbCBpbnQgc3RhdChjb25zdCBjaGFyICpmaWxlbmFtZSwgc3RydWN0IHN0 YXQgKnN0YXR1cyk7CiAgICAKICAgIHZpcnR1YWwgRmlsZVJlYWRlciAgKnJlYWQgIChjb25zdCBj aGFyICpmaWxlbmFtZSAgICAgICAgICAgICAgKTsKICAgIHZpcnR1YWwgRmlsZVdyaXRlciAgKndy aXRlIChjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90IGJ5dGVzKTsKICAgIAogcHJpdmF0ZToK CiAgICB2b2lkIGNsZWFudXBPcHRpb25zKCk7ICAKCiAgICBKaWtlc09wdGlvbiAqb3B0aW9uOwog ICAgY2hhciAqKnBhcnNlZE9wdGlvbnM7CgogICAgc3RhdGljIEppa2VzQVBJICppbnN0YW5jZTsK fTsKCgojIDEzICIuLi8uLi9qaWtlcy9zcmMvdHVwbGUuaCIgMgoKCgoKCgpjbGFzcyBPdXRwdXRC dWZmZXI7CgogCiAKIAogCiAKIAogCiAKIAp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgVHVwbGUK ewpwcm90ZWN0ZWQ6CgogICAgZnJpZW5kIGNsYXNzIE91dHB1dEJ1ZmZlcjsKCiAgICBlbnVtIHsg REVGQVVMVF9MT0dfQkxLU0laRSA9IDMsIERFRkFVTFRfQkFTRV9JTkNSRU1FTlQgPSA0IH07Cgog ICAgVCAqKmJhc2U7CiAgICBpbnQgYmFzZV9zaXplLAogICAgICAgIHRvcCwKICAgICAgICBzaXpl OwoKICAgIGludCBsb2dfYmxrc2l6ZSwKICAgICAgICBiYXNlX2luY3JlbWVudDsKCiAgICBpbmxp bmUgaW50IEJsa3NpemUoKSB7IHJldHVybiAoMSA8PCBsb2dfYmxrc2l6ZSk7IH0KCiAgICAgCiAg ICAgCiAgICAgCiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZU1vcmVTcGFjZSgpCiAgICB7CiAgICAg ICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAg ICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAg CiAgICAgICAgIAogICAgICAgIGludCBrID0gc2l6ZSA+PiBsb2dfYmxrc2l6ZTsgIAoKICAgICAg ICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICBpZiAoayA9PSBiYXNlX3NpemUpCiAgICAg ICAgewogICAgICAgICAgICBpbnQgb2xkX2Jhc2Vfc2l6ZSA9IGJhc2Vfc2l6ZTsKICAgICAgICAg ICAgVCAqKm9sZF9iYXNlID0gYmFzZTsKCiAgICAgICAgICAgIGJhc2Vfc2l6ZSArPSBiYXNlX2lu Y3JlbWVudDsKICAgICAgICAgICAgYmFzZSA9IG5ldyBUKltiYXNlX3NpemVdOwoKICAgICAgICAg ICAgaWYgKG9sZF9iYXNlICE9IF9fbnVsbCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg IG1lbW1vdmUoYmFzZSwgb2xkX2Jhc2UsIG9sZF9iYXNlX3NpemUgKiBzaXplb2YoVCAqKSk7CiAg ICAgICAgICAgICAgICBkZWxldGUgW10gb2xkX2Jhc2U7CiAgICAgICAgICAgIH0KICAgICAgICAg ICAgbWVtc2V0KCZiYXNlW29sZF9iYXNlX3NpemVdLCAwLCAoYmFzZV9zaXplIC0gb2xkX2Jhc2Vf c2l6ZSkgKiBzaXplb2YoVCAqKSk7CiAgICAgICAgfQoKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICBiYXNlW2tdID0gbmV3 IFRbQmxrc2l6ZSgpXTsKICAgICAgICBiYXNlW2tdIC09IHNpemU7CgogICAgICAgICAKICAgICAg ICAgCiAgICAgICAgIAogICAgICAgIHNpemUgKz0gQmxrc2l6ZSgpOwoKICAgICAgICByZXR1cm47 CiAgICB9CgpwdWJsaWM6CgogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAg IAogICAgIAogICAgIAogICAgaW5saW5lIHZvaWQgUmVzaXplKGNvbnN0IGludCBuID0gMCkKICAg IHsKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgIGlmIChuID4gc2l6ZSkKICAgICAgICB7CiAgICAgICAgICAgIGRvCiAgICAgICAgICAgIHsK ICAgICAgICAgICAgICAgIEFsbG9jYXRlTW9yZVNwYWNlKCk7CiAgICAgICAgICAgIH0gd2hpbGUg KG4gPiBzaXplKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobiA8IHNpemUpCiAgICAgICAg ewogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgaW50IHNsb3QgPSAobiA8 PSAwID8gLTEgOiAobiAtIDEpID4+IGxvZ19ibGtzaXplKTsKCiAgICAgICAgICAgIGZvciAoaW50 IGsgPSAoc2l6ZSA+PiBsb2dfYmxrc2l6ZSkgLSAxOyBrID4gc2xvdDsgay0tKQogICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICBzaXplIC09IEJsa3NpemUoKTsKICAgICAgICAgICAgICAgIGJh c2Vba10gKz0gc2l6ZTsKICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSBiYXNlW2tdOwogICAgICAg ICAgICAgICAgYmFzZVtrXSA9IF9fbnVsbCA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlm IChzbG90IDwgMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGVsZXRlIFtdIGJhc2U7 CiAgICAgICAgICAgICAgICBiYXNlID0gX19udWxsIDsKICAgICAgICAgICAgICAgIGJhc2Vfc2l6 ZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRvcCAgPSBuOwogICAgfQoK ICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGlubGluZSB2b2lkIFJlc2V0 KGNvbnN0IGludCBuID0gMCkKICAgIHsKICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIG4g Pj0gMCAmJiBuIDw9IHNpemUgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoIm4gPj0gMCAmJiBuIDw9 IHNpemUiICwgIi4uLy4uL2ppa2VzL3NyYy90dXBsZS5oIiwgMTYzLCBfX1BSRVRUWV9GVU5DVElP Tl9fICksIDApKSkgOwoKICAgICAgICB0b3AgPSBuOwogICAgfQoKICAgICAKICAgICAKICAgICAK ICAgIGlubGluZSBpbnQgTGVuZ3RoKCkgeyByZXR1cm4gdG9wOyB9CgogICAgIAogICAgIAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgaW5saW5lIFQmIG9wZXJhdG9yW10oY29uc3Qg aW50IGkpCiAgICB7CiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBpID49IDAgJiYgaSA8 IHRvcCApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiaSA+PSAwICYmIGkgPCB0b3AiICwgIi4uLy4u L2ppa2VzL3NyYy90dXBsZS5oIiwgMTgyLCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoK ICAgICAgICByZXR1cm4gYmFzZVtpID4+IGxvZ19ibGtzaXplXVtpXTsKICAgIH0KCiAgICAgCiAg ICAgCiAgICAgCiAgICBpbmxpbmUgaW50IE5leHRJbmRleCgpCiAgICB7CiAgICAgICAgaW50IGkg PSB0b3ArKzsKICAgICAgICBpZiAoaSA9PSBzaXplKQogICAgICAgICAgICBBbGxvY2F0ZU1vcmVT cGFjZSgpOwogICAgICAgIHJldHVybiBpOwogICAgfQoKICAgIGlubGluZSB2b2lkIFB1c2goVCBl bHQpIHsgdGhpcyAtPiBOZXh0KCkgPSBlbHQ7IH0KICAgICAKICAgICAKICAgIGlubGluZSBUIFBv cCgpIHsgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCB0b3AhPTAgKSA/IDAgOgkoX19hc3NlcnRfZmFp bCAoInRvcCE9MCIgLCAiLi4vLi4vamlrZXMvc3JjL3R1cGxlLmgiLCAyMDEsIF9fUFJFVFRZX0ZV TkNUSU9OX18gKSwgMCkpKSA7IHRvcC0tOyByZXR1cm4gYmFzZVt0b3AgPj4gbG9nX2Jsa3NpemVd W3RvcF07IH0KICAgIGlubGluZSBUIFRvcCgpIHsgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCB0b3Ah PTAgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInRvcCE9MCIgLCAiLi4vLi4vamlrZXMvc3JjL3R1 cGxlLmgiLCAyMDIsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7IHJldHVybiAoKnRoaXMp W3RvcC0xXTsgfQoKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGlubGluZSBUJiBOZXh0KCkg eyBpbnQgaSA9IE5leHRJbmRleCgpOyByZXR1cm4gYmFzZVtpID4+IGxvZ19ibGtzaXplXVtpXTsg fQoKICAgICAKICAgICAKICAgICAKICAgIGlubGluZSBUdXBsZTxUPiYgb3BlcmF0b3I9KGNvbnN0 IFR1cGxlPFQ+JiByaHMpCiAgICB7CiAgICAgICAgaWYgKHRoaXMgIT0gJnJocykKICAgICAgICB7 CiAgICAgICAgICAgIFJlc2l6ZShyaHMudG9wKTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7 IGkgPCByaHMudG9wOyBpKyspCiAgICAgICAgICAgICAgICBiYXNlW2kgPj4gbG9nX2Jsa3NpemVd W2ldID0gcmhzLmJhc2VbaSA+PiBsb2dfYmxrc2l6ZV1baV07CiAgICAgICAgfQoKICAgICAgICBy ZXR1cm4gKnRoaXM7CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAgVHVwbGUodW5zaWduZWQg ZXN0aW1hdGUgPSAwKQogICAgewogICAgICAgIGlmIChlc3RpbWF0ZSA9PSAwKQogICAgICAgIHsK ICAgICAgICAgICAgbG9nX2Jsa3NpemUgPSBERUZBVUxUX0xPR19CTEtTSVpFOwogICAgICAgICAg ICBiYXNlX2luY3JlbWVudCA9IERFRkFVTFRfQkFTRV9JTkNSRU1FTlQ7CiAgICAgICAgfQogICAg ICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGZvciAobG9nX2Jsa3NpemUgPSAxOyAoKCh1 bnNpZ25lZCkgMSA8PCBsb2dfYmxrc2l6ZSkgPCBlc3RpbWF0ZSkgJiYgKGxvZ19ibGtzaXplIDwg MzEpOyBsb2dfYmxrc2l6ZSsrKQogICAgICAgICAgICAgICAgOwogICAgICAgICAgICBpZiAobG9n X2Jsa3NpemUgPD0gREVGQVVMVF9MT0dfQkxLU0laRSkKICAgICAgICAgICAgICAgIGJhc2VfaW5j cmVtZW50ID0gMTsKICAgICAgICAgICAgZWxzZSBpZiAobG9nX2Jsa3NpemUgPCAxMykKICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgYmFzZV9pbmNyZW1lbnQgPSAodW5zaWduZWQpIDEgPDwg KGxvZ19ibGtzaXplIC0gNCk7CiAgICAgICAgICAgICAgICBsb2dfYmxrc2l6ZSA9IDQ7CiAgICAg ICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBi YXNlX2luY3JlbWVudCA9ICh1bnNpZ25lZCkgMSA8PCAobG9nX2Jsa3NpemUgLSA4KTsKICAgICAg ICAgICAgICAgIGxvZ19ibGtzaXplID0gODsKICAgICAgICAgICAgfQogICAgICAgICAgICBiYXNl X2luY3JlbWVudCsrOyAgCiAgICAgICAgfQoKICAgICAgICBiYXNlX3NpemUgPSAwOwogICAgICAg IHNpemUgPSAwOwogICAgICAgIHRvcCA9IDA7CiAgICAgICAgYmFzZSA9IF9fbnVsbCA7CiAgICB9 CgogICAgIAogICAgIAogICAgIAogICAgVHVwbGUoaW50IGxvZ19ibGtzaXplXywgaW50IGJhc2Vf aW5jcmVtZW50XykgOiBsb2dfYmxrc2l6ZShsb2dfYmxrc2l6ZV8pLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2luY3JlbWVudChiYXNlX2lu Y3JlbWVudF8pCiAgICB7CiAgICAgICAgYmFzZV9zaXplID0gMDsKICAgICAgICBzaXplID0gMDsK ICAgICAgICB0b3AgPSAwOwogICAgICAgIGJhc2UgPSBfX251bGwgOwogICAgfQoKICAgICAKICAg ICAKICAgICAKICAgIFR1cGxlKGNvbnN0IFR1cGxlPFQ+JiByaHMpIDogbG9nX2Jsa3NpemUocmhz LmxvZ19ibGtzaXplKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9pbmNy ZW1lbnQocmhzLmJhc2VfaW5jcmVtZW50KQogICAgewogICAgICAgIGJhc2Vfc2l6ZSA9IDA7CiAg ICAgICAgc2l6ZSA9IDA7CiAgICAgICAgYmFzZSA9IF9fbnVsbCA7CiAgICAgICAgKnRoaXMgPSBy aHM7CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAgflR1cGxlKCkgeyBSZXNpemUoMCk7IH0K CiAgICAgCgogICAgIAogICAgIAogICAgIAogICAgaW5saW5lIHNpemVfdCBTcGFjZUFsbG9jYXRl ZCh2b2lkKQogICAgewogICAgICAgIHJldHVybiAoKGJhc2Vfc2l6ZSAqIHNpemVvZihUICoqKSkg KyAoc2l6ZSAqIHNpemVvZihUKSkpOwogICAgfQoKICAgICAKICAgICAKICAgICAKICAgIGlubGlu ZSBzaXplX3QgU3BhY2VVc2VkKHZvaWQpCiAgICB7CiAgICAgICAgcmV0dXJuICgoKHNpemUgPj4g bG9nX2Jsa3NpemUpICogc2l6ZW9mKFQgKiopKSArICh0b3AgKiBzaXplb2YoVCkpKTsKICAgIH0K fTsKCgogCiAKIAp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgQ29udmVydGlibGVBcnJheSA6IHB1 YmxpYyBUdXBsZTxUPgp7CnB1YmxpYzoKCiAgICBDb252ZXJ0aWJsZUFycmF5KGludCBlc3RpbWF0 ZSA9IDApIDogVHVwbGU8VD4oZXN0aW1hdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGFycmF5KF9fbnVsbCApCiAgICB7fQoKICAgIENvbnZlcnRpYmxlQXJyYXko aW50IGxvZ19ibGtzaXplLCBpbnQgYmFzZV9pbmNyZW1lbnQpIDogVHVwbGU8VD4obG9nX2Jsa3Np emUsIGJhc2VfaW5jcmVtZW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkoX19udWxsICkKICAgIHt9CgogICAgfkNvbnZl cnRpYmxlQXJyYXkoKSB7IGRlbGV0ZSBbXSBhcnJheTsgfQoKICAgICAKICAgICAKICAgICAKICAg ICAKICAgIGlubGluZSBUIComQXJyYXkoKQogICAgewogICAgICAgIGlmICgoISBhcnJheSkgJiYg VHVwbGU8VD46OnRvcCA+IDApCiAgICAgICAgewogICAgICAgICAgICBhcnJheSA9IG5ldyBUW1R1 cGxlPFQ+Ojp0b3BdOwoKICAgICAgICAgICAgaW50IGkgPSAwLAogICAgICAgICAgICAgICAgcHJv Y2Vzc2VkX3NpemUgPSAwLAogICAgICAgICAgICAgICAgbiA9IChUdXBsZTxUPjo6dG9wIC0gMSkg Pj4gVHVwbGU8VD46OmxvZ19ibGtzaXplOyAgCiAgICAgICAgICAgIHdoaWxlIChpIDwgbikKICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgbWVtbW92ZSgmYXJyYXlbcHJvY2Vzc2VkX3NpemVd LCBUdXBsZTxUPjo6YmFzZVtpXSArIHByb2Nlc3NlZF9zaXplLCBUdXBsZTxUPjo6Qmxrc2l6ZSgp ICogc2l6ZW9mKFQpKTsKICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSAoVHVwbGU8VD46OmJhc2Vb aV0gKyBwcm9jZXNzZWRfc2l6ZSk7CiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAg ICBwcm9jZXNzZWRfc2l6ZSArPSBUdXBsZTxUPjo6Qmxrc2l6ZSgpOwogICAgICAgICAgICB9CiAg ICAgICAgICAgIG1lbW1vdmUoJmFycmF5W3Byb2Nlc3NlZF9zaXplXSwgVHVwbGU8VD46OmJhc2Vb bl0gKyBwcm9jZXNzZWRfc2l6ZSwgKFR1cGxlPFQ+Ojp0b3AgLSBwcm9jZXNzZWRfc2l6ZSkgKiBz aXplb2YoVCkpOwogICAgICAgICAgICBkZWxldGUgW10gKFR1cGxlPFQ+OjpiYXNlW25dICsgcHJv Y2Vzc2VkX3NpemUpOwogICAgICAgICAgICBkZWxldGUgW10gVHVwbGU8VD46OmJhc2U7CiAgICAg ICAgICAgIFR1cGxlPFQ+OjpiYXNlID0gX19udWxsIDsKICAgICAgICAgICAgVHVwbGU8VD46OnNp emUgPSAwOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgfQoKICAgIGlubGlu ZSBUJiBvcGVyYXRvcltdKGNvbnN0IGludCBpKQogICAgewogICAgICAgIChzdGF0aWNfY2FzdDx2 b2lkPiAgKCggaSA+PSAwICYmIGkgPCBUdXBsZTxUPjo6dG9wICkgPyAwIDoJKF9fYXNzZXJ0X2Zh aWwgKCJpID49IDAgJiYgaSA8IFR1cGxlPFQ+Ojp0b3AiICwgIi4uLy4uL2ppa2VzL3NyYy90dXBs ZS5oIiwgMzU5LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICByZXR1cm4g KGFycmF5ID8gYXJyYXlbaV0gOiBUdXBsZTxUPjo6YmFzZVtpID4+IFR1cGxlPFQ+Ojpsb2dfYmxr c2l6ZV1baV0pOwogICAgfQoKICAgIGlubGluZSB2b2lkIFJlc2l6ZShjb25zdCBpbnQgbiA9IDAp IHsgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBmYWxzZSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgi ZmFsc2UiICwgIi4uLy4uL2ppa2VzL3NyYy90dXBsZS5oIiwgMzY0LCBfX1BSRVRUWV9GVU5DVElP Tl9fICksIDApKSkgOyB9CiAgICBpbmxpbmUgdm9pZCBSZXNldChjb25zdCBpbnQgbiA9IDApIHsg KHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBmYWxzZSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiZmFs c2UiICwgIi4uLy4uL2ppa2VzL3NyYy90dXBsZS5oIiwgMzY1LCBfX1BSRVRUWV9GVU5DVElPTl9f ICksIDApKSkgOyB9CiAgICBpbmxpbmUgVCYgTmV4dCgpCiAgICB7CiAgICAgICAgKHN0YXRpY19j YXN0PHZvaWQ+ICAoKCAhIGFycmF5ICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCIhIGFycmF5IiAs ICIuLi8uLi9qaWtlcy9zcmMvdHVwbGUuaCIsIDM2OCwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAw KSkpIDsKCiAgICAgICAgaW50IGkgPSBUdXBsZTxUPjo6TmV4dEluZGV4KCk7CiAgICAgICAgcmV0 dXJuIFR1cGxlPFQ+OjpiYXNlW2kgPj4gVHVwbGU8VD46OmxvZ19ibGtzaXplXVtpXTsKICAgIH0K ICAgIGlubGluZSBUdXBsZTxUPiYgb3BlcmF0b3I9KGNvbnN0IFR1cGxlPFQ+JiByaHMpCiAgICB7 CiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBmYWxzZSApID8gMCA6CShfX2Fzc2VydF9m YWlsICgiZmFsc2UiICwgIi4uLy4uL2ppa2VzL3NyYy90dXBsZS5oIiwgMzc1LCBfX1BSRVRUWV9G VU5DVElPTl9fICksIDApKSkgOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCnByaXZhdGU6 CgogICAgVCAqYXJyYXk7Cn07CgoKIAogCiAKY2xhc3MgT3V0cHV0QnVmZmVyCnsKcHVibGljOgoK ICAgIE91dHB1dEJ1ZmZlcihpbnQgbG9nX2Jsa3NpemUgPSAxMywgaW50IGJhc2VfaW5jcmVtZW50 ID0gMTI4KSA6IGJ1ZmZlcihsb2dfYmxrc2l6ZSwgYmFzZV9pbmNyZW1lbnQpIHt9CgogICAgaW5s aW5lIHZvaWQgUHV0QjEodTEgdSkgeyBidWZmZXIuTmV4dCgpID0gdTsgfQoKICAgIGlubGluZSB2 b2lkIFB1dEIyKHUyIHUpCiAgICB7CiAgICAgICAgYnVmZmVyLk5leHQoKSA9IHUgPj4gODsKICAg ICAgICBidWZmZXIuTmV4dCgpID0gdSAmIDB4ZmY7CiAgICB9CgogICAgaW5saW5lIHZvaWQgUHV0 QjQodTQgdSkKICAgIHsKICAgICAgICBidWZmZXIuTmV4dCgpID0gdSA+PiAyNDsKICAgICAgICBi dWZmZXIuTmV4dCgpID0gKHUgPj4gMTYpICYgMHhmZjsKICAgICAgICBidWZmZXIuTmV4dCgpID0g KHUgPj4gOCkgICYgMHhmZjsKICAgICAgICBidWZmZXIuTmV4dCgpID0gdSAmIDB4ZmY7CiAgICB9 CgogICAgaW5saW5lIHZvaWQgcHV0X24odTEgKnUsIGludCBuKQogICAgewogICAgICAgIGZvciAo aW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgICAgICBidWZmZXIuTmV4dCgpID0gdVtpXTsK ICAgIH0KCiAgICBpbmxpbmUgYm9vbCBXcml0ZVRvRmlsZShjaGFyICpmaWxlX25hbWUpCiAgICB7 CiAgICAgICAgSmlrZXNBUEk6OkZpbGVXcml0ZXIgKmZpbGUgPSBKaWtlc0FQSTo6Z2V0SW5zdGFu Y2UoKS0+d3JpdGUoZmlsZV9uYW1lLGJ1ZmZlci50b3ApOwoKICAgICAgICBpZiAoZmlsZSA9PSBf X251bGwgKSAgCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgc2l6ZV90IHNpemUg ID0gMDsKICAgICAgICBpbnQgICAgbiAgICAgPSAoYnVmZmVyLnRvcCAtIDEpID4+IGJ1ZmZlci5s b2dfYmxrc2l6ZTsgIAoKICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBuOyBpKyspCiAgICAgICAg ewogICAgICAgICAgICBmaWxlLT53cml0ZShidWZmZXIuYmFzZVtpXSArIHNpemUsIGJ1ZmZlci5C bGtzaXplKCkpOwogICAgICAgICAgICBzaXplICs9IGJ1ZmZlci5CbGtzaXplKCk7CiAgICAgICAg fQogICAgICAgIGZpbGUtPndyaXRlKGJ1ZmZlci5iYXNlW25dICsgc2l6ZSwgKGJ1ZmZlci50b3Ag LSBzaXplKSk7CgogICAgICAgIGRlbGV0ZSBmaWxlOwogICAgICAgCiAgICAgICAgcmV0dXJuIHRy dWU7CiAgICB9Cgpwcml2YXRlOgoKICAgIFR1cGxlPHUxPiBidWZmZXI7Cn07CgoKCgoKCgojIDI0 OSAiLi4vLi4vamlrZXMvc3JjL3BsYXRmb3JtLmgiIDIKCgoKCgoKCgogCiAKIAoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgogCiAKIAp2b2lkIFNldE5ld0hhbmRsZXIoKTsKCgoKCmV4dGVybiB2 b2lkIE91dE9mTWVtb3J5KCk7CgoKIAogCiAKIAogCmV4dGVybiB2b2lkIEZsb2F0aW5nUG9pbnRD aGVjaygpOwoKCiAKIAogCiAKZXh0ZXJuIGludCBTeXN0ZW1TdGF0KGNvbnN0IGNoYXIgKm5hbWUs IHN0cnVjdCBzdGF0ICpzdGF0X3N0cnVjdCk7CmV4dGVybiBGSUxFICpTeXN0ZW1Gb3Blbihjb25z dCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICptb2RlKTsKZXh0ZXJuIHNpemVfdCBTeXN0ZW1GcmVh ZChjaGFyICpwdHIsIHNpemVfdCBlbGVtZW50X3NpemUsIHNpemVfdCBjb3VudCwgRklMRSAqc3Ry ZWFtKTsKZXh0ZXJuIGludCBTeXN0ZW1Jc0RpcmVjdG9yeShjaGFyICpuYW1lKTsKCiAKIAogCiAK ZXh0ZXJuIGNoYXIgUGF0aFNlcGFyYXRvcigpOwpleHRlcm4gaW50IFN5c3RlbU1rZGlyKGNoYXIg Kik7CmV4dGVybiBpbnQgU3lzdGVtTWtkaXJoaWVyKGNoYXIgKik7CgpleHRlcm4gY2hhciAqIHN0 cmNhdDMoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CmV4dGVybiBj aGFyICogd3N0cmluZzJzdHJpbmcod2NoYXJfdCAqIGluKTsKCgoKCiAKIAogCiAKIAogCgoKCiAK IAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoK ZW51bSBVX2NoYXJzCnsKICAgIFVfTlVMTCA9IDAsICAgICAgICAgICAgICAgVV9OVSA9IFVfTlVM TCwgICAgICAgICAgICAgCiAgICBVX0JBQ0tTUEFDRSA9IDgsICAgICAgICAgIFVfQlMgPSBVX0JB Q0tTUEFDRSwgICAgICAgIAogICAgVV9IT1JJWk9OVEFMX1RBQiA9IDksICAgICBVX0hUID0gVV9I T1JJWk9OVEFMX1RBQiwgICAKICAgIFVfTElORV9GRUVEID0gMTAsICAgICAgICAgVV9MRiA9IFVf TElORV9GRUVELCAgICAgICAgCiAgICBVX0ZPUk1fRkVFRCA9IDEyLCAgICAgICAgIFVfRkYgPSBV X0ZPUk1fRkVFRCwgICAgICAgIAogICAgVV9DQVJSSUFHRV9SRVRVUk4gPSAxMywgICBVX0NSID0g VV9DQVJSSUFHRV9SRVRVUk4sICAKCiAgICBVX0NUTF9aID0gMjYsCiAgICBVX0VTQ0FQRSA9IDI3 LAoKICAgIFVfU1BBQ0UgPSAzMiwgICAgICAgICAgICAgVV9TUCA9IFVfU1BBQ0UsICAgICAgICAg ICAgICAKICAgIFVfRVhDTEFNQVRJT04gPSAzMywgICAgICAgVV9FWCA9IFVfRVhDTEFNQVRJT04s ICAgICAgICAKICAgIFVfRE9VQkxFX1FVT1RFID0gMzQsICAgICAgVV9EUSA9IFVfRE9VQkxFX1FV T1RFLCAgICAgICAKICAgIFVfUE9VTkQgPSAzNSwgICAgICAgICAgICAgVV9TSCA9IFVfUE9VTkQs ICAgICAgICAgICAgICAKICAgIFVfRE9MTEFSID0gMzYsICAgICAgICAgICAgVV9EUyA9IFVfRE9M TEFSLCAgICAgICAgICAgICAKICAgIFVfUEVSQ0VOVCA9IDM3LCAgICAgICAgICAgVV9QRSA9IFVf UEVSQ0VOVCwgICAgICAgICAgICAKICAgIFVfQU1QRVJTQU5EID0gMzgsICAgICAgICAgVV9BTSA9 IFVfQU1QRVJTQU5ELCAgICAgICAgICAKICAgIFVfU0lOR0xFX1FVT1RFID0gMzksICAgICAgVV9T USA9IFVfU0lOR0xFX1FVT1RFLCAgICAgICAKICAgIFVfTEVGVF9QQVJFTlRIRVNJUyA9IDQwLCAg VV9MUCA9IFVfTEVGVF9QQVJFTlRIRVNJUywgICAKICAgIFVfUklHSFRfUEFSRU5USEVTSVMgPSA0 MSwgVV9SUCA9IFVfUklHSFRfUEFSRU5USEVTSVMsICAKICAgIFVfU1RBUiA9IDQyLCAgICAgICAg ICAgICAgVV9TVCA9IFVfU1RBUiwgICAgICAgICAgICAgICAKICAgIFVfUExVUyA9IDQzLCAgICAg ICAgICAgICAgVV9QTCA9IFVfUExVUywgICAgICAgICAgICAgICAKICAgIFVfTUlOVVMgPSA0NSwg ICAgICAgICAgICAgVV9NSSA9IFVfTUlOVVMsICAgICAgICAgICAgICAKICAgIFVfQ09NTUEgPSA0 NCwgICAgICAgICAgICAgVV9DTSA9IFVfQ09NTUEsICAgICAgICAgICAgICAKICAgIFVfRE9UID0g NDYsICAgICAgICAgICAgICAgVV9ETyA9IFVfRE9ULCAgICAgICAgICAgICAgICAKICAgIFVfU0xB U0ggPSA0NywgICAgICAgICAgICAgVV9TTCA9IFVfU0xBU0gsICAgICAgICAgICAgICAKCiAgICBV XzAgPSA0OCwgIAogICAgVV8xID0gNDksICAKICAgIFVfMiA9IDUwLCAgCiAgICBVXzMgPSA1MSwg IAogICAgVV80ID0gNTIsICAKICAgIFVfNSA9IDUzLCAgCiAgICBVXzYgPSA1NCwgIAogICAgVV83 ID0gNTUsICAKICAgIFVfOCA9IDU2LCAgCiAgICBVXzkgPSA1NywgIAoKICAgIFVfQ09MT04gPSA1 OCwgICAgICAgICAgICAgVV9DTyA9IFVfQ09MT04sICAgICAgCiAgICBVX1NFTUlDT0xPTiA9IDU5 LCAgICAgICAgIFVfU0MgPSBVX1NFTUlDT0xPTiwgIAogICAgVV9MRVNTID0gNjAsICAgICAgICAg ICAgICBVX0xUID0gVV9MRVNTLCAgICAgICAKICAgIFVfRVFVQUwgPSA2MSwgICAgICAgICAgICAg VV9FUSA9IFVfRVFVQUwsICAgICAgCiAgICBVX0dSRUFURVIgPSA2MiwgICAgICAgICAgIFVfR1Qg PSBVX0dSRUFURVIsICAgIAogICAgVV9RVUVTVElPTiA9IDYzLCAgICAgICAgICBVX1FVID0gVV9R VUVTVElPTiwgICAKICAgIFVfQVQgPSA2NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCgogICAgVV9BID0gNjUsICAKICAgIFVfQiA9IDY2LCAgCiAgICBVX0MgPSA2NywgIAog ICAgVV9EID0gNjgsICAKICAgIFVfRSA9IDY5LCAgCiAgICBVX0YgPSA3MCwgIAogICAgVV9HID0g NzEsICAKICAgIFVfSCA9IDcyLCAgCiAgICBVX0kgPSA3MywgIAogICAgVV9KID0gNzQsICAKICAg IFVfSyA9IDc1LCAgCiAgICBVX0wgPSA3NiwgIAogICAgVV9NID0gNzcsICAKICAgIFVfTiA9IDc4 LCAgCiAgICBVX08gPSA3OSwgIAogICAgVV9QID0gODAsICAKICAgIFVfUSA9IDgxLCAgCiAgICBV X1IgPSA4MiwgIAogICAgVV9TID0gODMsICAKICAgIFVfVCA9IDg0LCAgCiAgICBVX1UgPSA4NSwg IAogICAgVV9WID0gODYsICAKICAgIFVfVyA9IDg3LCAgCiAgICBVX1ggPSA4OCwgIAogICAgVV9Z ID0gODksICAKICAgIFVfWiA9IDkwLCAgCgogICAgVV9MRUZUX0JSQUNLRVQgPSA5MSwgICAgICBV X0xCID0gVV9MRUZUX0JSQUNLRVQsICAgCiAgICBVX0JBQ0tTTEFTSCA9IDkyLCAgICAgICAgIFVf UlMgPSBVX0JBQ0tTTEFTSCwgICAgICAKICAgIFVfUklHSFRfQlJBQ0tFVCA9IDkzLCAgICAgVV9S QiA9IFVfUklHSFRfQlJBQ0tFVCwgIAogICAgVV9DQVJFVCA9IDk0LCAgICAgICAgICAgICBVX0NB ID0gVV9DQVJFVCwgICAgICAgICAgCiAgICBVX1VOREVSU0NPUkUgPSA5NSwgICAgICAgIFVfVU4g PSBVX1VOREVSU0NPUkUsICAgICAKCiAgICBVX2EgPSA5NywgIAogICAgVV9iID0gOTgsICAKICAg IFVfYyA9IDk5LCAgCiAgICBVX2QgPSAxMDAsICAKICAgIFVfZSA9IDEwMSwgIAogICAgVV9mID0g MTAyLCAgCiAgICBVX2cgPSAxMDMsICAKICAgIFVfaCA9IDEwNCwgIAogICAgVV9pID0gMTA1LCAg CiAgICBVX2ogPSAxMDYsICAKICAgIFVfayA9IDEwNywgIAogICAgVV9sID0gMTA4LCAgCiAgICBV X20gPSAxMDksICAKICAgIFVfbiA9IDExMCwgIAogICAgVV9vID0gMTExLCAgCiAgICBVX3AgPSAx MTIsICAKICAgIFVfcSA9IDExMywgIAogICAgVV9yID0gMTE0LCAgCiAgICBVX3MgPSAxMTUsICAK ICAgIFVfdCA9IDExNiwgIAogICAgVV91ID0gMTE3LCAgCiAgICBVX3YgPSAxMTgsICAKICAgIFVf dyA9IDExOSwgIAogICAgVV94ID0gMTIwLCAgCiAgICBVX3kgPSAxMjEsICAKICAgIFVfeiA9IDEy MiwgIAoKICAgIFVfTEVGVF9CUkFDRSA9IDEyMywgICAgICAgVV9PUyA9IFVfTEVGVF9CUkFDRSwg ICAKICAgIFVfQkFSID0gMTI0LCAgICAgICAgICAgICAgVV9CQSA9IFVfQkFSLCAgICAgICAgICAK ICAgIFVfUklHSFRfQlJBQ0UgPSAxMjUsICAgICAgVV9DUyA9IFVfUklHSFRfQlJBQ0UsICAKICAg IFVfVElMREUgPSAxMjYsICAgICAgICAgICAgVV9USSA9IFVfVElMREUsICAgICAgICAKCiAgICBV X0JPTSAgICAgICAgID0gMHhmZWZmLAogICAgVV9SRVZFUlNFX0JPTSA9IDB4ZmZmZQp9OwoKCiAK IAogCmNsYXNzIFN0cmluZ0NvbnN0YW50CnsKcHVibGljOgogICAgc3RhdGljIHdjaGFyX3QgVVNf QU5EW10sICAKICAgICAgICAgICAgICAgICAgIFVTX0FORF9BTkRbXSwgIAogICAgICAgICAgICAg ICAgICAgVVNfQU5EX0VRVUFMW10sICAKICAgICAgICAgICAgICAgICAgIFVTX0NPTE9OW10sICAK ICAgICAgICAgICAgICAgICAgIFVTX0NPTU1BW10sICAKICAgICAgICAgICAgICAgICAgIFVTX0RJ VklERVtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19ESVZJREVfRVFVQUxbXSwgIAogICAgICAg ICAgICAgICAgICAgVVNfRE9UW10sICAKICAgICAgICAgICAgICAgICAgIFVTX0VNUFRZW10sICAK ICAgICAgICAgICAgICAgICAgIFVTX0VRVUFMW10sICAKICAgICAgICAgICAgICAgICAgIFVTX0VR VUFMX0VRVUFMW10sICAKICAgICAgICAgICAgICAgICAgIFVTX0dSRUFURVJbXSwgIAogICAgICAg ICAgICAgICAgICAgVVNfR1JFQVRFUl9FUVVBTFtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19M QlJBQ0VbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfTEJSQUNLRVRbXSwgIAogICAgICAgICAg ICAgICAgICAgVVNfTEVGVF9TSElGVFtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19MRUZUX1NI SUZUX0VRVUFMW10sICAKICAgICAgICAgICAgICAgICAgIFVTX0xFU1NbXSwgIAogICAgICAgICAg ICAgICAgICAgVVNfTEVTU19FUVVBTFtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19MUEFSRU5b XSwgIAogICAgICAgICAgICAgICAgICAgVVNfTUlOVVNbXSwgIAogICAgICAgICAgICAgICAgICAg VVNfTUlOVVNfRVFVQUxbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfTUlOVVNfTUlOVVNbXSwg IAogICAgICAgICAgICAgICAgICAgVVNfTVVMVElQTFlbXSwgIAogICAgICAgICAgICAgICAgICAg VVNfTVVMVElQTFlfRVFVQUxbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfTk9UW10sICAKICAg ICAgICAgICAgICAgICAgIFVTX05PVF9FUVVBTFtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19P UltdLCAgCiAgICAgICAgICAgICAgICAgICBVU19PUl9FUVVBTFtdLCAgCiAgICAgICAgICAgICAg ICAgICBVU19PUl9PUltdLCAgCiAgICAgICAgICAgICAgICAgICBVU19QTFVTW10sICAKICAgICAg ICAgICAgICAgICAgIFVTX1BMVVNfRVFVQUxbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfUExV U19QTFVTW10sICAKICAgICAgICAgICAgICAgICAgIFVTX1FVRVNUSU9OW10sICAKICAgICAgICAg ICAgICAgICAgIFVTX1JCUkFDRVtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19SQlJBQ0tFVFtd LCAgCiAgICAgICAgICAgICAgICAgICBVU19SRU1BSU5ERVJbXSwgIAogICAgICAgICAgICAgICAg ICAgVVNfUkVNQUlOREVSX0VRVUFMW10sICAKICAgICAgICAgICAgICAgICAgIFVTX1JJR0hUX1NI SUZUW10sICAKICAgICAgICAgICAgICAgICAgIFVTX1JJR0hUX1NISUZUX0VRVUFMW10sICAKICAg ICAgICAgICAgICAgICAgIFVTX1JQQVJFTltdLCAgCiAgICAgICAgICAgICAgICAgICBVU19TRU1J Q09MT05bXSwgIAogICAgICAgICAgICAgICAgICAgVVNfVFdJRERMRVtdLCAgCiAgICAgICAgICAg ICAgICAgICBVU19VTlNJR05FRF9SSUdIVF9TSElGVFtdLCAgCiAgICAgICAgICAgICAgICAgICBV U19VTlNJR05FRF9SSUdIVF9TSElGVF9FUVVBTFtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19Y T1JbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfWE9SX0VRVUFMW10sICAKCiAgICAgICAgICAg ICAgICAgICBVU19Cb29sZWFuW10sICAKICAgICAgICAgICAgICAgICAgIFVTX0J5dGVbXSwgIAog ICAgICAgICAgICAgICAgICAgVVNfQ2hhcmFjdGVyW10sICAKICAgICAgICAgICAgICAgICAgIFVT X0NsYXNzW10sICAKICAgICAgICAgICAgICAgICAgIFVTX0NsYXNzTm90Rm91bmRFeGNlcHRpb25b XSwgIAogICAgICAgICAgICAgICAgICAgVVNfQ2xvbmVhYmxlW10sICAKICAgICAgICAgICAgICAg ICAgIFVTX0RvdWJsZVtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19FcnJvcltdLCAgCiAgICAg ICAgICAgICAgICAgICBVU19FeGNlcHRpb25bXSwgIAogICAgICAgICAgICAgICAgICAgVVNfRmxv YXRbXSwgICAKICAgICAgICAgICAgICAgICAgIFVTX0ludGVnZXJbXSwgIAogICAgICAgICAgICAg ICAgICAgVVNfTFtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19Mb25nW10sICAKICAgICAgICAg ICAgICAgICAgIFVTX05vQ2xhc3NEZWZGb3VuZEVycm9yW10sICAKICAgICAgICAgICAgICAgICAg IFVTX09iamVjdFtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19QT2JqZWN0W10sICAKICAgICAg ICAgICAgICAgICAgIFVTX1J1bnRpbWVFeGNlcHRpb25bXSwgIAogICAgICAgICAgICAgICAgICAg VVNfU2VyaWFsaXphYmxlW10sICAKICAgICAgICAgICAgICAgICAgIFVTX1Nob3J0W10sICAKICAg ICAgICAgICAgICAgICAgIFVTX1N0cmluZ0J1ZmZlcltdLCAgCiAgICAgICAgICAgICAgICAgICBV U19TdHJpbmdbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfVFlQRVtdLCAgCiAgICAgICAgICAg ICAgICAgICBVU19UaHJvd2FibGVbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfVm9pZFtdLCAg CiAgICAgICAgICAgICAgICAgICBVU19fRE9bXSwgIAogICAgICAgICAgICAgICAgICAgVVNfX0RP X19ET1tdLCAgCiAgICAgICAgICAgICAgICAgICBVU19fRFNbXSwgIAogICAgICAgICAgICAgICAg ICAgVVNfX0xCX19SQltdLCAgCiAgICAgICAgICAgICAgICAgICBVU19fTFRfY2xpbml0X0dUW10s ICAKICAgICAgICAgICAgICAgICAgIFVTX19MVF9pbml0X0dUW10sICAKICAgICAgICAgICAgICAg ICAgIFVTX19RVV9fUVVbXSwgICAKICAgICAgICAgICAgICAgICAgIFVTX19TQ1tdLCAgCiAgICAg ICAgICAgICAgICAgICBVU19fU0xbXSwgIAoKICAgICAgICAgICAgICAgICAgIFVTX196aXBbXSwg IAogICAgICAgICAgICAgICAgICAgVVNfX2phcltdLCAgCgogICAgICAgICAgICAgICAgICAgVVNf X2FycmF5W10sICAKICAgICAgICAgICAgICAgICAgIFVTX19hY2Nlc3NfRE9MTEFSW10sICAKICAg ICAgICAgICAgICAgICAgIFVTX19jbGFzc19ET0xMQVJbXSwgIAogICAgICAgICAgICAgICAgICAg VVNfX2NvbnN0cnVjdG9yX0RPTExBUltdLCAgCiAgICAgICAgICAgICAgICAgICBVU19fdGhpc19E T0xMQVJbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfX3ZhbF9ET0xMQVJbXSwgIAoKICAgICAg ICAgICAgICAgICAgIFVTX2Fic3RyYWN0W10sICAKICAgICAgICAgICAgICAgICAgIFVTX2FwcGVu ZFtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19ibG9ja19ET0xMQVJbXSwgIAogICAgICAgICAg ICAgICAgICAgVVNfYm9vbGVhbltdLCAgCiAgICAgICAgICAgICAgICAgICBVU19icmVha1tdLCAg CiAgICAgICAgICAgICAgICAgICBVU19ieXRlW10sICAKICAgICAgICAgICAgICAgICAgIFVTX2Nh c2VbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfY2F0Y2hbXSwgIAogICAgICAgICAgICAgICAg ICAgVVNfY2hhcltdLCAgCiAgICAgICAgICAgICAgICAgICBVU19jbGFzc1tdLCAgCiAgICAgICAg ICAgICAgICAgICBVU19jbG9uZVtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19jb25zdFtdLCAg CiAgICAgICAgICAgICAgICAgICBVU19jb250aW51ZVtdLCAgCiAgICAgICAgICAgICAgICAgICBV U19kZWZhdWx0W10sICAKICAgICAgICAgICAgICAgICAgIFVTX2RvW10sICAKICAgICAgICAgICAg ICAgICAgIFVTX2RvdWJsZVtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19lbHNlW10sICAKICAg ICAgICAgICAgICAgICAgIFVTX2V4dGVuZHNbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfZmFs c2VbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfZmluYWxbXSwgIAogICAgICAgICAgICAgICAg ICAgVVNfZmluYWxseVtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19mbG9hdFtdLCAgCiAgICAg ICAgICAgICAgICAgICBVU19mb3JbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfZm9yTmFtZVtd LCAgCiAgICAgICAgICAgICAgICAgICBVU19nZXRNZXNzYWdlW10sICAKICAgICAgICAgICAgICAg ICAgIFVTX2dvdG9bXSwgIAogICAgICAgICAgICAgICAgICAgVVNfaWZbXSwgIAogICAgICAgICAg ICAgICAgICAgVVNfaW1wbGVtZW50c1tdLCAgCiAgICAgICAgICAgICAgICAgICBVU19pbXBvcnRb XSwgIAogICAgICAgICAgICAgICAgICAgVVNfaW5zdGFuY2VvZltdLCAgCiAgICAgICAgICAgICAg ICAgICBVU19pbnRbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfaW50ZXJmYWNlW10sICAKICAg ICAgICAgICAgICAgICAgIFVTX2phdmFfU0xfaW9bXSwgIAogICAgICAgICAgICAgICAgICAgVVNf amF2YV9TTF9sYW5nW10sICAKICAgICAgICAgICAgICAgICAgIFVTX2phdmFfU0xfdXRpbFtdLCAg CiAgICAgICAgICAgICAgICAgICBVU19sZW5ndGhbXSwgIAogICAgICAgICAgICAgICAgICAgVVNf bG9uZ1tdLCAgCiAgICAgICAgICAgICAgICAgICBVU19uYXRpdmVbXSwgIAogICAgICAgICAgICAg ICAgICAgVVNfbmV3W10sICAKICAgICAgICAgICAgICAgICAgIFVTX251bGxbXSwgIAogICAgICAg ICAgICAgICAgICAgVVNfcGFja2FnZVtdLCAgCiAgICAgICAgICAgICAgICAgICBVU19wcml2YXRl W10sICAKICAgICAgICAgICAgICAgICAgIFVTX3Byb3RlY3RlZFtdLCAgCiAgICAgICAgICAgICAg ICAgICBVU19wdWJsaWNbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfcmV0dXJuW10sICAKICAg ICAgICAgICAgICAgICAgIFVTX3Nob3J0W10sICAKICAgICAgICAgICAgICAgICAgIFVTX3N0YXRp Y1tdLCAgCiAgICAgICAgICAgICAgICAgICBVU19zdHJpY3RmcFtdLCAgCiAgICAgICAgICAgICAg ICAgICBVU19zdXBlcltdLCAgCiAgICAgICAgICAgICAgICAgICBVU19zd2l0Y2hbXSwgIAogICAg ICAgICAgICAgICAgICAgVVNfc3luY2hyb25pemVkW10sICAKICAgICAgICAgICAgICAgICAgIFVT X3RoaXMwW10sICAKICAgICAgICAgICAgICAgICAgIFVTX3RoaXNbXSwgIAogICAgICAgICAgICAg ICAgICAgVVNfdGhyb3dbXSwgIAogICAgICAgICAgICAgICAgICAgVVNfdGhyb3dzW10sICAKICAg ICAgICAgICAgICAgICAgIFVTX3RvU3RyaW5nW10sICAKICAgICAgICAgICAgICAgICAgIFVTX3Ry YW5zaWVudFtdLCAgCiAgICAgICAgICAgICAgICAgICBVU190cnVlW10sICAKICAgICAgICAgICAg ICAgICAgIFVTX3RyeVtdLCAgCiAgICAgICAgICAgICAgICAgICBVU192b2lkW10sICAKICAgICAg ICAgICAgICAgICAgIFVTX3ZvbGF0aWxlW10sICAKICAgICAgICAgICAgICAgICAgIFVTX3doaWxl W10sICAKCiAgICAgICAgICAgICAgICAgICBVU19FT0ZbXTsgIAoKICAgIHN0YXRpYyB3Y2hhcl90 IFVTX3NtYWxsZXN0X2ludFtdOyAgCgogICAgc3RhdGljIGNoYXIgVThTX2NvbW1hbmRfZm9ybWF0 W107CgogICAgc3RhdGljIGludCBVOFNfQ29uc3RhbnRWYWx1ZV9sZW5ndGgsCiAgICAgICAgICAg ICAgIFU4U19FeGNlcHRpb25zX2xlbmd0aCwKICAgICAgICAgICAgICAgVThTX0lubmVyQ2xhc3Nl c19sZW5ndGgsCiAgICAgICAgICAgICAgIFU4U19TeW50aGV0aWNfbGVuZ3RoLAogICAgICAgICAg ICAgICBVOFNfRGVwcmVjYXRlZF9sZW5ndGgsCiAgICAgICAgICAgICAgIFU4U19MaW5lTnVtYmVy VGFibGVfbGVuZ3RoLAogICAgICAgICAgICAgICBVOFNfTG9jYWxWYXJpYWJsZVRhYmxlX2xlbmd0 aCwKICAgICAgICAgICAgICAgVThTX0NvZGVfbGVuZ3RoLAogICAgICAgICAgICAgICBVOFNfU291 cmNlZmlsZV9sZW5ndGgsCgogICAgICAgICAgICAgICBVOFNfbnVsbF9sZW5ndGgsCiAgICAgICAg ICAgICAgIFU4U190aGlzX2xlbmd0aDsKCiAgICBzdGF0aWMgY2hhciBVOFNfQltdLCAgCiAgICAg ICAgICAgICAgICBVOFNfQ1tdLCAgCiAgICAgICAgICAgICAgICBVOFNfQ29kZVtdLCAgCiAgICAg ICAgICAgICAgICBVOFNfQ29uc3RhbnRWYWx1ZVtdLCAgCiAgICAgICAgICAgICAgICBVOFNfRFtd LCAgCiAgICAgICAgICAgICAgICBVOFNfRXhjZXB0aW9uc1tdLCAgCiAgICAgICAgICAgICAgICBV OFNfRltdLCAgCiAgICAgICAgICAgICAgICBVOFNfSVtdLCAgCiAgICAgICAgICAgICAgICBVOFNf SW5uZXJDbGFzc2VzW10sICAKICAgICAgICAgICAgICAgIFU4U19KW10sICAgCiAgICAgICAgICAg ICAgICBVOFNfTFBfTGphdmFfU0xfbGFuZ19TTF9TdHJpbmdfU0NfUlBfTGphdmFfU0xfbGFuZ19T TF9DbGFzc19TQ1tdLCAgCiAgICAgICAgICAgICAgICBVOFNfTFBfTGphdmFfU0xfbGFuZ19TTF9T dHJpbmdfU0NfUlBfVltdLCAgCiAgICAgICAgICAgICAgICBVOFNfTFBfUlBfTGphdmFfU0xfbGFu Z19TTF9TdHJpbmdfU0NbXSwgIAogICAgICAgICAgICAgICAgVThTX0xQX1JQX1ZbXSwgIAogICAg ICAgICAgICAgICAgVThTX0xpbmVOdW1iZXJUYWJsZVtdLCAgCiAgICAgICAgICAgICAgICBVOFNf TG9jYWxWYXJpYWJsZVRhYmxlW10sICAKICAgICAgICAgICAgICAgIFU4U19TW10sICAKICAgICAg ICAgICAgICAgIFU4U19Tb3VyY2VmaWxlW10sICAKICAgICAgICAgICAgICAgIFU4U19TeW50aGV0 aWNbXSwgIAogICAgICAgICAgICAgICAgVThTX0RlcHJlY2F0ZWRbXSwgIAogICAgICAgICAgICAg ICAgVThTX1ZbXSwgIAogICAgICAgICAgICAgICAgVThTX1pbXSwgIAoKICAgICAgICAgICAgICAg IFU4U19fRE9bXSwgIAogICAgICAgICAgICAgICAgVThTX19ET19jbGFzc1tdLCAgCiAgICAgICAg ICAgICAgICBVOFNfX0RPX2phdmFbXSwgIAogICAgICAgICAgICAgICAgVThTX19ET190b2tbXSwg IAogICAgICAgICAgICAgICAgVThTX19ET191W10sICAKICAgICAgICAgICAgICAgIFU4U19fTFBb XSwgIAogICAgICAgICAgICAgICAgVThTX19SUFtdLCAgCiAgICAgICAgICAgICAgICBVOFNfX1NM W10sICAKICAgICAgICAgICAgICAgIFU4U19fU1RbXSwgIAoKICAgICAgICAgICAgICAgIFU4U19j bGFzc1tdLCAgCiAgICAgICAgICAgICAgICBVOFNfamF2YVtdLCAgCiAgICAgICAgICAgICAgICBV OFNfamF2YV9TTF9sYW5nX1NMX0NsYXNzTm90Rm91bmRFeGNlcHRpb25bXSwgIAogICAgICAgICAg ICAgICAgVThTX2phdmFfU0xfbGFuZ19TTF9DbGFzc1tdLCAgCiAgICAgICAgICAgICAgICBVOFNf amF2YV9TTF9sYW5nX1NMX0ludGVybmFsRXJyb3JbXSwgIAogICAgICAgICAgICAgICAgVThTX2ph dmFfU0xfbGFuZ19TTF9Ob0NsYXNzRGVmRm91bmRFcnJvcltdLCAgCiAgICAgICAgICAgICAgICBV OFNfamF2YV9TTF9sYW5nX1NMX1N0cmluZ0J1ZmZlcltdLCAgCiAgICAgICAgICAgICAgICBVOFNf amF2YV9TTF9sYW5nX1NMX1Rocm93YWJsZVtdLCAgCiAgICAgICAgICAgICAgICBVOFNfbnVsbFtd LCAgCiAgICAgICAgICAgICAgICBVOFNfcXVpdFtdLCAgCiAgICAgICAgICAgICAgICBVOFNfdGhp c1tdLCAgCgogICAgICAgICAgICAgICAgVThTX0xQX0xCX0NfUlBfTGphdmFfU0xfbGFuZ19TTF9T dHJpbmdCdWZmZXJfU0NbXSwgIAogICAgICAgICAgICAgICAgVThTX0xQX0NfUlBfTGphdmFfU0xf bGFuZ19TTF9TdHJpbmdCdWZmZXJfU0NbXSwgIAogICAgICAgICAgICAgICAgVThTX0xQX1pfUlBf TGphdmFfU0xfbGFuZ19TTF9TdHJpbmdCdWZmZXJfU0NbXSwgIAogICAgICAgICAgICAgICAgVThT X0xQX0lfUlBfTGphdmFfU0xfbGFuZ19TTF9TdHJpbmdCdWZmZXJfU0NbXSwgIAogICAgICAgICAg ICAgICAgVThTX0xQX0pfUlBfTGphdmFfU0xfbGFuZ19TTF9TdHJpbmdCdWZmZXJfU0NbXSwgIAog ICAgICAgICAgICAgICAgVThTX0xQX0ZfUlBfTGphdmFfU0xfbGFuZ19TTF9TdHJpbmdCdWZmZXJf U0NbXSwgIAogICAgICAgICAgICAgICAgVThTX0xQX0RfUlBfTGphdmFfU0xfbGFuZ19TTF9TdHJp bmdCdWZmZXJfU0NbXSwgIAogICAgICAgICAgICAgICAgVThTX0xQX0xqYXZhX1NMX2xhbmdfU0xf U3RyaW5nX1NDX1JQX0xqYXZhX1NMX2xhbmdfU0xfU3RyaW5nQnVmZmVyX1NDW10sICAKICAgICAg ICAgICAgICAgIFU4U19MUF9MamF2YV9TTF9sYW5nX1NMX09iamVjdF9TQ19SUF9MamF2YV9TTF9s YW5nX1NMX1N0cmluZ0J1ZmZlcl9TQ1tdOyAgCgogICAgc3RhdGljIGNoYXIgVThTX3NtYWxsZXN0 X2ludFtdLCAgICAgICAKICAgICAgICAgICAgICAgIFU4U19zbWFsbGVzdF9sb25nX2ludFtdLCAg CiAgICAgICAgICAgICAgICBVOFNfTmFOW10sICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgVThTX3Bvc19JbmZpbml0eVtdLCAgICAgICAKICAgICAgICAgICAgICAgIFU4U19uZWdfSW5m aW5pdHlbXSwgICAgICAgCiAgICAgICAgICAgICAgICBVOFNfcG9zX1plcm9bXSwgICAgICAgICAg IAogICAgICAgICAgICAgICAgVThTX25lZ19aZXJvW107ICAgICAgICAgICAKfTsKCgogCiAKIApj bGFzcyBJbnRUb1N0cmluZwp7CnB1YmxpYzoKICAgIEludFRvU3RyaW5nKGludCk7CgogICAgY2hh ciAqU3RyaW5nKCkgeyByZXR1cm4gc3RyOyB9CiAgICBpbnQgTGVuZ3RoKCkgICB7IHJldHVybiAo JmluZm9bVEFJTF9JTkRFWF0pIC0gc3RyOyB9Cgpwcml2YXRlOgogICAgZW51bSB7IFRBSUxfSU5E RVggPSAxICsgMTAgfTsgIAoKICAgIGNoYXIgaW5mb1tUQUlMX0lOREVYICsgMV0sICAKICAgICAg ICAgKnN0cjsKfTsKCgogCiAKIApjbGFzcyBJbnRUb1dzdHJpbmcKewpwdWJsaWM6CiAgICBJbnRU b1dzdHJpbmcoaW50KTsKCiAgICB3Y2hhcl90ICpTdHJpbmcoKSB7IHJldHVybiB3c3RyOyB9CiAg ICBpbnQgTGVuZ3RoKCkgICAgICB7IHJldHVybiAoJndpbmZvW1RBSUxfSU5ERVhdKSAtIHdzdHI7 IH0KCnByaXZhdGU6CiAgICBlbnVtIHsgVEFJTF9JTkRFWCA9IDEgKyAxMCB9OyAgCgogICAgd2No YXJfdCB3aW5mb1tUQUlMX0lOREVYICsgMV0sICAKICAgICAgICAgICAgKndzdHI7Cn07CgoKIAog CiAKY2xhc3MgVUxvbmdJbnQ7CmNsYXNzIFVMb25nVG9EZWNTdHJpbmcKewpwdWJsaWM6CiAgICBV TG9uZ1RvRGVjU3RyaW5nKFVMb25nSW50ICYpOwoKICAgIGNoYXIgKlN0cmluZygpIHsgcmV0dXJu IHN0cjsgfQogICAgaW50IExlbmd0aCgpICAgeyByZXR1cm4gKCZpbmZvW1RBSUxfSU5ERVhdKSAt IHN0cjsgfQoKcHJpdmF0ZToKICAgIGVudW0geyBUQUlMX0lOREVYID0gMjAgfTsgIAoKICAgIGNo YXIgaW5mb1tUQUlMX0lOREVYICsgMV0sICAKICAgICAgICAgKnN0cjsKfTsKCgogCiAKIApjbGFz cyBCYXNlTG9uZzsKY2xhc3MgTG9uZ1RvT2N0U3RyaW5nCnsKcHVibGljOgogICAgTG9uZ1RvT2N0 U3RyaW5nKEJhc2VMb25nICYpOwoKICAgIGNoYXIgKlN0cmluZygpIHsgcmV0dXJuIHN0ciArIDE7 IH0gIAogICAgY2hhciAqU3RyaW5nV2l0aEJhc2UoKSB7IHJldHVybiBzdHI7IH0KICAgIGludCBM ZW5ndGgoKSAgIHsgcmV0dXJuICgmaW5mb1tUQUlMX0lOREVYXSkgLSBzdHI7IH0KCnByaXZhdGU6 CiAgICBlbnVtIHsgVEFJTF9JTkRFWCA9IDEgKyAyMiB9OyAgCgogICAgY2hhciBpbmZvW1RBSUxf SU5ERVggKyAxXSwgIAogICAgICAgICAqc3RyOwp9OwoKCiAKIAogCmNsYXNzIExvbmdUb0hleFN0 cmluZwp7CnB1YmxpYzoKICAgIExvbmdUb0hleFN0cmluZyhCYXNlTG9uZyAmKTsKCiAgICBjaGFy ICpTdHJpbmcoKSB7IHJldHVybiBzdHIgKyAyOyB9ICAKICAgIGNoYXIgKlN0cmluZ1dpdGhCYXNl KCkgeyByZXR1cm4gc3RyOyB9CiAgICBpbnQgTGVuZ3RoKCkgICB7IHJldHVybiAoJmluZm9bVEFJ TF9JTkRFWF0pIC0gc3RyOyB9Cgpwcml2YXRlOgogICAgZW51bSB7IFRBSUxfSU5ERVggPSAxICsg MSArIDE2IH07ICAKCiAgICBjaGFyIGluZm9bVEFJTF9JTkRFWCArIDFdLCAgCiAgICAgICAgICpz dHI7Cn07CgoKIAogCiAKY2xhc3MgTG9uZ0ludDsKY2xhc3MgTG9uZ1RvRGVjU3RyaW5nCnsKcHVi bGljOgogICAgTG9uZ1RvRGVjU3RyaW5nKExvbmdJbnQgJik7CgogICAgY2hhciAqU3RyaW5nKCkg eyByZXR1cm4gc3RyOyB9CiAgICBpbnQgTGVuZ3RoKCkgICB7IHJldHVybiAoJmluZm9bVEFJTF9J TkRFWF0pIC0gc3RyOyB9Cgpwcml2YXRlOgogICAgZW51bSB7IFRBSUxfSU5ERVggPSAxICsgMTkg fTsgIAoKICAgIGNoYXIgaW5mb1tUQUlMX0lOREVYICsgMV0sICAKICAgICAgICAgKnN0cjsKfTsK CiAKIAogCmNsYXNzIElFRUVkb3VibGU7CmNsYXNzIERvdWJsZVRvU3RyaW5nCnsKcHVibGljOgog ICAgRG91YmxlVG9TdHJpbmcoY29uc3QgSUVFRWRvdWJsZSAmKTsKCiAgICBjb25zdCBjaGFyICpT dHJpbmcoKSBjb25zdCB7IHJldHVybiBzdHI7IH0KICAgIGludCBMZW5ndGgoKSBjb25zdCB7IHJl dHVybiBsZW5ndGg7IH0KCnByaXZhdGU6CiAgICB2b2lkIEZvcm1hdChjaGFyICosIGludCwgYm9v bCk7CgogICAgZW51bQogICAgewogICAgICAgIE1BWElNVU1fUFJFQ0lTSU9OID0gMTcsCiAgICAg ICAgTUFYSU1VTV9TVFJfTEVOR1RIID0gMSArIE1BWElNVU1fUFJFQ0lTSU9OICsgMSArIDUgIAog ICAgfTsKCiAgICBjaGFyIHN0cltNQVhJTVVNX1NUUl9MRU5HVEggKyAxXTsgIAogICAgaW50IGxl bmd0aDsKfTsKCiAKIAogCmNsYXNzIElFRUVmbG9hdDsKY2xhc3MgRmxvYXRUb1N0cmluZwp7CnB1 YmxpYzoKICAgIEZsb2F0VG9TdHJpbmcoY29uc3QgSUVFRWZsb2F0ICYpOwoKICAgIGNvbnN0IGNo YXIgKlN0cmluZygpIGNvbnN0IHsgcmV0dXJuIHN0cjsgfQogICAgaW50IExlbmd0aCgpIGNvbnN0 ICAgeyByZXR1cm4gbGVuZ3RoOyB9Cgpwcml2YXRlOgogICAgdm9pZCBGb3JtYXQoY2hhciAqLCBp bnQsIGJvb2wpOwoKICAgIGVudW0KICAgIHsKICAgICAgICBNQVhJTVVNX1BSRUNJU0lPTiA9IDks CiAgICAgICAgTUFYSU1VTV9TVFJfTEVOR1RIID0gMSArIE1BWElNVU1fUFJFQ0lTSU9OICsgMSAr IDQgIAogICAgfTsKCiAgICBjaGFyIHN0cltNQVhJTVVNX1NUUl9MRU5HVEggKyAxXTsgIAogICAg aW50IGxlbmd0aDsKfTsKCgoKY2xhc3MgTG9uZ0ludDsKY2xhc3MgVUxvbmdJbnQ7CiAKIAogCmNs YXNzIE9zdHJlYW0KewogICAgb3N0cmVhbSAqb3M7CgogICAgYm9vbCBleHBhbmRfd2NoYXI7Cgpw dWJsaWM6CgogICAgT3N0cmVhbSgpIDogb3MoJmNlcnIpLAogICAgICAgICAgICAgICAgZXhwYW5k X3djaGFyKGZhbHNlKQogICAge30KCiAgICBPc3RyZWFtKG9zdHJlYW0gKl9vcykgOiBvcyhfb3Mp LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX3djaGFyKGZhbHNlKQogICAge30K CiAgICB2b2lkIFN0YW5kYXJkT3V0cHV0KCkgeyBvcyA9ICZjb3V0OyB9CiAgICB2b2lkIFN0YW5k YXJkRXJyb3IoKSB7IG9zID0gJmNlcnI7IH0KICAgIHZvaWQgU2V0RXhwYW5kV2NoYXIoYm9vbCB2 YWwgPSB0cnVlKSB7IGV4cGFuZF93Y2hhciA9IHZhbDsgfQogICAgYm9vbCBFeHBhbmRXY2hhcigp IHsgcmV0dXJuIGV4cGFuZF93Y2hhcjsgfQoKICAgIE9zdHJlYW0gJm9wZXJhdG9yPDwod2NoYXJf dCBjaCkKICAgIHsKICAgICAgICBpZiAoY2ggPj4gOCA9PSAwKQogICAgICAgICAgICAqb3MgPDwg KGNoYXIpIGNoOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmIChleHBhbmRf d2NoYXIgPT0gMCkKICAgICAgICAgICAgICAgICpvcyA8PCAoY2hhcikgVV9RVUVTVElPTjsKICAg ICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAqb3MgPDwgKGNoYXIp IFVfQkFDS1NMQVNICiAgICAgICAgICAgICAgICAgICAgPDwgKGNoYXIpIFVfdTsKCiAgICAgICAg ICAgICAgICBjaGFyIHN0cls0XTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAzOyBpID49 IDA7IGktLSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnQgZCA9IGNo ICUgMTY7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGQpCiAgICAgICAgICAgICAgICAgICAg ewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgICAg ICAgICAgc3RyW2ldID0gVV9BOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAg ICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzdHJbaV0gPSBVX0I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAg ICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0 cltpXSA9IFVfQzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAg ICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyW2ld ID0gVV9EOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAg ICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJbaV0gPSBV X0U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAg ICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cltpXSA9IFVfRjsK ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAg ICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyW2ldID0gVV8wICsgZDsK ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0K ICAgICAgICAgICAgICAgICAgICBjaCAvPSAxNjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAg ICAgICAgICpvcyA8PCBzdHJbMF07CiAgICAgICAgICAgICAgICAqb3MgPDwgc3RyWzFdOwogICAg ICAgICAgICAgICAgKm9zIDw8IHN0clsyXTsKICAgICAgICAgICAgICAgICpvcyA8PCBzdHJbM107 CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAg ICBPc3RyZWFtICZvcGVyYXRvcjw8KGNvbnN0IHdjaGFyX3QgKnN0cikKICAgIHsKICAgICAgICBm b3IgKDsgKnN0cjsgc3RyKyspCiAgICAgICAgICAgICgqdGhpcykgPDwgKnN0cjsKICAgICAgICBy ZXR1cm4gKnRoaXM7CiAgICB9CgoKICAgIE9zdHJlYW0gJm9wZXJhdG9yPDwoY2hhciBjKQogICAg ewogICAgICAgICpvcyA8PCBjOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBPc3Ry ZWFtICZvcGVyYXRvcjw8KHNpZ25lZCBjaGFyIGMpCiAgICB7CiAgICAgICAgKm9zIDw8IGM7CiAg ICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIE9zdHJlYW0gJm9wZXJhdG9yPDwodW5zaWdu ZWQgY2hhciBjKQogICAgewogICAgICAgICpvcyA8PCBjOwogICAgICAgIHJldHVybiAqdGhpczsK ICAgIH0KCiAgICBPc3RyZWFtICZvcGVyYXRvcjw8KGNvbnN0IGNoYXIgKmMpCiAgICB7CiAgICAg ICAgKm9zIDw8IGM7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIE9zdHJlYW0gJm9w ZXJhdG9yPDwoY29uc3Qgc2lnbmVkIGNoYXIgKmMpCiAgICB7CiAgICAgICAgKm9zIDw8IGM7CiAg ICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIE9zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3Qg dW5zaWduZWQgY2hhciAqYykKICAgIHsKCgoKCgoKCiAgICAgICAgKm9zIDw8IGM7CgogICAgICAg IHJldHVybiAqdGhpczsKICAgIH0KCiAgICBPc3RyZWFtICZvcGVyYXRvcjw8KGludCBhKQogICAg ewogICAgICAgICpvcyA8PCBhOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBPc3Ry ZWFtICZvcGVyYXRvcjw8KHVuc2lnbmVkIGludCBhKQogICAgewogICAgICAgICpvcyA8PCBhOwog ICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBPc3RyZWFtICZvcGVyYXRvcjw8KExvbmdJ bnQpOwogICAgT3N0cmVhbSAmb3BlcmF0b3I8PChVTG9uZ0ludCk7CgogICAgT3N0cmVhbSAmb3Bl cmF0b3I8PChmbG9hdCBmKQogICAgewogICAgICAgICpvcyA8PCBmOwogICAgICAgIHJldHVybiAq dGhpczsKICAgIH0KCiAgICBPc3RyZWFtICZvcGVyYXRvcjw8KGRvdWJsZSBkKQogICAgewogICAg ICAgICpvcyA8PCBkOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBjaGFyIGZpbGwo Y2hhciBjKSB7IHJldHVybiBvcyAtPiBmaWxsKGMpOyB9CgogICAgT3N0cmVhbSAmZmx1c2goKQog ICAgewogICAgICAgIG9zIC0+IGZsdXNoKCk7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoK ICAgIGludCB3aWR0aChpbnQgdykKICAgIHsKICAgICAgICByZXR1cm4gb3MgLT4gd2lkdGgodyk7 CiAgICB9CgogICAgT3N0cmVhbSAmb3BlcmF0b3I8PChpb3MgJigqZikoaW9zJikpCiAgICB7CiAg ICAgICAgKCpmKSgqb3MpOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAgICBPc3RyZWFt ICZvcGVyYXRvcjw8KG9zdHJlYW0gJigqZikob3N0cmVhbSYpKQogICAgewogICAgICAgICgqZiko Km9zKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9Cn07CgpleHRlcm4gT3N0cmVhbSBDb3V0 cHV0OwoKIAogCiAKIAogCiAKIAoKCgogCiAKIAogCmNsYXNzIEVycm9yU3RyaW5nOiBwdWJsaWMg Q29udmVydGlibGVBcnJheTx3Y2hhcl90PiAKeyAKIHB1YmxpYzoKICAgIEVycm9yU3RyaW5nKCk7 IAogICAgCiAgICBFcnJvclN0cmluZyAmb3BlcmF0b3I8PChjb25zdCB3Y2hhcl90ICpzKTsKICAg IEVycm9yU3RyaW5nICZvcGVyYXRvcjw8KGNvbnN0IHdjaGFyX3QgYyApOwogICAgRXJyb3JTdHJp bmcgJm9wZXJhdG9yPDwoY29uc3QgY2hhciAgICAqcyk7CiAgICBFcnJvclN0cmluZyAmb3BlcmF0 b3I8PChjb25zdCBjaGFyICAgIGMgKTsKICAgIEVycm9yU3RyaW5nICZvcGVyYXRvcjw8KGludCBu KTsKCiAgICB2b2lkIHdpZHRoKGludCB3KTsKICAgIHZvaWQgZmlsbChjb25zdCBjaGFyIGMpOwog ICAgCiAgICB3Y2hhcl90ICpBcnJheSgpOwoKIHByaXZhdGU6CgogICAgdm9pZCBkb19maWxsKGlu dCBuKTsKICAgIGNoYXIgZmlsbF9jaGFyICAgOwogICAgaW50ICBmaWVsZF93aWR0aCA7Cn07CgoK CgoKCgojIDExICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiIDIKCiMgMSAiLi4vLi4vamlrZXMv c3JjL2RvdWJsZS5oIiAxCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIAoKCgoKCiMgMSAiLi4vLi4vamlrZXMvc3JjL2xvbmcuaCIgMQog CiAKIAogCiAKIAogCiAKIAoKCgoKCgoKCgpjbGFzcyBJRUVFZG91YmxlOwpjbGFzcyBJRUVFZmxv YXQ7CgpjbGFzcyBMb25nSW50OwpjbGFzcyBVTG9uZ0ludDsKCmNsYXNzIEJhc2VMb25nCnsKcHJv dGVjdGVkOgogICAgZW51bSAKICAgIHsKICAgICAgICBNQVhfSU5UICAgID0gMHg3RkZGRkZGRiwg IAogICAgICAgIE1JTl9JTlQgICAgPSAweDgwMDAwMDAwLCAgCiAgICAgICAgU0hPUlRfTUFTSyA9 IDB4RkZGRiwgICAgICAKICAgICAgICBTSUdOX0JJVCAgID0gMHg4MDAwMDAwMCAgCiAgICB9OwoK ICAgIHVuaW9uCiAgICB7CiAgICAgICAgZG91YmxlIGRvdWJsZV92YWx1ZTsKCgoKICAgICAgICB1 OCB3b3JkczsKCiAgICB9IHZhbHVlOwoKICAgICAKICAgIGlubGluZSB2b2lkIHNldEhpZ2hXb3Jk KHU0IGhpZ2gpIHsKCgoKCgoKCiAgICAgICAgc2V0SGlnaEFuZExvd1dvcmRzKGhpZ2gsIExvd1dv cmQoKSk7CgogICAgfQoKICAgICAKICAgIGlubGluZSB2b2lkIHNldExvd1dvcmQodTQgbG93KSB7 CgoKCgoKCgogICAgICAgIHNldEhpZ2hBbmRMb3dXb3JkcyhIaWdoV29yZCgpLCBsb3cpOwoKICAg IH0KICAgIAogICAgIAogICAgaW5saW5lIHZvaWQgc2V0SGlnaEFuZExvd1dvcmRzKHU0IGhpZ2gs IHU0IGxvdykgewojIDgyICIuLi8uLi9qaWtlcy9zcmMvbG9uZy5oIgoKICAgICAgICB2YWx1ZS53 b3JkcyA9ICgoKHU4KSBoaWdoKSA8PCAzMikgfCBsb3c7CgogICAgfQoKICAgICAKICAgIGlubGlu ZSB2b2lkIHNldEhpZ2hBbmRMb3dXb3Jkcyhjb25zdCBCYXNlTG9uZyAmb3ApCiAgICB7CgoKCgog ICAgICAgIHZhbHVlLndvcmRzID0gb3AudmFsdWUud29yZHM7CgogICAgfQoKcHVibGljOgoKIyAx MDggIi4uLy4uL2ppa2VzL3NyYy9sb25nLmgiCgogICAgaW5saW5lIHU0IEhpZ2hXb3JkKHZvaWQp IGNvbnN0IHsgcmV0dXJuICgodTQpICh2YWx1ZS53b3JkcyA+PiAzMikpOyB9CiAgICBpbmxpbmUg dTQgTG93V29yZCh2b2lkKSBjb25zdCAgeyByZXR1cm4gKCh1NCkgdmFsdWUud29yZHMpOyB9CiAg ICBpbmxpbmUgdTggV29yZHModm9pZCkgY29uc3QgICAgeyByZXR1cm4gdmFsdWUud29yZHM7IH0K CgogICAgZG91YmxlIERvdWJsZVZpZXcodm9pZCkgY29uc3QgeyByZXR1cm4gdmFsdWUuZG91Ymxl X3ZhbHVlOyB9CgogICAgQmFzZUxvbmcodTQgaGlnaCwgdTQgbG93KTsKICAgIEJhc2VMb25nKHU0 IGEpOyAgCiAgICBCYXNlTG9uZyhpNCBhKTsgIAogICAgaW5saW5lIEJhc2VMb25nICh2b2lkKSB7 fSAgCgogICAgaW5saW5lIEJhc2VMb25nKHU4IGEpIHsgdmFsdWUud29yZHMgPSBhOyB9ICAKCgog ICAgQmFzZUxvbmcgIG9wZXJhdG9yKyAgKGNvbnN0IEJhc2VMb25nKSBjb25zdDsgIAogICAgQmFz ZUxvbmcgIG9wZXJhdG9yKyAgKHZvaWQpIGNvbnN0OyAgICAgIAogICAgQmFzZUxvbmcgJm9wZXJh dG9yKz0gKGNvbnN0IEJhc2VMb25nKTsgIAogICAgQmFzZUxvbmcgIG9wZXJhdG9yKysgKGludCk7 ICAgICAgIAogICAgQmFzZUxvbmcgIG9wZXJhdG9yKysgKHZvaWQpOyAgICAgIAoKICAgIEJhc2VM b25nICBvcGVyYXRvci0gIChjb25zdCBCYXNlTG9uZykgY29uc3Q7ICAKICAgIEJhc2VMb25nICBv cGVyYXRvci0gICh2b2lkKSBjb25zdDsgICAgICAKICAgIEJhc2VMb25nICZvcGVyYXRvci09IChj b25zdCBCYXNlTG9uZyk7ICAKICAgIEJhc2VMb25nICBvcGVyYXRvci0tIChpbnQpOyAgICAgICAK ICAgIEJhc2VMb25nICBvcGVyYXRvci0tICh2b2lkKTsgICAgICAKCiAgICBCYXNlTG9uZyAgb3Bl cmF0b3IqICAoY29uc3QgQmFzZUxvbmcpIGNvbnN0OyAgCiAgICBCYXNlTG9uZyAmb3BlcmF0b3Iq PSAoY29uc3QgQmFzZUxvbmcpOyAgCgogICAgIAogICAgIAogICAgIAogICAgIAogICAgQmFzZUxv bmcgIG9wZXJhdG9yPDwgKGludCkgY29uc3Q7ICAgICAgIAogICAgQmFzZUxvbmcgJm9wZXJhdG9y PDw9KGludCk7ICAgICAgIAoKICAgIGJvb2wgICAgICBvcGVyYXRvcj09IChjb25zdCBCYXNlTG9u ZykgY29uc3Q7ICAKICAgIGJvb2wgICAgICBvcGVyYXRvciE9IChjb25zdCBCYXNlTG9uZykgY29u c3Q7ICAKICAgIGJvb2wgICAgICBvcGVyYXRvciEgICh2b2lkKSBjb25zdDsgICAgICAKCiAgICBC YXNlTG9uZyAgb3BlcmF0b3J+ICAodm9pZCkgY29uc3Q7ICAgICAgCiAgICBCYXNlTG9uZyAgb3Bl cmF0b3JeICAoY29uc3QgQmFzZUxvbmcpIGNvbnN0OyAgCiAgICBCYXNlTG9uZyAmb3BlcmF0b3Je PSAoY29uc3QgQmFzZUxvbmcpOyAgCiAgICBCYXNlTG9uZyAgb3BlcmF0b3J8ICAoY29uc3QgQmFz ZUxvbmcpIGNvbnN0OyAgCiAgICBCYXNlTG9uZyAmb3BlcmF0b3J8PSAoY29uc3QgQmFzZUxvbmcp OyAgCiAgICBCYXNlTG9uZyAgb3BlcmF0b3ImICAoY29uc3QgQmFzZUxvbmcpIGNvbnN0OyAgCiAg ICBCYXNlTG9uZyAmb3BlcmF0b3ImPSAoY29uc3QgQmFzZUxvbmcpOyAgCgogICAgYm9vbCAgICAg IG9wZXJhdG9yJiYgKGNvbnN0IEJhc2VMb25nKSBjb25zdDsgIAogICAgYm9vbCAgICAgIG9wZXJh dG9yfHwgKGNvbnN0IEJhc2VMb25nKSBjb25zdDsgIAoKICAgIHN0YXRpYyB2b2lkIERpdmlkZShj b25zdCBCYXNlTG9uZyAmLCBjb25zdCBCYXNlTG9uZyAmLCBCYXNlTG9uZyAmLCBCYXNlTG9uZyAm KTsKCiAgICBvcGVyYXRvciBMb25nSW50KHZvaWQpIGNvbnN0OyAgICAgICAgICAgCiAgICBvcGVy YXRvciBVTG9uZ0ludCh2b2lkKSBjb25zdDsgICAgICAgICAgCgogICAgIAogICAgaW5saW5lIGk0 IGhhc2hDb2RlKHZvaWQpIGNvbnN0IHsgcmV0dXJuIChIaWdoV29yZCgpIF4gTG93V29yZCgpKTsg fQp9OwoKCmNsYXNzIExvbmdJbnQgOiBwdWJsaWMgQmFzZUxvbmcKewpwdWJsaWM6CgogICAgaW5s aW5lIExvbmdJbnQgKHU0IGEsIHU0IGIpIDogQmFzZUxvbmcgKGEsIGIpIHt9CiAgICBpbmxpbmUg TG9uZ0ludCAodTQgYSkgOiBCYXNlTG9uZyAoYSkge30gIAogICAgaW5saW5lIExvbmdJbnQgKGk0 IGEpIDogQmFzZUxvbmcgKGEpIHt9ICAKICAgIGlubGluZSBMb25nSW50ICh2b2lkKSA6IEJhc2VM b25nICgpIHt9ICAKCiAgICBleHBsaWNpdAoKICAgICAgICAgICBMb25nSW50IChjb25zdCBJRUVF ZG91YmxlICYpOyAgCgoKICAgIGV4cGxpY2l0IAoKICAgICAgICAgICBMb25nSW50IChjb25zdCBJ RUVFZmxvYXQgJik7ICAKCiAgICBpbmxpbmUgTG9uZ0ludCh1OCBhKSA6IEJhc2VMb25nIChhKSB7 fSAgCgoKICAgICAKICAgICAKICAgICAKICAgICAKICAgIHN0YXRpYyBpbmxpbmUgY29uc3QgTG9u Z0ludCBNQVhfTE9ORyh2b2lkKQogICAgewogICAgICAgIHJldHVybiBtYXhfbG9uZ19jb25zdCA/ ICptYXhfbG9uZ19jb25zdAogICAgICAgICAgICA6ICoobWF4X2xvbmdfY29uc3QgPSBuZXcgTG9u Z0ludCgweDdGRkZGRkZGLCAweEZGRkZGRkZGKSk7CiAgICB9CiAgICBzdGF0aWMgaW5saW5lIGNv bnN0IExvbmdJbnQgTUlOX0xPTkcodm9pZCkKICAgIHsKICAgICAgICByZXR1cm4gbWluX2xvbmdf Y29uc3QgPyAqbWluX2xvbmdfY29uc3QKICAgICAgICAgICAgOiAqKG1pbl9sb25nX2NvbnN0ID0g bmV3IExvbmdJbnQoMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCkpOwogICAgfQogICAgc3RhdGljIHZv aWQgQ29uc3RhbnRDbGVhbnVwKHZvaWQpCiAgICB7CiAgICAgICAgIAogICAgICAgICAKICAgICAg ICAgCiAgICAgICAgaWYgKG1heF9sb25nX2NvbnN0KQogICAgICAgICAgICBkZWxldGUgKExvbmdJ bnQqKW1heF9sb25nX2NvbnN0OwogICAgICAgIGlmIChtaW5fbG9uZ19jb25zdCkKICAgICAgICAg ICAgZGVsZXRlIChMb25nSW50KiltaW5fbG9uZ19jb25zdDsKICAgIH0KCgpwcml2YXRlOgogICAg c3RhdGljIGNvbnN0IExvbmdJbnQgKm1heF9sb25nX2NvbnN0LCAqbWluX2xvbmdfY29uc3Q7Cgpw dWJsaWM6CiAgICBMb25nSW50ICBvcGVyYXRvci8gIChjb25zdCBMb25nSW50KSBjb25zdDsgIAog ICAgTG9uZ0ludCAmb3BlcmF0b3IvPSAoY29uc3QgTG9uZ0ludCk7ICAKCiAgICBMb25nSW50ICBv cGVyYXRvciUgIChjb25zdCBMb25nSW50KSBjb25zdDsgIAogICAgTG9uZ0ludCAmb3BlcmF0b3Il PSAoY29uc3QgTG9uZ0ludCk7ICAKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBMb25nSW50 ICBvcGVyYXRvcj4+IChpbnQpIGNvbnN0OyAgICAgIAogICAgTG9uZ0ludCAmb3BlcmF0b3I+Pj0o aW50KTsgICAgICAKCiAgICBib29sICAgICBvcGVyYXRvcjwgIChjb25zdCBMb25nSW50KSBjb25z dDsgIAogICAgYm9vbCAgICAgb3BlcmF0b3I+ICAoY29uc3QgTG9uZ0ludCkgY29uc3Q7ICAKICAg IGJvb2wgICAgIG9wZXJhdG9yPD0gKGNvbnN0IExvbmdJbnQpIGNvbnN0OyAgCiAgICBib29sICAg ICBvcGVyYXRvcj49IChjb25zdCBMb25nSW50KSBjb25zdDsgIAp9OwoKCmNsYXNzIFVMb25nSW50 IDogcHVibGljIEJhc2VMb25nCnsKcHVibGljOgoKICAgIGlubGluZSBVTG9uZ0ludCAodTQgYSwg dTQgYikgOiBCYXNlTG9uZyAoYSwgYikge30KICAgIGlubGluZSBVTG9uZ0ludCAodTQgYSkgOiBC YXNlTG9uZyAoYSkge30gIAogICAgaW5saW5lIFVMb25nSW50IChpNCBhKSA6IEJhc2VMb25nIChh KSB7fSAgCiAgICBpbmxpbmUgVUxvbmdJbnQgKHZvaWQpIDogQmFzZUxvbmcgKCkge30gIAoKICAg IGlubGluZSBVTG9uZ0ludCh1OCBhKSA6IEJhc2VMb25nIChhKSB7fSAgCgoKICAgIFVMb25nSW50 ICBvcGVyYXRvci8gIChjb25zdCBVTG9uZ0ludCkgY29uc3Q7ICAKICAgIFVMb25nSW50ICZvcGVy YXRvci89IChjb25zdCBVTG9uZ0ludCk7ICAKCiAgICBVTG9uZ0ludCAgb3BlcmF0b3IlICAoY29u c3QgVUxvbmdJbnQpIGNvbnN0OyAgCiAgICBVTG9uZ0ludCAmb3BlcmF0b3IlPSAoY29uc3QgVUxv bmdJbnQpOyAgCgogICAgIAogICAgIAogICAgIAogICAgIAogICAgVUxvbmdJbnQgIG9wZXJhdG9y Pj4gKGludCkgY29uc3Q7ICAgICAgIAogICAgVUxvbmdJbnQgJm9wZXJhdG9yPj49KGludCk7ICAg ICAgIAoKICAgIGJvb2wgICAgICBvcGVyYXRvcjwgIChjb25zdCBVTG9uZ0ludCkgY29uc3Q7ICAK ICAgIGJvb2wgICAgICBvcGVyYXRvcj4gIChjb25zdCBVTG9uZ0ludCkgY29uc3Q7ICAKICAgIGJv b2wgICAgICBvcGVyYXRvcjw9IChjb25zdCBVTG9uZ0ludCkgY29uc3Q7ICAKICAgIGJvb2wgICAg ICBvcGVyYXRvcj49IChjb25zdCBVTG9uZ0ludCkgY29uc3Q7ICAKfTsKCgoKCgoKIyA2NSAiLi4v Li4vamlrZXMvc3JjL2RvdWJsZS5oIiAyCgoKCgoKCmNsYXNzIExvbmdJbnQ7CmNsYXNzIElFRUVk b3VibGU7CmNsYXNzIEJpZ0ludDsKCmNsYXNzIElFRUVmbG9hdAp7CiAgICAgCiAgICAgCiAgICAg CiAgICAgCiAgICAgCiAgICAgCnByaXZhdGU6CiAgICBmcmllbmQgY2xhc3MgRmxvYXRUb1N0cmlu ZzsKCiAgICB1bmlvbgogICAgewogICAgICAgIGZsb2F0IGZsb2F0X3ZhbHVlOwogICAgICAgIHU0 IHdvcmQ7ICAKICAgICAgICBpNCBpd29yZDsgIAogICAgfSB2YWx1ZTsKCiAgICAgCiAgICAgCiAg ICAgCiAgICBlbnVtCiAgICB7CiAgICAgICAgRlJBQ1RfU0laRSA9IDIzLCAgICAgICAgICAKICAg ICAgICBCSUFTICAgICAgID0gMTI3LCAgICAgICAgIAogICAgICAgIE1BWF9ERUNfRVhQID0gMzgs ICAgICAgICAgCiAgICAgICAgTUFYX0RJR0lUUyA9IEJJQVMgKyBGUkFDVF9TSVpFICsgMSAtIE1B WF9ERUNfRVhQICAKICAgIH07CiAgICBlbnVtCiAgICB7CiAgICAgICAgU0lHTl9CSVQgICA9IDB4 ODAwMDAwMDAsICAKICAgICAgICBFWFBfQklUUyAgID0gMHg3RjgwMDAwMCwgIAogICAgICAgIEZS QUNUX0JJVFMgPSAweDAwN0ZGRkZGLCAgCiAgICAgICAgQUJTX0JJVFMgICA9IEVYUF9CSVRTIHwg RlJBQ1RfQklUUywgIAogICAgICAgIE1BWF9GUkFDVCAgPSAweDAxMDAwMDAwLCAgCiAgICAgICAg TUlOX0ZSQUNUICA9IDB4MDA4MDAwMDAsICAKICAgICAgICBORUdfWkVSTyAgID0gMHg4MDAwMDAw MCwgIAogICAgICAgIFBPU19aRVJPICAgPSAweDAwMDAwMDAwLCAgCiAgICAgICAgTkVHX0lORiAg ICA9IDB4RkY4MDAwMDAsICAKICAgICAgICBQT1NfSU5GICAgID0gMHg3RjgwMDAwMCwgIAogICAg ICAgIE5BTiAgICAgICAgPSAweDdGQzAwMDAwLCAgCiAgICAgICAgQllURV9NQVNLICA9IDB4MDAw MDAwRkYsICAKICAgICAgICBNQVhfSU5UICAgID0gMHg3RkZGRkZGRiwgIAogICAgICAgIE1JTl9J TlQgICAgPSAweDgwMDAwMDAwLCAgCiAgICAgICAgTUlOX0xPTkdfRiA9IDB4REYwMDAwMDAsICAK ICAgICAgICBNSU5fSU5UX0YgID0gMHhDRjAwMDAwMCAgCiAgICB9OwoKICAgIGlubGluZSB1NCBT aWduQml0KHZvaWQpIGNvbnN0ICAgeyByZXR1cm4gdmFsdWUud29yZCAmIFNJR05fQklUOyB9CiAg ICBpbmxpbmUgdTQgRXhwQml0cyh2b2lkKSBjb25zdCAgIHsgcmV0dXJuIHZhbHVlLndvcmQgJiBF WFBfQklUUzsgfQogICAgaW5saW5lIHU0IEZyYWN0Qml0cyh2b2lkKSBjb25zdCB7IHJldHVybiB2 YWx1ZS53b3JkICYgRlJBQ1RfQklUUzsgfQoKICAgICAKICAgICAKICAgIHN0YXRpYyBJRUVFZmxv YXQgTm9ybWFsaXplKGludCwgaW50LCB1NCk7CiAgICAgCiAgICAgCiAgICBpbnQgU3BsaXRJbnRv KHU0ICZmcmFjdGlvbikgY29uc3Q7CgogICAgIAogICAgSUVFRWZsb2F0IFVscCh2b2lkKSBjb25z dDsKICAgICAKICAgIHN0YXRpYyBJRUVFZmxvYXQgUmF0aW8oY29uc3QgQmlnSW50ICYsIGNvbnN0 IEJpZ0ludCAmKTsKICAgICAKICAgICAKICAgIGJvb2wgQWRqdXN0KGNvbnN0IEJpZ0ludCAmLCBj b25zdCBCaWdJbnQgJiwgY29uc3QgYm9vbCk7CgoKCgoKCiAgICBzdGF0aWMgY29uc3QgSUVFRWZs b2F0IHRlbnNbXTsgIAogICAgc3RhdGljIGNvbnN0IElFRUVmbG9hdCBiaWd0ZW5zW107ICAKCgpw dWJsaWM6CiAgICAgCiAgICAgCiAgICAgCiAgICBpbmxpbmUgdTQgV29yZCh2b2lkKSBjb25zdCB7 IHJldHVybiB2YWx1ZS53b3JkOyB9CgogICAgaW5saW5lIGludCAgU2lnbih2b2lkKSBjb25zdCAg ICAgeyByZXR1cm4gdmFsdWUud29yZCA+PiAzMTsgfQogICAgaW5saW5lIGludCAgRXhwb25lbnQo dm9pZCkgY29uc3QgeyByZXR1cm4gKCh2YWx1ZS53b3JkICYgRVhQX0JJVFMpID4+IEZSQUNUX1NJ WkUpIC0gQklBUzsgfQogICAgaW5saW5lIHU0ICAgRnJhY3Rpb24odm9pZCkgY29uc3QgeyByZXR1 cm4gKHZhbHVlLndvcmQgJiBGUkFDVF9CSVRTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IChFeHBCaXRzKCkgPyBNSU5fRlJBQ1QgOiAwKTsgfQogICAgc3RhdGlj IGlubGluZSBpbnQgQmlhcyh2b2lkKSAgICAgIHsgcmV0dXJuIEJJQVM7IH0KICAgIHN0YXRpYyBp bmxpbmUgaW50IEZyYWN0U2l6ZSh2b2lkKSB7IHJldHVybiBGUkFDVF9TSVpFOyB9CgogICAgaW5s aW5lIGJvb2wgSXNOYU4odm9pZCkgY29uc3QgICAgICB7IHJldHVybiAodmFsdWUud29yZCAmIEFC U19CSVRTKSA+IEVYUF9CSVRTOyB9CgogICAgaW5saW5lIGJvb2wgSXNOZWdhdGl2ZSh2b2lkKSBj b25zdCB7IHJldHVybiAodmFsdWUuaXdvcmQgPCAwKSAmJiAhSXNOYU4oKTsgfQogICAgaW5saW5l IGJvb2wgSXNQb3NpdGl2ZSh2b2lkKSBjb25zdCB7IHJldHVybiAodmFsdWUuaXdvcmQgPj0gMCkg JiYgIUlzTmFOKCk7IH0KCiAgICBpbmxpbmUgYm9vbCBJc05lZ2F0aXZlWmVybyh2b2lkKSBjb25z dCB7IHJldHVybiB2YWx1ZS53b3JkID09IE5FR19aRVJPOyB9CiAgICBpbmxpbmUgYm9vbCBJc1Bv c2l0aXZlWmVybyh2b2lkKSBjb25zdCB7IHJldHVybiB2YWx1ZS53b3JkID09IFBPU19aRVJPOyB9 CiAgICBpbmxpbmUgYm9vbCBJc1plcm8odm9pZCkgY29uc3QgICAgICAgICB7IHJldHVybiAodmFs dWUud29yZCAmIEFCU19CSVRTKSA9PSBQT1NfWkVSTzsgfQoKICAgIGlubGluZSBib29sIElzTmVn YXRpdmVJbmZpbml0eSh2b2lkKSBjb25zdCB7IHJldHVybiB2YWx1ZS53b3JkID09IE5FR19JTkY7 IH0KICAgIGlubGluZSBib29sIElzUG9zaXRpdmVJbmZpbml0eSh2b2lkKSBjb25zdCB7IHJldHVy biB2YWx1ZS53b3JkID09IFBPU19JTkY7IH0KICAgIGlubGluZSBib29sIElzSW5maW5pdGUodm9p ZCkgY29uc3QgICAgICAgICB7IHJldHVybiAodmFsdWUud29yZCAmIEFCU19CSVRTKSA9PSBQT1Nf SU5GOyB9CgoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAK ICAgIHN0YXRpYyBpbmxpbmUgY29uc3QgSUVFRWZsb2F0CiAgICAgICAgTmFOKHZvaWQpICAgICAg ICAgICAgICAgeyByZXR1cm4gSUVFRWZsb2F0KCh1NClOQU4pOyB9CiAgICBzdGF0aWMgaW5saW5l IGNvbnN0IElFRUVmbG9hdAogICAgICAgIFBPU0lUSVZFX0lORklOSVRZKHZvaWQpIHsgcmV0dXJu IElFRUVmbG9hdCgodTQpUE9TX0lORik7IH0KICAgIHN0YXRpYyBpbmxpbmUgY29uc3QgSUVFRWZs b2F0CiAgICAgICAgTkVHQVRJVkVfSU5GSU5JVFkodm9pZCkgeyByZXR1cm4gSUVFRWZsb2F0KCh1 NClORUdfSU5GKTsgfQogICAgc3RhdGljIGlubGluZSBjb25zdCBJRUVFZmxvYXQKICAgICAgICBQ T1NJVElWRV9aRVJPKHZvaWQpICAgICB7IHJldHVybiBJRUVFZmxvYXQoKHU0KVBPU19aRVJPKTsg fQogICAgc3RhdGljIGlubGluZSBjb25zdCBJRUVFZmxvYXQKICAgICAgICBORUdBVElWRV9aRVJP KHZvaWQpICAgICB7IHJldHVybiBJRUVFZmxvYXQoKHU0KU5FR19aRVJPKTsgfQoKICAgICAKICAg ICAKICAgICAKICAgICAKICAgIGlubGluZSAgIElFRUVmbG9hdChmbG9hdCBmKSB7IHZhbHVlLmZs b2F0X3ZhbHVlID0gZjsgfQoKICAgICAKICAgICAgICAgICAgIElFRUVmbG9hdChjb25zdCBjaGFy ICosIGJvb2wgY2hlY2tfaW52YWxpZCA9IGZhbHNlKTsKICAgICAKICAgICAgICAgICAgIElFRUVm bG9hdChpNCk7CiAgICAgCiAgICAgICAgICAgICBJRUVFZmxvYXQoY29uc3QgTG9uZ0ludCAmKTsK ICAgICAKCiAgICBleHBsaWNpdAoKICAgICAgICAgICAgIElFRUVmbG9hdChjb25zdCBJRUVFZG91 YmxlICYpOwogICAgIAogICAgaW5saW5lICAgSUVFRWZsb2F0KHZvaWQpIHt9CgogICAgIAogICAg aW5saW5lICAgSUVFRWZsb2F0KHU0IGJpdHMpIHsgdmFsdWUud29yZCA9IGJpdHM7IH0KCgogICAg IAogICAgIAogICAgIAogICAgICAgICAgIGk0ICAgICAgICAgSW50VmFsdWUodm9pZCkgY29uc3Q7 CiAgICAgICAgICAgTG9uZ0ludCAgICBMb25nVmFsdWUodm9pZCkgY29uc3Q7CiAgICBpbmxpbmUg ZmxvYXQgICAgICBGbG9hdFZpZXcodm9pZCkgY29uc3QgeyByZXR1cm4gdmFsdWUuZmxvYXRfdmFs dWU7IH0KICAgIGlubGluZSBJRUVFZG91YmxlIERvdWJsZVZhbHVlKHZvaWQpIGNvbnN0OwoKCiAg ICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgICAgICAgSUVFRWZsb2F0ICBvcGVyYXRvcisgIChj b25zdCBJRUVFZmxvYXQpIGNvbnN0OyAgICAKICAgIGlubGluZSBJRUVFZmxvYXQgIG9wZXJhdG9y KyAgKHZvaWQpICAgICAgICAgeyByZXR1cm4gKnRoaXM7IH0gIAogICAgaW5saW5lIElFRUVmbG9h dCAmb3BlcmF0b3IrPSAoY29uc3QgSUVFRWZsb2F0IG9wKSB7IHJldHVybiAqdGhpcyA9ICp0aGlz ICsgb3A7IH0gIAogICAgaW5saW5lIElFRUVmbG9hdCAgb3BlcmF0b3IrKyAodm9pZCkgICAgICAg ICB7IHJldHVybiAqdGhpcyArPSAxOyB9ICAKICAgIGlubGluZSBJRUVFZmxvYXQgIG9wZXJhdG9y KysgKGludCBkdW1teSkKICAgIHsKICAgICAgICBJRUVFZmxvYXQgcmVzdWx0ID0gKnRoaXM7CiAg ICAgICAgKnRoaXMgKz0gMTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgCgogICAgICAg ICAgIElFRUVmbG9hdCAgb3BlcmF0b3ItICAodm9pZCkgY29uc3Q7ICAgICAgICAgCiAgICBpbmxp bmUgSUVFRWZsb2F0ICBvcGVyYXRvci0gIChjb25zdCBJRUVFZmxvYXQgb3ApIGNvbnN0IHsgcmV0 dXJuICp0aGlzICsgKC1vcCk7IH0gIAogICAgaW5saW5lIElFRUVmbG9hdCAmb3BlcmF0b3ItPSAo Y29uc3QgSUVFRWZsb2F0IG9wKSB7IHJldHVybiAqdGhpcyA9ICp0aGlzIC0gb3A7IH0gIAogICAg aW5saW5lIElFRUVmbG9hdCAgb3BlcmF0b3ItLSAodm9pZCkgICAgICAgICB7IHJldHVybiAqdGhp cyAtPSAxOyB9ICAKICAgIGlubGluZSBJRUVFZmxvYXQgIG9wZXJhdG9yLS0gKGludCBkdW1teSkK ICAgIHsKICAgICAgICBJRUVFZmxvYXQgcmVzdWx0ID0gKnRoaXM7CiAgICAgICAgKnRoaXMgLT0g MTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfSAgCgogICAgICAgICAgIElFRUVmbG9hdCAg b3BlcmF0b3IqICAoY29uc3QgSUVFRWZsb2F0KSBjb25zdDsgICAgCiAgICBpbmxpbmUgSUVFRWZs b2F0ICZvcGVyYXRvcio9IChjb25zdCBJRUVFZmxvYXQgb3ApIHsgcmV0dXJuICp0aGlzID0gKnRo aXMgKiBvcDsgfSAgCgogICAgICAgICAgIElFRUVmbG9hdCAgb3BlcmF0b3IvICAoY29uc3QgSUVF RWZsb2F0KSBjb25zdDsgICAgCiAgICBpbmxpbmUgSUVFRWZsb2F0ICZvcGVyYXRvci89IChjb25z dCBJRUVFZmxvYXQgb3ApIHsgcmV0dXJuICp0aGlzID0gKnRoaXMgLyBvcDsgfSAgCgogICAgICAg ICAgIElFRUVmbG9hdCAgb3BlcmF0b3IlICAoY29uc3QgSUVFRWZsb2F0KSBjb25zdDsgICAgCiAg ICBpbmxpbmUgSUVFRWZsb2F0ICZvcGVyYXRvciU9IChjb25zdCBJRUVFZmxvYXQgb3ApIHsgcmV0 dXJuICp0aGlzID0gKnRoaXMgJSBvcDsgfSAgCgogICAgIAogICAgIAogICAgIAogICAgYm9vbCBv cGVyYXRvcj09IChjb25zdCBJRUVFZmxvYXQpIGNvbnN0OyAgCiAgICBib29sIG9wZXJhdG9yIT0g KGNvbnN0IElFRUVmbG9hdCkgY29uc3Q7ICAKICAgIGJvb2wgb3BlcmF0b3I8ICAoY29uc3QgSUVF RWZsb2F0KSBjb25zdDsgIAogICAgYm9vbCBvcGVyYXRvcj4gIChjb25zdCBJRUVFZmxvYXQpIGNv bnN0OyAgCiAgICBib29sIG9wZXJhdG9yPD0gKGNvbnN0IElFRUVmbG9hdCkgY29uc3Q7ICAKICAg IGJvb2wgb3BlcmF0b3I+PSAoY29uc3QgSUVFRWZsb2F0KSBjb25zdDsgIAoKICAgICAKICAgICAK ICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGlubGluZSBib29s IGVxdWFscyhjb25zdCBJRUVFZmxvYXQgb3ApIGNvbnN0IHsgcmV0dXJuIHZhbHVlLndvcmQgPT0g b3AudmFsdWUud29yZDsgfQogICAgaW5saW5lIGk0IGhhc2hDb2RlKHZvaWQpIGNvbnN0IHsgcmV0 dXJuIHZhbHVlLml3b3JkOyB9CiAgICBpbmxpbmUgaW50IGNvbXBhcmVUbyhjb25zdCBJRUVFZmxv YXQgb3ApIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIElzTmFOKCkgPyAxCiAgICAgICAgICAg ICAgICAgICAgICAgOiAoSXNaZXJvKCkgJiYgb3AuSXNaZXJvKCkpID8gb3AuU2lnbigpIC0gU2ln bigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDog KCp0aGlzIDwgb3ApID8gLTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAqdGhpcyA+IG9wOwogICAgfSAgICAgICAgCn07 CgoKY2xhc3MgSUVFRWRvdWJsZSA6IHB1YmxpYyBCYXNlTG9uZwogICAgIAogICAgIAogICAgIAog ICAgIAogICAgIAogICAgIAp7CnByaXZhdGU6CiAgICBmcmllbmQgY2xhc3MgRG91YmxlVG9TdHJp bmc7CgogICAgIAogICAgIAogICAgIAogICAgZW51bQogICAgewogICAgICAgIEZSQUNUX1NJWkUg ICAgPSA1MiwgICAgICAgICAgCiAgICAgICAgRlJBQ1RfU0laRV9ISSA9IEZSQUNUX1NJWkUgLSAz MiwgIAogICAgICAgIEJJQVMgICAgICAgICAgPSAxMDIzLCAgICAgICAgCiAgICAgICAgTUFYX0RF Q19FWFAgICA9IDMwOCwgICAgICAgICAKICAgICAgICBNQVhfRElHSVRTICAgID0gQklBUyArIEZS QUNUX1NJWkUgKyAxIC0gTUFYX0RFQ19FWFAgIAogICAgfTsKICAgIGVudW0KICAgIHsKICAgICAg ICBFWFBfQklUUyAgICAgID0gMHg3RkYwMDAwMCwgIAogICAgICAgIEZSQUNUX0JJVFMgICAgPSAw eDAwMEZGRkZGLCAgCiAgICAgICAgQUJTX0JJVFMgICAgICA9IEVYUF9CSVRTIHwgRlJBQ1RfQklU UywgIAogICAgICAgIE1BWF9GUkFDVCAgICAgPSAweDAwMjAwMDAwLCAgCiAgICAgICAgTUlOX0ZS QUNUICAgICA9IDB4MDAxMDAwMDAsICAKICAgICAgICBORUdfWkVST19ISSAgID0gMHg4MDAwMDAw MCwgIAogICAgICAgIFBPU19aRVJPX0hJICAgPSAweDAwMDAwMDAwLCAgCiAgICAgICAgTkVHX0lO Rl9ISSAgICA9IDB4RkZGMDAwMDAsICAKICAgICAgICBQT1NfSU5GX0hJICAgID0gMHg3RkYwMDAw MCwgIAogICAgICAgIE5BTl9ISSAgICAgICAgPSAweDdGRjgwMDAwLCAgCiAgICAgICAgWkVST19M TyAgICAgICA9IDB4MDAwMDAwMDAgIAogICAgfTsKCiAgICBpbmxpbmUgdTQgU2lnbkJpdCh2b2lk KSBjb25zdCAgIHsgcmV0dXJuIEhpZ2hXb3JkKCkgJiBTSUdOX0JJVDsgfQogICAgaW5saW5lIHU0 IEV4cEJpdHModm9pZCkgY29uc3QgICB7IHJldHVybiBIaWdoV29yZCgpICYgRVhQX0JJVFM7IH0K ICAgIGlubGluZSB1NCBGcmFjdEJpdHModm9pZCkgY29uc3QgeyByZXR1cm4gSGlnaFdvcmQoKSAm IEZSQUNUX0JJVFM7IH0KCiAgICAgCiAgICAgCiAgICBzdGF0aWMgSUVFRWRvdWJsZSBOb3JtYWxp emUoaW50LCBpbnQsIFVMb25nSW50KTsKICAgICAKICAgICAKICAgIGludCBTcGxpdEludG8oQmFz ZUxvbmcgJmZyYWN0aW9uKSBjb25zdDsKCiAgICAgCiAgICBJRUVFZG91YmxlIFVscCh2b2lkKSBj b25zdDsKICAgICAKICAgIHN0YXRpYyBJRUVFZG91YmxlIFJhdGlvKGNvbnN0IEJpZ0ludCAmYSwg Y29uc3QgQmlnSW50ICZiKTsKCgoKCgoKCiAgICBzdGF0aWMgY29uc3QgSUVFRWRvdWJsZSB0ZW5z W107ICAKICAgIHN0YXRpYyBjb25zdCBJRUVFZG91YmxlIGJpZ3RlbnNbXTsgIAoKCnB1YmxpYzoK ICAgICAKICAgICAKICAgICAKICAgIGlubGluZSBpbnQgICAgIFNpZ24odm9pZCkgY29uc3QgICAg IHsgcmV0dXJuIEhpZ2hXb3JkKCkgPj4gMzE7IH0KICAgIGlubGluZSBpbnQgICAgIEV4cG9uZW50 KHZvaWQpIGNvbnN0IHsgcmV0dXJuICgoSGlnaFdvcmQoKSAmIEVYUF9CSVRTKSA+PiAoRlJBQ1Rf U0laRV9ISSkpIC0gQklBUzsgfQogICAgaW5saW5lIExvbmdJbnQgRnJhY3Rpb24odm9pZCkgY29u c3QKICAgIHsKICAgICAgICByZXR1cm4gTG9uZ0ludCgoSGlnaFdvcmQoKSAmIEZSQUNUX0JJVFMp IHwgKEV4cEJpdHMoKSA/IE1JTl9GUkFDVCA6IDApLAogICAgICAgICAgICAgICAgICAgICAgIExv d1dvcmQoKSk7IAogICAgfQogICAgc3RhdGljIGlubGluZSBpbnQgQmlhcyh2b2lkKSAgICAgIHsg cmV0dXJuIEJJQVM7IH0KICAgIHN0YXRpYyBpbmxpbmUgaW50IEZyYWN0U2l6ZSh2b2lkKSB7IHJl dHVybiBGUkFDVF9TSVpFOyB9CgogICAgaW5saW5lIGJvb2wgSXNOYU4odm9pZCkgY29uc3QKICAg IHsKICAgICAgICAgCiAgICAgICAgdTQgaGlnaCA9IEhpZ2hXb3JkKCksCiAgICAgICAgICAgIGxv dyA9IExvd1dvcmQoKTsKICAgICAgICByZXR1cm4gKChoaWdoICYgQUJTX0JJVFMpIHwgKChsb3cg fCAtKGk0KSBsb3cpID4+IDMxKSkgPiBFWFBfQklUUzsKICAgIH0KCiAgICBpbmxpbmUgYm9vbCBJ c05lZ2F0aXZlKHZvaWQpIGNvbnN0IHsgcmV0dXJuICgoaTQpIEhpZ2hXb3JkKCkgPCAwKSAmJiAh SXNOYU4oKTsgfQogICAgaW5saW5lIGJvb2wgSXNQb3NpdGl2ZSh2b2lkKSBjb25zdCB7IHJldHVy biAoKGk0KSBIaWdoV29yZCgpID49IDApICYmICFJc05hTigpOyB9CgogICAgaW5saW5lIGJvb2wg SXNOZWdhdGl2ZVplcm8odm9pZCkgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gKEhpZ2hXb3Jk KCkgPT0gTkVHX1pFUk9fSEkpICYmIChMb3dXb3JkKCkgPT0gWkVST19MTyk7CiAgICB9CiAgICBp bmxpbmUgYm9vbCBJc1Bvc2l0aXZlWmVybyh2b2lkKSBjb25zdAogICAgewogICAgICAgIHJldHVy biAoSGlnaFdvcmQoKSA9PSBQT1NfWkVST19ISSkgJiYgKExvd1dvcmQoKSA9PSBaRVJPX0xPKTsK ICAgIH0KICAgIGlubGluZSBib29sIElzWmVybyh2b2lkKSBjb25zdAogICAgewogICAgICAgIHJl dHVybiAoKEhpZ2hXb3JkKCkgJiBBQlNfQklUUykgPT0gUE9TX1pFUk9fSEkpICYmIChMb3dXb3Jk KCkgPT0gWkVST19MTyk7CiAgICB9CgogICAgaW5saW5lIGJvb2wgSXNOZWdhdGl2ZUluZmluaXR5 KHZvaWQpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIChIaWdoV29yZCgpID09IE5FR19JTkZf SEkpICYmIChMb3dXb3JkKCkgPT0gWkVST19MTyk7CiAgICB9CiAgICBpbmxpbmUgYm9vbCBJc1Bv c2l0aXZlSW5maW5pdHkodm9pZCkgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gKEhpZ2hXb3Jk KCkgPT0gUE9TX0lORl9ISSkgJiYgKExvd1dvcmQoKSA9PSBaRVJPX0xPKTsKICAgIH0KICAgIGlu bGluZSBib29sIElzSW5maW5pdGUodm9pZCkgY29uc3QKICAgIHsKICAgICAgICByZXR1cm4gKChI aWdoV29yZCgpICYgQUJTX0JJVFMpID09IFBPU19JTkZfSEkpICYmIChMb3dXb3JkKCkgPT0gWkVS T19MTyk7CiAgICB9CgoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIHN0 YXRpYyBpbmxpbmUgY29uc3QgSUVFRWRvdWJsZSBOYU4odm9pZCkgICAgICAgICAgICAgICB7IHJl dHVybiBJRUVFZG91YmxlKE5BTl9ISSwgWkVST19MTyk7IH0KICAgIHN0YXRpYyBpbmxpbmUgY29u c3QgSUVFRWRvdWJsZSBQT1NJVElWRV9JTkZJTklUWSh2b2lkKSB7IHJldHVybiBJRUVFZG91Ymxl KFBPU19JTkZfSEksIFpFUk9fTE8pOyB9CiAgICBzdGF0aWMgaW5saW5lIGNvbnN0IElFRUVkb3Vi bGUgTkVHQVRJVkVfSU5GSU5JVFkodm9pZCkgeyByZXR1cm4gSUVFRWRvdWJsZShORUdfSU5GX0hJ LCBaRVJPX0xPKTsgfQogICAgc3RhdGljIGlubGluZSBjb25zdCBJRUVFZG91YmxlIFBPU0lUSVZF X1pFUk8odm9pZCkgICAgIHsgcmV0dXJuIElFRUVkb3VibGUoUE9TX1pFUk9fSEksIFpFUk9fTE8p OyB9CiAgICBzdGF0aWMgaW5saW5lIGNvbnN0IElFRUVkb3VibGUgTkVHQVRJVkVfWkVSTyh2b2lk KSAgICAgeyByZXR1cm4gSUVFRWRvdWJsZShORUdfWkVST19ISSwgWkVST19MTyk7IH0KCgogICAg IAogICAgIAogICAgIAogICAgIAogICAgaW5saW5lIElFRUVkb3VibGUoZG91YmxlIGQpIHsgdmFs dWUuZG91YmxlX3ZhbHVlID0gZDsgfQogICAgIAogICAgICAgICAgIElFRUVkb3VibGUoY29uc3Qg Y2hhciAqLCBib29sIGNoZWNrX2ludmFsaWQgPSBmYWxzZSk7CgogICAgIAogICAgICAgICAgIElF RUVkb3VibGUoaTQpOwogICAgIAogICAgICAgICAgIElFRUVkb3VibGUoY29uc3QgTG9uZ0ludCAm KTsKICAgICAKICAgICAgICAgICBJRUVFZG91YmxlKGNvbnN0IElFRUVmbG9hdCAmKTsKICAgICAK ICAgIGlubGluZSBJRUVFZG91YmxlKHZvaWQpIHt9CiAgICAgCiAgICBpbmxpbmUgSUVFRWRvdWJs ZSh1NCBoaSwgdTQgbG8pIHsgc2V0SGlnaEFuZExvd1dvcmRzKGhpLCBsbyk7IH0KCiAgICAgCiAg ICAgCiAgICAgCiAgICAgICAgICAgaTQgICAgICAgIEludFZhbHVlKHZvaWQpIGNvbnN0OwogICAg ICAgICAgIExvbmdJbnQgICBMb25nVmFsdWUodm9pZCkgY29uc3Q7CiAgICBpbmxpbmUgSUVFRWZs b2F0IEZsb2F0VmFsdWUodm9pZCkgY29uc3QgeyByZXR1cm4gSUVFRWZsb2F0KCp0aGlzKTsgfQoK CiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgICAgICAgSUVFRWRvdWJsZSAgb3BlcmF0b3Ir ICAoY29uc3QgSUVFRWRvdWJsZSkgY29uc3Q7ICAgIAogICAgaW5saW5lIElFRUVkb3VibGUgIG9w ZXJhdG9yKyAgKHZvaWQpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuICp0aGlzOyB9ICAKICAgIGlu bGluZSBJRUVFZG91YmxlICZvcGVyYXRvcis9IChjb25zdCBJRUVFZG91YmxlIG9wKSB7IHJldHVy biAqdGhpcyA9ICp0aGlzICsgb3A7IH0gIAogICAgaW5saW5lIElFRUVkb3VibGUgIG9wZXJhdG9y KysgKHZvaWQpICAgICAgICAgIHsgcmV0dXJuICp0aGlzICs9IDE7IH0gIAogICAgaW5saW5lIElF RUVkb3VibGUgIG9wZXJhdG9yKysgKGludCBkdW1teSkKICAgIHsKICAgICAgICBJRUVFZG91Ymxl IHJlc3VsdCA9ICp0aGlzOwogICAgICAgICp0aGlzICs9IDE7CiAgICAgICAgcmV0dXJuIHJlc3Vs dDsKICAgIH0gIAoKICAgICAgICAgICBJRUVFZG91YmxlICBvcGVyYXRvci0gICh2b2lkKSBjb25z dDsgICAgICAgICAgCiAgICBpbmxpbmUgSUVFRWRvdWJsZSAgb3BlcmF0b3ItICAoY29uc3QgSUVF RWRvdWJsZSBvcCkgY29uc3QgeyByZXR1cm4gKnRoaXMgKyAoLW9wKTsgfSAgCiAgICBpbmxpbmUg SUVFRWRvdWJsZSAmb3BlcmF0b3ItPSAoY29uc3QgSUVFRWRvdWJsZSBvcCkgeyByZXR1cm4gKnRo aXMgPSAqdGhpcyAtIG9wOyB9ICAKICAgIGlubGluZSBJRUVFZG91YmxlICBvcGVyYXRvci0tICh2 b2lkKSAgICAgICAgICB7IHJldHVybiAqdGhpcyAtPSAxOyB9ICAKICAgIGlubGluZSBJRUVFZG91 YmxlICBvcGVyYXRvci0tIChpbnQgZHVtbXkpCiAgICB7CiAgICAgICAgSUVFRWRvdWJsZSByZXN1 bHQgPSAqdGhpczsKICAgICAgICAqdGhpcyAtPSAxOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAg ICB9ICAKCiAgICAgICAgICAgSUVFRWRvdWJsZSAgb3BlcmF0b3IqICAoY29uc3QgSUVFRWRvdWJs ZSkgY29uc3Q7ICAgIAogICAgaW5saW5lIElFRUVkb3VibGUgJm9wZXJhdG9yKj0gKGNvbnN0IElF RUVkb3VibGUgb3ApIHsgcmV0dXJuICp0aGlzID0gKnRoaXMgKiBvcDsgfSAgCgogICAgICAgICAg IElFRUVkb3VibGUgIG9wZXJhdG9yLyAgKGNvbnN0IElFRUVkb3VibGUpIGNvbnN0OyAgICAKICAg IGlubGluZSBJRUVFZG91YmxlICZvcGVyYXRvci89IChjb25zdCBJRUVFZG91YmxlIG9wKSB7IHJl dHVybiAqdGhpcyA9ICp0aGlzIC8gb3A7IH0gIAoKICAgICAgICAgICBJRUVFZG91YmxlICBvcGVy YXRvciUgIChjb25zdCBJRUVFZG91YmxlKSBjb25zdDsgICAgCiAgICBpbmxpbmUgSUVFRWRvdWJs ZSAmb3BlcmF0b3IlPSAoY29uc3QgSUVFRWRvdWJsZSBvcCkgeyByZXR1cm4gKnRoaXMgPSAqdGhp cyAlIG9wOyB9ICAKCiAgICAgCiAgICAgCiAgICAgCiAgICBib29sIG9wZXJhdG9yPT0gKGNvbnN0 IElFRUVkb3VibGUpIGNvbnN0OyAgCiAgICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IElFRUVkb3Vi bGUpIGNvbnN0OyAgCiAgICBib29sIG9wZXJhdG9yPCAgKGNvbnN0IElFRUVkb3VibGUpIGNvbnN0 OyAgCiAgICBib29sIG9wZXJhdG9yPiAgKGNvbnN0IElFRUVkb3VibGUpIGNvbnN0OyAgCiAgICBi b29sIG9wZXJhdG9yPD0gKGNvbnN0IElFRUVkb3VibGUpIGNvbnN0OyAgCiAgICBib29sIG9wZXJh dG9yPj0gKGNvbnN0IElFRUVkb3VibGUpIGNvbnN0OyAgCgogICAgIAogICAgIAogICAgIAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgaW5saW5lIGJvb2wgZXF1YWxzKGNv bnN0IElFRUVkb3VibGUgb3ApIGNvbnN0IHsgcmV0dXJuIChCYXNlTG9uZykgKnRoaXMgPT0gKEJh c2VMb25nKSBvcDsgfQogICAgaW5saW5lIGk0IGhhc2hDb2RlKHZvaWQpIGNvbnN0IHsgcmV0dXJu ICgoQmFzZUxvbmcpICp0aGlzKS5oYXNoQ29kZSgpOyB9CiAgICBpbmxpbmUgaW50IGNvbXBhcmVU byhjb25zdCBJRUVFZG91YmxlIG9wKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBJc05hTigp ID8gMQogICAgICAgICAgICAgICAgICAgICAgIDogKElzWmVybygpICYmIG9wLklzWmVybygpKSA/ IG9wLlNpZ24oKSAtIFNpZ24oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICA6ICgqdGhpcyA8IG9wKSA/IC0xCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKnRoaXMgPiBvcDsK ICAgIH0gICAgICAgIAp9OwoKCiAKIAogCiAKY2xhc3MgQmlnSW50CnsKcHVibGljOgogICAgIAog ICAgQmlnSW50KGNvbnN0IElFRUVmbG9hdCAmLCBpbnQgJmV4cCwgaW50ICZiaXRjbnQpOwogICAg QmlnSW50KGNvbnN0IElFRUVkb3VibGUgJiwgaW50ICZleHAsIGludCAmYml0Y250KTsKICAgICAK ICAgIGlubGluZSBCaWdJbnQoaW50KTsKICAgICAKICAgICAKICAgICAKICAgICAKICAgIEJpZ0lu dChjb25zdCBjaGFyICosIGludCBiZWZvcmUsIGludCB0b3RhbCwgdTQgc3RhcnQsIGludCBzdGFy dHNpemUpOwogICAgIAogICAgQmlnSW50ICZvcGVyYXRvciA9KGNvbnN0IEJpZ0ludCAmKTsKICAg IEJpZ0ludChjb25zdCBCaWdJbnQgJm9wKSB7ICp0aGlzID0gb3A7IH0KICAgICAKICAgIH5CaWdJ bnQoKQogICAgewogICAgICAgIGRlbGV0ZSBkYXRhOwogICAgfQoKcHJpdmF0ZToKICAgICAKICAg IGlubGluZSB2b2lkIHJlc2l6ZShpbnQgayk7CgogICAgIAogICAgc3RhdGljIGludCBoaTBiaXRz KHU0IHgpOwogICAgIAogICAgIAogICAgc3RhdGljIGludCBsbzBiaXRzKHU0ICZ5KTsKCnB1Ymxp YzoKICAgICAKICAgIGlubGluZSBpbnQgaGkwYml0cygpIGNvbnN0IHsgKHN0YXRpY19jYXN0PHZv aWQ+ICAoKCBkYXRhICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJkYXRhIiAsICIuLi8uLi9qaWtl cy9zcmMvZG91YmxlLmgiLCA1NTUsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7IHJldHVy biBoaTBiaXRzKGRhdGFbd2RzIC0gMV0pOyB9CgogICAgIAogICAgaW5saW5lIGJvb2wgSXNaZXJv KCkgY29uc3QgeyAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIGRhdGEgKSA/IDAgOgkoX19hc3NlcnRf ZmFpbCAoImRhdGEiICwgIi4uLy4uL2ppa2VzL3NyYy9kb3VibGUuaCIsIDU1OCwgX19QUkVUVFlf RlVOQ1RJT05fXyApLCAwKSkpIDsgcmV0dXJuICEgKGRhdGFbMF0gfHwgd2RzID4gMSk7IH0KCiAg ICAgCiAgICBpbmxpbmUgYm9vbCBJc05lZ2F0aXZlKCkgY29uc3QgeyByZXR1cm4gbmVnOyB9CiAg ICAgCiAgICBpbmxpbmUgdm9pZCBJc05lZ2F0aXZlKGJvb2wgdmFsdWUpIHsgbmVnID0gdmFsdWU7 IH0KCiAgICAgCiAgICAgICAgICAgQmlnSW50ICZvcGVyYXRvciArICAoY29uc3QgdW5zaWduZWQg b3ApIGNvbnN0OwogICAgaW5saW5lIEJpZ0ludCAmb3BlcmF0b3IgKz0gKGNvbnN0IHVuc2lnbmVk IG9wKSB7IHJldHVybiAqdGhpcyA9ICp0aGlzICsgb3A7IH0KICAgIGlubGluZSBCaWdJbnQgJm9w ZXJhdG9yICsrICh2b2lkKSB7IHJldHVybiAqdGhpcyArPSAxOyB9ICAKICAgICAgICAgICBCaWdJ bnQgJm9wZXJhdG9yIC0gIChjb25zdCBCaWdJbnQgJm9wKSBjb25zdDsKICAgICAgICAgICBCaWdJ bnQgJm9wZXJhdG9yICogIChjb25zdCBCaWdJbnQgJm9wKSBjb25zdDsKICAgICAgICAgICBCaWdJ bnQgJm9wZXJhdG9yICogICh1bnNpZ25lZCBvcCkgY29uc3Q7CiAgICBpbmxpbmUgQmlnSW50ICZv cGVyYXRvciAqPSAoY29uc3QgQmlnSW50ICZvcCkgeyByZXR1cm4gKnRoaXMgPSAqdGhpcyAqIG9w OyB9CiAgICBpbmxpbmUgQmlnSW50ICZvcGVyYXRvciAqPSAodW5zaWduZWQgb3ApIHsgcmV0dXJu ICp0aGlzID0gKnRoaXMgKiBvcDsgfQogICAgICAgICAgIEJpZ0ludCAmb3BlcmF0b3IgPDwgKHVu c2lnbmVkIG9wKSBjb25zdDsKICAgIGlubGluZSBCaWdJbnQgJm9wZXJhdG9yIDw8PSh1bnNpZ25l ZCBvcCkgeyByZXR1cm4gKnRoaXMgPSAqdGhpcyA8PCBvcDsgfQoKICAgICAKICAgIEJpZ0ludCAm bXVsdGFkZCh1bnNpZ25lZCBtLCB1bnNpZ25lZCBhKTsKICAgICAKICAgIEJpZ0ludCAmcG93NW11 bHQodW5zaWduZWQgayk7CiAgICAgCiAgICBpbnQgY29tcGFyZVRvKGNvbnN0IEJpZ0ludCAmYikg Y29uc3Q7CiAgICAgCiAgICBpbnQgcXVvcmVtKGNvbnN0IEJpZ0ludCAmUyk7CgogICAgIAogICAg SUVFRWZsb2F0IEZsb2F0VmFsdWUoKSBjb25zdDsKICAgIElFRUVkb3VibGUgRG91YmxlVmFsdWUo KSBjb25zdDsKCnByaXZhdGU6CiAgICBmcmllbmQgSUVFRWZsb2F0IElFRUVmbG9hdDo6UmF0aW8o Y29uc3QgQmlnSW50ICYsIGNvbnN0IEJpZ0ludCAmKTsKICAgIGZyaWVuZCBJRUVFZG91YmxlIElF RUVkb3VibGU6OlJhdGlvKGNvbnN0IEJpZ0ludCAmLCBjb25zdCBCaWdJbnQgJik7CgogICAgaW50 IGs7ICAgICAgIAogICAgaW50IG1heHdkczsgIAogICAgYm9vbCBuZWc7ICAgIAogICAgaW50IHdk czsgICAgIAogICAgdTQgKmRhdGE7ICAgIAoKCgoKCiAgICBzdGF0aWMgY29uc3QgdTQgZml2ZXNb XTsKICAgIHN0YXRpYyBjb25zdCBCaWdJbnQgKmJpZ2ZpdmVzW107CgoKfTsKCgppbmxpbmUgSUVF RWRvdWJsZSBJRUVFZmxvYXQ6OkRvdWJsZVZhbHVlKCkgY29uc3QKewogICAgcmV0dXJuIElFRUVk b3VibGUoKnRoaXMpOwp9CgppbmxpbmUgQmlnSW50OjpCaWdJbnQoaW50IGkpIDogZGF0YShfX251 bGwgKQp7CiAgICByZXNpemUoMCk7CiAgICBkYXRhWzBdID0gaTsKICAgIHdkcyA9IDE7CiAgICBu ZWcgPSBpIDwgMDsKfQoKaW5saW5lIHZvaWQgQmlnSW50OjpyZXNpemUoaW50IGspCnsKICAgIG1h eHdkcyA9IDEgPDwgazsKICAgIGRlbGV0ZSBkYXRhOwogICAgZGF0YSA9IG5ldyB1NFttYXh3ZHNd OwogICAgdGhpcyAtPiBrID0gazsKICAgIHdkcyA9IDA7CiAgICBuZWcgPSBmYWxzZTsKfQoKCgoK CgoKIyAxMiAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiAyCgojIDEgIi4uLy4uL2ppa2VzL3Ny Yy9wYXJzZXIuaCIgMQogCiAKIAogCiAKIAogCiAKIAoKCgoKIyAxICIuLi8uLi9qaWtlcy9zcmMv bHBnaW5wdXQuaCIgMQogCiAKIAogCiAKIAogCiAKIAoKCgoKIyAxICIuLi8uLi9qaWtlcy9zcmMv c3RyZWFtLmgiIDEKIAogCiAKIAogCiAKIAogCiAKCgoKCiMgMSAiLi4vLi4vamlrZXMvc3JjL2ph dmFkZWYuaCIgMQogCiAKIAogCiAKIAogCiAKIAogCgoKCgoKCgoKZW51bSB7CiAgICAgIEVSUk9S X1NZTUJPTCAgICAgID0gMTA3LAogICAgICBNQVhfRElTVEFOQ0UgICAgICA9IDMwLAogICAgICBN SU5fRElTVEFOQ0UgICAgICA9IDMsCiAgICAgIE1BWF9OQU1FX0xFTkdUSCAgID0gMzgsCiAgICAg IE1BWF9URVJNX0xFTkdUSCAgID0gMzgsCiAgICAgIE5VTV9TVEFURVMgICAgICAgID0gNTU5LAoK ICAgICAgTlRfT0ZGU0VUICAgICAgICAgPSAxMDgsCiAgICAgIEJVRkZfVUJPVU5EICAgICAgID0g MzEsCiAgICAgIEJVRkZfU0laRSAgICAgICAgID0gMzIsCiAgICAgIFNUQUNLX1VCT1VORCAgICAg ID0gMTI3LAogICAgICBTVEFDS19TSVpFICAgICAgICA9IDEyOCwKICAgICAgU0NPUEVfVUJPVU5E ICAgICAgPSA1NiwKICAgICAgU0NPUEVfU0laRSAgICAgICAgPSA1NywKICAgICAgTEFfU1RBVEVf T0ZGU0VUICAgPSA1NTk3LAogICAgICBNQVhfTEEgICAgICAgICAgICA9IDIsCiAgICAgIE5VTV9S VUxFUyAgICAgICAgID0gMzU2LAogICAgICBOVU1fVEVSTUlOQUxTICAgICA9IDEwOCwKICAgICAg TlVNX05PTl9URVJNSU5BTFMgPSAxNjAsCiAgICAgIE5VTV9TWU1CT0xTICAgICAgID0gMjY4LAog ICAgICBTVEFSVF9TVEFURSAgICAgICA9IDk4MiwKICAgICAgRU9GVF9TWU1CT0wgICAgICAgPSA5 NiwKICAgICAgRU9MVF9TWU1CT0wgICAgICAgPSAyNywKICAgICAgQUNDRVBUX0FDVElPTiAgICAg PSA1MjQwLAogICAgICBFUlJPUl9BQ1RJT04gICAgICA9IDUyNDEKICAgICB9OwoKCgoKCgoKIyAx NCAiLi4vLi4vamlrZXMvc3JjL3N0cmVhbS5oIiAyCgojIDEgIi4uLy4uL2ppa2VzL3NyYy9qYXZh c3ltLmgiIDEKIAogCiAKIAogCiAKIAogCiAKIAoKCgoKCgoKCmVudW0gewogICAgICBUS19Cb2R5 TWFya2VyID0gMTAxLAogICAgICBUS19JZGVudGlmaWVyID0gMjgsCiAgICAgIFRLX2Fic3RyYWN0 ID0gNTcsCiAgICAgIFRLX2Jvb2xlYW4gPSAzMiwKICAgICAgVEtfYnJlYWsgPSA3MCwKICAgICAg VEtfYnl0ZSA9IDMzLAogICAgICBUS19jYXNlID0gODEsCiAgICAgIFRLX2NhdGNoID0gOTcsCiAg ICAgIFRLX2NoYXIgPSAzNCwKICAgICAgVEtfY2xhc3MgPSA3OSwKICAgICAgVEtfY29uc3QgPSAx MDUsCiAgICAgIFRLX2NvbnRpbnVlID0gNzEsCiAgICAgIFRLX2RlZmF1bHQgPSA4MiwKICAgICAg VEtfZG8gPSA3MiwKICAgICAgVEtfZG91YmxlID0gMzUsCiAgICAgIFRLX2Vsc2UgPSA5NCwKICAg ICAgVEtfZXh0ZW5kcyA9IDk4LAogICAgICBUS19mYWxzZSA9IDQ2LAogICAgICBUS19maW5hbCA9 IDU4LAogICAgICBUS19maW5hbGx5ID0gOTksCiAgICAgIFRLX2Zsb2F0ID0gMzYsCiAgICAgIFRL X2ZvciA9IDczLAogICAgICBUS19nb3RvID0gMTA2LAogICAgICBUS19pZiA9IDc0LAogICAgICBU S19pbXBsZW1lbnRzID0gMTAyLAogICAgICBUS19pbXBvcnQgPSAxMDAsCiAgICAgIFRLX2luc3Rh bmNlb2YgPSAxNywKICAgICAgVEtfaW50ID0gMzcsCiAgICAgIFRLX2ludGVyZmFjZSA9IDk1LAog ICAgICBUS19sb25nID0gMzgsCiAgICAgIFRLX25hdGl2ZSA9IDU5LAogICAgICBUS19uZXcgPSAz OSwKICAgICAgVEtfbnVsbCA9IDQ3LAogICAgICBUS19wYWNrYWdlID0gMTAzLAogICAgICBUS19w cml2YXRlID0gNjAsCiAgICAgIFRLX3Byb3RlY3RlZCA9IDYxLAogICAgICBUS19wdWJsaWMgPSA2 MiwKICAgICAgVEtfcmV0dXJuID0gNzUsCiAgICAgIFRLX3Nob3J0ID0gNDAsCiAgICAgIFRLX3N0 YXRpYyA9IDYzLAogICAgICBUS19zdHJpY3RmcCA9IDY0LAogICAgICBUS19zdXBlciA9IDQxLAog ICAgICBUS19zd2l0Y2ggPSA3NiwKICAgICAgVEtfc3luY2hyb25pemVkID0gNTUsCiAgICAgIFRL X3RoaXMgPSA0MywKICAgICAgVEtfdGhyb3cgPSA3NywKICAgICAgVEtfdGhyb3dzID0gMTA0LAog ICAgICBUS190cmFuc2llbnQgPSA2NSwKICAgICAgVEtfdHJ1ZSA9IDQ4LAogICAgICBUS190cnkg PSA3OCwKICAgICAgVEtfdm9pZCA9IDQ0LAogICAgICBUS192b2xhdGlsZSA9IDY2LAogICAgICBU S193aGlsZSA9IDY3LAogICAgICBUS19JbnRlZ2VyTGl0ZXJhbCA9IDQ5LAogICAgICBUS19Mb25n TGl0ZXJhbCA9IDUwLAogICAgICBUS19GbG9hdGluZ1BvaW50TGl0ZXJhbCA9IDUxLAogICAgICBU S19Eb3VibGVMaXRlcmFsID0gNTIsCiAgICAgIFRLX0NoYXJhY3RlckxpdGVyYWwgPSA1MywKICAg ICAgVEtfU3RyaW5nTGl0ZXJhbCA9IDU0LAogICAgICBUS19QTFVTX1BMVVMgPSAxLAogICAgICBU S19NSU5VU19NSU5VUyA9IDIsCiAgICAgIFRLX0VRVUFMX0VRVUFMID0gMTMsCiAgICAgIFRLX0xF U1NfRVFVQUwgPSAxOCwKICAgICAgVEtfR1JFQVRFUl9FUVVBTCA9IDE5LAogICAgICBUS19OT1Rf RVFVQUwgPSAxNCwKICAgICAgVEtfTEVGVF9TSElGVCA9IDEwLAogICAgICBUS19SSUdIVF9TSElG VCA9IDExLAogICAgICBUS19VTlNJR05FRF9SSUdIVF9TSElGVCA9IDEyLAogICAgICBUS19QTFVT X0VRVUFMID0gODMsCiAgICAgIFRLX01JTlVTX0VRVUFMID0gODQsCiAgICAgIFRLX01VTFRJUExZ X0VRVUFMID0gODUsCiAgICAgIFRLX0RJVklERV9FUVVBTCA9IDg2LAogICAgICBUS19BTkRfRVFV QUwgPSA4NywKICAgICAgVEtfT1JfRVFVQUwgPSA4OCwKICAgICAgVEtfWE9SX0VRVUFMID0gODks CiAgICAgIFRLX1JFTUFJTkRFUl9FUVVBTCA9IDkwLAogICAgICBUS19MRUZUX1NISUZUX0VRVUFM ID0gOTEsCiAgICAgIFRLX1JJR0hUX1NISUZUX0VRVUFMID0gOTIsCiAgICAgIFRLX1VOU0lHTkVE X1JJR0hUX1NISUZUX0VRVUFMID0gOTMsCiAgICAgIFRLX09SX09SID0gMjQsCiAgICAgIFRLX0FO RF9BTkQgPSAyNSwKICAgICAgVEtfUExVUyA9IDcsCiAgICAgIFRLX01JTlVTID0gOCwKICAgICAg VEtfTk9UID0gNjgsCiAgICAgIFRLX1JFTUFJTkRFUiA9IDUsCiAgICAgIFRLX1hPUiA9IDE2LAog ICAgICBUS19BTkQgPSAxNSwKICAgICAgVEtfTVVMVElQTFkgPSA0LAogICAgICBUS19PUiA9IDIz LAogICAgICBUS19UV0lERExFID0gNjksCiAgICAgIFRLX0RJVklERSA9IDYsCiAgICAgIFRLX0dS RUFURVIgPSAyMCwKICAgICAgVEtfTEVTUyA9IDIxLAogICAgICBUS19MUEFSRU4gPSAyMiwKICAg ICAgVEtfUlBBUkVOID0gMjksCiAgICAgIFRLX0xCUkFDRSA9IDQ1LAogICAgICBUS19SQlJBQ0Ug PSAzMSwKICAgICAgVEtfTEJSQUNLRVQgPSA5LAogICAgICBUS19SQlJBQ0tFVCA9IDU2LAogICAg ICBUS19TRU1JQ09MT04gPSAyNywKICAgICAgVEtfUVVFU1RJT04gPSAyNiwKICAgICAgVEtfQ09M T04gPSA0MiwKICAgICAgVEtfQ09NTUEgPSAzMCwKICAgICAgVEtfRE9UID0gMywKICAgICAgVEtf RVFVQUwgPSA4MCwKICAgICAgVEtfRVJST1IgPSAxMDcsCiAgICAgIFRLX0VPRiA9IDk2LAogICAg ICBUS19FT0wgPSAxMDgKICAgICB9OwoKCgoKCgojIDE1ICIuLi8uLi9qaWtlcy9zcmMvc3RyZWFt LmgiIDIKCgojIDEgIi4uLy4uL2ppa2VzL3NyYy90YWIuaCIgMQogCiAKIAogCiAKIAogCiAKIAoK CgoKCiAKCgoKCgoKCgoKCgpjbGFzcyBUYWIKewpwdWJsaWM6CiAgICBlbnVtIHsgREVGQVVMVF9U QUJfU0laRSA9IDggfTsKCiAgICBpbmxpbmUgc3RhdGljIGludCBUYWJTaXplKCkgeyByZXR1cm4g dGFiX3NpemU7IH0KICAgIGlubGluZSBzdGF0aWMgdm9pZCBTZXRUYWJTaXplKGludCB2YWx1ZSkg eyB0YWJfc2l6ZSA9IHZhbHVlOyB9CgogICAgc3RhdGljIGludCBXY3NsZW4od2NoYXJfdCAqbGlu ZSwgaW50IHN0YXJ0LCBpbnQgZW5kKTsKCnByaXZhdGU6CiAgICBzdGF0aWMgaW50IHRhYl9zaXpl Owp9OwoKCgoKCgoKIyAxNyAiLi4vLi4vamlrZXMvc3JjL3N0cmVhbS5oIiAyCgojIDEgIi4uLy4u L2ppa2VzL3NyYy9sb29rdXAuaCIgMQogCiAKIAogCiAKIAogCiAKIAoKCgoKCgoKCgojIDEgIi91 c3IvaW5jbHVkZS90aW1lLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKZXh0 ZXJuICJDIiB7IAoKCgoKIAoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgv Mi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2Nj LWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCiAK CgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2lu Y2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoK IAoKCiMgMTI2ICIvdXNyL2xpYi9nY2MtbGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVk ZS9zdGRkZWYuaCIgMwoKCiAKCgoKCiAKCiAKCgojIDE4OCAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2 LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgogCgoKCgogCgoKIyAy NjkgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRl Zi5oIiAzCgoKCgoKCgoKCgoKCgoKCgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pNDg2 LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoK CiAKCgoKCgoKCiMgMzggIi91c3IvaW5jbHVkZS90aW1lLmgiIDIgMwoKCiAKCiMgMSAiL3Vzci9p bmNsdWRlL2JpdHMvdGltZS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgogCgoK IAoKCgoKCiAKCgpleHRlcm4gbG9uZyBpbnQgX19zeXNjb25mIChpbnQpOwoKCgoKIAoKIAoKIAoK CiAKCgoKCgoKIyA3MyAiL3Vzci9pbmNsdWRlL2JpdHMvdGltZS5oIiAzCgojIDQyICIvdXNyL2lu Y2x1ZGUvdGltZS5oIiAyIDMKCgogCgoKCgoKCgoKCgoKCgogCnR5cGVkZWYgX19jbG9ja190IGNs b2NrX3Q7CgoKCgojIDcyICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCiMgODQgIi91c3IvaW5j bHVkZS90aW1lLmgiIDMKCgoKIyA5NiAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCgoKIyAxMTIg Ii91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgoKCgogCnN0cnVjdCB0bQp7CiAgaW50IHRtX3NlYzsJ CQkgCiAgaW50IHRtX21pbjsJCQkgCiAgaW50IHRtX2hvdXI7CQkJIAogIGludCB0bV9tZGF5OwkJ CSAKICBpbnQgdG1fbW9uOwkJCSAKICBpbnQgdG1feWVhcjsJCQkgCiAgaW50IHRtX3dkYXk7CQkJ IAogIGludCB0bV95ZGF5OwkJCSAKICBpbnQgdG1faXNkc3Q7CQkJIAoKCiAgbG9uZyBpbnQgdG1f Z210b2ZmOwkJIAogIF9fY29uc3QgY2hhciAqdG1fem9uZTsJIAoKCgoKfTsKCgoKIApzdHJ1Y3Qg aXRpbWVyc3BlYwogIHsKICAgIHN0cnVjdCB0aW1lc3BlYyBpdF9pbnRlcnZhbDsKICAgIHN0cnVj dCB0aW1lc3BlYyBpdF92YWx1ZTsKICB9OwoKIApzdHJ1Y3Qgc2lnZXZlbnQ7CgoKCgoKCgoKCgoK IAoKZXh0ZXJuIGNsb2NrX3QgY2xvY2sgKHZvaWQpIHRocm93ICgpIDsKCiAKZXh0ZXJuIHRpbWVf dCB0aW1lICh0aW1lX3QgKl9fdGltZXIpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGRvdWJsZSBkaWZm dGltZSAodGltZV90IF9fdGltZTEsIHRpbWVfdCBfX3RpbWUwKQogICAgIHRocm93ICgpICBfX2F0 dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CgogCmV4dGVybiB0aW1lX3QgbWt0aW1lIChzdHJ1Y3Qg dG0gKl9fdHApIHRocm93ICgpIDsKCgogCgoKZXh0ZXJuIHNpemVfdCBzdHJmdGltZSAoY2hhciAq X19yZXN0cmljdCBfX3MsIHNpemVfdCBfX21heHNpemUsCgkJCV9fY29uc3QgY2hhciAqX19yZXN0 cmljdCBfX2Zvcm1hdCwKCQkJX19jb25zdCBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgdGhy b3cgKCkgOwoKCgoKCgoKCgoKIAoKZXh0ZXJuIHN0cnVjdCB0bSAqZ210aW1lIChfX2NvbnN0IHRp bWVfdCAqX190aW1lcikgdGhyb3cgKCkgOwoKIAoKZXh0ZXJuIHN0cnVjdCB0bSAqbG9jYWx0aW1l IChfX2NvbnN0IHRpbWVfdCAqX190aW1lcikgdGhyb3cgKCkgOwoKCiAKCmV4dGVybiBzdHJ1Y3Qg dG0gKmdtdGltZV9yIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVyLAoJCQkgICAg c3RydWN0IHRtICpfX3Jlc3RyaWN0IF9fdHApIHRocm93ICgpIDsKCiAKCmV4dGVybiBzdHJ1Y3Qg dG0gKmxvY2FsdGltZV9yIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVyLAoJCQkg ICAgICAgc3RydWN0IHRtICpfX3Jlc3RyaWN0IF9fdHApIHRocm93ICgpIDsKCgogCgpleHRlcm4g Y2hhciAqYXNjdGltZSAoX19jb25zdCBzdHJ1Y3QgdG0gKl9fdHApIHRocm93ICgpIDsKCiAKZXh0 ZXJuIGNoYXIgKmN0aW1lIChfX2NvbnN0IHRpbWVfdCAqX190aW1lcikgdGhyb3cgKCkgOwoKCiAK CiAKCmV4dGVybiBjaGFyICphc2N0aW1lX3IgKF9fY29uc3Qgc3RydWN0IHRtICpfX3Jlc3RyaWN0 IF9fdHAsCgkJCWNoYXIgKl9fcmVzdHJpY3QgX19idWYpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGNo YXIgKmN0aW1lX3IgKF9fY29uc3QgdGltZV90ICpfX3Jlc3RyaWN0IF9fdGltZXIsCgkJICAgICAg Y2hhciAqX19yZXN0cmljdCBfX2J1ZikgdGhyb3cgKCkgOwoKCgogCmV4dGVybiBjaGFyICpfX3R6 bmFtZVsyXTsJIApleHRlcm4gaW50IF9fZGF5bGlnaHQ7CQkgCmV4dGVybiBsb25nIGludCBfX3Rp bWV6b25lOwkgCgoKCiAKZXh0ZXJuIGNoYXIgKnR6bmFtZVsyXTsKCiAKCmV4dGVybiB2b2lkIHR6 c2V0ICh2b2lkKSB0aHJvdyAoKSA7CgoKCmV4dGVybiBpbnQgZGF5bGlnaHQ7CmV4dGVybiBsb25n IGludCB0aW1lem9uZTsKCgoKIAoKZXh0ZXJuIGludCBzdGltZSAoX19jb25zdCB0aW1lX3QgKl9f d2hlbikgdGhyb3cgKCkgOwoKCgogCgoKCgoKCiAKCgogCmV4dGVybiB0aW1lX3QgdGltZWdtIChz dHJ1Y3QgdG0gKl9fdHApIHRocm93ICgpIDsKCiAKZXh0ZXJuIHRpbWVfdCB0aW1lbG9jYWwgKHN0 cnVjdCB0bSAqX190cCkgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IGR5c2l6ZSAoaW50IF9feWVh cikgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CgoKCgogCmV4dGVybiBp bnQgbmFub3NsZWVwIChfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXF1ZXN0ZWRfdGltZSwK CQkgICAgICBzdHJ1Y3QgdGltZXNwZWMgKl9fcmVtYWluaW5nKSB0aHJvdyAoKSA7CgoKIApleHRl cm4gaW50IGNsb2NrX2dldHJlcyAoY2xvY2tpZF90IF9fY2xvY2tfaWQsIHN0cnVjdCB0aW1lc3Bl YyAqX19yZXMpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCBjbG9ja19nZXR0aW1lIChjbG9ja2lk X3QgX19jbG9ja19pZCwgc3RydWN0IHRpbWVzcGVjICpfX3RwKSB0aHJvdyAoKSA7CgogCmV4dGVy biBpbnQgY2xvY2tfc2V0dGltZSAoY2xvY2tpZF90IF9fY2xvY2tfaWQsIF9fY29uc3Qgc3RydWN0 IHRpbWVzcGVjICpfX3RwKQogICAgIHRocm93ICgpIDsKCiMgMzA1ICIvdXNyL2luY2x1ZGUvdGlt ZS5oIiAzCgoKCiAKZXh0ZXJuIGludCB0aW1lcl9jcmVhdGUgKGNsb2NraWRfdCBfX2Nsb2NrX2lk LAoJCQkgc3RydWN0IHNpZ2V2ZW50ICpfX3Jlc3RyaWN0IF9fZXZwLAoJCQkgdGltZXJfdCAqX19y ZXN0cmljdCBfX3RpbWVyaWQpIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCB0aW1lcl9kZWxldGUg KHRpbWVyX3QgX190aW1lcmlkKSB0aHJvdyAoKSA7CgogCmV4dGVybiBpbnQgdGltZXJfc2V0dGlt ZSAodGltZXJfdCBfX3RpbWVyaWQsIGludCBfX2ZsYWdzLAoJCQkgIF9fY29uc3Qgc3RydWN0IGl0 aW1lcnNwZWMgKl9fcmVzdHJpY3QgX192YWx1ZSwKCQkJICBzdHJ1Y3QgaXRpbWVyc3BlYyAqX19y ZXN0cmljdCBfX292YWx1ZSkgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHRpbWVyX2dldHRpbWUg KHRpbWVyX3QgX190aW1lcmlkLCBzdHJ1Y3QgaXRpbWVyc3BlYyAqX192YWx1ZSkKICAgICB0aHJv dyAoKSA7CgogCmV4dGVybiBpbnQgdGltZXJfZ2V0b3ZlcnJ1biAodGltZXJfdCBfX3RpbWVyaWQp IHRocm93ICgpIDsKCgoKIyAzNDkgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgojIDM1OSAiL3Vz ci9pbmNsdWRlL3RpbWUuaCIgMwoKCgp9IAoKCgoKIyAxOSAiLi4vLi4vamlrZXMvc3JjL2xvb2t1 cC5oIiAyCgoKCgoKCgoKCgoKY2xhc3MgQ29udHJvbDsKY2xhc3MgU3ltYm9sOwpjbGFzcyBQYWNr YWdlU3ltYm9sOwpjbGFzcyBUeXBlU3ltYm9sOwpjbGFzcyBNZXRob2RTeW1ib2w7CmNsYXNzIE1l dGhvZFNoYWRvd1N5bWJvbDsKY2xhc3MgQmxvY2tTeW1ib2w7CmNsYXNzIFZhcmlhYmxlU3ltYm9s OwpjbGFzcyBWYXJpYWJsZVNoYWRvd1N5bWJvbDsKY2xhc3MgTGFiZWxTeW1ib2w7CmNsYXNzIExp dGVyYWxTeW1ib2w7CmNsYXNzIE5hbWVTeW1ib2w7CgpjbGFzcyBQYXRoU3ltYm9sOwpjbGFzcyBE aXJlY3RvcnlTeW1ib2w7CmNsYXNzIEZpbGVTeW1ib2w7CgpjbGFzcyBTaGFkb3dTeW1ib2w7Cgpj bGFzcyBMaXRlcmFsVmFsdWU7CmNsYXNzIEludExpdGVyYWxWYWx1ZTsKY2xhc3MgTG9uZ0xpdGVy YWxWYWx1ZTsKY2xhc3MgRmxvYXRMaXRlcmFsVmFsdWU7CmNsYXNzIERvdWJsZUxpdGVyYWxWYWx1 ZTsKY2xhc3MgVXRmOExpdGVyYWxWYWx1ZTsKCmNsYXNzIFV0ZjhMaXRlcmFsVGFibGU7CmNsYXNz IE5hbWVMb29rdXBUYWJsZTsKY2xhc3MgVHlwZUxvb2t1cFRhYmxlOwpjbGFzcyBMaXRlcmFsTG9v a3VwVGFibGU7CgpjbGFzcyBBc3RCaW5hcnlFeHByZXNzaW9uOwpjbGFzcyBBc3RFeHByZXNzaW9u OwoKY2xhc3MgSGFzaAp7CnB1YmxpYzoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAg IGlubGluZSBzdGF0aWMgdW5zaWduZWQgRnVuY3Rpb24od2NoYXJfdCAqaGVhZCwgaW50IGxlbikK ICAgIHsKICAgICAgICB1bnNpZ25lZCBsb25nIGhhc2hfdmFsdWUgPSBoZWFkW2xlbiA+PiAxXTsg IAogICAgICAgIHdjaGFyX3QgKnRhaWwgPSAmaGVhZFtsZW4gLSAxXTsKCiAgICAgICAgZm9yIChp bnQgaSA9IDA7IGkgPCA1ICYmIGhlYWQgPCB0YWlsOyBpKyspCiAgICAgICAgewogICAgICAgICAg ICB1bnNpZ25lZCBrID0gKnRhaWwtLTsKICAgICAgICAgICAgaGFzaF92YWx1ZSArPSAoKGsgPDwg NykgKyAqaGVhZCsrKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBoYXNoX3ZhbHVlOwogICAg fQoKICAgICAKICAgICAKICAgICAKICAgIGlubGluZSBzdGF0aWMgdW5zaWduZWQgRnVuY3Rpb24o Y29uc3QgY2hhciAqaGVhZCwgaW50IGxlbikKICAgIHsKICAgICAgICB1bnNpZ25lZCBsb25nIGhh c2hfdmFsdWUgPSBoZWFkW2xlbiA+PiAxXTsgIAogICAgICAgIGNvbnN0IGNoYXIgKnRhaWwgPSAm aGVhZFtsZW4gLSAxXTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1ICYmIGhlYWQgPCB0 YWlsOyBpKyspCiAgICAgICAgewogICAgICAgICAgICB1bnNpZ25lZCBrID0gKnRhaWwtLTsKICAg ICAgICAgICAgaGFzaF92YWx1ZSArPSAoKGsgPDwgNykgKyAqaGVhZCsrKTsKICAgICAgICB9Cgog ICAgICAgIHJldHVybiBoYXNoX3ZhbHVlOwogICAgfQoKICAgIGlubGluZSBzdGF0aWMgdW5zaWdu ZWQgRnVuY3Rpb24oTG9uZ0ludCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gdmFsdWUuaGFz aENvZGUoKTsKICAgIH0KCiAgICBpbmxpbmUgc3RhdGljIHVuc2lnbmVkIEZ1bmN0aW9uKElFRUVm bG9hdCB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gdmFsdWUuaGFzaENvZGUoKTsKICAgIH0K CiAgICBpbmxpbmUgc3RhdGljIHVuc2lnbmVkIEZ1bmN0aW9uKElFRUVkb3VibGUgdmFsdWUpCiAg ICB7CiAgICAgICAgcmV0dXJuIHZhbHVlLmhhc2hDb2RlKCk7CiAgICB9Cn07CgoKY2xhc3MgRGly ZWN0b3J5RW50cnkKewpwdWJsaWM6CiAgICBEaXJlY3RvcnlFbnRyeSAqbmV4dDsKICAgIGNoYXIg Km5hbWU7CiAgICBpbnQgbGVuZ3RoOwoKICAgIERpcmVjdG9yeUVudHJ5KCkgOiBuZXh0KF9fbnVs bCApLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUoX19udWxsICksCiAgICAgICAgICAgICAg ICAgICAgICAgbGVuZ3RoKDApLAogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeShfX251 bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICBtdGltZV8oMCkKICAgIHsKICAgICAgICBpbWFn ZSA9IHRoaXM7CiAgICB9CgogICAgdmlydHVhbCB+RGlyZWN0b3J5RW50cnkoKQogICAgewogICAg ICAgIGRlbGV0ZSBbXSBuYW1lOwogICAgfQoKCiAgICBpbmxpbmUgdm9pZCBJbml0aWFsaXplKERp cmVjdG9yeVN5bWJvbCAqZGlyZWN0b3J5XywgY2hhciAqbmFtZV8sIGludCBsZW5ndGhfKQogICAg ewogICAgICAgIGRpcmVjdG9yeSA9IGRpcmVjdG9yeV87CiAgICAgICAgbGVuZ3RoID0gbGVuZ3Ro XzsKICAgICAgICBuYW1lID0gbmV3IGNoYXJbbGVuZ3RoICsgMV07CiAgICAgICAgbWVtbW92ZShu YW1lLCBuYW1lXywgbGVuZ3RoICogc2l6ZW9mKGNoYXIpKTsKICAgICAgICBuYW1lW2xlbmd0aF0g PSBVX05VTEw7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBJbml0aWFs aXplKERpcmVjdG9yeUVudHJ5ICplbnRyeSwgY2hhciAqbmFtZV8sIGludCBsZW5ndGhfKQogICAg ewogICAgICAgIEluaXRpYWxpemUoZW50cnkgLT4gZGlyZWN0b3J5LCBuYW1lXywgbGVuZ3RoXyk7 CiAgICB9CgogICAgdGltZV90IE10aW1lKCk7CgogICAgYm9vbCBJc0R1bW15KCkgeyByZXR1cm4g dGhpcyAhPSBpbWFnZTsgfQoKICAgICAKICAgICAKICAgICAKICAgIHZpcnR1YWwgRGlyZWN0b3J5 RW50cnkgKkltYWdlKCkgeyByZXR1cm4gdGhpczsgfQoKcHJvdGVjdGVkOgogICAgRGlyZWN0b3J5 U3ltYm9sICpkaXJlY3Rvcnk7CiAgICBEaXJlY3RvcnlFbnRyeSAqaW1hZ2U7CiAgICB0aW1lX3Qg bXRpbWVfOwp9OwoKCiMgMTg3ICIuLi8uLi9qaWtlcy9zcmMvbG9va3VwLmgiCgoKCmNsYXNzIFN5 c3RlbVRhYmxlCnsKICAgIGVudW0KICAgIHsKICAgICAgICBERUZBVUxUX0hBU0hfU0laRSA9IDEz LAogICAgICAgIE1BWF9IQVNIX1NJWkUgPSAxMDIxCiAgICB9OwoKcHVibGljOgoKICAgIFN5c3Rl bVRhYmxlKGludCA9IERFRkFVTFRfSEFTSF9TSVpFKTsKICAgIHZpcnR1YWwgflN5c3RlbVRhYmxl KCk7CgogICAgRGlyZWN0b3J5U3ltYm9sICpGaW5kRGlyZWN0b3J5U3ltYm9sKGRldl90LCBpbm9f dCk7CiAgICB2b2lkIEluc2VydERpcmVjdG9yeVN5bWJvbChkZXZfdCwgaW5vX3QsIERpcmVjdG9y eVN5bWJvbCAqKTsKCnByaXZhdGU6CiAgICBjbGFzcyBFbGVtZW50CiAgICB7CiAgICBwdWJsaWM6 CiAgICAgICAgRWxlbWVudChkZXZfdCBkZXZpY2VfLCBpbm9fdCBpbm9kZV8sIERpcmVjdG9yeVN5 bWJvbCAqZGlyZWN0b3J5X3N5bWJvbF8pIDogZGV2aWNlKGRldmljZV8pLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGlub2RlKGlub2RlXyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGly ZWN0b3J5X3N5bWJvbChkaXJlY3Rvcnlfc3ltYm9sXykKICAgICAgICB7fQoKICAgICAgICBFbGVt ZW50ICpuZXh0OwogICAgICAgIGRldl90IGRldmljZTsKICAgICAgICBpbm9fdCBpbm9kZTsKICAg ICAgICBEaXJlY3RvcnlTeW1ib2wgKmRpcmVjdG9yeV9zeW1ib2w7CiAgICB9OwoKICAgIFR1cGxl PEVsZW1lbnQgKj4gZGlyZWN0b3JpZXM7CgogICAgRWxlbWVudCAqKmJhc2U7CiAgICBpbnQgaGFz aF9zaXplOwoKICAgIHN0YXRpYyBpbnQgcHJpbWVzW107CiAgICBpbnQgcHJpbWVfaW5kZXg7Cgog ICAgaW50IGhhc2goZGV2X3QgZGV2aWNlLCBpbm9fdCBpbm9kZSkgeyByZXR1cm4gKGRldmljZSAr IGlub2RlKSAlIGhhc2hfc2l6ZTsgfQoKICAgIHZvaWQgUmVoYXNoKCk7Cn07CgoKY2xhc3MgRGly ZWN0b3J5VGFibGUKewpwdWJsaWM6CiAgICBUdXBsZTxEaXJlY3RvcnlFbnRyeSAqPiBlbnRyeV9w b29sOwoKICAgIERpcmVjdG9yeVRhYmxlKGludCBlc3RpbWF0ZSA9IDEwMjQpOwogICAgfkRpcmVj dG9yeVRhYmxlKCk7CgogICAgRGlyZWN0b3J5RW50cnkgKkZpbmRFbnRyeShjaGFyICosIGludCk7 CiAgICBEaXJlY3RvcnlFbnRyeSAqSW5zZXJ0RW50cnkoRGlyZWN0b3J5U3ltYm9sICosIGNoYXIg KiwgaW50KTsKCgoKCgoKCgoKcHJpdmF0ZToKICAgIGVudW0KICAgIHsKICAgICAgICBERUZBVUxU X0hBU0hfU0laRSA9IDEwMjEsCiAgICAgICAgTUFYX0hBU0hfU0laRSA9IDgxOTEKICAgIH07Cgog ICAgRGlyZWN0b3J5RW50cnkgKipiYXNlOwogICAgaW50IGhhc2hfc2l6ZTsKCiAgICBzdGF0aWMg aW50IHByaW1lc1tdOwogICAgaW50IHByaW1lX2luZGV4OwoKICAgIGlubGluZSBzdGF0aWMgdW5z aWduZWQgSGFzaChjb25zdCBjaGFyICpoZWFkLCBpbnQgbGVuKSB7IHJldHVybiBIYXNoOjpGdW5j dGlvbihoZWFkLCBsZW4pOyB9CgogICAgdm9pZCBSZWhhc2goKTsKfTsKCgpjbGFzcyBTeW1ib2wK ewpwdWJsaWM6CiAgICBTeW1ib2wgICpuZXh0OwoKICAgIGVudW0gU3ltYm9sS2luZAogICAgewog ICAgICAgICBOT05FLAogICAgICAgICBOQU1FLAogICAgICAgICBQQUNLQUdFLAogICAgICAgICBU WVBFLCAgCiAgICAgICAgIE1FVEhPRCwKICAgICAgICAgQkxPQ0ssCiAgICAgICAgIFZBUklBQkxF LAogICAgICAgICBMQUJFTCwKICAgICAgICAgTElURVJBTCwKCiAgICAgICAgIFBBVEgsCiAgICAg ICAgIF9ESVJFQ1RPUlksCiAgICAgICAgIF9GSUxFLAoKICAgICAgICAgX251bV9raW5kcwogICAg fTsKCiAgICBTeW1ib2xLaW5kIEtpbmQoKSB7IHJldHVybiBfa2luZDsgfQogICAgdmlydHVhbCB3 Y2hhcl90ICpOYW1lKCkgICB7IHJldHVybiAod2NoYXJfdCAqKSBfX251bGwgOyB9CiAgICB2aXJ0 dWFsIHNpemVfdCBOYW1lTGVuZ3RoKCkgeyByZXR1cm4gMDsgfQogICAgdmlydHVhbCBOYW1lU3lt Ym9sICpJZGVudGl0eSgpIHsgcmV0dXJuIChOYW1lU3ltYm9sICopIF9fbnVsbCA7IH0KCiAgICAg CiAgICAgCiAgICAgCiAgICAgCiAgICBQYWNrYWdlU3ltYm9sICpQYWNrYWdlQ2FzdCgpOwogICAg VHlwZVN5bWJvbCAqVHlwZUNhc3QoKTsKICAgIE1ldGhvZFN5bWJvbCAqTWV0aG9kQ2FzdCgpOwog ICAgQmxvY2tTeW1ib2wgKkJsb2NrQ2FzdCgpOwogICAgVmFyaWFibGVTeW1ib2wgKlZhcmlhYmxl Q2FzdCgpOwogICAgTGFiZWxTeW1ib2wgKkxhYmVsQ2FzdCgpOwogICAgTGl0ZXJhbFN5bWJvbCAq TGl0ZXJhbENhc3QoKTsKICAgIE5hbWVTeW1ib2wgKk5hbWVDYXN0KCk7CgogICAgUGF0aFN5bWJv bCAqUGF0aENhc3QoKTsKICAgIERpcmVjdG9yeVN5bWJvbCAqRGlyZWN0b3J5Q2FzdCgpOwogICAg RmlsZVN5bWJvbCAqRmlsZUNhc3QoKTsKCiAgICB2aXJ0dWFsIH5TeW1ib2woKSB7fQoKcHJvdGVj dGVkOgogICAgU3ltYm9sS2luZCBfa2luZDsKfTsKCgpjbGFzcyBMaXRlcmFsVmFsdWUKewpwdWJs aWM6CiAgICBMaXRlcmFsVmFsdWUgKm5leHQ7CiAgICBpbnQgaW5kZXg7CgogICAgdmlydHVhbCB+ TGl0ZXJhbFZhbHVlKCkge30KfTsKCgpjbGFzcyBJbnRMaXRlcmFsVmFsdWUgOiBwdWJsaWMgTGl0 ZXJhbFZhbHVlCnsKcHVibGljOgogICAgaW50IHZhbHVlOwoKICAgIHZpcnR1YWwgfkludExpdGVy YWxWYWx1ZSgpIHt9CgogICAgdm9pZCBJbml0aWFsaXplKGludCB2YWx1ZV8sIGludCBpbmRleF8p CiAgICB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZV87CiAgICAgICAgaW5kZXggPSBpbmRleF87CiAg ICB9Cn07CgoKY2xhc3MgTG9uZ0xpdGVyYWxWYWx1ZSA6IHB1YmxpYyBMaXRlcmFsVmFsdWUKewpw dWJsaWM6CiAgICBMb25nSW50IHZhbHVlOwoKICAgIHZpcnR1YWwgfkxvbmdMaXRlcmFsVmFsdWUo KSB7fQoKICAgIHZvaWQgSW5pdGlhbGl6ZShMb25nSW50IHZhbHVlXywgaW50IGluZGV4XykKICAg IHsKICAgICAgICB2YWx1ZSA9IHZhbHVlXzsKICAgICAgICBpbmRleCA9IGluZGV4XzsKICAgIH0K fTsKCgpjbGFzcyBGbG9hdExpdGVyYWxWYWx1ZSA6IHB1YmxpYyBMaXRlcmFsVmFsdWUKewpwdWJs aWM6CiAgICBJRUVFZmxvYXQgdmFsdWU7CgogICAgdmlydHVhbCB+RmxvYXRMaXRlcmFsVmFsdWUo KSB7fQoKICAgIHZvaWQgSW5pdGlhbGl6ZShJRUVFZmxvYXQgdmFsdWVfLCBpbnQgaW5kZXhfKQog ICAgewogICAgICAgIHZhbHVlID0gdmFsdWVfOwogICAgICAgIGluZGV4ID0gaW5kZXhfOwogICAg fQp9OwoKCmNsYXNzIERvdWJsZUxpdGVyYWxWYWx1ZSA6IHB1YmxpYyBMaXRlcmFsVmFsdWUKewpw dWJsaWM6CiAgICBJRUVFZG91YmxlIHZhbHVlOwoKICAgIHZpcnR1YWwgfkRvdWJsZUxpdGVyYWxW YWx1ZSgpIHt9CgogICAgdm9pZCBJbml0aWFsaXplKElFRUVkb3VibGUgdmFsdWVfLCBpbnQgaW5k ZXhfKQogICAgewogICAgICAgIHZhbHVlID0gdmFsdWVfOwogICAgICAgIGluZGV4ID0gaW5kZXhf OwogICAgfQp9OwoKCmNsYXNzIFV0ZjhMaXRlcmFsVmFsdWUgOiBwdWJsaWMgTGl0ZXJhbFZhbHVl CnsKcHVibGljOgogICAgY2hhciAqdmFsdWU7CiAgICBpbnQgIGxlbmd0aDsKCiAgICBVdGY4TGl0 ZXJhbFZhbHVlKCkgOiB2YWx1ZShfX251bGwgKQogICAge30KCiAgICB2aXJ0dWFsIH5VdGY4TGl0 ZXJhbFZhbHVlKCkKICAgIHsKICAgICAgICBkZWxldGUgW10gdmFsdWU7CiAgICB9CgogICAgdm9p ZCBJbml0aWFsaXplKGNvbnN0IGNoYXIgKnZhbHVlXywgaW50IGxlbmd0aF8sIHVuc2lnbmVkIGhh c2hfYWRkcmVzc18sIGludCBpbmRleF8pCiAgICB7CiAgICAgICAgbGVuZ3RoID0gbGVuZ3RoXzsK ICAgICAgICB2YWx1ZSA9IG5ldyBjaGFyW2xlbmd0aCArIDFdOwogICAgICAgIG1lbW1vdmUodmFs dWUsIHZhbHVlXywgbGVuZ3RoICogc2l6ZW9mKGNoYXIpKTsKICAgICAgICB2YWx1ZVtsZW5ndGhd ID0gVV9OVUxMOwoKICAgICAgICBoYXNoX2FkZHJlc3MgPSBoYXNoX2FkZHJlc3NfOwogICAgICAg IGluZGV4ID0gaW5kZXhfOwogICAgfQoKcHJpdmF0ZToKCiAgICBmcmllbmQgY2xhc3MgVXRmOExp dGVyYWxUYWJsZTsKCiAgICB1bnNpZ25lZCBoYXNoX2FkZHJlc3M7Cn07CgoKY2xhc3MgTmFtZVN5 bWJvbCA6IHB1YmxpYyBTeW1ib2wKewpwdWJsaWM6CiAgICBpbnQgaW5kZXg7CiAgICBVdGY4TGl0 ZXJhbFZhbHVlICpVdGY4X2xpdGVyYWw7CgogICAgdmlydHVhbCB3Y2hhcl90ICpOYW1lKCkgICB7 IHJldHVybiBuYW1lXzsgfQogICAgdmlydHVhbCBzaXplX3QgTmFtZUxlbmd0aCgpIHsgcmV0dXJu IGxlbmd0aDsgfQogICAgdmlydHVhbCBOYW1lU3ltYm9sICpJZGVudGl0eSgpIHsgcmV0dXJuIHRo aXM7IH0KICAgIGNoYXIgKlV0ZjhOYW1lKCkgeyByZXR1cm4gKGNoYXIgKikgKFV0ZjhfbGl0ZXJh bCA/IFV0ZjhfbGl0ZXJhbCAtPiB2YWx1ZSA6IF9fbnVsbCApOyB9CiAgICBpbnQgVXRmOE5hbWVM ZW5ndGgoKSB7IHJldHVybiAoVXRmOF9saXRlcmFsID8gVXRmOF9saXRlcmFsIC0+IGxlbmd0aCA6 IDApOyB9CgogICAgTmFtZVN5bWJvbCgpIDogbmFtZV8oX19udWxsICkKICAgIHt9CgogICAgdmly dHVhbCB+TmFtZVN5bWJvbCgpCiAgICB7CiAgICAgICAgZGVsZXRlIFtdIG5hbWVfOwogICAgfQoK ICAgIGlubGluZSB2b2lkIEluaXRpYWxpemUod2NoYXJfdCAqc3RyLCBpbnQgbGVuZ3RoXywgdW5z aWduZWQgaGFzaF9hZGRyZXNzXywgaW50IGluZGV4XykKICAgIHsKICAgICAgICBTeW1ib2w6Ol9r aW5kID0gTkFNRTsKCiAgICAgICAgaGFzaF9hZGRyZXNzID0gaGFzaF9hZGRyZXNzXzsKICAgICAg ICBpbmRleCA9IGluZGV4XzsKCiAgICAgICAgbGVuZ3RoID0gbGVuZ3RoXzsKICAgICAgICBuYW1l XyA9IG5ldyB3Y2hhcl90W2xlbmd0aCArIDFdOwogICAgICAgIG1lbW1vdmUobmFtZV8sIHN0ciwg bGVuZ3RoICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICAgICBuYW1lX1tsZW5ndGhdID0gVV9OVUxM OwoKICAgICAgICBVdGY4X2xpdGVyYWwgPSBfX251bGwgOwoKICAgICAgICByZXR1cm47CiAgICB9 Cgpwcml2YXRlOgoKICAgIGZyaWVuZCBjbGFzcyBOYW1lTG9va3VwVGFibGU7CgogICAgd2NoYXJf dCAqbmFtZV87CiAgICBpbnQgbGVuZ3RoOwogICAgdW5zaWduZWQgaGFzaF9hZGRyZXNzOwp9OwoK CmNsYXNzIE5hbWVMb29rdXBUYWJsZQp7CnB1YmxpYzoKICAgIFR1cGxlPE5hbWVTeW1ib2wgKj4g c3ltYm9sX3Bvb2w7CgogICAgTmFtZUxvb2t1cFRhYmxlKGludCBlc3RpbWF0ZSA9IDE2Mzg0KTsK ICAgIH5OYW1lTG9va3VwVGFibGUoKTsKCiAgICBOYW1lU3ltYm9sICpGaW5kT3JJbnNlcnROYW1l KHdjaGFyX3QgKiwgc2l6ZV90KTsKCnByaXZhdGU6CiAgICBlbnVtCiAgICB7CiAgICAgICAgREVG QVVMVF9IQVNIX1NJWkUgPSA0MDkzLAogICAgICAgIE1BWF9IQVNIX1NJWkUgPSAzMjc3MQogICAg fTsKCiAgICBOYW1lU3ltYm9sICoqYmFzZTsKICAgIGludCBoYXNoX3NpemU7CgogICAgc3RhdGlj IGludCBwcmltZXNbXTsKICAgIGludCBwcmltZV9pbmRleDsKCiAgICBpbmxpbmUgc3RhdGljIHVu c2lnbmVkIEhhc2god2NoYXJfdCAqaGVhZCwgaW50IGxlbikgeyByZXR1cm4gSGFzaDo6RnVuY3Rp b24oaGVhZCwgbGVuKTsgfQoKICAgIHZvaWQgUmVoYXNoKCk7Cn07CgoKY2xhc3MgVHlwZUxvb2t1 cFRhYmxlCnsKcHVibGljOgogICAgVHlwZUxvb2t1cFRhYmxlKGludCBlc3RpbWF0ZSA9IDE2Mzg0 KTsKICAgIH5UeXBlTG9va3VwVGFibGUoKTsKCiAgICBUeXBlU3ltYm9sICpGaW5kVHlwZShjb25z dCBjaGFyICosIGludCk7CiAgICB2b2lkIEluc2VydFR5cGUoVHlwZVN5bWJvbCAqKTsKICAgIHZv aWQgU2V0RW1wdHkoKTsKCnByaXZhdGU6CiAgICBUdXBsZTxUeXBlU3ltYm9sICo+IHN5bWJvbF9w b29sOwoKICAgIGVudW0KICAgIHsKICAgICAgICBERUZBVUxUX0hBU0hfU0laRSA9IDQwOTMsCiAg ICAgICAgTUFYX0hBU0hfU0laRSA9IDMyNzcxCiAgICB9OwoKICAgIFR5cGVTeW1ib2wgKipiYXNl OwogICAgaW50IGhhc2hfc2l6ZTsKCiAgICBzdGF0aWMgaW50IHByaW1lc1tdOwogICAgaW50IHBy aW1lX2luZGV4OwoKICAgIGlubGluZSBzdGF0aWMgdW5zaWduZWQgSGFzaChjb25zdCBjaGFyICpo ZWFkLCBpbnQgbGVuKSB7IHJldHVybiBIYXNoOjpGdW5jdGlvbihoZWFkLCBsZW4pOyB9CgogICAg dm9pZCBSZWhhc2goKTsKfTsKCgpjbGFzcyBMaXRlcmFsU3ltYm9sIDogcHVibGljIFN5bWJvbAp7 CnB1YmxpYzoKICAgIExpdGVyYWxWYWx1ZSAqdmFsdWU7CgogICAgdmlydHVhbCB3Y2hhcl90ICpO YW1lKCkgICB7IHJldHVybiBuYW1lXzsgfQogICAgdmlydHVhbCBzaXplX3QgTmFtZUxlbmd0aCgp IHsgcmV0dXJuIGxlbmd0aDsgfQogICAgdmlydHVhbCBOYW1lU3ltYm9sICpJZGVudGl0eSgpIHsg cmV0dXJuIChOYW1lU3ltYm9sICopIF9fbnVsbCA7IH0KCiAgICBMaXRlcmFsU3ltYm9sKCkgOiBu YW1lXyhfX251bGwgKQogICAge30KCiAgICB2aXJ0dWFsIH5MaXRlcmFsU3ltYm9sKCkKICAgIHsK ICAgICAgICBkZWxldGUgW10gbmFtZV87CiAgICB9CgogICAgdm9pZCBJbml0aWFsaXplKHdjaGFy X3QgKnN0ciwgdW5zaWduZWQgaGFzaF9hZGRyZXNzXywgaW50IGxlbmd0aF8pCiAgICB7CiAgICAg ICAgU3ltYm9sOjpfa2luZCA9IExJVEVSQUw7CgogICAgICAgIGhhc2hfYWRkcmVzcyA9IGhhc2hf YWRkcmVzc187CgogICAgICAgIGxlbmd0aCA9IGxlbmd0aF87CiAgICAgICAgbmFtZV8gPSBuZXcg d2NoYXJfdFtsZW5ndGggKyAxXTsKICAgICAgICBtZW1tb3ZlKG5hbWVfLCBzdHIsIGxlbmd0aCAq IHNpemVvZih3Y2hhcl90KSk7CiAgICAgICAgbmFtZV9bbGVuZ3RoXSA9IFVfTlVMTDsKCiAgICAg ICAgdmFsdWUgPSBfX251bGwgOwogICAgfQoKcHJpdmF0ZToKCiAgICBmcmllbmQgY2xhc3MgTGl0 ZXJhbExvb2t1cFRhYmxlOwoKICAgIHdjaGFyX3QgKm5hbWVfOwogICAgaW50IGxlbmd0aDsKICAg IHVuc2lnbmVkIGhhc2hfYWRkcmVzczsKfTsKCgpjbGFzcyBMaXRlcmFsTG9va3VwVGFibGUKewpw dWJsaWM6CiAgICBUdXBsZTxMaXRlcmFsU3ltYm9sICo+IHN5bWJvbF9wb29sOwoKICAgIExpdGVy YWxMb29rdXBUYWJsZSgpOwogICAgfkxpdGVyYWxMb29rdXBUYWJsZSgpOwoKICAgIExpdGVyYWxT eW1ib2wgKkZpbmRPckluc2VydExpdGVyYWwod2NoYXJfdCAqLCBzaXplX3QpOwoKcHJpdmF0ZToK ICAgIGVudW0KICAgIHsKICAgICAgICBERUZBVUxUX0hBU0hfU0laRSA9IDEwMjEsCiAgICAgICAg TUFYX0hBU0hfU0laRSA9IDgxOTEKICAgIH07CgogICAgTGl0ZXJhbFN5bWJvbCAqKmJhc2U7CiAg ICBpbnQgaGFzaF9zaXplOwoKICAgIHN0YXRpYyBpbnQgcHJpbWVzW107CiAgICBpbnQgcHJpbWVf aW5kZXg7CgogICAgaW5saW5lIHN0YXRpYyB1bnNpZ25lZCBIYXNoKHdjaGFyX3QgKmhlYWQsIGlu dCBsZW4pIHsgcmV0dXJuIEhhc2g6OkZ1bmN0aW9uKGhlYWQsIGxlbik7IH0KCiAgICB2b2lkIFJl aGFzaCgpOwp9OwoKCmNsYXNzIEludExpdGVyYWxUYWJsZQp7CnB1YmxpYzoKICAgIFR1cGxlPElu dExpdGVyYWxWYWx1ZSAqPiBzeW1ib2xfcG9vbDsKCiAgICBJbnRMaXRlcmFsVGFibGUoTGl0ZXJh bFZhbHVlICopOwogICAgfkludExpdGVyYWxUYWJsZSgpOwoKICAgIExpdGVyYWxWYWx1ZSAqRmlu ZE9ySW5zZXJ0TnVsbCgpCiAgICB7CiAgICAgICAgcmV0dXJuIEZpbmRPckluc2VydCgwKTsKICAg IH0KCiAgICBMaXRlcmFsVmFsdWUgKkZpbmRPckluc2VydENoYXIoTGl0ZXJhbFN5bWJvbCAqKTsK ICAgIExpdGVyYWxWYWx1ZSAqRmluZE9ySW5zZXJ0SW50KExpdGVyYWxTeW1ib2wgKik7CiAgICBM aXRlcmFsVmFsdWUgKkZpbmRPckluc2VydEhleEludChMaXRlcmFsU3ltYm9sICopOwogICAgTGl0 ZXJhbFZhbHVlICpGaW5kT3JJbnNlcnRPY3RhbEludChMaXRlcmFsU3ltYm9sICopOwogICAgTGl0 ZXJhbFZhbHVlICpGaW5kT3JJbnNlcnROZWdhdGl2ZUludChMaXRlcmFsU3ltYm9sICopOwoKICAg IEludExpdGVyYWxWYWx1ZSAqRmluZE9ySW5zZXJ0KGludCk7CiAgICBJbnRMaXRlcmFsVmFsdWUg KkZpbmQoaW50KTsKCiMgNjM2ICIuLi8uLi9qaWtlcy9zcmMvbG9va3VwLmgiCgoKcHJpdmF0ZToK ICAgIGVudW0KICAgIHsKICAgICAgICBERUZBVUxUX0hBU0hfU0laRSA9IDQwOTMsCiAgICAgICAg TUFYX0hBU0hfU0laRSA9IDMyNzcxCiAgICB9OwoKICAgIEludExpdGVyYWxWYWx1ZSAqKmJhc2U7 CiAgICBpbnQgaGFzaF9zaXplOwoKICAgIHN0YXRpYyBpbnQgcHJpbWVzW107CiAgICBpbnQgcHJp bWVfaW5kZXg7CgogICAgc3RhdGljIGludCBpbnQzMl9saW1pdDsKCiAgICBMaXRlcmFsVmFsdWUg KmJhZF92YWx1ZTsKCiAgICB2b2lkIFJlaGFzaCgpOwp9OwoKCmNsYXNzIExvbmdMaXRlcmFsVGFi bGUKewpwdWJsaWM6CiAgICBUdXBsZTxMb25nTGl0ZXJhbFZhbHVlICo+IHN5bWJvbF9wb29sOwoK ICAgIExvbmdMaXRlcmFsVGFibGUoTGl0ZXJhbFZhbHVlICopOwogICAgfkxvbmdMaXRlcmFsVGFi bGUoKTsKCiAgICBMaXRlcmFsVmFsdWUgKkZpbmRPckluc2VydExvbmcoTGl0ZXJhbFN5bWJvbCAq KTsKICAgIExpdGVyYWxWYWx1ZSAqRmluZE9ySW5zZXJ0SGV4TG9uZyhMaXRlcmFsU3ltYm9sICop OwogICAgTGl0ZXJhbFZhbHVlICpGaW5kT3JJbnNlcnRPY3RhbExvbmcoTGl0ZXJhbFN5bWJvbCAq KTsKICAgIExpdGVyYWxWYWx1ZSAqRmluZE9ySW5zZXJ0TmVnYXRpdmVMb25nKExpdGVyYWxTeW1i b2wgKik7CgogICAgTG9uZ0xpdGVyYWxWYWx1ZSAqRmluZE9ySW5zZXJ0KExvbmdJbnQpOwoKCgoK CgoKCgoKcHJpdmF0ZToKCiAgICBlbnVtCiAgICB7CiAgICAgICAgREVGQVVMVF9IQVNIX1NJWkUg PSAxMDIxLAogICAgICAgIE1BWF9IQVNIX1NJWkUgPSA4MTkxCiAgICB9OwoKICAgIExvbmdMaXRl cmFsVmFsdWUgKipiYXNlOwogICAgaW50IGhhc2hfc2l6ZTsKCiAgICBzdGF0aWMgaW50IHByaW1l c1tdOwogICAgaW50IHByaW1lX2luZGV4OwoKICAgIHN0YXRpYyBMb25nSW50IGludDY0X2xpbWl0 OwoKICAgIExpdGVyYWxWYWx1ZSAqYmFkX3ZhbHVlOwoKICAgIGlubGluZSBzdGF0aWMgdW5zaWdu ZWQgSGFzaChMb25nSW50IHZhbHVlKSB7IHJldHVybiBIYXNoOjpGdW5jdGlvbih2YWx1ZSk7IH0K CiAgICB2b2lkIFJlaGFzaCgpOwp9OwoKCmNsYXNzIEZsb2F0TGl0ZXJhbFRhYmxlCnsKcHVibGlj OgogICAgVHVwbGU8RmxvYXRMaXRlcmFsVmFsdWUgKj4gc3ltYm9sX3Bvb2w7CgogICAgRmxvYXRM aXRlcmFsVGFibGUoTGl0ZXJhbFZhbHVlICopOwogICAgfkZsb2F0TGl0ZXJhbFRhYmxlKCk7Cgog ICAgTGl0ZXJhbFZhbHVlICpGaW5kT3JJbnNlcnRGbG9hdChMaXRlcmFsU3ltYm9sICopOwoKICAg IEZsb2F0TGl0ZXJhbFZhbHVlICpGaW5kT3JJbnNlcnQoSUVFRWZsb2F0KTsKCgoKCgoKCgoKCnBy aXZhdGU6CgogICAgZW51bQogICAgewogICAgICAgIERFRkFVTFRfSEFTSF9TSVpFID0gMTAyMSwK ICAgICAgICBNQVhfSEFTSF9TSVpFID0gODE5MQogICAgfTsKCiAgICBGbG9hdExpdGVyYWxWYWx1 ZSAqKmJhc2U7CiAgICBpbnQgaGFzaF9zaXplOwoKICAgIHN0YXRpYyBpbnQgcHJpbWVzW107CiAg ICBpbnQgcHJpbWVfaW5kZXg7CgogICAgTGl0ZXJhbFZhbHVlICpiYWRfdmFsdWU7CgogICAgaW5s aW5lIHN0YXRpYyB1bnNpZ25lZCBIYXNoKElFRUVmbG9hdCB2YWx1ZSkgeyByZXR1cm4gSGFzaDo6 RnVuY3Rpb24odmFsdWUpOyB9CgogICAgdm9pZCBSZWhhc2goKTsKfTsKCgpjbGFzcyBEb3VibGVM aXRlcmFsVGFibGUKewpwdWJsaWM6CiAgICBUdXBsZTxEb3VibGVMaXRlcmFsVmFsdWUgKj4gc3lt Ym9sX3Bvb2w7CgogICAgRG91YmxlTGl0ZXJhbFRhYmxlKExpdGVyYWxWYWx1ZSAqKTsKICAgIH5E b3VibGVMaXRlcmFsVGFibGUoKTsKCiAgICBMaXRlcmFsVmFsdWUgKkZpbmRPckluc2VydERvdWJs ZShMaXRlcmFsU3ltYm9sICopOwoKICAgIERvdWJsZUxpdGVyYWxWYWx1ZSAqRmluZE9ySW5zZXJ0 KElFRUVkb3VibGUpOwoKCgoKCgoKCgoKcHJpdmF0ZToKCiAgICBlbnVtCiAgICB7CiAgICAgICAg REVGQVVMVF9IQVNIX1NJWkUgPSAxMDIxLAogICAgICAgIE1BWF9IQVNIX1NJWkUgPSA4MTkxCiAg ICB9OwoKICAgIERvdWJsZUxpdGVyYWxWYWx1ZSAqKmJhc2U7CiAgICBpbnQgaGFzaF9zaXplOwoK ICAgIHN0YXRpYyBpbnQgcHJpbWVzW107CiAgICBpbnQgcHJpbWVfaW5kZXg7CgogICAgTGl0ZXJh bFZhbHVlICpiYWRfdmFsdWU7CgogICAgaW5saW5lIHN0YXRpYyB1bnNpZ25lZCBIYXNoKElFRUVk b3VibGUgdmFsdWUpIHsgcmV0dXJuIEhhc2g6OkZ1bmN0aW9uKHZhbHVlKTsgfQoKICAgIHZvaWQg UmVoYXNoKCk7Cn07CgoKY2xhc3MgVXRmOExpdGVyYWxUYWJsZQp7CnB1YmxpYzoKICAgIFR1cGxl PFV0ZjhMaXRlcmFsVmFsdWUgKj4gc3ltYm9sX3Bvb2w7CgogICAgVXRmOExpdGVyYWxUYWJsZShM aXRlcmFsVmFsdWUgKik7CiAgICB+VXRmOExpdGVyYWxUYWJsZSgpOwoKICAgIExpdGVyYWxWYWx1 ZSAqRmluZE9ySW5zZXJ0U3RyaW5nKExpdGVyYWxTeW1ib2wgKik7CgogICAgVXRmOExpdGVyYWxW YWx1ZSAqRmluZE9ySW5zZXJ0KGNvbnN0IGNoYXIgKiwgaW50KTsKICAgIFV0ZjhMaXRlcmFsVmFs dWUgKkZpbmRPckluc2VydCh3Y2hhcl90KTsKCiAgICB2b2lkIENoZWNrU3RyaW5nQ29uc3RhbnQo QXN0RXhwcmVzc2lvbiAqZXhwcik7Cgpwcml2YXRlOgoKICAgIFR1cGxlPFV0ZjhMaXRlcmFsVmFs dWUgKj4gKnV0ZjhfbGl0ZXJhbHM7CiAgICB2b2lkIEV2YWx1YXRlQ29uc3RhbnQoQXN0RXhwcmVz c2lvbiAqLCBpbnQsIGludCk7CiAgICBib29sIElzQ29uc3RhbnQoQXN0RXhwcmVzc2lvbiAqLCBU eXBlU3ltYm9sICopOwoKICAgIGVudW0KICAgIHsKICAgICAgICBERUZBVUxUX0hBU0hfU0laRSA9 IDQwOTMsCiAgICAgICAgTUFYX0hBU0hfU0laRSA9IDMyNzcxCiAgICB9OwoKICAgIFV0ZjhMaXRl cmFsVmFsdWUgKipiYXNlOwogICAgaW50IGhhc2hfc2l6ZTsKCiAgICBzdGF0aWMgaW50IHByaW1l c1tdOwogICAgaW50IHByaW1lX2luZGV4OwoKICAgIExpdGVyYWxWYWx1ZSAqYmFkX3ZhbHVlOwoK ICAgIGlubGluZSBzdGF0aWMgdW5zaWduZWQgSGFzaChjb25zdCBjaGFyICpoZWFkLCBpbnQgbGVu KSB7IHJldHVybiBIYXNoOjpGdW5jdGlvbihoZWFkLCBsZW4pOyB9CgogICAgdm9pZCBSZWhhc2go KTsKfTsKCgoKCgoKIyAxOCAiLi4vLi4vamlrZXMvc3JjL3N0cmVhbS5oIiAyCgoKCiAKCgoKCgoK CgoKCiMgMSAiL3Vzci9pbmNsdWRlL2ljb252LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgojIDEgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0 ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxp bnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91 c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAz CgoKIAoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCiAKCiAKCgojIDEyNiAiL3Vzci9s aWIvZ2NjLWxpYi9pNDg2LXN1c2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgog CgoKCgogCgogCgoKIyAxODggIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUu My9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKIAoKCgoKIAoKCiMgMjY5ICIvdXNyL2xpYi9nY2Mt bGliL2k0ODYtc3VzZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKCgoKCgoK CgoKCgoKIAoKIAoKIyAzMTcgIi91c3IvbGliL2djYy1saWIvaTQ4Ni1zdXNlLWxpbnV4LzIuOTUu My9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoKCgogCgoKCgoKCgojIDI0ICIv dXNyL2luY2x1ZGUvaWNvbnYuaCIgMiAzCgoKCmV4dGVybiAiQyIgeyAKCiAKdHlwZWRlZiB2b2lk ICppY29udl90OwoKCiAKCmV4dGVybiBpY29udl90IGljb252X29wZW4gKF9fY29uc3QgY2hhciAq X190b2NvZGUsIF9fY29uc3QgY2hhciAqX19mcm9tY29kZSkKICAgICB0aHJvdyAoKSA7CgogCgoK ZXh0ZXJuIHNpemVfdCBpY29udiAoaWNvbnZfdCBfX2NkLCBjaGFyICoqX19yZXN0cmljdCBfX2lu YnVmLAoJCSAgICAgc2l6ZV90ICpfX3Jlc3RyaWN0IF9faW5ieXRlc2xlZnQsCgkJICAgICBjaGFy ICoqX19yZXN0cmljdCBfX291dGJ1ZiwKCQkgICAgIHNpemVfdCAqX19yZXN0cmljdCBfX291dGJ5 dGVzbGVmdCk7CgogCmV4dGVybiBpbnQgaWNvbnZfY2xvc2UgKGljb252X3QgX19jZCkgdGhyb3cg KCkgOwoKfSAKCgojIDMyICIuLi8uLi9qaWtlcy9zcmMvc3RyZWFtLmgiIDIKCgoKCgoKCmNsYXNz IENvbnRyb2wgICAgOwpjbGFzcyBJbnB1dF9pbmZvIDsKY2xhc3MgU2Nhbm5lciAgICA7CmNsYXNz IFN5bWJvbCAgICAgOwpjbGFzcyBGaWxlU3ltYm9sIDsKY2xhc3MgWmlwRmlsZSAgICA7CmNsYXNz IExleFN0cmVhbSAgOwoKY2xhc3MgU3RyZWFtRXJyb3IgOiBwdWJsaWMgSmlrZXNFcnJvcgp7CiAg ICBmcmllbmQgY2xhc3MgTGV4U3RyZWFtOwoKIHB1YmxpYzoKCiAgICBTdHJlYW1FcnJvcigpOwog ICAgCiAgICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QgKmdldEVycm9yTWVzc2FnZSgpOwogICAgdmly dHVhbCBjb25zdCB3Y2hhcl90ICpnZXRFcnJvclJlcG9ydCgpOwogICAgCiAgICB2aXJ0dWFsIEpp a2VzRXJyb3JTZXZlcml0eSBnZXRTZXZlcml0eSgpOwogICAgdmlydHVhbCBjb25zdCBjaGFyICpn ZXRGaWxlTmFtZSgpOwogICAgCiAgICB2aXJ0dWFsIGludCBnZXRMZWZ0TGluZU5vICAgICAgKCk7 CiAgICB2aXJ0dWFsIGludCBnZXRMZWZ0Q29sdW1uTm8gICAgKCk7CiAgICB2aXJ0dWFsIGludCBn ZXRSaWdodExpbmVObyAgICAgKCk7CiAgICB2aXJ0dWFsIGludCBnZXRSaWdodENvbHVtbk5vICAg KCk7CiAgICAKICAgIGVudW0gU3RyZWFtRXJyb3JLaW5kCiAgICB7CiAgICAgICAgQkFEX1RPS0VO LAogICAgICAgIEJBRF9PQ1RBTF9DT05TVEFOVCwKICAgICAgICBFTVBUWV9DSEFSQUNURVJfQ09O U1RBTlQsCiAgICAgICAgVU5URVJNSU5BVEVEX0NIQVJBQ1RFUl9DT05TVEFOVCwKICAgICAgICBV TlRFUk1JTkFURURfQ09NTUVOVCwKICAgICAgICBVTlRFUk1JTkFURURfU1RSSU5HX0NPTlNUQU5U LAogICAgICAgIElOVkFMSURfSEVYX0NPTlNUQU5ULAogICAgICAgIElOVkFMSURfRkxPQVRJTkdf Q09OU1RBTlRfRVhQT05FTlQsCiAgICAgICAgSU5WQUxJRF9VTklDT0RFX0VTQ0FQRQogICAgfTsK CiAgICB2b2lkIEluaXRpYWxpemUoU3RyZWFtRXJyb3JLaW5kIGtpbmRfLCB1bnNpZ25lZCBzdGFy dF9sb2NhdGlvbl8sIHVuc2lnbmVkIGVuZF9sb2NhdGlvbl8sIExleFN0cmVhbSAqKTsKCiBwcm90 ZWN0ZWQ6CgogcHJpdmF0ZToKCiAgICB1bnNpZ25lZCAgICAgICAgc3RhcnRfbG9jYXRpb24gOwog ICAgdW5zaWduZWQgICAgICAgIGVuZF9sb2NhdGlvbiAgIDsKICAgIFN0cmVhbUVycm9yS2luZCBr aW5kICAgICAgICAgICA7CiAgICAKICAgIHN0YXRpYyAgYm9vbCAgICBlbWFjc19zdHlsZV9yZXBv cnQ7CiAgICBMZXhTdHJlYW0gICAgICAqbGV4X3N0cmVhbTsKCiAgICBpbnQgbGVmdF9saW5lX25v ICAgIDsKICAgIGludCBsZWZ0X2NvbHVtbl9ubyAgOwogICAgaW50IHJpZ2h0X2xpbmVfbm8gICA7 CiAgICBpbnQgcmlnaHRfY29sdW1uX25vIDsKCiAgICB3Y2hhcl90ICpyZWd1bGFyRXJyb3JTdHJp bmcoKTsKICAgIHdjaGFyX3QgKmVtYWNzRXJyb3JTdHJpbmcoKTsKICAgIAogICAgdm9pZCBQcmlu dExhcmdlU291cmNlKEVycm9yU3RyaW5nICZzKTsKICAgIHZvaWQgUHJpbnRTbWFsbFNvdXJjZShF cnJvclN0cmluZyAmcyk7CgogICAgYm9vbCBpbml0aWFsaXplZDsKICAgIAp9OwoKCiAKIAoKY2xh c3MgU3RyZWFtCnsKcHVibGljOgogIAogICAgU3RyZWFtKCk7CiAgICB+U3RyZWFtKCk7CgogICAg dm9pZCBEZXN0cm95SW5wdXQoKSB7CiAgICAgICAgZGVsZXRlIFtdIGlucHV0X2J1ZmZlcjsKICAg ICAgICBpbnB1dF9idWZmZXIgPSBfX251bGwgOwogICAgfQoKICAgIGlubGluZSB3Y2hhcl90KiBJ bnB1dEJ1ZmZlcigpIHsgcmV0dXJuIGlucHV0X2J1ZmZlcjsgfQogICAgaW5saW5lIHNpemVfdCBJ bnB1dEJ1ZmZlckxlbmd0aCgpIHsgcmV0dXJuIGlucHV0X2J1ZmZlcl9sZW5ndGg7IH0KCiAgICBp bmxpbmUgd2NoYXJfdCogQWxsb2NhdGVJbnB1dEJ1ZmZlciggc2l6ZV90IHNpemUgKSB7CiAgICAg ICAgcmV0dXJuIGlucHV0X2J1ZmZlciA9IG5ldyB3Y2hhcl90W3NpemUgKyA0XTsKICAgIH0KCgog ICAgc3RhdGljIGJvb2wgSXNTdXBwb3J0ZWRFbmNvZGluZyhjaGFyKiBlbmNvZGluZyk7CiAgICBi b29sIFNldEVuY29kaW5nKGNoYXIqIGVuY29kaW5nKTsKCgpwcm90ZWN0ZWQ6CgogICAgd2NoYXJf dCAqaW5wdXRfYnVmZmVyOwogICAgc2l6ZV90IGlucHV0X2J1ZmZlcl9sZW5ndGg7CgogICAgY29u c3QgY2hhciAqc291cmNlX3B0cjsgICAgIAogICAgY29uc3QgY2hhciAqc291cmNlX3RhaWw7ICAg IAogICAgY29uc3QgY2hhciAqZGF0YV9idWZmZXI7ICAgIAoKICAgIGJvb2wgIGVycm9yX2RlY29k ZV9uZXh0X2NoYXJhY3RlcjsKCiAKCgoKCgoKICAgICBpY29udl90IF9kZWNvZGVyOwoKCiAgICB2 b2lkIERlc3Ryb3lFbmNvZGluZygpOwoKICAgICAKICAgICAKICAgICAKCiAgICB3Y2hhcl90IERl Y29kZU5leHRDaGFyYWN0ZXIoKTsKCiAgICBpbmxpbmUgYm9vbCBFcnJvckRlY29kZU5leHRDaGFy YWN0ZXIoKSB7CiAgICAgICAgYm9vbCByZXN1bHQgPSBlcnJvcl9kZWNvZGVfbmV4dF9jaGFyYWN0 ZXI7CiAgICAgICAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgZXJyb3JfZGVjb2RlX25leHRfY2hh cmFjdGVyID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAgCgogICAg aW5saW5lIGJvb2wgSGF2ZURlY29kZXIoKSB7CgoKCiAgICAgICAgcmV0dXJuIChfZGVjb2RlciAh PSAoaWNvbnZfdCktMSk7CgogICAgfQoKCgogICAgaW5saW5lIHZvaWQgSW5pdGlhbGl6ZURhdGFC dWZmZXIoY29uc3QgY2hhciAqIGJ1ZmZlciwgbG9uZyBzaXplKSB7CiAgICAgICAgZGF0YV9idWZm ZXIgPSBidWZmZXI7CiAgICAgICAgc291cmNlX3B0ciA9IGRhdGFfYnVmZmVyOwogICAgICAgIHNv dXJjZV90YWlsID0gZGF0YV9idWZmZXIgKyBzaXplIC0gMTsKICAgIH0KCiAgICBpbmxpbmUgYm9v bCBIYXNNb3JlRGF0YSgpIHsKICAgICAgICByZXR1cm4gKHNvdXJjZV9wdHIgPD0gc291cmNlX3Rh aWwpOwogICAgfQp9OwoKCiAKIAogCiAKY2xhc3MgTGV4U3RyZWFtIDogcHVibGljIFN0cmVhbQp7 CgogICAgZnJpZW5kIGNsYXNzIFN0cmVhbUVycm9yOwogICAgCiBwdWJsaWM6CiAgICAKICAgIHR5 cGVkZWYgaW50IFR5cGVJbmRleDsKICAgIHR5cGVkZWYgaW50IFRva2VuSW5kZXg7CiAgICB0eXBl ZGVmIGludCBDb21tZW50SW5kZXg7CiAgICBlbnVtIHsgTEVYX0lORklOSVRZID0gMjE0NzQ4MzY0 NyAgIH07ICAKCiAgICBGaWxlU3ltYm9sICpmaWxlX3N5bWJvbDsKCiAgICBpbmxpbmUgVG9rZW5J bmRleCBOZXh0KFRva2VuSW5kZXggaSkKICAgICAgICAgeyByZXR1cm4gKCsraSA8IHRva2VuX3N0 cmVhbS5MZW5ndGgoKSA/IGkgOiB0b2tlbl9zdHJlYW0uTGVuZ3RoKCkgLSAxKTsgfQoKICAgIGlu bGluZSBUb2tlbkluZGV4IFByZXZpb3VzKFRva2VuSW5kZXggaSkgeyByZXR1cm4gKGkgPD0gMCA/ IDAgOiBpIC0gMSk7IH0KCiAgICBpbmxpbmUgVG9rZW5JbmRleCBQZWVrKCkgeyByZXR1cm4gTmV4 dChpbmRleCk7IH0KCiAgICBpbmxpbmUgdm9pZCBSZXNldChUb2tlbkluZGV4IGkgPSAxKSB7IGlu ZGV4ID0gUHJldmlvdXMoaSk7IH0KCiAgICBpbmxpbmUgVG9rZW5JbmRleCBHZXR0b2tlbigpIHsg cmV0dXJuIGluZGV4ID0gTmV4dChpbmRleCk7IH0KCiAgICBpbmxpbmUgVG9rZW5JbmRleCBHZXR0 b2tlbihUb2tlbkluZGV4IGVuZF90b2tlbikKICAgICAgICAgeyByZXR1cm4gaW5kZXggPSAoaW5k ZXggPCBlbmRfdG9rZW4gPyBOZXh0KGluZGV4KSA6IHRva2VuX3N0cmVhbS5MZW5ndGgoKSAtIDEp OyB9CgogICAgaW5saW5lIFRva2VuSW5kZXggQmFkdG9rZW4oKSB7IHJldHVybiAwOyB9CgogICAg aW5saW5lIHVuc2lnbmVkIEtpbmQoVG9rZW5JbmRleCBpKSB7IHJldHVybiB0b2tlbnNbaV0uS2lu ZCgpOyB9CgogICAgaW5saW5lIHVuc2lnbmVkIExvY2F0aW9uKFRva2VuSW5kZXggaSkgeyByZXR1 cm4gdG9rZW5zW2ldLkxvY2F0aW9uKCk7IH0KCiAgICBpbmxpbmUgdW5zaWduZWQgTGluZShUb2tl bkluZGV4IGkpIHsgcmV0dXJuIEZpbmRMaW5lKHRva2Vuc1tpXS5Mb2NhdGlvbigpKTsgfQoKICAg IGlubGluZSB1bnNpZ25lZCBDb2x1bW4oVG9rZW5JbmRleCBpKSB7IHJldHVybiBjb2x1bW5zID8g Y29sdW1uc1tpXSA6IChpbnB1dF9idWZmZXIgPyBGaW5kQ29sdW1uKHRva2Vuc1tpXS5Mb2NhdGlv bigpKSA6IDApOyB9CgogICAgaW5saW5lIGJvb2wgQWZ0ZXJFb2woVG9rZW5JbmRleCBpKSB7IHJl dHVybiAoaSA8IDEgPyB0cnVlIDogTGluZShpIC0gMSkgPCBMaW5lKGkpKTsgfQoKICAgIGlubGlu ZSBib29sIElzRGVwcmVjYXRlZChUb2tlbkluZGV4IGkpIHsgcmV0dXJuIHRva2Vuc1tpXS5EZXBy ZWNhdGVkKCk7IH0KCiAgICBpbmxpbmUgVG9rZW5JbmRleCBNYXRjaGluZ0JyYWNlKFRva2VuSW5k ZXggaSkgeyByZXR1cm4gdG9rZW5zW2ldLmFkZGl0aW9uYWxfaW5mby5yaWdodF9icmFjZTsgfQoK ICAgIHdjaGFyX3QgKk5hbWVTdHJpbmcoVG9rZW5JbmRleCBpKQogICAgewogICAgICAgIHJldHVy biAoTmFtZVN5bWJvbChpKSB8fCBMaXRlcmFsU3ltYm9sKGkpID8gdG9rZW5zW2ldLmFkZGl0aW9u YWxfaW5mby5zeW1ib2wgLT4gTmFtZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgOiBLZXl3b3JkTmFtZSh0b2tlbnNbaV0uS2luZCgpKSk7CiAgICB9 CgogICAgaW50IE5hbWVTdHJpbmdMZW5ndGgoVG9rZW5JbmRleCBpKQogICAgewogICAgICAgIHJl dHVybiAoTmFtZVN5bWJvbChpKSB8fCBMaXRlcmFsU3ltYm9sKGkpID8gdG9rZW5zW2ldLmFkZGl0 aW9uYWxfaW5mby5zeW1ib2wgLT4gTmFtZUxlbmd0aCgpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB3Y3NsZW4oS2V5d29yZE5hbWUodG9rZW5zW2ld LktpbmQoKSkpKTsKICAgIH0KCiAgICBjbGFzcyBMaXRlcmFsU3ltYm9sICpMaXRlcmFsU3ltYm9s KFRva2VuSW5kZXgpOwoKICAgIGNsYXNzIE5hbWVTeW1ib2wgKk5hbWVTeW1ib2woVG9rZW5JbmRl eCk7CgogICAgY2hhciAqRmlsZU5hbWUoKTsKICAgIHNpemVfdCBGaWxlTmFtZUxlbmd0aCgpOwoK ICAgIGlubGluZSBpbnQgTGluZUxlbmd0aCh1bnNpZ25lZCBsaW5lX25vKSB7IHJldHVybiBsb2Nh dGlvbnNbbGluZV9ubyArIDFdIC0gbG9jYXRpb25zW2xpbmVfbm9dOyB9CiAgICBpbmxpbmUgaW50 IExpbmVTdGFydCh1bnNpZ25lZCBsaW5lX25vKSAgeyByZXR1cm4gbG9jYXRpb25zW2xpbmVfbm9d OyB9CiAgICBpbmxpbmUgaW50IExpbmVFbmQodW5zaWduZWQgbGluZV9ubykgICAgeyByZXR1cm4g bG9jYXRpb25zW2xpbmVfbm8gKyAxXSAtIDE7IH0KCiAgICBpbmxpbmUgaW50IExpbmVTZWdtZW50 TGVuZ3RoKFRva2VuSW5kZXggaSkKICAgICAgICB7IHJldHVybiBUYWI6Oldjc2xlbihpbnB1dF9i dWZmZXIsIHRva2Vuc1tpXS5Mb2NhdGlvbigpLCBMaW5lRW5kKExpbmUoaSkpKTsgfQoKICAgICAK ICAgICAKICAgICAKICAgICAKICAgIGlubGluZSBpbnQgV2NoYXJPZmZzZXQoVG9rZW5JbmRleCBz dGFydCwgVG9rZW5JbmRleCBlbmQpCiAgICB7CiAgICAgICAgaW50IG9mZnNldCA9IDA7CiAgICAg ICAgZm9yIChUb2tlbkluZGV4IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykKICAgICAgICB7CiAg ICAgICAgICAgIGZvciAod2NoYXJfdCAqc3RyID0gTmFtZVN0cmluZyhpKTsgKnN0cjsgc3RyKysp CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoKnN0ciA+IDB4ZmYpCiAgICAgICAg ICAgICAgICAgICAgb2Zmc2V0ICs9IDU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAg IHJldHVybiBvZmZzZXQ7CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAgaW5saW5lIGludCBX Y2hhck9mZnNldChUb2tlbkluZGV4IGVuZCkKICAgIHsKICAgICAgICBUb2tlbkluZGV4IHN0YXJ0 OwogICAgICAgIHVuc2lnbmVkIHRoZV9saW5lID0gTGluZShlbmQpOwogICAgICAgIGZvciAoc3Rh cnQgPSBlbmQ7IExpbmUoc3RhcnQpID09IHRoZV9saW5lOyBzdGFydC0tKQogICAgICAgICAgICA7 CiAgICAgICAgc3RhcnQrKzsKCiAgICAgICAgcmV0dXJuIFdjaGFyT2Zmc2V0KHN0YXJ0LCBlbmQp OwogICAgfQoKICAgIENvbW1lbnRJbmRleCBGaXJzdENvbW1lbnQoVG9rZW5JbmRleCk7CgogICAg aW5saW5lIGludCBOdW1UeXBlcygpIHsgcmV0dXJuIHR5cGVfaW5kZXguTGVuZ3RoKCk7IH0KICAg IGlubGluZSBUb2tlbkluZGV4IFR5cGUoaW50IGkpIHsgcmV0dXJuIHR5cGVzW2ldOyB9CgogICAg aW5saW5lIGludCBOdW1Ub2tlbnMoKSB7IHJldHVybiB0b2tlbl9zdHJlYW0uTGVuZ3RoKCk7IH0K CiAgICBpbmxpbmUgaW50IE51bUNvbW1lbnRzKCkgeyByZXR1cm4gY29tbWVudF9zdHJlYW0uTGVu Z3RoKCk7IH0KCiAgICBpbmxpbmUgVG9rZW5JbmRleCBQcmVjZWRpbmdUb2tlbihDb21tZW50SW5k ZXggaSkgeyByZXR1cm4gY29tbWVudHNbaV0ucHJldmlvdXNfdG9rZW47IH0KCiAgICBpbmxpbmUg dW5zaWduZWQgQ29tbWVudExvY2F0aW9uKENvbW1lbnRJbmRleCBpKSAgeyByZXR1cm4gY29tbWVu dHNbaV0ubG9jYXRpb247IH0KCiAgICBpbmxpbmUgd2NoYXJfdCAqQ29tbWVudFN0cmluZyhDb21t ZW50SW5kZXggaSkgICAgeyByZXR1cm4gY29tbWVudHNbaV0uc3RyaW5nOyB9CgogICAgaW5saW5l IGludCBDb21tZW50U3RyaW5nTGVuZ3RoKENvbW1lbnRJbmRleCBpKSAgIHsgcmV0dXJuIGNvbW1l bnRzW2ldLmxlbmd0aDsgfQoKICAgIGlubGluZSBpbnQgTnVtQmFkVG9rZW5zKCkgeyByZXR1cm4g YmFkX3Rva2Vucy5MZW5ndGgoKTsgfQoKCgoKCiAgICAgCiAgICAgCiAgICAgCiAgICBMZXhTdHJl YW0oQ29udHJvbCAmY29udHJvbF8sIEZpbGVTeW1ib2wgKmZpbGVfc3ltYm9sXyk7CgogICAgYm9v bCBDb21wdXRlQ29sdW1ucygpCiAgICB7CiAgICAgICAgUmVyZWFkSW5wdXQoKTsKICAgICAgICBp ZiAoaW5wdXRfYnVmZmVyKQogICAgICAgICAgICBJbml0aWFsaXplQ29sdW1ucygpOwoKICAgICAg ICBEZXN0cm95SW5wdXQoKTsKCiAgICAgICAgcmV0dXJuIChjb2x1bW5zICE9IF9fbnVsbCApOwog ICAgfQoKICAgIHZvaWQgUmVyZWFkSW5wdXQoKTsKICAgIH5MZXhTdHJlYW0oKTsKCgogICAgdm9p ZCBEZXN0cm95SW5wdXQoKQogICAgewogICAgICAgIFN0cmVhbTo6RGVzdHJveUlucHV0KCk7Cgog ICAgICAgIGRlbGV0ZSBbXSBjb21tZW50X2J1ZmZlcjsKICAgICAgICBjb21tZW50X2J1ZmZlciA9 IF9fbnVsbCA7CiAgICB9CgogICAgdm9pZCBTb3J0TWVzc2FnZXMoKTsKICAgIHZvaWQgUHJpbnRN ZXNzYWdlcygpOwoKICAgIHZvaWQgU2V0VXBDb21tZW50cygpCiAgICB7CiAgICAgICAgaWYgKGNv bW1lbnRfYnVmZmVyKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgUmVyZWFkSW5wdXQoKTsK ICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAg IGludCBsZW5ndGggPSAwLAogICAgICAgICAgICBpOwoKICAgICAgICBmb3IgKGkgPSAxOyBpIDwg Y29tbWVudF9zdHJlYW0uTGVuZ3RoKCk7IGkrKykKICAgICAgICAgICAgbGVuZ3RoICs9IChjb21t ZW50c1tpXS5sZW5ndGggKyAxKTsKICAgICAgICBjb21tZW50X2J1ZmZlciA9IG5ldyB3Y2hhcl90 W2xlbmd0aF07CiAgICAgICAgd2NoYXJfdCAqcHRyID0gY29tbWVudF9idWZmZXI7CiAgICAgICAg Zm9yIChpID0gMTsgaSA8IGNvbW1lbnRfc3RyZWFtLkxlbmd0aCgpOyBpKyspCiAgICAgICAgewog ICAgICAgICAgICBtZW1tb3ZlKHB0ciwgJihpbnB1dF9idWZmZXJbY29tbWVudHNbaV0ubG9jYXRp b25dKSwgY29tbWVudHNbaV0ubGVuZ3RoICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICAgICAgICAg Y29tbWVudHNbaV0uc3RyaW5nID0gcHRyOwogICAgICAgICAgICBwdHIgKz0gY29tbWVudHNbaV0u bGVuZ3RoOwogICAgICAgICAgICAqcHRyKysgPSBVX05VTEw7CiAgICAgICAgfQoKICAgICAgICBy ZXR1cm47CiAgICB9CgoKCgoKICAgICAKICAgICAKICAgICAKICAgIHNpemVfdCBUb2tlblNwYWNl QWxsb2NhdGVkKHZvaWQpCiAgICB7CiAgICAgICAgcmV0dXJuIHRva2VuX3N0cmVhbS5MZW5ndGgo KSAqIHNpemVvZihUb2tlbik7CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAgc2l6ZV90IENv bW1lbnRTcGFjZUFsbG9jYXRlZCh2b2lkKQogICAgewogICAgICAgIHJldHVybiBjb21tZW50X3N0 cmVhbS5MZW5ndGgoKSAqIHNpemVvZihDb21tZW50KTsKICAgIH0KCnByaXZhdGU6CgogICAgaW50 IGhleHZhbHVlKHdjaGFyX3QgY2gpOwogICAgCgogICAgZW51bSBVbmljb2RlTGV4ZXJTdGF0ZQog ICAgewogICAgICAgIFNUQVJULAogICAgICAgIFJBVywKICAgICAgICBDUiwKICAgICAgICBRVU9U RSwKICAgICAgICBVTklDT0RFX0VTQ0FQRSwKICAgICAgICBVTklDT0RFX0VTQ0FQRV9ESUdJVF8w LAogICAgICAgIFVOSUNPREVfRVNDQVBFX0RJR0lUXzEsCiAgICAgICAgVU5JQ09ERV9FU0NBUEVf RElHSVRfMgogICAgfTsKCiAgICAKICAgIGZyaWVuZCBjbGFzcyBTY2FubmVyOwoKICAgIGNsYXNz IFRva2VuCiAgICB7CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgaW5s aW5lIHZvaWQgU2V0TG9jYXRpb24odW5zaWduZWQgbG9jYXRpb24pIHsgKHN0YXRpY19jYXN0PHZv aWQ+ICAoKCBsb2NhdGlvbiA8PSAweDAwRkZGRkZGICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJs b2NhdGlvbiA8PSAweDAwRkZGRkZGIiAsICIuLi8uLi9qaWtlcy9zcmMvc3RyZWFtLmgiLCA0MzUs IF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7IGluZm8gPSAoaW5mbyAmIDB4MDAwMDAwN0Yp IHwgKGxvY2F0aW9uIDw8IDgpOyB9CgogICAgcHVibGljOgogICAgICAgIHVuc2lnbmVkIGluZm87 CiAgICAgICAgdW5pb24KICAgICAgICB7CiAgICAgICAgICAgIFN5bWJvbCAgICpzeW1ib2w7CiAg ICAgICAgICAgIFRva2VuSW5kZXggcmlnaHRfYnJhY2U7CiAgICAgICAgfSBhZGRpdGlvbmFsX2lu Zm87CgogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgIGlubGluZSB2b2lkIFJl c2V0SW5mb0FuZFNldExvY2F0aW9uKHVuc2lnbmVkIGxvY2F0aW9uKQogICAgICAgIHsKICAgICAg ICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBsb2NhdGlvbiA8PSAweDAwRkZGRkZGICkgPyAw IDoJKF9fYXNzZXJ0X2ZhaWwgKCJsb2NhdGlvbiA8PSAweDAwRkZGRkZGIiAsICIuLi8uLi9qaWtl cy9zcmMvc3RyZWFtLmgiLCA0NTAsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CiAgICAg ICAgICAgIGluZm8gPSAobG9jYXRpb24gPDwgOCk7CiAgICAgICAgICAgIGFkZGl0aW9uYWxfaW5m by5zeW1ib2wgPSBfX251bGwgOwogICAgICAgIH0KCiAgICAgICAgaW5saW5lIHVuc2lnbmVkIExv Y2F0aW9uKCkgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKGluZm8gPj4gOCk7IH0KICAgICAg ICBpbmxpbmUgdm9pZCBTZXRLaW5kKHVuc2lnbmVkIGtpbmQpICAgICAgICAgICB7IChzdGF0aWNf Y2FzdDx2b2lkPiAgKCgga2luZCA8PSAweDAwMDAwMDdGICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwg KCJraW5kIDw9IDB4MDAwMDAwN0YiICwgIi4uLy4uL2ppa2VzL3NyYy9zdHJlYW0uaCIsIDQ1Niwg X19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsgaW5mbyA9IChpbmZvICYgMHhGRkZGRkY4MCkg fCBraW5kOyB9CiAgICAgICAgaW5saW5lIHVuc2lnbmVkIEtpbmQoKSAgICAgICAgICAgICAgICAg ICAgICAgeyByZXR1cm4gKGluZm8gJiAweDAwMDAwMDdGKTsgfQogICAgICAgIGlubGluZSB2b2lk IFNldERlcHJlY2F0ZWQoKSAgICAgICAgICAgICAgICAgIHsgaW5mbyB8PSAweDAwMDAwMDgwOyB9 CiAgICAgICAgaW5saW5lIGJvb2wgRGVwcmVjYXRlZCgpICAgICAgICAgICAgICAgICAgICAgeyBy ZXR1cm4gKChpbmZvICYgMHgwMDAwMDA4MCkgIT0gMCk7IH0KCiAgICAgICAgaW5saW5lIHZvaWQg U2V0U3ltYm9sKFN5bWJvbCAqc3ltYm9sKSAgICAgICAgeyBhZGRpdGlvbmFsX2luZm8uc3ltYm9s ID0gc3ltYm9sOyB9CiAgICAgICAgaW5saW5lIHZvaWQgU2V0UmlnaHRCcmFjZShUb2tlbkluZGV4 IHJicmFjZSkgeyBhZGRpdGlvbmFsX2luZm8ucmlnaHRfYnJhY2UgPSByYnJhY2U7IH0KICAgIH07 CgogICAgVG9rZW5JbmRleCBHZXROZXh0VG9rZW4odW5zaWduZWQgbG9jYXRpb24gPSAwKQogICAg ewogICAgICAgIFRva2VuSW5kZXggaW5kZXggPSB0b2tlbl9zdHJlYW0uTmV4dEluZGV4KCk7CiAg ICAgICAgdG9rZW5fc3RyZWFtW2luZGV4XS5SZXNldEluZm9BbmRTZXRMb2NhdGlvbihsb2NhdGlv bik7CgogICAgICAgIHJldHVybiBpbmRleDsKICAgIH0KCiAgICBjbGFzcyBDb21tZW50CiAgICB7 CiAgICBwdWJsaWM6CiAgICAgICAgVG9rZW5JbmRleCBwcmV2aW91c190b2tlbjsKICAgICAgICB1 bnNpZ25lZCAgIGxvY2F0aW9uOwogICAgICAgIHVuc2lnbmVkICAgbGVuZ3RoOwogICAgICAgIHdj aGFyX3QgICAqc3RyaW5nOwogICAgfTsKCiAgICBUdXBsZTxTdHJlYW1FcnJvcj4gYmFkX3Rva2Vu czsKCiAgICBUb2tlbkluZGV4IGluZGV4OwogICAgVG9rZW4gKnRva2VuczsKICAgIHVuc2lnbmVk IHNob3J0ICpjb2x1bW5zOwogICAgQ29udmVydGlibGVBcnJheTxUb2tlbj4gdG9rZW5fc3RyZWFt OwogICAgQ29tbWVudCAqY29tbWVudHM7CiAgICBDb252ZXJ0aWJsZUFycmF5PENvbW1lbnQ+IGNv bW1lbnRfc3RyZWFtOwogICAgdW5zaWduZWQgKmxvY2F0aW9uczsKICAgIENvbnZlcnRpYmxlQXJy YXk8dW5zaWduZWQ+IGxpbmVfbG9jYXRpb247CiAgICBUb2tlbkluZGV4ICp0eXBlczsKICAgIENv bnZlcnRpYmxlQXJyYXk8VG9rZW5JbmRleD4gdHlwZV9pbmRleDsKCiAgICB2b2lkIEluaXRpYWxp emVDb2x1bW5zKCk7CiAgICB2b2lkIENvbXByZXNzU3BhY2UoKTsKCiAgICBib29sIGluaXRpYWxf cmVhZGluZ19vZl9pbnB1dDsKCiAgICB3Y2hhcl90ICpjb21tZW50X2J1ZmZlcjsKCiAgICBDb250 cm9sICZjb250cm9sOwoKICAgIHZvaWQgUmVhZElucHV0KCk7CiAgICB2b2lkIFByb2Nlc3NJbnB1 dChjb25zdCBjaGFyICosIGxvbmcpOwoKICAgIHZvaWQgUHJvY2Vzc0lucHV0VW5pY29kZShjb25z dCBjaGFyICosIGxvbmcpOwoKCgoKICAgIHdjaGFyX3QgKktleXdvcmROYW1lKGludCk7CgogICAg dW5zaWduZWQgRmluZExpbmUodW5zaWduZWQgbG9jYXRpb24pOwoKICAgIHVuc2lnbmVkIEZpbmRD b2x1bW4odW5zaWduZWQgbG9jYXRpb24pCiAgICB7CiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ ICAoKCBsb2NhdGlvbnMgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImxvY2F0aW9ucyIgLCAiLi4v Li4vamlrZXMvc3JjL3N0cmVhbS5oIiwgNTE4LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkg OwoKICAgICAgICByZXR1cm4gVGFiOjpXY3NsZW4oaW5wdXRfYnVmZmVyLCBsb2NhdGlvbnNbRmlu ZExpbmUobG9jYXRpb24pXSwgbG9jYXRpb24pOwogICAgfQp9OwoKCgoKCgoKIyAxNCAiLi4vLi4v amlrZXMvc3JjL2xwZ2lucHV0LmgiIDIKCgoKCgoKdHlwZWRlZiBMZXhTdHJlYW06OlRva2VuSW5k ZXggVG9rZW5PYmplY3Q7CnR5cGVkZWYgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExvY2F0aW9uOwoK aW5saW5lIExvY2F0aW9uIExvYyhUb2tlbk9iamVjdCBpKSB7IHJldHVybiBpOyB9CgoKCgoKCgoj IDEgIi4uLy4uL2ppa2VzL3NyYy9qYXZhcHJzLmgiIDEKIAogCiAKIAogCiAKIAogCiAKIAoKCgoK CgoKCgoKCgoKY2xhc3MgTGV4U3RyZWFtOwoKY2xhc3MgamF2YXByc190YWJsZQp7CnB1YmxpYzoK ICAgIHN0YXRpYyBpbnQgb3JpZ2luYWxfc3RhdGUoaW50IHN0YXRlKSB7IHJldHVybiAtYmFzZV9j aGVja1tzdGF0ZV07IH0KICAgIHN0YXRpYyBpbnQgYXNpKGludCBzdGF0ZSkgeyByZXR1cm4gYXNi W29yaWdpbmFsX3N0YXRlKHN0YXRlKV07IH0KICAgIHN0YXRpYyBpbnQgbmFzaShpbnQgc3RhdGUp IHsgcmV0dXJuIG5hc2Jbb3JpZ2luYWxfc3RhdGUoc3RhdGUpXTsgfQogICAgc3RhdGljIGludCBp bl9zeW1ib2woaW50IHN0YXRlKSB7IHJldHVybiBpbl9zeW1iW29yaWdpbmFsX3N0YXRlKHN0YXRl KV07IH0KCiAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAgcmhzW107CiAgICBzdGF0aWMg Y29uc3QgICBzaWduZWQgc2hvcnQgY2hlY2tfdGFibGVbXTsKICAgIHN0YXRpYyBjb25zdCAgIHNp Z25lZCBzaG9ydCAqYmFzZV9jaGVjazsKICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBs aHNbXTsKICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCAqYmFzZV9hY3Rpb247CiAgICBz dGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAgdGVybV9jaGVja1tdOwogICAgc3RhdGljIGNvbnN0 IHVuc2lnbmVkIHNob3J0IHRlcm1fYWN0aW9uW107CgogICAgc3RhdGljIGNvbnN0IHVuc2lnbmVk IHNob3J0IGFzYltdOwogICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgIGFzcltdOwogICAg c3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5hc2JbXTsKICAgIHN0YXRpYyBjb25zdCB1bnNp Z25lZCBzaG9ydCBuYXNyW107CiAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbmFtZV9z dGFydFtdOwogICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgIG5hbWVfbGVuZ3RoW107CiAg ICBzdGF0aWMgY29uc3QgICAgICAgICAgY2hhciAgc3RyaW5nX2J1ZmZlcltdOwogICAgc3RhdGlj IGNvbnN0IHVuc2lnbmVkIHNob3J0IHRlcm1pbmFsX2luZGV4W107CiAgICBzdGF0aWMgY29uc3Qg dW5zaWduZWQgc2hvcnQgbm9uX3Rlcm1pbmFsX2luZGV4W107CiAgICBzdGF0aWMgY29uc3QgdW5z aWduZWQgc2hvcnQgc2NvcGVfcHJlZml4W107CiAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hv cnQgc2NvcGVfc3VmZml4W107CiAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2NvcGVf bGhzW107CiAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAgc2NvcGVfbGFbXTsKICAgIHN0 YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICBzY29wZV9zdGF0ZV9zZXRbXTsKICAgIHN0YXRpYyBj b25zdCB1bnNpZ25lZCBzaG9ydCBzY29wZV9yaHNbXTsKICAgIHN0YXRpYyBjb25zdCB1bnNpZ25l ZCBzaG9ydCBzY29wZV9zdGF0ZVtdOwogICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGlu X3N5bWJbXTsKCiAgICBzdGF0aWMgaW50IG50X2FjdGlvbihpbnQgc3RhdGUsIGludCBzeW0pCiAg ICB7CiAgICAgICAgcmV0dXJuIGJhc2VfYWN0aW9uW3N0YXRlICsgc3ltXTsKICAgIH0KCiAgICBz dGF0aWMgaW50IHRfYWN0aW9uKGludCBhY3QsIGludCBzeW0sIExleFN0cmVhbSAqc3RyZWFtKQog ICAgewogICAgICAgIGFjdCA9IGJhc2VfYWN0aW9uW2FjdF07CiAgICAgICAgaW50IGkgPSBhY3Qg KyBzeW07CgogICAgICAgIGFjdCA9IHRlcm1fYWN0aW9uW3Rlcm1fY2hlY2tbaV0gPT0gc3ltID8g aSA6IGFjdF07CgogICAgICAgIGlmIChhY3QgPiBMQV9TVEFURV9PRkZTRVQpCiAgICAgICAgewog ICAgICAgICAgICBmb3IgKFRva2VuT2JqZWN0IHRvayA9IHN0cmVhbSAtPiBQZWVrKCk7CiAgICAg ICAgICAgICAgICAgOwogICAgICAgICAgICAgICAgIHRvayA9IHN0cmVhbSAtPiBOZXh0KHRvaykp CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgYWN0IC09IExBX1NUQVRFX09GRlNFVDsKICAg ICAgICAgICAgICAgc3ltID0gc3RyZWFtIC0+IEtpbmQodG9rKTsKICAgICAgICAgICAgICAgaSA9 IGFjdCArIHN5bTsKICAgICAgICAgICAgICAgYWN0ID0gdGVybV9hY3Rpb25bdGVybV9jaGVja1tp XSA9PSBzeW0gPyBpIDogYWN0XTsKICAgICAgICAgICAgICAgaWYgKGFjdCA8PSBMQV9TVEFURV9P RkZTRVQpCiAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfSAKICAgICAgICB9 CgogICAgICAgIHJldHVybiBhY3Q7CiAgICB9Cn07CgoKCgoKCiMgMzEgIi4uLy4uL2ppa2VzL3Ny Yy9scGdpbnB1dC5oIiAyCgoKCiMgMTQgIi4uLy4uL2ppa2VzL3NyYy9wYXJzZXIuaCIgMgoKCiAK CgoKCgoKCgoKCgoKCgoKCmNsYXNzIFN0b3JhZ2VQb29sOwpjbGFzcyBBc3RQYWNrYWdlRGVjbGFy YXRpb247CmNsYXNzIEFzdENvbXBpbGF0aW9uVW5pdDsKY2xhc3MgQXN0Q2xhc3NCb2R5OwpjbGFz cyBBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbjsKY2xhc3MgQXN0OwpjbGFzcyBBc3RMaXN0Tm9kZTsK CmVudW0gUGFyc2VFcnJvckNvZGUKewogICAgRVJST1JfQ09ERSwKICAgIEJFRk9SRV9DT0RFLAog ICAgSU5TRVJUSU9OX0NPREUsCiAgICBJTlZBTElEX0NPREUsCiAgICBTVUJTVElUVVRJT05fQ09E RSwKICAgIERFTEVUSU9OX0NPREUsCiAgICBNRVJHRV9DT0RFLAogICAgTUlTUExBQ0VEX0NPREUs CiAgICBTQ09QRV9DT0RFLAogICAgTUFOVUFMX0NPREUsCiAgICBTRUNPTkRBUllfQ09ERSwKICAg IEVPRl9DT0RFCn07CgpzdHJ1Y3QgUHJpbWFyeVJlcGFpckluZm8KewogICAgUGFyc2VFcnJvckNv ZGUgY29kZTsKICAgIAogICAgaW50IGRpc3RhbmNlLAogICAgICAgIGJ1ZmZlcl9wb3NpdGlvbiwK ICAgICAgICBtaXNzcGVsbF9pbmRleCwKICAgICAgICBzeW1ib2w7Cn07CgpzdHJ1Y3QgU2Vjb25k YXJ5UmVwYWlySW5mbwp7CiAgICBQYXJzZUVycm9yQ29kZSBjb2RlOwogICAgaW50IGRpc3RhbmNl LAogICAgICAgIGJ1ZmZlcl9wb3NpdGlvbiwKICAgICAgICBzdGFja19wb3NpdGlvbiwKICAgICAg ICBudW1fZGVsZXRpb25zLAogICAgICAgIHN5bWJvbDsKCiAgICBib29sIHJlY292ZXJ5X29uX25l eHRfc3RhY2s7Cn07CgpjbGFzcyBQYXJzZXIgOiBwdWJsaWMgamF2YXByc190YWJsZQp7CnB1Ymxp YzoKCiAgICBQYXJzZXIoKSA6IGFzdF9wb29sKF9fbnVsbCApLAogICAgICAgICAgICAgICBwYXJz ZV9oZWFkZXJfb25seShmYWxzZSksCiAgICAgICAgICAgICAgIHBhcnNlX3BhY2thZ2VfaGVhZGVy X29ubHkoZmFsc2UpLAogICAgICAgICAgICAgICBsb2NhdGlvbl9zdGFjayhfX251bGwgKSwKICAg ICAgICAgICAgICAgcGFyc2Vfc3RhY2soX19udWxsICksCiAgICAgICAgICAgICAgIHN0YWNrX2xl bmd0aCgwKSwKICAgICAgICAgICAgICAgc3RhY2soX19udWxsICksCiAgICAgICAgICAgICAgIHRl bXBfc3RhY2soX19udWxsICkKICAgIHsKICAgICAgICBJbml0UnVsZUFjdGlvbigpOwogICAgICAg IHJldHVybjsKICAgIH0KCiAgICB+UGFyc2VyKCkKICAgIHsKICAgICAgICBkZWxldGUgW10gc3Rh Y2s7CiAgICAgICAgZGVsZXRlIFtdIGxvY2F0aW9uX3N0YWNrOwogICAgICAgIGRlbGV0ZSBbXSBw YXJzZV9zdGFjazsKICAgICAgICBkZWxldGUgW10gdGVtcF9zdGFjazsKICAgIH0KCiAgICBBc3RQ YWNrYWdlRGVjbGFyYXRpb24gKlBhY2thZ2VIZWFkZXJQYXJzZShMZXhTdHJlYW0gKiwgU3RvcmFn ZVBvb2wgKik7CiAgICBBc3RDb21waWxhdGlvblVuaXQgKkhlYWRlclBhcnNlKExleFN0cmVhbSAq LCBTdG9yYWdlUG9vbCAqID0gX19udWxsICk7CiAgICBib29sIEluaXRpYWxpemVyUGFyc2UoTGV4 U3RyZWFtICosIEFzdENsYXNzQm9keSAqKTsKICAgIGJvb2wgSW5pdGlhbGl6ZXJQYXJzZShMZXhT dHJlYW0gKiwgQXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gKik7CiAgICBib29sIEJvZHlQYXJzZShM ZXhTdHJlYW0gKiwgQXN0Q2xhc3NCb2R5ICopOwogICAgYm9vbCBCb2R5UGFyc2UoTGV4U3RyZWFt ICosIEFzdEludGVyZmFjZURlY2xhcmF0aW9uICopOwoKcHJvdGVjdGVkOgoKICAgIFRva2VuT2Jq ZWN0IGJ1ZmZlcltCVUZGX1NJWkVdOwogICAgVG9rZW5PYmplY3QgZW5kX3Rva2VuOwoKICAgIEFz dCAqSGVhZGVyUGFyc2UoKTsKICAgIGJvb2wgSW5pdGlhbGl6ZXIoQXN0Q2xhc3NCb2R5ICopOwog ICAgYm9vbCBJbml0aWFsaXplcihBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiAqKTsKICAgIGJvb2wg Qm9keShBc3RDbGFzc0JvZHkgKik7CiAgICBib29sIEJvZHkoQXN0SW50ZXJmYWNlRGVjbGFyYXRp b24gKik7CiAgICBBc3QgKlBhcnNlU2VnbWVudChUb2tlbk9iamVjdCk7CgoKIyAxICIuLi8uLi9q aWtlcy9zcmMvamF2YWFjdC5oIiAxCiAKIAogCiAKIAogCiAKIAogCiAKCiMgMjEgIi4uLy4uL2pp a2VzL3NyYy9qYXZhYWN0LmgiCgogICAgdm9pZCBCYWRBY3Rpb24odm9pZCk7CiAgICB2b2lkIE5v QWN0aW9uKHZvaWQpOwogICAgdm9pZCBOdWxsQWN0aW9uKHZvaWQpOwogICAgdm9pZCBNYWtlQXJy YXlUeXBlKHZvaWQpOwogICAgdm9pZCBNYWtlU2ltcGxlTmFtZSh2b2lkKTsKICAgIHZvaWQgTWFr ZUZpZWxkQWNjZXNzKHZvaWQpOwogICAgdm9pZCBNYWtlUXVhbGlmaWVkU3VwZXIodm9pZCk7CiAg ICB2b2lkIE1ha2VRdWFsaWZpZWROZXcodm9pZCk7CiAgICB2b2lkIFNldFN5bTFUb1N5bTIodm9p ZCk7CiAgICB2b2lkIE1ha2VFbXB0eVN0YXRlbWVudCh2b2lkKTsKICAgIHZvaWQgTWFrZUxhYmVs ZWRTdGF0ZW1lbnQodm9pZCk7CiAgICB2b2lkIE1ha2VFeHByZXNzaW9uU3RhdGVtZW50KHZvaWQp OwogICAgdm9pZCBNYWtlSWZUaGVuRWxzZVN0YXRlbWVudCh2b2lkKTsKICAgIHZvaWQgTWFrZVdo aWxlU3RhdGVtZW50KHZvaWQpOwogICAgdm9pZCBNYWtlRm9yU3RhdGVtZW50KHZvaWQpOwogICAg dm9pZCBNYWtlQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24odm9pZCk7CiAgICB2b2lkIE1ha2VTdXBl ckZpZWxkQWNjZXNzKHZvaWQpOwogICAgdm9pZCBNYWtlU3VwZXJEb3VibGVGaWVsZEFjY2Vzcyh2 b2lkKTsKICAgIHZvaWQgTWFrZUFycmF5QWNjZXNzKHZvaWQpOwogICAgdm9pZCBNYWtlQ2FzdEV4 cHJlc3Npb24odm9pZCk7CgoKCgoKCgoKCiAgICB2b2lkIEFjdDIodm9pZCk7CgoKCgoKICAgIHZv aWQgQWN0Myh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3Q0KHZvaWQpOwoKCgoKCiAgICB2b2lkIEFj dDUodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0Nih2b2lkKTsKCgoKCgoKCgoKICAgIHZvaWQgQWN0 OCh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3Q5KHZvaWQpOwoKCgoKCiAgICB2b2lkIEFjdDEwKHZv aWQpOwoKCgoKCiAgICB2b2lkIEFjdDExKHZvaWQpOwoKCgoKCiAgICB2b2lkIEFjdDEyKHZvaWQp OwoKCgoKCgoKCgoKCgoKCgoKCiAgICB2b2lkIEFjdDE2KHZvaWQpOwoKCgoKCgoKCgoKCgoKICAg IHZvaWQgQWN0MTkodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MjAodm9pZCk7CgoKCgoKICAgIHZv aWQgQWN0MjEodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MjIodm9pZCk7CgoKCgoKICAgIHZvaWQg QWN0MjModm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MjQodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0 MjUodm9pZCk7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgogICAgdm9pZCBBY3QzNyh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QzOCh2b2lkKTsKCgoKCgog ICAgdm9pZCBBY3QzOSh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3Q0MCh2b2lkKTsKCgoKCgogICAg dm9pZCBBY3Q0MSh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3Q0Mih2b2lkKTsKCgoKCgoKCgoKCgoK CiAgICB2b2lkIEFjdDQ1KHZvaWQpOwoKCgoKCiAgICB2b2lkIEFjdDQ2KHZvaWQpOwoKCgoKCgoK CgoKCgoKICAgIHZvaWQgQWN0NDkodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0NTAodm9pZCk7CgoK CgoKICAgIHZvaWQgQWN0NTEodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0NTIodm9pZCk7CgoKCgoK ICAgIHZvaWQgQWN0NTModm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0NTQodm9pZCk7CgoKCgoKICAg IHZvaWQgQWN0NTUodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0NTYodm9pZCk7CgoKCgoKICAgIHZv aWQgQWN0NTcodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0NTgodm9pZCk7CgoKCgoKICAgIHZvaWQg QWN0NTkodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0NjAodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0 NjEodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0NjIodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0NjMo dm9pZCk7CgoKCgoKCgoKCgoKCgogICAgdm9pZCBBY3Q2Nih2b2lkKTsKCgoKCgogICAgdm9pZCBB Y3Q2Nyh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3Q2OCh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3Q2 OSh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3Q3MCh2b2lkKTsKCgoKCgoKCgoKCgoKCgoKCgogICAg dm9pZCBBY3Q3NCh2b2lkKTsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKICAgIHZvaWQgQWN0Nzkodm9p ZCk7CgoKCgoKICAgIHZvaWQgQWN0ODAodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0ODEodm9pZCk7 CgoKCgoKICAgIHZvaWQgQWN0ODIodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0ODModm9pZCk7CgoK CgoKICAgIHZvaWQgQWN0ODQodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0ODUodm9pZCk7CgoKCgoK CgoKCgoKCgogICAgdm9pZCBBY3Q4OCh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3Q4OSh2b2lkKTsK CgoKCgogICAgdm9pZCBBY3Q5MCh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3Q5MSh2b2lkKTsKCgoK CgogICAgdm9pZCBBY3Q5Mih2b2lkKTsKCgoKCgogICAgdm9pZCBBY3Q5Myh2b2lkKTsKCgoKCgog ICAgdm9pZCBBY3Q5NCh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3Q5NSh2b2lkKTsKCgoKCgoKCgoK ICAgIHZvaWQgQWN0OTcodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0OTgodm9pZCk7CgoKCgoKCgoK CgoKCgogICAgdm9pZCBBY3QxMDEodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MTAyKHZvaWQpOwoK CgoKCiAgICB2b2lkIEFjdDEwMyh2b2lkKTsKCgoKCgoKCgoKICAgIHZvaWQgQWN0MTA1KHZvaWQp OwoKCgoKCiAgICB2b2lkIEFjdDEwNih2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QxMDcodm9pZCk7 CgoKCgoKCgoKCgoKCgogICAgdm9pZCBBY3QxMTAodm9pZCk7CgoKCgoKCgoKCiAgICB2b2lkIEFj dDExMih2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QxMTModm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0 MTE0KHZvaWQpOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgogICAgdm9pZCBBY3QxMTkodm9pZCk7CgoK CgoKCgoKCiAgICB2b2lkIEFjdDEyMSh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QxMjIodm9pZCk7 CgoKCgoKICAgIHZvaWQgQWN0MTIzKHZvaWQpOwoKCgoKCiAgICB2b2lkIEFjdDEyNCh2b2lkKTsK CgoKCgogICAgdm9pZCBBY3QxMjUodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MTI2KHZvaWQpOwoK CgoKCiAgICB2b2lkIEFjdDEyNyh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QxMjgodm9pZCk7CgoK CgoKICAgIHZvaWQgQWN0MTI5KHZvaWQpOwoKCgoKCgoKCgoKCgoKCgoKCiAgICB2b2lkIEFjdDEz Myh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QxMzQodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MTM1 KHZvaWQpOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgog ICAgdm9pZCBBY3QxNjEodm9pZCk7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAg ICB2b2lkIEFjdDE2OSh2b2lkKTsKCgoKCgoKCgoKCgoKCiAgICB2b2lkIEFjdDE3Mih2b2lkKTsK CgoKCgogICAgdm9pZCBBY3QxNzModm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MTc0KHZvaWQpOwoK CgoKCiAgICB2b2lkIEFjdDE3NSh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QxNzYodm9pZCk7CgoK CgoKICAgIHZvaWQgQWN0MTc3KHZvaWQpOwoKCgoKCiAgICB2b2lkIEFjdDE3OCh2b2lkKTsKCgoK CgogICAgdm9pZCBBY3QxNzkodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MTgwKHZvaWQpOwoKCgoK CiAgICB2b2lkIEFjdDE4MSh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QxODIodm9pZCk7CgoKCgoK ICAgIHZvaWQgQWN0MTgzKHZvaWQpOwoKCgoKCgoKCgoKCgoKICAgIHZvaWQgQWN0MTg2KHZvaWQp OwoKCgoKCgoKCgoKCgoKCgoKCiAgICB2b2lkIEFjdDE5MCh2b2lkKTsKCgoKCgoKCgoKICAgIHZv aWQgQWN0MTkyKHZvaWQpOwoKCgoKCiAgICB2b2lkIEFjdDE5Myh2b2lkKTsKCgoKCgogICAgdm9p ZCBBY3QxOTQodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MTk1KHZvaWQpOwoKCgoKCiAgICB2b2lk IEFjdDE5Nih2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QxOTcodm9pZCk7CgoKCgoKICAgIHZvaWQg QWN0MTk4KHZvaWQpOwoKCgoKCiAgICB2b2lkIEFjdDE5OSh2b2lkKTsKCgoKCgogICAgdm9pZCBB Y3QyMDAodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MjAxKHZvaWQpOwoKCgoKCiAgICB2b2lkIEFj dDIwMih2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QyMDModm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0 MjA0KHZvaWQpOwoKCgoKCiAgICB2b2lkIEFjdDIwNSh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3Qy MDYodm9pZCk7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAgICB2b2lkIEFjdDIxMSh2b2lkKTsKCgoK CgogICAgdm9pZCBBY3QyMTIodm9pZCk7CgoKCgoKCgoKCgoKCgogICAgdm9pZCBBY3QyMTUodm9p ZCk7CgoKCgoKICAgIHZvaWQgQWN0MjE2KHZvaWQpOwoKCgoKCiAgICB2b2lkIEFjdDIxNyh2b2lk KTsKCgoKCgoKCgoKCgoKCiAgICB2b2lkIEFjdDIyMCh2b2lkKTsKCgoKCgoKCgoKCgoKCiAgICB2 b2lkIEFjdDIyMyh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QyMjQodm9pZCk7CgoKCgoKCgoKCgoK CgogICAgdm9pZCBBY3QyMjcodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MjI4KHZvaWQpOwoKCgoK CiAgICB2b2lkIEFjdDIyOSh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QyMzAodm9pZCk7CgoKCgoK ICAgIHZvaWQgQWN0MjMxKHZvaWQpOwoKCgoKCiAgICB2b2lkIEFjdDIzMih2b2lkKTsKCgoKCgoK CgoKCgoKCgoKCgogICAgdm9pZCBBY3QyMzYodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MjM3KHZv aWQpOwoKCgoKCiAgICB2b2lkIEFjdDIzOCh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QyMzkodm9p ZCk7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAgICB2b2lkIEFjdDI0Nyh2b2lk KTsKCgoKCgogICAgdm9pZCBBY3QyNDgodm9pZCk7CgoKCgoKCgoKCgoKCgogICAgdm9pZCBBY3Qy NTEodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MjUyKHZvaWQpOwoKCgoKCgoKCgogICAgdm9pZCBB Y3QyNTQodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MjU1KHZvaWQpOwoKCgoKCgoKCgogICAgdm9p ZCBBY3QyNTcodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MjU4KHZvaWQpOwoKCgoKCgoKCgoKCgoK ICAgIHZvaWQgQWN0MjYxKHZvaWQpOwoKCgoKCgoKCgoKCgoKICAgIHZvaWQgQWN0MjY0KHZvaWQp OwoKCgoKCiAgICB2b2lkIEFjdDI2NSh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QyNjYodm9pZCk7 CgoKCgoKCgoKCiAgICB2b2lkIEFjdDI2OCh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QyNjkodm9p ZCk7CgoKCgoKCgoKCiAgICB2b2lkIEFjdDI3MSh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QyNzIo dm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MjczKHZvaWQpOwoKCgoKCgoKCgogICAgdm9pZCBBY3Qy NzUodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0Mjc2KHZvaWQpOwoKCgoKCiAgICB2b2lkIEFjdDI3 Nyh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QyNzgodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0Mjc5 KHZvaWQpOwoKCgoKCgoKCgogICAgdm9pZCBBY3QyODEodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0 MjgyKHZvaWQpOwoKCgoKCgoKCgogICAgdm9pZCBBY3QyODQodm9pZCk7CgoKCgoKCgoKCiAgICB2 b2lkIEFjdDI4Nih2b2lkKTsKCgoKCgoKCgoKICAgIHZvaWQgQWN0Mjg4KHZvaWQpOwoKCgoKCgoK CgogICAgdm9pZCBBY3QyOTAodm9pZCk7CgoKCgoKCgoKCiAgICB2b2lkIEFjdDI5Mih2b2lkKTsK CgoKCgoKCgoKICAgIHZvaWQgQWN0Mjk0KHZvaWQpOwoKCgoKCgoKCgoKCgoKICAgIHZvaWQgQWN0 Mjk3KHZvaWQpOwoKCgoKCgoKCgoKCgoKCgoKCiAgICB2b2lkIEFjdDMwMSh2b2lkKTsKCgoKCgog ICAgdm9pZCBBY3QzMDIodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MzAzKHZvaWQpOwoKCgoKCiAg ICB2b2lkIEFjdDMwNCh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QzMDUodm9pZCk7CgoKCgoKICAg IHZvaWQgQWN0MzA2KHZvaWQpOwoKCgoKCiAgICB2b2lkIEFjdDMwNyh2b2lkKTsKCgoKCgogICAg dm9pZCBBY3QzMDgodm9pZCk7CgoKCgoKICAgIHZvaWQgQWN0MzA5KHZvaWQpOwoKCgoKCiAgICB2 b2lkIEFjdDMxMCh2b2lkKTsKCgoKCgogICAgdm9pZCBBY3QzMTEodm9pZCk7CgoKCgoKICAgIHZv aWQgQWN0MzEyKHZvaWQpOwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCiAgICB2b2lkIEFjdDM1NSh2b2lkKTsKCgoKCgogICAgdm9pZCBB Y3QzNTYodm9pZCk7CgoKIyAxODM4ICIuLi8uLi9qaWtlcy9zcmMvamF2YWFjdC5oIgoKIyAxMjQg Ii4uLy4uL2ppa2VzL3NyYy9wYXJzZXIuaCIgMgoKCiAgICB2b2lkIChQYXJzZXI6OipydWxlX2Fj dGlvbltOVU1fUlVMRVMgKyAxXSkgKCk7CgogICAgdm9pZCBJbml0UnVsZUFjdGlvbigpOwoKICAg ICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGlu bGluZSBMZXhTdHJlYW06OlRva2VuSW5kZXggVG9rZW4oaW50IGkpCiAgICB7CiAgICAgICAgcmV0 dXJuIGxvY2F0aW9uX3N0YWNrW3N0YXRlX3N0YWNrX3RvcCArIChpIC0gMSldOwogICAgfQoKICAg ICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGlubGluZSBB c3QqJiBTeW0oaW50IGkpIHsgcmV0dXJuIHBhcnNlX3N0YWNrW3N0YXRlX3N0YWNrX3RvcCArIChp IC0gMSldOyB9CgogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAg IAogICAgaW5saW5lIHZvaWQgVG9rZW5BY3Rpb24oVG9rZW5PYmplY3QgY3VydG9rKSB7IFN5bSgx KSA9IF9fbnVsbCA7IH0KCiAgICBMZXhTdHJlYW0gKmxleF9zdHJlYW07CgogICAgU3RvcmFnZVBv b2wgKmFzdF9wb29sLAogICAgICAgICAgICAgICAgKmJvZHlfcG9vbCwKICAgICAgICAgICAgICAg ICpsaXN0X25vZGVfcG9vbDsKCiAgICBBc3RMaXN0Tm9kZSAqZnJlZV9saXN0X25vZGVzOwogICAg QXN0TGlzdE5vZGUgKkFsbG9jYXRlTGlzdE5vZGUoKTsKICAgIHZvaWQgRnJlZUNpcmN1bGFyTGlz dChBc3RMaXN0Tm9kZSAqKTsKCiAgICBib29sIHBhcnNlX2hlYWRlcl9vbmx5LAogICAgICAgICBw YXJzZV9wYWNrYWdlX2hlYWRlcl9vbmx5OwoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAK ICAgICAKICAgIExvY2F0aW9uICpsb2NhdGlvbl9zdGFjazsKICAgIEFzdCAqKnBhcnNlX3N0YWNr OwoKICAgIGVudW0geyBTVEFDS19JTkNSRU1FTlQgPSAyNTYgfTsKCiAgICBpbnQgc3RhY2tfbGVu Z3RoLAogICAgICAgIHN0YXRlX3N0YWNrX3RvcCwKICAgICAgICAqc3RhY2ssCgogICAgICAgIHRl bXBfc3RhY2tfdG9wLAogICAgICAgICp0ZW1wX3N0YWNrOwoKICAgIHN0YXRpYyBpbmxpbmUgaW50 IE1pbihpbnQgeCwgaW50IHkpIHsgcmV0dXJuICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpOyB9CiAg ICBzdGF0aWMgaW5saW5lIGludCBNYXgoaW50IHgsIGludCB5KSB7IHJldHVybiAoKHgpID4gKHkp ID8gKHgpIDogKHkpKTsgfQoKICAgIHZvaWQgQWxsb2NhdGVFcnJvclN0YWNrcygpOwogICAgdm9p ZCBSZWFsbG9jYXRlU3RhY2tzKCk7CiAgICB2b2lkIEVycm9yUmVwYWlyKFRva2VuT2JqZWN0IGVy cm9yX3Rva2VuKTsKICAgIHZvaWQgUmVwYWlyUGFyc2UoVG9rZW5PYmplY3QpOwogICAgU2Vjb25k YXJ5UmVwYWlySW5mbyBFcnJvclN1cmdlcnkoaW50IHN0YWNrW10sCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpbnQgc3RhY2tfdG9wLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgaW50IGxhc3RfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBTZWNvbmRhcnlSZXBhaXJJbmZvIHJlcGFpcik7CiAgICBpbnQgUGFyc2VDaGVj ayhpbnQgc3RhY2tbXSwgaW50IHN0YWNrX3RvcCwgaW50IGZpcnN0X3Rva2VuLCBpbnQgYnVmZmVy X3Bvc2l0aW9uKTsKfTsKCgoKCgoKCiMgMTMgIi4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIgMgoK IyAxICIuLi8uLi9qaWtlcy9zcmMvc2VtYW50aWMuaCIgMQogCiAKIAogCiAKIAogCiAKIAoKCgoK IyAxICIuLi8uLi9qaWtlcy9zcmMvYXN0LmgiIDEKIAogCiAKIAogCiAKIAogCiAKCgoKCgoKIyAx ICIuLi8uLi9qaWtlcy9zcmMvc3ltYm9sLmgiIDEKIAogCiAKIAogCiAKIAogCiAKCgoKCiMgMSAi Li4vLi4vamlrZXMvc3JjL2NvZGUuaCIgMQogCiAKIAogCiAKIAogCiAKIAogCgoKCgoKCgoKCgpj bGFzcyBDb2RlCnsKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGVudW0gewogICAg ICAgICAgICAgTE9HX0JBU0VfU0laRSAgICAgICA9IDksCiAgICAgICAgICAgICBMT0dfQ09NUExF TUVOVF9TSVpFID0gNywKICAgICAgICAgICAgIEJBU0VfU0laRSAgICAgICAgICAgPSA1MTIsCiAg ICAgICAgICAgICBTTE9UX1NJWkUgICAgICAgICAgID0gMTI4LAogICAgICAgICAgICAgU0xPVF9N QVNLICAgICAgICAgICA9IDEyNywKCiAgICAgICAgICAgICBORVdMSU5FX0NPREUgICAgICAgID0g MSwKICAgICAgICAgICAgIFNQQUNFX0NPREUgICAgICAgICAgPSAyLAogICAgICAgICAgICAgQkFE X0NPREUgICAgICAgICAgICA9IDMsCiAgICAgICAgICAgICBESUdJVF9DT0RFICAgICAgICAgID0g NCwKICAgICAgICAgICAgIE9USEVSX0RJR0lUX0NPREUgICAgPSA1LAogICAgICAgICAgICAgTE9X RVJfQ09ERSAgICAgICAgICA9IDYsCiAgICAgICAgICAgICBVUFBFUl9DT0RFICAgICAgICAgID0g NywKICAgICAgICAgICAgIE9USEVSX0xFVFRFUl9DT0RFICAgPSA4CiAgICAgICAgIH07CgogICAg c3RhdGljIGNoYXIgY29kZVs3OTEyXTsKICAgIHN0YXRpYyBjaGFyICpiYXNlWzUxMl07CgoKcHVi bGljOgoKICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXRCYWRDb2RlKHdjaGFyX3QgYykKICAgIHsK ICAgICAgICBiYXNlW2MgPj4gTE9HX0NPTVBMRU1FTlRfU0laRV1bY10gPSBCQURfQ09ERTsKICAg IH0KCiAgICBzdGF0aWMgaW5saW5lIHZvaWQgQ29kZUNoZWNrKHdjaGFyX3QgYykKICAgIHsKICAg ICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIGMgPj4gTE9HX0NPTVBMRU1FTlRfU0laRSA8IEJB U0VfU0laRSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiYyA+PiBMT0dfQ09NUExFTUVOVF9TSVpF IDwgQkFTRV9TSVpFIiAsICIuLi8uLi9qaWtlcy9zcmMvY29kZS5oIiwgNTgsIF9fUFJFVFRZX0ZV TkNUSU9OX18gKSwgMCkpKSA7CiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBiYXNlW2Mg Pj4gTE9HX0NPTVBMRU1FTlRfU0laRV0gKyBjID49ICgmY29kZVswXSkgKSA/IDAgOgkoX19hc3Nl cnRfZmFpbCAoImJhc2VbYyA+PiBMT0dfQ09NUExFTUVOVF9TSVpFXSArIGMgPj0gKCZjb2RlWzBd KSIgLCAiLi4vLi4vamlrZXMvc3JjL2NvZGUuaCIsIDU5LCBfX1BSRVRUWV9GVU5DVElPTl9fICks IDApKSkgOwogICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggYmFzZVtjID4+IExPR19DT01Q TEVNRU5UX1NJWkVdICsgYyA8ICgmY29kZVs3OTEyXSkgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAo ImJhc2VbYyA+PiBMT0dfQ09NUExFTUVOVF9TSVpFXSArIGMgPCAoJmNvZGVbNzkxMl0pIiAsICIu Li8uLi9qaWtlcy9zcmMvY29kZS5oIiwgNjAsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7 CiAgICB9CgogICAgc3RhdGljIGlubGluZSBib29sIENvZGVDaGVjayh2b2lkKQogICAgewogICAg ICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IDB4ZmZmZjsgaSsrKQogICAgICAgICAgICBDb2RlQ2hl Y2soKHdjaGFyX3QpIGkpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHN0YXRpYyBp bmxpbmUgYm9vbCBJc05ld2xpbmUod2NoYXJfdCBjKSAgCiAgICB7CiAgICAgICAgcmV0dXJuIGMg PT0gJ1x4MGEnOwogICAgfQoKICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBJc1NwYWNlQnV0Tm90TmV3 bGluZSh3Y2hhcl90IGMpCiAgICB7CiAgICAgICAgcmV0dXJuIGJhc2VbYyA+PiBMT0dfQ09NUExF TUVOVF9TSVpFXVtjXSA9PSBTUEFDRV9DT0RFOwogICAgfQoKICAgIHN0YXRpYyBpbmxpbmUgYm9v bCBJc1NwYWNlKHdjaGFyX3QgYykKICAgIHsKICAgICAgICByZXR1cm4gYmFzZVtjID4+IExPR19D T01QTEVNRU5UX1NJWkVdW2NdIDw9IFNQQUNFX0NPREU7CiAgICB9CgogICAgc3RhdGljIGlubGlu ZSBib29sIElzRGlnaXQod2NoYXJfdCBjKQogICAgewogICAgICAgIHJldHVybiBiYXNlW2MgPj4g TE9HX0NPTVBMRU1FTlRfU0laRV1bY10gPT0gRElHSVRfQ09ERTsKICAgIH0KCiAgICBzdGF0aWMg aW5saW5lIGJvb2wgSXNVcHBlcih3Y2hhcl90IGMpCiAgICB7CiAgICAgICAgcmV0dXJuIGJhc2Vb YyA+PiBMT0dfQ09NUExFTUVOVF9TSVpFXVtjXSA9PSBVUFBFUl9DT0RFOwogICAgfQoKICAgIHN0 YXRpYyBpbmxpbmUgYm9vbCBJc0xvd2VyKHdjaGFyX3QgYykKICAgIHsKICAgICAgICByZXR1cm4g YmFzZVtjID4+IExPR19DT01QTEVNRU5UX1NJWkVdW2NdID09IExPV0VSX0NPREU7CiAgICB9Cgog ICAgc3RhdGljIGlubGluZSBib29sIElzQWxwaGEod2NoYXJfdCBjKQogICAgewogICAgICAgIHJl dHVybiBiYXNlW2MgPj4gTE9HX0NPTVBMRU1FTlRfU0laRV1bY10gPj0gTE9XRVJfQ09ERTsKICAg IH0KCiAgICBzdGF0aWMgaW5saW5lIGJvb2wgSXNBbG51bSh3Y2hhcl90IGMpCiAgICB7CiAgICAg ICAgcmV0dXJuIGJhc2VbYyA+PiBMT0dfQ09NUExFTUVOVF9TSVpFXVtjXSA+PSBESUdJVF9DT0RF OwogICAgfQoKCn07CgoKCgoKCgojIDE0ICIuLi8uLi9qaWtlcy9zcmMvc3ltYm9sLmgiIDIKCgoj IDEgIi4uLy4uL2ppa2VzL3NyYy9vcHRpb24uaCIgMQogCiAKIAogCiAKIAogCiAKIAoKCgoKCiMg MSAiLi4vLi4vamlrZXMvc3JjL2NvZGUuaCIgMQogCiAKIAogCiAKIAogCiAKIAogCgoKCgoKCgoj IDExMyAiLi4vLi4vamlrZXMvc3JjL2NvZGUuaCIKCgoKCgoKIyAxNSAiLi4vLi4vamlrZXMvc3Jj L29wdGlvbi5oIiAyCgoKCgogCiAKCgoKCgpjbGFzcyBBcmd1bWVudEV4cGFuZGVyCnsKcHVibGlj OgoKICAgIGludCBhcmdjOwogICAgY2hhciAqKmFyZ3Y7CgogICAgQXJndW1lbnRFeHBhbmRlcihp bnQsIGNoYXIgKiopOwoKICAgIEFyZ3VtZW50RXhwYW5kZXIoVHVwbGU8Y2hhcj4gJik7CgogICAg fkFyZ3VtZW50RXhwYW5kZXIoKQogICAgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJn YzsgaSsrKQogICAgICAgICAgICBkZWxldGUgW10gYXJndltpXTsKICAgICAgICBkZWxldGUgW10g YXJndjsKICAgIH0KCiAgICBib29sIEV4cGFuZEF0RmlsZUFyZ3VtZW50KFR1cGxlPGNoYXIgKj4g JiBhcmd1bWVudHMsIGNoYXIgKiBmaWxlX25hbWUpOwp9OwoKCmNsYXNzIEtleXdvcmRNYXAKewpw dWJsaWM6CiAgICB3Y2hhcl90ICpuYW1lOwogICAgaW50IGxlbmd0aCwKICAgICAgICBrZXk7Cn07 CgoKY2xhc3MgT3B0aW9uRXJyb3IKewpwdWJsaWM6CiAgICBpbnQga2luZDsKICAgIHdjaGFyX3Qg Km5hbWU7CgogICAgT3B0aW9uRXJyb3IoaW50IGtpbmRfLCBjaGFyICpzdHIpIDoga2luZChraW5k XykKICAgIHsKICAgICAgICBpbnQgbGVuZ3RoID0gc3RybGVuKHN0cik7CiAgICAgICAgbmFtZSA9 IG5ldyB3Y2hhcl90W2xlbmd0aCArIDFdOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVu Z3RoOyBpKyspCiAgICAgICAgICAgIG5hbWVbaV0gPSBzdHJbaV07CiAgICAgICAgbmFtZVtsZW5n dGhdID0gVV9OVUxMOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgfk9wdGlvbkVycm9yKCkg eyBkZWxldGUgW10gbmFtZTsgfQp9OwoKY2xhc3MgT3N0cmVhbTsKCmNsYXNzIE9wdGlvbjogcHVi bGljIEppa2VzT3B0aW9uCiB7CgojIDExMCAiLi4vLi4vamlrZXMvc3JjL29wdGlvbi5oIgoKCnB1 YmxpYzoKICAgICAgICAgCiAgICBUdXBsZTxLZXl3b3JkTWFwPiBrZXl3b3JkX21hcDsKICAgIFR1 cGxlPE9wdGlvbkVycm9yICo+IGJhZF9vcHRpb25zOwoKICAgIGludCBmaXJzdF9maWxlX2luZGV4 OwoKICAgIGludCBkZWJ1Z190cmFwX29wOwoKICAgIGJvb2wgZGVidWdfZHVtcF9sZXgsCiAgICAg ICAgIGRlYnVnX2R1bXBfYXN0LAogICAgICAgICBkZWJ1Z191bnBhcnNlX2FzdCwKICAgICAgICAg ZGVidWdfdW5wYXJzZV9hc3RfZGVidWcsCiAgICAgICAgIGRlYnVnX2R1bXBfY2xhc3MsCiAgICAg ICAgIG5vY2xlYW51cCwKICAgICAgICAgaW5jcmVtZW50YWwsCiAgICAgICAgIG1ha2VmaWxlLAoJ IGRlcGVuZGVuY2VfcmVwb3J0LAogICAgICAgICBieXRlY29kZSwKICAgICAgICAgZnVsbF9jaGVj aywKICAgICAgICAgdW56aXAsCiAgICAgICAgIGR1bXBfZXJyb3JzLAogICAgICAgICBlcnJvcnMs CiAgICAgICAgIGNvbW1lbnRzLAogICAgICAgICBwZWRhbnRpYzsKCiAgICBjaGFyICpkZXBlbmRl bmNlX3JlcG9ydF9uYW1lOwoKICAgIE9wdGlvbihBcmd1bWVudEV4cGFuZGVyICYpOwoKICAgIH5P cHRpb24oKTsKfTsKCgoKCgoKCiMgMTYgIi4uLy4uL2ppa2VzL3NyYy9zeW1ib2wuaCIgMgoKCiMg MSAiLi4vLi4vamlrZXMvc3JjL2RlcGVuZC5oIiAxCiAKIAogCiAKIAogCiAKIAogCgoKCgogCiAK CgoKCgpjbGFzcyBTZW1hbnRpYzsKY2xhc3MgVHlwZVN5bWJvbDsKY2xhc3MgRmlsZVN5bWJvbDsK Y2xhc3MgQXN0Q2xhc3NCb2R5OwpjbGFzcyBBc3RDb25zdHJ1Y3RvckRlY2xhcmF0aW9uOwpjbGFz cyBTeW1ib2xTZXQ7CmNsYXNzIENvbnRyb2w7CgpjbGFzcyBDeWNsZUNoZWNrZXIKewpwdWJsaWM6 CiAgICBlbnVtIHsgT01FR0EgPSAtMSwgQ1lDTEVfSU5GSU5JVFkgPSAyMTQ3NDgzNjQ3ICAgfTsK CiAgICBpbmxpbmUgaW50IE1pbihpbnQgeCwgaW50IHkpIHsgcmV0dXJuICh4IDwgeSA/IHggOiB5 KTsgfQp9OwoKY2xhc3MgVHlwZUN5Y2xlQ2hlY2tlciA6IHB1YmxpYyBDeWNsZUNoZWNrZXIKewpw dWJsaWM6CgogICAgVHlwZUN5Y2xlQ2hlY2tlcihUdXBsZTxUeXBlU3ltYm9sICo+ICZ0eXBlX2xp c3RfKSA6IHR5cGVfbGlzdCh0eXBlX2xpc3RfKQogICAge30KICAgIHZvaWQgUGFydGlhbE9yZGVy KFR1cGxlPFNlbWFudGljICo+ICYsIGludCk7CiAgICB2b2lkIFBhcnRpYWxPcmRlcihTeW1ib2xT ZXQgJik7Cgpwcml2YXRlOgogICAgY2xhc3MgU3RhY2sKICAgIHsKICAgIHB1YmxpYzoKICAgICAg ICB2b2lkIFB1c2goVHlwZVN5bWJvbCAqdHlwZSkgeyBpbmZvLk5leHQoKSA9IHR5cGU7IH0KICAg ICAgICB2b2lkIFBvcCgpICAgICAgICAgICAgICAgICAgeyBpZiAoaW5mby5MZW5ndGgoKSA+IDAp IGluZm8uUmVzZXQoaW5mby5MZW5ndGgoKSAtIDEpOyB9CiAgICAgICAgaW50IFNpemUoKSAgICAg ICAgICAgICAgICAgIHsgcmV0dXJuIGluZm8uTGVuZ3RoKCk7IH0KICAgICAgICBUeXBlU3ltYm9s ICpUb3AoKSAgICAgICAgICAgeyByZXR1cm4gKFR5cGVTeW1ib2wgKikgKGluZm8uTGVuZ3RoKCkg PiAwID8gaW5mb1tpbmZvLkxlbmd0aCgpIC0gMV0gOiBfX251bGwgKTsgfQogICAgcHJpdmF0ZToK ICAgICAgICBUdXBsZTxUeXBlU3ltYm9sICo+IGluZm87CiAgICB9IHN0YWNrOwoKICAgIFR1cGxl PFR5cGVTeW1ib2wgKj4gJnR5cGVfbGlzdDsKCiAgICB2b2lkIFByb2Nlc3NTdWJ0eXBlcyhUeXBl U3ltYm9sICopOwogICAgdm9pZCBSZXZlcnNlVHlwZUxpc3QoKTsKfTsKCgpjbGFzcyBDb25zdHJ1 Y3RvckN5Y2xlQ2hlY2tlciA6IHB1YmxpYyBDeWNsZUNoZWNrZXIKewpwdWJsaWM6CgogICAgQ29u c3RydWN0b3JDeWNsZUNoZWNrZXIoQXN0Q2xhc3NCb2R5ICopOwoKcHJpdmF0ZToKICAgIGNsYXNz IFN0YWNrCiAgICB7CiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBQdXNoKEFzdENvbnN0cnVjdG9y RGVjbGFyYXRpb24gKmNvbnN0cnVjdG9yKSB7IGluZm8uTmV4dCgpID0gY29uc3RydWN0b3I7IH0K ICAgICAgICB2b2lkIFBvcCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHsgaWYgKGluZm8uTGVuZ3RoKCkgPiAwKSBpbmZvLlJlc2V0KGluZm8uTGVuZ3RoKCkgLSAxKTsg fQogICAgICAgIGludCBTaXplKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgeyByZXR1cm4gaW5mby5MZW5ndGgoKTsgfQogICAgICAgIEFzdENvbnN0cnVjdG9yRGVjbGFy YXRpb24gKlRvcCgpCiAgICAgICAgICAgeyByZXR1cm4gKEFzdENvbnN0cnVjdG9yRGVjbGFyYXRp b24gKikgKGluZm8uTGVuZ3RoKCkgPiAwID8gaW5mb1tpbmZvLkxlbmd0aCgpIC0gMV0gOiBfX251 bGwgKTt9CiAgICBwcml2YXRlOgogICAgICAgIFR1cGxlPEFzdENvbnN0cnVjdG9yRGVjbGFyYXRp b24gKj4gaW5mbzsKICAgIH0gc3RhY2s7CgogICAgdm9pZCBDaGVja0NvbnN0cnVjdG9yQ3ljbGVz KEFzdENvbnN0cnVjdG9yRGVjbGFyYXRpb24gKik7Cn07CgoKY2xhc3MgVHlwZURlcGVuZGVuY2VD aGVja2VyIDogcHVibGljIEN5Y2xlQ2hlY2tlcgp7CnB1YmxpYzoKICAgIFR5cGVEZXBlbmRlbmNl Q2hlY2tlcihDb250cm9sICpjb250cm9sXywgU3ltYm9sU2V0ICZmaWxlX3NldF8sIFR1cGxlPFR5 cGVTeW1ib2wgKj4gJnR5cGVfdHJhc2hfYmluXykKICAgICAgICA6IGZpbGVfc2V0KGZpbGVfc2V0 XyksCiAgICAgICAgICBjb250cm9sKGNvbnRyb2xfKSwKICAgICAgICAgIHR5cGVfdHJhc2hfYmlu KHR5cGVfdHJhc2hfYmluXykKICAgIHt9CgogICAgflR5cGVEZXBlbmRlbmNlQ2hlY2tlcigpIHt9 CgogICAgdm9pZCBQYXJ0aWFsT3JkZXIoKTsKICAgIHZvaWQgT3V0cHV0RGVwZW5kZW5jZXMoKTsK CiAgICBUdXBsZTxUeXBlU3ltYm9sICo+ICZUeXBlTGlzdCgpIHsgcmV0dXJuIHR5cGVfbGlzdDsg fQoKICAgIFN5bWJvbFNldCAmZmlsZV9zZXQ7Cgpwcml2YXRlOgogICAgQ29udHJvbCAqY29udHJv bDsKICAgIFR1cGxlPFR5cGVTeW1ib2wgKj4gJnR5cGVfdHJhc2hfYmluOwoKICAgIGNsYXNzIFN0 YWNrCiAgICB7CiAgICBwdWJsaWM6CiAgICAgICAgdm9pZCBQdXNoKFR5cGVTeW1ib2wgKnR5cGUp IHsgaW5mby5OZXh0KCkgPSB0eXBlOyB9CiAgICAgICAgdm9pZCBQb3AoKSAgICAgICAgICAgICAg ICAgIHsgaWYgKGluZm8uTGVuZ3RoKCkgPiAwKSBpbmZvLlJlc2V0KGluZm8uTGVuZ3RoKCkgLSAx KTsgfQogICAgICAgIGludCBTaXplKCkgICAgICAgICAgICAgICAgICB7IHJldHVybiBpbmZvLkxl bmd0aCgpOyB9CiAgICAgICAgVHlwZVN5bWJvbCAqVG9wKCkgICAgICAgICAgIHsgcmV0dXJuIChU eXBlU3ltYm9sICopIChpbmZvLkxlbmd0aCgpID4gMCA/IGluZm9baW5mby5MZW5ndGgoKSAtIDFd IDogX19udWxsICk7IH0KICAgIHByaXZhdGU6CiAgICAgICAgVHVwbGU8VHlwZVN5bWJvbCAqPiBp bmZvOwogICAgfSBzdGFjazsKCiAgICB2b2lkIE91dHB1dE1ha2UoRklMRSAqLCBjaGFyICosIFR1 cGxlPEZpbGVTeW1ib2wgKj4gJik7CiAgICB2b2lkIE91dHB1dE1ha2UoRmlsZVN5bWJvbCAqKTsK CiAgICBUdXBsZTxUeXBlU3ltYm9sICo+IHR5cGVfbGlzdDsKCiAgICB2b2lkIFByb2Nlc3NUeXBl KFR5cGVTeW1ib2wgKik7Cn07CgoKY2xhc3MgVG9wb2xvZ2ljYWxTb3J0CnsKcHVibGljOgogICAg VG9wb2xvZ2ljYWxTb3J0KFN5bWJvbFNldCAmLCBUdXBsZTxUeXBlU3ltYm9sICo+ICYpOwogICAg flRvcG9sb2dpY2FsU29ydCgpOwoKICAgIHZvaWQgU29ydCgpOwoKcHJpdmF0ZToKICAgIHZvaWQg UHJvY2VzcyhUeXBlU3ltYm9sICopOwoKICAgIFN5bWJvbFNldCAqcGVuZGluZzsKCiAgICBTeW1i b2xTZXQgJnR5cGVfY29sbGVjdGlvbjsKICAgIFR1cGxlPFR5cGVTeW1ib2wgKj4gJnR5cGVfbGlz dDsKfTsKCgoKCgoKCiMgMTggIi4uLy4uL2ppa2VzL3NyYy9zeW1ib2wuaCIgMgoKIyAxICIuLi8u Li9qaWtlcy9zcmMvYWNjZXNzLmgiIDEKIAogCiAKIAogCiAKIAogCiAKCgoKCgoKCgoKCgpjbGFz cyBBY2Nlc3NGbGFncwp7CnByb3RlY3RlZDoKICAgIHUyIGFjY2Vzc19mbGFnczsKCnB1YmxpYzoK CiAgICBib29sIEFDQ19QVUJMSUMoKSAgICAgICB7IHJldHVybiAoYWNjZXNzX2ZsYWdzICYgMHgw MDAxKSAhPSAwOyB9CiAgICBib29sIEFDQ19QUklWQVRFKCkgICAgICB7IHJldHVybiAoYWNjZXNz X2ZsYWdzICYgMHgwMDAyKSAhPSAwOyB9CiAgICBib29sIEFDQ19QUk9URUNURUQoKSAgICB7IHJl dHVybiAoYWNjZXNzX2ZsYWdzICYgMHgwMDA0KSAhPSAwOyB9CiAgICBib29sIEFDQ19TVEFUSUMo KSAgICAgICB7IHJldHVybiAoYWNjZXNzX2ZsYWdzICYgMHgwMDA4KSAhPSAwOyB9CiAgICBib29s IEFDQ19GSU5BTCgpICAgICAgICB7IHJldHVybiAoYWNjZXNzX2ZsYWdzICYgMHgwMDEwKSAhPSAw OyB9CiAgICBib29sIEFDQ19TVVBFUigpICAgICAgICB7IHJldHVybiAoYWNjZXNzX2ZsYWdzICYg MHgwMDIwKSAhPSAwOyB9CiAgICBib29sIEFDQ19TWU5DSFJPTklaRUQoKSB7IHJldHVybiAoYWNj ZXNzX2ZsYWdzICYgMHgwMDIwKSAhPSAwOyB9CiAgICBib29sIEFDQ19WT0xBVElMRSgpICAgICB7 IHJldHVybiAoYWNjZXNzX2ZsYWdzICYgMHgwMDQwKSAhPSAwOyB9CiAgICBib29sIEFDQ19UUkFO U0lFTlQoKSAgICB7IHJldHVybiAoYWNjZXNzX2ZsYWdzICYgMHgwMDgwKSAhPSAwOyB9CiAgICBi b29sIEFDQ19OQVRJVkUoKSAgICAgICB7IHJldHVybiAoYWNjZXNzX2ZsYWdzICYgMHgwMTAwKSAh PSAwOyB9CiAgICBib29sIEFDQ19JTlRFUkZBQ0UoKSAgICB7IHJldHVybiAoYWNjZXNzX2ZsYWdz ICYgMHgwMjAwKSAhPSAwOyB9CiAgICBib29sIEFDQ19BQlNUUkFDVCgpICAgICB7IHJldHVybiAo YWNjZXNzX2ZsYWdzICYgMHgwNDAwKSAhPSAwOyB9CiAgICBib29sIEFDQ19TVFJJQ1RGUCgpICAg ICB7IHJldHVybiAoYWNjZXNzX2ZsYWdzICYgMHgwODAwKSAhPSAwOyB9CgogICAgdm9pZCBTZXRB Q0NfUFVCTElDKCkgICAgICAgeyBhY2Nlc3NfZmxhZ3MgfD0gMHgwMDAxOyB9CiAgICB2b2lkIFNl dEFDQ19QUklWQVRFKCkgICAgICB7IGFjY2Vzc19mbGFncyB8PSAweDAwMDI7IH0KICAgIHZvaWQg U2V0QUNDX1BST1RFQ1RFRCgpICAgIHsgYWNjZXNzX2ZsYWdzIHw9IDB4MDAwNDsgfQogICAgdm9p ZCBTZXRBQ0NfU1RBVElDKCkgICAgICAgeyBhY2Nlc3NfZmxhZ3MgfD0gMHgwMDA4OyB9CiAgICB2 b2lkIFNldEFDQ19GSU5BTCgpICAgICAgICB7IGFjY2Vzc19mbGFncyB8PSAweDAwMTA7IH0KICAg IHZvaWQgU2V0QUNDX1NVUEVSKCkgICAgICAgIHsgYWNjZXNzX2ZsYWdzIHw9IDB4MDAyMDsgfQog ICAgdm9pZCBTZXRBQ0NfU1lOQ0hST05JWkVEKCkgeyBhY2Nlc3NfZmxhZ3MgfD0gMHgwMDIwOyB9 CiAgICB2b2lkIFNldEFDQ19WT0xBVElMRSgpICAgICB7IGFjY2Vzc19mbGFncyB8PSAweDAwNDA7 IH0KICAgIHZvaWQgU2V0QUNDX1RSQU5TSUVOVCgpICAgIHsgYWNjZXNzX2ZsYWdzIHw9IDB4MDA4 MDsgfQogICAgdm9pZCBTZXRBQ0NfTkFUSVZFKCkgICAgICAgeyBhY2Nlc3NfZmxhZ3MgfD0gMHgw MTAwOyB9CiAgICB2b2lkIFNldEFDQ19JTlRFUkZBQ0UoKSAgICB7IGFjY2Vzc19mbGFncyB8PSAw eDAyMDA7IH0KICAgIHZvaWQgU2V0QUNDX0FCU1RSQUNUKCkgICAgIHsgYWNjZXNzX2ZsYWdzIHw9 IDB4MDQwMDsgfQogICAgdm9pZCBTZXRBQ0NfU1RSSUNURlAoKSAgICAgeyBhY2Nlc3NfZmxhZ3Mg fD0gMHgwODAwOyB9CgogICAgdm9pZCBSZXNldEFDQ19QVUJMSUMoKSAgICAgICB7IGFjY2Vzc19m bGFncyAmPSAofiAweDAwMDEpOyB9CiAgICB2b2lkIFJlc2V0QUNDX1BSSVZBVEUoKSAgICAgIHsg YWNjZXNzX2ZsYWdzICY9ICh+IDB4MDAwMik7IH0KICAgIHZvaWQgUmVzZXRBQ0NfUFJPVEVDVEVE KCkgICAgeyBhY2Nlc3NfZmxhZ3MgJj0gKH4gMHgwMDA0KTsgfQogICAgdm9pZCBSZXNldEFDQ19T VEFUSUMoKSAgICAgICB7IGFjY2Vzc19mbGFncyAmPSAofiAweDAwMDgpOyB9CiAgICB2b2lkIFJl c2V0QUNDX0ZJTkFMKCkgICAgICAgIHsgYWNjZXNzX2ZsYWdzICY9ICh+IDB4MDAxMCk7IH0KICAg IHZvaWQgUmVzZXRBQ0NfU1VQRVIoKSAgICAgICAgeyBhY2Nlc3NfZmxhZ3MgJj0gKH4gMHgwMDIw KTsgfQogICAgdm9pZCBSZXNldEFDQ19TWU5DSFJPTklaRUQoKSB7IGFjY2Vzc19mbGFncyAmPSAo fiAweDAwMjApOyB9CiAgICB2b2lkIFJlc2V0QUNDX1ZPTEFUSUxFKCkgICAgIHsgYWNjZXNzX2Zs YWdzICY9ICh+IDB4MDA0MCk7IH0KICAgIHZvaWQgUmVzZXRBQ0NfVFJBTlNJRU5UKCkgICAgeyBh Y2Nlc3NfZmxhZ3MgJj0gKH4gMHgwMDgwKTsgfQogICAgdm9pZCBSZXNldEFDQ19OQVRJVkUoKSAg ICAgICB7IGFjY2Vzc19mbGFncyAmPSAofiAweDAxMDApOyB9CiAgICB2b2lkIFJlc2V0QUNDX0lO VEVSRkFDRSgpICAgIHsgYWNjZXNzX2ZsYWdzICY9ICh+IDB4MDIwMCk7IH0KICAgIHZvaWQgUmVz ZXRBQ0NfQUJTVFJBQ1QoKSAgICAgeyBhY2Nlc3NfZmxhZ3MgJj0gKH4gMHgwNDAwKTsgfQogICAg dm9pZCBSZXNldEFDQ19TVFJJQ1RGUCgpICAgICB7IGFjY2Vzc19mbGFncyAmPSAofiAweDA4MDAp OyB9CgogICAgdm9pZCBSZXNldEZsYWdzKCkgeyBhY2Nlc3NfZmxhZ3MgPSAwOyB9CiAgICB2b2lk IFNldEZsYWdzKHUyIGFjY2Vzc19mbGFnc18pIHsgYWNjZXNzX2ZsYWdzID0gYWNjZXNzX2ZsYWdz XzsgfQogICAgdm9pZCBTZXRGbGFncyhBY2Nlc3NGbGFncyBhZikgIHsgdGhpcyAtPiBhY2Nlc3Nf ZmxhZ3MgPSBhZi5hY2Nlc3NfZmxhZ3M7IH0KICAgIHUyIEZsYWdzKCkgeyByZXR1cm4gYWNjZXNz X2ZsYWdzOyB9CgogICAgQWNjZXNzRmxhZ3MoKSA6IGFjY2Vzc19mbGFncygwKSB7fQogICAgQWNj ZXNzRmxhZ3ModTImIF9hY2Nlc3NfZmxhZ3MpIDogYWNjZXNzX2ZsYWdzKF9hY2Nlc3NfZmxhZ3Mp IHt9CgojIDk3ICIuLi8uLi9qaWtlcy9zcmMvYWNjZXNzLmgiCgp9OwoKCgoKCgoKIyAxOSAiLi4v Li4vamlrZXMvc3JjL3N5bWJvbC5oIiAyCgoKIyAxICIuLi8uLi9qaWtlcy9zcmMvY2FzZS5oIiAx CiAKIAogCiAKIAogCiAKIAogCgoKCgoKCiAKCgoKCgoKCgoKCiAKIAogCiAKIAogCiAKY2xhc3Mg Q2FzZQp7CiAgICBzdGF0aWMgY2hhciBsb3dlclsxMjhdOwogICAgc3RhdGljIGNoYXIgdXBwZXJb MTI4XTsKCnB1YmxpYzoKCiAgICBzdGF0aWMgaW5saW5lIGJvb2wgSXNBc2NpaUxvd2VyKGNoYXIg YykgICAgICAgeyByZXR1cm4gYyA9PSBsb3dlcltjXTsgfQogICAgc3RhdGljIGlubGluZSBjaGFy IFRvQXNjaWlMb3dlcihjaGFyIGMpICAgICAgIHsgcmV0dXJuIChjICYgKGNoYXIpIDB4ODApID8g YyA6IGxvd2VyW2NdOyB9CiAgICBzdGF0aWMgaW5saW5lIHdjaGFyX3QgVG9Bc2NpaUxvd2VyKHdj aGFyX3QgYykgeyByZXR1cm4gKGMgPCAxMjggPyAod2NoYXJfdCkgbG93ZXJbY10gOiBjKTsgfQoK ICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBJc0FzY2lpVXBwZXIoY2hhciBjKSAgICAgICB7IHJldHVy biBjID09IHVwcGVyW2NdOyB9CiAgICBzdGF0aWMgaW5saW5lIGNoYXIgVG9Bc2NpaVVwcGVyKGNo YXIgYykgICAgICAgeyByZXR1cm4gKGMgJiAoY2hhcikgMHg4MCkgPyBjIDogdXBwZXJbY107IH0K ICAgIHN0YXRpYyBpbmxpbmUgd2NoYXJfdCBUb0FzY2lpVXBwZXIod2NoYXJfdCBjKSB7IHJldHVy biAoYyA8IDEyOCA/ICh3Y2hhcl90KSB1cHBlcltjXSA6IGMpOyB9CgogICAgc3RhdGljIGlubGlu ZSBib29sIElzQXNjaWlBbHBoYShjaGFyIGMpICAgIHsgcmV0dXJuIChjID09IGxvd2VyW2NdIHx8 IGMgPT0gdXBwZXJbY10pOyB9CiAgICBzdGF0aWMgaW5saW5lIGJvb2wgSXNBc2NpaUFscGhhKHdj aGFyX3QgYykgeyByZXR1cm4gKGMgPT0gbG93ZXJbY10gfHwgYyA9PSB1cHBlcltjXSk7IH0KCiAg ICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBzdGF0aWMgaW5saW5lIGludCBJbmRleChjaGFyICpz LCB3Y2hhcl90IGMpCiAgICB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7ICpzICE9IFVfTlVMTDsg aSsrLCBzKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoKnMgPT0gYykKICAgICAgICAgICAg ICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgc3Rh dGljIGlubGluZSBpbnQgSW5kZXgod2NoYXJfdCAqcywgd2NoYXJfdCBjKQogICAgewogICAgICAg IGZvciAoaW50IGkgPSAwOyAqcyAhPSBVX05VTEw7IGkrKywgcysrKQogICAgICAgIHsKICAgICAg ICAgICAgaWYgKCpzID09IGMpCiAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAg ICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAg ICAKICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBTdHJpbmdTZWdtZW50RXF1YWwoY2hhciAqczEsIGNv bnN0IGNoYXIgKnMyLCBpbnQgbikKICAgIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47 IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChUb0FzY2lpTG93ZXIoczFbaV0pICE9IFRv QXNjaWlMb3dlcihzMltpXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAg fQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBTdHJp bmdTZWdtZW50RXF1YWwod2NoYXJfdCAqczEsIGNvbnN0IGNoYXIgKnMyLCBpbnQgbikKICAgIHsK ICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICB7CiAgICAgICAgICAg IGlmIChUb0FzY2lpTG93ZXIoczFbaV0pICE9IFRvQXNjaWlMb3dlcihzMltpXSkpCiAgICAgICAg ICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAg fQoKICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBTdHJpbmdTZWdtZW50RXF1YWwoY2hhciAqczEsIGNv bnN0IHdjaGFyX3QgKnMyLCBpbnQgbikKICAgIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8 IG47IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChUb0FzY2lpTG93ZXIoczFbaV0pICE9 IFRvQXNjaWlMb3dlcihzMltpXSkpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAg ICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBT dHJpbmdTZWdtZW50RXF1YWwod2NoYXJfdCAqczEsIGNvbnN0IHdjaGFyX3QgKnMyLCBpbnQgbikK ICAgIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICB7CiAgICAg ICAgICAgIGlmIChUb0FzY2lpTG93ZXIoczFbaV0pICE9IFRvQXNjaWlMb3dlcihzMltpXSkpCiAg ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVl OwogICAgfQoKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBzdGF0aWMgaW5saW5lIGJvb2wg U3RyaW5nRXF1YWwoY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQogICAgewogICAgICAgIGludCBp OwogICAgICAgIGZvciAoaSA9IDA7IHMxW2ldICYmIHMyW2ldOyBpKyspCiAgICAgICAgewogICAg ICAgICAgICBpZiAoVG9Bc2NpaUxvd2VyKHMxW2ldKSAhPSBUb0FzY2lpTG93ZXIoczJbaV0pKQog ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHMx W2ldID09IHMyW2ldKTsKICAgIH0KCiAgICBzdGF0aWMgaW5saW5lIGJvb2wgU3RyaW5nRXF1YWwo d2NoYXJfdCAqczEsIGNvbnN0IGNoYXIgKnMyKQogICAgewogICAgICAgIGludCBpOwogICAgICAg IGZvciAoaSA9IDA7IHMxW2ldICYmIHMyW2ldOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBp ZiAoVG9Bc2NpaUxvd2VyKHMxW2ldKSAhPSBUb0FzY2lpTG93ZXIoczJbaV0pKQogICAgICAgICAg ICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHMxW2ldID09IHMy W2ldKTsKICAgIH0KCiAgICBzdGF0aWMgaW5saW5lIGJvb2wgU3RyaW5nRXF1YWwoY2hhciAqczEs IGNvbnN0IHdjaGFyX3QgKnMyKQogICAgewogICAgICAgIGludCBpOwogICAgICAgIGZvciAoaSA9 IDA7IHMxW2ldICYmIHMyW2ldOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoVG9Bc2Np aUxvd2VyKHMxW2ldKSAhPSBUb0FzY2lpTG93ZXIoczJbaV0pKQogICAgICAgICAgICAgICAgcmV0 dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHMxW2ldID09IHMyW2ldKTsKICAg IH0KCiAgICBzdGF0aWMgaW5saW5lIGJvb2wgU3RyaW5nRXF1YWwod2NoYXJfdCAqczEsIGNvbnN0 IHdjaGFyX3QgKnMyKQogICAgewogICAgICAgIGludCBpOwogICAgICAgIGZvciAoaSA9IDA7IHMx W2ldICYmIHMyW2ldOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoVG9Bc2NpaUxvd2Vy KHMxW2ldKSAhPSBUb0FzY2lpTG93ZXIoczJbaV0pKQogICAgICAgICAgICAgICAgcmV0dXJuIGZh bHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHMxW2ldID09IHMyW2ldKTsKICAgIH0KCiAK IAogCiAKIAogCiAKIAogCiAKIAogCiAKfTsKCgoKCgoKCiMgMjEgIi4uLy4uL2ppa2VzL3NyYy9z eW1ib2wuaCIgMgoKCgoKCgpjbGFzcyBTZW1hbnRpYzsKY2xhc3MgU2VtYW50aWNFbnZpcm9ubWVu dDsKY2xhc3MgQXN0OwpjbGFzcyBBc3RDb21waWxhdGlvblVuaXQ7CmNsYXNzIEFzdE1ldGhvZERl Y2xhcmF0b3I7CmNsYXNzIEFzdEJsb2NrOwpjbGFzcyBBc3RMaXN0OwpjbGFzcyBBc3RFeHByZXNz aW9uOwpjbGFzcyBBc3RWYXJpYWJsZURlY2xhcmF0b3I7CmNsYXNzIEV4cGFuZGVkVHlwZVRhYmxl OwpjbGFzcyBFeHBhbmRlZEZpZWxkVGFibGU7CmNsYXNzIEV4cGFuZGVkTWV0aG9kVGFibGU7CmNs YXNzIFN5bWJvbFRhYmxlOwpjbGFzcyBTeW1ib2xTZXQ7CmNsYXNzIFN5bWJvbE1hcDsKY2xhc3Mg WmlwOwoKY2xhc3MgUGFja2FnZVN5bWJvbDsKCmNsYXNzIFBhdGhTeW1ib2wgOiBwdWJsaWMgU3lt Ym9sCnsKcHVibGljOgogICAgTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2w7CiAgICBaaXAgKnppcGZp bGU7CgogICAgUGF0aFN5bWJvbChOYW1lU3ltYm9sICopOwogICAgdmlydHVhbCB+UGF0aFN5bWJv bCgpOwoKICAgIHZpcnR1YWwgd2NoYXJfdCAqTmFtZSgpIHsgcmV0dXJuIG5hbWVfc3ltYm9sIC0+ IE5hbWUoKTsgfQogICAgdmlydHVhbCBzaXplX3QgTmFtZUxlbmd0aCgpIHsgcmV0dXJuIG5hbWVf c3ltYm9sIC0+IE5hbWVMZW5ndGgoKTsgfQogICAgdmlydHVhbCBOYW1lU3ltYm9sICpJZGVudGl0 eSgpIHsgcmV0dXJuIG5hbWVfc3ltYm9sOyB9CiAgICBjaGFyICpVdGY4TmFtZSgpIHsgcmV0dXJu IChjaGFyICopIChuYW1lX3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgPyBuYW1lX3N5bWJvbCAtPiBV dGY4X2xpdGVyYWwgLT4gdmFsdWUgOiBfX251bGwgKTsgfQogICAgaW50IFV0ZjhOYW1lTGVuZ3Ro KCkgeyByZXR1cm4gKG5hbWVfc3ltYm9sIC0+IFV0ZjhfbGl0ZXJhbCA/IG5hbWVfc3ltYm9sIC0+ IFV0ZjhfbGl0ZXJhbCAtPiBsZW5ndGggOiAwKTsgfQoKICAgIGlubGluZSBib29sIElzWmlwKCkg eyByZXR1cm4gemlwZmlsZSAhPSBfX251bGwgOyB9CgogICAgaW5saW5lIERpcmVjdG9yeVN5bWJv bCAqUm9vdERpcmVjdG9yeSgpIHsgcmV0dXJuIHJvb3RfZGlyZWN0b3J5OyB9Cgpwcml2YXRlOgog ICAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlOwogICAgRGlyZWN0b3J5U3ltYm9sICpyb290X2Rp cmVjdG9yeTsKfTsKCgpjbGFzcyBEaXJlY3RvcnlTeW1ib2wgOiBwdWJsaWMgU3ltYm9sCnsKcHVi bGljOgogICAgU3ltYm9sICpvd25lcjsKICAgIE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sOwoKICAg IFR1cGxlPERpcmVjdG9yeVN5bWJvbCAqPiBzdWJkaXJlY3RvcmllczsKCiAgICBEaXJlY3RvcnlT eW1ib2woTmFtZVN5bWJvbCAqLCBTeW1ib2wgKiwgYm9vbCBzb3VyY2VfZGlyX29ubHkpOwogICAg dmlydHVhbCB+RGlyZWN0b3J5U3ltYm9sKCk7CgogICAgdmlydHVhbCB3Y2hhcl90ICpOYW1lKCkg eyByZXR1cm4gbmFtZV9zeW1ib2wgLT4gTmFtZSgpOyB9CiAgICB2aXJ0dWFsIHNpemVfdCBOYW1l TGVuZ3RoKCkgeyByZXR1cm4gbmFtZV9zeW1ib2wgLT4gTmFtZUxlbmd0aCgpOyB9CiAgICB2aXJ0 dWFsIE5hbWVTeW1ib2wgKklkZW50aXR5KCkgeyByZXR1cm4gbmFtZV9zeW1ib2w7IH0KICAgIGNo YXIgKlV0ZjhOYW1lKCkgeyByZXR1cm4gKGNoYXIgKikgKG5hbWVfc3ltYm9sIC0+IFV0ZjhfbGl0 ZXJhbCA/IG5hbWVfc3ltYm9sIC0+IFV0ZjhfbGl0ZXJhbCAtPiB2YWx1ZSA6IF9fbnVsbCApOyB9 CiAgICBpbnQgVXRmOE5hbWVMZW5ndGgoKSB7IHJldHVybiAobmFtZV9zeW1ib2wgLT4gVXRmOF9s aXRlcmFsID8gbmFtZV9zeW1ib2wgLT4gVXRmOF9saXRlcmFsIC0+IGxlbmd0aCA6IDApOyB9CiAg ICBib29sIElzU291cmNlRGlyZWN0b3J5KCkgeyByZXR1cm4gc291cmNlX2Rpcl9vbmx5OyB9Cgog ICAgRGlyZWN0b3J5RW50cnkgKkZpbmRFbnRyeShjaGFyICpuYW1lLCBpbnQgbGVuKSB7IHJldHVy biAoZW50cmllcyA/IGVudHJpZXMgLT4gRmluZEVudHJ5KG5hbWUsIGxlbikgOiAoRGlyZWN0b3J5 RW50cnkgKikgX19udWxsICk7IH0KCiMgMTA2ICIuLi8uLi9qaWtlcy9zcmMvc3ltYm9sLmgiCgoK ICAgIFBhdGhTeW1ib2wgKlBhdGhTeW0oKQogICAgewogICAgICAgIHJldHVybiAob3duZXIgLT4g UGF0aENhc3QoKSA/IChQYXRoU3ltYm9sICopIG93bmVyIDogKChEaXJlY3RvcnlTeW1ib2wgKikg b3duZXIpIC0+IFBhdGhTeW0oKSk7CiAgICB9CgogICAgaW5saW5lIGJvb2wgSXNaaXAoKSB7IHJl dHVybiBQYXRoU3ltKCkgLT4gSXNaaXAoKTsgfQoKICAgIHZvaWQgU2V0RGlyZWN0b3J5TmFtZSgp OwogICAgaW5saW5lIGNoYXIgKkRpcmVjdG9yeU5hbWUoKQogICAgewogICAgICAgIGlmICghIGRp cmVjdG9yeV9uYW1lKQogICAgICAgICAgICBTZXREaXJlY3RvcnlOYW1lKCk7CiAgICAgICAgcmV0 dXJuIGRpcmVjdG9yeV9uYW1lOwogICAgfQogICAgaW5saW5lIHNpemVfdCBEaXJlY3RvcnlOYW1l TGVuZ3RoKCkKICAgIHsKICAgICAgICBpZiAoISBkaXJlY3RvcnlfbmFtZSkKICAgICAgICAgICAg U2V0RGlyZWN0b3J5TmFtZSgpOwogICAgICAgIHJldHVybiBkaXJlY3RvcnlfbmFtZV9sZW5ndGg7 CiAgICB9CgogICAgaW5saW5lIERpcmVjdG9yeVN5bWJvbCAqSW5zZXJ0RGlyZWN0b3J5U3ltYm9s KE5hbWVTeW1ib2wgKiwgYm9vbCk7CiAgICBpbmxpbmUgRGlyZWN0b3J5U3ltYm9sICpGaW5kRGly ZWN0b3J5U3ltYm9sKE5hbWVTeW1ib2wgKik7CgogICAgaW5saW5lIEZpbGVTeW1ib2wgKkluc2Vy dEZpbGVTeW1ib2woTmFtZVN5bWJvbCAqKTsKICAgIGlubGluZSBGaWxlU3ltYm9sICpGaW5kRmls ZVN5bWJvbChOYW1lU3ltYm9sICopOwoKICAgIHZvaWQgUmVzZXREaXJlY3RvcnkoKTsKCiAgICB2 b2lkIFJlYWREaXJlY3RvcnkoKTsKCnByaXZhdGU6CgogICAgdGltZV90IG10aW1lOwoKICAgIFN5 bWJvbFRhYmxlICp0YWJsZTsKICAgIGlubGluZSBTeW1ib2xUYWJsZSAqVGFibGUoKTsKCiAgICBE aXJlY3RvcnlUYWJsZSAqZW50cmllczsKICAgIGNoYXIgKmRpcmVjdG9yeV9uYW1lOwogICAgc2l6 ZV90IGRpcmVjdG9yeV9uYW1lX2xlbmd0aDsKCiAgICBib29sIHNvdXJjZV9kaXJfb25seTsKfTsK CgpjbGFzcyBGaWxlU3ltYm9sIDogcHVibGljIFN5bWJvbAp7CnByaXZhdGU6CiAgICBlbnVtIEZp bGVLaW5kCiAgICB7CiAgICAgICAgSkFWQSwKICAgICAgICBDTEFTUywKICAgICAgICBDTEFTU19P TkxZCiAgICB9OwoKICAgIERpcmVjdG9yeVN5bWJvbCAqb3V0cHV0X2RpcmVjdG9yeTsKICAgIGNo YXIgKmZpbGVfbmFtZTsKICAgIHNpemVfdCBmaWxlX25hbWVfbGVuZ3RoOwogICAgVXRmOExpdGVy YWxWYWx1ZSAqZmlsZV9uYW1lX2xpdGVyYWw7CgpwdWJsaWM6CiAgICBOYW1lU3ltYm9sICpuYW1l X3N5bWJvbDsKICAgIERpcmVjdG9yeVN5bWJvbCAqZGlyZWN0b3J5X3N5bWJvbDsKICAgIFBhY2th Z2VTeW1ib2wgKnBhY2thZ2U7CiAgICBGaWxlS2luZCBraW5kOwoKICAgICAKICAgICAKICAgICAK ICAgIHU0IHVuY29tcHJlc3NlZF9zaXplOwogICAgdTQgZGF0ZV90aW1lOwogICAgbG9uZyBvZmZz ZXQ7CgogICAgIAogICAgIAogICAgIAogICAgdGltZV90IG10aW1lOwoKICAgICAKICAgICAKICAg ICAKCiAgICAgCiAgICAgCiAgICBjaGFyICpidWZmZXI7CgogICAgTGV4U3RyZWFtICpsZXhfc3Ry ZWFtOwogICAgQXN0Q29tcGlsYXRpb25Vbml0ICpjb21waWxhdGlvbl91bml0OwogICAgU2VtYW50 aWMgKnNlbWFudGljOwoKICAgIFR1cGxlPFR5cGVTeW1ib2wgKj4gdHlwZXM7CgogICAgRmlsZVN5 bWJvbChOYW1lU3ltYm9sICpuYW1lX3N5bWJvbF8pIDogb3V0cHV0X2RpcmVjdG9yeShfX251bGwg KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZShf X251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVf bmFtZV9saXRlcmFsKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgbmFtZV9zeW1ib2wobmFtZV9zeW1ib2xfKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeV9zeW1ib2woX19udWxsICksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlKF9fbnVsbCApLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRpbWUoMCksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIoX19udWxsICksCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXhfc3RyZWFtKF9fbnVsbCAp LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsYXRpb25f dW5pdChfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHNlbWFudGljKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdHlwZXMoNCkKICAgIHsKICAgICAgICAgU3ltYm9sOjpfa2luZCA9IF9GSUxFOwogICAg fQoKICAgIHZpcnR1YWwgfkZpbGVTeW1ib2woKQogICAgewogICAgICAgIGRlbGV0ZSBbXSBmaWxl X25hbWU7CiAgICAgICAgZGVsZXRlIFtdIGJ1ZmZlcjsKICAgICAgICBkZWxldGUgbGV4X3N0cmVh bTsKICAgIH0KCiAgICBGaWxlU3ltYm9sICpDbG9uZSgpCiAgICB7CiAgICAgICAgRmlsZVN5bWJv bCAqY2xvbmUgPSBuZXcgRmlsZVN5bWJvbChuYW1lX3N5bWJvbCk7CgogICAgICAgIGNsb25lIC0+ IGtpbmQgPSBraW5kOwogICAgICAgIGNsb25lIC0+IGRpcmVjdG9yeV9zeW1ib2wgPSBkaXJlY3Rv cnlfc3ltYm9sOwogICAgICAgIGNsb25lIC0+IG10aW1lID0gbXRpbWU7CgogICAgICAgIHJldHVy biBjbG9uZTsKICAgIH0KCiAgICB2aXJ0dWFsIHdjaGFyX3QgKk5hbWUoKSB7IHJldHVybiBuYW1l X3N5bWJvbCAtPiBOYW1lKCk7IH0KICAgIHZpcnR1YWwgc2l6ZV90IE5hbWVMZW5ndGgoKSB7IHJl dHVybiBuYW1lX3N5bWJvbCAtPiBOYW1lTGVuZ3RoKCk7IH0KICAgIHZpcnR1YWwgTmFtZVN5bWJv bCAqSWRlbnRpdHkoKSB7IHJldHVybiBuYW1lX3N5bWJvbDsgfQogICAgY2hhciAqVXRmOE5hbWUo KSB7IHJldHVybiAoY2hhciAqKSAobmFtZV9zeW1ib2wgLT4gVXRmOF9saXRlcmFsID8gbmFtZV9z eW1ib2wgLT4gVXRmOF9saXRlcmFsIC0+IHZhbHVlIDogX19udWxsICk7IH0KICAgIGludCBVdGY4 TmFtZUxlbmd0aCgpIHsgcmV0dXJuIChuYW1lX3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgPyBuYW1l X3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgLT4gbGVuZ3RoIDogMCk7IH0KCiAgICBpbmxpbmUgdm9p ZCBTZXRKYXZhKCkgICAgICAgeyBraW5kID0gSkFWQTsgfQogICAgaW5saW5lIHZvaWQgU2V0Q2xh c3MoKSAgICAgIHsga2luZCA9IENMQVNTOyB9CiAgICBpbmxpbmUgdm9pZCBTZXRDbGFzc09ubHko KSAgeyBraW5kID0gQ0xBU1NfT05MWTsgfQoKICAgIGlubGluZSBib29sIElzSmF2YSgpICAgICAg IHsgcmV0dXJuIGtpbmQgPT0gSkFWQTsgfQogICAgaW5saW5lIGJvb2wgSXNDbGFzcygpICAgICAg eyByZXR1cm4ga2luZCA+PSBDTEFTUzsgfQogICAgaW5saW5lIGJvb2wgSXNDbGFzc09ubHkoKSAg eyByZXR1cm4ga2luZCA9PSBDTEFTU19PTkxZOyB9CgogICAgUGF0aFN5bWJvbCAqUGF0aFN5bSgp CiAgICB7CiAgICAgICAgcmV0dXJuIGRpcmVjdG9yeV9zeW1ib2wgLT4gUGF0aFN5bSgpOwogICAg fQogICAgaW5saW5lIGJvb2wgSXNaaXAoKSB7IHJldHVybiBQYXRoU3ltKCkgLT4gSXNaaXAoKTsg fQogICAgaW5saW5lIFppcCAqWmlwZmlsZSgpIHsgcmV0dXJuIFBhdGhTeW0oKSAtPiB6aXBmaWxl OyB9CgogICAgc3RhdGljIGNoYXIgKmphdmFfc3VmZml4OwogICAgc3RhdGljIGludCBqYXZhX3N1 ZmZpeF9sZW5ndGg7CiAgICBzdGF0aWMgY2hhciAqY2xhc3Nfc3VmZml4OwogICAgc3RhdGljIGlu dCBjbGFzc19zdWZmaXhfbGVuZ3RoOwogICAgc3RhdGljIGlubGluZSBib29sIElzSmF2YVN1ZmZp eChjaGFyICpwdHIpOwogICAgc3RhdGljIGlubGluZSBib29sIElzQ2xhc3NTdWZmaXgoY2hhciAq cHRyKTsKCiAgICBpbmxpbmUgY2hhciAqRmlsZU5hbWUoKQogICAgewogICAgICAgIGlmICghIGZp bGVfbmFtZSkKICAgICAgICAgICAgU2V0RmlsZU5hbWUoKTsKICAgICAgICByZXR1cm4gZmlsZV9u YW1lOwogICAgfQogICAgaW5saW5lIGludCBGaWxlTmFtZUxlbmd0aCgpCiAgICB7CiAgICAgICAg aWYgKCEgZmlsZV9uYW1lKQogICAgICAgICAgICBTZXRGaWxlTmFtZSgpOwogICAgICAgIHJldHVy biBmaWxlX25hbWVfbGVuZ3RoOwogICAgfQoKICAgIGlubGluZSBVdGY4TGl0ZXJhbFZhbHVlICpG aWxlTmFtZUxpdGVyYWwoKSB7IChzdGF0aWNfY2FzdDx2b2lkPiAgKCggZmlsZV9uYW1lX2xpdGVy YWwgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImZpbGVfbmFtZV9saXRlcmFsIiAsICIuLi8uLi9q aWtlcy9zcmMvc3ltYm9sLmgiLCAyNzYsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7IHJl dHVybiBmaWxlX25hbWVfbGl0ZXJhbDsgfQoKICAgIHZvaWQgU2V0RmlsZU5hbWVMaXRlcmFsKENv bnRyb2wgKik7CgogICAgRGlyZWN0b3J5U3ltYm9sICpPdXRwdXREaXJlY3RvcnkoKTsKCiAgICB2 b2lkIFNldEZpbGVOYW1lKCk7CgogICAgdm9pZCBDbGVhblVwKCk7CgogICAgdm9pZCBSZXNldCgp CiAgICB7CiAgICAgICAgQ2xlYW5VcCgpOwoKICAgICAgICBkZWxldGUgW10gZmlsZV9uYW1lOwog ICAgICAgIGZpbGVfbmFtZSA9IF9fbnVsbCA7CiAgICAgICAgdHlwZXMuUmVzZXQoKTsKICAgIH0K fTsKCgpjbGFzcyBGaWxlTG9jYXRpb24KewpwdWJsaWM6CiAgICB3Y2hhcl90ICpsb2NhdGlvbjsK CiAgICBGaWxlTG9jYXRpb24gKExleFN0cmVhbSAqbGV4X3N0cmVhbSwgTGV4U3RyZWFtOjpUb2tl bkluZGV4IHRva2VuX2luZGV4KQogICAgewogICAgICAgIGNoYXIgKmZpbGVfbmFtZSA9IGxleF9z dHJlYW0gLT4gRmlsZU5hbWUoKTsKICAgICAgICBpbnQgbGVuZ3RoID0gbGV4X3N0cmVhbSAtPiBG aWxlTmFtZUxlbmd0aCgpOwogICAgICAgIGxvY2F0aW9uID0gbmV3IHdjaGFyX3RbbGVuZ3RoICsg MTNdOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAg ICAgbG9jYXRpb25baV0gPSAod2NoYXJfdCkgZmlsZV9uYW1lW2ldOwogICAgICAgIH0KICAgICAg ICBsb2NhdGlvbltsZW5ndGgrK10gPSBVX0NPTE9OOwoKICAgICAgICBJbnRUb1dzdHJpbmcgbGlu ZV9ubyhsZXhfc3RyZWFtIC0+IExpbmUodG9rZW5faW5kZXgpKTsKCiAgICAgICAgZm9yIChpbnQg aiA9IDA7IGogPCBsaW5lX25vLkxlbmd0aCgpOyBqKyspCiAgICAgICAgICAgIGxvY2F0aW9uW2xl bmd0aCsrXSA9IGxpbmVfbm8uU3RyaW5nKClbal07CiAgICAgICAgbG9jYXRpb25bbGVuZ3RoXSA9 IFVfTlVMTDsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIEZpbGVMb2NhdGlvbiAoRmlsZVN5 bWJvbCAqZmlsZV9zeW1ib2wpCiAgICB7CiAgICAgICAgY2hhciAqZmlsZV9uYW1lID0gZmlsZV9z eW1ib2wgLT4gRmlsZU5hbWUoKTsKICAgICAgICBpbnQgbGVuZ3RoID0gZmlsZV9zeW1ib2wgLT4g RmlsZU5hbWVMZW5ndGgoKTsKICAgICAgICBsb2NhdGlvbiA9IG5ldyB3Y2hhcl90W2xlbmd0aCAr IDEzXTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAg ICAgIGxvY2F0aW9uW2ldID0gKHdjaGFyX3QpIGZpbGVfbmFtZVtpXTsKICAgICAgICB9CiAgICAg ICAgbG9jYXRpb25bbGVuZ3RoXSA9IFVfTlVMTDsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAg IH5GaWxlTG9jYXRpb24oKQogICAgewogICAgICAgIGRlbGV0ZSBbXSBsb2NhdGlvbjsKICAgIH0K fTsKCgpjbGFzcyBQYWNrYWdlU3ltYm9sIDogcHVibGljIFN5bWJvbAp7CnB1YmxpYzoKICAgIFR1 cGxlPERpcmVjdG9yeVN5bWJvbCAqPiBkaXJlY3Rvcnk7CiAgICBQYWNrYWdlU3ltYm9sICpvd25l cjsKCiAgICBQYWNrYWdlU3ltYm9sKE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sXywgUGFja2FnZVN5 bWJvbCAqb3duZXJfKSA6IGRpcmVjdG9yeSg0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIob3duZXJfKSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgbmFtZV9zeW1ib2wobmFtZV9zeW1ib2xfKSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUo X19udWxsICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZShfX251bGwgKQogICAgewogICAgICAg IFN5bWJvbDo6X2tpbmQgPSBQQUNLQUdFOwogICAgfQoKICAgIHZpcnR1YWwgflBhY2thZ2VTeW1i b2woKTsKCiAgICB2aXJ0dWFsIHdjaGFyX3QgKk5hbWUoKSB7IHJldHVybiBuYW1lX3N5bWJvbCAt PiBOYW1lKCk7IH0KICAgIHZpcnR1YWwgc2l6ZV90IE5hbWVMZW5ndGgoKSB7IHJldHVybiBuYW1l X3N5bWJvbCAtPiBOYW1lTGVuZ3RoKCk7IH0KICAgIHZpcnR1YWwgTmFtZVN5bWJvbCAqSWRlbnRp dHkoKSB7IHJldHVybiBuYW1lX3N5bWJvbDsgfQogICAgY2hhciAqVXRmOE5hbWUoKSB7IHJldHVy biAoY2hhciAqKSAobmFtZV9zeW1ib2wgLT4gVXRmOF9saXRlcmFsID8gbmFtZV9zeW1ib2wgLT4g VXRmOF9saXRlcmFsIC0+IHZhbHVlIDogX19udWxsICk7IH0KICAgIGludCBVdGY4TmFtZUxlbmd0 aCgpIHsgcmV0dXJuIChuYW1lX3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgPyBuYW1lX3N5bWJvbCAt PiBVdGY4X2xpdGVyYWwgLT4gbGVuZ3RoIDogMCk7IH0KICAgICAKCiAgICB2b2lkIFNldFBhY2th Z2VOYW1lKCk7CiAgICAgCiAgICB3Y2hhcl90ICpQYWNrYWdlTmFtZSgpCiAgICB7CiAgICAgICAg aWYgKCEgcGFja2FnZV9uYW1lKQogICAgICAgICAgICBTZXRQYWNrYWdlTmFtZSgpOwogICAgICAg IHJldHVybiBwYWNrYWdlX25hbWU7CiAgICB9CiAgICBpbnQgUGFja2FnZU5hbWVMZW5ndGgoKQog ICAgewogICAgICAgIGlmICghIHBhY2thZ2VfbmFtZSkKICAgICAgICAgICAgU2V0UGFja2FnZU5h bWUoKTsKICAgICAgICByZXR1cm4gcGFja2FnZV9uYW1lX2xlbmd0aDsKICAgIH0KCiAgICBpbmxp bmUgUGFja2FnZVN5bWJvbCAqRmluZFBhY2thZ2VTeW1ib2woTmFtZVN5bWJvbCAqKTsKICAgIGlu bGluZSBQYWNrYWdlU3ltYm9sICpJbnNlcnRQYWNrYWdlU3ltYm9sKE5hbWVTeW1ib2wgKik7Cgog ICAgaW5saW5lIFR5cGVTeW1ib2wgKkZpbmRUeXBlU3ltYm9sKE5hbWVTeW1ib2wgKik7CiAgICBp bmxpbmUgVHlwZVN5bWJvbCAqSW5zZXJ0U3lzdGVtVHlwZVN5bWJvbChOYW1lU3ltYm9sICopOwog ICAgaW5saW5lIFR5cGVTeW1ib2wgKkluc2VydE91dGVyVHlwZVN5bWJvbChOYW1lU3ltYm9sICop OwogICAgaW5saW5lIHZvaWQgRGVsZXRlVHlwZVN5bWJvbChUeXBlU3ltYm9sICopOwoKcHJpdmF0 ZToKCiAgICBOYW1lU3ltYm9sICpuYW1lX3N5bWJvbDsKICAgIFN5bWJvbFRhYmxlICp0YWJsZTsK ICAgIGlubGluZSBTeW1ib2xUYWJsZSAqVGFibGUoKTsKCiAgICB3Y2hhcl90ICpwYWNrYWdlX25h bWU7CiAgICBzaXplX3QgcGFja2FnZV9uYW1lX2xlbmd0aDsKfTsKCgpjbGFzcyBNZXRob2RTeW1i b2wgOiBwdWJsaWMgU3ltYm9sLCBwdWJsaWMgQWNjZXNzRmxhZ3MKewpwdWJsaWM6CiAgICBBc3Qg Km1ldGhvZF9vcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbjsgIAogICAgTmFtZVN5bWJvbCAqbmFt ZV9zeW1ib2w7CiAgICBUeXBlU3ltYm9sICpjb250YWluaW5nX3R5cGU7CiAgICBCbG9ja1N5bWJv bCAqYmxvY2tfc3ltYm9sOwogICAgTWV0aG9kU3ltYm9sICpuZXh0X21ldGhvZDsKICAgIFV0ZjhM aXRlcmFsVmFsdWUgKnNpZ25hdHVyZTsKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAg ICAgCiAgICBpbnQgTnVtSW5pdGlhbGl6ZXJDb25zdHJ1Y3RvcnMoKQogICAgewogICAgICAgIHJl dHVybiAoaW5pdGlhbGl6ZXJfY29uc3RydWN0b3JzID8gaW5pdGlhbGl6ZXJfY29uc3RydWN0b3Jz IC0+IExlbmd0aCgpIDogMCk7CiAgICB9CiAgICBNZXRob2RTeW1ib2wgKkluaXRpYWxpemVyQ29u c3RydWN0b3IoaW50IGkpCiAgICB7CiAgICAgICAgcmV0dXJuICgqaW5pdGlhbGl6ZXJfY29uc3Ry dWN0b3JzKVtpXTsKICAgIH0KICAgIHZvaWQgQWRkSW5pdGlhbGl6ZXJDb25zdHJ1Y3RvcihNZXRo b2RTeW1ib2wgKm1ldGhvZCkKICAgIHsKICAgICAgICBpZiAoISBpbml0aWFsaXplcl9jb25zdHJ1 Y3RvcnMpCiAgICAgICAgICAgIGluaXRpYWxpemVyX2NvbnN0cnVjdG9ycyA9IG5ldyBUdXBsZTxN ZXRob2RTeW1ib2wgKj4oOCk7CiAgICAgICAgaW5pdGlhbGl6ZXJfY29uc3RydWN0b3JzIC0+IE5l eHQoKSA9IG1ldGhvZDsKICAgIH0KCiAgICBpbnQgbWF4X2Jsb2NrX2RlcHRoOwoKICAgICAKICAg ICAKICAgICAKICAgICAKICAgIFN5bWJvbCAqYWNjZXNzZWRfbWVtYmVyOwoKICAgIHZpcnR1YWwg d2NoYXJfdCAqTmFtZSgpIHsgcmV0dXJuIG5hbWVfc3ltYm9sIC0+IE5hbWUoKTsgfQogICAgdmly dHVhbCBzaXplX3QgTmFtZUxlbmd0aCgpIHsgcmV0dXJuIG5hbWVfc3ltYm9sIC0+IE5hbWVMZW5n dGgoKTsgfQogICAgdmlydHVhbCBOYW1lU3ltYm9sICpJZGVudGl0eSgpIHsgcmV0dXJuIG5hbWVf c3ltYm9sOyB9CiAgICBjaGFyICpVdGY4TmFtZSgpIHsgcmV0dXJuIChjaGFyICopIChuYW1lX3N5 bWJvbCAtPiBVdGY4X2xpdGVyYWwgPyBuYW1lX3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgLT4gdmFs dWUgOiBfX251bGwgKTsgfQogICAgaW50IFV0ZjhOYW1lTGVuZ3RoKCkgeyByZXR1cm4gKG5hbWVf c3ltYm9sIC0+IFV0ZjhfbGl0ZXJhbCA/IG5hbWVfc3ltYm9sIC0+IFV0ZjhfbGl0ZXJhbCAtPiBs ZW5ndGggOiAwKTsgfQoKICAgIE1ldGhvZFN5bWJvbChOYW1lU3ltYm9sICpuYW1lX3N5bWJvbF8p IDogbWV0aG9kX29yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uKF9fbnVsbCApLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3N5bWJvbChuYW1lX3N5bWJv bF8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlu aW5nX3R5cGUoX19udWxsICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGJsb2NrX3N5bWJvbChfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbmV4dF9tZXRob2QoX19udWxsICksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZShfX251bGwgKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Jsb2NrX2RlcHRoKDEpLCAg CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBh Y2Nlc3NlZF9tZW1iZXIoX19udWxsICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGV4dGVybmFsX25hbWVfc3ltYm9sKF9fbnVsbCApLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMoMCksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcihfX251bGwgKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV8oX19udWxsICksCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hbF9wYXJhbWV0ZXJz KF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0 aHJvd3MoX19udWxsICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHRocm93c19zaWduYXR1cmVzKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplcl9jb25zdHJ1Y3RvcnMoX19udWxsICksCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2NvbnN0cnVj dG9yKF9fbnVsbCApCiAgICB7CiAgICAgICAgU3ltYm9sOjpfa2luZCA9IE1FVEhPRDsKICAgIH0K CiAgICB2aXJ0dWFsIH5NZXRob2RTeW1ib2woKTsKCiAgICBib29sIElzRmluYWwoKTsKCiAgICBi b29sIElzVHlwZWQoKQogICAgewogICAgICAgIHJldHVybiB0eXBlXyAhPSBfX251bGwgOwogICAg fQoKICAgIHZvaWQgU2V0VHlwZShUeXBlU3ltYm9sICpfdHlwZSkKICAgIHsKICAgICAgICB0eXBl XyA9IF90eXBlOwogICAgfQoKICAgIHZvaWQgUHJvY2Vzc01ldGhvZFNpZ25hdHVyZShTZW1hbnRp YyAqLCBMZXhTdHJlYW06OlRva2VuSW5kZXgpOwogICAgdm9pZCBQcm9jZXNzTWV0aG9kVGhyb3dz KFNlbWFudGljICosIExleFN0cmVhbTo6VG9rZW5JbmRleCk7CgogICAgVHlwZVN5bWJvbCAqVHlw ZSgpCiAgICB7CiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCB0eXBlXyApID8gMCA6CShf X2Fzc2VydF9mYWlsICgidHlwZV8iICwgIi4uLy4uL2ppa2VzL3NyYy9zeW1ib2wuaCIsIDQ4NSwg X19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsgIAogICAgICAgICAgICAgICAgICAgICAgICAK CiAgICAgICAgcmV0dXJuIHR5cGVfOwogICAgfQoKICAgIGludCBOdW1Gb3JtYWxQYXJhbWV0ZXJz KCkKICAgIHsKICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIHR5cGVfICkgPyAwIDoJKF9f YXNzZXJ0X2ZhaWwgKCJ0eXBlXyIgLCAiLi4vLi4vamlrZXMvc3JjL3N5bWJvbC5oIiwgNDkzLCBf X1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICByZXR1cm4gKGZvcm1hbF9wYXJh bWV0ZXJzID8gZm9ybWFsX3BhcmFtZXRlcnMgLT4gTGVuZ3RoKCkgOiAwKTsKICAgIH0KICAgIFZh cmlhYmxlU3ltYm9sICpGb3JtYWxQYXJhbWV0ZXIoaW50IGkpCiAgICB7CiAgICAgICAgcmV0dXJu ICgqZm9ybWFsX3BhcmFtZXRlcnMpW2ldOwogICAgfQogICAgdm9pZCBBZGRGb3JtYWxQYXJhbWV0 ZXIoVmFyaWFibGVTeW1ib2wgKnZhcmlhYmxlKQogICAgewogICAgICAgIGlmICghIGZvcm1hbF9w YXJhbWV0ZXJzKQogICAgICAgICAgICBmb3JtYWxfcGFyYW1ldGVycyA9IG5ldyBUdXBsZTxWYXJp YWJsZVN5bWJvbCAqPig4KTsKICAgICAgICBmb3JtYWxfcGFyYW1ldGVycyAtPiBOZXh0KCkgPSB2 YXJpYWJsZTsKICAgIH0KCiAgICBpbnQgTnVtVGhyb3dzKCkKICAgIHsKICAgICAgICAoc3RhdGlj X2Nhc3Q8dm9pZD4gICgoICEgdGhyb3dzX3NpZ25hdHVyZXMgKSA/IDAgOgkoX19hc3NlcnRfZmFp bCAoIiEgdGhyb3dzX3NpZ25hdHVyZXMiICwgIi4uLy4uL2ppa2VzL3NyYy9zeW1ib2wuaCIsIDUx MCwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICAgICAgcmV0dXJuICh0aHJvd3Mg PyB0aHJvd3MgLT4gTGVuZ3RoKCkgOiAwKTsKICAgIH0KICAgIFR5cGVTeW1ib2wgKlRocm93cyhp bnQgaSkKICAgIHsKICAgICAgICByZXR1cm4gKCp0aHJvd3MpW2ldOwogICAgfQogICAgdm9pZCBB ZGRUaHJvd3MoVHlwZVN5bWJvbCAqZXhjZXB0aW9uKQogICAgewogICAgICAgIGlmICghIHRocm93 cykKICAgICAgICAgICAgdGhyb3dzID0gbmV3IFR1cGxlPFR5cGVTeW1ib2wgKj4oOCk7CiAgICAg ICAgdGhyb3dzIC0+IE5leHQoKSA9IGV4Y2VwdGlvbjsKICAgIH0KCiAgICBpbnQgTnVtVGhyb3dz U2lnbmF0dXJlcygpCiAgICB7CiAgICAgICAgcmV0dXJuICh0aHJvd3Nfc2lnbmF0dXJlcyA/IHRo cm93c19zaWduYXR1cmVzIC0+IExlbmd0aCgpIDogMCk7CiAgICB9CiAgICBjaGFyICpUaHJvd3NT aWduYXR1cmUoaW50IGkpCiAgICB7CiAgICAgICAgcmV0dXJuICgqdGhyb3dzX3NpZ25hdHVyZXMp W2ldOwogICAgfQogICAgdm9pZCBBZGRUaHJvd3NTaWduYXR1cmUoY29uc3QgY2hhciAqc2lnbmF0 dXJlXywgaW50IGxlbmd0aCkKICAgIHsKICAgICAgICBjaGFyICpzaWduYXR1cmUgPSBuZXcgY2hh cltsZW5ndGggKyAxXTsKICAgICAgICBzdHJuY3B5KHNpZ25hdHVyZSwgc2lnbmF0dXJlXywgbGVu Z3RoKTsKICAgICAgICBzaWduYXR1cmVbbGVuZ3RoXSA9IFVfTlVMTDsKCiAgICAgICAgaWYgKCEg dGhyb3dzX3NpZ25hdHVyZXMpCiAgICAgICAgICAgIHRocm93c19zaWduYXR1cmVzID0gbmV3IFR1 cGxlPGNoYXIgKj4oOCk7CiAgICAgICAgdGhyb3dzX3NpZ25hdHVyZXMgLT4gTmV4dCgpID0gc2ln bmF0dXJlOwogICAgfQoKICAgIHZvaWQgU2V0R2VuZXJhdGVkTG9jYWxDb25zdHJ1Y3RvcihNZXRo b2RTeW1ib2wgKmJhc2VfbWV0aG9kKQogICAgewogICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAg KCggISBiYXNlX21ldGhvZCAtPiBsb2NhbF9jb25zdHJ1Y3RvciApID8gMCA6CShfX2Fzc2VydF9m YWlsICgiISBiYXNlX21ldGhvZCAtPiBsb2NhbF9jb25zdHJ1Y3RvciIgLCAiLi4vLi4vamlrZXMv c3JjL3N5bWJvbC5oIiwgNTQ2LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAg ICBiYXNlX21ldGhvZCAtPiBsb2NhbF9jb25zdHJ1Y3RvciA9IHRoaXM7CiAgICAgICAgdGhpcyAt PiBsb2NhbF9jb25zdHJ1Y3RvciA9IGJhc2VfbWV0aG9kOwogICAgfQogICAgYm9vbCBJc0dlbmVy YXRlZExvY2FsQ29uc3RydWN0b3IoKSB7IHJldHVybiAoKGxvY2FsX2NvbnN0cnVjdG9yICE9IF9f bnVsbCApICYmICh0aGlzIC0+IGV4dGVybmFsX25hbWVfc3ltYm9sID09IF9fbnVsbCApKTsgfQog ICAgTWV0aG9kU3ltYm9sICpMb2NhbENvbnN0cnVjdG9yKCkgIHsgcmV0dXJuIGxvY2FsX2NvbnN0 cnVjdG9yOyB9CgogICAgdm9pZCBTZXRFeHRlcm5hbElkZW50aXR5KE5hbWVTeW1ib2wgKmV4dGVy bmFsX25hbWVfc3ltYm9sXykgeyBleHRlcm5hbF9uYW1lX3N5bWJvbCA9IGV4dGVybmFsX25hbWVf c3ltYm9sXzsgfQogICAgTmFtZVN5bWJvbCAqRXh0ZXJuYWxJZGVudGl0eSgpCiAgICB7CiAgICAg ICAgcmV0dXJuIChleHRlcm5hbF9uYW1lX3N5bWJvbCA/IGV4dGVybmFsX25hbWVfc3ltYm9sIDog bmFtZV9zeW1ib2wpOwogICAgfQogICAgd2NoYXJfdCAqRXh0ZXJuYWxOYW1lKCkKICAgIHsKICAg ICAgICByZXR1cm4gKGV4dGVybmFsX25hbWVfc3ltYm9sID8gZXh0ZXJuYWxfbmFtZV9zeW1ib2wg LT4gTmFtZSgpIDogbmFtZV9zeW1ib2wgLT4gTmFtZSgpKTsKICAgIH0KICAgIGludCBFeHRlcm5h bE5hbWVMZW5ndGgoKQogICAgewogICAgICAgIHJldHVybiAoZXh0ZXJuYWxfbmFtZV9zeW1ib2wg PyBleHRlcm5hbF9uYW1lX3N5bWJvbCAtPiBOYW1lTGVuZ3RoKCkgOiBuYW1lX3N5bWJvbCAtPiBO YW1lTGVuZ3RoKCkpOwogICAgfQogICAgY2hhciAqRXh0ZXJuYWxVdGY4TmFtZSgpCiAgICB7CiAg ICAgICAgcmV0dXJuIChjaGFyICopIChleHRlcm5hbF9uYW1lX3N5bWJvbCA/IGV4dGVybmFsX25h bWVfc3ltYm9sIC0+IFV0ZjhfbGl0ZXJhbCAtPiB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgOiAobmFtZV9zeW1ib2wgLT4gVXRmOF9saXRlcmFsID8g bmFtZV9zeW1ib2wgLT4gVXRmOF9saXRlcmFsIC0+IHZhbHVlIDogX19udWxsICkpOwogICAgfQog ICAgaW50IEV4dGVybmFsVXRmOE5hbWVMZW5ndGgoKQogICAgewogICAgICAgIHJldHVybiAoZXh0 ZXJuYWxfbmFtZV9zeW1ib2wgPyAoZXh0ZXJuYWxfbmFtZV9zeW1ib2wgLT4gVXRmOF9saXRlcmFs ID8gZXh0ZXJuYWxfbmFtZV9zeW1ib2wgLT4gVXRmOF9saXRlcmFsIC0+IGxlbmd0aCA6IDApCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChuYW1lX3N5bWJvbCAtPiBVdGY4 X2xpdGVyYWwgPyBuYW1lX3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgLT4gbGVuZ3RoIDogMCkpOwog ICAgfQoKICAgIHZvaWQgU2V0Q29udGFpbmluZ1R5cGUoVHlwZVN5bWJvbCAqY29udGFpbmluZ190 eXBlXykgeyBjb250YWluaW5nX3R5cGUgPSBjb250YWluaW5nX3R5cGVfOyB9CiAgICB2b2lkIFNl dEJsb2NrU3ltYm9sKEJsb2NrU3ltYm9sICpibG9ja19zeW1ib2xfKSB7IGJsb2NrX3N5bWJvbCA9 IGJsb2NrX3N5bWJvbF87IH0KICAgIHZvaWQgU2V0U2lnbmF0dXJlKENvbnRyb2wgJiwgVmFyaWFi bGVTeW1ib2wgKiA9IF9fbnVsbCApOwogICAgdm9pZCBTZXRTaWduYXR1cmUoVXRmOExpdGVyYWxW YWx1ZSAqc2lnbmF0dXJlXykgeyBzaWduYXR1cmUgPSBzaWduYXR1cmVfOyB9CiAgICBjaGFyICpT aWduYXR1cmVTdHJpbmcoKSB7IHJldHVybiBzaWduYXR1cmUgLT4gdmFsdWU7IH0KICAgIHdjaGFy X3QgKkhlYWRlcigpOwoKICAgIHZvaWQgQ2xlYW5VcCgpOwoKICAgIHZvaWQgTWFya1N5bnRoZXRp YygpIHsgc3RhdHVzIHw9ICh1bnNpZ25lZCBjaGFyKSAweDA4OyB9CiAgICBib29sIElzU3ludGhl dGljKCkgICB7IHJldHVybiAoc3RhdHVzICYgKHVuc2lnbmVkIGNoYXIpIDB4MDgpICE9IDA7IH0K CiAgICB2b2lkIE1hcmtEZXByZWNhdGVkKCkgeyBzdGF0dXMgfD0gKHVuc2lnbmVkIGNoYXIpIDB4 MTA7IH0KICAgIGJvb2wgSXNEZXByZWNhdGVkKCkgICB7IHJldHVybiAoc3RhdHVzICYgKHVuc2ln bmVkIGNoYXIpIDB4MTApICE9IDA7IH0KCnByaXZhdGU6CiAgICBOYW1lU3ltYm9sICpleHRlcm5h bF9uYW1lX3N5bWJvbDsKCiAgICB1bnNpZ25lZCBjaGFyIHN0YXR1czsKICAgIHdjaGFyX3QgKmhl YWRlcjsKCiAgICBUeXBlU3ltYm9sICp0eXBlXzsKICAgIFR1cGxlPFZhcmlhYmxlU3ltYm9sICo+ ICpmb3JtYWxfcGFyYW1ldGVyczsKICAgIFR1cGxlPFR5cGVTeW1ib2wgKj4gKnRocm93czsKICAg IFR1cGxlPGNoYXIgKj4gKnRocm93c19zaWduYXR1cmVzOwogICAgVHVwbGU8TWV0aG9kU3ltYm9s ICo+ICppbml0aWFsaXplcl9jb25zdHJ1Y3RvcnM7CgogICAgIAogICAgIAogICAgIAogICAgIAog ICAgTWV0aG9kU3ltYm9sICpsb2NhbF9jb25zdHJ1Y3RvcjsKCiAgICBib29sIEFDQ19GSU5BTCgp CiAgICB7CiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCAhICJ1c2UgdGhlIEFDQ19GSU5B TCgpIGZsYWcgb24gYSBtZXRob2Qgc3ltYm9sLiBVc2UgdGhlIGZ1bmN0aW9uIElzRmluYWwoKSBp bnN0ZWFkIiApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiISBcInVzZSB0aGUgQUNDX0ZJTkFMKCkg ZmxhZyBvbiBhIG1ldGhvZCBzeW1ib2wuIFVzZSB0aGUgZnVuY3Rpb24gSXNGaW5hbCgpIGluc3Rl YWRcIiIgLCAiLi4vLi4vamlrZXMvc3JjL3N5bWJvbC5oIiwgNjEzLCBfX1BSRVRUWV9GVU5DVElP Tl9fICksIDApKSkgOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn07CgoKY2xhc3MgVHlw ZVN5bWJvbCA6IHB1YmxpYyBTeW1ib2wsIHB1YmxpYyBBY2Nlc3NGbGFncwp7CnB1YmxpYzoKICAg IFNlbWFudGljRW52aXJvbm1lbnQgKnNlbWFudGljX2Vudmlyb25tZW50OwogICAgQXN0ICpkZWNs YXJhdGlvbjsgICAKICAgIEZpbGVTeW1ib2wgKmZpbGVfc3ltYm9sOwogICAgRmlsZUxvY2F0aW9u ICpmaWxlX2xvY2F0aW9uOwogICAgTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2w7CiAgICBTeW1ib2wg Km93bmVyOwogICAgVHlwZVN5bWJvbCAqb3V0ZXJtb3N0X3R5cGU7ICAKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg VHlwZVN5bWJvbCAqc3VwZXIsCiAgICAgICAgICAgICAgICpiYXNlX3R5cGU7ICAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBpbnQg aW5kZXgsICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgdW5pdF9pbmRleCwgICAgICAgICAKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg ICAgaW5jcmVtZW50YWxfaW5kZXg7ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAg IGludCBOdW1Mb2NhbENvbnN0cnVjdG9yQ2FsbEVudmlyb25tZW50cygpIHsgcmV0dXJuIChsb2Nh bF9jb25zdHJ1Y3Rvcl9jYWxsX2Vudmlyb25tZW50cyA/IGxvY2FsX2NvbnN0cnVjdG9yX2NhbGxf ZW52aXJvbm1lbnRzIC0+IExlbmd0aCgpIDogMCk7IH0KICAgIFNlbWFudGljRW52aXJvbm1lbnQg KiZMb2NhbENvbnN0cnVjdG9yQ2FsbEVudmlyb25tZW50KGludCBpKSB7IHJldHVybiAoKmxvY2Fs X2NvbnN0cnVjdG9yX2NhbGxfZW52aXJvbm1lbnRzKVtpXTsgfQogICAgdm9pZCBBZGRMb2NhbENv bnN0cnVjdG9yQ2FsbEVudmlyb25tZW50KFNlbWFudGljRW52aXJvbm1lbnQgKmVudmlyb25tZW50 KQogICAgewogICAgICAgIGlmICghIGxvY2FsX2NvbnN0cnVjdG9yX2NhbGxfZW52aXJvbm1lbnRz KQogICAgICAgICAgICBsb2NhbF9jb25zdHJ1Y3Rvcl9jYWxsX2Vudmlyb25tZW50cyA9IG5ldyBU dXBsZTxTZW1hbnRpY0Vudmlyb25tZW50ICo+KDgpOwogICAgICAgIGxvY2FsX2NvbnN0cnVjdG9y X2NhbGxfZW52aXJvbm1lbnRzIC0+IE5leHQoKSA9IGVudmlyb25tZW50OwogICAgfQoKICAgIGlu dCBOdW1Qcml2YXRlQWNjZXNzTWV0aG9kcygpIHsgcmV0dXJuIChwcml2YXRlX2FjY2Vzc19tZXRo b2RzID8gcHJpdmF0ZV9hY2Nlc3NfbWV0aG9kcyAtPiBMZW5ndGgoKSA6IDApOyB9CiAgICBNZXRo b2RTeW1ib2wgKiZQcml2YXRlQWNjZXNzTWV0aG9kKGludCBpKSB7IHJldHVybiAoKnByaXZhdGVf YWNjZXNzX21ldGhvZHMpW2ldOyB9CiAgICB2b2lkIEFkZFByaXZhdGVBY2Nlc3NNZXRob2QoTWV0 aG9kU3ltYm9sICptZXRob2Rfc3ltYm9sKQogICAgewogICAgICAgIGlmICghIHByaXZhdGVfYWNj ZXNzX21ldGhvZHMpCiAgICAgICAgICAgIHByaXZhdGVfYWNjZXNzX21ldGhvZHMgPSBuZXcgVHVw bGU8TWV0aG9kU3ltYm9sICo+KDgpOwogICAgICAgIHByaXZhdGVfYWNjZXNzX21ldGhvZHMgLT4g TmV4dCgpID0gbWV0aG9kX3N5bWJvbDsKICAgIH0KCiAgICBpbnQgTnVtUHJpdmF0ZUFjY2Vzc0Nv bnN0cnVjdG9ycygpIHsgcmV0dXJuIChwcml2YXRlX2FjY2Vzc19jb25zdHJ1Y3RvcnMgPyBwcml2 YXRlX2FjY2Vzc19jb25zdHJ1Y3RvcnMgLT4gTGVuZ3RoKCkgOiAwKTsgfQogICAgTWV0aG9kU3lt Ym9sIComUHJpdmF0ZUFjY2Vzc0NvbnN0cnVjdG9yKGludCBpKSB7IHJldHVybiAoKnByaXZhdGVf YWNjZXNzX2NvbnN0cnVjdG9ycylbaV07IH0KICAgIHZvaWQgQWRkUHJpdmF0ZUFjY2Vzc0NvbnN0 cnVjdG9yKE1ldGhvZFN5bWJvbCAqY29uc3RydWN0b3Jfc3ltYm9sKQogICAgewogICAgICAgIGlm ICghIHByaXZhdGVfYWNjZXNzX2NvbnN0cnVjdG9ycykKICAgICAgICAgICAgcHJpdmF0ZV9hY2Nl c3NfY29uc3RydWN0b3JzID0gbmV3IFR1cGxlPE1ldGhvZFN5bWJvbCAqPig4KTsKICAgICAgICBw cml2YXRlX2FjY2Vzc19jb25zdHJ1Y3RvcnMgLT4gTmV4dCgpID0gY29uc3RydWN0b3Jfc3ltYm9s OwogICAgfQoKICAgIGludCBOdW1Db25zdHJ1Y3RvclBhcmFtZXRlcnMoKSB7IHJldHVybiAoY29u c3RydWN0b3JfcGFyYW1ldGVycyA/IGNvbnN0cnVjdG9yX3BhcmFtZXRlcnMgLT4gTGVuZ3RoKCkg OiAwKTsgfQogICAgVmFyaWFibGVTeW1ib2wgKiZDb25zdHJ1Y3RvclBhcmFtZXRlcihpbnQgaSkg eyByZXR1cm4gKCpjb25zdHJ1Y3Rvcl9wYXJhbWV0ZXJzKVtpXTsgfQogICAgdm9pZCBBZGRDb25z dHJ1Y3RvclBhcmFtZXRlcihWYXJpYWJsZVN5bWJvbCAqdmFyaWFibGVfc3ltYm9sKQogICAgewog ICAgICAgIGlmICghIGNvbnN0cnVjdG9yX3BhcmFtZXRlcnMpCiAgICAgICAgICAgIGNvbnN0cnVj dG9yX3BhcmFtZXRlcnMgPSBuZXcgVHVwbGU8VmFyaWFibGVTeW1ib2wgKj4oOCk7CiAgICAgICAg Y29uc3RydWN0b3JfcGFyYW1ldGVycyAtPiBOZXh0KCkgPSB2YXJpYWJsZV9zeW1ib2w7CiAgICB9 CgogICAgaW50IE51bUdlbmVyYXRlZENvbnN0cnVjdG9ycygpIHsgcmV0dXJuIChnZW5lcmF0ZWRf Y29uc3RydWN0b3JzID8gZ2VuZXJhdGVkX2NvbnN0cnVjdG9ycyAtPiBMZW5ndGgoKSA6IDApOyB9 CiAgICBNZXRob2RTeW1ib2wgKiZHZW5lcmF0ZWRDb25zdHJ1Y3RvcihpbnQgaSkgeyByZXR1cm4g KCpnZW5lcmF0ZWRfY29uc3RydWN0b3JzKVtpXTsgfQogICAgdm9pZCBBZGRHZW5lcmF0ZWRDb25z dHJ1Y3RvcihNZXRob2RTeW1ib2wgKmNvbnN0cnVjdG9yX3N5bWJvbCkKICAgIHsKICAgICAgICBp ZiAoISBnZW5lcmF0ZWRfY29uc3RydWN0b3JzKQogICAgICAgICAgICBnZW5lcmF0ZWRfY29uc3Ry dWN0b3JzID0gbmV3IFR1cGxlPE1ldGhvZFN5bWJvbCAqPig4KTsKICAgICAgICBnZW5lcmF0ZWRf Y29uc3RydWN0b3JzIC0+IE5leHQoKSA9IGNvbnN0cnVjdG9yX3N5bWJvbDsKICAgIH0KCiAgICBp bnQgTnVtRW5jbG9zaW5nSW5zdGFuY2VzKCkgeyByZXR1cm4gKGVuY2xvc2luZ19pbnN0YW5jZXMg PyBlbmNsb3NpbmdfaW5zdGFuY2VzIC0+IExlbmd0aCgpIDogMCk7IH0KICAgIFZhcmlhYmxlU3lt Ym9sIComRW5jbG9zaW5nSW5zdGFuY2UoaW50IGkpIHsgcmV0dXJuICgqZW5jbG9zaW5nX2luc3Rh bmNlcylbaV07IH0KICAgIHZvaWQgQWRkRW5jbG9zaW5nSW5zdGFuY2UoVmFyaWFibGVTeW1ib2wg Kmluc3RhbmNlX3N5bWJvbCkKICAgIHsKICAgICAgICBpZiAoISBlbmNsb3NpbmdfaW5zdGFuY2Vz KQogICAgICAgICAgICBlbmNsb3NpbmdfaW5zdGFuY2VzID0gbmV3IFR1cGxlPFZhcmlhYmxlU3lt Ym9sICo+KDgpOwogICAgICAgIGVuY2xvc2luZ19pbnN0YW5jZXMgLT4gTmV4dCgpID0gaW5zdGFu Y2Vfc3ltYm9sOwogICAgfQoKICAgIGludCBOdW1DbGFzc0xpdGVyYWxzKCkgeyByZXR1cm4gKGNs YXNzX2xpdGVyYWxzID8gY2xhc3NfbGl0ZXJhbHMgLT4gTGVuZ3RoKCkgOiAwKTsgfQogICAgVmFy aWFibGVTeW1ib2wgKiZDbGFzc0xpdGVyYWwoaW50IGkpIHsgcmV0dXJuICgqY2xhc3NfbGl0ZXJh bHMpW2ldOyB9CiAgICB2b2lkIEFkZENsYXNzTGl0ZXJhbChWYXJpYWJsZVN5bWJvbCAqbGl0ZXJh bF9zeW1ib2wpCiAgICB7CiAgICAgICAgaWYgKCEgY2xhc3NfbGl0ZXJhbHMpCiAgICAgICAgICAg IGNsYXNzX2xpdGVyYWxzID0gbmV3IFR1cGxlPFZhcmlhYmxlU3ltYm9sICo+KDgpOwogICAgICAg IGNsYXNzX2xpdGVyYWxzIC0+IE5leHQoKSA9IGxpdGVyYWxfc3ltYm9sOwogICAgfQoKICAgIGlu dCBOdW1OZXN0ZWRUeXBlcygpIHsgcmV0dXJuIChuZXN0ZWRfdHlwZXMgPyBuZXN0ZWRfdHlwZXMg LT4gTGVuZ3RoKCkgOiAwKTsgfQogICAgVHlwZVN5bWJvbCAqJk5lc3RlZFR5cGUoaW50IGkpIHsg cmV0dXJuICgqbmVzdGVkX3R5cGVzKVtpXTsgfQogICAgdm9pZCBBZGROZXN0ZWRUeXBlKFR5cGVT eW1ib2wgKnR5cGVfc3ltYm9sKQogICAgewogICAgICAgIGlmICghIG5lc3RlZF90eXBlcykKICAg ICAgICAgICAgbmVzdGVkX3R5cGVzID0gbmV3IFR1cGxlPFR5cGVTeW1ib2wgKj4oOCk7CiAgICAg ICAgbmVzdGVkX3R5cGVzIC0+IE5leHQoKSA9IHR5cGVfc3ltYm9sOwogICAgfQoKICAgIGludCBO dW1JbnRlcmZhY2VzKCkgeyByZXR1cm4gKGludGVyZmFjZXMgPyBpbnRlcmZhY2VzIC0+IExlbmd0 aCgpIDogMCk7IH0KICAgIHZvaWQgUmVzZXRJbnRlcmZhY2VzKCkKICAgIHsKICAgICAgICBkZWxl dGUgaW50ZXJmYWNlczsKICAgICAgICBpbnRlcmZhY2VzID0gX19udWxsIDsKICAgIH0KICAgIFR5 cGVTeW1ib2wgKkludGVyZmFjZShpbnQgaSkgeyByZXR1cm4gKCppbnRlcmZhY2VzKVtpXTsgfQog ICAgdm9pZCBBZGRJbnRlcmZhY2UoVHlwZVN5bWJvbCAqdHlwZV9zeW1ib2wpCiAgICB7CiAgICAg ICAgaWYgKCEgaW50ZXJmYWNlcykKICAgICAgICAgICAgaW50ZXJmYWNlcyA9IG5ldyBUdXBsZTxU eXBlU3ltYm9sICo+KDgpOwogICAgICAgIGludGVyZmFjZXMgLT4gTmV4dCgpID0gdHlwZV9zeW1i b2w7CiAgICB9CgogICAgaW50IG51bV9hbm9ueW1vdXNfdHlwZXMoKSB7IHJldHVybiAoYW5vbnlt b3VzX3R5cGVzID8gYW5vbnltb3VzX3R5cGVzIC0+IExlbmd0aCgpIDogMCk7IH0KICAgIFR5cGVT eW1ib2wgKiZBbm9ueW1vdXNUeXBlKGludCBpKSB7IHJldHVybiAoKmFub255bW91c190eXBlcylb aV07IH0KICAgIHZvaWQgQWRkQW5vbnltb3VzVHlwZShUeXBlU3ltYm9sICp0eXBlX3N5bWJvbCkK ICAgIHsKICAgICAgICBpZiAoISBhbm9ueW1vdXNfdHlwZXMpCiAgICAgICAgICAgIGFub255bW91 c190eXBlcyA9IG5ldyBUdXBsZTxUeXBlU3ltYm9sICo+KDgpOwogICAgICAgIGFub255bW91c190 eXBlcyAtPiBOZXh0KCkgPSB0eXBlX3N5bWJvbDsKICAgIH0KICAgIHZvaWQgRGVsZXRlQW5vbnlt b3VzVHlwZXMoKTsKCiAgICBTeW1ib2xTZXQgKmxvY2FsLAogICAgICAgICAgICAgICpub25fbG9j YWw7CgogICAgU3ltYm9sU2V0ICpzdXBlcnR5cGVzX2Nsb3N1cmUsCiAgICAgICAgICAgICAgKnN1 YnR5cGVzLAogICAgICAgICAgICAgICpzdWJ0eXBlc19jbG9zdXJlLAogICAgICAgICAgICAgICpp bm5lcnR5cGVzX2Nsb3N1cmU7CgogICAgU3ltYm9sU2V0ICpkZXBlbmRlbnRzLAogICAgICAgICAg ICAgICpwYXJlbnRzLAogICAgICAgICAgICAgICpzdGF0aWNfcGFyZW50cywKICAgICAgICAgICAg ICAqZGVwZW5kZW50c19jbG9zdXJlLCAgIAogICAgICAgICAgICAgICpwYXJlbnRzX2Nsb3N1cmU7 ICAgICAgCgogICAgaW50IHBvb2xfaW5kZXg7ICAKCiAgICBVdGY4TGl0ZXJhbFZhbHVlICpzaWdu YXR1cmU7CiAgICBVdGY4TGl0ZXJhbFZhbHVlICpmdWxseV9xdWFsaWZpZWRfbmFtZTsKCiAgICBF eHBhbmRlZFR5cGVUYWJsZSAqZXhwYW5kZWRfdHlwZV90YWJsZTsKICAgIEV4cGFuZGVkRmllbGRU YWJsZSAqZXhwYW5kZWRfZmllbGRfdGFibGU7CiAgICBFeHBhbmRlZE1ldGhvZFRhYmxlICpleHBh bmRlZF9tZXRob2RfdGFibGU7CgogICAgaW50IG51bV9kaW1lbnNpb25zOwoKICAgIE1ldGhvZFN5 bWJvbCAqc3RhdGljX2luaXRpYWxpemVyX21ldGhvZDsKICAgIE1ldGhvZFN5bWJvbCAqYmxvY2tf aW5pdGlhbGl6ZXJfbWV0aG9kOwoKICAgIHZpcnR1YWwgd2NoYXJfdCAqTmFtZSgpIHsgcmV0dXJu IG5hbWVfc3ltYm9sIC0+IE5hbWUoKTsgfQogICAgdmlydHVhbCBzaXplX3QgTmFtZUxlbmd0aCgp IHsgcmV0dXJuIG5hbWVfc3ltYm9sIC0+IE5hbWVMZW5ndGgoKTsgfQogICAgdmlydHVhbCBOYW1l U3ltYm9sICpJZGVudGl0eSgpIHsgcmV0dXJuIG5hbWVfc3ltYm9sOyB9CiAgICBjaGFyICpVdGY4 TmFtZSgpIHsgcmV0dXJuIChjaGFyICopIChuYW1lX3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgPyBu YW1lX3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgLT4gdmFsdWUgOiBfX251bGwgKTsgfQogICAgaW50 IFV0ZjhOYW1lTGVuZ3RoKCkgeyByZXR1cm4gKG5hbWVfc3ltYm9sIC0+IFV0ZjhfbGl0ZXJhbCA/ IG5hbWVfc3ltYm9sIC0+IFV0ZjhfbGl0ZXJhbCAtPiBsZW5ndGggOiAwKTsgfQoKCiAgICB2b2lk IFNldEV4dGVybmFsSWRlbnRpdHkoTmFtZVN5bWJvbCAqZXh0ZXJuYWxfbmFtZV9zeW1ib2xfKSB7 IGV4dGVybmFsX25hbWVfc3ltYm9sID0gZXh0ZXJuYWxfbmFtZV9zeW1ib2xfOyB9CiAgICBOYW1l U3ltYm9sICpFeHRlcm5hbElkZW50aXR5KCkKICAgIHsKICAgICAgICByZXR1cm4gKGV4dGVybmFs X25hbWVfc3ltYm9sID8gZXh0ZXJuYWxfbmFtZV9zeW1ib2wgOiBuYW1lX3N5bWJvbCk7CiAgICB9 CiAgICB3Y2hhcl90ICpFeHRlcm5hbE5hbWUoKQogICAgewogICAgICAgIHJldHVybiAoZXh0ZXJu YWxfbmFtZV9zeW1ib2wgPyBleHRlcm5hbF9uYW1lX3N5bWJvbCAtPiBOYW1lKCkgOiBuYW1lX3N5 bWJvbCAtPiBOYW1lKCkpOwogICAgfQogICAgaW50IEV4dGVybmFsTmFtZUxlbmd0aCgpCiAgICB7 CiAgICAgICAgcmV0dXJuIChleHRlcm5hbF9uYW1lX3N5bWJvbCA/IGV4dGVybmFsX25hbWVfc3lt Ym9sIC0+IE5hbWVMZW5ndGgoKSA6IG5hbWVfc3ltYm9sIC0+IE5hbWVMZW5ndGgoKSk7CiAgICB9 CiAgICBjaGFyICpFeHRlcm5hbFV0ZjhOYW1lKCkKICAgIHsKICAgICAgICByZXR1cm4gKGNoYXIg KikgKGV4dGVybmFsX25hbWVfc3ltYm9sID8gZXh0ZXJuYWxfbmFtZV9zeW1ib2wgLT4gVXRmOF9s aXRlcmFsIC0+IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA6IChuYW1lX3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgPyBuYW1lX3N5bWJvbCAtPiBVdGY4 X2xpdGVyYWwgLT4gdmFsdWUgOiBfX251bGwgKSk7CiAgICB9CiAgICBpbnQgRXh0ZXJuYWxVdGY4 TmFtZUxlbmd0aCgpCiAgICB7CiAgICAgICAgcmV0dXJuIChleHRlcm5hbF9uYW1lX3N5bWJvbCA/ IChleHRlcm5hbF9uYW1lX3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgPyBleHRlcm5hbF9uYW1lX3N5 bWJvbCAtPiBVdGY4X2xpdGVyYWwgLT4gbGVuZ3RoIDogMCkKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDogKG5hbWVfc3ltYm9sIC0+IFV0ZjhfbGl0ZXJhbCA/IG5hbWVfc3lt Ym9sIC0+IFV0ZjhfbGl0ZXJhbCAtPiBsZW5ndGggOiAwKSk7CiAgICB9CgogICAgVHlwZVN5bWJv bChOYW1lU3ltYm9sICopOwogICAgdmlydHVhbCB+VHlwZVN5bWJvbCgpOwoKICAgIHZvaWQgUHJv Y2Vzc1R5cGVIZWFkZXJzKCk7CiAgICB2b2lkIFByb2Nlc3NNZW1iZXJzKCk7CiAgICB2b2lkIENv bXBsZXRlU3ltYm9sVGFibGUoKTsKICAgIHZvaWQgUHJvY2Vzc0V4ZWN1dGFibGVCb2RpZXMoKTsK ICAgIHZvaWQgUmVtb3ZlQ29tcGlsYXRpb25SZWZlcmVuY2VzKCk7CgogICAgTmFtZVN5bWJvbCAq R2V0VGhpc05hbWUoQ29udHJvbCAmLCBpbnQpOwoKICAgIFZhcmlhYmxlU3ltYm9sICpGaW5kVGhp cyhpbnQgaykKICAgIHsKICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIElzSW5uZXIoKSAp ID8gMCA6CShfX2Fzc2VydF9mYWlsICgiSXNJbm5lcigpIiAsICIuLi8uLi9qaWtlcy9zcmMvc3lt Ym9sLmgiLCA4MTMsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CiAgICAgICAgKHN0YXRp Y19jYXN0PHZvaWQ+ICAoKCBOdW1Db25zdHJ1Y3RvclBhcmFtZXRlcnMoKSA+IDAgKSA/IDAgOgko X19hc3NlcnRfZmFpbCAoIk51bUNvbnN0cnVjdG9yUGFyYW1ldGVycygpID4gMCIgLCAiLi4vLi4v amlrZXMvc3JjL3N5bWJvbC5oIiwgODE0LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoK ICAgICAgICByZXR1cm4gKGsgPT0gMCA/IENvbnN0cnVjdG9yUGFyYW1ldGVyKDApCiAgICAgICAg ICAgICAgICAgICAgICAgOiAoVmFyaWFibGVTeW1ib2wgKikgKE51bUVuY2xvc2luZ0luc3RhbmNl cygpID4gayA/IEVuY2xvc2luZ0luc3RhbmNlKGspIDogX19udWxsICkpOwogICAgfQogICAgVmFy aWFibGVTeW1ib2wgKkluc2VydFRoaXMoaW50IGspOwoKICAgIFR5cGVTeW1ib2wgKkZpbmRPcklu c2VydENsYXNzTGl0ZXJhbENsYXNzKExleFN0cmVhbTo6VG9rZW5JbmRleCk7CiAgICBUeXBlU3lt Ym9sICpDbGFzc0xpdGVyYWxDbGFzcygpCiAgICB7CiAgICAgICAgcmV0dXJuIGNsYXNzX2xpdGVy YWxfY2xhc3M7CiAgICB9CiAgICBNZXRob2RTeW1ib2wgKkZpbmRPckluc2VydENsYXNzTGl0ZXJh bE1ldGhvZChDb250cm9sICYpOwogICAgTWV0aG9kU3ltYm9sICpDbGFzc0xpdGVyYWxNZXRob2Qo KQogICAgewogICAgICAgIHJldHVybiBjbGFzc19saXRlcmFsX21ldGhvZDsKICAgIH0KICAgIFV0 ZjhMaXRlcmFsVmFsdWUgKkZpbmRPckluc2VydENsYXNzTGl0ZXJhbE5hbWUoQ29udHJvbCAmKTsK ICAgIFV0ZjhMaXRlcmFsVmFsdWUgKkNsYXNzTGl0ZXJhbE5hbWUoKQogICAgewogICAgICAgIHJl dHVybiBjbGFzc19saXRlcmFsX25hbWU7CiAgICB9CiAgICBWYXJpYWJsZVN5bWJvbCAqRmluZE9y SW5zZXJ0Q2xhc3NMaXRlcmFsKFR5cGVTeW1ib2wgKik7CiAgICBWYXJpYWJsZVN5bWJvbCAqRmlu ZE9ySW5zZXJ0TG9jYWxTaGFkb3coVmFyaWFibGVTeW1ib2wgKik7CgogICAgTWV0aG9kU3ltYm9s ICpHZXRSZWFkQWNjZXNzTWV0aG9kKE1ldGhvZFN5bWJvbCAqKTsKICAgIE1ldGhvZFN5bWJvbCAq R2V0UmVhZEFjY2Vzc01ldGhvZChWYXJpYWJsZVN5bWJvbCAqKTsKICAgIE1ldGhvZFN5bWJvbCAq R2V0V3JpdGVBY2Nlc3NNZXRob2QoVmFyaWFibGVTeW1ib2wgKik7CgogICAgYm9vbCBJc0FycmF5 KCkgeyByZXR1cm4gKG51bV9kaW1lbnNpb25zID4gMCk7IH0KCiAgICB2b2lkIFNldE93bmVyKFN5 bWJvbCAqb3duZXJfKSB7IG93bmVyID0gb3duZXJfOyB9CiAgICBib29sIElzT3duZXIoVHlwZVN5 bWJvbCAqdHlwZSkKICAgIHsKICAgICAgICBTeW1ib2wgKnN5bSA9IHR5cGUgLT4gb3duZXI7CiAg ICAgICAgd2hpbGUgKCEgc3ltIC0+IFBhY2thZ2VDYXN0KCkpCiAgICAgICAgewogICAgICAgICAg ICBpZiAoc3ltID09IHRoaXMpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAgICAg ICAgIE1ldGhvZFN5bWJvbCAqbWV0aG9kID0gc3ltIC0+IE1ldGhvZENhc3QoKTsKICAgICAgICAg ICAgc3ltID0gKG1ldGhvZCA/IG1ldGhvZCAtPiBjb250YWluaW5nX3R5cGUgOiAoKFR5cGVTeW1i b2wgKikgc3ltKSAtPiBvd25lcik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAg ICB9CgogICAgVHlwZVN5bWJvbCAqQ29udGFpbmluZ1R5cGUoKQogICAgewogICAgICAgIGlmIChv d25lcikKICAgICAgICB7CiAgICAgICAgICAgIFR5cGVTeW1ib2wgKnR5cGUgPSBvd25lciAtPiBU eXBlQ2FzdCgpOwogICAgICAgICAgICBpZiAodHlwZSkKICAgICAgICAgICAgICAgIHJldHVybiB0 eXBlOwogICAgICAgICAgICBNZXRob2RTeW1ib2wgKm1ldGhvZCA9IG93bmVyIC0+IE1ldGhvZENh c3QoKTsKICAgICAgICAgICAgaWYgKG1ldGhvZCkKICAgICAgICAgICAgICAgIHJldHVybiBtZXRo b2QgLT4gY29udGFpbmluZ190eXBlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIF9fbnVsbCA7 CiAgICB9CgogICAgYm9vbCBDYW5BY2Nlc3MoVHlwZVN5bWJvbCAqKTsKCiAgICBib29sIEhhc1By b3RlY3RlZEFjY2Vzc1RvKFR5cGVTeW1ib2wgKik7CgogICAgYm9vbCBJc1N1YmNsYXNzKFR5cGVT eW1ib2wgKnN1cGVyX2NsYXNzKQogICAgewogICAgICAgIHJldHVybiAodGhpcyA9PSBzdXBlcl9j bGFzcyA/IHRydWUgOiAoc3VwZXIgPT0gX19udWxsICA/IGZhbHNlIDogc3VwZXIgLT4gSXNTdWJj bGFzcyhzdXBlcl9jbGFzcykpKTsKICAgIH0KCiAgICBib29sIElzU3ViaW50ZXJmYWNlKFR5cGVT eW1ib2wgKnN1cGVyX2ludGVyZmFjZSkKICAgIHsKICAgICAgICBpZiAodGhpcyA9PSBzdXBlcl9p bnRlcmZhY2UpCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIGZvciAoaW50IGkgPSAw OyBpIDwgTnVtSW50ZXJmYWNlcygpOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpZiAoSW50 ZXJmYWNlKGkpIC0+IElzU3ViaW50ZXJmYWNlKHN1cGVyX2ludGVyZmFjZSkpCiAgICAgICAgICAg ICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoK ICAgIGJvb2wgSW1wbGVtZW50cyhUeXBlU3ltYm9sICppbnRlcikKICAgIHsKICAgICAgICBmb3Ig KGludCBpID0gMDsgaSA8IE51bUludGVyZmFjZXMoKTsgaSsrKQogICAgICAgIHsKICAgICAgICAg ICAgaWYgKEludGVyZmFjZShpKSAtPiBJc1N1YmludGVyZmFjZShpbnRlcikpCiAgICAgICAgICAg ICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh0aGlzIC0+IHN1cGVy ID8gdGhpcyAtPiBzdXBlciAtPiBJbXBsZW1lbnRzKGludGVyKSA6IGZhbHNlKTsKICAgIH0KCiAg ICB3Y2hhcl90ICpGaWxlTG9jKCkKICAgIHsKICAgICAgICByZXR1cm4gKHdjaGFyX3QgKikgKGZp bGVfbG9jYXRpb24gPyBmaWxlX2xvY2F0aW9uIC0+IGxvY2F0aW9uIDogX19udWxsICk7CiAgICB9 CgogICAgdm9pZCBTZXRMb2NhdGlvbigpOwoKICAgIFR5cGVTeW1ib2wgKkdldEFycmF5VHlwZShT ZW1hbnRpYyAqLCBpbnQpOwoKICAgIFR5cGVTeW1ib2wgKkFycmF5U3VidHlwZSgpCiAgICB7CiAg ICAgICAgcmV0dXJuIHRoaXMgLT4gYmFzZV90eXBlIC0+IEFycmF5KHRoaXMgLT4gbnVtX2RpbWVu c2lvbnMgLSAxKTsKICAgIH0KCiAgICB2b2lkIFNldFNpZ25hdHVyZShDb250cm9sICYpOwogICAg dm9pZCBTZXRTaWduYXR1cmUoVXRmOExpdGVyYWxWYWx1ZSAqc2lnbmF0dXJlXykgeyBzaWduYXR1 cmUgPSBzaWduYXR1cmVfOyB9CiAgICBjaGFyICpTaWduYXR1cmVTdHJpbmcoKSB7IHJldHVybiBz aWduYXR1cmUgLT4gdmFsdWU7IH0KCiAgICB2b2lkIFNldENsYXNzTGl0ZXJhbE5hbWUoVXRmOExp dGVyYWxWYWx1ZSAqY2xhc3NfbGl0ZXJhbF9uYW1lXykgeyBjbGFzc19saXRlcmFsX25hbWUgPSBj bGFzc19saXRlcmFsX25hbWVfOyB9CgogICAgUGFja2FnZVN5bWJvbCAqQ29udGFpbmluZ1BhY2th Z2UoKSB7IHJldHVybiBvdXRlcm1vc3RfdHlwZSAtPiBvd25lciAtPiBQYWNrYWdlQ2FzdCgpOyB9 CgogICAgYm9vbCBJc05lc3RlZEluKFR5cGVTeW1ib2wgKik7CgogICAgYm9vbCBJc05lc3RlZCgp IHsgcmV0dXJuIG91dGVybW9zdF90eXBlICE9IHRoaXM7IH0KCiAgICBib29sIElzSW5uZXIoKSB7 IHJldHVybiBJc0xvY2FsKCkgfHwgQW5vbnltb3VzKCkgfHwgKElzTmVzdGVkKCkgJiYgKCEgQUND X1NUQVRJQygpKSk7IH0KCiAgICBib29sIElzTG9jYWwoKQogICAgewogICAgICAgIGZvciAoU3lt Ym9sICpzeW0gPSBvd25lcjsgISBzeW0gLT4gUGFja2FnZUNhc3QoKTsgc3ltID0gKChUeXBlU3lt Ym9sICopIHN5bSkgLT4gb3duZXIpCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3ltIC0+IE1l dGhvZENhc3QoKSkKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAg ICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlubGluZSBjaGFyICpDbGFzc05hbWUoKQogICAg ewogICAgICAgIGlmICghIGNsYXNzX25hbWUpCiAgICAgICAgICAgIFNldENsYXNzTmFtZSgpOwog ICAgICAgIHJldHVybiBjbGFzc19uYW1lOwogICAgfQoKICAgIHZvaWQgTWFya0NvbnN0cnVjdG9y TWVtYmVyc1Byb2Nlc3NlZCgpIHsgc3RhdHVzIHw9ICh1bnNpZ25lZCBzaG9ydCkgMHgwMDAxOyB9 CiAgICBib29sIENvbnN0cnVjdG9yTWVtYmVyc1Byb2Nlc3NlZCgpIHsgcmV0dXJuIChzdGF0dXMg JiAodW5zaWduZWQgc2hvcnQpIDB4MDAwMSkgIT0gMCA7IH0KCiAgICB2b2lkIE1hcmtNZXRob2RN ZW1iZXJzUHJvY2Vzc2VkKCkgeyBzdGF0dXMgfD0gKHVuc2lnbmVkIHNob3J0KSAweDAwMDI7IH0K ICAgIGJvb2wgTWV0aG9kTWVtYmVyc1Byb2Nlc3NlZCgpIHsgcmV0dXJuIChzdGF0dXMgJiAodW5z aWduZWQgc2hvcnQpIDB4MDAwMikgIT0gMDsgfQoKICAgIHZvaWQgTWFya0ZpZWxkTWVtYmVyc1By b2Nlc3NlZCgpIHsgc3RhdHVzIHw9ICh1bnNpZ25lZCBzaG9ydCkgMHgwMDA0OyB9CiAgICBib29s IEZpZWxkTWVtYmVyc1Byb2Nlc3NlZCgpIHsgcmV0dXJuIChzdGF0dXMgJiAodW5zaWduZWQgc2hv cnQpIDB4MDAwNCkgIT0gMDsgfQoKICAgIHZvaWQgTWFya0xvY2FsQ2xhc3NQcm9jZXNzaW5nQ29t cGxldGVkKCkgeyBzdGF0dXMgfD0gKHVuc2lnbmVkIHNob3J0KSAweDAwMDg7IH0KICAgIGJvb2wg TG9jYWxDbGFzc1Byb2Nlc3NpbmdDb21wbGV0ZWQoKSB7IHJldHVybiAoc3RhdHVzICYgKHVuc2ln bmVkIHNob3J0KSAweDAwMDgpICE9IDA7IH0KCiAgICB2b2lkIE1hcmtTb3VyY2VQZW5kaW5nKCkg eyBzdGF0dXMgfD0gKHVuc2lnbmVkIHNob3J0KSAweDAwMTA7IH0KICAgIHZvaWQgTWFya1NvdXJj ZU5vTG9uZ2VyUGVuZGluZygpIHsgc3RhdHVzICY9ICh+ICgodW5zaWduZWQgc2hvcnQpIDB4MDAx MCkpOyB9CiAgICBib29sIFNvdXJjZVBlbmRpbmcoKSB7IHJldHVybiAoc3RhdHVzICYgKHVuc2ln bmVkIHNob3J0KSAweDAwMTApICE9IDA7IH0KCiAgICB2b2lkIE1hcmtBbm9ueW1vdXMoKSB7IHN0 YXR1cyB8PSAodW5zaWduZWQgc2hvcnQpIDB4MDAyMDsgfQogICAgYm9vbCBBbm9ueW1vdXMoKSB7 IHJldHVybiAoc3RhdHVzICYgKHVuc2lnbmVkIHNob3J0KSAweDAwMjApICE9IDA7IH0KCiAgICB2 b2lkIE1hcmtIZWFkZXJQcm9jZXNzZWQoKSB7IHN0YXR1cyB8PSAodW5zaWduZWQgc2hvcnQpIDB4 MDA0MDsgfQogICAgYm9vbCBIZWFkZXJQcm9jZXNzZWQoKSB7IHJldHVybiAoc3RhdHVzICYgKHVu c2lnbmVkIHNob3J0KSAweDAwNDApICE9IDA7IH0KCiAgICB2b2lkIE1hcmtQcmltaXRpdmUoKSB7 IHN0YXR1cyB8PSAodW5zaWduZWQgc2hvcnQpIDB4MDA4MDsgfQogICAgYm9vbCBQcmltaXRpdmUo KSAgICAgeyByZXR1cm4gKHN0YXR1cyAmICh1bnNpZ25lZCBzaG9ydCkgMHgwMDgwKSAhPSAwOyB9 CgogICAgdm9pZCBNYXJrRGVwcmVjYXRlZCgpIHsgc3RhdHVzIHw9ICh1bnNpZ25lZCBzaG9ydCkg MHgwMTAwOyB9CiAgICBib29sIElzRGVwcmVjYXRlZCgpICAgeyByZXR1cm4gKHN0YXR1cyAmICh1 bnNpZ25lZCBzaG9ydCkgMHgwMTAwKSAhPSAwOyB9CgogICAgdm9pZCBNYXJrQmFkKCkKICAgIHsK ICAgICAgICBTZXRBQ0NfUFVCTElDKCk7CgogICAgICAgIHN0YXR1cyB8PSAodW5zaWduZWQgc2hv cnQpIDB4MDIwMDsKCiAgICAgICAgTWFya0hlYWRlclByb2Nlc3NlZCgpOwogICAgICAgIE1hcmtD b25zdHJ1Y3Rvck1lbWJlcnNQcm9jZXNzZWQoKTsKICAgICAgICBNYXJrTWV0aG9kTWVtYmVyc1By b2Nlc3NlZCgpOwogICAgICAgIE1hcmtGaWVsZE1lbWJlcnNQcm9jZXNzZWQoKTsKICAgICAgICBN YXJrTG9jYWxDbGFzc1Byb2Nlc3NpbmdDb21wbGV0ZWQoKTsKICAgICAgICBNYXJrU291cmNlTm9M b25nZXJQZW5kaW5nKCk7CgogICAgICAgIHJldHVybjsKICAgIH0KICAgIGJvb2wgQmFkKCkgeyBy ZXR1cm4gKHN0YXR1cyAmICh1bnNpZ25lZCBzaG9ydCkgMHgwMjAwKSAhPSAwOyB9CgogICAgdm9p ZCBNYXJrQ2lyY3VsYXIoKQogICAgewogICAgICAgIHN0YXR1cyB8PSAodW5zaWduZWQgc2hvcnQp IDB4MDQwMDsKICAgICAgICBNYXJrQmFkKCk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgdm9p ZCBNYXJrTm9uQ2lyY3VsYXIoKSB7IHN0YXR1cyAmPSAofiAoKHVuc2lnbmVkIHNob3J0KSAweDA0 MDApKTsgfQogICAgYm9vbCBDaXJjdWxhcigpIHsgcmV0dXJuIChzdGF0dXMgJiAodW5zaWduZWQg c2hvcnQpIDB4MDQwMCkgIT0gMDsgfQoKICAgIHZvaWQgUHJvY2Vzc05lc3RlZFR5cGVTaWduYXR1 cmVzKFNlbWFudGljICosIExleFN0cmVhbTo6VG9rZW5JbmRleCk7CgogICAgYm9vbCBOZXN0ZWRU eXBlc1Byb2Nlc3NlZCgpIHsgcmV0dXJuIG5lc3RlZF90eXBlX3NpZ25hdHVyZXMgPT0gX19udWxs IDsgfQoKICAgIGludCBOdW1OZXN0ZWRUeXBlU2lnbmF0dXJlcygpCiAgICB7CiAgICAgICAgcmV0 dXJuIChuZXN0ZWRfdHlwZV9zaWduYXR1cmVzID8gbmVzdGVkX3R5cGVfc2lnbmF0dXJlcyAtPiBM ZW5ndGgoKSA6IDApOwogICAgfQogICAgY2hhciAqTmVzdGVkVHlwZVNpZ25hdHVyZShpbnQgaSkK ICAgIHsKICAgICAgICByZXR1cm4gKCpuZXN0ZWRfdHlwZV9zaWduYXR1cmVzKVtpXTsKICAgIH0K ICAgIHZvaWQgQWRkTmVzdGVkVHlwZVNpZ25hdHVyZShjb25zdCBjaGFyICpzaWduYXR1cmVfLCBp bnQgbGVuZ3RoKQogICAgewogICAgICAgIGNoYXIgKnNpZ25hdHVyZSA9IG5ldyBjaGFyW2xlbmd0 aCArIDFdOwogICAgICAgIHN0cm5jcHkoc2lnbmF0dXJlLCBzaWduYXR1cmVfLCBsZW5ndGgpOwog ICAgICAgIHNpZ25hdHVyZVtsZW5ndGhdID0gVV9OVUxMOwoKICAgICAgICBpZiAoISBuZXN0ZWRf dHlwZV9zaWduYXR1cmVzKQogICAgICAgICAgICBuZXN0ZWRfdHlwZV9zaWduYXR1cmVzID0gbmV3 IFR1cGxlPGNoYXIgKj4oOCk7CiAgICAgICAgbmVzdGVkX3R5cGVfc2lnbmF0dXJlcyAtPiBOZXh0 KCkgPSBzaWduYXR1cmU7CiAgICB9CgogICAgaW5saW5lIHZvaWQgU2V0U3ltYm9sVGFibGUoaW50 KTsKICAgIGlubGluZSBTeW1ib2xUYWJsZSAqVGFibGUoKTsKCiAgICBpbnQgTnVtVmFyaWFibGVT eW1ib2xzKCk7CiAgICBWYXJpYWJsZVN5bWJvbCAqVmFyaWFibGVTeW0oaW50KTsKCiAgICBpbnQg TnVtTWV0aG9kU3ltYm9scygpOwogICAgTWV0aG9kU3ltYm9sICpNZXRob2RTeW0oaW50KTsKCiAg ICBpbnQgTnVtVHlwZVN5bWJvbHMoKTsKICAgIFR5cGVTeW1ib2wgKlR5cGVTeW0oaW50KTsKCiAg ICBpbmxpbmUgVHlwZVN5bWJvbCAqSW5zZXJ0QW5vbnltb3VzVHlwZVN5bWJvbChOYW1lU3ltYm9s ICopOwogICAgaW5saW5lIFR5cGVTeW1ib2wgKkZpbmRUeXBlU3ltYm9sKE5hbWVTeW1ib2wgKik7 CiAgICBpbmxpbmUgVHlwZVN5bWJvbCAqSW5zZXJ0TmVzdGVkVHlwZVN5bWJvbChOYW1lU3ltYm9s ICopOwogICAgaW5saW5lIE1ldGhvZFN5bWJvbCAqRmluZENvbnN0cnVjdG9yU3ltYm9sKCk7CiAg ICBpbmxpbmUgTWV0aG9kU3ltYm9sICpJbnNlcnRDb25zdHJ1Y3RvclN5bWJvbChOYW1lU3ltYm9s ICopOwogICAgaW5saW5lIHZvaWQgSW5zZXJ0Q29uc3RydWN0b3JTeW1ib2woTWV0aG9kU3ltYm9s ICopOwogICAgaW5saW5lIE1ldGhvZFN5bWJvbCAqRmluZE1ldGhvZFN5bWJvbChOYW1lU3ltYm9s ICopOwogICAgaW5saW5lIFZhcmlhYmxlU3ltYm9sICpGaW5kVmFyaWFibGVTeW1ib2woTmFtZVN5 bWJvbCAqKTsKICAgIGlubGluZSBWYXJpYWJsZVN5bWJvbCAqSW5zZXJ0VmFyaWFibGVTeW1ib2wo TmFtZVN5bWJvbCAqKTsKICAgIGlubGluZSB2b2lkIEluc2VydFZhcmlhYmxlU3ltYm9sKFZhcmlh YmxlU3ltYm9sICopOwoKICAgIGlubGluZSBNZXRob2RTeW1ib2wgKkluc2VydE1ldGhvZFN5bWJv bChOYW1lU3ltYm9sICopOwogICAgaW5saW5lIHZvaWQgSW5zZXJ0TWV0aG9kU3ltYm9sKE1ldGhv ZFN5bWJvbCAqKTsKICAgIGlubGluZSBNZXRob2RTeW1ib2wgKk92ZXJsb2FkKE1ldGhvZFN5bWJv bCAqKTsKICAgIGlubGluZSB2b2lkIE92ZXJsb2FkKE1ldGhvZFN5bWJvbCAqLCBNZXRob2RTeW1i b2wgKik7CiAgICBpbmxpbmUgTWV0aG9kU3ltYm9sICpMb2NhbENvbnN0cnVjdG9yT3ZlcmxvYWQo TWV0aG9kU3ltYm9sICopOwogICAgTWV0aG9kU3ltYm9sICpGaW5kT3ZlcmxvYWRNZXRob2QoTWV0 aG9kU3ltYm9sICosIEFzdE1ldGhvZERlY2xhcmF0b3IgKik7CgogICAgaW5saW5lIHZvaWQgQ29t cHJlc3NTcGFjZSgpOwoKcHJpdmF0ZToKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGZyaWVu ZCBjbGFzcyBUeXBlTG9va3VwVGFibGU7CiAgICB1bnNpZ25lZCBoYXNoX2FkZHJlc3M7CiAgICBU eXBlU3ltYm9sICpuZXh0X3R5cGU7CgogICAgTmFtZVN5bWJvbCAqZXh0ZXJuYWxfbmFtZV9zeW1i b2w7CgogICAgU3ltYm9sVGFibGUgKnRhYmxlOwogICAgU3ltYm9sTWFwICpsb2NhbF9zaGFkb3df bWFwOwoKICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKCiAgICBQYWNrYWdlU3ltYm9sICpwYWNr YWdlOwogICAgY2hhciAqY2xhc3NfbmFtZTsKCiAgICB2b2lkIFNldENsYXNzTmFtZSgpOwoKICAg IFR5cGVTeW1ib2wgKmNsYXNzX2xpdGVyYWxfY2xhc3M7CiAgICBNZXRob2RTeW1ib2wgKmNsYXNz X2xpdGVyYWxfbWV0aG9kOwogICAgVXRmOExpdGVyYWxWYWx1ZSAqY2xhc3NfbGl0ZXJhbF9uYW1l OwoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIFR1cGxlPFNl bWFudGljRW52aXJvbm1lbnQgKj4gKmxvY2FsX2NvbnN0cnVjdG9yX2NhbGxfZW52aXJvbm1lbnRz OwoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIFR1 cGxlPE1ldGhvZFN5bWJvbCAqPiAqcHJpdmF0ZV9hY2Nlc3NfbWV0aG9kcywKICAgICAgICAgICAg ICAgICAgICAgICAgICAqcHJpdmF0ZV9hY2Nlc3NfY29uc3RydWN0b3JzOwoKICAgIGlubGluZSB2 b2lkIE1hcFN5bWJvbFRvUmVhZE1ldGhvZChTeW1ib2wgKiwgTWV0aG9kU3ltYm9sICopOwogICAg aW5saW5lIE1ldGhvZFN5bWJvbCAqUmVhZE1ldGhvZChTeW1ib2wgKik7CiAgICBpbmxpbmUgdm9p ZCBNYXBTeW1ib2xUb1dyaXRlTWV0aG9kKFZhcmlhYmxlU3ltYm9sICosIE1ldGhvZFN5bWJvbCAq KTsKICAgIGlubGluZSBNZXRob2RTeW1ib2wgKldyaXRlTWV0aG9kKFZhcmlhYmxlU3ltYm9sICop OwoKICAgIFN5bWJvbE1hcCAqcmVhZF9tZXRob2QsCiAgICAgICAgICAgICAgKndyaXRlX21ldGhv ZDsKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAg CiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBUdXBs ZTxWYXJpYWJsZVN5bWJvbCAqPiAqY29uc3RydWN0b3JfcGFyYW1ldGVyczsKICAgIFR1cGxlPE1l dGhvZFN5bWJvbCAqPiAqZ2VuZXJhdGVkX2NvbnN0cnVjdG9yczsKICAgIFR1cGxlPFZhcmlhYmxl U3ltYm9sICo+ICplbmNsb3NpbmdfaW5zdGFuY2VzOwogICAgVHVwbGU8VmFyaWFibGVTeW1ib2wg Kj4gKmNsYXNzX2xpdGVyYWxzOwoKICAgIFR1cGxlPGNoYXIgKj4gKm5lc3RlZF90eXBlX3NpZ25h dHVyZXM7CgogICAgIAogICAgIAogICAgIAogICAgVHVwbGU8VHlwZVN5bWJvbCAqPiAqbmVzdGVk X3R5cGVzOwoKICAgICAKICAgICAKICAgICAKICAgIFR1cGxlPFR5cGVTeW1ib2wgKj4gKmludGVy ZmFjZXM7CgogICAgIAogICAgIAogICAgIAogICAgVHVwbGU8VHlwZVN5bWJvbCAqPiAqYW5vbnlt b3VzX3R5cGVzOwoKICAgICAKICAgICAKICAgICAKICAgIFR1cGxlPFR5cGVTeW1ib2wgKj4gKmFy cmF5OwogICAgaW5saW5lIGludCBOdW1BcnJheXMoKQogICAgewogICAgICAgIHJldHVybiAoYXJy YXkgPyBhcnJheSAtPiBMZW5ndGgoKSA6IDApOwogICAgfQogICAgaW5saW5lIFR5cGVTeW1ib2wg KkFycmF5KGludCBpKQogICAgewogICAgICAgIHJldHVybiAoKmFycmF5KVtpXTsKICAgIH0KICAg IGlubGluZSB2b2lkIEFkZEFycmF5VHlwZShUeXBlU3ltYm9sICp0eXBlX3N5bWJvbCkKICAgIHsK ICAgICAgICBpZiAoISBhcnJheSkKICAgICAgICAgICAgYXJyYXkgPSBuZXcgVHVwbGU8VHlwZVN5 bWJvbCAqPig0KTsKICAgICAgICBhcnJheSAtPiBOZXh0KCkgPSB0eXBlX3N5bWJvbDsKICAgIH0K fTsKCgpjbGFzcyBWYXJpYWJsZVN5bWJvbCA6IHB1YmxpYyBTeW1ib2wsIHB1YmxpYyBBY2Nlc3NG bGFncwp7CnB1YmxpYzoKICAgIEFzdFZhcmlhYmxlRGVjbGFyYXRvciAqZGVjbGFyYXRvcjsKCiAg ICBOYW1lU3ltYm9sICpuYW1lX3N5bWJvbDsKICAgIFN5bWJvbCAgICAgKm93bmVyOwogICAgTGl0 ZXJhbFZhbHVlICppbml0aWFsX3ZhbHVlOwoKICAgIFZhcmlhYmxlU3ltYm9sICphY2Nlc3NlZF9s b2NhbDsKCiAgICB2aXJ0dWFsIHdjaGFyX3QgKk5hbWUoKSB7IHJldHVybiBuYW1lX3N5bWJvbCAt PiBOYW1lKCk7IH0KICAgIHZpcnR1YWwgc2l6ZV90IE5hbWVMZW5ndGgoKSB7IHJldHVybiBuYW1l X3N5bWJvbCAtPiBOYW1lTGVuZ3RoKCk7IH0KICAgIHZpcnR1YWwgTmFtZVN5bWJvbCAqSWRlbnRp dHkoKSB7IHJldHVybiBuYW1lX3N5bWJvbDsgfQogICAgY2hhciAqVXRmOE5hbWUoKSB7IHJldHVy biAoY2hhciAqKSAobmFtZV9zeW1ib2wgLT4gVXRmOF9saXRlcmFsID8gbmFtZV9zeW1ib2wgLT4g VXRmOF9saXRlcmFsIC0+IHZhbHVlIDogX19udWxsICk7IH0KICAgIGludCBVdGY4TmFtZUxlbmd0 aCgpIHsgcmV0dXJuIChuYW1lX3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgPyBuYW1lX3N5bWJvbCAt PiBVdGY4X2xpdGVyYWwgLT4gbGVuZ3RoIDogMCk7IH0KCiAgICB2b2lkIFNldEV4dGVybmFsSWRl bnRpdHkoTmFtZVN5bWJvbCAqZXh0ZXJuYWxfbmFtZV9zeW1ib2xfKSB7IGV4dGVybmFsX25hbWVf c3ltYm9sID0gZXh0ZXJuYWxfbmFtZV9zeW1ib2xfOyB9CiAgICBOYW1lU3ltYm9sICpFeHRlcm5h bElkZW50aXR5KCkKICAgIHsKICAgICAgICByZXR1cm4gKGV4dGVybmFsX25hbWVfc3ltYm9sID8g ZXh0ZXJuYWxfbmFtZV9zeW1ib2wgOiBuYW1lX3N5bWJvbCk7CiAgICB9CiAgICB3Y2hhcl90ICpF eHRlcm5hbE5hbWUoKQogICAgewogICAgICAgIHJldHVybiAoZXh0ZXJuYWxfbmFtZV9zeW1ib2wg PyBleHRlcm5hbF9uYW1lX3N5bWJvbCAtPiBOYW1lKCkgOiBuYW1lX3N5bWJvbCAtPiBOYW1lKCkp OwogICAgfQogICAgaW50IEV4dGVybmFsTmFtZUxlbmd0aCgpCiAgICB7CiAgICAgICAgcmV0dXJu IChleHRlcm5hbF9uYW1lX3N5bWJvbCA/IGV4dGVybmFsX25hbWVfc3ltYm9sIC0+IE5hbWVMZW5n dGgoKSA6IG5hbWVfc3ltYm9sIC0+IE5hbWVMZW5ndGgoKSk7CiAgICB9CiAgICBjaGFyICpFeHRl cm5hbFV0ZjhOYW1lKCkKICAgIHsKICAgICAgICByZXR1cm4gKGNoYXIgKikgKGV4dGVybmFsX25h bWVfc3ltYm9sID8gZXh0ZXJuYWxfbmFtZV9zeW1ib2wgLT4gVXRmOF9saXRlcmFsIC0+IHZhbHVl CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChuYW1lX3N5 bWJvbCAtPiBVdGY4X2xpdGVyYWwgPyBuYW1lX3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgLT4gdmFs dWUgOiBfX251bGwgKSk7CiAgICB9CiAgICBpbnQgRXh0ZXJuYWxVdGY4TmFtZUxlbmd0aCgpCiAg ICB7CiAgICAgICAgcmV0dXJuIChleHRlcm5hbF9uYW1lX3N5bWJvbCA/IChleHRlcm5hbF9uYW1l X3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgPyBleHRlcm5hbF9uYW1lX3N5bWJvbCAtPiBVdGY4X2xp dGVyYWwgLT4gbGVuZ3RoIDogMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDogKG5hbWVfc3ltYm9sIC0+IFV0ZjhfbGl0ZXJhbCA/IG5hbWVfc3ltYm9sIC0+IFV0ZjhfbGl0 ZXJhbCAtPiBsZW5ndGggOiAwKSk7CiAgICB9CgogICAgVmFyaWFibGVTeW1ib2woTmFtZVN5bWJv bCAqbmFtZV9zeW1ib2xfKSA6IGRlY2xhcmF0b3IoX19udWxsICksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9zeW1ib2wobmFtZV9zeW1ib2xfKSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcihfX251 bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0 aWFsX3ZhbHVlKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGFjY2Vzc2VkX2xvY2FsKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsX25hbWVfc3ltYm9sKF9fbnVsbCApLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cygwKSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF92YXJp YWJsZV9pbmRleF8oLTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHR5cGVfKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNpZ25hdHVyZV9zdHJpbmcoX19udWxsICkKICAgIHsKICAgICAgICBTeW1i b2w6Ol9raW5kID0gVkFSSUFCTEU7CiAgICB9CgogICAgdmlydHVhbCB+VmFyaWFibGVTeW1ib2wo KSB7IGRlbGV0ZSBbXSBzaWduYXR1cmVfc3RyaW5nOyB9CgogICAgdm9pZCBTZXRPd25lcihTeW1i b2wgKm93bmVyXykgeyBvd25lciA9IG93bmVyXzsgfQoKICAgIHZvaWQgU2V0TG9jYWxWYXJpYWJs ZUluZGV4KGludCBpbmRleCkKICAgIHsKICAgICAgICBsb2NhbF92YXJpYWJsZV9pbmRleF8gPSBp bmRleDsKICAgICAgICBNYXJrQ29tcGxldGUoKTsKICAgIH0KICAgIGludCBMb2NhbFZhcmlhYmxl SW5kZXgoKSB7IHJldHVybiBsb2NhbF92YXJpYWJsZV9pbmRleF87IH0KCiAgICBib29sIElzVHlw ZWQoKQogICAgewogICAgICAgIHJldHVybiB0eXBlXyAhPSBfX251bGwgOwogICAgfQoKICAgIHZv aWQgU2V0VHlwZShUeXBlU3ltYm9sICpfdHlwZSkKICAgIHsKICAgICAgICB0eXBlXyA9IF90eXBl OwogICAgfQoKICAgIHZvaWQgUHJvY2Vzc1ZhcmlhYmxlU2lnbmF0dXJlKFNlbWFudGljICosIExl eFN0cmVhbTo6VG9rZW5JbmRleCk7CgogICAgVHlwZVN5bWJvbCAqVHlwZSgpCiAgICB7CiAgICAg ICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCB0eXBlXyApID8gMCA6CShfX2Fzc2VydF9mYWlsICgi dHlwZV8iICwgIi4uLy4uL2ppa2VzL3NyYy9zeW1ib2wuaCIsIDEyNTUsIF9fUFJFVFRZX0ZVTkNU SU9OX18gKSwgMCkpKSA7ICAKICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgICAgIHJldHVy biB0eXBlXzsKICAgIH0KCiAgICB2b2lkIFNldFNpZ25hdHVyZVN0cmluZyhjb25zdCBjaGFyICpz aWduYXR1cmVfLCBpbnQgbGVuZ3RoKQogICAgewogICAgICAgIHNpZ25hdHVyZV9zdHJpbmcgPSBu ZXcgY2hhcltsZW5ndGggKyAxXTsKICAgICAgICBzdHJuY3B5KHNpZ25hdHVyZV9zdHJpbmcsIHNp Z25hdHVyZV8sIGxlbmd0aCk7CiAgICAgICAgc2lnbmF0dXJlX3N0cmluZ1tsZW5ndGhdID0gVV9O VUxMOwogICAgfQoKICAgIGJvb2wgSXNMb2NhbCgpICAgICAgICAgICAgICAgICAgICAgeyByZXR1 cm4gb3duZXIgLT4gTWV0aG9kQ2FzdCgpICE9IF9fbnVsbCA7IH0gICAgICAgICAgICAKICAgIGJv b2wgSXNMb2NhbChNZXRob2RTeW1ib2wgKm1ldGhvZCkgeyByZXR1cm4gb3duZXIgPT0gbWV0aG9k OyB9ICAKICAgIGJvb2wgSXNGaW5hbChUeXBlU3ltYm9sICp0eXBlKSAgICAgeyByZXR1cm4gKG93 bmVyID09IHR5cGUgJiYgQUNDX0ZJTkFMKCkpOyB9CgogICAgIAogICAgIAogICAgIAogICAgIAog ICAgdm9pZCBNYXJrSW5jb21wbGV0ZSgpICAgICAgICAgeyBzdGF0dXMgJj0gKH4oKHVuc2lnbmVk IGNoYXIpIDB4MDEpKTsgfQogICAgdm9pZCBNYXJrQ29tcGxldGUoKSAgICAgICAgICAgeyBzdGF0 dXMgfD0gKHVuc2lnbmVkIGNoYXIpIDB4MDE7IH0KICAgIGJvb2wgSXNEZWNsYXJhdGlvbkNvbXBs ZXRlKCkgIHsgcmV0dXJuIChzdGF0dXMgJiAodW5zaWduZWQgY2hhcikgMHgwMSkgIT0gMDsgfQoK ICAgIHZvaWQgTWFya05vdERlZmluaXRlbHlBc3NpZ25lZCgpIHsgc3RhdHVzICY9ICh+KCh1bnNp Z25lZCBjaGFyKSAweDAyKSk7IH0KICAgIHZvaWQgTWFya0RlZmluaXRlbHlBc3NpZ25lZCgpICAg IHsgc3RhdHVzIHw9ICh1bnNpZ25lZCBjaGFyKSAweDAyOyB9CiAgICBib29sIElzRGVmaW5pdGVs eUFzc2lnbmVkKCkgICAgICB7IHJldHVybiAoc3RhdHVzICYgKHVuc2lnbmVkIGNoYXIpIDB4MDIp ICE9IDA7IH0KCiAgICB2b2lkIE1hcmtQb3NzaWJseUFzc2lnbmVkKCkgeyBzdGF0dXMgfD0gKHVu c2lnbmVkIGNoYXIpIDB4MDQ7IH0KICAgIGJvb2wgSXNQb3NzaWJseUFzc2lnbmVkKCkgICB7IHJl dHVybiAoc3RhdHVzICYgKHVuc2lnbmVkIGNoYXIpIDB4MDQpICE9IDA7IH0KCiAgICB2b2lkIE1h cmtTeW50aGV0aWMoKSB7IHN0YXR1cyB8PSAodW5zaWduZWQgY2hhcikgMHgwODsgfQogICAgYm9v bCBJc1N5bnRoZXRpYygpICAgeyByZXR1cm4gKHN0YXR1cyAmICh1bnNpZ25lZCBjaGFyKSAweDA4 KSAhPSAwOyB9CgogICAgdm9pZCBNYXJrRGVwcmVjYXRlZCgpIHsgc3RhdHVzIHw9ICh1bnNpZ25l ZCBjaGFyKSAweDEwOyB9CiAgICBib29sIElzRGVwcmVjYXRlZCgpICAgeyByZXR1cm4gKHN0YXR1 cyAmICh1bnNpZ25lZCBjaGFyKSAweDEwKSAhPSAwOyB9Cgpwcml2YXRlOgogICAgTmFtZVN5bWJv bCAqZXh0ZXJuYWxfbmFtZV9zeW1ib2w7CgogICAgdW5zaWduZWQgY2hhciBzdGF0dXM7CiAgICBp bnQgbG9jYWxfdmFyaWFibGVfaW5kZXhfOwogICAgVHlwZVN5bWJvbCAqdHlwZV87CiAgICBjaGFy ICpzaWduYXR1cmVfc3RyaW5nOwp9OwoKCmNsYXNzIEJsb2NrU3ltYm9sIDogcHVibGljIFN5bWJv bAp7CnB1YmxpYzoKICAgIGludCBtYXhfdmFyaWFibGVfaW5kZXgsCiAgICAgICAgdHJ5X29yX3N5 bmNocm9uaXplZF92YXJpYWJsZV9pbmRleDsKCiAgICBCbG9ja1N5bWJvbChpbnQgaGFzaF9zaXpl KTsKICAgIHZpcnR1YWwgfkJsb2NrU3ltYm9sKCk7CgogICAgaW50IE51bVZhcmlhYmxlU3ltYm9s cygpOwogICAgVmFyaWFibGVTeW1ib2wgKlZhcmlhYmxlU3ltKGludCk7CgogICAgaW5saW5lIFZh cmlhYmxlU3ltYm9sICpGaW5kVmFyaWFibGVTeW1ib2woTmFtZVN5bWJvbCAqKTsKICAgIGlubGlu ZSBWYXJpYWJsZVN5bWJvbCAqSW5zZXJ0VmFyaWFibGVTeW1ib2woTmFtZVN5bWJvbCAqKTsKICAg IGlubGluZSB2b2lkIEluc2VydFZhcmlhYmxlU3ltYm9sKFZhcmlhYmxlU3ltYm9sICopOwogICAg aW5saW5lIEJsb2NrU3ltYm9sICpJbnNlcnRCbG9ja1N5bWJvbChpbnQpOwoKICAgIGlubGluZSB2 b2lkIENvbXByZXNzU3BhY2UoKTsKCiAgICBpbmxpbmUgU3ltYm9sVGFibGUgKlRhYmxlKCk7Cgpw cml2YXRlOgoKICAgIFN5bWJvbFRhYmxlICp0YWJsZTsKfTsKCgpjbGFzcyBMYWJlbFN5bWJvbCA6 IHB1YmxpYyBTeW1ib2wKewpwdWJsaWM6CiAgICBBc3RCbG9jayAqYmxvY2s7ICAKICAgIE5hbWVT eW1ib2wgKm5hbWVfc3ltYm9sOwoKICAgIGludCBuZXN0aW5nX2xldmVsOwoKICAgIHZpcnR1YWwg d2NoYXJfdCAqTmFtZSgpIHsgcmV0dXJuIG5hbWVfc3ltYm9sIC0+IE5hbWUoKTsgfQogICAgdmly dHVhbCBzaXplX3QgTmFtZUxlbmd0aCgpIHsgcmV0dXJuIG5hbWVfc3ltYm9sIC0+IE5hbWVMZW5n dGgoKTsgfQogICAgdmlydHVhbCBOYW1lU3ltYm9sICpJZGVudGl0eSgpIHsgcmV0dXJuIG5hbWVf c3ltYm9sOyB9CiAgICBjaGFyICpVdGY4TmFtZSgpIHsgcmV0dXJuIChjaGFyICopIChuYW1lX3N5 bWJvbCAtPiBVdGY4X2xpdGVyYWwgPyBuYW1lX3N5bWJvbCAtPiBVdGY4X2xpdGVyYWwgLT4gdmFs dWUgOiBfX251bGwgKTsgfQogICAgaW50IFV0ZjhOYW1lTGVuZ3RoKCkgeyByZXR1cm4gKG5hbWVf c3ltYm9sIC0+IFV0ZjhfbGl0ZXJhbCA/IG5hbWVfc3ltYm9sIC0+IFV0ZjhfbGl0ZXJhbCAtPiBs ZW5ndGggOiAwKTsgfQoKICAgIExhYmVsU3ltYm9sKE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sXykg OiBibG9jayhfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBuYW1lX3N5bWJvbChuYW1lX3N5bWJvbF8pLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwoMCkKICAgIHsKICAgICAgICBTeW1ib2w6 Ol9raW5kID0gTEFCRUw7CiAgICB9CgogICAgdmlydHVhbCB+TGFiZWxTeW1ib2woKSB7fQoKcHJp dmF0ZToKfTsKCgpjbGFzcyBTeW1ib2xUYWJsZQp7CnB1YmxpYzoKICAgIGVudW0KICAgIHsKICAg ICAgICBERUZBVUxUX0hBU0hfU0laRSA9IDEzLAogICAgICAgIE1BWF9IQVNIX1NJWkUgPSAxMDIx CiAgICB9OwoKICAgIGludCBOdW1Bbm9ueW1vdXNTeW1ib2xzKCkKICAgIHsKICAgICAgICByZXR1 cm4gKGFub255bW91c19zeW1ib2xfcG9vbCA/IGFub255bW91c19zeW1ib2xfcG9vbCAtPiBMZW5n dGgoKSA6IDApOwogICAgfQogICAgVHlwZVN5bWJvbCAqQW5vbnltb3VzU3ltKGludCBpKQogICAg ewogICAgICAgIHJldHVybiAoKmFub255bW91c19zeW1ib2xfcG9vbClbaV07CiAgICB9CiAgICB2 b2lkIEFkZEFub255bW91c1N5bWJvbChUeXBlU3ltYm9sICpzeW1ib2wpCiAgICB7CiAgICAgICAg aWYgKCEgYW5vbnltb3VzX3N5bWJvbF9wb29sKQogICAgICAgICAgICBhbm9ueW1vdXNfc3ltYm9s X3Bvb2wgPSBuZXcgQ29udmVydGlibGVBcnJheTxUeXBlU3ltYm9sICo+KDI1Nik7CiAgICAgICAg YW5vbnltb3VzX3N5bWJvbF9wb29sIC0+IE5leHQoKSA9IHN5bWJvbDsKICAgIH0KCiAgICBpbnQg TnVtVHlwZVN5bWJvbHMoKQogICAgewogICAgICAgIHJldHVybiAodHlwZV9zeW1ib2xfcG9vbCA/ IHR5cGVfc3ltYm9sX3Bvb2wgLT4gTGVuZ3RoKCkgOiAwKTsKICAgIH0KICAgIFR5cGVTeW1ib2wg KiZUeXBlU3ltKGludCBpKQogICAgewogICAgICAgIHJldHVybiAoKnR5cGVfc3ltYm9sX3Bvb2wp W2ldOwogICAgfQogICAgdm9pZCBBZGRUeXBlU3ltYm9sKFR5cGVTeW1ib2wgKnN5bWJvbCkKICAg IHsKICAgICAgICBpZiAoISB0eXBlX3N5bWJvbF9wb29sKQogICAgICAgICAgICB0eXBlX3N5bWJv bF9wb29sID0gbmV3IENvbnZlcnRpYmxlQXJyYXk8VHlwZVN5bWJvbCAqPigyNTYpOwogICAgICAg IHR5cGVfc3ltYm9sX3Bvb2wgLT4gTmV4dCgpID0gc3ltYm9sOwogICAgfQoKICAgIGludCBOdW1N ZXRob2RTeW1ib2xzKCkKICAgIHsKICAgICAgICByZXR1cm4gKG1ldGhvZF9zeW1ib2xfcG9vbCA/ IG1ldGhvZF9zeW1ib2xfcG9vbCAtPiBMZW5ndGgoKSA6IDApOwogICAgfQogICAgTWV0aG9kU3lt Ym9sICpNZXRob2RTeW0oaW50IGkpCiAgICB7CiAgICAgICAgcmV0dXJuICgqbWV0aG9kX3N5bWJv bF9wb29sKVtpXTsKICAgIH0KICAgIHZvaWQgQWRkTWV0aG9kU3ltYm9sKE1ldGhvZFN5bWJvbCAq c3ltYm9sKQogICAgewogICAgICAgIGlmICghIG1ldGhvZF9zeW1ib2xfcG9vbCkKICAgICAgICAg ICAgbWV0aG9kX3N5bWJvbF9wb29sID0gbmV3IENvbnZlcnRpYmxlQXJyYXk8TWV0aG9kU3ltYm9s ICo+KDI1Nik7CiAgICAgICAgbWV0aG9kX3N5bWJvbF9wb29sIC0+IE5leHQoKSA9IHN5bWJvbDsK ICAgIH0KCiAgICBpbnQgTnVtVmFyaWFibGVTeW1ib2xzKCkKICAgIHsKICAgICAgICByZXR1cm4g KHZhcmlhYmxlX3N5bWJvbF9wb29sID8gdmFyaWFibGVfc3ltYm9sX3Bvb2wgLT4gTGVuZ3RoKCkg OiAwKTsKICAgIH0KICAgIFZhcmlhYmxlU3ltYm9sICpWYXJpYWJsZVN5bShpbnQgaSkKICAgIHsK ICAgICAgICByZXR1cm4gKCp2YXJpYWJsZV9zeW1ib2xfcG9vbClbaV07CiAgICB9CiAgICB2b2lk IEFkZFZhcmlhYmxlU3ltYm9sKFZhcmlhYmxlU3ltYm9sICpzeW1ib2wpCiAgICB7CiAgICAgICAg aWYgKCEgdmFyaWFibGVfc3ltYm9sX3Bvb2wpCiAgICAgICAgICAgIHZhcmlhYmxlX3N5bWJvbF9w b29sID0gbmV3IENvbnZlcnRpYmxlQXJyYXk8VmFyaWFibGVTeW1ib2wgKj4oMjU2KTsKICAgICAg ICB2YXJpYWJsZV9zeW1ib2xfcG9vbCAtPiBOZXh0KCkgPSBzeW1ib2w7CiAgICB9CgogICAgaW50 IE51bU90aGVyU3ltYm9scygpCiAgICB7CiAgICAgICAgcmV0dXJuIChvdGhlcl9zeW1ib2xfcG9v bCA/IG90aGVyX3N5bWJvbF9wb29sIC0+IExlbmd0aCgpIDogMCk7CiAgICB9CiAgICBTeW1ib2wg Kk90aGVyU3ltKGludCBpKQogICAgewogICAgICAgIHJldHVybiAoKm90aGVyX3N5bWJvbF9wb29s KVtpXTsKICAgIH0KICAgIHZvaWQgQWRkT3RoZXJTeW1ib2woU3ltYm9sICpzeW1ib2wpCiAgICB7 CiAgICAgICAgaWYgKCEgb3RoZXJfc3ltYm9sX3Bvb2wpCiAgICAgICAgICAgIG90aGVyX3N5bWJv bF9wb29sID0gbmV3IENvbnZlcnRpYmxlQXJyYXk8U3ltYm9sICo+KDI1Nik7CiAgICAgICAgb3Ro ZXJfc3ltYm9sX3Bvb2wgLT4gTmV4dCgpID0gc3ltYm9sOwogICAgfQoKICAgIFN5bWJvbFRhYmxl KGludCBoYXNoX3NpemVfID0gREVGQVVMVF9IQVNIX1NJWkUpOwogICAgflN5bWJvbFRhYmxlKCk7 CgogICAgaW5saW5lIHZvaWQgQ29tcHJlc3NTcGFjZSgpCiAgICB7CiAgICAgICAgaWYgKGFub255 bW91c19zeW1ib2xfcG9vbCkKICAgICAgICAgICAgKHZvaWQpIGFub255bW91c19zeW1ib2xfcG9v bCAtPiBBcnJheSgpOwogICAgICAgIGlmIChtZXRob2Rfc3ltYm9sX3Bvb2wpCiAgICAgICAgICAg ICh2b2lkKSBtZXRob2Rfc3ltYm9sX3Bvb2wgLT4gQXJyYXkoKTsKICAgICAgICBpZiAodmFyaWFi bGVfc3ltYm9sX3Bvb2wpCiAgICAgICAgICAgICh2b2lkKSB2YXJpYWJsZV9zeW1ib2xfcG9vbCAt PiBBcnJheSgpOwogICAgICAgIGlmIChvdGhlcl9zeW1ib2xfcG9vbCkKICAgICAgICAgICAgKHZv aWQpIG90aGVyX3N5bWJvbF9wb29sIC0+IEFycmF5KCk7CgogICAgICAgIHJldHVybjsKICAgIH0K CnByaXZhdGU6CgogICAgVHVwbGU8VHlwZVN5bWJvbCAqPiAqdHlwZV9zeW1ib2xfcG9vbDsgIAoK ICAgIENvbnZlcnRpYmxlQXJyYXk8VHlwZVN5bWJvbCAqPiAgICAgKmFub255bW91c19zeW1ib2xf cG9vbDsKICAgIENvbnZlcnRpYmxlQXJyYXk8TWV0aG9kU3ltYm9sICo+ICAgKm1ldGhvZF9zeW1i b2xfcG9vbDsKICAgIENvbnZlcnRpYmxlQXJyYXk8VmFyaWFibGVTeW1ib2wgKj4gKnZhcmlhYmxl X3N5bWJvbF9wb29sOwogICAgQ29udmVydGlibGVBcnJheTxTeW1ib2wgKj4gICAgICAgICAqb3Ro ZXJfc3ltYm9sX3Bvb2w7CgogICAgU3ltYm9sICoqYmFzZTsKICAgIGludCBoYXNoX3NpemU7Cgog ICAgc3RhdGljIGludCBwcmltZXNbXTsKICAgIGludCBwcmltZV9pbmRleDsKCiAgICBpbnQgU2l6 ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIE51bUFub255bW91c1N5bWJvbHMoKSArCiAgICAgICAg ICAgICAgIE51bVR5cGVTeW1ib2xzKCkgKwogICAgICAgICAgICAgICBOdW1NZXRob2RTeW1ib2xz KCkgKwogICAgICAgICAgICAgICBOdW1WYXJpYWJsZVN5bWJvbHMoKSArCiAgICAgICAgICAgICAg IE51bU90aGVyU3ltYm9scygpOwogICAgfQogICAgdm9pZCBSZWhhc2goKTsKCiAgICBNZXRob2RT eW1ib2wgKmNvbnN0cnVjdG9yOwoKcHVibGljOgoKICAgIGlubGluZSBQYXRoU3ltYm9sICpJbnNl cnRQYXRoU3ltYm9sKE5hbWVTeW1ib2wgKiwgRGlyZWN0b3J5U3ltYm9sICopOwogICAgaW5saW5l IFBhdGhTeW1ib2wgKkZpbmRQYXRoU3ltYm9sKE5hbWVTeW1ib2wgKik7CiAgICBpbmxpbmUgRGly ZWN0b3J5U3ltYm9sICpJbnNlcnREaXJlY3RvcnlTeW1ib2woTmFtZVN5bWJvbCAqLCBTeW1ib2wg KiwgYm9vbCBzb3VyY2VfcGF0aCk7CiAgICBpbmxpbmUgRGlyZWN0b3J5U3ltYm9sICpGaW5kRGly ZWN0b3J5U3ltYm9sKE5hbWVTeW1ib2wgKik7CiAgICBpbmxpbmUgRmlsZVN5bWJvbCAqSW5zZXJ0 RmlsZVN5bWJvbChOYW1lU3ltYm9sICopOwogICAgaW5saW5lIEZpbGVTeW1ib2wgKkZpbmRGaWxl U3ltYm9sKE5hbWVTeW1ib2wgKik7CiAgICBpbmxpbmUgUGFja2FnZVN5bWJvbCAqSW5zZXJ0UGFj a2FnZVN5bWJvbChOYW1lU3ltYm9sICosIFBhY2thZ2VTeW1ib2wgKik7CiAgICBpbmxpbmUgUGFj a2FnZVN5bWJvbCAqRmluZFBhY2thZ2VTeW1ib2woTmFtZVN5bWJvbCAqKTsKICAgIGlubGluZSBU eXBlU3ltYm9sICpJbnNlcnRBbm9ueW1vdXNUeXBlU3ltYm9sKE5hbWVTeW1ib2wgKik7CiAgICBp bmxpbmUgVHlwZVN5bWJvbCAqSW5zZXJ0U3lzdGVtVHlwZVN5bWJvbChOYW1lU3ltYm9sICopOwog ICAgaW5saW5lIFR5cGVTeW1ib2wgKkluc2VydE91dGVyVHlwZVN5bWJvbChOYW1lU3ltYm9sICop OwogICAgaW5saW5lIFR5cGVTeW1ib2wgKkluc2VydE5lc3RlZFR5cGVTeW1ib2woTmFtZVN5bWJv bCAqKTsKICAgIGlubGluZSB2b2lkIERlbGV0ZVR5cGVTeW1ib2woVHlwZVN5bWJvbCAqKTsKICAg IGlubGluZSB2b2lkIERlbGV0ZUFub255bW91c1R5cGVzKCk7CiAgICBpbmxpbmUgVHlwZVN5bWJv bCAqRmluZFR5cGVTeW1ib2woTmFtZVN5bWJvbCAqKTsKICAgIGlubGluZSBNZXRob2RTeW1ib2wg Kkluc2VydE1ldGhvZFN5bWJvbChOYW1lU3ltYm9sICopOwogICAgaW5saW5lIE1ldGhvZFN5bWJv bCAqSW5zZXJ0Q29uc3RydWN0b3JTeW1ib2woTmFtZVN5bWJvbCAqKTsKICAgIGlubGluZSB2b2lk IEluc2VydE1ldGhvZFN5bWJvbChNZXRob2RTeW1ib2wgKik7CiAgICBpbmxpbmUgdm9pZCBJbnNl cnRDb25zdHJ1Y3RvclN5bWJvbChNZXRob2RTeW1ib2wgKik7CiAgICBpbmxpbmUgTWV0aG9kU3lt Ym9sICpGaW5kTWV0aG9kU3ltYm9sKE5hbWVTeW1ib2wgKik7CiAgICBpbmxpbmUgTWV0aG9kU3lt Ym9sICpGaW5kQ29uc3RydWN0b3JTeW1ib2woKTsKICAgIGlubGluZSBWYXJpYWJsZVN5bWJvbCAq SW5zZXJ0VmFyaWFibGVTeW1ib2woTmFtZVN5bWJvbCAqKTsKICAgIGlubGluZSB2b2lkIEluc2Vy dFZhcmlhYmxlU3ltYm9sKFZhcmlhYmxlU3ltYm9sICopOwogICAgaW5saW5lIFZhcmlhYmxlU3lt Ym9sICpGaW5kVmFyaWFibGVTeW1ib2woTmFtZVN5bWJvbCAqKTsKICAgIGlubGluZSBMYWJlbFN5 bWJvbCAqSW5zZXJ0TGFiZWxTeW1ib2woTmFtZVN5bWJvbCAqKTsKICAgIGlubGluZSBMYWJlbFN5 bWJvbCAqRmluZExhYmVsU3ltYm9sKE5hbWVTeW1ib2wgKik7CiAgICBpbmxpbmUgQmxvY2tTeW1i b2wgKkluc2VydEJsb2NrU3ltYm9sKGludCk7CgogICAgaW5saW5lIE1ldGhvZFN5bWJvbCAqT3Zl cmxvYWQoTWV0aG9kU3ltYm9sICopOwogICAgaW5saW5lIHZvaWQgT3ZlcmxvYWQoTWV0aG9kU3lt Ym9sICosIE1ldGhvZFN5bWJvbCAqKTsKICAgIGlubGluZSBNZXRob2RTeW1ib2wgKkxvY2FsQ29u c3RydWN0b3JPdmVybG9hZChNZXRob2RTeW1ib2wgKik7CiAgICBNZXRob2RTeW1ib2wgKkZpbmRP dmVybG9hZE1ldGhvZChNZXRob2RTeW1ib2wgKiwgQXN0TWV0aG9kRGVjbGFyYXRvciAqKTsKfTsK CgppbmxpbmUgaW50IFR5cGVTeW1ib2w6Ok51bVZhcmlhYmxlU3ltYm9scygpIHsgcmV0dXJuICh0 YWJsZSA/IHRhYmxlIC0+IE51bVZhcmlhYmxlU3ltYm9scygpIDogMCk7IH0KaW5saW5lIFZhcmlh YmxlU3ltYm9sICpUeXBlU3ltYm9sOjpWYXJpYWJsZVN5bShpbnQgaSkgeyByZXR1cm4gdGFibGUg LT4gVmFyaWFibGVTeW0oaSk7IH0KCmlubGluZSBpbnQgQmxvY2tTeW1ib2w6Ok51bVZhcmlhYmxl U3ltYm9scygpIHsgcmV0dXJuICh0YWJsZSA/IHRhYmxlIC0+IE51bVZhcmlhYmxlU3ltYm9scygp IDogMCk7IH0KaW5saW5lIFZhcmlhYmxlU3ltYm9sICpCbG9ja1N5bWJvbDo6VmFyaWFibGVTeW0o aW50IGkpIHsgcmV0dXJuIHRhYmxlIC0+IFZhcmlhYmxlU3ltKGkpOyB9CgppbmxpbmUgaW50IFR5 cGVTeW1ib2w6Ok51bU1ldGhvZFN5bWJvbHMoKSB7IHJldHVybiAodGFibGUgPyB0YWJsZSAtPiBO dW1NZXRob2RTeW1ib2xzKCkgOiAwKTsgfQppbmxpbmUgTWV0aG9kU3ltYm9sICpUeXBlU3ltYm9s OjpNZXRob2RTeW0oaW50IGkpIHsgcmV0dXJuIHRhYmxlIC0+IE1ldGhvZFN5bShpKTsgfQoKaW5s aW5lIGludCBUeXBlU3ltYm9sOjpOdW1UeXBlU3ltYm9scygpIHsgcmV0dXJuICh0YWJsZSA/IHRh YmxlIC0+IE51bVR5cGVTeW1ib2xzKCkgOiAwKTsgfQppbmxpbmUgVHlwZVN5bWJvbCAqVHlwZVN5 bWJvbDo6VHlwZVN5bShpbnQgaSkgeyByZXR1cm4gdGFibGUgLT4gVHlwZVN5bShpKTsgfQoKaW5s aW5lIHZvaWQgVHlwZVN5bWJvbDo6Q29tcHJlc3NTcGFjZSgpIHsgaWYgKHRhYmxlKSB0YWJsZSAt PiBDb21wcmVzc1NwYWNlKCk7IH0KaW5saW5lIHZvaWQgQmxvY2tTeW1ib2w6OkNvbXByZXNzU3Bh Y2UoKSB7IGlmICh0YWJsZSkgdGFibGUgLT4gQ29tcHJlc3NTcGFjZSgpOyB9CgppbmxpbmUgUGF0 aFN5bWJvbCAqU3ltYm9sVGFibGU6Okluc2VydFBhdGhTeW1ib2woTmFtZVN5bWJvbCAqbmFtZV9z eW1ib2wsIERpcmVjdG9yeVN5bWJvbCAqZGlyZWN0b3J5X3N5bWJvbCkKewogICAgKHN0YXRpY19j YXN0PHZvaWQ+ICAoKCBiYXNlICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJiYXNlIiAsICIuLi8u Li9qaWtlcy9zcmMvc3ltYm9sLmgiLCAxNTM5LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkg OwoKICAgIFBhdGhTeW1ib2wgKnN5bWJvbCA9IG5ldyBQYXRoU3ltYm9sKG5hbWVfc3ltYm9sKTsK ICAgIGRpcmVjdG9yeV9zeW1ib2wgLT4gb3duZXIgPSBzeW1ib2w7CiAgICBzeW1ib2wgLT4gcm9v dF9kaXJlY3RvcnkgPSBkaXJlY3Rvcnlfc3ltYm9sOwogICAgQWRkT3RoZXJTeW1ib2woc3ltYm9s KTsKCiAgICBpbnQgayA9IG5hbWVfc3ltYm9sIC0+IGluZGV4ICUgaGFzaF9zaXplOwogICAgc3lt Ym9sIC0+IG5leHQgPSBiYXNlW2tdOwogICAgYmFzZVtrXSA9IHN5bWJvbDsKCiAgICAgCiAgICAg CiAgICAgCiAgICAgCiAgICAgCiAgICBpZiAoKFNpemUoKSA+IChoYXNoX3NpemUgPDwgMSkpICYm IChoYXNoX3NpemUgPCBNQVhfSEFTSF9TSVpFKSkKICAgICAgICBSZWhhc2goKTsKCiAgICByZXR1 cm4gc3ltYm9sOwp9CgoKaW5saW5lIFBhdGhTeW1ib2wgKlN5bWJvbFRhYmxlOjpGaW5kUGF0aFN5 bWJvbChOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKewogICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAo KCBiYXNlICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJiYXNlIiAsICIuLi8uLi9qaWtlcy9zcmMv c3ltYm9sLmgiLCAxNTY0LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgIGZvciAo U3ltYm9sICpzeW1ib2wgPSBiYXNlW25hbWVfc3ltYm9sIC0+IGluZGV4ICUgaGFzaF9zaXplXTsg c3ltYm9sOyBzeW1ib2wgPSBzeW1ib2wgLT4gbmV4dCkKICAgIHsKICAgICAgICBpZiAobmFtZV9z eW1ib2wgPT0gc3ltYm9sIC0+IElkZW50aXR5KCkpCiAgICAgICAgICAgIHJldHVybiAoUGF0aFN5 bWJvbCAqKSBzeW1ib2w7CiAgICB9CgogICAgcmV0dXJuIChQYXRoU3ltYm9sICopIF9fbnVsbCA7 Cn0KCgppbmxpbmUgRGlyZWN0b3J5U3ltYm9sICpTeW1ib2xUYWJsZTo6SW5zZXJ0RGlyZWN0b3J5 U3ltYm9sKE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sLCBTeW1ib2wgKm93bmVyLCBib29sIHNvdXJj ZV9wYXRoKQp7CiAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIGJhc2UgKSA/IDAgOgkoX19hc3Nl cnRfZmFpbCAoImJhc2UiICwgIi4uLy4uL2ppa2VzL3NyYy9zeW1ib2wuaCIsIDE1NzgsIF9fUFJF VFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgRGlyZWN0b3J5U3ltYm9sICpzeW1ib2wgPSBu ZXcgRGlyZWN0b3J5U3ltYm9sKG5hbWVfc3ltYm9sLCBvd25lciwgc291cmNlX3BhdGgpOwogICAg QWRkT3RoZXJTeW1ib2woc3ltYm9sKTsKCiAgICBpbnQgayA9IG5hbWVfc3ltYm9sIC0+IGluZGV4 ICUgaGFzaF9zaXplOwogICAgc3ltYm9sIC0+IG5leHQgPSBiYXNlW2tdOwogICAgYmFzZVtrXSA9 IHN5bWJvbDsKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBpZiAoKFNpemUoKSA+ IChoYXNoX3NpemUgPDwgMSkpICYmIChoYXNoX3NpemUgPCBNQVhfSEFTSF9TSVpFKSkKICAgICAg ICBSZWhhc2goKTsKCiAgICByZXR1cm4gc3ltYm9sOwp9CgoKaW5saW5lIERpcmVjdG9yeVN5bWJv bCAqRGlyZWN0b3J5U3ltYm9sOjpJbnNlcnREaXJlY3RvcnlTeW1ib2woTmFtZVN5bWJvbCAqbmFt ZV9zeW1ib2wsIGJvb2wgc291cmNlX2RpcikKewogICAgRGlyZWN0b3J5U3ltYm9sICpzdWJkaXJl Y3Rvcnlfc3ltYm9sID0gVGFibGUoKSAtPiBJbnNlcnREaXJlY3RvcnlTeW1ib2wobmFtZV9zeW1i b2wsIHRoaXMsIHNvdXJjZV9kaXIpOwogICAgdGhpcyAtPiBzdWJkaXJlY3Rvcmllcy5OZXh0KCkg PSBzdWJkaXJlY3Rvcnlfc3ltYm9sOwoKICAgIHJldHVybiBzdWJkaXJlY3Rvcnlfc3ltYm9sOwp9 CgoKaW5saW5lIERpcmVjdG9yeVN5bWJvbCAqU3ltYm9sVGFibGU6OkZpbmREaXJlY3RvcnlTeW1i b2woTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wpCnsKICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCgg YmFzZSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiYmFzZSIgLCAiLi4vLi4vamlrZXMvc3JjL3N5 bWJvbC5oIiwgMTYxMCwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICBmb3IgKFN5 bWJvbCAqc3ltYm9sID0gYmFzZVtuYW1lX3N5bWJvbCAtPiBpbmRleCAlIGhhc2hfc2l6ZV07IHN5 bWJvbDsgc3ltYm9sID0gc3ltYm9sIC0+IG5leHQpCiAgICB7CiAgICAgICAgaWYgKG5hbWVfc3lt Ym9sID09IHN5bWJvbCAtPiBJZGVudGl0eSgpKQogICAgICAgIHsKICAgICAgICAgICAgRGlyZWN0 b3J5U3ltYm9sICpkaXJlY3Rvcnlfc3ltYm9sID0gc3ltYm9sIC0+IERpcmVjdG9yeUNhc3QoKTsK ICAgICAgICAgICAgaWYgKGRpcmVjdG9yeV9zeW1ib2wpCiAgICAgICAgICAgICAgICByZXR1cm4g ZGlyZWN0b3J5X3N5bWJvbDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIChEaXJlY3RvcnlT eW1ib2wgKikgX19udWxsIDsKfQoKCmlubGluZSBEaXJlY3RvcnlTeW1ib2wgKkRpcmVjdG9yeVN5 bWJvbDo6RmluZERpcmVjdG9yeVN5bWJvbChOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKewogICAg cmV0dXJuICh0YWJsZSA/IHRhYmxlIC0+IEZpbmREaXJlY3RvcnlTeW1ib2wobmFtZV9zeW1ib2wp IDogKERpcmVjdG9yeVN5bWJvbCAqKSBfX251bGwgKTsKfQoKCmlubGluZSBGaWxlU3ltYm9sICpT eW1ib2xUYWJsZTo6SW5zZXJ0RmlsZVN5bWJvbChOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKewog ICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBiYXNlICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJi YXNlIiAsICIuLi8uLi9qaWtlcy9zcmMvc3ltYm9sLmgiLCAxNjM0LCBfX1BSRVRUWV9GVU5DVElP Tl9fICksIDApKSkgOwoKICAgIEZpbGVTeW1ib2wgKnN5bWJvbCA9IG5ldyBGaWxlU3ltYm9sKG5h bWVfc3ltYm9sKTsKICAgIEFkZE90aGVyU3ltYm9sKHN5bWJvbCk7CgogICAgaW50IGsgPSBuYW1l X3N5bWJvbCAtPiBpbmRleCAlIGhhc2hfc2l6ZTsKICAgIHN5bWJvbCAtPiBuZXh0ID0gYmFzZVtr XTsKICAgIGJhc2Vba10gPSBzeW1ib2w7CgogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAog ICAgaWYgKChTaXplKCkgPiAoaGFzaF9zaXplIDw8IDEpKSAmJiAoaGFzaF9zaXplIDwgTUFYX0hB U0hfU0laRSkpCiAgICAgICAgUmVoYXNoKCk7CgogICAgcmV0dXJuIHN5bWJvbDsKfQoKCmlubGlu ZSBGaWxlU3ltYm9sICpEaXJlY3RvcnlTeW1ib2w6Okluc2VydEZpbGVTeW1ib2woTmFtZVN5bWJv bCAqbmFtZV9zeW1ib2wpCnsKICAgIHJldHVybiBUYWJsZSgpIC0+IEluc2VydEZpbGVTeW1ib2wo bmFtZV9zeW1ib2wpOwp9CgoKaW5saW5lIEZpbGVTeW1ib2wgKlN5bWJvbFRhYmxlOjpGaW5kRmls ZVN5bWJvbChOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKewogICAgKHN0YXRpY19jYXN0PHZvaWQ+ ICAoKCBiYXNlICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJiYXNlIiAsICIuLi8uLi9qaWtlcy9z cmMvc3ltYm9sLmgiLCAxNjYzLCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgIGZv ciAoU3ltYm9sICpzeW1ib2wgPSBiYXNlW25hbWVfc3ltYm9sIC0+IGluZGV4ICUgaGFzaF9zaXpl XTsgc3ltYm9sOyBzeW1ib2wgPSBzeW1ib2wgLT4gbmV4dCkKICAgIHsKICAgICAgICBpZiAobmFt ZV9zeW1ib2wgPT0gc3ltYm9sIC0+IElkZW50aXR5KCkpCiAgICAgICAgewogICAgICAgICAgICBG aWxlU3ltYm9sICpmaWxlX3N5bWJvbCA9IHN5bWJvbCAtPiBGaWxlQ2FzdCgpOwogICAgICAgICAg ICBpZiAoZmlsZV9zeW1ib2wpCiAgICAgICAgICAgICAgICByZXR1cm4gZmlsZV9zeW1ib2w7CiAg ICAgICAgfQogICAgfQoKICAgIHJldHVybiAoRmlsZVN5bWJvbCAqKSBfX251bGwgOwp9CgoKaW5s aW5lIEZpbGVTeW1ib2wgKkRpcmVjdG9yeVN5bWJvbDo6RmluZEZpbGVTeW1ib2woTmFtZVN5bWJv bCAqbmFtZV9zeW1ib2wpCnsKICAgIHJldHVybiAodGFibGUgPyB0YWJsZSAtPiBGaW5kRmlsZVN5 bWJvbChuYW1lX3N5bWJvbCkgOiAoRmlsZVN5bWJvbCAqKSBfX251bGwgKTsKfQoKCmlubGluZSBQ YWNrYWdlU3ltYm9sICpTeW1ib2xUYWJsZTo6SW5zZXJ0UGFja2FnZVN5bWJvbChOYW1lU3ltYm9s ICpuYW1lX3N5bWJvbCwgUGFja2FnZVN5bWJvbCAqb3duZXIpCnsKICAgIChzdGF0aWNfY2FzdDx2 b2lkPiAgKCggYmFzZSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiYmFzZSIgLCAiLi4vLi4vamlr ZXMvc3JjL3N5bWJvbC5oIiwgMTY4NywgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAg ICBQYWNrYWdlU3ltYm9sICpzeW1ib2wgPSBuZXcgUGFja2FnZVN5bWJvbChuYW1lX3N5bWJvbCwg b3duZXIpOwogICAgQWRkT3RoZXJTeW1ib2woc3ltYm9sKTsKCiAgICBpbnQgayA9IG5hbWVfc3lt Ym9sIC0+IGluZGV4ICUgaGFzaF9zaXplOwogICAgc3ltYm9sIC0+IG5leHQgPSBiYXNlW2tdOwog ICAgYmFzZVtrXSA9IHN5bWJvbDsKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBp ZiAoKFNpemUoKSA+IChoYXNoX3NpemUgPDwgMSkpICYmIChoYXNoX3NpemUgPCBNQVhfSEFTSF9T SVpFKSkKICAgICAgICBSZWhhc2goKTsKCiAgICByZXR1cm4gc3ltYm9sOwp9CgoKaW5saW5lIFBh Y2thZ2VTeW1ib2wgKlBhY2thZ2VTeW1ib2w6Okluc2VydFBhY2thZ2VTeW1ib2woTmFtZVN5bWJv bCAqbmFtZV9zeW1ib2wpCnsKICAgIHJldHVybiBUYWJsZSgpIC0+IEluc2VydFBhY2thZ2VTeW1i b2wobmFtZV9zeW1ib2wsIHRoaXMpOwp9CgoKaW5saW5lIFBhY2thZ2VTeW1ib2wgKlN5bWJvbFRh YmxlOjpGaW5kUGFja2FnZVN5bWJvbChOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKewogICAgKHN0 YXRpY19jYXN0PHZvaWQ+ICAoKCBiYXNlICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJiYXNlIiAs ICIuLi8uLi9qaWtlcy9zcmMvc3ltYm9sLmgiLCAxNzE2LCBfX1BSRVRUWV9GVU5DVElPTl9fICks IDApKSkgOwoKICAgIGZvciAoU3ltYm9sICpzeW1ib2wgPSBiYXNlW25hbWVfc3ltYm9sIC0+IGlu ZGV4ICUgaGFzaF9zaXplXTsgc3ltYm9sOyBzeW1ib2wgPSBzeW1ib2wgLT4gbmV4dCkKICAgIHsK ICAgICAgICBpZiAobmFtZV9zeW1ib2wgPT0gc3ltYm9sIC0+IElkZW50aXR5KCkpCiAgICAgICAg ewogICAgICAgICAgICBQYWNrYWdlU3ltYm9sICpwYWNrYWdlX3N5bWJvbCA9IHN5bWJvbCAtPiBQ YWNrYWdlQ2FzdCgpOwogICAgICAgICAgICBpZiAocGFja2FnZV9zeW1ib2wpCiAgICAgICAgICAg ICAgICByZXR1cm4gcGFja2FnZV9zeW1ib2w7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAo UGFja2FnZVN5bWJvbCAqKSBfX251bGwgOwp9CgoKaW5saW5lIFBhY2thZ2VTeW1ib2wgKlBhY2th Z2VTeW1ib2w6OkZpbmRQYWNrYWdlU3ltYm9sKE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sKQp7CiAg cmV0dXJuICh0YWJsZSA/IHRhYmxlIC0+IEZpbmRQYWNrYWdlU3ltYm9sKG5hbWVfc3ltYm9sKSA6 IChQYWNrYWdlU3ltYm9sICopIF9fbnVsbCApOwp9CgppbmxpbmUgVHlwZVN5bWJvbCAqU3ltYm9s VGFibGU6Okluc2VydEFub255bW91c1R5cGVTeW1ib2woTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wp CnsKICAgIFR5cGVTeW1ib2wgKnN5bWJvbCA9IG5ldyBUeXBlU3ltYm9sKG5hbWVfc3ltYm9sKTsK ICAgIEFkZEFub255bW91c1N5bWJvbChzeW1ib2wpOwoKICAgIHJldHVybiBzeW1ib2w7Cn0KCgpp bmxpbmUgVHlwZVN5bWJvbCAqVHlwZVN5bWJvbDo6SW5zZXJ0QW5vbnltb3VzVHlwZVN5bWJvbChO YW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKewogICAgcmV0dXJuIFRhYmxlKCkgLT4gSW5zZXJ0QW5v bnltb3VzVHlwZVN5bWJvbChuYW1lX3N5bWJvbCk7Cn0KCgppbmxpbmUgVHlwZVN5bWJvbCAqU3lt Ym9sVGFibGU6Okluc2VydFN5c3RlbVR5cGVTeW1ib2woTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wp CnsKICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggYmFzZSApID8gMCA6CShfX2Fzc2VydF9mYWls ICgiYmFzZSIgLCAiLi4vLi4vamlrZXMvc3JjL3N5bWJvbC5oIiwgMTc1NCwgX19QUkVUVFlfRlVO Q1RJT05fXyApLCAwKSkpIDsKCiAgICBUeXBlU3ltYm9sICpzeW1ib2wgPSBuZXcgVHlwZVN5bWJv bChuYW1lX3N5bWJvbCk7CiAgICBzeW1ib2wgLT4gcG9vbF9pbmRleCA9IE51bVR5cGVTeW1ib2xz KCk7CiAgICBBZGRUeXBlU3ltYm9sKHN5bWJvbCk7CgogICAgaW50IGsgPSBuYW1lX3N5bWJvbCAt PiBpbmRleCAlIGhhc2hfc2l6ZTsKICAgIHN5bWJvbCAtPiBuZXh0ID0gYmFzZVtrXTsKICAgIGJh c2Vba10gPSBzeW1ib2w7CgogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgaWYgKChT aXplKCkgPiAoaGFzaF9zaXplIDw8IDEpKSAmJiAoaGFzaF9zaXplIDwgTUFYX0hBU0hfU0laRSkp CiAgICAgICAgUmVoYXNoKCk7CgogICAgcmV0dXJuIHN5bWJvbDsKfQoKCmlubGluZSBUeXBlU3lt Ym9sICpQYWNrYWdlU3ltYm9sOjpJbnNlcnRTeXN0ZW1UeXBlU3ltYm9sKE5hbWVTeW1ib2wgKm5h bWVfc3ltYm9sKQp7CiAgICByZXR1cm4gVGFibGUoKSAtPiBJbnNlcnRTeXN0ZW1UeXBlU3ltYm9s KG5hbWVfc3ltYm9sKTsKfQoKCmlubGluZSBUeXBlU3ltYm9sICpTeW1ib2xUYWJsZTo6SW5zZXJ0 T3V0ZXJUeXBlU3ltYm9sKE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sKQp7CiAgICAoc3RhdGljX2Nh c3Q8dm9pZD4gICgoIGJhc2UgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImJhc2UiICwgIi4uLy4u L2ppa2VzL3NyYy9zeW1ib2wuaCIsIDE3ODQsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7 CgogICAgVHlwZVN5bWJvbCAqc3ltYm9sID0gbmV3IFR5cGVTeW1ib2wobmFtZV9zeW1ib2wpOwog ICAgc3ltYm9sIC0+IHBvb2xfaW5kZXggPSBOdW1UeXBlU3ltYm9scygpOwogICAgQWRkVHlwZVN5 bWJvbChzeW1ib2wpOwoKICAgIGludCBrID0gbmFtZV9zeW1ib2wgLT4gaW5kZXggJSBoYXNoX3Np emU7CiAgICBzeW1ib2wgLT4gbmV4dCA9IGJhc2Vba107CiAgICBiYXNlW2tdID0gc3ltYm9sOwoK ICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGlmICgoU2l6ZSgpID4gKGhhc2hfc2l6 ZSA8PCAxKSkgJiYgKGhhc2hfc2l6ZSA8IE1BWF9IQVNIX1NJWkUpKQogICAgICAgIFJlaGFzaCgp OwoKICAgIHJldHVybiBzeW1ib2w7Cn0KCgppbmxpbmUgVHlwZVN5bWJvbCAqUGFja2FnZVN5bWJv bDo6SW5zZXJ0T3V0ZXJUeXBlU3ltYm9sKE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sKQp7CiAgICBy ZXR1cm4gVGFibGUoKSAtPiBJbnNlcnRPdXRlclR5cGVTeW1ib2wobmFtZV9zeW1ib2wpOwp9CgoK aW5saW5lIFR5cGVTeW1ib2wgKlN5bWJvbFRhYmxlOjpJbnNlcnROZXN0ZWRUeXBlU3ltYm9sKE5h bWVTeW1ib2wgKm5hbWVfc3ltYm9sKQp7CiAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIGJhc2Ug KSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImJhc2UiICwgIi4uLy4uL2ppa2VzL3NyYy9zeW1ib2wu aCIsIDE4MTQsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgVHlwZVN5bWJvbCAq c3ltYm9sID0gbmV3IFR5cGVTeW1ib2wobmFtZV9zeW1ib2wpOwogICAgc3ltYm9sIC0+IHBvb2xf aW5kZXggPSBOdW1UeXBlU3ltYm9scygpOwogICAgQWRkVHlwZVN5bWJvbChzeW1ib2wpOwoKICAg IGludCBrID0gbmFtZV9zeW1ib2wgLT4gaW5kZXggJSBoYXNoX3NpemU7CiAgICBzeW1ib2wgLT4g bmV4dCA9IGJhc2Vba107CiAgICBiYXNlW2tdID0gc3ltYm9sOwoKICAgICAKICAgICAKICAgICAK ICAgICAKICAgICAKICAgIGlmICgoU2l6ZSgpID4gKGhhc2hfc2l6ZSA8PCAxKSkgJiYgKGhhc2hf c2l6ZSA8IE1BWF9IQVNIX1NJWkUpKQogICAgICAgIFJlaGFzaCgpOwoKICAgIHJldHVybiBzeW1i b2w7Cn0KCgppbmxpbmUgVHlwZVN5bWJvbCAqVHlwZVN5bWJvbDo6SW5zZXJ0TmVzdGVkVHlwZVN5 bWJvbChOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKewogICAgcmV0dXJuIFRhYmxlKCkgLT4gSW5z ZXJ0TmVzdGVkVHlwZVN5bWJvbChuYW1lX3N5bWJvbCk7Cn0KCgppbmxpbmUgdm9pZCBTeW1ib2xU YWJsZTo6RGVsZXRlVHlwZVN5bWJvbChUeXBlU3ltYm9sICp0eXBlKQp7CiAgICAoc3RhdGljX2Nh c3Q8dm9pZD4gICgoIGJhc2UgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImJhc2UiICwgIi4uLy4u L2ppa2VzL3NyYy9zeW1ib2wuaCIsIDE4NDQsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7 CgogICAgaW50IGsgPSB0eXBlIC0+IG5hbWVfc3ltYm9sIC0+IGluZGV4ICUgaGFzaF9zaXplOwog ICAgaWYgKHR5cGUgPT0gYmFzZVtrXSkKICAgICAgICBiYXNlW2tdID0gdHlwZSAtPiBuZXh0Owog ICAgZWxzZQogICAgewogICAgICAgIFN5bWJvbCAqcHJldmlvdXMgPSBiYXNlW2tdOwogICAgICAg IGZvciAoU3ltYm9sICpzeW1ib2wgPSBwcmV2aW91cyAtPiBuZXh0OyBzeW1ib2wgIT0gdHlwZTsg cHJldmlvdXMgPSBzeW1ib2wsIHN5bWJvbCA9IHN5bWJvbCAtPiBuZXh0KQogICAgICAgICAgICA7 CiAgICAgICAgcHJldmlvdXMgLT4gbmV4dCA9IHR5cGUgLT4gbmV4dDsKICAgIH0KCiAgICBpbnQg bGFzdF9pbmRleCA9IE51bVR5cGVTeW1ib2xzKCkgLSAxOwogICAgaWYgKHR5cGUgLT4gcG9vbF9p bmRleCAhPSBsYXN0X2luZGV4KQogICAgeyAKICAgICAgICBUeXBlU3ltKGxhc3RfaW5kZXgpIC0+ IHBvb2xfaW5kZXggPSB0eXBlIC0+IHBvb2xfaW5kZXg7CiAgICAgICAgVHlwZVN5bSh0eXBlIC0+ IHBvb2xfaW5kZXgpID0gVHlwZVN5bShsYXN0X2luZGV4KTsKICAgIH0KCiAgICB0eXBlX3N5bWJv bF9wb29sIC0+IFJlc2V0KGxhc3RfaW5kZXgpOyAgCgogICAgZGVsZXRlIHR5cGU7CgogICAgcmV0 dXJuOwp9CgoKaW5saW5lIHZvaWQgUGFja2FnZVN5bWJvbDo6RGVsZXRlVHlwZVN5bWJvbChUeXBl U3ltYm9sICp0eXBlKQp7CiAgICBpZiAodGFibGUpCiAgICAgICAgdGFibGUgLT4gRGVsZXRlVHlw ZVN5bWJvbCh0eXBlKTsKfQoKCmlubGluZSB2b2lkIFN5bWJvbFRhYmxlOjpEZWxldGVBbm9ueW1v dXNUeXBlcygpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtQW5vbnltb3VzU3ltYm9scygp OyBpKyspCiAgICAgICAgZGVsZXRlIEFub255bW91c1N5bShpKTsKICAgIGRlbGV0ZSBhbm9ueW1v dXNfc3ltYm9sX3Bvb2w7CiAgICBhbm9ueW1vdXNfc3ltYm9sX3Bvb2wgPSBfX251bGwgOwoKICAg IHJldHVybjsKfQoKCmlubGluZSB2b2lkIFR5cGVTeW1ib2w6OkRlbGV0ZUFub255bW91c1R5cGVz KCkKewogICAgZGVsZXRlIGFub255bW91c190eXBlczsKICAgIGFub255bW91c190eXBlcyA9IF9f bnVsbCA7CiAgICBpZiAodGFibGUpCiAgICAgICAgdGFibGUgLT4gRGVsZXRlQW5vbnltb3VzVHlw ZXMoKTsKfQoKaW5saW5lIFR5cGVTeW1ib2wgKlN5bWJvbFRhYmxlOjpGaW5kVHlwZVN5bWJvbChO YW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKewogICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBiYXNl ICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJiYXNlIiAsICIuLi8uLi9qaWtlcy9zcmMvc3ltYm9s LmgiLCAxOTAwLCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgIGZvciAoU3ltYm9s ICpzeW1ib2wgPSBiYXNlW25hbWVfc3ltYm9sIC0+IGluZGV4ICUgaGFzaF9zaXplXTsgc3ltYm9s OyBzeW1ib2wgPSBzeW1ib2wgLT4gbmV4dCkKICAgIHsKICAgICAgICBpZiAobmFtZV9zeW1ib2wg PT0gc3ltYm9sIC0+IElkZW50aXR5KCkpCiAgICAgICAgewogICAgICAgICAgICBUeXBlU3ltYm9s ICp0eXBlID0gc3ltYm9sIC0+IFR5cGVDYXN0KCk7CiAgICAgICAgICAgIGlmICh0eXBlKQogICAg ICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAoVHlw ZVN5bWJvbCAqKSBfX251bGwgOwp9CgoKaW5saW5lIFR5cGVTeW1ib2wgKlBhY2thZ2VTeW1ib2w6 OkZpbmRUeXBlU3ltYm9sKE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sKQp7CiAgICByZXR1cm4gKHRh YmxlID8gdGFibGUgLT4gRmluZFR5cGVTeW1ib2wobmFtZV9zeW1ib2wpIDogKFR5cGVTeW1ib2wg KikgX19udWxsICk7Cn0KCgppbmxpbmUgVHlwZVN5bWJvbCAqVHlwZVN5bWJvbDo6RmluZFR5cGVT eW1ib2woTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wpCnsKICAgIHJldHVybiAodGFibGUgPyB0YWJs ZSAtPiBGaW5kVHlwZVN5bWJvbChuYW1lX3N5bWJvbCkgOiAoVHlwZVN5bWJvbCAqKSBfX251bGwg KTsKfQoKCmlubGluZSBNZXRob2RTeW1ib2wgKlN5bWJvbFRhYmxlOjpJbnNlcnRNZXRob2RTeW1i b2woTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wpCnsKICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCgg YmFzZSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiYmFzZSIgLCAiLi4vLi4vamlrZXMvc3JjL3N5 bWJvbC5oIiwgMTkzMCwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICBNZXRob2RT eW1ib2wgKnN5bWJvbCA9IG5ldyBNZXRob2RTeW1ib2wobmFtZV9zeW1ib2wpOwogICAgQWRkTWV0 aG9kU3ltYm9sKHN5bWJvbCk7CgogICAgaW50IGsgPSBuYW1lX3N5bWJvbCAtPiBpbmRleCAlIGhh c2hfc2l6ZTsKICAgIHN5bWJvbCAtPiBuZXh0ID0gYmFzZVtrXTsKICAgIGJhc2Vba10gPSBzeW1i b2w7CgogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgaWYgKChTaXplKCkgPiAoaGFz aF9zaXplIDw8IDEpKSAmJiAoaGFzaF9zaXplIDwgTUFYX0hBU0hfU0laRSkpCiAgICAgICAgUmVo YXNoKCk7CgogICAgcmV0dXJuIHN5bWJvbDsKfQoKCmlubGluZSBNZXRob2RTeW1ib2wgKlR5cGVT eW1ib2w6Okluc2VydE1ldGhvZFN5bWJvbChOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKewogICAg cmV0dXJuIFRhYmxlKCkgLT4gSW5zZXJ0TWV0aG9kU3ltYm9sKG5hbWVfc3ltYm9sKTsKfQoKCmlu bGluZSBNZXRob2RTeW1ib2wgKlN5bWJvbFRhYmxlOjpJbnNlcnRDb25zdHJ1Y3RvclN5bWJvbChO YW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKewogICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCAhIGNv bnN0cnVjdG9yICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCIhIGNvbnN0cnVjdG9yIiAsICIuLi8u Li9qaWtlcy9zcmMvc3ltYm9sLmgiLCAxOTU5LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkg OwoKICAgIHRoaXMgLT4gY29uc3RydWN0b3IgPSBJbnNlcnRNZXRob2RTeW1ib2wobmFtZV9zeW1i b2wpOwogICAgcmV0dXJuIHRoaXMgLT4gY29uc3RydWN0b3I7Cn0KCgppbmxpbmUgTWV0aG9kU3lt Ym9sICpUeXBlU3ltYm9sOjpJbnNlcnRDb25zdHJ1Y3RvclN5bWJvbChOYW1lU3ltYm9sICpuYW1l X3N5bWJvbCkKewogICAgcmV0dXJuIFRhYmxlKCkgLT4gSW5zZXJ0Q29uc3RydWN0b3JTeW1ib2wo bmFtZV9zeW1ib2wpOwp9CgoKaW5saW5lIHZvaWQgU3ltYm9sVGFibGU6Okluc2VydE1ldGhvZFN5 bWJvbChNZXRob2RTeW1ib2wgKm1ldGhvZF9zeW1ib2wpCnsKICAgIChzdGF0aWNfY2FzdDx2b2lk PiAgKCggYmFzZSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiYmFzZSIgLCAiLi4vLi4vamlrZXMv c3JjL3N5bWJvbC5oIiwgMTk3NCwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICBB ZGRNZXRob2RTeW1ib2wobWV0aG9kX3N5bWJvbCk7CgogICAgaW50IGsgPSBtZXRob2Rfc3ltYm9s IC0+IG5hbWVfc3ltYm9sIC0+IGluZGV4ICUgaGFzaF9zaXplOwogICAgbWV0aG9kX3N5bWJvbCAt PiBuZXh0ID0gYmFzZVtrXTsKICAgIGJhc2Vba10gPSBtZXRob2Rfc3ltYm9sOwoKICAgICAKICAg ICAKICAgICAKICAgICAKICAgICAKICAgIGlmICgoU2l6ZSgpID4gKGhhc2hfc2l6ZSA8PCAxKSkg JiYgKGhhc2hfc2l6ZSA8IE1BWF9IQVNIX1NJWkUpKQogICAgICAgIFJlaGFzaCgpOwoKICAgIHJl dHVybjsKfQoKCmlubGluZSB2b2lkIFR5cGVTeW1ib2w6Okluc2VydE1ldGhvZFN5bWJvbChNZXRo b2RTeW1ib2wgKm1ldGhvZF9zeW1ib2wpCnsKICAgIFRhYmxlKCkgLT4gSW5zZXJ0TWV0aG9kU3lt Ym9sKG1ldGhvZF9zeW1ib2wpOwp9CgoKaW5saW5lIHZvaWQgU3ltYm9sVGFibGU6Okluc2VydENv bnN0cnVjdG9yU3ltYm9sKE1ldGhvZFN5bWJvbCAqbWV0aG9kX3N5bWJvbCkKewogICAgKHN0YXRp Y19jYXN0PHZvaWQ+ICAoKCAhIGNvbnN0cnVjdG9yICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCIh IGNvbnN0cnVjdG9yIiAsICIuLi8uLi9qaWtlcy9zcmMvc3ltYm9sLmgiLCAyMDAyLCBfX1BSRVRU WV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgIHRoaXMgLT4gY29uc3RydWN0b3IgPSBtZXRob2Rf c3ltYm9sOwogICAgSW5zZXJ0TWV0aG9kU3ltYm9sKG1ldGhvZF9zeW1ib2wpOwp9CgoKaW5saW5l IHZvaWQgVHlwZVN5bWJvbDo6SW5zZXJ0Q29uc3RydWN0b3JTeW1ib2woTWV0aG9kU3ltYm9sICpt ZXRob2Rfc3ltYm9sKQp7CiAgICBUYWJsZSgpIC0+IEluc2VydENvbnN0cnVjdG9yU3ltYm9sKG1l dGhvZF9zeW1ib2wpOwp9CgoKaW5saW5lIE1ldGhvZFN5bWJvbCAqU3ltYm9sVGFibGU6OkZpbmRN ZXRob2RTeW1ib2woTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wpCnsKICAgIChzdGF0aWNfY2FzdDx2 b2lkPiAgKCggYmFzZSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiYmFzZSIgLCAiLi4vLi4vamlr ZXMvc3JjL3N5bWJvbC5oIiwgMjAxNywgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAg ICBmb3IgKFN5bWJvbCAqc3ltYm9sID0gYmFzZVtuYW1lX3N5bWJvbCAtPiBpbmRleCAlIGhhc2hf c2l6ZV07IHN5bWJvbDsgc3ltYm9sID0gc3ltYm9sIC0+IG5leHQpCiAgICB7CiAgICAgICAgaWYg KG5hbWVfc3ltYm9sID09IHN5bWJvbCAtPiBJZGVudGl0eSgpKQogICAgICAgIHsKICAgICAgICAg ICAgTWV0aG9kU3ltYm9sICptZXRob2QgPSBzeW1ib2wgLT4gTWV0aG9kQ2FzdCgpOwogICAgICAg ICAgICBpZiAobWV0aG9kKQogICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKICAgICAgICB9 CiAgICB9CgogICAgcmV0dXJuIChNZXRob2RTeW1ib2wgKikgX19udWxsIDsKfQoKCmlubGluZSBN ZXRob2RTeW1ib2wgKlR5cGVTeW1ib2w6OkZpbmRNZXRob2RTeW1ib2woTmFtZVN5bWJvbCAqbmFt ZV9zeW1ib2wpCnsKICAgIHJldHVybiAodGFibGUgPyB0YWJsZSAtPiBGaW5kTWV0aG9kU3ltYm9s KG5hbWVfc3ltYm9sKSA6IChNZXRob2RTeW1ib2wgKikgX19udWxsICk7Cn0KCgppbmxpbmUgTWV0 aG9kU3ltYm9sICpTeW1ib2xUYWJsZTo6RmluZENvbnN0cnVjdG9yU3ltYm9sKCkKewogICAgcmV0 dXJuIHRoaXMgLT4gY29uc3RydWN0b3I7Cn0KCmlubGluZSBNZXRob2RTeW1ib2wgKlR5cGVTeW1i b2w6OkZpbmRDb25zdHJ1Y3RvclN5bWJvbCgpCnsKICAgIHJldHVybiAodGFibGUgPyB0YWJsZSAt PiBGaW5kQ29uc3RydWN0b3JTeW1ib2woKSA6IChNZXRob2RTeW1ib2wgKikgX19udWxsICk7Cn0K CmlubGluZSBWYXJpYWJsZVN5bWJvbCAqU3ltYm9sVGFibGU6Okluc2VydFZhcmlhYmxlU3ltYm9s KE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sKQp7CiAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIGJh c2UgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImJhc2UiICwgIi4uLy4uL2ppa2VzL3NyYy9zeW1i b2wuaCIsIDIwNTEsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgVmFyaWFibGVT eW1ib2wgKnN5bWJvbCA9IG5ldyBWYXJpYWJsZVN5bWJvbChuYW1lX3N5bWJvbCk7CiAgICBBZGRW YXJpYWJsZVN5bWJvbChzeW1ib2wpOwoKICAgIGludCBrID0gbmFtZV9zeW1ib2wgLT4gaW5kZXgg JSBoYXNoX3NpemU7CiAgICBzeW1ib2wgLT4gbmV4dCA9IGJhc2Vba107CiAgICBiYXNlW2tdID0g c3ltYm9sOwoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGlmICgoU2l6ZSgpID4g KGhhc2hfc2l6ZSA8PCAxKSkgJiYgKGhhc2hfc2l6ZSA8IE1BWF9IQVNIX1NJWkUpKQogICAgICAg IFJlaGFzaCgpOwoKICAgIHJldHVybiBzeW1ib2w7Cn0KCgppbmxpbmUgVmFyaWFibGVTeW1ib2wg KlR5cGVTeW1ib2w6Okluc2VydFZhcmlhYmxlU3ltYm9sKE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9s KQp7CiAgICByZXR1cm4gVGFibGUoKSAtPiBJbnNlcnRWYXJpYWJsZVN5bWJvbChuYW1lX3N5bWJv bCk7Cn0KCgppbmxpbmUgVmFyaWFibGVTeW1ib2wgKkJsb2NrU3ltYm9sOjpJbnNlcnRWYXJpYWJs ZVN5bWJvbChOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKewogICAgcmV0dXJuIFRhYmxlKCkgLT4g SW5zZXJ0VmFyaWFibGVTeW1ib2wobmFtZV9zeW1ib2wpOwp9CgoKaW5saW5lIHZvaWQgU3ltYm9s VGFibGU6Okluc2VydFZhcmlhYmxlU3ltYm9sKFZhcmlhYmxlU3ltYm9sICp2YXJpYWJsZV9zeW1i b2wpCnsKICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggYmFzZSApID8gMCA6CShfX2Fzc2VydF9m YWlsICgiYmFzZSIgLCAiLi4vLi4vamlrZXMvc3JjL3N5bWJvbC5oIiwgMjA4NiwgX19QUkVUVFlf RlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICBBZGRWYXJpYWJsZVN5bWJvbCh2YXJpYWJsZV9zeW1i b2wpOwoKICAgIGludCBrID0gdmFyaWFibGVfc3ltYm9sIC0+IG5hbWVfc3ltYm9sIC0+IGluZGV4 ICUgaGFzaF9zaXplOwogICAgdmFyaWFibGVfc3ltYm9sIC0+IG5leHQgPSBiYXNlW2tdOwogICAg YmFzZVtrXSA9IHZhcmlhYmxlX3N5bWJvbDsKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAg CiAgICBpZiAoKFNpemUoKSA+IChoYXNoX3NpemUgPDwgMSkpICYmIChoYXNoX3NpemUgPCBNQVhf SEFTSF9TSVpFKSkKICAgICAgICBSZWhhc2goKTsKCiAgICByZXR1cm47Cn0KCgppbmxpbmUgdm9p ZCBUeXBlU3ltYm9sOjpJbnNlcnRWYXJpYWJsZVN5bWJvbChWYXJpYWJsZVN5bWJvbCAqdmFyaWFi bGVfc3ltYm9sKQp7CiAgICBUYWJsZSgpIC0+IEluc2VydFZhcmlhYmxlU3ltYm9sKHZhcmlhYmxl X3N5bWJvbCk7Cn0KCgppbmxpbmUgdm9pZCBCbG9ja1N5bWJvbDo6SW5zZXJ0VmFyaWFibGVTeW1i b2woVmFyaWFibGVTeW1ib2wgKnZhcmlhYmxlX3N5bWJvbCkKewogICAgVGFibGUoKSAtPiBJbnNl cnRWYXJpYWJsZVN5bWJvbCh2YXJpYWJsZV9zeW1ib2wpOwp9CgoKaW5saW5lIFZhcmlhYmxlU3lt Ym9sICpTeW1ib2xUYWJsZTo6RmluZFZhcmlhYmxlU3ltYm9sKE5hbWVTeW1ib2wgKm5hbWVfc3lt Ym9sKQp7CiAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIGJhc2UgKSA/IDAgOgkoX19hc3NlcnRf ZmFpbCAoImJhc2UiICwgIi4uLy4uL2ppa2VzL3NyYy9zeW1ib2wuaCIsIDIxMjAsIF9fUFJFVFRZ X0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgZm9yIChTeW1ib2wgKnN5bWJvbCA9IGJhc2VbbmFt ZV9zeW1ib2wgLT4gaW5kZXggJSBoYXNoX3NpemVdOyBzeW1ib2w7IHN5bWJvbCA9IHN5bWJvbCAt PiBuZXh0KQogICAgewogICAgICAgIGlmIChuYW1lX3N5bWJvbCA9PSBzeW1ib2wgLT4gSWRlbnRp dHkoKSkKICAgICAgICB7CiAgICAgICAgICAgIFZhcmlhYmxlU3ltYm9sICp2YXJpYWJsZV9zeW1i b2wgPSBzeW1ib2wgLT4gVmFyaWFibGVDYXN0KCk7CiAgICAgICAgICAgIGlmICh2YXJpYWJsZV9z eW1ib2wpCiAgICAgICAgICAgICAgICByZXR1cm4gdmFyaWFibGVfc3ltYm9sOwogICAgICAgIH0K ICAgIH0KCiAgICByZXR1cm4gKFZhcmlhYmxlU3ltYm9sICopIF9fbnVsbCA7Cn0KCgppbmxpbmUg VmFyaWFibGVTeW1ib2wgKlR5cGVTeW1ib2w6OkZpbmRWYXJpYWJsZVN5bWJvbChOYW1lU3ltYm9s ICpuYW1lX3N5bWJvbCkKewogICAgcmV0dXJuICh0YWJsZSA/IHRhYmxlIC0+IEZpbmRWYXJpYWJs ZVN5bWJvbChuYW1lX3N5bWJvbCkgOiAoVmFyaWFibGVTeW1ib2wgKikgX19udWxsICk7Cn0KCgpp bmxpbmUgVmFyaWFibGVTeW1ib2wgKkJsb2NrU3ltYm9sOjpGaW5kVmFyaWFibGVTeW1ib2woTmFt ZVN5bWJvbCAqbmFtZV9zeW1ib2wpCnsKICAgIHJldHVybiAodGFibGUgPyB0YWJsZSAtPiBGaW5k VmFyaWFibGVTeW1ib2wobmFtZV9zeW1ib2wpIDogKFZhcmlhYmxlU3ltYm9sICopIF9fbnVsbCAp Owp9CgoKaW5saW5lIExhYmVsU3ltYm9sICpTeW1ib2xUYWJsZTo6SW5zZXJ0TGFiZWxTeW1ib2wo TmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wpCnsKICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggYmFz ZSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiYmFzZSIgLCAiLi4vLi4vamlrZXMvc3JjL3N5bWJv bC5oIiwgMjE1MCwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICBMYWJlbFN5bWJv bCAqc3ltYm9sID0gbmV3IExhYmVsU3ltYm9sKG5hbWVfc3ltYm9sKTsKICAgIEFkZE90aGVyU3lt Ym9sKHN5bWJvbCk7CgogICAgaW50IGsgPSBuYW1lX3N5bWJvbCAtPiBpbmRleCAlIGhhc2hfc2l6 ZTsKICAgIHN5bWJvbCAtPiBuZXh0ID0gYmFzZVtrXTsKICAgIGJhc2Vba10gPSBzeW1ib2w7Cgog ICAgIAogICAgIAogICAgIAogICAgIAoKICAgIHJldHVybiBzeW1ib2w7Cn0KCgppbmxpbmUgTGFi ZWxTeW1ib2wgKlN5bWJvbFRhYmxlOjpGaW5kTGFiZWxTeW1ib2woTmFtZVN5bWJvbCAqbmFtZV9z eW1ib2wpCnsKICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggYmFzZSApID8gMCA6CShfX2Fzc2Vy dF9mYWlsICgiYmFzZSIgLCAiLi4vLi4vamlrZXMvc3JjL3N5bWJvbC5oIiwgMjE3MCwgX19QUkVU VFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICBmb3IgKFN5bWJvbCAqc3ltYm9sID0gYmFzZVtu YW1lX3N5bWJvbCAtPiBpbmRleCAlIGhhc2hfc2l6ZV07IHN5bWJvbDsgc3ltYm9sID0gc3ltYm9s IC0+IG5leHQpCiAgICB7CiAgICAgICAgaWYgKG5hbWVfc3ltYm9sID09IHN5bWJvbCAtPiBJZGVu dGl0eSgpKQogICAgICAgIHsKICAgICAgICAgICAgTGFiZWxTeW1ib2wgKmxhYmVsID0gc3ltYm9s IC0+IExhYmVsQ2FzdCgpOwogICAgICAgICAgICBpZiAobGFiZWwpCiAgICAgICAgICAgICAgICBy ZXR1cm4gbGFiZWw7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAoTGFiZWxTeW1ib2wgKikg X19udWxsIDsKfQoKaW5saW5lIEJsb2NrU3ltYm9sICpTeW1ib2xUYWJsZTo6SW5zZXJ0QmxvY2tT eW1ib2woaW50IGhhc2hfc2l6ZSA9IDApCnsKICAgIEJsb2NrU3ltYm9sICpzeW1ib2wgPSBuZXcg QmxvY2tTeW1ib2woaGFzaF9zaXplKTsKICAgIEFkZE90aGVyU3ltYm9sKHN5bWJvbCk7CgogICAg cmV0dXJuIHN5bWJvbDsKfQoKCmlubGluZSBCbG9ja1N5bWJvbCAqQmxvY2tTeW1ib2w6Okluc2Vy dEJsb2NrU3ltYm9sKGludCBoYXNoX3NpemUgPSAwKQp7CiAgICByZXR1cm4gVGFibGUoKSAtPiBJ bnNlcnRCbG9ja1N5bWJvbChoYXNoX3NpemUpOwp9CgoKaW5saW5lIE1ldGhvZFN5bWJvbCAqU3lt Ym9sVGFibGU6Ok92ZXJsb2FkKE1ldGhvZFN5bWJvbCAqYmFzZV9tZXRob2QpCnsKICAgIE1ldGhv ZFN5bWJvbCAqb3ZlcmxvYWRfbWV0aG9kID0gbmV3IE1ldGhvZFN5bWJvbChiYXNlX21ldGhvZCAt PiBJZGVudGl0eSgpKTsKICAgIEFkZE1ldGhvZFN5bWJvbChvdmVybG9hZF9tZXRob2QpOwoKICAg IG92ZXJsb2FkX21ldGhvZCAtPiBuZXh0ID0gb3ZlcmxvYWRfbWV0aG9kOyAgCiAgICBvdmVybG9h ZF9tZXRob2QgLT4gbmV4dF9tZXRob2QgPSBiYXNlX21ldGhvZCAtPiBuZXh0X21ldGhvZDsKICAg IGJhc2VfbWV0aG9kIC0+IG5leHRfbWV0aG9kID0gb3ZlcmxvYWRfbWV0aG9kOwoKICAgIHJldHVy biBvdmVybG9hZF9tZXRob2Q7Cn0KCgppbmxpbmUgTWV0aG9kU3ltYm9sICpUeXBlU3ltYm9sOjpP dmVybG9hZChNZXRob2RTeW1ib2wgKmJhc2VfbWV0aG9kKQp7CiAgICAoc3RhdGljX2Nhc3Q8dm9p ZD4gICgoIHRhYmxlICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJ0YWJsZSIgLCAiLi4vLi4vamlr ZXMvc3JjL3N5bWJvbC5oIiwgMjIxNSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAg ICByZXR1cm4gdGFibGUgLT4gT3ZlcmxvYWQoYmFzZV9tZXRob2QpOwp9CgoKaW5saW5lIHZvaWQg U3ltYm9sVGFibGU6Ok92ZXJsb2FkKE1ldGhvZFN5bWJvbCAqYmFzZV9tZXRob2QsIE1ldGhvZFN5 bWJvbCAqb3ZlcmxvYWRfbWV0aG9kKQp7CiAgICBBZGRNZXRob2RTeW1ib2wob3ZlcmxvYWRfbWV0 aG9kKTsKCiAgICBvdmVybG9hZF9tZXRob2QgLT4gbmV4dCA9IG92ZXJsb2FkX21ldGhvZDsgIAog ICAgb3ZlcmxvYWRfbWV0aG9kIC0+IG5leHRfbWV0aG9kID0gYmFzZV9tZXRob2QgLT4gbmV4dF9t ZXRob2Q7CiAgICBiYXNlX21ldGhvZCAtPiBuZXh0X21ldGhvZCA9IG92ZXJsb2FkX21ldGhvZDsK CiAgICByZXR1cm47Cn0KCmlubGluZSB2b2lkIFR5cGVTeW1ib2w6Ok92ZXJsb2FkKE1ldGhvZFN5 bWJvbCAqYmFzZV9tZXRob2QsIE1ldGhvZFN5bWJvbCAqb3ZlcmxvYWRfbWV0aG9kKQp7CiAgICAo c3RhdGljX2Nhc3Q8dm9pZD4gICgoIHRhYmxlICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJ0YWJs ZSIgLCAiLi4vLi4vamlrZXMvc3JjL3N5bWJvbC5oIiwgMjIzNCwgX19QUkVUVFlfRlVOQ1RJT05f XyApLCAwKSkpIDsKCiAgICB0YWJsZSAtPiBPdmVybG9hZChiYXNlX21ldGhvZCwgb3ZlcmxvYWRf bWV0aG9kKTsKfQoKCmlubGluZSBNZXRob2RTeW1ib2wgKlN5bWJvbFRhYmxlOjpMb2NhbENvbnN0 cnVjdG9yT3ZlcmxvYWQoTWV0aG9kU3ltYm9sICpiYXNlX21ldGhvZCkKewogICAgTWV0aG9kU3lt Ym9sICpvdmVybG9hZF9tZXRob2QgPSBuZXcgTWV0aG9kU3ltYm9sKGJhc2VfbWV0aG9kIC0+IElk ZW50aXR5KCkpOwogICAgQWRkTWV0aG9kU3ltYm9sKG92ZXJsb2FkX21ldGhvZCk7CgogICAgb3Zl cmxvYWRfbWV0aG9kIC0+IG5leHQgPSBvdmVybG9hZF9tZXRob2Q7ICAKICAgIG92ZXJsb2FkX21l dGhvZCAtPiBTZXRHZW5lcmF0ZWRMb2NhbENvbnN0cnVjdG9yKGJhc2VfbWV0aG9kKTsKCiAgICBy ZXR1cm4gb3ZlcmxvYWRfbWV0aG9kOwp9CgoKaW5saW5lIE1ldGhvZFN5bWJvbCAqVHlwZVN5bWJv bDo6TG9jYWxDb25zdHJ1Y3Rvck92ZXJsb2FkKE1ldGhvZFN5bWJvbCAqYmFzZV9tZXRob2QpCnsK ICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggdGFibGUgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAo InRhYmxlIiAsICIuLi8uLi9qaWtlcy9zcmMvc3ltYm9sLmgiLCAyMjU0LCBfX1BSRVRUWV9GVU5D VElPTl9fICksIDApKSkgOwoKICAgIHJldHVybiB0YWJsZSAtPiBMb2NhbENvbnN0cnVjdG9yT3Zl cmxvYWQoYmFzZV9tZXRob2QpOwp9CgoKaW5saW5lIE1ldGhvZFN5bWJvbCAqVHlwZVN5bWJvbDo6 RmluZE92ZXJsb2FkTWV0aG9kKE1ldGhvZFN5bWJvbCAqYmFzZV9tZXRob2QsIEFzdE1ldGhvZERl Y2xhcmF0b3IgKm1ldGhvZF9kZWNsYXJhdG9yKQp7CiAgICByZXR1cm4gKHRhYmxlID8gdGFibGUg LT4gRmluZE92ZXJsb2FkTWV0aG9kKGJhc2VfbWV0aG9kLCBtZXRob2RfZGVjbGFyYXRvcikgOiAo TWV0aG9kU3ltYm9sICopIF9fbnVsbCApOwp9CgoKaW5saW5lIFN5bWJvbFRhYmxlICpEaXJlY3Rv cnlTeW1ib2w6OlRhYmxlKCkKewogICAgcmV0dXJuICh0YWJsZSA/IHRhYmxlIDogdGFibGUgPSBu ZXcgU3ltYm9sVGFibGUoMTAxKSk7Cn0KCmlubGluZSBTeW1ib2xUYWJsZSAqUGFja2FnZVN5bWJv bDo6VGFibGUoKQp7CiAgICByZXR1cm4gKHRhYmxlID8gdGFibGUgOiB0YWJsZSA9IG5ldyBTeW1i b2xUYWJsZSgxMDEpKTsKfQoKaW5saW5lIHZvaWQgVHlwZVN5bWJvbDo6U2V0U3ltYm9sVGFibGUo aW50IGVzdGltYXRlKQp7CiAgICBpZiAoISB0YWJsZSkgIAogICAgICAgIHRhYmxlID0gbmV3IFN5 bWJvbFRhYmxlKGVzdGltYXRlKTsKfQoKaW5saW5lIFN5bWJvbFRhYmxlICpUeXBlU3ltYm9sOjpU YWJsZSgpCnsKICAgIHJldHVybiAodGFibGUgPyB0YWJsZSA6IHRhYmxlID0gbmV3IFN5bWJvbFRh YmxlKCkpOwp9CgppbmxpbmUgU3ltYm9sVGFibGUgKkJsb2NrU3ltYm9sOjpUYWJsZSgpCnsKICAg IHJldHVybiAodGFibGUgPyB0YWJsZSA6IHRhYmxlID0gbmV3IFN5bWJvbFRhYmxlKCkpOwp9CgoK ICAgIGlubGluZSBib29sIEZpbGVTeW1ib2w6OklzQ2xhc3NTdWZmaXgoY2hhciAqc3VmZml4KQog ICAgewogICAgICAgIHJldHVybiAoc3RybmNtcChzdWZmaXgsIGNsYXNzX3N1ZmZpeCwgY2xhc3Nf c3VmZml4X2xlbmd0aCkgPT0gMCk7CiAgICB9CgogICAgaW5saW5lIGJvb2wgIEZpbGVTeW1ib2w6 OklzSmF2YVN1ZmZpeChjaGFyICpzdWZmaXgpCiAgICB7CiAgICAgICAgcmV0dXJuIChzdHJuY21w KHN1ZmZpeCwgamF2YV9zdWZmaXgsIGphdmFfc3VmZml4X2xlbmd0aCkgPT0gMCk7CiAgICB9CiMg MjMxMiAiLi4vLi4vamlrZXMvc3JjL3N5bWJvbC5oIgoKCgoKCgoKCiMgMTYgIi4uLy4uL2ppa2Vz L3NyYy9hc3QuaCIgMgoKIyAxICIuLi8uLi9qaWtlcy9zcmMvc2V0LmgiIDEKIAogCiAKIAogCiAK IAogCiAKCgoKCgoKCgoKCmNsYXNzIFNoYWRvd1N5bWJvbAp7CnB1YmxpYzoKICAgIFNoYWRvd1N5 bWJvbCAqbmV4dDsKICAgIFN5bWJvbCAqc3ltYm9sOwogICAgaW50IHBvb2xfaW5kZXg7CgogICAg aW5saW5lIE5hbWVTeW1ib2wgKklkZW50aXR5KCkgeyByZXR1cm4gc3ltYm9sIC0+IElkZW50aXR5 KCk7IH0KCiAgICBTaGFkb3dTeW1ib2woU3ltYm9sICpzeW1ib2xfKSA6IHN5bWJvbChzeW1ib2xf KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3QoX19udWxsICkK ICAgIHt9CgogICAgflNoYWRvd1N5bWJvbCgpIHsgZGVsZXRlIGNvbmZsaWN0OyB9CgogICAgU3lt Ym9sICpDb25mbGljdChpbnQgaSkgeyByZXR1cm4gKCpjb25mbGljdClbaV07IH0KCiAgICBpbmxp bmUgaW50IE51bUNvbmZsaWN0cygpCiAgICB7CiAgICAgICAgcmV0dXJuIChjb25mbGljdCA/IGNv bmZsaWN0IC0+IExlbmd0aCgpIDogMCk7CiAgICB9CgogICAgaW5saW5lIHZvaWQgQWRkQ29uZmxp Y3QoU3ltYm9sICpjb25mbGljdF9zeW1ib2wpCiAgICB7CiAgICAgICAgaWYgKChzeW1ib2wgIT0g Y29uZmxpY3Rfc3ltYm9sKSAmJiAoISBGaW5kKGNvbmZsaWN0X3N5bWJvbCkpKQogICAgICAgICAg ICBjb25mbGljdCAtPiBOZXh0KCkgPSBjb25mbGljdF9zeW1ib2w7CiAgICAgICAgcmV0dXJuOwog ICAgfQoKICAgIGlubGluZSB2b2lkIFJlbW92ZUNvbmZsaWN0KGludCBrKQogICAgewogICAgICAg IGludCBsYXN0X2luZGV4ID0gY29uZmxpY3QgLT4gTGVuZ3RoKCkgLSAxOwogICAgICAgIGlmIChr IDwgMCkgIAogICAgICAgICAgICAgc3ltYm9sID0gKCpjb25mbGljdClbbGFzdF9pbmRleF07CiAg ICAgICAgZWxzZSAoKmNvbmZsaWN0KVtrXSA9ICgqY29uZmxpY3QpW2xhc3RfaW5kZXhdOwogICAg ICAgIGNvbmZsaWN0IC0+IFJlc2V0KGxhc3RfaW5kZXgpOwogICAgfQoKcHJpdmF0ZToKICAgIFR1 cGxlPFN5bWJvbCAqPiAqY29uZmxpY3Q7CgogICAgYm9vbCBGaW5kKFN5bWJvbCAqY29uZmxpY3Rf c3ltYm9sKQogICAgewogICAgICAgIGlmICghIGNvbmZsaWN0KQogICAgICAgICAgICBjb25mbGlj dCA9IG5ldyBUdXBsZTxTeW1ib2wgKj4oNCk7CiAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBj b25mbGljdCAtPiBMZW5ndGgoKTsgaysrKQogICAgICAgICAgICBpZiAoKCpjb25mbGljdClba10g PT0gY29uZmxpY3Rfc3ltYm9sKQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAg cmV0dXJuIGZhbHNlOwogICAgfQp9OwoKCmNsYXNzIFN5bWJvbFNldAp7CnB1YmxpYzoKICAgIGVu dW0KICAgIHsKICAgICAgICBERUZBVUxUX0hBU0hfU0laRSA9IDEzLAogICAgICAgIE1BWF9IQVNI X1NJWkUgPSAxMDIxCiAgICB9OwoKICAgIFN5bWJvbFNldChpbnQgaGFzaF9zaXplXyA9IERFRkFV TFRfSEFTSF9TSVpFKSA6IHN5bWJvbF9wb29sKDI1NiksCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluX2luZGV4KDApLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2luZGV4KDApCiAgICB7 CiAgICAgICAgaGFzaF9zaXplID0gKGhhc2hfc2l6ZV8gPD0gMCA/IDEgOiBoYXNoX3NpemVfKTsK CiAgICAgICAgcHJpbWVfaW5kZXggPSAtMTsKICAgICAgICBkbwogICAgICAgIHsKICAgICAgICAg ICAgaWYgKGhhc2hfc2l6ZSA8IHByaW1lc1twcmltZV9pbmRleCArIDFdKQogICAgICAgICAgICAg ICAgYnJlYWs7CiAgICAgICAgICAgIHByaW1lX2luZGV4Kys7CiAgICAgICAgfSB3aGlsZSAocHJp bWVzW3ByaW1lX2luZGV4XSA8IE1BWF9IQVNIX1NJWkUpOwoKICAgICAgICBiYXNlID0gKFNoYWRv d1N5bWJvbCAqKikgbWVtc2V0KG5ldyBTaGFkb3dTeW1ib2wgKltoYXNoX3NpemVdLCAwLCBoYXNo X3NpemUgKiBzaXplb2YoU2hhZG93U3ltYm9sICopKTsKICAgIH0KCiAgICB+U3ltYm9sU2V0KCk7 CgogICAgIAogICAgIAogICAgIAogICAgaW5saW5lIGludCBTaXplKCkKICAgIHsKICAgICAgICBp bnQgc2l6ZSA9IDA7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ltYm9sX3Bvb2wuTGVu Z3RoKCk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIFNoYWRvd1N5bWJvbCAqc2hhZG93ID0g c3ltYm9sX3Bvb2xbaV07CiAgICAgICAgICAgIFN5bWJvbCAqc3ltYm9sID0gc2hhZG93IC0+IHN5 bWJvbDsKICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IHN5bWJvbDsgc3ltYm9sID0gKFN5bWJv bCAqKSAoayA8IHNoYWRvdyAtPiBOdW1Db25mbGljdHMoKSA/IHNoYWRvdyAtPiBDb25mbGljdChr KyspIDogX19udWxsICkpCiAgICAgICAgICAgICAgICBzaXplKys7CiAgICAgICAgfQoKICAgICAg ICByZXR1cm4gc2l6ZTsKICAgIH0KCiAgICAgCiAgICAgCiAgICAgCiAgICBpbmxpbmUgdm9pZCBT ZXRFbXB0eSgpCiAgICB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzeW1ib2xfcG9vbC5M ZW5ndGgoKTsgaSsrKQogICAgICAgICAgICBkZWxldGUgc3ltYm9sX3Bvb2xbaV07CiAgICAgICAg c3ltYm9sX3Bvb2wuUmVzZXQoKTsKICAgICAgICBiYXNlID0gKFNoYWRvd1N5bWJvbCAqKikgbWVt c2V0KGJhc2UsIDAsIGhhc2hfc2l6ZSAqIHNpemVvZihTaGFkb3dTeW1ib2wgKikpOwogICAgfQoK ICAgICAKICAgICAKICAgICAKICAgIGJvb2wgSXNFbXB0eSgpIHsgcmV0dXJuIHN5bWJvbF9wb29s Lkxlbmd0aCgpID09IDA7IH0KCiAgICAgCiAgICAgCiAgICAgCiAgICBTeW1ib2xTZXQgJm9wZXJh dG9yPShTeW1ib2xTZXQgJnJocykKICAgIHsKICAgICAgICBpZiAodGhpcyAhPSAmcmhzKQogICAg ICAgIHsKICAgICAgICAgICAgdGhpcyAtPiBTZXRFbXB0eSgpOwogICAgICAgICAgICB0aGlzIC0+ IFVuaW9uKHJocyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAg IAogICAgIAogICAgIAogICAgYm9vbCBvcGVyYXRvcj09KFN5bWJvbFNldCAmKTsKCiAgICAgCiAg ICAgCiAgICAgCiAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KFN5bWJvbFNldCAmcmhzKQogICAg ewogICAgICAgIHJldHVybiAhICgqdGhpcyA9PSByaHMpOwogICAgfQoKICAgICAKICAgICAKICAg ICAKICAgIHZvaWQgVW5pb24oU3ltYm9sU2V0ICYpOwoKICAgICAKICAgICAKICAgICAKICAgIHZv aWQgSW50ZXJzZWN0aW9uKFN5bWJvbFNldCAmKTsKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAg ICBib29sIEludGVyc2VjdHMoU3ltYm9sU2V0ICYpOwoKICAgICAKICAgICAKICAgICAKICAgIGlu bGluZSBpbnQgTmFtZUNvdW50KFN5bWJvbCAqZWxlbWVudCkKICAgIHsKICAgICAgICBOYW1lU3lt Ym9sICpuYW1lX3N5bWJvbCA9IGVsZW1lbnQgLT4gSWRlbnRpdHkoKTsKICAgICAgICBmb3IgKFNo YWRvd1N5bWJvbCAqc2hhZG93ID0gYmFzZVtuYW1lX3N5bWJvbCAtPiBpbmRleCAlIGhhc2hfc2l6 ZV07IHNoYWRvdzsgc2hhZG93ID0gc2hhZG93IC0+IG5leHQpCiAgICAgICAgewogICAgICAgICAg ICBpZiAoc2hhZG93IC0+IElkZW50aXR5KCkgPT0gbmFtZV9zeW1ib2wpCiAgICAgICAgICAgICAg ICByZXR1cm4gc2hhZG93IC0+IE51bUNvbmZsaWN0cygpICsgMTsKICAgICAgICB9CgogICAgICAg IHJldHVybiAwOwogICAgfQoKICAgICAKICAgICAKICAgICAKICAgIGlubGluZSBib29sIElzRWxl bWVudChTeW1ib2wgKmVsZW1lbnQpCiAgICB7CiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAo KCBlbGVtZW50ICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJlbGVtZW50IiAsICIuLi8uLi9qaWtl cy9zcmMvc2V0LmgiLCAxOTgsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgICAg IE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sID0gZWxlbWVudCAtPiBJZGVudGl0eSgpOwogICAgICAg IGZvciAoU2hhZG93U3ltYm9sICpzaGFkb3cgPSBiYXNlW25hbWVfc3ltYm9sIC0+IGluZGV4ICUg aGFzaF9zaXplXTsgc2hhZG93OyBzaGFkb3cgPSBzaGFkb3cgLT4gbmV4dCkKICAgICAgICB7CiAg ICAgICAgICAgIGlmIChzaGFkb3cgLT4gSWRlbnRpdHkoKSA9PSBuYW1lX3N5bWJvbCkKICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgU3ltYm9sICpzeW1ib2wgPSBzaGFkb3cgLT4gc3ltYm9s OwogICAgICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IHN5bWJvbDsgc3ltYm9sID0gKFN5bWJv bCAqKSAoayA8IHNoYWRvdyAtPiBOdW1Db25mbGljdHMoKSA/IHNoYWRvdyAtPiBDb25mbGljdChr KyspIDogX19udWxsICkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYg KHN5bWJvbCA9PSBlbGVtZW50KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK ICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAg ICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAgCiAgICAg CiAgICAgCiAgICBpbmxpbmUgdm9pZCBBZGRFbGVtZW50KFN5bWJvbCAqZWxlbWVudCkKICAgIHsK ICAgICAgICBOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCA9IGVsZW1lbnQgLT4gSWRlbnRpdHkoKTsK ICAgICAgICBpbnQgaSA9IG5hbWVfc3ltYm9sIC0+IGluZGV4ICUgaGFzaF9zaXplOwoKICAgICAg ICBTaGFkb3dTeW1ib2wgKnNoYWRvdzsKICAgICAgICBmb3IgKHNoYWRvdyA9IGJhc2VbaV07IHNo YWRvdzsgc2hhZG93ID0gc2hhZG93IC0+IG5leHQpCiAgICAgICAgewogICAgICAgICAgICBpZiAo c2hhZG93IC0+IElkZW50aXR5KCkgPT0gbmFtZV9zeW1ib2wpCiAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgIHNoYWRvdyAtPiBBZGRDb25mbGljdChlbGVtZW50KTsKICAgICAgICAgICAgICAg IHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc2hhZG93ID0gbmV3IFNo YWRvd1N5bWJvbChlbGVtZW50KTsKICAgICAgICBzaGFkb3cgLT4gcG9vbF9pbmRleCA9IHN5bWJv bF9wb29sLkxlbmd0aCgpOwogICAgICAgIHN5bWJvbF9wb29sLk5leHQoKSA9IHNoYWRvdzsKCiAg ICAgICAgc2hhZG93IC0+IG5leHQgPSBiYXNlW2ldOwogICAgICAgIGJhc2VbaV0gPSBzaGFkb3c7 CgogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAg ICAgaWYgKChzeW1ib2xfcG9vbC5MZW5ndGgoKSA+IChoYXNoX3NpemUgPDwgMSkpICYmIChoYXNo X3NpemUgPCBNQVhfSEFTSF9TSVpFKSkKICAgICAgICAgICAgUmVoYXNoKCk7CgogICAgICAgIHJl dHVybjsKICAgIH0KCgogICAgdm9pZCBSZW1vdmVFbGVtZW50KFN5bWJvbCAqKTsKCiAgICBTeW1i b2wqIEZpcnN0RWxlbWVudCgpCiAgICB7CiAgICAgICAgbWFpbl9pbmRleCA9IDA7CiAgICAgICAg c3ViX2luZGV4ID0gMDsKICAgICAgICByZXR1cm4gKG1haW5faW5kZXggPCBzeW1ib2xfcG9vbC5M ZW5ndGgoKSA/IHN5bWJvbF9wb29sW21haW5faW5kZXhdIC0+IHN5bWJvbCA6IChTeW1ib2wgKikg X19udWxsICk7CiAgICB9CgogICAgU3ltYm9sKiBOZXh0RWxlbWVudCgpCiAgICB7CiAgICAgICAg U3ltYm9sICpzeW1ib2wgPSBfX251bGwgOwoKICAgICAgICBpZiAobWFpbl9pbmRleCA8IHN5bWJv bF9wb29sLkxlbmd0aCgpKQogICAgICAgIHsKICAgICAgICAgICAgIGlmIChzdWJfaW5kZXggPCBz eW1ib2xfcG9vbFttYWluX2luZGV4XSAtPiBOdW1Db25mbGljdHMoKSkKICAgICAgICAgICAgICAg ICAgc3ltYm9sID0gc3ltYm9sX3Bvb2xbbWFpbl9pbmRleF0gLT4gQ29uZmxpY3Qoc3ViX2luZGV4 KyspOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1h aW5faW5kZXgrKzsKICAgICAgICAgICAgICAgICBzdWJfaW5kZXggPSAwOwogICAgICAgICAgICAg ICAgIHN5bWJvbCA9IChtYWluX2luZGV4IDwgc3ltYm9sX3Bvb2wuTGVuZ3RoKCkgPyBzeW1ib2xf cG9vbFttYWluX2luZGV4XSAtPiBzeW1ib2wgOiAoU3ltYm9sICopIF9fbnVsbCApOwogICAgICAg ICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHN5bWJvbDsKICAgIH0KCnByb3RlY3Rl ZDoKCiAgICBUdXBsZTxTaGFkb3dTeW1ib2wgKj4gc3ltYm9sX3Bvb2w7CgogICAgaW50IG1haW5f aW5kZXgsCiAgICAgICAgc3ViX2luZGV4OwoKICAgIFNoYWRvd1N5bWJvbCAqKmJhc2U7CiAgICBp bnQgaGFzaF9zaXplOwoKICAgIHN0YXRpYyBpbnQgcHJpbWVzW107CiAgICBpbnQgcHJpbWVfaW5k ZXg7CgogICAgdm9pZCBSZWhhc2goKTsKfTsKCgogCiAKIApjbGFzcyBOYW1lU3ltYm9sTWFwIDog cHVibGljIFN5bWJvbFNldAp7CnB1YmxpYzoKICAgIE5hbWVTeW1ib2xNYXAoaW50IGhhc2hfc2l6 ZV8gPSBERUZBVUxUX0hBU0hfU0laRSkgOiBTeW1ib2xTZXQoaGFzaF9zaXplXykKICAgIHt9Cgog ICAgIAogICAgIAogICAgIAogICAgaW5saW5lIFN5bWJvbCAqSW1hZ2UoTmFtZVN5bWJvbCAqbmFt ZV9zeW1ib2wpCiAgICB7CiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBuYW1lX3N5bWJv bCApID8gMCA6CShfX2Fzc2VydF9mYWlsICgibmFtZV9zeW1ib2wiICwgIi4uLy4uL2ppa2VzL3Ny Yy9zZXQuaCIsIDMxNSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICAgICAgZm9y IChTaGFkb3dTeW1ib2wgKnNoYWRvdyA9IGJhc2VbbmFtZV9zeW1ib2wgLT4gaW5kZXggJSBoYXNo X3NpemVdOyBzaGFkb3c7IHNoYWRvdyA9IHNoYWRvdyAtPiBuZXh0KQogICAgICAgIHsKICAgICAg ICAgICAgaWYgKHNoYWRvdyAtPiBJZGVudGl0eSgpID09IG5hbWVfc3ltYm9sKQogICAgICAgICAg ICAgICAgcmV0dXJuIHNoYWRvdyAtPiBzeW1ib2w7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4g X19udWxsIDsKICAgIH0KCiAgICAgCiAgICAgCiAgICAgCiAgICBpbmxpbmUgdm9pZCBBZGRFbGVt ZW50KFN5bWJvbCAqZWxlbWVudCkKICAgIHsKICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgo IGVsZW1lbnQgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImVsZW1lbnQiICwgIi4uLy4uL2ppa2Vz L3NyYy9zZXQuaCIsIDMzMSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICAgICAg U2hhZG93U3ltYm9sICpzaGFkb3cgPSBfX251bGwgOwogICAgICAgIGZvciAoc2hhZG93ID0gYmFz ZVtlbGVtZW50IC0+IElkZW50aXR5KCkgLT4gaW5kZXggJSBoYXNoX3NpemVdOyBzaGFkb3c7IHNo YWRvdyA9IHNoYWRvdyAtPiBuZXh0KQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHNoYWRvdyAt PiBJZGVudGl0eSgpID09IGVsZW1lbnQgLT4gSWRlbnRpdHkoKSkKICAgICAgICAgICAgICAgIGJy ZWFrOwogICAgICAgIH0KCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAog ICAgICAgIGlmIChzaGFkb3cpCiAgICAgICAgICAgICBzaGFkb3cgLT4gc3ltYm9sID0gZWxlbWVu dDsKICAgICAgICBlbHNlIFN5bWJvbFNldDo6QWRkRWxlbWVudChlbGVtZW50KTsKCiAgICAgICAg cmV0dXJuOwogICAgfQp9OwoKCiAKIAogCmNsYXNzIFN5bWJvbE1hcAp7CnB1YmxpYzoKICAgIGVu dW0KICAgIHsKICAgICAgICBERUZBVUxUX0hBU0hfU0laRSA9IDEzLAogICAgICAgIE1BWF9IQVNI X1NJWkUgPSAxMDIxCiAgICB9OwoKICAgIFN5bWJvbE1hcChpbnQgaGFzaF9zaXplXyA9IERFRkFV TFRfSEFTSF9TSVpFKTsKICAgIH5TeW1ib2xNYXAoKTsKCiAgICAgCiAgICAgCiAgICAgCiAgICBp bmxpbmUgU3ltYm9sICpJbWFnZShTeW1ib2wgKnN5bWJvbCkKICAgIHsKICAgICAgICAoc3RhdGlj X2Nhc3Q8dm9pZD4gICgoIHN5bWJvbCApID8gMCA6CShfX2Fzc2VydF9mYWlsICgic3ltYm9sIiAs ICIuLi8uLi9qaWtlcy9zcmMvc2V0LmgiLCAzNzMsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkp KSA7CgogICAgICAgIGludCBrID0gc3ltYm9sIC0+IElkZW50aXR5KCkgLT4gaW5kZXggJSBoYXNo X3NpemU7CiAgICAgICAgZm9yIChFbGVtZW50ICplbGVtZW50ID0gYmFzZVtrXTsgZWxlbWVudDsg ZWxlbWVudCA9IGVsZW1lbnQgLT4gbmV4dCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChlbGVt ZW50IC0+IGRvbWFpbl9lbGVtZW50ID09IHN5bWJvbCkKICAgICAgICAgICAgICAgIHJldHVybiBl bGVtZW50IC0+IGltYWdlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIF9fbnVsbCA7CiAgICB9 CgogICAgIAogICAgIAogICAgIAogICAgdm9pZCBNYXAoU3ltYm9sICosIFN5bWJvbCAqKTsKCnBy aXZhdGU6CgogICAgY2xhc3MgRWxlbWVudAogICAgewogICAgcHVibGljOgogICAgICAgIEVsZW1l bnQgKm5leHQ7CiAgICAgICAgU3ltYm9sICAqZG9tYWluX2VsZW1lbnQsCiAgICAgICAgICAgICAg ICAqaW1hZ2U7CiAgICB9OwoKICAgIFR1cGxlPEVsZW1lbnQgKj4gc3ltYm9sX3Bvb2w7CgogICAg RWxlbWVudCAqKmJhc2U7CiAgICBpbnQgaGFzaF9zaXplOwoKICAgIHN0YXRpYyBpbnQgcHJpbWVz W107CiAgICBpbnQgcHJpbWVfaW5kZXg7CgogICAgdm9pZCBSZWhhc2goKTsKfTsKCgogCiAKIAog CiAKIApjbGFzcyBCaXRTZXQKewogICAgdHlwZWRlZiB1bnNpZ25lZCBDRUxMOwoKICAgIENFTEwg KnM7CiAgICBjb25zdCBpbnQgc2V0X3NpemU7CgpwdWJsaWM6CgogICAgZW51bSB7IEVNUFRZLCBV TklWRVJTRSwgY2VsbF9zaXplID0gc2l6ZW9mKENFTEwpICogOCAgfTsKCiAgICAgCiAgICAgCiAg ICAgCiAgICB2b2lkIFNldEVtcHR5KCkKICAgIHsKICAgICAgICBmb3IgKGludCBpID0gKHNldF9z aXplIC0gMSkgLyBjZWxsX3NpemU7IGkgPj0gMDsgaS0tKQogICAgICAgICAgICBzW2ldID0gMDsK ICAgIH0KCiAgICAgCiAgICAgCiAgICAgCiAgICB2b2lkIFNldFVuaXZlcnNlKCkKICAgIHsKICAg ICAgICBmb3IgKGludCBpID0gKHNldF9zaXplIC0gMSkgLyBjZWxsX3NpemU7IGkgPj0gMDsgaS0t KQogICAgICAgICAgICBzW2ldID0gfigoQ0VMTCkgMCk7CiAgICB9CgogICAgIAogICAgIAogICAg IAogICAgIAogICAgaW50IEhhc2goaW50IHRhYmxlX3NpemUpCiAgICB7CiAgICAgICAgdW5zaWdu ZWQgbG9uZyBoYXNoX2FkZHJlc3MgPSAwOwoKICAgICAgICBmb3IgKGludCBpID0gKHNldF9zaXpl IC0gMSkgLyBjZWxsX3NpemU7IGkgPj0gMDsgaS0tKQogICAgICAgICAgICBoYXNoX2FkZHJlc3Mg Kz0gc1tpXTsKCiAgICAgICAgcmV0dXJuIGhhc2hfYWRkcmVzcyAlIHRhYmxlX3NpemU7CiAgICB9 CgogICAgIAogICAgIAogICAgIAogICAgQml0U2V0JiBvcGVyYXRvcj0oY29uc3QgQml0U2V0JiBy aHMpCiAgICB7CiAgICAgICAgZm9yIChpbnQgaSA9IChzZXRfc2l6ZSAtIDEpIC8gY2VsbF9zaXpl OyBpID49IDA7IGktLSkKICAgICAgICAgICAgc1tpXSA9IHJocy5zW2ldOwoKICAgICAgICByZXR1 cm4gKnRoaXM7CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAgQml0U2V0KGludCBzZXRfc2l6 ZV8pIDogc2V0X3NpemUoc2V0X3NpemVfKQogICAgewogICAgICAgICAKICAgICAgICAgCiAgICAg ICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgcyA9IG5ldyBDRUxMWyhzZXRfc2l6ZSAr IGNlbGxfc2l6ZSAgKSAvIGNlbGxfc2l6ZV07CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAg Qml0U2V0KGludCBzZXRfc2l6ZV8sIGludCBpbml0KSA6IHNldF9zaXplKHNldF9zaXplXykKICAg IHsKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgIHMgPSBuZXcgQ0VMTFsoc2V0X3NpemUgKyBjZWxsX3NpemUgICkgLyBjZWxsX3NpemVdOwog ICAgICAgIGlmIChpbml0ID09IFVOSVZFUlNFKQogICAgICAgICAgICAgU2V0VW5pdmVyc2UoKTsK ICAgICAgICBlbHNlIFNldEVtcHR5KCk7CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAgQml0 U2V0KGNvbnN0IEJpdFNldCYgcmhzKSA6IHNldF9zaXplKHJocy5zZXRfc2l6ZSkKICAgIHsKICAg ICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgIHMg PSBuZXcgQ0VMTFsoc2V0X3NpemUgKyBjZWxsX3NpemUgICkgLyBjZWxsX3NpemVdOwogICAgICAg IGZvciAoaW50IGkgPSAoc2V0X3NpemUgLSAxKSAvIGNlbGxfc2l6ZTsgaSA+PSAwOyBpLS0pCiAg ICAgICAgICAgIHNbaV0gPSByaHMuc1tpXTsKICAgIH0KCiAgICAgCiAgICAgCiAgICAgCiAgICB+ Qml0U2V0KCkgeyBkZWxldGUgW10gczsgfQoKICAgICAKICAgICAKICAgICAKICAgIGludCBTaXpl KCkgeyByZXR1cm4gc2V0X3NpemU7IH0KCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBib29s IG9wZXJhdG9yW10oY29uc3QgaW50IGkpCiAgICB7CiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ ICAoKCBpID49IDAgJiYgaSA8IHNldF9zaXplICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJpID49 IDAgJiYgaSA8IHNldF9zaXplIiAsICIuLi8uLi9qaWtlcy9zcmMvc2V0LmgiLCA1MzIsIF9fUFJF VFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgICAgIHJldHVybiAoc1tpIC8gY2VsbF9zaXpl XSAmCiAgICAgICAgICAgICAgICAoKGkgKyBjZWxsX3NpemUpICUgY2VsbF9zaXplCiAgICAgICAg ICAgICAgICAgICAgICAgICAgPyAoQ0VMTCkgMSA8PCAoKGkgKyBjZWxsX3NpemUpICUgY2VsbF9z aXplKQogICAgICAgICAgICAgICAgICAgICAgICAgIDogKENFTEwpIDEpKSAhPSAwOwogICAgfQoK ICAgICAKICAgICAKICAgICAKICAgIHZvaWQgQWRkRWxlbWVudChpbnQgaSkKICAgIHsKICAgICAg ICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIGkgPj0gMCAmJiBpIDwgc2V0X3NpemUgKSA/IDAgOgko X19hc3NlcnRfZmFpbCAoImkgPj0gMCAmJiBpIDwgc2V0X3NpemUiICwgIi4uLy4uL2ppa2VzL3Ny Yy9zZXQuaCIsIDU0NSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICAgICAgc1tp IC8gY2VsbF9zaXplXSB8PSAoKGkgKyBjZWxsX3NpemUpICUgY2VsbF9zaXplCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKENFTEwpIDEgPDwgKChpICsgY2Vs bF9zaXplKSAlIGNlbGxfc2l6ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOiAoQ0VMTCkgMSk7CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAgdm9pZCBS ZW1vdmVFbGVtZW50KGludCBpKQogICAgewogICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCgg aSA+PSAwICYmIGkgPCBzZXRfc2l6ZSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiaSA+PSAwICYm IGkgPCBzZXRfc2l6ZSIgLCAiLi4vLi4vamlrZXMvc3JjL3NldC5oIiwgNTU3LCBfX1BSRVRUWV9G VU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICBzW2kgLyBjZWxsX3NpemVdICY9IH4oKGkgKyBj ZWxsX3NpemUpICUgY2VsbF9zaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA/IChDRUxMKSAxIDw8ICgoaSArIGNlbGxfc2l6ZSkgJSBjZWxsX3NpemUpCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChDRUxMKSAxKTsK ICAgIH0KCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBpbnQgb3BlcmF0b3I9PShjb25zdCBC aXRTZXQmIHJocykKICAgIHsKICAgICAgICBmb3IgKGludCBpID0gKHNldF9zaXplIC0gMSkgLyBj ZWxsX3NpemU7IGkgPj0gMDsgaS0tKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHNbaV0gIT0g cmhzLnNbaV0pCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHJl dHVybiAxOwogICAgfQoKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGludCBvcGVyYXRvciE9 KGNvbnN0IEJpdFNldCYgcmhzKQogICAgewogICAgICAgIHJldHVybiAhICgqdGhpcyA9PSByaHMp OwogICAgfQoKICAgICAKICAgICAKICAgICAKICAgIEJpdFNldCBvcGVyYXRvcisoY29uc3QgQml0 U2V0JiByaHMpCiAgICB7CiAgICAgICAgQml0U2V0IHJlc3VsdChzZXRfc2l6ZSk7CgogICAgICAg IGZvciAoaW50IGkgPSAoc2V0X3NpemUgLSAxKSAvIGNlbGxfc2l6ZTsgaSA+PSAwOyBpLS0pCiAg ICAgICAgICAgIHJlc3VsdC5zW2ldID0gc1tpXSB8IHJocy5zW2ldOwoKICAgICAgICByZXR1cm4g cmVzdWx0OwogICAgfQoKICAgICAKICAgICAKICAgICAKICAgIEJpdFNldCYgb3BlcmF0b3IrPShj b25zdCBCaXRTZXQmIHJocykKICAgIHsKICAgICAgICBmb3IgKGludCBpID0gKHNldF9zaXplIC0g MSkgLyBjZWxsX3NpemU7IGkgPj0gMDsgaS0tKQogICAgICAgICAgICBzW2ldIHw9IHJocy5zW2ld OwoKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAgQml0 U2V0IG9wZXJhdG9yKihjb25zdCBCaXRTZXQmIHJocykKICAgIHsKICAgICAgICBCaXRTZXQgcmVz dWx0KHNldF9zaXplKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IChzZXRfc2l6ZSAtIDEpIC8gY2Vs bF9zaXplOyBpID49IDA7IGktLSkKICAgICAgICAgICAgcmVzdWx0LnNbaV0gPSBzW2ldICYgcmhz LnNbaV07CgogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgIAogICAgIAogICAgIAog ICAgQml0U2V0JiBvcGVyYXRvcio9KGNvbnN0IEJpdFNldCYgcmhzKQogICAgewogICAgICAgIGZv ciAoaW50IGkgPSAoc2V0X3NpemUgLSAxKSAvIGNlbGxfc2l6ZTsgaSA+PSAwOyBpLS0pCiAgICAg ICAgICAgIHNbaV0gJj0gcmhzLnNbaV07CgogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KCiAg ICAgCiAgICAgCiAgICAgCiAgICBCaXRTZXQgb3BlcmF0b3ItKGNvbnN0IEJpdFNldCYgcmhzKQog ICAgewogICAgICAgIEJpdFNldCByZXN1bHQoc2V0X3NpemUpOwoKICAgICAgICBmb3IgKGludCBp ID0gKHNldF9zaXplIC0gMSkgLyBjZWxsX3NpemU7IGkgPj0gMDsgaS0tKQogICAgICAgICAgICBy ZXN1bHQuc1tpXSA9IHNbaV0gJiAofiByaHMuc1tpXSk7CgogICAgICAgIHJldHVybiByZXN1bHQ7 CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAgQml0U2V0JiBvcGVyYXRvci09KGNvbnN0IEJp dFNldCYgcmhzKQogICAgewogICAgICAgIGZvciAoaW50IGkgPSAoc2V0X3NpemUgLSAxKSAvIGNl bGxfc2l6ZTsgaSA+PSAwOyBpLS0pCiAgICAgICAgICAgIHNbaV0gJj0gKH4gcmhzLnNbaV0pOwoK ICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9Cn07CgpjbGFzcyBEZWZpbml0ZUFzc2lnbm1lbnRT ZXQKewpwdWJsaWM6CiAgICBpbnQgc2V0X3NpemU7CgogICAgQml0U2V0IHRydWVfc2V0LAogICAg ICAgICAgIGZhbHNlX3NldDsKCiAgICBEZWZpbml0ZUFzc2lnbm1lbnRTZXQoaW50IHNldF9zaXpl XykgOiBzZXRfc2l6ZShzZXRfc2l6ZV8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdHJ1ZV9zZXQoc2V0X3NpemUpLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZmFsc2Vfc2V0KHNldF9zaXplKQogICAge30KfTsKCgoKCgoKCiMg MTcgIi4uLy4uL2ppa2VzL3NyYy9hc3QuaCIgMgoKCgoKCgoKY2xhc3MgUGFyc2VyOwpjbGFzcyBT ZW1hbnRpY0Vudmlyb25tZW50OwpjbGFzcyBTdG9yYWdlUG9vbDsKCmNsYXNzIFZhcmlhYmxlU3lt Ym9sQXJyYXkKewogICAgdHlwZWRlZiBWYXJpYWJsZVN5bWJvbCAqIFQ7CgogICAgVCAqKmJhc2U7 CiAgICBzaXplX3QgYmFzZV9zaXplOwogICAgaW50IHRvcCwKICAgICAgICBzaXplOwogICAgU3Rv cmFnZVBvb2wgKnBvb2w7CiAgICB1bnNpZ25lZCBzaG9ydCBsb2dfYmxrc2l6ZSwKICAgICAgICAg ICAgICAgICAgIGJhc2VfaW5jcmVtZW50OwoKICAgIGlubGluZSBzaXplX3QgQmxrc2l6ZSgpIHsg cmV0dXJuICgxIDw8IGxvZ19ibGtzaXplKTsgfQoKICAgICAKICAgICAKICAgICAKICAgIHZvaWQg QWxsb2NhdGVNb3JlU3BhY2UoKTsKCnB1YmxpYzoKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAg ICAgCiAgICAgCiAgICB2b2lkIFJlc2V0KGNvbnN0IGludCBuID0gMCkKICAgIHsKICAgICAgICBp ZiAobiA8IDAgfHwgbiA+IHNpemUpCiAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCgg ZmFsc2UgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImZhbHNlIiAsICIuLi8uLi9qaWtlcy9zcmMv YXN0LmgiLCA1OCwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKICAgICAgICB0b3AgPSBu OwogICAgfQoKICAgICAKICAgICAKICAgICAKICAgIGludCBMZW5ndGgoKSB7IHJldHVybiB0b3A7 IH0KCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBUJiBvcGVy YXRvcltdKGNvbnN0IGludCBpKSB7IHJldHVybiBiYXNlW2kgPj4gbG9nX2Jsa3NpemVdW2ldOyB9 CgogICAgIAogICAgIAogICAgIAogICAgaW50IE5leHRJbmRleCgpCiAgICB7CiAgICAgICAgaW50 IGkgPSB0b3ArKzsKICAgICAgICBpZiAoaSA9PSBzaXplKQogICAgICAgICAgICBBbGxvY2F0ZU1v cmVTcGFjZSgpOwogICAgICAgIHJldHVybiBpOwogICAgfQoKICAgICAKICAgICAKICAgICAKICAg ICAKICAgIFQmIE5leHQoKSB7IGludCBpID0gTmV4dEluZGV4KCk7IHJldHVybiBiYXNlW2kgPj4g bG9nX2Jsa3NpemVdW2ldOyB9CgogICAgIAogICAgIAogICAgIAogICAgVmFyaWFibGVTeW1ib2xB cnJheShTdG9yYWdlUG9vbCAqLCB1bnNpZ25lZCk7CgogICAgIAogICAgIAogICAgIAogICAgflZh cmlhYmxlU3ltYm9sQXJyYXkoKSB7IChzdGF0aWNfY2FzdDx2b2lkPiAgKCggZmFsc2UgKSA/IDAg OgkoX19hc3NlcnRfZmFpbCAoImZhbHNlIiAsICIuLi8uLi9qaWtlcy9zcmMvYXN0LmgiLCAxMDEs IF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7IH0KfTsKCgogCiAKIAogCiAKIAogCgogCiAK IAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCiAKIAogCiAKY2xhc3MgQXN0OwpjbGFz cyBBc3RMaXN0Tm9kZTsKY2xhc3MgQXN0U3RhdGVtZW50OwpjbGFzcyBBc3RFeHByZXNzaW9uOwpj bGFzcyBBc3RQcmltaXRpdmVUeXBlOwpjbGFzcyBBc3RBcnJheVR5cGU7CmNsYXNzIEFzdFNpbXBs ZU5hbWU7CmNsYXNzIEFzdFBhY2thZ2VEZWNsYXJhdGlvbjsKY2xhc3MgQXN0SW1wb3J0RGVjbGFy YXRpb247CmNsYXNzIEFzdENvbXBpbGF0aW9uVW5pdDsKY2xhc3MgQXN0TW9kaWZpZXI7CmNsYXNz IEFzdEVtcHR5RGVjbGFyYXRpb247CmNsYXNzIEFzdENsYXNzRGVjbGFyYXRpb247CmNsYXNzIEFz dENsYXNzQm9keTsKY2xhc3MgQXN0QXJyYXlJbml0aWFsaXplcjsKY2xhc3MgQXN0QnJhY2tldHM7 CmNsYXNzIEFzdFZhcmlhYmxlRGVjbGFyYXRvcklkOwpjbGFzcyBBc3RWYXJpYWJsZURlY2xhcmF0 b3I7CmNsYXNzIEFzdEZpZWxkRGVjbGFyYXRpb247CmNsYXNzIEFzdEZvcm1hbFBhcmFtZXRlcjsK Y2xhc3MgQXN0TWV0aG9kRGVjbGFyYXRvcjsKY2xhc3MgQXN0TWV0aG9kRGVjbGFyYXRpb247CmNs YXNzIEFzdFN0YXRpY0luaXRpYWxpemVyOwpjbGFzcyBBc3RUaGlzQ2FsbDsKY2xhc3MgQXN0U3Vw ZXJDYWxsOwpjbGFzcyBBc3RDb25zdHJ1Y3RvckJsb2NrOwpjbGFzcyBBc3RDb25zdHJ1Y3RvckRl Y2xhcmF0aW9uOwpjbGFzcyBBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbjsKY2xhc3MgQXN0QmxvY2s7 CmNsYXNzIEFzdExvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDsKY2xhc3MgQXN0SWZT dGF0ZW1lbnQ7CmNsYXNzIEFzdEVtcHR5U3RhdGVtZW50OwpjbGFzcyBBc3RFeHByZXNzaW9uU3Rh dGVtZW50OwpjbGFzcyBBc3RDYXNlTGFiZWw7CmNsYXNzIEFzdERlZmF1bHRMYWJlbDsKY2xhc3Mg QXN0U3dpdGNoQmxvY2tTdGF0ZW1lbnQ7CmNsYXNzIEFzdFN3aXRjaFN0YXRlbWVudDsKY2xhc3Mg QXN0V2hpbGVTdGF0ZW1lbnQ7CmNsYXNzIEFzdERvU3RhdGVtZW50OwpjbGFzcyBBc3RGb3JTdGF0 ZW1lbnQ7CmNsYXNzIEFzdEJyZWFrU3RhdGVtZW50OwpjbGFzcyBBc3RDb250aW51ZVN0YXRlbWVu dDsKY2xhc3MgQXN0UmV0dXJuU3RhdGVtZW50OwpjbGFzcyBBc3RUaHJvd1N0YXRlbWVudDsKY2xh c3MgQXN0U3luY2hyb25pemVkU3RhdGVtZW50OwpjbGFzcyBBc3RDYXRjaENsYXVzZTsKY2xhc3Mg QXN0RmluYWxseUNsYXVzZTsKY2xhc3MgQXN0VHJ5U3RhdGVtZW50OwpjbGFzcyBBc3RJbnRlZ2Vy TGl0ZXJhbDsKY2xhc3MgQXN0TG9uZ0xpdGVyYWw7CmNsYXNzIEFzdEZsb2F0aW5nUG9pbnRMaXRl cmFsOwpjbGFzcyBBc3REb3VibGVMaXRlcmFsOwpjbGFzcyBBc3RUcnVlTGl0ZXJhbDsKY2xhc3Mg QXN0RmFsc2VMaXRlcmFsOwpjbGFzcyBBc3RTdHJpbmdMaXRlcmFsOwpjbGFzcyBBc3RDaGFyYWN0 ZXJMaXRlcmFsOwpjbGFzcyBBc3ROdWxsTGl0ZXJhbDsKY2xhc3MgQXN0VGhpc0V4cHJlc3Npb247 CmNsYXNzIEFzdFN1cGVyRXhwcmVzc2lvbjsKY2xhc3MgQXN0UGFyZW50aGVzaXplZEV4cHJlc3Np b247CmNsYXNzIEFzdENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb247CmNsYXNzIEFzdERp bUV4cHI7CmNsYXNzIEFzdEFycmF5Q3JlYXRpb25FeHByZXNzaW9uOwpjbGFzcyBBc3RGaWVsZEFj Y2VzczsKY2xhc3MgQXN0TWV0aG9kSW52b2NhdGlvbjsKY2xhc3MgQXN0QXJyYXlBY2Nlc3M7CmNs YXNzIEFzdFBvc3RVbmFyeUV4cHJlc3Npb247CmNsYXNzIEFzdFByZVVuYXJ5RXhwcmVzc2lvbjsK Y2xhc3MgQXN0Q2FzdEV4cHJlc3Npb247CmNsYXNzIEFzdEJpbmFyeUV4cHJlc3Npb247CmNsYXNz IEFzdFR5cGVFeHByZXNzaW9uOwpjbGFzcyBBc3RDb25kaXRpb25hbEV4cHJlc3Npb247CmNsYXNz IEFzdEFzc2lnbm1lbnRFeHByZXNzaW9uOwoKY2xhc3MgQ2FzZUVsZW1lbnQ7CgogCiAKIApjbGFz cyBBc3QKewpwdWJsaWM6CiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBlbnVtIEFzdFRhZwog ICAgewogICAgICAgIE5PX1RBRywKICAgICAgICBQUklNSVRJVkVfVFlQRSwKICAgICAgICBTVEFU RU1FTlQsCiAgICAgICAgRVhQUkVTU0lPTiwKICAgICAgICBNT0RJRklFUiwKICAgICAgICBTVEFU SUNfRklFTEQsCiAgICAgICAgVU5QQVJTRUQsCgogICAgICAgIF9udW1fdGFncyA9IE1PRElGSUVS CiAgICB9OwoKICAgICAKICAgICAKICAgICAKICAgIGVudW0gQXN0S2luZAogICAgewogICAgICAg IEFTVCwKICAgICAgICBJREVOVElGSUVSLAogICAgICAgIERPVCwKICAgICAgICBJTlRFR0VSX0xJ VEVSQUwsCiAgICAgICAgTE9OR19MSVRFUkFMLAogICAgICAgIEZMT0FUSU5HX1BPSU5UX0xJVEVS QUwsCiAgICAgICAgRE9VQkxFX0xJVEVSQUwsCiAgICAgICAgVFJVRV9MSVRFUkFMLAogICAgICAg IEZBTFNFX0xJVEVSQUwsCiAgICAgICAgU1RSSU5HX0xJVEVSQUwsCiAgICAgICAgQ0hBUkFDVEVS X0xJVEVSQUwsCiAgICAgICAgTlVMTF9MSVRFUkFMLAogICAgICAgIEFSUkFZX0FDQ0VTUywKICAg ICAgICBDQUxMLAogICAgICAgIFRISVNfRVhQUkVTU0lPTiwKICAgICAgICBTVVBFUl9FWFBSRVNT SU9OLAogICAgICAgIFBBUkVOVEhFU0laRURfRVhQUkVTU0lPTiwKICAgICAgICBDTEFTU19DUkVB VElPTiwKICAgICAgICBBUlJBWV9DUkVBVElPTiwKICAgICAgICBQT1NUX1VOQVJZLAogICAgICAg IFBSRV9VTkFSWSwKICAgICAgICBDQVNULAogICAgICAgIENIRUNLX0FORF9DQVNULAogICAgICAg IEJJTkFSWSwKICAgICAgICBUWVBFLAogICAgICAgIENPTkRJVElPTkFMLAogICAgICAgIEFTU0lH Tk1FTlQsCgogICAgICAgIF9udW1fZXhwcmVzc2lvbl9raW5kcywKCiAgICAgICAgRElNID0gX251 bV9leHByZXNzaW9uX2tpbmRzLAogICAgICAgIExJU1RfTk9ERSwKICAgICAgICBJTlQsCiAgICAg ICAgRE9VQkxFLAogICAgICAgIENIQVIsCiAgICAgICAgTE9ORywKICAgICAgICBGTE9BVCwKICAg ICAgICBCWVRFLAogICAgICAgIFNIT1JULAogICAgICAgIEJPT0xFQU4sCiAgICAgICAgVk9JRF9U WVBFLAogICAgICAgIEFSUkFZLAogICAgICAgIENPTVBJTEFUSU9OLAogICAgICAgIEJBRF9DT01Q SUxBVElPTiwKICAgICAgICBFTVBUWV9DT01QSUxBVElPTiwKICAgICAgICBQQUNLQUdFX0NPTVBP TkVOVCwKICAgICAgICBQQUNLQUdFX05BTUUsCiAgICAgICAgUEFDS0FHRSwKICAgICAgICBJTVBP UlQsCiAgICAgICAgRU1QVFlfREVDTEFSQVRJT04sCiAgICAgICAgQ0xBU1MsCiAgICAgICAgQ0xB U1NfQk9EWSwKICAgICAgICBQVUJMSUMsCiAgICAgICAgUFJPVEVDVEVELAogICAgICAgIFBSSVZB VEUsCiAgICAgICAgU1RBVElDLAogICAgICAgIEFCU1RSQUNULAogICAgICAgIEZJTkFMLAogICAg ICAgIE5BVElWRSwKICAgICAgICBTVFJJQ1RGUCwKICAgICAgICBTWU5DSFJPTklaRUQsCiAgICAg ICAgVFJBTlNJRU5ULAogICAgICAgIFZPTEFUSUxFLAogICAgICAgIEZJRUxELAogICAgICAgIFZB UklBQkxFX0RFQ0xBUkFUT1IsCiAgICAgICAgVkFSSUFCTEVfREVDTEFSQVRPUl9OQU1FLAogICAg ICAgIEJSQUNLRVRTLAogICAgICAgIE1FVEhPRCwKICAgICAgICBNRVRIT0RfREVDTEFSQVRPUiwK ICAgICAgICBQQVJBTUVURVIsCiAgICAgICAgQ09OU1RSVUNUT1IsCiAgICAgICAgSU5URVJGQUNF LAogICAgICAgIEFSUkFZX0lOSVRJQUxJWkVSLAogICAgICAgIFNUQVRJQ19JTklUSUFMSVpFUiwK ICAgICAgICBUSElTX0NBTEwsCiAgICAgICAgU1VQRVJfQ0FMTCwKICAgICAgICBCTE9DSywKICAg ICAgICBDT05TVFJVQ1RPUl9CTE9DSywKICAgICAgICBMT0NBTF9WQVJJQUJMRV9ERUNMQVJBVElP TiwKICAgICAgICBJRiwKICAgICAgICBFTVBUWV9TVEFURU1FTlQsCiAgICAgICAgRVhQUkVTU0lP Tl9TVEFURU1FTlQsCiAgICAgICAgU1dJVENILAogICAgICAgIFNXSVRDSF9CTE9DSywKICAgICAg ICBDQVNFLAogICAgICAgIERFRkFVTFQsCiAgICAgICAgV0hJTEUsCiAgICAgICAgRE8sCiAgICAg ICAgRk9SLAogICAgICAgIEJSRUFLLAogICAgICAgIENPTlRJTlVFLAogICAgICAgIFJFVFVSTiwK ICAgICAgICBUSFJPVywKICAgICAgICBTWU5DSFJPTklaRURfU1RBVEVNRU5ULAogICAgICAgIFRS WSwKICAgICAgICBDQVRDSCwKICAgICAgICBGSU5BTExZLAoKICAgICAgICBfbnVtX2tpbmRzCiAg ICB9OwoKCgoKCiAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEtpbmQ7CiAgICB0eXBlZGVmIHVu c2lnbmVkIGNoYXIgIFRhZzsKCgogICAgS2luZCAga2luZDsgICAgICAgCiAgICBUYWcgICBjbGFz c190YWc7ICAKICAgIGJvb2wgIGdlbmVyYXRlZDsgIAogICAgICAgICAgICAgICAgICAgICAgCiAg ICAgICAgICAgICAgICAgICAgICAKCgoKCgoKCgoKCiAgICB2aXJ0dWFsIH5Bc3QoKTsKCgoKCgoK ICAgICAKICAgICAKICAgICAKICAgIGJvb2wgSXNOYW1lKCk7CiAgICBib29sIElzU2ltcGxlTmFt ZU9yRmllbGRBY2Nlc3MoKTsKICAgIGJvb2wgSXNTdXBlckV4cHJlc3Npb24oKTsKICAgIGJvb2wg SXNMZWZ0SGFuZFNpZGUoKTsKICAgIGJvb2wgSXNHZW5lcmF0ZWQoKTsKCiAgICAgCiAgICAgCiAg ICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAg CiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAg ICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAg CiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCgogICAgIAogICAgIAog ICAgIAogICAgIAogICAgIAogICAgaW5saW5lIEFzdFN0YXRlbWVudCAqU3RhdGVtZW50Q2FzdCgp OwogICAgaW5saW5lIEFzdEV4cHJlc3Npb24gKkV4cHJlc3Npb25DYXN0KCk7CiAgICBpbmxpbmUg QXN0UHJpbWl0aXZlVHlwZSAqUHJpbWl0aXZlVHlwZUNhc3QoKTsKICAgIGlubGluZSBBc3RNb2Rp ZmllciAqTW9kaWZpZXJDYXN0KCk7CiAgICBpbmxpbmUgQXN0RmllbGREZWNsYXJhdGlvbiAqU3Rh dGljRmllbGRDYXN0KCk7CiAgICBpbmxpbmUgQXN0Q2xhc3NCb2R5ICpVbnBhcnNlZENsYXNzQm9k eUNhc3QoKTsKICAgIGlubGluZSBBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiAqVW5wYXJzZWRJbnRl cmZhY2VCb2R5Q2FzdCgpOwoKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGlubGluZSBBc3RM aXN0Tm9kZSAqTGlzdE5vZGVDYXN0KCk7CiAgICBpbmxpbmUgQXN0QXJyYXlUeXBlICpBcnJheVR5 cGVDYXN0KCk7CiAgICBpbmxpbmUgQXN0U2ltcGxlTmFtZSAqU2ltcGxlTmFtZUNhc3QoKTsKICAg IGlubGluZSBBc3RQYWNrYWdlRGVjbGFyYXRpb24gKlBhY2thZ2VEZWNsYXJhdGlvbkNhc3QoKTsK ICAgIGlubGluZSBBc3RJbXBvcnREZWNsYXJhdGlvbiAqSW1wb3J0RGVjbGFyYXRpb25DYXN0KCk7 CiAgICBpbmxpbmUgQXN0Q29tcGlsYXRpb25Vbml0ICpDb21waWxhdGlvblVuaXRDYXN0KCk7CiAg ICBpbmxpbmUgQXN0Q29tcGlsYXRpb25Vbml0ICpCYWRDb21waWxhdGlvblVuaXRDYXN0KCk7CiAg ICBpbmxpbmUgQXN0Q29tcGlsYXRpb25Vbml0ICpFbXB0eUNvbXBpbGF0aW9uVW5pdENhc3QoKTsK ICAgIGlubGluZSBBc3RFbXB0eURlY2xhcmF0aW9uICpFbXB0eURlY2xhcmF0aW9uQ2FzdCgpOwog ICAgaW5saW5lIEFzdENsYXNzRGVjbGFyYXRpb24gKkNsYXNzRGVjbGFyYXRpb25DYXN0KCk7CiAg ICBpbmxpbmUgQXN0QXJyYXlJbml0aWFsaXplciAqQXJyYXlJbml0aWFsaXplckNhc3QoKTsKICAg IGlubGluZSBBc3RCcmFja2V0cyAqQnJhY2tldHNDYXN0KCk7CiAgICBpbmxpbmUgQXN0VmFyaWFi bGVEZWNsYXJhdG9ySWQgKlZhcmlhYmxlRGVjbGFyYXRvcklkQ2FzdCgpOwogICAgaW5saW5lIEFz dFZhcmlhYmxlRGVjbGFyYXRvciAqVmFyaWFibGVEZWNsYXJhdG9yQ2FzdCgpOwogICAgaW5saW5l IEFzdEZpZWxkRGVjbGFyYXRpb24gKkZpZWxkRGVjbGFyYXRpb25DYXN0KCk7CiAgICBpbmxpbmUg QXN0Rm9ybWFsUGFyYW1ldGVyICpGb3JtYWxQYXJhbWV0ZXJDYXN0KCk7CiAgICBpbmxpbmUgQXN0 TWV0aG9kRGVjbGFyYXRvciAqTWV0aG9kRGVjbGFyYXRvckNhc3QoKTsKICAgIGlubGluZSBBc3RN ZXRob2REZWNsYXJhdGlvbiAqTWV0aG9kRGVjbGFyYXRpb25DYXN0KCk7CiAgICBpbmxpbmUgQXN0 U3RhdGljSW5pdGlhbGl6ZXIgKlN0YXRpY0luaXRpYWxpemVyQ2FzdCgpOwogICAgaW5saW5lIEFz dFRoaXNDYWxsICpUaGlzQ2FsbENhc3QoKTsKICAgIGlubGluZSBBc3RTdXBlckNhbGwgKlN1cGVy Q2FsbENhc3QoKTsKICAgIGlubGluZSBBc3RDb25zdHJ1Y3RvckJsb2NrICpDb25zdHJ1Y3RvckJs b2NrQ2FzdCgpOwogICAgaW5saW5lIEFzdENvbnN0cnVjdG9yRGVjbGFyYXRpb24gKkNvbnN0cnVj dG9yRGVjbGFyYXRpb25DYXN0KCk7CiAgICBpbmxpbmUgQXN0SW50ZXJmYWNlRGVjbGFyYXRpb24g KkludGVyZmFjZURlY2xhcmF0aW9uQ2FzdCgpOwogICAgaW5saW5lIEFzdEJsb2NrICpCbG9ja0Nh c3QoKTsKICAgIGlubGluZSBBc3RMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgKkxv Y2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudENhc3QoKTsKICAgIGlubGluZSBBc3RJZlN0 YXRlbWVudCAqSWZTdGF0ZW1lbnRDYXN0KCk7CiAgICBpbmxpbmUgQXN0RW1wdHlTdGF0ZW1lbnQg KkVtcHR5U3RhdGVtZW50Q2FzdCgpOwogICAgaW5saW5lIEFzdEV4cHJlc3Npb25TdGF0ZW1lbnQg KkV4cHJlc3Npb25TdGF0ZW1lbnRDYXN0KCk7CiAgICBpbmxpbmUgQXN0Q2FzZUxhYmVsICpDYXNl TGFiZWxDYXN0KCk7CiAgICBpbmxpbmUgQXN0RGVmYXVsdExhYmVsICpEZWZhdWx0TGFiZWxDYXN0 KCk7CiAgICBpbmxpbmUgQXN0U3dpdGNoQmxvY2tTdGF0ZW1lbnQgKlN3aXRjaEJsb2NrU3RhdGVt ZW50Q2FzdCgpOwogICAgaW5saW5lIEFzdFN3aXRjaFN0YXRlbWVudCAqU3dpdGNoU3RhdGVtZW50 Q2FzdCgpOwogICAgaW5saW5lIEFzdFdoaWxlU3RhdGVtZW50ICpXaGlsZVN0YXRlbWVudENhc3Qo KTsKICAgIGlubGluZSBBc3REb1N0YXRlbWVudCAqRG9TdGF0ZW1lbnRDYXN0KCk7CiAgICBpbmxp bmUgQXN0Rm9yU3RhdGVtZW50ICpGb3JTdGF0ZW1lbnRDYXN0KCk7CiAgICBpbmxpbmUgQXN0QnJl YWtTdGF0ZW1lbnQgKkJyZWFrU3RhdGVtZW50Q2FzdCgpOwogICAgaW5saW5lIEFzdENvbnRpbnVl U3RhdGVtZW50ICpDb250aW51ZVN0YXRlbWVudENhc3QoKTsKICAgIGlubGluZSBBc3RSZXR1cm5T dGF0ZW1lbnQgKlJldHVyblN0YXRlbWVudENhc3QoKTsKICAgIGlubGluZSBBc3RUaHJvd1N0YXRl bWVudCAqVGhyb3dTdGF0ZW1lbnRDYXN0KCk7CiAgICBpbmxpbmUgQXN0U3luY2hyb25pemVkU3Rh dGVtZW50ICpTeW5jaHJvbml6ZWRTdGF0ZW1lbnRDYXN0KCk7CiAgICBpbmxpbmUgQXN0Q2F0Y2hD bGF1c2UgKkNhdGNoQ2xhdXNlQ2FzdCgpOwogICAgaW5saW5lIEFzdEZpbmFsbHlDbGF1c2UgKkZp bmFsbHlDbGF1c2VDYXN0KCk7CiAgICBpbmxpbmUgQXN0VHJ5U3RhdGVtZW50ICpUcnlTdGF0ZW1l bnRDYXN0KCk7CiAgICBpbmxpbmUgQXN0SW50ZWdlckxpdGVyYWwgKkludGVnZXJMaXRlcmFsQ2Fz dCgpOwogICAgaW5saW5lIEFzdExvbmdMaXRlcmFsICpMb25nTGl0ZXJhbENhc3QoKTsKICAgIGlu bGluZSBBc3RGbG9hdGluZ1BvaW50TGl0ZXJhbCAqRmxvYXRpbmdQb2ludExpdGVyYWxDYXN0KCk7 CiAgICBpbmxpbmUgQXN0RG91YmxlTGl0ZXJhbCAqRG91YmxlTGl0ZXJhbENhc3QoKTsKICAgIGlu bGluZSBBc3RUcnVlTGl0ZXJhbCAqVHJ1ZUxpdGVyYWxDYXN0KCk7CiAgICBpbmxpbmUgQXN0RmFs c2VMaXRlcmFsICpGYWxzZUxpdGVyYWxDYXN0KCk7CiAgICBpbmxpbmUgQXN0U3RyaW5nTGl0ZXJh bCAqU3RyaW5nTGl0ZXJhbENhc3QoKTsKICAgIGlubGluZSBBc3RDaGFyYWN0ZXJMaXRlcmFsICpD aGFyYWN0ZXJMaXRlcmFsQ2FzdCgpOwogICAgaW5saW5lIEFzdE51bGxMaXRlcmFsICpOdWxsTGl0 ZXJhbENhc3QoKTsKICAgIGlubGluZSBBc3RUaGlzRXhwcmVzc2lvbiAqVGhpc0V4cHJlc3Npb25D YXN0KCk7CiAgICBpbmxpbmUgQXN0U3VwZXJFeHByZXNzaW9uICpTdXBlckV4cHJlc3Npb25DYXN0 KCk7CiAgICBpbmxpbmUgQXN0UGFyZW50aGVzaXplZEV4cHJlc3Npb24gKlBhcmVudGhlc2l6ZWRF eHByZXNzaW9uQ2FzdCgpOwogICAgaW5saW5lIEFzdENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJl c3Npb24gKkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb25DYXN0KCk7CiAgICBpbmxpbmUg QXN0RGltRXhwciAqRGltRXhwckNhc3QoKTsKICAgIGlubGluZSBBc3RBcnJheUNyZWF0aW9uRXhw cmVzc2lvbiAqQXJyYXlDcmVhdGlvbkV4cHJlc3Npb25DYXN0KCk7CiAgICBpbmxpbmUgQXN0Rmll bGRBY2Nlc3MgKkZpZWxkQWNjZXNzQ2FzdCgpOwogICAgaW5saW5lIEFzdE1ldGhvZEludm9jYXRp b24gKk1ldGhvZEludm9jYXRpb25DYXN0KCk7CiAgICBpbmxpbmUgQXN0QXJyYXlBY2Nlc3MgKkFy cmF5QWNjZXNzQ2FzdCgpOwogICAgaW5saW5lIEFzdFBvc3RVbmFyeUV4cHJlc3Npb24gKlBvc3RV bmFyeUV4cHJlc3Npb25DYXN0KCk7CiAgICBpbmxpbmUgQXN0UHJlVW5hcnlFeHByZXNzaW9uICpQ cmVVbmFyeUV4cHJlc3Npb25DYXN0KCk7CiAgICBpbmxpbmUgQXN0Q2FzdEV4cHJlc3Npb24gKkNh c3RFeHByZXNzaW9uQ2FzdCgpOwogICAgaW5saW5lIEFzdEJpbmFyeUV4cHJlc3Npb24gKkJpbmFy eUV4cHJlc3Npb25DYXN0KCk7CiAgICBpbmxpbmUgQXN0VHlwZUV4cHJlc3Npb24gKlR5cGVFeHBy ZXNzaW9uQ2FzdCgpOwogICAgaW5saW5lIEFzdENvbmRpdGlvbmFsRXhwcmVzc2lvbiAqQ29uZGl0 aW9uYWxFeHByZXNzaW9uQ2FzdCgpOwogICAgaW5saW5lIEFzdEFzc2lnbm1lbnRFeHByZXNzaW9u ICpBc3NpZ25tZW50RXhwcmVzc2lvbkNhc3QoKTsKCiAgICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3Rv cmFnZVBvb2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2Vu KCkgIHsgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCAwICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCIw IiAsICIuLi8uLi9qaWtlcy9zcmMvYXN0LmgiLCA1MzcsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwg MCkpKSA7IHJldHVybiAwOyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdo dFRva2VuKCkgeyAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIDAgKSA/IDAgOgkoX19hc3NlcnRfZmFp bCAoIjAiICwgIi4uLy4uL2ppa2VzL3NyYy9hc3QuaCIsIDUzOCwgX19QUkVUVFlfRlVOQ1RJT05f XyApLCAwKSkpIDsgcmV0dXJuIDA7IH0KfTsKCgogCiAKIAogCiAKIAogCiAKIAp0ZW1wbGF0ZSA8 Y2xhc3MgVD4KY2xhc3MgQXN0QXJyYXkKewogICAgVCAqKmJhc2U7CiAgICBzaXplX3QgYmFzZV9z aXplOwogICAgaW50IHRvcCwKICAgICAgICBzaXplOwogICAgU3RvcmFnZVBvb2wgKnBvb2w7CiAg ICB1bnNpZ25lZCBzaG9ydCBsb2dfYmxrc2l6ZSwKICAgICAgICAgICAgICAgICAgIGJhc2VfaW5j cmVtZW50OwoKICAgIGlubGluZSBzaXplX3QgQmxrc2l6ZSgpIHsgcmV0dXJuICgxIDw8IGxvZ19i bGtzaXplKTsgfQoKICAgICAKICAgICAKICAgICAKICAgIHZvaWQgQWxsb2NhdGVNb3JlU3BhY2Uo KTsKCnB1YmxpYzoKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICB2b2lk IFJlc2V0KGNvbnN0IGludCBuID0gMCkKICAgIHsKICAgICAgICBpZiAobiA8IDAgfHwgbiA+IHNp emUpCiAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggZmFsc2UgKSA/IDAgOgkoX19h c3NlcnRfZmFpbCAoImZhbHNlIiAsICIuLi8uLi9qaWtlcy9zcmMvYXN0LmgiLCA1ODAsIF9fUFJF VFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CiAgICAgICAgdG9wID0gbjsKICAgIH0KCiAgICAgCiAg ICAgCiAgICAgCiAgICBpbnQgTGVuZ3RoKCkgeyByZXR1cm4gdG9wOyB9CgogICAgIAogICAgIAog ICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgVCYgb3BlcmF0b3JbXShjb25zdCBpbnQg aSkgeyByZXR1cm4gYmFzZVtpID4+IGxvZ19ibGtzaXplXVtpXTsgfQoKICAgICAKICAgICAKICAg ICAKICAgIGludCBOZXh0SW5kZXgoKQogICAgewogICAgICAgIGludCBpID0gdG9wKys7CiAgICAg ICAgaWYgKGkgPT0gc2l6ZSkKICAgICAgICAgICAgQWxsb2NhdGVNb3JlU3BhY2UoKTsKICAgICAg ICByZXR1cm4gaTsKICAgIH0KCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBUJiBOZXh0KCkg eyBpbnQgaSA9IE5leHRJbmRleCgpOyByZXR1cm4gYmFzZVtpID4+IGxvZ19ibGtzaXplXVtpXTsg fQoKICAgIGlubGluZSB2b2lkIFB1c2goVCBlbHQpIHsgdGhpcyAtPiBOZXh0KCkgPSBlbHQ7IH0K ICAgICAKICAgICAKICAgIGlubGluZSBUIFBvcCgpIHsgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCB0 b3AhPTAgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInRvcCE9MCIgLCAiLi4vLi4vamlrZXMvc3Jj L2FzdC5oIiwgNjE4LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOyB0b3AtLTsgcmV0dXJu IGJhc2VbdG9wID4+IGxvZ19ibGtzaXplXVt0b3BdOyB9CiAgICBpbmxpbmUgVCBUb3AoKSB7IChz dGF0aWNfY2FzdDx2b2lkPiAgKCggdG9wIT0wICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJ0b3Ah PTAiICwgIi4uLy4uL2ppa2VzL3NyYy9hc3QuaCIsIDYxOSwgX19QUkVUVFlfRlVOQ1RJT05fXyAp LCAwKSkpIDsgcmV0dXJuICgqdGhpcylbdG9wLTFdOyB9CgogICAgIAogICAgIAogICAgIAogICAg QXN0QXJyYXkoU3RvcmFnZVBvb2wgKiwgdW5zaWduZWQpOwoKICAgICAKICAgICAKICAgICAKICAg IH5Bc3RBcnJheSgpIHsgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBmYWxzZSApID8gMCA6CShfX2Fz c2VydF9mYWlsICgiZmFsc2UiICwgIi4uLy4uL2ppa2VzL3NyYy9hc3QuaCIsIDYyOSwgX19QUkVU VFlfRlVOQ1RJT05fXyApLCAwKSkpIDsgfQp9OwoKCiAKIAogCmNsYXNzIEFzdExpc3ROb2RlIDog cHVibGljIEFzdAp7CnB1YmxpYzoKICAgIEFzdExpc3ROb2RlICpuZXh0OwogICAgQXN0ICplbGVt ZW50OwogICAgdW5zaWduZWQgaW5kZXg7CgogICAgQXN0TGlzdE5vZGUoKQogICAgewogICAgICAg IEFzdDo6a2luZCA9IEFzdDo6TElTVF9OT0RFOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0 OjpOT19UQUc7CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwoKCgogICAgfQoKICAgIH5Bc3RM aXN0Tm9kZSgpIHt9CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2Vu KCkgIHsgcmV0dXJuIGVsZW1lbnQgLT4gTGVmdFRva2VuKCk7IH0KICAgIHZpcnR1YWwgTGV4U3Ry ZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiBlbGVtZW50IC0+IFJpZ2h0VG9r ZW4oKTsgfQp9OwoKCmNsYXNzIEFzdFN0YXRlbWVudCA6IHB1YmxpYyBBc3QKewpwcm90ZWN0ZWQ6 CgogICAgU3RvcmFnZVBvb2wgKnBvb2w7CiAgICBWYXJpYWJsZVN5bWJvbEFycmF5ICpkZWZpbmVk X3ZhcmlhYmxlczsKCnB1YmxpYzoKCiAgICBib29sIGlzX3JlYWNoYWJsZSwKICAgICAgICAgY2Fu X2NvbXBsZXRlX25vcm1hbGx5OwoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAK ICAgICAKICAgIHZpcnR1YWwgfkFzdFN0YXRlbWVudCgpOwoKICAgIHZpcnR1YWwgQXN0ICpDbG9u ZShTdG9yYWdlUG9vbCAqKSB7IHJldHVybiAoQXN0ICopIF9fbnVsbCA7IH0KCiAgICBpbmxpbmUg VmFyaWFibGVTeW1ib2wgKiZEZWZpbmVkVmFyaWFibGUoaW50IGkpIHsgcmV0dXJuICgqZGVmaW5l ZF92YXJpYWJsZXMpW2ldOyB9CiAgICBpbmxpbmUgaW50IE51bURlZmluZWRWYXJpYWJsZXMoKSB7 IHJldHVybiAoZGVmaW5lZF92YXJpYWJsZXMgPyBkZWZpbmVkX3ZhcmlhYmxlcyAtPiBMZW5ndGgo KSA6IDApOyB9CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZURlZmluZWRWYXJpYWJsZXMoaW50IGVz dGltYXRlID0gMCk7CiAgICBpbmxpbmUgdm9pZCBBZGREZWZpbmVkVmFyaWFibGUoVmFyaWFibGVT eW1ib2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2VuKCkg IHsgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCAwICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCIwIiAs ICIuLi8uLi9qaWtlcy9zcmMvYXN0LmgiLCA2ODgsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkp KSA7IHJldHVybiAwOyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdodFRv a2VuKCkgeyAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIDAgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAo IjAiICwgIi4uLy4uL2ppa2VzL3NyYy9hc3QuaCIsIDY4OSwgX19QUkVUVFlfRlVOQ1RJT05fXyAp LCAwKSkpIDsgcmV0dXJuIDA7IH0KfTsKCgpjbGFzcyBBc3RFeHByZXNzaW9uIDogcHVibGljIEFz dAp7CnB1YmxpYzoKICAgIExpdGVyYWxWYWx1ZSAqdmFsdWU7CiAgICBTeW1ib2wgKnN5bWJvbDsK CiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCgog ICAgdmlydHVhbCB+QXN0RXhwcmVzc2lvbigpOwoKICAgIGJvb2wgSXNDb25zdGFudCgpIHsgcmV0 dXJuICh2YWx1ZSAhPSBfX251bGwgKTsgfQoKICAgIFR5cGVTeW1ib2wgKlR5cGUoKQogICAgewog ICAgICAgIHJldHVybiAoVHlwZVN5bWJvbCAqKQogICAgICAgICAgICAgICAoc3ltYm9sID8gKHN5 bWJvbCAtPiBLaW5kKCkgPT0gU3ltYm9sOjpUWVBFCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA/IChUeXBlU3ltYm9sICopIHN5bWJvbAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgOiAoc3ltYm9sIC0+IEtpbmQoKSA9PSBTeW1ib2w6OlZBUklBQkxFCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKChWYXJpYWJsZVN5bWJvbCAq KSBzeW1ib2wpIC0+IFR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA6IChzeW1ib2wgLT4gS2luZCgpID09IFN5bWJvbDo6TUVUSE9ECiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoKE1ldGhvZFN5 bWJvbCAqKSBzeW1ib2wpIC0+IFR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDogX19udWxsICkpKQogICAgICAgICAgICAgICAgICAg ICAgIDogX19udWxsICk7CiAgICB9CgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29s ICopIHsgcmV0dXJuIChBc3QgKikgX19udWxsIDsgfQoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpU b2tlbkluZGV4IExlZnRUb2tlbigpICB7IChzdGF0aWNfY2FzdDx2b2lkPiAgKCggMCApID8gMCA6 CShfX2Fzc2VydF9mYWlsICgiMCIgLCAiLi4vLi4vamlrZXMvc3JjL2FzdC5oIiwgNzI4LCBfX1BS RVRUWV9GVU5DVElPTl9fICksIDApKSkgOyByZXR1cm4gMDsgfQogICAgdmlydHVhbCBMZXhTdHJl YW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpIHsgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCAwICkg PyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCIwIiAsICIuLi8uLi9qaWtlcy9zcmMvYXN0LmgiLCA3Mjks IF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7IHJldHVybiAwOyB9Cn07CgoKIAogCiAKIAog CiAKY2xhc3MgQXN0QmxvY2sgOiBwdWJsaWMgQXN0U3RhdGVtZW50CnsKcHJpdmF0ZToKCiAgICBB c3RBcnJheTxMZXhTdHJlYW06OlRva2VuSW5kZXg+ICpsYWJlbHM7CiAgICBBc3RBcnJheTxBc3Qg Kj4gKmJsb2NrX3N0YXRlbWVudHM7CiAgICBWYXJpYWJsZVN5bWJvbEFycmF5ICpsb2NhbGx5X2Rl ZmluZWRfdmFyaWFibGVzOwoKcHVibGljOgogICAgZW51bSBCbG9ja1RhZwogICAgewogICAgICAg IE5PTkUsCiAgICAgICAgVFJZX0NMQVVTRV9XSVRIX0ZJTkFMTFksCiAgICAgICAgRklOQUxMWSwK ICAgICAgICBTWU5DSFJPTklaRUQKICAgIH07CiAgICBCbG9ja1RhZyBibG9ja190YWc7CgogICAg QmxvY2tTeW1ib2wgKmJsb2NrX3N5bWJvbDsKCiAgICBpbnQgbmVzdGluZ19sZXZlbDsKICAgIExl eFN0cmVhbTo6VG9rZW5JbmRleCBsZWZ0X2JyYWNlX3Rva2VuOwogICAgTGV4U3RyZWFtOjpUb2tl bkluZGV4IHJpZ2h0X2JyYWNlX3Rva2VuOwoKICAgIGJvb2wgbm9fYnJhY2VzOwoKICAgIEFzdEJs b2NrKFN0b3JhZ2VQb29sICpwb29sXykgOiBsYWJlbHMoX19udWxsICksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc3RhdGVtZW50cyhfX251bGwgKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGx5X2RlZmluZWRfdmFyaWFibGVzKF9fbnVs bCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3RhZyhOT05FKSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19zeW1ib2woX19udWxsICks CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCgwKSwKICAg ICAgICAgICAgICAgICAgIG5vX2JyYWNlcyhmYWxzZSkKICAgIHsKICAgICAgICBBc3Q6OmtpbmQg PSBBc3Q6OkJMT0NLOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpTVEFURU1FTlQ7CiAg ICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwogICAgICAgIEFzdFN0YXRlbWVudDo6cG9vbCA9IHBv b2xfOwogICAgICAgIEFzdFN0YXRlbWVudDo6aXNfcmVhY2hhYmxlID0gZmFsc2U7CiAgICAgICAg QXN0U3RhdGVtZW50OjpjYW5fY29tcGxldGVfbm9ybWFsbHkgPSBmYWxzZTsKICAgICAgICBBc3RT dGF0ZW1lbnQ6OmRlZmluZWRfdmFyaWFibGVzID0gX19udWxsIDsKICAgIH0KCiAgICB2aXJ0dWFs IH5Bc3RCbG9jaygpOwoKICAgIGlubGluZSBBc3QgKiZTdGF0ZW1lbnQoaW50IGkpIHsgcmV0dXJu ICgqYmxvY2tfc3RhdGVtZW50cylbaV07IH0KICAgIGlubGluZSBpbnQgTnVtU3RhdGVtZW50cygp IHsgcmV0dXJuIChibG9ja19zdGF0ZW1lbnRzID8gYmxvY2tfc3RhdGVtZW50cyAtPiBMZW5ndGgo KSA6IDApOyB9CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZUJsb2NrU3RhdGVtZW50cyhpbnQgZXN0 aW1hdGUgPSAwKTsKICAgIGlubGluZSB2b2lkIEFkZFN0YXRlbWVudChBc3QgKik7CgogICAgaW5s aW5lIExleFN0cmVhbTo6VG9rZW5JbmRleCAmTGFiZWwoaW50IGkpIHsgcmV0dXJuICgqbGFiZWxz KVtpXTsgfQogICAgaW5saW5lIGludCBOdW1MYWJlbHMoKSB7IHJldHVybiAobGFiZWxzID8gbGFi ZWxzIC0+IExlbmd0aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9jYXRlTGFiZWxzKGlu dCBlc3RpbWF0ZSA9IDQpOwogICAgaW5saW5lIHZvaWQgQWRkTGFiZWwoTGV4U3RyZWFtOjpUb2tl bkluZGV4KTsKCiAgICBpbmxpbmUgVmFyaWFibGVTeW1ib2wgKiZMb2NhbGx5RGVmaW5lZFZhcmlh YmxlKGludCBpKSB7IHJldHVybiAoKmxvY2FsbHlfZGVmaW5lZF92YXJpYWJsZXMpW2ldOyB9CiAg ICBpbmxpbmUgaW50IE51bUxvY2FsbHlEZWZpbmVkVmFyaWFibGVzKCkgeyByZXR1cm4gKGxvY2Fs bHlfZGVmaW5lZF92YXJpYWJsZXMgPyBsb2NhbGx5X2RlZmluZWRfdmFyaWFibGVzIC0+IExlbmd0 aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9jYXRlTG9jYWxseURlZmluZWRWYXJpYWJs ZXMoaW50IGVzdGltYXRlID0gMCk7CiAgICBpbmxpbmUgdm9pZCBBZGRMb2NhbGx5RGVmaW5lZFZh cmlhYmxlKFZhcmlhYmxlU3ltYm9sICopOwoKICAgIGlubGluZSB2b2lkIFRyYW5zZmVyTG9jYWxs eURlZmluZWRWYXJpYWJsZXNUbyhBc3RTd2l0Y2hCbG9ja1N0YXRlbWVudCAqKTsKCgoKCgoKICAg IHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsKCiAgICB2aXJ0dWFsIExleFN0cmVh bTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKSAgeyByZXR1cm4gbGVmdF9icmFjZV90b2tlbjsgfQog ICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpIHsgcmV0dXJuIHJp Z2h0X2JyYWNlX3Rva2VuOyB9Cn07CgogCiAKIAogCiAKIAogCiAKIAogCiAKY2xhc3MgQXN0UHJp bWl0aXZlVHlwZSA6IHB1YmxpYyBBc3QKewpwdWJsaWM6CiAgICBMZXhTdHJlYW06OlRva2VuSW5k ZXggcHJpbWl0aXZlX2tpbmRfdG9rZW47CgogICAgQXN0UHJpbWl0aXZlVHlwZShBc3Q6OktpbmQg a2luZF8sIExleFN0cmVhbTo6VG9rZW5JbmRleCB0b2tlbl8pIDogcHJpbWl0aXZlX2tpbmRfdG9r ZW4odG9rZW5fKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IGtpbmRfOwogICAgICAgIEFzdDo6 Y2xhc3NfdGFnID0gQXN0OjpQUklNSVRJVkVfVFlQRTsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9 IDA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0UHJpbWl0aXZlVHlwZSgpOwoKCgoKCgogICAgdmly dHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpU b2tlbkluZGV4IExlZnRUb2tlbigpICB7IHJldHVybiBwcmltaXRpdmVfa2luZF90b2tlbjsgfQog ICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpIHsgcmV0dXJuIHBy aW1pdGl2ZV9raW5kX3Rva2VuOyB9Cn07CgoKIAogCiAKY2xhc3MgQXN0QnJhY2tldHMgOiBwdWJs aWMgQXN0CnsKcHVibGljOgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGxlZnRfYnJhY2tldF90 b2tlbjsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCByaWdodF9icmFja2V0X3Rva2VuOwoKICAg IEFzdEJyYWNrZXRzKExleFN0cmVhbTo6VG9rZW5JbmRleCBsZWZ0XywgTGV4U3RyZWFtOjpUb2tl bkluZGV4IHJpZ2h0XykgOiBsZWZ0X2JyYWNrZXRfdG9rZW4obGVmdF8pLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHJpZ2h0X2JyYWNrZXRfdG9rZW4ocmlnaHRfKQogICAgewogICAgICAgIEFzdDo6a2lu ZCA9IEFzdDo6QlJBQ0tFVFM7CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6Ok5PX1RBRzsK ICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0QnJhY2tl dHMoKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsKCiAgICB2 aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKSAgeyByZXR1cm4gbGVmdF9i cmFja2V0X3Rva2VuOyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdodFRv a2VuKCkgeyByZXR1cm4gcmlnaHRfYnJhY2tldF90b2tlbjsgfQp9OwoKCiAKIAogCiAKIAogCiAK IAogCiAKIAogCmNsYXNzIEFzdEFycmF5VHlwZSA6IHB1YmxpYyBBc3QKewpwcml2YXRlOgoKICAg IFN0b3JhZ2VQb29sICpwb29sOwogICAgQXN0QXJyYXk8QXN0QnJhY2tldHMgKj4gKmJyYWNrZXRz OwoKcHVibGljOgogICAgQXN0ICp0eXBlOwoKICAgIEFzdEFycmF5VHlwZShTdG9yYWdlUG9vbCAq cG9vbF8pIDogcG9vbChwb29sXyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGJyYWNrZXRzKF9fbnVsbCApCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0OjpBUlJB WTsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFzdDo6Tk9fVEFHOwogICAgICAgIEFzdDo6Z2Vu ZXJhdGVkID0gMDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RBcnJheVR5cGUoKTsKCiAgICBpbmxp bmUgQXN0QnJhY2tldHMgKiZCcmFja2V0cyhpbnQgaSkgeyByZXR1cm4gKCpicmFja2V0cylbaV07 IH0KICAgIGlubGluZSBpbnQgTnVtQnJhY2tldHMoKSB7IHJldHVybiAoYnJhY2tldHMgPyBicmFj a2V0cyAtPiBMZW5ndGgoKSA6IDApOyB9CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZUJyYWNrZXRz KGludCBlc3RpbWF0ZSA9IDApOwogICAgaW5saW5lIHZvaWQgQWRkQnJhY2tldHMoQXN0QnJhY2tl dHMgKik7CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3RvcmFnZVBvb2wgKik7CgogICAg dmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2VuKCkgIHsgcmV0dXJuIHR5cGUg LT4gTGVmdFRva2VuKCk7IH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0 VG9rZW4oKSB7IHJldHVybiBCcmFja2V0cyhOdW1CcmFja2V0cygpIC0gMSkgLT4gUmlnaHRUb2tl bigpOyB9Cn07CgoKIAogCiAKIAogCiAKY2xhc3MgQXN0U2ltcGxlTmFtZSA6IHB1YmxpYyBBc3RF eHByZXNzaW9uCnsKcHVibGljOgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGlkZW50aWZpZXJf dG9rZW47CgogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgQXN0RXhwcmVzc2lvbiAq cmVzb2x1dGlvbl9vcHQ7CgogICAgQXN0U2ltcGxlTmFtZShMZXhTdHJlYW06OlRva2VuSW5kZXgg dG9rZW5fKSA6IGlkZW50aWZpZXJfdG9rZW4odG9rZW5fKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uX29wdChfX251bGwgKQogICAg ewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6SURFTlRJRklFUjsKICAgICAgICBBc3Q6OmNsYXNz X3RhZyA9IEFzdDo6RVhQUkVTU0lPTjsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICAg ICAgQXN0RXhwcmVzc2lvbjo6dmFsdWUgPSBfX251bGwgOwogICAgICAgIEFzdEV4cHJlc3Npb246 OnN5bWJvbCA9IF9fbnVsbCA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0U2ltcGxlTmFtZSgpOwoK CgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwg TGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpICB7IHJldHVybiBpZGVudGlmaWVyX3Rv a2VuOyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdodFRva2VuKCkgeyBy ZXR1cm4gaWRlbnRpZmllcl90b2tlbjsgfQp9OwoKIAogCiAKY2xhc3MgQXN0UGFja2FnZURlY2xh cmF0aW9uIDogcHVibGljIEFzdAp7CnB1YmxpYzoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBw YWNrYWdlX3Rva2VuOwogICAgQXN0RXhwcmVzc2lvbiAqbmFtZTsKICAgIExleFN0cmVhbTo6VG9r ZW5JbmRleCBzZW1pY29sb25fdG9rZW47CgogICAgQXN0UGFja2FnZURlY2xhcmF0aW9uKCkKICAg IHsKICAgICAgICBBc3Q6OmtpbmQgPSBBc3Q6OlBBQ0tBR0U7CiAgICAgICAgQXN0OjpjbGFzc190 YWcgPSBBc3Q6Ok5PX1RBRzsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICB9CgogICAg dmlydHVhbCB+QXN0UGFja2FnZURlY2xhcmF0aW9uKCk7CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAq Q2xvbmUoU3RvcmFnZVBvb2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXgg TGVmdFRva2VuKCkgIHsgcmV0dXJuIHBhY2thZ2VfdG9rZW47IH0KICAgIHZpcnR1YWwgTGV4U3Ry ZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiBzZW1pY29sb25fdG9rZW47IH0K fTsKCiAKIAogCmNsYXNzIEFzdEltcG9ydERlY2xhcmF0aW9uIDogcHVibGljIEFzdAp7CnB1Ymxp YzoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBpbXBvcnRfdG9rZW47CiAgICBBc3RFeHByZXNz aW9uICpuYW1lOwogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHN0YXJfdG9rZW5fb3B0OyAgICAg ICAgCiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggc2VtaWNvbG9uX3Rva2VuOwoKICAgIEFzdElt cG9ydERlY2xhcmF0aW9uKCkKICAgIHsKICAgICAgICBBc3Q6OmtpbmQgPSBBc3Q6OklNUE9SVDsK ICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFzdDo6Tk9fVEFHOwogICAgICAgIEFzdDo6Z2VuZXJh dGVkID0gMDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RJbXBvcnREZWNsYXJhdGlvbigpOwoKCgoK CgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4 U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpICB7IHJldHVybiBpbXBvcnRfdG9rZW47IH0K ICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiBz ZW1pY29sb25fdG9rZW47IH0KfTsKCiAKIAogCiAKIApjbGFzcyBBc3RDb21waWxhdGlvblVuaXQg OiBwdWJsaWMgQXN0CnsKcHJpdmF0ZToKCiAgICBTdG9yYWdlUG9vbCAqcG9vbDsKICAgIEFzdEFy cmF5PEFzdEltcG9ydERlY2xhcmF0aW9uICo+ICppbXBvcnRfZGVjbGFyYXRpb25zOwogICAgQXN0 QXJyYXk8QXN0ICo+ICp0eXBlX2RlY2xhcmF0aW9uczsKCnB1YmxpYzoKICAgIFN0b3JhZ2VQb29s ICphc3RfcG9vbDsKCiAgICBBc3RQYWNrYWdlRGVjbGFyYXRpb24gKnBhY2thZ2VfZGVjbGFyYXRp b25fb3B0OwoKICAgIEFzdENvbXBpbGF0aW9uVW5pdChTdG9yYWdlUG9vbCAqcG9vbF8pIDogcG9v bChwb29sXyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlt cG9ydF9kZWNsYXJhdGlvbnMoX19udWxsICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHR5cGVfZGVjbGFyYXRpb25zKF9fbnVsbCApCiAgICB7CiAgICAgICAg QXN0OjpraW5kID0gQXN0OjpDT01QSUxBVElPTjsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFz dDo6Tk9fVEFHOwogICAgICAgIEFzdDo6Z2VuZXJhdGVkID0gMDsKICAgIH0KCiAgICB2aXJ0dWFs IH5Bc3RDb21waWxhdGlvblVuaXQoKTsKCiAgICB2b2lkIEZyZWVBc3QoKTsKCiAgICBpbmxpbmUg QXN0SW1wb3J0RGVjbGFyYXRpb24gKiZJbXBvcnREZWNsYXJhdGlvbihpbnQgaSkgeyByZXR1cm4g KCppbXBvcnRfZGVjbGFyYXRpb25zKVtpXTsgfQogICAgaW5saW5lIGludCBOdW1JbXBvcnREZWNs YXJhdGlvbnMoKSB7IHJldHVybiAoaW1wb3J0X2RlY2xhcmF0aW9ucyA/IGltcG9ydF9kZWNsYXJh dGlvbnMgLT4gTGVuZ3RoKCkgOiAwKTsgfQogICAgaW5saW5lIHZvaWQgQWxsb2NhdGVJbXBvcnRE ZWNsYXJhdGlvbnMoaW50IGVzdGltYXRlID0gMCk7CiAgICBpbmxpbmUgdm9pZCBBZGRJbXBvcnRE ZWNsYXJhdGlvbihBc3RJbXBvcnREZWNsYXJhdGlvbiAqKTsKCiAgICBpbmxpbmUgdm9pZCBSZXNl dFR5cGVEZWNsYXJhdGlvbnMoaW50IG4pIHsgaWYgKHR5cGVfZGVjbGFyYXRpb25zKSB0eXBlX2Rl Y2xhcmF0aW9ucyAtPiBSZXNldChuKTsgfQogICAgaW5saW5lIEFzdCAqJlR5cGVEZWNsYXJhdGlv bihpbnQgaSkgeyByZXR1cm4gKCp0eXBlX2RlY2xhcmF0aW9ucylbaV07IH0KICAgIGlubGluZSBp bnQgTnVtVHlwZURlY2xhcmF0aW9ucygpIHsgcmV0dXJuICh0eXBlX2RlY2xhcmF0aW9ucyA/IHR5 cGVfZGVjbGFyYXRpb25zIC0+IExlbmd0aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9j YXRlVHlwZURlY2xhcmF0aW9ucyhpbnQgZXN0aW1hdGUgPSAwKTsKICAgIGlubGluZSB2b2lkIEFk ZFR5cGVEZWNsYXJhdGlvbihBc3QgKik7CgoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0 b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tl bigpCiAgICB7CiAgICAgICAgaWYgKHBhY2thZ2VfZGVjbGFyYXRpb25fb3B0KQogICAgICAgICAg ICAgcmV0dXJuIHBhY2thZ2VfZGVjbGFyYXRpb25fb3B0IC0+IExlZnRUb2tlbigpOwogICAgICAg IGVsc2UgaWYgKE51bUltcG9ydERlY2xhcmF0aW9ucygpID4gMCkKICAgICAgICAgICAgIHJldHVy biBJbXBvcnREZWNsYXJhdGlvbigwKSAtPiBMZWZ0VG9rZW4oKTsKICAgICAgICBlbHNlIGlmIChO dW1UeXBlRGVjbGFyYXRpb25zKCkgPiAwKQogICAgICAgICAgICAgcmV0dXJuIFR5cGVEZWNsYXJh dGlvbigwKSAtPiBMZWZ0VG9rZW4oKTsKCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgdmly dHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpCiAgICB7CiAgICAgICAgaWYg KE51bVR5cGVEZWNsYXJhdGlvbnMoKSA+IDApCiAgICAgICAgICAgICByZXR1cm4gVHlwZURlY2xh cmF0aW9uKE51bVR5cGVEZWNsYXJhdGlvbnMoKSAtIDEpIC0+IFJpZ2h0VG9rZW4oKTsKICAgICAg ICBlbHNlIGlmIChOdW1JbXBvcnREZWNsYXJhdGlvbnMoKSA+IDApCiAgICAgICAgICAgICByZXR1 cm4gSW1wb3J0RGVjbGFyYXRpb24oTnVtSW1wb3J0RGVjbGFyYXRpb25zKCkgLSAxKSAtPiBSaWdo dFRva2VuKCk7CiAgICAgICAgZWxzZSBpZiAocGFja2FnZV9kZWNsYXJhdGlvbl9vcHQpCiAgICAg ICAgICAgICByZXR1cm4gcGFja2FnZV9kZWNsYXJhdGlvbl9vcHQgLT4gUmlnaHRUb2tlbigpOwoK ICAgICAgICByZXR1cm4gMDsKICAgIH0KfTsKCgogCiAKIAogCiAKIAogCiAKIApjbGFzcyBBc3RN b2RpZmllciA6IHB1YmxpYyBBc3QKewpwdWJsaWM6CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXgg bW9kaWZpZXJfa2luZF90b2tlbjsKCiAgICBBc3RNb2RpZmllcihBc3Q6OktpbmQga2luZF8sIExl eFN0cmVhbTo6VG9rZW5JbmRleCB0b2tlbl8pIDogbW9kaWZpZXJfa2luZF90b2tlbih0b2tlbl8p CiAgICB7CiAgICAgICAgQXN0OjpraW5kID0ga2luZF87CiAgICAgICAgQXN0OjpjbGFzc190YWcg PSBBc3Q6Ok1PRElGSUVSOwogICAgICAgIEFzdDo6Z2VuZXJhdGVkID0gMDsKICAgIH0KCiAgICB2 aXJ0dWFsIH5Bc3RNb2RpZmllcigpOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3Jh Z2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigp ICB7IHJldHVybiBtb2RpZmllcl9raW5kX3Rva2VuOyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6 VG9rZW5JbmRleCBSaWdodFRva2VuKCkgeyByZXR1cm4gbW9kaWZpZXJfa2luZF90b2tlbjsgfQp9 OwoKCiAKIAogCmNsYXNzIEFzdEVtcHR5RGVjbGFyYXRpb24gOiBwdWJsaWMgQXN0CnsKcHVibGlj OgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHNlbWljb2xvbl90b2tlbjsKCiAgICBBc3RFbXB0 eURlY2xhcmF0aW9uKExleFN0cmVhbTo6VG9rZW5JbmRleCB0b2tlbl8pIDogc2VtaWNvbG9uX3Rv a2VuKHRva2VuXykKICAgIHsKICAgICAgICBBc3Q6OmtpbmQgPSBBc3Q6OkVNUFRZX0RFQ0xBUkFU SU9OOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpOT19UQUc7CiAgICAgICAgQXN0Ojpn ZW5lcmF0ZWQgPSAwOwogICAgfQoKICAgIHZpcnR1YWwgfkFzdEVtcHR5RGVjbGFyYXRpb24oKTsK CgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsKCiAgICB2aXJ0dWFs IExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKSB7IHJldHVybiBzZW1pY29sb25fdG9r ZW47IH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJl dHVybiBzZW1pY29sb25fdG9rZW47IH0KfTsKCiAKIAogCmNsYXNzIEFzdENsYXNzQm9keSA6IHB1 YmxpYyBBc3QKewpwcml2YXRlOgogICAgZnJpZW5kIGNsYXNzIFBhcnNlcjsKCiAgICBTdG9yYWdl UG9vbCAqcG9vbDsKICAgIEFzdEFycmF5PEFzdCAqPiAqY2xhc3NfYm9keV9kZWNsYXJhdGlvbnM7 CgogICAgQXN0QXJyYXk8QXN0RmllbGREZWNsYXJhdGlvbiAqPiAqaW5zdGFuY2VfdmFyaWFibGVz OwogICAgQXN0QXJyYXk8QXN0RmllbGREZWNsYXJhdGlvbiAqPiAqY2xhc3NfdmFyaWFibGVzOwog ICAgQXN0QXJyYXk8QXN0TWV0aG9kRGVjbGFyYXRpb24gKj4gKm1ldGhvZHM7CiAgICBBc3RBcnJh eTxBc3RDb25zdHJ1Y3RvckRlY2xhcmF0aW9uICo+ICpjb25zdHJ1Y3RvcnM7CiAgICBBc3RBcnJh eTxBc3RTdGF0aWNJbml0aWFsaXplciAqPiAqc3RhdGljX2luaXRpYWxpemVyczsKICAgIEFzdEFy cmF5PEFzdENsYXNzRGVjbGFyYXRpb24gKj4gKmlubmVyX2NsYXNzZXM7CiAgICBBc3RBcnJheTxB c3RJbnRlcmZhY2VEZWNsYXJhdGlvbiAqPiAqaW5uZXJfaW50ZXJmYWNlczsKICAgIEFzdEFycmF5 PEFzdEJsb2NrICo+ICpibG9ja3M7CiAgICBBc3RBcnJheTxBc3RFbXB0eURlY2xhcmF0aW9uICo+ ICplbXB0eV9kZWNsYXJhdGlvbnM7CgpwdWJsaWM6CgogICAgQXN0Q29uc3RydWN0b3JEZWNsYXJh dGlvbiAqZGVmYXVsdF9jb25zdHJ1Y3RvcjsKCiAgICBBc3RCbG9jayAqdGhpc19ibG9jazsgIAoK ICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBsZWZ0X2JyYWNlX3Rva2VuOwogICAgTGV4U3RyZWFt OjpUb2tlbkluZGV4IHJpZ2h0X2JyYWNlX3Rva2VuOwoKICAgIGlubGluZSB2b2lkIG1hcmtfdW5w YXJzZWQoKSB7IEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpVTlBBUlNFRDsgfQogICAgaW5saW5lIHZv aWQgbWFya19wYXJzZWQoKSAgIHsgQXN0OjpjbGFzc190YWcgPSBBc3Q6Ok5PX1RBRzsgfQoKICAg IEFzdENsYXNzQm9keShTdG9yYWdlUG9vbCAqcG9vbF8pIDogcG9vbChwb29sXyksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX2JvZHlfZGVjbGFyYXRpb25zKF9f bnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZV92 YXJpYWJsZXMoX19udWxsICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNsYXNzX3ZhcmlhYmxlcyhfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgbWV0aG9kcyhfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3RydWN0b3JzKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzdGF0aWNfaW5pdGlhbGl6ZXJzKF9fbnVsbCApLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lcl9jbGFzc2VzKF9fbnVsbCApLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lcl9pbnRlcmZhY2VzKF9fbnVsbCAp LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MoX19udWxsICks CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5X2RlY2xhcmF0aW9u cyhfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVs dF9jb25zdHJ1Y3RvcihfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdGhpc19ibG9jayhfX251bGwgKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6 Q0xBU1NfQk9EWTsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFzdDo6Tk9fVEFHOwogICAgICAg IEFzdDo6Z2VuZXJhdGVkID0gMDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RDbGFzc0JvZHkoKTsK CiAgICBpbmxpbmUgQXN0IComQ2xhc3NCb2R5RGVjbGFyYXRpb24oaW50IGkpIHsgcmV0dXJuICgq Y2xhc3NfYm9keV9kZWNsYXJhdGlvbnMpW2ldOyB9CiAgICBpbmxpbmUgaW50IE51bUNsYXNzQm9k eURlY2xhcmF0aW9ucygpIHsgcmV0dXJuIChjbGFzc19ib2R5X2RlY2xhcmF0aW9ucyA/IGNsYXNz X2JvZHlfZGVjbGFyYXRpb25zIC0+IExlbmd0aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFs bG9jYXRlQ2xhc3NCb2R5RGVjbGFyYXRpb25zKGludCBlc3RpbWF0ZSA9IDApOwogICAgaW5saW5l IHZvaWQgQWRkQ2xhc3NCb2R5RGVjbGFyYXRpb24oQXN0ICopOwogICAgaW5saW5lIHZvaWQgQWRk Q2xhc3NCb2R5RGVjbGFyYXRpb25OaWNlbHkoQXN0ICopOwoKICAgIGlubGluZSBBc3RGaWVsZERl Y2xhcmF0aW9uIComSW5zdGFuY2VWYXJpYWJsZShpbnQgaSkgeyByZXR1cm4gKCppbnN0YW5jZV92 YXJpYWJsZXMpW2ldOyB9CiAgICBpbmxpbmUgaW50IE51bUluc3RhbmNlVmFyaWFibGVzKCkgeyBy ZXR1cm4gKGluc3RhbmNlX3ZhcmlhYmxlcyA/IGluc3RhbmNlX3ZhcmlhYmxlcyAtPiBMZW5ndGgo KSA6IDApOyB9CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZUluc3RhbmNlVmFyaWFibGVzKGludCBl c3RpbWF0ZSA9IDApOwogICAgaW5saW5lIHZvaWQgQWRkSW5zdGFuY2VWYXJpYWJsZShBc3RGaWVs ZERlY2xhcmF0aW9uICopOwoKICAgIGlubGluZSBBc3RGaWVsZERlY2xhcmF0aW9uIComQ2xhc3NW YXJpYWJsZShpbnQgaSkgeyByZXR1cm4gKCpjbGFzc192YXJpYWJsZXMpW2ldOyB9CiAgICBpbmxp bmUgaW50IE51bUNsYXNzVmFyaWFibGVzKCkgeyByZXR1cm4gKGNsYXNzX3ZhcmlhYmxlcyA/IGNs YXNzX3ZhcmlhYmxlcyAtPiBMZW5ndGgoKSA6IDApOyB9CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0 ZUNsYXNzVmFyaWFibGVzKGludCBlc3RpbWF0ZSA9IDApOwogICAgaW5saW5lIHZvaWQgQWRkQ2xh c3NWYXJpYWJsZShBc3RGaWVsZERlY2xhcmF0aW9uICopOwoKICAgIGlubGluZSBBc3RNZXRob2RE ZWNsYXJhdGlvbiAqJk1ldGhvZChpbnQgaSkgeyByZXR1cm4gKCptZXRob2RzKVtpXTsgfQogICAg aW5saW5lIGludCBOdW1NZXRob2RzKCkgeyByZXR1cm4gKG1ldGhvZHMgPyBtZXRob2RzIC0+IExl bmd0aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9jYXRlTWV0aG9kcyhpbnQgZXN0aW1h dGUgPSAwKTsKICAgIGlubGluZSB2b2lkIEFkZE1ldGhvZChBc3RNZXRob2REZWNsYXJhdGlvbiAq KTsKCiAgICBpbmxpbmUgQXN0Q29uc3RydWN0b3JEZWNsYXJhdGlvbiAqJkNvbnN0cnVjdG9yKGlu dCBpKSB7IHJldHVybiAoKmNvbnN0cnVjdG9ycylbaV07IH0KICAgIGlubGluZSBpbnQgTnVtQ29u c3RydWN0b3JzKCkgeyByZXR1cm4gKGNvbnN0cnVjdG9ycyA/IGNvbnN0cnVjdG9ycyAtPiBMZW5n dGgoKSA6IDApOyB9CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZUNvbnN0cnVjdG9ycyhpbnQgZXN0 aW1hdGUgPSAwKTsKICAgIGlubGluZSB2b2lkIEFkZENvbnN0cnVjdG9yKEFzdENvbnN0cnVjdG9y RGVjbGFyYXRpb24gKik7CgogICAgaW5saW5lIEFzdFN0YXRpY0luaXRpYWxpemVyIComU3RhdGlj SW5pdGlhbGl6ZXIoaW50IGkpIHsgcmV0dXJuICgqc3RhdGljX2luaXRpYWxpemVycylbaV07IH0K ICAgIGlubGluZSBpbnQgTnVtU3RhdGljSW5pdGlhbGl6ZXJzKCkgeyByZXR1cm4gKHN0YXRpY19p bml0aWFsaXplcnMgPyBzdGF0aWNfaW5pdGlhbGl6ZXJzIC0+IExlbmd0aCgpIDogMCk7IH0KICAg IGlubGluZSB2b2lkIEFsbG9jYXRlU3RhdGljSW5pdGlhbGl6ZXJzKGludCBlc3RpbWF0ZSA9IDAp OwogICAgaW5saW5lIHZvaWQgQWRkU3RhdGljSW5pdGlhbGl6ZXIoQXN0U3RhdGljSW5pdGlhbGl6 ZXIgKik7CgogICAgaW5saW5lIEFzdENsYXNzRGVjbGFyYXRpb24gKiZOZXN0ZWRDbGFzcyhpbnQg aSkgeyByZXR1cm4gKCppbm5lcl9jbGFzc2VzKVtpXTsgfQogICAgaW5saW5lIGludCBOdW1OZXN0 ZWRDbGFzc2VzKCkgeyByZXR1cm4gKGlubmVyX2NsYXNzZXMgPyBpbm5lcl9jbGFzc2VzIC0+IExl bmd0aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9jYXRlTmVzdGVkQ2xhc3NlcyhpbnQg ZXN0aW1hdGUgPSAwKTsKICAgIGlubGluZSB2b2lkIEFkZE5lc3RlZENsYXNzKEFzdENsYXNzRGVj bGFyYXRpb24gKik7CgogICAgaW5saW5lIEFzdEludGVyZmFjZURlY2xhcmF0aW9uIComTmVzdGVk SW50ZXJmYWNlKGludCBpKSB7IHJldHVybiAoKmlubmVyX2ludGVyZmFjZXMpW2ldOyB9CiAgICBp bmxpbmUgaW50IE51bU5lc3RlZEludGVyZmFjZXMoKSB7IHJldHVybiAoaW5uZXJfaW50ZXJmYWNl cyA/IGlubmVyX2ludGVyZmFjZXMgLT4gTGVuZ3RoKCkgOiAwKTsgfQogICAgaW5saW5lIHZvaWQg QWxsb2NhdGVOZXN0ZWRJbnRlcmZhY2VzKGludCBlc3RpbWF0ZSA9IDApOwogICAgaW5saW5lIHZv aWQgQWRkTmVzdGVkSW50ZXJmYWNlKEFzdEludGVyZmFjZURlY2xhcmF0aW9uICopOwoKICAgIGlu bGluZSBBc3RCbG9jayAqJkJsb2NrKGludCBpKSB7IHJldHVybiAoKmJsb2NrcylbaV07IH0KICAg IGlubGluZSBpbnQgTnVtQmxvY2tzKCkgeyByZXR1cm4gKGJsb2NrcyA/IGJsb2NrcyAtPiBMZW5n dGgoKSA6IDApOyB9CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZUJsb2NrcyhpbnQgZXN0aW1hdGUg PSAwKTsKICAgIGlubGluZSB2b2lkIEFkZEJsb2NrKEFzdEJsb2NrICopOwoKICAgIGlubGluZSBB c3RFbXB0eURlY2xhcmF0aW9uIComRW1wdHlEZWNsYXJhdGlvbihpbnQgaSkgeyByZXR1cm4gKCpl bXB0eV9kZWNsYXJhdGlvbnMpW2ldOyB9CiAgICBpbmxpbmUgaW50IE51bUVtcHR5RGVjbGFyYXRp b25zKCkgeyByZXR1cm4gKGVtcHR5X2RlY2xhcmF0aW9ucyA/IGVtcHR5X2RlY2xhcmF0aW9ucyAt PiBMZW5ndGgoKSA6IDApOyB9CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZUVtcHR5RGVjbGFyYXRp b25zKGludCBlc3RpbWF0ZSA9IDApOwogICAgaW5saW5lIHZvaWQgQWRkRW1wdHlEZWNsYXJhdGlv bihBc3RFbXB0eURlY2xhcmF0aW9uICopOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0 b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tl bigpIHsgcmV0dXJuIGxlZnRfYnJhY2VfdG9rZW47IH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpU b2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiByaWdodF9icmFjZV90b2tlbjsgfQp9OwoK CgogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIApjbGFzcyBBc3RDbGFzc0RlY2xh cmF0aW9uIDogcHVibGljIEFzdFN0YXRlbWVudAp7CiAgICBBc3RBcnJheTxBc3RNb2RpZmllciAq PiAqY2xhc3NfbW9kaWZpZXJzOwogICAgQXN0QXJyYXk8QXN0RXhwcmVzc2lvbiAqPiAqaW50ZXJm YWNlczsKCnB1YmxpYzoKICAgIFNlbWFudGljRW52aXJvbm1lbnQgKnNlbWFudGljX2Vudmlyb25t ZW50OwoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBjbGFzc190b2tlbjsKICAgIExleFN0cmVh bTo6VG9rZW5JbmRleCBpZGVudGlmaWVyX3Rva2VuOwogICAgQXN0ICpzdXBlcl9vcHQ7CiAgICBB c3RDbGFzc0JvZHkgKmNsYXNzX2JvZHk7CgogICAgQXN0Q2xhc3NEZWNsYXJhdGlvbihTdG9yYWdl UG9vbCAqcG9vbF8pIDogY2xhc3NfbW9kaWZpZXJzKF9fbnVsbCApLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlcyhfX251bGwgKSwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljX2Vudmlyb25t ZW50KF9fbnVsbCApCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0OjpDTEFTUzsKICAgICAg ICBBc3Q6OmNsYXNzX3RhZyA9IEFzdDo6Tk9fVEFHOwogICAgICAgIEFzdDo6Z2VuZXJhdGVkID0g MDsKICAgIEFzdFN0YXRlbWVudDo6cG9vbCA9IHBvb2xfOwogICAgfQoKICAgIHZpcnR1YWwgfkFz dENsYXNzRGVjbGFyYXRpb24oKTsKCiAgICBib29sIElzVmFsaWQoKSB7IHJldHVybiBzZW1hbnRp Y19lbnZpcm9ubWVudCAhPSBfX251bGwgOyB9CgogICAgaW5saW5lIHZvaWQgTWFya0xvY2FsKCkK ICAgIHsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFzdDo6U1RBVEVNRU5UOwogICAgICAgIEFz dFN0YXRlbWVudDo6aXNfcmVhY2hhYmxlID0gdHJ1ZTsKICAgICAgICBBc3RTdGF0ZW1lbnQ6OmNh bl9jb21wbGV0ZV9ub3JtYWxseSA9IHRydWU7CiAgICAgICAgQXN0U3RhdGVtZW50OjpkZWZpbmVk X3ZhcmlhYmxlcyA9IF9fbnVsbCA7CiAgICB9CgogICAgaW5saW5lIEFzdE1vZGlmaWVyIComQ2xh c3NNb2RpZmllcihpbnQgaSkgeyByZXR1cm4gKCpjbGFzc19tb2RpZmllcnMpW2ldOyB9CiAgICBp bmxpbmUgaW50IE51bUNsYXNzTW9kaWZpZXJzKCkgeyByZXR1cm4gKGNsYXNzX21vZGlmaWVycyA/ IGNsYXNzX21vZGlmaWVycyAtPiBMZW5ndGgoKSA6IDApOyB9CiAgICBpbmxpbmUgdm9pZCBBbGxv Y2F0ZUNsYXNzTW9kaWZpZXJzKGludCBlc3RpbWF0ZSA9IDApOwogICAgaW5saW5lIHZvaWQgQWRk Q2xhc3NNb2RpZmllcihBc3RNb2RpZmllciAqKTsKCiAgICBpbmxpbmUgQXN0RXhwcmVzc2lvbiAq JkludGVyZmFjZShpbnQgaSkgeyByZXR1cm4gKCppbnRlcmZhY2VzKVtpXTsgfQogICAgaW5saW5l IGludCBOdW1JbnRlcmZhY2VzKCkgeyByZXR1cm4gKGludGVyZmFjZXMgPyBpbnRlcmZhY2VzIC0+ IExlbmd0aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9jYXRlSW50ZXJmYWNlcyhpbnQg ZXN0aW1hdGUgPSAwKTsKICAgIGlubGluZSB2b2lkIEFkZEludGVyZmFjZShBc3RFeHByZXNzaW9u ICopOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZp cnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpCiAgICB7CiAgICAgICAgcmV0 dXJuIChOdW1DbGFzc01vZGlmaWVycygpID4gMCA/ICgqY2xhc3NfbW9kaWZpZXJzKVswXSAtPiBM ZWZ0VG9rZW4oKSA6IGNsYXNzX3Rva2VuKTsKICAgIH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpU b2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiBjbGFzc19ib2R5IC0+IFJpZ2h0VG9rZW4o KTsgfQp9OwoKCiAKIAogCiAKIAogCmNsYXNzIEFzdEFycmF5SW5pdGlhbGl6ZXIgOiBwdWJsaWMg QXN0CnsKcHJpdmF0ZToKCiAgICBTdG9yYWdlUG9vbCAqcG9vbDsKICAgIEFzdEFycmF5PEFzdCAq PiAqdmFyaWFibGVfaW5pdGlhbGl6ZXJzOwoKcHVibGljOgogICAgTGV4U3RyZWFtOjpUb2tlbklu ZGV4IGxlZnRfYnJhY2VfdG9rZW47CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggcmlnaHRfYnJh Y2VfdG9rZW47CgogICAgQXN0QXJyYXlJbml0aWFsaXplcihTdG9yYWdlUG9vbCAqcG9vbF8pIDog cG9vbChwb29sXyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB2YXJpYWJsZV9pbml0aWFsaXplcnMoX19udWxsICkKICAgIHsKICAgICAgICBBc3Q6OmtpbmQg PSBBc3Q6OkFSUkFZX0lOSVRJQUxJWkVSOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpO T19UQUc7CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwogICAgfQoKICAgIHZpcnR1YWwgfkFz dEFycmF5SW5pdGlhbGl6ZXIoKTsKCiAgICBpbmxpbmUgQXN0IComVmFyaWFibGVJbml0aWFsaXpl cihpbnQgaSkgeyByZXR1cm4gKCp2YXJpYWJsZV9pbml0aWFsaXplcnMpW2ldOyB9CiAgICBpbmxp bmUgaW50IE51bVZhcmlhYmxlSW5pdGlhbGl6ZXJzKCkgeyByZXR1cm4gKHZhcmlhYmxlX2luaXRp YWxpemVycyA/IHZhcmlhYmxlX2luaXRpYWxpemVycyAtPiBMZW5ndGgoKSA6IDApOyB9CiAgICBp bmxpbmUgdm9pZCBBbGxvY2F0ZVZhcmlhYmxlSW5pdGlhbGl6ZXJzKGludCBlc3RpbWF0ZSA9IDAp OwogICAgaW5saW5lIHZvaWQgQWRkVmFyaWFibGVJbml0aWFsaXplcihBc3QgKik7CgoKCgoKCiAg ICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3RvcmFnZVBvb2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJl YW06OlRva2VuSW5kZXggTGVmdFRva2VuKCkgeyByZXR1cm4gbGVmdF9icmFjZV90b2tlbjsgfQog ICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpIHsgcmV0dXJuIHJp Z2h0X2JyYWNlX3Rva2VuOyB9Cn07CgoKIAogCiAKY2xhc3MgQXN0VmFyaWFibGVEZWNsYXJhdG9y SWQgOiBwdWJsaWMgQXN0CnsKcHJpdmF0ZToKCiAgICBTdG9yYWdlUG9vbCAqcG9vbDsKICAgIEFz dEFycmF5PEFzdEJyYWNrZXRzICo+ICpicmFja2V0czsKCnB1YmxpYzoKCiAgICBMZXhTdHJlYW06 OlRva2VuSW5kZXggaWRlbnRpZmllcl90b2tlbjsKCiAgICBBc3RWYXJpYWJsZURlY2xhcmF0b3JJ ZChTdG9yYWdlUG9vbCAqcG9vbF8pIDogcG9vbChwb29sXyksCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhY2tldHMoX19udWxsICkKICAgIHsKICAg ICAgICBBc3Q6OmtpbmQgPSBBc3Q6OlZBUklBQkxFX0RFQ0xBUkFUT1JfTkFNRTsKICAgICAgICBB c3Q6OmNsYXNzX3RhZyA9IEFzdDo6Tk9fVEFHOwogICAgICAgIEFzdDo6Z2VuZXJhdGVkID0gMDsK ICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RWYXJpYWJsZURlY2xhcmF0b3JJZCgpOwoKICAgIGlubGlu ZSBBc3RCcmFja2V0cyAqJkJyYWNrZXRzKGludCBpKSB7IHJldHVybiAoKmJyYWNrZXRzKVtpXTsg fQogICAgaW5saW5lIGludCBOdW1CcmFja2V0cygpIHsgcmV0dXJuIChicmFja2V0cyA/IGJyYWNr ZXRzIC0+IExlbmd0aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9jYXRlQnJhY2tldHMo aW50IGVzdGltYXRlID0gMCk7CiAgICBpbmxpbmUgdm9pZCBBZGRCcmFja2V0cyhBc3RCcmFja2V0 cyAqKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsKCiAgICB2 aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKSAgeyByZXR1cm4gaWRlbnRp Zmllcl90b2tlbjsgfQogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tl bigpCiAgICB7CiAgICAgICAgcmV0dXJuIChOdW1CcmFja2V0cygpID4gMCA/ICgqYnJhY2tldHMp W051bUJyYWNrZXRzKCkgLSAxXSAtPiBSaWdodFRva2VuKCkgOiBpZGVudGlmaWVyX3Rva2VuKTsK ICAgIH0KfTsKCgogCiAKIApjbGFzcyBBc3RWYXJpYWJsZURlY2xhcmF0b3IgOiBwdWJsaWMgQXN0 CnsKcHVibGljOgogICAgVmFyaWFibGVTeW1ib2wgKnN5bWJvbDsKICAgIGJvb2wgcGVuZGluZzsg IAoKICAgIEFzdFZhcmlhYmxlRGVjbGFyYXRvcklkICp2YXJpYWJsZV9kZWNsYXJhdG9yX25hbWU7 CiAgICBBc3QgKnZhcmlhYmxlX2luaXRpYWxpemVyX29wdDsKCiAgICBBc3RWYXJpYWJsZURlY2xh cmF0b3IoKSA6IHN5bWJvbChfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cGVuZGluZyhmYWxzZSkKICAgIHsKICAgICAgICBBc3Q6OmtpbmQgPSBBc3Q6OlZBUklBQkxFX0RF Q0xBUkFUT1I7CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6Ok5PX1RBRzsKICAgICAgICBB c3Q6OmdlbmVyYXRlZCA9IDA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0VmFyaWFibGVEZWNsYXJh dG9yKCk7CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3RvcmFnZVBvb2wgKik7CgogICAg dmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2VuKCkgeyByZXR1cm4gdmFyaWFi bGVfZGVjbGFyYXRvcl9uYW1lIC0+IExlZnRUb2tlbigpOyB9CgogICAgdmlydHVhbCBMZXhTdHJl YW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpCiAgICB7CiAgICAgICAgcmV0dXJuICh2YXJpYWJs ZV9pbml0aWFsaXplcl9vcHQgPwogICAgICAgICAgICAgICAgdmFyaWFibGVfaW5pdGlhbGl6ZXJf b3B0IC0+IFJpZ2h0VG9rZW4oKSA6CiAgICAgICAgICAgICAgICB2YXJpYWJsZV9kZWNsYXJhdG9y X25hbWUgLT4gUmlnaHRUb2tlbigpKTsKICAgIH0KfTsKCgogCiAKIAogCiAKY2xhc3MgQXN0Rmll bGREZWNsYXJhdGlvbiA6IHB1YmxpYyBBc3QKewogICAgU3RvcmFnZVBvb2wgKnBvb2w7CiAgICBB c3RBcnJheTxBc3RNb2RpZmllciAqPiAqdmFyaWFibGVfbW9kaWZpZXJzOwogICAgQXN0QXJyYXk8 QXN0VmFyaWFibGVEZWNsYXJhdG9yICo+ICp2YXJpYWJsZV9kZWNsYXJhdG9yczsKCnB1YmxpYzoK CiAgICBBc3QgKnR5cGU7CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggc2VtaWNvbG9uX3Rva2Vu OwoKICAgIEFzdEZpZWxkRGVjbGFyYXRpb24oU3RvcmFnZVBvb2wgKnBvb2xfKSA6IHBvb2wocG9v bF8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFi bGVfbW9kaWZpZXJzKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdmFyaWFibGVfZGVjbGFyYXRvcnMoX19udWxsICkKICAgIHsKICAgICAgICBB c3Q6OmtpbmQgPSBBc3Q6OkZJRUxEOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpOT19U QUc7CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwogICAgfQoKICAgIHZpcnR1YWwgfkFzdEZp ZWxkRGVjbGFyYXRpb24oKTsKCiAgICBpbmxpbmUgdm9pZCBNYXJrU3RhdGljKCkgeyBBc3Q6OmNs YXNzX3RhZyA9IEFzdDo6U1RBVElDX0ZJRUxEOyB9CgogICAgaW5saW5lIEFzdE1vZGlmaWVyICom VmFyaWFibGVNb2RpZmllcihpbnQgaSkgeyByZXR1cm4gKCp2YXJpYWJsZV9tb2RpZmllcnMpW2ld OyB9CiAgICBpbmxpbmUgaW50IE51bVZhcmlhYmxlTW9kaWZpZXJzKCkgeyByZXR1cm4gKHZhcmlh YmxlX21vZGlmaWVycyA/IHZhcmlhYmxlX21vZGlmaWVycyAtPiBMZW5ndGgoKSA6IDApOyB9CiAg ICBpbmxpbmUgdm9pZCBBbGxvY2F0ZVZhcmlhYmxlTW9kaWZpZXJzKGludCBlc3RpbWF0ZSA9IDAp OwogICAgaW5saW5lIHZvaWQgQWRkVmFyaWFibGVNb2RpZmllcihBc3RNb2RpZmllciAqKTsKCiAg ICBpbmxpbmUgQXN0VmFyaWFibGVEZWNsYXJhdG9yIComVmFyaWFibGVEZWNsYXJhdG9yKGludCBp KSB7IHJldHVybiAoKnZhcmlhYmxlX2RlY2xhcmF0b3JzKVtpXTsgfQogICAgaW5saW5lIGludCBO dW1WYXJpYWJsZURlY2xhcmF0b3JzKCkgeyByZXR1cm4gKHZhcmlhYmxlX2RlY2xhcmF0b3JzID8g dmFyaWFibGVfZGVjbGFyYXRvcnMgLT4gTGVuZ3RoKCkgOiAwKTsgfQogICAgaW5saW5lIHZvaWQg QWxsb2NhdGVWYXJpYWJsZURlY2xhcmF0b3JzKGludCBlc3RpbWF0ZSA9IDApOwogICAgaW5saW5l IHZvaWQgQWRkVmFyaWFibGVEZWNsYXJhdG9yKEFzdFZhcmlhYmxlRGVjbGFyYXRvciAqKTsKCgoK CgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsKCiAgICB2aXJ0dWFsIExl eFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKQogICAgewogICAgICAgIHJldHVybiAoTnVt VmFyaWFibGVNb2RpZmllcnMoKSA+IDAgPyAoKnZhcmlhYmxlX21vZGlmaWVycylbMF0gLT4gTGVm dFRva2VuKCkgOiB0eXBlIC0+IExlZnRUb2tlbigpKTsKICAgIH0KCiAgICB2aXJ0dWFsIExleFN0 cmVhbTo6VG9rZW5JbmRleCBSaWdodFRva2VuKCkgeyByZXR1cm4gc2VtaWNvbG9uX3Rva2VuOyB9 Cn07CgoKIAogCiAKY2xhc3MgQXN0Rm9ybWFsUGFyYW1ldGVyIDogcHVibGljIEFzdAp7CiAgICBT dG9yYWdlUG9vbCAqcG9vbDsKICAgIEFzdEFycmF5PEFzdE1vZGlmaWVyICo+ICpwYXJhbWV0ZXJf bW9kaWZpZXJzOwoKcHVibGljOgoKICAgIEFzdCAqdHlwZTsKICAgIEFzdFZhcmlhYmxlRGVjbGFy YXRvciAqZm9ybWFsX2RlY2xhcmF0b3I7CgogICAgQXN0Rm9ybWFsUGFyYW1ldGVyKFN0b3JhZ2VQ b29sICpwb29sXykgOiBwb29sKHBvb2xfKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGFyYW1ldGVyX21vZGlmaWVycyhfX251bGwgKQogICAgewogICAgICAg IEFzdDo6a2luZCA9IEFzdDo6UEFSQU1FVEVSOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0 OjpOT19UQUc7CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwogICAgfQoKICAgIHZpcnR1YWwg fkFzdEZvcm1hbFBhcmFtZXRlcigpOwoKICAgIGlubGluZSBBc3RNb2RpZmllciAqJlBhcmFtZXRl ck1vZGlmaWVyKGludCBpKSB7IHJldHVybiAoKnBhcmFtZXRlcl9tb2RpZmllcnMpW2ldOyB9CiAg ICBpbmxpbmUgaW50IE51bVBhcmFtZXRlck1vZGlmaWVycygpIHsgcmV0dXJuIChwYXJhbWV0ZXJf bW9kaWZpZXJzID8gcGFyYW1ldGVyX21vZGlmaWVycyAtPiBMZW5ndGgoKSA6IDApOyB9CiAgICBp bmxpbmUgdm9pZCBBbGxvY2F0ZVBhcmFtZXRlck1vZGlmaWVycyhpbnQgZXN0aW1hdGUgPSAwKTsK ICAgIGlubGluZSB2b2lkIEFkZFBhcmFtZXRlck1vZGlmaWVyKEFzdE1vZGlmaWVyICopOwoKCgoK CgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4 U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpCiAgICB7CiAgICAgICByZXR1cm4gKE51bVBh cmFtZXRlck1vZGlmaWVycygpID4gMCA/ICgqcGFyYW1ldGVyX21vZGlmaWVycylbMF0gLT4gTGVm dFRva2VuKCkgOiB0eXBlIC0+IExlZnRUb2tlbigpKTsKICAgIH0KICAgIHZpcnR1YWwgTGV4U3Ry ZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiBmb3JtYWxfZGVjbGFyYXRvciAt PiBSaWdodFRva2VuKCk7IH0KfTsKCgogCiAKIApjbGFzcyBBc3RNZXRob2REZWNsYXJhdG9yIDog cHVibGljIEFzdAp7CnByaXZhdGU6CgogICAgU3RvcmFnZVBvb2wgKnBvb2w7CiAgICBBc3RBcnJh eTxBc3RCcmFja2V0cyAqPiAqYnJhY2tldHM7CiAgICBBc3RBcnJheTxBc3RGb3JtYWxQYXJhbWV0 ZXIgKj4gKmZvcm1hbF9wYXJhbWV0ZXJzOwoKcHVibGljOgogICAgTGV4U3RyZWFtOjpUb2tlbklu ZGV4IGlkZW50aWZpZXJfdG9rZW47CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggbGVmdF9wYXJl bnRoZXNpc190b2tlbjsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCByaWdodF9wYXJlbnRoZXNp c190b2tlbjsKCiAgICBBc3RNZXRob2REZWNsYXJhdG9yKFN0b3JhZ2VQb29sICpwb29sXykgOiBw b29sKHBvb2xfKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGJyYWNrZXRzKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZm9ybWFsX3BhcmFtZXRlcnMoX19udWxsICkKICAgIHsKICAgICAgICBBc3Q6Omtp bmQgPSBBc3Q6Ok1FVEhPRF9ERUNMQVJBVE9SOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0 OjpOT19UQUc7CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwogICAgfQoKICAgIHZpcnR1YWwg fkFzdE1ldGhvZERlY2xhcmF0b3IoKTsKCiAgICBpbmxpbmUgQXN0QnJhY2tldHMgKiZCcmFja2V0 cyhpbnQgaSkgeyByZXR1cm4gKCpicmFja2V0cylbaV07IH0KICAgIGlubGluZSBpbnQgTnVtQnJh Y2tldHMoKSB7IHJldHVybiAoYnJhY2tldHMgPyBicmFja2V0cyAtPiBMZW5ndGgoKSA6IDApOyB9 CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZUJyYWNrZXRzKGludCBlc3RpbWF0ZSA9IDApOwogICAg aW5saW5lIHZvaWQgQWRkQnJhY2tldHMoQXN0QnJhY2tldHMgKik7CgogICAgaW5saW5lIEFzdEZv cm1hbFBhcmFtZXRlciAqJkZvcm1hbFBhcmFtZXRlcihpbnQgaSkgeyByZXR1cm4gKCpmb3JtYWxf cGFyYW1ldGVycylbaV07IH0KICAgIGlubGluZSBpbnQgTnVtRm9ybWFsUGFyYW1ldGVycygpIHsg cmV0dXJuIChmb3JtYWxfcGFyYW1ldGVycyA/IGZvcm1hbF9wYXJhbWV0ZXJzIC0+IExlbmd0aCgp IDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9jYXRlRm9ybWFsUGFyYW1ldGVycyhpbnQgZXN0 aW1hdGUgPSAwKTsKICAgIGlubGluZSB2b2lkIEFkZEZvcm1hbFBhcmFtZXRlcihBc3RGb3JtYWxQ YXJhbWV0ZXIgKik7CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3RvcmFnZVBvb2wgKik7 CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2VuKCkgeyByZXR1cm4g aWRlbnRpZmllcl90b2tlbjsgfQoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IFJp Z2h0VG9rZW4oKQogICAgewogICAgICAgIHJldHVybiAoTnVtQnJhY2tldHMoKSA/IEJyYWNrZXRz KE51bUJyYWNrZXRzKCkgLSAxKSAtPiBSaWdodFRva2VuKCkgOiByaWdodF9wYXJlbnRoZXNpc190 b2tlbik7CiAgICB9Cn07CgoKIAogCiAKIAogCiAKIAogCiAKIApjbGFzcyBBc3RNZXRob2REZWNs YXJhdGlvbiA6IHB1YmxpYyBBc3QKewogICAgU3RvcmFnZVBvb2wgKnBvb2w7CiAgICBBc3RBcnJh eTxBc3RNb2RpZmllciAqPiAqbWV0aG9kX21vZGlmaWVyczsKICAgIEFzdEFycmF5PEFzdEV4cHJl c3Npb24gKj4gKnRocm93czsKCnB1YmxpYzoKICAgIE1ldGhvZFN5bWJvbCAqbWV0aG9kX3N5bWJv bDsKCiAgICBBc3QgKnR5cGU7CiAgICBBc3RNZXRob2REZWNsYXJhdG9yICptZXRob2RfZGVjbGFy YXRvcjsKICAgIEFzdFN0YXRlbWVudCAqbWV0aG9kX2JvZHk7CgogICAgQXN0TWV0aG9kRGVjbGFy YXRpb24oU3RvcmFnZVBvb2wgKnBvb2xfKSA6IHBvb2wocG9vbF8pLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9tb2RpZmllcnMoX19udWxsICks CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzKF9f bnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1l dGhvZF9zeW1ib2woX19udWxsICkKICAgIHsKICAgICAgICBBc3Q6OmtpbmQgPSBBc3Q6Ok1FVEhP RDsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFzdDo6Tk9fVEFHOwogICAgICAgIEFzdDo6Z2Vu ZXJhdGVkID0gMDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RNZXRob2REZWNsYXJhdGlvbigpOwoK ICAgIGJvb2wgSXNWYWxpZCgpIHsgcmV0dXJuIG1ldGhvZF9zeW1ib2wgIT0gX19udWxsIDsgfQoK ICAgIGJvb2wgSXNTaWduYXR1cmUoKSB7IHJldHVybiAobWV0aG9kX2JvZHkgLT4gRW1wdHlTdGF0 ZW1lbnRDYXN0KCkgIT0gX19udWxsICk7IH0KCiAgICBpbmxpbmUgQXN0TW9kaWZpZXIgKiZNZXRo b2RNb2RpZmllcihpbnQgaSkgeyByZXR1cm4gKCptZXRob2RfbW9kaWZpZXJzKVtpXTsgfQogICAg aW5saW5lIGludCBOdW1NZXRob2RNb2RpZmllcnMoKSB7IHJldHVybiAobWV0aG9kX21vZGlmaWVy cyA/IG1ldGhvZF9tb2RpZmllcnMgLT4gTGVuZ3RoKCkgOiAwKTsgfQogICAgaW5saW5lIHZvaWQg QWxsb2NhdGVNZXRob2RNb2RpZmllcnMoaW50IGVzdGltYXRlID0gMCk7CiAgICBpbmxpbmUgdm9p ZCBBZGRNZXRob2RNb2RpZmllcihBc3RNb2RpZmllciAqKTsKCiAgICBpbmxpbmUgQXN0RXhwcmVz c2lvbiAqJlRocm93KGludCBpKSB7IHJldHVybiAoKnRocm93cylbaV07IH0KICAgIGlubGluZSBp bnQgTnVtVGhyb3dzKCkgeyByZXR1cm4gKHRocm93cyA/IHRocm93cyAtPiBMZW5ndGgoKSA6IDAp OyB9CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZVRocm93cyhpbnQgZXN0aW1hdGUgPSAwKTsKICAg IGlubGluZSB2b2lkIEFkZFRocm93KEFzdEV4cHJlc3Npb24gKik7CgoKCgoKCiAgICB2aXJ0dWFs IEFzdCAqQ2xvbmUoU3RvcmFnZVBvb2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2Vu SW5kZXggTGVmdFRva2VuKCkKICAgIHsKICAgICAgICByZXR1cm4gKE51bU1ldGhvZE1vZGlmaWVy cygpID4gMCA/ICgqbWV0aG9kX21vZGlmaWVycylbMF0gLT4gTGVmdFRva2VuKCkgOiB0eXBlIC0+ IExlZnRUb2tlbigpKTsKICAgIH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IFJp Z2h0VG9rZW4oKSB7IHJldHVybiBtZXRob2RfYm9keSAtPiBSaWdodFRva2VuKCk7IH0KfTsKCiAK IAogCmNsYXNzIEFzdFN0YXRpY0luaXRpYWxpemVyIDogcHVibGljIEFzdAp7CnB1YmxpYzoKICAg IExleFN0cmVhbTo6VG9rZW5JbmRleCBzdGF0aWNfdG9rZW47CiAgICBBc3RCbG9jayAqYmxvY2s7 CgogICAgQXN0U3RhdGljSW5pdGlhbGl6ZXIoKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFz dDo6U1RBVElDX0lOSVRJQUxJWkVSOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpOT19U QUc7CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwogICAgfQoKICAgIHZpcnR1YWwgfkFzdFN0 YXRpY0luaXRpYWxpemVyKCk7CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3RvcmFnZVBv b2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2VuKCkgeyBy ZXR1cm4gc3RhdGljX3Rva2VuOyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBS aWdodFRva2VuKCkgeyByZXR1cm4gYmxvY2sgLT4gUmlnaHRUb2tlbigpOyB9Cn07CgoKIAogCiAK IAogCmNsYXNzIEFzdFRoaXNDYWxsIDogcHVibGljIEFzdFN0YXRlbWVudAp7CnByaXZhdGU6Cgog ICAgQXN0QXJyYXk8QXN0RXhwcmVzc2lvbiAqPiAqYXJndW1lbnRzOwogICAgQXN0QXJyYXk8QXN0 RXhwcmVzc2lvbiAqPiAqbG9jYWxfYXJndW1lbnRzX29wdDsgIAoKcHVibGljOgogICAgTWV0aG9k U3ltYm9sICpzeW1ib2w7CgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHRoaXNfdG9rZW47CiAg ICBMZXhTdHJlYW06OlRva2VuSW5kZXggbGVmdF9wYXJlbnRoZXNpc190b2tlbjsKICAgIExleFN0 cmVhbTo6VG9rZW5JbmRleCByaWdodF9wYXJlbnRoZXNpc190b2tlbjsKICAgIExleFN0cmVhbTo6 VG9rZW5JbmRleCBzZW1pY29sb25fdG9rZW47CgogICAgQXN0VGhpc0NhbGwoU3RvcmFnZVBvb2wg KnBvb2xfKSA6IGFyZ3VtZW50cyhfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBsb2NhbF9hcmd1bWVudHNfb3B0KF9fbnVsbCApLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbChfX251bGwgKQogICAgewogICAgICAgIEFzdDo6 a2luZCA9IEFzdDo6VEhJU19DQUxMOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpTVEFU RU1FTlQ7CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwogICAgICAgIEFzdFN0YXRlbWVudDo6 cG9vbCA9IHBvb2xfOwogICAgICAgIEFzdFN0YXRlbWVudDo6aXNfcmVhY2hhYmxlID0gZmFsc2U7 CiAgICAgICAgQXN0U3RhdGVtZW50OjpjYW5fY29tcGxldGVfbm9ybWFsbHkgPSBmYWxzZTsKICAg ICAgICBBc3RTdGF0ZW1lbnQ6OmRlZmluZWRfdmFyaWFibGVzID0gX19udWxsIDsKICAgIH0KCiAg ICB2aXJ0dWFsIH5Bc3RUaGlzQ2FsbCgpOwoKICAgIGlubGluZSBBc3RFeHByZXNzaW9uIComQXJn dW1lbnQoaW50IGkpIHsgcmV0dXJuICgqYXJndW1lbnRzKVtpXTsgfQogICAgaW5saW5lIGludCBO dW1Bcmd1bWVudHMoKSB7IHJldHVybiAoYXJndW1lbnRzID8gYXJndW1lbnRzIC0+IExlbmd0aCgp IDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9jYXRlQXJndW1lbnRzKGludCBlc3RpbWF0ZSA9 IDApOwogICAgaW5saW5lIHZvaWQgQWRkQXJndW1lbnQoQXN0RXhwcmVzc2lvbiAqKTsKCiAgICBp bmxpbmUgQXN0RXhwcmVzc2lvbiAqJkxvY2FsQXJndW1lbnQoaW50IGkpIHsgcmV0dXJuICgqbG9j YWxfYXJndW1lbnRzX29wdClbaV07IH0KICAgIGlubGluZSBpbnQgTnVtTG9jYWxBcmd1bWVudHMo KSB7IHJldHVybiAobG9jYWxfYXJndW1lbnRzX29wdCA/IGxvY2FsX2FyZ3VtZW50c19vcHQgLT4g TGVuZ3RoKCkgOiAwKTsgfQogICAgaW5saW5lIHZvaWQgQWxsb2NhdGVMb2NhbEFyZ3VtZW50cyhp bnQgZXN0aW1hdGUgPSAwKTsKICAgIGlubGluZSB2b2lkIEFkZExvY2FsQXJndW1lbnQoQXN0RXhw cmVzc2lvbiAqKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsK CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKSB7IHJldHVybiB0 aGlzX3Rva2VuOyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdodFRva2Vu KCkgeyByZXR1cm4gc2VtaWNvbG9uX3Rva2VuOyB9Cn07CgoKIAogCiAKIApjbGFzcyBBc3RTdXBl ckNhbGwgOiBwdWJsaWMgQXN0U3RhdGVtZW50CnsKcHJpdmF0ZToKCiAgICBBc3RBcnJheTxBc3RF eHByZXNzaW9uICo+ICphcmd1bWVudHM7CiAgICBBc3RBcnJheTxBc3RFeHByZXNzaW9uICo+ICps b2NhbF9hcmd1bWVudHNfb3B0OyAgCgogICAgYm9vbCBhZGRfbnVsbF9hcmd1bWVudDsKCnB1Ymxp YzoKICAgIE1ldGhvZFN5bWJvbCAqc3ltYm9sOwoKICAgIEFzdEV4cHJlc3Npb24gKmJhc2Vfb3B0 OwogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGRvdF90b2tlbl9vcHQ7CiAgICBMZXhTdHJlYW06 OlRva2VuSW5kZXggc3VwZXJfdG9rZW47CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggbGVmdF9w YXJlbnRoZXNpc190b2tlbjsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCByaWdodF9wYXJlbnRo ZXNpc190b2tlbjsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBzZW1pY29sb25fdG9rZW47Cgog ICAgQXN0U3VwZXJDYWxsKFN0b3JhZ2VQb29sICpwb29sXykgOiBhcmd1bWVudHMoX19udWxsICks CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2FyZ3VtZW50c19v cHQoX19udWxsICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9u dWxsX2FyZ3VtZW50KGZhbHNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc3ltYm9sKF9fbnVsbCApCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0OjpTVVBFUl9D QUxMOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpTVEFURU1FTlQ7CiAgICAgICAgQXN0 OjpnZW5lcmF0ZWQgPSAwOwogICAgICAgIEFzdFN0YXRlbWVudDo6cG9vbCA9IHBvb2xfOwogICAg ICAgIEFzdFN0YXRlbWVudDo6aXNfcmVhY2hhYmxlID0gZmFsc2U7CiAgICAgICAgQXN0U3RhdGVt ZW50OjpjYW5fY29tcGxldGVfbm9ybWFsbHkgPSBmYWxzZTsKICAgICAgICBBc3RTdGF0ZW1lbnQ6 OmRlZmluZWRfdmFyaWFibGVzID0gX19udWxsIDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RTdXBl ckNhbGwoKTsKCiAgICBpbmxpbmUgQXN0RXhwcmVzc2lvbiAqJkFyZ3VtZW50KGludCBpKSB7IHJl dHVybiAoKmFyZ3VtZW50cylbaV07IH0KICAgIGlubGluZSBpbnQgTnVtQXJndW1lbnRzKCkgeyBy ZXR1cm4gKGFyZ3VtZW50cyA/IGFyZ3VtZW50cyAtPiBMZW5ndGgoKSA6IDApOyB9CiAgICBpbmxp bmUgdm9pZCBBbGxvY2F0ZUFyZ3VtZW50cyhpbnQgZXN0aW1hdGUgPSAwKTsKICAgIGlubGluZSB2 b2lkIEFkZEFyZ3VtZW50KEFzdEV4cHJlc3Npb24gKik7CgogICAgaW5saW5lIEFzdEV4cHJlc3Np b24gKiZMb2NhbEFyZ3VtZW50KGludCBpKSB7IHJldHVybiAoKmxvY2FsX2FyZ3VtZW50c19vcHQp W2ldOyB9CiAgICBpbmxpbmUgaW50IE51bUxvY2FsQXJndW1lbnRzKCkgeyByZXR1cm4gKGxvY2Fs X2FyZ3VtZW50c19vcHQgPyBsb2NhbF9hcmd1bWVudHNfb3B0IC0+IExlbmd0aCgpIDogMCk7IH0K ICAgIGlubGluZSB2b2lkIEFsbG9jYXRlTG9jYWxBcmd1bWVudHMoaW50IGVzdGltYXRlID0gMCk7 CiAgICBpbmxpbmUgdm9pZCBBZGRMb2NhbEFyZ3VtZW50KEFzdEV4cHJlc3Npb24gKik7CgogICAg aW5saW5lIHZvaWQgQWRkTnVsbEFyZ3VtZW50KCkgeyBhZGRfbnVsbF9hcmd1bWVudCA9IHRydWU7 IH0KICAgIGlubGluZSBib29sIE5lZWRzRXh0cmFOdWxsQXJndW1lbnQoKSB7IHJldHVybiBhZGRf bnVsbF9hcmd1bWVudDsgfQoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29s ICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpIHsgcmV0 dXJuIChiYXNlX29wdCA/IGJhc2Vfb3B0IC0+IExlZnRUb2tlbigpIDogc3VwZXJfdG9rZW4pOyB9 CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdodFRva2VuKCkgeyByZXR1cm4g c2VtaWNvbG9uX3Rva2VuOyB9Cn07CgoKIAogCiAKIAogCiAKIAogCiAKIAogCmNsYXNzIEFzdENv bnN0cnVjdG9yQmxvY2sgOiBwdWJsaWMgQXN0U3RhdGVtZW50CnsKcHJpdmF0ZToKCiAgICBBc3RB cnJheTxBc3RTdGF0ZW1lbnQgKj4gKmxvY2FsX2luaXRfc3RhdGVtZW50czsKCnB1YmxpYzoKICAg IEJsb2NrU3ltYm9sICpibG9ja19zeW1ib2w7CgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGxl ZnRfYnJhY2VfdG9rZW47CiAgICBBc3QgKmV4cGxpY2l0X2NvbnN0cnVjdG9yX2ludm9jYXRpb25f b3B0OwogICAgQXN0QmxvY2sgKmJsb2NrOwogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHJpZ2h0 X2JyYWNlX3Rva2VuOwoKICAgIEFzdEV4cHJlc3Npb25TdGF0ZW1lbnQgKm9yaWdpbmFsX2NvbnN0 cnVjdG9yX2ludm9jYXRpb247CgogICAgQXN0Q29uc3RydWN0b3JCbG9jayhTdG9yYWdlUG9vbCAq cG9vbF8pIDogbG9jYWxfaW5pdF9zdGF0ZW1lbnRzKF9fbnVsbCApLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc3ltYm9sKF9fbnVsbCApLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxfY29uc3Ry dWN0b3JfaW52b2NhdGlvbihfX251bGwgKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6 Q09OU1RSVUNUT1JfQkxPQ0s7CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6OlNUQVRFTUVO VDsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICAgICAgQXN0U3RhdGVtZW50Ojpwb29s ID0gcG9vbF87CiAgICAgICAgQXN0U3RhdGVtZW50Ojppc19yZWFjaGFibGUgPSBmYWxzZTsKICAg ICAgICBBc3RTdGF0ZW1lbnQ6OmNhbl9jb21wbGV0ZV9ub3JtYWxseSA9IGZhbHNlOwogICAgICAg IEFzdFN0YXRlbWVudDo6ZGVmaW5lZF92YXJpYWJsZXMgPSBfX251bGwgOwogICAgfQoKICAgIHZp cnR1YWwgfkFzdENvbnN0cnVjdG9yQmxvY2soKTsKCiAgICBpbmxpbmUgQXN0U3RhdGVtZW50ICom TG9jYWxJbml0U3RhdGVtZW50KGludCBpKSB7IHJldHVybiAoKmxvY2FsX2luaXRfc3RhdGVtZW50 cylbaV07IH0KICAgIGlubGluZSBpbnQgTnVtTG9jYWxJbml0U3RhdGVtZW50cygpIHsgcmV0dXJu IChsb2NhbF9pbml0X3N0YXRlbWVudHMgPyBsb2NhbF9pbml0X3N0YXRlbWVudHMgLT4gTGVuZ3Ro KCkgOiAwKTsgfQogICAgaW5saW5lIHZvaWQgQWxsb2NhdGVMb2NhbEluaXRTdGF0ZW1lbnRzKGlu dCBlc3RpbWF0ZSA9IDApOwogICAgaW5saW5lIHZvaWQgQWRkTG9jYWxJbml0U3RhdGVtZW50KEFz dFN0YXRlbWVudCAqKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9vbCAq KTsKCiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKSAgeyByZXR1 cm4gbGVmdF9icmFjZV90b2tlbjsgIH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4 IFJpZ2h0VG9rZW4oKSB7IHJldHVybiByaWdodF9icmFjZV90b2tlbjsgfQp9OwoKCmNsYXNzIEFz dENvbnN0cnVjdG9yRGVjbGFyYXRpb24gOiBwdWJsaWMgQXN0CnsKICAgIFN0b3JhZ2VQb29sICpw b29sOwogICAgQXN0QXJyYXk8QXN0TW9kaWZpZXIgKj4gKmNvbnN0cnVjdG9yX21vZGlmaWVyczsK ICAgIEFzdEFycmF5PEFzdEV4cHJlc3Npb24gKj4gKnRocm93czsKCnB1YmxpYzoKICAgIE1ldGhv ZFN5bWJvbCAqY29uc3RydWN0b3Jfc3ltYm9sOwogICAgaW50IGluZGV4OwoKICAgIEFzdE1ldGhv ZERlY2xhcmF0b3IgKmNvbnN0cnVjdG9yX2RlY2xhcmF0b3I7CiAgICBBc3RDb25zdHJ1Y3RvckJs b2NrICpjb25zdHJ1Y3Rvcl9ib2R5OwoKICAgIEFzdENvbnN0cnVjdG9yRGVjbGFyYXRpb24oU3Rv cmFnZVBvb2wgKnBvb2xfKSA6IHBvb2wocG9vbF8pLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3JfbW9kaWZpZXJzKF9fbnVsbCAp LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhy b3dzKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3RydWN0b3Jfc3ltYm9sKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgoQ3ljbGVDaGVja2VyOjpPTUVH QSkKICAgIHsKICAgICAgICBBc3Q6OmtpbmQgPSBBc3Q6OkNPTlNUUlVDVE9SOwogICAgICAgIEFz dDo6Y2xhc3NfdGFnID0gQXN0OjpOT19UQUc7CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwog ICAgfQoKICAgIHZpcnR1YWwgfkFzdENvbnN0cnVjdG9yRGVjbGFyYXRpb24oKTsKCiAgICBib29s IElzVmFsaWQoKSB7IHJldHVybiBjb25zdHJ1Y3Rvcl9zeW1ib2wgIT0gX19udWxsIDsgfQoKICAg IGlubGluZSBBc3RNb2RpZmllciAqJkNvbnN0cnVjdG9yTW9kaWZpZXIoaW50IGkpIHsgcmV0dXJu ICgqY29uc3RydWN0b3JfbW9kaWZpZXJzKVtpXTsgfQogICAgaW5saW5lIGludCBOdW1Db25zdHJ1 Y3Rvck1vZGlmaWVycygpIHsgcmV0dXJuIChjb25zdHJ1Y3Rvcl9tb2RpZmllcnMgPyBjb25zdHJ1 Y3Rvcl9tb2RpZmllcnMgLT4gTGVuZ3RoKCkgOiAwKTsgfQogICAgaW5saW5lIHZvaWQgQWxsb2Nh dGVDb25zdHJ1Y3Rvck1vZGlmaWVycyhpbnQgZXN0aW1hdGUgPSAwKTsKICAgIGlubGluZSB2b2lk IEFkZENvbnN0cnVjdG9yTW9kaWZpZXIoQXN0TW9kaWZpZXIgKik7CgogICAgaW5saW5lIEFzdEV4 cHJlc3Npb24gKiZUaHJvdyhpbnQgaSkgeyByZXR1cm4gKCp0aHJvd3MpW2ldOyB9CiAgICBpbmxp bmUgaW50IE51bVRocm93cygpIHsgcmV0dXJuICh0aHJvd3MgPyB0aHJvd3MgLT4gTGVuZ3RoKCkg OiAwKTsgfQogICAgaW5saW5lIHZvaWQgQWxsb2NhdGVUaHJvd3MoaW50IGVzdGltYXRlID0gMCk7 CiAgICBpbmxpbmUgdm9pZCBBZGRUaHJvdyhBc3RFeHByZXNzaW9uICopOwoKCgoKCgogICAgdmly dHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpU b2tlbkluZGV4IExlZnRUb2tlbigpCiAgICB7CiAgICAgICAgcmV0dXJuIChOdW1Db25zdHJ1Y3Rv ck1vZGlmaWVycygpID4gMCA/ICgqY29uc3RydWN0b3JfbW9kaWZpZXJzKVswXSAtPiBMZWZ0VG9r ZW4oKSA6IGNvbnN0cnVjdG9yX2RlY2xhcmF0b3IgLT4gTGVmdFRva2VuKCkpOwogICAgfQogICAg dmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpIHsgcmV0dXJuIGNvbnN0 cnVjdG9yX2JvZHkgLT4gUmlnaHRUb2tlbigpOyB9Cn07CgoKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKIAogCiAKIAogCmNsYXNzIEFzdEludGVyZmFjZURlY2xhcmF0aW9uIDogcHVibGlj IEFzdAp7CnByaXZhdGU6CiAgICBmcmllbmQgY2xhc3MgUGFyc2VyOwoKICAgIFN0b3JhZ2VQb29s ICpwb29sOwogICAgQXN0QXJyYXk8QXN0TW9kaWZpZXIgKj4gKmludGVyZmFjZV9tb2RpZmllcnM7 CiAgICBBc3RBcnJheTxBc3RFeHByZXNzaW9uICo+ICpleHRlbmRzX2ludGVyZmFjZXM7CiAgICBB c3RBcnJheTxBc3QgKj4gKmludGVyZmFjZV9tZW1iZXJfZGVjbGFyYXRpb25zOwoKICAgIEFzdEFy cmF5PEFzdEZpZWxkRGVjbGFyYXRpb24gKj4gKmNsYXNzX3ZhcmlhYmxlczsKICAgIEFzdEFycmF5 PEFzdE1ldGhvZERlY2xhcmF0aW9uICo+ICptZXRob2RzOwogICAgQXN0QXJyYXk8QXN0Q2xhc3NE ZWNsYXJhdGlvbiAqPiAqaW5uZXJfY2xhc3NlczsKICAgIEFzdEFycmF5PEFzdEludGVyZmFjZURl Y2xhcmF0aW9uICo+ICppbm5lcl9pbnRlcmZhY2VzOwogICAgQXN0QXJyYXk8QXN0RW1wdHlEZWNs YXJhdGlvbiAqPiAqZW1wdHlfZGVjbGFyYXRpb25zOwoKcHVibGljOgoKICAgIFNlbWFudGljRW52 aXJvbm1lbnQgKnNlbWFudGljX2Vudmlyb25tZW50OwoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRl eCBpbnRlcmZhY2VfdG9rZW47CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggaWRlbnRpZmllcl90 b2tlbjsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBsZWZ0X2JyYWNlX3Rva2VuOwogICAgTGV4 U3RyZWFtOjpUb2tlbkluZGV4IHJpZ2h0X2JyYWNlX3Rva2VuOwoKICAgIGlubGluZSB2b2lkIG1h cmtfdW5wYXJzZWQoKSB7IEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpVTlBBUlNFRDsgfQogICAgaW5s aW5lIHZvaWQgbWFya19wYXJzZWQoKSAgIHsgQXN0OjpjbGFzc190YWcgPSBBc3Q6Ok5PX1RBRzsg fQoKICAgIEFzdEludGVyZmFjZURlY2xhcmF0aW9uKFN0b3JhZ2VQb29sICpwb29sXykgOiBwb29s KHBvb2xfKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBpbnRlcmZhY2VfbW9kaWZpZXJzKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZHNfaW50ZXJmYWNlcyhfX251bGwgKSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vf bWVtYmVyX2RlY2xhcmF0aW9ucyhfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBjbGFzc192YXJpYWJsZXMoX19udWxsICksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcyhfX251bGwg KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5l cl9jbGFzc2VzKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGlubmVyX2ludGVyZmFjZXMoX19udWxsICksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlfZGVjbGFyYXRpb25zKF9fbnVs bCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNl bWFudGljX2Vudmlyb25tZW50KF9fbnVsbCApCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0 OjpJTlRFUkZBQ0U7CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6Ok5PX1RBRzsKICAgICAg ICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0SW50ZXJmYWNlRGVj bGFyYXRpb24oKTsKCiAgICBib29sIElzVmFsaWQoKSB7IHJldHVybiBzZW1hbnRpY19lbnZpcm9u bWVudCAhPSBfX251bGwgOyB9CgogICAgaW5saW5lIEFzdE1vZGlmaWVyIComSW50ZXJmYWNlTW9k aWZpZXIoaW50IGkpIHsgcmV0dXJuICgqaW50ZXJmYWNlX21vZGlmaWVycylbaV07IH0KICAgIGlu bGluZSBpbnQgTnVtSW50ZXJmYWNlTW9kaWZpZXJzKCkgeyByZXR1cm4gKGludGVyZmFjZV9tb2Rp ZmllcnMgPyBpbnRlcmZhY2VfbW9kaWZpZXJzIC0+IExlbmd0aCgpIDogMCk7IH0KICAgIGlubGlu ZSB2b2lkIEFsbG9jYXRlSW50ZXJmYWNlTW9kaWZpZXJzKGludCBlc3RpbWF0ZSA9IDApOwogICAg aW5saW5lIHZvaWQgQWRkSW50ZXJmYWNlTW9kaWZpZXIoQXN0TW9kaWZpZXIgKik7CgogICAgaW5s aW5lIEFzdEV4cHJlc3Npb24gKiZFeHRlbmRzSW50ZXJmYWNlKGludCBpKSB7IHJldHVybiAoKmV4 dGVuZHNfaW50ZXJmYWNlcylbaV07IH0KICAgIGlubGluZSBpbnQgTnVtRXh0ZW5kc0ludGVyZmFj ZXMoKSB7IHJldHVybiAoZXh0ZW5kc19pbnRlcmZhY2VzID8gZXh0ZW5kc19pbnRlcmZhY2VzIC0+ IExlbmd0aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9jYXRlRXh0ZW5kc0ludGVyZmFj ZXMoaW50IGVzdGltYXRlID0gMCk7CiAgICBpbmxpbmUgdm9pZCBBZGRFeHRlbmRzSW50ZXJmYWNl KEFzdEV4cHJlc3Npb24gKik7CgogICAgaW5saW5lIEFzdCAqJkludGVyZmFjZU1lbWJlckRlY2xh cmF0aW9uKGludCBpKSB7IHJldHVybiAoKmludGVyZmFjZV9tZW1iZXJfZGVjbGFyYXRpb25zKVtp XTsgfQogICAgaW5saW5lIGludCBOdW1JbnRlcmZhY2VNZW1iZXJEZWNsYXJhdGlvbnMoKQogICAg ICAgICAgICAgICB7IHJldHVybiAoaW50ZXJmYWNlX21lbWJlcl9kZWNsYXJhdGlvbnMgPyBpbnRl cmZhY2VfbWVtYmVyX2RlY2xhcmF0aW9ucyAtPiBMZW5ndGgoKSA6IDApOyB9CiAgICBpbmxpbmUg dm9pZCBBbGxvY2F0ZUludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9ucyhpbnQgZXN0aW1hdGUgPSAw KTsKICAgIGlubGluZSB2b2lkIEFkZEludGVyZmFjZU1lbWJlckRlY2xhcmF0aW9uKEFzdCAqKTsK CiAgICBpbmxpbmUgQXN0RmllbGREZWNsYXJhdGlvbiAqJkNsYXNzVmFyaWFibGUoaW50IGkpIHsg cmV0dXJuICgqY2xhc3NfdmFyaWFibGVzKVtpXTsgfQogICAgaW5saW5lIGludCBOdW1DbGFzc1Zh cmlhYmxlcygpIHsgcmV0dXJuIChjbGFzc192YXJpYWJsZXMgPyBjbGFzc192YXJpYWJsZXMgLT4g TGVuZ3RoKCkgOiAwKTsgfQogICAgaW5saW5lIHZvaWQgQWxsb2NhdGVDbGFzc1ZhcmlhYmxlcyhp bnQgZXN0aW1hdGUgPSAwKTsKICAgIGlubGluZSB2b2lkIEFkZENsYXNzVmFyaWFibGUoQXN0Rmll bGREZWNsYXJhdGlvbiAqKTsKCiAgICBpbmxpbmUgQXN0TWV0aG9kRGVjbGFyYXRpb24gKiZNZXRo b2QoaW50IGkpIHsgcmV0dXJuICgqbWV0aG9kcylbaV07IH0KICAgIGlubGluZSBpbnQgTnVtTWV0 aG9kcygpIHsgcmV0dXJuIChtZXRob2RzID8gbWV0aG9kcyAtPiBMZW5ndGgoKSA6IDApOyB9CiAg ICBpbmxpbmUgdm9pZCBBbGxvY2F0ZU1ldGhvZHMoaW50IGVzdGltYXRlID0gMCk7CiAgICBpbmxp bmUgdm9pZCBBZGRNZXRob2QoQXN0TWV0aG9kRGVjbGFyYXRpb24gKik7CgogICAgaW5saW5lIEFz dENsYXNzRGVjbGFyYXRpb24gKiZOZXN0ZWRDbGFzcyhpbnQgaSkgeyByZXR1cm4gKCppbm5lcl9j bGFzc2VzKVtpXTsgfQogICAgaW5saW5lIGludCBOdW1OZXN0ZWRDbGFzc2VzKCkgeyByZXR1cm4g KGlubmVyX2NsYXNzZXMgPyBpbm5lcl9jbGFzc2VzIC0+IExlbmd0aCgpIDogMCk7IH0KICAgIGlu bGluZSB2b2lkIEFsbG9jYXRlTmVzdGVkQ2xhc3NlcyhpbnQgZXN0aW1hdGUgPSAwKTsKICAgIGlu bGluZSB2b2lkIEFkZE5lc3RlZENsYXNzKEFzdENsYXNzRGVjbGFyYXRpb24gKik7CgogICAgaW5s aW5lIEFzdEludGVyZmFjZURlY2xhcmF0aW9uIComTmVzdGVkSW50ZXJmYWNlKGludCBpKSB7IHJl dHVybiAoKmlubmVyX2ludGVyZmFjZXMpW2ldOyB9CiAgICBpbmxpbmUgaW50IE51bU5lc3RlZElu dGVyZmFjZXMoKSB7IHJldHVybiAoaW5uZXJfaW50ZXJmYWNlcyA/IGlubmVyX2ludGVyZmFjZXMg LT4gTGVuZ3RoKCkgOiAwKTsgfQogICAgaW5saW5lIHZvaWQgQWxsb2NhdGVOZXN0ZWRJbnRlcmZh Y2VzKGludCBlc3RpbWF0ZSA9IDApOwogICAgaW5saW5lIHZvaWQgQWRkTmVzdGVkSW50ZXJmYWNl KEFzdEludGVyZmFjZURlY2xhcmF0aW9uICopOwoKICAgIGlubGluZSBBc3RFbXB0eURlY2xhcmF0 aW9uIComRW1wdHlEZWNsYXJhdGlvbihpbnQgaSkgeyByZXR1cm4gKCplbXB0eV9kZWNsYXJhdGlv bnMpW2ldOyB9CiAgICBpbmxpbmUgaW50IE51bUVtcHR5RGVjbGFyYXRpb25zKCkgeyByZXR1cm4g KGVtcHR5X2RlY2xhcmF0aW9ucyA/IGVtcHR5X2RlY2xhcmF0aW9ucyAtPiBMZW5ndGgoKSA6IDAp OyB9CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZUVtcHR5RGVjbGFyYXRpb25zKGludCBlc3RpbWF0 ZSA9IDApOwogICAgaW5saW5lIHZvaWQgQWRkRW1wdHlEZWNsYXJhdGlvbihBc3RFbXB0eURlY2xh cmF0aW9uICopOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoK ICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpCiAgICB7CiAgICAg ICAgcmV0dXJuIChOdW1JbnRlcmZhY2VNb2RpZmllcnMoKSA+IDAgPyAoKmludGVyZmFjZV9tb2Rp ZmllcnMpWzBdIC0+IExlZnRUb2tlbigpIDogaW50ZXJmYWNlX3Rva2VuKTsKICAgIH0KICAgIHZp cnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiByaWdodF9i cmFjZV90b2tlbjsgfQp9OwoKCiAKIAogCmNsYXNzIEFzdExvY2FsVmFyaWFibGVEZWNsYXJhdGlv blN0YXRlbWVudCA6IHB1YmxpYyBBc3RTdGF0ZW1lbnQKewogICAgQXN0QXJyYXk8QXN0TW9kaWZp ZXIgKj4gKmxvY2FsX21vZGlmaWVyczsKICAgIEFzdEFycmF5PEFzdFZhcmlhYmxlRGVjbGFyYXRv ciAqPiAqdmFyaWFibGVfZGVjbGFyYXRvcnM7CgpwdWJsaWM6CiAgICBBc3QgKnR5cGU7CiAgICBM ZXhTdHJlYW06OlRva2VuSW5kZXggc2VtaWNvbG9uX3Rva2VuX29wdDsKCiAgICBBc3RMb2NhbFZh cmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoU3RvcmFnZVBvb2wgKnBvb2xfKSA6IGxvY2FsX21v ZGlmaWVycyhfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVfZGVjbGFyYXRvcnMoX19udWxsICkKICAg IHsKICAgICAgICBBc3Q6OmtpbmQgPSBBc3Q6OkxPQ0FMX1ZBUklBQkxFX0RFQ0xBUkFUSU9OOwog ICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpTVEFURU1FTlQ7CiAgICAgICAgQXN0OjpnZW5l cmF0ZWQgPSAwOwogICAgICAgIEFzdFN0YXRlbWVudDo6cG9vbCA9IHBvb2xfOwogICAgICAgIEFz dFN0YXRlbWVudDo6aXNfcmVhY2hhYmxlID0gZmFsc2U7CiAgICAgICAgQXN0U3RhdGVtZW50Ojpj YW5fY29tcGxldGVfbm9ybWFsbHkgPSBmYWxzZTsKICAgICAgICBBc3RTdGF0ZW1lbnQ6OmRlZmlu ZWRfdmFyaWFibGVzID0gX19udWxsIDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RMb2NhbFZhcmlh YmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQoKTsKCiAgICBpbmxpbmUgQXN0TW9kaWZpZXIgKiZMb2Nh bE1vZGlmaWVyKGludCBpKSB7IHJldHVybiAoKmxvY2FsX21vZGlmaWVycylbaV07IH0KICAgIGlu bGluZSBpbnQgTnVtTG9jYWxNb2RpZmllcnMoKSB7IHJldHVybiAobG9jYWxfbW9kaWZpZXJzID8g bG9jYWxfbW9kaWZpZXJzIC0+IExlbmd0aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9j YXRlTG9jYWxNb2RpZmllcnMoaW50IGVzdGltYXRlID0gMCk7CiAgICBpbmxpbmUgdm9pZCBBZGRM b2NhbE1vZGlmaWVyKEFzdE1vZGlmaWVyICopOwoKICAgIGlubGluZSBBc3RWYXJpYWJsZURlY2xh cmF0b3IgKiZWYXJpYWJsZURlY2xhcmF0b3IoaW50IGkpIHsgcmV0dXJuICgqdmFyaWFibGVfZGVj bGFyYXRvcnMpW2ldOyB9CiAgICBpbmxpbmUgaW50IE51bVZhcmlhYmxlRGVjbGFyYXRvcnMoKSB7 IHJldHVybiAodmFyaWFibGVfZGVjbGFyYXRvcnMgPyB2YXJpYWJsZV9kZWNsYXJhdG9ycyAtPiBM ZW5ndGgoKSA6IDApOyB9CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZVZhcmlhYmxlRGVjbGFyYXRv cnMoaW50IGVzdGltYXRlID0gMCk7CiAgICBpbmxpbmUgdm9pZCBBZGRWYXJpYWJsZURlY2xhcmF0 b3IoQXN0VmFyaWFibGVEZWNsYXJhdG9yICopOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25l KFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRU b2tlbigpCiAgICB7CiAgICAgICAgcmV0dXJuIChOdW1Mb2NhbE1vZGlmaWVycygpID4gMCA/ICgq bG9jYWxfbW9kaWZpZXJzKVswXSAtPiBMZWZ0VG9rZW4oKSA6IHR5cGUgLT4gTGVmdFRva2VuKCkp OwogICAgfQogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpCiAg ICB7CiAgICAgICAgcmV0dXJuIChzZW1pY29sb25fdG9rZW5fb3B0ID8gc2VtaWNvbG9uX3Rva2Vu X29wdCA6IFZhcmlhYmxlRGVjbGFyYXRvcihOdW1WYXJpYWJsZURlY2xhcmF0b3JzKCkgLSAxKSAt PiBSaWdodFRva2VuKCkpOwogICAgfQp9OwoKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCiAKY2xhc3MgQXN0SWZTdGF0ZW1lbnQgOiBwdWJsaWMgQXN0U3RhdGVt ZW50CnsKcHVibGljOgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGlmX3Rva2VuOwogICAgQXN0 RXhwcmVzc2lvbiAqZXhwcmVzc2lvbjsKICAgIEFzdFN0YXRlbWVudCAqdHJ1ZV9zdGF0ZW1lbnQ7 CiAgICBBc3RTdGF0ZW1lbnQgKmZhbHNlX3N0YXRlbWVudF9vcHQ7CgogICAgQXN0SWZTdGF0ZW1l bnQoU3RvcmFnZVBvb2wgKnBvb2xfKSA6IGV4cHJlc3Npb24oX19udWxsICkKICAgIHsKICAgICAg ICBBc3Q6OmtpbmQgPSBBc3Q6OklGOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpTVEFU RU1FTlQ7CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwogICAgICAgIEFzdFN0YXRlbWVudDo6 cG9vbCA9IHBvb2xfOwogICAgICAgIEFzdFN0YXRlbWVudDo6aXNfcmVhY2hhYmxlID0gZmFsc2U7 CiAgICAgICAgQXN0U3RhdGVtZW50OjpjYW5fY29tcGxldGVfbm9ybWFsbHkgPSBmYWxzZTsKICAg ICAgICBBc3RTdGF0ZW1lbnQ6OmRlZmluZWRfdmFyaWFibGVzID0gX19udWxsIDsKICAgIH0KCiAg ICB2aXJ0dWFsIH5Bc3RJZlN0YXRlbWVudCgpOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25l KFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRU b2tlbigpCiAgICB7CiAgICAgICAgcmV0dXJuIGlmX3Rva2VuOwogICAgfQogICAgdmlydHVhbCBM ZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpCiAgICB7CiAgICAgICAgcmV0dXJuIChm YWxzZV9zdGF0ZW1lbnRfb3B0ID8gZmFsc2Vfc3RhdGVtZW50X29wdCAtPiBSaWdodFRva2VuKCkK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0cnVlX3N0YXRlbWVudCAtPiBS aWdodFRva2VuKCkpOwogICAgfQp9OwoKCiAKIAogCmNsYXNzIEFzdEVtcHR5U3RhdGVtZW50IDog cHVibGljIEFzdFN0YXRlbWVudAp7CnB1YmxpYzoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBz ZW1pY29sb25fdG9rZW47CgogICAgQXN0RW1wdHlTdGF0ZW1lbnQoU3RvcmFnZVBvb2wgKnBvb2xf LCBMZXhTdHJlYW06OlRva2VuSW5kZXggdG9rZW5fKSA6IHNlbWljb2xvbl90b2tlbih0b2tlbl8p CiAgICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0OjpFTVBUWV9TVEFURU1FTlQ7CiAgICAgICAg QXN0OjpjbGFzc190YWcgPSBBc3Q6OlNUQVRFTUVOVDsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9 IDA7CiAgICAgICAgQXN0U3RhdGVtZW50Ojpwb29sID0gcG9vbF87CiAgICAgICAgQXN0U3RhdGVt ZW50Ojppc19yZWFjaGFibGUgPSBmYWxzZTsKICAgICAgICBBc3RTdGF0ZW1lbnQ6OmNhbl9jb21w bGV0ZV9ub3JtYWxseSA9IGZhbHNlOwogICAgICAgIEFzdFN0YXRlbWVudDo6ZGVmaW5lZF92YXJp YWJsZXMgPSBfX251bGwgOwogICAgfQoKICAgIHZpcnR1YWwgfkFzdEVtcHR5U3RhdGVtZW50KCk7 CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3RvcmFnZVBvb2wgKik7CgogICAgdmlydHVh bCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2VuKCkKICAgIHsKICAgICAgICByZXR1cm4g c2VtaWNvbG9uX3Rva2VuOwogICAgfQogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXgg UmlnaHRUb2tlbigpIHsgcmV0dXJuIHNlbWljb2xvbl90b2tlbjsgfQp9OwoKCiAKIAogCmNsYXNz IEFzdEV4cHJlc3Npb25TdGF0ZW1lbnQgOiBwdWJsaWMgQXN0U3RhdGVtZW50CnsKcHVibGljOgog ICAgQXN0RXhwcmVzc2lvbiAqZXhwcmVzc2lvbjsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBz ZW1pY29sb25fdG9rZW5fb3B0OwoKICAgIEFzdEV4cHJlc3Npb25TdGF0ZW1lbnQoU3RvcmFnZVBv b2wgKnBvb2xfKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6RVhQUkVTU0lPTl9TVEFU RU1FTlQ7CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6OlNUQVRFTUVOVDsKICAgICAgICBB c3Q6OmdlbmVyYXRlZCA9IDA7CiAgICAgICAgQXN0U3RhdGVtZW50Ojpwb29sID0gcG9vbF87CiAg ICAgICAgQXN0U3RhdGVtZW50Ojppc19yZWFjaGFibGUgPSBmYWxzZTsKICAgICAgICBBc3RTdGF0 ZW1lbnQ6OmNhbl9jb21wbGV0ZV9ub3JtYWxseSA9IGZhbHNlOwogICAgICAgIEFzdFN0YXRlbWVu dDo6ZGVmaW5lZF92YXJpYWJsZXMgPSBfX251bGwgOwogICAgfQoKICAgIHZpcnR1YWwgfkFzdEV4 cHJlc3Npb25TdGF0ZW1lbnQoKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdl UG9vbCAqKTsKCiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKQog ICAgewogICAgICAgIHJldHVybiBleHByZXNzaW9uIC0+IExlZnRUb2tlbigpOwogICAgfQogICAg dmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpCiAgICB7CiAgICAgICAg cmV0dXJuIChzZW1pY29sb25fdG9rZW5fb3B0ID8gc2VtaWNvbG9uX3Rva2VuX29wdCA6IGV4cHJl c3Npb24gLT4gUmlnaHRUb2tlbigpKTsKICAgIH0KfTsKCgogCiAKIAogCiAKIApjbGFzcyBBc3RD YXNlTGFiZWwgOiBwdWJsaWMgQXN0CnsKcHVibGljOgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4 IGNhc2VfdG9rZW47CiAgICBBc3RFeHByZXNzaW9uICpleHByZXNzaW9uOwogICAgTGV4U3RyZWFt OjpUb2tlbkluZGV4IGNvbG9uX3Rva2VuOwogICAgaW50IG1hcF9pbmRleDsKCiAgICBBc3RDYXNl TGFiZWwoKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6Q0FTRTsKICAgICAgICBBc3Q6 OmNsYXNzX3RhZyA9IEFzdDo6Tk9fVEFHOwogICAgICAgIEFzdDo6Z2VuZXJhdGVkID0gMDsKICAg IH0KCiAgICB2aXJ0dWFsIH5Bc3RDYXNlTGFiZWwoKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpD bG9uZShTdG9yYWdlUG9vbCAqKTsKCiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBM ZWZ0VG9rZW4oKSB7IHJldHVybiBjYXNlX3Rva2VuOyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6 VG9rZW5JbmRleCBSaWdodFRva2VuKCkgeyByZXR1cm4gY29sb25fdG9rZW47IH0KfTsKCgogCiAK IApjbGFzcyBBc3REZWZhdWx0TGFiZWwgOiBwdWJsaWMgQXN0CnsKcHVibGljOgogICAgTGV4U3Ry ZWFtOjpUb2tlbkluZGV4IGRlZmF1bHRfdG9rZW47CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXgg Y29sb25fdG9rZW47CgogICAgQXN0RGVmYXVsdExhYmVsKCkKICAgIHsKICAgICAgICBBc3Q6Omtp bmQgPSBBc3Q6OkRFRkFVTFQ7CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6Ok5PX1RBRzsK ICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0RGVmYXVs dExhYmVsKCk7CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3RvcmFnZVBvb2wgKik7Cgog ICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2VuKCkgeyByZXR1cm4gZGVm YXVsdF90b2tlbjsgfQogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tl bigpIHsgcmV0dXJuIGNvbG9uX3Rva2VuOyB9Cn07CgoKIAogCiAKY2xhc3MgQXN0U3dpdGNoQmxv Y2tTdGF0ZW1lbnQgOiBwdWJsaWMgQXN0CnsKcHJpdmF0ZToKICAgIFN0b3JhZ2VQb29sICpwb29s OwoKICAgIEFzdEFycmF5PEFzdFN0YXRlbWVudCAqPiAqYmxvY2tfc3RhdGVtZW50czsKICAgIEFz dEFycmF5PEFzdCAqPiAqc3dpdGNoX2xhYmVsczsKICAgIFZhcmlhYmxlU3ltYm9sQXJyYXkgKmxv Y2FsbHlfZGVmaW5lZF92YXJpYWJsZXM7CgogICAgZnJpZW5kIGNsYXNzIEFzdEJsb2NrOwoKcHVi bGljOgogICAgQXN0U3dpdGNoQmxvY2tTdGF0ZW1lbnQoU3RvcmFnZVBvb2wgKnBvb2xfKSA6IHBv b2wocG9vbF8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGJsb2NrX3N0YXRlbWVudHMoX19udWxsICksCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoX2xhYmVscyhfX251bGwgKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGx5X2RlZmluZWRf dmFyaWFibGVzKF9fbnVsbCApCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0OjpTV0lUQ0hf QkxPQ0s7CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6Ok5PX1RBRzsKICAgICAgICBBc3Q6 OmdlbmVyYXRlZCA9IDA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0U3dpdGNoQmxvY2tTdGF0ZW1l bnQoKTsKCiAgICBpbmxpbmUgQXN0U3RhdGVtZW50IComU3RhdGVtZW50KGludCBpKSB7IHJldHVy biAoKmJsb2NrX3N0YXRlbWVudHMpW2ldOyB9CiAgICBpbmxpbmUgaW50IE51bVN0YXRlbWVudHMo KSB7IHJldHVybiAoYmxvY2tfc3RhdGVtZW50cyA/IGJsb2NrX3N0YXRlbWVudHMgLT4gTGVuZ3Ro KCkgOiAwKTsgfQogICAgaW5saW5lIHZvaWQgQWxsb2NhdGVCbG9ja1N0YXRlbWVudHMoaW50IGVz dGltYXRlID0gMCk7CiAgICBpbmxpbmUgdm9pZCBBZGRTdGF0ZW1lbnQoQXN0U3RhdGVtZW50ICop OwoKICAgIGlubGluZSBBc3QgKiZTd2l0Y2hMYWJlbChpbnQgaSkgeyByZXR1cm4gKCpzd2l0Y2hf bGFiZWxzKVtpXTsgfQogICAgaW5saW5lIGludCBOdW1Td2l0Y2hMYWJlbHMoKSB7IHJldHVybiAo c3dpdGNoX2xhYmVscyA/IHN3aXRjaF9sYWJlbHMgLT4gTGVuZ3RoKCkgOiAwKTsgfQogICAgaW5s aW5lIHZvaWQgQWxsb2NhdGVTd2l0Y2hMYWJlbHMoaW50IGVzdGltYXRlID0gMCk7CiAgICBpbmxp bmUgdm9pZCBBZGRTd2l0Y2hMYWJlbChBc3QgKik7CgogICAgaW5saW5lIFZhcmlhYmxlU3ltYm9s IComTG9jYWxseURlZmluZWRWYXJpYWJsZShpbnQgaSkgeyByZXR1cm4gKCpsb2NhbGx5X2RlZmlu ZWRfdmFyaWFibGVzKVtpXTsgfQogICAgaW5saW5lIGludCBOdW1Mb2NhbGx5RGVmaW5lZFZhcmlh YmxlcygpIHsgcmV0dXJuIChsb2NhbGx5X2RlZmluZWRfdmFyaWFibGVzID8gbG9jYWxseV9kZWZp bmVkX3ZhcmlhYmxlcyAtPiBMZW5ndGgoKSA6IDApOyB9CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAq Q2xvbmUoU3RvcmFnZVBvb2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXgg TGVmdFRva2VuKCkKICAgIHsKICAgICAgICByZXR1cm4gU3dpdGNoTGFiZWwoMCkgLT4gTGVmdFRv a2VuKCk7CiAgICB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdodFRva2Vu KCkKICAgIHsKICAgICAgICByZXR1cm4gU3RhdGVtZW50KE51bVN0YXRlbWVudHMoKSAtIDEpIC0+ IFJpZ2h0VG9rZW4oKTsKICAgIH0KfTsKCgpjbGFzcyBDYXNlRWxlbWVudAp7CnB1YmxpYzoKICAg IEFzdFN3aXRjaEJsb2NrU3RhdGVtZW50ICpzd2l0Y2hfYmxvY2tfc3RhdGVtZW50OwogICAgQXN0 RXhwcmVzc2lvbiAqZXhwcmVzc2lvbjsKICAgIGludCBpbmRleDsKCiAgICBpbnQgVmFsdWUoKSB7 IHJldHVybiAoKEludExpdGVyYWxWYWx1ZSAqKSAoZXhwcmVzc2lvbiAtPiB2YWx1ZSkpIC0+IHZh bHVlOyB9Cn07CgogCiAKIApjbGFzcyBBc3RTd2l0Y2hTdGF0ZW1lbnQgOiBwdWJsaWMgQXN0U3Rh dGVtZW50CnsKICAgIEFzdEFycmF5PENhc2VFbGVtZW50ICo+ICpjYXNlczsKCnB1YmxpYzoKICAg IENhc2VFbGVtZW50IGRlZmF1bHRfY2FzZTsKCiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggc3dp dGNoX3Rva2VuOwogICAgQXN0RXhwcmVzc2lvbiAqZXhwcmVzc2lvbjsKICAgIEFzdEJsb2NrICpz d2l0Y2hfYmxvY2s7CgogICAgQXN0U3dpdGNoU3RhdGVtZW50KFN0b3JhZ2VQb29sICpwb29sXykg OiBjYXNlcyhfX251bGwgKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6U1dJVENIOwog ICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpTVEFURU1FTlQ7CiAgICAgICAgQXN0OjpnZW5l cmF0ZWQgPSAwOwogICAgICAgIEFzdFN0YXRlbWVudDo6cG9vbCA9IHBvb2xfOwogICAgICAgIEFz dFN0YXRlbWVudDo6aXNfcmVhY2hhYmxlID0gZmFsc2U7CiAgICAgICAgQXN0U3RhdGVtZW50Ojpj YW5fY29tcGxldGVfbm9ybWFsbHkgPSBmYWxzZTsKICAgICAgICBBc3RTdGF0ZW1lbnQ6OmRlZmlu ZWRfdmFyaWFibGVzID0gX19udWxsIDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RTd2l0Y2hTdGF0 ZW1lbnQoKTsKCiAgICBpbmxpbmUgQ2FzZUVsZW1lbnQgKiZDYXNlKGludCBpKSB7IHJldHVybiAo KmNhc2VzKVtpXTsgfQogICAgaW5saW5lIGludCBOdW1DYXNlcygpIHsgcmV0dXJuIChjYXNlcyA/ IGNhc2VzIC0+IExlbmd0aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9jYXRlQ2FzZXMo aW50IGVzdGltYXRlID0gMCk7CiAgICBpbmxpbmUgdm9pZCBBZGRDYXNlKENhc2VFbGVtZW50ICop OwoKICAgIHZvaWQgU29ydENhc2VzKCk7CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3Rv cmFnZVBvb2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2Vu KCkKICAgIHsKICAgICAgICByZXR1cm4gc3dpdGNoX3Rva2VuOwogICAgfQogICAgdmlydHVhbCBM ZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpIHsgcmV0dXJuIHN3aXRjaF9ibG9jayAt PiBSaWdodFRva2VuKCk7IH0KfTsKCgogCiAKIApjbGFzcyBBc3RXaGlsZVN0YXRlbWVudCA6IHB1 YmxpYyBBc3RTdGF0ZW1lbnQKewpwdWJsaWM6CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggd2hp bGVfdG9rZW47CiAgICBBc3RFeHByZXNzaW9uICpleHByZXNzaW9uOwogICAgQXN0U3RhdGVtZW50 ICpzdGF0ZW1lbnQ7CgogICAgQXN0V2hpbGVTdGF0ZW1lbnQoU3RvcmFnZVBvb2wgKnBvb2xfKQog ICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6V0hJTEU7CiAgICAgICAgQXN0OjpjbGFzc190 YWcgPSBBc3Q6OlNUQVRFTUVOVDsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICAgICAg QXN0U3RhdGVtZW50Ojpwb29sID0gcG9vbF87CiAgICAgICAgQXN0U3RhdGVtZW50Ojppc19yZWFj aGFibGUgPSBmYWxzZTsKICAgICAgICBBc3RTdGF0ZW1lbnQ6OmNhbl9jb21wbGV0ZV9ub3JtYWxs eSA9IGZhbHNlOwogICAgICAgIEFzdFN0YXRlbWVudDo6ZGVmaW5lZF92YXJpYWJsZXMgPSBfX251 bGwgOwogICAgfQoKICAgIHZpcnR1YWwgfkFzdFdoaWxlU3RhdGVtZW50KCk7CgoKCgoKCiAgICB2 aXJ0dWFsIEFzdCAqQ2xvbmUoU3RvcmFnZVBvb2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06 OlRva2VuSW5kZXggTGVmdFRva2VuKCkKICAgIHsKICAgICAgICByZXR1cm4gd2hpbGVfdG9rZW47 CiAgICB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdodFRva2VuKCkgeyBy ZXR1cm4gc3RhdGVtZW50IC0+IFJpZ2h0VG9rZW4oKTsgfQp9OwoKCiAKIAogCmNsYXNzIEFzdERv U3RhdGVtZW50IDogcHVibGljIEFzdFN0YXRlbWVudAp7CnB1YmxpYzoKICAgIExleFN0cmVhbTo6 VG9rZW5JbmRleCBkb190b2tlbjsKICAgIEFzdFN0YXRlbWVudCAqc3RhdGVtZW50OwogICAgTGV4 U3RyZWFtOjpUb2tlbkluZGV4IHdoaWxlX3Rva2VuOwogICAgQXN0RXhwcmVzc2lvbiAqZXhwcmVz c2lvbjsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBzZW1pY29sb25fdG9rZW47CgogICAgQXN0 RG9TdGF0ZW1lbnQoU3RvcmFnZVBvb2wgKnBvb2xfKQogICAgewogICAgICAgIEFzdDo6a2luZCA9 IEFzdDo6RE87CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6OlNUQVRFTUVOVDsKICAgICAg ICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICAgICAgQXN0U3RhdGVtZW50Ojpwb29sID0gcG9vbF87 CiAgICAgICAgQXN0U3RhdGVtZW50Ojppc19yZWFjaGFibGUgPSBmYWxzZTsKICAgICAgICBBc3RT dGF0ZW1lbnQ6OmNhbl9jb21wbGV0ZV9ub3JtYWxseSA9IGZhbHNlOwogICAgICAgIEFzdFN0YXRl bWVudDo6ZGVmaW5lZF92YXJpYWJsZXMgPSBfX251bGwgOwogICAgfQoKICAgIHZpcnR1YWwgfkFz dERvU3RhdGVtZW50KCk7CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3RvcmFnZVBvb2wg Kik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2VuKCkKICAgIHsK ICAgICAgICByZXR1cm4gZG9fdG9rZW47CiAgICB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9r ZW5JbmRleCBSaWdodFRva2VuKCkgeyByZXR1cm4gc2VtaWNvbG9uX3Rva2VuOyB9Cn07CgoKIAog CiAKIAogCiAKIAogCmNsYXNzIEFzdEZvclN0YXRlbWVudCA6IHB1YmxpYyBBc3RTdGF0ZW1lbnQK ewpwcml2YXRlOgoKICAgIEFzdEFycmF5PEFzdFN0YXRlbWVudCAqPiAqZm9yX2luaXRfc3RhdGVt ZW50czsKICAgIEFzdEFycmF5PEFzdEV4cHJlc3Npb25TdGF0ZW1lbnQgKj4gKmZvcl91cGRhdGVf c3RhdGVtZW50czsKCnB1YmxpYzoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBmb3JfdG9rZW47 CiAgICBBc3RFeHByZXNzaW9uICplbmRfZXhwcmVzc2lvbl9vcHQ7CiAgICBBc3RTdGF0ZW1lbnQg KnN0YXRlbWVudDsKCiAgICBBc3RGb3JTdGF0ZW1lbnQoU3RvcmFnZVBvb2wgKnBvb2xfKSA6IGZv cl9pbml0X3N0YXRlbWVudHMoX19udWxsICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGZvcl91cGRhdGVfc3RhdGVtZW50cyhfX251bGwgKQogICAgewogICAgICAg IEFzdDo6a2luZCA9IEFzdDo6Rk9SOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpTVEFU RU1FTlQ7CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwogICAgICAgIEFzdFN0YXRlbWVudDo6 cG9vbCA9IHBvb2xfOwogICAgICAgIEFzdFN0YXRlbWVudDo6aXNfcmVhY2hhYmxlID0gZmFsc2U7 CiAgICAgICAgQXN0U3RhdGVtZW50OjpjYW5fY29tcGxldGVfbm9ybWFsbHkgPSBmYWxzZTsKICAg ICAgICBBc3RTdGF0ZW1lbnQ6OmRlZmluZWRfdmFyaWFibGVzID0gX19udWxsIDsKICAgIH0KCiAg ICB2aXJ0dWFsIH5Bc3RGb3JTdGF0ZW1lbnQoKTsKCiAgICBpbmxpbmUgQXN0U3RhdGVtZW50ICom Rm9ySW5pdFN0YXRlbWVudChpbnQgaSkgeyByZXR1cm4gKCpmb3JfaW5pdF9zdGF0ZW1lbnRzKVtp XTsgfQogICAgaW5saW5lIGludCBOdW1Gb3JJbml0U3RhdGVtZW50cygpIHsgcmV0dXJuIChmb3Jf aW5pdF9zdGF0ZW1lbnRzID8gZm9yX2luaXRfc3RhdGVtZW50cyAtPiBMZW5ndGgoKSA6IDApOyB9 CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZUZvckluaXRTdGF0ZW1lbnRzKGludCBlc3RpbWF0ZSA9 IDApOwogICAgaW5saW5lIHZvaWQgQWRkRm9ySW5pdFN0YXRlbWVudChBc3RTdGF0ZW1lbnQgKik7 CgogICAgaW5saW5lIEFzdEV4cHJlc3Npb25TdGF0ZW1lbnQgKiZGb3JVcGRhdGVTdGF0ZW1lbnQo aW50IGkpIHsgcmV0dXJuICgqZm9yX3VwZGF0ZV9zdGF0ZW1lbnRzKVtpXTsgfQogICAgaW5saW5l IGludCBOdW1Gb3JVcGRhdGVTdGF0ZW1lbnRzKCkgeyByZXR1cm4gKGZvcl91cGRhdGVfc3RhdGVt ZW50cyA/IGZvcl91cGRhdGVfc3RhdGVtZW50cyAtPiBMZW5ndGgoKSA6IDApOyB9CiAgICBpbmxp bmUgdm9pZCBBbGxvY2F0ZUZvclVwZGF0ZVN0YXRlbWVudHMoaW50IGVzdGltYXRlID0gMCk7CiAg ICBpbmxpbmUgdm9pZCBBZGRGb3JVcGRhdGVTdGF0ZW1lbnQoQXN0RXhwcmVzc2lvblN0YXRlbWVu dCAqKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsKCiAgICB2 aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKQogICAgewogICAgICAgIHJl dHVybiBmb3JfdG9rZW47CiAgICB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBS aWdodFRva2VuKCkgeyByZXR1cm4gc3RhdGVtZW50IC0+IFJpZ2h0VG9rZW4oKTsgfQp9OwoKCiAK IAogCmNsYXNzIEFzdEJyZWFrU3RhdGVtZW50IDogcHVibGljIEFzdFN0YXRlbWVudAp7CnB1Ymxp YzoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBicmVha190b2tlbjsKICAgIExleFN0cmVhbTo6 VG9rZW5JbmRleCBpZGVudGlmaWVyX3Rva2VuX29wdDsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRl eCBzZW1pY29sb25fdG9rZW47CiAgICBpbnQgbmVzdGluZ19sZXZlbDsKCiAgICBBc3RCcmVha1N0 YXRlbWVudChTdG9yYWdlUG9vbCAqcG9vbF8pCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0 OjpCUkVBSzsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFzdDo6U1RBVEVNRU5UOwogICAgICAg IEFzdDo6Z2VuZXJhdGVkID0gMDsKICAgICAgICBBc3RTdGF0ZW1lbnQ6OnBvb2wgPSBwb29sXzsK ICAgICAgICBBc3RTdGF0ZW1lbnQ6OmlzX3JlYWNoYWJsZSA9IGZhbHNlOwogICAgICAgIEFzdFN0 YXRlbWVudDo6Y2FuX2NvbXBsZXRlX25vcm1hbGx5ID0gZmFsc2U7CiAgICAgICAgQXN0U3RhdGVt ZW50OjpkZWZpbmVkX3ZhcmlhYmxlcyA9IF9fbnVsbCA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0 QnJlYWtTdGF0ZW1lbnQoKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9v bCAqKTsKCiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKQogICAg ewogICAgICAgIHJldHVybiBicmVha190b2tlbjsKICAgIH0KICAgIHZpcnR1YWwgTGV4U3RyZWFt OjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiBzZW1pY29sb25fdG9rZW47IH0KfTsK CiAKIAogCmNsYXNzIEFzdENvbnRpbnVlU3RhdGVtZW50IDogcHVibGljIEFzdFN0YXRlbWVudAp7 CnB1YmxpYzoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBjb250aW51ZV90b2tlbjsKICAgIExl eFN0cmVhbTo6VG9rZW5JbmRleCBpZGVudGlmaWVyX3Rva2VuX29wdDsKICAgIExleFN0cmVhbTo6 VG9rZW5JbmRleCBzZW1pY29sb25fdG9rZW47CiAgICBpbnQgbmVzdGluZ19sZXZlbDsKCiAgICBB c3RDb250aW51ZVN0YXRlbWVudChTdG9yYWdlUG9vbCAqcG9vbF8pCiAgICB7CiAgICAgICAgQXN0 OjpraW5kID0gQXN0OjpDT05USU5VRTsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFzdDo6U1RB VEVNRU5UOwogICAgICAgIEFzdDo6Z2VuZXJhdGVkID0gMDsKICAgICAgICBBc3RTdGF0ZW1lbnQ6 OnBvb2wgPSBwb29sXzsKICAgICAgICBBc3RTdGF0ZW1lbnQ6OmlzX3JlYWNoYWJsZSA9IGZhbHNl OwogICAgICAgIEFzdFN0YXRlbWVudDo6Y2FuX2NvbXBsZXRlX25vcm1hbGx5ID0gZmFsc2U7CiAg ICAgICAgQXN0U3RhdGVtZW50OjpkZWZpbmVkX3ZhcmlhYmxlcyA9IF9fbnVsbCA7CiAgICB9Cgog ICAgdmlydHVhbCB+QXN0Q29udGludWVTdGF0ZW1lbnQoKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0 ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsKCiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRl eCBMZWZ0VG9rZW4oKQogICAgewogICAgICAgIHJldHVybiBjb250aW51ZV90b2tlbjsKICAgIH0K ICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiBz ZW1pY29sb25fdG9rZW47IH0KfTsKCgogCiAKIApjbGFzcyBBc3RSZXR1cm5TdGF0ZW1lbnQgOiBw dWJsaWMgQXN0U3RhdGVtZW50CnsKcHVibGljOgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHJl dHVybl90b2tlbjsKICAgIEFzdEV4cHJlc3Npb24gKmV4cHJlc3Npb25fb3B0OwogICAgTGV4U3Ry ZWFtOjpUb2tlbkluZGV4IHNlbWljb2xvbl90b2tlbjsKCiAgICBBc3RSZXR1cm5TdGF0ZW1lbnQo U3RvcmFnZVBvb2wgKnBvb2xfKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6UkVUVVJO OwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpTVEFURU1FTlQ7CiAgICAgICAgQXN0Ojpn ZW5lcmF0ZWQgPSAwOwogICAgICAgIEFzdFN0YXRlbWVudDo6cG9vbCA9IHBvb2xfOwogICAgICAg IEFzdFN0YXRlbWVudDo6aXNfcmVhY2hhYmxlID0gZmFsc2U7CiAgICAgICAgQXN0U3RhdGVtZW50 OjpjYW5fY29tcGxldGVfbm9ybWFsbHkgPSBmYWxzZTsKICAgICAgICBBc3RTdGF0ZW1lbnQ6OmRl ZmluZWRfdmFyaWFibGVzID0gX19udWxsIDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RSZXR1cm5T dGF0ZW1lbnQoKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsK CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKQogICAgewogICAg ICAgIHJldHVybiByZXR1cm5fdG9rZW47CiAgICB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9r ZW5JbmRleCBSaWdodFRva2VuKCkgeyByZXR1cm4gc2VtaWNvbG9uX3Rva2VuOyB9Cn07CgoKIAog CiAKY2xhc3MgQXN0VGhyb3dTdGF0ZW1lbnQgOiBwdWJsaWMgQXN0U3RhdGVtZW50CnsKcHVibGlj OgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHRocm93X3Rva2VuOwogICAgQXN0RXhwcmVzc2lv biAqZXhwcmVzc2lvbjsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBzZW1pY29sb25fdG9rZW47 CgogICAgQXN0VGhyb3dTdGF0ZW1lbnQoU3RvcmFnZVBvb2wgKnBvb2xfKQogICAgewogICAgICAg IEFzdDo6a2luZCA9IEFzdDo6VEhST1c7CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6OlNU QVRFTUVOVDsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICAgICAgQXN0U3RhdGVtZW50 Ojpwb29sID0gcG9vbF87CiAgICAgICAgQXN0U3RhdGVtZW50Ojppc19yZWFjaGFibGUgPSBmYWxz ZTsKICAgICAgICBBc3RTdGF0ZW1lbnQ6OmNhbl9jb21wbGV0ZV9ub3JtYWxseSA9IGZhbHNlOwog ICAgICAgIEFzdFN0YXRlbWVudDo6ZGVmaW5lZF92YXJpYWJsZXMgPSBfX251bGwgOwogICAgfQoK ICAgIHZpcnR1YWwgfkFzdFRocm93U3RhdGVtZW50KCk7CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAq Q2xvbmUoU3RvcmFnZVBvb2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXgg TGVmdFRva2VuKCkKICAgIHsKICAgICAgICByZXR1cm4gdGhyb3dfdG9rZW47CiAgICB9CiAgICB2 aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdodFRva2VuKCkgeyByZXR1cm4gc2VtaWNv bG9uX3Rva2VuOyB9Cn07CgoKIAogCiAKY2xhc3MgQXN0U3luY2hyb25pemVkU3RhdGVtZW50IDog cHVibGljIEFzdFN0YXRlbWVudAp7CnB1YmxpYzoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBz eW5jaHJvbml6ZWRfdG9rZW47CiAgICBBc3RFeHByZXNzaW9uICpleHByZXNzaW9uOwogICAgQXN0 QmxvY2sgKmJsb2NrOwoKICAgIEFzdFN5bmNocm9uaXplZFN0YXRlbWVudChTdG9yYWdlUG9vbCAq cG9vbF8pCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0OjpTWU5DSFJPTklaRURfU1RBVEVN RU5UOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpTVEFURU1FTlQ7CiAgICAgICAgQXN0 OjpnZW5lcmF0ZWQgPSAwOwogICAgICAgIEFzdFN0YXRlbWVudDo6cG9vbCA9IHBvb2xfOwogICAg ICAgIEFzdFN0YXRlbWVudDo6aXNfcmVhY2hhYmxlID0gZmFsc2U7CiAgICAgICAgQXN0U3RhdGVt ZW50OjpjYW5fY29tcGxldGVfbm9ybWFsbHkgPSBmYWxzZTsKICAgICAgICBBc3RTdGF0ZW1lbnQ6 OmRlZmluZWRfdmFyaWFibGVzID0gX19udWxsIDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RTeW5j aHJvbml6ZWRTdGF0ZW1lbnQoKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdl UG9vbCAqKTsKCiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKQog ICAgewogICAgICAgIHJldHVybiBzeW5jaHJvbml6ZWRfdG9rZW47CiAgICB9CiAgICB2aXJ0dWFs IExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdodFRva2VuKCkgeyByZXR1cm4gYmxvY2sgLT4gUmln aHRUb2tlbigpOyB9Cn07CgoKIAogCiAKY2xhc3MgQXN0Q2F0Y2hDbGF1c2UgOiBwdWJsaWMgQXN0 CnsKcHVibGljOgogICAgVmFyaWFibGVTeW1ib2wgKnBhcmFtZXRlcl9zeW1ib2w7CgogICAgTGV4 U3RyZWFtOjpUb2tlbkluZGV4IGNhdGNoX3Rva2VuOwogICAgQXN0Rm9ybWFsUGFyYW1ldGVyICpm b3JtYWxfcGFyYW1ldGVyOwogICAgQXN0QmxvY2sgKmJsb2NrOwoKICAgIEFzdENhdGNoQ2xhdXNl KCkgOiBwYXJhbWV0ZXJfc3ltYm9sKF9fbnVsbCApCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0g QXN0OjpDQVRDSDsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFzdDo6Tk9fVEFHOwogICAgICAg IEFzdDo6Z2VuZXJhdGVkID0gMDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RDYXRjaENsYXVzZSgp OwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1 YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpIHsgcmV0dXJuIGNhdGNoX3Rva2Vu OyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdodFRva2VuKCkgeyByZXR1 cm4gYmxvY2sgLT4gUmlnaHRUb2tlbigpOyB9Cn07CgoKIAogCiAKY2xhc3MgQXN0RmluYWxseUNs YXVzZSA6IHB1YmxpYyBBc3QKewpwdWJsaWM6CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggZmlu YWxseV90b2tlbjsKICAgIEFzdEJsb2NrICpibG9jazsKCiAgICBBc3RGaW5hbGx5Q2xhdXNlKCkK ICAgIHsKICAgICAgICBBc3Q6OmtpbmQgPSBBc3Q6OkZJTkFMTFk7CiAgICAgICAgQXN0OjpjbGFz c190YWcgPSBBc3Q6Ok5PX1RBRzsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICB9Cgog ICAgdmlydHVhbCB+QXN0RmluYWxseUNsYXVzZSgpOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNs b25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExl ZnRUb2tlbigpIHsgcmV0dXJuIGZpbmFsbHlfdG9rZW47IH0KICAgIHZpcnR1YWwgTGV4U3RyZWFt OjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiBibG9jayAtPiBSaWdodFRva2VuKCk7 IH0KfTsKCgogCiAKIApjbGFzcyBBc3RUcnlTdGF0ZW1lbnQgOiBwdWJsaWMgQXN0U3RhdGVtZW50 CnsKcHJpdmF0ZToKCiAgICBBc3RBcnJheTxBc3RDYXRjaENsYXVzZSAqPiAqY2F0Y2hfY2xhdXNl czsKCnB1YmxpYzoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCB0cnlfdG9rZW47CiAgICBBc3RC bG9jayAqYmxvY2s7CiAgICBBc3RGaW5hbGx5Q2xhdXNlICpmaW5hbGx5X2NsYXVzZV9vcHQ7Cgog ICAgQXN0VHJ5U3RhdGVtZW50KFN0b3JhZ2VQb29sICpwb29sXykgOiBjYXRjaF9jbGF1c2VzKF9f bnVsbCApCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0OjpUUlk7CiAgICAgICAgQXN0Ojpj bGFzc190YWcgPSBBc3Q6OlNUQVRFTUVOVDsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAg ICAgICAgQXN0U3RhdGVtZW50Ojpwb29sID0gcG9vbF87CiAgICAgICAgQXN0U3RhdGVtZW50Ojpp c19yZWFjaGFibGUgPSBmYWxzZTsKICAgICAgICBBc3RTdGF0ZW1lbnQ6OmNhbl9jb21wbGV0ZV9u b3JtYWxseSA9IGZhbHNlOwogICAgICAgIEFzdFN0YXRlbWVudDo6ZGVmaW5lZF92YXJpYWJsZXMg PSBfX251bGwgOwogICAgfQoKICAgIHZpcnR1YWwgfkFzdFRyeVN0YXRlbWVudCgpOwoKICAgIGlu bGluZSBBc3RDYXRjaENsYXVzZSAqJkNhdGNoQ2xhdXNlKGludCBpKSB7IHJldHVybiAoKmNhdGNo X2NsYXVzZXMpW2ldOyB9CiAgICBpbmxpbmUgaW50IE51bUNhdGNoQ2xhdXNlcygpIHsgcmV0dXJu IChjYXRjaF9jbGF1c2VzID8gY2F0Y2hfY2xhdXNlcyAtPiBMZW5ndGgoKSA6IDApOyB9CiAgICBp bmxpbmUgdm9pZCBBbGxvY2F0ZUNhdGNoQ2xhdXNlcyhpbnQgZXN0aW1hdGUgPSAwKTsKICAgIGlu bGluZSB2b2lkIEFkZENhdGNoQ2xhdXNlKEFzdENhdGNoQ2xhdXNlICopOwoKCgoKCgogICAgdmly dHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpU b2tlbkluZGV4IExlZnRUb2tlbigpCiAgICB7CiAgICAgICAgcmV0dXJuIHRyeV90b2tlbjsKICAg IH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKQogICAgewog ICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgIHJldHVybiAoZmluYWxseV9jbGF1 c2Vfb3B0ID8gZmluYWxseV9jbGF1c2Vfb3B0IC0+IFJpZ2h0VG9rZW4oKSA6IENhdGNoQ2xhdXNl KE51bUNhdGNoQ2xhdXNlcygpIC0gMSkgLT4gUmlnaHRUb2tlbigpKTsKICAgIH0KfTsKCiAKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKIAog CiAKY2xhc3MgQXN0SW50ZWdlckxpdGVyYWwgOiBwdWJsaWMgQXN0RXhwcmVzc2lvbgp7CnB1Ymxp YzoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBpbnRlZ2VyX2xpdGVyYWxfdG9rZW47CgogICAg QXN0SW50ZWdlckxpdGVyYWwoTGV4U3RyZWFtOjpUb2tlbkluZGV4IHRva2VuXykgOiBpbnRlZ2Vy X2xpdGVyYWxfdG9rZW4odG9rZW5fKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6SU5U RUdFUl9MSVRFUkFMOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpFWFBSRVNTSU9OOwog ICAgICAgIEFzdDo6Z2VuZXJhdGVkID0gMDsKICAgICAgICBBc3RFeHByZXNzaW9uOjp2YWx1ZSA9 IF9fbnVsbCA7CiAgICAgICAgQXN0RXhwcmVzc2lvbjo6c3ltYm9sID0gX19udWxsIDsKICAgIH0K CiAgICB2aXJ0dWFsIH5Bc3RJbnRlZ2VyTGl0ZXJhbCgpOwoKCgoKCgogICAgdmlydHVhbCBBc3Qg KkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4 IExlZnRUb2tlbigpICB7IHJldHVybiBpbnRlZ2VyX2xpdGVyYWxfdG9rZW47IH0KICAgIHZpcnR1 YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiBpbnRlZ2VyX2xp dGVyYWxfdG9rZW47IH0KfTsKCgogCiAKIApjbGFzcyBBc3RMb25nTGl0ZXJhbCA6IHB1YmxpYyBB c3RFeHByZXNzaW9uCnsKcHVibGljOgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGxvbmdfbGl0 ZXJhbF90b2tlbjsKCiAgICBBc3RMb25nTGl0ZXJhbChMZXhTdHJlYW06OlRva2VuSW5kZXggdG9r ZW5fKSA6IGxvbmdfbGl0ZXJhbF90b2tlbih0b2tlbl8pCiAgICB7CiAgICAgICAgQXN0OjpraW5k ID0gQXN0OjpMT05HX0xJVEVSQUw7CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6OkVYUFJF U1NJT047CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwogICAgICAgIEFzdEV4cHJlc3Npb246 OnZhbHVlID0gX19udWxsIDsKICAgICAgICBBc3RFeHByZXNzaW9uOjpzeW1ib2wgPSBfX251bGwg OwogICAgfQoKICAgIHZpcnR1YWwgfkFzdExvbmdMaXRlcmFsKCk7CgoKCgoKCiAgICB2aXJ0dWFs IEFzdCAqQ2xvbmUoU3RvcmFnZVBvb2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2Vu SW5kZXggTGVmdFRva2VuKCkgIHsgcmV0dXJuIGxvbmdfbGl0ZXJhbF90b2tlbjsgfQogICAgdmly dHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpIHsgcmV0dXJuIGxvbmdfbGl0 ZXJhbF90b2tlbjsgfQp9OwoKCiAKIAogCmNsYXNzIEFzdEZsb2F0aW5nUG9pbnRMaXRlcmFsIDog cHVibGljIEFzdEV4cHJlc3Npb24KewpwdWJsaWM6CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXgg ZmxvYXRpbmdfcG9pbnRfbGl0ZXJhbF90b2tlbjsKCiAgICBBc3RGbG9hdGluZ1BvaW50TGl0ZXJh bChMZXhTdHJlYW06OlRva2VuSW5kZXggdG9rZW5fKSA6IGZsb2F0aW5nX3BvaW50X2xpdGVyYWxf dG9rZW4odG9rZW5fKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6RkxPQVRJTkdfUE9J TlRfTElURVJBTDsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFzdDo6RVhQUkVTU0lPTjsKICAg ICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICAgICAgQXN0RXhwcmVzc2lvbjo6dmFsdWUgPSBf X251bGwgOwogICAgICAgIEFzdEV4cHJlc3Npb246OnN5bWJvbCA9IF9fbnVsbCA7CiAgICB9Cgog ICAgdmlydHVhbCB+QXN0RmxvYXRpbmdQb2ludExpdGVyYWwoKTsKCgoKCgoKICAgIHZpcnR1YWwg QXN0ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsKCiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5J bmRleCBMZWZ0VG9rZW4oKSAgeyByZXR1cm4gZmxvYXRpbmdfcG9pbnRfbGl0ZXJhbF90b2tlbjsg fQogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpIHsgcmV0dXJu IGZsb2F0aW5nX3BvaW50X2xpdGVyYWxfdG9rZW47IH0KfTsKCiAKIAogCmNsYXNzIEFzdERvdWJs ZUxpdGVyYWwgOiBwdWJsaWMgQXN0RXhwcmVzc2lvbgp7CnB1YmxpYzoKICAgIExleFN0cmVhbTo6 VG9rZW5JbmRleCBkb3VibGVfbGl0ZXJhbF90b2tlbjsKCiAgICBBc3REb3VibGVMaXRlcmFsKExl eFN0cmVhbTo6VG9rZW5JbmRleCB0b2tlbl8pIDogZG91YmxlX2xpdGVyYWxfdG9rZW4odG9rZW5f KQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6RE9VQkxFX0xJVEVSQUw7CiAgICAgICAg QXN0OjpjbGFzc190YWcgPSBBc3Q6OkVYUFJFU1NJT047CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQg PSAwOwogICAgICAgIEFzdEV4cHJlc3Npb246OnZhbHVlID0gX19udWxsIDsKICAgICAgICBBc3RF eHByZXNzaW9uOjpzeW1ib2wgPSBfX251bGwgOwogICAgfQoKICAgIHZpcnR1YWwgfkFzdERvdWJs ZUxpdGVyYWwoKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsK CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKSAgeyByZXR1cm4g ZG91YmxlX2xpdGVyYWxfdG9rZW47IH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4 IFJpZ2h0VG9rZW4oKSB7IHJldHVybiBkb3VibGVfbGl0ZXJhbF90b2tlbjsgfQp9OwoKIAogCiAK Y2xhc3MgQXN0VHJ1ZUxpdGVyYWwgOiBwdWJsaWMgQXN0RXhwcmVzc2lvbgp7CnB1YmxpYzoKICAg IExleFN0cmVhbTo6VG9rZW5JbmRleCB0cnVlX2xpdGVyYWxfdG9rZW47CgogICAgQXN0VHJ1ZUxp dGVyYWwoTGV4U3RyZWFtOjpUb2tlbkluZGV4IHRva2VuXykgOiB0cnVlX2xpdGVyYWxfdG9rZW4o dG9rZW5fKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6VFJVRV9MSVRFUkFMOwogICAg ICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpFWFBSRVNTSU9OOwogICAgICAgIEFzdDo6Z2VuZXJh dGVkID0gMDsKICAgICAgICBBc3RFeHByZXNzaW9uOjp2YWx1ZSA9IF9fbnVsbCA7CiAgICAgICAg QXN0RXhwcmVzc2lvbjo6c3ltYm9sID0gX19udWxsIDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RU cnVlTGl0ZXJhbCgpOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICop OwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpICB7IHJldHVy biB0cnVlX2xpdGVyYWxfdG9rZW47IH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4 IFJpZ2h0VG9rZW4oKSB7IHJldHVybiB0cnVlX2xpdGVyYWxfdG9rZW47IH0KfTsKCiAKIAogCmNs YXNzIEFzdEZhbHNlTGl0ZXJhbCA6IHB1YmxpYyBBc3RFeHByZXNzaW9uCnsKcHVibGljOgogICAg TGV4U3RyZWFtOjpUb2tlbkluZGV4IGZhbHNlX2xpdGVyYWxfdG9rZW47CgogICAgQXN0RmFsc2VM aXRlcmFsKExleFN0cmVhbTo6VG9rZW5JbmRleCB0b2tlbl8pIDogZmFsc2VfbGl0ZXJhbF90b2tl bih0b2tlbl8pCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0OjpGQUxTRV9MSVRFUkFMOwog ICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpFWFBSRVNTSU9OOwogICAgICAgIEFzdDo6Z2Vu ZXJhdGVkID0gMDsKICAgICAgICBBc3RFeHByZXNzaW9uOjp2YWx1ZSA9IF9fbnVsbCA7CiAgICAg ICAgQXN0RXhwcmVzc2lvbjo6c3ltYm9sID0gX19udWxsIDsKICAgIH0KCiAgICB2aXJ0dWFsIH5B c3RGYWxzZUxpdGVyYWwoKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9v bCAqKTsKCiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKSAgeyBy ZXR1cm4gZmFsc2VfbGl0ZXJhbF90b2tlbjsgfQogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2Vu SW5kZXggUmlnaHRUb2tlbigpIHsgcmV0dXJuIGZhbHNlX2xpdGVyYWxfdG9rZW47IH0KfTsKCiAK IAogCmNsYXNzIEFzdFN0cmluZ0xpdGVyYWwgOiBwdWJsaWMgQXN0RXhwcmVzc2lvbgp7CnB1Ymxp YzoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBzdHJpbmdfbGl0ZXJhbF90b2tlbjsKCiAgICBB c3RTdHJpbmdMaXRlcmFsKExleFN0cmVhbTo6VG9rZW5JbmRleCB0b2tlbl8pIDogc3RyaW5nX2xp dGVyYWxfdG9rZW4odG9rZW5fKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6U1RSSU5H X0xJVEVSQUw7CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6OkVYUFJFU1NJT047CiAgICAg ICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwogICAgICAgIEFzdEV4cHJlc3Npb246OnZhbHVlID0gX19u dWxsIDsKICAgICAgICBBc3RFeHByZXNzaW9uOjpzeW1ib2wgPSBfX251bGwgOwogICAgfQoKICAg IHZpcnR1YWwgfkFzdFN0cmluZ0xpdGVyYWwoKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9u ZShTdG9yYWdlUG9vbCAqKTsKCiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0 VG9rZW4oKSAgeyByZXR1cm4gc3RyaW5nX2xpdGVyYWxfdG9rZW47IH0KICAgIHZpcnR1YWwgTGV4 U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiBzdHJpbmdfbGl0ZXJhbF90 b2tlbjsgfQp9OwoKIAogCiAKY2xhc3MgQXN0Q2hhcmFjdGVyTGl0ZXJhbCA6IHB1YmxpYyBBc3RF eHByZXNzaW9uCnsKcHVibGljOgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGNoYXJhY3Rlcl9s aXRlcmFsX3Rva2VuOwoKICAgIEFzdENoYXJhY3RlckxpdGVyYWwoTGV4U3RyZWFtOjpUb2tlbklu ZGV4IHRva2VuXykgOiBjaGFyYWN0ZXJfbGl0ZXJhbF90b2tlbih0b2tlbl8pCiAgICB7CiAgICAg ICAgQXN0OjpraW5kID0gQXN0OjpDSEFSQUNURVJfTElURVJBTDsKICAgICAgICBBc3Q6OmNsYXNz X3RhZyA9IEFzdDo6RVhQUkVTU0lPTjsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICAg ICAgQXN0RXhwcmVzc2lvbjo6dmFsdWUgPSBfX251bGwgOwogICAgICAgIEFzdEV4cHJlc3Npb246 OnN5bWJvbCA9IF9fbnVsbCA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0Q2hhcmFjdGVyTGl0ZXJh bCgpOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZp cnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpICB7IHJldHVybiBjaGFyYWN0 ZXJfbGl0ZXJhbF90b2tlbjsgfQogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmln aHRUb2tlbigpIHsgcmV0dXJuIGNoYXJhY3Rlcl9saXRlcmFsX3Rva2VuOyB9Cn07CgogCiAKIApj bGFzcyBBc3ROdWxsTGl0ZXJhbCA6IHB1YmxpYyBBc3RFeHByZXNzaW9uCnsKcHVibGljOgogICAg TGV4U3RyZWFtOjpUb2tlbkluZGV4IG51bGxfdG9rZW47CgogICAgQXN0TnVsbExpdGVyYWwoTGV4 U3RyZWFtOjpUb2tlbkluZGV4IHRva2VuXykgOiBudWxsX3Rva2VuKHRva2VuXykKICAgIHsKICAg ICAgICBBc3Q6OmtpbmQgPSBBc3Q6Ok5VTExfTElURVJBTDsKICAgICAgICBBc3Q6OmNsYXNzX3Rh ZyA9IEFzdDo6RVhQUkVTU0lPTjsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICAgICAg QXN0RXhwcmVzc2lvbjo6dmFsdWUgPSBfX251bGwgOwogICAgICAgIEFzdEV4cHJlc3Npb246OnN5 bWJvbCA9IF9fbnVsbCA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0TnVsbExpdGVyYWwoKTsKCgoK CgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsKCiAgICB2aXJ0dWFsIExl eFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKSAgeyByZXR1cm4gbnVsbF90b2tlbjsgfQog ICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigpIHsgcmV0dXJuIG51 bGxfdG9rZW47IH0KfTsKCiAKIAogCmNsYXNzIEFzdFRoaXNFeHByZXNzaW9uIDogcHVibGljIEFz dEV4cHJlc3Npb24KewpwdWJsaWM6CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggdGhpc190b2tl bjsKCiAgICBBc3RUaGlzRXhwcmVzc2lvbihMZXhTdHJlYW06OlRva2VuSW5kZXggdG9rZW5fKSA6 IHRoaXNfdG9rZW4odG9rZW5fKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6VEhJU19F WFBSRVNTSU9OOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpFWFBSRVNTSU9OOwogICAg ICAgIEFzdDo6Z2VuZXJhdGVkID0gMDsKICAgICAgICBBc3RFeHByZXNzaW9uOjp2YWx1ZSA9IF9f bnVsbCA7CiAgICAgICAgQXN0RXhwcmVzc2lvbjo6c3ltYm9sID0gX19udWxsIDsKICAgIH0KCiAg ICB2aXJ0dWFsIH5Bc3RUaGlzRXhwcmVzc2lvbigpOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNs b25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExl ZnRUb2tlbigpICB7IHJldHVybiB0aGlzX3Rva2VuOyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6 VG9rZW5JbmRleCBSaWdodFRva2VuKCkgeyByZXR1cm4gdGhpc190b2tlbjsgfQp9OwoKCiAKIAog CmNsYXNzIEFzdFN1cGVyRXhwcmVzc2lvbiA6IHB1YmxpYyBBc3RFeHByZXNzaW9uCnsKcHVibGlj OgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHN1cGVyX3Rva2VuOwoKICAgIEFzdFN1cGVyRXhw cmVzc2lvbihMZXhTdHJlYW06OlRva2VuSW5kZXggdG9rZW5fKSA6IHN1cGVyX3Rva2VuKHRva2Vu XykKICAgIHsKICAgICAgICBBc3Q6OmtpbmQgPSBBc3Q6OlNVUEVSX0VYUFJFU1NJT047CiAgICAg ICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6OkVYUFJFU1NJT047CiAgICAgICAgQXN0OjpnZW5lcmF0 ZWQgPSAwOwogICAgICAgIEFzdEV4cHJlc3Npb246OnZhbHVlID0gX19udWxsIDsKICAgICAgICBB c3RFeHByZXNzaW9uOjpzeW1ib2wgPSBfX251bGwgOwogICAgfQoKICAgIHZpcnR1YWwgfkFzdFN1 cGVyRXhwcmVzc2lvbigpOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29s ICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpICB7IHJl dHVybiBzdXBlcl90b2tlbjsgfQogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmln aHRUb2tlbigpIHsgcmV0dXJuIHN1cGVyX3Rva2VuOyB9Cn07CgoKIAogCiAKY2xhc3MgQXN0UGFy ZW50aGVzaXplZEV4cHJlc3Npb24gOiBwdWJsaWMgQXN0RXhwcmVzc2lvbgp7CnB1YmxpYzoKICAg IExleFN0cmVhbTo6VG9rZW5JbmRleCBsZWZ0X3BhcmVudGhlc2lzX3Rva2VuOwogICAgQXN0RXhw cmVzc2lvbiAqZXhwcmVzc2lvbjsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCByaWdodF9wYXJl bnRoZXNpc190b2tlbjsKCiAgICBBc3RQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpCiAgICB7CiAg ICAgICAgQXN0OjpraW5kID0gQXN0OjpQQVJFTlRIRVNJWkVEX0VYUFJFU1NJT047CiAgICAgICAg QXN0OjpjbGFzc190YWcgPSBBc3Q6OkVYUFJFU1NJT047CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQg PSAwOwogICAgICAgIEFzdEV4cHJlc3Npb246OnZhbHVlID0gX19udWxsIDsKICAgICAgICBBc3RF eHByZXNzaW9uOjpzeW1ib2wgPSBfX251bGwgOwogICAgfQoKICAgIHZpcnR1YWwgfkFzdFBhcmVu dGhlc2l6ZWRFeHByZXNzaW9uKCk7CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3RvcmFn ZVBvb2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2VuKCkg IHsgcmV0dXJuIGxlZnRfcGFyZW50aGVzaXNfdG9rZW47IH0KICAgIHZpcnR1YWwgTGV4U3RyZWFt OjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiByaWdodF9wYXJlbnRoZXNpc190b2tl bjsgfQp9OwoKCiAKIAogCmNsYXNzIEFzdFR5cGVFeHByZXNzaW9uIDogcHVibGljIEFzdEV4cHJl c3Npb24KewpwdWJsaWM6CiAgICBBc3QgKnR5cGU7CgogICAgQXN0VHlwZUV4cHJlc3Npb24oQXN0 ICp0eXBlXykgOiB0eXBlKHR5cGVfKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6VFlQ RTsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFzdDo6RVhQUkVTU0lPTjsKICAgICAgICBBc3Q6 OmdlbmVyYXRlZCA9IDA7CiAgICAgICAgQXN0RXhwcmVzc2lvbjo6dmFsdWUgPSBfX251bGwgOwog ICAgICAgIEFzdEV4cHJlc3Npb246OnN5bWJvbCA9IF9fbnVsbCA7CiAgICB9CgogICAgdmlydHVh bCB+QXN0VHlwZUV4cHJlc3Npb24oKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9y YWdlUG9vbCAqKTsKCiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4o KSAgeyByZXR1cm4gdHlwZSAtPiBMZWZ0VG9rZW4oKTsgfQogICAgdmlydHVhbCBMZXhTdHJlYW06 OlRva2VuSW5kZXggUmlnaHRUb2tlbigpIHsgcmV0dXJuIHR5cGUgLT4gUmlnaHRUb2tlbigpOyB9 Cn07CgoKIAogCiAKIAogCiAKIApjbGFzcyBBc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNz aW9uIDogcHVibGljIEFzdEV4cHJlc3Npb24Kewpwcml2YXRlOgoKICAgIFN0b3JhZ2VQb29sICpw b29sOwogICAgQXN0QXJyYXk8QXN0RXhwcmVzc2lvbiAqPiAqYXJndW1lbnRzOwogICAgQXN0QXJy YXk8QXN0RXhwcmVzc2lvbiAqPiAqbG9jYWxfYXJndW1lbnRzX29wdDsgIAoKICAgIGJvb2wgYWRk X251bGxfYXJndW1lbnQ7CgpwdWJsaWM6CiAgICBBc3RFeHByZXNzaW9uICpiYXNlX29wdDsKICAg IExleFN0cmVhbTo6VG9rZW5JbmRleCBkb3RfdG9rZW5fb3B0OwogICAgTGV4U3RyZWFtOjpUb2tl bkluZGV4IG5ld190b2tlbjsKICAgIEFzdFR5cGVFeHByZXNzaW9uICpjbGFzc190eXBlOwogICAg TGV4U3RyZWFtOjpUb2tlbkluZGV4IGxlZnRfcGFyZW50aGVzaXNfdG9rZW47CiAgICBMZXhTdHJl YW06OlRva2VuSW5kZXggcmlnaHRfcGFyZW50aGVzaXNfdG9rZW47CiAgICBBc3RDbGFzc0JvZHkg KmNsYXNzX2JvZHlfb3B0OwoKICAgIEFzdENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24o U3RvcmFnZVBvb2wgKnBvb2xfKSA6IHBvb2wocG9vbF8pLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzKF9fbnVsbCAp LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbG9jYWxfYXJndW1lbnRzX29wdChfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9udWxsX2FyZ3VtZW50 KGZhbHNlKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6Q0xBU1NfQ1JFQVRJT047CiAg ICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6OkVYUFJFU1NJT047CiAgICAgICAgQXN0OjpnZW5l cmF0ZWQgPSAwOwogICAgICAgIEFzdEV4cHJlc3Npb246OnZhbHVlID0gX19udWxsIDsKICAgICAg ICBBc3RFeHByZXNzaW9uOjpzeW1ib2wgPSBfX251bGwgOwogICAgfQoKICAgIHZpcnR1YWwgfkFz dENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24oKTsKCiAgICBpbmxpbmUgQXN0RXhwcmVz c2lvbiAqJkFyZ3VtZW50KGludCBpKSB7IHJldHVybiAoKmFyZ3VtZW50cylbaV07IH0KICAgIGlu bGluZSBpbnQgTnVtQXJndW1lbnRzKCkgeyByZXR1cm4gKGFyZ3VtZW50cyA/IGFyZ3VtZW50cyAt PiBMZW5ndGgoKSA6IDApOyB9CiAgICBpbmxpbmUgdm9pZCBBbGxvY2F0ZUFyZ3VtZW50cyhpbnQg ZXN0aW1hdGUgPSAwKTsKICAgIGlubGluZSB2b2lkIEFkZEFyZ3VtZW50KEFzdEV4cHJlc3Npb24g Kik7CgogICAgaW5saW5lIEFzdEV4cHJlc3Npb24gKiZMb2NhbEFyZ3VtZW50KGludCBpKSB7IHJl dHVybiAoKmxvY2FsX2FyZ3VtZW50c19vcHQpW2ldOyB9CiAgICBpbmxpbmUgaW50IE51bUxvY2Fs QXJndW1lbnRzKCkgeyByZXR1cm4gKGxvY2FsX2FyZ3VtZW50c19vcHQgPyBsb2NhbF9hcmd1bWVu dHNfb3B0IC0+IExlbmd0aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9jYXRlTG9jYWxB cmd1bWVudHMoaW50IGVzdGltYXRlID0gMCk7CiAgICBpbmxpbmUgdm9pZCBBZGRMb2NhbEFyZ3Vt ZW50KEFzdEV4cHJlc3Npb24gKik7CgogICAgaW5saW5lIHZvaWQgQWRkTnVsbEFyZ3VtZW50KCkg eyBhZGRfbnVsbF9hcmd1bWVudCA9IHRydWU7IH0KICAgIGlubGluZSBib29sIE5lZWRzRXh0cmFO dWxsQXJndW1lbnQoKSB7IHJldHVybiBhZGRfbnVsbF9hcmd1bWVudDsgfQoKCgoKCgogICAgdmly dHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpU b2tlbkluZGV4IExlZnRUb2tlbigpCiAgICB7CiAgICAgICAgcmV0dXJuIChiYXNlX29wdCA/IGJh c2Vfb3B0IC0+IExlZnRUb2tlbigpIDogbmV3X3Rva2VuKTsKICAgIH0KICAgIHZpcnR1YWwgTGV4 U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiAoY2xhc3NfYm9keV9vcHQg PyBjbGFzc19ib2R5X29wdCAtPiBSaWdodFRva2VuKCkgOiByaWdodF9wYXJlbnRoZXNpc190b2tl bik7IH0KfTsKCgogCiAKIApjbGFzcyBBc3REaW1FeHByIDogcHVibGljIEFzdAp7CnB1YmxpYzoK ICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBsZWZ0X2JyYWNrZXRfdG9rZW47CiAgICBBc3RFeHBy ZXNzaW9uICpleHByZXNzaW9uOwogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHJpZ2h0X2JyYWNr ZXRfdG9rZW47CgogICAgQXN0RGltRXhwcigpCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0 OjpESU07CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6Ok5PX1RBRzsKICAgICAgICBBc3Q6 OmdlbmVyYXRlZCA9IDA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0RGltRXhwcigpOwoKCgoKCgog ICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3Ry ZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpICB7IHJldHVybiBsZWZ0X2JyYWNrZXRfdG9rZW47 IH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVy biByaWdodF9icmFja2V0X3Rva2VuOyB9Cn07CgoKIAogCiAKY2xhc3MgQXN0QXJyYXlDcmVhdGlv bkV4cHJlc3Npb24gOiBwdWJsaWMgQXN0RXhwcmVzc2lvbgp7CnByaXZhdGU6CgogICAgU3RvcmFn ZVBvb2wgKnBvb2w7CiAgICBBc3RBcnJheTxBc3RCcmFja2V0cyAqPiAqYnJhY2tldHM7CiAgICBB c3RBcnJheTxBc3REaW1FeHByICo+ICpkaW1fZXhwcnM7CgpwdWJsaWM6CiAgICBMZXhTdHJlYW06 OlRva2VuSW5kZXggbmV3X3Rva2VuOwogICAgQXN0ICphcnJheV90eXBlOwogICAgQXN0QXJyYXlJ bml0aWFsaXplciAqYXJyYXlfaW5pdGlhbGl6ZXJfb3B0OwoKICAgIEFzdEFycmF5Q3JlYXRpb25F eHByZXNzaW9uKFN0b3JhZ2VQb29sICpwb29sXykgOiBwb29sKHBvb2xfKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFja2V0cyhfX251bGwg KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk aW1fZXhwcnMoX19udWxsICkKICAgIHsKICAgICAgICBBc3Q6OmtpbmQgPSBBc3Q6OkFSUkFZX0NS RUFUSU9OOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpFWFBSRVNTSU9OOwogICAgICAg IEFzdDo6Z2VuZXJhdGVkID0gMDsKICAgICAgICBBc3RFeHByZXNzaW9uOjp2YWx1ZSA9IF9fbnVs bCA7CiAgICAgICAgQXN0RXhwcmVzc2lvbjo6c3ltYm9sID0gX19udWxsIDsKICAgIH0KCiAgICB2 aXJ0dWFsIH5Bc3RBcnJheUNyZWF0aW9uRXhwcmVzc2lvbigpOwoKICAgIGlubGluZSBBc3RCcmFj a2V0cyAqJkJyYWNrZXRzKGludCBpKSB7IHJldHVybiAoKmJyYWNrZXRzKVtpXTsgfQogICAgaW5s aW5lIGludCBOdW1CcmFja2V0cygpIHsgcmV0dXJuIChicmFja2V0cyA/IGJyYWNrZXRzIC0+IExl bmd0aCgpIDogMCk7IH0KICAgIGlubGluZSB2b2lkIEFsbG9jYXRlQnJhY2tldHMoaW50IGVzdGlt YXRlID0gMCk7CiAgICBpbmxpbmUgdm9pZCBBZGRCcmFja2V0cyhBc3RCcmFja2V0cyAqKTsKCiAg ICBpbmxpbmUgQXN0RGltRXhwciAqJkRpbUV4cHIoaW50IGkpIHsgcmV0dXJuICgqZGltX2V4cHJz KVtpXTsgfQogICAgaW5saW5lIGludCBOdW1EaW1FeHBycygpIHsgcmV0dXJuIChkaW1fZXhwcnMg PyBkaW1fZXhwcnMgLT4gTGVuZ3RoKCkgOiAwKTsgfQogICAgaW5saW5lIHZvaWQgQWxsb2NhdGVE aW1FeHBycyhpbnQgZXN0aW1hdGUgPSAwKTsKICAgIGlubGluZSB2b2lkIEFkZERpbUV4cHIoQXN0 RGltRXhwciAqKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpDbG9uZShTdG9yYWdlUG9vbCAqKTsK CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBMZWZ0VG9rZW4oKSAgeyByZXR1cm4g bmV3X3Rva2VuOyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdodFRva2Vu KCkKICAgIHsKICAgICAgICByZXR1cm4gKGFycmF5X2luaXRpYWxpemVyX29wdCA/IGFycmF5X2lu aXRpYWxpemVyX29wdCAtPiBSaWdodFRva2VuKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA6IChOdW1CcmFja2V0cygpID4gMCA/IEJyYWNrZXRzKE51bUJyYWNrZXRzKCkg LSAxKSAtPiBSaWdodFRva2VuKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICA6IERpbUV4cHIoTnVtRGltRXhwcnMoKSAtIDEpIC0+IFJp Z2h0VG9rZW4oKSkpOwogICAgfQp9OwoKCiAKIAogCiAKIAogCiAKIAogCiAKY2xhc3MgQXN0Rmll bGRBY2Nlc3MgOiBwdWJsaWMgQXN0RXhwcmVzc2lvbgp7CnB1YmxpYzoKICAgIGVudW0gRmllbGRB Y2Nlc3NUYWcKICAgIHsKICAgICAgICBOT05FLAogICAgICAgIENMQVNTX1RBRywKICAgICAgICBU SElTX1RBRywKICAgICAgICBTVVBFUl9UQUcsCgogICAgICAgIF9udW1fa2luZHMKICAgIH07Cgog ICAgQXN0RXhwcmVzc2lvbiAqYmFzZTsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBkb3RfdG9r ZW47CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggaWRlbnRpZmllcl90b2tlbjsKCiAgICAgCiAg ICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAg CiAgICAgCiAgICAgCiAgICAgCiAgICBBc3RFeHByZXNzaW9uICpyZXNvbHV0aW9uX29wdDsKCiAg ICBBc3RGaWVsZEFjY2VzcyhGaWVsZEFjY2Vzc1RhZyB0YWcgPSBOT05FKSA6IHJlc29sdXRpb25f b3B0KF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBmaWVsZF9hY2Nlc3NfdGFnKHRhZykKICAgIHsKICAgICAgICBBc3Q6OmtpbmQgPSBBc3Q6 OkRPVDsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFzdDo6RVhQUkVTU0lPTjsKICAgICAgICBB c3Q6OmdlbmVyYXRlZCA9IDA7CiAgICAgICAgQXN0RXhwcmVzc2lvbjo6dmFsdWUgPSBfX251bGwg OwogICAgICAgIEFzdEV4cHJlc3Npb246OnN5bWJvbCA9IF9fbnVsbCA7CiAgICB9CgogICAgdmly dHVhbCB+QXN0RmllbGRBY2Nlc3MoKTsKCiAgICBib29sIElzTmFtZUFjY2VzcygpICB7IHJldHVy biBmaWVsZF9hY2Nlc3NfdGFnID09IE5PTkU7IH0KICAgIGJvb2wgSXNUaGlzQWNjZXNzKCkgIHsg cmV0dXJuIGZpZWxkX2FjY2Vzc190YWcgPT0gVEhJU19UQUc7IH0KICAgIGJvb2wgSXNTdXBlckFj Y2VzcygpIHsgcmV0dXJuIGZpZWxkX2FjY2Vzc190YWcgPT0gU1VQRVJfVEFHOyB9CiAgICBib29s IElzQ2xhc3NBY2Nlc3MoKSB7IHJldHVybiBmaWVsZF9hY2Nlc3NfdGFnID09IENMQVNTX1RBRzsg fQoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1 YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpICB7IHJldHVybiBiYXNlIC0+IExl ZnRUb2tlbigpOyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBSaWdodFRva2Vu KCkgeyByZXR1cm4gaWRlbnRpZmllcl90b2tlbjsgfQoKcHJpdmF0ZToKICAgIEZpZWxkQWNjZXNz VGFnIGZpZWxkX2FjY2Vzc190YWc7Cn07CgoKIAogCiAKIAogCiAKY2xhc3MgQXN0TWV0aG9kSW52 b2NhdGlvbiA6IHB1YmxpYyBBc3RFeHByZXNzaW9uCnsKcHJpdmF0ZToKCiAgICBTdG9yYWdlUG9v bCAqcG9vbDsKICAgIEFzdEFycmF5PEFzdEV4cHJlc3Npb24gKj4gKmFyZ3VtZW50czsKCnB1Ymxp YzoKICAgIEFzdEV4cHJlc3Npb24gKm1ldGhvZDsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBs ZWZ0X3BhcmVudGhlc2lzX3Rva2VuOwogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHJpZ2h0X3Bh cmVudGhlc2lzX3Rva2VuOwoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIEFzdEV4 cHJlc3Npb24gKnJlc29sdXRpb25fb3B0OwoKICAgIEFzdE1ldGhvZEludm9jYXRpb24oU3RvcmFn ZVBvb2wgKnBvb2xfKSA6IHBvb2wocG9vbF8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgYXJndW1lbnRzKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbl9vcHQoX19udWxsICkKICAgIHsK ICAgICAgICBBc3Q6OmtpbmQgPSBBc3Q6OkNBTEw7CiAgICAgICAgQXN0OjpjbGFzc190YWcgPSBB c3Q6OkVYUFJFU1NJT047CiAgICAgICAgQXN0OjpnZW5lcmF0ZWQgPSAwOwogICAgICAgIEFzdEV4 cHJlc3Npb246OnZhbHVlID0gX19udWxsIDsKICAgICAgICBBc3RFeHByZXNzaW9uOjpzeW1ib2wg PSBfX251bGwgOwogICAgfQoKICAgIHZpcnR1YWwgfkFzdE1ldGhvZEludm9jYXRpb24oKTsKCiAg ICBpbmxpbmUgQXN0RXhwcmVzc2lvbiAqJkFyZ3VtZW50KGludCBpKSB7IHJldHVybiAoKmFyZ3Vt ZW50cylbaV07IH0KICAgIGlubGluZSBpbnQgTnVtQXJndW1lbnRzKCkgeyByZXR1cm4gKGFyZ3Vt ZW50cyA/IGFyZ3VtZW50cyAtPiBMZW5ndGgoKSA6IDApOyB9CiAgICBpbmxpbmUgdm9pZCBBbGxv Y2F0ZUFyZ3VtZW50cyhpbnQgZXN0aW1hdGUgPSAwKTsKICAgIGlubGluZSB2b2lkIEFkZEFyZ3Vt ZW50KEFzdEV4cHJlc3Npb24gKik7CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3RvcmFn ZVBvb2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2VuKCkg eyByZXR1cm4gbWV0aG9kIC0+IExlZnRUb2tlbigpOyB9CiAgICB2aXJ0dWFsIExleFN0cmVhbTo6 VG9rZW5JbmRleCBSaWdodFRva2VuKCkgeyByZXR1cm4gcmlnaHRfcGFyZW50aGVzaXNfdG9rZW47 IH0KfTsKCgogCiAKIApjbGFzcyBBc3RBcnJheUFjY2VzcyA6IHB1YmxpYyBBc3RFeHByZXNzaW9u CnsKcHVibGljOgogICAgQXN0RXhwcmVzc2lvbiAqYmFzZTsKICAgIExleFN0cmVhbTo6VG9rZW5J bmRleCBsZWZ0X2JyYWNrZXRfdG9rZW47CiAgICBBc3RFeHByZXNzaW9uICpleHByZXNzaW9uOwog ICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHJpZ2h0X2JyYWNrZXRfdG9rZW47CgogICAgQXN0QXJy YXlBY2Nlc3MoKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6QVJSQVlfQUNDRVNTOwog ICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpFWFBSRVNTSU9OOwogICAgICAgIEFzdDo6Z2Vu ZXJhdGVkID0gMDsKICAgICAgICBBc3RFeHByZXNzaW9uOjp2YWx1ZSA9IF9fbnVsbCA7CiAgICAg ICAgQXN0RXhwcmVzc2lvbjo6c3ltYm9sID0gX19udWxsIDsKICAgIH0KCiAgICB2aXJ0dWFsIH5B c3RBcnJheUFjY2VzcygpOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29s ICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpIHsgcmV0 dXJuIGJhc2UgLT4gTGVmdFRva2VuKCk7IH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbklu ZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiByaWdodF9icmFja2V0X3Rva2VuOyB9Cn07CgoKIAog CiAKIAogCiAKIAogCiAKIAogCmNsYXNzIEFzdFBvc3RVbmFyeUV4cHJlc3Npb24gOiBwdWJsaWMg QXN0RXhwcmVzc2lvbgp7CnB1YmxpYzoKICAgIGVudW0gUG9zdFVuYXJ5RXhwcmVzc2lvblRhZwog ICAgewogICAgICAgIE5PTkUsCiAgICAgICAgUExVU1BMVVMsCiAgICAgICAgTUlOVVNNSU5VUywK CiAgICAgICAgX251bV9raW5kcwogICAgfTsKCiAgICBQb3N0VW5hcnlFeHByZXNzaW9uVGFnIHBv c3RfdW5hcnlfdGFnOwogICAgQXN0RXhwcmVzc2lvbiAqZXhwcmVzc2lvbjsKICAgIExleFN0cmVh bTo6VG9rZW5JbmRleCBwb3N0X29wZXJhdG9yX3Rva2VuOwoKICAgICAKICAgICAKICAgICAKICAg ICAKICAgICAKICAgIE1ldGhvZFN5bWJvbCAqd3JpdGVfbWV0aG9kOwoKICAgIEFzdFBvc3RVbmFy eUV4cHJlc3Npb24oUG9zdFVuYXJ5RXhwcmVzc2lvblRhZyB0YWdfKSA6IHBvc3RfdW5hcnlfdGFn KHRhZ18pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgd3JpdGVfbWV0aG9kKF9fbnVsbCApCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0g QXN0OjpQT1NUX1VOQVJZOwogICAgICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpFWFBSRVNTSU9O OwogICAgICAgIEFzdDo6Z2VuZXJhdGVkID0gMDsKICAgICAgICBBc3RFeHByZXNzaW9uOjp2YWx1 ZSA9IF9fbnVsbCA7CiAgICAgICAgQXN0RXhwcmVzc2lvbjo6c3ltYm9sID0gX19udWxsIDsKICAg IH0KCiAgICB2aXJ0dWFsIH5Bc3RQb3N0VW5hcnlFeHByZXNzaW9uKCk7CgoKCgoKCiAgICB2aXJ0 dWFsIEFzdCAqQ2xvbmUoU3RvcmFnZVBvb2wgKik7CgogICAgdmlydHVhbCBMZXhTdHJlYW06OlRv a2VuSW5kZXggTGVmdFRva2VuKCkgIHsgcmV0dXJuIGV4cHJlc3Npb24gLT4gTGVmdFRva2VuKCk7 IH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVy biBwb3N0X29wZXJhdG9yX3Rva2VuOyB9Cn07CgoKIAogCiAKIAogCiAKIApjbGFzcyBBc3RQcmVV bmFyeUV4cHJlc3Npb24gOiBwdWJsaWMgQXN0RXhwcmVzc2lvbgp7CnB1YmxpYzoKICAgIGVudW0g UHJlVW5hcnlFeHByZXNzaW9uVGFnCiAgICB7CiAgICAgICAgTk9ORSwKICAgICAgICBQTFVTUExV UywKICAgICAgICBNSU5VU01JTlVTLAogICAgICAgIFBMVVMsCiAgICAgICAgTUlOVVMsCiAgICAg ICAgVFdJRERMRSwKICAgICAgICBOT1QsCgogICAgICAgIF9udW1fa2luZHMKICAgIH07CgogICAg UHJlVW5hcnlFeHByZXNzaW9uVGFnIHByZV91bmFyeV90YWc7CiAgICBMZXhTdHJlYW06OlRva2Vu SW5kZXggcHJlX29wZXJhdG9yX3Rva2VuOwogICAgQXN0RXhwcmVzc2lvbiAqZXhwcmVzc2lvbjsK CiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBNZXRob2RTeW1ib2wgKndyaXRlX21l dGhvZDsKCiAgICBBc3RQcmVVbmFyeUV4cHJlc3Npb24oUHJlVW5hcnlFeHByZXNzaW9uVGFnIHRh Z18pIDogcHJlX3VuYXJ5X3RhZyh0YWdfKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9tZXRob2QoX19udWxsICkKICAgIHsKICAg ICAgICBBc3Q6OmtpbmQgPSBBc3Q6OlBSRV9VTkFSWTsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9 IEFzdDo6RVhQUkVTU0lPTjsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICAgICAgQXN0 RXhwcmVzc2lvbjo6dmFsdWUgPSBfX251bGwgOwogICAgICAgIEFzdEV4cHJlc3Npb246OnN5bWJv bCA9IF9fbnVsbCA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0UHJlVW5hcnlFeHByZXNzaW9uKCk7 CgoKCgoKCiAgICB2aXJ0dWFsIEFzdCAqQ2xvbmUoU3RvcmFnZVBvb2wgKik7CgogICAgdmlydHVh bCBMZXhTdHJlYW06OlRva2VuSW5kZXggTGVmdFRva2VuKCkgIHsgcmV0dXJuIHByZV9vcGVyYXRv cl90b2tlbjsgfQogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigp IHsgcmV0dXJuIGV4cHJlc3Npb24gLT4gUmlnaHRUb2tlbigpOyB9Cn07CgoKIAogCiAKIAogCiAK IAogCiAKY2xhc3MgQXN0Q2FzdEV4cHJlc3Npb24gOiBwdWJsaWMgQXN0RXhwcmVzc2lvbgp7CnBy aXZhdGU6CgogICAgU3RvcmFnZVBvb2wgKnBvb2w7CiAgICBBc3RBcnJheTxBc3RCcmFja2V0cyAq PiAqYnJhY2tldHM7CgpwdWJsaWM6CiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggbGVmdF9wYXJl bnRoZXNpc190b2tlbl9vcHQ7CiAgICBBc3QgKnR5cGVfb3B0OwogICAgTGV4U3RyZWFtOjpUb2tl bkluZGV4IHJpZ2h0X3BhcmVudGhlc2lzX3Rva2VuX29wdDsKICAgIEFzdEV4cHJlc3Npb24gKmV4 cHJlc3Npb247CgogICAgQXN0Q2FzdEV4cHJlc3Npb24oU3RvcmFnZVBvb2wgKnBvb2xfKSA6IHBv b2wocG9vbF8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJy YWNrZXRzKF9fbnVsbCApCiAgICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0OjpDQVNUOwogICAg ICAgIEFzdDo6Y2xhc3NfdGFnID0gQXN0OjpFWFBSRVNTSU9OOwogICAgICAgIEFzdDo6Z2VuZXJh dGVkID0gMDsKICAgICAgICBBc3RFeHByZXNzaW9uOjp2YWx1ZSA9IF9fbnVsbCA7CiAgICAgICAg QXN0RXhwcmVzc2lvbjo6c3ltYm9sID0gX19udWxsIDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RD YXN0RXhwcmVzc2lvbigpOwoKICAgIGlubGluZSBBc3RCcmFja2V0cyAqJkJyYWNrZXRzKGludCBp KSB7IHJldHVybiAoKmJyYWNrZXRzKVtpXTsgfQogICAgaW5saW5lIGludCBOdW1CcmFja2V0cygp IHsgcmV0dXJuIChicmFja2V0cyA/IGJyYWNrZXRzIC0+IExlbmd0aCgpIDogMCk7IH0KICAgIGlu bGluZSB2b2lkIEFsbG9jYXRlQnJhY2tldHMoaW50IGVzdGltYXRlID0gMCk7CiAgICBpbmxpbmUg dm9pZCBBZGRCcmFja2V0cyhBc3RCcmFja2V0cyAqKTsKCgoKCgoKICAgIHZpcnR1YWwgQXN0ICpD bG9uZShTdG9yYWdlUG9vbCAqKTsKCiAgICB2aXJ0dWFsIExleFN0cmVhbTo6VG9rZW5JbmRleCBM ZWZ0VG9rZW4oKQogICAgewogICAgICAgIHJldHVybiAobGVmdF9wYXJlbnRoZXNpc190b2tlbl9v cHQgPyBsZWZ0X3BhcmVudGhlc2lzX3Rva2VuX29wdCA6IGV4cHJlc3Npb24gLT4gTGVmdFRva2Vu KCkpOwogICAgfQogICAgdmlydHVhbCBMZXhTdHJlYW06OlRva2VuSW5kZXggUmlnaHRUb2tlbigp IHsgcmV0dXJuIGV4cHJlc3Npb24gLT4gUmlnaHRUb2tlbigpOyB9Cn07CgoKIAogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIApjbGFzcyBBc3RCaW5hcnlFeHByZXNzaW9uIDogcHVibGljIEFz dEV4cHJlc3Npb24KewpwdWJsaWM6CiAgICBlbnVtIEJpbmFyeUV4cHJlc3Npb25UYWcKICAgIHsK ICAgICAgICBOT05FLAogICAgICAgIFNUQVIsCiAgICAgICAgU0xBU0gsCiAgICAgICAgTU9ELAog ICAgICAgIFBMVVMsCiAgICAgICAgTUlOVVMsCiAgICAgICAgTEVGVF9TSElGVCwKICAgICAgICBS SUdIVF9TSElGVCwKICAgICAgICBVTlNJR05FRF9SSUdIVF9TSElGVCwKICAgICAgICBJTlNUQU5D RU9GLAogICAgICAgIExFU1MsCiAgICAgICAgR1JFQVRFUiwKICAgICAgICBBTkQsCiAgICAgICAg WE9SLAogICAgICAgIElPUiwKICAgICAgICBBTkRfQU5ELAogICAgICAgIE9SX09SLAoKICAgICAg ICBMRVNTX0VRVUFMLAogICAgICAgIEdSRUFURVJfRVFVQUwsCiAgICAgICAgRVFVQUxfRVFVQUws CiAgICAgICAgTk9UX0VRVUFMLAoKICAgICAgICBfbnVtX2tpbmRzCiAgICB9OwoKICAgIEJpbmFy eUV4cHJlc3Npb25UYWcgYmluYXJ5X3RhZzsKICAgIEFzdEV4cHJlc3Npb24gKmxlZnRfZXhwcmVz c2lvbjsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBiaW5hcnlfb3BlcmF0b3JfdG9rZW47CiAg ICBBc3RFeHByZXNzaW9uICpyaWdodF9leHByZXNzaW9uOwoKICAgIEFzdEJpbmFyeUV4cHJlc3Np b24oQmluYXJ5RXhwcmVzc2lvblRhZyB0YWdfKSA6IGJpbmFyeV90YWcodGFnXykKICAgIHsKICAg ICAgICBBc3Q6OmtpbmQgPSBBc3Q6OkJJTkFSWTsKICAgICAgICBBc3Q6OmNsYXNzX3RhZyA9IEFz dDo6RVhQUkVTU0lPTjsKICAgICAgICBBc3Q6OmdlbmVyYXRlZCA9IDA7CiAgICAgICAgQXN0RXhw cmVzc2lvbjo6dmFsdWUgPSBfX251bGwgOwogICAgICAgIEFzdEV4cHJlc3Npb246OnN5bWJvbCA9 IF9fbnVsbCA7CiAgICB9CgogICAgdmlydHVhbCB+QXN0QmluYXJ5RXhwcmVzc2lvbigpOwoKCgoK CgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4 U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpICB7IHJldHVybiBsZWZ0X2V4cHJlc3Npb24g LT4gTGVmdFRva2VuKCk7IH0KICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0 VG9rZW4oKSB7IHJldHVybiByaWdodF9leHByZXNzaW9uIC0+IFJpZ2h0VG9rZW4oKTsgfQp9OwoK CiAKIAogCmNsYXNzIEFzdENvbmRpdGlvbmFsRXhwcmVzc2lvbiA6IHB1YmxpYyBBc3RFeHByZXNz aW9uCnsKcHVibGljOgogICAgQXN0RXhwcmVzc2lvbiAqdGVzdF9leHByZXNzaW9uOwogICAgTGV4 U3RyZWFtOjpUb2tlbkluZGV4IHF1ZXN0aW9uX3Rva2VuOwogICAgQXN0RXhwcmVzc2lvbiAqdHJ1 ZV9leHByZXNzaW9uOwogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGNvbG9uX3Rva2VuOwogICAg QXN0RXhwcmVzc2lvbiAqZmFsc2VfZXhwcmVzc2lvbjsKCiAgICBBc3RDb25kaXRpb25hbEV4cHJl c3Npb24oKQogICAgewogICAgICAgIEFzdDo6a2luZCA9IEFzdDo6Q09ORElUSU9OQUw7CiAgICAg ICAgQXN0OjpjbGFzc190YWcgPSBBc3Q6OkVYUFJFU1NJT047CiAgICAgICAgQXN0OjpnZW5lcmF0 ZWQgPSAwOwogICAgICAgIEFzdEV4cHJlc3Npb246OnZhbHVlID0gX19udWxsIDsKICAgICAgICBB c3RFeHByZXNzaW9uOjpzeW1ib2wgPSBfX251bGwgOwogICAgfQoKICAgIHZpcnR1YWwgfkFzdENv bmRpdGlvbmFsRXhwcmVzc2lvbigpOwoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3Jh Z2VQb29sICopOwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigp ICB7IHJldHVybiB0ZXN0X2V4cHJlc3Npb24gLT4gTGVmdFRva2VuKCk7IH0KICAgIHZpcnR1YWwg TGV4U3RyZWFtOjpUb2tlbkluZGV4IFJpZ2h0VG9rZW4oKSB7IHJldHVybiBmYWxzZV9leHByZXNz aW9uIC0+IFJpZ2h0VG9rZW4oKTsgfQp9OwoKCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKY2xhc3MgQXN0QXNzaWdubWVudEV4cHJlc3Npb24gOiBwdWJsaWMgQXN0RXhwcmVz c2lvbgp7CnB1YmxpYzoKICAgIGVudW0gQXNzaWdubWVudEV4cHJlc3Npb25UYWcKICAgIHsKICAg ICAgICBOT05FLAogICAgICAgIFNJTVBMRV9FUVVBTCwKICAgICAgICBERUZJTklURV9FUVVBTCwK ICAgICAgICBTVEFSX0VRVUFMLAogICAgICAgIFNMQVNIX0VRVUFMLAogICAgICAgIE1PRF9FUVVB TCwKICAgICAgICBQTFVTX0VRVUFMLAogICAgICAgIE1JTlVTX0VRVUFMLAogICAgICAgIExFRlRf U0hJRlRfRVFVQUwsCiAgICAgICAgUklHSFRfU0hJRlRfRVFVQUwsCiAgICAgICAgVU5TSUdORURf UklHSFRfU0hJRlRfRVFVQUwsCgoKICAgICAgICBBTkRfRVFVQUwsCiAgICAgICAgWE9SX0VRVUFM LAogICAgICAgIElPUl9FUVVBTCwKCiAgICAgICAgX251bV9raW5kcwogICAgfTsKCiAgICAgCiAg ICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBNZXRob2RTeW1ib2wgKndyaXRlX21ldGhvZDsKCiAg ICBBc3NpZ25tZW50RXhwcmVzc2lvblRhZyBhc3NpZ25tZW50X3RhZzsKICAgIEFzdEV4cHJlc3Np b24gKmxlZnRfaGFuZF9zaWRlOwogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGFzc2lnbm1lbnRf b3BlcmF0b3JfdG9rZW47CiAgICBBc3RFeHByZXNzaW9uICpleHByZXNzaW9uOwoKICAgIEFzdEFz c2lnbm1lbnRFeHByZXNzaW9uKEFzc2lnbm1lbnRFeHByZXNzaW9uVGFnIHRhZ18sIExleFN0cmVh bTo6VG9rZW5JbmRleCB0b2tlbl8pIDogd3JpdGVfbWV0aG9kKF9fbnVsbCApLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50X3RhZyh0YWdfKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgYXNzaWdubWVudF9vcGVyYXRvcl90b2tlbih0b2tlbl8pCiAg ICB7CiAgICAgICAgQXN0OjpraW5kID0gQXN0OjpBU1NJR05NRU5UOwogICAgICAgIEFzdDo6Y2xh c3NfdGFnID0gQXN0OjpFWFBSRVNTSU9OOwogICAgICAgIEFzdDo6Z2VuZXJhdGVkID0gMDsKICAg ICAgICBBc3RFeHByZXNzaW9uOjp2YWx1ZSA9IF9fbnVsbCA7CiAgICAgICAgQXN0RXhwcmVzc2lv bjo6c3ltYm9sID0gX19udWxsIDsKICAgIH0KCiAgICB2aXJ0dWFsIH5Bc3RBc3NpZ25tZW50RXhw cmVzc2lvbigpOwoKICAgIGlubGluZSBib29sIFNpbXBsZUFzc2lnbm1lbnQoKSB7IHJldHVybiAo YXNzaWdubWVudF90YWcgPT0gU0lNUExFX0VRVUFMIHx8IGFzc2lnbm1lbnRfdGFnID09IERFRklO SVRFX0VRVUFMKTsgfQoKCgoKCgogICAgdmlydHVhbCBBc3QgKkNsb25lKFN0b3JhZ2VQb29sICop OwoKICAgIHZpcnR1YWwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IExlZnRUb2tlbigpICB7IHJldHVy biBsZWZ0X2hhbmRfc2lkZSAtPiBMZWZ0VG9rZW4oKTsgfQogICAgdmlydHVhbCBMZXhTdHJlYW06 OlRva2VuSW5kZXggUmlnaHRUb2tlbigpIHsgcmV0dXJuIGV4cHJlc3Npb24gLT4gUmlnaHRUb2tl bigpOyB9Cn07CgoKIAogCiAKaW5saW5lIGJvb2wgQXN0OjpJc05hbWUoKQp7CiAgICBBc3QgKm5h bWUgPSB0aGlzOwogICAgZm9yIChBc3RGaWVsZEFjY2VzcyAqZmllbGRfYWNjZXNzID0gbmFtZSAt PiBGaWVsZEFjY2Vzc0Nhc3QoKTsgZmllbGRfYWNjZXNzICYmIGZpZWxkX2FjY2VzcyAtPiBJc05h bWVBY2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyA9IG5hbWUgLT4gRmllbGRBY2Nlc3ND YXN0KCkpCiAgICAgICAgbmFtZSA9IGZpZWxkX2FjY2VzcyAtPiBiYXNlOwogICAgcmV0dXJuIChu YW1lIC0+IFNpbXBsZU5hbWVDYXN0KCkgIT0gX19udWxsICk7Cn0KCgogCiAKIAogCmlubGluZSBi b29sIEFzdDo6SXNTaW1wbGVOYW1lT3JGaWVsZEFjY2VzcygpCnsKICAgIEFzdCAqbmFtZSA9IHRo aXM7CiAgICBmb3IgKEFzdEZpZWxkQWNjZXNzICpmaWVsZF9hY2Nlc3MgPSBuYW1lIC0+IEZpZWxk QWNjZXNzQ2FzdCgpOyBmaWVsZF9hY2Nlc3M7IGZpZWxkX2FjY2VzcyA9IG5hbWUgLT4gRmllbGRB Y2Nlc3NDYXN0KCkpCiAgICAgICAgbmFtZSA9IGZpZWxkX2FjY2VzcyAtPiBiYXNlOwogICAgcmV0 dXJuIChuYW1lIC0+IFNpbXBsZU5hbWVDYXN0KCkgfHwgbmFtZSAtPiBUeXBlRXhwcmVzc2lvbkNh c3QoKSk7Cn0KCgogCiAKIAppbmxpbmUgYm9vbCBBc3Q6OklzU3VwZXJFeHByZXNzaW9uKCkKewog ICAgcmV0dXJuICh0aGlzIC0+IFN1cGVyRXhwcmVzc2lvbkNhc3QoKSB8fCAodGhpcyAtPiBGaWVs ZEFjY2Vzc0Nhc3QoKSAmJiB0aGlzIC0+IEZpZWxkQWNjZXNzQ2FzdCgpIC0+IElzU3VwZXJBY2Nl c3MoKSkpOwoKfQoKIAogCiAKaW5saW5lIGJvb2wgQXN0OjpJc0xlZnRIYW5kU2lkZSgpCnsKICAg IHJldHVybiAodGhpcyAtPiBTaW1wbGVOYW1lQ2FzdCgpIHx8IHRoaXMgLT4gRmllbGRBY2Nlc3ND YXN0KCkgfHwgdGhpcyAtPiBBcnJheUFjY2Vzc0Nhc3QoKSk7Cn0KCgogCiAKIAppbmxpbmUgYm9v bCBBc3Q6OklzR2VuZXJhdGVkKCkKewogICAgcmV0dXJuIChnZW5lcmF0ZWQgPT0gMSk7Cn0KCgog CiAKIAogCiAKY2xhc3MgU3RvcmFnZVBvb2wKewpwdWJsaWM6CgogICAgdHlwZWRlZiB2b2lkICpD ZWxsOwoKICAgIGlubGluZSBzaXplX3QgQmxrc2l6ZSgpIHsgcmV0dXJuICgxIDw8IGxvZ19ibGtz aXplKTsgfQoKcHJpdmF0ZToKCiAgICBDZWxsICoqYmFzZTsKICAgIHNpemVfdCBiYXNlX3NpemU7 CiAgICBpbnQgdG9wLAogICAgICAgIHNpemU7CgogICAgc2l6ZV90IGxvZ19ibGtzaXplLAogICAg ICAgICAgIGJhc2VfaW5jcmVtZW50OwoKICAgICAKICAgICAKICAgICAKICAgIHZvaWQgQWxsb2Nh dGVNb3JlU3BhY2UoKQogICAgewogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAg ICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICBzaXplX3QgayA9IHNp emUgPj4gbG9nX2Jsa3NpemU7ICAKCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAg ICAgaWYgKGsgPT0gYmFzZV9zaXplKQogICAgICAgIHsKICAgICAgICAgICAgaW50IG9sZF9iYXNl X3NpemUgPSBiYXNlX3NpemU7CiAgICAgICAgICAgIENlbGwgKipvbGRfYmFzZSA9IGJhc2U7Cgog ICAgICAgICAgICBiYXNlX3NpemUgKz0gYmFzZV9pbmNyZW1lbnQ7CiAgICAgICAgICAgIGJhc2Ug PSBuZXcgQ2VsbCpbYmFzZV9zaXplXTsKCiAgICAgICAgICAgIGlmIChvbGRfYmFzZSAhPSBfX251 bGwgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtZW1tb3ZlKGJhc2UsIG9sZF9iYXNl LCBvbGRfYmFzZV9zaXplICogc2l6ZW9mKENlbGwgKikpOwogICAgICAgICAgICAgICAgZGVsZXRl IFtdIG9sZF9iYXNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1lbXNldCgmYmFzZVtvbGRf YmFzZV9zaXplXSwgMCwgKGJhc2Vfc2l6ZSAtIG9sZF9iYXNlX3NpemUpICogc2l6ZW9mKENlbGwg KikpOwogICAgICAgIH0KCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAog ICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgIGlmIChiYXNlW2tdID09IF9fbnVs bCApCiAgICAgICAgewogICAgICAgICAgICBiYXNlW2tdID0gbmV3IENlbGxbQmxrc2l6ZSgpXTsK ICAgICAgICAgICAgYmFzZVtrXSAtPSBzaXplOwogICAgICAgIH0KCiAgICAgICAgIAogICAgICAg ICAKICAgICAgICAgCiAgICAgICAgc2l6ZSArPSBCbGtzaXplKCk7CgogICAgICAgIHJldHVybjsK ICAgIH0KCnB1YmxpYzoKCiAgICAgCiAgICAgCiAgICAgCiAgICBTdG9yYWdlUG9vbChzaXplX3Qg bnVtX3Rva2VucykKICAgIHsKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAg CiAgICAgICAgIAogICAgICAgICAKICAgICAgICBzaXplX3QgZXN0aW1hdGUgPSBudW1fdG9rZW5z ICogMTA7ICAKCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAg IGZvciAobG9nX2Jsa3NpemUgPSA4OyAoKCh1bnNpZ25lZCkgMSA8PCBsb2dfYmxrc2l6ZSkgPCBl c3RpbWF0ZSkgJiYgKGxvZ19ibGtzaXplIDwgMzEpOyBsb2dfYmxrc2l6ZSsrKQogICAgICAgICAg ICA7CgogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAg ICAgICAgIAogICAgICAgICAKICAgICAgICBpZiAobG9nX2Jsa3NpemUgPCA4KQogICAgICAgIHsK ICAgICAgICAgICAgYmFzZV9pbmNyZW1lbnQgPSAxOwogICAgICAgICAgICBsb2dfYmxrc2l6ZSA9 IDg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGxvZ19ibGtzaXplIDwgMTMpCiAgICAgICAg ewogICAgICAgICAgICBiYXNlX2luY3JlbWVudCA9ICh1bnNpZ25lZCkgMSA8PCAobG9nX2Jsa3Np emUgLSA4KTsKICAgICAgICAgICAgbG9nX2Jsa3NpemUgPSA4OwogICAgICAgIH0KICAgICAgICBl bHNlIGlmIChsb2dfYmxrc2l6ZSA8IDE3KQogICAgICAgIHsKICAgICAgICAgICAgYmFzZV9pbmNy ZW1lbnQgPSAodW5zaWduZWQpIDEgPDwgKGxvZ19ibGtzaXplIC0gMTApOwogICAgICAgICAgICBs b2dfYmxrc2l6ZSA9IDEwOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAg ICAgICBiYXNlX2luY3JlbWVudCA9ICh1bnNpZ25lZCkgMSA8PCAobG9nX2Jsa3NpemUgLSAxMik7 ICAKICAgICAgICAgICAgbG9nX2Jsa3NpemUgPSAxMjsKICAgICAgICB9CgogICAgICAgICAKICAg ICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgYmFzZV9pbmNyZW1l bnQgPSAoYmFzZV9pbmNyZW1lbnQgPDwgMSkgKyAzOwoKICAgICAgICBiYXNlX3NpemUgPSAwOwog ICAgICAgIHNpemUgPSAwOwogICAgICAgIHRvcCA9IDA7CiAgICAgICAgYmFzZSA9IF9fbnVsbCA7 CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAgflN0b3JhZ2VQb29sKCkKICAgIHsKICAgICAg ICBmb3IgKGludCBrID0gKHNpemUgPj4gbG9nX2Jsa3NpemUpIC0gMTsgayA+PSAwOyBrLS0pCiAg ICAgICAgewogICAgICAgICAgICBzaXplIC09IEJsa3NpemUoKTsKICAgICAgICAgICAgYmFzZVtr XSArPSBzaXplOwogICAgICAgICAgICBkZWxldGUgW10gYmFzZVtrXTsKICAgICAgICB9CgogICAg ICAgIGRlbGV0ZSBbXSBiYXNlOwogICAgfQoKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGlu bGluZSB2b2lkICpBbGxvYyhzaXplX3QgbikKICAgIHsKICAgICAgICBzaXplX3QgaSA9IHRvcCwK ICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9ICgobiArIHNpemVvZihDZWxsKSAtIDEpIC8gc2l6 ZW9mKENlbGwpKTsKICAgICAgICB0b3AgKz0gY2h1bmtfc2l6ZTsKICAgICAgICBpZiAodG9wID4g c2l6ZSkKICAgICAgICB7CiAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggY2h1bmtf c2l6ZSA8PSBCbGtzaXplKCkgJiYgIndlIGNhbm5vdCBhbGxvY2F0ZSBhIGNodW5rIG9mIHN0b3Jh Z2UgdGhhdCBpcyBsYXJnZXIgdGhhbiB0aGUgYmxvY2sgISIgKSA/IDAgOgkoX19hc3NlcnRfZmFp bCAoImNodW5rX3NpemUgPD0gQmxrc2l6ZSgpICYmIFwid2UgY2Fubm90IGFsbG9jYXRlIGEgY2h1 bmsgb2Ygc3RvcmFnZSB0aGF0IGlzIGxhcmdlciB0aGFuIHRoZSBibG9jayAhXCIiICwgIi4uLy4u L2ppa2VzL3NyYy9hc3QuaCIsIDQyNDgsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7Cgog ICAgICAgICAgICBpID0gc2l6ZTsKICAgICAgICAgICAgdG9wID0gc2l6ZSArIGNodW5rX3NpemU7 CiAgICAgICAgICAgIEFsbG9jYXRlTW9yZVNwYWNlKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1 cm4gKCh2b2lkICopICYoYmFzZVtpID4+IGxvZ19ibGtzaXplXSBbaV0pKTsKICAgIH0KCiAgICAg CiAgICAgCiAgICAgCiAgICBpbmxpbmUgc2l6ZV90IExlbmd0aCgpIHsgcmV0dXJuIHRvcDsgfQoK ICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGlubGluZSB2b2lkIFJlc2V0KGNvbnN0 IGludCBuID0gMCkKICAgIHsKICAgICAgICBpZiAobiA8IDAgfHwgbiA+IHNpemUpCiAgICAgICAg ICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggZmFsc2UgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAo ImZhbHNlIiAsICIuLi8uLi9qaWtlcy9zcmMvYXN0LmgiLCA0MjcxLCBfX1BSRVRUWV9GVU5DVElP Tl9fICksIDApKSkgOwogICAgICAgIHRvcCA9IG47CiAgICB9CgogICAgIAogICAgIAogICAgIAog ICAgIAogICAgaW5saW5lIHZvaWQgRGVzdHJveSgpCiAgICB7CiAgICAgICAgZm9yIChpbnQgayA9 IChzaXplID4+IGxvZ19ibGtzaXplKSAtIDE7IGsgPj0gMDsgay0tKQogICAgICAgIHsKICAgICAg ICAgICAgc2l6ZSAtPSBCbGtzaXplKCk7CiAgICAgICAgICAgIGJhc2Vba10gKz0gc2l6ZTsKICAg ICAgICAgICAgZGVsZXRlIFtdIGJhc2Vba107CiAgICAgICAgICAgIGJhc2Vba10gPSBfX251bGwg OwogICAgICAgIH0KCiAgICAgICAgZGVsZXRlIFtdIGJhc2U7CiAgICAgICAgYmFzZSA9IF9fbnVs bCA7CiAgICAgICAgYmFzZV9zaXplID0gMDsKCiAgICAgICAgUmVzZXQoKTsKCiAgICAgICAgcmV0 dXJuOwogICAgfQoKICAgICAKCiAgICBpbmxpbmUgVmFyaWFibGVTeW1ib2xBcnJheSAqTmV3VmFy aWFibGVTeW1ib2xBcnJheSh1bnNpZ25lZCBzaXplID0gMCkKICAgIHsKICAgICAgICByZXR1cm4g bmV3IChBbGxvYyhzaXplb2YoVmFyaWFibGVTeW1ib2xBcnJheSkpKSBWYXJpYWJsZVN5bWJvbEFy cmF5KChTdG9yYWdlUG9vbCAqKSB0aGlzLCBzaXplKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0QXJy YXk8TGV4U3RyZWFtOjpUb2tlbkluZGV4PiAqTmV3VG9rZW5JbmRleEFycmF5KHVuc2lnbmVkIHNp emUgPSAwKQogICAgewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVvZihBc3RBcnJheTxM ZXhTdHJlYW06OlRva2VuSW5kZXg+KSkpIEFzdEFycmF5PExleFN0cmVhbTo6VG9rZW5JbmRleD4o KFN0b3JhZ2VQb29sICopIHRoaXMsIHNpemUpOwogICAgfQoKICAgIGlubGluZSBBc3RBcnJheTxB c3QgKj4gKk5ld0FzdEFycmF5KHVuc2lnbmVkIHNpemUgPSAwKQogICAgewogICAgICAgIHJldHVy biBuZXcgKEFsbG9jKHNpemVvZihBc3RBcnJheTxBc3QgKj4pKSkgQXN0QXJyYXk8QXN0ICo+KChT dG9yYWdlUG9vbCAqKSB0aGlzLCBzaXplKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0QXJyYXk8Q2Fz ZUVsZW1lbnQgKj4gKk5ld0Nhc2VFbGVtZW50QXJyYXkodW5zaWduZWQgc2l6ZSA9IDApCiAgICB7 CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdEFycmF5PENhc2VFbGVtZW50ICo+ KSkpIEFzdEFycmF5PENhc2VFbGVtZW50ICo+KChTdG9yYWdlUG9vbCAqKSB0aGlzLCBzaXplKTsK ICAgIH0KCiAgICBpbmxpbmUgQXN0TGlzdE5vZGUgKk5ld0xpc3ROb2RlKCkKICAgIHsKICAgICAg ICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0TGlzdE5vZGUpKSkgQXN0TGlzdE5vZGUoKTsK ICAgIH0KCiAgICBpbmxpbmUgQXN0QmxvY2sgKk5ld0Jsb2NrKCkKICAgIHsKICAgICAgICByZXR1 cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0QmxvY2spKSkgQXN0QmxvY2soKFN0b3JhZ2VQb29sICop IHRoaXMpOwogICAgfQoKICAgIGlubGluZSBBc3RQcmltaXRpdmVUeXBlICpOZXdQcmltaXRpdmVU eXBlKEFzdDo6S2luZCBraW5kLCBMZXhTdHJlYW06OlRva2VuSW5kZXggdG9rZW4pCiAgICB7CiAg ICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdFByaW1pdGl2ZVR5cGUpKSkgQXN0UHJp bWl0aXZlVHlwZShraW5kLCB0b2tlbik7CiAgICB9CgogICAgaW5saW5lIEFzdEFycmF5VHlwZSAq TmV3QXJyYXlUeXBlKCkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0 QXJyYXlUeXBlKSkpIEFzdEFycmF5VHlwZSgoU3RvcmFnZVBvb2wgKikgdGhpcyk7CiAgICB9Cgog ICAgaW5saW5lIEFzdFNpbXBsZU5hbWUgKk5ld1NpbXBsZU5hbWUoTGV4U3RyZWFtOjpUb2tlbklu ZGV4IHRva2VuKQogICAgewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVvZihBc3RTaW1w bGVOYW1lKSkpIEFzdFNpbXBsZU5hbWUodG9rZW4pOwogICAgfQoKICAgIGlubGluZSBBc3RQYWNr YWdlRGVjbGFyYXRpb24gKk5ld1BhY2thZ2VEZWNsYXJhdGlvbigpCiAgICB7CiAgICAgICAgcmV0 dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdFBhY2thZ2VEZWNsYXJhdGlvbikpKSBBc3RQYWNrYWdl RGVjbGFyYXRpb24oKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0SW1wb3J0RGVjbGFyYXRpb24gKk5l d0ltcG9ydERlY2xhcmF0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXpl b2YoQXN0SW1wb3J0RGVjbGFyYXRpb24pKSkgQXN0SW1wb3J0RGVjbGFyYXRpb24oKTsKICAgIH0K CiAgICBpbmxpbmUgQXN0Q29tcGlsYXRpb25Vbml0ICpOZXdDb21waWxhdGlvblVuaXQoKQogICAg ewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVvZihBc3RDb21waWxhdGlvblVuaXQpKSkg QXN0Q29tcGlsYXRpb25Vbml0KChTdG9yYWdlUG9vbCAqKSB0aGlzKTsKICAgIH0KCiAgICBpbmxp bmUgQXN0TW9kaWZpZXIgKk5ld01vZGlmaWVyKEFzdDo6S2luZCBraW5kLCBMZXhTdHJlYW06OlRv a2VuSW5kZXggdG9rZW4pCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFz dE1vZGlmaWVyKSkpIEFzdE1vZGlmaWVyKGtpbmQsIHRva2VuKTsKICAgIH0KCiAgICBpbmxpbmUg QXN0RW1wdHlEZWNsYXJhdGlvbiAqTmV3RW1wdHlEZWNsYXJhdGlvbihMZXhTdHJlYW06OlRva2Vu SW5kZXggdG9rZW4pCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdEVt cHR5RGVjbGFyYXRpb24pKSkgQXN0RW1wdHlEZWNsYXJhdGlvbih0b2tlbik7CiAgICB9CgogICAg aW5saW5lIEFzdENsYXNzQm9keSAqTmV3Q2xhc3NCb2R5KCkKICAgIHsKICAgICAgICByZXR1cm4g bmV3IChBbGxvYyhzaXplb2YoQXN0Q2xhc3NCb2R5KSkpIEFzdENsYXNzQm9keSgoU3RvcmFnZVBv b2wgKikgdGhpcyk7CiAgICB9CgogICAgaW5saW5lIEFzdENsYXNzRGVjbGFyYXRpb24gKk5ld0Ns YXNzRGVjbGFyYXRpb24oKQogICAgewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVvZihB c3RDbGFzc0RlY2xhcmF0aW9uKSkpIEFzdENsYXNzRGVjbGFyYXRpb24oKFN0b3JhZ2VQb29sICop IHRoaXMpOwogICAgfQoKICAgIGlubGluZSBBc3RBcnJheUluaXRpYWxpemVyICpOZXdBcnJheUlu aXRpYWxpemVyKCkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0QXJy YXlJbml0aWFsaXplcikpKSBBc3RBcnJheUluaXRpYWxpemVyKChTdG9yYWdlUG9vbCAqKSB0aGlz KTsKICAgIH0KCiAgICBpbmxpbmUgQXN0QnJhY2tldHMgKk5ld0JyYWNrZXRzKExleFN0cmVhbTo6 VG9rZW5JbmRleCBsZWZ0LCBMZXhTdHJlYW06OlRva2VuSW5kZXggcmlnaHQpCiAgICB7CiAgICAg ICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdEJyYWNrZXRzKSkpIEFzdEJyYWNrZXRzKGxl ZnQsIHJpZ2h0KTsKICAgIH0KCiAgICBpbmxpbmUgQXN0VmFyaWFibGVEZWNsYXJhdG9ySWQgKk5l d1ZhcmlhYmxlRGVjbGFyYXRvcklkKCkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhz aXplb2YoQXN0VmFyaWFibGVEZWNsYXJhdG9ySWQpKSkgQXN0VmFyaWFibGVEZWNsYXJhdG9ySWQo KFN0b3JhZ2VQb29sICopIHRoaXMpOwogICAgfQoKICAgIGlubGluZSBBc3RWYXJpYWJsZURlY2xh cmF0b3IgKk5ld1ZhcmlhYmxlRGVjbGFyYXRvcigpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAo QWxsb2Moc2l6ZW9mKEFzdFZhcmlhYmxlRGVjbGFyYXRvcikpKSBBc3RWYXJpYWJsZURlY2xhcmF0 b3IoKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0RmllbGREZWNsYXJhdGlvbiAqTmV3RmllbGREZWNs YXJhdGlvbigpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdEZpZWxk RGVjbGFyYXRpb24pKSkgQXN0RmllbGREZWNsYXJhdGlvbigoU3RvcmFnZVBvb2wgKikgdGhpcyk7 CiAgICB9CgogICAgaW5saW5lIEFzdEZvcm1hbFBhcmFtZXRlciAqTmV3Rm9ybWFsUGFyYW1ldGVy KCkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0Rm9ybWFsUGFyYW1l dGVyKSkpIEFzdEZvcm1hbFBhcmFtZXRlcigoU3RvcmFnZVBvb2wgKikgdGhpcyk7CiAgICB9Cgog ICAgaW5saW5lIEFzdE1ldGhvZERlY2xhcmF0b3IgKk5ld01ldGhvZERlY2xhcmF0b3IoKQogICAg ewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVvZihBc3RNZXRob2REZWNsYXJhdG9yKSkp IEFzdE1ldGhvZERlY2xhcmF0b3IoKFN0b3JhZ2VQb29sICopIHRoaXMpOwogICAgfQoKICAgIGlu bGluZSBBc3RNZXRob2REZWNsYXJhdGlvbiAqTmV3TWV0aG9kRGVjbGFyYXRpb24oKQogICAgewog ICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVvZihBc3RNZXRob2REZWNsYXJhdGlvbikpKSBB c3RNZXRob2REZWNsYXJhdGlvbigoU3RvcmFnZVBvb2wgKikgdGhpcyk7CiAgICB9CgogICAgaW5s aW5lIEFzdFN0YXRpY0luaXRpYWxpemVyICpOZXdTdGF0aWNJbml0aWFsaXplcigpCiAgICB7CiAg ICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdFN0YXRpY0luaXRpYWxpemVyKSkpIEFz dFN0YXRpY0luaXRpYWxpemVyKCk7CiAgICB9CgogICAgaW5saW5lIEFzdFRoaXNDYWxsICpOZXdU aGlzQ2FsbCgpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdFRoaXND YWxsKSkpIEFzdFRoaXNDYWxsKChTdG9yYWdlUG9vbCAqKSB0aGlzKTsKICAgIH0KCiAgICBpbmxp bmUgQXN0U3VwZXJDYWxsICpOZXdTdXBlckNhbGwoKQogICAgewogICAgICAgIHJldHVybiBuZXcg KEFsbG9jKHNpemVvZihBc3RTdXBlckNhbGwpKSkgQXN0U3VwZXJDYWxsKChTdG9yYWdlUG9vbCAq KSB0aGlzKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0Q29uc3RydWN0b3JCbG9jayAqTmV3Q29uc3Ry dWN0b3JCbG9jaygpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdENv bnN0cnVjdG9yQmxvY2spKSkgQXN0Q29uc3RydWN0b3JCbG9jaygoU3RvcmFnZVBvb2wgKikgdGhp cyk7CiAgICB9CgogICAgaW5saW5lIEFzdENvbnN0cnVjdG9yRGVjbGFyYXRpb24gKk5ld0NvbnN0 cnVjdG9yRGVjbGFyYXRpb24oKQogICAgewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVv ZihBc3RDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSkpIEFzdENvbnN0cnVjdG9yRGVjbGFyYXRpb24o KFN0b3JhZ2VQb29sICopIHRoaXMpOwogICAgfQoKICAgIGlubGluZSBBc3RJbnRlcmZhY2VEZWNs YXJhdGlvbiAqTmV3SW50ZXJmYWNlRGVjbGFyYXRpb24oKQogICAgewogICAgICAgIHJldHVybiBu ZXcgKEFsbG9jKHNpemVvZihBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbikpKSBBc3RJbnRlcmZhY2VE ZWNsYXJhdGlvbigoU3RvcmFnZVBvb2wgKikgdGhpcyk7CiAgICB9CgogICAgaW5saW5lIEFzdExv Y2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCAqTmV3TG9jYWxWYXJpYWJsZURlY2xhcmF0 aW9uU3RhdGVtZW50KCkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0 TG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KSkpIEFzdExvY2FsVmFyaWFibGVEZWNs YXJhdGlvblN0YXRlbWVudCgoU3RvcmFnZVBvb2wgKikgdGhpcyk7CiAgICB9CgogICAgaW5saW5l IEFzdElmU3RhdGVtZW50ICpOZXdJZlN0YXRlbWVudCgpCiAgICB7CiAgICAgICAgcmV0dXJuIG5l dyAoQWxsb2Moc2l6ZW9mKEFzdElmU3RhdGVtZW50KSkpIEFzdElmU3RhdGVtZW50KChTdG9yYWdl UG9vbCAqKSB0aGlzKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0RW1wdHlTdGF0ZW1lbnQgKk5ld0Vt cHR5U3RhdGVtZW50KExleFN0cmVhbTo6VG9rZW5JbmRleCB0b2tlbikKICAgIHsKICAgICAgICBy ZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0RW1wdHlTdGF0ZW1lbnQpKSkgQXN0RW1wdHlTdGF0 ZW1lbnQoKFN0b3JhZ2VQb29sICopIHRoaXMsIHRva2VuKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0 RXhwcmVzc2lvblN0YXRlbWVudCAqTmV3RXhwcmVzc2lvblN0YXRlbWVudCgpCiAgICB7CiAgICAg ICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdEV4cHJlc3Npb25TdGF0ZW1lbnQpKSkgQXN0 RXhwcmVzc2lvblN0YXRlbWVudCgoU3RvcmFnZVBvb2wgKikgdGhpcyk7CiAgICB9CgogICAgaW5s aW5lIEFzdENhc2VMYWJlbCAqTmV3Q2FzZUxhYmVsKCkKICAgIHsKICAgICAgICByZXR1cm4gbmV3 IChBbGxvYyhzaXplb2YoQXN0Q2FzZUxhYmVsKSkpIEFzdENhc2VMYWJlbCgpOwogICAgfQoKICAg IGlubGluZSBBc3REZWZhdWx0TGFiZWwgKk5ld0RlZmF1bHRMYWJlbCgpCiAgICB7CiAgICAgICAg cmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdERlZmF1bHRMYWJlbCkpKSBBc3REZWZhdWx0TGFi ZWwoKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0U3dpdGNoQmxvY2tTdGF0ZW1lbnQgKk5ld1N3aXRj aEJsb2NrU3RhdGVtZW50KCkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2Yo QXN0U3dpdGNoQmxvY2tTdGF0ZW1lbnQpKSkgQXN0U3dpdGNoQmxvY2tTdGF0ZW1lbnQoKFN0b3Jh Z2VQb29sICopIHRoaXMpOwogICAgfQoKICAgIGlubGluZSBBc3RTd2l0Y2hTdGF0ZW1lbnQgKk5l d1N3aXRjaFN0YXRlbWVudCgpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9m KEFzdFN3aXRjaFN0YXRlbWVudCkpKSBBc3RTd2l0Y2hTdGF0ZW1lbnQoKFN0b3JhZ2VQb29sICop IHRoaXMpOwogICAgfQoKICAgIGlubGluZSBBc3RXaGlsZVN0YXRlbWVudCAqTmV3V2hpbGVTdGF0 ZW1lbnQoKQogICAgewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVvZihBc3RXaGlsZVN0 YXRlbWVudCkpKSBBc3RXaGlsZVN0YXRlbWVudCgoU3RvcmFnZVBvb2wgKikgdGhpcyk7CiAgICB9 CgogICAgaW5saW5lIEFzdERvU3RhdGVtZW50ICpOZXdEb1N0YXRlbWVudCgpCiAgICB7CiAgICAg ICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdERvU3RhdGVtZW50KSkpIEFzdERvU3RhdGVt ZW50KChTdG9yYWdlUG9vbCAqKSB0aGlzKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0Rm9yU3RhdGVt ZW50ICpOZXdGb3JTdGF0ZW1lbnQoKQogICAgewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNp emVvZihBc3RGb3JTdGF0ZW1lbnQpKSkgQXN0Rm9yU3RhdGVtZW50KChTdG9yYWdlUG9vbCAqKSB0 aGlzKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0QnJlYWtTdGF0ZW1lbnQgKk5ld0JyZWFrU3RhdGVt ZW50KCkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0QnJlYWtTdGF0 ZW1lbnQpKSkgQXN0QnJlYWtTdGF0ZW1lbnQoKFN0b3JhZ2VQb29sICopIHRoaXMpOwogICAgfQoK ICAgIGlubGluZSBBc3RDb250aW51ZVN0YXRlbWVudCAqTmV3Q29udGludWVTdGF0ZW1lbnQoKQog ICAgewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVvZihBc3RDb250aW51ZVN0YXRlbWVu dCkpKSBBc3RDb250aW51ZVN0YXRlbWVudCgoU3RvcmFnZVBvb2wgKikgdGhpcyk7CiAgICB9Cgog ICAgaW5saW5lIEFzdFJldHVyblN0YXRlbWVudCAqTmV3UmV0dXJuU3RhdGVtZW50KCkKICAgIHsK ICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0UmV0dXJuU3RhdGVtZW50KSkpIEFz dFJldHVyblN0YXRlbWVudCgoU3RvcmFnZVBvb2wgKikgdGhpcyk7CiAgICB9CgogICAgaW5saW5l IEFzdFRocm93U3RhdGVtZW50ICpOZXdUaHJvd1N0YXRlbWVudCgpCiAgICB7CiAgICAgICAgcmV0 dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdFRocm93U3RhdGVtZW50KSkpIEFzdFRocm93U3RhdGVt ZW50KChTdG9yYWdlUG9vbCAqKSB0aGlzKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0U3luY2hyb25p emVkU3RhdGVtZW50ICpOZXdTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoKQogICAgewogICAgICAgIHJl dHVybiBuZXcgKEFsbG9jKHNpemVvZihBc3RTeW5jaHJvbml6ZWRTdGF0ZW1lbnQpKSkgQXN0U3lu Y2hyb25pemVkU3RhdGVtZW50KChTdG9yYWdlUG9vbCAqKSB0aGlzKTsKICAgIH0KCiAgICBpbmxp bmUgQXN0Q2F0Y2hDbGF1c2UgKk5ld0NhdGNoQ2xhdXNlKCkKICAgIHsKICAgICAgICByZXR1cm4g bmV3IChBbGxvYyhzaXplb2YoQXN0Q2F0Y2hDbGF1c2UpKSkgQXN0Q2F0Y2hDbGF1c2UoKTsKICAg IH0KCiAgICBpbmxpbmUgQXN0RmluYWxseUNsYXVzZSAqTmV3RmluYWxseUNsYXVzZSgpCiAgICB7 CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdEZpbmFsbHlDbGF1c2UpKSkgQXN0 RmluYWxseUNsYXVzZSgpOwogICAgfQoKICAgIGlubGluZSBBc3RUcnlTdGF0ZW1lbnQgKk5ld1Ry eVN0YXRlbWVudCgpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdFRy eVN0YXRlbWVudCkpKSBBc3RUcnlTdGF0ZW1lbnQoKFN0b3JhZ2VQb29sICopIHRoaXMpOwogICAg fQoKICAgIGlubGluZSBBc3RJbnRlZ2VyTGl0ZXJhbCAqTmV3SW50ZWdlckxpdGVyYWwoTGV4U3Ry ZWFtOjpUb2tlbkluZGV4IHRva2VuKQogICAgewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNp emVvZihBc3RJbnRlZ2VyTGl0ZXJhbCkpKSBBc3RJbnRlZ2VyTGl0ZXJhbCh0b2tlbik7CiAgICB9 CgogICAgaW5saW5lIEFzdExvbmdMaXRlcmFsICpOZXdMb25nTGl0ZXJhbChMZXhTdHJlYW06OlRv a2VuSW5kZXggdG9rZW4pCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFz dExvbmdMaXRlcmFsKSkpIEFzdExvbmdMaXRlcmFsKHRva2VuKTsKICAgIH0KCiAgICBpbmxpbmUg QXN0RmxvYXRpbmdQb2ludExpdGVyYWwgKk5ld0Zsb2F0aW5nUG9pbnRMaXRlcmFsKExleFN0cmVh bTo6VG9rZW5JbmRleCB0b2tlbikKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXpl b2YoQXN0RmxvYXRpbmdQb2ludExpdGVyYWwpKSkgQXN0RmxvYXRpbmdQb2ludExpdGVyYWwodG9r ZW4pOwogICAgfQoKICAgIGlubGluZSBBc3REb3VibGVMaXRlcmFsICpOZXdEb3VibGVMaXRlcmFs KExleFN0cmVhbTo6VG9rZW5JbmRleCB0b2tlbikKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChB bGxvYyhzaXplb2YoQXN0RG91YmxlTGl0ZXJhbCkpKSBBc3REb3VibGVMaXRlcmFsKHRva2VuKTsK ICAgIH0KCiAgICBpbmxpbmUgQXN0VHJ1ZUxpdGVyYWwgKk5ld1RydWVMaXRlcmFsKExleFN0cmVh bTo6VG9rZW5JbmRleCB0b2tlbikKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXpl b2YoQXN0VHJ1ZUxpdGVyYWwpKSkgQXN0VHJ1ZUxpdGVyYWwodG9rZW4pOwogICAgfQoKICAgIGlu bGluZSBBc3RGYWxzZUxpdGVyYWwgKk5ld0ZhbHNlTGl0ZXJhbChMZXhTdHJlYW06OlRva2VuSW5k ZXggdG9rZW4pCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdEZhbHNl TGl0ZXJhbCkpKSBBc3RGYWxzZUxpdGVyYWwodG9rZW4pOwogICAgfQoKICAgIGlubGluZSBBc3RT dHJpbmdMaXRlcmFsICpOZXdTdHJpbmdMaXRlcmFsKExleFN0cmVhbTo6VG9rZW5JbmRleCB0b2tl bikKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0U3RyaW5nTGl0ZXJh bCkpKSBBc3RTdHJpbmdMaXRlcmFsKHRva2VuKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0Q2hhcmFj dGVyTGl0ZXJhbCAqTmV3Q2hhcmFjdGVyTGl0ZXJhbChMZXhTdHJlYW06OlRva2VuSW5kZXggdG9r ZW4pCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdENoYXJhY3Rlckxp dGVyYWwpKSkgQXN0Q2hhcmFjdGVyTGl0ZXJhbCh0b2tlbik7CiAgICB9CgogICAgaW5saW5lIEFz dE51bGxMaXRlcmFsICpOZXdOdWxsTGl0ZXJhbChMZXhTdHJlYW06OlRva2VuSW5kZXggdG9rZW4p CiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdE51bGxMaXRlcmFsKSkp IEFzdE51bGxMaXRlcmFsKHRva2VuKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0VGhpc0V4cHJlc3Np b24gKk5ld1RoaXNFeHByZXNzaW9uKExleFN0cmVhbTo6VG9rZW5JbmRleCB0b2tlbikKICAgIHsK ICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0VGhpc0V4cHJlc3Npb24pKSkgQXN0 VGhpc0V4cHJlc3Npb24odG9rZW4pOwogICAgfQoKICAgIGlubGluZSBBc3RTdXBlckV4cHJlc3Np b24gKk5ld1N1cGVyRXhwcmVzc2lvbihMZXhTdHJlYW06OlRva2VuSW5kZXggdG9rZW4pCiAgICB7 CiAgICAgICAgcmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdFN1cGVyRXhwcmVzc2lvbikpKSBB c3RTdXBlckV4cHJlc3Npb24odG9rZW4pOwogICAgfQoKICAgIGlubGluZSBBc3RQYXJlbnRoZXNp emVkRXhwcmVzc2lvbiAqTmV3UGFyZW50aGVzaXplZEV4cHJlc3Npb24oKQogICAgewogICAgICAg IHJldHVybiBuZXcgKEFsbG9jKHNpemVvZihBc3RQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikpKSBB c3RQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwogICAgfQoKICAgIGlubGluZSBBc3RUeXBlRXhw cmVzc2lvbiAqTmV3VHlwZUV4cHJlc3Npb24oQXN0ICp0eXBlKQogICAgewogICAgICAgIHJldHVy biBuZXcgKEFsbG9jKHNpemVvZihBc3RUeXBlRXhwcmVzc2lvbikpKSBBc3RUeXBlRXhwcmVzc2lv bih0eXBlKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVz c2lvbiAqTmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbigpCiAgICB7CiAgICAgICAg cmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Np b24pKSkgQXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbigoU3RvcmFnZVBvb2wgKikg dGhpcyk7CiAgICB9CgogICAgaW5saW5lIEFzdERpbUV4cHIgKk5ld0RpbUV4cHIoKQogICAgewog ICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVvZihBc3REaW1FeHByKSkpIEFzdERpbUV4cHIo KTsKICAgIH0KCiAgICBpbmxpbmUgQXN0QXJyYXlDcmVhdGlvbkV4cHJlc3Npb24gKk5ld0FycmF5 Q3JlYXRpb25FeHByZXNzaW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXpl b2YoQXN0QXJyYXlDcmVhdGlvbkV4cHJlc3Npb24pKSkgQXN0QXJyYXlDcmVhdGlvbkV4cHJlc3Np b24oKFN0b3JhZ2VQb29sICopIHRoaXMpOwogICAgfQoKICAgIGlubGluZSBBc3RGaWVsZEFjY2Vz cyAqTmV3RmllbGRBY2Nlc3MoQXN0RmllbGRBY2Nlc3M6OkZpZWxkQWNjZXNzVGFnIHRhZyA9IEFz dEZpZWxkQWNjZXNzOjpOT05FKQogICAgewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVv ZihBc3RGaWVsZEFjY2VzcykpKSBBc3RGaWVsZEFjY2Vzcyh0YWcpOwogICAgfQoKICAgIGlubGlu ZSBBc3RNZXRob2RJbnZvY2F0aW9uICpOZXdNZXRob2RJbnZvY2F0aW9uKCkKICAgIHsKICAgICAg ICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0TWV0aG9kSW52b2NhdGlvbikpKSBBc3RNZXRo b2RJbnZvY2F0aW9uKChTdG9yYWdlUG9vbCAqKSB0aGlzKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0 QXJyYXlBY2Nlc3MgKk5ld0FycmF5QWNjZXNzKCkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChB bGxvYyhzaXplb2YoQXN0QXJyYXlBY2Nlc3MpKSkgQXN0QXJyYXlBY2Nlc3MoKTsKICAgIH0KCiAg ICBpbmxpbmUgQXN0UG9zdFVuYXJ5RXhwcmVzc2lvbiAqTmV3UG9zdFVuYXJ5RXhwcmVzc2lvbihB c3RQb3N0VW5hcnlFeHByZXNzaW9uOjpQb3N0VW5hcnlFeHByZXNzaW9uVGFnIHRhZykKICAgIHsK ICAgICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0UG9zdFVuYXJ5RXhwcmVzc2lvbikp KSBBc3RQb3N0VW5hcnlFeHByZXNzaW9uKHRhZyk7CiAgICB9CgogICAgaW5saW5lIEFzdFByZVVu YXJ5RXhwcmVzc2lvbiAqTmV3UHJlVW5hcnlFeHByZXNzaW9uKEFzdFByZVVuYXJ5RXhwcmVzc2lv bjo6UHJlVW5hcnlFeHByZXNzaW9uVGFnIHRhZykKICAgIHsKICAgICAgICByZXR1cm4gbmV3IChB bGxvYyhzaXplb2YoQXN0UHJlVW5hcnlFeHByZXNzaW9uKSkpIEFzdFByZVVuYXJ5RXhwcmVzc2lv bih0YWcpOwogICAgfQoKICAgIGlubGluZSBBc3RDYXN0RXhwcmVzc2lvbiAqTmV3Q2FzdEV4cHJl c3Npb24oKQogICAgewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVvZihBc3RDYXN0RXhw cmVzc2lvbikpKSBBc3RDYXN0RXhwcmVzc2lvbigoU3RvcmFnZVBvb2wgKikgdGhpcyk7CiAgICB9 CgogICAgaW5saW5lIEFzdEJpbmFyeUV4cHJlc3Npb24gKk5ld0JpbmFyeUV4cHJlc3Npb24oQXN0 QmluYXJ5RXhwcmVzc2lvbjo6QmluYXJ5RXhwcmVzc2lvblRhZyB0YWcpCiAgICB7CiAgICAgICAg cmV0dXJuIG5ldyAoQWxsb2Moc2l6ZW9mKEFzdEJpbmFyeUV4cHJlc3Npb24pKSkgQXN0QmluYXJ5 RXhwcmVzc2lvbih0YWcpOwogICAgfQoKICAgIGlubGluZSBBc3RDb25kaXRpb25hbEV4cHJlc3Np b24gKk5ld0NvbmRpdGlvbmFsRXhwcmVzc2lvbigpCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyAo QWxsb2Moc2l6ZW9mKEFzdENvbmRpdGlvbmFsRXhwcmVzc2lvbikpKSBBc3RDb25kaXRpb25hbEV4 cHJlc3Npb24oKTsKICAgIH0KCiAgICBpbmxpbmUgQXN0QXNzaWdubWVudEV4cHJlc3Npb24gKk5l d0Fzc2lnbm1lbnRFeHByZXNzaW9uKEFzdEFzc2lnbm1lbnRFeHByZXNzaW9uOjpBc3NpZ25tZW50 RXhwcmVzc2lvblRhZyB0YWcsIExleFN0cmVhbTo6VG9rZW5JbmRleCB0b2tlbikKICAgIHsKICAg ICAgICByZXR1cm4gbmV3IChBbGxvYyhzaXplb2YoQXN0QXNzaWdubWVudEV4cHJlc3Npb24pKSkg QXN0QXNzaWdubWVudEV4cHJlc3Npb24odGFnLCB0b2tlbik7CiAgICB9CgogICAgIAoKICAgICAK ICAgICAKICAgICAKICAgICAKICAgICAKICAgIGlubGluZSBDYXNlRWxlbWVudCAqR2VuQ2FzZUVs ZW1lbnQoKQogICAgewogICAgICAgIHJldHVybiBuZXcgKEFsbG9jKHNpemVvZihDYXNlRWxlbWVu dCkpKSBDYXNlRWxlbWVudCgpOwogICAgfQoKICAgIGlubGluZSBBc3RCbG9jayAqR2VuQmxvY2so KQogICAgewogICAgICAgIEFzdEJsb2NrICpwID0gTmV3QmxvY2soKTsKICAgICAgICBwIC0+IGdl bmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdFByaW1p dGl2ZVR5cGUgKkdlblByaW1pdGl2ZVR5cGUoQXN0OjpLaW5kIGtpbmQsIExleFN0cmVhbTo6VG9r ZW5JbmRleCB0b2tlbikKICAgIHsKICAgICAgICBBc3RQcmltaXRpdmVUeXBlICpwID0gTmV3UHJp bWl0aXZlVHlwZShraW5kLCB0b2tlbik7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAg ICAgIHJldHVybiBwOwogICAgfQoKICAgIGlubGluZSBBc3RBcnJheVR5cGUgKkdlbkFycmF5VHlw ZSgpCiAgICB7CiAgICAgICAgQXN0QXJyYXlUeXBlICpwID0gTmV3QXJyYXlUeXBlKCk7CiAgICAg ICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJldHVybiBwOwogICAgfQoKICAgIGlubGlu ZSBBc3RTaW1wbGVOYW1lICpHZW5TaW1wbGVOYW1lKExleFN0cmVhbTo6VG9rZW5JbmRleCB0b2tl bikKICAgIHsKICAgICAgICBBc3RTaW1wbGVOYW1lICpwID0gTmV3U2ltcGxlTmFtZSh0b2tlbik7 CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJldHVybiBwOwogICAgfQoKICAg IGlubGluZSBBc3RQYWNrYWdlRGVjbGFyYXRpb24gKkdlblBhY2thZ2VEZWNsYXJhdGlvbigpCiAg ICB7CiAgICAgICAgQXN0UGFja2FnZURlY2xhcmF0aW9uICpwID0gTmV3UGFja2FnZURlY2xhcmF0 aW9uKCk7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJldHVybiBwOwogICAg fQoKICAgIGlubGluZSBBc3RJbXBvcnREZWNsYXJhdGlvbiAqR2VuSW1wb3J0RGVjbGFyYXRpb24o KQogICAgewogICAgICAgIEFzdEltcG9ydERlY2xhcmF0aW9uICpwID0gTmV3SW1wb3J0RGVjbGFy YXRpb24oKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAg ICB9CgogICAgaW5saW5lIEFzdENvbXBpbGF0aW9uVW5pdCAqR2VuQ29tcGlsYXRpb25Vbml0KCkK ICAgIHsKICAgICAgICBBc3RDb21waWxhdGlvblVuaXQgKnAgPSBOZXdDb21waWxhdGlvblVuaXQo KTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9Cgog ICAgaW5saW5lIEFzdE1vZGlmaWVyICpHZW5Nb2RpZmllcihBc3Q6OktpbmQga2luZCwgTGV4U3Ry ZWFtOjpUb2tlbkluZGV4IHRva2VuKQogICAgewogICAgICAgIEFzdE1vZGlmaWVyICpwID0gTmV3 TW9kaWZpZXIoa2luZCwgdG9rZW4pOwogICAgICAgIHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAg ICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUgQXN0RW1wdHlEZWNsYXJhdGlvbiAqR2VuRW1w dHlEZWNsYXJhdGlvbihMZXhTdHJlYW06OlRva2VuSW5kZXggdG9rZW4pCiAgICB7CiAgICAgICAg QXN0RW1wdHlEZWNsYXJhdGlvbiAqcCA9IE5ld0VtcHR5RGVjbGFyYXRpb24odG9rZW4pOwogICAg ICAgIHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxp bmUgQXN0Q2xhc3NCb2R5ICpHZW5DbGFzc0JvZHkoKQogICAgewogICAgICAgIEFzdENsYXNzQm9k eSAqcCA9IE5ld0NsYXNzQm9keSgpOwogICAgICAgIHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAg ICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUgQXN0Q2xhc3NEZWNsYXJhdGlvbiAqR2VuQ2xh c3NEZWNsYXJhdGlvbigpCiAgICB7CiAgICAgICAgQXN0Q2xhc3NEZWNsYXJhdGlvbiAqcCA9IE5l d0NsYXNzRGVjbGFyYXRpb24oKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAg cmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdEFycmF5SW5pdGlhbGl6ZXIgKkdlbkFycmF5 SW5pdGlhbGl6ZXIoKQogICAgewogICAgICAgIEFzdEFycmF5SW5pdGlhbGl6ZXIgKnAgPSBOZXdB cnJheUluaXRpYWxpemVyKCk7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJl dHVybiBwOwogICAgfQoKICAgIGlubGluZSBBc3RCcmFja2V0cyAqR2VuQnJhY2tldHMoTGV4U3Ry ZWFtOjpUb2tlbkluZGV4IGxlZnQsIExleFN0cmVhbTo6VG9rZW5JbmRleCByaWdodCkKICAgIHsK ICAgICAgICBBc3RCcmFja2V0cyAqcCA9IE5ld0JyYWNrZXRzKGxlZnQsIHJpZ2h0KTsKICAgICAg ICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5l IEFzdFZhcmlhYmxlRGVjbGFyYXRvcklkICpHZW5WYXJpYWJsZURlY2xhcmF0b3JJZCgpCiAgICB7 CiAgICAgICAgQXN0VmFyaWFibGVEZWNsYXJhdG9ySWQgKnAgPSBOZXdWYXJpYWJsZURlY2xhcmF0 b3JJZCgpOwogICAgICAgIHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAg IH0KCiAgICBpbmxpbmUgQXN0VmFyaWFibGVEZWNsYXJhdG9yICpHZW5WYXJpYWJsZURlY2xhcmF0 b3IoKQogICAgewogICAgICAgIEFzdFZhcmlhYmxlRGVjbGFyYXRvciAqcCA9IE5ld1ZhcmlhYmxl RGVjbGFyYXRvcigpOwogICAgICAgIHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4g cDsKICAgIH0KCiAgICBpbmxpbmUgQXN0RmllbGREZWNsYXJhdGlvbiAqR2VuRmllbGREZWNsYXJh dGlvbigpCiAgICB7CiAgICAgICAgQXN0RmllbGREZWNsYXJhdGlvbiAqcCA9IE5ld0ZpZWxkRGVj bGFyYXRpb24oKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7 CiAgICB9CgogICAgaW5saW5lIEFzdEZvcm1hbFBhcmFtZXRlciAqR2VuRm9ybWFsUGFyYW1ldGVy KCkKICAgIHsKICAgICAgICBBc3RGb3JtYWxQYXJhbWV0ZXIgKnAgPSBOZXdGb3JtYWxQYXJhbWV0 ZXIoKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9 CgogICAgaW5saW5lIEFzdE1ldGhvZERlY2xhcmF0b3IgKkdlbk1ldGhvZERlY2xhcmF0b3IoKQog ICAgewogICAgICAgIEFzdE1ldGhvZERlY2xhcmF0b3IgKnAgPSBOZXdNZXRob2REZWNsYXJhdG9y KCk7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJldHVybiBwOwogICAgfQoK ICAgIGlubGluZSBBc3RNZXRob2REZWNsYXJhdGlvbiAqR2VuTWV0aG9kRGVjbGFyYXRpb24oKQog ICAgewogICAgICAgIEFzdE1ldGhvZERlY2xhcmF0aW9uICpwID0gTmV3TWV0aG9kRGVjbGFyYXRp b24oKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9 CgogICAgaW5saW5lIEFzdFN0YXRpY0luaXRpYWxpemVyICpHZW5TdGF0aWNJbml0aWFsaXplcigp CiAgICB7CiAgICAgICAgQXN0U3RhdGljSW5pdGlhbGl6ZXIgKnAgPSBOZXdTdGF0aWNJbml0aWFs aXplcigpOwogICAgICAgIHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAg IH0KCiAgICBpbmxpbmUgQXN0VGhpc0NhbGwgKkdlblRoaXNDYWxsKCkKICAgIHsKICAgICAgICBB c3RUaGlzQ2FsbCAqcCA9IE5ld1RoaXNDYWxsKCk7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAx OwogICAgICAgIHJldHVybiBwOwogICAgfQoKICAgIGlubGluZSBBc3RTdXBlckNhbGwgKkdlblN1 cGVyQ2FsbCgpCiAgICB7CiAgICAgICAgQXN0U3VwZXJDYWxsICpwID0gTmV3U3VwZXJDYWxsKCk7 CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJldHVybiBwOwogICAgfQoKICAg IGlubGluZSBBc3RDb25zdHJ1Y3RvckJsb2NrICpHZW5Db25zdHJ1Y3RvckJsb2NrKCkKICAgIHsK ICAgICAgICBBc3RDb25zdHJ1Y3RvckJsb2NrICpwID0gTmV3Q29uc3RydWN0b3JCbG9jaygpOwog ICAgICAgIHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBp bmxpbmUgQXN0Q29uc3RydWN0b3JEZWNsYXJhdGlvbiAqR2VuQ29uc3RydWN0b3JEZWNsYXJhdGlv bigpCiAgICB7CiAgICAgICAgQXN0Q29uc3RydWN0b3JEZWNsYXJhdGlvbiAqcCA9IE5ld0NvbnN0 cnVjdG9yRGVjbGFyYXRpb24oKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAg cmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdEludGVyZmFjZURlY2xhcmF0aW9uICpHZW5J bnRlcmZhY2VEZWNsYXJhdGlvbigpCiAgICB7CiAgICAgICAgQXN0SW50ZXJmYWNlRGVjbGFyYXRp b24gKnAgPSBOZXdJbnRlcmZhY2VEZWNsYXJhdGlvbigpOwogICAgICAgIHAgLT4gZ2VuZXJhdGVk ID0gMTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUgQXN0TG9jYWxWYXJpYWJs ZURlY2xhcmF0aW9uU3RhdGVtZW50ICpHZW5Mb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1l bnQoKQogICAgewogICAgICAgIEFzdExvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCAq cCA9IE5ld0xvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCgpOwogICAgICAgIHAgLT4g Z2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUgQXN0SWZT dGF0ZW1lbnQgKkdlbklmU3RhdGVtZW50KCkKICAgIHsKICAgICAgICBBc3RJZlN0YXRlbWVudCAq cCA9IE5ld0lmU3RhdGVtZW50KCk7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAg IHJldHVybiBwOwogICAgfQoKICAgIGlubGluZSBBc3RFbXB0eVN0YXRlbWVudCAqR2VuRW1wdHlT dGF0ZW1lbnQoTGV4U3RyZWFtOjpUb2tlbkluZGV4IHRva2VuKQogICAgewogICAgICAgIEFzdEVt cHR5U3RhdGVtZW50ICpwID0gTmV3RW1wdHlTdGF0ZW1lbnQodG9rZW4pOwogICAgICAgIHAgLT4g Z2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUgQXN0RXhw cmVzc2lvblN0YXRlbWVudCAqR2VuRXhwcmVzc2lvblN0YXRlbWVudCgpCiAgICB7CiAgICAgICAg QXN0RXhwcmVzc2lvblN0YXRlbWVudCAqcCA9IE5ld0V4cHJlc3Npb25TdGF0ZW1lbnQoKTsKICAg ICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5s aW5lIEFzdENhc2VMYWJlbCAqR2VuQ2FzZUxhYmVsKCkKICAgIHsKICAgICAgICBBc3RDYXNlTGFi ZWwgKnAgPSBOZXdDYXNlTGFiZWwoKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAg ICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdERlZmF1bHRMYWJlbCAqR2VuRGVmYXVs dExhYmVsKCkKICAgIHsKICAgICAgICBBc3REZWZhdWx0TGFiZWwgKnAgPSBOZXdEZWZhdWx0TGFi ZWwoKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9 CgogICAgaW5saW5lIEFzdFN3aXRjaEJsb2NrU3RhdGVtZW50ICpHZW5Td2l0Y2hCbG9ja1N0YXRl bWVudCgpCiAgICB7CiAgICAgICAgQXN0U3dpdGNoQmxvY2tTdGF0ZW1lbnQgKnAgPSBOZXdTd2l0 Y2hCbG9ja1N0YXRlbWVudCgpOwogICAgICAgIHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICBy ZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUgQXN0U3dpdGNoU3RhdGVtZW50ICpHZW5Td2l0Y2hT dGF0ZW1lbnQoKQogICAgewogICAgICAgIEFzdFN3aXRjaFN0YXRlbWVudCAqcCA9IE5ld1N3aXRj aFN0YXRlbWVudCgpOwogICAgICAgIHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4g cDsKICAgIH0KCiAgICBpbmxpbmUgQXN0V2hpbGVTdGF0ZW1lbnQgKkdlbldoaWxlU3RhdGVtZW50 KCkKICAgIHsKICAgICAgICBBc3RXaGlsZVN0YXRlbWVudCAqcCA9IE5ld1doaWxlU3RhdGVtZW50 KCk7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJldHVybiBwOwogICAgfQoK ICAgIGlubGluZSBBc3REb1N0YXRlbWVudCAqR2VuRG9TdGF0ZW1lbnQoKQogICAgewogICAgICAg IEFzdERvU3RhdGVtZW50ICpwID0gTmV3RG9TdGF0ZW1lbnQoKTsKICAgICAgICBwIC0+IGdlbmVy YXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdEZvclN0YXRl bWVudCAqR2VuRm9yU3RhdGVtZW50KCkKICAgIHsKICAgICAgICBBc3RGb3JTdGF0ZW1lbnQgKnAg PSBOZXdGb3JTdGF0ZW1lbnQoKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAg cmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdEJyZWFrU3RhdGVtZW50ICpHZW5CcmVha1N0 YXRlbWVudCgpCiAgICB7CiAgICAgICAgQXN0QnJlYWtTdGF0ZW1lbnQgKnAgPSBOZXdCcmVha1N0 YXRlbWVudCgpOwogICAgICAgIHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsK ICAgIH0KCiAgICBpbmxpbmUgQXN0Q29udGludWVTdGF0ZW1lbnQgKkdlbkNvbnRpbnVlU3RhdGVt ZW50KCkKICAgIHsKICAgICAgICBBc3RDb250aW51ZVN0YXRlbWVudCAqcCA9IE5ld0NvbnRpbnVl U3RhdGVtZW50KCk7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJldHVybiBw OwogICAgfQoKICAgIGlubGluZSBBc3RSZXR1cm5TdGF0ZW1lbnQgKkdlblJldHVyblN0YXRlbWVu dCgpCiAgICB7CiAgICAgICAgQXN0UmV0dXJuU3RhdGVtZW50ICpwID0gTmV3UmV0dXJuU3RhdGVt ZW50KCk7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJldHVybiBwOwogICAg fQoKICAgIGlubGluZSBBc3RUaHJvd1N0YXRlbWVudCAqR2VuVGhyb3dTdGF0ZW1lbnQoKQogICAg ewogICAgICAgIEFzdFRocm93U3RhdGVtZW50ICpwID0gTmV3VGhyb3dTdGF0ZW1lbnQoKTsKICAg ICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5s aW5lIEFzdFN5bmNocm9uaXplZFN0YXRlbWVudCAqR2VuU3luY2hyb25pemVkU3RhdGVtZW50KCkK ICAgIHsKICAgICAgICBBc3RTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgKnAgPSBOZXdTeW5jaHJvbml6 ZWRTdGF0ZW1lbnQoKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJu IHA7CiAgICB9CgogICAgaW5saW5lIEFzdENhdGNoQ2xhdXNlICpHZW5DYXRjaENsYXVzZSgpCiAg ICB7CiAgICAgICAgQXN0Q2F0Y2hDbGF1c2UgKnAgPSBOZXdDYXRjaENsYXVzZSgpOwogICAgICAg IHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUg QXN0RmluYWxseUNsYXVzZSAqR2VuRmluYWxseUNsYXVzZSgpCiAgICB7CiAgICAgICAgQXN0Rmlu YWxseUNsYXVzZSAqcCA9IE5ld0ZpbmFsbHlDbGF1c2UoKTsKICAgICAgICBwIC0+IGdlbmVyYXRl ZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdFRyeVN0YXRlbWVu dCAqR2VuVHJ5U3RhdGVtZW50KCkKICAgIHsKICAgICAgICBBc3RUcnlTdGF0ZW1lbnQgKnAgPSBO ZXdUcnlTdGF0ZW1lbnQoKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0 dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdEludGVnZXJMaXRlcmFsICpHZW5JbnRlZ2VyTGl0 ZXJhbChMZXhTdHJlYW06OlRva2VuSW5kZXggdG9rZW4pCiAgICB7CiAgICAgICAgQXN0SW50ZWdl ckxpdGVyYWwgKnAgPSBOZXdJbnRlZ2VyTGl0ZXJhbCh0b2tlbik7CiAgICAgICAgcCAtPiBnZW5l cmF0ZWQgPSAxOwogICAgICAgIHJldHVybiBwOwogICAgfQoKICAgIGlubGluZSBBc3RMb25nTGl0 ZXJhbCAqR2VuTG9uZ0xpdGVyYWwoTGV4U3RyZWFtOjpUb2tlbkluZGV4IHRva2VuKQogICAgewog ICAgICAgIEFzdExvbmdMaXRlcmFsICpwID0gTmV3TG9uZ0xpdGVyYWwodG9rZW4pOwogICAgICAg IHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUg QXN0RmxvYXRpbmdQb2ludExpdGVyYWwgKkdlbkZsb2F0aW5nUG9pbnRMaXRlcmFsKExleFN0cmVh bTo6VG9rZW5JbmRleCB0b2tlbikKICAgIHsKICAgICAgICBBc3RGbG9hdGluZ1BvaW50TGl0ZXJh bCAqcCA9IE5ld0Zsb2F0aW5nUG9pbnRMaXRlcmFsKHRva2VuKTsKICAgICAgICBwIC0+IGdlbmVy YXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdERvdWJsZUxp dGVyYWwgKkdlbkRvdWJsZUxpdGVyYWwoTGV4U3RyZWFtOjpUb2tlbkluZGV4IHRva2VuKQogICAg ewogICAgICAgIEFzdERvdWJsZUxpdGVyYWwgKnAgPSBOZXdEb3VibGVMaXRlcmFsKHRva2VuKTsK ICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAg aW5saW5lIEFzdFRydWVMaXRlcmFsICpHZW5UcnVlTGl0ZXJhbChMZXhTdHJlYW06OlRva2VuSW5k ZXggdG9rZW4pCiAgICB7CiAgICAgICAgQXN0VHJ1ZUxpdGVyYWwgKnAgPSBOZXdUcnVlTGl0ZXJh bCh0b2tlbik7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJldHVybiBwOwog ICAgfQoKICAgIGlubGluZSBBc3RGYWxzZUxpdGVyYWwgKkdlbkZhbHNlTGl0ZXJhbChMZXhTdHJl YW06OlRva2VuSW5kZXggdG9rZW4pCiAgICB7CiAgICAgICAgQXN0RmFsc2VMaXRlcmFsICpwID0g TmV3RmFsc2VMaXRlcmFsKHRva2VuKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAg ICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdFN0cmluZ0xpdGVyYWwgKkdlblN0cmlu Z0xpdGVyYWwoTGV4U3RyZWFtOjpUb2tlbkluZGV4IHRva2VuKQogICAgewogICAgICAgIEFzdFN0 cmluZ0xpdGVyYWwgKnAgPSBOZXdTdHJpbmdMaXRlcmFsKHRva2VuKTsKICAgICAgICBwIC0+IGdl bmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdENoYXJh Y3RlckxpdGVyYWwgKkdlbkNoYXJhY3RlckxpdGVyYWwoTGV4U3RyZWFtOjpUb2tlbkluZGV4IHRv a2VuKQogICAgewogICAgICAgIEFzdENoYXJhY3RlckxpdGVyYWwgKnAgPSBOZXdDaGFyYWN0ZXJM aXRlcmFsKHRva2VuKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJu IHA7CiAgICB9CgogICAgaW5saW5lIEFzdE51bGxMaXRlcmFsICpHZW5OdWxsTGl0ZXJhbChMZXhT dHJlYW06OlRva2VuSW5kZXggdG9rZW4pCiAgICB7CiAgICAgICAgQXN0TnVsbExpdGVyYWwgKnAg PSBOZXdOdWxsTGl0ZXJhbCh0b2tlbik7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAg ICAgIHJldHVybiBwOwogICAgfQoKICAgIGlubGluZSBBc3RUaGlzRXhwcmVzc2lvbiAqR2VuVGhp c0V4cHJlc3Npb24oTGV4U3RyZWFtOjpUb2tlbkluZGV4IHRva2VuKQogICAgewogICAgICAgIEFz dFRoaXNFeHByZXNzaW9uICpwID0gTmV3VGhpc0V4cHJlc3Npb24odG9rZW4pOwogICAgICAgIHAg LT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUgQXN0 U3VwZXJFeHByZXNzaW9uICpHZW5TdXBlckV4cHJlc3Npb24oTGV4U3RyZWFtOjpUb2tlbkluZGV4 IHRva2VuKQogICAgewogICAgICAgIEFzdFN1cGVyRXhwcmVzc2lvbiAqcCA9IE5ld1N1cGVyRXhw cmVzc2lvbih0b2tlbik7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJldHVy biBwOwogICAgfQoKICAgIGlubGluZSBBc3RQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiAqR2VuUGFy ZW50aGVzaXplZEV4cHJlc3Npb24oKQogICAgewogICAgICAgIEFzdFBhcmVudGhlc2l6ZWRFeHBy ZXNzaW9uICpwID0gTmV3UGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKICAgICAgICBwIC0+IGdl bmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdFR5cGVF eHByZXNzaW9uICpHZW5UeXBlRXhwcmVzc2lvbihBc3QgKnR5cGUpCiAgICB7CiAgICAgICAgQXN0 VHlwZUV4cHJlc3Npb24gKnAgPSBOZXdUeXBlRXhwcmVzc2lvbih0eXBlKTsKICAgICAgICBwIC0+ IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFzdENs YXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gKkdlbkNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4 cHJlc3Npb24oKQogICAgewogICAgICAgIEFzdENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Np b24gKnAgPSBOZXdDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uKCk7CiAgICAgICAgcCAt PiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJldHVybiBwOwogICAgfQoKICAgIGlubGluZSBBc3RE aW1FeHByICpHZW5EaW1FeHByKCkKICAgIHsKICAgICAgICBBc3REaW1FeHByICpwID0gTmV3RGlt RXhwcigpOwogICAgICAgIHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAg IH0KCiAgICBpbmxpbmUgQXN0QXJyYXlDcmVhdGlvbkV4cHJlc3Npb24gKkdlbkFycmF5Q3JlYXRp b25FeHByZXNzaW9uKCkKICAgIHsKICAgICAgICBBc3RBcnJheUNyZWF0aW9uRXhwcmVzc2lvbiAq cCA9IE5ld0FycmF5Q3JlYXRpb25FeHByZXNzaW9uKCk7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQg PSAxOwogICAgICAgIHJldHVybiBwOwogICAgfQoKICAgIGlubGluZSBBc3RGaWVsZEFjY2VzcyAq R2VuRmllbGRBY2Nlc3MoQXN0RmllbGRBY2Nlc3M6OkZpZWxkQWNjZXNzVGFnIHRhZyA9IEFzdEZp ZWxkQWNjZXNzOjpOT05FKQogICAgewogICAgICAgIEFzdEZpZWxkQWNjZXNzICpwID0gTmV3Rmll bGRBY2Nlc3ModGFnKTsKICAgICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJu IHA7CiAgICB9CgogICAgaW5saW5lIEFzdE1ldGhvZEludm9jYXRpb24gKkdlbk1ldGhvZEludm9j YXRpb24oKQogICAgewogICAgICAgIEFzdE1ldGhvZEludm9jYXRpb24gKnAgPSBOZXdNZXRob2RJ bnZvY2F0aW9uKCk7CiAgICAgICAgcCAtPiBnZW5lcmF0ZWQgPSAxOwogICAgICAgIHJldHVybiBw OwogICAgfQoKICAgIGlubGluZSBBc3RBcnJheUFjY2VzcyAqR2VuQXJyYXlBY2Nlc3MoKQogICAg ewogICAgICAgIEFzdEFycmF5QWNjZXNzICpwID0gTmV3QXJyYXlBY2Nlc3MoKTsKICAgICAgICBw IC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5saW5lIEFz dFBvc3RVbmFyeUV4cHJlc3Npb24gKkdlblBvc3RVbmFyeUV4cHJlc3Npb24oQXN0UG9zdFVuYXJ5 RXhwcmVzc2lvbjo6UG9zdFVuYXJ5RXhwcmVzc2lvblRhZyB0YWcpCiAgICB7CiAgICAgICAgQXN0 UG9zdFVuYXJ5RXhwcmVzc2lvbiAqcCA9IE5ld1Bvc3RVbmFyeUV4cHJlc3Npb24odGFnKTsKICAg ICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5s aW5lIEFzdFByZVVuYXJ5RXhwcmVzc2lvbiAqR2VuUHJlVW5hcnlFeHByZXNzaW9uKEFzdFByZVVu YXJ5RXhwcmVzc2lvbjo6UHJlVW5hcnlFeHByZXNzaW9uVGFnIHRhZykKICAgIHsKICAgICAgICBB c3RQcmVVbmFyeUV4cHJlc3Npb24gKnAgPSBOZXdQcmVVbmFyeUV4cHJlc3Npb24odGFnKTsKICAg ICAgICBwIC0+IGdlbmVyYXRlZCA9IDE7CiAgICAgICAgcmV0dXJuIHA7CiAgICB9CgogICAgaW5s aW5lIEFzdENhc3RFeHByZXNzaW9uICpHZW5DYXN0RXhwcmVzc2lvbigpCiAgICB7CiAgICAgICAg QXN0Q2FzdEV4cHJlc3Npb24gKnAgPSBOZXdDYXN0RXhwcmVzc2lvbigpOwogICAgICAgIHAgLT4g Z2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUgQXN0Qmlu YXJ5RXhwcmVzc2lvbiAqR2VuQmluYXJ5RXhwcmVzc2lvbihBc3RCaW5hcnlFeHByZXNzaW9uOjpC aW5hcnlFeHByZXNzaW9uVGFnIHRhZykKICAgIHsKICAgICAgICBBc3RCaW5hcnlFeHByZXNzaW9u ICpwID0gTmV3QmluYXJ5RXhwcmVzc2lvbih0YWcpOwogICAgICAgIHAgLT4gZ2VuZXJhdGVkID0g MTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUgQXN0Q29uZGl0aW9uYWxFeHBy ZXNzaW9uICpHZW5Db25kaXRpb25hbEV4cHJlc3Npb24oKQogICAgewogICAgICAgIEFzdENvbmRp dGlvbmFsRXhwcmVzc2lvbiAqcCA9IE5ld0NvbmRpdGlvbmFsRXhwcmVzc2lvbigpOwogICAgICAg IHAgLT4gZ2VuZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUg QXN0QXNzaWdubWVudEV4cHJlc3Npb24gKkdlbkFzc2lnbm1lbnRFeHByZXNzaW9uKEFzdEFzc2ln bm1lbnRFeHByZXNzaW9uOjpBc3NpZ25tZW50RXhwcmVzc2lvblRhZyB0YWcsIExleFN0cmVhbTo6 VG9rZW5JbmRleCB0b2tlbikKICAgIHsKICAgICAgICBBc3RBc3NpZ25tZW50RXhwcmVzc2lvbiAq cCA9IE5ld0Fzc2lnbm1lbnRFeHByZXNzaW9uKHRhZywgdG9rZW4pOwogICAgICAgIHAgLT4gZ2Vu ZXJhdGVkID0gMTsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICAgCgogICAgIAogICAgIAog ICAgIAogICAgc2l6ZV90IFNwYWNlQWxsb2NhdGVkKHZvaWQpCiAgICB7CiAgICAgICAgcmV0dXJu ICgoYmFzZV9zaXplICogc2l6ZW9mKENlbGwgKiopKSArIChzaXplICogc2l6ZW9mKENlbGwpKSk7 CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAgc2l6ZV90IFNwYWNlVXNlZCh2b2lkKQogICAg ewogICAgICAgIHJldHVybiAoKChzaXplID4+IGxvZ19ibGtzaXplKSAqIHNpemVvZihDZWxsICoq KSkgKyAodG9wICogc2l6ZW9mKENlbGwpKSk7CiAgICB9Cn07CgoKIAogCiAKIAogCiAKIAogCiAK IAoKCgoKCnRlbXBsYXRlIDxjbGFzcyBUTywgY2xhc3MgRlJPTT4KVE8gRFlOQU1JQ19DQVNUKEZS T00gZikgewoKCgogICAgIAogICAgaWYgKCFmKSByZXR1cm4gKFRPKSBfX251bGwgOwogICAgVE8g cHRyID0gZHluYW1pY19jYXN0PFRPPiAoZik7CgogICAgaWYgKCEgcHRyKSB7CgoKCgoKICAgICAg ICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIHB0ciAmJiAiRmFpbGVkIGR5bmFtaWNfY2FzdDw+IGlu IERZTkFNSUNfQ0FTVCIgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInB0ciAmJiBcIkZhaWxlZCBk eW5hbWljX2Nhc3Q8PiBpbiBEWU5BTUlDX0NBU1RcIiIgLCAiLi4vLi4vamlrZXMvc3JjL2FzdC5o IiwgNTIxNSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKICAgIH0KICAgIHJldHVybiBw dHI7Cgp9CgoKIAogCiAKCmlubGluZSBBc3RTdGF0ZW1lbnQgKkFzdDo6U3RhdGVtZW50Q2FzdCgp CnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0U3RhdGVtZW50ICosIEFzdCAqPgogICAgICAg IChjbGFzc190YWcgPT0gU1RBVEVNRU5UID8gdGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0 RXhwcmVzc2lvbiAqQXN0OjpFeHByZXNzaW9uQ2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NB U1Q8QXN0RXhwcmVzc2lvbiAqLCBBc3QgKj4KICAgICAgICAoY2xhc3NfdGFnID09IEVYUFJFU1NJ T04gPyB0aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RQcmltaXRpdmVUeXBlICpBc3Q6OlBy aW1pdGl2ZVR5cGVDYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxBc3RQcmltaXRpdmVU eXBlICosIEFzdCAqPgogICAgICAgIChjbGFzc190YWcgPT0gUFJJTUlUSVZFX1RZUEUgPyB0aGlz IDogX19udWxsICk7Cn0KCmlubGluZSBBc3RNb2RpZmllciAqQXN0OjpNb2RpZmllckNhc3QoKQp7 CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdE1vZGlmaWVyICosIEFzdCAqPgogICAgICAgIChj bGFzc190YWcgPT0gTU9ESUZJRVIgPyB0aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RGaWVs ZERlY2xhcmF0aW9uICpBc3Q6OlN0YXRpY0ZpZWxkQ2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlD X0NBU1Q8QXN0RmllbGREZWNsYXJhdGlvbiAqLCBBc3QgKj4KICAgICAgICAoY2xhc3NfdGFnID09 IFNUQVRJQ19GSUVMRCA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdENsYXNzQm9keSAq QXN0OjpVbnBhcnNlZENsYXNzQm9keUNhc3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFz dENsYXNzQm9keSAqLCBBc3QgKj4KICAgICAgICAoY2xhc3NfdGFnID09IFVOUEFSU0VEID8gdGhp cyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gKkFzdDo6VW5w YXJzZWRJbnRlcmZhY2VCb2R5Q2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0SW50 ZXJmYWNlRGVjbGFyYXRpb24gKiwgQXN0ICo+CiAgICAgICAgKGNsYXNzX3RhZyA9PSBVTlBBUlNF RCA/IHRoaXMgOiBfX251bGwgKTsKfQoKCiAKIAogCiAKCmlubGluZSBBc3RMaXN0Tm9kZSAqQXN0 OjpMaXN0Tm9kZUNhc3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdExpc3ROb2RlICos IEFzdCAqPgogICAgICAgIChraW5kID09IExJU1RfTk9ERSA/IHRoaXMgOiBfX251bGwgKTsKfQoK aW5saW5lIEFzdEFycmF5VHlwZSAqQXN0OjpBcnJheVR5cGVDYXN0KCkKewogICAgcmV0dXJuIERZ TkFNSUNfQ0FTVDxBc3RBcnJheVR5cGUgKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gQVJSQVkg PyB0aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RTaW1wbGVOYW1lICpBc3Q6OlNpbXBsZU5h bWVDYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxBc3RTaW1wbGVOYW1lICosIEFzdCAq PgogICAgICAgIChraW5kID09IElERU5USUZJRVIgPyB0aGlzIDogX19udWxsICk7Cn0KCmlubGlu ZSBBc3RQYWNrYWdlRGVjbGFyYXRpb24gKkFzdDo6UGFja2FnZURlY2xhcmF0aW9uQ2FzdCgpCnsK ICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0UGFja2FnZURlY2xhcmF0aW9uICosIEFzdCAqPgog ICAgICAgIChraW5kID09IFBBQ0tBR0UgPyB0aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RJ bXBvcnREZWNsYXJhdGlvbiAqQXN0OjpJbXBvcnREZWNsYXJhdGlvbkNhc3QoKQp7CiAgICByZXR1 cm4gRFlOQU1JQ19DQVNUPEFzdEltcG9ydERlY2xhcmF0aW9uICosIEFzdCAqPgogICAgICAgIChr aW5kID09IElNUE9SVCA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdENvbXBpbGF0aW9u VW5pdCAqQXN0OjpDb21waWxhdGlvblVuaXRDYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FT VDxBc3RDb21waWxhdGlvblVuaXQgKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gQ09NUElMQVRJ T04gfHwga2luZCA9PSBCQURfQ09NUElMQVRJT04KICAgICAgICAgICAgfHwga2luZCA9PSBFTVBU WV9DT01QSUxBVElPTiA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdENvbXBpbGF0aW9u VW5pdCAqQXN0OjpCYWRDb21waWxhdGlvblVuaXRDYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNf Q0FTVDxBc3RDb21waWxhdGlvblVuaXQgKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gQkFEX0NP TVBJTEFUSU9OID8gdGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0Q29tcGlsYXRpb25Vbml0 ICpBc3Q6OkVtcHR5Q29tcGlsYXRpb25Vbml0Q2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NB U1Q8QXN0Q29tcGlsYXRpb25Vbml0ICosIEFzdCAqPgogICAgICAgIChraW5kID09IEVNUFRZX0NP TVBJTEFUSU9OID8gdGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0RW1wdHlEZWNsYXJhdGlv biAqQXN0OjpFbXB0eURlY2xhcmF0aW9uQ2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8 QXN0RW1wdHlEZWNsYXJhdGlvbiAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBFTVBUWV9ERUNM QVJBVElPTiA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdENsYXNzRGVjbGFyYXRpb24g KkFzdDo6Q2xhc3NEZWNsYXJhdGlvbkNhc3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFz dENsYXNzRGVjbGFyYXRpb24gKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gQ0xBU1MgPyB0aGlz IDogX19udWxsICk7Cn0KCmlubGluZSBBc3RBcnJheUluaXRpYWxpemVyICpBc3Q6OkFycmF5SW5p dGlhbGl6ZXJDYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxBc3RBcnJheUluaXRpYWxp emVyICosIEFzdCAqPgogICAgICAgIChraW5kID09IEFSUkFZX0lOSVRJQUxJWkVSID8gdGhpcyA6 IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0QnJhY2tldHMgKkFzdDo6QnJhY2tldHNDYXN0KCkKewog ICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxBc3RCcmFja2V0cyAqLCBBc3QgKj4KICAgICAgICAoa2lu ZCA9PSBCUkFDS0VUUyA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdFZhcmlhYmxlRGVj bGFyYXRvcklkICpBc3Q6OlZhcmlhYmxlRGVjbGFyYXRvcklkQ2FzdCgpCnsKICAgIHJldHVybiBE WU5BTUlDX0NBU1Q8QXN0VmFyaWFibGVEZWNsYXJhdG9ySWQgKiwgQXN0ICo+CiAgICAgICAgKGtp bmQgPT0gVkFSSUFCTEVfREVDTEFSQVRPUl9OQU1FID8gdGhpcyA6IF9fbnVsbCApOwp9Cgppbmxp bmUgQXN0VmFyaWFibGVEZWNsYXJhdG9yICpBc3Q6OlZhcmlhYmxlRGVjbGFyYXRvckNhc3QoKQp7 CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdFZhcmlhYmxlRGVjbGFyYXRvciAqLCBBc3QgKj4K ICAgICAgICAoa2luZCA9PSBWQVJJQUJMRV9ERUNMQVJBVE9SID8gdGhpcyA6IF9fbnVsbCApOwp9 CgppbmxpbmUgQXN0RmllbGREZWNsYXJhdGlvbiAqQXN0OjpGaWVsZERlY2xhcmF0aW9uQ2FzdCgp CnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0RmllbGREZWNsYXJhdGlvbiAqLCBBc3QgKj4K ICAgICAgICAoa2luZCA9PSBGSUVMRCA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdEZv cm1hbFBhcmFtZXRlciAqQXN0OjpGb3JtYWxQYXJhbWV0ZXJDYXN0KCkKewogICAgcmV0dXJuIERZ TkFNSUNfQ0FTVDxBc3RGb3JtYWxQYXJhbWV0ZXIgKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0g UEFSQU1FVEVSID8gdGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0TWV0aG9kRGVjbGFyYXRv ciAqQXN0OjpNZXRob2REZWNsYXJhdG9yQ2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8 QXN0TWV0aG9kRGVjbGFyYXRvciAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBNRVRIT0RfREVD TEFSQVRPUiA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdE1ldGhvZERlY2xhcmF0aW9u ICpBc3Q6Ok1ldGhvZERlY2xhcmF0aW9uQ2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8 QXN0TWV0aG9kRGVjbGFyYXRpb24gKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gTUVUSE9EID8g dGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0U3RhdGljSW5pdGlhbGl6ZXIgKkFzdDo6U3Rh dGljSW5pdGlhbGl6ZXJDYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxBc3RTdGF0aWNJ bml0aWFsaXplciAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBTVEFUSUNfSU5JVElBTElaRVIg PyB0aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RUaGlzQ2FsbCAqQXN0OjpUaGlzQ2FsbENh c3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdFRoaXNDYWxsICosIEFzdCAqPgogICAg ICAgIChraW5kID09IFRISVNfQ0FMTCA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdFN1 cGVyQ2FsbCAqQXN0OjpTdXBlckNhbGxDYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxB c3RTdXBlckNhbGwgKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gU1VQRVJfQ0FMTCA/IHRoaXMg OiBfX251bGwgKTsKfQoKaW5saW5lIEFzdENvbnN0cnVjdG9yQmxvY2sgKkFzdDo6Q29uc3RydWN0 b3JCbG9ja0Nhc3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdENvbnN0cnVjdG9yQmxv Y2sgKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gQ09OU1RSVUNUT1JfQkxPQ0sgPyB0aGlzIDog X19udWxsICk7Cn0KCmlubGluZSBBc3RDb25zdHJ1Y3RvckRlY2xhcmF0aW9uICpBc3Q6OkNvbnN0 cnVjdG9yRGVjbGFyYXRpb25DYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxBc3RDb25z dHJ1Y3RvckRlY2xhcmF0aW9uICosIEFzdCAqPgogICAgICAgIChraW5kID09IENPTlNUUlVDVE9S ID8gdGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gKkFz dDo6SW50ZXJmYWNlRGVjbGFyYXRpb25DYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxB c3RJbnRlcmZhY2VEZWNsYXJhdGlvbiAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBJTlRFUkZB Q0UgPyB0aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RCbG9jayAqQXN0OjpCbG9ja0Nhc3Qo KQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdEJsb2NrICosIEFzdCAqPgogICAgICAgIChr aW5kID09IEJMT0NLID8gdGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0TG9jYWxWYXJpYWJs ZURlY2xhcmF0aW9uU3RhdGVtZW50ICpBc3Q6OkxvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRl bWVudENhc3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdExvY2FsVmFyaWFibGVEZWNs YXJhdGlvblN0YXRlbWVudCAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBMT0NBTF9WQVJJQUJM RV9ERUNMQVJBVElPTiA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdElmU3RhdGVtZW50 ICpBc3Q6OklmU3RhdGVtZW50Q2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0SWZT dGF0ZW1lbnQgKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gSUYgPyB0aGlzIDogX19udWxsICk7 Cn0KCmlubGluZSBBc3RFbXB0eVN0YXRlbWVudCAqQXN0OjpFbXB0eVN0YXRlbWVudENhc3QoKQp7 CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdEVtcHR5U3RhdGVtZW50ICosIEFzdCAqPgogICAg ICAgIChraW5kID09IEVNUFRZX1NUQVRFTUVOVCA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5l IEFzdEV4cHJlc3Npb25TdGF0ZW1lbnQgKkFzdDo6RXhwcmVzc2lvblN0YXRlbWVudENhc3QoKQp7 CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdEV4cHJlc3Npb25TdGF0ZW1lbnQgKiwgQXN0ICo+ CiAgICAgICAgKGtpbmQgPT0gRVhQUkVTU0lPTl9TVEFURU1FTlQgPyB0aGlzIDogX19udWxsICk7 Cn0KCmlubGluZSBBc3RDYXNlTGFiZWwgKkFzdDo6Q2FzZUxhYmVsQ2FzdCgpCnsKICAgIHJldHVy biBEWU5BTUlDX0NBU1Q8QXN0Q2FzZUxhYmVsICosIEFzdCAqPgogICAgICAgIChraW5kID09IENB U0UgPyB0aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3REZWZhdWx0TGFiZWwgKkFzdDo6RGVm YXVsdExhYmVsQ2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0RGVmYXVsdExhYmVs ICosIEFzdCAqPgogICAgICAgIChraW5kID09IERFRkFVTFQgPyB0aGlzIDogX19udWxsICk7Cn0K CmlubGluZSBBc3RTd2l0Y2hCbG9ja1N0YXRlbWVudCAqQXN0OjpTd2l0Y2hCbG9ja1N0YXRlbWVu dENhc3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdFN3aXRjaEJsb2NrU3RhdGVtZW50 ICosIEFzdCAqPgogICAgICAgIChraW5kID09IFNXSVRDSF9CTE9DSyA/IHRoaXMgOiBfX251bGwg KTsKfQoKaW5saW5lIEFzdFN3aXRjaFN0YXRlbWVudCAqQXN0OjpTd2l0Y2hTdGF0ZW1lbnRDYXN0 KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxBc3RTd2l0Y2hTdGF0ZW1lbnQgKiwgQXN0ICo+ CiAgICAgICAgKGtpbmQgPT0gU1dJVENIID8gdGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0 V2hpbGVTdGF0ZW1lbnQgKkFzdDo6V2hpbGVTdGF0ZW1lbnRDYXN0KCkKewogICAgcmV0dXJuIERZ TkFNSUNfQ0FTVDxBc3RXaGlsZVN0YXRlbWVudCAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBX SElMRSA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdERvU3RhdGVtZW50ICpBc3Q6OkRv U3RhdGVtZW50Q2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0RG9TdGF0ZW1lbnQg KiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gRE8gPyB0aGlzIDogX19udWxsICk7Cn0KCmlubGlu ZSBBc3RGb3JTdGF0ZW1lbnQgKkFzdDo6Rm9yU3RhdGVtZW50Q2FzdCgpCnsKICAgIHJldHVybiBE WU5BTUlDX0NBU1Q8QXN0Rm9yU3RhdGVtZW50ICosIEFzdCAqPgogICAgICAgIChraW5kID09IEZP UiA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdEJyZWFrU3RhdGVtZW50ICpBc3Q6OkJy ZWFrU3RhdGVtZW50Q2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0QnJlYWtTdGF0 ZW1lbnQgKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gQlJFQUsgPyB0aGlzIDogX19udWxsICk7 Cn0KCmlubGluZSBBc3RDb250aW51ZVN0YXRlbWVudCAqQXN0OjpDb250aW51ZVN0YXRlbWVudENh c3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdENvbnRpbnVlU3RhdGVtZW50ICosIEFz dCAqPgogICAgICAgIChraW5kID09IENPTlRJTlVFID8gdGhpcyA6IF9fbnVsbCApOwp9Cgppbmxp bmUgQXN0UmV0dXJuU3RhdGVtZW50ICpBc3Q6OlJldHVyblN0YXRlbWVudENhc3QoKQp7CiAgICBy ZXR1cm4gRFlOQU1JQ19DQVNUPEFzdFJldHVyblN0YXRlbWVudCAqLCBBc3QgKj4KICAgICAgICAo a2luZCA9PSBSRVRVUk4gPyB0aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RUaHJvd1N0YXRl bWVudCAqQXN0OjpUaHJvd1N0YXRlbWVudENhc3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNU PEFzdFRocm93U3RhdGVtZW50ICosIEFzdCAqPgogICAgICAgIChraW5kID09IFRIUk9XID8gdGhp cyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0U3luY2hyb25pemVkU3RhdGVtZW50ICpBc3Q6OlN5 bmNocm9uaXplZFN0YXRlbWVudENhc3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdFN5 bmNocm9uaXplZFN0YXRlbWVudCAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBTWU5DSFJPTkla RURfU1RBVEVNRU5UID8gdGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0Q2F0Y2hDbGF1c2Ug KkFzdDo6Q2F0Y2hDbGF1c2VDYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxBc3RDYXRj aENsYXVzZSAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBDQVRDSCA/IHRoaXMgOiBfX251bGwg KTsKfQoKaW5saW5lIEFzdEZpbmFsbHlDbGF1c2UgKkFzdDo6RmluYWxseUNsYXVzZUNhc3QoKQp7 CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdEZpbmFsbHlDbGF1c2UgKiwgQXN0ICo+CiAgICAg ICAgKGtpbmQgPT0gRklOQUxMWSA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdFRyeVN0 YXRlbWVudCAqQXN0OjpUcnlTdGF0ZW1lbnRDYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FT VDxBc3RUcnlTdGF0ZW1lbnQgKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gVFJZID8gdGhpcyA6 IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0SW50ZWdlckxpdGVyYWwgKkFzdDo6SW50ZWdlckxpdGVy YWxDYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxBc3RJbnRlZ2VyTGl0ZXJhbCAqLCBB c3QgKj4KICAgICAgICAoa2luZCA9PSBJTlRFR0VSX0xJVEVSQUwgPyB0aGlzIDogX19udWxsICk7 Cn0KCmlubGluZSBBc3RMb25nTGl0ZXJhbCAqQXN0OjpMb25nTGl0ZXJhbENhc3QoKQp7CiAgICBy ZXR1cm4gRFlOQU1JQ19DQVNUPEFzdExvbmdMaXRlcmFsICosIEFzdCAqPgogICAgICAgIChraW5k ID09IExPTkdfTElURVJBTCA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdEZsb2F0aW5n UG9pbnRMaXRlcmFsICpBc3Q6OkZsb2F0aW5nUG9pbnRMaXRlcmFsQ2FzdCgpCnsKICAgIHJldHVy biBEWU5BTUlDX0NBU1Q8QXN0RmxvYXRpbmdQb2ludExpdGVyYWwgKiwgQXN0ICo+CiAgICAgICAg KGtpbmQgPT0gRkxPQVRJTkdfUE9JTlRfTElURVJBTCA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5s aW5lIEFzdERvdWJsZUxpdGVyYWwgKkFzdDo6RG91YmxlTGl0ZXJhbENhc3QoKQp7CiAgICByZXR1 cm4gRFlOQU1JQ19DQVNUPEFzdERvdWJsZUxpdGVyYWwgKiwgQXN0ICo+CiAgICAgICAgKGtpbmQg PT0gRE9VQkxFX0xJVEVSQUwgPyB0aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RUcnVlTGl0 ZXJhbCAqQXN0OjpUcnVlTGl0ZXJhbENhc3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFz dFRydWVMaXRlcmFsICosIEFzdCAqPgogICAgICAgIChraW5kID09IFRSVUVfTElURVJBTCA/IHRo aXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdEZhbHNlTGl0ZXJhbCAqQXN0OjpGYWxzZUxpdGVy YWxDYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxBc3RGYWxzZUxpdGVyYWwgKiwgQXN0 ICo+CiAgICAgICAgKGtpbmQgPT0gRkFMU0VfTElURVJBTCA/IHRoaXMgOiBfX251bGwgKTsKfQoK aW5saW5lIEFzdFN0cmluZ0xpdGVyYWwgKkFzdDo6U3RyaW5nTGl0ZXJhbENhc3QoKQp7CiAgICBy ZXR1cm4gRFlOQU1JQ19DQVNUPEFzdFN0cmluZ0xpdGVyYWwgKiwgQXN0ICo+CiAgICAgICAgKGtp bmQgPT0gU1RSSU5HX0xJVEVSQUwgPyB0aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RDaGFy YWN0ZXJMaXRlcmFsICpBc3Q6OkNoYXJhY3RlckxpdGVyYWxDYXN0KCkKewogICAgcmV0dXJuIERZ TkFNSUNfQ0FTVDxBc3RDaGFyYWN0ZXJMaXRlcmFsICosIEFzdCAqPgogICAgICAgIChraW5kID09 IENIQVJBQ1RFUl9MSVRFUkFMID8gdGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0TnVsbExp dGVyYWwgKkFzdDo6TnVsbExpdGVyYWxDYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxB c3ROdWxsTGl0ZXJhbCAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBOVUxMX0xJVEVSQUwgPyB0 aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RUaGlzRXhwcmVzc2lvbiAqQXN0OjpUaGlzRXhw cmVzc2lvbkNhc3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdFRoaXNFeHByZXNzaW9u ICosIEFzdCAqPgogICAgICAgIChraW5kID09IFRISVNfRVhQUkVTU0lPTiA/IHRoaXMgOiBfX251 bGwgKTsKfQoKaW5saW5lIEFzdFN1cGVyRXhwcmVzc2lvbiAqQXN0OjpTdXBlckV4cHJlc3Npb25D YXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxBc3RTdXBlckV4cHJlc3Npb24gKiwgQXN0 ICo+CiAgICAgICAgKGtpbmQgPT0gU1VQRVJfRVhQUkVTU0lPTiA/IHRoaXMgOiBfX251bGwgKTsK fQoKaW5saW5lIEFzdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uICpBc3Q6OlBhcmVudGhlc2l6ZWRF eHByZXNzaW9uQ2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0UGFyZW50aGVzaXpl ZEV4cHJlc3Npb24gKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gUEFSRU5USEVTSVpFRF9FWFBS RVNTSU9OID8gdGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0Q2xhc3NJbnN0YW5jZUNyZWF0 aW9uRXhwcmVzc2lvbiAqQXN0OjpDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uQ2FzdCgp CnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVz c2lvbiAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBDTEFTU19DUkVBVElPTiA/IHRoaXMgOiBf X251bGwgKTsKfQoKaW5saW5lIEFzdERpbUV4cHIgKkFzdDo6RGltRXhwckNhc3QoKQp7CiAgICBy ZXR1cm4gRFlOQU1JQ19DQVNUPEFzdERpbUV4cHIgKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0g RElNID8gdGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0QXJyYXlDcmVhdGlvbkV4cHJlc3Np b24gKkFzdDo6QXJyYXlDcmVhdGlvbkV4cHJlc3Npb25DYXN0KCkKewogICAgcmV0dXJuIERZTkFN SUNfQ0FTVDxBc3RBcnJheUNyZWF0aW9uRXhwcmVzc2lvbiAqLCBBc3QgKj4KICAgICAgICAoa2lu ZCA9PSBBUlJBWV9DUkVBVElPTiA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdEZpZWxk QWNjZXNzICpBc3Q6OkZpZWxkQWNjZXNzQ2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8 QXN0RmllbGRBY2Nlc3MgKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gRE9UID8gdGhpcyA6IF9f bnVsbCApOwp9CgppbmxpbmUgQXN0TWV0aG9kSW52b2NhdGlvbiAqQXN0OjpNZXRob2RJbnZvY2F0 aW9uQ2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0TWV0aG9kSW52b2NhdGlvbiAq LCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBDQUxMID8gdGhpcyA6IF9fbnVsbCApOwp9Cgppbmxp bmUgQXN0QXJyYXlBY2Nlc3MgKkFzdDo6QXJyYXlBY2Nlc3NDYXN0KCkKewogICAgcmV0dXJuIERZ TkFNSUNfQ0FTVDxBc3RBcnJheUFjY2VzcyAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBBUlJB WV9BQ0NFU1MgPyB0aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RQb3N0VW5hcnlFeHByZXNz aW9uICpBc3Q6OlBvc3RVbmFyeUV4cHJlc3Npb25DYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNf Q0FTVDxBc3RQb3N0VW5hcnlFeHByZXNzaW9uICosIEFzdCAqPgogICAgICAgIChraW5kID09IFBP U1RfVU5BUlkgPyB0aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RQcmVVbmFyeUV4cHJlc3Np b24gKkFzdDo6UHJlVW5hcnlFeHByZXNzaW9uQ2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NB U1Q8QXN0UHJlVW5hcnlFeHByZXNzaW9uICosIEFzdCAqPgogICAgICAgIChraW5kID09IFBSRV9V TkFSWSA/IHRoaXMgOiBfX251bGwgKTsKfQoKaW5saW5lIEFzdENhc3RFeHByZXNzaW9uICpBc3Q6 OkNhc3RFeHByZXNzaW9uQ2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0Q2FzdEV4 cHJlc3Npb24gKiwgQXN0ICo+CiAgICAgICAgKGtpbmQgPT0gQ0FTVCB8fCBraW5kID09IENIRUNL X0FORF9DQVNUID8gdGhpcyA6IF9fbnVsbCApOwp9CgppbmxpbmUgQXN0QmluYXJ5RXhwcmVzc2lv biAqQXN0OjpCaW5hcnlFeHByZXNzaW9uQ2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8 QXN0QmluYXJ5RXhwcmVzc2lvbiAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBCSU5BUlkgPyB0 aGlzIDogX19udWxsICk7Cn0KCmlubGluZSBBc3RUeXBlRXhwcmVzc2lvbiAqQXN0OjpUeXBlRXhw cmVzc2lvbkNhc3QoKQp7CiAgICByZXR1cm4gRFlOQU1JQ19DQVNUPEFzdFR5cGVFeHByZXNzaW9u ICosIEFzdCAqPgogICAgICAgIChraW5kID09IFRZUEUgPyB0aGlzIDogX19udWxsICk7Cn0KCmlu bGluZSBBc3RDb25kaXRpb25hbEV4cHJlc3Npb24gKkFzdDo6Q29uZGl0aW9uYWxFeHByZXNzaW9u Q2FzdCgpCnsKICAgIHJldHVybiBEWU5BTUlDX0NBU1Q8QXN0Q29uZGl0aW9uYWxFeHByZXNzaW9u ICosIEFzdCAqPgogICAgICAgIChraW5kID09IENPTkRJVElPTkFMID8gdGhpcyA6IF9fbnVsbCAp Owp9CgppbmxpbmUgQXN0QXNzaWdubWVudEV4cHJlc3Npb24gKkFzdDo6QXNzaWdubWVudEV4cHJl c3Npb25DYXN0KCkKewogICAgcmV0dXJuIERZTkFNSUNfQ0FTVDxBc3RBc3NpZ25tZW50RXhwcmVz c2lvbiAqLCBBc3QgKj4KICAgICAgICAoa2luZCA9PSBBU1NJR05NRU5UID8gdGhpcyA6IF9fbnVs bCApOwp9CgppbmxpbmUgdm9pZCBBc3RDbGFzc0JvZHk6OkFsbG9jYXRlSW5zdGFuY2VWYXJpYWJs ZXMoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISBpbnN0YW5jZV92YXJpYWJsZXMpCiAgICAgICAg aW5zdGFuY2VfdmFyaWFibGVzID0gCgogICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFy cmF5PEFzdEZpZWxkRGVjbGFyYXRpb24gKj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3 QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoKaW5saW5lIHZvaWQgQXN0Q2xhc3NCb2R5OjpBZGRJbnN0 YW5jZVZhcmlhYmxlKEFzdEZpZWxkRGVjbGFyYXRpb24gKmZpZWxkX2RlY2xhcmF0aW9uKQp7CiAg ICBpZiAoISBpbnN0YW5jZV92YXJpYWJsZXMpCiAgICAgICAgaW5zdGFuY2VfdmFyaWFibGVzID0g CgogICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFycmF5PEFzdEZpZWxkRGVjbGFyYXRp b24gKj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoKSk7CiAgICBpbnN0 YW5jZV92YXJpYWJsZXMgLT4gTmV4dCgpID0gZmllbGRfZGVjbGFyYXRpb247Cn0KCmlubGluZSB2 b2lkIEFzdENsYXNzQm9keTo6QWxsb2NhdGVDbGFzc1ZhcmlhYmxlcyhpbnQgZXN0aW1hdGUpCnsK ICAgIGlmICghIGNsYXNzX3ZhcmlhYmxlcykKICAgICAgICBjbGFzc192YXJpYWJsZXMgPSAKCiAg ICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0RmllbGREZWNsYXJhdGlvbiAq PiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheShlc3RpbWF0ZSkpOwp9Cgpp bmxpbmUgdm9pZCBBc3RDbGFzc0JvZHk6OkFkZENsYXNzVmFyaWFibGUoQXN0RmllbGREZWNsYXJh dGlvbiAqZmllbGRfZGVjbGFyYXRpb24pCnsKICAgIGlmICghIGNsYXNzX3ZhcmlhYmxlcykKICAg ICAgICBjbGFzc192YXJpYWJsZXMgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0 QXJyYXk8QXN0RmllbGREZWNsYXJhdGlvbiAqPiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBO ZXdBc3RBcnJheSgpKTsKICAgIGNsYXNzX3ZhcmlhYmxlcyAtPiBOZXh0KCkgPSBmaWVsZF9kZWNs YXJhdGlvbjsKfQoKaW5saW5lIHZvaWQgQXN0Q2xhc3NCb2R5OjpBbGxvY2F0ZU1ldGhvZHMoaW50 IGVzdGltYXRlKQp7CiAgICBpZiAoISBtZXRob2RzKQogICAgICAgIG1ldGhvZHMgPSAKCiAgICAg ICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0TWV0aG9kRGVjbGFyYXRpb24gKj4g Kj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoKaW5s aW5lIHZvaWQgQXN0Q2xhc3NCb2R5OjpBZGRNZXRob2QoQXN0TWV0aG9kRGVjbGFyYXRpb24gKm1l dGhvZF9kZWNsYXJhdGlvbikKewogICAgaWYgKCEgbWV0aG9kcykKICAgICAgICBtZXRob2RzID0g CgogICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFycmF5PEFzdE1ldGhvZERlY2xhcmF0 aW9uICo+ICo+CgoKCiAgICAgICAgICAgIChwb29sIC0+IE5ld0FzdEFycmF5KCkpOwogICAgbWV0 aG9kcyAtPiBOZXh0KCkgPSBtZXRob2RfZGVjbGFyYXRpb247Cn0KCmlubGluZSB2b2lkIEFzdENs YXNzQm9keTo6QWxsb2NhdGVCbG9ja3MoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISBibG9ja3Mp CiAgICAgICAgYmxvY2tzID0gCgogICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFycmF5 PEFzdEJsb2NrICo+ICo+CgoKCiAgICAgICAgICAgIChwb29sIC0+IE5ld0FzdEFycmF5KGVzdGlt YXRlKSk7Cn0KCmlubGluZSB2b2lkIEFzdENsYXNzQm9keTo6QWRkQmxvY2soQXN0QmxvY2sgKmJs b2NrKQp7CiAgICBpZiAoISBibG9ja3MpCiAgICAgICAgYmxvY2tzID0gCgogICAgICAgICAgICBy ZWludGVycHJldF9jYXN0PEFzdEFycmF5PEFzdEJsb2NrICo+ICo+CgoKCiAgICAgICAgICAgIChw b29sIC0+IE5ld0FzdEFycmF5KCkpOwogICAgYmxvY2tzIC0+IE5leHQoKSA9IGJsb2NrOwp9Cgpp bmxpbmUgdm9pZCBBc3RDbGFzc0JvZHk6OkFsbG9jYXRlTmVzdGVkSW50ZXJmYWNlcyhpbnQgZXN0 aW1hdGUpCnsKICAgIGlmICghIGlubmVyX2ludGVyZmFjZXMpCiAgICAgICAgaW5uZXJfaW50ZXJm YWNlcyA9IAoKICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBc3RBcnJheTxBc3RJbnRlcmZh Y2VEZWNsYXJhdGlvbiAqPiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheShl c3RpbWF0ZSkpOwp9CgppbmxpbmUgdm9pZCBBc3RDbGFzc0JvZHk6OkFkZE5lc3RlZEludGVyZmFj ZShBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiAqaW50ZXJmYWNlX2RlY2xhcmF0aW9uKQp7CiAgICBp ZiAoISBpbm5lcl9pbnRlcmZhY2VzKQogICAgICAgIGlubmVyX2ludGVyZmFjZXMgPSAKCiAgICAg ICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0SW50ZXJmYWNlRGVjbGFyYXRpb24g Kj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoKSk7CiAgICBpbm5lcl9p bnRlcmZhY2VzIC0+IE5leHQoKSA9IGludGVyZmFjZV9kZWNsYXJhdGlvbjsKfQoKaW5saW5lIHZv aWQgQXN0Q2xhc3NCb2R5OjpBbGxvY2F0ZU5lc3RlZENsYXNzZXMoaW50IGVzdGltYXRlKQp7CiAg ICBpZiAoISBpbm5lcl9jbGFzc2VzKQogICAgICAgIGlubmVyX2NsYXNzZXMgPSAKCiAgICAgICAg ICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0Q2xhc3NEZWNsYXJhdGlvbiAqPiAqPgoK CgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheShlc3RpbWF0ZSkpOwp9CgppbmxpbmUg dm9pZCBBc3RDbGFzc0JvZHk6OkFkZE5lc3RlZENsYXNzKEFzdENsYXNzRGVjbGFyYXRpb24gKmNs YXNzX2RlY2xhcmF0aW9uKQp7CiAgICBpZiAoISBpbm5lcl9jbGFzc2VzKQogICAgICAgIGlubmVy X2NsYXNzZXMgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0Q2xh c3NEZWNsYXJhdGlvbiAqPiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheSgp KTsKICAgIGlubmVyX2NsYXNzZXMgLT4gTmV4dCgpID0gY2xhc3NfZGVjbGFyYXRpb247Cn0KCmlu bGluZSB2b2lkIEFzdENsYXNzQm9keTo6QWxsb2NhdGVTdGF0aWNJbml0aWFsaXplcnMoaW50IGVz dGltYXRlKQp7CiAgICBpZiAoISBzdGF0aWNfaW5pdGlhbGl6ZXJzKQogICAgICAgIHN0YXRpY19p bml0aWFsaXplcnMgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0 U3RhdGljSW5pdGlhbGl6ZXIgKj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJy YXkoZXN0aW1hdGUpKTsKfQoKaW5saW5lIHZvaWQgQXN0Q2xhc3NCb2R5OjpBZGRTdGF0aWNJbml0 aWFsaXplcihBc3RTdGF0aWNJbml0aWFsaXplciAqc3RhdGljX2luaXRpYWxpemVyKQp7CiAgICBp ZiAoISBzdGF0aWNfaW5pdGlhbGl6ZXJzKQogICAgICAgIHN0YXRpY19pbml0aWFsaXplcnMgPSAK CiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0U3RhdGljSW5pdGlhbGl6 ZXIgKj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoKSk7CiAgICBzdGF0 aWNfaW5pdGlhbGl6ZXJzIC0+IE5leHQoKSA9IHN0YXRpY19pbml0aWFsaXplcjsKfQoKaW5saW5l IHZvaWQgQXN0Q2xhc3NCb2R5OjpBbGxvY2F0ZUNvbnN0cnVjdG9ycyhpbnQgZXN0aW1hdGUpCnsK ICAgIGlmICghIGNvbnN0cnVjdG9ycykKICAgICAgICBjb25zdHJ1Y3RvcnMgPSAKCiAgICAgICAg ICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0Q29uc3RydWN0b3JEZWNsYXJhdGlvbiAq PiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheShlc3RpbWF0ZSkpOwp9Cgpp bmxpbmUgdm9pZCBBc3RDbGFzc0JvZHk6OkFkZENvbnN0cnVjdG9yKEFzdENvbnN0cnVjdG9yRGVj bGFyYXRpb24gKmNvbnN0cnVjdG9yX2RlY2xhcmF0aW9uKQp7CiAgICBpZiAoISBjb25zdHJ1Y3Rv cnMpCiAgICAgICAgY29uc3RydWN0b3JzID0gCgogICAgICAgICAgICByZWludGVycHJldF9jYXN0 PEFzdEFycmF5PEFzdENvbnN0cnVjdG9yRGVjbGFyYXRpb24gKj4gKj4KCgoKICAgICAgICAgICAg KHBvb2wgLT4gTmV3QXN0QXJyYXkoKSk7CiAgICBjb25zdHJ1Y3RvcnMgLT4gTmV4dCgpID0gY29u c3RydWN0b3JfZGVjbGFyYXRpb247Cn0KCmlubGluZSB2b2lkIEFzdENsYXNzQm9keTo6QWxsb2Nh dGVFbXB0eURlY2xhcmF0aW9ucyhpbnQgZXN0aW1hdGUpCnsKICAgIGlmICghIGVtcHR5X2RlY2xh cmF0aW9ucykKICAgICAgICBlbXB0eV9kZWNsYXJhdGlvbnMgPSAKCiAgICAgICAgICAgIHJlaW50 ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0RW1wdHlEZWNsYXJhdGlvbiAqPiAqPgoKCgogICAgICAg ICAgICAocG9vbCAtPiBOZXdBc3RBcnJheShlc3RpbWF0ZSkpOwp9CgppbmxpbmUgdm9pZCBBc3RD bGFzc0JvZHk6OkFkZEVtcHR5RGVjbGFyYXRpb24oQXN0RW1wdHlEZWNsYXJhdGlvbiAqZW1wdHlf ZGVjbGFyYXRpb24pCnsKICAgIGlmICghIGVtcHR5X2RlY2xhcmF0aW9ucykKICAgICAgICBlbXB0 eV9kZWNsYXJhdGlvbnMgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8 QXN0RW1wdHlEZWNsYXJhdGlvbiAqPiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RB cnJheSgpKTsKICAgIGVtcHR5X2RlY2xhcmF0aW9ucyAtPiBOZXh0KCkgPSBlbXB0eV9kZWNsYXJh dGlvbjsKfQoKaW5saW5lIHZvaWQgQXN0SW50ZXJmYWNlRGVjbGFyYXRpb246OkFsbG9jYXRlTmVz dGVkSW50ZXJmYWNlcyhpbnQgZXN0aW1hdGUpCnsKICAgIGlmICghIGlubmVyX2ludGVyZmFjZXMp CiAgICAgICAgaW5uZXJfaW50ZXJmYWNlcyA9IAoKICAgICAgICAgICAgcmVpbnRlcnByZXRfY2Fz dDxBc3RBcnJheTxBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiAqPiAqPgoKCgogICAgICAgICAgICAo cG9vbCAtPiBOZXdBc3RBcnJheShlc3RpbWF0ZSkpOwp9CgppbmxpbmUgdm9pZCBBc3RJbnRlcmZh Y2VEZWNsYXJhdGlvbjo6QWRkTmVzdGVkSW50ZXJmYWNlKEFzdEludGVyZmFjZURlY2xhcmF0aW9u ICppbnRlcmZhY2VfZGVjbGFyYXRpb24pCnsKICAgIGlmICghIGlubmVyX2ludGVyZmFjZXMpCiAg ICAgICAgaW5uZXJfaW50ZXJmYWNlcyA9IAoKICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxB c3RBcnJheTxBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiAqPiAqPgoKCgogICAgICAgICAgICAocG9v bCAtPiBOZXdBc3RBcnJheSgpKTsKICAgIGlubmVyX2ludGVyZmFjZXMgLT4gTmV4dCgpID0gaW50 ZXJmYWNlX2RlY2xhcmF0aW9uOwp9CgppbmxpbmUgdm9pZCBBc3RJbnRlcmZhY2VEZWNsYXJhdGlv bjo6QWxsb2NhdGVOZXN0ZWRDbGFzc2VzKGludCBlc3RpbWF0ZSkKewogICAgaWYgKCEgaW5uZXJf Y2xhc3NlcykKICAgICAgICBpbm5lcl9jbGFzc2VzID0gCgogICAgICAgICAgICByZWludGVycHJl dF9jYXN0PEFzdEFycmF5PEFzdENsYXNzRGVjbGFyYXRpb24gKj4gKj4KCgoKICAgICAgICAgICAg KHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoKaW5saW5lIHZvaWQgQXN0SW50ZXJm YWNlRGVjbGFyYXRpb246OkFkZE5lc3RlZENsYXNzKEFzdENsYXNzRGVjbGFyYXRpb24gKmNsYXNz X2RlY2xhcmF0aW9uKQp7CiAgICBpZiAoISBpbm5lcl9jbGFzc2VzKQogICAgICAgIGlubmVyX2Ns YXNzZXMgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0Q2xhc3NE ZWNsYXJhdGlvbiAqPiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheSgpKTsK ICAgIGlubmVyX2NsYXNzZXMgLT4gTmV4dCgpID0gY2xhc3NfZGVjbGFyYXRpb247Cn0KCmlubGlu ZSB2b2lkIEFzdEludGVyZmFjZURlY2xhcmF0aW9uOjpBbGxvY2F0ZU1ldGhvZHMoaW50IGVzdGlt YXRlKQp7CiAgICBpZiAoISBtZXRob2RzKQogICAgICAgIG1ldGhvZHMgPSAKCiAgICAgICAgICAg IHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0TWV0aG9kRGVjbGFyYXRpb24gKj4gKj4KCgoK ICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoKaW5saW5lIHZv aWQgQXN0SW50ZXJmYWNlRGVjbGFyYXRpb246OkFkZE1ldGhvZChBc3RNZXRob2REZWNsYXJhdGlv biAqbWV0aG9kX2RlY2xhcmF0aW9uKQp7CiAgICBpZiAoISBtZXRob2RzKQogICAgICAgIG1ldGhv ZHMgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0TWV0aG9kRGVj bGFyYXRpb24gKj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoKSk7CiAg ICBtZXRob2RzIC0+IE5leHQoKSA9IG1ldGhvZF9kZWNsYXJhdGlvbjsKfQoKaW5saW5lIHZvaWQg QXN0SW50ZXJmYWNlRGVjbGFyYXRpb246OkFsbG9jYXRlQ2xhc3NWYXJpYWJsZXMoaW50IGVzdGlt YXRlKQp7CiAgICBpZiAoISBjbGFzc192YXJpYWJsZXMpCiAgICAgICAgY2xhc3NfdmFyaWFibGVz ID0gCgogICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFycmF5PEFzdEZpZWxkRGVjbGFy YXRpb24gKj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUp KTsKfQoKaW5saW5lIHZvaWQgQXN0SW50ZXJmYWNlRGVjbGFyYXRpb246OkFkZENsYXNzVmFyaWFi bGUoQXN0RmllbGREZWNsYXJhdGlvbiAqZmllbGRfZGVjbGFyYXRpb24pCnsKICAgIGlmICghIGNs YXNzX3ZhcmlhYmxlcykKICAgICAgICBjbGFzc192YXJpYWJsZXMgPSAKCiAgICAgICAgICAgIHJl aW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0RmllbGREZWNsYXJhdGlvbiAqPiAqPgoKCgogICAg ICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheSgpKTsKICAgIGNsYXNzX3ZhcmlhYmxlcyAtPiBO ZXh0KCkgPSBmaWVsZF9kZWNsYXJhdGlvbjsKfQoKaW5saW5lIHZvaWQgQXN0SW50ZXJmYWNlRGVj bGFyYXRpb246OkFsbG9jYXRlRW1wdHlEZWNsYXJhdGlvbnMoaW50IGVzdGltYXRlKQp7CiAgICBp ZiAoISBlbXB0eV9kZWNsYXJhdGlvbnMpCiAgICAgICAgZW1wdHlfZGVjbGFyYXRpb25zID0gCgog ICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFycmF5PEFzdEVtcHR5RGVjbGFyYXRpb24g Kj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoK aW5saW5lIHZvaWQgQXN0SW50ZXJmYWNlRGVjbGFyYXRpb246OkFkZEVtcHR5RGVjbGFyYXRpb24o QXN0RW1wdHlEZWNsYXJhdGlvbiAqZW1wdHlfZGVjbGFyYXRpb24pCnsKICAgIGlmICghIGVtcHR5 X2RlY2xhcmF0aW9ucykKICAgICAgICBlbXB0eV9kZWNsYXJhdGlvbnMgPSAKCiAgICAgICAgICAg IHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0RW1wdHlEZWNsYXJhdGlvbiAqPiAqPgoKCgog ICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheSgpKTsKICAgIGVtcHR5X2RlY2xhcmF0aW9u cyAtPiBOZXh0KCkgPSBlbXB0eV9kZWNsYXJhdGlvbjsKfQoKaW5saW5lIHZvaWQgQXN0Q2xhc3NE ZWNsYXJhdGlvbjo6QWxsb2NhdGVDbGFzc01vZGlmaWVycyhpbnQgZXN0aW1hdGUpCnsKICAgIGlm ICghIGNsYXNzX21vZGlmaWVycykKICAgICAgICBjbGFzc19tb2RpZmllcnMgPSAKCiAgICAgICAg ICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0TW9kaWZpZXIgKj4gKj4KCgoKICAgICAg ICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoKaW5saW5lIHZvaWQgQXN0 Q2xhc3NEZWNsYXJhdGlvbjo6QWRkQ2xhc3NNb2RpZmllcihBc3RNb2RpZmllciAqY2xhc3NfbW9k aWZpZXIpCnsKICAgIGlmICghIGNsYXNzX21vZGlmaWVycykKICAgICAgICBBbGxvY2F0ZUNsYXNz TW9kaWZpZXJzKDQpOyAgCiAgICBjbGFzc19tb2RpZmllcnMgLT4gTmV4dCgpID0gY2xhc3NfbW9k aWZpZXI7Cn0KCmlubGluZSB2b2lkIEFzdEZpZWxkRGVjbGFyYXRpb246OkFsbG9jYXRlVmFyaWFi bGVNb2RpZmllcnMoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISB2YXJpYWJsZV9tb2RpZmllcnMp CiAgICAgICAgdmFyaWFibGVfbW9kaWZpZXJzID0gCgogICAgICAgICAgICByZWludGVycHJldF9j YXN0PEFzdEFycmF5PEFzdE1vZGlmaWVyICo+ICo+CgoKCiAgICAgICAgICAgIChwb29sIC0+IE5l d0FzdEFycmF5KGVzdGltYXRlKSk7Cn0KCmlubGluZSB2b2lkIEFzdEZpZWxkRGVjbGFyYXRpb246 OkFkZFZhcmlhYmxlTW9kaWZpZXIoQXN0TW9kaWZpZXIgKnZhcmlhYmxlX21vZGlmaWVyKQp7CiAg ICBpZiAoISB2YXJpYWJsZV9tb2RpZmllcnMpCiAgICAgICAgQWxsb2NhdGVWYXJpYWJsZU1vZGlm aWVycyg0KTsgIAogICAgdmFyaWFibGVfbW9kaWZpZXJzIC0+IE5leHQoKSA9IHZhcmlhYmxlX21v ZGlmaWVyOwp9CgppbmxpbmUgdm9pZCBBc3RGb3JtYWxQYXJhbWV0ZXI6OkFsbG9jYXRlUGFyYW1l dGVyTW9kaWZpZXJzKGludCBlc3RpbWF0ZSkKewogICAgaWYgKCEgcGFyYW1ldGVyX21vZGlmaWVy cykKICAgICAgICBwYXJhbWV0ZXJfbW9kaWZpZXJzID0gCgogICAgICAgICAgICByZWludGVycHJl dF9jYXN0PEFzdEFycmF5PEFzdE1vZGlmaWVyICo+ICo+CgoKCiAgICAgICAgICAgIChwb29sIC0+ IE5ld0FzdEFycmF5KGVzdGltYXRlKSk7Cn0KCmlubGluZSB2b2lkIEFzdEZvcm1hbFBhcmFtZXRl cjo6QWRkUGFyYW1ldGVyTW9kaWZpZXIoQXN0TW9kaWZpZXIgKnBhcmFtZXRlcl9tb2RpZmllcikK ewogICAgaWYgKCEgcGFyYW1ldGVyX21vZGlmaWVycykKICAgICAgICBBbGxvY2F0ZVBhcmFtZXRl ck1vZGlmaWVycyg0KTsgIAogICAgcGFyYW1ldGVyX21vZGlmaWVycyAtPiBOZXh0KCkgPSBwYXJh bWV0ZXJfbW9kaWZpZXI7Cn0KCmlubGluZSB2b2lkIEFzdE1ldGhvZERlY2xhcmF0aW9uOjpBbGxv Y2F0ZU1ldGhvZE1vZGlmaWVycyhpbnQgZXN0aW1hdGUpCnsKICAgIGlmICghIG1ldGhvZF9tb2Rp ZmllcnMpCiAgICAgICAgbWV0aG9kX21vZGlmaWVycyA9IAoKICAgICAgICAgICAgcmVpbnRlcnBy ZXRfY2FzdDxBc3RBcnJheTxBc3RNb2RpZmllciAqPiAqPgoKCgogICAgICAgICAgICAocG9vbCAt PiBOZXdBc3RBcnJheShlc3RpbWF0ZSkpOwp9CgppbmxpbmUgdm9pZCBBc3RNZXRob2REZWNsYXJh dGlvbjo6QWRkTWV0aG9kTW9kaWZpZXIoQXN0TW9kaWZpZXIgKm1ldGhvZF9tb2RpZmllcikKewog ICAgaWYgKCEgbWV0aG9kX21vZGlmaWVycykKICAgICAgICBBbGxvY2F0ZU1ldGhvZE1vZGlmaWVy cyg0KTsgIAogICAgbWV0aG9kX21vZGlmaWVycyAtPiBOZXh0KCkgPSBtZXRob2RfbW9kaWZpZXI7 Cn0KCmlubGluZSB2b2lkIEFzdENvbnN0cnVjdG9yRGVjbGFyYXRpb246OkFsbG9jYXRlQ29uc3Ry dWN0b3JNb2RpZmllcnMoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISBjb25zdHJ1Y3Rvcl9tb2Rp ZmllcnMpCiAgICAgICAgY29uc3RydWN0b3JfbW9kaWZpZXJzID0gCgogICAgICAgICAgICByZWlu dGVycHJldF9jYXN0PEFzdEFycmF5PEFzdE1vZGlmaWVyICo+ICo+CgoKCiAgICAgICAgICAgIChw b29sIC0+IE5ld0FzdEFycmF5KGVzdGltYXRlKSk7Cn0KCmlubGluZSB2b2lkIEFzdENvbnN0cnVj dG9yRGVjbGFyYXRpb246OkFkZENvbnN0cnVjdG9yTW9kaWZpZXIoQXN0TW9kaWZpZXIgKmNvbnN0 cnVjdG9yX21vZGlmaWVyKQp7CiAgICBpZiAoISBjb25zdHJ1Y3Rvcl9tb2RpZmllcnMpCiAgICAg ICAgQWxsb2NhdGVDb25zdHJ1Y3Rvck1vZGlmaWVycyg0KTsgIAogICAgY29uc3RydWN0b3JfbW9k aWZpZXJzIC0+IE5leHQoKSA9IGNvbnN0cnVjdG9yX21vZGlmaWVyOwp9CgppbmxpbmUgdm9pZCBB c3RJbnRlcmZhY2VEZWNsYXJhdGlvbjo6QWxsb2NhdGVJbnRlcmZhY2VNb2RpZmllcnMoaW50IGVz dGltYXRlKQp7CiAgICBpZiAoISBpbnRlcmZhY2VfbW9kaWZpZXJzKQogICAgICAgIGludGVyZmFj ZV9tb2RpZmllcnMgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0 TW9kaWZpZXIgKj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1h dGUpKTsKfQoKaW5saW5lIHZvaWQgQXN0SW50ZXJmYWNlRGVjbGFyYXRpb246OkFkZEludGVyZmFj ZU1vZGlmaWVyKEFzdE1vZGlmaWVyICppbnRlcmZhY2VfbW9kaWZpZXIpCnsKICAgIGlmICghIGlu dGVyZmFjZV9tb2RpZmllcnMpCiAgICAgICAgQWxsb2NhdGVJbnRlcmZhY2VNb2RpZmllcnMoNCk7 ICAKICAgIGludGVyZmFjZV9tb2RpZmllcnMgLT4gTmV4dCgpID0gaW50ZXJmYWNlX21vZGlmaWVy Owp9CgppbmxpbmUgdm9pZCBBc3RMb2NhbFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQ6OkFs bG9jYXRlTG9jYWxNb2RpZmllcnMoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISBsb2NhbF9tb2Rp ZmllcnMpCiAgICAgICAgbG9jYWxfbW9kaWZpZXJzID0gCgogICAgICAgICAgICByZWludGVycHJl dF9jYXN0PEFzdEFycmF5PEFzdE1vZGlmaWVyICo+ICo+CgoKCiAgICAgICAgICAgIChwb29sIC0+ IE5ld0FzdEFycmF5KGVzdGltYXRlKSk7Cn0KCmlubGluZSB2b2lkIEFzdExvY2FsVmFyaWFibGVE ZWNsYXJhdGlvblN0YXRlbWVudDo6QWRkTG9jYWxNb2RpZmllcihBc3RNb2RpZmllciAqbG9jYWxf bW9kaWZpZXIpCnsKICAgIGlmICghIGxvY2FsX21vZGlmaWVycykKICAgICAgICBBbGxvY2F0ZUxv Y2FsTW9kaWZpZXJzKDQpOyAgCiAgICBsb2NhbF9tb2RpZmllcnMgLT4gTmV4dCgpID0gbG9jYWxf bW9kaWZpZXI7Cn0KCmlubGluZSB2b2lkIEFzdEJsb2NrOjpBbGxvY2F0ZUJsb2NrU3RhdGVtZW50 cyhpbnQgZXN0aW1hdGUpCnsKICAgIGlmICghIGJsb2NrX3N0YXRlbWVudHMpCiAgICAgICAgYmxv Y2tfc3RhdGVtZW50cyA9IHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpOwp9CgppbmxpbmUg dm9pZCBBc3RCbG9jazo6QWRkU3RhdGVtZW50KEFzdCAqc3RhdGVtZW50KQp7CiAgICBpZiAoISBi bG9ja19zdGF0ZW1lbnRzKQogICAgICAgIEFsbG9jYXRlQmxvY2tTdGF0ZW1lbnRzKCk7CiAgICBi bG9ja19zdGF0ZW1lbnRzIC0+IE5leHQoKSA9IHN0YXRlbWVudDsKfQoKaW5saW5lIHZvaWQgQXN0 QmxvY2s6OkFsbG9jYXRlTGFiZWxzKGludCBlc3RpbWF0ZSkKewogICAgaWYgKCEgbGFiZWxzKQog ICAgICAgIGxhYmVscyA9IHBvb2wgLT4gTmV3VG9rZW5JbmRleEFycmF5KGVzdGltYXRlKTsKfQoK aW5saW5lIHZvaWQgQXN0QmxvY2s6OkFkZExhYmVsKExleFN0cmVhbTo6VG9rZW5JbmRleCBsYWJl bF90b2tlbl9pbmRleCkKewogICAgaWYgKCEgbGFiZWxzKQogICAgICAgIEFsbG9jYXRlTGFiZWxz KCk7CiAgICBsYWJlbHMgLT4gTmV4dCgpID0gbGFiZWxfdG9rZW5faW5kZXg7Cn0KCmlubGluZSB2 b2lkIEFzdEJsb2NrOjpBbGxvY2F0ZUxvY2FsbHlEZWZpbmVkVmFyaWFibGVzKGludCBlc3RpbWF0 ZSkKewogICAgaWYgKCEgbG9jYWxseV9kZWZpbmVkX3ZhcmlhYmxlcykKICAgICAgICBsb2NhbGx5 X2RlZmluZWRfdmFyaWFibGVzID0gcG9vbCAtPiBOZXdWYXJpYWJsZVN5bWJvbEFycmF5KGVzdGlt YXRlKTsKfQoKaW5saW5lIHZvaWQgQXN0QmxvY2s6OkFkZExvY2FsbHlEZWZpbmVkVmFyaWFibGUo VmFyaWFibGVTeW1ib2wgKnZhcmlhYmxlX3N5bWJvbCkKewogICAgaWYgKCEgbG9jYWxseV9kZWZp bmVkX3ZhcmlhYmxlcykKICAgICAgICBBbGxvY2F0ZUxvY2FsbHlEZWZpbmVkVmFyaWFibGVzKCk7 CiAgICBsb2NhbGx5X2RlZmluZWRfdmFyaWFibGVzIC0+IE5leHQoKSA9IHZhcmlhYmxlX3N5bWJv bDsKfQoKaW5saW5lIHZvaWQgQXN0QmxvY2s6OlRyYW5zZmVyTG9jYWxseURlZmluZWRWYXJpYWJs ZXNUbyhBc3RTd2l0Y2hCbG9ja1N0YXRlbWVudCAqc3dpdGNoX2Jsb2NrX3N0YXRlbWVudCkKewog ICAgc3dpdGNoX2Jsb2NrX3N0YXRlbWVudCAtPiBsb2NhbGx5X2RlZmluZWRfdmFyaWFibGVzID0g dGhpcyAtPiBsb2NhbGx5X2RlZmluZWRfdmFyaWFibGVzOwogICAgdGhpcyAtPiBsb2NhbGx5X2Rl ZmluZWRfdmFyaWFibGVzID0gX19udWxsIDsKfQoKaW5saW5lIHZvaWQgQXN0U3RhdGVtZW50OjpB bGxvY2F0ZURlZmluZWRWYXJpYWJsZXMoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISBkZWZpbmVk X3ZhcmlhYmxlcykKICAgICAgICBkZWZpbmVkX3ZhcmlhYmxlcyA9IHBvb2wgLT4gTmV3VmFyaWFi bGVTeW1ib2xBcnJheShlc3RpbWF0ZSk7Cn0KCmlubGluZSB2b2lkIEFzdFN0YXRlbWVudDo6QWRk RGVmaW5lZFZhcmlhYmxlKFZhcmlhYmxlU3ltYm9sICp2YXJpYWJsZV9zeW1ib2wpCnsKICAgIGlm ICghIGRlZmluZWRfdmFyaWFibGVzKQogICAgICAgIEFsbG9jYXRlRGVmaW5lZFZhcmlhYmxlcygp OwogICAgZGVmaW5lZF92YXJpYWJsZXMgLT4gTmV4dCgpID0gdmFyaWFibGVfc3ltYm9sOwp9Cgpp bmxpbmUgdm9pZCBBc3RTd2l0Y2hCbG9ja1N0YXRlbWVudDo6QWxsb2NhdGVCbG9ja1N0YXRlbWVu dHMoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISBibG9ja19zdGF0ZW1lbnRzKQogICAgICAgIGJs b2NrX3N0YXRlbWVudHMgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8 QXN0U3RhdGVtZW50ICo+ICo+CgoKCiAgICAgICAgICAgIChwb29sIC0+IE5ld0FzdEFycmF5KGVz dGltYXRlKSk7Cn0KCmlubGluZSB2b2lkIEFzdFN3aXRjaEJsb2NrU3RhdGVtZW50OjpBZGRTdGF0 ZW1lbnQoQXN0U3RhdGVtZW50ICpzdGF0ZW1lbnQpCnsKICAgIGlmICghIGJsb2NrX3N0YXRlbWVu dHMpCiAgICAgICAgQWxsb2NhdGVCbG9ja1N0YXRlbWVudHMoKTsKICAgIGJsb2NrX3N0YXRlbWVu dHMgLT4gTmV4dCgpID0gc3RhdGVtZW50Owp9CgppbmxpbmUgdm9pZCBBc3RTd2l0Y2hCbG9ja1N0 YXRlbWVudDo6QWxsb2NhdGVTd2l0Y2hMYWJlbHMoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISBz d2l0Y2hfbGFiZWxzKQogICAgICAgIHN3aXRjaF9sYWJlbHMgPSBwb29sIC0+IE5ld0FzdEFycmF5 KGVzdGltYXRlKTsKfQoKaW5saW5lIHZvaWQgQXN0U3dpdGNoQmxvY2tTdGF0ZW1lbnQ6OkFkZFN3 aXRjaExhYmVsKEFzdCAqY2FzZV9vcl9kZWZhdWx0X2xhYmVsKQp7CiAgICBpZiAoISBzd2l0Y2hf bGFiZWxzKQogICAgICAgIEFsbG9jYXRlU3dpdGNoTGFiZWxzKCk7CiAgICBzd2l0Y2hfbGFiZWxz IC0+IE5leHQoKSA9IGNhc2Vfb3JfZGVmYXVsdF9sYWJlbDsKfQoKaW5saW5lIHZvaWQgQXN0U3dp dGNoU3RhdGVtZW50OjpBbGxvY2F0ZUNhc2VzKGludCBlc3RpbWF0ZSkKewogICAgaWYgKCEgY2Fz ZXMpCiAgICAgICAgY2FzZXMgPSBwb29sIC0+IE5ld0Nhc2VFbGVtZW50QXJyYXkoZXN0aW1hdGUp Owp9CgppbmxpbmUgdm9pZCBBc3RTd2l0Y2hTdGF0ZW1lbnQ6OkFkZENhc2UoQ2FzZUVsZW1lbnQg KmNhc2VfZWxlbWVudCkKewogICAgaWYgKCEgY2FzZXMpCiAgICAgICAgQWxsb2NhdGVDYXNlcygp OwogICAgY2FzZXMgLT4gTmV4dCgpID0gY2FzZV9lbGVtZW50Owp9CgppbmxpbmUgdm9pZCBBc3RD b25zdHJ1Y3RvckJsb2NrOjpBbGxvY2F0ZUxvY2FsSW5pdFN0YXRlbWVudHMoaW50IGVzdGltYXRl KQp7CiAgICBpZiAoISBsb2NhbF9pbml0X3N0YXRlbWVudHMpCiAgICAgICAgbG9jYWxfaW5pdF9z dGF0ZW1lbnRzID0gCgogICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFycmF5PEFzdFN0 YXRlbWVudCAqPiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheShlc3RpbWF0 ZSkpOwp9CgppbmxpbmUgdm9pZCBBc3RDb25zdHJ1Y3RvckJsb2NrOjpBZGRMb2NhbEluaXRTdGF0 ZW1lbnQoQXN0U3RhdGVtZW50ICpzdGF0ZW1lbnQpCnsKICAgIGlmICghIGxvY2FsX2luaXRfc3Rh dGVtZW50cykKICAgICAgICBBbGxvY2F0ZUxvY2FsSW5pdFN0YXRlbWVudHMoKTsKICAgIGxvY2Fs X2luaXRfc3RhdGVtZW50cyAtPiBOZXh0KCkgPSBzdGF0ZW1lbnQ7Cn0KCmlubGluZSB2b2lkIEFz dFZhcmlhYmxlRGVjbGFyYXRvcklkOjpBbGxvY2F0ZUJyYWNrZXRzKGludCBlc3RpbWF0ZSkKewog ICAgaWYgKCEgYnJhY2tldHMpCiAgICAgICAgYnJhY2tldHMgPSAKCiAgICAgICAgICAgIHJlaW50 ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0QnJhY2tldHMgKj4gKj4KCgoKICAgICAgICAgICAgKHBv b2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoKaW5saW5lIHZvaWQgQXN0VmFyaWFibGVE ZWNsYXJhdG9ySWQ6OkFkZEJyYWNrZXRzKEFzdEJyYWNrZXRzICpicmFja2V0KQp7CiAgICBpZiAo ISBicmFja2V0cykKICAgICAgICBBbGxvY2F0ZUJyYWNrZXRzKCk7CiAgICBicmFja2V0cyAtPiBO ZXh0KCkgPSBicmFja2V0Owp9CgppbmxpbmUgdm9pZCBBc3RBcnJheVR5cGU6OkFsbG9jYXRlQnJh Y2tldHMoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISBicmFja2V0cykKICAgICAgICBicmFja2V0 cyA9IAoKICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBc3RBcnJheTxBc3RCcmFja2V0cyAq PiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheShlc3RpbWF0ZSkpOwp9Cgpp bmxpbmUgdm9pZCBBc3RBcnJheVR5cGU6OkFkZEJyYWNrZXRzKEFzdEJyYWNrZXRzICpicmFja2V0 KQp7CiAgICBpZiAoISBicmFja2V0cykKICAgICAgICBBbGxvY2F0ZUJyYWNrZXRzKCk7CiAgICBi cmFja2V0cyAtPiBOZXh0KCkgPSBicmFja2V0Owp9CgppbmxpbmUgdm9pZCBBc3RNZXRob2REZWNs YXJhdG9yOjpBbGxvY2F0ZUJyYWNrZXRzKGludCBlc3RpbWF0ZSkKewogICAgaWYgKCEgYnJhY2tl dHMpCiAgICAgICAgYnJhY2tldHMgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0 QXJyYXk8QXN0QnJhY2tldHMgKj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJy YXkoZXN0aW1hdGUpKTsKfQoKaW5saW5lIHZvaWQgQXN0TWV0aG9kRGVjbGFyYXRvcjo6QWRkQnJh Y2tldHMoQXN0QnJhY2tldHMgKmJyYWNrZXQpCnsKICAgIGlmICghIGJyYWNrZXRzKQogICAgICAg IEFsbG9jYXRlQnJhY2tldHMoKTsKICAgIGJyYWNrZXRzIC0+IE5leHQoKSA9IGJyYWNrZXQ7Cn0K CmlubGluZSB2b2lkIEFzdEFycmF5Q3JlYXRpb25FeHByZXNzaW9uOjpBbGxvY2F0ZUJyYWNrZXRz KGludCBlc3RpbWF0ZSkKewogICAgaWYgKCEgYnJhY2tldHMpCiAgICAgICAgYnJhY2tldHMgPSAK CiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0QnJhY2tldHMgKj4gKj4K CgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoKaW5saW5l IHZvaWQgQXN0QXJyYXlDcmVhdGlvbkV4cHJlc3Npb246OkFkZEJyYWNrZXRzKEFzdEJyYWNrZXRz ICpicmFja2V0KQp7CiAgICBpZiAoISBicmFja2V0cykKICAgICAgICBBbGxvY2F0ZUJyYWNrZXRz KCk7CiAgICBicmFja2V0cyAtPiBOZXh0KCkgPSBicmFja2V0Owp9CgppbmxpbmUgdm9pZCBBc3RD YXN0RXhwcmVzc2lvbjo6QWxsb2NhdGVCcmFja2V0cyhpbnQgZXN0aW1hdGUpCnsKICAgIGlmICgh IGJyYWNrZXRzKQogICAgICAgIGJyYWNrZXRzID0gCgogICAgICAgICAgICByZWludGVycHJldF9j YXN0PEFzdEFycmF5PEFzdEJyYWNrZXRzICo+ICo+CgoKCiAgICAgICAgICAgIChwb29sIC0+IE5l d0FzdEFycmF5KGVzdGltYXRlKSk7Cn0KCmlubGluZSB2b2lkIEFzdENhc3RFeHByZXNzaW9uOjpB ZGRCcmFja2V0cyhBc3RCcmFja2V0cyAqYnJhY2tldCkKewogICAgaWYgKCEgYnJhY2tldHMpCiAg ICAgICAgQWxsb2NhdGVCcmFja2V0cygpOwogICAgYnJhY2tldHMgLT4gTmV4dCgpID0gYnJhY2tl dDsKfQoKaW5saW5lIHZvaWQgQXN0QXJyYXlDcmVhdGlvbkV4cHJlc3Npb246OkFsbG9jYXRlRGlt RXhwcnMoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISBkaW1fZXhwcnMpCiAgICAgICAgZGltX2V4 cHJzID0gCgogICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFycmF5PEFzdERpbUV4cHIg Kj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoK aW5saW5lIHZvaWQgQXN0QXJyYXlDcmVhdGlvbkV4cHJlc3Npb246OkFkZERpbUV4cHIoQXN0RGlt RXhwciAqZGltX2V4cHIpCnsKICAgIGlmICghIGRpbV9leHBycykKICAgICAgICBBbGxvY2F0ZURp bUV4cHJzKCk7ICAKICAgIGRpbV9leHBycyAtPiBOZXh0KCkgPSBkaW1fZXhwcjsKfQoKaW5saW5l IHZvaWQgQXN0VGhpc0NhbGw6OkFsbG9jYXRlQXJndW1lbnRzKGludCBlc3RpbWF0ZSkKewogICAg aWYgKCEgYXJndW1lbnRzKQogICAgICAgIGFyZ3VtZW50cyA9IAoKICAgICAgICAgICAgcmVpbnRl cnByZXRfY2FzdDxBc3RBcnJheTxBc3RFeHByZXNzaW9uICo+ICo+CgoKCiAgICAgICAgICAgIChw b29sIC0+IE5ld0FzdEFycmF5KGVzdGltYXRlKSk7Cn0KCmlubGluZSB2b2lkIEFzdFRoaXNDYWxs OjpBZGRBcmd1bWVudChBc3RFeHByZXNzaW9uICphcmd1bWVudCkKewogICAgaWYgKCEgYXJndW1l bnRzKQogICAgICAgIEFsbG9jYXRlQXJndW1lbnRzKCk7ICAKICAgIGFyZ3VtZW50cyAtPiBOZXh0 KCkgPSBhcmd1bWVudDsKfQoKaW5saW5lIHZvaWQgQXN0U3VwZXJDYWxsOjpBbGxvY2F0ZUFyZ3Vt ZW50cyhpbnQgZXN0aW1hdGUpCnsKICAgIGlmICghIGFyZ3VtZW50cykKICAgICAgICBhcmd1bWVu dHMgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0RXhwcmVzc2lv biAqPiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheShlc3RpbWF0ZSkpOwp9 CgppbmxpbmUgdm9pZCBBc3RTdXBlckNhbGw6OkFkZEFyZ3VtZW50KEFzdEV4cHJlc3Npb24gKmFy Z3VtZW50KQp7CiAgICBpZiAoISBhcmd1bWVudHMpCiAgICAgICAgQWxsb2NhdGVBcmd1bWVudHMo KTsgIAogICAgYXJndW1lbnRzIC0+IE5leHQoKSA9IGFyZ3VtZW50Owp9CgppbmxpbmUgdm9pZCBB c3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uOjpBbGxvY2F0ZUFyZ3VtZW50cyhpbnQg ZXN0aW1hdGUpCnsKICAgIGlmICghIGFyZ3VtZW50cykKICAgICAgICBhcmd1bWVudHMgPSAKCiAg ICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0RXhwcmVzc2lvbiAqPiAqPgoK CgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheShlc3RpbWF0ZSkpOwp9CgppbmxpbmUg dm9pZCBBc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uOjpBZGRBcmd1bWVudChBc3RF eHByZXNzaW9uICphcmd1bWVudCkKewogICAgaWYgKCEgYXJndW1lbnRzKQogICAgICAgIEFsbG9j YXRlQXJndW1lbnRzKCk7ICAKICAgIGFyZ3VtZW50cyAtPiBOZXh0KCkgPSBhcmd1bWVudDsKfQoK aW5saW5lIHZvaWQgQXN0TWV0aG9kSW52b2NhdGlvbjo6QWxsb2NhdGVBcmd1bWVudHMoaW50IGVz dGltYXRlKQp7CiAgICBpZiAoISBhcmd1bWVudHMpCiAgICAgICAgYXJndW1lbnRzID0gCgogICAg ICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFycmF5PEFzdEV4cHJlc3Npb24gKj4gKj4KCgoK ICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoKaW5saW5lIHZv aWQgQXN0TWV0aG9kSW52b2NhdGlvbjo6QWRkQXJndW1lbnQoQXN0RXhwcmVzc2lvbiAqYXJndW1l bnQpCnsKICAgIGlmICghIGFyZ3VtZW50cykKICAgICAgICBBbGxvY2F0ZUFyZ3VtZW50cygpOyAg CiAgICBhcmd1bWVudHMgLT4gTmV4dCgpID0gYXJndW1lbnQ7Cn0KCmlubGluZSB2b2lkIEFzdFRo aXNDYWxsOjpBbGxvY2F0ZUxvY2FsQXJndW1lbnRzKGludCBlc3RpbWF0ZSkKewogICAgaWYgKCEg bG9jYWxfYXJndW1lbnRzX29wdCkKICAgICAgICBsb2NhbF9hcmd1bWVudHNfb3B0ID0gCgogICAg ICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFycmF5PEFzdEV4cHJlc3Npb24gKj4gKj4KCgoK ICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoKaW5saW5lIHZv aWQgQXN0VGhpc0NhbGw6OkFkZExvY2FsQXJndW1lbnQoQXN0RXhwcmVzc2lvbiAqYXJndW1lbnQp CnsKICAgIGlmICghIGxvY2FsX2FyZ3VtZW50c19vcHQpCiAgICAgICAgQWxsb2NhdGVMb2NhbEFy Z3VtZW50cygpOwogICAgbG9jYWxfYXJndW1lbnRzX29wdCAtPiBOZXh0KCkgPSBhcmd1bWVudDsK fQoKaW5saW5lIHZvaWQgQXN0U3VwZXJDYWxsOjpBbGxvY2F0ZUxvY2FsQXJndW1lbnRzKGludCBl c3RpbWF0ZSkKewogICAgaWYgKCEgbG9jYWxfYXJndW1lbnRzX29wdCkKICAgICAgICBsb2NhbF9h cmd1bWVudHNfb3B0ID0gCgogICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFycmF5PEFz dEV4cHJlc3Npb24gKj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0 aW1hdGUpKTsKfQoKaW5saW5lIHZvaWQgQXN0U3VwZXJDYWxsOjpBZGRMb2NhbEFyZ3VtZW50KEFz dEV4cHJlc3Npb24gKmFyZ3VtZW50KQp7CiAgICBpZiAoISBsb2NhbF9hcmd1bWVudHNfb3B0KQog ICAgICAgIEFsbG9jYXRlTG9jYWxBcmd1bWVudHMoKTsKICAgIGxvY2FsX2FyZ3VtZW50c19vcHQg LT4gTmV4dCgpID0gYXJndW1lbnQ7Cn0KCmlubGluZSB2b2lkIEFzdENsYXNzSW5zdGFuY2VDcmVh dGlvbkV4cHJlc3Npb246OkFsbG9jYXRlTG9jYWxBcmd1bWVudHMoaW50IGVzdGltYXRlKQp7CiAg ICBpZiAoISBsb2NhbF9hcmd1bWVudHNfb3B0KQogICAgICAgIGxvY2FsX2FyZ3VtZW50c19vcHQg PSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0RXhwcmVzc2lvbiAq PiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheShlc3RpbWF0ZSkpOwp9Cgpp bmxpbmUgdm9pZCBBc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uOjpBZGRMb2NhbEFy Z3VtZW50KEFzdEV4cHJlc3Npb24gKmFyZ3VtZW50KQp7CiAgICBpZiAoISBsb2NhbF9hcmd1bWVu dHNfb3B0KQogICAgICAgIEFsbG9jYXRlTG9jYWxBcmd1bWVudHMoKTsKICAgIGxvY2FsX2FyZ3Vt ZW50c19vcHQgLT4gTmV4dCgpID0gYXJndW1lbnQ7Cn0KCmlubGluZSB2b2lkIEFzdE1ldGhvZERl Y2xhcmF0aW9uOjpBbGxvY2F0ZVRocm93cyhpbnQgZXN0aW1hdGUpCnsKICAgIGlmICghIHRocm93 cykKICAgICAgICB0aHJvd3MgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJy YXk8QXN0RXhwcmVzc2lvbiAqPiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJh eShlc3RpbWF0ZSkpOwp9CgppbmxpbmUgdm9pZCBBc3RNZXRob2REZWNsYXJhdGlvbjo6QWRkVGhy b3coQXN0RXhwcmVzc2lvbiAqZXhjZXB0aW9uKQp7CiAgICBpZiAoISB0aHJvd3MpCiAgICAgICAg QWxsb2NhdGVUaHJvd3MoKTsKICAgIHRocm93cyAtPiBOZXh0KCkgPSBleGNlcHRpb247Cn0KCmlu bGluZSB2b2lkIEFzdENvbnN0cnVjdG9yRGVjbGFyYXRpb246OkFsbG9jYXRlVGhyb3dzKGludCBl c3RpbWF0ZSkKewogICAgaWYgKCEgdGhyb3dzKQogICAgICAgIHRocm93cyA9IAoKICAgICAgICAg ICAgcmVpbnRlcnByZXRfY2FzdDxBc3RBcnJheTxBc3RFeHByZXNzaW9uICo+ICo+CgoKCiAgICAg ICAgICAgIChwb29sIC0+IE5ld0FzdEFycmF5KGVzdGltYXRlKSk7Cn0KCmlubGluZSB2b2lkIEFz dENvbnN0cnVjdG9yRGVjbGFyYXRpb246OkFkZFRocm93KEFzdEV4cHJlc3Npb24gKmV4Y2VwdGlv bikKewogICAgaWYgKCEgdGhyb3dzKQogICAgICAgIEFsbG9jYXRlVGhyb3dzKCk7CiAgICB0aHJv d3MgLT4gTmV4dCgpID0gZXhjZXB0aW9uOwp9CgppbmxpbmUgdm9pZCBBc3RNZXRob2REZWNsYXJh dG9yOjpBbGxvY2F0ZUZvcm1hbFBhcmFtZXRlcnMoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISBm b3JtYWxfcGFyYW1ldGVycykKICAgICAgICBmb3JtYWxfcGFyYW1ldGVycyA9IAoKICAgICAgICAg ICAgcmVpbnRlcnByZXRfY2FzdDxBc3RBcnJheTxBc3RGb3JtYWxQYXJhbWV0ZXIgKj4gKj4KCgoK ICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoKaW5saW5lIHZv aWQgQXN0TWV0aG9kRGVjbGFyYXRvcjo6QWRkRm9ybWFsUGFyYW1ldGVyKEFzdEZvcm1hbFBhcmFt ZXRlciAqZm9ybWFsX3BhcmFtZXRlcikKewogICAgaWYgKCEgZm9ybWFsX3BhcmFtZXRlcnMpCiAg ICAgICAgQWxsb2NhdGVGb3JtYWxQYXJhbWV0ZXJzKCk7CiAgICBmb3JtYWxfcGFyYW1ldGVycyAt PiBOZXh0KCkgPSBmb3JtYWxfcGFyYW1ldGVyOwp9CgppbmxpbmUgdm9pZCBBc3RMb2NhbFZhcmlh YmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQ6OkFsbG9jYXRlVmFyaWFibGVEZWNsYXJhdG9ycyhpbnQg ZXN0aW1hdGUpCnsKICAgIGlmICghIHZhcmlhYmxlX2RlY2xhcmF0b3JzKQogICAgICAgIHZhcmlh YmxlX2RlY2xhcmF0b3JzID0gCgogICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFycmF5 PEFzdFZhcmlhYmxlRGVjbGFyYXRvciAqPiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdB c3RBcnJheShlc3RpbWF0ZSkpOwp9CgppbmxpbmUgdm9pZCBBc3RMb2NhbFZhcmlhYmxlRGVjbGFy YXRpb25TdGF0ZW1lbnQ6OkFkZFZhcmlhYmxlRGVjbGFyYXRvcihBc3RWYXJpYWJsZURlY2xhcmF0 b3IgKnZhcmlhYmxlX2RlY2xhcmF0b3IpCnsKICAgIGlmICghIHZhcmlhYmxlX2RlY2xhcmF0b3Jz KQogICAgICAgIEFsbG9jYXRlVmFyaWFibGVEZWNsYXJhdG9ycygpOwogICAgdmFyaWFibGVfZGVj bGFyYXRvcnMgLT4gTmV4dCgpID0gdmFyaWFibGVfZGVjbGFyYXRvcjsKfQoKaW5saW5lIHZvaWQg QXN0RmllbGREZWNsYXJhdGlvbjo6QWxsb2NhdGVWYXJpYWJsZURlY2xhcmF0b3JzKGludCBlc3Rp bWF0ZSkKewogICAgaWYgKCEgdmFyaWFibGVfZGVjbGFyYXRvcnMpCiAgICAgICAgdmFyaWFibGVf ZGVjbGFyYXRvcnMgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0 VmFyaWFibGVEZWNsYXJhdG9yICo+ICo+CgoKCiAgICAgICAgICAgIChwb29sIC0+IE5ld0FzdEFy cmF5KGVzdGltYXRlKSk7Cn0KCmlubGluZSB2b2lkIEFzdEZpZWxkRGVjbGFyYXRpb246OkFkZFZh cmlhYmxlRGVjbGFyYXRvcihBc3RWYXJpYWJsZURlY2xhcmF0b3IgKnZhcmlhYmxlX2RlY2xhcmF0 b3IpCnsKICAgIGlmICghIHZhcmlhYmxlX2RlY2xhcmF0b3JzKQogICAgICAgIEFsbG9jYXRlVmFy aWFibGVEZWNsYXJhdG9ycygpOwogICAgdmFyaWFibGVfZGVjbGFyYXRvcnMgLT4gTmV4dCgpID0g dmFyaWFibGVfZGVjbGFyYXRvcjsKfQoKaW5saW5lIHZvaWQgQXN0Q2xhc3NEZWNsYXJhdGlvbjo6 QWxsb2NhdGVJbnRlcmZhY2VzKGludCBlc3RpbWF0ZSkKewogICAgaWYgKCEgaW50ZXJmYWNlcykK ICAgICAgICBpbnRlcmZhY2VzID0gCgogICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFzdEFy cmF5PEFzdEV4cHJlc3Npb24gKj4gKj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJy YXkoZXN0aW1hdGUpKTsKfQoKaW5saW5lIHZvaWQgQXN0Q2xhc3NEZWNsYXJhdGlvbjo6QWRkSW50 ZXJmYWNlKEFzdEV4cHJlc3Npb24gKmludGVyZikKewogICAgaWYgKCEgaW50ZXJmYWNlcykKICAg ICAgICBBbGxvY2F0ZUludGVyZmFjZXMoKTsKICAgIGludGVyZmFjZXMgLT4gTmV4dCgpID0gaW50 ZXJmOwp9CgppbmxpbmUgdm9pZCBBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbjo6QWxsb2NhdGVFeHRl bmRzSW50ZXJmYWNlcyhpbnQgZXN0aW1hdGUpCnsKICAgIGlmICghIGV4dGVuZHNfaW50ZXJmYWNl cykKICAgICAgICBleHRlbmRzX2ludGVyZmFjZXMgPSAKCiAgICAgICAgICAgIHJlaW50ZXJwcmV0 X2Nhc3Q8QXN0QXJyYXk8QXN0RXhwcmVzc2lvbiAqPiAqPgoKCgogICAgICAgICAgICAocG9vbCAt PiBOZXdBc3RBcnJheShlc3RpbWF0ZSkpOwp9CgppbmxpbmUgdm9pZCBBc3RJbnRlcmZhY2VEZWNs YXJhdGlvbjo6QWRkRXh0ZW5kc0ludGVyZmFjZShBc3RFeHByZXNzaW9uICppbnRlcmYpCnsKICAg IGlmICghIGV4dGVuZHNfaW50ZXJmYWNlcykKICAgICAgICBBbGxvY2F0ZUV4dGVuZHNJbnRlcmZh Y2VzKCk7CiAgICBleHRlbmRzX2ludGVyZmFjZXMgLT4gTmV4dCgpID0gaW50ZXJmOwp9Cgppbmxp bmUgdm9pZCBBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbjo6QWxsb2NhdGVJbnRlcmZhY2VNZW1iZXJE ZWNsYXJhdGlvbnMoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISBpbnRlcmZhY2VfbWVtYmVyX2Rl Y2xhcmF0aW9ucykKICAgICAgICBpbnRlcmZhY2VfbWVtYmVyX2RlY2xhcmF0aW9ucyA9IHBvb2wg LT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpOwp9CgppbmxpbmUgdm9pZCBBc3RJbnRlcmZhY2VEZWNs YXJhdGlvbjo6QWRkSW50ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb24oQXN0ICptZW1iZXIpCnsKICAg IGlmICghIGludGVyZmFjZV9tZW1iZXJfZGVjbGFyYXRpb25zKQogICAgICAgIEFsbG9jYXRlSW50 ZXJmYWNlTWVtYmVyRGVjbGFyYXRpb25zKCk7CiAgICBpbnRlcmZhY2VfbWVtYmVyX2RlY2xhcmF0 aW9ucyAtPiBOZXh0KCkgPSBtZW1iZXI7Cn0KCmlubGluZSB2b2lkIEFzdENsYXNzQm9keTo6QWxs b2NhdGVDbGFzc0JvZHlEZWNsYXJhdGlvbnMoaW50IGVzdGltYXRlKQp7CiAgICBpZiAoISBjbGFz c19ib2R5X2RlY2xhcmF0aW9ucykKICAgICAgICBjbGFzc19ib2R5X2RlY2xhcmF0aW9ucyA9IHBv b2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpOwp9CgppbmxpbmUgdm9pZCBBc3RDbGFzc0JvZHk6 OkFkZENsYXNzQm9keURlY2xhcmF0aW9uKEFzdCAqbWVtYmVyKQp7CiAgICBpZiAoISBjbGFzc19i b2R5X2RlY2xhcmF0aW9ucykKICAgICAgICBBbGxvY2F0ZUNsYXNzQm9keURlY2xhcmF0aW9ucygp OwogICAgY2xhc3NfYm9keV9kZWNsYXJhdGlvbnMgLT4gTmV4dCgpID0gbWVtYmVyOwp9CgogCnZv aWQgQXN0Q2xhc3NCb2R5OjpBZGRDbGFzc0JvZHlEZWNsYXJhdGlvbk5pY2VseShBc3QgKm1lbWJl cikKewogICAgQXN0RmllbGREZWNsYXJhdGlvbiAqZmllbGRfZGVjbGFyYXRpb24gPSBtZW1iZXIg LT4gRmllbGREZWNsYXJhdGlvbkNhc3QoKTsKICAgIEFzdE1ldGhvZERlY2xhcmF0aW9uICptZXRo b2RfZGVjbGFyYXRpb24gPSBtZW1iZXIgLT4gTWV0aG9kRGVjbGFyYXRpb25DYXN0KCk7CiAgICBB c3RDb25zdHJ1Y3RvckRlY2xhcmF0aW9uICpjb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiA9IG1lbWJl ciAtPiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uQ2FzdCgpOwogICAgQXN0U3RhdGljSW5pdGlhbGl6 ZXIgKnN0YXRpY19pbml0aWFsaXplciA9IG1lbWJlciAtPiBTdGF0aWNJbml0aWFsaXplckNhc3Qo KTsKICAgIEFzdENsYXNzRGVjbGFyYXRpb24gKmNsYXNzX2RlY2xhcmF0aW9uID0gbWVtYmVyIC0+ IENsYXNzRGVjbGFyYXRpb25DYXN0KCk7CiAgICBBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiAqaW50 ZXJmYWNlX2RlY2xhcmF0aW9uID0gbWVtYmVyIC0+IEludGVyZmFjZURlY2xhcmF0aW9uQ2FzdCgp OwogICAgQXN0QmxvY2sgKmJsb2NrID0gbWVtYmVyIC0+IEJsb2NrQ2FzdCgpOwoKICAgIEFkZENs YXNzQm9keURlY2xhcmF0aW9uKG1lbWJlcik7CgoKICAgICAKCiAgICBpZiAoZmllbGRfZGVjbGFy YXRpb24pCiAgICB7CiAgICAgICAgaWYgKGZpZWxkX2RlY2xhcmF0aW9uIC0+IFN0YXRpY0ZpZWxk Q2FzdCgpKQogICAgICAgICAgICBBZGRDbGFzc1ZhcmlhYmxlKGZpZWxkX2RlY2xhcmF0aW9uKTsK ICAgICAgICBlbHNlIEFkZEluc3RhbmNlVmFyaWFibGUoZmllbGRfZGVjbGFyYXRpb24pOwogICAg fQogICAgZWxzZSBpZiAobWV0aG9kX2RlY2xhcmF0aW9uKQogICAgewogICAgICAgIEFkZE1ldGhv ZChtZXRob2RfZGVjbGFyYXRpb24pOwogICAgfQogICAgZWxzZSBpZiAoY29uc3RydWN0b3JfZGVj bGFyYXRpb24pCiAgICB7CiAgICAgICAgQWRkQ29uc3RydWN0b3IoY29uc3RydWN0b3JfZGVjbGFy YXRpb24pOwogICAgfQogICAgZWxzZSBpZiAoc3RhdGljX2luaXRpYWxpemVyKQogICAgewogICAg ICAgIEFkZFN0YXRpY0luaXRpYWxpemVyKHN0YXRpY19pbml0aWFsaXplcik7CiAgICB9CiAgICBl bHNlIGlmIChjbGFzc19kZWNsYXJhdGlvbikKICAgIHsKICAgICAgICBBZGROZXN0ZWRDbGFzcyhj bGFzc19kZWNsYXJhdGlvbik7CiAgICB9CiAgICBlbHNlIGlmIChpbnRlcmZhY2VfZGVjbGFyYXRp b24pCiAgICB7CiAgICAgICAgQWRkTmVzdGVkSW50ZXJmYWNlKGludGVyZmFjZV9kZWNsYXJhdGlv bik7CiAgICB9CiAgICBlbHNlIGlmIChibG9jaykKICAgIHsKICAgICAgICBBZGRCbG9jayhibG9j ayk7CiAgICB9CiAgICBlbHNlICAKICAgIHsKICAgICAgICBBZGRFbXB0eURlY2xhcmF0aW9uKChB c3RFbXB0eURlY2xhcmF0aW9uICopIG1lbWJlcik7CiAgICB9Cn0KCmlubGluZSB2b2lkIEFzdEZv clN0YXRlbWVudDo6QWxsb2NhdGVGb3JJbml0U3RhdGVtZW50cyhpbnQgZXN0aW1hdGUpCnsKICAg IGlmICghIGZvcl9pbml0X3N0YXRlbWVudHMpCiAgICAgICAgZm9yX2luaXRfc3RhdGVtZW50cyA9 IAoKICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBc3RBcnJheTxBc3RTdGF0ZW1lbnQgKj4g Kj4KCgoKICAgICAgICAgICAgKHBvb2wgLT4gTmV3QXN0QXJyYXkoZXN0aW1hdGUpKTsKfQoKaW5s aW5lIHZvaWQgQXN0Rm9yU3RhdGVtZW50OjpBZGRGb3JJbml0U3RhdGVtZW50KEFzdFN0YXRlbWVu dCAqc3RhdGVtZW50KQp7CiAgICBpZiAoISBmb3JfaW5pdF9zdGF0ZW1lbnRzKQogICAgICAgIEFs bG9jYXRlRm9ySW5pdFN0YXRlbWVudHMoKTsKICAgIGZvcl9pbml0X3N0YXRlbWVudHMgLT4gTmV4 dCgpID0gc3RhdGVtZW50Owp9CgppbmxpbmUgdm9pZCBBc3RGb3JTdGF0ZW1lbnQ6OkFsbG9jYXRl Rm9yVXBkYXRlU3RhdGVtZW50cyhpbnQgZXN0aW1hdGUpCnsKICAgIGlmICghIGZvcl91cGRhdGVf c3RhdGVtZW50cykKICAgICAgICBmb3JfdXBkYXRlX3N0YXRlbWVudHMgPSAKCiAgICAgICAgICAg IHJlaW50ZXJwcmV0X2Nhc3Q8QXN0QXJyYXk8QXN0RXhwcmVzc2lvblN0YXRlbWVudCAqPiAqPgoK CgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheShlc3RpbWF0ZSkpOwp9CgppbmxpbmUg dm9pZCBBc3RGb3JTdGF0ZW1lbnQ6OkFkZEZvclVwZGF0ZVN0YXRlbWVudChBc3RFeHByZXNzaW9u U3RhdGVtZW50ICpzdGF0ZW1lbnQpCnsKICAgIGlmICghIGZvcl91cGRhdGVfc3RhdGVtZW50cykK ICAgICAgICBBbGxvY2F0ZUZvclVwZGF0ZVN0YXRlbWVudHMoKTsKICAgIGZvcl91cGRhdGVfc3Rh dGVtZW50cyAtPiBOZXh0KCkgPSBzdGF0ZW1lbnQ7Cn0KCmlubGluZSB2b2lkIEFzdEFycmF5SW5p dGlhbGl6ZXI6OkFsbG9jYXRlVmFyaWFibGVJbml0aWFsaXplcnMoaW50IGVzdGltYXRlKQp7CiAg ICBpZiAoISB2YXJpYWJsZV9pbml0aWFsaXplcnMpCiAgICAgICAgdmFyaWFibGVfaW5pdGlhbGl6 ZXJzID0gcG9vbCAtPiBOZXdBc3RBcnJheShlc3RpbWF0ZSk7Cn0KCmlubGluZSB2b2lkIEFzdEFy cmF5SW5pdGlhbGl6ZXI6OkFkZFZhcmlhYmxlSW5pdGlhbGl6ZXIoQXN0ICppbml0aWFsaXplcikK ewogICAgaWYgKCEgdmFyaWFibGVfaW5pdGlhbGl6ZXJzKQogICAgICAgIEFsbG9jYXRlVmFyaWFi bGVJbml0aWFsaXplcnMoKTsKICAgIHZhcmlhYmxlX2luaXRpYWxpemVycyAtPiBOZXh0KCkgPSBp bml0aWFsaXplcjsKfQoKaW5saW5lIHZvaWQgQXN0VHJ5U3RhdGVtZW50OjpBbGxvY2F0ZUNhdGNo Q2xhdXNlcyhpbnQgZXN0aW1hdGUpCnsKICAgIGlmICghIGNhdGNoX2NsYXVzZXMpCiAgICAgICAg Y2F0Y2hfY2xhdXNlcyA9IAoKICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBc3RBcnJheTxB c3RDYXRjaENsYXVzZSAqPiAqPgoKCgogICAgICAgICAgICAocG9vbCAtPiBOZXdBc3RBcnJheShl c3RpbWF0ZSkpOwp9CgppbmxpbmUgdm9pZCBBc3RUcnlTdGF0ZW1lbnQ6OkFkZENhdGNoQ2xhdXNl KEFzdENhdGNoQ2xhdXNlICpjYXRjaF9jbGF1c2UpCnsKICAgIGlmICghIGNhdGNoX2NsYXVzZXMp CiAgICAgICAgQWxsb2NhdGVDYXRjaENsYXVzZXMoKTsKICAgIGNhdGNoX2NsYXVzZXMgLT4gTmV4 dCgpID0gY2F0Y2hfY2xhdXNlOwp9CgppbmxpbmUgdm9pZCBBc3RDb21waWxhdGlvblVuaXQ6OkFs bG9jYXRlSW1wb3J0RGVjbGFyYXRpb25zKGludCBlc3RpbWF0ZSkKewogICAgaWYgKCEgaW1wb3J0 X2RlY2xhcmF0aW9ucykKICAgICAgICBpbXBvcnRfZGVjbGFyYXRpb25zID0gCgogICAgICAgICAg ICByZWludGVycHJldF9jYXN0PEFzdEFycmF5PEFzdEltcG9ydERlY2xhcmF0aW9uICo+ICo+CgoK CiAgICAgICAgICAgIChwb29sIC0+IE5ld0FzdEFycmF5KGVzdGltYXRlKSk7Cn0KCmlubGluZSB2 b2lkIEFzdENvbXBpbGF0aW9uVW5pdDo6QWRkSW1wb3J0RGVjbGFyYXRpb24oQXN0SW1wb3J0RGVj bGFyYXRpb24gKmltcG9ydF9kZWNsYXJhdGlvbikKewogICAgaWYgKCEgaW1wb3J0X2RlY2xhcmF0 aW9ucykKICAgICAgICBBbGxvY2F0ZUltcG9ydERlY2xhcmF0aW9ucygpOwogICAgaW1wb3J0X2Rl Y2xhcmF0aW9ucyAtPiBOZXh0KCkgPSBpbXBvcnRfZGVjbGFyYXRpb247Cn0KCmlubGluZSB2b2lk IEFzdENvbXBpbGF0aW9uVW5pdDo6QWxsb2NhdGVUeXBlRGVjbGFyYXRpb25zKGludCBlc3RpbWF0 ZSkKewogICAgaWYgKCEgdHlwZV9kZWNsYXJhdGlvbnMpCiAgICAgICAgdHlwZV9kZWNsYXJhdGlv bnMgPSBwb29sIC0+IE5ld0FzdEFycmF5KGVzdGltYXRlKTsKfQoKaW5saW5lIHZvaWQgQXN0Q29t cGlsYXRpb25Vbml0OjpBZGRUeXBlRGVjbGFyYXRpb24oQXN0ICp0eXBlX2RlY2xhcmF0aW9uKQp7 CiAgICBpZiAoISB0eXBlX2RlY2xhcmF0aW9ucykKICAgICAgICBBbGxvY2F0ZVR5cGVEZWNsYXJh dGlvbnMoKTsKICAgIHR5cGVfZGVjbGFyYXRpb25zIC0+IE5leHQoKSA9IHR5cGVfZGVjbGFyYXRp b247Cn0KCgogCiAKIAp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgIHZvaWQgQXN0QXJyYXk8VD46OkFs bG9jYXRlTW9yZVNwYWNlKCkKICAgIHsKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAg ICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAK ICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAg IHNpemVfdCBrID0gc2l6ZSA+PiBsb2dfYmxrc2l6ZTsgIAoKICAgICAgICAgCiAgICAgICAgIAog ICAgICAgICAKICAgICAgICBpZiAoayA9PSBiYXNlX3NpemUpCiAgICAgICAgewogICAgICAgICAg ICBpbnQgb2xkX2Jhc2Vfc2l6ZSA9IGJhc2Vfc2l6ZTsKICAgICAgICAgICAgVCAqKm9sZF9iYXNl ID0gYmFzZTsKCiAgICAgICAgICAgIGJhc2Vfc2l6ZSArPSBiYXNlX2luY3JlbWVudDsKCiAgICAg ICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggYmFzZV9zaXplIDw9IHBvb2wgLT4gQmxrc2l6 ZSgpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJiYXNlX3NpemUgPD0gcG9vbCAtPiBCbGtzaXpl KCkiICwgIi4uLy4uL2ppa2VzL3NyYy9hc3QuaCIsIDY4ODcsIF9fUFJFVFRZX0ZVTkNUSU9OX18g KSwgMCkpKSA7ICAKCiAgICAgICAgICAgIGJhc2UgPSAoVCAqKikgcG9vbCAtPiBBbGxvYyhzaXpl b2YoVCAqKSAqIGJhc2Vfc2l6ZSk7CgogICAgICAgICAgICBpZiAob2xkX2Jhc2UgIT0gX19udWxs ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVtbW92ZShiYXNlLCBvbGRfYmFzZSwg b2xkX2Jhc2Vfc2l6ZSAqIHNpemVvZihUICopKTsKIAogCiAgICAgICAgICAgIH0KICAgICAgICAg ICAgbWVtc2V0KCZiYXNlW29sZF9iYXNlX3NpemVdLCAwLCAoYmFzZV9zaXplIC0gb2xkX2Jhc2Vf c2l6ZSkgKiBzaXplb2YoVCAqKSk7CiAgICAgICAgfQoKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAoc3RhdGljX2Nhc3Q8 dm9pZD4gICgoIEJsa3NpemUoKSA8PSBwb29sIC0+IEJsa3NpemUoKSApID8gMCA6CShfX2Fzc2Vy dF9mYWlsICgiQmxrc2l6ZSgpIDw9IHBvb2wgLT4gQmxrc2l6ZSgpIiAsICIuLi8uLi9qaWtlcy9z cmMvYXN0LmgiLCA2OTA2LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOyAgCgogICAgICAg IGJhc2Vba10gPSAoVCAqKSBwb29sIC0+IEFsbG9jKHNpemVvZihUKSAqIEJsa3NpemUoKSk7CiAg ICAgICAgYmFzZVtrXSAtPSBzaXplOwoKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAg ICAgICBzaXplICs9IEJsa3NpemUoKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKCnRlbXBsYXRl IDxjbGFzcyBUPgogICAgIAogICAgIAogICAgIAogICAgQXN0QXJyYXk8VD46OkFzdEFycmF5KFN0 b3JhZ2VQb29sICpwb29sXywgdW5zaWduZWQgZXN0aW1hdGUpIDogcG9vbChwb29sXykKICAgIHsK ICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIHNpemVvZihUKSA9PSBzaXplb2YoU3RvcmFn ZVBvb2w6OkNlbGwpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJzaXplb2YoVCkgPT0gc2l6ZW9m KFN0b3JhZ2VQb29sOjpDZWxsKSIgLCAiLi4vLi4vamlrZXMvc3JjL2FzdC5oIiwgNjkyNiwgX19Q UkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsgIAogICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAg KCggcG9vbCAtPiBCbGtzaXplKCkgPj0gMjU2ICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJwb29s IC0+IEJsa3NpemUoKSA+PSAyNTYiICwgIi4uLy4uL2ppa2VzL3NyYy9hc3QuaCIsIDY5MjcsIF9f UFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7ICAKCiAgICAgICAgaWYgKGVzdGltYXRlID09IDAp CiAgICAgICAgICAgIGxvZ19ibGtzaXplID0gNjsgIAogICAgICAgIGVsc2UKICAgICAgICB7CiAg ICAgICAgICAgIGZvciAobG9nX2Jsa3NpemUgPSAxOyAoKCh1bnNpZ25lZCkgMSA8PCBsb2dfYmxr c2l6ZSkgPCBlc3RpbWF0ZSkgJiYgKGxvZ19ibGtzaXplIDwgMzEpOyBsb2dfYmxrc2l6ZSsrKQog ICAgICAgICAgICAgICAgOwogICAgICAgIH0KCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAg CiAgICAgICAgIAogICAgICAgICAKICAgICAgICBiYXNlX2luY3JlbWVudCA9IChCbGtzaXplKCkg PiBwb29sIC0+IEJsa3NpemUoKSA/IEJsa3NpemUoKSAvIHBvb2wgLT4gQmxrc2l6ZSgpIDogMSkg KiAyOwogICAgICAgIHdoaWxlIChCbGtzaXplKCkgPj0gcG9vbCAtPiBCbGtzaXplKCkpCiAgICAg ICAgICAgIGxvZ19ibGtzaXplLS07CgogICAgICAgIGJhc2Vfc2l6ZSA9IDA7CiAgICAgICAgc2l6 ZSA9IDA7CiAgICAgICAgdG9wID0gMDsKICAgICAgICBiYXNlID0gX19udWxsIDsKICAgIH0KCgoK CgoKCiMgMTQgIi4uLy4uL2ppa2VzL3NyYy9zZW1hbnRpYy5oIiAyCgojIDEgIi4uLy4uL2ppa2Vz L3NyYy9kaWFnbm9zZS5oIiAxCiAKIAogCiAKIAogCiAKIAogCgoKCgoKCgoKCgoKc3RydWN0IFJl cGFpckNhbmRpZGF0ZQp7CiAgICBpbnQgc3ltYm9sOwogICAgTG9jYXRpb24gbG9jYXRpb247Cn07 CgpzdHJ1Y3QgU3RhdGVJbmZvCnsKICAgIGludCBzdGF0ZSwKICAgICAgICBuZXh0Owp9OwoKY2xh c3MgUGFyc2VFcnJvckluZm86IHB1YmxpYyBKaWtlc0Vycm9yCnsKICAgIGZyaWVuZCBjbGFzcyBQ YXJzZUVycm9yOwogICAgCiBwdWJsaWM6CiAgICAKICAgIHZpcnR1YWwgY29uc3Qgd2NoYXJfdCAq Z2V0RXJyb3JNZXNzYWdlKCk7CiAgICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QgKmdldEVycm9yUmVw b3J0KCk7CiAgICAKICAgIHZpcnR1YWwgSmlrZXNFcnJvclNldmVyaXR5IGdldFNldmVyaXR5KCk7 CiAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKmdldEZpbGVOYW1lKCk7CiAgICAKICAgIHZpcnR1YWwg aW50IGdldExlZnRMaW5lTm8gICAgICAoKTsKICAgIHZpcnR1YWwgaW50IGdldExlZnRDb2x1bW5O byAgICAoKTsKICAgIHZpcnR1YWwgaW50IGdldFJpZ2h0TGluZU5vICAgICAoKTsKICAgIHZpcnR1 YWwgaW50IGdldFJpZ2h0Q29sdW1uTm8gICAoKTsKCiBwcm90ZWN0ZWQ6ICAgICAgICAKCiBwcml2 YXRlOgogICAgCiAgICBpbnQgbGVmdF9saW5lX25vICAgIDsKICAgIGludCBsZWZ0X2NvbHVtbl9u byAgOwogICAgaW50IHJpZ2h0X2xpbmVfbm8gICA7CiAgICBpbnQgcmlnaHRfY29sdW1uX25vIDsK ICAgIAogICAgc3RhdGljIGJvb2wgZW1hY3Nfc3R5bGVfcmVwb3J0OwogICAgTGV4U3RyZWFtICps ZXhfc3RyZWFtOwogICAgCiAgICB2b2lkIEluaXRpYWxpemUoTGV4U3RyZWFtICopOwoKICAgIHdj aGFyX3QgKnJlZ3VsYXJFcnJvclN0cmluZyAoKTsKICAgIHdjaGFyX3QgKmVtYWNzRXJyb3JTdHJp bmcgICAoKTsKICAgIAogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGxlZnRfdG9rZW4gIDsKICAg IExleFN0cmVhbTo6VG9rZW5JbmRleCByaWdodF90b2tlbiA7CiAgICAKICAgIGludCAgICAgICAg ICAgICAgICAgICBuYW1lX2luZGV4OyAgIAogICAgaW50ICAgICAgICAgICAgICAgICAgIHJpZ2h0 X3N0cmluZ19sZW5ndGg7CiAgICBpbnQgICAgICAgICAgICAgICAgICAgbnVtOwogICAgdW5zaWdu ZWQgY2hhciAgICAgICAgIG1zZ19sZXZlbDsKICAgIFBhcnNlRXJyb3JDb2RlICAgICAgICBtc2df Y29kZTsKICAgIHVuc2lnbmVkICAgICAgICAgICAgICBzY29wZV9uYW1lX2luZGV4Owp9OwoKCmNs YXNzIFBhcnNlRXJyb3IgOiBwdWJsaWMgamF2YXByc190YWJsZQp7CiBwdWJsaWM6CgogICAgdm9p ZCBSZXBvcnQoaW50IG1zZ19sZXZlbCwgUGFyc2VFcnJvckNvZGUsIGludCBuYW1lX2luZGV4LAog ICAgICAgICAgICAgICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGxlZnRfdG9rZW4sIExleFN0cmVh bTo6VG9rZW5JbmRleCByaWdodF90b2tlbiwKICAgICAgICAgICAgICAgIGludCBzY29wZV9uYW1l X2luZGV4ID0gMCk7CgogICAgdm9pZCBTb3J0TWVzc2FnZXMoKTsKCiAgICBQYXJzZUVycm9yKENv bnRyb2wgJmNvbnRyb2xfLCBMZXhTdHJlYW0gKmxleF9zdHJlYW1fKTsKICAgIHZvaWQgUHJpbnRN ZXNzYWdlcygpOwoKcHJpdmF0ZToKCiAgICBDb250cm9sICZjb250cm9sOwogICAgTGV4U3RyZWFt ICpsZXhfc3RyZWFtOwoKICAgIFR1cGxlPFBhcnNlRXJyb3JJbmZvPiBlcnJvcnM7CgogICAgdm9p ZCBQcmludFByaW1hcnlNZXNzYWdlICAgKGludCBrKTsKICAgIHZvaWQgUHJpbnRTZWNvbmRhcnlN ZXNzYWdlIChpbnQgayk7CiAgICAKfTsKCgpjbGFzcyBEaWFnbm9zZVBhcnNlciA6IHB1YmxpYyBQ YXJzZXIKewpwdWJsaWM6CgogICAgRGlhZ25vc2VQYXJzZXIoQ29udHJvbCAmY29udHJvbF8sIExl eFN0cmVhbSAqbGV4X3N0cmVhbV8pIDogbmV4dF9zdGFjayhfX251bGwgKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZf c3RhY2soX19udWxsICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzY29wZV9pbmRleChfX251bGwgKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3Bl X3Bvc2l0aW9uKF9fbnVsbCApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfcG9vbCgyNTYpLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Io Y29udHJvbF8sIGxleF9zdHJlYW1fKQogICAgewogICAgICAgIGxleF9zdHJlYW0gPSBsZXhfc3Ry ZWFtXzsKICAgICAgICBtZW1zZXQobGlzdCwgMCwgTlVNX1NZTUJPTFMgKiBzaXplb2YoaW50KSk7 CiAgICAgICAgRGlhZ25vc2VQYXJzZSgpOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgfkRp YWdub3NlUGFyc2VyKCkKICAgIHsKICAgICAgICBkZWxldGUgW10gbmV4dF9zdGFjazsKICAgICAg ICBkZWxldGUgW10gcHJldl9zdGFjazsKICAgICAgICBkZWxldGUgW10gc2NvcGVfaW5kZXg7CiAg ICAgICAgZGVsZXRlIFtdIHNjb3BlX3Bvc2l0aW9uOwogICAgfQoKcHJpdmF0ZToKCiAgICBpbnQg bmV4dF9zdGFja190b3AsCiAgICAgICAgKm5leHRfc3RhY2ssCgogICAgICAgIHByZXZfc3RhY2tf dG9wLAogICAgICAgICpwcmV2X3N0YWNrLAoKICAgICAgICBzY29wZV9zdGFja190b3AsCiAgICAg ICAgKnNjb3BlX2luZGV4LAogICAgICAgICpzY29wZV9wb3NpdGlvbjsKCiAgICBpbnQgbGlzdFtO VU1fU1lNQk9MUyArIDFdOwoKICAgIGVudW0geyBOSUwgPSAtMSB9OwogICAgVHVwbGU8U3RhdGVJ bmZvPiBzdGF0ZV9wb29sOwogICAgaW50ICpzdGF0ZV9zZWVuOyAgCgogICAgUGFyc2VFcnJvciBl cnJvcjsKCiAgICB2b2lkIERpYWdub3NlUGFyc2UoKTsKCiAgICB2b2lkIFJlYWxsb2NhdGVTdGFj a3MoKTsKCiAgICBSZXBhaXJDYW5kaWRhdGUgRXJyb3JSZWNvdmVyeShUb2tlbk9iamVjdCBlcnJv cl90b2tlbik7CiAgICBSZXBhaXJDYW5kaWRhdGUgUHJpbWFyeVBoYXNlKFRva2VuT2JqZWN0IGVy cm9yX3Rva2VuKTsKICAgIGludCBNZXJnZUNhbmRpZGF0ZShpbnQgc3RhdGUsIGludCBidWZmZXJf cG9zaXRpb24pOwogICAgUHJpbWFyeVJlcGFpckluZm8gQ2hlY2tQcmltYXJ5RGlzdGFuY2UoaW50 IHN0YWNrW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQg c3RhY2tfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJp bWFyeVJlcGFpckluZm8gcmVwYWlyKTsKICAgIFJlcGFpckNhbmRpZGF0ZSBQcmltYXJ5RGlhZ25v c2lzKFByaW1hcnlSZXBhaXJJbmZvIHJlcGFpcik7CiAgICBpbnQgR2V0VGVybUluZGV4KGludCBz dGFja1tdLCBpbnQgc3RhY2tfdG9wLAogICAgICAgICAgICAgICAgICAgICBpbnQgdG9rLCBpbnQg YnVmZmVyX3Bvc2l0aW9uKTsKICAgIGludCBHZXROdGVybUluZGV4KGludCBzdGFydCwgaW50IHN5 bSwgaW50IGJ1ZmZlcl9wb3NpdGlvbik7CiAgICBpbnQgTWlzc3BlbGwoaW50IHN5bSwgVG9rZW5P YmplY3QgdG9rKTsKICAgIFJlcGFpckNhbmRpZGF0ZSBTZWNvbmRhcnlQaGFzZShUb2tlbk9iamVj dCBlcnJvcl90b2tlbik7CiAgICBTZWNvbmRhcnlSZXBhaXJJbmZvIE1pc3BsYWNlbWVudFJlY292 ZXJ5CiAgICAgICAgICAgICAoaW50IHN0YWNrW10sCiAgICAgICAgICAgICAgaW50IHN0YWNrX3Rv cCwKICAgICAgICAgICAgICBpbnQgbGFzdF9pbmRleCwKICAgICAgICAgICAgICBTZWNvbmRhcnlS ZXBhaXJJbmZvIG1pc3BsYWNlZCwgYm9vbCBzdGFja19mbGFnKTsKICAgIFNlY29uZGFyeVJlcGFp ckluZm8gU2Vjb25kYXJ5UmVjb3ZlcnkKICAgICAgICAgICAgIChpbnQgc3RhY2tbXSwKICAgICAg ICAgICAgICBpbnQgc3RhY2tfdG9wLAogICAgICAgICAgICAgIGludCBsYXN0X2luZGV4LAogICAg ICAgICAgICAgIFNlY29uZGFyeVJlcGFpckluZm8gcmVwYWlyLCBib29sIHN0YWNrX2ZsYWcpOwog ICAgdm9pZCBTZWNvbmRhcnlEaWFnbm9zaXMoU2Vjb25kYXJ5UmVwYWlySW5mbyByZXBhaXIpOwoK ICAgIHZvaWQgUmVwYWlyUGFyc2UoVG9rZW5PYmplY3QpOwoKICAgIFByaW1hcnlSZXBhaXJJbmZv IFNjb3BlVHJpYWwoaW50IHN0YWNrW10sIGludCBzdGFja190b3AsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFByaW1hcnlSZXBhaXJJbmZvIHJlcGFpcik7CiAgICB2b2lkIFNjb3Bl VHJpYWxDaGVjayhpbnQgc3RhY2tbXSwgaW50IHN0YWNrX3RvcCwKICAgICAgICAgICAgICAgICAg ICAgICAgIFByaW1hcnlSZXBhaXJJbmZvJiByZXBhaXIsIGludCBpbmR4KTsKICAgIGJvb2wgU2Vj b25kYXJ5Q2hlY2soaW50IHN0YWNrW10sIGludCBzdGFja190b3AsCiAgICAgICAgICAgICAgICAg ICAgICAgIGludCBidWZmZXJfcG9zaXRpb24sIGludCBkaXN0YW5jZSk7Cn07CgoKCgoKCgojIDE1 ICIuLi8uLi9qaWtlcy9zcmMvc2VtYW50aWMuaCIgMgoKIyAxICIuLi8uLi9qaWtlcy9zcmMvZXJy b3IuaCIgMQogCiAKIAogCiAKIAogCiAKIAoKCgoKCgoKCgoKCgpjbGFzcyBDb250cm9sOwpjbGFz cyBMZXhTdHJlYW07CmNsYXNzIEFzdF9Db21waWxhdGlvblVuaXQ7CmNsYXNzIFN5bWJvbFNldDsK Y2xhc3MgU2VtYW50aWM7CmNsYXNzIFNlbWFudGljRXJyb3I7CgpjbGFzcyBFcnJvckluZm8gOiBw dWJsaWMgSmlrZXNFcnJvcgp7CiAgICBmcmllbmQgY2xhc3MgU2VtYW50aWNFcnJvcjsKICAgIAog cHVibGljOgogICAgCiAgICB2aXJ0dWFsIGNvbnN0IHdjaGFyX3QgKmdldEVycm9yTWVzc2FnZSgp OwogICAgdmlydHVhbCBjb25zdCB3Y2hhcl90ICpnZXRFcnJvclJlcG9ydCgpOwoKICAgIHZpcnR1 YWwgSmlrZXNFcnJvclNldmVyaXR5IGdldFNldmVyaXR5KCk7CiAgICB2aXJ0dWFsIGNvbnN0IGNo YXIgKmdldEZpbGVOYW1lKCk7CgogICAgdmlydHVhbCBpbnQgZ2V0TGVmdExpbmVObyAgICAgICgp OwogICAgdmlydHVhbCBpbnQgZ2V0TGVmdENvbHVtbk5vICAgICgpOwogICAgdmlydHVhbCBpbnQg Z2V0UmlnaHRMaW5lTm8gICAgICgpOwogICAgdmlydHVhbCBpbnQgZ2V0UmlnaHRDb2x1bW5ObyAg ICgpOwoKICAgIEVycm9ySW5mbygpOwogICAgdmlydHVhbCB+RXJyb3JJbmZvKCk7CgogcHJvdGVj dGVkOgoKIHByaXZhdGU6CiAgICBpbnQgbGVmdF9saW5lX25vICAgIDsKICAgIGludCBsZWZ0X2Nv bHVtbl9ubyAgOwogICAgaW50IHJpZ2h0X2xpbmVfbm8gICA7CiAgICBpbnQgcmlnaHRfY29sdW1u X25vIDsKICAgIAogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGxlZnRfdG9rZW47CiAgICBMZXhT dHJlYW06OlRva2VuSW5kZXggcmlnaHRfdG9rZW47CiAgICAKICAgIHdjaGFyX3QgKmluc2VydDEs CiAgICAgICAgKmluc2VydDIsCiAgICAgICAgKmluc2VydDMsCiAgICAgICAgKmluc2VydDQsCiAg ICAgICAgKmluc2VydDUsCiAgICAgICAgKmluc2VydDYsCiAgICAgICAgKmluc2VydDcsCiAgICAg ICAgKmluc2VydDgsCiAgICAgICAgKmluc2VydDk7CgogICAgd2NoYXJfdCAgKm1zZzsKICAgIHVu c2lnbmVkIG51bTsKICAgIHNob3J0ICAgIG1zZ19jb2RlOwogICAgc2hvcnQgICAgcmlnaHRfc3Ry aW5nX2xlbmd0aDsKICAgIEppa2VzRXJyb3JTZXZlcml0eSBzZXZlcml0eTsKCiAgICBzdGF0aWMg Ym9vbCBlbWFjc19zdHlsZV9yZXBvcnQ7CiAgICBMZXhTdHJlYW0gKmxleF9zdHJlYW07CgogICAg d2NoYXJfdCAqcmVndWxhckVycm9yU3RyaW5nICgpOwogICAgd2NoYXJfdCAqZW1hY3NFcnJvclN0 cmluZyAgICgpOwoKICAgIHZvaWQgUHJpbnRMYXJnZVNvdXJjZShFcnJvclN0cmluZyAmcyk7CiAg ICB2b2lkIFByaW50U21hbGxTb3VyY2UoRXJyb3JTdHJpbmcgJnMpOwoKICAgIHZvaWQgSW5pdGlh bGl6ZShMZXhTdHJlYW0gKiwgd2NoYXJfdCAqLCBKaWtlc0Vycm9yU2V2ZXJpdHkpOwp9OwoKY2xh c3MgU2VtYW50aWNFcnJvcgp7CiAgICBmcmllbmQgY2xhc3MgRXJyb3JJbmZvIDsKICAgIGZyaWVu ZCBjbGFzcyBKaWtlc0FQSSAgOwoKIHB1YmxpYzoKICAgIGVudW0gU2VtYW50aWNFcnJvcktpbmQK ICAgIHsKICAgICAgICBCQURfRVJST1IsCiAgICAgICAgREVGQVVMVF9FUlJPUiwKCiAgICAgICAg SU5WQUxJRF9PUFRJT04sCiAgICAgICAgSU5WQUxJRF9LX09QVElPTiwKICAgICAgICBJTlZBTElE X0tfVEFSR0VULAogICAgICAgIElOVkFMSURfVEFCX1ZBTFVFLAogICAgICAgIElOVkFMSURfRElS RUNUT1JZLAogICAgICAgIFVOU1VQUE9SVEVEX0VOQ09ESU5HLAogICAgICAgIFVOU1VQUE9SVEVE X09QVElPTiwKICAgICAgICBESVNBQkxFRF9PUFRJT04sCgogICAgICAgIE5PX0NVUlJFTlRfRElS RUNUT1JZLAogICAgICAgIENBTk5PVF9PUEVOX1pJUF9GSUxFLAogICAgICAgIENBTk5PVF9PUEVO X1BBVEhfRElSRUNUT1JZLAogICAgICAgIFBBQ0tBR0VfTk9UX0ZPVU5ELAogICAgICAgIENBTk5P VF9PUEVOX0RJUkVDVE9SWSwKICAgICAgICBCQURfSU5QVVRfRklMRSwKICAgICAgICBVTlJFQURB QkxFX0lOUFVUX0ZJTEUsCiAgICAgICAgTk9OX1NUQU5EQVJEX0xJQlJBUllfVFlQRSwKICAgICAg ICBMSUJSQVJZX01FVEhPRF9OT1RfRk9VTkQsCiAgICAgICAgQ0FOTk9UX1JFT1BFTl9GSUxFLAog ICAgICAgIENBTk5PVF9XUklURV9GSUxFLAogICAgICAgIENPTlNUQU5UX1BPT0xfT1ZFUkZMT1cs CiAgICAgICAgSU5URVJGQUNFU19PVkVSRkxPVywKICAgICAgICBNRVRIT0RTX09WRVJGTE9XLAog ICAgICAgIFNUUklOR19PVkVSRkxPVywKICAgICAgICBQQVJBTUVURVJfT1ZFUkZMT1csCiAgICAg ICAgQVJSQVlfT1ZFUkZMT1csCiAgICAgICAgRklFTERTX09WRVJGTE9XLAogICAgICAgIExPQ0FM X1ZBUklBQkxFU19PVkVSRkxPVywKICAgICAgICBTVEFDS19PVkVSRkxPVywKICAgICAgICBDT0RF X09WRVJGTE9XLAogICAgICAgIENBTk5PVF9DT01QVVRFX0NPTFVNTlMsCiAgICAgICAgRU1QVFlf REVDTEFSQVRJT04sCiAgICAgICAgUkVEVU5EQU5UX0FCU1RSQUNULAogICAgICAgIFJFRFVOREFO VF9GSU5BTCwKICAgICAgICBSRURVTkRBTlRfUFVCTElDLAogICAgICAgIFJFRFVOREFOVF9TVEFU SUMsCiAgICAgICAgT0JTT0xFU0NFTlRfQUJTVFJBQ1QsCiAgICAgICAgT0JTT0xFU0NFTlRfQlJB Q0tFVFMsCiAgICAgICAgTk9fVFlQRVMsCiAgICAgICAgTVVMVElQTEVfUFVCTElDX1RZUEVTLAog ICAgICAgIFRZUEVfSU5fTVVMVElQTEVfRklMRVMsCiAgICAgICAgUEFDS0FHRV9UWVBFX0NPTkZM SUNULAogICAgICAgIERJUkVDVE9SWV9GSUxFX0NPTkZMSUNULAogICAgICAgIEZJTEVfRklMRV9D T05GTElDVCwKICAgICAgICBNSVNNQVRDSEVEX1RZUEVfQU5EX0ZJTEVfTkFNRVMsCiAgICAgICAg UkVGRVJFTkNFX1RPX1RZUEVfSU5fTUlTTUFUQ0hFRF9GSUxFLAogICAgICAgIERVUExJQ0FURV9J Tk5FUl9UWVBFX05BTUUsCiAgICAgICAgRFVQTElDQVRFX1RZUEVfREVDTEFSQVRJT04sCiAgICAg ICAgVU5ORUNFU1NBUllfVFlQRV9JTVBPUlQsCiAgICAgICAgRFVQTElDQVRFX0FDQ0VTU19NT0RJ RklFUiwKICAgICAgICBEVVBMSUNBVEVfTU9ESUZJRVIsCiAgICAgICAgRklOQUxfQUJTVFJBQ1Rf Q0xBU1MsCiAgICAgICAgVk9MQVRJTEVfRklOQUwsCiAgICAgICAgRklOQUxfVk9MQVRJTEUsCiAg ICAgICAgSU5WQUxJRF9UT1BfTEVWRUxfQ0xBU1NfTU9ESUZJRVIsCiAgICAgICAgSU5WQUxJRF9J Tk5FUl9DTEFTU19NT0RJRklFUiwKICAgICAgICBJTlZBTElEX1NUQVRJQ19JTk5FUl9DTEFTU19N T0RJRklFUiwKICAgICAgICBJTlZBTElEX0xPQ0FMX0NMQVNTX01PRElGSUVSLAogICAgICAgIElO VkFMSURfSU5URVJGQUNFX01PRElGSUVSLAogICAgICAgIElOVkFMSURfRklFTERfTU9ESUZJRVIs CiAgICAgICAgSU5WQUxJRF9MT0NBTF9NT0RJRklFUiwKICAgICAgICBJTlZBTElEX01FVEhPRF9N T0RJRklFUiwKICAgICAgICBJTlZBTElEX1NJR05BVFVSRV9NT0RJRklFUiwKICAgICAgICBJTlZB TElEX0NPTlNUUlVDVE9SX01PRElGSUVSLAogICAgICAgIElOVkFMSURfQ09OU1RBTlRfTU9ESUZJ RVIsCiAgICAgICAgVU5JTklUSUFMSVpFRF9GSUVMRCwKICAgICAgICBQQVJFTlRfVFlQRV9JTl9V Tk5BTUVEX1BBQ0tBR0UsCiAgICAgICAgUkVDT01QSUxBVElPTiwKICAgICAgICBUWVBFX05PVF9G T1VORCwKICAgICAgICBEVVBMSUNBVEVfT05fREVNQU5EX0lNUE9SVCwKICAgICAgICBOT1RfQV9U WVBFLAogICAgICAgIE5PVF9BX0NMQVNTLAogICAgICAgIE5PVF9BTl9JTlRFUkZBQ0UsCiAgICAg ICAgU1VQRVJfSVNfRklOQUwsCiAgICAgICAgT0JKRUNUX1dJVEhfU1VQRVJfVFlQRSwKICAgICAg ICBPQkpFQ1RfSEFTX05PX1NVUEVSX1RZUEUsCiAgICAgICAgRFVQTElDQVRFX0ZJRUxELAogICAg ICAgIERVUExJQ0FURV9NRVRIT0QsCiAgICAgICAgRFVQTElDQVRFX0NPTlNUUlVDVE9SLAogICAg ICAgIE1JU01BVENIRURfSU5IRVJJVEVEX01FVEhPRCwKICAgICAgICBNSVNNQVRDSEVEX0lOSEVS SVRFRF9NRVRIT0RfRVhURVJOQUxMWSwKICAgICAgICBNSVNNQVRDSEVEX0lOSEVSSVRFRF9NRVRI T0RTX0lOX0JBU0UsCiAgICAgICAgRFVQTElDQVRFX0ZPUk1BTF9QQVJBTUVURVIsCiAgICAgICAg TUlTTUFUQ0hFRF9DT05TVFJVQ1RPUl9OQU1FLAogICAgICAgIE1FVEhPRF9XSVRIX0NPTlNUUlVD VE9SX05BTUUsCiAgICAgICAgRFVQTElDQVRFX0xPQ0FMX1ZBUklBQkxFX0RFQ0xBUkFUSU9OLAog ICAgICAgIERVUExJQ0FURV9MT0NBTF9UWVBFX0RFQ0xBUkFUSU9OLAogICAgICAgIE1VTFRJUExF X0RFRkFVTFRfTEFCRUwsCiAgICAgICAgVU5ERUNMQVJFRF9MQUJFTCwKICAgICAgICBEVVBMSUNB VEVfTEFCRUwsCiAgICAgICAgQ0FUQ0hfUFJJTUlUSVZFX1RZUEUsCiAgICAgICAgQ0FUQ0hfQVJS QVlfVFlQRSwKICAgICAgICBBTUJJR1VPVVNfRklFTEQsCiAgICAgICAgQU1CSUdVT1VTX1RZUEUs CiAgICAgICAgRklFTERfSVNfVFlQRSwKICAgICAgICBGSUVMRF9OT1RfRk9VTkQsCiAgICAgICAg RklFTERfTkFNRV9NSVNTUEVMTEVELAogICAgICAgIEZJRUxEX1dJVEhfUFJJVkFURV9BQ0NFU1Nf Tk9UX0FDQ0VTU0lCTEUsCiAgICAgICAgRklFTERfV0lUSF9ERUZBVUxUX0FDQ0VTU19OT1RfQUND RVNTSUJMRSwKICAgICAgICBOQU1FX05PVF9GT1VORCwKICAgICAgICBNRVRIT0RfTk9UX0ZJRUxE LAogICAgICAgIE5BTUVfTk9UX1lFVF9BVkFJTEFCTEUsCiAgICAgICAgTkFNRV9OT1RfVkFSSUFC TEUsCiAgICAgICAgTkFNRV9OT1RfQ0xBU1NfVkFSSUFCTEUsCiAgICAgICAgTk9UX0FfTlVNRVJJ Q19WQVJJQUJMRSwKICAgICAgICBNRVRIT0RfTk9UX0ZPVU5ELAogICAgICAgIE1FVEhPRF9OQU1F X05PVF9GT1VORF9JTl9UWVBFLAogICAgICAgIE1FVEhPRF9OQU1FX01JU1NQRUxMRUQsCiAgICAg ICAgTUVUSE9EX1dJVEhfUFJJVkFURV9BQ0NFU1NfTk9UX0FDQ0VTU0lCTEUsCiAgICAgICAgTUVU SE9EX1dJVEhfREVGQVVMVF9BQ0NFU1NfTk9UX0FDQ0VTU0lCTEUsCiAgICAgICAgSElEREVOX01F VEhPRF9JTl9FTkNMT1NJTkdfQ0xBU1MsCiAgICAgICAgRklFTERfTk9UX01FVEhPRCwKICAgICAg ICBUWVBFX05PVF9NRVRIT0QsCiAgICAgICAgVFlQRV9OT1RfRklFTEQsCiAgICAgICAgTUVUSE9E X05PVF9DTEFTU19NRVRIT0QsCiAgICAgICAgQU1CSUdVT1VTX0NPTlNUUlVDVE9SX0lOVk9DQVRJ T04sCiAgICAgICAgQU1CSUdVT1VTX01FVEhPRF9JTlZPQ0FUSU9OLAogICAgICAgIENPTlNUUlVD VE9SX05PVF9GT1VORCwKICAgICAgICBNRVRIT0RfRk9VTkRfRk9SX0NPTlNUUlVDVE9SLAogICAg ICAgIEFCU1RSQUNUX1RZUEVfQ1JFQVRJT04sCiAgICAgICAgSU5WQUxJRF9JTlNUQU5DRU9GX0NP TlZFUlNJT04sCiAgICAgICAgSU5WQUxJRF9DQVNUX0NPTlZFUlNJT04sCiAgICAgICAgSU5WQUxJ RF9DQVNUX1RZUEUsCiAgICAgICAgSU5DT01QQVRJQkxFX1RZUEVfRk9SX0lOSVRJQUxJWkFUSU9O LAogICAgICAgIElOQ09NUEFUSUJMRV9UWVBFX0ZPUl9BU1NJR05NRU5ULAogICAgICAgIElOQ09N UEFUSUJMRV9UWVBFX0ZPUl9CSU5BUllfRVhQUkVTU0lPTiwKICAgICAgICBJTkNPTVBBVElCTEVf VFlQRV9GT1JfQ09ORElUSU9OQUxfRVhQUkVTU0lPTiwKICAgICAgICBWT0lEX0FSUkFZLAogICAg ICAgIFZPSURfVFlQRV9JTl9FUVVBTElUWV9FWFBSRVNTSU9OLAogICAgICAgIFRZUEVfTk9UX1RI Uk9XQUJMRSwKICAgICAgICBUWVBFX05PVF9QUklNSVRJVkUsCiAgICAgICAgVFlQRV9OT1RfSU5U RUdSQUwsCiAgICAgICAgVFlQRV9OT1RfTlVNRVJJQywKICAgICAgICBUWVBFX05PVF9JTlRFR0VS LAogICAgICAgIFRZUEVfTk9UX0JPT0xFQU4sCiAgICAgICAgVFlQRV9OT1RfQVJSQVksCiAgICAg ICAgVFlQRV9OT1RfUkVGRVJFTkNFLAogICAgICAgIFRZUEVfTk9UX1ZBTElEX0ZPUl9TV0lUQ0gs CiAgICAgICAgVFlQRV9JU19WT0lELAogICAgICAgIFZBTFVFX05PVF9SRVBSRVNFTlRBQkxFX0lO X1NXSVRDSF9UWVBFLAogICAgICAgIFRZUEVfTk9UX0NPTlZFUlRJQkxFX1RPX1NXSVRDSF9UWVBF LAogICAgICAgIERVUExJQ0FURV9DQVNFX1ZBTFVFLAogICAgICAgIE1JU1BMQUNFRF9USElTX0VY UFJFU1NJT04sCiAgICAgICAgTUlTUExBQ0VEX1NVUEVSX0VYUFJFU1NJT04sCiAgICAgICAgVEFS R0VUX1ZBUklBQkxFX0lTX0ZJTkFMLAogICAgICAgIEZJTkFMX1ZBUklBQkxFX1RBUkdFVF9JTl9M T09QLAogICAgICAgIFVOSU5JVElBTElaRURfRklOQUxfVkFSSUFCTEUsCiAgICAgICAgVU5JTklU SUFMSVpFRF9TVEFUSUNfRklOQUxfVkFSSUFCTEUsCiAgICAgICAgVU5JTklUSUFMSVpFRF9GSU5B TF9WQVJJQUJMRV9JTl9DT05TVFJVQ1RPUiwKICAgICAgICBJTklUX1NDQUxBUl9XSVRIX0FSUkFZ LAogICAgICAgIElOSVRfQVJSQVlfV0lUSF9TQ0FMQVIsCiAgICAgICAgSU5WQUxJRF9CWVRFX1ZB TFVFLAogICAgICAgIElOVkFMSURfU0hPUlRfVkFMVUUsCiAgICAgICAgSU5WQUxJRF9DSEFSQUNU RVJfVkFMVUUsCiAgICAgICAgSU5WQUxJRF9JTlRfVkFMVUUsCiAgICAgICAgSU5WQUxJRF9MT05H X1ZBTFVFLAogICAgICAgIElOVkFMSURfRkxPQVRfVkFMVUUsCiAgICAgICAgSU5WQUxJRF9ET1VC TEVfVkFMVUUsCiAgICAgICAgSU5WQUxJRF9TVFJJTkdfVkFMVUUsCiAgICAgICAgUkVUVVJOX1NU QVRFTUVOVF9JTl9JTklUSUFMSVpFUiwKICAgICAgICBNSVNQTEFDRURfUkVUVVJOX1dJVEhfRVhQ UkVTU0lPTiwKICAgICAgICBNSVNQTEFDRURfUkVUVVJOX1dJVEhfTk9fRVhQUkVTU0lPTiwKICAg ICAgICBNSVNNQVRDSEVEX1JFVFVSTl9BTkRfTUVUSE9EX1RZUEUsCiAgICAgICAgRVhQUkVTU0lP Tl9OT1RfVEhST1dBQkxFLAogICAgICAgIEJBRF9USFJPV0FCTEVfRVhQUkVTU0lPTl9JTl9UUlks CiAgICAgICAgQkFEX1RIUk9XQUJMRV9FWFBSRVNTSU9OX0lOX01FVEhPRCwKICAgICAgICBCQURf VEhST1dBQkxFX0VYUFJFU1NJT04sCiAgICAgICAgTUlTUExBQ0VEX0JSRUFLX1NUQVRFTUVOVCwK ICAgICAgICBNSVNQTEFDRURfQ09OVElOVUVfU1RBVEVNRU5ULAogICAgICAgIE1JU1BMQUNFRF9F WFBMSUNJVF9DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OLAogICAgICAgIElOVkFMSURfQ09OVElOVUVf VEFSR0VULAogICAgICAgIE5PTl9BQlNUUkFDVF9UWVBFX0NPTlRBSU5TX0FCU1RSQUNUX01FVEhP RCwKICAgICAgICBOT05fQUJTVFJBQ1RfVFlQRV9JTkhFUklUU19BQlNUUkFDVF9NRVRIT0QsCiAg ICAgICAgTk9OX0FCU1RSQUNUX1RZUEVfSU5IRVJJVFNfQUJTVFJBQ1RfTUVUSE9EX0ZST01fQUJT VFJBQ1RfQ0xBU1MsCiAgICAgICAgTk9OX0FCU1RSQUNUX1RZUEVfQ0FOTk9UX09WRVJSSURFX0RF RkFVTFRfQUJTVFJBQ1RfTUVUSE9ELAogICAgICAgIE5PX0FCU1RSQUNUX01FVEhPRF9JTVBMRU1F TlRBVElPTiwKICAgICAgICBEVVBMSUNBVEVfSU5URVJGQUNFLAogICAgICAgIFVOS05PV05fUVVB TElGSUVEX05BTUVfQkFTRSwKICAgICAgICBVTktOT1dOX0FNQklHVU9VU19OQU1FLAogICAgICAg IENJUkNVTEFSX0lOVEVSRkFDRSwKICAgICAgICBDSVJDVUxBUl9DTEFTUywKICAgICAgICBUWVBF X05PVF9BQ0NFU1NJQkxFLAogICAgICAgIFBSSVZBVEVfRklFTERfTk9UX0FDQ0VTU0lCTEUsCiAg ICAgICAgUFJPVEVDVEVEX0ZJRUxEX05PVF9BQ0NFU1NJQkxFLAogICAgICAgIERFRkFVTFRfRklF TERfTk9UX0FDQ0VTU0lCTEUsCiAgICAgICAgUFJJVkFURV9NRVRIT0RfTk9UX0FDQ0VTU0lCTEUs CiAgICAgICAgUFJPVEVDVEVEX01FVEhPRF9OT1RfQUNDRVNTSUJMRSwKICAgICAgICBERUZBVUxU X01FVEhPRF9OT1RfQUNDRVNTSUJMRSwKICAgICAgICBQUklWQVRFX0NPTlNUUlVDVE9SX05PVF9B Q0NFU1NJQkxFLAogICAgICAgIFBST1RFQ1RFRF9DT05TVFJVQ1RPUl9OT1RfQUNDRVNTSUJMRSwK ICAgICAgICBERUZBVUxUX0NPTlNUUlVDVE9SX05PVF9BQ0NFU1NJQkxFLAogICAgICAgIENPTlNU UlVDVE9SX0RPRVNfTk9UX1RIUk9XX1RISVNfRVhDRVBUSU9OLAogICAgICAgIENPTlNUUlVDVE9S X0RPRVNfTk9UX1RIUk9XX1NVUEVSX0VYQ0VQVElPTiwKICAgICAgICBQQVJBTUVURVJfUkVERUNM QVJFRCwKICAgICAgICBCQURfQUJTVFJBQ1RfTUVUSE9EX01PRElGSUVSLAogICAgICAgIEFCU1RS QUNUX01FVEhPRF9NT0RJRklFUl9DT05GTElDVCwKICAgICAgICBTVFJJQ1RGUF9OQVRJVkVfTUVU SE9ELAogICAgICAgIEFCU1RSQUNUX01FVEhPRF9JTlZPQ0FUSU9OLAogICAgICAgIEZJTkFMX01F VEhPRF9PVkVSUklERSwKICAgICAgICBGSU5BTF9NRVRIT0RfT1ZFUlJJREVfRVhURVJOQUxMWSwK ICAgICAgICBQUklWQVRFX01FVEhPRF9PVkVSUklERSwKICAgICAgICBQUklWQVRFX01FVEhPRF9P VkVSUklERV9FWFRFUk5BTExZLAogICAgICAgIElOU1RBTkNFX01FVEhPRF9PVkVSUklERSwKICAg ICAgICBJTlNUQU5DRV9NRVRIT0RfT1ZFUlJJREVfRVhURVJOQUxMWSwKICAgICAgICBDTEFTU19N RVRIT0RfT1ZFUlJJREUsCiAgICAgICAgQ0xBU1NfTUVUSE9EX09WRVJSSURFX0VYVEVSTkFMTFks CiAgICAgICAgTUlTTUFUQ0hFRF9PVkVSUklEREVOX0VYQ0VQVElPTiwKICAgICAgICBNSVNNQVRD SEVEX09WRVJSSURERU5fRVhDRVBUSU9OX0VYVEVSTkFMTFksCiAgICAgICAgQUJTVFJBQ1RfTUVU SE9EX1dJVEhfQk9EWSwKICAgICAgICBOT05fQUJTVFJBQ1RfTUVUSE9EX1dJVEhPVVRfQk9EWSwK ICAgICAgICBCQURfQUNDRVNTX01FVEhPRF9PVkVSUklERSwKICAgICAgICBCQURfQUNDRVNTX01F VEhPRF9PVkVSUklERV9FWFRFUk5BTExZLAogICAgICAgIFNUQVRJQ19PVkVSUklERV9BQlNUUkFD VCwKICAgICAgICBTVEFUSUNfT1ZFUlJJREVfQUJTVFJBQ1RfRVhURVJOQUxMWSwKICAgICAgICBD SVJDVUxBUl9USElTX0NBTEwsCiAgICAgICAgSU5TVEFOQ0VfVkFSSUFCTEVfSU5fRVhQTElDSVRf Q09OU1RSVUNUT1JfSU5WT0NBVElPTiwKICAgICAgICBJTlNUQU5DRV9NRVRIT0RfSU5fRVhQTElD SVRfQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwKICAgICAgICBTWU5USEVUSUNfVkFSSUFCTEVfQUND RVNTLAogICAgICAgIFNZTlRIRVRJQ19NRVRIT0RfSU5WT0NBVElPTiwKICAgICAgICBTWU5USEVU SUNfQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwKICAgICAgICBUSElTX0lOX0VYUExJQ0lUX0NPTlNU UlVDVE9SX0lOVk9DQVRJT04sCiAgICAgICAgU1VQRVJfSU5fRVhQTElDSVRfQ09OU1RSVUNUT1Jf SU5WT0NBVElPTiwKICAgICAgICBJTk5FUl9DT05TVFJVQ1RPUl9JTl9FWFBMSUNJVF9DT05TVFJV Q1RPUl9JTlZPQ0FUSU9OLAogICAgICAgIEVYUFJFU1NJT05fTk9UX0NPTlNUQU5ULAogICAgICAg IFVOQ0FUQ0hBQkxFX01FVEhPRF9USFJPV05fQ0hFQ0tFRF9FWENFUFRJT04sCiAgICAgICAgVU5D QVRDSEFCTEVfQ09OU1RSVUNUT1JfVEhST1dOX0NIRUNLRURfRVhDRVBUSU9OLAogICAgICAgIFVO UkVBQ0hBQkxFX0NBVENIX0NMQVVTRSwKICAgICAgICBVTlJFQUNIQUJMRV9ERUZBVUxUX0NBVENI X0NMQVVTRSwKICAgICAgICBVTlJFQUNIQUJMRV9TVEFURU1FTlQsCiAgICAgICAgVU5SRUFDSEFC TEVfU1RBVEVNRU5UUywKICAgICAgICBVTlJFQUNIQUJMRV9DT05TVFJVQ1RPUl9CT0RZLAogICAg ICAgIEJMT0NLRURfQ0FUQ0hfQ0xBVVNFLAogICAgICAgIFZBUklBQkxFX05PVF9ERUZJTklURUxZ X0FTU0lHTkVELAogICAgICAgIFRZUEVEX01FVEhPRF9XSVRIX05PX1JFVFVSTiwKCiAgICAgICAg REVGQVVMVF9NRVRIT0RfTk9UX09WRVJSSURERU4sCgogICAgICAgIE9ORV9VTk5BTUVEX1BBQ0tB R0UsCiAgICAgICAgVFlQRV9OT1RfSU5fVU5OQU1FRF9QQUNLQUdFLAogICAgICAgIFRZUEVfSU5f V1JPTkdfUEFDS0FHRSwKICAgICAgICBUWVBFX05BTUVfTUlTTUFUQ0gsCgogICAgICAgIERFUFJF Q0FURURfVFlQRSwKICAgICAgICBERVBSRUNBVEVEX0ZJRUxELAogICAgICAgIERFUFJFQ0FURURf TUVUSE9ELAogICAgICAgIERFUFJFQ0FURURfQ09OU1RSVUNUT1IsCgogICAgICAgIENPTVBSRVNT RURfWklQX0ZJTEUsCiAgICAgICAgSU5WQUxJRF9DTEFTU19GSUxFLAogICAgICAgIENBTk5PVF9P UEVOX0NMQVNTX0ZJTEUsCgogICAgICAgIElOVEVSRkFDRV9OT1RfSU5ORVJfQ0xBU1MsCiAgICAg ICAgU1RBVElDX05PVF9JTk5FUl9DTEFTUywKICAgICAgICBUWVBFX05PVF9JTk5FUl9DTEFTUywK ICAgICAgICBTVVBFUl9UWVBFX05PVF9JTk5FUl9DTEFTUywKICAgICAgICBTVEFUSUNfRklFTERf SU5fSU5ORVJfQ0xBU1NfTk9UX0ZJTkFMLAogICAgICAgIFNUQVRJQ19GSUVMRF9JTl9JTk5FUl9D TEFTU19OT1RfQ09OU1RBTlQsCiAgICAgICAgU1RBVElDX01FVEhPRF9JTl9JTk5FUl9DTEFTUywK ICAgICAgICBTVEFUSUNfVFlQRV9JTl9JTk5FUl9DTEFTUywKICAgICAgICBTVEFUSUNfSU5JVElB TElaRVJfSU5fSU5ORVJfQ0xBU1MsCiAgICAgICAgSU5ORVJfQ0xBU1NfUkVGRVJFTkNFX1RPX05P Tl9GSU5BTF9MT0NBTF9WQVJJQUJMRSwKICAgICAgICBTVEFUSUNfUFJPVEVDVEVEX0ZJRUxEX0FD Q0VTUywKICAgICAgICBTVEFUSUNfUFJPVEVDVEVEX01FVEhPRF9BQ0NFU1MsCiAgICAgICAgSU5I RVJJVEFOQ0VfQU5EX0xFWElDQUxfU0NPUElOR19DT05GTElDVF9XSVRIX0xPQ0FMLAogICAgICAg IElOSEVSSVRBTkNFX0FORF9MRVhJQ0FMX1NDT1BJTkdfQ09ORkxJQ1RfV0lUSF9NRU1CRVIsCiAg ICAgICAgSUxMRUdBTF9USElTX0ZJRUxEX0FDQ0VTUywKICAgICAgICBDT05TVFJVQ1RPUl9GT1VO RF9JTl9BTk9OWU1PVVNfQ0xBU1MsCiAgICAgICAgRU5DTE9TSU5HX0lOU1RBTkNFX0FDQ0VTU19G Uk9NX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04sCiAgICAgICAgRU5DTE9TSU5HX0lOU1RBTkNFX0FD Q0VTU19BQ1JPU1NfU1RBVElDX1JFR0lPTiwKICAgICAgICBFTkNMT1NJTkdfSU5TVEFOQ0VfTk9U X0FDQ0VTU0lCTEUsCiAgICAgICAgSU5WQUxJRF9FTkNMT1NJTkdfSU5TVEFOQ0UsCgogICAgICAg IFpFUk9fRElWSURFX0VSUk9SLAogICAgICAgIFpFUk9fRElWSURFX0NBVVRJT04sCiAgICAgICAg Vk9JRF9UT19TVFJJTkcsCgogICAgICAgIF9udW1fa2luZHMKICAgIH07CgogICAgc3RhdGljIHZv aWQgU3RhdGljSW5pdGlhbGl6ZXIoKTsKCiAgICB2b2lkIFJlcG9ydChTZW1hbnRpY0Vycm9yS2lu ZCwKICAgICAgICAgICAgICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCwKICAgICAgICAgICAgICAg IExleFN0cmVhbTo6VG9rZW5JbmRleCwKICAgICAgICAgICAgICAgIHdjaGFyX3QgKiA9IF9fbnVs bCAsCiAgICAgICAgICAgICAgICB3Y2hhcl90ICogPSBfX251bGwgLAogICAgICAgICAgICAgICAg d2NoYXJfdCAqID0gX19udWxsICwKICAgICAgICAgICAgICAgIHdjaGFyX3QgKiA9IF9fbnVsbCAs CiAgICAgICAgICAgICAgICB3Y2hhcl90ICogPSBfX251bGwgLAogICAgICAgICAgICAgICAgd2No YXJfdCAqID0gX19udWxsICwKICAgICAgICAgICAgICAgIHdjaGFyX3QgKiA9IF9fbnVsbCAsCiAg ICAgICAgICAgICAgICB3Y2hhcl90ICogPSBfX251bGwgLAogICAgICAgICAgICAgICAgd2NoYXJf dCAqID0gX19udWxsICk7CgogICAgU2VtYW50aWNFcnJvcihDb250cm9sICYsIEZpbGVTeW1ib2wg Kik7CiAgICB+U2VtYW50aWNFcnJvcigpCiAgICB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkg PCBidWZmZXIuTGVuZ3RoKCk7IGkrKykKICAgICAgICAgICAgZGVsZXRlIFtdIGJ1ZmZlcltpXTsK ICAgIH0KCiAgICBpbnQgbnVtX2Vycm9ycywKICAgICAgICBudW1fd2FybmluZ3M7CgogICAgdm9p ZCBFbnRlcmluZ0Nsb25lKCkgeyBjbG9uZV9jb3VudCsrOyB9CiAgICB2b2lkIEV4aXRpbmdDbG9u ZSgpICB7IGNsb25lX2NvdW50LS07IH0KCiAgICBpbnQgUHJpbnRNZXNzYWdlcygpOwoKcHJpdmF0 ZToKICAgIGZyaWVuZCBjbGFzcyBTZW1hbnRpYzsKCiAgICB2b2lkIHJlcG9ydEVycm9yKGludCBr KTsKCiAgICBDb250cm9sICZjb250cm9sOwogICAgTGV4U3RyZWFtICpsZXhfc3RyZWFtOwoKICAg IGludCBjbG9uZV9jb3VudDsKCiAgICBUdXBsZTx3Y2hhcl90ICo+IGJ1ZmZlcjsKICAgIFR1cGxl PEVycm9ySW5mbz4gZXJyb3I7CgogICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgd2FybmluZ1tdOwog ICAgc3RhdGljIHdjaGFyX3QgKigqcHJpbnRfbWVzc2FnZVtfbnVtX2tpbmRzXSkoRXJyb3JJbmZv ICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwoKICAgIHN0YXRpYyBib29sIE5vdERvdCh3Y2hh cl90ICpzdHIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gc3RyID8KICAgICAgICAgICAg ICAgICghICh3Y3NsZW4oc3RyKSA9PSAwIHx8IHdjc2NtcChzdHIsIFN0cmluZ0NvbnN0YW50OjpV U19fRE8pID09IDApKSA6CiAgICAgICAgICAgICAgICBmYWxzZTsKICAgICAgICB9CgogICAgc3Rh dGljIHdjaGFyX3QgKlByaW50QkFEX0VSUk9SKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29u dHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludERFRkFVTFRfRVJST1IoRXJyb3JJbmZv ICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50SU5W QUxJRF9PUFRJT04oRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3Rh dGljIHdjaGFyX3QgKlByaW50SU5WQUxJRF9LX09QVElPTihFcnJvckluZm8gJiwgTGV4U3RyZWFt ICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRJTlZBTElEX0tfVEFSR0VU KEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90 ICpQcmludElOVkFMSURfVEFCX1ZBTFVFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJv bCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludElOVkFMSURfRElSRUNUT1JZKEVycm9ySW5m byAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludFVO U1VQUE9SVEVEX0VOQ09ESU5HKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsK ICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludFVOU1VQUE9SVEVEX09QVElPTihFcnJvckluZm8gJiwg TGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRESVNBQkxF RF9PUFRJT04oRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGlj IHdjaGFyX3QgKlByaW50Tk9fQ1VSUkVOVF9ESVJFQ1RPUlkoRXJyb3JJbmZvICYsIExleFN0cmVh bSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50Q0FOTk9UX09QRU5fWklQ X0ZJTEUoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdj aGFyX3QgKlByaW50Q0FOTk9UX09QRU5fUEFUSF9ESVJFQ1RPUlkoRXJyb3JJbmZvICYsIExleFN0 cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50UEFDS0FHRV9OT1Rf Rk9VTkQoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdj aGFyX3QgKlByaW50Q0FOTk9UX09QRU5fRElSRUNUT1JZKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0g KiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludEJBRF9JTlBVVF9GSUxFKEVy cm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQ cmludFVOUkVBREFCTEVfSU5QVVRfRklMRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRy b2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnROT05fU1RBTkRBUkRfTElCUkFSWV9UWVBF KEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90 ICpQcmludExJQlJBUllfTUVUSE9EX05PVF9GT1VORChFcnJvckluZm8gJiwgTGV4U3RyZWFtICos IENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRDQU5OT1RfUkVPUEVOX0ZJTEUo RXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3Qg KlByaW50Q0FOTk9UX1dSSVRFX0ZJTEUoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9s ICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50Q09OU1RBTlRfUE9PTF9PVkVSRkxPVyhFcnJv ckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJp bnRJTlRFUkZBQ0VTX09WRVJGTE9XKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAm KTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludE1FVEhPRFNfT1ZFUkZMT1coRXJyb3JJbmZvICYs IExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50U1RSSU5H X09WRVJGTE9XKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRp YyB3Y2hhcl90ICpQcmludFBBUkFNRVRFUl9PVkVSRkxPVyhFcnJvckluZm8gJiwgTGV4U3RyZWFt ICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRBUlJBWV9PVkVSRkxPVyhF cnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAq UHJpbnRGSUVMRFNfT1ZFUkZMT1coRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYp OwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50TE9DQUxfVkFSSUFCTEVTX09WRVJGTE9XKEVycm9y SW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmlu dFNUQUNLX09WRVJGTE9XKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAg IHN0YXRpYyB3Y2hhcl90ICpQcmludENPREVfT1ZFUkZMT1coRXJyb3JJbmZvICYsIExleFN0cmVh bSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50Q0FOTk9UX0NPTVBVVEVf Q09MVU1OUyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMg d2NoYXJfdCAqUHJpbnRFTVBUWV9ERUNMQVJBVElPTihFcnJvckluZm8gJiwgTGV4U3RyZWFtICos IENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRSRURVTkRBTlRfQUJTVFJBQ1Qo RXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3Qg KlByaW50UkVEVU5EQU5UX0ZJTkFMKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAm KTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludFJFRFVOREFOVF9QVUJMSUMoRXJyb3JJbmZvICYs IExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50UkVEVU5E QU5UX1NUQVRJQyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0 aWMgd2NoYXJfdCAqUHJpbnRPQlNPTEVTQ0VOVF9BQlNUUkFDVChFcnJvckluZm8gJiwgTGV4U3Ry ZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRPQlNPTEVTQ0VOVF9C UkFDS0VUUyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMg d2NoYXJfdCAqUHJpbnROT19UWVBFUyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wg Jik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRNVUxUSVBMRV9QVUJMSUNfVFlQRVMoRXJyb3JJ bmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50 VFlQRV9JTl9NVUxUSVBMRV9GSUxFUyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wg Jik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRQQUNLQUdFX1RZUEVfQ09ORkxJQ1QoRXJyb3JJ bmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50 RElSRUNUT1JZX0ZJTEVfQ09ORkxJQ1QoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9s ICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50RklMRV9GSUxFX0NPTkZMSUNUKEVycm9ySW5m byAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludE1J U01BVENIRURfVFlQRV9BTkRfRklMRV9OQU1FUyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENv bnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRSRUZFUkVOQ0VfVE9fVFlQRV9JTl9N SVNNQVRDSEVEX0ZJTEUoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAg c3RhdGljIHdjaGFyX3QgKlByaW50RFVQTElDQVRFX0lOTkVSX1RZUEVfTkFNRShFcnJvckluZm8g JiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnREVVBM SUNBVEVfVFlQRV9ERUNMQVJBVElPTihFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wg Jik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRVTk5FQ0VTU0FSWV9UWVBFX0lNUE9SVChFcnJv ckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJp bnREVVBMSUNBVEVfQUNDRVNTX01PRElGSUVSKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29u dHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludERVUExJQ0FURV9NT0RJRklFUihFcnJv ckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJp bnRGSU5BTF9BQlNUUkFDVF9DTEFTUyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wg Jik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRWT0xBVElMRV9GSU5BTChFcnJvckluZm8gJiwg TGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRGSU5BTF9W T0xBVElMRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMg d2NoYXJfdCAqUHJpbnRJTlZBTElEX1RPUF9MRVZFTF9DTEFTU19NT0RJRklFUihFcnJvckluZm8g JiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRJTlZB TElEX0lOTkVSX0NMQVNTX01PRElGSUVSKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJv bCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludElOVkFMSURfU1RBVElDX0lOTkVSX0NMQVNT X01PRElGSUVSKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRp YyB3Y2hhcl90ICpQcmludElOVkFMSURfTE9DQUxfQ0xBU1NfTU9ESUZJRVIoRXJyb3JJbmZvICYs IExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50SU5WQUxJ RF9JTlRFUkZBQ0VfTU9ESUZJRVIoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYp OwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50SU5WQUxJRF9GSUVMRF9NT0RJRklFUihFcnJvcklu Zm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRJ TlZBTElEX0xPQ0FMX01PRElGSUVSKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAm KTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludElOVkFMSURfTUVUSE9EX01PRElGSUVSKEVycm9y SW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmlu dElOVkFMSURfU0lHTkFUVVJFX01PRElGSUVSKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29u dHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludElOVkFMSURfQ09OU1RSVUNUT1JfTU9E SUZJRVIoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdj aGFyX3QgKlByaW50SU5WQUxJRF9DT05TVEFOVF9NT0RJRklFUihFcnJvckluZm8gJiwgTGV4U3Ry ZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRVTklOSVRJQUxJWkVE X0ZJRUxEKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3 Y2hhcl90ICpQcmludFBBUkVOVF9UWVBFX0lOX1VOTkFNRURfUEFDS0FHRShFcnJvckluZm8gJiwg TGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRSRUNPTVBJ TEFUSU9OKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3 Y2hhcl90ICpQcmludFRZUEVfTk9UX0ZPVU5EKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29u dHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludERVUExJQ0FURV9PTl9ERU1BTkRfSU1Q T1JUKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hh cl90ICpQcmludE5PVF9BX1RZUEUoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYp OwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50Tk9UX0FfQ0xBU1MoRXJyb3JJbmZvICYsIExleFN0 cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50Tk9UX0FOX0lOVEVS RkFDRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2No YXJfdCAqUHJpbnRTVVBFUl9JU19GSU5BTChFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRy b2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRPQkpFQ1RfV0lUSF9TVVBFUl9UWVBFKEVy cm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQ cmludE9CSkVDVF9IQVNfTk9fU1VQRVJfVFlQRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENv bnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnREVVBMSUNBVEVfRklFTEQoRXJyb3JJ bmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50 RFVQTElDQVRFX01FVEhPRChFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAg ICBzdGF0aWMgd2NoYXJfdCAqUHJpbnREVVBMSUNBVEVfQ09OU1RSVUNUT1IoRXJyb3JJbmZvICYs IExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50TUlTTUFU Q0hFRF9JTkhFUklURURfTUVUSE9EKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAm KTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludE1JU01BVENIRURfSU5IRVJJVEVEX01FVEhPRF9F WFRFUk5BTExZKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRp YyB3Y2hhcl90ICpQcmludE1JU01BVENIRURfSU5IRVJJVEVEX01FVEhPRFNfSU5fQkFTRShFcnJv ckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJp bnREVVBMSUNBVEVfRk9STUFMX1BBUkFNRVRFUihFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENv bnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRNSVNNQVRDSEVEX0NPTlNUUlVDVE9S X05BTUUoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdj aGFyX3QgKlByaW50TUVUSE9EX1dJVEhfQ09OU1RSVUNUT1JfTkFNRShFcnJvckluZm8gJiwgTGV4 U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnREVVBMSUNBVEVf TE9DQUxfVkFSSUFCTEVfREVDTEFSQVRJT04oRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250 cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50RFVQTElDQVRFX0xPQ0FMX1RZUEVfREVD TEFSQVRJT04oRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGlj IHdjaGFyX3QgKlByaW50TVVMVElQTEVfREVGQVVMVF9MQUJFTChFcnJvckluZm8gJiwgTGV4U3Ry ZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRVTkRFQ0xBUkVEX0xB QkVMKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hh cl90ICpQcmludERVUExJQ0FURV9MQUJFTChFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRy b2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRDQVRDSF9QUklNSVRJVkVfVFlQRShFcnJv ckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJp bnRDQVRDSF9BUlJBWV9UWVBFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsK ICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludEFNQklHVU9VU19GSUVMRChFcnJvckluZm8gJiwgTGV4 U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRBTUJJR1VPVVNf VFlQRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2No YXJfdCAqUHJpbnRGSUVMRF9JU19UWVBFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJv bCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludEZJRUxEX05PVF9GT1VORChFcnJvckluZm8g JiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRGSUVM RF9OQU1FX01JU1NQRUxMRUQoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwog ICAgc3RhdGljIHdjaGFyX3QgKlByaW50RklFTERfV0lUSF9QUklWQVRFX0FDQ0VTU19OT1RfQUND RVNTSUJMRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMg d2NoYXJfdCAqUHJpbnRGSUVMRF9XSVRIX0RFRkFVTFRfQUNDRVNTX05PVF9BQ0NFU1NJQkxFKEVy cm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQ cmludE5BTUVfTk9UX0ZPVU5EKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsK ICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludE1FVEhPRF9OT1RfRklFTEQoRXJyb3JJbmZvICYsIExl eFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50TkFNRV9OT1Rf WUVUX0FWQUlMQUJMRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBz dGF0aWMgd2NoYXJfdCAqUHJpbnROQU1FX05PVF9WQVJJQUJMRShFcnJvckluZm8gJiwgTGV4U3Ry ZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnROQU1FX05PVF9DTEFT U19WQVJJQUJMRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0 aWMgd2NoYXJfdCAqUHJpbnROT1RfQV9OVU1FUklDX1ZBUklBQkxFKEVycm9ySW5mbyAmLCBMZXhT dHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludE1FVEhPRF9OT1Rf Rk9VTkQoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdj aGFyX3QgKlByaW50TUVUSE9EX05BTUVfTk9UX0ZPVU5EX0lOX1RZUEUoRXJyb3JJbmZvICYsIExl eFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50TUVUSE9EX05B TUVfTUlTU1BFTExFRChFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBz dGF0aWMgd2NoYXJfdCAqUHJpbnRNRVRIT0RfV0lUSF9QUklWQVRFX0FDQ0VTU19OT1RfQUNDRVNT SUJMRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2No YXJfdCAqUHJpbnRNRVRIT0RfV0lUSF9ERUZBVUxUX0FDQ0VTU19OT1RfQUNDRVNTSUJMRShFcnJv ckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJp bnRISURERU5fTUVUSE9EX0lOX0VOQ0xPU0lOR19DTEFTUyhFcnJvckluZm8gJiwgTGV4U3RyZWFt ICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRGSUVMRF9OT1RfTUVUSE9E KEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90 ICpQcmludFRZUEVfTk9UX01FVEhPRChFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wg Jik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRUWVBFX05PVF9GSUVMRChFcnJvckluZm8gJiwg TGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRNRVRIT0Rf Tk9UX0NMQVNTX01FVEhPRChFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAg ICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRBTUJJR1VPVVNfQ09OU1RSVUNUT1JfSU5WT0NBVElPTihF cnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAq UHJpbnRBTUJJR1VPVVNfTUVUSE9EX0lOVk9DQVRJT04oRXJyb3JJbmZvICYsIExleFN0cmVhbSAq LCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50Q09OU1RSVUNUT1JfTk9UX0ZP VU5EKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hh cl90ICpQcmludE1FVEhPRF9GT1VORF9GT1JfQ09OU1RSVUNUT1IoRXJyb3JJbmZvICYsIExleFN0 cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50QUJTVFJBQ1RfVFlQ RV9DUkVBVElPTihFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0 aWMgd2NoYXJfdCAqUHJpbnRJTlZBTElEX0lOU1RBTkNFT0ZfQ09OVkVSU0lPTihFcnJvckluZm8g JiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRJTlZB TElEX0NBU1RfQ09OVkVSU0lPTihFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7 CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRJTlZBTElEX0NBU1RfVFlQRShFcnJvckluZm8gJiwg TGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRJTkNPTVBB VElCTEVfVFlQRV9GT1JfSU5JVElBTElaQVRJT04oRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBD b250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50SU5DT01QQVRJQkxFX1RZUEVfRk9S X0FTU0lHTk1FTlQoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3Rh dGljIHdjaGFyX3QgKlByaW50SU5DT01QQVRJQkxFX1RZUEVfRk9SX0JJTkFSWV9FWFBSRVNTSU9O KEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90 ICpQcmludElOQ09NUEFUSUJMRV9UWVBFX0ZPUl9DT05ESVRJT05BTF9FWFBSRVNTSU9OKEVycm9y SW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmlu dFZPSURfQVJSQVkoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3Rh dGljIHdjaGFyX3QgKlByaW50Vk9JRF9UWVBFX0lOX0VRVUFMSVRZX0VYUFJFU1NJT04oRXJyb3JJ bmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50 VFlQRV9OT1RfVEhST1dBQkxFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsK ICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludFRZUEVfTk9UX1BSSU1JVElWRShFcnJvckluZm8gJiwg TGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRUWVBFX05P VF9JTlRFR1JBTChFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0 aWMgd2NoYXJfdCAqUHJpbnRUWVBFX05PVF9OVU1FUklDKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0g KiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludFRZUEVfTk9UX0lOVEVHRVIo RXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3Qg KlByaW50VFlQRV9OT1RfQk9PTEVBTihFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wg Jik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRUWVBFX05PVF9BUlJBWShFcnJvckluZm8gJiwg TGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRUWVBFX05P VF9SRUZFUkVOQ0UoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3Rh dGljIHdjaGFyX3QgKlByaW50VFlQRV9OT1RfVkFMSURfRk9SX1NXSVRDSChFcnJvckluZm8gJiwg TGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRUWVBFX0lT X1ZPSUQoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdj aGFyX3QgKlByaW50VkFMVUVfTk9UX1JFUFJFU0VOVEFCTEVfSU5fU1dJVENIX1RZUEUoRXJyb3JJ bmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50 VFlQRV9OT1RfQ09OVkVSVElCTEVfVE9fU1dJVENIX1RZUEUoRXJyb3JJbmZvICYsIExleFN0cmVh bSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50RFVQTElDQVRFX0NBU0Vf VkFMVUUoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdj aGFyX3QgKlByaW50TUlTUExBQ0VEX1RISVNfRVhQUkVTU0lPTihFcnJvckluZm8gJiwgTGV4U3Ry ZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRNSVNQTEFDRURfU1VQ RVJfRVhQUkVTU0lPTihFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBz dGF0aWMgd2NoYXJfdCAqUHJpbnRUQVJHRVRfVkFSSUFCTEVfSVNfRklOQUwoRXJyb3JJbmZvICYs IExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50RklOQUxf VkFSSUFCTEVfVEFSR0VUX0lOX0xPT1AoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9s ICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50VU5JTklUSUFMSVpFRF9GSU5BTF9WQVJJQUJM RShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJf dCAqUHJpbnRVTklOSVRJQUxJWkVEX1NUQVRJQ19GSU5BTF9WQVJJQUJMRShFcnJvckluZm8gJiwg TGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRVTklOSVRJ QUxJWkVEX0ZJTkFMX1ZBUklBQkxFX0lOX0NPTlNUUlVDVE9SKEVycm9ySW5mbyAmLCBMZXhTdHJl YW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludElOSVRfU0NBTEFSX1dJ VEhfQVJSQVkoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGlj IHdjaGFyX3QgKlByaW50SU5JVF9BUlJBWV9XSVRIX1NDQUxBUihFcnJvckluZm8gJiwgTGV4U3Ry ZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRJTlZBTElEX0JZVEVf VkFMVUUoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdj aGFyX3QgKlByaW50SU5WQUxJRF9TSE9SVF9WQUxVRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICos IENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRJTlZBTElEX0NIQVJBQ1RFUl9W QUxVRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2No YXJfdCAqUHJpbnRJTlZBTElEX0lOVF9WQUxVRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENv bnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRJTlZBTElEX0xPTkdfVkFMVUUoRXJy b3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlBy aW50SU5WQUxJRF9GTE9BVF9WQUxVRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wg Jik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRJTlZBTElEX0RPVUJMRV9WQUxVRShFcnJvcklu Zm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRJ TlZBTElEX1NUUklOR19WQUxVRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7 CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRSRVRVUk5fU1RBVEVNRU5UX0lOX0lOSVRJQUxJWkVS KEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90 ICpQcmludE1JU1BMQUNFRF9SRVRVUk5fV0lUSF9FWFBSRVNTSU9OKEVycm9ySW5mbyAmLCBMZXhT dHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludE1JU1BMQUNFRF9S RVRVUk5fV0lUSF9OT19FWFBSRVNTSU9OKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJv bCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludE1JU01BVENIRURfUkVUVVJOX0FORF9NRVRI T0RfVFlQRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMg d2NoYXJfdCAqUHJpbnRFWFBSRVNTSU9OX05PVF9USFJPV0FCTEUoRXJyb3JJbmZvICYsIExleFN0 cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50QkFEX1RIUk9XQUJM RV9FWFBSRVNTSU9OX0lOX1RSWShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7 CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRCQURfVEhST1dBQkxFX0VYUFJFU1NJT05fSU5fTUVU SE9EKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hh cl90ICpQcmludEJBRF9USFJPV0FCTEVfRVhQUkVTU0lPTihFcnJvckluZm8gJiwgTGV4U3RyZWFt ICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRNSVNQTEFDRURfQlJFQUtf U1RBVEVNRU5UKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRp YyB3Y2hhcl90ICpQcmludE1JU1BMQUNFRF9DT05USU5VRV9TVEFURU1FTlQoRXJyb3JJbmZvICYs IExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50TUlTUExB Q0VEX0VYUExJQ0lUX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04oRXJyb3JJbmZvICYsIExleFN0cmVh bSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50SU5WQUxJRF9DT05USU5V RV9UQVJHRVQoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGlj IHdjaGFyX3QgKlByaW50Tk9OX0FCU1RSQUNUX1RZUEVfQ09OVEFJTlNfQUJTVFJBQ1RfTUVUSE9E KEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90 ICpQcmludE5PTl9BQlNUUkFDVF9UWVBFX0lOSEVSSVRTX0FCU1RSQUNUX01FVEhPRChFcnJvcklu Zm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRO T05fQUJTVFJBQ1RfVFlQRV9JTkhFUklUU19BQlNUUkFDVF9NRVRIT0RfRlJPTV9BQlNUUkFDVF9D TEFTUyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2No YXJfdCAqUHJpbnROT05fQUJTVFJBQ1RfVFlQRV9DQU5OT1RfT1ZFUlJJREVfREVGQVVMVF9BQlNU UkFDVF9NRVRIT0QoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3Rh dGljIHdjaGFyX3QgKlByaW50Tk9fQUJTVFJBQ1RfTUVUSE9EX0lNUExFTUVOVEFUSU9OKEVycm9y SW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmlu dERVUExJQ0FURV9JTlRFUkZBQ0UoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYp OwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50VU5LTk9XTl9RVUFMSUZJRURfTkFNRV9CQVNFKEVy cm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQ cmludFVOS05PV05fQU1CSUdVT1VTX05BTUUoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250 cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50Q0lSQ1VMQVJfSU5URVJGQUNFKEVycm9y SW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmlu dENJUkNVTEFSX0NMQVNTKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAg IHN0YXRpYyB3Y2hhcl90ICpQcmludFRZUEVfTk9UX0FDQ0VTU0lCTEUoRXJyb3JJbmZvICYsIExl eFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50UFJJVkFURV9G SUVMRF9OT1RfQUNDRVNTSUJMRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7 CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRQUk9URUNURURfRklFTERfTk9UX0FDQ0VTU0lCTEUo RXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3Qg KlByaW50REVGQVVMVF9GSUVMRF9OT1RfQUNDRVNTSUJMRShFcnJvckluZm8gJiwgTGV4U3RyZWFt ICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRQUklWQVRFX01FVEhPRF9O T1RfQUNDRVNTSUJMRShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBz dGF0aWMgd2NoYXJfdCAqUHJpbnRQUk9URUNURURfTUVUSE9EX05PVF9BQ0NFU1NJQkxFKEVycm9y SW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmlu dERFRkFVTFRfTUVUSE9EX05PVF9BQ0NFU1NJQkxFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwg Q29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludFBSSVZBVEVfQ09OU1RSVUNUT1Jf Tk9UX0FDQ0VTU0lCTEUoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAg c3RhdGljIHdjaGFyX3QgKlByaW50UFJPVEVDVEVEX0NPTlNUUlVDVE9SX05PVF9BQ0NFU1NJQkxF KEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90 ICpQcmludERFRkFVTFRfQ09OU1RSVUNUT1JfTk9UX0FDQ0VTU0lCTEUoRXJyb3JJbmZvICYsIExl eFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50Q09OU1RSVUNU T1JfRE9FU19OT1RfVEhST1dfVEhJU19FWENFUFRJT04oRXJyb3JJbmZvICYsIExleFN0cmVhbSAq LCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50Q09OU1RSVUNUT1JfRE9FU19O T1RfVEhST1dfU1VQRVJfRVhDRVBUSU9OKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJv bCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludFBBUkFNRVRFUl9SRURFQ0xBUkVEKEVycm9y SW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmlu dEJBRF9BQlNUUkFDVF9NRVRIT0RfTU9ESUZJRVIoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBD b250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50QUJTVFJBQ1RfTUVUSE9EX01PRElG SUVSX0NPTkZMSUNUKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0 YXRpYyB3Y2hhcl90ICpQcmludFNUUklDVEZQX05BVElWRV9NRVRIT0QoRXJyb3JJbmZvICYsIExl eFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50QUJTVFJBQ1Rf TUVUSE9EX0lOVk9DQVRJT04oRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwog ICAgc3RhdGljIHdjaGFyX3QgKlByaW50RklOQUxfTUVUSE9EX09WRVJSSURFKEVycm9ySW5mbyAm LCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludEZJTkFM X01FVEhPRF9PVkVSUklERV9FWFRFUk5BTExZKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29u dHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludFBSSVZBVEVfTUVUSE9EX09WRVJSSURF KEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90 ICpQcmludFBSSVZBVEVfTUVUSE9EX09WRVJSSURFX0VYVEVSTkFMTFkoRXJyb3JJbmZvICYsIExl eFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50SU5TVEFOQ0Vf TUVUSE9EX09WRVJSSURFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAg IHN0YXRpYyB3Y2hhcl90ICpQcmludElOU1RBTkNFX01FVEhPRF9PVkVSUklERV9FWFRFUk5BTExZ KEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90 ICpQcmludENMQVNTX01FVEhPRF9PVkVSUklERShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENv bnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRDTEFTU19NRVRIT0RfT1ZFUlJJREVf RVhURVJOQUxMWShFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0 aWMgd2NoYXJfdCAqUHJpbnRNSVNNQVRDSEVEX09WRVJSSURERU5fRVhDRVBUSU9OKEVycm9ySW5m byAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludE1J U01BVENIRURfT1ZFUlJJRERFTl9FWENFUFRJT05fRVhURVJOQUxMWShFcnJvckluZm8gJiwgTGV4 U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRBQlNUUkFDVF9N RVRIT0RfV0lUSF9CT0RZKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAg IHN0YXRpYyB3Y2hhcl90ICpQcmludE5PTl9BQlNUUkFDVF9NRVRIT0RfV0lUSE9VVF9CT0RZKEVy cm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQ cmludEJBRF9BQ0NFU1NfTUVUSE9EX09WRVJSSURFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwg Q29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludEJBRF9BQ0NFU1NfTUVUSE9EX09W RVJSSURFX0VYVEVSTkFMTFkoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwog ICAgc3RhdGljIHdjaGFyX3QgKlByaW50U1RBVElDX09WRVJSSURFX0FCU1RSQUNUKEVycm9ySW5m byAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludFNU QVRJQ19PVkVSUklERV9BQlNUUkFDVF9FWFRFUk5BTExZKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0g KiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludENJUkNVTEFSX1RISVNfQ0FM TChFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJf dCAqUHJpbnRJTlNUQU5DRV9WQVJJQUJMRV9JTl9FWFBMSUNJVF9DT05TVFJVQ1RPUl9JTlZPQ0FU SU9OKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hh cl90ICpQcmludElOU1RBTkNFX01FVEhPRF9JTl9FWFBMSUNJVF9DT05TVFJVQ1RPUl9JTlZPQ0FU SU9OKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hh cl90ICpQcmludFNZTlRIRVRJQ19WQVJJQUJMRV9BQ0NFU1MoRXJyb3JJbmZvICYsIExleFN0cmVh bSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50U1lOVEhFVElDX01FVEhP RF9JTlZPQ0FUSU9OKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0 YXRpYyB3Y2hhcl90ICpQcmludFNZTlRIRVRJQ19DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OKEVycm9y SW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmlu dFRISVNfSU5fRVhQTElDSVRfQ09OU1RSVUNUT1JfSU5WT0NBVElPTihFcnJvckluZm8gJiwgTGV4 U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRTVVBFUl9JTl9F WFBMSUNJVF9DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwg Q29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludElOTkVSX0NPTlNUUlVDVE9SX0lO X0VYUExJQ0lUX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04oRXJyb3JJbmZvICYsIExleFN0cmVhbSAq LCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50RVhQUkVTU0lPTl9OT1RfQ09O U1RBTlQoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdj aGFyX3QgKlByaW50VU5DQVRDSEFCTEVfTUVUSE9EX1RIUk9XTl9DSEVDS0VEX0VYQ0VQVElPTihF cnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAq UHJpbnRVTkNBVENIQUJMRV9DT05TVFJVQ1RPUl9USFJPV05fQ0hFQ0tFRF9FWENFUFRJT04oRXJy b3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlBy aW50VU5SRUFDSEFCTEVfQ0FUQ0hfQ0xBVVNFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29u dHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludFVOUkVBQ0hBQkxFX0RFRkFVTFRfQ0FU Q0hfQ0xBVVNFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRp YyB3Y2hhcl90ICpQcmludFVOUkVBQ0hBQkxFX1NUQVRFTUVOVChFcnJvckluZm8gJiwgTGV4U3Ry ZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRVTlJFQUNIQUJMRV9T VEFURU1FTlRTKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRp YyB3Y2hhcl90ICpQcmludFVOUkVBQ0hBQkxFX0NPTlNUUlVDVE9SX0JPRFkoRXJyb3JJbmZvICYs IExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50QkxPQ0tF RF9DQVRDSF9DTEFVU0UoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAg c3RhdGljIHdjaGFyX3QgKlByaW50VkFSSUFCTEVfTk9UX0RFRklOSVRFTFlfQVNTSUdORUQoRXJy b3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlBy aW50VFlQRURfTUVUSE9EX1dJVEhfTk9fUkVUVVJOKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwg Q29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludERFRkFVTFRfTUVUSE9EX05PVF9P VkVSUklEREVOKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRp YyB3Y2hhcl90ICpQcmludE9ORV9VTk5BTUVEX1BBQ0tBR0UoRXJyb3JJbmZvICYsIExleFN0cmVh bSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50VFlQRV9OT1RfSU5fVU5O QU1FRF9QQUNLQUdFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0 YXRpYyB3Y2hhcl90ICpQcmludFRZUEVfSU5fV1JPTkdfUEFDS0FHRShFcnJvckluZm8gJiwgTGV4 U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRUWVBFX05BTUVf TUlTTUFUQ0goRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGlj IHdjaGFyX3QgKlByaW50REVQUkVDQVRFRF9UWVBFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwg Q29udHJvbCAmKTsKICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludERFUFJFQ0FURURfRklFTEQoRXJy b3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlBy aW50REVQUkVDQVRFRF9NRVRIT0QoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYp OwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50REVQUkVDQVRFRF9DT05TVFJVQ1RPUihFcnJvcklu Zm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRD T01QUkVTU0VEX1pJUF9GSUxFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsK ICAgIHN0YXRpYyB3Y2hhcl90ICpQcmludElOVkFMSURfQ0xBU1NfRklMRShFcnJvckluZm8gJiwg TGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRDQU5OT1Rf T1BFTl9DTEFTU19GSUxFKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAg IHN0YXRpYyB3Y2hhcl90ICpQcmludElOVEVSRkFDRV9OT1RfSU5ORVJfQ0xBU1MoRXJyb3JJbmZv ICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50U1RB VElDX05PVF9JTk5FUl9DTEFTUyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7 CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRUWVBFX05PVF9JTk5FUl9DTEFTUyhFcnJvckluZm8g JiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRTVVBF Ul9UWVBFX05PVF9JTk5FUl9DTEFTUyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wg Jik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRTVEFUSUNfRklFTERfSU5fSU5ORVJfQ0xBU1Nf Tk9UX0ZJTkFMKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRp YyB3Y2hhcl90ICpQcmludFNUQVRJQ19GSUVMRF9JTl9JTk5FUl9DTEFTU19OT1RfQ09OU1RBTlQo RXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3Qg KlByaW50U1RBVElDX01FVEhPRF9JTl9JTk5FUl9DTEFTUyhFcnJvckluZm8gJiwgTGV4U3RyZWFt ICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRTVEFUSUNfVFlQRV9JTl9J Tk5FUl9DTEFTUyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0 aWMgd2NoYXJfdCAqUHJpbnRTVEFUSUNfSU5JVElBTElaRVJfSU5fSU5ORVJfQ0xBU1MoRXJyb3JJ bmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50 SU5ORVJfQ0xBU1NfUkVGRVJFTkNFX1RPX05PTl9GSU5BTF9MT0NBTF9WQVJJQUJMRShFcnJvcklu Zm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRT VEFUSUNfUFJPVEVDVEVEX0ZJRUxEX0FDQ0VTUyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENv bnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRTVEFUSUNfUFJPVEVDVEVEX01FVEhP RF9BQ0NFU1MoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGlj IHdjaGFyX3QgKlByaW50SU5IRVJJVEFOQ0VfQU5EX0xFWElDQUxfU0NPUElOR19DT05GTElDVF9X SVRIX0xPQ0FMKEVycm9ySW5mbyAmLCBMZXhTdHJlYW0gKiwgQ29udHJvbCAmKTsKICAgIHN0YXRp YyB3Y2hhcl90ICpQcmludElOSEVSSVRBTkNFX0FORF9MRVhJQ0FMX1NDT1BJTkdfQ09ORkxJQ1Rf V0lUSF9NRU1CRVIoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3Rh dGljIHdjaGFyX3QgKlByaW50SUxMRUdBTF9USElTX0ZJRUxEX0FDQ0VTUyhFcnJvckluZm8gJiwg TGV4U3RyZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRDT05TVFJV Q1RPUl9GT1VORF9JTl9BTk9OWU1PVVNfQ0xBU1MoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBD b250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50RU5DTE9TSU5HX0lOU1RBTkNFX0FD Q0VTU19GUk9NX0NPTlNUUlVDVE9SX0lOVk9DQVRJT04oRXJyb3JJbmZvICYsIExleFN0cmVhbSAq LCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50RU5DTE9TSU5HX0lOU1RBTkNF X0FDQ0VTU19BQ1JPU1NfU1RBVElDX1JFR0lPTihFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENv bnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRFTkNMT1NJTkdfSU5TVEFOQ0VfTk9U X0FDQ0VTU0lCTEUoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3Rh dGljIHdjaGFyX3QgKlByaW50SU5WQUxJRF9FTkNMT1NJTkdfSU5TVEFOQ0UoRXJyb3JJbmZvICYs IExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3RhdGljIHdjaGFyX3QgKlByaW50WkVST19E SVZJREVfRVJST1IoRXJyb3JJbmZvICYsIExleFN0cmVhbSAqLCBDb250cm9sICYpOwogICAgc3Rh dGljIHdjaGFyX3QgKlByaW50WkVST19ESVZJREVfQ0FVVElPTihFcnJvckluZm8gJiwgTGV4U3Ry ZWFtICosIENvbnRyb2wgJik7CiAgICBzdGF0aWMgd2NoYXJfdCAqUHJpbnRWT0lEX1RPX1NUUklO RyhFcnJvckluZm8gJiwgTGV4U3RyZWFtICosIENvbnRyb2wgJik7CgogICAgdm9pZCBTb3J0TWVz c2FnZXMoKTsKfTsKCgoKCgoKCiMgMTYgIi4uLy4uL2ppa2VzL3NyYy9zZW1hbnRpYy5oIiAyCgoK IyAxICIuLi8uLi9qaWtlcy9zcmMvY29udHJvbC5oIiAxCiAKIAogCiAKIAogCiAKIAogCgoKCgoK CgoKCiAKCgoKCgoKCgoKY2xhc3MgU3RvcmFnZVBvb2w7CmNsYXNzIFNjYW5uZXI7CmNsYXNzIFBh cnNlcjsKY2xhc3MgU2VtYW50aWM7CmNsYXNzIExleFN0cmVhbTsKY2xhc3MgQXN0UGFja2FnZURl Y2xhcmF0aW9uOwoKY2xhc3MgQ29udHJvbCA6IHB1YmxpYyBTdHJpbmdDb25zdGFudAp7CnB1Ymxp YzoKICAgIGludCByZXR1cm5fY29kZTsKICAgIE9wdGlvbiAmb3B0aW9uOwogICAgU3ltYm9sVGFi bGUgY2xhc3NwYXRoX3RhYmxlLAogICAgICAgICAgICAgICAgZXh0ZXJuYWxfdGFibGU7CgogICAg UGFja2FnZVN5bWJvbCAqc3lzdGVtX3BhY2thZ2UsCiAgICAgICAgICAgICAgICAgICpqYXZhX3V0 aWxfcGFja2FnZSwKICAgICAgICAgICAgICAgICAgKnVubmFtZWRfcGFja2FnZTsKICAgIGludCBk b3RfY2xhc3NwYXRoX2luZGV4OwogICAgVHVwbGU8UGF0aFN5bWJvbCAqPiBjbGFzc3BhdGg7CiAg ICBUdXBsZTx3Y2hhcl90ICo+IGJhZF9kaXJuYW1lcywKICAgICAgICAgICAgICAgICAgICAgYmFk X3ppcF9maWxlbmFtZXMsCiAgICAgICAgICAgICAgICAgICAgIGJhZF9pbnB1dF9maWxlbmFtZXMs CiAgICAgICAgICAgICAgICAgICAgIHVucmVhZGFibGVfaW5wdXRfZmlsZW5hbWVzOwoKICAgIFN5 c3RlbVRhYmxlICpzeXN0ZW1fdGFibGU7CiAgICBUdXBsZTxEaXJlY3RvcnlTeW1ib2wgKj4gc3lz dGVtX2RpcmVjdG9yaWVzOwoKICAgIFNlbWFudGljICpzeXN0ZW1fc2VtYW50aWM7CiAgICBUdXBs ZTxTZW1hbnRpYyAqPiBzZW1hbnRpYzsKICAgIFR1cGxlPFR5cGVTeW1ib2wgKj4gbmVlZHNfYm9k eV93b3JrLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3RyYXNoX2JpbjsKCiAgICBOYW1l U3ltYm9sTWFwIHVubmFtZWRfcGFja2FnZV90eXBlczsKCiAgICBTeW1ib2xTZXQgaW5wdXRfamF2 YV9maWxlX3NldCwKICAgICAgICAgICAgICBpbnB1dF9jbGFzc19maWxlX3NldCwKICAgICAgICAg ICAgICBleHBpcmVkX2ZpbGVfc2V0LAogICAgICAgICAgICAgIHJlY29tcGlsYXRpb25fZmlsZV9z ZXQ7CgogICAgUGFyc2VyICpwYXJzZXI7CiAgICBTY2FubmVyICpzY2FubmVyOwoKICAgICAKICAg ICAKICAgICAKICAgIExpdGVyYWxMb29rdXBUYWJsZSBzdHJpbmdfdGFibGUsCiAgICAgICAgICAg ICAgICAgICAgICAgaW50X3RhYmxlLAogICAgICAgICAgICAgICAgICAgICAgIGxvbmdfdGFibGUs CiAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90YWJsZSwKICAgICAgICAgICAgICAgICAgICAg ICBmbG9hdF90YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVfdGFibGU7CiAgICBO YW1lTG9va3VwVGFibGUgbmFtZV90YWJsZTsKICAgIFR5cGVMb29rdXBUYWJsZSB0eXBlX3RhYmxl OwoKICAgICAKICAgICAKICAgICAKICAgIE5hbWVTeW1ib2wgKmRvdF9uYW1lX3N5bWJvbCwKICAg ICAgICAgICAgICAgKmRvdF9kb3RfbmFtZV9zeW1ib2wsCiAgICAgICAgICAgICAgICpsZW5ndGhf bmFtZV9zeW1ib2wsCiAgICAgICAgICAgICAgICppbml0X25hbWVfc3ltYm9sLAogICAgICAgICAg ICAgICAqY2xpbml0X25hbWVfc3ltYm9sLAogICAgICAgICAgICAgICAqYmxvY2tfaW5pdF9uYW1l X3N5bWJvbCwKICAgICAgICAgICAgICAgKnRoaXMwX25hbWVfc3ltYm9sLAogICAgICAgICAgICAg ICAqY2xvbmVfbmFtZV9zeW1ib2wsCiAgICAgICAgICAgICAgICpvYmplY3RfbmFtZV9zeW1ib2ws CiAgICAgICAgICAgICAgICp0eXBlX25hbWVfc3ltYm9sLAogICAgICAgICAgICAgICAqY2xhc3Nf bmFtZV9zeW1ib2wsCiAgICAgICAgICAgICAgICp0b1N0cmluZ19uYW1lX3N5bWJvbCwKICAgICAg ICAgICAgICAgKmFwcGVuZF9uYW1lX3N5bWJvbCwKICAgICAgICAgICAgICAgKmZvck5hbWVfbmFt ZV9zeW1ib2wsCiAgICAgICAgICAgICAgICpnZXRNZXNzYWdlX25hbWVfc3ltYm9sOwoKICAgICAK ICAgICAKICAgICAKICAgIFR5cGVTeW1ib2wgKmJ5dGVfdHlwZSwKICAgICAgICAgICAgICAgKnNo b3J0X3R5cGUsCiAgICAgICAgICAgICAgICppbnRfdHlwZSwKICAgICAgICAgICAgICAgKmxvbmdf dHlwZSwKICAgICAgICAgICAgICAgKmNoYXJfdHlwZSwKICAgICAgICAgICAgICAgKmZsb2F0X3R5 cGUsCiAgICAgICAgICAgICAgICpkb3VibGVfdHlwZSwKICAgICAgICAgICAgICAgKmJvb2xlYW5f dHlwZSwKICAgICAgICAgICAgICAgKnZvaWRfdHlwZSwKICAgICAgICAgICAgICAgKm51bGxfdHlw ZSwKICAgICAgICAgICAgICAgKm5vX3R5cGU7CgogICAgIAogICAgVHlwZVN5bWJvbCAqR2V0VHlw ZShQYWNrYWdlU3ltYm9sICosIHdjaGFyX3QgKik7CgogICAgaW5saW5lIFR5cGVTeW1ib2wgKlNl cmlhbGl6YWJsZSgpCiAgICB7CiAgICAgICAgaWYgKCEgU2VyaWFsaXphYmxlX3R5cGUpCiAgICAg ICAgewogICAgICAgICAgICBQYWNrYWdlU3ltYm9sICppb19wYWNrYWdlID0gUHJvY2Vzc1BhY2th Z2UoU3RyaW5nQ29uc3RhbnQ6OlVTX2phdmFfU0xfaW8pOwogICAgICAgICAgICBGaW5kUGF0aHNU b0RpcmVjdG9yeShpb19wYWNrYWdlKTsKICAgICAgICAgICAgU2VyaWFsaXphYmxlX3R5cGUgPSBH ZXRUeXBlKGlvX3BhY2thZ2UsIFN0cmluZ0NvbnN0YW50OjpVU19TZXJpYWxpemFibGUpOwogICAg ICAgIH0KCiAgICAgICAgcmV0dXJuIFNlcmlhbGl6YWJsZV90eXBlOwogICAgfQoKICAgIGlubGlu ZSBUeXBlU3ltYm9sICpPYmplY3QoKQogICAgewogICAgICAgIHJldHVybiAoT2JqZWN0X3R5cGUg PyBPYmplY3RfdHlwZSA6IE9iamVjdF90eXBlID0gR2V0VHlwZShzeXN0ZW1fcGFja2FnZSwgU3Ry aW5nQ29uc3RhbnQ6OlVTX09iamVjdCkpOwogICAgfQoKICAgIGlubGluZSBUeXBlU3ltYm9sICpD bG9uZWFibGUoKQogICAgewogICAgICAgIHJldHVybiAoQ2xvbmVhYmxlX3R5cGUgPyBDbG9uZWFi bGVfdHlwZSA6IENsb25lYWJsZV90eXBlID0gR2V0VHlwZShzeXN0ZW1fcGFja2FnZSwgU3RyaW5n Q29uc3RhbnQ6OlVTX0Nsb25lYWJsZSkpOwogICAgfQoKICAgIGlubGluZSBUeXBlU3ltYm9sICpT dHJpbmcoKQogICAgewogICAgICAgIHJldHVybiAoU3RyaW5nX3R5cGUgPyBTdHJpbmdfdHlwZSA6 IFN0cmluZ190eXBlID0gR2V0VHlwZShzeXN0ZW1fcGFja2FnZSwgU3RyaW5nQ29uc3RhbnQ6OlVT X1N0cmluZykpOwogICAgfQoKICAgIGlubGluZSBUeXBlU3ltYm9sICpWb2lkKCkKICAgIHsKICAg ICAgICByZXR1cm4gKFZvaWRfdHlwZSA/IFZvaWRfdHlwZSA6IFZvaWRfdHlwZSA9IEdldFR5cGUo c3lzdGVtX3BhY2thZ2UsIFN0cmluZ0NvbnN0YW50OjpVU19Wb2lkKSk7CiAgICB9CgogICAgaW5s aW5lIFR5cGVTeW1ib2wgKkJvb2xlYW4oKQogICAgewogICAgICAgIHJldHVybiAoQm9vbGVhbl90 eXBlID8gQm9vbGVhbl90eXBlIDogQm9vbGVhbl90eXBlID0gR2V0VHlwZShzeXN0ZW1fcGFja2Fn ZSwgU3RyaW5nQ29uc3RhbnQ6OlVTX0Jvb2xlYW4pKTsKICAgIH0KCiAgICBpbmxpbmUgVHlwZVN5 bWJvbCAqQnl0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIChCeXRlX3R5cGUgPyBCeXRlX3R5cGUg OiBCeXRlX3R5cGUgPSBHZXRUeXBlKHN5c3RlbV9wYWNrYWdlLCBTdHJpbmdDb25zdGFudDo6VVNf Qnl0ZSkpOwogICAgfQoKICAgIGlubGluZSBUeXBlU3ltYm9sICpTaG9ydCgpCiAgICB7CiAgICAg ICAgcmV0dXJuIChTaG9ydF90eXBlID8gU2hvcnRfdHlwZSA6IFNob3J0X3R5cGUgPSBHZXRUeXBl KHN5c3RlbV9wYWNrYWdlLCBTdHJpbmdDb25zdGFudDo6VVNfU2hvcnQpKTsKICAgIH0KCiAgICBp bmxpbmUgVHlwZVN5bWJvbCAqQ2hhcmFjdGVyKCkKICAgIHsKICAgICAgICByZXR1cm4gKENoYXJh Y3Rlcl90eXBlID8gQ2hhcmFjdGVyX3R5cGUgOiBDaGFyYWN0ZXJfdHlwZSA9IEdldFR5cGUoc3lz dGVtX3BhY2thZ2UsIFN0cmluZ0NvbnN0YW50OjpVU19DaGFyYWN0ZXIpKTsKICAgIH0KCiAgICBp bmxpbmUgVHlwZVN5bWJvbCAqSW50ZWdlcigpCiAgICB7CiAgICAgICAgcmV0dXJuIChJbnRlZ2Vy X3R5cGUgPyBJbnRlZ2VyX3R5cGUgOiBJbnRlZ2VyX3R5cGUgPSBHZXRUeXBlKHN5c3RlbV9wYWNr YWdlLCBTdHJpbmdDb25zdGFudDo6VVNfSW50ZWdlcikpOwogICAgfQoKICAgIGlubGluZSBUeXBl U3ltYm9sICpMb25nKCkKICAgIHsKICAgICAgICByZXR1cm4gKExvbmdfdHlwZSA/IExvbmdfdHlw ZSA6IExvbmdfdHlwZSA9IEdldFR5cGUoc3lzdGVtX3BhY2thZ2UsIFN0cmluZ0NvbnN0YW50OjpV U19Mb25nKSk7CiAgICB9CgogICAgaW5saW5lIFR5cGVTeW1ib2wgKkZsb2F0KCkKICAgIHsKICAg ICAgICByZXR1cm4gKEZsb2F0X3R5cGUgPyBGbG9hdF90eXBlIDogRmxvYXRfdHlwZSA9IEdldFR5 cGUoc3lzdGVtX3BhY2thZ2UsIFN0cmluZ0NvbnN0YW50OjpVU19GbG9hdCkpOwogICAgfQoKICAg IGlubGluZSBUeXBlU3ltYm9sICpEb3VibGUoKQogICAgewogICAgICAgIHJldHVybiAoRG91Ymxl X3R5cGUgPyBEb3VibGVfdHlwZSA6IERvdWJsZV90eXBlID0gR2V0VHlwZShzeXN0ZW1fcGFja2Fn ZSwgU3RyaW5nQ29uc3RhbnQ6OlVTX0RvdWJsZSkpOwogICAgfQoKICAgIHZvaWQgSW5pdENsYXNz SW5mbygpOwogICAgaW5saW5lIFR5cGVTeW1ib2wgKkNsYXNzKCkKICAgIHsKICAgICAgICBpZiAo ISBDbGFzc190eXBlKQogICAgICAgIHsKICAgICAgICAgICAgQ2xhc3NfdHlwZSA9IEdldFR5cGUo c3lzdGVtX3BhY2thZ2UsIFN0cmluZ0NvbnN0YW50OjpVU19DbGFzcyk7CiAgICAgICAgICAgIElu aXRDbGFzc0luZm8oKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBDbGFzc190eXBlOwogICAg fQoKICAgIE1ldGhvZFN5bWJvbCAqQ2xhc3NfZm9yTmFtZU1ldGhvZCgpCiAgICB7CiAgICAgICAg aWYgKCEgQ2xhc3NfZm9yTmFtZV9tZXRob2QpCiAgICAgICAgICAgICh2b2lkKSBDbGFzcygpOwog ICAgICAgIHJldHVybiBDbGFzc19mb3JOYW1lX21ldGhvZDsKICAgIH0KCgogICAgdm9pZCBJbml0 VGhyb3dhYmxlSW5mbygpOwogICAgaW5saW5lIFR5cGVTeW1ib2wgKlRocm93YWJsZSgpCiAgICB7 CiAgICAgICAgaWYgKCEgVGhyb3dhYmxlX3R5cGUpCiAgICAgICAgewogICAgICAgICAgICBUaHJv d2FibGVfdHlwZSA9IEdldFR5cGUoc3lzdGVtX3BhY2thZ2UsIFN0cmluZ0NvbnN0YW50OjpVU19U aHJvd2FibGUpOwogICAgICAgICAgICBJbml0VGhyb3dhYmxlSW5mbygpOwogICAgICAgIH0KCiAg ICAgICAgcmV0dXJuIFRocm93YWJsZV90eXBlOwogICAgfQoKICAgIE1ldGhvZFN5bWJvbCAqVGhy b3dhYmxlX2dldE1lc3NhZ2VNZXRob2QoKQogICAgewogICAgICAgIGlmICghIFRocm93YWJsZV9n ZXRNZXNzYWdlX21ldGhvZCkKICAgICAgICAgICAgKHZvaWQpIFRocm93YWJsZSgpOwogICAgICAg IHJldHVybiBUaHJvd2FibGVfZ2V0TWVzc2FnZV9tZXRob2Q7CiAgICB9CgogICAgaW5saW5lIFR5 cGVTeW1ib2wgKkV4Y2VwdGlvbigpCiAgICB7CiAgICAgICAgcmV0dXJuIChFeGNlcHRpb25fdHlw ZQogICAgICAgICAgICAgICAgICAgICAgID8gRXhjZXB0aW9uX3R5cGUKICAgICAgICAgICAgICAg ICAgICAgICA6IEV4Y2VwdGlvbl90eXBlID0gR2V0VHlwZShzeXN0ZW1fcGFja2FnZSwgU3RyaW5n Q29uc3RhbnQ6OlVTX0V4Y2VwdGlvbikpOwogICAgfQoKICAgIGlubGluZSBUeXBlU3ltYm9sICpS dW50aW1lRXhjZXB0aW9uKCkKICAgIHsKICAgICAgICByZXR1cm4gKFJ1bnRpbWVFeGNlcHRpb25f dHlwZQogICAgICAgICAgICAgICAgICAgICAgID8gUnVudGltZUV4Y2VwdGlvbl90eXBlCiAgICAg ICAgICAgICAgICAgICAgICAgOiBSdW50aW1lRXhjZXB0aW9uX3R5cGUgPSBHZXRUeXBlKHN5c3Rl bV9wYWNrYWdlLCBTdHJpbmdDb25zdGFudDo6VVNfUnVudGltZUV4Y2VwdGlvbikpOwogICAgfQoK ICAgIGlubGluZSBUeXBlU3ltYm9sICpDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCkKICAgIHsKICAg ICAgICByZXR1cm4gKENsYXNzTm90Rm91bmRFeGNlcHRpb25fdHlwZQogICAgICAgICAgICAgICAg ICAgICAgID8gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbl90eXBlCiAgICAgICAgICAgICAgICAgICAg ICAgOiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uX3R5cGUgPSBHZXRUeXBlKHN5c3RlbV9wYWNrYWdl LCBTdHJpbmdDb25zdGFudDo6VVNfQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikpOwogICAgfQoKICAg IGlubGluZSBUeXBlU3ltYm9sICpFcnJvcigpCiAgICB7CiAgICAgICAgcmV0dXJuIChFcnJvcl90 eXBlID8gRXJyb3JfdHlwZSA6IEVycm9yX3R5cGUgPSBHZXRUeXBlKHN5c3RlbV9wYWNrYWdlLCBT dHJpbmdDb25zdGFudDo6VVNfRXJyb3IpKTsKICAgIH0KCiAgICB2b2lkIEluaXROb0NsYXNzRGVm Rm91bmRFcnJvckluZm8oKTsKICAgIGlubGluZSBUeXBlU3ltYm9sICpOb0NsYXNzRGVmRm91bmRF cnJvcigpCiAgICB7CiAgICAgICAgaWYgKCEgTm9DbGFzc0RlZkZvdW5kRXJyb3JfdHlwZSkKICAg ICAgICB7CiAgICAgICAgICAgIE5vQ2xhc3NEZWZGb3VuZEVycm9yX3R5cGUgPSBHZXRUeXBlKHN5 c3RlbV9wYWNrYWdlLCBTdHJpbmdDb25zdGFudDo6VVNfTm9DbGFzc0RlZkZvdW5kRXJyb3IpOwog ICAgICAgICAgICBJbml0Tm9DbGFzc0RlZkZvdW5kRXJyb3JJbmZvKCk7CiAgICAgICAgfQoKICAg ICAgICByZXR1cm4gTm9DbGFzc0RlZkZvdW5kRXJyb3JfdHlwZTsKICAgIH0KCiAgICBNZXRob2RT eW1ib2wgKk5vQ2xhc3NEZWZGb3VuZEVycm9yX0luaXRNZXRob2QoKQogICAgewogICAgICAgIGlm ICghIE5vQ2xhc3NEZWZGb3VuZEVycm9yX0luaXRXaXRoU3RyaW5nX21ldGhvZCkKICAgICAgICAg ICAgKHZvaWQpIE5vQ2xhc3NEZWZGb3VuZEVycm9yKCk7CiAgICAgICAgcmV0dXJuIE5vQ2xhc3NE ZWZGb3VuZEVycm9yX0luaXRXaXRoU3RyaW5nX21ldGhvZDsKICAgIH0KCgogICAgdm9pZCBJbml0 U3RyaW5nQnVmZmVySW5mbygpOwogICAgaW5saW5lIFR5cGVTeW1ib2wgKlN0cmluZ0J1ZmZlcigp CiAgICB7CiAgICAgICAgaWYgKCEgU3RyaW5nQnVmZmVyX3R5cGUpCiAgICAgICAgewogICAgICAg ICAgICBTdHJpbmdCdWZmZXJfdHlwZSA9IEdldFR5cGUoc3lzdGVtX3BhY2thZ2UsIFN0cmluZ0Nv bnN0YW50OjpVU19TdHJpbmdCdWZmZXIpOwogICAgICAgICAgICBJbml0U3RyaW5nQnVmZmVySW5m bygpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFN0cmluZ0J1ZmZlcl90eXBlOwogICAgfQoK CiAgICBNZXRob2RTeW1ib2wgKlN0cmluZ0J1ZmZlcl9Jbml0TWV0aG9kKCkKICAgIHsKICAgICAg ICBpZiAoISBTdHJpbmdCdWZmZXJfSW5pdF9tZXRob2QpCiAgICAgICAgICAgICh2b2lkKSBTdHJp bmdCdWZmZXIoKTsKICAgICAgICByZXR1cm4gU3RyaW5nQnVmZmVyX0luaXRfbWV0aG9kOwogICAg fQoKCiAgICBNZXRob2RTeW1ib2wgKlN0cmluZ0J1ZmZlcl9Jbml0V2l0aFN0cmluZ01ldGhvZCgp CiAgICB7CiAgICAgICAgaWYgKCEgU3RyaW5nQnVmZmVyX0luaXRXaXRoU3RyaW5nX21ldGhvZCkK ICAgICAgICAgICAgKHZvaWQpIFN0cmluZ0J1ZmZlcigpOwogICAgICAgIHJldHVybiBTdHJpbmdC dWZmZXJfSW5pdFdpdGhTdHJpbmdfbWV0aG9kOwogICAgfQoKCiAgICBNZXRob2RTeW1ib2wgKlN0 cmluZ0J1ZmZlcl90b1N0cmluZ01ldGhvZCgpCiAgICB7CiAgICAgICAgaWYgKCEgU3RyaW5nQnVm ZmVyX0luaXRXaXRoU3RyaW5nX21ldGhvZCkKICAgICAgICAgICAgKHZvaWQpIFN0cmluZ0J1ZmZl cigpOwogICAgICAgIHJldHVybiBTdHJpbmdCdWZmZXJfdG9TdHJpbmdfbWV0aG9kOwogICAgfQoK CiAgICBNZXRob2RTeW1ib2wgKlN0cmluZ0J1ZmZlcl9hcHBlbmRfY2hhcl9hcnJheU1ldGhvZCgp CiAgICB7CiAgICAgICAgaWYgKCEgU3RyaW5nQnVmZmVyX0luaXRXaXRoU3RyaW5nX21ldGhvZCkK ICAgICAgICAgICAgKHZvaWQpIFN0cmluZ0J1ZmZlcigpOwogICAgICAgIHJldHVybiBTdHJpbmdC dWZmZXJfYXBwZW5kX2NoYXJfYXJyYXlfbWV0aG9kOwogICAgfQoKCiAgICBNZXRob2RTeW1ib2wg KlN0cmluZ0J1ZmZlcl9hcHBlbmRfY2hhck1ldGhvZCgpCiAgICB7CiAgICAgICAgaWYgKCEgU3Ry aW5nQnVmZmVyX0luaXRXaXRoU3RyaW5nX21ldGhvZCkKICAgICAgICAgICAgKHZvaWQpIFN0cmlu Z0J1ZmZlcigpOwogICAgICAgIHJldHVybiBTdHJpbmdCdWZmZXJfYXBwZW5kX2NoYXJfbWV0aG9k OwogICAgfQoKCiAgICBNZXRob2RTeW1ib2wgKlN0cmluZ0J1ZmZlcl9hcHBlbmRfYm9vbGVhbk1l dGhvZCgpCiAgICB7CiAgICAgICAgaWYgKCEgU3RyaW5nQnVmZmVyX0luaXRXaXRoU3RyaW5nX21l dGhvZCkKICAgICAgICAgICAgKHZvaWQpIFN0cmluZ0J1ZmZlcigpOwogICAgICAgIHJldHVybiBT dHJpbmdCdWZmZXJfYXBwZW5kX2Jvb2xlYW5fbWV0aG9kOwogICAgfQoKCiAgICBNZXRob2RTeW1i b2wgKlN0cmluZ0J1ZmZlcl9hcHBlbmRfaW50TWV0aG9kKCkKICAgIHsKICAgICAgICBpZiAoISBT dHJpbmdCdWZmZXJfSW5pdFdpdGhTdHJpbmdfbWV0aG9kKQogICAgICAgICAgICAodm9pZCkgU3Ry aW5nQnVmZmVyKCk7CiAgICAgICAgcmV0dXJuIFN0cmluZ0J1ZmZlcl9hcHBlbmRfaW50X21ldGhv ZDsKICAgIH0KCgogICAgTWV0aG9kU3ltYm9sICpTdHJpbmdCdWZmZXJfYXBwZW5kX2xvbmdNZXRo b2QoKQogICAgewogICAgICAgIGlmICghIFN0cmluZ0J1ZmZlcl9Jbml0V2l0aFN0cmluZ19tZXRo b2QpCiAgICAgICAgICAgICh2b2lkKSBTdHJpbmdCdWZmZXIoKTsKICAgICAgICByZXR1cm4gU3Ry aW5nQnVmZmVyX2FwcGVuZF9sb25nX21ldGhvZDsKICAgIH0KCgogICAgTWV0aG9kU3ltYm9sICpT dHJpbmdCdWZmZXJfYXBwZW5kX2Zsb2F0TWV0aG9kKCkKICAgIHsKICAgICAgICBpZiAoISBTdHJp bmdCdWZmZXJfSW5pdFdpdGhTdHJpbmdfbWV0aG9kKQogICAgICAgICAgICAodm9pZCkgU3RyaW5n QnVmZmVyKCk7CiAgICAgICAgcmV0dXJuIFN0cmluZ0J1ZmZlcl9hcHBlbmRfZmxvYXRfbWV0aG9k OwogICAgfQoKCiAgICBNZXRob2RTeW1ib2wgKlN0cmluZ0J1ZmZlcl9hcHBlbmRfZG91YmxlTWV0 aG9kKCkKICAgIHsKICAgICAgICBpZiAoISBTdHJpbmdCdWZmZXJfSW5pdFdpdGhTdHJpbmdfbWV0 aG9kKQogICAgICAgICAgICAodm9pZCkgU3RyaW5nQnVmZmVyKCk7CiAgICAgICAgcmV0dXJuIFN0 cmluZ0J1ZmZlcl9hcHBlbmRfZG91YmxlX21ldGhvZDsKICAgIH0KCgogICAgTWV0aG9kU3ltYm9s ICpTdHJpbmdCdWZmZXJfYXBwZW5kX3N0cmluZ01ldGhvZCgpCiAgICB7CiAgICAgICAgaWYgKCEg U3RyaW5nQnVmZmVyX0luaXRXaXRoU3RyaW5nX21ldGhvZCkKICAgICAgICAgICAgKHZvaWQpIFN0 cmluZ0J1ZmZlcigpOwogICAgICAgIHJldHVybiBTdHJpbmdCdWZmZXJfYXBwZW5kX3N0cmluZ19t ZXRob2Q7CiAgICB9CgoKICAgIE1ldGhvZFN5bWJvbCAqU3RyaW5nQnVmZmVyX2FwcGVuZF9vYmpl Y3RNZXRob2QoKQogICAgewogICAgICAgIGlmICghIFN0cmluZ0J1ZmZlcl9Jbml0V2l0aFN0cmlu Z19tZXRob2QpCiAgICAgICAgICAgICh2b2lkKSBTdHJpbmdCdWZmZXIoKTsKICAgICAgICByZXR1 cm4gU3RyaW5nQnVmZmVyX2FwcGVuZF9vYmplY3RfbWV0aG9kOwogICAgfQoKICAgIEludExpdGVy YWxUYWJsZSAgICBpbnRfcG9vbDsKICAgIExvbmdMaXRlcmFsVGFibGUgICBsb25nX3Bvb2w7CiAg ICBGbG9hdExpdGVyYWxUYWJsZSAgZmxvYXRfcG9vbDsKICAgIERvdWJsZUxpdGVyYWxUYWJsZSBk b3VibGVfcG9vbDsKICAgIFV0ZjhMaXRlcmFsVGFibGUgICBVdGY4X3Bvb2w7CgogICAgVXRmOExp dGVyYWxWYWx1ZSAqQ29uc3RhbnRWYWx1ZV9saXRlcmFsLAogICAgICAgICAgICAgICAgICAgICAq RXhjZXB0aW9uc19saXRlcmFsLAogICAgICAgICAgICAgICAgICAgICAqSW5uZXJDbGFzc2VzX2xp dGVyYWwsCiAgICAgICAgICAgICAgICAgICAgICpTeW50aGV0aWNfbGl0ZXJhbCwKICAgICAgICAg ICAgICAgICAgICAgKkRlcHJlY2F0ZWRfbGl0ZXJhbCwKICAgICAgICAgICAgICAgICAgICAgKkxp bmVOdW1iZXJUYWJsZV9saXRlcmFsLAogICAgICAgICAgICAgICAgICAgICAqTG9jYWxWYXJpYWJs ZVRhYmxlX2xpdGVyYWwsCiAgICAgICAgICAgICAgICAgICAgICpDb2RlX2xpdGVyYWwsCiAgICAg ICAgICAgICAgICAgICAgICpTb3VyY2VmaWxlX2xpdGVyYWwsCgogICAgICAgICAgICAgICAgICAg ICAqbnVsbF9saXRlcmFsLAogICAgICAgICAgICAgICAgICAgICAqdGhpc19saXRlcmFsOwoKICAg IENvbnRyb2woY2hhciAqKiwgT3B0aW9uICYpOwogICAgfkNvbnRyb2woKTsKCiAgICBVdGY4TGl0 ZXJhbFZhbHVlICpDb252ZXJ0VW5pY29kZVRvVXRmOCh3Y2hhcl90ICpzb3VyY2UpCiAgICB7CiAg ICAgICAgY2hhciAqdGFyZ2V0ID0gbmV3IGNoYXJbd2NzbGVuKHNvdXJjZSkgKiAzICsgMV07ICAK ICAgICAgICBpbnQgbGVuZ3RoID0gQ29udmVydFVuaWNvZGVUb1V0Zjgoc291cmNlLCB0YXJnZXQp OwogICAgICAgIFV0ZjhMaXRlcmFsVmFsdWUgKmxpdGVyYWwgPSBVdGY4X3Bvb2wuRmluZE9ySW5z ZXJ0KHRhcmdldCwgbGVuZ3RoKTsKICAgICAgICBkZWxldGUgW10gdGFyZ2V0OwoKICAgICAgICBy ZXR1cm4gbGl0ZXJhbDsKICAgIH0KCiAgICBzdGF0aWMgaW50IENvbnZlcnRVdGY4VG9Vbmljb2Rl KHdjaGFyX3QgKiwgY29uc3QgY2hhciAqLCBpbnQpOwoKICAgIE5hbWVTeW1ib2wgKkNvbnZlcnRV dGY4VG9Vbmljb2RlKGNvbnN0IGNoYXIgKnNvdXJjZSwgaW50IGxlbmd0aCkKICAgIHsKICAgICAg ICB3Y2hhcl90ICpuYW1lID0gbmV3IHdjaGFyX3RbbGVuZ3RoICsgMV07CiAgICAgICAgaW50IG5h bWVfbGVuZ3RoID0gQ29udmVydFV0ZjhUb1VuaWNvZGUobmFtZSwgc291cmNlLCBsZW5ndGgpOwog ICAgICAgIE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sID0gRmluZE9ySW5zZXJ0TmFtZShuYW1lLCBu YW1lX2xlbmd0aCk7CiAgICAgICAgZGVsZXRlIFtdIG5hbWU7CgogICAgICAgIHJldHVybiBuYW1l X3N5bWJvbDsKICAgIH0KCiAgICB2b2lkIEZpbmRQYXRoc1RvRGlyZWN0b3J5KFBhY2thZ2VTeW1i b2wgKik7CgogICAgRGlyZWN0b3J5RW50cnkgKkZpbmRJbnB1dEZpbGUoRmlsZVN5bWJvbCAqKTsK ICAgIHZvaWQgRmluZE1vcmVSZWNlbnRJbnB1dEZpbGVzKFN5bWJvbFNldCAmKTsKICAgIHZvaWQg UmVtb3ZlVHJhc2hlZFR5cGVzKFN5bWJvbFNldCAmKTsKICAgIHZvaWQgUmVyZWFkRGlyZWN0b3J5 KERpcmVjdG9yeVN5bWJvbCAqKTsKICAgIHZvaWQgUmVyZWFkRGlyZWN0b3JpZXMoKTsKICAgIHZv aWQgQ29tcHV0ZVJlY29tcGlsYXRpb25TZXQoVHlwZURlcGVuZGVuY2VDaGVja2VyICYpOwogICAg Ym9vbCBJbmNyZW1lbnRhbFJlY29tcGlsYXRpb24oKTsKCiAgICAgCiAgICAgCiAgICAgCiAgICBM aXRlcmFsVmFsdWUgKkJhZFZhbHVlKCkgeyByZXR1cm4gJmJhZF92YWx1ZTsgfQoKICAgICAKICAg ICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIE5hbWVTeW1ib2wgKkZpbmRPckluc2VydE5h bWUod2NoYXJfdCAqbmFtZSwgaW50IGxlbikKICAgIHsKICAgICAgICBOYW1lU3ltYm9sICpuYW1l X3N5bWJvbCA9IG5hbWVfdGFibGUuRmluZE9ySW5zZXJ0TmFtZShuYW1lLCBsZW4pOwogICAgICAg IGlmICghIG5hbWVfc3ltYm9sIC0+IFV0ZjhfbGl0ZXJhbCkKICAgICAgICAgICAgbmFtZV9zeW1i b2wgLT4gVXRmOF9saXRlcmFsID0gQ29udmVydFVuaWNvZGVUb1V0ZjgobmFtZV9zeW1ib2wgLT4g TmFtZSgpKTsKCiAgICAgICAgcmV0dXJuIG5hbWVfc3ltYm9sOwogICAgfQoKICAgICAKICAgICAK ICAgICAKICAgIE5hbWVTeW1ib2wgKk1ha2VQYXJhbWV0ZXIoaW50IG51bSkKICAgIHsKICAgICAg ICBJbnRUb1dzdHJpbmcgdmFsdWUobnVtKTsKCiAgICAgICAgd2NoYXJfdCBzdHJbMTNdOwogICAg ICAgIHN0clswXSA9IFVfRE9MTEFSOyAgCiAgICAgICAgd2NzY3B5KCZzdHJbMV0sIHZhbHVlLlN0 cmluZygpKTsKCiAgICAgICAgcmV0dXJuIEZpbmRPckluc2VydE5hbWUoc3RyLCB2YWx1ZS5MZW5n dGgoKSArIDEpOwogICAgfQoKICAgICAKICAgICAKICAgICAKICAgIHN0YXRpYyBEaXJlY3RvcnlT eW1ib2wgKkdldE91dHB1dERpcmVjdG9yeShGaWxlU3ltYm9sICopOwogICAgc3RhdGljIEZpbGVT eW1ib2wgKkdldEphdmFGaWxlKFBhY2thZ2VTeW1ib2wgKiwgTmFtZVN5bWJvbCAqKTsKICAgIHN0 YXRpYyBGaWxlU3ltYm9sICpHZXRGaWxlKENvbnRyb2wgJiwgUGFja2FnZVN5bWJvbCAqLCBOYW1l U3ltYm9sICopOwogICAgc3RhdGljIEZpbGVTeW1ib2wgKkdldEZpbGVGaXJzdChDb250cm9sICYs IFBhY2thZ2VTeW1ib2wgKiwgTmFtZVN5bWJvbCAqKTsKICAgIHN0YXRpYyBGaWxlU3ltYm9sICpH ZXRGaWxlQm90aChDb250cm9sICYsIFBhY2thZ2VTeW1ib2wgKiwgTmFtZVN5bWJvbCAqKTsKCiAg ICBQYWNrYWdlU3ltYm9sICpGaW5kT3JJbnNlcnRQYWNrYWdlKExleFN0cmVhbSAqLCBBc3RFeHBy ZXNzaW9uICopOwogICAgdm9pZCBQcm9jZXNzUGFja2FnZURlY2xhcmF0aW9uKEZpbGVTeW1ib2wg KiwgQXN0UGFja2FnZURlY2xhcmF0aW9uICopOwogICAgdm9pZCBDbGVhblVwKEZpbGVTeW1ib2wg Kik7CgogICAgaW5saW5lIGJvb2wgSXNTaW1wbGVJbnRlZ2VyVmFsdWVUeXBlKFR5cGVTeW1ib2wg KnR5cGUpCiAgICB7CiAgICAgICAgcmV0dXJuICh0eXBlID09IGJ5dGVfdHlwZSB8fCB0eXBlID09 IHNob3J0X3R5cGUgfHwgdHlwZSA9PSBpbnRfdHlwZSB8fCB0eXBlID09IGNoYXJfdHlwZSk7CiAg ICB9CgogICAgaW5saW5lIGJvb2wgSXNJbnRlZ3JhbChUeXBlU3ltYm9sICp0eXBlKQogICAgewog ICAgICAgIHJldHVybiAoSXNTaW1wbGVJbnRlZ2VyVmFsdWVUeXBlKHR5cGUpIHx8IHR5cGUgPT0g bG9uZ190eXBlKTsKICAgIH0KCiAgICBpbmxpbmUgYm9vbCBJc0Zsb2F0aW5nUG9pbnQoVHlwZVN5 bWJvbCAqdHlwZSkKICAgIHsKICAgICAgICByZXR1cm4gKHR5cGUgPT0gZmxvYXRfdHlwZSB8fCB0 eXBlID09IGRvdWJsZV90eXBlKTsKICAgIH0KCiAgICBpbmxpbmUgYm9vbCBJc051bWVyaWMoVHlw ZVN5bWJvbCAqdHlwZSkKICAgIHsKICAgICAgICByZXR1cm4gSXNJbnRlZ3JhbCh0eXBlKSB8fCBJ c0Zsb2F0aW5nUG9pbnQodHlwZSk7CiAgICB9CgogICAgaW5saW5lIGJvb2wgSXNEb3VibGVXb3Jk VHlwZShUeXBlU3ltYm9sICp0eXBlKQogICAgewogICAgICAgIHJldHVybiAodHlwZSA9PSBsb25n X3R5cGUgfHwgdHlwZSA9PSBkb3VibGVfdHlwZSk7CiAgICB9CgogICAgaW5saW5lIGJvb2wgSXNQ cmltaXRpdmUoVHlwZVN5bWJvbCAqdHlwZSkKICAgIHsKICAgICAgICByZXR1cm4gKElzTnVtZXJp Yyh0eXBlKSB8fCB0eXBlID09IGJvb2xlYW5fdHlwZSk7CiAgICB9CgogICAgaW5saW5lIHZvaWQg UHJvY2Vzc0JhZFR5cGUoVHlwZVN5bWJvbCAqdHlwZV9zeW1ib2wpCiAgICB7CiAgICAgICAgdHlw ZV90cmFzaF9iaW4uTmV4dCgpID0gdHlwZV9zeW1ib2w7CiAgICB9CgogICAgdm9pZCBQcm9jZXNz SGVhZGVycyhGaWxlU3ltYm9sICopOwoKCgoKCgoKCiAgICBQYWNrYWdlU3ltYm9sICpQcm9jZXNz UGFja2FnZSh3Y2hhcl90ICopOwoKICAgIERpcmVjdG9yeVN5bWJvbCAqRmluZFN1YmRpcmVjdG9y eShQYXRoU3ltYm9sICosIHdjaGFyX3QgKiwgaW50KTsKICAgIERpcmVjdG9yeVN5bWJvbCAqUHJv Y2Vzc1N1YmRpcmVjdG9yaWVzKHdjaGFyX3QgKiwgaW50LCBib29sKTsKCnByaXZhdGU6CgogICAg TGl0ZXJhbFZhbHVlIGJhZF92YWx1ZTsKCiAgICBUeXBlU3ltYm9sICpTZXJpYWxpemFibGVfdHlw ZSwKCiAgICAgICAgICAgICAgICpPYmplY3RfdHlwZSwKICAgICAgICAgICAgICAgKkNsb25lYWJs ZV90eXBlLAogICAgICAgICAgICAgICAqU3RyaW5nX3R5cGUsCiAgICAgICAgICAgICAgICpWb2lk X3R5cGUsCiAgICAgICAgICAgICAgICpCb29sZWFuX3R5cGUsCiAgICAgICAgICAgICAgICpCeXRl X3R5cGUsCiAgICAgICAgICAgICAgICpTaG9ydF90eXBlLAogICAgICAgICAgICAgICAqQ2hhcmFj dGVyX3R5cGUsCiAgICAgICAgICAgICAgICpJbnRlZ2VyX3R5cGUsCiAgICAgICAgICAgICAgICpM b25nX3R5cGUsCiAgICAgICAgICAgICAgICpGbG9hdF90eXBlLAogICAgICAgICAgICAgICAqRG91 YmxlX3R5cGUsCiAgICAgICAgICAgICAgICpDbGFzc190eXBlLAogICAgICAgICAgICAgICAqVGhy b3dhYmxlX3R5cGUsCiAgICAgICAgICAgICAgICpFeGNlcHRpb25fdHlwZSwKICAgICAgICAgICAg ICAgKlJ1bnRpbWVFeGNlcHRpb25fdHlwZSwKICAgICAgICAgICAgICAgKkNsYXNzTm90Rm91bmRF eGNlcHRpb25fdHlwZSwKICAgICAgICAgICAgICAgKkVycm9yX3R5cGUsCiAgICAgICAgICAgICAg ICpOb0NsYXNzRGVmRm91bmRFcnJvcl90eXBlLAogICAgICAgICAgICAgICAqU3RyaW5nQnVmZmVy X3R5cGU7CgogICAgTWV0aG9kU3ltYm9sICpDbGFzc19mb3JOYW1lX21ldGhvZCwKCiAgICAgICAg ICAgICAgICAgKlRocm93YWJsZV9nZXRNZXNzYWdlX21ldGhvZCwKCiAgICAgICAgICAgICAgICAg Kk5vQ2xhc3NEZWZGb3VuZEVycm9yX0luaXRXaXRoU3RyaW5nX21ldGhvZCwKCiAgICAgICAgICAg ICAgICAgKlN0cmluZ0J1ZmZlcl9Jbml0X21ldGhvZCwKICAgICAgICAgICAgICAgICAqU3RyaW5n QnVmZmVyX0luaXRXaXRoU3RyaW5nX21ldGhvZCwKICAgICAgICAgICAgICAgICAqU3RyaW5nQnVm ZmVyX3RvU3RyaW5nX21ldGhvZCwKICAgICAgICAgICAgICAgICAqU3RyaW5nQnVmZmVyX2FwcGVu ZF9jaGFyX2FycmF5X21ldGhvZCwKICAgICAgICAgICAgICAgICAqU3RyaW5nQnVmZmVyX2FwcGVu ZF9jaGFyX21ldGhvZCwKICAgICAgICAgICAgICAgICAqU3RyaW5nQnVmZmVyX2FwcGVuZF9ib29s ZWFuX21ldGhvZCwKICAgICAgICAgICAgICAgICAqU3RyaW5nQnVmZmVyX2FwcGVuZF9pbnRfbWV0 aG9kLAogICAgICAgICAgICAgICAgICpTdHJpbmdCdWZmZXJfYXBwZW5kX2xvbmdfbWV0aG9kLAog ICAgICAgICAgICAgICAgICpTdHJpbmdCdWZmZXJfYXBwZW5kX2Zsb2F0X21ldGhvZCwKICAgICAg ICAgICAgICAgICAqU3RyaW5nQnVmZmVyX2FwcGVuZF9kb3VibGVfbWV0aG9kLAogICAgICAgICAg ICAgICAgICpTdHJpbmdCdWZmZXJfYXBwZW5kX3N0cmluZ19tZXRob2QsCiAgICAgICAgICAgICAg ICAgKlN0cmluZ0J1ZmZlcl9hcHBlbmRfb2JqZWN0X21ldGhvZDsKCiAgICBzdGF0aWMgaW50IENv bnZlcnRVbmljb2RlVG9VdGY4KHdjaGFyX3QgKiwgY2hhciAqKTsKCiAgICB2b2lkIFByb2Nlc3NH bG9iYWxzKCk7CiAgICB2b2lkIFByb2Nlc3NVbm5hbWVkUGFja2FnZSgpOwogICAgdm9pZCBQcm9j ZXNzUGF0aCgpOwogICAgdm9pZCBQcm9jZXNzQm9vdENsYXNzUGF0aCgpOwogICAgdm9pZCBQcm9j ZXNzRXh0RGlycygpOwogICAgdm9pZCBQcm9jZXNzQ2xhc3NQYXRoKCk7CiAgICB2b2lkIFByb2Nl c3NTb3VyY2VQYXRoKCk7CiAgICBUeXBlU3ltYm9sICpHZXRQcmltaXRpdmVUeXBlKHdjaGFyX3Qg KiwgY2hhciAqKTsKICAgIHZvaWQgUHJvY2Vzc1N5c3RlbUluZm9ybWF0aW9uKCk7CgogICAgdm9p ZCBQcm9jZXNzRmlsZShGaWxlU3ltYm9sICopOwogICAgdm9pZCBQcm9jZXNzTWVtYmVycygpOwog ICAgdm9pZCBQcm9jZXNzQm9kaWVzKFR5cGVTeW1ib2wgKik7CgogICAgdm9pZCBQcm9jZXNzTmV3 SW5wdXRGaWxlcyhTeW1ib2xTZXQgJiwgY2hhciAqKiwgaW50ID0gMCk7CgogICAgRmlsZVN5bWJv bCAqRmluZE9ySW5zZXJ0SmF2YUlucHV0RmlsZShEaXJlY3RvcnlTeW1ib2wgKiwgTmFtZVN5bWJv bCAqKTsKICAgIEZpbGVTeW1ib2wgKkZpbmRPckluc2VydEphdmFJbnB1dEZpbGUod2NoYXJfdCAq LCBpbnQpOwp9OwoKCgoKCgoKIyAxOCAiLi4vLi4vamlrZXMvc3JjL3NlbWFudGljLmgiIDIKCgoK CiAKCgoKCgoKCgoKCgpjbGFzcyBjcF9pbmZvOwpjbGFzcyBUeXBlU2hhZG93U3ltYm9sOwoKIAog CiAKY2xhc3MgU3ltYm9sVGFibGVTdGFjawp7CnB1YmxpYzoKICAgIHZvaWQgUHVzaChTeW1ib2xU YWJsZSAqc3ltdGFiKSB7IHRhYmxlLk5leHQoKSA9IHN5bXRhYjsgfQogICAgdm9pZCBQb3AoKSAg ICAgICAgICAgICAgICAgICAgIHsgaWYgKHRhYmxlLkxlbmd0aCgpID4gMCkgdGFibGUuUmVzZXQo dGFibGUuTGVuZ3RoKCkgLSAxKTsgfQogICAgaW50IFNpemUoKSAgICAgICAgICAgICAgICAgICAg IHsgcmV0dXJuIHRhYmxlLkxlbmd0aCgpOyB9CiAgICBTeW1ib2xUYWJsZSAqVG9wKCkgICAgICAg ICAgICAgeyByZXR1cm4gKFN5bWJvbFRhYmxlICopICh0YWJsZS5MZW5ndGgoKSA+IDAgPyB0YWJs ZVt0YWJsZS5MZW5ndGgoKSAtIDFdIDogX19udWxsICk7IH0KCiAgICBTeW1ib2xUYWJsZSAqb3Bl cmF0b3JbXShjb25zdCBpbnQgaSkgeyByZXR1cm4gdGFibGVbaV07IH0gIAoKICAgICAKICAgICAK ICAgICAKICAgICAKICAgIFZhcmlhYmxlU3ltYm9sICpGaW5kVmFyaWFibGVTeW1ib2woTmFtZVN5 bWJvbCAqbmFtZV9zeW1ib2wpCiAgICB7CiAgICAgICAgZm9yIChpbnQgaSA9IHRhYmxlLkxlbmd0 aCgpIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgewogICAgICAgICAgICBWYXJpYWJsZVN5bWJv bCAqc3ltYm9sID0gdGFibGVbaV0gLT4gRmluZFZhcmlhYmxlU3ltYm9sKG5hbWVfc3ltYm9sKTsK ICAgICAgICAgICAgaWYgKHN5bWJvbCkKICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2w7CiAg ICAgICAgfQogICAgICAgIHJldHVybiAoVmFyaWFibGVTeW1ib2wgKikgX19udWxsIDsKICAgIH0K CiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBUeXBlU3ltYm9sKiBGaW5kVHlwZVN5bWJvbChO YW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKICAgIHsKICAgICAgICBmb3IgKGludCBpID0gdGFibGUu TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkKICAgICAgICB7CiAgICAgICAgICAgIFR5cGVTeW1i b2wgKnN5bWJvbCA9IHRhYmxlW2ldIC0+IEZpbmRUeXBlU3ltYm9sKG5hbWVfc3ltYm9sKTsKICAg ICAgICAgICAgaWYgKHN5bWJvbCkKICAgICAgICAgICAgICAgIHJldHVybiBzeW1ib2w7CiAgICAg ICAgfQogICAgICAgIHJldHVybiAoVHlwZVN5bWJvbCAqKSBfX251bGwgOwogICAgfQoKICAgICAK ICAgICAKICAgICAKICAgICAKICAgIExhYmVsU3ltYm9sKiBGaW5kTGFiZWxTeW1ib2woTmFtZVN5 bWJvbCAqbmFtZV9zeW1ib2wpCiAgICB7CiAgICAgICAgZm9yIChpbnQgaSA9IHRhYmxlLkxlbmd0 aCgpIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgewogICAgICAgICAgICBMYWJlbFN5bWJvbCAq bGFiZWwgPSB0YWJsZVtpXSAtPiBGaW5kTGFiZWxTeW1ib2wobmFtZV9zeW1ib2wpOwogICAgICAg ICAgICBpZiAobGFiZWwpCiAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWw7CiAgICAgICAgfQog ICAgICAgIHJldHVybiAoTGFiZWxTeW1ib2wgKikgX19udWxsIDsKICAgIH0KCnByaXZhdGU6CiAg ICBUdXBsZTxTeW1ib2xUYWJsZSAqPiB0YWJsZTsKfTsKCgogCiAKIApjbGFzcyBFeGNlcHRpb25U YWJsZVN0YWNrCnsKcHVibGljOgogICAgdm9pZCBQdXNoKFN5bWJvbFNldCAqc2V0KSB7IHRhYmxl Lk5leHQoKSA9IHNldDsgfQogICAgdm9pZCAgICAgICBQb3AoKSAgICAgICAgICB7IGlmICh0YWJs ZS5MZW5ndGgoKSA+IDApIHRhYmxlLlJlc2V0KHRhYmxlLkxlbmd0aCgpIC0gMSk7IH0KICAgIGlu dCAgICAgICAgU2l6ZSgpICAgICAgICAgeyByZXR1cm4gdGFibGUuTGVuZ3RoKCk7IH0KICAgIFN5 bWJvbFNldCAqVG9wKCkgICAgICAgICAgeyByZXR1cm4gKFN5bWJvbFNldCAqKSAodGFibGUuTGVu Z3RoKCkgPiAwID8gdGFibGVbdGFibGUuTGVuZ3RoKCkgLSAxXSA6IF9fbnVsbCApOyB9Cgpwcml2 YXRlOgogICAgVHVwbGU8U3ltYm9sU2V0ICo+IHRhYmxlOwp9OwoKCiAKIAogCmNsYXNzIFN0YXRl bWVudFN0YWNrCnsKcHVibGljOgogICAgdm9pZCBQdXNoKEFzdCAqc3RtdCkgeyBpbmZvLk5leHQo KSA9IHN0bXQ7IH0KICAgIHZvaWQgUG9wKCkgICAgICAgICAgIHsgaWYgKGluZm8uTGVuZ3RoKCkg PiAwKSBpbmZvLlJlc2V0KGluZm8uTGVuZ3RoKCkgLSAxKTsgfQogICAgaW50IFNpemUoKSAgICAg ICAgICAgeyByZXR1cm4gaW5mby5MZW5ndGgoKTsgfQogICAgQXN0ICpUb3AoKSAgICAgICAgICAg eyByZXR1cm4gKEFzdCAqKSAoaW5mby5MZW5ndGgoKSA+IDAgPyBpbmZvW2luZm8uTGVuZ3RoKCkg LSAxXSA6IF9fbnVsbCApOyB9CgogICAgQXN0ICpvcGVyYXRvcltdKGNvbnN0IGludCBpKSB7IHJl dHVybiBpbmZvW2ldOyB9Cgpwcml2YXRlOgogICAgVHVwbGU8QXN0ICo+IGluZm87Cn07CgoKIAog CiAKY2xhc3MgQmxvY2tTdGFjawp7CnB1YmxpYzoKICAgIGludCBtYXhfc2l6ZTsKCiAgICB2b2lk IFB1c2goQXN0QmxvY2sgKmJsb2NrXykKICAgIHsKICAgICAgICBibG9jay5OZXh0KCkgPSBibG9j a187CiAgICAgICAgaW5kZXguTmV4dCgpID0gMDsKICAgICAgICBpZiAoYmxvY2suTGVuZ3RoKCkg PiBtYXhfc2l6ZSkKICAgICAgICAgICAgbWF4X3NpemUgPSBibG9jay5MZW5ndGgoKTsKICAgIH0K CiAgICB2b2lkIFBvcCgpCiAgICB7CiAgICAgICAgaW50IGxlbiA9IGJsb2NrLkxlbmd0aCgpIC0g MTsKICAgICAgICBpZiAobGVuID49IDApCiAgICAgICAgewogICAgICAgICAgICBibG9jay5SZXNl dChsZW4pOwogICAgICAgICAgICBpbmRleC5SZXNldChsZW4pOwogICAgICAgIH0KICAgIH0KCiAg ICBpbnQgU2l6ZSgpIHsgcmV0dXJuIGJsb2NrLkxlbmd0aCgpOyB9CiAgICBBc3RCbG9jayAqVG9w QmxvY2soKSB7IHJldHVybiAoQXN0QmxvY2sgKikgKGJsb2NrLkxlbmd0aCgpID4gMCA/IGJsb2Nr W2Jsb2NrLkxlbmd0aCgpIC0gMV0gOiBfX251bGwgKTsgfQoKICAgIEFzdEJsb2NrICpvcGVyYXRv cltdKGNvbnN0IGludCBpKSB7IHJldHVybiBibG9ja1tpXTsgfQoKICAgIGludCAmVG9wTWF4RW5j bG9zZWRWYXJpYWJsZUluZGV4KCkKICAgIHsKICAgICAgICBpZiAoaW5kZXguTGVuZ3RoKCkgPD0g MCkKICAgICAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBmYWxzZSApID8gMCA6CShfX2Fz c2VydF9mYWlsICgiZmFsc2UiICwgIi4uLy4uL2ppa2VzL3NyYy9zZW1hbnRpYy5oIiwgMTY4LCBf X1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwogICAgICAgIHJldHVybiBpbmRleFtpbmRleC5M ZW5ndGgoKSAtIDFdOwogICAgfQoKICAgIEJsb2NrU3RhY2soKSA6IG1heF9zaXplKDApIHt9Cgpw cml2YXRlOgogICAgVHVwbGU8QXN0QmxvY2sgKj4gYmxvY2s7CiAgICBUdXBsZTxpbnQ+IGluZGV4 Owp9OwoKCiAKIAogCmNsYXNzIERlZmluaXRlRmluYWxBc3NpZ25tZW50U3RhY2sKewpwdWJsaWM6 CiAgICB2b2lkIFB1c2goKSB7IGluZm8uTmV4dCgpLlJlc2V0KCk7IH0KICAgIHZvaWQgUG9wKCkg IHsgaWYgKGluZm8uTGVuZ3RoKCkgPiAwKSBpbmZvLlJlc2V0KGluZm8uTGVuZ3RoKCkgLSAxKTsg fQogICAgaW50IFNpemUoKSAgeyByZXR1cm4gaW5mby5MZW5ndGgoKTsgfQogICAgVHVwbGUgPEFz dEV4cHJlc3Npb24gKj4gJlRvcCgpICB7IGlmIChpbmZvLkxlbmd0aCgpID09IDApIChzdGF0aWNf Y2FzdDx2b2lkPiAgKCggZmFsc2UgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImZhbHNlIiAsICIu Li8uLi9qaWtlcy9zcmMvc2VtYW50aWMuaCIsIDE4OSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAw KSkpIDsgcmV0dXJuIGluZm9baW5mby5MZW5ndGgoKSAtIDFdOyB9Cgpwcml2YXRlOgogICAgVHVw bGU8IFR1cGxlPEFzdEV4cHJlc3Npb24gKj4gPiBpbmZvOwp9OwoKCiAKIAogCmNsYXNzIERlZmlu aXRlU2V0cwp7CnB1YmxpYzoKICAgIERlZmluaXRlU2V0cyhpbnQgc2V0X3NpemUpIDogYnJlYWtf c2V0KHNldF9zaXplKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVf c2V0KHNldF9zaXplKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3Nl dChzZXRfc2l6ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93X3NldChz ZXRfc2l6ZSkKICAgIHt9CgogICAgQml0U2V0IGJyZWFrX3NldCwKICAgICAgICAgICBjb250aW51 ZV9zZXQsCiAgICAgICAgICAgcmV0dXJuX3NldCwKICAgICAgICAgICB0aHJvd19zZXQ7CgogICAg dm9pZCBVbml2ZXJzZUluaXQoKQogICAgewogICAgICAgIGJyZWFrX3NldC5TZXRVbml2ZXJzZSgp OwogICAgICAgIGNvbnRpbnVlX3NldC5TZXRVbml2ZXJzZSgpOwogICAgICAgIHJldHVybl9zZXQu U2V0VW5pdmVyc2UoKTsKICAgICAgICB0aHJvd19zZXQuU2V0VW5pdmVyc2UoKTsKICAgIH0KCiAg ICB2b2lkIEVtcHR5SW5pdCgpCiAgICB7CiAgICAgICAgYnJlYWtfc2V0LlNldEVtcHR5KCk7CiAg ICAgICAgY29udGludWVfc2V0LlNldEVtcHR5KCk7CiAgICAgICAgcmV0dXJuX3NldC5TZXRFbXB0 eSgpOwogICAgICAgIHRocm93X3NldC5TZXRFbXB0eSgpOwogICAgfQp9OwoKCiAKIAogCmNsYXNz IERlZmluaXRlQmxvY2tTdGFjawp7CnB1YmxpYzoKCiAgICB2b2lkIFB1c2goQXN0QmxvY2sgKmJs b2NrXykKICAgIHsKICAgICAgICBkZWZpbml0ZV9zZXRzW3RvcF9pbmRleF0gLT4gVW5pdmVyc2VJ bml0KCk7CiAgICAgICAgZmluYWxfc2V0c1t0b3BfaW5kZXhdIC0+IEVtcHR5SW5pdCgpOwoKICAg ICAgICBpZiAobG9jYWxseV9kZWZpbmVkX3ZhcmlhYmxlcykKICAgICAgICB7CiAgICAgICAgICAg IGlmICh0b3BfaW5kZXggPT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWVtc2V0 KGxvY2FsX3ZhcmlhYmxlc1t0b3BfaW5kZXhdLCAwLCBsb2NhbGx5X2RlZmluZWRfdmFyaWFibGVz W3RvcF9pbmRleF0gLT4gU2l6ZSgpICogc2l6ZW9mKFZhcmlhYmxlU3ltYm9sICopKTsKICAgICAg ICAgICAgICAgIGxvY2FsbHlfZGVmaW5lZF92YXJpYWJsZXNbdG9wX2luZGV4XSAtPiBTZXRFbXB0 eSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAg ICAgICAgICAgbWVtbW92ZShsb2NhbF92YXJpYWJsZXNbdG9wX2luZGV4XSwKICAgICAgICAgICAg ICAgICAgICAgICAgbG9jYWxfdmFyaWFibGVzW3RvcF9pbmRleCAtIDFdLAogICAgICAgICAgICAg ICAgICAgICAgICBsb2NhbGx5X2RlZmluZWRfdmFyaWFibGVzW3RvcF9pbmRleF0gLT4gU2l6ZSgp ICogc2l6ZW9mKFZhcmlhYmxlU3ltYm9sICopKTsKICAgICAgICAgICAgICAgICpsb2NhbGx5X2Rl ZmluZWRfdmFyaWFibGVzW3RvcF9pbmRleF0gPSAqbG9jYWxseV9kZWZpbmVkX3ZhcmlhYmxlc1t0 b3BfaW5kZXggLSAxXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYmxvY2tbdG9w X2luZGV4XSA9IGJsb2NrXzsKICAgICAgICB0b3BfaW5kZXgrKzsKICAgIH0KCiAgICB2b2lkIFBv cCgpCiAgICB7CiAgICAgICAgaWYgKHRvcF9pbmRleCA+IDApCiAgICAgICAgICAgICB0b3BfaW5k ZXgtLTsKICAgICAgICBlbHNlIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggZmFsc2UgKSA/IDAgOgko X19hc3NlcnRfZmFpbCAoImZhbHNlIiAsICIuLi8uLi9qaWtlcy9zcmMvc2VtYW50aWMuaCIsIDI2 NywgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKICAgIH0KCiAgICBpbnQgU2l6ZSgpICAg ICAgICAgICAgICAgICB7IHJldHVybiB0b3BfaW5kZXg7IH0KICAgIEFzdEJsb2NrICpCbG9jayhp bnQgaSkgICAgIHsgcmV0dXJuIGJsb2NrW2ldOyB9CiAgICBBc3RCbG9jayAqVG9wQmxvY2soKSAg ICAgICB7IChzdGF0aWNfY2FzdDx2b2lkPiAgKCggdG9wX2luZGV4ID4gMCApID8gMCA6CShfX2Fz c2VydF9mYWlsICgidG9wX2luZGV4ID4gMCIgLCAiLi4vLi4vamlrZXMvc3JjL3NlbWFudGljLmgi LCAyNzIsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7IHJldHVybiBibG9ja1t0b3BfaW5k ZXggLSAxXTsgfQoKICAgIFZhcmlhYmxlU3ltYm9sICoqVG9wTG9jYWxWYXJpYWJsZXMoKSB7IChz dGF0aWNfY2FzdDx2b2lkPiAgKCggdG9wX2luZGV4ID4gMCAmJiBsb2NhbF92YXJpYWJsZXMgKSA/ IDAgOgkoX19hc3NlcnRfZmFpbCAoInRvcF9pbmRleCA+IDAgJiYgbG9jYWxfdmFyaWFibGVzIiAs ICIuLi8uLi9qaWtlcy9zcmMvc2VtYW50aWMuaCIsIDI3NCwgX19QUkVUVFlfRlVOQ1RJT05fXyAp LCAwKSkpIDsgcmV0dXJuIGxvY2FsX3ZhcmlhYmxlc1t0b3BfaW5kZXggLSAxXTsgfQogICAgQml0 U2V0ICpUb3BMb2NhbGx5RGVmaW5lZFZhcmlhYmxlcygpIHsgKHN0YXRpY19jYXN0PHZvaWQ+ICAo KCB0b3BfaW5kZXggPiAwICYmIGxvY2FsbHlfZGVmaW5lZF92YXJpYWJsZXMgKSA/IDAgOgkoX19h c3NlcnRfZmFpbCAoInRvcF9pbmRleCA+IDAgJiYgbG9jYWxseV9kZWZpbmVkX3ZhcmlhYmxlcyIg LCAiLi4vLi4vamlrZXMvc3JjL3NlbWFudGljLmgiLCAyNzUsIF9fUFJFVFRZX0ZVTkNUSU9OX18g KSwgMCkpKSA7IHJldHVybiBsb2NhbGx5X2RlZmluZWRfdmFyaWFibGVzW3RvcF9pbmRleCAtIDFd OyB9CgogICAgQml0U2V0ICZCcmVha1NldChpbnQgaSkgICAgeyByZXR1cm4gZGVmaW5pdGVfc2V0 c1tpXSAtPiBicmVha19zZXQ7IH0KICAgIEJpdFNldCAmQ29udGludWVTZXQoaW50IGkpIHsgcmV0 dXJuIGRlZmluaXRlX3NldHNbaV0gLT4gY29udGludWVfc2V0OyB9CiAgICBCaXRTZXQgJlJldHVy blNldChpbnQgaSkgICB7IHJldHVybiBkZWZpbml0ZV9zZXRzW2ldIC0+IHJldHVybl9zZXQ7IH0K ICAgIEJpdFNldCAmVGhyb3dTZXQoaW50IGkpICAgIHsgcmV0dXJuIGRlZmluaXRlX3NldHNbaV0g LT4gdGhyb3dfc2V0OyB9CgogICAgQml0U2V0ICZUb3BCcmVha1NldCgpICAgICAgeyAoc3RhdGlj X2Nhc3Q8dm9pZD4gICgoIHRvcF9pbmRleCA+IDAgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInRv cF9pbmRleCA+IDAiICwgIi4uLy4uL2ppa2VzL3NyYy9zZW1hbnRpYy5oIiwgMjgyLCBfX1BSRVRU WV9GVU5DVElPTl9fICksIDApKSkgOyByZXR1cm4gZGVmaW5pdGVfc2V0c1t0b3BfaW5kZXggLSAx XSAtPiBicmVha19zZXQ7IH0KICAgIEJpdFNldCAmVG9wQ29udGludWVTZXQoKSAgIHsgKHN0YXRp Y19jYXN0PHZvaWQ+ICAoKCB0b3BfaW5kZXggPiAwICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJ0 b3BfaW5kZXggPiAwIiAsICIuLi8uLi9qaWtlcy9zcmMvc2VtYW50aWMuaCIsIDI4MywgX19QUkVU VFlfRlVOQ1RJT05fXyApLCAwKSkpIDsgcmV0dXJuIGRlZmluaXRlX3NldHNbdG9wX2luZGV4IC0g MV0gLT4gY29udGludWVfc2V0OyB9CiAgICBCaXRTZXQgJlRvcFJldHVyblNldCgpICAgICB7IChz dGF0aWNfY2FzdDx2b2lkPiAgKCggdG9wX2luZGV4ID4gMCApID8gMCA6CShfX2Fzc2VydF9mYWls ICgidG9wX2luZGV4ID4gMCIgLCAiLi4vLi4vamlrZXMvc3JjL3NlbWFudGljLmgiLCAyODQsIF9f UFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7IHJldHVybiBkZWZpbml0ZV9zZXRzW3RvcF9pbmRl eCAtIDFdIC0+IHJldHVybl9zZXQ7IH0KICAgIEJpdFNldCAmVG9wVGhyb3dTZXQoKSAgICAgIHsg KHN0YXRpY19jYXN0PHZvaWQ+ICAoKCB0b3BfaW5kZXggPiAwICkgPyAwIDoJKF9fYXNzZXJ0X2Zh aWwgKCJ0b3BfaW5kZXggPiAwIiAsICIuLi8uLi9qaWtlcy9zcmMvc2VtYW50aWMuaCIsIDI4NSwg X19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsgcmV0dXJuIGRlZmluaXRlX3NldHNbdG9wX2lu ZGV4IC0gMV0gLT4gdGhyb3dfc2V0OyB9CgogICAgQml0U2V0ICZUb3BFeGl0U2V0KEJpdFNldCAm c3RhcnRfc2V0KQogICAgewogICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggdG9wX2luZGV4 ID4gMCApID8gMCA6CShfX2Fzc2VydF9mYWlsICgidG9wX2luZGV4ID4gMCIgLCAiLi4vLi4vamlr ZXMvc3JjL3NlbWFudGljLmgiLCAyODksIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7Cgog ICAgICAgIGV4aXRfc2V0ICA9IHN0YXJ0X3NldDsKICAgICAgICBleGl0X3NldCAqPSBUb3BCcmVh a1NldCgpOwogICAgICAgIGV4aXRfc2V0ICo9IFRvcENvbnRpbnVlU2V0KCk7CiAgICAgICAgZXhp dF9zZXQgKj0gVG9wUmV0dXJuU2V0KCk7CiAgICAgICAgZXhpdF9zZXQgKj0gVG9wVGhyb3dTZXQo KTsKCiAgICAgICAgcmV0dXJuIGV4aXRfc2V0OwogICAgfQoKICAgIEJpdFNldCAmRmluYWxCcmVh a1NldChpbnQgaSkgICAgeyByZXR1cm4gZmluYWxfc2V0c1tpXSAtPiBicmVha19zZXQ7IH0KICAg IEJpdFNldCAmRmluYWxDb250aW51ZVNldChpbnQgaSkgeyByZXR1cm4gZmluYWxfc2V0c1tpXSAt PiBjb250aW51ZV9zZXQ7IH0KICAgIEJpdFNldCAmRmluYWxSZXR1cm5TZXQoaW50IGkpICAgeyBy ZXR1cm4gZmluYWxfc2V0c1tpXSAtPiByZXR1cm5fc2V0OyB9CiAgICBCaXRTZXQgJkZpbmFsVGhy b3dTZXQoaW50IGkpICAgIHsgcmV0dXJuIGZpbmFsX3NldHNbaV0gLT4gdGhyb3dfc2V0OyB9Cgog ICAgQml0U2V0ICZUb3BGaW5hbEJyZWFrU2V0KCkgICAgICB7IChzdGF0aWNfY2FzdDx2b2lkPiAg KCggdG9wX2luZGV4ID4gMCApID8gMCA6CShfX2Fzc2VydF9mYWlsICgidG9wX2luZGV4ID4gMCIg LCAiLi4vLi4vamlrZXMvc3JjL3NlbWFudGljLmgiLCAzMDUsIF9fUFJFVFRZX0ZVTkNUSU9OX18g KSwgMCkpKSA7IHJldHVybiBmaW5hbF9zZXRzW3RvcF9pbmRleCAtIDFdIC0+IGJyZWFrX3NldDsg fQogICAgQml0U2V0ICZUb3BGaW5hbENvbnRpbnVlU2V0KCkgICB7IChzdGF0aWNfY2FzdDx2b2lk PiAgKCggdG9wX2luZGV4ID4gMCApID8gMCA6CShfX2Fzc2VydF9mYWlsICgidG9wX2luZGV4ID4g MCIgLCAiLi4vLi4vamlrZXMvc3JjL3NlbWFudGljLmgiLCAzMDYsIF9fUFJFVFRZX0ZVTkNUSU9O X18gKSwgMCkpKSA7IHJldHVybiBmaW5hbF9zZXRzW3RvcF9pbmRleCAtIDFdIC0+IGNvbnRpbnVl X3NldDsgfQogICAgQml0U2V0ICZUb3BGaW5hbFJldHVyblNldCgpICAgICB7IChzdGF0aWNfY2Fz dDx2b2lkPiAgKCggdG9wX2luZGV4ID4gMCApID8gMCA6CShfX2Fzc2VydF9mYWlsICgidG9wX2lu ZGV4ID4gMCIgLCAiLi4vLi4vamlrZXMvc3JjL3NlbWFudGljLmgiLCAzMDcsIF9fUFJFVFRZX0ZV TkNUSU9OX18gKSwgMCkpKSA7IHJldHVybiBmaW5hbF9zZXRzW3RvcF9pbmRleCAtIDFdIC0+IHJl dHVybl9zZXQ7IH0KICAgIEJpdFNldCAmVG9wRmluYWxUaHJvd1NldCgpICAgICAgeyAoc3RhdGlj X2Nhc3Q8dm9pZD4gICgoIHRvcF9pbmRleCA+IDAgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInRv cF9pbmRleCA+IDAiICwgIi4uLy4uL2ppa2VzL3NyYy9zZW1hbnRpYy5oIiwgMzA4LCBfX1BSRVRU WV9GVU5DVElPTl9fICksIDApKSkgOyByZXR1cm4gZmluYWxfc2V0c1t0b3BfaW5kZXggLSAxXSAt PiB0aHJvd19zZXQ7IH0KCiAgICBCaXRTZXQgJlRvcEZpbmFsRXhpdFNldChCaXRTZXQgJnN0YXJ0 X3NldCkKICAgIHsKICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIHRvcF9pbmRleCA+IDAg KSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInRvcF9pbmRleCA+IDAiICwgIi4uLy4uL2ppa2VzL3Ny Yy9zZW1hbnRpYy5oIiwgMzEyLCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAg ICBleGl0X3NldCAgPSBzdGFydF9zZXQ7CiAgICAgICAgZXhpdF9zZXQgKz0gVG9wRmluYWxCcmVh a1NldCgpOwogICAgICAgIGV4aXRfc2V0ICs9IFRvcEZpbmFsQ29udGludWVTZXQoKTsKICAgICAg ICBleGl0X3NldCArPSBUb3BGaW5hbFJldHVyblNldCgpOwogICAgICAgIGV4aXRfc2V0ICs9IFRv cEZpbmFsVGhyb3dTZXQoKTsKCiAgICAgICAgcmV0dXJuIGV4aXRfc2V0OwogICAgfQoKICAgIERl ZmluaXRlQmxvY2tTdGFjayhDb250cm9sICZjb250cm9sLCBpbnQgc3RhY2tfc2l6ZV8sIGludCBz ZXRfc2l6ZSkgOiBzdGFja19zaXplKHN0YWNrX3NpemVfKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3Bf aW5kZXgoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9zZXQoc2V0X3NpemUpCiAgICB7CiAgICAg ICAgYmxvY2sgPSBuZXcgQXN0QmxvY2sqW3N0YWNrX3NpemVdOwogICAgICAgIGRlZmluaXRlX3Nl dHMgPSBuZXcgRGVmaW5pdGVTZXRzKltzdGFja19zaXplXTsKICAgICAgICBmaW5hbF9zZXRzID0g bmV3IERlZmluaXRlU2V0cypbc3RhY2tfc2l6ZV07CiAgICAgICAgbG9jYWxfdmFyaWFibGVzID0g KFZhcmlhYmxlU3ltYm9sICoqKikgKGNvbnRyb2wub3B0aW9uLmcgPyBuZXcgVmFyaWFibGVTeW1i b2wqKltzdGFja19zaXplXSA6IF9fbnVsbCApOwogICAgICAgIGxvY2FsbHlfZGVmaW5lZF92YXJp YWJsZXMgPSAoQml0U2V0ICoqKSAoY29udHJvbC5vcHRpb24uZyA/IG5ldyBCaXRTZXQqW3N0YWNr X3NpemVdIDogX19udWxsICk7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhY2tfc2l6 ZTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgZGVmaW5pdGVfc2V0c1tpXSA9IG5ldyBEZWZp bml0ZVNldHMoc2V0X3NpemUpOwogICAgICAgICAgICBmaW5hbF9zZXRzW2ldID0gbmV3IERlZmlu aXRlU2V0cyhzZXRfc2l6ZSk7CiAgICAgICAgICAgIGlmIChsb2NhbF92YXJpYWJsZXMpCiAgICAg ICAgICAgIHsKICAgICAgICAgICAgICAgIGxvY2FsX3ZhcmlhYmxlc1tpXSA9IG5ldyBWYXJpYWJs ZVN5bWJvbCpbc2V0X3NpemVdOwogICAgICAgICAgICAgICAgbG9jYWxseV9kZWZpbmVkX3Zhcmlh Ymxlc1tpXSA9IG5ldyBCaXRTZXQoc2V0X3NpemUpOwogICAgICAgICAgICB9CiAgICAgICAgfQog ICAgfQoKICAgIH5EZWZpbml0ZUJsb2NrU3RhY2soKQogICAgewogICAgICAgIGZvciAoaW50IGkg PSAwOyBpIDwgc3RhY2tfc2l6ZTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgZGVsZXRlIGRl ZmluaXRlX3NldHNbaV07CiAgICAgICAgICAgIGRlbGV0ZSBmaW5hbF9zZXRzW2ldOwogICAgICAg ICAgICBpZiAobG9jYWxfdmFyaWFibGVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBk ZWxldGUgW10gbG9jYWxfdmFyaWFibGVzW2ldOwogICAgICAgICAgICAgICAgZGVsZXRlIGxvY2Fs bHlfZGVmaW5lZF92YXJpYWJsZXNbaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAg IGRlbGV0ZSBbXSBibG9jazsKICAgICAgICBkZWxldGUgW10gZGVmaW5pdGVfc2V0czsKICAgICAg ICBkZWxldGUgW10gZmluYWxfc2V0czsKICAgICAgICBkZWxldGUgW10gbG9jYWxfdmFyaWFibGVz OwogICAgICAgIGRlbGV0ZSBbXSBsb2NhbGx5X2RlZmluZWRfdmFyaWFibGVzOwogICAgfQoKcHJp dmF0ZToKCiAgICBpbnQgc3RhY2tfc2l6ZSwKICAgICAgICB0b3BfaW5kZXg7CiAgICBBc3RCbG9j ayAqKmJsb2NrOwoKICAgIERlZmluaXRlU2V0cyAqKmRlZmluaXRlX3NldHMsCiAgICAgICAgICAg ICAgICAgKipmaW5hbF9zZXRzOwoKICAgIEJpdFNldCAqKmxvY2FsbHlfZGVmaW5lZF92YXJpYWJs ZXM7CiAgICBWYXJpYWJsZVN5bWJvbCAqKipsb2NhbF92YXJpYWJsZXM7CgogICAgQml0U2V0IGV4 aXRfc2V0Owp9OwoKCiAKIAogCmNsYXNzIERlZmluaXRlVHJ5U3RhY2sKewpwdWJsaWM6CgogICAg dm9pZCBQdXNoKEFzdFRyeVN0YXRlbWVudCAqdHJ5X3N0YXRlbWVudF8pCiAgICB7CiAgICAgICAg dGhpcyAtPiB0cnlfc3RhdGVtZW50W3RvcF9pbmRleF0gPSB0cnlfc3RhdGVtZW50XzsKICAgICAg ICB0b3BfaW5kZXgrKzsKICAgIH0KCiAgICB2b2lkIFBvcCgpCiAgICB7CiAgICAgICAgaWYgKHRv cF9pbmRleCA+IDApCiAgICAgICAgICAgICB0b3BfaW5kZXgtLTsKICAgICAgICBlbHNlIChzdGF0 aWNfY2FzdDx2b2lkPiAgKCggZmFsc2UgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImZhbHNlIiAs ICIuLi8uLi9qaWtlcy9zcmMvc2VtYW50aWMuaCIsIDM5OCwgX19QUkVUVFlfRlVOQ1RJT05fXyAp LCAwKSkpIDsKICAgIH0KCiAgICBpbnQgU2l6ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAg eyByZXR1cm4gdG9wX2luZGV4OyB9CiAgICBBc3RUcnlTdGF0ZW1lbnQgKlRyeVN0YXRlbWVudChp bnQgaSkgeyByZXR1cm4gdHJ5X3N0YXRlbWVudFtpXTsgfQogICAgQXN0QmxvY2sgKkJsb2NrKGlu dCBpKSAgICAgICAgICAgICAgIHsgcmV0dXJuIGJsb2NrW2ldOyB9CiAgICBBc3RCbG9jayAqVG9w QmxvY2soKSAgICAgICAgICAgICAgICAgeyAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIHRvcF9pbmRl eCA+IDAgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInRvcF9pbmRleCA+IDAiICwgIi4uLy4uL2pp a2VzL3NyYy9zZW1hbnRpYy5oIiwgNDA0LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOyBy ZXR1cm4gYmxvY2tbdG9wX2luZGV4IC0gMV07IH0KICAgIHZvaWQgU2V0VG9wQmxvY2soQXN0Qmxv Y2sgKmJsb2NrXykgICB7IChzdGF0aWNfY2FzdDx2b2lkPiAgKCggdG9wX2luZGV4ID4gMCApID8g MCA6CShfX2Fzc2VydF9mYWlsICgidG9wX2luZGV4ID4gMCIgLCAiLi4vLi4vamlrZXMvc3JjL3Nl bWFudGljLmgiLCA0MDUsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7IGJsb2NrW3RvcF9p bmRleCAtIDFdID0gYmxvY2tfOyB9CgogICAgRGVmaW5pdGVUcnlTdGFjayhpbnQgc3RhY2tfc2l6 ZV8pIDogc3RhY2tfc2l6ZShzdGFja19zaXplXyksCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB0b3BfaW5kZXgoMCkKICAgIHsKICAgICAgICBibG9jayA9IG5ldyBBc3RC bG9jaypbc3RhY2tfc2l6ZV07CiAgICAgICAgdHJ5X3N0YXRlbWVudCA9IG5ldyBBc3RUcnlTdGF0 ZW1lbnQqW3N0YWNrX3NpemVdOwogICAgfQoKICAgIH5EZWZpbml0ZVRyeVN0YWNrKCkKICAgIHsK ICAgICAgICBkZWxldGUgW10gYmxvY2s7CiAgICAgICAgZGVsZXRlIFtdIHRyeV9zdGF0ZW1lbnQ7 CiAgICB9Cgpwcml2YXRlOgoKICAgIGludCBzdGFja19zaXplLAogICAgICAgIHRvcF9pbmRleDsK ICAgIEFzdEJsb2NrICoqYmxvY2s7CiAgICBBc3RUcnlTdGF0ZW1lbnQgKip0cnlfc3RhdGVtZW50 Owp9OwoKCiAKIAogCmNsYXNzIFNlbWFudGljRW52aXJvbm1lbnQKewpwdWJsaWM6CgogICAgU2Vt YW50aWMgKnNlbTsKICAgIFNlbWFudGljRW52aXJvbm1lbnQgKnByZXZpb3VzOwoKICAgIE1ldGhv ZFN5bWJvbCAgICp0aGlzX21ldGhvZDsKICAgIFZhcmlhYmxlU3ltYm9sICp0aGlzX3ZhcmlhYmxl OwogICAgQXN0ICAgICAgICAgICAgKmV4cGxpY2l0X2NvbnN0cnVjdG9yX2ludm9jYXRpb247CiAg ICBBc3QgICAgICAgICAgICAqYXN0X2NvbnN0cnVjdDsKCiAgICBTeW1ib2xUYWJsZVN0YWNrIHN5 bWJvbF90YWJsZTsgIAogICAgRXhjZXB0aW9uVGFibGVTdGFjayB0cnlfZXhjZXB0aW9uX3RhYmxl X3N0YWNrOwogICAgU3RhdGVtZW50U3RhY2sgdHJ5X3N0YXRlbWVudF9zdGFjaywKICAgICAgICAg ICAgICAgICAgIGJyZWFrYWJsZV9zdGF0ZW1lbnRfc3RhY2ssCiAgICAgICAgICAgICAgICAgICBj b250aW51YWJsZV9zdGF0ZW1lbnRfc3RhY2s7CiAgICBCbG9ja1N0YWNrIGJsb2NrX3N0YWNrOwoK ICAgIFNlbWFudGljRW52aXJvbm1lbnQoU2VtYW50aWMgKnNlbV8sIFR5cGVTeW1ib2wgKnR5cGVf LCBTZW1hbnRpY0Vudmlyb25tZW50ICpwcmV2aW91c18gPSBfX251bGwgKQogICAgICAgICAgICA6 IHNlbShzZW1fKSwKICAgICAgICAgICAgICBwcmV2aW91cyhwcmV2aW91c18pLAogICAgICAgICAg ICAgIHRoaXNfbWV0aG9kKF9fbnVsbCApLAogICAgICAgICAgICAgIHRoaXNfdmFyaWFibGUoX19u dWxsICksCiAgICAgICAgICAgICAgZXhwbGljaXRfY29uc3RydWN0b3JfaW52b2NhdGlvbihfX251 bGwgKSwKICAgICAgICAgICAgICBhc3RfY29uc3RydWN0KF9fbnVsbCApLAogICAgICAgICAgICAg IF90eXBlKHR5cGVfKSwKICAgICAgICAgICAgICBuZXh0KF9fbnVsbCApCiAgICB7fQoKCiAgICB+ U2VtYW50aWNFbnZpcm9ubWVudCgpCiAgICB7CiAgICAgICAgZGVsZXRlIG5leHQ7ICAKICAgIH0K CiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBTZW1hbnRpY0Vudmlyb25t ZW50ICpHZXRFbnZpcm9ubWVudChBc3QgKmFzdCkKICAgIHsKICAgICAgICBTZW1hbnRpY0Vudmly b25tZW50ICpjbG9uZSA9IG5ldyBTZW1hbnRpY0Vudmlyb25tZW50KHNlbSwgX3R5cGUsIF9fbnVs bCApOwogICAgICAgIGNsb25lIC0+IHRoaXNfbWV0aG9kID0gdGhpcyAtPiB0aGlzX21ldGhvZDsK ICAgICAgICBjbG9uZSAtPiB0aGlzX3ZhcmlhYmxlID0gdGhpcyAtPiB0aGlzX3ZhcmlhYmxlOwog ICAgICAgIGNsb25lIC0+IGFzdF9jb25zdHJ1Y3QgPSBhc3Q7CiAgICAgICAgZm9yIChpbnQgaSA9 IDA7IGkgPCB0aGlzIC0+IHN5bWJvbF90YWJsZS5TaXplKCk7IGkrKykKICAgICAgICAgICAgY2xv bmUgLT4gc3ltYm9sX3RhYmxlLlB1c2godGhpcyAtPiBzeW1ib2xfdGFibGVbaV0pOwogICAgICAg IGNsb25lIC0+IG5leHQgPSB0aGlzIC0+IG5leHQ7CiAgICAgICAgdGhpcyAtPiBuZXh0ID0gY2xv bmU7CgogICAgICAgIHJldHVybiBjbG9uZTsKICAgIH0KCiAgICBUeXBlU3ltYm9sICpUeXBlKCkg eyByZXR1cm4gX3R5cGU7IH0KCiAgICAgCiAgICAgCiAgICAgCiAgICBpbmxpbmUgYm9vbCBTdGF0 aWNSZWdpb24oKQogICAgewogICAgICAgIHJldHVybiAodGhpc192YXJpYWJsZSAmJiB0aGlzX3Zh cmlhYmxlIC0+IEFDQ19TVEFUSUMoKSkgfHwKICAgICAgICAgICAgICAgKHRoaXNfbWV0aG9kICAg JiYgdGhpc19tZXRob2QgLT4gQUNDX1NUQVRJQygpKSAgIHx8CiAgICAgICAgICAgICAgIChfdHlw ZSAtPiBBQ0NfSU5URVJGQUNFKCkpOwogICAgfQoKcHJpdmF0ZToKCiAgICBUeXBlU3ltYm9sICpf dHlwZTsKICAgIFNlbWFudGljRW52aXJvbm1lbnQgKm5leHQ7ICAKfTsKCgogCiAKIApjbGFzcyBT ZW1hbnRpY0Vudmlyb25tZW50U3RhY2sKewpwdWJsaWM6CiAgICB2b2lkIFB1c2goU2VtYW50aWNF bnZpcm9ubWVudCAqZW52KSB7IGluZm8uTmV4dCgpID0gZW52OyB9CgogICAgdm9pZCBQb3AoKQog ICAgewogICAgICAgIGlmIChpbmZvLkxlbmd0aCgpID4gMCkKICAgICAgICAgICAgaW5mby5SZXNl dChpbmZvLkxlbmd0aCgpIC0gMSk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpbnQgU2l6 ZSgpIHsgcmV0dXJuIGluZm8uTGVuZ3RoKCk7IH0KCiAgICBTZW1hbnRpY0Vudmlyb25tZW50ICpU b3AoKSB7IHJldHVybiAoU2VtYW50aWNFbnZpcm9ubWVudCAqKSAoaW5mby5MZW5ndGgoKSA+IDAg PyBpbmZvW2luZm8uTGVuZ3RoKCkgLSAxXSA6IF9fbnVsbCApOyB9CgogICAgU2VtYW50aWNFbnZp cm9ubWVudCAqb3BlcmF0b3JbXShjb25zdCBpbnQgaSkgeyByZXR1cm4gaW5mb1tpXTsgfQoKcHJp dmF0ZToKICAgIFR1cGxlPFNlbWFudGljRW52aXJvbm1lbnQgKj4gaW5mbzsKfTsKCgpjbGFzcyBT ZW1hbnRpYwp7CnB1YmxpYzoKICAgICAKICAgICAKICAgICAKICAgIENvbnRyb2wgJmNvbnRyb2w7 CiAgICBGaWxlU3ltYm9sICpzb3VyY2VfZmlsZV9zeW1ib2w7CiAgICBMZXhTdHJlYW0gKmxleF9z dHJlYW07CiAgICBBc3RDb21waWxhdGlvblVuaXQgKmNvbXBpbGF0aW9uX3VuaXQ7CiAgICBEaXJl Y3RvcnlTeW1ib2wgKmRpcmVjdG9yeV9zeW1ib2w7CgogICAgU3ltYm9sU2V0IHR5cGVzX3RvX2Jl X3Byb2Nlc3NlZDsKCiAgICBpbnQgcmV0dXJuX2NvZGU7CgogICAgUGFja2FnZVN5bWJvbCAqUGFj a2FnZSgpIHsgcmV0dXJuIHRoaXNfcGFja2FnZTsgfQoKICAgIHZvaWQgQ2hlY2tQYWNrYWdlKCk7 CiAgICB2b2lkIFByb2Nlc3NUeXBlTmFtZXMoKTsKICAgIHZvaWQgUHJvY2Vzc0ltcG9ydHMoKTsK ICAgIHZvaWQgUHJvY2Vzc1N1cGVyVHlwZURlcGVuZGVuY2VzKEFzdENsYXNzRGVjbGFyYXRpb24g Kik7CiAgICB2b2lkIFByb2Nlc3NTdXBlclR5cGVEZXBlbmRlbmNlcyhBc3RJbnRlcmZhY2VEZWNs YXJhdGlvbiAqKTsKCiAgICBMaXRlcmFsVmFsdWUgKkNvbXB1dGVGaW5hbFZhbHVlKEFzdFZhcmlh YmxlRGVjbGFyYXRvciAqKTsKCiAgICBTZW1hbnRpYyhDb250cm9sICZjb250cm9sXywgRmlsZVN5 bWJvbCAqZmlsZV9zeW1ib2xfKSA6IGNvbnRyb2woY29udHJvbF8pLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfZmlsZV9z eW1ib2woZmlsZV9zeW1ib2xfKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbGV4X3N0cmVhbShmaWxlX3N5bWJvbF8gLT4gbGV4X3N0 cmVhbSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNvbXBpbGF0aW9uX3VuaXQoZmlsZV9zeW1ib2xfIC0+IGNvbXBpbGF0aW9uX3Vu aXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBkaXJlY3Rvcnlfc3ltYm9sKGZpbGVfc3ltYm9sXyAtPiBkaXJlY3Rvcnlfc3ltYm9s KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmV0dXJuX2NvZGUoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKF9fbnVsbCApLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzX3BhY2thZ2Uo ZmlsZV9zeW1ib2xfIC0+IHBhY2thZ2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0ZWx5X2Fzc2lnbmVkX3ZhcmlhYmxl cyhfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcG9zc2libHlfYXNzaWduZWRfZmluYWxzKF9fbnVsbCApLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2 ZXJzZShfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZGVmaW5pdGVfYmxvY2tfc3RhY2soX19udWxsICksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmlu aXRlX3RyeV9zdGFjayhfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGVfZmluYWxfYXNzaWdubWVudF9zdGFj ayhfX251bGwgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgZGVmaW5pdGVfdmlzaWJsZV92YXJpYWJsZXMoX19udWxsICkKICAgIHsK ICAgICAgICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OkxPQ0FMX1ZBUklBQkxFX0RFQ0xBUkFUSU9O XSA9ICZTZW1hbnRpYzo6UHJvY2Vzc0xvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDsK ICAgICAgICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OkJMT0NLXSAgICAgICAgICAgICAgICAgICAg ICA9ICZTZW1hbnRpYzo6UHJvY2Vzc0Jsb2NrOwogICAgICAgIFByb2Nlc3NFeHByT3JTdG10W0Fz dDo6RVhQUkVTU0lPTl9TVEFURU1FTlRdICAgICAgID0gJlNlbWFudGljOjpQcm9jZXNzRXhwcmVz c2lvblN0YXRlbWVudDsKICAgICAgICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OlNZTkNIUk9OSVpF RF9TVEFURU1FTlRdICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc1N5bmNocm9uaXplZFN0YXRlbWVu dDsKICAgICAgICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OklGXSAgICAgICAgICAgICAgICAgICAg ICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc0lmU3RhdGVtZW50OwogICAgICAgIFByb2Nlc3NFeHBy T3JTdG10W0FzdDo6V0hJTEVdICAgICAgICAgICAgICAgICAgICAgID0gJlNlbWFudGljOjpQcm9j ZXNzV2hpbGVTdGF0ZW1lbnQ7CiAgICAgICAgUHJvY2Vzc0V4cHJPclN0bXRbQXN0OjpGT1JdICAg ICAgICAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nlc3NGb3JTdGF0ZW1lbnQ7CiAg ICAgICAgUHJvY2Vzc0V4cHJPclN0bXRbQXN0OjpTV0lUQ0hdICAgICAgICAgICAgICAgICAgICAg PSAmU2VtYW50aWM6OlByb2Nlc3NTd2l0Y2hTdGF0ZW1lbnQ7CiAgICAgICAgUHJvY2Vzc0V4cHJP clN0bXRbQXN0OjpET10gICAgICAgICAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nl c3NEb1N0YXRlbWVudDsKICAgICAgICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OkJSRUFLXSAgICAg ICAgICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc0JyZWFrU3RhdGVtZW50OwogICAg ICAgIFByb2Nlc3NFeHByT3JTdG10W0FzdDo6Q09OVElOVUVdICAgICAgICAgICAgICAgICAgID0g JlNlbWFudGljOjpQcm9jZXNzQ29udGludWVTdGF0ZW1lbnQ7CiAgICAgICAgUHJvY2Vzc0V4cHJP clN0bXRbQXN0OjpSRVRVUk5dICAgICAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nl c3NSZXR1cm5TdGF0ZW1lbnQ7CiAgICAgICAgUHJvY2Vzc0V4cHJPclN0bXRbQXN0OjpUSFJPV10g ICAgICAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nlc3NUaHJvd1N0YXRlbWVudDsK ICAgICAgICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OlRSWV0gICAgICAgICAgICAgICAgICAgICAg ICA9ICZTZW1hbnRpYzo6UHJvY2Vzc1RyeVN0YXRlbWVudDsKICAgICAgICBQcm9jZXNzRXhwck9y U3RtdFtBc3Q6OkVNUFRZX1NUQVRFTUVOVF0gICAgICAgICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vz c0VtcHR5U3RhdGVtZW50OwogICAgICAgIFByb2Nlc3NFeHByT3JTdG10W0FzdDo6Q0xBU1NdICAg ICAgICAgICAgICAgICAgICAgID0gJlNlbWFudGljOjpQcm9jZXNzQ2xhc3NEZWNsYXJhdGlvbjsK CiAgICAgICAgUHJvY2Vzc0V4cHJPclN0bXRbQXN0OjpJREVOVElGSUVSXSAgICAgICAgICAgICAg ID0gJlNlbWFudGljOjpQcm9jZXNzU2ltcGxlTmFtZTsKICAgICAgICBQcm9jZXNzRXhwck9yU3Rt dFtBc3Q6OkRPVF0gICAgICAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nlc3NGaWVs ZEFjY2VzczsKICAgICAgICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OklOVEVHRVJfTElURVJBTF0g ICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nlc3NJbnRlZ2VyTGl0ZXJhbDsKICAgICAgICBQcm9j ZXNzRXhwck9yU3RtdFtBc3Q6OkxPTkdfTElURVJBTF0gICAgICAgICAgICAgPSAmU2VtYW50aWM6 OlByb2Nlc3NMb25nTGl0ZXJhbDsKICAgICAgICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OkZMT0FU SU5HX1BPSU5UX0xJVEVSQUxdICAgPSAmU2VtYW50aWM6OlByb2Nlc3NGbG9hdGluZ1BvaW50TGl0 ZXJhbDsKICAgICAgICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OkRPVUJMRV9MSVRFUkFMXSAgICAg ICAgICAgPSAmU2VtYW50aWM6OlByb2Nlc3NEb3VibGVMaXRlcmFsOwogICAgICAgIFByb2Nlc3NF eHByT3JTdG10W0FzdDo6VFJVRV9MSVRFUkFMXSAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6UHJv Y2Vzc1RydWVMaXRlcmFsOwogICAgICAgIFByb2Nlc3NFeHByT3JTdG10W0FzdDo6RkFMU0VfTElU RVJBTF0gICAgICAgICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc0ZhbHNlTGl0ZXJhbDsKICAgICAg ICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OlNUUklOR19MSVRFUkFMXSAgICAgICAgICAgPSAmU2Vt YW50aWM6OlByb2Nlc3NTdHJpbmdMaXRlcmFsOwogICAgICAgIFByb2Nlc3NFeHByT3JTdG10W0Fz dDo6Q0hBUkFDVEVSX0xJVEVSQUxdICAgICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc0NoYXJhY3Rl ckxpdGVyYWw7CiAgICAgICAgUHJvY2Vzc0V4cHJPclN0bXRbQXN0OjpOVUxMX0xJVEVSQUxdICAg ICAgICAgICAgID0gJlNlbWFudGljOjpQcm9jZXNzTnVsbExpdGVyYWw7CiAgICAgICAgUHJvY2Vz c0V4cHJPclN0bXRbQXN0OjpBUlJBWV9BQ0NFU1NdICAgICAgICAgICAgID0gJlNlbWFudGljOjpQ cm9jZXNzQXJyYXlBY2Nlc3M7CiAgICAgICAgUHJvY2Vzc0V4cHJPclN0bXRbQXN0OjpDQUxMXSAg ICAgICAgICAgICAgICAgICAgID0gJlNlbWFudGljOjpQcm9jZXNzTWV0aG9kSW52b2NhdGlvbjsK ICAgICAgICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OlRISVNfRVhQUkVTU0lPTl0gICAgICAgICAg PSAmU2VtYW50aWM6OlByb2Nlc3NUaGlzRXhwcmVzc2lvbjsKICAgICAgICBQcm9jZXNzRXhwck9y U3RtdFtBc3Q6OlNVUEVSX0VYUFJFU1NJT05dICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nlc3NT dXBlckV4cHJlc3Npb247CiAgICAgICAgUHJvY2Vzc0V4cHJPclN0bXRbQXN0OjpQQVJFTlRIRVNJ WkVEX0VYUFJFU1NJT05dID0gJlNlbWFudGljOjpQcm9jZXNzUGFyZW50aGVzaXplZEV4cHJlc3Np b247CiAgICAgICAgUHJvY2Vzc0V4cHJPclN0bXRbQXN0OjpDTEFTU19DUkVBVElPTl0gICAgICAg ICAgID0gJlNlbWFudGljOjpQcm9jZXNzQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbjsK ICAgICAgICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OkFSUkFZX0NSRUFUSU9OXSAgICAgICAgICAg PSAmU2VtYW50aWM6OlByb2Nlc3NBcnJheUNyZWF0aW9uRXhwcmVzc2lvbjsKICAgICAgICBQcm9j ZXNzRXhwck9yU3RtdFtBc3Q6OlBPU1RfVU5BUlldICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6 OlByb2Nlc3NQb3N0VW5hcnlFeHByZXNzaW9uOwogICAgICAgIFByb2Nlc3NFeHByT3JTdG10W0Fz dDo6UFJFX1VOQVJZXSAgICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc1ByZVVuYXJ5 RXhwcmVzc2lvbjsKICAgICAgICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OkNBU1RdICAgICAgICAg ICAgICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nlc3NDYXN0RXhwcmVzc2lvbjsKICAgICAgICBQ cm9jZXNzRXhwck9yU3RtdFtBc3Q6OkJJTkFSWV0gICAgICAgICAgICAgICAgICAgPSAmU2VtYW50 aWM6OlByb2Nlc3NCaW5hcnlFeHByZXNzaW9uOwogICAgICAgIFByb2Nlc3NFeHByT3JTdG10W0Fz dDo6VFlQRV0gICAgICAgICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc1R5cGVFeHBy ZXNzaW9uOwogICAgICAgIFByb2Nlc3NFeHByT3JTdG10W0FzdDo6Q09ORElUSU9OQUxdICAgICAg ICAgICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc0NvbmRpdGlvbmFsRXhwcmVzc2lvbjsKICAgICAg ICBQcm9jZXNzRXhwck9yU3RtdFtBc3Q6OkFTU0lHTk1FTlRdICAgICAgICAgICAgICAgPSAmU2Vt YW50aWM6OlByb2Nlc3NBc3NpZ25tZW50RXhwcmVzc2lvbjsKCiAgICAgICAgRGVmaW5pdGVTdG10 W0FzdDo6TE9DQUxfVkFSSUFCTEVfREVDTEFSQVRJT05dID0gJlNlbWFudGljOjpEZWZpbml0ZUxv Y2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDsKICAgICAgICBEZWZpbml0ZVN0bXRbQXN0 OjpCTE9DS10gICAgICAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OkRlZmluaXRlQmxvY2s7 CiAgICAgICAgRGVmaW5pdGVTdG10W0FzdDo6RVhQUkVTU0lPTl9TVEFURU1FTlRdICAgICAgID0g JlNlbWFudGljOjpEZWZpbml0ZUV4cHJlc3Npb25TdGF0ZW1lbnQ7CiAgICAgICAgRGVmaW5pdGVT dG10W0FzdDo6U1lOQ0hST05JWkVEX1NUQVRFTUVOVF0gICAgID0gJlNlbWFudGljOjpEZWZpbml0 ZVN5bmNocm9uaXplZFN0YXRlbWVudDsKICAgICAgICBEZWZpbml0ZVN0bXRbQXN0OjpJRl0gICAg ICAgICAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OkRlZmluaXRlSWZTdGF0ZW1lbnQ7CiAg ICAgICAgRGVmaW5pdGVTdG10W0FzdDo6V0hJTEVdICAgICAgICAgICAgICAgICAgICAgID0gJlNl bWFudGljOjpEZWZpbml0ZVdoaWxlU3RhdGVtZW50OwogICAgICAgIERlZmluaXRlU3RtdFtBc3Q6 OkZPUl0gICAgICAgICAgICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVGb3JTdGF0 ZW1lbnQ7CiAgICAgICAgRGVmaW5pdGVTdG10W0FzdDo6U1dJVENIXSAgICAgICAgICAgICAgICAg ICAgID0gJlNlbWFudGljOjpEZWZpbml0ZVN3aXRjaFN0YXRlbWVudDsKICAgICAgICBEZWZpbml0 ZVN0bXRbQXN0OjpET10gICAgICAgICAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OkRlZmlu aXRlRG9TdGF0ZW1lbnQ7CiAgICAgICAgRGVmaW5pdGVTdG10W0FzdDo6QlJFQUtdICAgICAgICAg ICAgICAgICAgICAgID0gJlNlbWFudGljOjpEZWZpbml0ZUJyZWFrU3RhdGVtZW50OwogICAgICAg IERlZmluaXRlU3RtdFtBc3Q6OkNPTlRJTlVFXSAgICAgICAgICAgICAgICAgICA9ICZTZW1hbnRp Yzo6RGVmaW5pdGVDb250aW51ZVN0YXRlbWVudDsKICAgICAgICBEZWZpbml0ZVN0bXRbQXN0OjpS RVRVUk5dICAgICAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OkRlZmluaXRlUmV0dXJuU3Rh dGVtZW50OwogICAgICAgIERlZmluaXRlU3RtdFtBc3Q6OlRIUk9XXSAgICAgICAgICAgICAgICAg ICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVUaHJvd1N0YXRlbWVudDsKICAgICAgICBEZWZpbml0 ZVN0bXRbQXN0OjpUUlldICAgICAgICAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OkRlZmlu aXRlVHJ5U3RhdGVtZW50OwogICAgICAgIERlZmluaXRlU3RtdFtBc3Q6OkVNUFRZX1NUQVRFTUVO VF0gICAgICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVFbXB0eVN0YXRlbWVudDsKICAgICAg ICBEZWZpbml0ZVN0bXRbQXN0OjpDTEFTU10gICAgICAgICAgICAgICAgICAgICAgPSAmU2VtYW50 aWM6OkRlZmluaXRlQ2xhc3NEZWNsYXJhdGlvbjsKCiAgICAgICAgRGVmaW5pdGVFeHByW0FzdDo6 SURFTlRJRklFUl0gICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVTaW1wbGVOYW1l OwogICAgICAgIERlZmluaXRlRXhwcltBc3Q6OkRPVF0gICAgICAgICAgICAgICAgICAgICAgPSAm U2VtYW50aWM6OkRlZmluaXRlRmllbGRBY2Nlc3M7CiAgICAgICAgRGVmaW5pdGVFeHByW0FzdDo6 QVJSQVlfQUNDRVNTXSAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVBcnJheUFjY2Vz czsKICAgICAgICBEZWZpbml0ZUV4cHJbQXN0OjpDQUxMXSAgICAgICAgICAgICAgICAgICAgID0g JlNlbWFudGljOjpEZWZpbml0ZU1ldGhvZEludm9jYXRpb247CiAgICAgICAgRGVmaW5pdGVFeHBy W0FzdDo6UEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OXSA9ICZTZW1hbnRpYzo6RGVmaW5pdGVQYXJl bnRoZXNpemVkRXhwcmVzc2lvbjsKICAgICAgICBEZWZpbml0ZUV4cHJbQXN0OjpDTEFTU19DUkVB VElPTl0gICAgICAgICAgID0gJlNlbWFudGljOjpEZWZpbml0ZUNsYXNzSW5zdGFuY2VDcmVhdGlv bkV4cHJlc3Npb247CiAgICAgICAgRGVmaW5pdGVFeHByW0FzdDo6QVJSQVlfQ1JFQVRJT05dICAg ICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVBcnJheUNyZWF0aW9uRXhwcmVzc2lvbjsKICAg ICAgICBEZWZpbml0ZUV4cHJbQXN0OjpQT1NUX1VOQVJZXSAgICAgICAgICAgICAgID0gJlNlbWFu dGljOjpEZWZpbml0ZVBvc3RVbmFyeUV4cHJlc3Npb247CiAgICAgICAgRGVmaW5pdGVFeHByW0Fz dDo6UFJFX1VOQVJZXSAgICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVQcmVVbmFy eUV4cHJlc3Npb247CiAgICAgICAgRGVmaW5pdGVFeHByW0FzdDo6Q0FTVF0gICAgICAgICAgICAg ICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVDYXN0RXhwcmVzc2lvbjsKICAgICAgICBEZWZp bml0ZUV4cHJbQXN0OjpDSEVDS19BTkRfQ0FTVF0gICAgICAgICAgID0gJlNlbWFudGljOjpEZWZp bml0ZUNhc3RFeHByZXNzaW9uOwogICAgICAgIERlZmluaXRlRXhwcltBc3Q6OkJJTkFSWV0gICAg ICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OkRlZmluaXRlQmluYXJ5RXhwcmVzc2lvbjsKICAg ICAgICBEZWZpbml0ZUV4cHJbQXN0OjpDT05ESVRJT05BTF0gICAgICAgICAgICAgID0gJlNlbWFu dGljOjpEZWZpbml0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbjsKICAgICAgICBEZWZpbml0ZUV4cHJb QXN0OjpBU1NJR05NRU5UXSAgICAgICAgICAgICAgID0gJlNlbWFudGljOjpEZWZpbml0ZUFzc2ln bm1lbnRFeHByZXNzaW9uOwoKICAgICAgICBEZWZpbml0ZUV4cHJbQXN0OjpJTlRFR0VSX0xJVEVS QUxdICAgICAgICAgID0gJlNlbWFudGljOjpEZWZpbml0ZURlZmF1bHRFeHByZXNzaW9uOwogICAg ICAgIERlZmluaXRlRXhwcltBc3Q6OkxPTkdfTElURVJBTF0gICAgICAgICAgICAgPSAmU2VtYW50 aWM6OkRlZmluaXRlRGVmYXVsdEV4cHJlc3Npb247CiAgICAgICAgRGVmaW5pdGVFeHByW0FzdDo6 RkxPQVRJTkdfUE9JTlRfTElURVJBTF0gICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVEZWZhdWx0RXhw cmVzc2lvbjsKICAgICAgICBEZWZpbml0ZUV4cHJbQXN0OjpET1VCTEVfTElURVJBTF0gICAgICAg ICAgID0gJlNlbWFudGljOjpEZWZpbml0ZURlZmF1bHRFeHByZXNzaW9uOwogICAgICAgIERlZmlu aXRlRXhwcltBc3Q6OlRSVUVfTElURVJBTF0gICAgICAgICAgICAgPSAmU2VtYW50aWM6OkRlZmlu aXRlRGVmYXVsdEV4cHJlc3Npb247CiAgICAgICAgRGVmaW5pdGVFeHByW0FzdDo6RkFMU0VfTElU RVJBTF0gICAgICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVEZWZhdWx0RXhwcmVzc2lvbjsK ICAgICAgICBEZWZpbml0ZUV4cHJbQXN0OjpTVFJJTkdfTElURVJBTF0gICAgICAgICAgID0gJlNl bWFudGljOjpEZWZpbml0ZURlZmF1bHRFeHByZXNzaW9uOwogICAgICAgIERlZmluaXRlRXhwcltB c3Q6OkNIQVJBQ1RFUl9MSVRFUkFMXSAgICAgICAgPSAmU2VtYW50aWM6OkRlZmluaXRlRGVmYXVs dEV4cHJlc3Npb247CiAgICAgICAgRGVmaW5pdGVFeHByW0FzdDo6TlVMTF9MSVRFUkFMXSAgICAg ICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVEZWZhdWx0RXhwcmVzc2lvbjsKICAgICAgICBE ZWZpbml0ZUV4cHJbQXN0OjpUSElTX0VYUFJFU1NJT05dICAgICAgICAgID0gJlNlbWFudGljOjpE ZWZpbml0ZURlZmF1bHRFeHByZXNzaW9uOwogICAgICAgIERlZmluaXRlRXhwcltBc3Q6OlNVUEVS X0VYUFJFU1NJT05dICAgICAgICAgPSAmU2VtYW50aWM6OkRlZmluaXRlRGVmYXVsdEV4cHJlc3Np b247CiAgICAgICAgRGVmaW5pdGVFeHByW0FzdDo6VFlQRV0gICAgICAgICAgICAgICAgICAgICA9 ICZTZW1hbnRpYzo6RGVmaW5pdGVEZWZhdWx0RXhwcmVzc2lvbjsKCiAgICAgICAgRGVmaW5pdGVC aW5hcnlFeHByW0FzdEJpbmFyeUV4cHJlc3Npb246OlBMVVNdICAgICAgICAgICAgICAgICA9ICZT ZW1hbnRpYzo6RGVmaW5pdGVEZWZhdWx0QmluYXJ5RXhwcmVzc2lvbjsKICAgICAgICBEZWZpbml0 ZUJpbmFyeUV4cHJbQXN0QmluYXJ5RXhwcmVzc2lvbjo6TEVGVF9TSElGVF0gICAgICAgICAgID0g JlNlbWFudGljOjpEZWZpbml0ZURlZmF1bHRCaW5hcnlFeHByZXNzaW9uOwogICAgICAgIERlZmlu aXRlQmluYXJ5RXhwcltBc3RCaW5hcnlFeHByZXNzaW9uOjpSSUdIVF9TSElGVF0gICAgICAgICAg PSAmU2VtYW50aWM6OkRlZmluaXRlRGVmYXVsdEJpbmFyeUV4cHJlc3Npb247CiAgICAgICAgRGVm aW5pdGVCaW5hcnlFeHByW0FzdEJpbmFyeUV4cHJlc3Npb246OlVOU0lHTkVEX1JJR0hUX1NISUZU XSA9ICZTZW1hbnRpYzo6RGVmaW5pdGVEZWZhdWx0QmluYXJ5RXhwcmVzc2lvbjsKICAgICAgICBE ZWZpbml0ZUJpbmFyeUV4cHJbQXN0QmluYXJ5RXhwcmVzc2lvbjo6TEVTU10gICAgICAgICAgICAg ICAgID0gJlNlbWFudGljOjpEZWZpbml0ZURlZmF1bHRCaW5hcnlFeHByZXNzaW9uOwogICAgICAg IERlZmluaXRlQmluYXJ5RXhwcltBc3RCaW5hcnlFeHByZXNzaW9uOjpHUkVBVEVSXSAgICAgICAg ICAgICAgPSAmU2VtYW50aWM6OkRlZmluaXRlRGVmYXVsdEJpbmFyeUV4cHJlc3Npb247CiAgICAg ICAgRGVmaW5pdGVCaW5hcnlFeHByW0FzdEJpbmFyeUV4cHJlc3Npb246OkxFU1NfRVFVQUxdICAg ICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVEZWZhdWx0QmluYXJ5RXhwcmVzc2lvbjsKICAg ICAgICBEZWZpbml0ZUJpbmFyeUV4cHJbQXN0QmluYXJ5RXhwcmVzc2lvbjo6R1JFQVRFUl9FUVVB TF0gICAgICAgID0gJlNlbWFudGljOjpEZWZpbml0ZURlZmF1bHRCaW5hcnlFeHByZXNzaW9uOwoK ICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAg ICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAog ICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAg IAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAg ICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAg ICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAg CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAg ICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAg ICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAK ICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAg ICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAog ICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAg IAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAg ICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgRGVmaW5pdGVCaW5hcnlFeHByW0FzdEJp bmFyeUV4cHJlc3Npb246OkFORF0gICAgICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5p dGVEZWZhdWx0QmluYXJ5RXhwcmVzc2lvbjsgCiAgICAgICAgRGVmaW5pdGVCaW5hcnlFeHByW0Fz dEJpbmFyeUV4cHJlc3Npb246OlhPUl0gICAgICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6RGVm aW5pdGVEZWZhdWx0QmluYXJ5RXhwcmVzc2lvbjsgCiAgICAgICAgRGVmaW5pdGVCaW5hcnlFeHBy W0FzdEJpbmFyeUV4cHJlc3Npb246OklPUl0gICAgICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6 RGVmaW5pdGVEZWZhdWx0QmluYXJ5RXhwcmVzc2lvbjsgCgogICAgICAgIERlZmluaXRlQmluYXJ5 RXhwcltBc3RCaW5hcnlFeHByZXNzaW9uOjpFUVVBTF9FUVVBTF0gICAgICAgICAgPSAmU2VtYW50 aWM6OkRlZmluaXRlRGVmYXVsdEJpbmFyeUV4cHJlc3Npb247ICAKICAgICAgICBEZWZpbml0ZUJp bmFyeUV4cHJbQXN0QmluYXJ5RXhwcmVzc2lvbjo6Tk9UX0VRVUFMXSAgICAgICAgICAgID0gJlNl bWFudGljOjpEZWZpbml0ZURlZmF1bHRCaW5hcnlFeHByZXNzaW9uOyAgCgogICAgICAgIERlZmlu aXRlQmluYXJ5RXhwcltBc3RCaW5hcnlFeHByZXNzaW9uOjpBTkRfQU5EXSAgICAgICAgICAgICAg PSAmU2VtYW50aWM6OkRlZmluaXRlQU5EX0FORDsKICAgICAgICBEZWZpbml0ZUJpbmFyeUV4cHJb QXN0QmluYXJ5RXhwcmVzc2lvbjo6T1JfT1JdICAgICAgICAgICAgICAgID0gJlNlbWFudGljOjpE ZWZpbml0ZU9SX09SOwogICAgICAgIERlZmluaXRlQmluYXJ5RXhwcltBc3RCaW5hcnlFeHByZXNz aW9uOjpTVEFSXSAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OkRlZmluaXRlRGVmYXVsdEJp bmFyeUV4cHJlc3Npb247CiAgICAgICAgRGVmaW5pdGVCaW5hcnlFeHByW0FzdEJpbmFyeUV4cHJl c3Npb246Ok1JTlVTXSAgICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVEZWZhdWx0 QmluYXJ5RXhwcmVzc2lvbjsKICAgICAgICBEZWZpbml0ZUJpbmFyeUV4cHJbQXN0QmluYXJ5RXhw cmVzc2lvbjo6U0xBU0hdICAgICAgICAgICAgICAgID0gJlNlbWFudGljOjpEZWZpbml0ZURlZmF1 bHRCaW5hcnlFeHByZXNzaW9uOwogICAgICAgIERlZmluaXRlQmluYXJ5RXhwcltBc3RCaW5hcnlF eHByZXNzaW9uOjpNT0RdICAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OkRlZmluaXRlRGVm YXVsdEJpbmFyeUV4cHJlc3Npb247CiAgICAgICAgRGVmaW5pdGVCaW5hcnlFeHByW0FzdEJpbmFy eUV4cHJlc3Npb246OklOU1RBTkNFT0ZdICAgICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVE ZWZhdWx0QmluYXJ5RXhwcmVzc2lvbjsKCiAgICAgICAgRGVmaW5pdGVQcmVVbmFyeUV4cHJbQXN0 UHJlVW5hcnlFeHByZXNzaW9uOjpQTFVTXSAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5p dGVEZWZhdWx0UHJlVW5hcnlFeHByZXNzaW9uOwogICAgICAgIERlZmluaXRlUHJlVW5hcnlFeHBy W0FzdFByZVVuYXJ5RXhwcmVzc2lvbjo6TUlOVVNdICAgICAgICAgICAgPSAmU2VtYW50aWM6OkRl ZmluaXRlRGVmYXVsdFByZVVuYXJ5RXhwcmVzc2lvbjsKICAgICAgICBEZWZpbml0ZVByZVVuYXJ5 RXhwcltBc3RQcmVVbmFyeUV4cHJlc3Npb246OlRXSURETEVdICAgICAgICAgID0gJlNlbWFudGlj OjpEZWZpbml0ZURlZmF1bHRQcmVVbmFyeUV4cHJlc3Npb247CiAgICAgICAgRGVmaW5pdGVQcmVV bmFyeUV4cHJbQXN0UHJlVW5hcnlFeHByZXNzaW9uOjpOT1RdICAgICAgICAgICAgICA9ICZTZW1h bnRpYzo6RGVmaW5pdGVOT1Q7CiAgICAgICAgRGVmaW5pdGVQcmVVbmFyeUV4cHJbQXN0UHJlVW5h cnlFeHByZXNzaW9uOjpQTFVTUExVU10gICAgICAgICA9ICZTZW1hbnRpYzo6RGVmaW5pdGVQTFVT UExVU09yTUlOVVNNSU5VUzsKICAgICAgICBEZWZpbml0ZVByZVVuYXJ5RXhwcltBc3RQcmVVbmFy eUV4cHJlc3Npb246Ok1JTlVTTUlOVVNdICAgICAgID0gJlNlbWFudGljOjpEZWZpbml0ZVBMVVNQ TFVTT3JNSU5VU01JTlVTOwoKICAgICAgICBQcm9jZXNzQmluYXJ5RXhwcltBc3RCaW5hcnlFeHBy ZXNzaW9uOjpQTFVTXSAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nlc3NQTFVTOwog ICAgICAgIFByb2Nlc3NCaW5hcnlFeHByW0FzdEJpbmFyeUV4cHJlc3Npb246OkxFRlRfU0hJRlRd ICAgICAgICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc0xFRlRfU0hJRlQ7CiAgICAgICAgUHJvY2Vz c0JpbmFyeUV4cHJbQXN0QmluYXJ5RXhwcmVzc2lvbjo6UklHSFRfU0hJRlRdICAgICAgICAgID0g JlNlbWFudGljOjpQcm9jZXNzUklHSFRfU0hJRlQ7CiAgICAgICAgUHJvY2Vzc0JpbmFyeUV4cHJb QXN0QmluYXJ5RXhwcmVzc2lvbjo6VU5TSUdORURfUklHSFRfU0hJRlRdID0gJlNlbWFudGljOjpQ cm9jZXNzVU5TSUdORURfUklHSFRfU0hJRlQ7CiAgICAgICAgUHJvY2Vzc0JpbmFyeUV4cHJbQXN0 QmluYXJ5RXhwcmVzc2lvbjo6TEVTU10gICAgICAgICAgICAgICAgID0gJlNlbWFudGljOjpQcm9j ZXNzTEVTUzsKICAgICAgICBQcm9jZXNzQmluYXJ5RXhwcltBc3RCaW5hcnlFeHByZXNzaW9uOjpH UkVBVEVSXSAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nlc3NHUkVBVEVSOwogICAgICAg IFByb2Nlc3NCaW5hcnlFeHByW0FzdEJpbmFyeUV4cHJlc3Npb246OkxFU1NfRVFVQUxdICAgICAg ICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc0xFU1NfRVFVQUw7CiAgICAgICAgUHJvY2Vzc0JpbmFy eUV4cHJbQXN0QmluYXJ5RXhwcmVzc2lvbjo6R1JFQVRFUl9FUVVBTF0gICAgICAgID0gJlNlbWFu dGljOjpQcm9jZXNzR1JFQVRFUl9FUVVBTDsKICAgICAgICBQcm9jZXNzQmluYXJ5RXhwcltBc3RC aW5hcnlFeHByZXNzaW9uOjpBTkRdICAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nl c3NBTkQ7CiAgICAgICAgUHJvY2Vzc0JpbmFyeUV4cHJbQXN0QmluYXJ5RXhwcmVzc2lvbjo6WE9S XSAgICAgICAgICAgICAgICAgID0gJlNlbWFudGljOjpQcm9jZXNzWE9SOwogICAgICAgIFByb2Nl c3NCaW5hcnlFeHByW0FzdEJpbmFyeUV4cHJlc3Npb246OklPUl0gICAgICAgICAgICAgICAgICA9 ICZTZW1hbnRpYzo6UHJvY2Vzc0lPUjsKICAgICAgICBQcm9jZXNzQmluYXJ5RXhwcltBc3RCaW5h cnlFeHByZXNzaW9uOjpBTkRfQU5EXSAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nlc3NB TkRfQU5EOwogICAgICAgIFByb2Nlc3NCaW5hcnlFeHByW0FzdEJpbmFyeUV4cHJlc3Npb246Ok9S X09SXSAgICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc09SX09SOwogICAgICAgIFBy b2Nlc3NCaW5hcnlFeHByW0FzdEJpbmFyeUV4cHJlc3Npb246OkVRVUFMX0VRVUFMXSAgICAgICAg ICA9ICZTZW1hbnRpYzo6UHJvY2Vzc0VRVUFMX0VRVUFMOwogICAgICAgIFByb2Nlc3NCaW5hcnlF eHByW0FzdEJpbmFyeUV4cHJlc3Npb246Ok5PVF9FUVVBTF0gICAgICAgICAgICA9ICZTZW1hbnRp Yzo6UHJvY2Vzc05PVF9FUVVBTDsKICAgICAgICBQcm9jZXNzQmluYXJ5RXhwcltBc3RCaW5hcnlF eHByZXNzaW9uOjpTVEFSXSAgICAgICAgICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nlc3NTVEFS OwogICAgICAgIFByb2Nlc3NCaW5hcnlFeHByW0FzdEJpbmFyeUV4cHJlc3Npb246Ok1JTlVTXSAg ICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc01JTlVTOwogICAgICAgIFByb2Nlc3NC aW5hcnlFeHByW0FzdEJpbmFyeUV4cHJlc3Npb246OlNMQVNIXSAgICAgICAgICAgICAgICA9ICZT ZW1hbnRpYzo6UHJvY2Vzc1NMQVNIOwogICAgICAgIFByb2Nlc3NCaW5hcnlFeHByW0FzdEJpbmFy eUV4cHJlc3Npb246Ok1PRF0gICAgICAgICAgICAgICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc01P RDsKICAgICAgICBQcm9jZXNzQmluYXJ5RXhwcltBc3RCaW5hcnlFeHByZXNzaW9uOjpJTlNUQU5D RU9GXSAgICAgICAgICAgPSAmU2VtYW50aWM6OlByb2Nlc3NJTlNUQU5DRU9GOwoKICAgICAgICBQ cm9jZXNzUHJlVW5hcnlFeHByW0FzdFByZVVuYXJ5RXhwcmVzc2lvbjo6UExVU10gICAgICAgPSAm U2VtYW50aWM6OlByb2Nlc3NQTFVTOwogICAgICAgIFByb2Nlc3NQcmVVbmFyeUV4cHJbQXN0UHJl VW5hcnlFeHByZXNzaW9uOjpNSU5VU10gICAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc01JTlVTOwog ICAgICAgIFByb2Nlc3NQcmVVbmFyeUV4cHJbQXN0UHJlVW5hcnlFeHByZXNzaW9uOjpUV0lERExF XSAgICA9ICZTZW1hbnRpYzo6UHJvY2Vzc1RXSURETEU7CiAgICAgICAgUHJvY2Vzc1ByZVVuYXJ5 RXhwcltBc3RQcmVVbmFyeUV4cHJlc3Npb246Ok5PVF0gICAgICAgID0gJlNlbWFudGljOjpQcm9j ZXNzTk9UOwogICAgICAgIFByb2Nlc3NQcmVVbmFyeUV4cHJbQXN0UHJlVW5hcnlFeHByZXNzaW9u OjpQTFVTUExVU10gICA9ICZTZW1hbnRpYzo6UHJvY2Vzc1BMVVNQTFVTT3JNSU5VU01JTlVTOwog ICAgICAgIFByb2Nlc3NQcmVVbmFyeUV4cHJbQXN0UHJlVW5hcnlFeHByZXNzaW9uOjpNSU5VU01J TlVTXSA9ICZTZW1hbnRpYzo6UHJvY2Vzc1BMVVNQTFVTT3JNSU5VU01JTlVTOwogICAgfQoKICAg IH5TZW1hbnRpYygpIHsgZGVsZXRlIGVycm9yOyB9CgogICAgdm9pZCBSZXBvcnRTZW1FcnJvcihT ZW1hbnRpY0Vycm9yOjpTZW1hbnRpY0Vycm9yS2luZCBraW5kLAogICAgICAgICAgICAgICAgICAg ICAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggbHRvaywKICAgICAgICAgICAgICAgICAgICAgICAg TGV4U3RyZWFtOjpUb2tlbkluZGV4IHJ0b2ssCiAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFy X3QgKnMxID0gX19udWxsICwKICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAqczIgPSBf X251bGwgLAogICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90ICpzMyA9IF9fbnVsbCAsCiAg ICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QgKnM0ID0gX19udWxsICwKICAgICAgICAgICAg ICAgICAgICAgICAgd2NoYXJfdCAqczUgPSBfX251bGwgLAogICAgICAgICAgICAgICAgICAgICAg ICB3Y2hhcl90ICpzNiA9IF9fbnVsbCAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3Qg KnM3ID0gX19udWxsICwKICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCAqczggPSBfX251 bGwgLAogICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90ICpzOSA9IF9fbnVsbCApCiAgICB7 CiAgICAgICAgaWYgKCEgZXJyb3IpCiAgICAgICAgICAgIGVycm9yID0gbmV3IFNlbWFudGljRXJy b3IoY29udHJvbCwgc291cmNlX2ZpbGVfc3ltYm9sKTsKICAgICAgICBlcnJvciAtPiBSZXBvcnQo a2luZCwgbHRvaywgcnRvaywgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4LCBzOSk7CiAg ICB9CgogICAgaW50IE51bUVycm9ycygpIHsgcmV0dXJuIChlcnJvciA/IGVycm9yIC0+IG51bV9l cnJvcnMgOiAwKTsgfQoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIHZvaWQgUHJp bnRNZXNzYWdlcygpCiAgICB7CiAgICAgICAgaWYgKHRoaXMgIT0gY29udHJvbC5zeXN0ZW1fc2Vt YW50aWMpCiAgICAgICAgewogICAgICAgICAgICBpZiAobGV4X3N0cmVhbSAtPiBOdW1CYWRUb2tl bnMoKSA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxleF9zdHJlYW0gLT4gUHJp bnRNZXNzYWdlcygpOwogICAgICAgICAgICAgICAgcmV0dXJuX2NvZGUgPSAxOwogICAgICAgICAg ICB9CgogICAgICAgICAgICBpZiAoKCEgY29tcGlsYXRpb25fdW5pdCkgfHwgY29tcGlsYXRpb25f dW5pdCAtPiBCYWRDb21waWxhdGlvblVuaXRDYXN0KCkpCiAgICAgICAgICAgIHsKICAgICAgICAg ICAgICAgIERpYWdub3NlUGFyc2VyICpkaWFnbm9zZV9wYXJzZXIgPSBuZXcgRGlhZ25vc2VQYXJz ZXIoY29udHJvbCwgbGV4X3N0cmVhbSk7CiAgICAgICAgICAgICAgICByZXR1cm5fY29kZSA9IDE7 CiAgICAgICAgICAgICAgICBkZWxldGUgZGlhZ25vc2VfcGFyc2VyOwogICAgICAgICAgICB9Cgog ICAgICAgICAgICBpZiAoISBjb250cm9sLm9wdGlvbi5ub2NsZWFudXApCiAgICAgICAgICAgIGlm IChjb21waWxhdGlvbl91bml0KQogICAgICAgICAgICAgICAgQ2xlYW5VcCgpOwogICAgICAgIH0K CiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yIC0+IGVycm9yLkxlbmd0aCgpID4gMCAmJiBlcnJv ciAtPiBQcmludE1lc3NhZ2VzKCkgPiByZXR1cm5fY29kZSkKICAgICAgICAgICAgcmV0dXJuX2Nv ZGUgPSAxOwoKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICBkZWxldGUgZXJy b3I7CiAgICAgICAgZXJyb3IgPSBfX251bGwgOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAg VHlwZVN5bWJvbCAqUHJvY2Vzc1NpZ25hdHVyZShUeXBlU3ltYm9sICosIGNvbnN0IGNoYXIgKiwg TGV4U3RyZWFtOjpUb2tlbkluZGV4KTsKICAgIFR5cGVTeW1ib2wgKlJlYWRUeXBlKEZpbGVTeW1i b2wgKiwgUGFja2FnZVN5bWJvbCAqLCBOYW1lU3ltYm9sICosIExleFN0cmVhbTo6VG9rZW5JbmRl eCk7CiAgICBUeXBlU3ltYm9sICpSZWFkVHlwZUZyb21TaWduYXR1cmUoVHlwZVN5bWJvbCAqLCBj b25zdCBjaGFyICosIGludCwgTGV4U3RyZWFtOjpUb2tlbkluZGV4KTsKICAgIFR5cGVTeW1ib2wg KlByb2Nlc3NOZXN0ZWRUeXBlKFR5cGVTeW1ib2wgKiwgTmFtZVN5bWJvbCAqLCBMZXhTdHJlYW06 OlRva2VuSW5kZXgpOwoKcHJpdmF0ZToKICAgIGVudW0KICAgIHsKICAgICAgICBJTlRfU0hJRlRf TUFTSyA9IDB4MWYsCiAgICAgICAgTE9OR19TSElGVF9NQVNLID0gMHgzZgogICAgfTsKCiAgICBT ZW1hbnRpY0Vycm9yICplcnJvcjsKCiAgICB2b2lkIENsZWFuVXAoKTsKICAgIHZvaWQgQ2xlYW5V cFR5cGUoVHlwZVN5bWJvbCAqKTsKCiAgICB2b2lkIFNldERlZmF1bHRTdXBlclR5cGUoQXN0Q2xh c3NEZWNsYXJhdGlvbiAqKTsKICAgIHZvaWQgU2V0RGVmYXVsdFN1cGVyVHlwZShBc3RJbnRlcmZh Y2VEZWNsYXJhdGlvbiAqKTsKICAgIHZvaWQgUHJvY2Vzc1R5cGVIZWFkZXIoQXN0Q2xhc3NEZWNs YXJhdGlvbiAqKTsKICAgIHZvaWQgTWFya0NpcmN1bGFyTmVzdChUeXBlU3ltYm9sICopOwogICAg dm9pZCBQcm9jZXNzU3VwZXJUeXBlc09mT3V0ZXJUeXBlKFR5cGVTeW1ib2wgKik7CiAgICB2b2lk IFByb2Nlc3NTdXBlclR5cGVzT2ZJbm5lclR5cGUoVHlwZVN5bWJvbCAqLCBUdXBsZTxUeXBlU3lt Ym9sICo+ICYpOwogICAgdm9pZCBQcm9jZXNzVHlwZUhlYWRlcnMoQXN0Q2xhc3NEZWNsYXJhdGlv biAqKTsKICAgIFR5cGVTeW1ib2wgKkZpbmRUeXBlSW5MYXllcihBc3QgKiwgU3ltYm9sU2V0ICYp OwogICAgdm9pZCBQcm9jZXNzTmVzdGVkU3VwZXJUeXBlcyhUeXBlU3ltYm9sICopOwogICAgdm9p ZCBQcm9jZXNzTmVzdGVkVHlwZUhlYWRlcnMoVHlwZVN5bWJvbCAqLCBBc3RDbGFzc0JvZHkgKik7 CiAgICB2b2lkIFByb2Nlc3NUeXBlSGVhZGVyKEFzdEludGVyZmFjZURlY2xhcmF0aW9uICopOwog ICAgdm9pZCBQcm9jZXNzVHlwZUhlYWRlcnMoQXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gKik7CiAg ICB2b2lkIFByb2Nlc3NOZXN0ZWRUeXBlSGVhZGVycyhBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiAq KTsKICAgIHZvaWQgUHJvY2Vzc0NvbnN0cnVjdG9yTWVtYmVycyhBc3RDbGFzc0JvZHkgKik7CiAg ICB2b2lkIFByb2Nlc3NNZXRob2RNZW1iZXJzKEFzdENsYXNzQm9keSAqKTsKICAgIHZvaWQgUHJv Y2Vzc0ZpZWxkTWVtYmVycyhBc3RDbGFzc0JvZHkgKik7CiAgICB2b2lkIFByb2Nlc3NNZW1iZXJz KFNlbWFudGljRW52aXJvbm1lbnQgKiwgQXN0Q2xhc3NCb2R5ICopOwogICAgdm9pZCBDb21wbGV0 ZVN5bWJvbFRhYmxlKFNlbWFudGljRW52aXJvbm1lbnQgKiwgTGV4U3RyZWFtOjpUb2tlbkluZGV4 LCBBc3RDbGFzc0JvZHkgKik7CiAgICB2b2lkIFByb2Nlc3NFeGVjdXRhYmxlQm9kaWVzKFNlbWFu dGljRW52aXJvbm1lbnQgKiwgQXN0Q2xhc3NCb2R5ICopOwogICAgdm9pZCBQcm9jZXNzRXhlY3V0 YWJsZUJvZGllcyhBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiAqKTsKCiAgICB2b2lkIFByb2Nlc3NN ZXRob2RNZW1iZXJzKEFzdEludGVyZmFjZURlY2xhcmF0aW9uICopOwogICAgdm9pZCBQcm9jZXNz RmllbGRNZW1iZXJzKEFzdEludGVyZmFjZURlY2xhcmF0aW9uICopOwogICAgdm9pZCBQcm9jZXNz TWVtYmVycyhBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiAqKTsKICAgIHZvaWQgQ29tcGxldGVTeW1i b2xUYWJsZShBc3RJbnRlcmZhY2VEZWNsYXJhdGlvbiAqKTsKCiAgICBmcmllbmQgY2xhc3MgVHlw ZVN5bWJvbDsKCiAgICBUdXBsZTxTeW1ib2wgKj4gaW1wb3J0X29uX2RlbWFuZF9wYWNrYWdlczsK ICAgIFR1cGxlPFR5cGVTeW1ib2wgKj4gc2luZ2xlX3R5cGVfaW1wb3J0czsKCiAgICAgCiAgICAg CiAgICAgCiAgICBQYWNrYWdlU3ltYm9sICAqdGhpc19wYWNrYWdlOwoKICAgIFR5cGVTeW1ib2wg KlRoaXNUeXBlKCkgICAgICAgICAgICAgICAgICAgICAgICB7IChzdGF0aWNfY2FzdDx2b2lkPiAg KCggc3RhdGVfc3RhY2suU2l6ZSgpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJzdGF0ZV9zdGFj ay5TaXplKCkiICwgIi4uLy4uL2ppa2VzL3NyYy9zZW1hbnRpYy5oIiwgOTI2LCBfX1BSRVRUWV9G VU5DVElPTl9fICksIDApKSkgOyByZXR1cm4gc3RhdGVfc3RhY2suVG9wKCkgLT4gVHlwZSgpOyB9 CiAgICBNZXRob2RTeW1ib2wgKiZUaGlzTWV0aG9kKCkgICAgICAgICAgICAgICAgICAgeyAoc3Rh dGljX2Nhc3Q8dm9pZD4gICgoIHN0YXRlX3N0YWNrLlNpemUoKSApID8gMCA6CShfX2Fzc2VydF9m YWlsICgic3RhdGVfc3RhY2suU2l6ZSgpIiAsICIuLi8uLi9qaWtlcy9zcmMvc2VtYW50aWMuaCIs IDkyNywgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsgcmV0dXJuIHN0YXRlX3N0YWNrLlRv cCgpIC0+IHRoaXNfbWV0aG9kOyB9CiAgICBWYXJpYWJsZVN5bWJvbCAqJlRoaXNWYXJpYWJsZSgp ICAgICAgICAgICAgICAgeyAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIHN0YXRlX3N0YWNrLlNpemUo KSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgic3RhdGVfc3RhY2suU2l6ZSgpIiAsICIuLi8uLi9q aWtlcy9zcmMvc2VtYW50aWMuaCIsIDkyOCwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsg cmV0dXJuIHN0YXRlX3N0YWNrLlRvcCgpIC0+IHRoaXNfdmFyaWFibGU7IH0KICAgIEFzdCAqJkV4 cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKCkgICAgICAgICB7IChzdGF0aWNfY2FzdDx2b2lk PiAgKCggc3RhdGVfc3RhY2suU2l6ZSgpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJzdGF0ZV9z dGFjay5TaXplKCkiICwgIi4uLy4uL2ppa2VzL3NyYy9zZW1hbnRpYy5oIiwgOTI5LCBfX1BSRVRU WV9GVU5DVElPTl9fICksIDApKSkgOyByZXR1cm4gc3RhdGVfc3RhY2suVG9wKCkgLT4gZXhwbGlj aXRfY29uc3RydWN0b3JfaW52b2NhdGlvbjsgfQogICAgU3ltYm9sVGFibGVTdGFjayAmTG9jYWxT eW1ib2xUYWJsZSgpICAgICAgICAgIHsgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBzdGF0ZV9zdGFj ay5TaXplKCkgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInN0YXRlX3N0YWNrLlNpemUoKSIgLCAi Li4vLi4vamlrZXMvc3JjL3NlbWFudGljLmgiLCA5MzAsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwg MCkpKSA7IHJldHVybiBzdGF0ZV9zdGFjay5Ub3AoKSAtPiBzeW1ib2xfdGFibGU7IH0KICAgIEV4 Y2VwdGlvblRhYmxlU3RhY2sgJlRyeUV4Y2VwdGlvblRhYmxlU3RhY2soKSB7IChzdGF0aWNfY2Fz dDx2b2lkPiAgKCggc3RhdGVfc3RhY2suU2l6ZSgpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJz dGF0ZV9zdGFjay5TaXplKCkiICwgIi4uLy4uL2ppa2VzL3NyYy9zZW1hbnRpYy5oIiwgOTMxLCBf X1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOyByZXR1cm4gc3RhdGVfc3RhY2suVG9wKCkgLT4g dHJ5X2V4Y2VwdGlvbl90YWJsZV9zdGFjazsgfQogICAgU3RhdGVtZW50U3RhY2sgJlRyeVN0YXRl bWVudFN0YWNrKCkgICAgICAgICAgIHsgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBzdGF0ZV9zdGFj ay5TaXplKCkgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInN0YXRlX3N0YWNrLlNpemUoKSIgLCAi Li4vLi4vamlrZXMvc3JjL3NlbWFudGljLmgiLCA5MzIsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwg MCkpKSA7IHJldHVybiBzdGF0ZV9zdGFjay5Ub3AoKSAtPiB0cnlfc3RhdGVtZW50X3N0YWNrOyB9 CiAgICBTdGF0ZW1lbnRTdGFjayAmQnJlYWthYmxlU3RhdGVtZW50U3RhY2soKSAgICAgeyAoc3Rh dGljX2Nhc3Q8dm9pZD4gICgoIHN0YXRlX3N0YWNrLlNpemUoKSApID8gMCA6CShfX2Fzc2VydF9m YWlsICgic3RhdGVfc3RhY2suU2l6ZSgpIiAsICIuLi8uLi9qaWtlcy9zcmMvc2VtYW50aWMuaCIs IDkzMywgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsgcmV0dXJuIHN0YXRlX3N0YWNrLlRv cCgpIC0+IGJyZWFrYWJsZV9zdGF0ZW1lbnRfc3RhY2s7IH0KICAgIFN0YXRlbWVudFN0YWNrICZD b250aW51YWJsZVN0YXRlbWVudFN0YWNrKCkgICB7IChzdGF0aWNfY2FzdDx2b2lkPiAgKCggc3Rh dGVfc3RhY2suU2l6ZSgpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJzdGF0ZV9zdGFjay5TaXpl KCkiICwgIi4uLy4uL2ppa2VzL3NyYy9zZW1hbnRpYy5oIiwgOTM0LCBfX1BSRVRUWV9GVU5DVElP Tl9fICksIDApKSkgOyByZXR1cm4gc3RhdGVfc3RhY2suVG9wKCkgLT4gY29udGludWFibGVfc3Rh dGVtZW50X3N0YWNrOyB9CiAgICBCbG9ja1N0YWNrICZMb2NhbEJsb2NrU3RhY2soKSAgICAgICAg ICAgICAgICAgeyAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIHN0YXRlX3N0YWNrLlNpemUoKSApID8g MCA6CShfX2Fzc2VydF9mYWlsICgic3RhdGVfc3RhY2suU2l6ZSgpIiAsICIuLi8uLi9qaWtlcy9z cmMvc2VtYW50aWMuaCIsIDkzNSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsgcmV0dXJu IHN0YXRlX3N0YWNrLlRvcCgpIC0+IGJsb2NrX3N0YWNrOyB9CiAgICBTZW1hbnRpY0Vudmlyb25t ZW50ICpHZXRFbnZpcm9ubWVudChBc3QgKmFzdCkgeyAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIHN0 YXRlX3N0YWNrLlNpemUoKSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgic3RhdGVfc3RhY2suU2l6 ZSgpIiAsICIuLi8uLi9qaWtlcy9zcmMvc2VtYW50aWMuaCIsIDkzNiwgX19QUkVUVFlfRlVOQ1RJ T05fXyApLCAwKSkpIDsgcmV0dXJuIHN0YXRlX3N0YWNrLlRvcCgpIC0+IEdldEVudmlyb25tZW50 KGFzdCk7IH0KICAgIGJvb2wgU3RhdGljUmVnaW9uKCkgICAgICAgICAgICAgICAgICAgICAgICAg ICB7IChzdGF0aWNfY2FzdDx2b2lkPiAgKCggc3RhdGVfc3RhY2suU2l6ZSgpICkgPyAwIDoJKF9f YXNzZXJ0X2ZhaWwgKCJzdGF0ZV9zdGFjay5TaXplKCkiICwgIi4uLy4uL2ppa2VzL3NyYy9zZW1h bnRpYy5oIiwgOTM3LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOyByZXR1cm4gc3RhdGVf c3RhY2suVG9wKCkgLT4gU3RhdGljUmVnaW9uKCk7IH0KCiAgICBTZW1hbnRpY0Vudmlyb25tZW50 U3RhY2sgc3RhdGVfc3RhY2s7CgogICAgQml0U2V0ICpkZWZpbml0ZWx5X2Fzc2lnbmVkX3Zhcmlh YmxlcywKICAgICAgICAgICAqcG9zc2libHlfYXNzaWduZWRfZmluYWxzLAogICAgICAgICAgICp1 bml2ZXJzZTsKICAgIERlZmluaXRlQmxvY2tTdGFjayAqZGVmaW5pdGVfYmxvY2tfc3RhY2s7CiAg ICBEZWZpbml0ZVRyeVN0YWNrICpkZWZpbml0ZV90cnlfc3RhY2s7CiAgICBEZWZpbml0ZUZpbmFs QXNzaWdubWVudFN0YWNrICpkZWZpbml0ZV9maW5hbF9hc3NpZ25tZW50X3N0YWNrOwogICAgU3lt Ym9sU2V0ICpkZWZpbml0ZV92aXNpYmxlX3ZhcmlhYmxlczsKCiAgICBib29sIElzSW50VmFsdWVS ZXByZXNlbnRhYmxlSW5UeXBlKEFzdEV4cHJlc3Npb24gKiwgVHlwZVN5bWJvbCAqKTsKCiAgICB2 b2lkIENoZWNrQ2xhc3NNZW1iZXJzKFR5cGVTeW1ib2wgKiwgQXN0Q2xhc3NCb2R5ICopOwogICAg dm9pZCBDaGVja05lc3RlZFR5cGVEdXBsaWNhdGlvbihTZW1hbnRpY0Vudmlyb25tZW50ICosIExl eFN0cmVhbTo6VG9rZW5JbmRleCk7CiAgICBUeXBlU3ltYm9sICpQcm9jZXNzTmVzdGVkQ2xhc3NO YW1lKFR5cGVTeW1ib2wgKiwgQXN0Q2xhc3NEZWNsYXJhdGlvbiAqKTsKICAgIHZvaWQgQ2hlY2tJ bnRlcmZhY2VNZW1iZXJzKFR5cGVTeW1ib2wgKiwgQXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gKik7 CiAgICBUeXBlU3ltYm9sICpQcm9jZXNzTmVzdGVkSW50ZXJmYWNlTmFtZShUeXBlU3ltYm9sICos IEFzdEludGVyZmFjZURlY2xhcmF0aW9uICopOwogICAgVHlwZVN5bWJvbCAqRmluZFR5cGVJblNo YWRvdyhUeXBlU2hhZG93U3ltYm9sICosIExleFN0cmVhbTo6VG9rZW5JbmRleCk7CiAgICB2b2lk IFJlcG9ydFR5cGVJbmFjY2Vzc2libGUoTGV4U3RyZWFtOjpUb2tlbkluZGV4LCBMZXhTdHJlYW06 OlRva2VuSW5kZXgsIFR5cGVTeW1ib2wgKik7CiAgICB2b2lkIFJlcG9ydFR5cGVJbmFjY2Vzc2li bGUoQXN0ICphc3QsIFR5cGVTeW1ib2wgKnR5cGUpIHsgUmVwb3J0VHlwZUluYWNjZXNzaWJsZShh c3QgLT4gTGVmdFRva2VuKCksIGFzdCAtPiBSaWdodFRva2VuKCksIHR5cGUpOyB9CiAgICBUeXBl U3ltYm9sICpHZXRCYWROZXN0ZWRUeXBlKFR5cGVTeW1ib2wgKiwgTGV4U3RyZWFtOjpUb2tlbklu ZGV4KTsKICAgIFR5cGVTeW1ib2wgKkZpbmROZXN0ZWRUeXBlKFR5cGVTeW1ib2wgKiwgTGV4U3Ry ZWFtOjpUb2tlbkluZGV4KTsKICAgIFR5cGVTeW1ib2wgKk11c3RGaW5kTmVzdGVkVHlwZShUeXBl U3ltYm9sICosIEFzdCAqKTsKICAgIHZvaWQgUHJvY2Vzc0ltcG9ydFF1YWxpZmllZE5hbWUoQXN0 RXhwcmVzc2lvbiAqKTsKICAgIHZvaWQgUHJvY2Vzc1BhY2thZ2VPclR5cGUoQXN0RXhwcmVzc2lv biAqKTsKICAgIHZvaWQgUHJvY2Vzc1R5cGVJbXBvcnRPbkRlbWFuZERlY2xhcmF0aW9uKEFzdElt cG9ydERlY2xhcmF0aW9uICopOwogICAgQXN0RXhwcmVzc2lvbiAqRmluZEZpcnN0VHlwZShBc3Qg Kik7CiAgICBUeXBlU3ltYm9sICpGaW5kU2ltcGxlTmFtZVR5cGUoUGFja2FnZVN5bWJvbCAqLCBM ZXhTdHJlYW06OlRva2VuSW5kZXgpOwogICAgdm9pZCBQcm9jZXNzU2luZ2xlVHlwZUltcG9ydERl Y2xhcmF0aW9uKEFzdEltcG9ydERlY2xhcmF0aW9uICopOwogICAgQWNjZXNzRmxhZ3MgUHJvY2Vz c0NsYXNzTW9kaWZpZXJzKEFzdENsYXNzRGVjbGFyYXRpb24gKik7CiAgICBBY2Nlc3NGbGFncyBQ cm9jZXNzTG9jYWxDbGFzc01vZGlmaWVycyhBc3RDbGFzc0RlY2xhcmF0aW9uICopOwogICAgQWNj ZXNzRmxhZ3MgUHJvY2Vzc05lc3RlZENsYXNzTW9kaWZpZXJzKEFzdENsYXNzRGVjbGFyYXRpb24g Kik7CiAgICBBY2Nlc3NGbGFncyBQcm9jZXNzU3RhdGljTmVzdGVkQ2xhc3NNb2RpZmllcnMoQXN0 Q2xhc3NEZWNsYXJhdGlvbiAqKTsKICAgIEFjY2Vzc0ZsYWdzIFByb2Nlc3NJbnRlcmZhY2VNb2Rp ZmllcnMoQXN0SW50ZXJmYWNlRGVjbGFyYXRpb24gKik7CiAgICBBY2Nlc3NGbGFncyBQcm9jZXNz TmVzdGVkSW50ZXJmYWNlTW9kaWZpZXJzKEFzdEludGVyZmFjZURlY2xhcmF0aW9uICopOwogICAg QWNjZXNzRmxhZ3MgUHJvY2Vzc1N0YXRpY05lc3RlZEludGVyZmFjZU1vZGlmaWVycyhBc3RJbnRl cmZhY2VEZWNsYXJhdGlvbiAqKTsKICAgIEFjY2Vzc0ZsYWdzIFByb2Nlc3NGaWVsZE1vZGlmaWVy cyhBc3RGaWVsZERlY2xhcmF0aW9uICopOwogICAgQWNjZXNzRmxhZ3MgUHJvY2Vzc0xvY2FsTW9k aWZpZXJzKEFzdExvY2FsVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCAqKTsKICAgIEFjY2Vz c0ZsYWdzIFByb2Nlc3NGb3JtYWxNb2RpZmllcnMoQXN0Rm9ybWFsUGFyYW1ldGVyICopOwogICAg QWNjZXNzRmxhZ3MgUHJvY2Vzc01ldGhvZE1vZGlmaWVycyhBc3RNZXRob2REZWNsYXJhdGlvbiAq KTsKICAgIEFjY2Vzc0ZsYWdzIFByb2Nlc3NDb25zdHJ1Y3Rvck1vZGlmaWVycyhBc3RDb25zdHJ1 Y3RvckRlY2xhcmF0aW9uICopOwogICAgQWNjZXNzRmxhZ3MgUHJvY2Vzc0NvbnN0YW50TW9kaWZp ZXJzKEFzdEZpZWxkRGVjbGFyYXRpb24gKik7CiAgICBBY2Nlc3NGbGFncyBQcm9jZXNzSW50ZXJm YWNlTWV0aG9kTW9kaWZpZXJzKEFzdE1ldGhvZERlY2xhcmF0aW9uICopOwogICAgdm9pZCBBZGRE ZWZhdWx0Q29uc3RydWN0b3IoVHlwZVN5bWJvbCAqKTsKICAgIHZvaWQgUHJvY2Vzc0NvbnN0cnVj dG9yRGVjbGFyYXRpb24oQXN0Q29uc3RydWN0b3JEZWNsYXJhdGlvbiAqKTsKICAgIHZvaWQgUHJv Y2Vzc01ldGhvZERlY2xhcmF0aW9uKEFzdE1ldGhvZERlY2xhcmF0aW9uICopOwogICAgdm9pZCBQ cm9jZXNzRmllbGREZWNsYXJhdGlvbihBc3RGaWVsZERlY2xhcmF0aW9uICopOwogICAgdm9pZCBQ cm9jZXNzRm9ybWFsUGFyYW1ldGVycyhCbG9ja1N5bWJvbCAqLCBBc3RNZXRob2REZWNsYXJhdG9y ICopOwogICAgVHlwZVN5bWJvbCAqSW1wb3J0VHlwZShMZXhTdHJlYW06OlRva2VuSW5kZXgsIE5h bWVTeW1ib2wgKik7CiAgICBUeXBlU3ltYm9sICpGaW5kUHJpbWl0aXZlVHlwZShBc3RQcmltaXRp dmVUeXBlICopOwogICAgVHlwZVN5bWJvbCAqRmluZFR5cGVJbkVudmlyb25tZW50KFNlbWFudGlj RW52aXJvbm1lbnQgKiwgTmFtZVN5bWJvbCAqKTsKICAgIFR5cGVTeW1ib2wgKkZpbmRUeXBlKExl eFN0cmVhbTo6VG9rZW5JbmRleCk7CiAgICBUeXBlU3ltYm9sICpNdXN0RmluZFR5cGUoQXN0ICop OwogICAgdm9pZCBQcm9jZXNzSW50ZXJmYWNlKFR5cGVTeW1ib2wgKiwgQXN0RXhwcmVzc2lvbiAq KTsKCiAgICB2b2lkIEluaXRpYWxpemVWYXJpYWJsZShBc3RGaWVsZERlY2xhcmF0aW9uICosIFR1 cGxlPFZhcmlhYmxlU3ltYm9sICo+ICYpOwogICAgdm9pZCBQcm9jZXNzSW5pdGlhbGl6ZXIoQXN0 QmxvY2sgKiwgQXN0QmxvY2sgKiwgTWV0aG9kU3ltYm9sICosIFR1cGxlPFZhcmlhYmxlU3ltYm9s ICo+ICYpOwogICAgYm9vbCBOZWVkc0luaXRpYWxpemF0aW9uTWV0aG9kKEFzdEZpZWxkRGVjbGFy YXRpb24gKik7CiAgICB2b2lkIFByb2Nlc3NTdGF0aWNJbml0aWFsaXplcnMoQXN0Q2xhc3NCb2R5 ICopOwogICAgdm9pZCBQcm9jZXNzQmxvY2tJbml0aWFsaXplcnMoQXN0Q2xhc3NCb2R5ICopOwoK ICAgIGJvb2wgQ2FuV2lkZW5pbmdQcmltaXRpdmVDb252ZXJ0KFR5cGVTeW1ib2wgKiwgVHlwZVN5 bWJvbCAqKTsKICAgIGJvb2wgQ2FuTmFycm93aW5nUHJpbWl0aXZlQ29udmVydChUeXBlU3ltYm9s ICosIFR5cGVTeW1ib2wgKik7CiAgICBib29sIENhbkNhc3RDb252ZXJ0KFR5cGVTeW1ib2wgKiwg VHlwZVN5bWJvbCAqLCBMZXhTdHJlYW06OlRva2VuSW5kZXgpOwogICAgYm9vbCBDYW5NZXRob2RJ bnZvY2F0aW9uQ29udmVydChUeXBlU3ltYm9sICosIFR5cGVTeW1ib2wgKik7CiAgICBib29sIENh bkFzc2lnbm1lbnRDb252ZXJ0KFR5cGVTeW1ib2wgKiwgQXN0RXhwcmVzc2lvbiAqKTsKICAgIGJv b2wgQ2FuQXNzaWdubWVudENvbnZlcnRSZWZlcmVuY2UoVHlwZVN5bWJvbCAqLCBUeXBlU3ltYm9s ICopOwogICAgTGl0ZXJhbFZhbHVlICpDYXN0UHJpbWl0aXZlVmFsdWUoVHlwZVN5bWJvbCAqLCBB c3RFeHByZXNzaW9uICopOwogICAgTGl0ZXJhbFZhbHVlICpDYXN0VmFsdWUoVHlwZVN5bWJvbCAq LCBBc3RFeHByZXNzaW9uICopOwogICAgQXN0RXhwcmVzc2lvbiAqQ29udmVydFRvVHlwZShBc3RF eHByZXNzaW9uICosIFR5cGVTeW1ib2wgKik7CiAgICBBc3RFeHByZXNzaW9uICpQcm9tb3RlVW5h cnlOdW1lcmljRXhwcmVzc2lvbihBc3RFeHByZXNzaW9uICopOwogICAgdm9pZCBCaW5hcnlOdW1l cmljUHJvbW90aW9uKEFzdEFzc2lnbm1lbnRFeHByZXNzaW9uICopOwogICAgdm9pZCBCaW5hcnlO dW1lcmljUHJvbW90aW9uKEFzdEJpbmFyeUV4cHJlc3Npb24gKik7CiAgICB2b2lkIEJpbmFyeU51 bWVyaWNQcm9tb3Rpb24oQXN0Q29uZGl0aW9uYWxFeHByZXNzaW9uICopOwoKICAgIHZvaWQgKFNl bWFudGljOjoqRGVmaW5pdGVTdG10W0FzdDo6X251bV9raW5kc10pKEFzdCAqKTsKICAgIGlubGlu ZSB2b2lkIERlZmluaXRlU3RhdGVtZW50KEFzdCAqKTsKCiAgICB2b2lkIERlZmluaXRlTG9vcEJv ZHkoQXN0U3RhdGVtZW50ICopOwoKICAgIHZvaWQgRGVmaW5pdGVCbG9jayhBc3QgKik7CiAgICB2 b2lkIERlZmluaXRlTG9jYWxWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KEFzdCAqKTsKICAg IHZvaWQgRGVmaW5pdGVFeHByZXNzaW9uU3RhdGVtZW50KEFzdCAqKTsKICAgIHZvaWQgRGVmaW5p dGVTeW5jaHJvbml6ZWRTdGF0ZW1lbnQoQXN0ICopOwogICAgdm9pZCBEZWZpbml0ZUlmU3RhdGVt ZW50KEFzdCAqKTsKICAgIHZvaWQgRGVmaW5pdGVXaGlsZVN0YXRlbWVudChBc3QgKik7CiAgICB2 b2lkIERlZmluaXRlRm9yU3RhdGVtZW50KEFzdCAqKTsKICAgIHZvaWQgRGVmaW5pdGVTd2l0Y2hT dGF0ZW1lbnQoQXN0ICopOwogICAgdm9pZCBEZWZpbml0ZURvU3RhdGVtZW50KEFzdCAqKTsKICAg IHZvaWQgRGVmaW5pdGVCcmVha1N0YXRlbWVudChBc3QgKik7CiAgICB2b2lkIERlZmluaXRlQ29u dGludWVTdGF0ZW1lbnQoQXN0ICopOwogICAgdm9pZCBEZWZpbml0ZVJldHVyblN0YXRlbWVudChB c3QgKik7CiAgICB2b2lkIERlZmluaXRlVGhyb3dTdGF0ZW1lbnQoQXN0ICopOwogICAgdm9pZCBE ZWZpbml0ZVRyeVN0YXRlbWVudChBc3QgKik7CiAgICB2b2lkIERlZmluaXRlRW1wdHlTdGF0ZW1l bnQoQXN0ICopOwogICAgdm9pZCBEZWZpbml0ZUNsYXNzRGVjbGFyYXRpb24oQXN0ICopOwoKICAg IFZhcmlhYmxlU3ltYm9sICpEZWZpbml0ZUZpbmFsKEFzdEZpZWxkQWNjZXNzICopOwoKICAgIERl ZmluaXRlQXNzaWdubWVudFNldCAqKFNlbWFudGljOjoqRGVmaW5pdGVFeHByW0FzdDo6X251bV9l eHByZXNzaW9uX2tpbmRzXSkoQXN0RXhwcmVzc2lvbiAqLCBCaXRTZXQgJik7CiAgICBEZWZpbml0 ZUFzc2lnbm1lbnRTZXQgKkRlZmluaXRlU2ltcGxlTmFtZShBc3RFeHByZXNzaW9uICosIEJpdFNl dCAmKTsKICAgIERlZmluaXRlQXNzaWdubWVudFNldCAqRGVmaW5pdGVBcnJheUFjY2VzcyhBc3RF eHByZXNzaW9uICosIEJpdFNldCAmKTsKICAgIERlZmluaXRlQXNzaWdubWVudFNldCAqRGVmaW5p dGVNZXRob2RJbnZvY2F0aW9uKEFzdEV4cHJlc3Npb24gKiwgQml0U2V0ICYpOwogICAgRGVmaW5p dGVBc3NpZ25tZW50U2V0ICpEZWZpbml0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24o QXN0RXhwcmVzc2lvbiAqLCBCaXRTZXQgJik7CiAgICBEZWZpbml0ZUFzc2lnbm1lbnRTZXQgKkRl ZmluaXRlQXJyYXlDcmVhdGlvbkV4cHJlc3Npb24oQXN0RXhwcmVzc2lvbiAqLCBCaXRTZXQgJik7 CiAgICBEZWZpbml0ZUFzc2lnbm1lbnRTZXQgKkRlZmluaXRlUHJlVW5hcnlFeHByZXNzaW9uKEFz dEV4cHJlc3Npb24gKiwgQml0U2V0ICYpOwogICAgRGVmaW5pdGVBc3NpZ25tZW50U2V0ICpEZWZp bml0ZVBvc3RVbmFyeUV4cHJlc3Npb24oQXN0RXhwcmVzc2lvbiAqLCBCaXRTZXQgJik7CiAgICBE ZWZpbml0ZUFzc2lnbm1lbnRTZXQgKkRlZmluaXRlQmluYXJ5RXhwcmVzc2lvbihBc3RFeHByZXNz aW9uICosIEJpdFNldCAmKTsKICAgIERlZmluaXRlQXNzaWdubWVudFNldCAqRGVmaW5pdGVDb25k aXRpb25hbEV4cHJlc3Npb24oQXN0RXhwcmVzc2lvbiAqLCBCaXRTZXQgJik7CiAgICBEZWZpbml0 ZUFzc2lnbm1lbnRTZXQgKkRlZmluaXRlQXNzaWdubWVudEV4cHJlc3Npb24oQXN0RXhwcmVzc2lv biAqLCBCaXRTZXQgJik7CiAgICBEZWZpbml0ZUFzc2lnbm1lbnRTZXQgKkRlZmluaXRlRGVmYXVs dEV4cHJlc3Npb24oQXN0RXhwcmVzc2lvbiAqLCBCaXRTZXQgJik7CiAgICBEZWZpbml0ZUFzc2ln bm1lbnRTZXQgKkRlZmluaXRlRmllbGRBY2Nlc3MoQXN0RXhwcmVzc2lvbiAqLCBCaXRTZXQgJik7 CiAgICBEZWZpbml0ZUFzc2lnbm1lbnRTZXQgKkRlZmluaXRlUGFyZW50aGVzaXplZEV4cHJlc3Np b24oQXN0RXhwcmVzc2lvbiAqLCBCaXRTZXQgJik7CiAgICBEZWZpbml0ZUFzc2lnbm1lbnRTZXQg KkRlZmluaXRlQ2FzdEV4cHJlc3Npb24oQXN0RXhwcmVzc2lvbiAqLCBCaXRTZXQgJik7CiAgICBE ZWZpbml0ZUFzc2lnbm1lbnRTZXQgKkRlZmluaXRlRXhwcmVzc2lvbihBc3RFeHByZXNzaW9uICos IEJpdFNldCAmKTsKCiAgICBEZWZpbml0ZUFzc2lnbm1lbnRTZXQgKihTZW1hbnRpYzo6KkRlZmlu aXRlUHJlVW5hcnlFeHByW0FzdFByZVVuYXJ5RXhwcmVzc2lvbjo6X251bV9raW5kc10pKEFzdEV4 cHJlc3Npb24gKiwgQml0U2V0ICYpOwogICAgRGVmaW5pdGVBc3NpZ25tZW50U2V0ICpEZWZpbml0 ZURlZmF1bHRQcmVVbmFyeUV4cHJlc3Npb24oQXN0RXhwcmVzc2lvbiAqLCBCaXRTZXQgJik7CiAg ICBEZWZpbml0ZUFzc2lnbm1lbnRTZXQgKkRlZmluaXRlTk9UKEFzdEV4cHJlc3Npb24gKiwgQml0 U2V0ICYpOwogICAgRGVmaW5pdGVBc3NpZ25tZW50U2V0ICpEZWZpbml0ZVBMVVNQTFVTT3JNSU5V U01JTlVTKEFzdEV4cHJlc3Npb24gKiwgQml0U2V0ICYpOwoKICAgIERlZmluaXRlQXNzaWdubWVu dFNldCAqKFNlbWFudGljOjoqRGVmaW5pdGVCaW5hcnlFeHByW0FzdEJpbmFyeUV4cHJlc3Npb246 Ol9udW1fa2luZHNdKShBc3RCaW5hcnlFeHByZXNzaW9uICosIEJpdFNldCAmKTsKICAgIERlZmlu aXRlQXNzaWdubWVudFNldCAqRGVmaW5pdGVEZWZhdWx0QmluYXJ5RXhwcmVzc2lvbihBc3RCaW5h cnlFeHByZXNzaW9uICosIEJpdFNldCAmKTsKICAgIERlZmluaXRlQXNzaWdubWVudFNldCAqRGVm aW5pdGVBTkQoQXN0QmluYXJ5RXhwcmVzc2lvbiAqLCBCaXRTZXQgJik7CiAgICBEZWZpbml0ZUFz c2lnbm1lbnRTZXQgKkRlZmluaXRlSU9SKEFzdEJpbmFyeUV4cHJlc3Npb24gKiwgQml0U2V0ICYp OwogICAgRGVmaW5pdGVBc3NpZ25tZW50U2V0ICpEZWZpbml0ZVhPUihBc3RCaW5hcnlFeHByZXNz aW9uICosIEJpdFNldCAmKTsKICAgIERlZmluaXRlQXNzaWdubWVudFNldCAqRGVmaW5pdGVBTkRf QU5EKEFzdEJpbmFyeUV4cHJlc3Npb24gKiwgQml0U2V0ICYpOwogICAgRGVmaW5pdGVBc3NpZ25t ZW50U2V0ICpEZWZpbml0ZU9SX09SKEFzdEJpbmFyeUV4cHJlc3Npb24gKiwgQml0U2V0ICYpOwog ICAgRGVmaW5pdGVBc3NpZ25tZW50U2V0ICpEZWZpbml0ZUVRVUFMX0VRVUFMKEFzdEJpbmFyeUV4 cHJlc3Npb24gKiwgQml0U2V0ICYpOwogICAgRGVmaW5pdGVBc3NpZ25tZW50U2V0ICpEZWZpbml0 ZU5PVF9FUVVBTChBc3RCaW5hcnlFeHByZXNzaW9uICosIEJpdFNldCAmKTsKCiAgICBEZWZpbml0 ZUFzc2lnbm1lbnRTZXQgKkRlZmluaXRlQXNzaWdubWVudEFORChUeXBlU3ltYm9sICosIEJpdFNl dCAqLCBCaXRTZXQgJiwgRGVmaW5pdGVBc3NpZ25tZW50U2V0ICosIERlZmluaXRlQXNzaWdubWVu dFNldCAqKTsKICAgIERlZmluaXRlQXNzaWdubWVudFNldCAqRGVmaW5pdGVBc3NpZ25tZW50SU9S KFR5cGVTeW1ib2wgKiwgQml0U2V0ICosIEJpdFNldCAmLCBEZWZpbml0ZUFzc2lnbm1lbnRTZXQg KiwgRGVmaW5pdGVBc3NpZ25tZW50U2V0ICopOwogICAgRGVmaW5pdGVBc3NpZ25tZW50U2V0ICpE ZWZpbml0ZUFzc2lnbm1lbnRYT1IoVHlwZVN5bWJvbCAqLCBCaXRTZXQgKiwgQml0U2V0ICYsIERl ZmluaXRlQXNzaWdubWVudFNldCAqLCBEZWZpbml0ZUFzc2lnbm1lbnRTZXQgKik7CgogICAgdm9p ZCBEZWZpbml0ZUFycmF5SW5pdGlhbGl6ZXIoQXN0QXJyYXlJbml0aWFsaXplciAqKTsKICAgIHZv aWQgRGVmaW5pdGVWYXJpYWJsZUluaXRpYWxpemVyKEFzdFZhcmlhYmxlRGVjbGFyYXRvciAqKTsK ICAgIHZvaWQgRGVmaW5pdGVCbG9ja1N0YXRlbWVudHMoQXN0QmxvY2sgKik7CiAgICB2b2lkIERl ZmluaXRlTWV0aG9kQm9keShBc3RNZXRob2REZWNsYXJhdGlvbiAqLCBUdXBsZTxWYXJpYWJsZVN5 bWJvbCAqPiAmKTsKICAgIHZvaWQgRGVmaW5pdGVDb25zdHJ1Y3RvckJvZHkoQXN0Q29uc3RydWN0 b3JEZWNsYXJhdGlvbiAqLCBUdXBsZTxWYXJpYWJsZVN5bWJvbCAqPiAmKTsKICAgIHZvaWQgRGVm aW5pdGVCbG9ja0luaXRpYWxpemVyKEFzdEJsb2NrICosIGludCwgVHVwbGU8VmFyaWFibGVTeW1i b2wgKj4gJik7CiAgICB2b2lkIERlZmluaXRlVmFyaWFibGVJbml0aWFsaXplcihBc3RWYXJpYWJs ZURlY2xhcmF0b3IgKiwgVHVwbGU8VmFyaWFibGVTeW1ib2wgKj4gJik7CgogICAgdm9pZCBQcm9j ZXNzQmxvY2tTdGF0ZW1lbnRzKEFzdEJsb2NrICopOwogICAgdm9pZCBQcm9jZXNzVGhpc0NhbGwo QXN0VGhpc0NhbGwgKik7CiAgICB2b2lkIFByb2Nlc3NTdXBlckNhbGwoQXN0U3VwZXJDYWxsICop OwogICAgdm9pZCBDaGVja1Rocm93KEFzdEV4cHJlc3Npb24gKik7CiAgICB2b2lkIFByb2Nlc3NN ZXRob2RCb2R5KEFzdE1ldGhvZERlY2xhcmF0aW9uICopOwogICAgdm9pZCBQcm9jZXNzQ29uc3Ry dWN0b3JCb2R5KEFzdENvbnN0cnVjdG9yRGVjbGFyYXRpb24gKiwgYm9vbCk7CiAgICBib29sIENh dGNoYWJsZUV4Y2VwdGlvbihUeXBlU3ltYm9sICopOwogICAgdm9pZCBSZXBvcnRNZXRob2ROb3RG b3VuZChBc3QgKmFzdCwgd2NoYXJfdCAqKTsKICAgIE1ldGhvZFN5bWJvbCAqRmluZENvbnN0cnVj dG9yKFR5cGVTeW1ib2wgKiwgQXN0ICosIExleFN0cmVhbTo6VG9rZW5JbmRleCwgTGV4U3RyZWFt OjpUb2tlbkluZGV4KTsKICAgIGJvb2wgTW9yZVNwZWNpZmljKE1ldGhvZFN5bWJvbCAqLCBNZXRo b2RTeW1ib2wgKik7CiAgICBib29sIE1vcmVTcGVjaWZpYyhNZXRob2RTeW1ib2wgKiwgVHVwbGU8 TWV0aG9kU3ltYm9sICo+ICYpOwogICAgYm9vbCBOb01ldGhvZE1vcmVTcGVjaWZpYyhUdXBsZTxN ZXRob2RTeW1ib2wgKj4gJiwgTWV0aG9kU3ltYm9sICopOwogICAgYm9vbCBJc01ldGhvZEFjY2Vz c2libGUoQXN0RmllbGRBY2Nlc3MgKiwgVHlwZVN5bWJvbCAqLCBNZXRob2RTeW1ib2wgKik7CiAg ICB2b2lkIFNlYXJjaEZvck1ldGhvZEluRW52aXJvbm1lbnQoVHVwbGU8TWV0aG9kU3ltYm9sICo+ ICYsIFNlbWFudGljRW52aXJvbm1lbnQgKiYsIFNlbWFudGljRW52aXJvbm1lbnQgKiwgQXN0TWV0 aG9kSW52b2NhdGlvbiAqKTsKICAgIE1ldGhvZFN5bWJvbCAqRmluZE1pc3NwZWxsZWRNZXRob2RO YW1lKFR5cGVTeW1ib2wgKiwgQXN0TWV0aG9kSW52b2NhdGlvbiAqLCBOYW1lU3ltYm9sICopOwog ICAgTWV0aG9kU3ltYm9sICpGaW5kTWV0aG9kSW5FbnZpcm9ubWVudChTZW1hbnRpY0Vudmlyb25t ZW50IComLCBTZW1hbnRpY0Vudmlyb25tZW50ICosIEFzdE1ldGhvZEludm9jYXRpb24gKik7CiAg ICBNZXRob2RTeW1ib2wgKkZpbmRNZXRob2RJblR5cGUoVHlwZVN5bWJvbCAqLCBBc3RNZXRob2RJ bnZvY2F0aW9uICosIE5hbWVTeW1ib2wgKiA9IF9fbnVsbCApOwoKICAgIHZvaWQgUmVwb3J0QWNj ZXNzZWRGaWVsZE5vdEZvdW5kKEFzdEZpZWxkQWNjZXNzICosIFR5cGVTeW1ib2wgKik7CiAgICB2 b2lkIFNlYXJjaEZvclZhcmlhYmxlSW5FbnZpcm9ubWVudChUdXBsZTxWYXJpYWJsZVN5bWJvbCAq PiAmLCBTZW1hbnRpY0Vudmlyb25tZW50IComLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgU2VtYW50aWNFbnZpcm9ubWVudCAqLCBOYW1lU3ltYm9sICosIExleFN0cmVh bTo6VG9rZW5JbmRleCk7CiAgICBWYXJpYWJsZVN5bWJvbCAqRmluZE1pc3NwZWxsZWRWYXJpYWJs ZU5hbWUoVHlwZVN5bWJvbCAqLCBMZXhTdHJlYW06OlRva2VuSW5kZXgpOwogICAgVmFyaWFibGVT eW1ib2wgKkZpbmRWYXJpYWJsZUluRW52aXJvbm1lbnQoU2VtYW50aWNFbnZpcm9ubWVudCAqJiwg U2VtYW50aWNFbnZpcm9ubWVudCAqLCBMZXhTdHJlYW06OlRva2VuSW5kZXgpOwogICAgVmFyaWFi bGVTeW1ib2wgKkZpbmRWYXJpYWJsZUluVHlwZShUeXBlU3ltYm9sICosIEFzdEZpZWxkQWNjZXNz ICosIE5hbWVTeW1ib2wgKiA9IF9fbnVsbCApOwogICAgVmFyaWFibGVTeW1ib2wgKkZpbmRJbnN0 YW5jZShUeXBlU3ltYm9sICosIFR5cGVTeW1ib2wgKik7CiAgICBBc3RFeHByZXNzaW9uICpDcmVh dGVBY2Nlc3NUb1R5cGUoQXN0ICosIFR5cGVTeW1ib2wgKik7CiAgICB2b2lkIENyZWF0ZUFjY2Vz c1RvU2NvcGVkVmFyaWFibGUoQXN0U2ltcGxlTmFtZSAqLCBUeXBlU3ltYm9sICopOwogICAgdm9p ZCBDcmVhdGVBY2Nlc3NUb1Njb3BlZE1ldGhvZChBc3RNZXRob2RJbnZvY2F0aW9uICosIFR5cGVT eW1ib2wgKik7CgogICAgdm9pZCBUeXBlQWNjZXNzQ2hlY2soQXN0ICosIFR5cGVTeW1ib2wgKik7 CiAgICB2b2lkIFR5cGVOZXN0QWNjZXNzQ2hlY2soQXN0RXhwcmVzc2lvbiAqKTsKICAgIHZvaWQg Q29uc3RydWN0b3JBY2Nlc3NDaGVjayhBc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9u ICosIE1ldGhvZFN5bWJvbCAqKTsKICAgIHZvaWQgTWVtYmVyQWNjZXNzQ2hlY2soQXN0RmllbGRB Y2Nlc3MgKiwgVHlwZVN5bWJvbCAqLCBTeW1ib2wgKik7CiAgICB2b2lkIFNpbXBsZU5hbWVBY2Nl c3NDaGVjayhBc3RTaW1wbGVOYW1lICosIFR5cGVTeW1ib2wgKiwgU3ltYm9sICopOwoKICAgIHZv aWQgKFNlbWFudGljOjoqUHJvY2Vzc1ByZVVuYXJ5RXhwcltBc3RQcmVVbmFyeUV4cHJlc3Npb246 Ol9udW1fa2luZHNdKShBc3RQcmVVbmFyeUV4cHJlc3Npb24gKik7CiAgICB2b2lkIFByb2Nlc3NQ TFVTKEFzdFByZVVuYXJ5RXhwcmVzc2lvbiAqKTsKICAgIHZvaWQgUHJvY2Vzc01JTlVTKEFzdFBy ZVVuYXJ5RXhwcmVzc2lvbiAqKTsKICAgIHZvaWQgUHJvY2Vzc1RXSURETEUoQXN0UHJlVW5hcnlF eHByZXNzaW9uICopOwogICAgdm9pZCBQcm9jZXNzTk9UKEFzdFByZVVuYXJ5RXhwcmVzc2lvbiAq KTsKICAgIHZvaWQgUHJvY2Vzc1BMVVNQTFVTT3JNSU5VU01JTlVTKEFzdFByZVVuYXJ5RXhwcmVz c2lvbiAqKTsKCiAgICB2b2lkIChTZW1hbnRpYzo6KlByb2Nlc3NCaW5hcnlFeHByW0FzdEJpbmFy eUV4cHJlc3Npb246Ol9udW1fa2luZHNdKShBc3RCaW5hcnlFeHByZXNzaW9uICopOwogICAgdm9p ZCBQcm9jZXNzUExVUyhBc3RCaW5hcnlFeHByZXNzaW9uICopOwogICAgdm9pZCBQcm9jZXNzTEVG VF9TSElGVChBc3RCaW5hcnlFeHByZXNzaW9uICopOwogICAgdm9pZCBQcm9jZXNzUklHSFRfU0hJ RlQoQXN0QmluYXJ5RXhwcmVzc2lvbiAqKTsKICAgIHZvaWQgUHJvY2Vzc1VOU0lHTkVEX1JJR0hU X1NISUZUKEFzdEJpbmFyeUV4cHJlc3Npb24gKik7CiAgICB2b2lkIFByb2Nlc3NMRVNTKEFzdEJp bmFyeUV4cHJlc3Npb24gKik7CiAgICB2b2lkIFByb2Nlc3NHUkVBVEVSKEFzdEJpbmFyeUV4cHJl c3Npb24gKik7CiAgICB2b2lkIFByb2Nlc3NMRVNTX0VRVUFMKEFzdEJpbmFyeUV4cHJlc3Npb24g Kik7CiAgICB2b2lkIFByb2Nlc3NHUkVBVEVSX0VRVUFMKEFzdEJpbmFyeUV4cHJlc3Npb24gKik7 CiAgICB2b2lkIFByb2Nlc3NBTkQoQXN0QmluYXJ5RXhwcmVzc2lvbiAqKTsKICAgIHZvaWQgUHJv Y2Vzc1hPUihBc3RCaW5hcnlFeHByZXNzaW9uICopOwogICAgdm9pZCBQcm9jZXNzSU9SKEFzdEJp bmFyeUV4cHJlc3Npb24gKik7CiAgICB2b2lkIFByb2Nlc3NBTkRfQU5EKEFzdEJpbmFyeUV4cHJl c3Npb24gKik7CiAgICB2b2lkIFByb2Nlc3NPUl9PUihBc3RCaW5hcnlFeHByZXNzaW9uICopOwog ICAgdm9pZCBQcm9jZXNzRVFVQUxfRVFVQUwoQXN0QmluYXJ5RXhwcmVzc2lvbiAqKTsKICAgIHZv aWQgUHJvY2Vzc05PVF9FUVVBTChBc3RCaW5hcnlFeHByZXNzaW9uICopOwogICAgdm9pZCBQcm9j ZXNzU1RBUihBc3RCaW5hcnlFeHByZXNzaW9uICopOwogICAgdm9pZCBQcm9jZXNzTUlOVVMoQXN0 QmluYXJ5RXhwcmVzc2lvbiAqKTsKICAgIHZvaWQgUHJvY2Vzc1NMQVNIKEFzdEJpbmFyeUV4cHJl c3Npb24gKik7CiAgICB2b2lkIFByb2Nlc3NNT0QoQXN0QmluYXJ5RXhwcmVzc2lvbiAqKTsKICAg IHZvaWQgUHJvY2Vzc0lOU1RBTkNFT0YoQXN0QmluYXJ5RXhwcmVzc2lvbiAqKTsKCiAgICBNZXRo b2RTeW1ib2wgKkZpbmRNZXRob2RNZW1iZXIoVHlwZVN5bWJvbCAqLCBUeXBlU3ltYm9sICosIEFz dE1ldGhvZEludm9jYXRpb24gKik7CiAgICB2b2lkIFByb2Nlc3NNZXRob2ROYW1lKEFzdE1ldGhv ZEludm9jYXRpb24gKik7CiAgICB2b2lkIChTZW1hbnRpYzo6KlByb2Nlc3NFeHByT3JTdG10W0Fz dDo6X251bV9raW5kc10pKEFzdCAqKTsKICAgIGlubGluZSB2b2lkIFByb2Nlc3NTdGF0ZW1lbnQo QXN0U3RhdGVtZW50ICpzdG10KQogICAgewogICAgICAgICh0aGlzIC0+KiBQcm9jZXNzRXhwck9y U3RtdFtzdG10IC0+IGtpbmRdKShzdG10KTsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBQcm9jZXNz RXhwcmVzc2lvbihBc3RFeHByZXNzaW9uICpleHByKQogICAgewogICAgICAgICh0aGlzIC0+KiBQ cm9jZXNzRXhwck9yU3RtdFtleHByIC0+IGtpbmRdKShleHByKTsKICAgIH0KCiAgICBpbmxpbmUg dm9pZCBQcm9jZXNzRXhwcmVzc2lvbk9yU3RyaW5nQ29uc3RhbnQoQXN0RXhwcmVzc2lvbiAqZXhw cikKICAgIHsKICAgICAgICAodGhpcyAtPiogUHJvY2Vzc0V4cHJPclN0bXRbZXhwciAtPiBraW5k XSkoZXhwcik7CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAg IGlmIChleHByIC0+IHN5bWJvbCA9PSBjb250cm9sLlN0cmluZygpICYmICghIGV4cHIgLT4gSXND b25zdGFudCgpKSkKICAgICAgICAgICAgY29udHJvbC5VdGY4X3Bvb2wuQ2hlY2tTdHJpbmdDb25z dGFudChleHByKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZvaWQgUHJvY2Vzc0xvY2Fs VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudChBc3QgKik7CiAgICB2b2lkIFByb2Nlc3NCbG9j ayhBc3QgKik7CiAgICB2b2lkIFByb2Nlc3NGb3JTdGF0ZW1lbnQoQXN0ICopOwogICAgdm9pZCBQ cm9jZXNzU3dpdGNoU3RhdGVtZW50KEFzdCAqKTsKICAgIHZvaWQgUHJvY2Vzc1Rocm93U3RhdGVt ZW50KEFzdCAqKTsKICAgIHZvaWQgUHJvY2Vzc1RyeVN0YXRlbWVudChBc3QgKik7CiAgICB2b2lk IFByb2Nlc3NFeHByZXNzaW9uU3RhdGVtZW50KEFzdCAqKTsKICAgIHZvaWQgUHJvY2Vzc1N5bmNo cm9uaXplZFN0YXRlbWVudChBc3QgKik7CiAgICB2b2lkIFByb2Nlc3NJZlN0YXRlbWVudChBc3Qg Kik7CiAgICB2b2lkIFByb2Nlc3NXaGlsZVN0YXRlbWVudChBc3QgKik7CiAgICB2b2lkIFByb2Nl c3NEb1N0YXRlbWVudChBc3QgKik7CiAgICB2b2lkIFByb2Nlc3NCcmVha1N0YXRlbWVudChBc3Qg Kik7CiAgICB2b2lkIFByb2Nlc3NDb250aW51ZVN0YXRlbWVudChBc3QgKik7CiAgICB2b2lkIFBy b2Nlc3NSZXR1cm5TdGF0ZW1lbnQoQXN0ICopOwogICAgdm9pZCBQcm9jZXNzRW1wdHlTdGF0ZW1l bnQoQXN0ICopOwogICAgVHlwZVN5bWJvbCAqR2V0TG9jYWxUeXBlKEFzdENsYXNzRGVjbGFyYXRp b24gKik7CiAgICB2b2lkIFByb2Nlc3NDbGFzc0RlY2xhcmF0aW9uKEFzdCAqKTsKICAgIHZvaWQg R2VuZXJhdGVMb2NhbENvbnN0cnVjdG9yKE1ldGhvZFN5bWJvbCAqKTsKCiAgICB2b2lkIENoZWNr U2ltcGxlTmFtZShBc3RTaW1wbGVOYW1lICosIFNlbWFudGljRW52aXJvbm1lbnQgKndoZXJlX2Zv dW5kKTsKICAgIHZvaWQgUHJvY2Vzc1NpbXBsZU5hbWUoQXN0ICopOwogICAgdm9pZCBGaW5kVmFy aWFibGVNZW1iZXIoVHlwZVN5bWJvbCAqLCBUeXBlU3ltYm9sICosIEFzdEZpZWxkQWNjZXNzICop OwogICAgdm9pZCBQcm9jZXNzQW1iaWd1b3VzTmFtZShBc3QgKik7CiAgICB2b2lkIFByb2Nlc3NG aWVsZEFjY2VzcyhBc3QgKik7CiAgICB2b2lkIFByb2Nlc3NJbnRlZ2VyTGl0ZXJhbChBc3QgKik7 CiAgICB2b2lkIFByb2Nlc3NMb25nTGl0ZXJhbChBc3QgKik7CiAgICB2b2lkIFByb2Nlc3NGbG9h dGluZ1BvaW50TGl0ZXJhbChBc3QgKik7CiAgICB2b2lkIFByb2Nlc3NEb3VibGVMaXRlcmFsKEFz dCAqKTsKICAgIHZvaWQgUHJvY2Vzc1RydWVMaXRlcmFsKEFzdCAqKTsKICAgIHZvaWQgUHJvY2Vz c0ZhbHNlTGl0ZXJhbChBc3QgKik7CiAgICB2b2lkIFByb2Nlc3NTdHJpbmdMaXRlcmFsKEFzdCAq KTsKICAgIHZvaWQgUHJvY2Vzc0NoYXJhY3RlckxpdGVyYWwoQXN0ICopOwogICAgdm9pZCBQcm9j ZXNzQXJyYXlBY2Nlc3MoQXN0ICopOwogICAgdm9pZCBQcm9jZXNzTWV0aG9kSW52b2NhdGlvbihB c3QgKik7CiAgICB2b2lkIFByb2Nlc3NOdWxsTGl0ZXJhbChBc3QgKik7CiAgICB2b2lkIFByb2Nl c3NUaGlzRXhwcmVzc2lvbihBc3QgKik7CiAgICB2b2lkIFByb2Nlc3NTdXBlckV4cHJlc3Npb24o QXN0ICopOwogICAgdm9pZCBQcm9jZXNzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oQXN0ICopOwog ICAgdm9pZCBVcGRhdGVHZW5lcmF0ZWRMb2NhbENvbnN0cnVjdG9yKE1ldGhvZFN5bWJvbCAqKTsK ICAgIHZvaWQgVXBkYXRlTG9jYWxDb25zdHJ1Y3RvcnMoVHlwZVN5bWJvbCAqKTsKICAgIHZvaWQg R2V0QW5vbnltb3VzQ29uc3RydWN0b3IoQXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lv biAqLCBUeXBlU3ltYm9sICopOwogICAgVHlwZVN5bWJvbCAqR2V0QW5vbnltb3VzVHlwZShBc3RD bGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uICosIFR5cGVTeW1ib2wgKik7CiAgICB2b2lk IFByb2Nlc3NDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uKEFzdCAqKTsKICAgIHZvaWQg UHJvY2Vzc0FycmF5Q3JlYXRpb25FeHByZXNzaW9uKEFzdCAqKTsKICAgIHZvaWQgUHJvY2Vzc1Bv c3RVbmFyeUV4cHJlc3Npb24oQXN0ICopOwogICAgdm9pZCBQcm9jZXNzUHJlVW5hcnlFeHByZXNz aW9uKEFzdCAqKTsKICAgIHZvaWQgUHJvY2Vzc0Nhc3RFeHByZXNzaW9uKEFzdCAqKTsKICAgIHZv aWQgUHJvY2Vzc0JpbmFyeUV4cHJlc3Npb24oQXN0ICopOwogICAgdm9pZCBQcm9jZXNzVHlwZUV4 cHJlc3Npb24oQXN0ICopOwogICAgdm9pZCBQcm9jZXNzQ29uZGl0aW9uYWxFeHByZXNzaW9uKEFz dCAqKTsKICAgIHZvaWQgUHJvY2Vzc0Fzc2lnbm1lbnRFeHByZXNzaW9uKEFzdCAqKTsKCiAgICB2 b2lkIFByb2Nlc3NWYXJpYWJsZUluaXRpYWxpemVyKEFzdFZhcmlhYmxlRGVjbGFyYXRvciAqKTsK ICAgIHZvaWQgUHJvY2Vzc0FycmF5SW5pdGlhbGl6ZXIoQXN0QXJyYXlJbml0aWFsaXplciAqLCBU eXBlU3ltYm9sICopOwoKICAgIHZvaWQgQ2hlY2tJbmhlcml0ZWRNZXRob2RUaHJvd3MoQXN0TWV0 aG9kRGVjbGFyYXRpb24gKiwgTWV0aG9kU3ltYm9sICopOwogICAgdm9pZCBDaGVja01ldGhvZE92 ZXJyaWRlKEFzdE1ldGhvZERlY2xhcmF0aW9uICosIE1ldGhvZFN5bWJvbCAqKTsKICAgIHZvaWQg Q2hlY2tJbmhlcml0ZWRNZXRob2RUaHJvd3MoQXN0Q2xhc3NEZWNsYXJhdGlvbiAqLCBNZXRob2RT eW1ib2wgKiwgTWV0aG9kU3ltYm9sICopOwogICAgdm9pZCBDaGVja01ldGhvZE92ZXJyaWRlKEFz dENsYXNzRGVjbGFyYXRpb24gKiwgTWV0aG9kU3ltYm9sICosIE1ldGhvZFN5bWJvbCAqKTsKICAg IHZvaWQgQWRkSW5oZXJpdGVkVHlwZXMoVHlwZVN5bWJvbCAqLCBUeXBlU3ltYm9sICopOwogICAg dm9pZCBBZGRJbmhlcml0ZWRGaWVsZHMoVHlwZVN5bWJvbCAqLCBUeXBlU3ltYm9sICopOwogICAg dm9pZCBBZGRJbmhlcml0ZWRNZXRob2RzKFR5cGVTeW1ib2wgKiwgVHlwZVN5bWJvbCAqLCBMZXhT dHJlYW06OlRva2VuSW5kZXgpOwogICAgdm9pZCBDb21wdXRlVHlwZXNDbG9zdXJlKFR5cGVTeW1i b2wgKiwgTGV4U3RyZWFtOjpUb2tlbkluZGV4KTsKICAgIHZvaWQgQ29tcHV0ZUZpZWxkc0Nsb3N1 cmUoVHlwZVN5bWJvbCAqLCBMZXhTdHJlYW06OlRva2VuSW5kZXgpOwogICAgdm9pZCBDb21wdXRl TWV0aG9kc0Nsb3N1cmUoVHlwZVN5bWJvbCAqLCBMZXhTdHJlYW06OlRva2VuSW5kZXgpOwoKICAg IGlubGluZSBib29sIEluUmFuZ2UoY29uc3QgY2hhciAqYnVmZmVyX3B0ciwgY29uc3QgY2hhciAq YnVmZmVyX3RhaWwsIGludCBzaXplKSB7IHJldHVybiAoKGJ1ZmZlcl9wdHIgKyBzaXplKSA8PSBi dWZmZXJfdGFpbCk7IH0KICAgIFR5cGVTeW1ib2wgKlJldHJpZXZlTmVzdGVkVHlwZXMoVHlwZVN5 bWJvbCAqLCB3Y2hhcl90ICosIExleFN0cmVhbTo6VG9rZW5JbmRleCk7CiAgICBUeXBlU3ltYm9s ICpHZXRDbGFzc1Bvb2woVHlwZVN5bWJvbCAqLCBUeXBlU3ltYm9sICoqLCBjb25zdCBjaGFyICoq LCBpbnQsIExleFN0cmVhbTo6VG9rZW5JbmRleCk7CiAgICB2b2lkIFByb2Nlc3NCYWRDbGFzcyhU eXBlU3ltYm9sICosIExleFN0cmVhbTo6VG9rZW5JbmRleCk7CiAgICBib29sIFByb2Nlc3NDbGFz c0ZpbGUoVHlwZVN5bWJvbCAqLCBjb25zdCBjaGFyICosIGludCwgTGV4U3RyZWFtOjpUb2tlbklu ZGV4KTsKICAgIHZvaWQgUmVhZENsYXNzRmlsZShUeXBlU3ltYm9sICosIExleFN0cmVhbTo6VG9r ZW5JbmRleCk7CgogICAgIAogICAgIAogICAgIAogICAgIAogICAgaW5saW5lIGJvb2wgQ2hlY2tl ZEV4Y2VwdGlvbihUeXBlU3ltYm9sICpleGNlcHRpb24pCiAgICB7CiAgICAgICAgcmV0dXJuICgh IChleGNlcHRpb24gLT4gSXNTdWJjbGFzcyhjb250cm9sLlJ1bnRpbWVFeGNlcHRpb24oKSkgfHwg ZXhjZXB0aW9uIC0+IElzU3ViY2xhc3MoY29udHJvbC5FcnJvcigpKSkpOwogICAgfQoKcHVibGlj OgoKICAgIHN0YXRpYyBpbmxpbmUgdTEgR2V0VTEoY29uc3QgY2hhciAqKTsKICAgIHN0YXRpYyBp bmxpbmUgdTIgR2V0VTIoY29uc3QgY2hhciAqKTsKICAgIHN0YXRpYyBpbmxpbmUgdTQgR2V0VTQo Y29uc3QgY2hhciAqKTsKCiAgICBzdGF0aWMgaW5saW5lIHUxIEdldEFuZFNraXBVMShjb25zdCBj aGFyIComKTsKICAgIHN0YXRpYyBpbmxpbmUgdTIgR2V0QW5kU2tpcFUyKGNvbnN0IGNoYXIgKiYp OwogICAgc3RhdGljIGlubGluZSB1NCBHZXRBbmRTa2lwVTQoY29uc3QgY2hhciAqJik7CiAgICBz dGF0aWMgaW5saW5lIHZvaWQgU2tpcChjb25zdCBjaGFyIComLCBpbnQpOwoKICAgIGlubGluZSB2 b2lkIEFkZERlcGVuZGVuY2UoVHlwZVN5bWJvbCAqLCBUeXBlU3ltYm9sICosIExleFN0cmVhbTo6 VG9rZW5JbmRleCwgYm9vbCA9IGZhbHNlKTsKICAgIGlubGluZSB2b2lkIFNldE9iamVjdFN1cGVy VHlwZShUeXBlU3ltYm9sICosIExleFN0cmVhbTo6VG9rZW5JbmRleCk7CiAgICBpbmxpbmUgdm9p ZCBBZGRTdHJpbmdDb252ZXJzaW9uRGVwZW5kZW5jZShUeXBlU3ltYm9sICosIExleFN0cmVhbTo6 VG9rZW5JbmRleCk7Cn07CgoKaW5saW5lIHZvaWQgU2VtYW50aWM6OkFkZERlcGVuZGVuY2UoVHlw ZVN5bWJvbCAqYmFzZV90eXBlXywgVHlwZVN5bWJvbCAqcGFyZW50X3R5cGVfLCBMZXhTdHJlYW06 OlRva2VuSW5kZXggdG9rLCBib29sIHN0YXRpY19hY2Nlc3MpCnsKICAgIGlmIChiYXNlX3R5cGVf ICE9IGNvbnRyb2wubm9fdHlwZSkKICAgIHsKICAgICAgICBUeXBlU3ltYm9sICpiYXNlX3R5cGUg PSBiYXNlX3R5cGVfIC0+IG91dGVybW9zdF90eXBlLAogICAgICAgICAgICAgICAgICAgKnBhcmVu dF90eXBlID0gcGFyZW50X3R5cGVfIC0+IG91dGVybW9zdF90eXBlOwoKICAgICAgICBwYXJlbnRf dHlwZSAtPiBkZXBlbmRlbnRzIC0+IEFkZEVsZW1lbnQoYmFzZV90eXBlKTsKICAgICAgICBpZiAo c3RhdGljX2FjY2VzcykKICAgICAgICAgICAgIGJhc2VfdHlwZSAtPiBzdGF0aWNfcGFyZW50cyAt PiBBZGRFbGVtZW50KHBhcmVudF90eXBlKTsKICAgICAgICBlbHNlIGJhc2VfdHlwZSAtPiBwYXJl bnRzIC0+IEFkZEVsZW1lbnQocGFyZW50X3R5cGUpOwoKICAgICAgICBpZiAoY29udHJvbC5vcHRp b24ucGVkYW50aWMpCiAgICAgICAgewogICAgICAgICAgICBpZiAocGFyZW50X3R5cGUgLT4gQ29u dGFpbmluZ1BhY2thZ2UoKSA9PSBjb250cm9sLnVubmFtZWRfcGFja2FnZSAmJgogICAgICAgICAg ICAgICAgYmFzZV90eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgIT0gY29udHJvbC51bm5hbWVk X3BhY2thZ2UpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNl bWFudGljRXJyb3I6OlBBUkVOVF9UWVBFX0lOX1VOTkFNRURfUEFDS0FHRSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHRvaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRv aywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudF90eXBlXyAtPiBDb250YWlu aW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBwYXJlbnRfdHlwZV8gLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgICAgICAgICB9CiAgICAg ICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKaW5saW5lIHZvaWQgU2VtYW50aWM6OlNldE9iamVj dFN1cGVyVHlwZShUeXBlU3ltYm9sICp0eXBlLCBMZXhTdHJlYW06OlRva2VuSW5kZXggdG9rKQp7 CiAgICB0eXBlIC0+IHN1cGVyID0gY29udHJvbC5PYmplY3QoKTsKICAgIEFkZERlcGVuZGVuY2Uo dHlwZSwgdHlwZSAtPiBzdXBlciwgdG9rKTsKfQoKaW5saW5lIHZvaWQgU2VtYW50aWM6OkFkZFN0 cmluZ0NvbnZlcnNpb25EZXBlbmRlbmNlKFR5cGVTeW1ib2wgKnR5cGUsIExleFN0cmVhbTo6VG9r ZW5JbmRleCB0b2spCnsKICAgIGlmICh0eXBlID09IGNvbnRyb2wubnVsbF90eXBlKQogICAgICAg ICA7CiAgICBlbHNlIGlmICh0eXBlID09IGNvbnRyb2wuYm9vbGVhbl90eXBlKQogICAgICAgICBB ZGREZXBlbmRlbmNlKFRoaXNUeXBlKCksIGNvbnRyb2wuQm9vbGVhbigpLCB0b2spOwogICAgZWxz ZSBpZiAodHlwZSA9PSBjb250cm9sLmNoYXJfdHlwZSkKICAgICAgICAgQWRkRGVwZW5kZW5jZShU aGlzVHlwZSgpLCBjb250cm9sLkNoYXJhY3RlcigpLCB0b2spOwogICAgZWxzZSBpZiAodHlwZSA9 PSBjb250cm9sLmludF90eXBlKQogICAgICAgICBBZGREZXBlbmRlbmNlKFRoaXNUeXBlKCksIGNv bnRyb2wuSW50ZWdlcigpLCB0b2spOwogICAgZWxzZSBpZiAodHlwZSA9PSBjb250cm9sLmxvbmdf dHlwZSkKICAgICAgICAgQWRkRGVwZW5kZW5jZShUaGlzVHlwZSgpLCBjb250cm9sLkxvbmcoKSwg dG9rKTsKICAgIGVsc2UgaWYgKHR5cGUgPT0gY29udHJvbC5mbG9hdF90eXBlKQogICAgICAgICBB ZGREZXBlbmRlbmNlKFRoaXNUeXBlKCksIGNvbnRyb2wuRmxvYXQoKSwgdG9rKTsKICAgIGVsc2Ug IAogICAgICAgICBBZGREZXBlbmRlbmNlKFRoaXNUeXBlKCksIGNvbnRyb2wuRG91YmxlKCksIHRv ayk7Cn0KCgoKCgoKCiMgMTQgIi4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIgMgoKCiMgMSAiLi4v Li4vamlrZXMvc3JjL3RhYmxlLmgiIDEKIAogCiAKIAogCiAKIAogCiAKCgoKCgoKCgoKCmNsYXNz IFZhcmlhYmxlU2hhZG93U3ltYm9sCnsKcHVibGljOgogICAgVmFyaWFibGVTeW1ib2wgKnZhcmlh YmxlX3N5bWJvbDsKCiAgICBWYXJpYWJsZVNoYWRvd1N5bWJvbChWYXJpYWJsZVN5bWJvbCAqdmFy aWFibGVfc3ltYm9sXykgOiB2YXJpYWJsZV9zeW1ib2wodmFyaWFibGVfc3ltYm9sXyksCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj b25mbGljdChfX251bGwgKQogICAge30KCiAgICB+VmFyaWFibGVTaGFkb3dTeW1ib2woKQogICAg ewogICAgICAgIGRlbGV0ZSBjb25mbGljdDsKICAgIH0KCiAgICBWYXJpYWJsZVN5bWJvbCAqQ29u ZmxpY3QoaW50IGkpIHsgcmV0dXJuICgqY29uZmxpY3QpW2ldOyB9CgogICAgaW5saW5lIGludCBO dW1Db25mbGljdHMoKQogICAgewogICAgICAgIHJldHVybiAoY29uZmxpY3QgPyBjb25mbGljdCAt PiBMZW5ndGgoKSA6IDApOwogICAgfQogICAgaW5saW5lIHZvaWQgQWRkQ29uZmxpY3QoVmFyaWFi bGVTeW1ib2wgKmNvbmZsaWN0X3N5bWJvbCkKICAgIHsKICAgICAgICBpZiAoKHZhcmlhYmxlX3N5 bWJvbCAhPSBjb25mbGljdF9zeW1ib2wpICYmICghIEZpbmQoY29uZmxpY3Rfc3ltYm9sKSkpCiAg ICAgICAgICAgIGNvbmZsaWN0IC0+IE5leHQoKSA9IGNvbmZsaWN0X3N5bWJvbDsKICAgICAgICBy ZXR1cm47CiAgICB9CiAgICBpbmxpbmUgdm9pZCBDb21wcmVzc1NwYWNlKCkKICAgIHsKICAgICAg ICBpZiAoY29uZmxpY3QpCiAgICAgICAgICAgICh2b2lkKSBjb25mbGljdCAtPiBBcnJheSgpOwog ICAgfQoKcHJpdmF0ZToKICAgIGZyaWVuZCBjbGFzcyBFeHBhbmRlZEZpZWxkVGFibGU7CiAgICBW YXJpYWJsZVNoYWRvd1N5bWJvbCAqbmV4dDsKCiAgICBDb252ZXJ0aWJsZUFycmF5PFZhcmlhYmxl U3ltYm9sICo+ICpjb25mbGljdDsKCiAgICBib29sIEZpbmQoVmFyaWFibGVTeW1ib2wgKmNvbmZs aWN0X3N5bWJvbCkKICAgIHsKICAgICAgICBpZiAoISBjb25mbGljdCkKICAgICAgICAgICAgY29u ZmxpY3QgPSBuZXcgQ29udmVydGlibGVBcnJheTxWYXJpYWJsZVN5bWJvbCAqPig0KTsKICAgICAg ICBmb3IgKGludCBrID0gMDsgayA8IGNvbmZsaWN0IC0+IExlbmd0aCgpOyBrKyspCiAgICAgICAg ICAgIGlmICgoKmNvbmZsaWN0KVtrXSA9PSBjb25mbGljdF9zeW1ib2wpCiAgICAgICAgICAgICAg ICByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn07CgoKY2xhc3MgTWV0 aG9kU2hhZG93U3ltYm9sCnsKcHVibGljOgogICAgTWV0aG9kU3ltYm9sICptZXRob2Rfc3ltYm9s OwogICAgTWV0aG9kU2hhZG93U3ltYm9sICpuZXh0X21ldGhvZDsKCiAgICBNZXRob2RTaGFkb3dT eW1ib2woTWV0aG9kU3ltYm9sICptZXRob2Rfc3ltYm9sXykgOiBtZXRob2Rfc3ltYm9sKG1ldGhv ZF9zeW1ib2xfKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGNvbmZsaWN0KF9fbnVsbCApCiAgICB7fQoKICAgIH5NZXRob2RTaGFkb3dTeW1i b2woKQogICAgewogICAgICAgIGRlbGV0ZSBjb25mbGljdDsKICAgIH0KCiAgICBNZXRob2RTeW1i b2wgKkNvbmZsaWN0KGNvbnN0IGludCBpKSB7IHJldHVybiAoKmNvbmZsaWN0KVtpXTsgfQoKICAg IGlubGluZSBpbnQgTnVtQ29uZmxpY3RzKCkKICAgIHsKICAgICAgICByZXR1cm4gKGNvbmZsaWN0 ID8gY29uZmxpY3QgLT4gTGVuZ3RoKCkgOiAwKTsKICAgIH0KICAgIGlubGluZSB2b2lkIEFkZENv bmZsaWN0KE1ldGhvZFN5bWJvbCAqY29uZmxpY3Rfc3ltYm9sKQogICAgewogICAgICAgIGlmICgo bWV0aG9kX3N5bWJvbCAhPSBjb25mbGljdF9zeW1ib2wpICYmICghIEZpbmQoY29uZmxpY3Rfc3lt Ym9sKSkpCiAgICAgICAgICAgIGNvbmZsaWN0IC0+IE5leHQoKSA9IGNvbmZsaWN0X3N5bWJvbDsK ICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbmxpbmUgdm9pZCBSZW1vdmVDb25mbGljdHMoKQog ICAgewogICAgICAgIGRlbGV0ZSBjb25mbGljdDsKICAgICAgICBjb25mbGljdCA9IF9fbnVsbCA7 CiAgICB9CgogICAgaW5saW5lIHZvaWQgQ29tcHJlc3NTcGFjZSgpCiAgICB7CiAgICAgICAgaWYg KGNvbmZsaWN0KQogICAgICAgICAgICAodm9pZCkgY29uZmxpY3QgLT4gQXJyYXkoKTsKICAgIH0K CnByaXZhdGU6CiAgICBmcmllbmQgY2xhc3MgRXhwYW5kZWRNZXRob2RUYWJsZTsKICAgIE1ldGhv ZFNoYWRvd1N5bWJvbCAqbmV4dDsKCiAgICBDb252ZXJ0aWJsZUFycmF5PE1ldGhvZFN5bWJvbCAq PiAqY29uZmxpY3Q7CgogICAgYm9vbCBGaW5kKE1ldGhvZFN5bWJvbCAqY29uZmxpY3Rfc3ltYm9s KQogICAgewogICAgICAgIGlmICghIGNvbmZsaWN0KQogICAgICAgICAgICBjb25mbGljdCA9IG5l dyBDb252ZXJ0aWJsZUFycmF5PE1ldGhvZFN5bWJvbCAqPig0KTsKICAgICAgICBmb3IgKGludCBr ID0gMDsgayA8IGNvbmZsaWN0IC0+IExlbmd0aCgpOyBrKyspCiAgICAgICAgICAgIGlmICgoKmNv bmZsaWN0KVtrXSA9PSBjb25mbGljdF9zeW1ib2wpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1 ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn07CgoKY2xhc3MgVHlwZVNoYWRvd1N5bWJv bAp7CnB1YmxpYzoKICAgIFR5cGVTeW1ib2wgKnR5cGVfc3ltYm9sOwoKICAgIFR5cGVTaGFkb3dT eW1ib2woVHlwZVN5bWJvbCAqdHlwZV9zeW1ib2xfKSA6IHR5cGVfc3ltYm9sKHR5cGVfc3ltYm9s XyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25m bGljdChfX251bGwgKQogICAge30KCiAgICB+VHlwZVNoYWRvd1N5bWJvbCgpCiAgICB7CiAgICAg ICAgZGVsZXRlIGNvbmZsaWN0OwogICAgfQoKICAgIFR5cGVTeW1ib2wgKkNvbmZsaWN0KGludCBp KSB7IHJldHVybiAoKmNvbmZsaWN0KVtpXTsgfQoKICAgIGlubGluZSBpbnQgTnVtQ29uZmxpY3Rz KCkKICAgIHsKICAgICAgICByZXR1cm4gKGNvbmZsaWN0ID8gY29uZmxpY3QgLT4gTGVuZ3RoKCkg OiAwKTsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBBZGRDb25mbGljdChUeXBlU3ltYm9sICpjb25m bGljdF9zeW1ib2wpCiAgICB7CiAgICAgICAgaWYgKCh0eXBlX3N5bWJvbCAhPSBjb25mbGljdF9z eW1ib2wpICYmICghIEZpbmQoY29uZmxpY3Rfc3ltYm9sKSkpCiAgICAgICAgICAgIGNvbmZsaWN0 IC0+IE5leHQoKSA9IGNvbmZsaWN0X3N5bWJvbDsKICAgICAgICByZXR1cm47CiAgICB9CgogICAg aW5saW5lIHZvaWQgQ29tcHJlc3NTcGFjZSgpCiAgICB7CiAgICAgICAgaWYgKGNvbmZsaWN0KQog ICAgICAgICAgICAodm9pZCkgY29uZmxpY3QgLT4gQXJyYXkoKTsKICAgIH0KCnByaXZhdGU6CiAg ICBmcmllbmQgY2xhc3MgRXhwYW5kZWRUeXBlVGFibGU7CiAgICBUeXBlU2hhZG93U3ltYm9sICpu ZXh0OwoKICAgIENvbnZlcnRpYmxlQXJyYXk8VHlwZVN5bWJvbCAqPiAqY29uZmxpY3Q7CgogICAg Ym9vbCBGaW5kKFR5cGVTeW1ib2wgKmNvbmZsaWN0X3N5bWJvbCkKICAgIHsKICAgICAgICBpZiAo ISBjb25mbGljdCkKICAgICAgICAgICAgY29uZmxpY3QgPSBuZXcgQ29udmVydGlibGVBcnJheTxU eXBlU3ltYm9sICo+KDQpOwogICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgY29uZmxpY3QgLT4g TGVuZ3RoKCk7IGsrKykKICAgICAgICAgICAgaWYgKCgqY29uZmxpY3QpW2tdID09IGNvbmZsaWN0 X3N5bWJvbCkKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIHJldHVybiBmYWxz ZTsKICAgIH0KfTsKCgpjbGFzcyBFeHBhbmRlZFR5cGVUYWJsZQp7CnB1YmxpYzoKICAgIGVudW0K ICAgIHsKICAgICAgICBERUZBVUxUX0hBU0hfU0laRSA9IDI1MSwKICAgICAgICBNQVhfSEFTSF9T SVpFID0gNTA5CiAgICB9OwoKICAgIENvbnZlcnRpYmxlQXJyYXk8VHlwZVNoYWRvd1N5bWJvbCAq PiBzeW1ib2xfcG9vbDsKCiAgICBpbmxpbmUgdm9pZCBDb21wcmVzc1NwYWNlKCkKICAgIHsKICAg ICAgICBoYXNoX3NpemUgPSBzeW1ib2xfcG9vbC5MZW5ndGgoKTsKICAgICAgICBoYXNoX3NpemUg PSAoaGFzaF9zaXplIDw9IDAgPyAxIDogKGhhc2hfc2l6ZSA+IE1BWF9IQVNIX1NJWkUgPyBNQVhf SEFTSF9TSVpFIDogaGFzaF9zaXplKSk7CiAgICAgICAgZGVsZXRlIFtdIGJhc2U7CiAgICAgICAg YmFzZSA9IChUeXBlU2hhZG93U3ltYm9sICoqKSBtZW1zZXQobmV3IFR5cGVTaGFkb3dTeW1ib2wg KltoYXNoX3NpemVdLCAwLCBoYXNoX3NpemUgKiBzaXplb2YoVHlwZVNoYWRvd1N5bWJvbCAqKSk7 CgogICAgICAgIFR5cGVTaGFkb3dTeW1ib2wgKiphcnJheSA9IHN5bWJvbF9wb29sLkFycmF5KCk7 CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzeW1ib2xfcG9vbC5MZW5ndGgoKTsgaSsrKQog ICAgICAgIHsKICAgICAgICAgICAgYXJyYXlbaV0gLT4gQ29tcHJlc3NTcGFjZSgpOwoKICAgICAg ICAgICAgaW50IGsgPSBhcnJheVtpXSAtPiB0eXBlX3N5bWJvbCAtPiBuYW1lX3N5bWJvbCAtPiBp bmRleCAlIGhhc2hfc2l6ZTsKICAgICAgICAgICAgYXJyYXlbaV0gLT4gbmV4dCA9IGJhc2Vba107 CiAgICAgICAgICAgIGJhc2Vba10gPSBhcnJheVtpXTsKICAgICAgICB9CiAgICB9CgogICAgRXhw YW5kZWRUeXBlVGFibGUoaW50IGhhc2hfc2l6ZV8gPSBERUZBVUxUX0hBU0hfU0laRSkgOiBzeW1i b2xfcG9vbCgxMCwgNCkKICAgIHsKICAgICAgICBoYXNoX3NpemUgPSAoaGFzaF9zaXplXyA8PSAw ID8gMSA6IChoYXNoX3NpemVfID4gTUFYX0hBU0hfU0laRSA/IE1BWF9IQVNIX1NJWkUgOiBoYXNo X3NpemVfKSk7CiAgICAgICAgYmFzZSA9IChUeXBlU2hhZG93U3ltYm9sICoqKSBtZW1zZXQobmV3 IFR5cGVTaGFkb3dTeW1ib2wgKltoYXNoX3NpemVdLCAwLCBoYXNoX3NpemUgKiBzaXplb2YoVHlw ZVNoYWRvd1N5bWJvbCAqKSk7CiAgICB9CgogICAgfkV4cGFuZGVkVHlwZVRhYmxlKCkKICAgIHsK ICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHN5bWJvbF9wb29sLkxlbmd0aCgpOyBrKyspCiAg ICAgICAgICAgIGRlbGV0ZSBzeW1ib2xfcG9vbFtrXTsKICAgICAgICBkZWxldGUgW10gYmFzZTsK ICAgIH0KCiAgICBpbmxpbmUgVHlwZVNoYWRvd1N5bWJvbCAqSW5zZXJ0VHlwZVNoYWRvd1N5bWJv bChUeXBlU3ltYm9sICp0eXBlX3N5bWJvbCkKICAgIHsKICAgICAgICBpbnQgaSA9IHR5cGVfc3lt Ym9sIC0+IG5hbWVfc3ltYm9sIC0+IGluZGV4ICUgaGFzaF9zaXplOwogICAgICAgIFR5cGVTaGFk b3dTeW1ib2wgKnAgPSBuZXcgVHlwZVNoYWRvd1N5bWJvbCh0eXBlX3N5bWJvbCk7CiAgICAgICAg cCAtPiBuZXh0ID0gYmFzZVtpXTsKICAgICAgICBiYXNlW2ldID0gcDsKICAgICAgICBzeW1ib2xf cG9vbC5OZXh0KCkgPSBwOwoKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUgVHlw ZVNoYWRvd1N5bWJvbCAqRmluZFR5cGVTaGFkb3dTeW1ib2woTmFtZVN5bWJvbCAqbmFtZV9zeW1i b2wpCiAgICB7CiAgICAgICAgVHlwZVNoYWRvd1N5bWJvbCAqcDsKICAgICAgICBmb3IgKHAgPSBi YXNlW25hbWVfc3ltYm9sIC0+IGluZGV4ICUgaGFzaF9zaXplXTsgcDsgcCA9IHAgLT4gbmV4dCkK ICAgICAgICAgICAgIGlmIChwIC0+IHR5cGVfc3ltYm9sIC0+IG5hbWVfc3ltYm9sID09IG5hbWVf c3ltYm9sKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIHJldHVybiBwOwogICAgfQoK cHJpdmF0ZToKICAgIFR5cGVTaGFkb3dTeW1ib2wgKipiYXNlOwogICAgaW50IGhhc2hfc2l6ZTsK fTsKCmNsYXNzIEV4cGFuZGVkRmllbGRUYWJsZQp7CnB1YmxpYzoKICAgIGVudW0KICAgIHsKICAg ICAgICBERUZBVUxUX0hBU0hfU0laRSA9IDI1MSwKICAgICAgICBNQVhfSEFTSF9TSVpFID0gNTA5 CiAgICB9OwoKICAgIENvbnZlcnRpYmxlQXJyYXk8VmFyaWFibGVTaGFkb3dTeW1ib2wgKj4gc3lt Ym9sX3Bvb2w7CgogICAgaW5saW5lIHZvaWQgQ29tcHJlc3NTcGFjZSgpCiAgICB7CiAgICAgICAg aGFzaF9zaXplID0gc3ltYm9sX3Bvb2wuTGVuZ3RoKCk7CiAgICAgICAgaGFzaF9zaXplID0gKGhh c2hfc2l6ZSA8PSAwID8gMSA6IChoYXNoX3NpemUgPiBNQVhfSEFTSF9TSVpFID8gTUFYX0hBU0hf U0laRSA6IGhhc2hfc2l6ZSkpOwogICAgICAgIGRlbGV0ZSBbXSBiYXNlOwogICAgICAgIGJhc2Ug PSAoVmFyaWFibGVTaGFkb3dTeW1ib2wgKiopIG1lbXNldChuZXcgVmFyaWFibGVTaGFkb3dTeW1i b2wgKltoYXNoX3NpemVdLCAwLCBoYXNoX3NpemUgKiBzaXplb2YoVmFyaWFibGVTaGFkb3dTeW1i b2wgKikpOwoKICAgICAgICBWYXJpYWJsZVNoYWRvd1N5bWJvbCAqKmFycmF5ID0gc3ltYm9sX3Bv b2wuQXJyYXkoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN5bWJvbF9wb29sLkxlbmd0 aCgpOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBhcnJheVtpXSAtPiBDb21wcmVzc1NwYWNl KCk7CgogICAgICAgICAgICBpbnQgayA9IGFycmF5W2ldIC0+IHZhcmlhYmxlX3N5bWJvbCAtPiBu YW1lX3N5bWJvbCAtPiBpbmRleCAlIGhhc2hfc2l6ZTsKICAgICAgICAgICAgYXJyYXlbaV0gLT4g bmV4dCA9IGJhc2Vba107CiAgICAgICAgICAgIGJhc2Vba10gPSBhcnJheVtpXTsKICAgICAgICB9 CiAgICB9CgogICAgRXhwYW5kZWRGaWVsZFRhYmxlKGludCBoYXNoX3NpemVfID0gREVGQVVMVF9I QVNIX1NJWkUpIDogc3ltYm9sX3Bvb2woMTAsIDQpCiAgICB7CiAgICAgICAgaGFzaF9zaXplID0g KGhhc2hfc2l6ZV8gPD0gMCA/IDEgOiAoaGFzaF9zaXplXyA+IE1BWF9IQVNIX1NJWkUgPyBNQVhf SEFTSF9TSVpFIDogaGFzaF9zaXplXykpOwogICAgICAgIGJhc2UgPSAoVmFyaWFibGVTaGFkb3dT eW1ib2wgKiopIG1lbXNldChuZXcgVmFyaWFibGVTaGFkb3dTeW1ib2wgKltoYXNoX3NpemVdLCAw LCBoYXNoX3NpemUgKiBzaXplb2YoVmFyaWFibGVTaGFkb3dTeW1ib2wgKikpOwogICAgfQogICAg fkV4cGFuZGVkRmllbGRUYWJsZSgpCiAgICB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBz eW1ib2xfcG9vbC5MZW5ndGgoKTsgaSsrKQogICAgICAgICAgICBkZWxldGUgc3ltYm9sX3Bvb2xb aV07CiAgICAgICAgZGVsZXRlIFtdIGJhc2U7CiAgICB9CgogICAgaW5saW5lIFZhcmlhYmxlU2hh ZG93U3ltYm9sICpJbnNlcnRWYXJpYWJsZVNoYWRvd1N5bWJvbChWYXJpYWJsZVN5bWJvbCAqdmFy aWFibGVfc3ltYm9sKQogICAgewogICAgICAgIGludCBpID0gdmFyaWFibGVfc3ltYm9sIC0+IG5h bWVfc3ltYm9sIC0+IGluZGV4ICUgaGFzaF9zaXplOwogICAgICAgIFZhcmlhYmxlU2hhZG93U3lt Ym9sICpwID0gbmV3IFZhcmlhYmxlU2hhZG93U3ltYm9sKHZhcmlhYmxlX3N5bWJvbCk7CiAgICAg ICAgcCAtPiBuZXh0ID0gYmFzZVtpXTsKICAgICAgICBiYXNlW2ldID0gcDsKICAgICAgICBzeW1i b2xfcG9vbC5OZXh0KCkgPSBwOwoKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUg VmFyaWFibGVTaGFkb3dTeW1ib2wgKkZpbmRWYXJpYWJsZVNoYWRvd1N5bWJvbChOYW1lU3ltYm9s ICpuYW1lX3N5bWJvbCkKICAgIHsKICAgICAgICBWYXJpYWJsZVNoYWRvd1N5bWJvbCAqcDsKICAg ICAgICBmb3IgKHAgPSBiYXNlW25hbWVfc3ltYm9sIC0+IGluZGV4ICUgaGFzaF9zaXplXTsgcDsg cCA9IHAgLT4gbmV4dCkKICAgICAgICAgICAgaWYgKHAgLT4gdmFyaWFibGVfc3ltYm9sIC0+IG5h bWVfc3ltYm9sID09IG5hbWVfc3ltYm9sKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAg cmV0dXJuIHA7CiAgICB9Cgpwcml2YXRlOgogICAgVmFyaWFibGVTaGFkb3dTeW1ib2wgKipiYXNl OwogICAgaW50IGhhc2hfc2l6ZTsKfTsKCgpjbGFzcyBFeHBhbmRlZE1ldGhvZFRhYmxlCnsKcHVi bGljOgogICAgZW51bQogICAgewogICAgICAgIERFRkFVTFRfSEFTSF9TSVpFID0gMjUxLAogICAg ICAgIE1BWF9IQVNIX1NJWkUgPSA1MDkKICAgIH07CgogICAgQ29udmVydGlibGVBcnJheTxNZXRo b2RTaGFkb3dTeW1ib2wgKj4gc3ltYm9sX3Bvb2w7CgogICAgaW5saW5lIHZvaWQgQ29tcHJlc3NT cGFjZSgpCiAgICB7CiAgICAgICAgaGFzaF9zaXplID0gc3ltYm9sX3Bvb2wuTGVuZ3RoKCk7CiAg ICAgICAgaGFzaF9zaXplID0gKGhhc2hfc2l6ZSA8PSAwID8gMSA6IChoYXNoX3NpemUgPiBNQVhf SEFTSF9TSVpFID8gTUFYX0hBU0hfU0laRSA6IGhhc2hfc2l6ZSkpOwogICAgICAgIGRlbGV0ZSBb XSBiYXNlOwogICAgICAgIGJhc2UgPSAoTWV0aG9kU2hhZG93U3ltYm9sICoqKSBtZW1zZXQobmV3 IE1ldGhvZFNoYWRvd1N5bWJvbCAqW2hhc2hfc2l6ZV0sIDAsIGhhc2hfc2l6ZSAqIHNpemVvZihN ZXRob2RTaGFkb3dTeW1ib2wgKikpOwoKICAgICAgICBNZXRob2RTaGFkb3dTeW1ib2wgKiphcnJh eSA9IHN5bWJvbF9wb29sLkFycmF5KCk7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzeW1i b2xfcG9vbC5MZW5ndGgoKTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgYXJyYXlbaV0gLT4g Q29tcHJlc3NTcGFjZSgpOwoKICAgICAgICAgICAgTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wgPSBh cnJheVtpXSAtPiBtZXRob2Rfc3ltYm9sIC0+IG5hbWVfc3ltYm9sOwogICAgICAgICAgICBNZXRo b2RTaGFkb3dTeW1ib2wgKmJhc2Vfc2hhZG93ID0gRmluZE1ldGhvZFNoYWRvd1N5bWJvbChuYW1l X3N5bWJvbCk7CiAgICAgICAgICAgIGlmICghIGJhc2Vfc2hhZG93KQogICAgICAgICAgICB7CiAg ICAgICAgICAgICAgICBpbnQgayA9IG5hbWVfc3ltYm9sIC0+IGluZGV4ICUgaGFzaF9zaXplOwog ICAgICAgICAgICAgICAgYXJyYXlbaV0gLT4gbmV4dCA9IGJhc2Vba107CiAgICAgICAgICAgICAg ICBiYXNlW2tdID0gYXJyYXlbaV07CiAgICAgICAgICAgICAgICBhcnJheVtpXSAtPiBuZXh0X21l dGhvZCA9IF9fbnVsbCA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICBhcnJheVtpXSAtPiBuZXh0X21ldGhvZCA9IGJhc2Vfc2hhZG93 IC0+IG5leHRfbWV0aG9kOwogICAgICAgICAgICAgICAgYmFzZV9zaGFkb3cgLT4gbmV4dF9tZXRo b2QgPSBhcnJheVtpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBFeHBhbmRl ZE1ldGhvZFRhYmxlKGludCBoYXNoX3NpemVfID0gREVGQVVMVF9IQVNIX1NJWkUpIDogc3ltYm9s X3Bvb2woMTAsIDQpCiAgICB7CiAgICAgICAgaGFzaF9zaXplID0gKGhhc2hfc2l6ZV8gPD0gMCA/ IDEgOiAoaGFzaF9zaXplXyA+IE1BWF9IQVNIX1NJWkUgPyBNQVhfSEFTSF9TSVpFIDogaGFzaF9z aXplXykpOwogICAgICAgIGJhc2UgPSAoTWV0aG9kU2hhZG93U3ltYm9sICoqKSBtZW1zZXQobmV3 IE1ldGhvZFNoYWRvd1N5bWJvbCAqW2hhc2hfc2l6ZV0sIDAsIGhhc2hfc2l6ZSAqIHNpemVvZihN ZXRob2RTaGFkb3dTeW1ib2wgKikpOwogICAgfQogICAgfkV4cGFuZGVkTWV0aG9kVGFibGUoKQog ICAgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ltYm9sX3Bvb2wuTGVuZ3RoKCk7IGkr KykKICAgICAgICAgICAgZGVsZXRlIHN5bWJvbF9wb29sW2ldOwogICAgICAgZGVsZXRlIFtdIGJh c2U7CiAgICB9CgogICAgaW5saW5lIE1ldGhvZFNoYWRvd1N5bWJvbCAqRmluZE1ldGhvZFNoYWRv d1N5bWJvbChOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCkKICAgIHsKICAgICAgICBNZXRob2RTaGFk b3dTeW1ib2wgKnA7CiAgICAgICAgZm9yIChwID0gYmFzZVtuYW1lX3N5bWJvbCAtPiBpbmRleCAl IGhhc2hfc2l6ZV07IHA7IHAgPSBwIC0+IG5leHQpCiAgICAgICAgICAgIGlmIChwIC0+IG1ldGhv ZF9zeW1ib2wgLT4gbmFtZV9zeW1ib2wgPT0gbmFtZV9zeW1ib2wpCiAgICAgICAgICAgICAgICBi cmVhazsKICAgICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBJbnNlcnRNZXRo b2RTaGFkb3dTeW1ib2woTWV0aG9kU3ltYm9sICptZXRob2Rfc3ltYm9sKQogICAgewogICAgICAg IGludCBpID0gbWV0aG9kX3N5bWJvbCAtPiBuYW1lX3N5bWJvbCAtPiBpbmRleCAlIGhhc2hfc2l6 ZTsKICAgICAgICBNZXRob2RTaGFkb3dTeW1ib2wgKnAgPSBuZXcgTWV0aG9kU2hhZG93U3ltYm9s KG1ldGhvZF9zeW1ib2wpOwogICAgICAgIHAgLT4gbmV4dF9tZXRob2QgPSBfX251bGwgOwogICAg ICAgIHAgLT4gbmV4dCA9IGJhc2VbaV07CiAgICAgICAgYmFzZVtpXSA9IHA7CiAgICAgICAgc3lt Ym9sX3Bvb2wuTmV4dCgpID0gcDsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlubGluZSB2 b2lkIE92ZXJsb2FkKE1ldGhvZFNoYWRvd1N5bWJvbCAqYmFzZV9zaGFkb3csIE1ldGhvZFN5bWJv bCAqb3ZlcmxvYWRfbWV0aG9kKQogICAgewogICAgICAgIE1ldGhvZFNoYWRvd1N5bWJvbCAqc2hh ZG93ID0gbmV3IE1ldGhvZFNoYWRvd1N5bWJvbChvdmVybG9hZF9tZXRob2QpOwogICAgICAgIHN5 bWJvbF9wb29sLk5leHQoKSA9IHNoYWRvdzsKICAgICAgICBzaGFkb3cgLT4gbmV4dF9tZXRob2Qg PSBiYXNlX3NoYWRvdyAtPiBuZXh0X21ldGhvZDsKICAgICAgICBiYXNlX3NoYWRvdyAtPiBuZXh0 X21ldGhvZCA9IHNoYWRvdzsKICAgIH0KCiAgICBpbmxpbmUgdm9pZCBPdmVybG9hZChNZXRob2RT eW1ib2wgKm92ZXJsb2FkX21ldGhvZCkKICAgIHsKICAgICAgICBNZXRob2RTaGFkb3dTeW1ib2wg KmJhc2Vfc2hhZG93ID0gRmluZE1ldGhvZFNoYWRvd1N5bWJvbChvdmVybG9hZF9tZXRob2QgLT4g bmFtZV9zeW1ib2wpOwogICAgICAgIGlmICghIGJhc2Vfc2hhZG93KQogICAgICAgICAgICAgSW5z ZXJ0TWV0aG9kU2hhZG93U3ltYm9sKG92ZXJsb2FkX21ldGhvZCk7CiAgICAgICAgZWxzZSBPdmVy bG9hZChiYXNlX3NoYWRvdywgb3ZlcmxvYWRfbWV0aG9kKTsKICAgIH0KCiAgICBNZXRob2RTaGFk b3dTeW1ib2wgKkZpbmRPdmVybG9hZE1ldGhvZFNoYWRvdyhNZXRob2RTeW1ib2wgKm92ZXJsb2Fk X21ldGhvZCwgU2VtYW50aWMgKnNlbSwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHRvaykKICAgIHsK ICAgICAgICBpZiAoISBvdmVybG9hZF9tZXRob2QgLT4gSXNUeXBlZCgpKQogICAgICAgICAgICBv dmVybG9hZF9tZXRob2QgLT4gUHJvY2Vzc01ldGhvZFNpZ25hdHVyZShzZW0sIHRvayk7CgogICAg ICAgIGZvciAoTWV0aG9kU2hhZG93U3ltYm9sICptZXRob2Rfc2hhZG93ID0gRmluZE1ldGhvZFNo YWRvd1N5bWJvbChvdmVybG9hZF9tZXRob2QgLT4gbmFtZV9zeW1ib2wpOwogICAgICAgICAgICAg bWV0aG9kX3NoYWRvdzsKICAgICAgICAgICAgIG1ldGhvZF9zaGFkb3cgPSBtZXRob2Rfc2hhZG93 IC0+IG5leHRfbWV0aG9kKQogICAgICAgIHsKICAgICAgICAgICAgTWV0aG9kU3ltYm9sICptZXRo b2QgPSBtZXRob2Rfc2hhZG93IC0+IG1ldGhvZF9zeW1ib2w7CgogICAgICAgICAgICBpZiAob3Zl cmxvYWRfbWV0aG9kID09IG1ldGhvZCkKICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Rfc2hh ZG93OwoKICAgICAgICAgICAgaWYgKCEgbWV0aG9kIC0+IElzVHlwZWQoKSkKICAgICAgICAgICAg ICAgIG1ldGhvZCAtPiBQcm9jZXNzTWV0aG9kU2lnbmF0dXJlKHNlbSwgdG9rKTsKCiAgICAgICAg ICAgIGlmIChvdmVybG9hZF9tZXRob2QgLT4gTnVtRm9ybWFsUGFyYW1ldGVycygpID09IG1ldGhv ZCAtPiBOdW1Gb3JtYWxQYXJhbWV0ZXJzKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg IGludCBpOwogICAgICAgICAgICAgICAgZm9yIChpID0gbWV0aG9kIC0+IE51bUZvcm1hbFBhcmFt ZXRlcnMoKSAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAg ICAgICAgIGlmIChtZXRob2QgLT4gRm9ybWFsUGFyYW1ldGVyKGkpIC0+IFR5cGUoKSAhPSBvdmVy bG9hZF9tZXRob2QgLT4gRm9ybWFsUGFyYW1ldGVyKGkpIC0+IFR5cGUoKSkKICAgICAgICAgICAg ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYg KGkgPCAwKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Rfc2hhZG93OwogICAgICAg ICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKE1ldGhvZFNoYWRvd1N5bWJvbCAqKSBf X251bGwgOwogICAgfQoKcHJpdmF0ZToKICAgIE1ldGhvZFNoYWRvd1N5bWJvbCAqKmJhc2U7CiAg ICBpbnQgaGFzaF9zaXplOwp9OwoKCgoKCgoKIyAxNiAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3Bw IiAyCgoKIyAxICIuLi8uLi9qaWtlcy9zcmMvc3BlbGwuaCIgMQogCiAKIAogCiAKIAogCiAKIAoK CgoKCgoKCgoKY2xhc3MgU3BlbGwKewogICAgc3RhdGljIGlubGluZSBpbnQgTWluKGludCB4LCBp bnQgeSkgeyByZXR1cm4gKHggPCB5ID8geCA6IHkpOyB9CgpwdWJsaWM6CiAgICBzdGF0aWMgaW50 IEluZGV4KHdjaGFyX3QgKnN0cjEsIHdjaGFyX3QgKnN0cjIpCiAgICB7CiAgICAgICAgaW50IGxl bjEgPSB3Y3NsZW4oc3RyMSksCiAgICAgICAgICAgIGxlbjIgPSB3Y3NsZW4oc3RyMik7CgogICAg ICAgIHdjaGFyX3QgKnMxID0gbmV3IHdjaGFyX3RbbGVuMSArIDFdLAogICAgICAgICAgICAgICAg KnMyID0gbmV3IHdjaGFyX3RbbGVuMiArIDFdOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8 IGxlbjE7IGkrKykKICAgICAgICAgICAgczFbaV0gPSBDYXNlOjpUb0FzY2lpTG93ZXIoc3RyMVtp XSk7CiAgICAgICAgczFbbGVuMV0gPSBVX05VTEw7CgogICAgICAgIGZvciAoaW50IGogPSAwOyBq IDwgbGVuMjsgaisrKQogICAgICAgICAgICBzMltqXSA9IENhc2U6OlRvQXNjaWlMb3dlcihzdHIy W2pdKTsKICAgICAgICBzMltsZW4yXSA9IFVfTlVMTDsKCiAgICAgICAgaWYgKGxlbjEgPT0gMSAm JiBsZW4yID09IDEpCiAgICAgICAgewogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAg ICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAg ICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAg ICAgICAKICAgICAgICAgICAgaWYgKChzMVswXSA9PSBVX1NFTUlDT0xPTiAgICAmJiAgczJbMF0g PT0gVV9DT01NQSkgIHx8CiAgICAgICAgICAgICAgICAoczFbMF0gPT0gVV9DT01NQSAgICAgICAg JiYgIHMyWzBdID09IFVfU0VNSUNPTE9OKSAgfHwKICAgICAgICAgICAgICAgIChzMVswXSA9PSBV X1NFTUlDT0xPTiAgICAmJiAgczJbMF0gPT0gVV9DT0xPTikgIHx8CiAgICAgICAgICAgICAgICAo czFbMF0gPT0gVV9DT0xPTiAgICAgICAgJiYgIHMyWzBdID09IFVfU0VNSUNPTE9OKSAgfHwKICAg ICAgICAgICAgICAgIChzMVswXSA9PSBVX0RPVCAgICAgICAgICAmJiAgczJbMF0gPT0gVV9DT01N QSkgIHx8CiAgICAgICAgICAgICAgICAoczFbMF0gPT0gVV9DT01NQSAgICAgICAgJiYgIHMyWzBd ID09IFVfRE9UKSAgfHwKICAgICAgICAgICAgICAgIChzMVswXSA9PSBVX1NJTkdMRV9RVU9URSAm JiAgczJbMF0gPT0gVV9ET1VCTEVfUVVPVEUpICB8fAogICAgICAgICAgICAgICAgKHMxWzBdID09 IFVfRE9VQkxFX1FVT1RFICYmICBzMlswXSA9PSBVX1NJTkdMRV9RVU9URSkpCiAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgfQoKICAgICAgICAgCiAgICAgICAgIAogICAgICAg ICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgIGludCBjb3VudCA9IDAsCiAgICAgICAg ICAgIHByZWZpeF9sZW5ndGggPSAwLAogICAgICAgICAgICBudW1fZXJyb3JzID0gMCwKICAgICAg ICAgICAgaTEgPSAwLAogICAgICAgICAgICBpMiA9IDA7CgogICAgICAgIHdoaWxlICgoaTEgPCBs ZW4xKSAgJiYgIChpMiA8IGxlbjIpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHMxW2kxXSA9 PSBzMltpMl0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAg ICAgICAgICBpMSsrOwogICAgICAgICAgICAgICAgaTIrKzsKICAgICAgICAgICAgICAgIGlmIChu dW1fZXJyb3JzID09IDApCiAgICAgICAgICAgICAgICAgICAgcHJlZml4X2xlbmd0aCsrOwogICAg ICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHMxW2kxICsgMV0gPT0gczJbaTJdICAmJiAg czFbaTFdID09IHMyW2kyICsgMV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvdW50 ICs9IDI7CiAgICAgICAgICAgICAgICBpMSArPSAyOwogICAgICAgICAgICAgICAgaTIgKz0gMjsK ICAgICAgICAgICAgICAgIG51bV9lcnJvcnMrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBl bHNlIGlmIChzMVtpMSArIDFdID09IHMyW2kyICsgMV0pCiAgICAgICAgICAgIHsKICAgICAgICAg ICAgICAgIGkxKys7CiAgICAgICAgICAgICAgICBpMisrOwogICAgICAgICAgICAgICAgbnVtX2Vy cm9ycysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAg ICAgICAgICAgICAgaWYgKChsZW4xIC0gaTEpID4gKGxlbjIgLSBpMikpCiAgICAgICAgICAgICAg ICAgICAgIGkxKys7CiAgICAgICAgICAgICAgICBlbHNlIGlmICgobGVuMiAtIGkyKSA+IChsZW4x IC0gaTEpKQogICAgICAgICAgICAgICAgICAgICBpMisrOwogICAgICAgICAgICAgICAgZWxzZQog ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGkxKys7CiAgICAgICAgICAgICAg ICAgICAgaTIrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG51bV9lcnJvcnMr KzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGkxIDwgbGVuMSAgfHwgIGky IDwgbGVuMikKICAgICAgICAgICAgbnVtX2Vycm9ycysrOwoKICAgICAgICBpZiAobnVtX2Vycm9y cyA+IChNaW4obGVuMSwgbGVuMikgLyA2ICsgMSkpCiAgICAgICAgICAgICBjb3VudCA9IHByZWZp eF9sZW5ndGg7CgogICAgICAgIGRlbGV0ZSBbXSBzMTsKICAgICAgICBkZWxldGUgW10gczI7Cgog ICAgICAgIHJldHVybiAoY291bnQgKiAxMCAvIChsZW4xICsgbnVtX2Vycm9ycykpOwogICAgfQp9 OwoKCgoKCgoKIyAxOCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiAyCgoKIAoKCgoKCgoKCgoK Ym9vbCBTZW1hbnRpYzo6SXNJbnRWYWx1ZVJlcHJlc2VudGFibGVJblR5cGUoQXN0RXhwcmVzc2lv biAqZXhwciwgVHlwZVN5bWJvbCAqdHlwZSkKewogICAgSW50TGl0ZXJhbFZhbHVlICpsaXRlcmFs ID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHZhbHVlOwoKICAgIHJldHVybiAoZXhwciAt PiBJc0NvbnN0YW50KCkgJiYKICAgICAgICAgICAgY29udHJvbC5Jc1NpbXBsZUludGVnZXJWYWx1 ZVR5cGUoZXhwciAtPiBUeXBlKCkpICYmCiAgICAgICAgICAgICh0eXBlID09IGNvbnRyb2wuaW50 X3R5cGUgfHwKICAgICAgICAgICAgIHR5cGUgPT0gY29udHJvbC5ub190eXBlICB8fAogICAgICAg ICAgICAgKHR5cGUgPT0gY29udHJvbC5jaGFyX3R5cGUgJiYgKGxpdGVyYWwgLT4gdmFsdWUgPj0g MCkgJiYgKGxpdGVyYWwgLT4gdmFsdWUgPD0gNjU1MzUpKSB8fAogICAgICAgICAgICAgKHR5cGUg PT0gY29udHJvbC5ieXRlX3R5cGUgJiYgKGxpdGVyYWwgLT4gdmFsdWUgPj0gLTEyOCkgJiYgKGxp dGVyYWwgLT4gdmFsdWUgPD0gMTI3KSkgfHwKICAgICAgICAgICAgICh0eXBlID09IGNvbnRyb2wu c2hvcnRfdHlwZSAmJiAobGl0ZXJhbCAtPiB2YWx1ZSA+PSAtMzI3NjgpICYmIChsaXRlcmFsIC0+ IHZhbHVlIDw9IDMyNzY3KSkpKTsKfQoKCmlubGluZSBib29sIFNlbWFudGljOjpNb3JlU3BlY2lm aWMoTWV0aG9kU3ltYm9sICpzb3VyY2VfbWV0aG9kLCBNZXRob2RTeW1ib2wgKnRhcmdldF9tZXRo b2QpCnsKICAgIGlmICghIENhbk1ldGhvZEludm9jYXRpb25Db252ZXJ0KHRhcmdldF9tZXRob2Qg LT4gY29udGFpbmluZ190eXBlLCBzb3VyY2VfbWV0aG9kIC0+IGNvbnRhaW5pbmdfdHlwZSkpCiAg ICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGZvciAoaW50IGsgPSB0YXJnZXRfbWV0aG9kIC0+IE51 bUZvcm1hbFBhcmFtZXRlcnMoKSAtIDE7IGsgPj0gMDsgay0tKQogICAgewogICAgICAgIGlmICgh IENhbk1ldGhvZEludm9jYXRpb25Db252ZXJ0KHRhcmdldF9tZXRob2QgLT4gRm9ybWFsUGFyYW1l dGVyKGspIC0+IFR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzb3VyY2VfbWV0aG9kIC0+IEZvcm1hbFBhcmFtZXRlcihrKSAtPiBUeXBlKCkpKQogICAgICAg ICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIHRydWU7Cn0KCgppbmxpbmUgYm9v bCBTZW1hbnRpYzo6TW9yZVNwZWNpZmljKE1ldGhvZFN5bWJvbCAqbWV0aG9kLCBUdXBsZTxNZXRo b2RTeW1ib2wgKj4gJm1heGltYWxseV9zcGVjaWZpY19tZXRob2QpCnsKICAgIGZvciAoaW50IGkg PSAwOyBpIDwgbWF4aW1hbGx5X3NwZWNpZmljX21ldGhvZC5MZW5ndGgoKTsgaSsrKQogICAgewog ICAgICAgIGlmICghIE1vcmVTcGVjaWZpYyhtZXRob2QsIG1heGltYWxseV9zcGVjaWZpY19tZXRo b2RbaV0pKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIHRydWU7 Cn0KCgppbmxpbmUgYm9vbCBTZW1hbnRpYzo6Tm9NZXRob2RNb3JlU3BlY2lmaWMoVHVwbGU8TWV0 aG9kU3ltYm9sICo+ICZtYXhpbWFsbHlfc3BlY2lmaWNfbWV0aG9kLCBNZXRob2RTeW1ib2wgKm1l dGhvZCkKewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhpbWFsbHlfc3BlY2lmaWNfbWV0aG9k Lkxlbmd0aCgpOyBpKyspCiAgICB7CiAgICAgICAgaWYgKE1vcmVTcGVjaWZpYyhtYXhpbWFsbHlf c3BlY2lmaWNfbWV0aG9kW2ldLCBtZXRob2QpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAg ICB9CgogICAgcmV0dXJuIHRydWU7Cn0KCgp2b2lkIFNlbWFudGljOjpSZXBvcnRNZXRob2ROb3RG b3VuZChBc3QgKmFzdCwgd2NoYXJfdCAqbmFtZSkKewogICAgU2VtYW50aWNFcnJvcjo6U2VtYW50 aWNFcnJvcktpbmQga2luZDsKCiAgICBpbnQgbnVtX2FyZ3VtZW50czsKICAgIEFzdEV4cHJlc3Np b24gKiphcmd1bWVudDsKCiAgICBBc3RNZXRob2RJbnZvY2F0aW9uICptZXRob2RfY2FsbDsKICAg IGlmICgobWV0aG9kX2NhbGwgPSBhc3QgLT4gTWV0aG9kSW52b2NhdGlvbkNhc3QoKSkpCiAgICB7 CiAgICAgICAga2luZCA9IFNlbWFudGljRXJyb3I6Ok1FVEhPRF9OT1RfRk9VTkQ7CiAgICAgICAg bnVtX2FyZ3VtZW50cyA9IG1ldGhvZF9jYWxsIC0+IE51bUFyZ3VtZW50cygpOwogICAgICAgIGFy Z3VtZW50ID0gbmV3IEFzdEV4cHJlc3Npb24qW251bV9hcmd1bWVudHMgKyAxXTsKICAgICAgICBm b3IgKGludCBpID0gMDsgaSA8IG51bV9hcmd1bWVudHM7IGkrKykKICAgICAgICAgICAgYXJndW1l bnRbaV0gPSBtZXRob2RfY2FsbCAtPiBBcmd1bWVudChpKTsKICAgIH0KICAgIGVsc2UKICAgIHsK ICAgICAgICBraW5kID0gU2VtYW50aWNFcnJvcjo6Q09OU1RSVUNUT1JfTk9UX0ZPVU5EOwoKICAg ICAgICBBc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uICpjbGFzc19jcmVhdGlvbjsK ICAgICAgICBBc3RTdXBlckNhbGwgKnN1cGVyX2NhbGw7CgogICAgICAgIGlmICgoY2xhc3NfY3Jl YXRpb24gPSBhc3QgLT4gQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbkNhc3QoKSkpCiAg ICAgICAgewogICAgICAgICAgICBudW1fYXJndW1lbnRzID0gY2xhc3NfY3JlYXRpb24gLT4gTnVt QXJndW1lbnRzKCk7CiAgICAgICAgICAgIGFyZ3VtZW50ID0gbmV3IEFzdEV4cHJlc3Npb24qW251 bV9hcmd1bWVudHMgKyAxXTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJn dW1lbnRzOyBpKyspCiAgICAgICAgICAgICAgICBhcmd1bWVudFtpXSA9IGNsYXNzX2NyZWF0aW9u IC0+IEFyZ3VtZW50KGkpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgoc3VwZXJfY2FsbCA9 IGFzdCAtPiBTdXBlckNhbGxDYXN0KCkpKQogICAgICAgIHsKICAgICAgICAgICAgbnVtX2FyZ3Vt ZW50cyA9IHN1cGVyX2NhbGwgLT4gTnVtQXJndW1lbnRzKCk7CiAgICAgICAgICAgIGFyZ3VtZW50 ID0gbmV3IEFzdEV4cHJlc3Npb24qW251bV9hcmd1bWVudHMgKyAxXTsKICAgICAgICAgICAgZm9y IChpbnQgaSA9IDA7IGkgPCBudW1fYXJndW1lbnRzOyBpKyspCiAgICAgICAgICAgICAgICBhcmd1 bWVudFtpXSA9IHN1cGVyX2NhbGwgLT4gQXJndW1lbnQoaSk7CiAgICAgICAgfQogICAgICAgIGVs c2UKICAgICAgICB7CiAgICAgICAgICAgIEFzdFRoaXNDYWxsICp0aGlzX2NhbGwgPSBhc3QgLT4g VGhpc0NhbGxDYXN0KCk7CgogICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIHRoaXNf Y2FsbCApID8gMCA6CShfX2Fzc2VydF9mYWlsICgidGhpc19jYWxsIiAsICIuLi8uLi9qaWtlcy9z cmMvZXhwci5jcHAiLCAxMjYsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgICAg ICAgICBudW1fYXJndW1lbnRzID0gdGhpc19jYWxsIC0+IE51bUFyZ3VtZW50cygpOwogICAgICAg ICAgICBhcmd1bWVudCA9IG5ldyBBc3RFeHByZXNzaW9uKltudW1fYXJndW1lbnRzICsgMV07CiAg ICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2FyZ3VtZW50czsgaSsrKQogICAgICAg ICAgICAgICAgYXJndW1lbnRbaV0gPSB0aGlzX2NhbGwgLT4gQXJndW1lbnQoaSk7CiAgICAgICAg fQogICAgfQoKICAgIGludCBsZW5ndGggPSB3Y3NsZW4obmFtZSk7CgogICAgZm9yIChpbnQgaSA9 IDA7IGkgPCBudW1fYXJndW1lbnRzOyBpKyspCiAgICB7CiAgICAgICAgVHlwZVN5bWJvbCAqYXJn X3R5cGUgPSBhcmd1bWVudFtpXSAtPiBUeXBlKCk7CiAgICAgICAgbGVuZ3RoICs9IGFyZ190eXBl IC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWVMZW5ndGgoKSArCiAgICAgICAg ICAgICAgICAgIGFyZ190eXBlIC0+IEV4dGVybmFsTmFtZUxlbmd0aCgpICsgMzsgIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIH0K CiAgICB3Y2hhcl90ICpoZWFkZXIgPSBuZXcgd2NoYXJfdFtsZW5ndGggKyAzXTsgIAogICAgd2No YXJfdCAqcyA9IGhlYWRlcjsKCiAgICBmb3IgKHdjaGFyX3QgKnMyID0gbmFtZTsgKnMyOyBzMisr KQogICAgICAgICAqcysrID0gKnMyOwogICAgKnMrKyA9IFVfTEVGVF9QQVJFTlRIRVNJUzsKICAg IGlmIChudW1fYXJndW1lbnRzID4gMCkKICAgIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8 IG51bV9hcmd1bWVudHM7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIFR5cGVTeW1ib2wgKmFy Z190eXBlID0gYXJndW1lbnRbaV0gLT4gVHlwZSgpOwoKICAgICAgICAgICAgUGFja2FnZVN5bWJv bCAqcGFja2FnZSA9IGFyZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCk7CiAgICAgICAgICAg IHdjaGFyX3QgKnBhY2thZ2VfbmFtZSA9IHBhY2thZ2UgLT4gUGFja2FnZU5hbWUoKTsKICAgICAg ICAgICAgaWYgKHBhY2thZ2UgLT4gUGFja2FnZU5hbWVMZW5ndGgoKSA+IDAgJiYgd2NzY21wKHBh Y2thZ2VfbmFtZSwgU3RyaW5nQ29uc3RhbnQ6OlVTX19ETykgIT0gMCkKICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgd2hpbGUgKCpwYWNrYWdlX25hbWUpCiAgICAgICAgICAgICAgICB7CiAg ICAgICAgICAgICAgICAgICAgKnMrKyA9ICgqcGFja2FnZV9uYW1lID09IFVfU0xBU0ggPyAod2No YXJfdCkgVV9ET1QgOiAqcGFja2FnZV9uYW1lKTsKICAgICAgICAgICAgICAgICAgICBwYWNrYWdl X25hbWUrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICpzKysgPSBVX0RPVDsK ICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh3Y2hhcl90ICpzMiA9IGFyZ190eXBlIC0+ IEV4dGVybmFsTmFtZSgpOyAqczI7IHMyKyspCiAgICAgICAgICAgICAgICAqcysrID0gKCpzMiA9 PSBVX0RPTExBUiA/ICh3Y2hhcl90KSBVX0RPVCA6ICpzMik7CiAgICAgICAgICAgICpzKysgPSBV X0NPTU1BOwogICAgICAgICAgICAqcysrID0gVV9TUEFDRTsKICAgICAgICB9CgogICAgICAgIHMg LT0gMjsgIAogICAgfQogICAgKnMrKyA9IFVfUklHSFRfUEFSRU5USEVTSVM7CiAgICAqcyA9IFVf TlVMTDsKCiAgICBSZXBvcnRTZW1FcnJvcihraW5kLAogICAgICAgICAgICAgICAgICAgYXN0IC0+ IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgYXN0IC0+IFJpZ2h0VG9rZW4oKSwKICAg ICAgICAgICAgICAgICAgIGhlYWRlcik7CgogICAgZGVsZXRlIFtdIGhlYWRlcjsKICAgIGRlbGV0 ZSBbXSBhcmd1bWVudDsKCiAgICByZXR1cm47Cn0KCgpNZXRob2RTeW1ib2wgKlNlbWFudGljOjpG aW5kQ29uc3RydWN0b3IoVHlwZVN5bWJvbCAqY29udGFpbmluZ190eXBlLCBBc3QgKmFzdCwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExleFN0cmVhbTo6VG9rZW5JbmRl eCBsZWZ0X3RvaywgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHJpZ2h0X3RvaykKewogICAgVHVwbGU8 TWV0aG9kU3ltYm9sICo+IGNvbnN0cnVjdG9yX3NldCgyKTsKCiAgICBpbnQgbnVtX2FyZ3VtZW50 czsKICAgIEFzdEV4cHJlc3Npb24gKiphcmd1bWVudDsKCiAgICBBc3RDbGFzc0luc3RhbmNlQ3Jl YXRpb25FeHByZXNzaW9uICpjbGFzc19jcmVhdGlvbjsKICAgIEFzdFN1cGVyQ2FsbCAqc3VwZXJf Y2FsbDsKCiAgICBpZiAoKGNsYXNzX2NyZWF0aW9uID0gYXN0IC0+IENsYXNzSW5zdGFuY2VDcmVh dGlvbkV4cHJlc3Npb25DYXN0KCkpKQogICAgewogICAgICAgIG51bV9hcmd1bWVudHMgPSBjbGFz c19jcmVhdGlvbiAtPiBOdW1Bcmd1bWVudHMoKTsKICAgICAgICBhcmd1bWVudCA9IG5ldyBBc3RF eHByZXNzaW9uKltudW1fYXJndW1lbnRzICsgMV07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkg PCBudW1fYXJndW1lbnRzOyBpKyspCiAgICAgICAgICAgIGFyZ3VtZW50W2ldID0gY2xhc3NfY3Jl YXRpb24gLT4gQXJndW1lbnQoaSk7CiAgICB9CiAgICBlbHNlIGlmICgoc3VwZXJfY2FsbCA9IGFz dCAtPiBTdXBlckNhbGxDYXN0KCkpKQogICAgewogICAgICAgIG51bV9hcmd1bWVudHMgPSBzdXBl cl9jYWxsIC0+IE51bUFyZ3VtZW50cygpOwogICAgICAgIGFyZ3VtZW50ID0gbmV3IEFzdEV4cHJl c3Npb24qW251bV9hcmd1bWVudHMgKyAxXTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51 bV9hcmd1bWVudHM7IGkrKykKICAgICAgICAgICAgYXJndW1lbnRbaV0gPSBzdXBlcl9jYWxsIC0+ IEFyZ3VtZW50KGkpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIEFzdFRoaXNDYWxsICp0 aGlzX2NhbGwgPSBhc3QgLT4gVGhpc0NhbGxDYXN0KCk7CgogICAgICAgIChzdGF0aWNfY2FzdDx2 b2lkPiAgKCggdGhpc19jYWxsICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJ0aGlzX2NhbGwiICwg Ii4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDIyMSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAw KSkpIDsKCiAgICAgICAgbnVtX2FyZ3VtZW50cyA9IHRoaXNfY2FsbCAtPiBOdW1Bcmd1bWVudHMo KTsKICAgICAgICBhcmd1bWVudCA9IG5ldyBBc3RFeHByZXNzaW9uKltudW1fYXJndW1lbnRzICsg MV07CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJndW1lbnRzOyBpKyspCiAgICAg ICAgICAgIGFyZ3VtZW50W2ldID0gdGhpc19jYWxsIC0+IEFyZ3VtZW50KGkpOwogICAgfQoKICAg IChzdGF0aWNfY2FzdDx2b2lkPiAgKCggY29udGFpbmluZ190eXBlIC0+IENvbnN0cnVjdG9yTWVt YmVyc1Byb2Nlc3NlZCgpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJjb250YWluaW5nX3R5cGUg LT4gQ29uc3RydWN0b3JNZW1iZXJzUHJvY2Vzc2VkKCkiICwgIi4uLy4uL2ppa2VzL3NyYy9leHBy LmNwcCIsIDIyOSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICBmb3IgKE1ldGhv ZFN5bWJvbCAqY29uc3RydWN0b3IgPSBjb250YWluaW5nX3R5cGUgLT4gRmluZENvbnN0cnVjdG9y U3ltYm9sKCk7CiAgICAgICAgIGNvbnN0cnVjdG9yOyBjb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9y IC0+IG5leHRfbWV0aG9kKQogICAgewogICAgICAgIGlmICghIGNvbnN0cnVjdG9yIC0+IElzVHlw ZWQoKSkKICAgICAgICAgICAgY29uc3RydWN0b3IgLT4gUHJvY2Vzc01ldGhvZFNpZ25hdHVyZSgo U2VtYW50aWMgKikgdGhpcywgcmlnaHRfdG9rKTsKCiAgICAgICAgaWYgKG51bV9hcmd1bWVudHMg PT0gY29uc3RydWN0b3IgLT4gTnVtRm9ybWFsUGFyYW1ldGVycygpKQogICAgICAgIHsKICAgICAg ICAgICAgaW50IGk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYXJndW1lbnRzOyBp KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghIENhbk1ldGhvZEludm9jYXRp b25Db252ZXJ0KGNvbnN0cnVjdG9yIC0+IEZvcm1hbFBhcmFtZXRlcihpKSAtPiBUeXBlKCksIGFy Z3VtZW50W2ldIC0+IFR5cGUoKSkpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAg ICAgIH0KICAgICAgICAgICAgaWYgKGkgPT0gbnVtX2FyZ3VtZW50cykKICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgaWYgKE1vcmVTcGVjaWZpYyhjb25zdHJ1Y3RvciwgY29uc3RydWN0b3Jf c2V0KSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcl9z ZXQuUmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcl9zZXQuTmV4dCgpID0g Y29uc3RydWN0b3I7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChO b01ldGhvZE1vcmVTcGVjaWZpYyhjb25zdHJ1Y3Rvcl9zZXQsIGNvbnN0cnVjdG9yKSkKICAgICAg ICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcl9zZXQuTmV4dCgpID0gY29uc3RydWN0b3I7CiAgICAg ICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKGNvbnN0cnVjdG9yX3NldC5MZW5ndGgo KSA9PSAwKQogICAgewogICAgICAgIE1ldGhvZFN5bWJvbCAqbWV0aG9kOwogICAgICAgIGZvciAo bWV0aG9kID0gY29udGFpbmluZ190eXBlIC0+IEZpbmRNZXRob2RTeW1ib2woY29udGFpbmluZ190 eXBlIC0+IElkZW50aXR5KCkpOyBtZXRob2Q7IG1ldGhvZCA9IG1ldGhvZCAtPiBuZXh0X21ldGhv ZCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghIG1ldGhvZCAtPiBJc1R5cGVkKCkpCiAgICAg ICAgICAgICAgICBtZXRob2QgLT4gUHJvY2Vzc01ldGhvZFNpZ25hdHVyZSgoU2VtYW50aWMgKikg dGhpcywgcmlnaHRfdG9rKTsKCiAgICAgICAgICAgIGlmIChudW1fYXJndW1lbnRzID09IG1ldGhv ZCAtPiBOdW1Gb3JtYWxQYXJhbWV0ZXJzKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg IGludCBpOwogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9hcmd1bWVudHM7IGkr KykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISBDYW5NZXRob2RJ bnZvY2F0aW9uQ29udmVydChtZXRob2QgLT4gRm9ybWFsUGFyYW1ldGVyKGkpIC0+IFR5cGUoKSwg YXJndW1lbnRbaV0gLT4gVHlwZSgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBudW1fYXJndW1lbnRzKQog ICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAg ICBpZiAobWV0aG9kKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKG1ldGhvZCAtPiBtZXRob2Rf b3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg IEFzdE1ldGhvZERlY2xhcmF0aW9uICptZXRob2RfZGVjbGFyYXRpb24gPSAoQXN0TWV0aG9kRGVj bGFyYXRpb24gKikgbWV0aG9kIC0+IG1ldGhvZF9vcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbjsK ICAgICAgICAgICAgICAgIEZpbGVMb2NhdGlvbiBsb2MobWV0aG9kIC0+IGNvbnRhaW5pbmdfdHlw ZSAtPiBzZW1hbnRpY19lbnZpcm9ubWVudCAtPiBzZW0gLT4gbGV4X3N0cmVhbSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2RlY2xhcmF0aW9uIC0+IG1ldGhvZF9kZWNs YXJhdG9yIC0+IGlkZW50aWZpZXJfdG9rZW4pOwoKICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVy cm9yKFNlbWFudGljRXJyb3I6Ok1FVEhPRF9GT1VORF9GT1JfQ09OU1RSVUNUT1IsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X3RvaywKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHJpZ2h0X3RvaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5p bmdfdHlwZSAtPiBOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MubG9j YXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAg ICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6TUVUSE9EX0ZPVU5EX0ZP Ul9DT05TVFJVQ1RPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfdG9rLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfdG9rLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlIC0+IE5hbWUoKSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIG1ldGhvZCAtPiBjb250YWluaW5nX3R5cGUgLT4gZmlsZV9sb2NhdGlv biAtPiBsb2NhdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAo KCEgY29udGFpbmluZ190eXBlIC0+IEJhZCgpKSB8fCBOdW1FcnJvcnMoKSA9PSAwKQogICAgICAg ICAgICBSZXBvcnRNZXRob2ROb3RGb3VuZChhc3QsIGNvbnRhaW5pbmdfdHlwZSAtPiBOYW1lKCkp OwoKICAgICAgICBkZWxldGUgW10gYXJndW1lbnQ7CgogICAgICAgIHJldHVybiAoTWV0aG9kU3lt Ym9sICopIF9fbnVsbCA7CiAgICB9CiAgICBlbHNlIGlmIChjb25zdHJ1Y3Rvcl9zZXQuTGVuZ3Ro KCkgPiAxKQogICAgewogICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OkFNQklH VU9VU19DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OLAogICAgICAgICAgICAgICAgICAgICAgIGxlZnRf dG9rLAogICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0X3RvaywKICAgICAgICAgICAgICAgICAg ICAgICBjb250YWluaW5nX3R5cGUgLT4gTmFtZSgpKTsKICAgIH0KCiAgICBkZWxldGUgW10gYXJn dW1lbnQ7CgogICAgTWV0aG9kU3ltYm9sICpjb25zdHJ1Y3Rvcl9zeW1ib2wgPSBjb25zdHJ1Y3Rv cl9zZXRbMF07CgogICAgaWYgKGNvbnN0cnVjdG9yX3N5bWJvbCAtPiBJc1N5bnRoZXRpYygpKQog ICAgewogICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlNZTlRIRVRJQ19DT05T VFJVQ1RPUl9JTlZPQ0FUSU9OLAogICAgICAgICAgICAgICAgICAgICAgIGxlZnRfdG9rLAogICAg ICAgICAgICAgICAgICAgICAgIHJpZ2h0X3RvaywKICAgICAgICAgICAgICAgICAgICAgICBjb25z dHJ1Y3Rvcl9zeW1ib2wgLT4gSGVhZGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgY29udGFp bmluZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAg ICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAg fQoKICAgICAKICAgICAKICAgICAKICAgIGNvbnN0cnVjdG9yX3N5bWJvbCAtPiBQcm9jZXNzTWV0 aG9kVGhyb3dzKChTZW1hbnRpYyAqKSB0aGlzLCByaWdodF90b2spOwoKICAgIGlmIChjb250cm9s Lm9wdGlvbi5kZXByZWNhdGlvbiAmJgogICAgICAgIGNvbnN0cnVjdG9yX3N5bWJvbCAtPiBJc0Rl cHJlY2F0ZWQoKSAmJgogICAgICAgIGNvbnN0cnVjdG9yX3N5bWJvbCAtPiBjb250YWluaW5nX3R5 cGUgLT4gb3V0ZXJtb3N0X3R5cGUgIT0gVGhpc1R5cGUoKSAtPiBvdXRlcm1vc3RfdHlwZSkKICAg IHsKICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpERVBSRUNBVEVEX01FVEhP RCwKICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X3RvaywKICAgICAgICAgICAgICAgICAgICAg ICByaWdodF90b2ssCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3Jfc3ltYm9sIC0+ IEhlYWRlcigpLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yX3N5bWJvbCAtPiBj b250YWluaW5nX3R5cGUgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdlTmFtZSgpLAog ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yX3N5bWJvbCAtPiBjb250YWluaW5nX3R5 cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgfQoKICAgIHJldHVybiBjb25zdHJ1Y3Rvcl9zeW1i b2w7Cn0KCgogCiAKIApWYXJpYWJsZVN5bWJvbCAqU2VtYW50aWM6OkZpbmRNaXNzcGVsbGVkVmFy aWFibGVOYW1lKFR5cGVTeW1ib2wgKnR5cGUsIExleFN0cmVhbTo6VG9rZW5JbmRleCBpZGVudGlm aWVyX3Rva2VuKQp7CiAgICBWYXJpYWJsZVN5bWJvbCAqbWlzc3BlbGxlZF92YXJpYWJsZSA9IF9f bnVsbCA7CiAgICBpbnQgaW5kZXggPSAwOwogICAgd2NoYXJfdCAqbmFtZSA9IGxleF9zdHJlYW0g LT4gTmFtZVN0cmluZyhpZGVudGlmaWVyX3Rva2VuKTsKCiAgICBmb3IgKGludCBrID0gMDsgayA8 IHR5cGUgLT4gZXhwYW5kZWRfZmllbGRfdGFibGUgLT4gc3ltYm9sX3Bvb2wuTGVuZ3RoKCk7IGsr KykKICAgIHsKICAgICAgICBWYXJpYWJsZVNoYWRvd1N5bWJvbCAqdmFyaWFibGVfc2hhZG93ID0g dHlwZSAtPiBleHBhbmRlZF9maWVsZF90YWJsZSAtPiBzeW1ib2xfcG9vbFtrXTsKICAgICAgICBW YXJpYWJsZVN5bWJvbCAqdmFyaWFibGUgPSB2YXJpYWJsZV9zaGFkb3cgLT4gdmFyaWFibGVfc3lt Ym9sOwogICAgICAgIGlmICghIHZhcmlhYmxlIC0+IElzVHlwZWQoKSkKICAgICAgICAgICAgdmFy aWFibGUgLT4gUHJvY2Vzc1ZhcmlhYmxlU2lnbmF0dXJlKChTZW1hbnRpYyAqKSB0aGlzLCBpZGVu dGlmaWVyX3Rva2VuKTsKCiAgICAgICAgaW50IG5ld19pbmRleCA9IFNwZWxsOjpJbmRleChuYW1l LCB2YXJpYWJsZSAtPiBOYW1lKCkpOwogICAgICAgIGlmIChuZXdfaW5kZXggPiBpbmRleCkKICAg ICAgICB7CiAgICAgICAgICAgIG1pc3NwZWxsZWRfdmFyaWFibGUgPSB2YXJpYWJsZTsKICAgICAg ICAgICAgaW5kZXggPSBuZXdfaW5kZXg7CiAgICAgICAgfQogICAgfQoKICAgIGludCBsZW5ndGgg PSB3Y3NsZW4obmFtZSk7CgogICAgcmV0dXJuICgobGVuZ3RoID09IDMgJiYgaW5kZXggPj0gNSkg fHwgKGxlbmd0aCA9PSA0ICYmIGluZGV4ID49IDYpIHx8IChsZW5ndGggPj0gNSAmJiBpbmRleCA+ PSA3KQogICAgICAgICAgICAgICAgICAgICAgICAgID8gbWlzc3BlbGxlZF92YXJpYWJsZQogICAg ICAgICAgICAgICAgICAgICAgICAgIDogKFZhcmlhYmxlU3ltYm9sICopIF9fbnVsbCApOwp9Cgog CiAKIApNZXRob2RTeW1ib2wgKlNlbWFudGljOjpGaW5kTWlzc3BlbGxlZE1ldGhvZE5hbWUoVHlw ZVN5bWJvbCAqdHlwZSwgQXN0TWV0aG9kSW52b2NhdGlvbiAqbWV0aG9kX2NhbGwsIE5hbWVTeW1i b2wgKm5hbWVfc3ltYm9sKQp7CiAgICBNZXRob2RTeW1ib2wgKm1pc3NwZWxsZWRfbWV0aG9kID0g X19udWxsIDsKICAgIGludCBpbmRleCA9IDA7CiAgICBBc3RTaW1wbGVOYW1lICpzaW1wbGVfbmFt ZSA9IG1ldGhvZF9jYWxsIC0+IG1ldGhvZCAtPiBTaW1wbGVOYW1lQ2FzdCgpOwogICAgQXN0Rmll bGRBY2Nlc3MgKmZpZWxkX2FjY2VzcyA9IG1ldGhvZF9jYWxsIC0+IG1ldGhvZCAtPiBGaWVsZEFj Y2Vzc0Nhc3QoKTsKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBpZGVudGlmaWVyX3Rva2VuID0g KHNpbXBsZV9uYW1lID8gc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90b2tlbiA6IGZpZWxkX2Fj Y2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuKTsKCiAgICBmb3IgKGludCBrID0gMDsgayA8IHR5cGUg LT4gZXhwYW5kZWRfbWV0aG9kX3RhYmxlIC0+IHN5bWJvbF9wb29sLkxlbmd0aCgpOyBrKyspCiAg ICB7CiAgICAgICAgTWV0aG9kU2hhZG93U3ltYm9sICptZXRob2Rfc2hhZG93ID0gdHlwZSAtPiBl eHBhbmRlZF9tZXRob2RfdGFibGUgLT4gc3ltYm9sX3Bvb2xba107CiAgICAgICAgTWV0aG9kU3lt Ym9sICptZXRob2QgPSBtZXRob2Rfc2hhZG93IC0+IG1ldGhvZF9zeW1ib2w7CgogICAgICAgIGlm ICghIG1ldGhvZCAtPiBJc1R5cGVkKCkpCiAgICAgICAgICAgIG1ldGhvZCAtPiBQcm9jZXNzTWV0 aG9kU2lnbmF0dXJlKChTZW1hbnRpYyAqKSB0aGlzLCBpZGVudGlmaWVyX3Rva2VuKTsKCiAgICAg ICAgaWYgKG1ldGhvZF9jYWxsIC0+IE51bUFyZ3VtZW50cygpID09IG1ldGhvZCAtPiBOdW1Gb3Jt YWxQYXJhbWV0ZXJzKCkpCiAgICAgICAgewogICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAg Zm9yIChpID0gMDsgaSA8IG1ldGhvZF9jYWxsIC0+IE51bUFyZ3VtZW50cygpOyBpKyspCiAgICAg ICAgICAgIHsKICAgICAgICAgICAgICAgIEFzdEV4cHJlc3Npb24gKmV4cHIgPSBtZXRob2RfY2Fs bCAtPiBBcmd1bWVudChpKTsKICAgICAgICAgICAgICAgIGlmICghIENhbk1ldGhvZEludm9jYXRp b25Db252ZXJ0KG1ldGhvZCAtPiBGb3JtYWxQYXJhbWV0ZXIoaSkgLT4gVHlwZSgpLCBleHByIC0+ IFR5cGUoKSkpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAg ICAgICAgaWYgKGkgPT0gbWV0aG9kX2NhbGwgLT4gTnVtQXJndW1lbnRzKCkpCiAgICAgICAgICAg IHsKICAgICAgICAgICAgICAgIGludCBuZXdfaW5kZXggPSBTcGVsbDo6SW5kZXgobmFtZV9zeW1i b2wgLT4gTmFtZSgpLCBtZXRob2QgLT4gTmFtZSgpKTsKICAgICAgICAgICAgICAgIGlmIChuZXdf aW5kZXggPiBpbmRleCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtaXNz cGVsbGVkX21ldGhvZCA9IG1ldGhvZDsKICAgICAgICAgICAgICAgICAgICBpbmRleCA9IG5ld19p bmRleDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAg ICBpbnQgbGVuZ3RoID0gbmFtZV9zeW1ib2wgLT4gTmFtZUxlbmd0aCgpLAogICAgICAgICBudW1f YXJncyA9IG1ldGhvZF9jYWxsIC0+IE51bUFyZ3VtZW50cygpOwoKICAgICAKICAgICAKICAgICAK ICAgICAKICAgICAKICAgIHJldHVybiAoaW5kZXggPCAzID8gKE1ldGhvZFN5bWJvbCAqKSBfX251 bGwgCiAgICAgICAgICAgICAgICAgICAgICA6IChsZW5ndGggPT0gMiAmJiAoaW5kZXggPj0gMyB8 fCBudW1fYXJncyA+IDApKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAobGVuZ3RoID09IDMg JiYgKGluZGV4ID49IDUgfHwgbnVtX2FyZ3MgPiAwKSkgfHwKICAgICAgICAgICAgICAgICAgICAg ICAgKGxlbmd0aCAgPiAzICYmIChpbmRleCA+PSA2IHx8IChpbmRleCA+PSA1ICYmIG51bV9hcmdz ID4gMCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtaXNzcGVsbGVk X21ldGhvZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoTWV0aG9kU3lt Ym9sICopIF9fbnVsbCApOwp9CgoKIAogCiAKYm9vbCBTZW1hbnRpYzo6SXNNZXRob2RBY2Nlc3Np YmxlKEFzdEZpZWxkQWNjZXNzICpmaWVsZF9hY2Nlc3MsIFR5cGVTeW1ib2wgKmJhc2VfdHlwZSwg TWV0aG9kU3ltYm9sICptZXRob2Rfc3ltYm9sKQp7CiAgICBUeXBlU3ltYm9sICp0aGlzX3R5cGUg PSBUaGlzVHlwZSgpLAogICAgICAgICAgICAgICAqY29udGFpbmluZ190eXBlID0gbWV0aG9kX3N5 bWJvbCAtPiBjb250YWluaW5nX3R5cGU7CgogICAgcmV0dXJuICh0aGlzX3R5cGUgLT4gb3V0ZXJt b3N0X3R5cGUgPT0gY29udGFpbmluZ190eXBlIC0+IG91dGVybW9zdF90eXBlKSB8fAogICAgICAg ICAgICBtZXRob2Rfc3ltYm9sIC0+IEFDQ19QVUJMSUMoKSB8fAogICAgICAgICAgICAoKCEgbWV0 aG9kX3N5bWJvbCAtPiBBQ0NfUFJJVkFURSgpKSAmJiBjb250YWluaW5nX3R5cGUgLT4gQ29udGFp bmluZ1BhY2thZ2UoKSA9PSB0aGlzX3BhY2thZ2UpIHx8CiAgICAgICAgICAgIChtZXRob2Rfc3lt Ym9sIC0+IEFDQ19QUk9URUNURUQoKSAmJiAoZmllbGRfYWNjZXNzIC0+IGJhc2UgLT4gSXNTdXBl ckV4cHJlc3Npb24oKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICh0aGlzX3R5cGUgLT4gSGFzUHJvdGVjdGVkQWNjZXNzVG8oY29udGFpbmluZ190 eXBlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoYmFzZV90eXBlIC0+IElzU3ViY2xhc3ModGhpc190eXBlKSB8fCBiYXNlX3R5cGUgLT4gSXNP d25lcih0aGlzX3R5cGUpKSkpKTsKfQoKCiAKIAogCiAKIAogCk1ldGhvZFN5bWJvbCAqU2VtYW50 aWM6OkZpbmRNZXRob2RJblR5cGUoVHlwZVN5bWJvbCAqdHlwZSwgQXN0TWV0aG9kSW52b2NhdGlv biAqbWV0aG9kX2NhbGwsIE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sKQp7CiAgICBUdXBsZTxNZXRo b2RTeW1ib2wgKj4gbWV0aG9kX3NldCgyKTsKICAgIEFzdEZpZWxkQWNjZXNzICpmaWVsZF9hY2Nl c3MgPSBtZXRob2RfY2FsbCAtPiBtZXRob2QgLT4gRmllbGRBY2Nlc3NDYXN0KCk7CiAgICBpZiAo ISBuYW1lX3N5bWJvbCkKICAgICAgICBuYW1lX3N5bWJvbCA9IGxleF9zdHJlYW0gLT4gTmFtZVN5 bWJvbChmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbik7CgogICAgaWYgKCEgdHlwZSAt PiBleHBhbmRlZF9tZXRob2RfdGFibGUpCiAgICAgICAgQ29tcHV0ZU1ldGhvZHNDbG9zdXJlKHR5 cGUsIGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuKTsKCiAKIAogCiAKCgoKCgoKCgoK CiAgICAgICAgVHlwZVN5bWJvbCAqdHlwZV9zeW1ib2wgPSB0eXBlOwoKICAgICAgICBmb3IgKE1l dGhvZFNoYWRvd1N5bWJvbCAqbWV0aG9kX3NoYWRvdyA9IHR5cGVfc3ltYm9sIC0+IGV4cGFuZGVk X21ldGhvZF90YWJsZSAtPiBGaW5kTWV0aG9kU2hhZG93U3ltYm9sKG5hbWVfc3ltYm9sKTsKICAg ICAgICAgICAgIG1ldGhvZF9zaGFkb3c7IG1ldGhvZF9zaGFkb3cgPSBtZXRob2Rfc2hhZG93IC0+ IG5leHRfbWV0aG9kKQogICAgICAgIHsKICAgICAgICAgICAgTWV0aG9kU3ltYm9sICptZXRob2Qg PSBtZXRob2Rfc2hhZG93IC0+IG1ldGhvZF9zeW1ib2w7CgogICAgICAgICAgICBpZiAoISBtZXRo b2QgLT4gSXNUeXBlZCgpKQogICAgICAgICAgICAgICAgbWV0aG9kIC0+IFByb2Nlc3NNZXRob2RT aWduYXR1cmUoKFNlbWFudGljICopIHRoaXMsIGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rv a2VuKTsKCiAgICAgICAgICAgIGlmIChtZXRob2RfY2FsbCAtPiBOdW1Bcmd1bWVudHMoKSA9PSBt ZXRob2QgLT4gTnVtRm9ybWFsUGFyYW1ldGVycygpICYmCiAgICAgICAgICAgICAgICBJc01ldGhv ZEFjY2Vzc2libGUoZmllbGRfYWNjZXNzLCB0eXBlX3N5bWJvbCwgbWV0aG9kKSkKICAgICAgICAg ICAgewogICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBp IDwgbWV0aG9kX2NhbGwgLT4gTnVtQXJndW1lbnRzKCk7IGkrKykKICAgICAgICAgICAgICAgIHsK ICAgICAgICAgICAgICAgICAgICBBc3RFeHByZXNzaW9uICpleHByID0gbWV0aG9kX2NhbGwgLT4g QXJndW1lbnQoaSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEgQ2FuTWV0aG9kSW52b2NhdGlv bkNvbnZlcnQobWV0aG9kIC0+IEZvcm1hbFBhcmFtZXRlcihpKSAtPiBUeXBlKCksIGV4cHIgLT4g VHlwZSgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgICAgICBpZiAoaSA9PSBtZXRob2RfY2FsbCAtPiBOdW1Bcmd1bWVudHMoKSkK ICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoTW9yZVNwZWNpZmljKG1l dGhvZCwgbWV0aG9kX3NldCkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg ICAgICAgICBtZXRob2Rfc2V0LlJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhv ZF9zZXQuTmV4dCgpID0gbWV0aG9kOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg ICAgICAgICBlbHNlIGlmIChOb01ldGhvZE1vcmVTcGVjaWZpYyhtZXRob2Rfc2V0LCBtZXRob2Qp KQogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfc2V0Lk5leHQoKSA9IG1ldGhvZDsKICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAKCgoKCiAgICBpZiAobWV0 aG9kX3NldC5MZW5ndGgoKSA9PSAwKQogICAgewogICAgICAgIGlmICghIHR5cGUgLT4gZXhwYW5k ZWRfZmllbGRfdGFibGUpCiAgICAgICAgICAgIENvbXB1dGVGaWVsZHNDbG9zdXJlKHR5cGUsIGZp ZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuKTsKCiAgICAgICAgVmFyaWFibGVTaGFkb3dT eW1ib2wgKnZhcmlhYmxlX3NoYWRvd19zeW1ib2wgPSB0eXBlIC0+IGV4cGFuZGVkX2ZpZWxkX3Rh YmxlIC0+IEZpbmRWYXJpYWJsZVNoYWRvd1N5bWJvbChuYW1lX3N5bWJvbCk7CgogICAgICAgIGlm ICh2YXJpYWJsZV9zaGFkb3dfc3ltYm9sKQogICAgICAgIHsKICAgICAgICAgICAgVmFyaWFibGVT eW1ib2wgKnZhcmlhYmxlX3N5bWJvbCA9IHZhcmlhYmxlX3NoYWRvd19zeW1ib2wgLT4gdmFyaWFi bGVfc3ltYm9sOwogICAgICAgICAgICBUeXBlU3ltYm9sICplbmNsb3NpbmdfdHlwZSA9IHZhcmlh YmxlX3N5bWJvbCAtPiBvd25lciAtPiBUeXBlQ2FzdCgpOwoKICAgICAgICAgICAgKHN0YXRpY19j YXN0PHZvaWQ+ICAoKCBlbmNsb3NpbmdfdHlwZSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiZW5j bG9zaW5nX3R5cGUiICwgIi4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDUzNywgX19QUkVUVFlf RlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGlj RXJyb3I6OkZJRUxEX05PVF9NRVRIT0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhv ZF9jYWxsIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rf Y2FsbCAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxl X3N5bWJvbCAtPiBOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY2xvc2luZ190 eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgZW5jbG9zaW5nX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgICAg IH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBUeXBlU3ltYm9sICpzdXBlcl90 eXBlOwogICAgICAgICAgICBNZXRob2RTaGFkb3dTeW1ib2wgKm1ldGhvZF9zaGFkb3c7CgogICAg ICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICBmb3IgKHN1 cGVyX3R5cGUgPSB0eXBlOyBzdXBlcl90eXBlOyBzdXBlcl90eXBlID0gc3VwZXJfdHlwZSAtPiBz dXBlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yIChtZXRob2Rfc2hhZG93ID0g c3VwZXJfdHlwZSAtPiBleHBhbmRlZF9tZXRob2RfdGFibGUgLT4gRmluZE1ldGhvZFNoYWRvd1N5 bWJvbChuYW1lX3N5bWJvbCk7CiAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9zaGFkb3c7IG1l dGhvZF9zaGFkb3cgPSBtZXRob2Rfc2hhZG93IC0+IG5leHRfbWV0aG9kKQogICAgICAgICAgICAg ICAgewogICAgICAgICAgICAgICAgICAgIE1ldGhvZFN5bWJvbCAqbWV0aG9kID0gbWV0aG9kX3No YWRvdyAtPiBtZXRob2Rfc3ltYm9sOwogICAgICAgICAgICAgICAgICAgIGlmICghIG1ldGhvZCAt PiBJc1R5cGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCAtPiBQcm9jZXNzTWV0 aG9kU2lnbmF0dXJlKChTZW1hbnRpYyAqKSB0aGlzLCBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmll cl90b2tlbik7CgogICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2RfY2FsbCAtPiBOdW1Bcmd1 bWVudHMoKSA9PSBtZXRob2QgLT4gTnVtRm9ybWFsUGFyYW1ldGVycygpKQogICAgICAgICAgICAg ICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICAg ICAgICAgIGZvciAoaSA9IDA7IGkgPCBtZXRob2RfY2FsbCAtPiBOdW1Bcmd1bWVudHMoKTsgaSsr KQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBB c3RFeHByZXNzaW9uICpleHByID0gbWV0aG9kX2NhbGwgLT4gQXJndW1lbnQoaSk7CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBpZiAoISBDYW5NZXRob2RJbnZvY2F0aW9uQ29udmVydChtZXRo b2QgLT4gRm9ybWFsUGFyYW1ldGVyKGkpIC0+IFR5cGUoKSwgZXhwciAtPiBUeXBlKCkpKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAg ICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IG1ldGhvZF9jYWxsIC0+IE51bUFy Z3VtZW50cygpKSAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAg ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKG1ldGhv ZF9zaGFkb3cpICAKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAg ICAgICAgICAgaWYgKHN1cGVyX3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJl cG9ydFNlbUVycm9yKChtZXRob2Rfc2hhZG93IC0+IG1ldGhvZF9zeW1ib2wgLT4gQUNDX1BSSVZB VEUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU2Vt YW50aWNFcnJvcjo6TUVUSE9EX1dJVEhfUFJJVkFURV9BQ0NFU1NfTk9UX0FDQ0VTU0lCTEUKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNlbWFudGljRXJy b3I6Ok1FVEhPRF9XSVRIX0RFRkFVTFRfQUNDRVNTX05PVF9BQ0NFU1NJQkxFKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IExlZnRUb2tlbigpLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4gUmlnaHRUb2tlbigpLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX3NoYWRvdyAtPiBtZXRob2Rfc3ltYm9s IC0+IEhlYWRlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJfdHlwZSAt PiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzdXBlcl90eXBlIC0+IEV4dGVybmFsTmFtZSgpLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgVGhpc1R5cGUoKSAtPiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBh Y2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzVHlwZSgpIC0+ IEV4dGVybmFsTmFtZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgIGlmIChGaW5kTmVzdGVkVHlwZSh0eXBlLCBmaWVsZF9hY2Nl c3MgLT4gaWRlbnRpZmllcl90b2tlbikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VFlQRV9OT1RfTUVUSE9ELAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVy X3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAt PiBpZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5h bWVfc3ltYm9sIC0+IE5hbWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBl bHNlIGlmICh0eXBlIC0+IGV4cGFuZGVkX21ldGhvZF90YWJsZSAtPiBGaW5kTWV0aG9kU2hhZG93 U3ltYm9sKG5hbWVfc3ltYm9sKSkKICAgICAgICAgICAgICAgICAgICBSZXBvcnRNZXRob2ROb3RG b3VuZChtZXRob2RfY2FsbCwgbmFtZV9zeW1ib2wgLT4gTmFtZSgpKTsKICAgICAgICAgICAgICAg IGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBNZXRob2RTeW1ib2wg Km1ldGhvZCA9IEZpbmRNaXNzcGVsbGVkTWV0aG9kTmFtZSh0eXBlLCBtZXRob2RfY2FsbCwgbmFt ZV9zeW1ib2wpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QpCiAgICAgICAgICAgICAg ICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpNRVRIT0RfTkFNRV9NSVNT UEVMTEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2Nh bGwgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBtZXRob2RfY2FsbCAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBuYW1lX3N5bWJvbCAtPiBOYW1lKCksCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB0eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2Fn ZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgLT4g RXh0ZXJuYWxOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt ZXRob2QgLT4gTmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICBlbHNlIFJlcG9ydFNlbUVycm9y KFNlbWFudGljRXJyb3I6Ok1FVEhPRF9OQU1FX05PVF9GT1VORF9JTl9UWVBFLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4gTGVmdFRva2VuKCks CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBS aWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1l X3N5bWJvbCAtPiBOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB0eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwog ICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4g KE1ldGhvZFN5bWJvbCAqKSBfX251bGwgOwogICAgfQogICAgZWxzZSBpZiAobWV0aG9kX3NldC5M ZW5ndGgoKSA+IDEpCiAgICB7CiAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6 QU1CSUdVT1VTX01FVEhPRF9JTlZPQ0FUSU9OLAogICAgICAgICAgICAgICAgICAgICAgIG1ldGhv ZF9jYWxsIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxs IC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3N5bWJvbCAtPiBO YW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX3NldFswXSAtPiBIZWFkZXIoKSwK ICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfc2V0WzBdIC0+IGNvbnRhaW5pbmdfdHlwZSAt PiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAg ICAgICAgbWV0aG9kX3NldFswXSAtPiBjb250YWluaW5nX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCks CiAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX3NldFsxXSAtPiBIZWFkZXIoKSwKICAgICAg ICAgICAgICAgICAgICAgICBtZXRob2Rfc2V0WzFdIC0+IGNvbnRhaW5pbmdfdHlwZSAtPiBDb250 YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAg bWV0aG9kX3NldFsxXSAtPiBjb250YWluaW5nX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAg fQoKICAgIE1ldGhvZFN5bWJvbCAqbWV0aG9kID0gbWV0aG9kX3NldFswXTsKICAgIGlmIChtZXRo b2QgLT4gSXNTeW50aGV0aWMoKSkKICAgIHsKICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRp Y0Vycm9yOjpTWU5USEVUSUNfTUVUSE9EX0lOVk9DQVRJT04sCiAgICAgICAgICAgICAgICAgICAg ICAgbWV0aG9kX2NhbGwgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgbWV0 aG9kX2NhbGwgLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCAt PiBIZWFkZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgLT4gY29udGFpbmluZ190 eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAg ICAgICAgICAgICBtZXRob2QgLT4gY29udGFpbmluZ190eXBlIC0+IEV4dGVybmFsTmFtZSgpKTsK ICAgIH0KCiAgICAgCiAgICAgCiAgICAgCiAgICBtZXRob2QgLT4gUHJvY2Vzc01ldGhvZFRocm93 cygoU2VtYW50aWMgKikgdGhpcywgZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW4pOwoK ICAgIGlmIChjb250cm9sLm9wdGlvbi5kZXByZWNhdGlvbiAmJgogICAgICAgIG1ldGhvZCAtPiBJ c0RlcHJlY2F0ZWQoKSAmJiBtZXRob2QgLT4gY29udGFpbmluZ190eXBlIC0+IG91dGVybW9zdF90 eXBlICE9IFRoaXNUeXBlKCkgLT4gb3V0ZXJtb3N0X3R5cGUpCiAgICB7CiAgICAgICAgUmVwb3J0 U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6REVQUkVDQVRFRF9NRVRIT0QsCiAgICAgICAgICAgICAg ICAgICAgICAgbWV0aG9kX2NhbGwgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAg ICAgbWV0aG9kX2NhbGwgLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgIG1l dGhvZCAtPiBIZWFkZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgLT4gY29udGFp bmluZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAg ICAgICAgICAgICAgICAgICBtZXRob2QgLT4gY29udGFpbmluZ190eXBlIC0+IEV4dGVybmFsTmFt ZSgpKTsKICAgIH0KCiAgICByZXR1cm4gbWV0aG9kOwp9CgoKdm9pZCBTZW1hbnRpYzo6U2VhcmNo Rm9yTWV0aG9kSW5FbnZpcm9ubWVudChUdXBsZTxNZXRob2RTeW1ib2wgKj4gJm1ldGhvZHNfZm91 bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYW50aWNF bnZpcm9ubWVudCAqJndoZXJlX2ZvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFNlbWFudGljRW52aXJvbm1lbnQgKnN0YWNrLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzdE1ldGhvZEludm9jYXRpb24gKm1ldGhvZF9j YWxsKQp7CiAgICBBc3RTaW1wbGVOYW1lICpzaW1wbGVfbmFtZSA9IG1ldGhvZF9jYWxsIC0+IG1l dGhvZCAtPiBTaW1wbGVOYW1lQ2FzdCgpOwogICAgTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wgPSBs ZXhfc3RyZWFtIC0+IE5hbWVTeW1ib2woc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90b2tlbik7 CgogICAgZm9yIChTZW1hbnRpY0Vudmlyb25tZW50ICplbnYgPSBzdGFjazsgZW52OyBlbnYgPSBl bnYgLT4gcHJldmlvdXMpCiAgICB7CiAgICAgICAgVHlwZVN5bWJvbCAqdHlwZSA9IGVudiAtPiBU eXBlKCk7CiAgICAgICAgaWYgKCEgdHlwZSAtPiBleHBhbmRlZF9tZXRob2RfdGFibGUpCiAgICAg ICAgICAgIENvbXB1dGVNZXRob2RzQ2xvc3VyZSh0eXBlLCBzaW1wbGVfbmFtZSAtPiBpZGVudGlm aWVyX3Rva2VuKTsKCiAgICAgICAgbWV0aG9kc19mb3VuZC5SZXNldCgpOwogICAgICAgIHdoZXJl X2ZvdW5kID0gX19udWxsIDsKCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAg IAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgIE1ldGhvZFNoYWRvd1N5bWJv bCAqbWV0aG9kX3NoYWRvdyA9IHR5cGUgLT4gZXhwYW5kZWRfbWV0aG9kX3RhYmxlIC0+IEZpbmRN ZXRob2RTaGFkb3dTeW1ib2wobmFtZV9zeW1ib2wpOwogICAgICAgIGlmIChtZXRob2Rfc2hhZG93 KQogICAgICAgIHsKICAgICAgICAgICAgZm9yICg7IG1ldGhvZF9zaGFkb3c7IG1ldGhvZF9zaGFk b3cgPSBtZXRob2Rfc2hhZG93IC0+IG5leHRfbWV0aG9kKQogICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICBNZXRob2RTeW1ib2wgKm1ldGhvZCA9IG1ldGhvZF9zaGFkb3cgLT4gbWV0aG9kX3N5 bWJvbDsKCiAgICAgICAgICAgICAgICBpZiAoISBtZXRob2QgLT4gSXNUeXBlZCgpKQogICAgICAg ICAgICAgICAgICAgIG1ldGhvZCAtPiBQcm9jZXNzTWV0aG9kU2lnbmF0dXJlKChTZW1hbnRpYyAq KSB0aGlzLCBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuKTsKCiAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg CiAgICAgICAgICAgICAgICBpZiAobWV0aG9kX2NhbGwgLT4gTnVtQXJndW1lbnRzKCkgPT0gbWV0 aG9kIC0+IE51bUZvcm1hbFBhcmFtZXRlcnMoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAg ICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWV0 aG9kX2NhbGwgLT4gTnVtQXJndW1lbnRzKCk7IGkrKykKICAgICAgICAgICAgICAgICAgICB7CiAg ICAgICAgICAgICAgICAgICAgICAgIEFzdEV4cHJlc3Npb24gKmV4cHIgPSBtZXRob2RfY2FsbCAt PiBBcmd1bWVudChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgQ2FuTWV0aG9kSW52 b2NhdGlvbkNvbnZlcnQobWV0aG9kIC0+IEZvcm1hbFBhcmFtZXRlcihpKSAtPiBUeXBlKCksIGV4 cHIgLT4gVHlwZSgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBtZXRob2RfY2FsbCAt PiBOdW1Bcmd1bWVudHMoKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg ICAgICAgIGlmIChNb3JlU3BlY2lmaWMobWV0aG9kLCBtZXRob2RzX2ZvdW5kKSkKICAgICAgICAg ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kc19mb3Vu ZC5SZXNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kc19mb3VuZC5OZXh0 KCkgPSBtZXRob2Q7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAg ICAgICAgZWxzZSBpZiAoTm9NZXRob2RNb3JlU3BlY2lmaWMobWV0aG9kc19mb3VuZCwgbWV0aG9k KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHNfZm91bmQuTmV4dCgpID0gbWV0 aG9kOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg fQoKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAg d2hlcmVfZm91bmQgPSAobWV0aG9kc19mb3VuZC5MZW5ndGgoKSA+IDAgPyBlbnYgOiAoU2VtYW50 aWNFbnZpcm9ubWVudCAqKSBfX251bGwgKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQog ICAgfQoKICAgIHJldHVybjsKfQoKCk1ldGhvZFN5bWJvbCAqU2VtYW50aWM6OkZpbmRNZXRob2RJ bkVudmlyb25tZW50KFNlbWFudGljRW52aXJvbm1lbnQgKiZ3aGVyZV9mb3VuZCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYW50aWNFbnZpcm9ubWVu dCAqc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEFzdE1ldGhvZEludm9jYXRpb24gKm1ldGhvZF9jYWxsKQp7CiAgICBUdXBsZTxNZXRob2RTeW1i b2wgKj4gbWV0aG9kc19mb3VuZCgyKTsKICAgIFNlYXJjaEZvck1ldGhvZEluRW52aXJvbm1lbnQo bWV0aG9kc19mb3VuZCwgd2hlcmVfZm91bmQsIHN0YWNrLCBtZXRob2RfY2FsbCk7CgogICAgTWV0 aG9kU3ltYm9sICptZXRob2Rfc3ltYm9sID0gKG1ldGhvZHNfZm91bmQuTGVuZ3RoKCkgPiAwID8g bWV0aG9kc19mb3VuZFswXSA6IChNZXRob2RTeW1ib2wgKikgX19udWxsICk7CiAgICBpZiAobWV0 aG9kX3N5bWJvbCkKICAgIHsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1ldGhvZHNfZm91 bmQuTGVuZ3RoKCk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNl bWFudGljRXJyb3I6OkFNQklHVU9VU19NRVRIT0RfSU5WT0NBVElPTiwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgbWV0aG9kX3N5bWJvbCAtPiBOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAg ICAgIG1ldGhvZHNfZm91bmRbMF0gLT4gSGVhZGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAg ICAgIG1ldGhvZF9zeW1ib2wgLT4gY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdl KCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX3N5 bWJvbCAtPiBjb250YWluaW5nX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgIG1ldGhvZHNfZm91bmRbaV0gLT4gSGVhZGVyKCksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgIG1ldGhvZHNfZm91bmRbaV0gLT4gY29udGFpbmluZ190eXBlIC0+IENvbnRh aW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgbWV0aG9kc19mb3VuZFtpXSAtPiBjb250YWluaW5nX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCkp OwogICAgICAgIH0KCiAgICAgICAgaWYgKG1ldGhvZF9zeW1ib2wgLT4gY29udGFpbmluZ190eXBl ICE9IHdoZXJlX2ZvdW5kIC0+IFR5cGUoKSkgICAKICAgICAgICB7CiAgICAgICAgICAgIGlmICht ZXRob2Rfc3ltYm9sIC0+IElzU3ludGhldGljKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlNZTlRIRVRJQ19NRVRIT0RfSU5WT0NB VElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IExlZnRU b2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4gUmln aHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX3N5bWJvbCAt PiBIZWFkZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9zeW1ib2wg LT4gY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUo KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9zeW1ib2wgLT4gY29udGFp bmluZ190eXBlIC0+IEV4dGVybmFsTmFtZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBl bHNlIGlmICghIHdoZXJlX2ZvdW5kIC0+IFR5cGUoKSAtPiBBQ0NfU1RBVElDKCkpCiAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgIFR1cGxlPE1ldGhvZFN5bWJvbCAqPiBvdGhlcnMoMik7CiAg ICAgICAgICAgICAgICBTZW1hbnRpY0Vudmlyb25tZW50ICpmb3VuZF9vdGhlciwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKnByZXZpb3VzX2VudiA9IHdoZXJlX2ZvdW5kIC0+ IHByZXZpb3VzOwogICAgICAgICAgICAgICAgU2VhcmNoRm9yTWV0aG9kSW5FbnZpcm9ubWVudChv dGhlcnMsIGZvdW5kX290aGVyLCBwcmV2aW91c19lbnYsIG1ldGhvZF9jYWxsKTsKCiAgICAgICAg ICAgICAgICBpZiAob3RoZXJzLkxlbmd0aCgpID4gMCAmJiB3aGVyZV9mb3VuZCAtPiBUeXBlKCkg LT4gQ2FuQWNjZXNzKGZvdW5kX290aGVyIC0+IFR5cGUoKSkpCiAgICAgICAgICAgICAgICB7CiAg ICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlcnMuTGVuZ3RoKCk7ICBp KyspCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISAo b3RoZXJzW2ldID09IG1ldGhvZF9zeW1ib2wgJiYgbWV0aG9kX3N5bWJvbCAtPiBBQ0NfU1RBVElD KCkpKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpJTkhFUklUQU5DRV9BTkRfTEVYSUNBTF9T Q09QSU5HX0NPTkZMSUNUX1dJVEhfTUVNQkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBSaWdodFRva2VuKCks CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rfc3ltYm9s IC0+IE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1l dGhvZF9zeW1ib2wgLT4gY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4g UGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IG1ldGhvZF9zeW1ib2wgLT4gY29udGFpbmluZ190eXBlIC0+IEV4dGVybmFsTmFtZSgpLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfb3RoZXIgLT4gVHlw ZSgpIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX290aGVyIC0+IFR5cGUoKSAtPiBF eHRlcm5hbE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIAogICAg ICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAg ICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAg IEFzdFNpbXBsZU5hbWUgKnNpbXBsZV9uYW1lID0gbWV0aG9kX2NhbGwgLT4gbWV0aG9kIC0+IFNp bXBsZU5hbWVDYXN0KCk7CiAgICAgICAgTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wgPSBsZXhfc3Ry ZWFtIC0+IE5hbWVTeW1ib2woc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90b2tlbik7CiAgICAg ICAgYm9vbCBzeW1ib2xfZm91bmQgPSBmYWxzZTsKCiAgICAgICAgIAogICAgICAgICAKICAgICAg ICAgCiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBzdGFjayApID8gMCA6CShfX2Fzc2Vy dF9mYWlsICgic3RhY2siICwgIi4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDgxNywgX19QUkVU VFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKICAgICAgICBmb3IgKFNlbWFudGljRW52aXJvbm1lbnQg KmVudiA9IHN0YWNrIC0+IHByZXZpb3VzOyBlbnY7IGVudiA9IGVudiAtPiBwcmV2aW91cykKICAg ICAgICB7CiAgICAgICAgICAgIFR1cGxlPE1ldGhvZFN5bWJvbCAqPiBvdGhlcnMoMik7CiAgICAg ICAgICAgIFNlbWFudGljRW52aXJvbm1lbnQgKmZvdW5kX290aGVyOwogICAgICAgICAgICBTZWFy Y2hGb3JNZXRob2RJbkVudmlyb25tZW50KG90aGVycywgZm91bmRfb3RoZXIsIGVudiwgbWV0aG9k X2NhbGwpOwoKICAgICAgICAgICAgaWYgKG90aGVycy5MZW5ndGgoKSA+IDApCiAgICAgICAgICAg IHsKICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OkhJRERFTl9N RVRIT0RfSU5fRU5DTE9TSU5HX0NMQVNTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bWV0aG9kX2NhbGwgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBtZXRob2RfY2FsbCAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBvdGhlcnNbMF0gLT4gSGVhZGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBvdGhlcnNbMF0gLT4gY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4g UGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyc1swXSAt PiBjb250YWluaW5nX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwoKICAgICAgICAgICAgICAgIHN5 bWJvbF9mb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQog ICAgICAgIH0KCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAg IGZvciAoU2VtYW50aWNFbnZpcm9ubWVudCAqZW52MiA9IHN0YWNrOyBlbnYyICYmICghIHN5bWJv bF9mb3VuZCk7IGVudjIgPSBlbnYyIC0+IHByZXZpb3VzKQogICAgICAgIHsKICAgICAgICAgICAg VHlwZVN5bWJvbCAqdHlwZSA9IGVudjIgLT4gVHlwZSgpOwoKICAgICAgICAgICAgaWYgKCEgdHlw ZSAtPiBleHBhbmRlZF9maWVsZF90YWJsZSkKICAgICAgICAgICAgICAgIENvbXB1dGVGaWVsZHND bG9zdXJlKHR5cGUsIHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJfdG9rZW4pOwoKICAgICAgICAg ICAgVmFyaWFibGVTaGFkb3dTeW1ib2wgKnZhcmlhYmxlX3NoYWRvd19zeW1ib2wgPSB0eXBlIC0+ IGV4cGFuZGVkX2ZpZWxkX3RhYmxlIC0+IEZpbmRWYXJpYWJsZVNoYWRvd1N5bWJvbChuYW1lX3N5 bWJvbCk7CiAgICAgICAgICAgIGlmICh2YXJpYWJsZV9zaGFkb3dfc3ltYm9sKQogICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICBWYXJpYWJsZVN5bWJvbCAqdmFyaWFibGVfc3ltYm9sID0gdmFy aWFibGVfc2hhZG93X3N5bWJvbCAtPiB2YXJpYWJsZV9zeW1ib2w7CiAgICAgICAgICAgICAgICBU eXBlU3ltYm9sICplbmNsb3NpbmdfdHlwZSA9IHZhcmlhYmxlX3N5bWJvbCAtPiBvd25lciAtPiBU eXBlQ2FzdCgpOwoKICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggZW5jbG9z aW5nX3R5cGUgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImVuY2xvc2luZ190eXBlIiAsICIuLi8u Li9qaWtlcy9zcmMvZXhwci5jcHAiLCA4NTUsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7 CgogICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6RklFTERfTk9U X01FVEhPRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IExl ZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4g UmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVfc3lt Ym9sIC0+IE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY2xvc2luZ190 eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGVuY2xvc2luZ190eXBlIC0+IEV4dGVybmFsTmFtZSgpKTsKICAg ICAgICAgICAgICAgIHN5bWJvbF9mb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsK ICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgIFR5cGVTeW1ib2wgKnN1cGVyX3R5cGU7CiAgICAgICAgICAgICAgICBNZXRob2RTaGFkb3dT eW1ib2wgKm1ldGhvZF9zaGFkb3c7CgogICAgICAgICAgICAgICAgZm9yIChzdXBlcl90eXBlID0g dHlwZSAtPiBzdXBlcjsgc3VwZXJfdHlwZTsgc3VwZXJfdHlwZSA9IHN1cGVyX3R5cGUgLT4gc3Vw ZXIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChtZXRob2Rfc2hh ZG93ID0gc3VwZXJfdHlwZSAtPiBleHBhbmRlZF9tZXRob2RfdGFibGUgLT4gRmluZE1ldGhvZFNo YWRvd1N5bWJvbChuYW1lX3N5bWJvbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rf c2hhZG93OyBtZXRob2Rfc2hhZG93ID0gbWV0aG9kX3NoYWRvdyAtPiBuZXh0X21ldGhvZCkKICAg ICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFN5bWJvbCAq bWV0aG9kID0gbWV0aG9kX3NoYWRvdyAtPiBtZXRob2Rfc3ltYm9sOwogICAgICAgICAgICAgICAg ICAgICAgICBpZiAoISBtZXRob2QgLT4gSXNUeXBlZCgpKQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgbWV0aG9kIC0+IFByb2Nlc3NNZXRob2RTaWduYXR1cmUoKFNlbWFudGljICopIHRoaXMs IHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJfdG9rZW4pOwoKICAgICAgICAgICAgICAgICAgICAg ICAgaWYgKG1ldGhvZF9jYWxsIC0+IE51bUFyZ3VtZW50cygpID09IG1ldGhvZCAtPiBOdW1Gb3Jt YWxQYXJhbWV0ZXJzKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0g MDsgaSA8IG1ldGhvZF9jYWxsIC0+IE51bUFyZ3VtZW50cygpOyBpKyspCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN0RXhwcmVz c2lvbiAqZXhwciA9IG1ldGhvZF9jYWxsIC0+IEFyZ3VtZW50KGkpOwogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGlmICghIENhbk1ldGhvZEludm9jYXRpb25Db252ZXJ0KG1ldGhvZCAt PiBGb3JtYWxQYXJhbWV0ZXIoaSkgLT4gVHlwZSgpLCBleHByIC0+IFR5cGUoKSkpCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAg ICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gbWV0aG9kX2NhbGwg LT4gTnVtQXJndW1lbnRzKCkpICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVh azsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAg ICAgICAgICAgICAgICAgaWYgKG1ldGhvZF9zaGFkb3cpICAKICAgICAgICAgICAgICAgICAgICAg ICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKHN1cGVyX3R5 cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3Io KG1ldGhvZF9zaGFkb3cgLT4gbWV0aG9kX3N5bWJvbCAtPiBBQ0NfUFJJVkFURSgpCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU2VtYW50aWNFcnJv cjo6TUVUSE9EX1dJVEhfUFJJVkFURV9BQ0NFU1NfTk9UX0FDQ0VTU0lCTEUKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTZW1hbnRpY0Vycm9yOjpN RVRIT0RfV0lUSF9ERUZBVUxUX0FDQ0VTU19OT1RfQUNDRVNTSUJMRSksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4gTGVmdFRva2VuKCksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4gUmlnaHRUb2tlbigpLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc3ltYm9sIC0+IE5hbWUoKSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcl90eXBlIC0+IENvbnRhaW5p bmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdXBlcl90eXBlIC0+IEV4dGVybmFsTmFtZSgpLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHR5cGUgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdlTmFt ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgLT4gRXh0ZXJuYWxO YW1lKCkpOwogICAgICAgICAgICAgICAgICAgIHN5bWJvbF9mb3VuZCA9IHRydWU7CiAgICAgICAg ICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAg ICB9CgogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICBpZiAo ISBzeW1ib2xfZm91bmQpCiAgICAgICAgewogICAgICAgICAgICBUeXBlU3ltYm9sICp0aGlzX3R5 cGUgPSBUaGlzVHlwZSgpOwoKICAgICAgICAgICAgaWYgKEZpbmRUeXBlKHNpbXBsZV9uYW1lIC0+ IGlkZW50aWZpZXJfdG9rZW4pKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSZXBvcnRT ZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpUWVBFX05PVF9NRVRIT0QsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90b2tlbiwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc3ltYm9sIC0+IE5hbWUoKSk7CiAgICAg ICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpc190eXBlIC0+IGV4cGFuZGVkX21ldGhv ZF90YWJsZSAtPiBGaW5kTWV0aG9kU2hhZG93U3ltYm9sKG5hbWVfc3ltYm9sKSkKICAgICAgICAg ICAgICAgIFJlcG9ydE1ldGhvZE5vdEZvdW5kKG1ldGhvZF9jYWxsLCBuYW1lX3N5bWJvbCAtPiBO YW1lKCkpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE1l dGhvZFN5bWJvbCAqbWV0aG9kID0gRmluZE1pc3NwZWxsZWRNZXRob2ROYW1lKHRoaXNfdHlwZSwg bWV0aG9kX2NhbGwsIG5hbWVfc3ltYm9sKTsKICAgICAgICAgICAgICAgIGlmIChtZXRob2QpCiAg ICAgICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6Ok1FVEhPRF9O QU1FX01JU1NQRUxMRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhv ZF9jYWxsIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBtZXRob2RfY2FsbCAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIG5hbWVfc3ltYm9sIC0+IE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdGhpc190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5h bWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc190eXBlIC0+IEV4 dGVybmFsTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Qg LT4gTmFtZSgpKTsKICAgICAgICAgICAgICAgIGVsc2UgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNF cnJvcjo6TUVUSE9EX05BTUVfTk9UX0ZPVU5EX0lOX1RZUEUsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBSaWdodFRva2VuKCksCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc3ltYm9sIC0+IE5hbWUoKSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc190eXBlIC0+IENvbnRhaW5pbmdQ YWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdGhpc190eXBlIC0+IEV4dGVybmFsTmFtZSgpKTsKICAgICAgICAgICAgfQogICAgICAg IH0KICAgIH0KCiAgICAgCiAgICAgCiAgICAgCiAgICBpZiAobWV0aG9kX3N5bWJvbCkKICAgIHsK ICAgICAgICBtZXRob2Rfc3ltYm9sIC0+IFByb2Nlc3NNZXRob2RUaHJvd3MoKFNlbWFudGljICop IHRoaXMsIG1ldGhvZF9jYWxsIC0+IG1ldGhvZCAtPiBSaWdodFRva2VuKCkpOwoKICAgICAgICBp ZiAoY29udHJvbC5vcHRpb24uZGVwcmVjYXRpb24gJiYKICAgICAgICAgICAgbWV0aG9kX3N5bWJv bCAtPiBJc0RlcHJlY2F0ZWQoKSAmJiBtZXRob2Rfc3ltYm9sIC0+IGNvbnRhaW5pbmdfdHlwZSAt PiBvdXRlcm1vc3RfdHlwZSAhPSBUaGlzVHlwZSgpIC0+IG91dGVybW9zdF90eXBlKQogICAgICAg IHsKICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6REVQUkVDQVRFRF9N RVRIT0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IExlZnRUb2tl bigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBSaWdodFRva2Vu KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9zeW1ib2wgLT4gSGVhZGVyKCks CiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9zeW1ib2wgLT4gY29udGFpbmluZ190 eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgbWV0aG9kX3N5bWJvbCAtPiBjb250YWluaW5nX3R5cGUgLT4gRXh0ZXJu YWxOYW1lKCkpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbWV0aG9kX3N5bWJvbDsKfQoK CgogCiAKIAogCiAKaW5saW5lIFZhcmlhYmxlU3ltYm9sICpTZW1hbnRpYzo6RmluZFZhcmlhYmxl SW5UeXBlKFR5cGVTeW1ib2wgKnR5cGUsIEFzdEZpZWxkQWNjZXNzICpmaWVsZF9hY2Nlc3MsIE5h bWVTeW1ib2wgKm5hbWVfc3ltYm9sKQp7CiAgICBpZiAoISBuYW1lX3N5bWJvbCkKICAgICAgICBu YW1lX3N5bWJvbCA9IGxleF9zdHJlYW0gLT4gTmFtZVN5bWJvbChmaWVsZF9hY2Nlc3MgLT4gaWRl bnRpZmllcl90b2tlbik7CgogICAgaWYgKCEgdHlwZSAtPiBleHBhbmRlZF9maWVsZF90YWJsZSkK ICAgICAgICBDb21wdXRlRmllbGRzQ2xvc3VyZSh0eXBlLCBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRp Zmllcl90b2tlbik7CgogCiAKIAogCgoKCgoKCgoKCgoKCiAgICBWYXJpYWJsZVNoYWRvd1N5bWJv bCAqdmFyaWFibGVfc2hhZG93X3N5bWJvbCA9IHR5cGUgLT4gZXhwYW5kZWRfZmllbGRfdGFibGUg LT4gRmluZFZhcmlhYmxlU2hhZG93U3ltYm9sKG5hbWVfc3ltYm9sKTsKCiAgICAgCiAgICAgCiAg ICAgCiAgICAgCiAgICAgCiAgICBpZiAodmFyaWFibGVfc2hhZG93X3N5bWJvbCkKICAgIHsKICAg ICAgICBWYXJpYWJsZVN5bWJvbCAqdmFyaWFibGVfc3ltYm9sID0gdmFyaWFibGVfc2hhZG93X3N5 bWJvbCAtPiB2YXJpYWJsZV9zeW1ib2w7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFy aWFibGVfc2hhZG93X3N5bWJvbCAtPiBOdW1Db25mbGljdHMoKTsgaSsrKQogICAgICAgIHsKICAg ICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6QU1CSUdVT1VTX0ZJRUxELAog ICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gTGVmdFRva2VuKCksCiAg ICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBSaWdodFRva2VuKCksCiAg ICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc3ltYm9sIC0+IE5hbWUoKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgdmFyaWFibGVfc3ltYm9sIC0+IG93bmVyIC0+IFR5cGVDYXN0KCkg LT4gQ29udGFpbmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAg ICAgICAgICAgICB2YXJpYWJsZV9zeW1ib2wgLT4gb3duZXIgLT4gVHlwZUNhc3QoKSAtPiBFeHRl cm5hbE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVfc2hhZG93X3N5 bWJvbCAtPiBDb25mbGljdChpKSAtPiBvd25lciAtPiBUeXBlQ2FzdCgpIC0+IENvbnRhaW5pbmdQ YWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFy aWFibGVfc2hhZG93X3N5bWJvbCAtPiBDb25mbGljdChpKSAtPiBvd25lciAtPiBUeXBlQ2FzdCgp IC0+IEV4dGVybmFsTmFtZSgpKTsKICAgICAgICB9CgogICAgICAgIGlmICh2YXJpYWJsZV9zeW1i b2wgLT4gSXNTeW50aGV0aWMoKSkKICAgICAgICB7CiAgICAgICAgICAgIFJlcG9ydFNlbUVycm9y KFNlbWFudGljRXJyb3I6OlNZTlRIRVRJQ19WQVJJQUJMRV9BQ0NFU1MsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgZmllbGRfYWNjZXNzIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgdmFyaWFibGVfc3ltYm9sIC0+IE5hbWUoKSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgdmFyaWFibGVfc3ltYm9sIC0+IG93bmVyIC0+IFR5cGVDYXN0KCkgLT4gQ29udGFp bmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAg ICB2YXJpYWJsZV9zeW1ib2wgLT4gb3duZXIgLT4gVHlwZUNhc3QoKSAtPiBFeHRlcm5hbE5hbWUo KSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoY29udHJvbC5vcHRpb24uZGVwcmVjYXRpb24gJiYK ICAgICAgICAgICAgdmFyaWFibGVfc3ltYm9sIC0+IElzRGVwcmVjYXRlZCgpICYmCiAgICAgICAg ICAgIHZhcmlhYmxlX3N5bWJvbCAtPiBvd25lciAtPiBUeXBlQ2FzdCgpIC0+IG91dGVybW9zdF90 eXBlICE9IFRoaXNUeXBlKCkgLT4gb3V0ZXJtb3N0X3R5cGUpCiAgICAgICAgewogICAgICAgICAg ICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpERVBSRUNBVEVEX0ZJRUxELAogICAgICAg ICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gTGVmdFRva2VuKCksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBSaWdodFRva2VuKCksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX3N5bWJvbCAtPiBOYW1lKCksCiAgICAgICAgICAg ICAgICAgICAgICAgICAgIHZhcmlhYmxlX3N5bWJvbCAtPiBvd25lciAtPiBUeXBlQ2FzdCgpIC0+ IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgdmFyaWFibGVfc3ltYm9sIC0+IG93bmVyIC0+IFR5cGVDYXN0KCkgLT4gRXh0ZXJu YWxOYW1lKCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEgdmFyaWFibGVfc3ltYm9sIC0+IElz VHlwZWQoKSkKICAgICAgICAgICAgdmFyaWFibGVfc3ltYm9sIC0+IFByb2Nlc3NWYXJpYWJsZVNp Z25hdHVyZSgoU2VtYW50aWMgKikgdGhpcywgZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9r ZW4pOwoKICAgICAgICByZXR1cm4gdmFyaWFibGVfc3ltYm9sOwogICAgfQoKICAgIHJldHVybiAo VmFyaWFibGVTeW1ib2wgKikgX19udWxsIDsKfQoKCnZvaWQgU2VtYW50aWM6OlJlcG9ydEFjY2Vz c2VkRmllbGROb3RGb3VuZChBc3RGaWVsZEFjY2VzcyAqZmllbGRfYWNjZXNzLCBUeXBlU3ltYm9s ICp0eXBlKQp7CiAgICBOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCA9IGxleF9zdHJlYW0gLT4gTmFt ZVN5bWJvbChmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbik7CiAgICBWYXJpYWJsZVNo YWRvd1N5bWJvbCAqdmFyaWFibGVfc2hhZG93X3N5bWJvbDsKCiAgICBpZiAoISB0eXBlIC0+IGV4 cGFuZGVkX2ZpZWxkX3RhYmxlKQogICAgICAgIENvbXB1dGVGaWVsZHNDbG9zdXJlKHR5cGUsIGZp ZWxkX2FjY2VzcyAtPiBiYXNlIC0+IExlZnRUb2tlbigpKTsKICAgIFR5cGVTeW1ib2wgKnN1cGVy X3R5cGU7CiAgICBmb3IgKHN1cGVyX3R5cGUgPSB0eXBlIC0+IHN1cGVyOyBzdXBlcl90eXBlOyBz dXBlcl90eXBlID0gc3VwZXJfdHlwZSAtPiBzdXBlcikKICAgIHsKICAgICAgICB2YXJpYWJsZV9z aGFkb3dfc3ltYm9sID0gc3VwZXJfdHlwZSAtPiBleHBhbmRlZF9maWVsZF90YWJsZSAtPiBGaW5k VmFyaWFibGVTaGFkb3dTeW1ib2wobmFtZV9zeW1ib2wpOwogICAgICAgIGlmICh2YXJpYWJsZV9z aGFkb3dfc3ltYm9sKQogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAoc3VwZXJfdHlw ZSkKICAgIHsKICAgICAgICBWYXJpYWJsZVN5bWJvbCAqdmFyaWFibGVfc3ltYm9sID0gdmFyaWFi bGVfc2hhZG93X3N5bWJvbCAtPiB2YXJpYWJsZV9zeW1ib2w7CiAgICAgICAgUmVwb3J0U2VtRXJy b3IoKHZhcmlhYmxlX3N5bWJvbCAtPiBBQ0NfUFJJVkFURSgpCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgPyBTZW1hbnRpY0Vycm9yOjpGSUVMRF9XSVRIX1BSSVZBVEVf QUNDRVNTX05PVF9BQ0NFU1NJQkxFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgOiBTZW1hbnRpY0Vycm9yOjpGSUVMRF9XSVRIX0RFRkFVTFRfQUNDRVNTX05PVF9BQ0NF U1NJQkxFKSwKICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gTGVmdFRva2Vu KCksCiAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYWNjZXNzIC0+IFJpZ2h0VG9rZW4oKSwK ICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV9zeW1ib2wgLT4gTmFtZSgpLAogICAgICAg ICAgICAgICAgICAgICAgIHN1cGVyX3R5cGUgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAtPiBQYWNr YWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgIHN1cGVyX3R5cGUgLT4gRXh0ZXJuYWxO YW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAtPiBDb250YWluaW5nUGFja2FnZSgp IC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAtPiBFeHRlcm5h bE5hbWUoKSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgVmFyaWFibGVTeW1ib2wgKnZh cmlhYmxlID0gRmluZE1pc3NwZWxsZWRWYXJpYWJsZU5hbWUodHlwZSwgZmllbGRfYWNjZXNzIC0+ IGlkZW50aWZpZXJfdG9rZW4pOwogICAgICAgIGlmICh2YXJpYWJsZSkKICAgICAgICAgICAgIFJl cG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OkZJRUxEX05BTUVfTUlTU1BFTExFRCwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBMZWZ0VG9rZW4oKSwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBSaWdodFRva2VuKCksCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3N5bWJvbCAtPiBOYW1lKCksCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICB0eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5h bWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgLT4gRXh0ZXJuYWxOYW1lKCks CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSAtPiBOYW1lKCkpOwogICAgICAg IGVsc2UgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6RklFTERfTk9UX0ZPVU5ELAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYWNjZXNzIC0+IExlZnRUb2tlbigpLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYWNjZXNzIC0+IFJpZ2h0VG9rZW4oKSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGxleF9zdHJlYW0gLT4gTmFtZVN0cmluZyhmaWVsZF9h Y2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0 eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHR5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgfQoKICAgIHJldHVy bjsKfQoKCnZvaWQgU2VtYW50aWM6OlNlYXJjaEZvclZhcmlhYmxlSW5FbnZpcm9ubWVudChUdXBs ZTxWYXJpYWJsZVN5bWJvbCAqPiAmdmFyaWFibGVzX2ZvdW5kLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYW50aWNFbnZpcm9ubWVudCAqJndoZXJlX2Zv dW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtYW50 aWNFbnZpcm9ubWVudCAqc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBpZGVudGlmaWVy X3Rva2VuKQp7CiAgICB2YXJpYWJsZXNfZm91bmQuUmVzZXQoKTsKICAgIHdoZXJlX2ZvdW5kID0g KFNlbWFudGljRW52aXJvbm1lbnQgKikgX19udWxsIDsKCiAgICBmb3IgKFNlbWFudGljRW52aXJv bm1lbnQgKmVudiA9IHN0YWNrOyBlbnY7IGVudiA9IGVudiAtPiBwcmV2aW91cykKICAgIHsKICAg ICAgICBWYXJpYWJsZVN5bWJvbCAqdmFyaWFibGVfc3ltYm9sID0gZW52IC0+IHN5bWJvbF90YWJs ZS5GaW5kVmFyaWFibGVTeW1ib2wobmFtZV9zeW1ib2wpOwogICAgICAgIGlmICh2YXJpYWJsZV9z eW1ib2wpICAKICAgICAgICB7CiAgICAgICAgICAgIHZhcmlhYmxlc19mb3VuZC5OZXh0KCkgPSB2 YXJpYWJsZV9zeW1ib2w7CiAgICAgICAgICAgIHdoZXJlX2ZvdW5kID0gZW52OwogICAgICAgICAg ICBicmVhazsKICAgICAgICB9CgogICAgICAgIFR5cGVTeW1ib2wgKnR5cGUgPSBlbnYgLT4gVHlw ZSgpOwogICAgICAgIGlmICghIHR5cGUgLT4gZXhwYW5kZWRfZmllbGRfdGFibGUpCiAgICAgICAg ICAgIENvbXB1dGVGaWVsZHNDbG9zdXJlKHR5cGUsIGlkZW50aWZpZXJfdG9rZW4pOwogICAgICAg IFZhcmlhYmxlU2hhZG93U3ltYm9sICp2YXJpYWJsZV9zaGFkb3dfc3ltYm9sID0gdHlwZSAtPiBl eHBhbmRlZF9maWVsZF90YWJsZSAtPiBGaW5kVmFyaWFibGVTaGFkb3dTeW1ib2wobmFtZV9zeW1i b2wpOwogICAgICAgIGlmICh2YXJpYWJsZV9zaGFkb3dfc3ltYm9sKQogICAgICAgIHsKICAgICAg ICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAg ICAgICB2YXJpYWJsZXNfZm91bmQuTmV4dCgpID0gdmFyaWFibGVfc2hhZG93X3N5bWJvbCAtPiB2 YXJpYWJsZV9zeW1ib2w7CgogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAg IAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7 IGkgPCB2YXJpYWJsZV9zaGFkb3dfc3ltYm9sIC0+IE51bUNvbmZsaWN0cygpOyBpKyspCiAgICAg ICAgICAgICAgICB2YXJpYWJsZXNfZm91bmQuTmV4dCgpID0gdmFyaWFibGVfc2hhZG93X3N5bWJv bCAtPiBDb25mbGljdChpKTsKICAgICAgICAgICAgd2hlcmVfZm91bmQgPSBlbnY7CiAgICAgICAg ICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCgpWYXJpYWJsZVN5bWJv bCAqU2VtYW50aWM6OkZpbmRWYXJpYWJsZUluRW52aXJvbm1lbnQoU2VtYW50aWNFbnZpcm9ubWVu dCAqJndoZXJlX2ZvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgU2VtYW50aWNFbnZpcm9ubWVudCAqc3RhY2ssIExleFN0cmVhbTo6VG9rZW5J bmRleCBpZGVudGlmaWVyX3Rva2VuKQp7CiAgICBUdXBsZTxWYXJpYWJsZVN5bWJvbCAqPiB2YXJp YWJsZXNfZm91bmQoMik7CiAgICBOYW1lU3ltYm9sICpuYW1lX3N5bWJvbCA9IGxleF9zdHJlYW0g LT4gTmFtZVN5bWJvbChpZGVudGlmaWVyX3Rva2VuKTsKICAgIFNlYXJjaEZvclZhcmlhYmxlSW5F bnZpcm9ubWVudCh2YXJpYWJsZXNfZm91bmQsIHdoZXJlX2ZvdW5kLCBzdGFjaywgbmFtZV9zeW1i b2wsIGlkZW50aWZpZXJfdG9rZW4pOwoKICAgIFZhcmlhYmxlU3ltYm9sICp2YXJpYWJsZV9zeW1i b2wgPSAoVmFyaWFibGVTeW1ib2wgKikgKHZhcmlhYmxlc19mb3VuZC5MZW5ndGgoKSA+IDAgPyB2 YXJpYWJsZXNfZm91bmRbMF0gOiBfX251bGwgKTsKCiAgICBpZiAodmFyaWFibGVfc3ltYm9sKQog ICAgewogICAgICAgIGlmICh2YXJpYWJsZV9zeW1ib2wgLT4gSXNMb2NhbCgpKSAgCiAgICAgICAg ewogICAgICAgICAgICBpZiAod2hlcmVfZm91bmQgIT0gc3RhY2spCiAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgIFR5cGVTeW1ib2wgKnR5cGUgPSBzdGFjayAtPiBUeXBlKCk7CgogICAgICAg ICAgICAgICAgaWYgKCEgdmFyaWFibGVfc3ltYm9sIC0+IEFDQ19GSU5BTCgpKQogICAgICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgICAgIE1ldGhvZFN5bWJvbCAqbWV0aG9kID0gdmFyaWFi bGVfc3ltYm9sIC0+IG93bmVyIC0+IE1ldGhvZENhc3QoKTsKCiAgICAgICAgICAgICAgICAgICAg UmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6SU5ORVJfQ0xBU1NfUkVGRVJFTkNFX1RPX05P Tl9GSU5BTF9MT0NBTF9WQVJJQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBpZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlk ZW50aWZpZXJfdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAt PiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdHlwZSAtPiBFeHRlcm5hbE5hbWUoKSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBsZXhfc3RyZWFtIC0+IE5hbWVTdHJpbmcoaWRlbnRpZmllcl90 b2tlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIG1ldGhvZCAtPiBOYW1lKCkpOwogICAgICAgICAgICAgICAgfQoKICAg ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAg ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIFZhcmlhYmxlU3lt Ym9sICpsb2NhbF9zaGFkb3cgPSB0eXBlIC0+IEZpbmRPckluc2VydExvY2FsU2hhZG93KHZhcmlh YmxlX3N5bWJvbCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9jYWxfc3ltYm9s ID0gc3RhY2sgLT4gc3ltYm9sX3RhYmxlLkZpbmRWYXJpYWJsZVN5bWJvbChsb2NhbF9zaGFkb3cg LT4gSWRlbnRpdHkoKSk7CiAgICAgICAgICAgICAgICB2YXJpYWJsZV9zeW1ib2wgPSAobG9jYWxf c3ltYm9sID8gbG9jYWxfc3ltYm9sIDogbG9jYWxfc2hhZG93KTsKCiAgICAgICAgICAgICAgICAo c3RhdGljX2Nhc3Q8dm9pZD4gICgoIHZhcmlhYmxlX3N5bWJvbCApID8gMCA6CShfX2Fzc2VydF9m YWlsICgidmFyaWFibGVfc3ltYm9sIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAxMjA3 LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICAgICAgICAgIHdoZXJlX2Zv dW5kID0gc3RhY2s7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodmFy aWFibGVfc3ltYm9sIC0+IG93bmVyICE9IHdoZXJlX2ZvdW5kIC0+IFR5cGUoKSkgICAKICAgICAg ICB7CiAgICAgICAgICAgIFR5cGVTeW1ib2wgKnR5cGUgPSAoVHlwZVN5bWJvbCAqKSB2YXJpYWJs ZV9zeW1ib2wgLT4gb3duZXI7CgogICAgICAgICAgICBpZiAodmFyaWFibGVfc3ltYm9sIC0+IElz U3ludGhldGljKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9y KFNlbWFudGljRXJyb3I6OlNZTlRIRVRJQ19WQVJJQUJMRV9BQ0NFU1MsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaWRlbnRpZmllcl90b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHZhcmlhYmxlX3N5bWJvbCAtPiBOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB0eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHR5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgICAgICAg ICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCEgd2hlcmVfZm91bmQgLT4gVHlwZSgpIC0+IEFDQ19T VEFUSUMoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVHVwbGU8VmFyaWFibGVTeW1i b2wgKj4gb3RoZXJzKDIpOwogICAgICAgICAgICAgICAgU2VtYW50aWNFbnZpcm9ubWVudCAqZm91 bmRfb3RoZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcmV2aW91c19l bnYgPSB3aGVyZV9mb3VuZCAtPiBwcmV2aW91czsKICAgICAgICAgICAgICAgIFNlYXJjaEZvclZh cmlhYmxlSW5FbnZpcm9ubWVudChvdGhlcnMsIGZvdW5kX290aGVyLCBwcmV2aW91c19lbnYsIG5h bWVfc3ltYm9sLCBpZGVudGlmaWVyX3Rva2VuKTsKCiAgICAgICAgICAgICAgICBpZiAob3RoZXJz Lkxlbmd0aCgpID4gMCAmJiB3aGVyZV9mb3VuZCAtPiBUeXBlKCkgLT4gQ2FuQWNjZXNzKGZvdW5k X290aGVyIC0+IFR5cGUoKSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAg Zm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlcnMuTGVuZ3RoKCk7ICBpKyspCiAgICAgICAgICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISAob3RoZXJzW2ldID09IHZhcmlh YmxlX3N5bWJvbCAmJiB2YXJpYWJsZV9zeW1ib2wgLT4gQUNDX1NUQVRJQygpKSkKICAgICAgICAg ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kU3ltYm9s ICptZXRob2QgPSBvdGhlcnNbaV0gLT4gb3duZXIgLT4gTWV0aG9kQ2FzdCgpOwoKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QpCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50 aWNFcnJvcjo6SU5IRVJJVEFOQ0VfQU5EX0xFWElDQUxfU0NPUElOR19DT05GTElDVF9XSVRIX0xP Q0FMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50 aWZpZXJfdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgaWRlbnRpZmllcl90b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBsZXhfc3RyZWFtIC0+IE5hbWVTdHJpbmcoaWRlbnRpZmllcl90b2tlbiksCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAtPiBDb250 YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAtPiBFeHRlcm5hbE5hbWUoKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgLT4gTmFtZSgpKTsK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAg ICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBvcnRT ZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpJTkhFUklUQU5DRV9BTkRfTEVYSUNBTF9TQ09QSU5HX0NP TkZMSUNUX1dJVEhfTUVNQkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGlkZW50aWZpZXJfdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcl90b2tlbiwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBsZXhfc3RyZWFtIC0+IE5hbWVTdHJpbmcoaWRlbnRp Zmllcl90b2tlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgdHlwZSAtPiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAtPiBFeHRlcm5hbE5h bWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Vu ZF9vdGhlciAtPiBUeXBlKCkgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdlTmFtZSgp LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX290 aGVyIC0+IFR5cGUoKSAtPiBFeHRlcm5hbE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPCB2YXJp YWJsZXNfZm91bmQuTGVuZ3RoKCk7IGkrKykKICAgIHsKICAgICAgICBSZXBvcnRTZW1FcnJvcihT ZW1hbnRpY0Vycm9yOjpBTUJJR1VPVVNfRklFTEQsCiAgICAgICAgICAgICAgICAgICAgICAgaWRl bnRpZmllcl90b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3Rva2VuLAog ICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX3N5bWJvbCAtPiBOYW1lKCksCiAgICAgICAg ICAgICAgICAgICAgICAgdmFyaWFibGVfc3ltYm9sIC0+IG93bmVyIC0+IFR5cGVDYXN0KCkgLT4g Q29udGFpbmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAg ICAgIHZhcmlhYmxlX3N5bWJvbCAtPiBvd25lciAtPiBUeXBlQ2FzdCgpIC0+IEV4dGVybmFsTmFt ZSgpLAogICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc19mb3VuZFtpXSAtPiBvd25lciAt PiBUeXBlQ2FzdCgpIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAg ICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXNfZm91bmRbaV0gLT4gb3duZXIgLT4gVHlwZUNh c3QoKSAtPiBFeHRlcm5hbE5hbWUoKSk7CiAgICB9CgogICAgaWYgKHZhcmlhYmxlX3N5bWJvbCkK ICAgIHsKICAgICAgICBpZiAoY29udHJvbC5vcHRpb24uZGVwcmVjYXRpb24gJiYKICAgICAgICAg ICAgdmFyaWFibGVfc3ltYm9sIC0+IElzRGVwcmVjYXRlZCgpICYmCiAgICAgICAgICAgIHZhcmlh YmxlX3N5bWJvbCAtPiBvd25lciAtPiBUeXBlQ2FzdCgpIC0+IG91dGVybW9zdF90eXBlICE9IFRo aXNUeXBlKCkgLT4gb3V0ZXJtb3N0X3R5cGUpCiAgICAgICAgewogICAgICAgICAgICBSZXBvcnRT ZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpERVBSRUNBVEVEX0ZJRUxELAogICAgICAgICAgICAgICAg ICAgICAgICAgICBpZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBp ZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV9zeW1i b2wgLT4gTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV9zeW1ib2wg LT4gb3duZXIgLT4gVHlwZUNhc3QoKSAtPiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VO YW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX3N5bWJvbCAtPiBvd25l ciAtPiBUeXBlQ2FzdCgpIC0+IEV4dGVybmFsTmFtZSgpKTsKICAgICAgICB9CgogICAgICAgIGlm ICghIHZhcmlhYmxlX3N5bWJvbCAtPiBJc1R5cGVkKCkpCiAgICAgICAgICAgIHZhcmlhYmxlX3N5 bWJvbCAtPiBQcm9jZXNzVmFyaWFibGVTaWduYXR1cmUoKFNlbWFudGljICopIHRoaXMsIGlkZW50 aWZpZXJfdG9rZW4pOwogICAgfQoKICAgIHJldHVybiB2YXJpYWJsZV9zeW1ib2w7Cn0KCgpWYXJp YWJsZVN5bWJvbCAqU2VtYW50aWM6OkZpbmRJbnN0YW5jZShUeXBlU3ltYm9sICpiYXNlX3R5cGUs IFR5cGVTeW1ib2wgKmVudmlyb25tZW50X3R5cGUpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwg YmFzZV90eXBlIC0+IE51bUVuY2xvc2luZ0luc3RhbmNlcygpOyBpKyspCiAgICB7CiAgICAgICAg VmFyaWFibGVTeW1ib2wgKnZhcmlhYmxlID0gYmFzZV90eXBlIC0+IEVuY2xvc2luZ0luc3RhbmNl KGkpOwogICAgICAgIGlmICh2YXJpYWJsZSAtPiBUeXBlKCkgLT4gSXNTdWJjbGFzcyhlbnZpcm9u bWVudF90eXBlKSkKICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlOwogICAgfQoKICAgIEFzdENs YXNzRGVjbGFyYXRpb24gKmNsYXNzX2RlY2xhcmF0aW9uID0gYmFzZV90eXBlIC0+IGRlY2xhcmF0 aW9uIC0+IENsYXNzRGVjbGFyYXRpb25DYXN0KCk7CiAgICBBc3RDbGFzc0luc3RhbmNlQ3JlYXRp b25FeHByZXNzaW9uICpjbGFzc19jcmVhdGlvbiA9IGJhc2VfdHlwZSAtPiBkZWNsYXJhdGlvbiAt PiBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uQ2FzdCgpOwoKICAgIChzdGF0aWNfY2Fz dDx2b2lkPiAgKCggY2xhc3NfZGVjbGFyYXRpb24gfHwgY2xhc3NfY3JlYXRpb24gKSA/IDAgOgko X19hc3NlcnRfZmFpbCAoImNsYXNzX2RlY2xhcmF0aW9uIHx8IGNsYXNzX2NyZWF0aW9uIiAsICIu Li8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAxMzE2LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDAp KSkgOwoKICAgIEFzdENsYXNzQm9keSAqY2xhc3NfYm9keSA9IChjbGFzc19kZWNsYXJhdGlvbiA/ IGNsYXNzX2RlY2xhcmF0aW9uIC0+IGNsYXNzX2JvZHkgOiBjbGFzc19jcmVhdGlvbiAtPiBjbGFz c19ib2R5X29wdCk7CgogICAgTGV4U3RyZWFtOjpUb2tlbkluZGV4IGxvYyA9IGNsYXNzX2JvZHkg LT4gbGVmdF9icmFjZV90b2tlbjsKICAgIEFzdEJsb2NrICp0aGlzX2Jsb2NrID0gY2xhc3NfYm9k eSAtPiB0aGlzX2Jsb2NrOwogICAgaWYgKCEgdGhpc19ibG9jaykKICAgIHsKICAgICAgICB0aGlz X2Jsb2NrID0gY29tcGlsYXRpb25fdW5pdCAtPiBhc3RfcG9vbCAtPiBHZW5CbG9jaygpOwogICAg ICAgIHRoaXNfYmxvY2sgLT4gbGVmdF9icmFjZV90b2tlbiAgPSBsb2M7CiAgICAgICAgdGhpc19i bG9jayAtPiByaWdodF9icmFjZV90b2tlbiA9IGxvYzsKCiAgICAgICAgdGhpc19ibG9jayAtPiBp c19yZWFjaGFibGUgPSB0cnVlOwogICAgICAgIHRoaXNfYmxvY2sgLT4gY2FuX2NvbXBsZXRlX25v cm1hbGx5ID0gdHJ1ZTsKCiAgICAgICAgY2xhc3NfYm9keSAtPiB0aGlzX2Jsb2NrID0gdGhpc19i bG9jazsKICAgIH0KCiAgICBpbnQgayA9IGJhc2VfdHlwZSAtPiBOdW1FbmNsb3NpbmdJbnN0YW5j ZXMoKTsKICAgIGZvciAoVHlwZVN5bWJvbCAqdHlwZSA9IGJhc2VfdHlwZSAtPiBFbmNsb3NpbmdJ bnN0YW5jZShrIC0gMSkgLT4gVHlwZSgpOyB0eXBlOyB0eXBlID0gdHlwZSAtPiBDb250YWluaW5n VHlwZSgpLCBrKyspCiAgICB7CiAgICAgICAgQXN0U2ltcGxlTmFtZSAqcGFybSA9IGNvbXBpbGF0 aW9uX3VuaXQgLT4gYXN0X3Bvb2wgLT4gR2VuU2ltcGxlTmFtZShsb2MpOwogICAgICAgIHBhcm0g LT4gc3ltYm9sID0gYmFzZV90eXBlIC0+IEVuY2xvc2luZ0luc3RhbmNlKGsgLSAxKTsKCiAgICAg ICAgVmFyaWFibGVTeW1ib2wgKnZhcmlhYmxlX3N5bWJvbCA9IChWYXJpYWJsZVN5bWJvbCAqKSB0 eXBlIC0+IEZpbmRUaGlzKDApOwoKICAgICAgICBBc3RGaWVsZEFjY2VzcyAqbWV0aG9kX25hbWUg PSBjb21waWxhdGlvbl91bml0IC0+IGFzdF9wb29sIC0+IEdlbkZpZWxkQWNjZXNzKCk7CiAgICAg ICAgbWV0aG9kX25hbWUgLT4gYmFzZSA9IHBhcm07CiAgICAgICAgbWV0aG9kX25hbWUgLT4gZG90 X3Rva2VuID0gbG9jOwogICAgICAgIG1ldGhvZF9uYW1lIC0+IGlkZW50aWZpZXJfdG9rZW4gPSBs b2M7CiAgICAgICAgbWV0aG9kX25hbWUgLT4gc3ltYm9sID0gdmFyaWFibGVfc3ltYm9sOyAgCgog ICAgICAgIEFzdE1ldGhvZEludm9jYXRpb24gKnJocyAgICAgICA9IGNvbXBpbGF0aW9uX3VuaXQg LT4gYXN0X3Bvb2wgLT4gR2VuTWV0aG9kSW52b2NhdGlvbigpOwogICAgICAgIHJocyAtPiBtZXRo b2QgICAgICAgICAgICAgICAgICA9IG1ldGhvZF9uYW1lOwogICAgICAgIHJocyAtPiBsZWZ0X3Bh cmVudGhlc2lzX3Rva2VuICA9IGxvYzsKICAgICAgICByaHMgLT4gcmlnaHRfcGFyZW50aGVzaXNf dG9rZW4gPSBsb2M7CiAgICAgICAgcmhzIC0+IHN5bWJvbCAgICAgICAgICAgICAgICAgID0gdHlw ZSAtPiBHZXRSZWFkQWNjZXNzTWV0aG9kKHZhcmlhYmxlX3N5bWJvbCk7CiAgICAgICAgcmhzIC0+ IEFkZEFyZ3VtZW50KHBhcm0pOyAgCgoKICAgICAgICBBc3RTaW1wbGVOYW1lICpsaHMgPSBjb21w aWxhdGlvbl91bml0IC0+IGFzdF9wb29sIC0+IEdlblNpbXBsZU5hbWUobG9jKTsKICAgICAgICBW YXJpYWJsZVN5bWJvbCAqdmFyaWFibGUgPSBiYXNlX3R5cGUgLT4gRmluZFRoaXMoayk7CiAgICAg ICAgbGhzIC0+IHN5bWJvbCA9ICh2YXJpYWJsZSA/IHZhcmlhYmxlIDogYmFzZV90eXBlIC0+IElu c2VydFRoaXMoaykpOwoKICAgICAgICBBc3RBc3NpZ25tZW50RXhwcmVzc2lvbiAqYXNzaWduID0g Y29tcGlsYXRpb25fdW5pdCAtPiBhc3RfcG9vbAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IEdlbkFzc2lnbm1lbnRFeHByZXNzaW9u KEFzdEFzc2lnbm1lbnRFeHByZXNzaW9uOjpTSU1QTEVfRVFVQUwsIGxvYyk7CiAgICAgICAgYXNz aWduIC0+IGxlZnRfaGFuZF9zaWRlID0gbGhzOwogICAgICAgIGFzc2lnbiAtPiBleHByZXNzaW9u ICAgICA9IHJoczsKICAgICAgICBhc3NpZ24gLT4gc3ltYm9sICAgICAgICAgPSBsaHMgLT4gVHlw ZSgpOwoKICAgICAgICBBc3RFeHByZXNzaW9uU3RhdGVtZW50ICpzdG10ICA9IGNvbXBpbGF0aW9u X3VuaXQgLT4gYXN0X3Bvb2wgLT4gR2VuRXhwcmVzc2lvblN0YXRlbWVudCgpOwogICAgICAgIHN0 bXQgLT4gZXhwcmVzc2lvbiAgICAgICAgICAgID0gYXNzaWduOwogICAgICAgIHN0bXQgLT4gc2Vt aWNvbG9uX3Rva2VuX29wdCAgID0gbG9jOwogICAgICAgIHN0bXQgLT4gaXNfcmVhY2hhYmxlICAg ICAgICAgID0gdHJ1ZTsKICAgICAgICBzdG10IC0+IGNhbl9jb21wbGV0ZV9ub3JtYWxseSA9IHRy dWU7CgogICAgICAgIHRoaXNfYmxvY2sgLT4gQWRkU3RhdGVtZW50KHN0bXQpOwoKICAgICAgICBp ZiAobGhzIC0+IFR5cGUoKSAtPiBJc1N1YmNsYXNzKGVudmlyb25tZW50X3R5cGUpKQogICAgICAg ICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gYmFzZV90eXBlIC0+IEVuY2xvc2luZ0luc3Rh bmNlKGspOwp9CgoKQXN0RXhwcmVzc2lvbiAqU2VtYW50aWM6OkNyZWF0ZUFjY2Vzc1RvVHlwZShB c3QgKnNvdXJjZSwgVHlwZVN5bWJvbCAqZW52aXJvbm1lbnRfdHlwZSkKewogICAgVHlwZVN5bWJv bCAqdGhpc190eXBlID0gVGhpc1R5cGUoKTsKCiAgICBMZXhTdHJlYW06OlRva2VuSW5kZXggdG9r OwoKICAgIEFzdFNpbXBsZU5hbWUgKnNpbXBsZV9uYW1lID0gc291cmNlIC0+IFNpbXBsZU5hbWVD YXN0KCk7CiAgICBBc3RGaWVsZEFjY2VzcyAqZmllbGRfYWNjZXNzID0gc291cmNlIC0+IEZpZWxk QWNjZXNzQ2FzdCgpOwogICAgQXN0U3VwZXJDYWxsICpzdXBlcl9jYWxsID0gc291cmNlIC0+IFN1 cGVyQ2FsbENhc3QoKTsKICAgIEFzdFRoaXNDYWxsICp0aGlzX2NhbGwgPSBzb3VyY2UgLT4gVGhp c0NhbGxDYXN0KCk7CiAgICBBc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uICpjbGFz c19jcmVhdGlvbiA9IHNvdXJjZSAtPiBDbGFzc0luc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uQ2Fz dCgpOwoKICAgIGlmIChzaW1wbGVfbmFtZSkKICAgICAgICAgdG9rID0gc2ltcGxlX25hbWUgLT4g aWRlbnRpZmllcl90b2tlbjsKICAgIGVsc2UgaWYgKGNsYXNzX2NyZWF0aW9uKQogICAgICAgICB0 b2sgPSBjbGFzc19jcmVhdGlvbiAtPiBuZXdfdG9rZW47CiAgICBlbHNlIGlmIChzdXBlcl9jYWxs KQogICAgICAgICB0b2sgPSBzdXBlcl9jYWxsIC0+IHN1cGVyX3Rva2VuOwogICAgZWxzZSBpZiAo dGhpc19jYWxsKQogICAgICAgICB0b2sgPSB0aGlzX2NhbGwgLT4gdGhpc190b2tlbjsKICAgIGVs c2UgaWYgKGZpZWxkX2FjY2VzcykKICAgICAgICAgdG9rID0gZmllbGRfYWNjZXNzIC0+IGRvdF90 b2tlbjsKICAgIGVsc2UgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBmYWxzZSApID8gMCA6CShfX2Fz c2VydF9mYWlsICgiZmFsc2UiICwgIi4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDE0MDQsIF9f UFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgQXN0RXhwcmVzc2lvbiAqcmVzb2x1dGlv bjsKCiAgICBpZiAoISB0aGlzX3R5cGUgLT4gQ2FuQWNjZXNzKGVudmlyb25tZW50X3R5cGUpKQog ICAgewogICAgICAgIGlmIChFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigpKQogICAgICAg ICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpFTkNMT1NJTkdfSU5TVEFOQ0VfQUND RVNTX0ZST01fQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgKGZpZWxkX2FjY2VzcyA/IGZpZWxkX2FjY2VzcyAtPiBiYXNlIC0+IExlZnRUb2tlbigpIDog dG9rKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpZWxkX2FjY2VzcyA/IGZpZWxkX2Fj Y2VzcyAtPiBiYXNlIC0+IFJpZ2h0VG9rZW4oKSA6IHRvayksCiAgICAgICAgICAgICAgICAgICAg ICAgICAgIGVudmlyb25tZW50X3R5cGUgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdl TmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudF90eXBlIC0+IEV4 dGVybmFsTmFtZSgpKTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBTZW1hbnRp Y0Vudmlyb25tZW50ICplbnYgPSBzdGF0ZV9zdGFjay5Ub3AoKTsKICAgICAgICAgICAgZm9yICg7 IGVudjsgZW52ID0gZW52IC0+IHByZXZpb3VzKSAgCiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgIGlmIChlbnYgLT4gU3RhdGljUmVnaW9uKCkgfHwgZW52IC0+IFR5cGUoKSAtPiBBQ0NfU1RB VElDKCkpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAg ICAgIGlmIChlbnYpCiAgICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJv cjo6RU5DTE9TSU5HX0lOU1RBTkNFX0FDQ0VTU19BQ1JPU1NfU1RBVElDX1JFR0lPTiwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAoZmllbGRfYWNjZXNzID8gZmllbGRfYWNjZXNzIC0+ IGJhc2UgLT4gTGVmdFRva2VuKCkgOiB0b2spLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIChmaWVsZF9hY2Nlc3MgPyBmaWVsZF9hY2Nlc3MgLT4gYmFzZSAtPiBSaWdodFRva2VuKCkg OiB0b2spLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50X3R5cGUg LT4gQ29udGFpbmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGVudmlyb25tZW50X3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCksCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52IC0+IFR5cGUoKSAtPiBDb250YWluaW5nUGFj a2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ZW52IC0+IFR5cGUoKSAtPiBFeHRlcm5hbE5hbWUoKSk7CiAgICAgICAgICAgIGVsc2UgUmVwb3J0 U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6RU5DTE9TSU5HX0lOU1RBTkNFX05PVF9BQ0NFU1NJQkxF LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZF9hY2Nlc3MgPyBmaWVsZF9h Y2Nlc3MgLT4gYmFzZSAtPiBMZWZ0VG9rZW4oKSA6IHRvayksCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGZpZWxkX2FjY2VzcyA/IGZpZWxkX2FjY2VzcyAtPiBiYXNlIC0+IFJpZ2h0 VG9rZW4oKSA6IHRvayksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1l bnRfdHlwZSAtPiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRfdHlwZSAtPiBFeHRlcm5hbE5hbWUo KSk7CiAgICAgICAgfQoKICAgICAgICByZXNvbHV0aW9uID0gY29tcGlsYXRpb25fdW5pdCAtPiBh c3RfcG9vbCAtPiBHZW5TaW1wbGVOYW1lKHRvayk7CiAgICAgICAgcmVzb2x1dGlvbiAtPiBzeW1i b2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICB9CiAgICBlbHNlIGlmIChFeHBsaWNpdENvbnN0cnVj dG9ySW52b2NhdGlvbigpKQogICAgewogICAgICAgIFZhcmlhYmxlU3ltYm9sICp2YXJpYWJsZSA9 IExvY2FsU3ltYm9sVGFibGUoKS5GaW5kVmFyaWFibGVTeW1ib2woY29udHJvbC50aGlzMF9uYW1l X3N5bWJvbCk7CgogICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggdmFyaWFibGUgKSA/IDAg OgkoX19hc3NlcnRfZmFpbCAoInZhcmlhYmxlIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAi LCAxNDQ3LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICByZXNvbHV0aW9u ID0gY29tcGlsYXRpb25fdW5pdCAtPiBhc3RfcG9vbCAtPiBHZW5TaW1wbGVOYW1lKHRvayk7CiAg ICAgICAgcmVzb2x1dGlvbiAtPiBzeW1ib2wgPSB2YXJpYWJsZTsKCiAgICAgICAgIAogICAgICAg ICAKICAgICAgICAgCiAgICAgICAgaWYgKEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKCkg LT4gU3VwZXJDYWxsQ2FzdCgpKQogICAgICAgIHsKICAgICAgICAgICAgVHlwZVN5bWJvbCAqY29u dGFpbmluZ190eXBlID0gdGhpc190eXBlIC0+IENvbnRhaW5pbmdUeXBlKCk7CiAgICAgICAgICAg IGlmICghIGNvbnRhaW5pbmdfdHlwZSAtPiBJc1N1YmNsYXNzKGVudmlyb25tZW50X3R5cGUpKQog ICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2YXJpYWJsZSA9IEZpbmRJbnN0YW5jZShjb250 YWluaW5nX3R5cGUsIGVudmlyb25tZW50X3R5cGUpOwoKICAgICAgICAgICAgICAgIEFzdEZpZWxk QWNjZXNzICptZXRob2RfbmFtZSA9IGNvbXBpbGF0aW9uX3VuaXQgLT4gYXN0X3Bvb2wgLT4gR2Vu RmllbGRBY2Nlc3MoKTsKICAgICAgICAgICAgICAgIG1ldGhvZF9uYW1lIC0+IGJhc2UgPSByZXNv bHV0aW9uOyAgCiAgICAgICAgICAgICAgICBtZXRob2RfbmFtZSAtPiBkb3RfdG9rZW4gPSB0b2s7 CiAgICAgICAgICAgICAgICBtZXRob2RfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuID0gdG9rOwog ICAgICAgICAgICAgICAgbWV0aG9kX25hbWUgLT4gc3ltYm9sID0gdmFyaWFibGU7CgogICAgICAg ICAgICAgICAgQXN0TWV0aG9kSW52b2NhdGlvbiAqbWV0aG9kX2NhbGwgICAgICAgPSBjb21waWxh dGlvbl91bml0IC0+IGFzdF9wb29sIC0+IEdlbk1ldGhvZEludm9jYXRpb24oKTsKICAgICAgICAg ICAgICAgIG1ldGhvZF9jYWxsIC0+IG1ldGhvZCAgICAgICAgICAgICAgICAgID0gbWV0aG9kX25h bWU7CiAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBsZWZ0X3BhcmVudGhlc2lzX3Rva2Vu ICA9IHRvazsKICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IHJpZ2h0X3BhcmVudGhlc2lz X3Rva2VuID0gdG9rOwoKICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggY29u dGFpbmluZ190eXBlID09IHZhcmlhYmxlIC0+IG93bmVyIC0+IFR5cGVDYXN0KCkgKSA/IDAgOgko X19hc3NlcnRfZmFpbCAoImNvbnRhaW5pbmdfdHlwZSA9PSB2YXJpYWJsZSAtPiBvd25lciAtPiBU eXBlQ2FzdCgpIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAxNDczLCBfX1BSRVRUWV9G VU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IHN5bWJv bCA9IGNvbnRhaW5pbmdfdHlwZSAtPiBHZXRSZWFkQWNjZXNzTWV0aG9kKHZhcmlhYmxlKTsKICAg ICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IEFkZEFyZ3VtZW50KHJlc29sdXRpb24pOwoKICAg ICAgICAgICAgICAgIHJlc29sdXRpb24gPSBtZXRob2RfY2FsbDsKICAgICAgICAgICAgfQogICAg ICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKHRoaXNfdHlwZSAtPiBJc1N1YmNsYXNzKGVudmlyb25t ZW50X3R5cGUpKQogICAgewogICAgICAgIHJlc29sdXRpb24gPSBjb21waWxhdGlvbl91bml0IC0+ IGFzdF9wb29sIC0+IEdlblRoaXNFeHByZXNzaW9uKHRvayk7CiAgICAgICAgcmVzb2x1dGlvbiAt PiBzeW1ib2wgPSB0aGlzX3R5cGU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcmVzb2x1 dGlvbiA9IGNvbXBpbGF0aW9uX3VuaXQgLT4gYXN0X3Bvb2wgLT4gR2VuU2ltcGxlTmFtZSh0b2sp OwogICAgICAgIHJlc29sdXRpb24gLT4gc3ltYm9sID0gRmluZEluc3RhbmNlKHRoaXNfdHlwZSwg ZW52aXJvbm1lbnRfdHlwZSk7CiAgICB9CgogICAgcmV0dXJuICgocmVzb2x1dGlvbiAtPiBzeW1i b2wgPT0gY29udHJvbC5ub190eXBlKSB8fCAocmVzb2x1dGlvbiAtPiBUeXBlKCkgPT0gZW52aXJv bm1lbnRfdHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgID8gcmVzb2x1dGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgOiBDb252ZXJ0VG9UeXBlKHJlc29sdXRpb24sIGVudmlyb25t ZW50X3R5cGUpKTsKfQoKCnZvaWQgU2VtYW50aWM6OkNyZWF0ZUFjY2Vzc1RvU2NvcGVkVmFyaWFi bGUoQXN0U2ltcGxlTmFtZSAqc2ltcGxlX25hbWUsIFR5cGVTeW1ib2wgKmVudmlyb25tZW50X3R5 cGUpCnsKICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggZW52aXJvbm1lbnRfdHlwZSAtPiBJc093 bmVyKFRoaXNUeXBlKCkpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJlbnZpcm9ubWVudF90eXBl IC0+IElzT3duZXIoVGhpc1R5cGUoKSkiICwgIi4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDE1 MDEsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgVmFyaWFibGVTeW1ib2wgKnZh cmlhYmxlX3N5bWJvbCA9IChWYXJpYWJsZVN5bWJvbCAqKSBzaW1wbGVfbmFtZSAtPiBzeW1ib2w7 CgogICAgQXN0RXhwcmVzc2lvbiAqYWNjZXNzX2V4cHJlc3Npb247CiAgICBpZiAodmFyaWFibGVf c3ltYm9sIC0+IEFDQ19TVEFUSUMoKSkKICAgIHsKICAgICAgICBhY2Nlc3NfZXhwcmVzc2lvbiA9 IGNvbXBpbGF0aW9uX3VuaXQgLT4gYXN0X3Bvb2wgLT4gR2VuU2ltcGxlTmFtZShzaW1wbGVfbmFt ZSAtPiBpZGVudGlmaWVyX3Rva2VuKTsKICAgICAgICBhY2Nlc3NfZXhwcmVzc2lvbiAtPiBzeW1i b2wgPSBlbnZpcm9ubWVudF90eXBlOwogICAgfQogICAgZWxzZSBhY2Nlc3NfZXhwcmVzc2lvbiA9 IENyZWF0ZUFjY2Vzc1RvVHlwZShzaW1wbGVfbmFtZSwgZW52aXJvbm1lbnRfdHlwZSk7CgogICAg aWYgKGFjY2Vzc19leHByZXNzaW9uIC0+IHN5bWJvbCAhPSBjb250cm9sLm5vX3R5cGUpCiAgICB7 CiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCB2YXJpYWJsZV9zeW1ib2wgLT4gb3duZXIg LT4gVHlwZUNhc3QoKSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgidmFyaWFibGVfc3ltYm9sIC0+ IG93bmVyIC0+IFR5cGVDYXN0KCkiICwgIi4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDE1MTUs IF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgICAgIGlmICh2YXJpYWJsZV9zeW1i b2wgLT4gQUNDX1BSSVZBVEUoKSB8fAogICAgICAgICAgICAodmFyaWFibGVfc3ltYm9sIC0+IEFD Q19QUk9URUNURUQoKSAmJgogICAgICAgICAgICAgdmFyaWFibGVfc3ltYm9sIC0+IG93bmVyIC0+ IFR5cGVDYXN0KCkgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAhPSBlbnZpcm9ubWVudF90eXBlIC0+ IENvbnRhaW5pbmdQYWNrYWdlKCkpKQogICAgICAgIHsKICAgICAgICAgICAgQXN0RmllbGRBY2Nl c3MgKm1ldGhvZF9uYW1lICAgICA9IGNvbXBpbGF0aW9uX3VuaXQgLT4gYXN0X3Bvb2wgLT4gR2Vu RmllbGRBY2Nlc3MoKTsKICAgICAgICAgICAgbWV0aG9kX25hbWUgLT4gYmFzZSAgICAgICAgICAg ICA9IGFjY2Vzc19leHByZXNzaW9uOwogICAgICAgICAgICBtZXRob2RfbmFtZSAtPiBkb3RfdG9r ZW4gICAgICAgID0gc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90b2tlbjsKICAgICAgICAgICAg bWV0aG9kX25hbWUgLT4gaWRlbnRpZmllcl90b2tlbiA9IHNpbXBsZV9uYW1lIC0+IGlkZW50aWZp ZXJfdG9rZW47CiAgICAgICAgICAgIG1ldGhvZF9uYW1lIC0+IHN5bWJvbCAgICAgICAgICAgPSB2 YXJpYWJsZV9zeW1ib2w7CgogICAgICAgICAgICBBc3RNZXRob2RJbnZvY2F0aW9uICptZXRob2Rf Y2FsbCAgICAgICA9IGNvbXBpbGF0aW9uX3VuaXQgLT4gYXN0X3Bvb2wgLT4gR2VuTWV0aG9kSW52 b2NhdGlvbigpOwogICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBtZXRob2QgICAgICAgICAgICAg ICAgICA9IG1ldGhvZF9uYW1lOwogICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBsZWZ0X3BhcmVu dGhlc2lzX3Rva2VuICA9IHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJfdG9rZW47CiAgICAgICAg ICAgIG1ldGhvZF9jYWxsIC0+IHJpZ2h0X3BhcmVudGhlc2lzX3Rva2VuID0gc2ltcGxlX25hbWUg LT4gaWRlbnRpZmllcl90b2tlbjsKICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4gc3ltYm9sICAg ICAgICAgICAgICAgICAgPSBlbnZpcm9ubWVudF90eXBlIC0+IEdldFJlYWRBY2Nlc3NNZXRob2Qo dmFyaWFibGVfc3ltYm9sKTsKCiAgICAgICAgICAgIGlmICghIHZhcmlhYmxlX3N5bWJvbCAtPiBB Q0NfU1RBVElDKCkpCiAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBBZGRBcmd1bWVudChh Y2Nlc3NfZXhwcmVzc2lvbik7ICAKCiAgICAgICAgICAgIHNpbXBsZV9uYW1lIC0+IHJlc29sdXRp b25fb3B0ID0gbWV0aG9kX2NhbGw7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAg ICAgICAgICAgIEFzdEZpZWxkQWNjZXNzICpmaWVsZF9hY2Nlc3MgICAgID0gY29tcGlsYXRpb25f dW5pdCAtPiBhc3RfcG9vbCAtPiBHZW5GaWVsZEFjY2VzcygpOwogICAgICAgICAgICBmaWVsZF9h Y2Nlc3MgLT4gYmFzZSAgICAgICAgICAgICA9IGFjY2Vzc19leHByZXNzaW9uOwogICAgICAgICAg ICBmaWVsZF9hY2Nlc3MgLT4gZG90X3Rva2VuICAgICAgICA9IHNpbXBsZV9uYW1lIC0+IGlkZW50 aWZpZXJfdG9rZW47CiAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2Vu ID0gc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90b2tlbjsKICAgICAgICAgICAgZmllbGRfYWNj ZXNzIC0+IHN5bWJvbCAgICAgICAgICAgPSB2YXJpYWJsZV9zeW1ib2w7CgogICAgICAgICAgICBz aW1wbGVfbmFtZSAtPiByZXNvbHV0aW9uX29wdCA9IGZpZWxkX2FjY2VzczsKICAgICAgICB9CiAg ICB9CgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6Q3JlYXRlQWNjZXNzVG9TY29wZWRN ZXRob2QoQXN0TWV0aG9kSW52b2NhdGlvbiAqbWV0aG9kX2NhbGwsIFR5cGVTeW1ib2wgKmVudmly b25tZW50X3R5cGUpCnsKICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggZW52aXJvbm1lbnRfdHlw ZSAtPiBJc093bmVyKFRoaXNUeXBlKCkpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJlbnZpcm9u bWVudF90eXBlIC0+IElzT3duZXIoVGhpc1R5cGUoKSkiICwgIi4uLy4uL2ppa2VzL3NyYy9leHBy LmNwcCIsIDE1NTYsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgTWV0aG9kU3lt Ym9sICptZXRob2QgPSAoTWV0aG9kU3ltYm9sICopIG1ldGhvZF9jYWxsIC0+IHN5bWJvbDsKICAg IEFzdFNpbXBsZU5hbWUgKnNpbXBsZV9uYW1lID0gKEFzdFNpbXBsZU5hbWUgKikgbWV0aG9kX2Nh bGwgLT4gbWV0aG9kOwoKICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggc2ltcGxlX25hbWUgLT4g U2ltcGxlTmFtZUNhc3QoKSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgic2ltcGxlX25hbWUgLT4g U2ltcGxlTmFtZUNhc3QoKSIgLCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMTU2MSwgX19Q UkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICBBc3RFeHByZXNzaW9uICphY2Nlc3NfZXhw cmVzc2lvbjsKICAgIGlmIChtZXRob2QgLT4gQUNDX1NUQVRJQygpKQogICAgewogICAgICAgIGFj Y2Vzc19leHByZXNzaW9uID0gY29tcGlsYXRpb25fdW5pdCAtPiBhc3RfcG9vbCAtPiBHZW5TaW1w bGVOYW1lKHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJfdG9rZW4pOwogICAgICAgIGFjY2Vzc19l eHByZXNzaW9uIC0+IHN5bWJvbCA9IGVudmlyb25tZW50X3R5cGU7CiAgICB9CiAgICBlbHNlIGFj Y2Vzc19leHByZXNzaW9uID0gQ3JlYXRlQWNjZXNzVG9UeXBlKHNpbXBsZV9uYW1lLCBlbnZpcm9u bWVudF90eXBlKTsKCiAgICBpZiAoYWNjZXNzX2V4cHJlc3Npb24gLT4gc3ltYm9sICE9IGNvbnRy b2wubm9fdHlwZSkKICAgIHsKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAg CiAgICAgICAgIAogICAgICAgIHNpbXBsZV9uYW1lIC0+IHJlc29sdXRpb25fb3B0ID0gYWNjZXNz X2V4cHJlc3Npb247CiAgICAgICAgaWYgKG1ldGhvZCAtPiBBQ0NfUFJJVkFURSgpIHx8CiAgICAg ICAgICAgIChtZXRob2QgLT4gQUNDX1BST1RFQ1RFRCgpICYmCiAgICAgICAgICAgICBtZXRob2Qg LT4gY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgIT0gZW52aXJvbm1lbnRf dHlwZSAtPiBDb250YWluaW5nUGFja2FnZSgpKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICht ZXRob2QgLT4gQUNDX1NUQVRJQygpKQogICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4gc3lt Ym9sID0gZW52aXJvbm1lbnRfdHlwZSAtPiBHZXRSZWFkQWNjZXNzTWV0aG9kKG1ldGhvZCk7CiAg ICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQXN0TWV0aG9kSW52 b2NhdGlvbiAqb2xkX21ldGhvZF9jYWxsID0gbWV0aG9kX2NhbGw7CgogICAgICAgICAgICAgICAg IAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgQXN0 TWV0aG9kSW52b2NhdGlvbiAqbWV0aG9kX2NhbGwgICAgICAgPSBjb21waWxhdGlvbl91bml0IC0+ IGFzdF9wb29sIC0+IEdlbk1ldGhvZEludm9jYXRpb24oKTsKICAgICAgICAgICAgICAgIG1ldGhv ZF9jYWxsIC0+IG1ldGhvZCAgICAgICAgICAgICAgICAgID0gb2xkX21ldGhvZF9jYWxsIC0+IG1l dGhvZDsKICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IGxlZnRfcGFyZW50aGVzaXNfdG9r ZW4gID0gb2xkX21ldGhvZF9jYWxsIC0+IGxlZnRfcGFyZW50aGVzaXNfdG9rZW47CiAgICAgICAg ICAgICAgICBtZXRob2RfY2FsbCAtPiByaWdodF9wYXJlbnRoZXNpc190b2tlbiA9IG9sZF9tZXRo b2RfY2FsbCAtPiByaWdodF9wYXJlbnRoZXNpc190b2tlbjsKICAgICAgICAgICAgICAgIG1ldGhv ZF9jYWxsIC0+IHN5bWJvbCAgICAgICAgICAgICAgICAgID0gZW52aXJvbm1lbnRfdHlwZSAtPiBH ZXRSZWFkQWNjZXNzTWV0aG9kKG1ldGhvZCk7CiAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAt PiBBZGRBcmd1bWVudChhY2Nlc3NfZXhwcmVzc2lvbik7CiAgICAgICAgICAgICAgICBmb3IgKGlu dCBpID0gMDsgaSA8IG9sZF9tZXRob2RfY2FsbCAtPiBOdW1Bcmd1bWVudHMoKTsgaSsrKQogICAg ICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IEFkZEFyZ3VtZW50KG9sZF9tZXRob2RfY2Fs bCAtPiBBcmd1bWVudChpKSk7CgogICAgICAgICAgICAgICAgb2xkX21ldGhvZF9jYWxsIC0+IHN5 bWJvbCA9IG1ldGhvZDsKICAgICAgICAgICAgICAgIG9sZF9tZXRob2RfY2FsbCAtPiByZXNvbHV0 aW9uX29wdCA9IG1ldGhvZF9jYWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAg IHJldHVybjsKfQoKCnZvaWQgU2VtYW50aWM6OkNoZWNrU2ltcGxlTmFtZShBc3RTaW1wbGVOYW1l ICpzaW1wbGVfbmFtZSwgU2VtYW50aWNFbnZpcm9ubWVudCAqd2hlcmVfZm91bmQpCnsKICAgIFZh cmlhYmxlU3ltYm9sICp2YXJpYWJsZV9zeW1ib2wgPSBzaW1wbGVfbmFtZSAtPiBzeW1ib2wgLT4g VmFyaWFibGVDYXN0KCk7CgogICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCB2YXJpYWJsZV9zeW1i b2wgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInZhcmlhYmxlX3N5bWJvbCIgLCAiLi4vLi4vamlr ZXMvc3JjL2V4cHIuY3BwIiwgMTYxNSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAg ICBpZiAoU3RhdGljUmVnaW9uKCkpCiAgICB7CiAgICAgICAgaWYgKCEgKHZhcmlhYmxlX3N5bWJv bCAtPiBJc0xvY2FsKCkgfHwgdmFyaWFibGVfc3ltYm9sIC0+IEFDQ19TVEFUSUMoKSkpCiAgICAg ICAgewogICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpOQU1FX05PVF9D TEFTU19WQVJJQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX25hbWUgLT4g aWRlbnRpZmllcl90b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX25hbWUg LT4gaWRlbnRpZmllcl90b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV4X3N0cmVh bSAtPiBOYW1lU3RyaW5nKHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJfdG9rZW4pKTsKICAgICAg ICB9CiAgICAgICAgZWxzZSBpZiAoISB2YXJpYWJsZV9zeW1ib2wgLT4gSXNEZWNsYXJhdGlvbkNv bXBsZXRlKCkpCiAgICAgICAgewogICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vy cm9yOjpOQU1FX05PVF9ZRVRfQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBz aW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAg ICBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAg ICAgICBsZXhfc3RyZWFtIC0+IE5hbWVTdHJpbmcoc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90 b2tlbikpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKCEgdmFyaWFibGVfc3ltYm9sIC0+ IEFDQ19TVEFUSUMoKSkgIAogICAgewogICAgICAgIFR5cGVTeW1ib2wgKmNvbnRhaW5pbmdfdHlw ZSA9IHZhcmlhYmxlX3N5bWJvbCAtPiBvd25lciAtPiBUeXBlQ2FzdCgpOyAgCgogICAgICAgIGlm IChjb250YWluaW5nX3R5cGUpICAKICAgICAgICB7CiAgICAgICAgICAgIGlmIChjb250YWluaW5n X3R5cGUgPT0gVGhpc1R5cGUoKSAmJiAoISB2YXJpYWJsZV9zeW1ib2wgLT4gSXNEZWNsYXJhdGlv bkNvbXBsZXRlKCkpKSAgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVy cm9yKFNlbWFudGljRXJyb3I6Ok5BTUVfTk9UX1lFVF9BVkFJTEFCTEUsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90b2tlbiwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxleF9zdHJlYW0gLT4gTmFtZVN0cmluZyhz aW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuKSk7CiAgICAgICAgICAgIH0KICAgICAgICAg ICAgZWxzZSBpZiAoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oKSAmJiB3aGVyZV9mb3Vu ZCA9PSBzdGF0ZV9zdGFjay5Ub3AoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIAog ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJv cjo6SU5TVEFOQ0VfVkFSSUFCTEVfSU5fRVhQTElDSVRfQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJf dG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVfbmFtZSAtPiBpZGVu dGlmaWVyX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV4X3N0cmVhbSAt PiBOYW1lU3RyaW5nKHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJfdG9rZW4pLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlIC0+IE5hbWUoKSk7CiAgICAgICAg ICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6UHJv Y2Vzc1NpbXBsZU5hbWUoQXN0ICpleHByKQp7CiAgICBUeXBlU3ltYm9sICp0aGlzX3R5cGUgPSBU aGlzVHlwZSgpOwoKICAgIEFzdFNpbXBsZU5hbWUgKnNpbXBsZV9uYW1lID0gKEFzdFNpbXBsZU5h bWUgKikgZXhwcjsKICAgIFNlbWFudGljRW52aXJvbm1lbnQgKndoZXJlX2ZvdW5kOwogICAgVmFy aWFibGVTeW1ib2wgKnZhcmlhYmxlX3N5bWJvbCA9IEZpbmRWYXJpYWJsZUluRW52aXJvbm1lbnQo d2hlcmVfZm91bmQsIHN0YXRlX3N0YWNrLlRvcCgpLCBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVy X3Rva2VuKTsKICAgIGlmICh2YXJpYWJsZV9zeW1ib2wpCiAgICB7CiAgICAgICAgc2ltcGxlX25h bWUgLT4gc3ltYm9sID0gdmFyaWFibGVfc3ltYm9sOwoKICAgICAgICAoc3RhdGljX2Nhc3Q8dm9p ZD4gICgoIHZhcmlhYmxlX3N5bWJvbCAtPiBJc1R5cGVkKCkgKSA/IDAgOgkoX19hc3NlcnRfZmFp bCAoInZhcmlhYmxlX3N5bWJvbCAtPiBJc1R5cGVkKCkiICwgIi4uLy4uL2ppa2VzL3NyYy9leHBy LmNwcCIsIDE2NzgsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgICAgICAKICAg ICAgICAgCiAgICAgICAgIAogICAgICAgIGlmICh2YXJpYWJsZV9zeW1ib2wgLT4gQUNDX0ZJTkFM KCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAodmFyaWFibGVfc3ltYm9sIC0+IElzRGVjbGFy YXRpb25Db21wbGV0ZSgpKQogICAgICAgICAgICAgICAgc2ltcGxlX25hbWUgLT4gdmFsdWUgPSB2 YXJpYWJsZV9zeW1ib2wgLT4gaW5pdGlhbF92YWx1ZTsKICAgICAgICAgICAgZWxzZSBpZiAodmFy aWFibGVfc3ltYm9sIC0+IGRlY2xhcmF0b3IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg IEFzdFZhcmlhYmxlRGVjbGFyYXRvciAqZGVjbGFyYXRvciA9IHZhcmlhYmxlX3N5bWJvbCAtPiBk ZWNsYXJhdG9yIC0+IFZhcmlhYmxlRGVjbGFyYXRvckNhc3QoKTsKICAgICAgICAgICAgICAgICAK ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAg ICAgICAgICAgICAgIGlmIChkZWNsYXJhdG9yICYmCiAgICAgICAgICAgICAgICAgICAgKCEgZGVj bGFyYXRvciAtPiBwZW5kaW5nKSAmJgogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0b3IgLT4g dmFyaWFibGVfaW5pdGlhbGl6ZXJfb3B0ICYmCiAgICAgICAgICAgICAgICAgICAgKCEgZGVjbGFy YXRvciAtPiB2YXJpYWJsZV9pbml0aWFsaXplcl9vcHQgLT4gQXJyYXlJbml0aWFsaXplckNhc3Qo KSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVHlwZVN5bWJvbCAqdHlw ZSA9IChUeXBlU3ltYm9sICopIHZhcmlhYmxlX3N5bWJvbCAtPiBvd25lcjsKICAgICAgICAgICAg ICAgICAgICBTZW1hbnRpYyAqc2VtID0gdHlwZSAtPiBzZW1hbnRpY19lbnZpcm9ubWVudCAtPiBz ZW07CiAgICAgICAgICAgICAgICAgICAgc2ltcGxlX25hbWUgLT4gdmFsdWUgPSBzZW0gLT4gQ29t cHV0ZUZpbmFsVmFsdWUoZGVjbGFyYXRvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg IH0KICAgICAgICB9CgogICAgICAgIENoZWNrU2ltcGxlTmFtZShzaW1wbGVfbmFtZSwgd2hlcmVf Zm91bmQpOwoKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAg IAogICAgICAgIGlmICh3aGVyZV9mb3VuZCAhPSBzdGF0ZV9zdGFjay5Ub3AoKSkKICAgICAgICAg ICAgQ3JlYXRlQWNjZXNzVG9TY29wZWRWYXJpYWJsZShzaW1wbGVfbmFtZSwgd2hlcmVfZm91bmQg LT4gVHlwZSgpKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICAgCiAgICAgICAgTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wgPSBsZXhfc3Ry ZWFtIC0+IE5hbWVTeW1ib2woc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90b2tlbik7CgogICAg ICAgIE1ldGhvZFNoYWRvd1N5bWJvbCAqbWV0aG9kX3NoYWRvdzsKICAgICAgICBNZXRob2RTeW1i b2wgKm1ldGhvZDsKCiAgICAgICAgZm9yIChtZXRob2Rfc2hhZG93ID0gdGhpc190eXBlIC0+IGV4 cGFuZGVkX21ldGhvZF90YWJsZSAtPiBGaW5kTWV0aG9kU2hhZG93U3ltYm9sKG5hbWVfc3ltYm9s KTsKICAgICAgICAgICAgIG1ldGhvZF9zaGFkb3c7IG1ldGhvZF9zaGFkb3cgPSBtZXRob2Rfc2hh ZG93IC0+IG5leHRfbWV0aG9kKQogICAgICAgIHsKICAgICAgICAgICAgbWV0aG9kID0gbWV0aG9k X3NoYWRvdyAtPiBtZXRob2Rfc3ltYm9sOwoKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAg ICAgICAgICAgICAKICAgICAgICAgICAgaWYgKCEgbWV0aG9kIC0+IElzVHlwZWQoKSkKICAgICAg ICAgICAgICAgIG1ldGhvZCAtPiBQcm9jZXNzTWV0aG9kU2lnbmF0dXJlKChTZW1hbnRpYyAqKSB0 aGlzLCBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuKTsKCiAgICAgICAgICAgIGlmICht ZXRob2QgLT4gTnVtRm9ybWFsUGFyYW1ldGVycygpID09IDApCiAgICAgICAgICAgICAgICBicmVh azsKICAgICAgICB9CgogICAgICAgIGlmIChtZXRob2Rfc2hhZG93KQogICAgICAgIHsKICAgICAg ICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6Ok1FVEhPRF9OT1RfRklFTEQsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2Vu LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90 b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxleF9zdHJlYW0gLT4gTmFtZVN0cmlu ZyhzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgIG1ldGhvZCAtPiBjb250YWluaW5nX3R5cGUgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAt PiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kIC0+IGNv bnRhaW5pbmdfdHlwZSAtPiBFeHRlcm5hbE5hbWUoKSk7CiAgICAgICAgfQogICAgICAgIGVsc2Ug aWYgKEZpbmRUeXBlKHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJfdG9rZW4pKQogICAgICAgIHsK ICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlRZUEVfTk9UX0ZJRUxE LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90 b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZV9uYW1lIC0+IGlkZW50aWZp ZXJfdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXhfc3RyZWFtIC0+IE5hbWVT dHJpbmcoc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90b2tlbikpOwogICAgICAgIH0KICAgICAg ICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBWYXJpYWJsZVN5bWJvbCAqdmFyaWFibGUgPSBG aW5kTWlzc3BlbGxlZFZhcmlhYmxlTmFtZSh0aGlzX3R5cGUsIHNpbXBsZV9uYW1lIC0+IGlkZW50 aWZpZXJfdG9rZW4pOwogICAgICAgICAgICBpZiAodmFyaWFibGUpCiAgICAgICAgICAgICAgICAg UmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6RklFTERfTkFNRV9NSVNTUEVMTEVELAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJfdG9r ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX25hbWUgLT4gaWRlbnRp Zmllcl90b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3N5bWJvbCAt PiBOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc190eXBlIC0+IENv bnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB0aGlzX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgdmFyaWFibGUgLT4gTmFtZSgpKTsKICAgICAgICAgICAgZWxzZSBSZXBv cnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpOQU1FX05PVF9GT1VORCwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJfdG9rZW4s CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV4X3N0cmVhbSAtPiBOYW1lU3RyaW5n KHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJfdG9rZW4pKTsKICAgICAgICB9CiAgICAgICAgc2lt cGxlX25hbWUgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgfQoKICAgIHJldHVybjsK fQoKCnZvaWQgU2VtYW50aWM6OlR5cGVBY2Nlc3NDaGVjayhBc3QgKmFzdCwgVHlwZVN5bWJvbCAq dHlwZSkKewogICAgIAogICAgIAogICAgIAogICAgIAogICAgaWYgKHN0YXRlX3N0YWNrLlNpemUo KSA+IDApCiAgICB7CiAgICAgICAgVHlwZVN5bWJvbCAqdGhpc190eXBlID0gVGhpc1R5cGUoKTsK CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAg ICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgaWYgKHRoaXNfdHlwZSAt PiBvdXRlcm1vc3RfdHlwZSAhPSB0eXBlIC0+IG91dGVybW9zdF90eXBlKQogICAgICAgIHsKICAg ICAgICAgICAgaWYgKHR5cGUgLT4gQUNDX1BSSVZBVEUoKSkKICAgICAgICAgICAgICAgICBSZXBv cnRUeXBlSW5hY2Nlc3NpYmxlKGFzdCwgdHlwZSk7CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUg LT4gQUNDX1BST1RFQ1RFRCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgCiAgICAg ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgCiAgICAgICAg ICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoISAodHlwZSAtPiBDb250YWluaW5nUGFja2Fn ZSgpID09IHRoaXNfcGFja2FnZSB8fCB0aGlzX3R5cGUgLT4gSGFzUHJvdGVjdGVkQWNjZXNzVG8o dHlwZSkpKQogICAgICAgICAgICAgICAgICAgIFJlcG9ydFR5cGVJbmFjY2Vzc2libGUoYXN0LCB0 eXBlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghICh0eXBlIC0+IEFDQ19Q VUJMSUMoKSB8fCB0eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgPT0gdGhpc19wYWNrYWdlKSkK ICAgICAgICAgICAgICAgICBSZXBvcnRUeXBlSW5hY2Nlc3NpYmxlKGFzdCwgdHlwZSk7CiAgICAg ICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKCnZvaWQgU2VtYW50aWM6OlR5cGVOZXN0QWNjZXNz Q2hlY2soQXN0RXhwcmVzc2lvbiAqbmFtZSkKewogICAgQXN0U2ltcGxlTmFtZSAqc2ltcGxlX25h bWUgPSBuYW1lIC0+IFNpbXBsZU5hbWVDYXN0KCk7CiAgICBBc3RGaWVsZEFjY2VzcyAqZmllbGRf YWNjZXNzID0gbmFtZSAtPiBGaWVsZEFjY2Vzc0Nhc3QoKTsKCiAgICAoc3RhdGljX2Nhc3Q8dm9p ZD4gICgoIHNpbXBsZV9uYW1lIHx8IGZpZWxkX2FjY2VzcyApID8gMCA6CShfX2Fzc2VydF9mYWls ICgic2ltcGxlX25hbWUgfHwgZmllbGRfYWNjZXNzIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5j cHAiLCAxODI4LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgIGlmIChmaWVsZF9h Y2Nlc3MpCiAgICAgICAgVHlwZU5lc3RBY2Nlc3NDaGVjayhmaWVsZF9hY2Nlc3MgLT4gYmFzZSk7 CgogICAgVHlwZVN5bWJvbCAqdHlwZSA9IChzaW1wbGVfbmFtZSA/IHNpbXBsZV9uYW1lIC0+IFR5 cGUoKSA6IGZpZWxkX2FjY2VzcyAtPiBUeXBlKCkpOwogICAgaWYgKHR5cGUpCiAgICAgICAgVHlw ZUFjY2Vzc0NoZWNrKG5hbWUsIHR5cGUpOwoKICAgIHJldHVybjsKfQoKCnZvaWQgU2VtYW50aWM6 OkNvbnN0cnVjdG9yQWNjZXNzQ2hlY2soQXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lv biAqY2xhc3NfY3JlYXRpb24sIE1ldGhvZFN5bWJvbCAqY29uc3RydWN0b3IpCnsKICAgIFR5cGVT eW1ib2wgKnRoaXNfdHlwZSA9IFRoaXNUeXBlKCk7CiAgICBUeXBlU3ltYm9sICpjb250YWluaW5n X3R5cGUgPSBjb25zdHJ1Y3RvciAtPiBjb250YWluaW5nX3R5cGU7CgogICAgaWYgKHRoaXNfdHlw ZSAtPiBvdXRlcm1vc3RfdHlwZSAhPSBjb250YWluaW5nX3R5cGUgLT4gb3V0ZXJtb3N0X3R5cGUp CiAgICB7CiAgICAgICAgaWYgKGNvbnN0cnVjdG9yIC0+IEFDQ19QUklWQVRFKCkpCiAgICAgICAg ewogICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpQUklWQVRFX0NPTlNU UlVDVE9SX05PVF9BQ0NFU1NJQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc19j cmVhdGlvbiAtPiBjbGFzc190eXBlIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAg ICAgICAgICBjbGFzc19jcmVhdGlvbiAtPiByaWdodF9wYXJlbnRoZXNpc190b2tlbiwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgLT4gSGVhZGVyKCksCiAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZSAtPiBDb250YWluaW5nUGFja2FnZSgpIC0+ IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlw ZSAtPiBFeHRlcm5hbE5hbWUoKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCEgY2xhc3Nf Y3JlYXRpb24gLT4gc3ltYm9sIC0+IFR5cGVDYXN0KCkgLT4gQW5vbnltb3VzKCkpCiAgICAgICAg ewogICAgICAgICAgICBpZiAoY29uc3RydWN0b3IgLT4gQUNDX1BST1RFQ1RFRCgpKQogICAgICAg ICAgICB7CiAgICAgICAgICAgICAgICBpZihjb250YWluaW5nX3R5cGUtPkNvbnRhaW5pbmdQYWNr YWdlKCkgIT0gdGhpc19wYWNrYWdlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg ICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlBST1RFQ1RFRF9DT05TVFJVQ1RPUl9O T1RfQUNDRVNTSUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc19j cmVhdGlvbiAtPiBjbGFzc190eXBlIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNsYXNzX2NyZWF0aW9uIC0+IHJpZ2h0X3BhcmVudGhlc2lzX3Rva2Vu LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yIC0+IEhlYWRl cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZSAt PiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlIC0+IEV4dGVybmFsTmFtZSgpKTsKICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghIChjb25z dHJ1Y3RvciAtPiBBQ0NfUFVCTElDKCkgfHwgY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdQ YWNrYWdlKCkgPT0gdGhpc19wYWNrYWdlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAg UmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6REVGQVVMVF9DT05TVFJVQ1RPUl9OT1RfQUND RVNTSUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX2NyZWF0aW9uIC0+ IGNsYXNzX3R5cGUgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjbGFzc19jcmVhdGlvbiAtPiByaWdodF9wYXJlbnRoZXNpc190b2tlbiwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yIC0+IEhlYWRlcigpLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkg LT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5p bmdfdHlwZSAtPiBFeHRlcm5hbE5hbWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9 CgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6TWVtYmVyQWNjZXNzQ2hlY2soQXN0Rmll bGRBY2Nlc3MgKmZpZWxkX2FjY2VzcywgVHlwZVN5bWJvbCAqYmFzZV90eXBlLCBTeW1ib2wgKnN5 bWJvbCkKewogICAgVHlwZVN5bWJvbCAqdGhpc190eXBlID0gVGhpc1R5cGUoKTsKCiAgICBWYXJp YWJsZVN5bWJvbCAqdmFyaWFibGVfc3ltYm9sID0gc3ltYm9sIC0+IFZhcmlhYmxlQ2FzdCgpOwog ICAgTWV0aG9kU3ltYm9sICptZXRob2Rfc3ltYm9sID0gc3ltYm9sIC0+IE1ldGhvZENhc3QoKTsK CiAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIHZhcmlhYmxlX3N5bWJvbCB8fCBtZXRob2Rfc3lt Ym9sICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJ2YXJpYWJsZV9zeW1ib2wgfHwgbWV0aG9kX3N5 bWJvbCIgLCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMTg5NCwgX19QUkVUVFlfRlVOQ1RJ T05fXyApLCAwKSkpIDsKCiAgICBBY2Nlc3NGbGFncyAqZmxhZ3MgPSAodmFyaWFibGVfc3ltYm9s ID8gKEFjY2Vzc0ZsYWdzICopIHZhcmlhYmxlX3N5bWJvbCA6IChBY2Nlc3NGbGFncyAqKSBtZXRo b2Rfc3ltYm9sKTsKICAgIFR5cGVTeW1ib2wgKmNvbnRhaW5pbmdfdHlwZSA9ICh2YXJpYWJsZV9z eW1ib2wgPyB2YXJpYWJsZV9zeW1ib2wgLT4gb3duZXIgLT4gVHlwZUNhc3QoKSA6IG1ldGhvZF9z eW1ib2wgLT4gY29udGFpbmluZ190eXBlKTsKCiAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIGNv bnRhaW5pbmdfdHlwZSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiY29udGFpbmluZ190eXBlIiAs ICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAxODk5LCBfX1BSRVRUWV9GVU5DVElPTl9fICks IDApKSkgOwoKICAgIEFzdEV4cHJlc3Npb24gKmJhc2UgPSBmaWVsZF9hY2Nlc3MgLT4gYmFzZTsK CiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAg ICAgCiAgICAgCgogICAgaWYgKHRoaXNfdHlwZSAtPiBvdXRlcm1vc3RfdHlwZSAhPSBjb250YWlu aW5nX3R5cGUgLT4gb3V0ZXJtb3N0X3R5cGUpCiAgICB7CiAgICAgICAgaWYgKGZsYWdzIC0+IEFD Q19QUklWQVRFKCkpCiAgICAgICAgewogICAgICAgICAgICBSZXBvcnRTZW1FcnJvcigodmFyaWFi bGVfc3ltYm9sID8gU2VtYW50aWNFcnJvcjo6UFJJVkFURV9GSUVMRF9OT1RfQUNDRVNTSUJMRQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2VtYW50aWNFcnJv cjo6UFJJVkFURV9NRVRIT0RfTk9UX0FDQ0VTU0lCTEUpLAogICAgICAgICAgICAgICAgICAgICAg ICAgICBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbiwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW4sCiAgICAgICAgICAgICAg ICAgICAgICAgICAgIGxleF9zdHJlYW0gLT4gTmFtZVN0cmluZyhmaWVsZF9hY2Nlc3MgLT4gaWRl bnRpZmllcl90b2tlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlw ZSAtPiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZSAtPiBFeHRlcm5hbE5hbWUoKSk7CiAgICAgICAg fQogICAgICAgIGVsc2UgaWYgKGZsYWdzIC0+IEFDQ19QUk9URUNURUQoKSkKICAgICAgICB7CiAg ICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAg ICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChmbGFncyAtPiBBQ0NfU1RB VElDKCkgJiYKICAgICAgICAgICAgICAgIHRoaXNfcGFja2FnZSAhPSBjb250YWluaW5nX3R5cGUg LT4gQ29udGFpbmluZ1BhY2thZ2UoKSAmJgogICAgICAgICAgICAgICAgdGhpc190eXBlIC0+IElz U3ViY2xhc3MoY29udGFpbmluZ190eXBlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAg IAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgQXN0 RXhwcmVzc2lvbiAqZXhwciA9IGJhc2U7CiAgICAgICAgICAgICAgICB3aGlsZShleHByIC0+IFBh cmVudGhlc2l6ZWRFeHByZXNzaW9uQ2FzdCgpKQogICAgICAgICAgICAgICAgICAgIGV4cHIgPSBl eHByIC0+IFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQ2FzdCgpIC0+IGV4cHJlc3Npb247CgogICAg ICAgICAgICAgICAgaWYgKCEgKGV4cHIgLT4gVGhpc0V4cHJlc3Npb25DYXN0KCkgfHwgZXhwciAt PiBTdXBlckV4cHJlc3Npb25DYXN0KCkpKQogICAgICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVy cm9yKCh2YXJpYWJsZV9zeW1ib2wgPyBTZW1hbnRpY0Vycm9yOjpTVEFUSUNfUFJPVEVDVEVEX0ZJ RUxEX0FDQ0VTUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgOiBTZW1hbnRpY0Vycm9yOjpTVEFUSUNfUFJPVEVDVEVEX01FVEhPRF9BQ0NFU1MpLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBMZWZ0VG9r ZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4g UmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxleF9zdHJl YW0gLT4gTmFtZVN0cmluZyhmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbiksCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5p bmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb250YWluaW5nX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgICAgICAgICB9 IGVsc2UKCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAg ICAgICAKICAgICAgICAgICAgaWYgKCEgKGJhc2UgLT4gSXNTdXBlckV4cHJlc3Npb24oKSB8fAog ICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkg PT0gdGhpc19wYWNrYWdlIHx8CiAgICAgICAgICAgICAgICAgICAodGhpc190eXBlIC0+IEhhc1By b3RlY3RlZEFjY2Vzc1RvKGNvbnRhaW5pbmdfdHlwZSkgJiYKICAgICAgICAgICAgICAgICAgICAo YmFzZV90eXBlIC0+IElzU3ViY2xhc3ModGhpc190eXBlKSB8fCBiYXNlX3R5cGUgLT4gSXNPd25l cih0aGlzX3R5cGUpKSkpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSZXBvcnRTZW1F cnJvcigodmFyaWFibGVfc3ltYm9sID8gU2VtYW50aWNFcnJvcjo6UFJPVEVDVEVEX0ZJRUxEX05P VF9BQ0NFU1NJQkxFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDogU2VtYW50aWNFcnJvcjo6UFJPVEVDVEVEX01FVEhPRF9OT1RfQUNDRVNTSUJMRSksCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90 b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBpZGVu dGlmaWVyX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV4X3N0cmVhbSAt PiBOYW1lU3RyaW5nKGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZSAtPiBDb250YWluaW5nUGFja2Fn ZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250 YWluaW5nX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQog ICAgICAgIGVsc2UgaWYgKCEgKGZsYWdzIC0+IEFDQ19QVUJMSUMoKSB8fCBjb250YWluaW5nX3R5 cGUgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSA9PSB0aGlzX3BhY2thZ2UpKQogICAgICAgIHsKICAg ICAgICAgICAgUmVwb3J0U2VtRXJyb3IoKHZhcmlhYmxlX3N5bWJvbCA/IFNlbWFudGljRXJyb3I6 OkRFRkFVTFRfRklFTERfTk9UX0FDQ0VTU0lCTEUKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA6IFNlbWFudGljRXJyb3I6OkRFRkFVTFRfTUVUSE9EX05PVF9BQ0NF U1NJQkxFKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYWNjZXNzIC0+IGlkZW50 aWZpZXJfdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBp ZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXhfc3RyZWFtIC0+ IE5hbWVTdHJpbmcoZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW4pLAogICAgICAgICAg ICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAt PiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5 cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCgp2 b2lkIFNlbWFudGljOjpTaW1wbGVOYW1lQWNjZXNzQ2hlY2soQXN0U2ltcGxlTmFtZSAqc2ltcGxl X25hbWUsIFR5cGVTeW1ib2wgKmNvbnRhaW5pbmdfdHlwZSwgU3ltYm9sICpzeW1ib2wpCnsKICAg IFR5cGVTeW1ib2wgKnRoaXNfdHlwZSA9IFRoaXNUeXBlKCk7CgogICAgVmFyaWFibGVTeW1ib2wg KnZhcmlhYmxlX3N5bWJvbCA9IHN5bWJvbCAtPiBWYXJpYWJsZUNhc3QoKTsKICAgIE1ldGhvZFN5 bWJvbCAqbWV0aG9kX3N5bWJvbCA9IHN5bWJvbCAtPiBNZXRob2RDYXN0KCk7CgogICAgKHN0YXRp Y19jYXN0PHZvaWQ+ICAoKCB2YXJpYWJsZV9zeW1ib2wgfHwgbWV0aG9kX3N5bWJvbCApID8gMCA6 CShfX2Fzc2VydF9mYWlsICgidmFyaWFibGVfc3ltYm9sIHx8IG1ldGhvZF9zeW1ib2wiICwgIi4u Ly4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDE5OTcsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkp KSA7CgogICAgQWNjZXNzRmxhZ3MgKmZsYWdzID0gKHZhcmlhYmxlX3N5bWJvbCA/IChBY2Nlc3NG bGFncyAqKSB2YXJpYWJsZV9zeW1ib2wgOiAoQWNjZXNzRmxhZ3MgKikgbWV0aG9kX3N5bWJvbCk7 CgogICAgaWYgKCEgKGNvbnRhaW5pbmdfdHlwZSAtPiBBQ0NfUFVCTElDKCkgfHwgdGhpc190eXBl IC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgPT0gY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdQ YWNrYWdlKCkpKQogICAgICAgIFJlcG9ydFR5cGVJbmFjY2Vzc2libGUoc2ltcGxlX25hbWUsIGNv bnRhaW5pbmdfdHlwZSk7CgogICAgaWYgKHRoaXNfdHlwZSAtPiBvdXRlcm1vc3RfdHlwZSAhPSBj b250YWluaW5nX3R5cGUgLT4gb3V0ZXJtb3N0X3R5cGUpCiAgICB7CiAgICAgICAgaWYgKGZsYWdz IC0+IEFDQ19QUklWQVRFKCkpCiAgICAgICAgewogICAgICAgICAgICBSZXBvcnRTZW1FcnJvcigo dmFyaWFibGVfc3ltYm9sID8gU2VtYW50aWNFcnJvcjo6UFJJVkFURV9GSUVMRF9OT1RfQUNDRVNT SUJMRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2VtYW50 aWNFcnJvcjo6UFJJVkFURV9NRVRIT0RfTk9UX0FDQ0VTU0lCTEUpLAogICAgICAgICAgICAgICAg ICAgICAgICAgICBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAgICAg ICAgICAgICAgICAgICBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAg ICAgICAgICAgICAgICAgICBsZXhfc3RyZWFtIC0+IE5hbWVTdHJpbmcoc2ltcGxlX25hbWUgLT4g aWRlbnRpZmllcl90b2tlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdf dHlwZSAtPiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZSAtPiBFeHRlcm5hbE5hbWUoKSk7CiAgICAg ICAgfQogICAgICAgIGVsc2UgaWYgKGZsYWdzIC0+IEFDQ19QUk9URUNURUQoKSkKICAgICAgICB7 CiAgICAgICAgICAgIGlmICghIChjb250YWluaW5nX3R5cGUgLT4gQ29udGFpbmluZ1BhY2thZ2Uo KSA9PSB0aGlzX3BhY2thZ2UgfHwgdGhpc190eXBlIC0+IElzU3ViY2xhc3MoY29udGFpbmluZ190 eXBlKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKCh2YXJp YWJsZV9zeW1ib2wgPyBTZW1hbnRpY0Vycm9yOjpQUk9URUNURURfRklFTERfTk9UX0FDQ0VTU0lC TEUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTZW1h bnRpY0Vycm9yOjpQUk9URUNURURfTUVUSE9EX05PVF9BQ0NFU1NJQkxFKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJfdG9rZW4sCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2Vu LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV4X3N0cmVhbSAtPiBOYW1lU3RyaW5n KHNpbXBsZV9uYW1lIC0+IGlkZW50aWZpZXJfdG9rZW4pLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2Fn ZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZSAt PiBFeHRlcm5hbE5hbWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBp ZiAoISAoZmxhZ3MgLT4gQUNDX1BVQkxJQygpIHx8IGNvbnRhaW5pbmdfdHlwZSAtPiBDb250YWlu aW5nUGFja2FnZSgpID09IHRoaXNfcGFja2FnZSkpCiAgICAgICAgewogICAgICAgICAgICBSZXBv cnRTZW1FcnJvcigodmFyaWFibGVfc3ltYm9sID8gU2VtYW50aWNFcnJvcjo6REVGQVVMVF9GSUVM RF9OT1RfQUNDRVNTSUJMRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDogU2VtYW50aWNFcnJvcjo6REVGQVVMVF9NRVRIT0RfTk9UX0FDQ0VTU0lCTEUpLAogICAg ICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuLAog ICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2Vu LAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXhfc3RyZWFtIC0+IE5hbWVTdHJpbmcoc2lt cGxlX25hbWUgLT4gaWRlbnRpZmllcl90b2tlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAg IGNvbnRhaW5pbmdfdHlwZSAtPiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCks CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZSAtPiBFeHRlcm5hbE5h bWUoKSk7CiAgICAgICAgfQogICAgfQoKCgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6 RmluZFZhcmlhYmxlTWVtYmVyKFR5cGVTeW1ib2wgKnR5cGUsIFR5cGVTeW1ib2wgKmVudmlyb25t ZW50X3R5cGUsIEFzdEZpZWxkQWNjZXNzICpmaWVsZF9hY2Nlc3MpCnsKICAgIFR5cGVTeW1ib2wg KnRoaXNfdHlwZSA9IFRoaXNUeXBlKCk7CgogICAgIAogICAgIAogICAgIAogICAgIAogICAgYm9v bCBiYXNlX2lzX3R5cGUgPSBmaWVsZF9hY2Nlc3MgLT4gYmFzZSAtPiBzeW1ib2wgLT4gVHlwZUNh c3QoKSAhPSBfX251bGwgICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAt PiBiYXNlIC0+IElzTmFtZSgpOwoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIFN5 bWJvbFNldCAqZXhjZXB0aW9uX3NldCA9IFRyeUV4Y2VwdGlvblRhYmxlU3RhY2soKS5Ub3AoKTsK ICAgIGlmIChleGNlcHRpb25fc2V0ICYmICEgZmllbGRfYWNjZXNzIC0+IGJhc2UgLT4gc3ltYm9s IC0+IFR5cGVDYXN0KCkpCiAgICAgICAgZXhjZXB0aW9uX3NldCAtPiBBZGRFbGVtZW50KGNvbnRy b2wuUnVudGltZUV4Y2VwdGlvbigpKTsKCiAgICBpZiAodHlwZSAtPiBCYWQoKSkKICAgIHsKICAg ICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAK ICAgICAgICBpZiAoTnVtRXJyb3JzKCkgPT0gMCkKICAgICAgICAgICAgUmVwb3J0QWNjZXNzZWRG aWVsZE5vdEZvdW5kKGZpZWxkX2FjY2VzcywgdHlwZSk7CiAgICAgICAgZmllbGRfYWNjZXNzIC0+ IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgIH0KICAgIGVsc2UgaWYgKHR5cGUgPT0gY29u dHJvbC5udWxsX3R5cGUgfHwgdHlwZSAtPiBQcmltaXRpdmUoKSkKICAgIHsKICAgICAgICBSZXBv cnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpUWVBFX05PVF9SRUZFUkVOQ0UsCiAgICAgICAgICAg ICAgICAgICAgICAgZmllbGRfYWNjZXNzIC0+IGJhc2UgLT4gTGVmdFRva2VuKCksCiAgICAgICAg ICAgICAgICAgICAgICAgZmllbGRfYWNjZXNzIC0+IGJhc2UgLT4gUmlnaHRUb2tlbigpLAogICAg ICAgICAgICAgICAgICAgICAgIHR5cGUgLT4gTmFtZSgpKTsKICAgICAgICBmaWVsZF9hY2Nlc3Mg LT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgfQogICAgZWxzZQogICAgewogICAgICAg IFR5cGVBY2Nlc3NDaGVjayhmaWVsZF9hY2Nlc3MgLT4gYmFzZSwgdHlwZSk7CgogICAgICAgIFZh cmlhYmxlU3ltYm9sICp2YXJpYWJsZV9zeW1ib2wgPSBGaW5kVmFyaWFibGVJblR5cGUodHlwZSwg ZmllbGRfYWNjZXNzKTsKICAgICAgICBpZiAodmFyaWFibGVfc3ltYm9sKQogICAgICAgIHsKICAg ICAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCB2YXJpYWJsZV9zeW1ib2wgLT4gSXNUeXBl ZCgpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJ2YXJpYWJsZV9zeW1ib2wgLT4gSXNUeXBlZCgp IiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAyMDk0LCBfX1BSRVRUWV9GVU5DVElPTl9f ICksIDApKSkgOwoKICAgICAgICAgICAgaWYgKGJhc2VfaXNfdHlwZSkKICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgaWYgKCEgdmFyaWFibGVfc3ltYm9sIC0+IEFDQ19TVEFUSUMoKSkKICAg ICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRp Y0Vycm9yOjpOQU1FX05PVF9DTEFTU19WQVJJQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbiwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbiwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXhfc3RyZWFtIC0+IE5hbWVTdHJp bmcoZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW4pKTsKICAgICAgICAgICAgICAgICAg ICBmaWVsZF9hY2Nlc3MgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgICAgICAgICAg ICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAKICAgICAg ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZV9zeW1ib2wgLT4gQUNDX0ZJTkFM KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgIAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBp ZiAodmFyaWFibGVfc3ltYm9sIC0+IElzRGVjbGFyYXRpb25Db21wbGV0ZSgpKQogICAgICAgICAg ICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gdmFsdWUgPSB2YXJpYWJsZV9zeW1ib2wgLT4g aW5pdGlhbF92YWx1ZTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YXJpYWJsZV9zeW1i b2wgLT4gZGVjbGFyYXRvcikKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg ICAgICAgIEFzdFZhcmlhYmxlRGVjbGFyYXRvciAqZGVjbGFyYXRvciA9IHZhcmlhYmxlX3N5bWJv bCAtPiBkZWNsYXJhdG9yIC0+IFZhcmlhYmxlRGVjbGFyYXRvckNhc3QoKTsKICAgICAgICAgICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg ICBpZiAoZGVjbGFyYXRvciAmJiAoISBkZWNsYXJhdG9yIC0+IHBlbmRpbmcpICYmCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdG9yIC0+IHZhcmlhYmxlX2luaXRpYWxpemVyX29w dCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEgZGVjbGFyYXRvciAtPiB2YXJpYWJs ZV9pbml0aWFsaXplcl9vcHQgLT4gQXJyYXlJbml0aWFsaXplckNhc3QoKSkpCiAgICAgICAgICAg ICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVTeW1ib2wgKnZh cmlhYmxlX3R5cGUgPSAoVHlwZVN5bWJvbCAqKSB2YXJpYWJsZV9zeW1ib2wgLT4gb3duZXI7CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hbnRpYyAqc2VtID0gdmFyaWFibGVfdHlwZSAt PiBzZW1hbnRpY19lbnZpcm9ubWVudCAtPiBzZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBmaWVsZF9hY2Nlc3MgLT4gdmFsdWUgPSBzZW0gLT4gQ29tcHV0ZUZpbmFsVmFsdWUoZGVjbGFy YXRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFR5cGVTeW1ib2wgKmNv bnRhaW5pbmdfdHlwZSA9IChUeXBlU3ltYm9sICopIHZhcmlhYmxlX3N5bWJvbCAtPiBvd25lcjsK ICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgaWYg KHRoaXNfdHlwZSAhPSBjb250YWluaW5nX3R5cGUgJiYKICAgICAgICAgICAgICAgIHRoaXNfdHlw ZSAtPiBvdXRlcm1vc3RfdHlwZSA9PSBlbnZpcm9ubWVudF90eXBlIC0+IG91dGVybW9zdF90eXBl ICYmCiAgICAgICAgICAgICAgICAodmFyaWFibGVfc3ltYm9sIC0+IEFDQ19QUklWQVRFKCkgfHwK ICAgICAgICAgICAgICAgICAodmFyaWFibGVfc3ltYm9sIC0+IEFDQ19QUk9URUNURUQoKSAmJgog ICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAh PSBlbnZpcm9ubWVudF90eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkpKSkKICAgICAgICAgICAg ewogICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCAoISB2YXJpYWJsZV9zeW1i b2wgLT4gQUNDX1BSSVZBVEUoKSkgfHwgY29udGFpbmluZ190eXBlID09IGVudmlyb25tZW50X3R5 cGUgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoIighIHZhcmlhYmxlX3N5bWJvbCAtPiBBQ0NfUFJJ VkFURSgpKSB8fCBjb250YWluaW5nX3R5cGUgPT0gZW52aXJvbm1lbnRfdHlwZSIgLCAiLi4vLi4v amlrZXMvc3JjL2V4cHIuY3BwIiwgMjE1NiwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsK CiAgICAgICAgICAgICAgICBpZiAoZmllbGRfYWNjZXNzIC0+IElzQ29uc3RhbnQoKSkKICAgICAg ICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gc3ltYm9sID0gdmFyaWFibGVfc3ltYm9sOwog ICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAg IEFzdEZpZWxkQWNjZXNzICptZXRob2RfbmFtZSA9IGNvbXBpbGF0aW9uX3VuaXQgLT4gYXN0X3Bv b2wgLT4gR2VuRmllbGRBY2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICBtZXRob2RfbmFtZSAt PiBiYXNlID0gZmllbGRfYWNjZXNzIC0+IGJhc2U7ICAKICAgICAgICAgICAgICAgICAgICBtZXRo b2RfbmFtZSAtPiBkb3RfdG9rZW4gPSBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbjsK ICAgICAgICAgICAgICAgICAgICBtZXRob2RfbmFtZSAtPiBpZGVudGlmaWVyX3Rva2VuID0gZmll bGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW47CiAgICAgICAgICAgICAgICAgICAgbWV0aG9k X25hbWUgLT4gc3ltYm9sID0gdmFyaWFibGVfc3ltYm9sOwoKICAgICAgICAgICAgICAgICAgICBB c3RNZXRob2RJbnZvY2F0aW9uICpwICAgICAgID0gY29tcGlsYXRpb25fdW5pdCAtPiBhc3RfcG9v bCAtPiBHZW5NZXRob2RJbnZvY2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgcCAtPiBtZXRo b2QgICAgICAgICAgICAgICAgICA9IG1ldGhvZF9uYW1lOwogICAgICAgICAgICAgICAgICAgIHAg LT4gbGVmdF9wYXJlbnRoZXNpc190b2tlbiAgPSBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90 b2tlbjsKICAgICAgICAgICAgICAgICAgICBwIC0+IHJpZ2h0X3BhcmVudGhlc2lzX3Rva2VuID0g ZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW47CiAgICAgICAgICAgICAgICAgICAgcCAt PiBzeW1ib2wgICAgICAgICAgICAgICAgICA9IGVudmlyb25tZW50X3R5cGUgLT4gR2V0UmVhZEFj Y2Vzc01ldGhvZCh2YXJpYWJsZV9zeW1ib2wpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoISB2 YXJpYWJsZV9zeW1ib2wgLT4gQUNDX1NUQVRJQygpKQogICAgICAgICAgICAgICAgICAgICAgICBw IC0+IEFkZEFyZ3VtZW50KGZpZWxkX2FjY2VzcyAtPiBiYXNlKTsKCiAgICAgICAgICAgICAgICAg ICAgZmllbGRfYWNjZXNzIC0+IHJlc29sdXRpb25fb3B0ID0gcDsKICAgICAgICAgICAgICAgICAg ICBmaWVsZF9hY2Nlc3MgLT4gc3ltYm9sID0gcCAtPiBzeW1ib2w7CiAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAg ICAgICBmaWVsZF9hY2Nlc3MgLT4gc3ltYm9sID0gdmFyaWFibGVfc3ltYm9sOwogICAgICAgICAg ICAgICAgTWVtYmVyQWNjZXNzQ2hlY2soZmllbGRfYWNjZXNzLCB0eXBlLCB2YXJpYWJsZV9zeW1i b2wpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAg ICAgICAgIFR5cGVTeW1ib2wgKmlubmVyX3R5cGUgPSBGaW5kTmVzdGVkVHlwZSh0eXBlLCBmaWVs ZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbik7CiAgICAgICAgICAgIGlmIChpbm5lcl90eXBl KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoYmFzZV9pc190eXBlKQogICAgICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBzeW1ib2wgPSBp bm5lcl90eXBlOwogICAgICAgICAgICAgICAgICAgIFR5cGVBY2Nlc3NDaGVjayhmaWVsZF9hY2Nl c3MsIGlubmVyX3R5cGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQog ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFu dGljRXJyb3I6OlRZUEVfTk9UX0ZJRUxELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxleF9zdHJlYW0gLT4gTmFtZVN0cmluZyhmaWVs ZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbikpOwogICAgICAgICAgICAgICAgICAgIGZpZWxk X2FjY2VzcyAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICBSZXBvcnRBY2Nlc3NlZEZpZWxkTm90Rm91bmQoZmllbGRfYWNjZXNzLCB0eXBlKTsKICAgICAg ICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICAg ICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9CgogCiAKIAogCnZvaWQgU2Vt YW50aWM6OlByb2Nlc3NBbWJpZ3VvdXNOYW1lKEFzdCAqbmFtZSkKewogICAgVHlwZVN5bWJvbCAq dGhpc190eXBlID0gVGhpc1R5cGUoKTsKCiAgICBBc3RTaW1wbGVOYW1lICpzaW1wbGVfbmFtZTsK CiAgICAgCiAgICAgCiAgICAgCiAgICBpZiAoKHNpbXBsZV9uYW1lID0gbmFtZSAtPiBTaW1wbGVO YW1lQ2FzdCgpKSkKICAgIHsKICAgICAgICBUeXBlU3ltYm9sICp0eXBlOwogICAgICAgICAKICAg ICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAK ICAgICAgICAgCiAgICAgICAgIAogICAgICAgIFNlbWFudGljRW52aXJvbm1lbnQgKndoZXJlX2Zv dW5kOwogICAgICAgIFZhcmlhYmxlU3ltYm9sICp2YXJpYWJsZV9zeW1ib2wgPSBGaW5kVmFyaWFi bGVJbkVudmlyb25tZW50KHdoZXJlX2ZvdW5kLCBzdGF0ZV9zdGFjay5Ub3AoKSwgc2ltcGxlX25h bWUgLT4gaWRlbnRpZmllcl90b2tlbik7CiAgICAgICAgaWYgKHZhcmlhYmxlX3N5bWJvbCkKICAg ICAgICB7CiAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggdmFyaWFibGVfc3ltYm9s IC0+IElzVHlwZWQoKSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgidmFyaWFibGVfc3ltYm9sIC0+ IElzVHlwZWQoKSIgLCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMjI0NiwgX19QUkVUVFlf RlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAg ICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgc2ltcGxlX25hbWUgLT4gdmFsdWUgPSB2 YXJpYWJsZV9zeW1ib2wgLT4gaW5pdGlhbF92YWx1ZTsKICAgICAgICAgICAgc2ltcGxlX25hbWUg LT4gc3ltYm9sID0gdmFyaWFibGVfc3ltYm9sOwoKICAgICAgICAgICAgQ2hlY2tTaW1wbGVOYW1l KHNpbXBsZV9uYW1lLCB3aGVyZV9mb3VuZCk7CgogICAgICAgICAgICAgCiAgICAgICAgICAgICAK ICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgaWYg KHdoZXJlX2ZvdW5kICE9IHN0YXRlX3N0YWNrLlRvcCgpKQogICAgICAgICAgICAgICAgQ3JlYXRl QWNjZXNzVG9TY29wZWRWYXJpYWJsZShzaW1wbGVfbmFtZSwgd2hlcmVfZm91bmQgLT4gVHlwZSgp KTsKICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAog ICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAg IAogICAgICAgIGVsc2UgaWYgKCh0eXBlID0gRmluZFR5cGUoc2ltcGxlX25hbWUgLT4gaWRlbnRp Zmllcl90b2tlbikpKQogICAgICAgICAgICAgc2ltcGxlX25hbWUgLT4gc3ltYm9sID0gdHlwZTsK ICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgZWxzZQogICAg ICAgIHsKICAgICAgICAgICAgTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wgPSBsZXhfc3RyZWFtIC0+ IE5hbWVTeW1ib2woc2ltcGxlX25hbWUgLT4gaWRlbnRpZmllcl90b2tlbik7CiAgICAgICAgICAg IFBhY2thZ2VTeW1ib2wgKnBhY2thZ2UgPSBjb250cm9sLmV4dGVybmFsX3RhYmxlLkZpbmRQYWNr YWdlU3ltYm9sKG5hbWVfc3ltYm9sKTsKICAgICAgICAgICAgaWYgKHBhY2thZ2UpCiAgICAgICAg ICAgICAgICBzaW1wbGVfbmFtZSAtPiBzeW1ib2wgPSBwYWNrYWdlOwogICAgICAgICAgICBlbHNl CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHBhY2thZ2UgPSBjb250cm9sLmV4dGVybmFs X3RhYmxlLkluc2VydFBhY2thZ2VTeW1ib2wobmFtZV9zeW1ib2wsIF9fbnVsbCApOwogICAgICAg ICAgICAgICAgY29udHJvbC5GaW5kUGF0aHNUb0RpcmVjdG9yeShwYWNrYWdlKTsKICAgICAgICAg ICAgICAgIHNpbXBsZV9uYW1lIC0+IHN5bWJvbCA9IHBhY2thZ2U7CiAgICAgICAgICAgIH0KICAg ICAgICB9CiAgICB9CiAgICAgCiAgICAgCiAgICAgCiAgICBlbHNlCiAgICB7CiAgICAgICAgQXN0 RmllbGRBY2Nlc3MgKmZpZWxkX2FjY2VzcyA9IChBc3RGaWVsZEFjY2VzcyAqKSBuYW1lOwoKICAg ICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIG5hbWUgLT4gRmllbGRBY2Nlc3NDYXN0KCkgKSA/ IDAgOgkoX19hc3NlcnRfZmFpbCAoIm5hbWUgLT4gRmllbGRBY2Nlc3NDYXN0KCkiICwgIi4uLy4u L2ppa2VzL3NyYy9leHByLmNwcCIsIDIzMDgsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7 CgogICAgICAgIFR5cGVTeW1ib2wgKnR5cGUgPSBfX251bGwgOwoKICAgICAgICBpZiAoZmllbGRf YWNjZXNzIC0+IElzQ2xhc3NBY2Nlc3MoKSkKICAgICAgICB7CiAgICAgICAgICAgIEFkZERlcGVu ZGVuY2UodGhpc190eXBlLCBjb250cm9sLk5vQ2xhc3NEZWZGb3VuZEVycm9yKCksIGZpZWxkX2Fj Y2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuKTsKICAgICAgICAgICAgQWRkRGVwZW5kZW5jZSh0aGlz X3R5cGUsIGNvbnRyb2wuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpLCBmaWVsZF9hY2Nlc3MgLT4g aWRlbnRpZmllcl90b2tlbik7CgogICAgICAgICAgICBBc3RUeXBlRXhwcmVzc2lvbiAqYmFzZSA9 IChBc3RUeXBlRXhwcmVzc2lvbiAqKSBmaWVsZF9hY2Nlc3MgLT4gYmFzZTsKCiAgICAgICAgICAg IEFzdEFycmF5VHlwZSAqYXJyYXlfdHlwZSA9IGJhc2UgLT4gdHlwZSAtPiBBcnJheVR5cGVDYXN0 KCk7CiAgICAgICAgICAgIGlmIChhcnJheV90eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAg ICAgICBBc3RQcmltaXRpdmVUeXBlICpwcmltaXRpdmVfdHlwZSA9IGFycmF5X3R5cGUgLT4gdHlw ZSAtPiBQcmltaXRpdmVUeXBlQ2FzdCgpOwogICAgICAgICAgICAgICAgVHlwZVN5bWJvbCAqdW5p dCA9IChwcmltaXRpdmVfdHlwZSA/IEZpbmRQcmltaXRpdmVUeXBlKHByaW1pdGl2ZV90eXBlKSA6 IE11c3RGaW5kVHlwZShhcnJheV90eXBlIC0+IHR5cGUpKTsKICAgICAgICAgICAgICAgIHR5cGUg PSB1bml0IC0+IEdldEFycmF5VHlwZSgoU2VtYW50aWMgKikgdGhpcywgYXJyYXlfdHlwZSAtPiBO dW1CcmFja2V0cygpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAg IHsKICAgICAgICAgICAgICAgIEFzdFByaW1pdGl2ZVR5cGUgKnByaW1pdGl2ZV90eXBlID0gYmFz ZSAtPiB0eXBlIC0+IFByaW1pdGl2ZVR5cGVDYXN0KCk7CiAgICAgICAgICAgICAgICB0eXBlID0g KHByaW1pdGl2ZV90eXBlID8gRmluZFByaW1pdGl2ZVR5cGUocHJpbWl0aXZlX3R5cGUpIDogTXVz dEZpbmRUeXBlKGJhc2UgLT4gdHlwZSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBUeXBl U3ltYm9sICpvdXRlcm1vc3RfdHlwZSA9IHRoaXNfdHlwZSAtPiBvdXRlcm1vc3RfdHlwZTsKCiAg ICAgICAgICAgIGlmICh0eXBlIC0+IFByaW1pdGl2ZSgpKQogICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICBpZiAodHlwZSA9PSBjb250cm9sLmludF90eXBlKQogICAgICAgICAgICAgICAgICAg ICB0eXBlID0gY29udHJvbC5JbnRlZ2VyKCk7CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBl ID09IGNvbnRyb2wuZG91YmxlX3R5cGUpCiAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBjb250 cm9sLkRvdWJsZSgpOwogICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZSA9PSBjb250cm9sLmNo YXJfdHlwZSkKICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGNvbnRyb2wuQ2hhcmFjdGVyKCk7 CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IGNvbnRyb2wubG9uZ190eXBlKQogICAg ICAgICAgICAgICAgICAgICB0eXBlID0gY29udHJvbC5Mb25nKCk7CiAgICAgICAgICAgICAgICBl bHNlIGlmICh0eXBlID09IGNvbnRyb2wuZmxvYXRfdHlwZSkKICAgICAgICAgICAgICAgICAgICAg dHlwZSA9IGNvbnRyb2wuRmxvYXQoKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0g Y29udHJvbC5ieXRlX3R5cGUpCiAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBjb250cm9sLkJ5 dGUoKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gY29udHJvbC5zaG9ydF90eXBl KQogICAgICAgICAgICAgICAgICAgICB0eXBlID0gY29udHJvbC5TaG9ydCgpOwogICAgICAgICAg ICAgICAgZWxzZSBpZiAodHlwZSA9PSBjb250cm9sLmJvb2xlYW5fdHlwZSkKICAgICAgICAgICAg ICAgICAgICAgdHlwZSA9IGNvbnRyb2wuQm9vbGVhbigpOwogICAgICAgICAgICAgICAgZWxzZSAg CiAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBjb250cm9sLlZvaWQoKTsKICAgICAgICAgICAg ICAgIGJhc2UgLT4gc3ltYm9sID0gdHlwZTsKCiAgICAgICAgICAgICAgICBWYXJpYWJsZVN5bWJv bCAqdmFyaWFibGVfc3ltYm9sID0gdHlwZSAtPiBGaW5kVmFyaWFibGVTeW1ib2woY29udHJvbC50 eXBlX25hbWVfc3ltYm9sKTsKCiAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgo IHZhcmlhYmxlX3N5bWJvbCApID8gMCA6CShfX2Fzc2VydF9mYWlsICgidmFyaWFibGVfc3ltYm9s IiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAyMzU4LCBfX1BSRVRUWV9GVU5DVElPTl9f ICksIDApKSkgOwoKICAgICAgICAgICAgICAgIGlmIChjb250cm9sLm9wdGlvbi5kZXByZWNhdGlv biAmJgogICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX3N5bWJvbCAtPiBJc0RlcHJlY2F0ZWQo KSAmJgogICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX3N5bWJvbCAtPiBvd25lciAtPiBUeXBl Q2FzdCgpIC0+IG91dGVybW9zdF90eXBlICE9IFRoaXNUeXBlKCkgLT4gb3V0ZXJtb3N0X3R5cGUp CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2Vt YW50aWNFcnJvcjo6REVQUkVDQVRFRF9GSUVMRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbiwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbiwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV9zeW1ib2wgLT4gTmFtZSgp LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX3N5bWJvbCAtPiBv d25lciAtPiBUeXBlQ2FzdCgpIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUo KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV9zeW1ib2wgLT4g b3duZXIgLT4gVHlwZUNhc3QoKSAtPiBFeHRlcm5hbE5hbWUoKSk7CiAgICAgICAgICAgICAgICB9 CgogICAgICAgICAgICAgICAgaWYgKCEgdmFyaWFibGVfc3ltYm9sIC0+IElzVHlwZWQoKSkKICAg ICAgICAgICAgICAgICAgICB2YXJpYWJsZV9zeW1ib2wgLT4gUHJvY2Vzc1ZhcmlhYmxlU2lnbmF0 dXJlKChTZW1hbnRpYyAqKSB0aGlzLCBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbik7 CgogICAgICAgICAgICAgICAgZmllbGRfYWNjZXNzIC0+IHN5bWJvbCA9IHZhcmlhYmxlX3N5bWJv bDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAg ICAgICAgIFR5cGVBY2Nlc3NDaGVjayhiYXNlLCBhcnJheV90eXBlID8gdHlwZSAtPiBiYXNlX3R5 cGUgOiB0eXBlKTsKICAgICAgICAgICAgICAgIGJhc2UgLT4gc3ltYm9sID0gdHlwZTsKCiAgICAg ICAgICAgICAgICBpZiAob3V0ZXJtb3N0X3R5cGUgLT4gQUNDX0lOVEVSRkFDRSgpKQogICAgICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFR5cGVTeW1ib2wgKmNsYXNzX2xpdGVyYWxf dHlwZSA9IG91dGVybW9zdF90eXBlIC0+IEZpbmRPckluc2VydENsYXNzTGl0ZXJhbENsYXNzKGZp ZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuKTsKICAgICAgICAgICAgICAgICAgICBBZGRE ZXBlbmRlbmNlKHRoaXNfdHlwZSwgY2xhc3NfbGl0ZXJhbF90eXBlLCBmaWVsZF9hY2Nlc3MgLT4g aWRlbnRpZmllcl90b2tlbik7CgogICAgICAgICAgICAgICAgICAgIEFzdFNpbXBsZU5hbWUgKnNp bXBsZV9uYW1lID0gY29tcGlsYXRpb25fdW5pdCAtPiBhc3RfcG9vbCAtPiBHZW5TaW1wbGVOYW1l KGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuKTsKICAgICAgICAgICAgICAgICAgICBz aW1wbGVfbmFtZSAtPiBzeW1ib2wgPSBjbGFzc19saXRlcmFsX3R5cGU7CgogICAgICAgICAgICAg ICAgICAgIEFzdEZpZWxkQWNjZXNzICptZXRob2RfYWNjZXNzID0gY29tcGlsYXRpb25fdW5pdCAt PiBhc3RfcG9vbCAtPiBHZW5GaWVsZEFjY2VzcygpOwogICAgICAgICAgICAgICAgICAgIG1ldGhv ZF9hY2Nlc3MgLT4gYmFzZSA9IHNpbXBsZV9uYW1lOwogICAgICAgICAgICAgICAgICAgIG1ldGhv ZF9hY2Nlc3MgLT4gZG90X3Rva2VuID0gZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW47 CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuID0g ZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW47CgogICAgICAgICAgICAgICAgICAgIEFz dFN0cmluZ0xpdGVyYWwgKnN0cmluZ19saXRlcmFsID0gY29tcGlsYXRpb25fdW5pdCAtPiBhc3Rf cG9vbCAtPiBHZW5TdHJpbmdMaXRlcmFsKGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2Vu KTsKICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGl0ZXJhbCAtPiB2YWx1ZSA9IHR5cGUgLT4g RmluZE9ySW5zZXJ0Q2xhc3NMaXRlcmFsTmFtZShjb250cm9sKTsKICAgICAgICAgICAgICAgICAg ICBzdHJpbmdfbGl0ZXJhbCAtPiBzeW1ib2wgPSBjb250cm9sLlN0cmluZygpOwoKICAgICAgICAg ICAgICAgICAgICBBc3RNZXRob2RJbnZvY2F0aW9uICptZXRob2RfY2FsbCAgICAgICA9IGNvbXBp bGF0aW9uX3VuaXQgLT4gYXN0X3Bvb2wgLT4gR2VuTWV0aG9kSW52b2NhdGlvbigpOwogICAgICAg ICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IG1ldGhvZCAgICAgICAgICAgICAgICAgID0gbWV0 aG9kX2FjY2VzczsKICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBsZWZ0X3BhcmVu dGhlc2lzX3Rva2VuICA9IGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuOwogICAgICAg ICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IEFkZEFyZ3VtZW50KHN0cmluZ19saXRlcmFsKTsK ICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiByaWdodF9wYXJlbnRoZXNpc190b2tl biA9IGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuOwogICAgICAgICAgICAgICAgICAg IG1ldGhvZF9jYWxsIC0+IHN5bWJvbCAgICAgICAgICAgICAgICAgID0gY2xhc3NfbGl0ZXJhbF90 eXBlIC0+IENsYXNzTGl0ZXJhbE1ldGhvZCgpOwoKICAgICAgICAgICAgICAgICAgICBmaWVsZF9h Y2Nlc3MgLT4gcmVzb2x1dGlvbl9vcHQgPSBtZXRob2RfY2FsbDsKICAgICAgICAgICAgICAgICAg ICBmaWVsZF9hY2Nlc3MgLT4gc3ltYm9sID0gKG1ldGhvZF9jYWxsIC0+IHN5bWJvbCA/IG1ldGhv ZF9jYWxsIC0+IHN5bWJvbCA6IGNvbnRyb2wubm9fdHlwZSk7CiAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAg QWRkRGVwZW5kZW5jZSh0aGlzX3R5cGUsIGNvbnRyb2wuQ2xhc3MoKSwgZmllbGRfYWNjZXNzIC0+ IGlkZW50aWZpZXJfdG9rZW4pOwoKICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZVN5bWJvbCAq dmFyaWFibGVfc3ltYm9sID0gb3V0ZXJtb3N0X3R5cGUgLT4gRmluZE9ySW5zZXJ0Q2xhc3NMaXRl cmFsKHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzX3R5cGUgPT0gb3V0ZXJtb3N0 X3R5cGUpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBBc3RT aW1wbGVOYW1lICpzaW1wbGVfbmFtZSA9IGNvbXBpbGF0aW9uX3VuaXQgLT4gYXN0X3Bvb2wgLT4g R2VuU2ltcGxlTmFtZShmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbik7CiAgICAgICAg ICAgICAgICAgICAgICAgIHNpbXBsZV9uYW1lIC0+IHN5bWJvbCA9IHZhcmlhYmxlX3N5bWJvbDsK CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBzeW1ib2wgPSB2YXJpYWJs ZV9zeW1ib2w7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiByZXNvbHV0 aW9uX29wdCA9IHNpbXBsZV9uYW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg ICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAg ICBBc3RTaW1wbGVOYW1lICpzaW1wbGVfbmFtZSA9IGNvbXBpbGF0aW9uX3VuaXQgLT4gYXN0X3Bv b2wgLT4gR2VuU2ltcGxlTmFtZShmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbik7CiAg ICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZV9uYW1lIC0+IHN5bWJvbCAgICAgID0gb3V0ZXJt b3N0X3R5cGU7CgogICAgICAgICAgICAgICAgICAgICAgICBBc3RGaWVsZEFjY2VzcyAqbWV0aG9k X2FjY2VzcyAgICAgPSBjb21waWxhdGlvbl91bml0IC0+IGFzdF9wb29sIC0+IEdlbkZpZWxkQWNj ZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9hY2Nlc3MgLT4gYmFzZSAgICAg ICAgICAgICA9IHNpbXBsZV9uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfYWNj ZXNzIC0+IGRvdF90b2tlbiAgICAgICAgPSBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tl bjsKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rv a2VuID0gZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW47CiAgICAgICAgICAgICAgICAg ICAgICAgIG1ldGhvZF9hY2Nlc3MgLT4gc3ltYm9sICAgICAgICAgICA9IHZhcmlhYmxlX3N5bWJv bDsgIAoKICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg CiAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRp Y19jYXN0PHZvaWQ+ICAoKCB2YXJpYWJsZV9zeW1ib2wgLT4gQUNDX1NUQVRJQygpICkgPyAwIDoJ KF9fYXNzZXJ0X2ZhaWwgKCJ2YXJpYWJsZV9zeW1ib2wgLT4gQUNDX1NUQVRJQygpIiAsICIuLi8u Li9qaWtlcy9zcmMvZXhwci5jcHAiLCAyNDM2LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkg OwoKICAgICAgICAgICAgICAgICAgICAgICAgQXN0TWV0aG9kSW52b2NhdGlvbiAqbWV0aG9kX2Nh bGwgICAgICAgPSBjb21waWxhdGlvbl91bml0IC0+IGFzdF9wb29sIC0+IEdlbk1ldGhvZEludm9j YXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4gbWV0aG9kICAg ICAgICAgICAgICAgICAgPSBtZXRob2RfYWNjZXNzOwogICAgICAgICAgICAgICAgICAgICAgICBt ZXRob2RfY2FsbCAtPiBsZWZ0X3BhcmVudGhlc2lzX3Rva2VuICA9IGZpZWxkX2FjY2VzcyAtPiBp ZGVudGlmaWVyX3Rva2VuOwogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBy aWdodF9wYXJlbnRoZXNpc190b2tlbiA9IGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2Vu OwogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBzeW1ib2wgICAgICAgICAg ICAgICAgICA9IG91dGVybW9zdF90eXBlIC0+IEdldFdyaXRlQWNjZXNzTWV0aG9kKHZhcmlhYmxl X3N5bWJvbCk7CgogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gcmVzb2x1 dGlvbl9vcHQgPSBtZXRob2RfY2FsbDsKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYWNj ZXNzIC0+IHN5bWJvbCA9IG91dGVybW9zdF90eXBlIC0+IEdldFJlYWRBY2Nlc3NNZXRob2QodmFy aWFibGVfc3ltYm9sKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAg QXN0RXhwcmVzc2lvbiogYmFzZSA9IGZpZWxkX2FjY2VzcyAtPiBiYXNlOwogICAgICAgICAgICBB c3RGaWVsZEFjY2VzcyAqc3ViX2ZpZWxkX2FjY2VzcyA9IGJhc2UgLT4gRmllbGRBY2Nlc3NDYXN0 KCk7CiAgICAgICAgICAgIHNpbXBsZV9uYW1lID0gYmFzZSAtPiBTaW1wbGVOYW1lQ2FzdCgpOwoK ICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgaWYg KHNpbXBsZV9uYW1lIHx8IHN1Yl9maWVsZF9hY2Nlc3MpCiAgICAgICAgICAgICAgICBQcm9jZXNz QW1iaWd1b3VzTmFtZShiYXNlKTsKICAgICAgICAgICAgZWxzZSAgCiAgICAgICAgICAgICAgICBQ cm9jZXNzRXhwcmVzc2lvbk9yU3RyaW5nQ29uc3RhbnQoYmFzZSk7CgogICAgICAgICAgICBpZiAo YmFzZSAtPiBzeW1ib2wgPT0gY29udHJvbC5ub190eXBlKQogICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgICAg ICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBQYWNrYWdlU3ltYm9s ICpwYWNrYWdlOwogICAgICAgICAgICBTeW1ib2wgKnN5bWJvbCA9IGJhc2UgLT4gc3ltYm9sOwoK ICAgICAgICAgICAgaWYgKGZpZWxkX2FjY2VzcyAtPiBJc1RoaXNBY2Nlc3MoKSB8fCBmaWVsZF9h Y2Nlc3MgLT4gSXNTdXBlckFjY2VzcygpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBU eXBlU3ltYm9sICplbmNsb3NpbmdfdHlwZSA9IHN5bWJvbCAtPiBUeXBlQ2FzdCgpOwogICAgICAg ICAgICAgICAgaWYgKGVuY2xvc2luZ190eXBlID09IGNvbnRyb2wubm9fdHlwZSkKICAgICAgICAg ICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAg ICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlm ICghIGVuY2xvc2luZ190eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg ICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6Tk9UX0FfVFlQRSwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSAtPiBMZWZ0VG9rZW4oKSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSAtPiBSaWdodFRva2VuKCkp OwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gc3ltYm9sID0gY29udHJv bC5ub190eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNl IGlmIChlbmNsb3NpbmdfdHlwZSAtPiBBQ0NfSU5URVJGQUNFKCkpCiAgICAgICAgICAgICAgICAg ICAgewogICAgICAgICAgICAgICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9y OjpOT1RfQV9DTEFTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFz ZSAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg YmFzZSAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGVuY2xvc2luZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUo KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nX3R5cGUg LT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3Mg LT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAg ICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg ICAgICAgICBpZiAoISAodGhpc190eXBlIC0+IElzTmVzdGVkSW4oZW5jbG9zaW5nX3R5cGUpICYm IHRoaXNfdHlwZSAtPiBDYW5BY2Nlc3MoZW5jbG9zaW5nX3R5cGUpKSkKICAgICAgICAgICAgICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNfdHlwZSA9PSBl bmNsb3NpbmdfdHlwZSAmJiBmaWVsZF9hY2Nlc3MgLT4gSXNUaGlzQWNjZXNzKCkpCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVw b3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6TUlTUExBQ0VEX1RISVNfRVhQUkVTU0lPTiwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3Mg LT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZmllbGRfYWNjZXNzIC0+IFJpZ2h0VG9rZW4oKSk7CiAgICAgICAgICAgICAgICAgICAg ICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwb3J0U2Vt RXJyb3IoU2VtYW50aWNFcnJvcjo6SUxMRUdBTF9USElTX0ZJRUxEX0FDQ0VTUywKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gTGVm dFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ZmllbGRfYWNjZXNzIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdfdHlwZSAtPiBDb250YWluaW5nUGFja2FnZSgp IC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZW5jbG9zaW5nX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc190eXBlIC0+IENvbnRhaW5pbmdQ YWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB0aGlzX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgICAgICAg ICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2Fj Y2VzcyAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAg IH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICBmaWVsZF9hY2Nlc3MgLT4gcmVzb2x1dGlvbl9vcHQgPSBDcmVhdGVBY2Nlc3NUb1R5cGUo ZmllbGRfYWNjZXNzLCBlbmNsb3NpbmdfdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAg ICBmaWVsZF9hY2Nlc3MgLT4gc3ltYm9sID0gZmllbGRfYWNjZXNzIC0+IHJlc29sdXRpb25fb3B0 IC0+IHN5bWJvbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAg IH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgo cGFja2FnZSA9IHN5bWJvbCAtPiBQYWNrYWdlQ2FzdCgpKSkKICAgICAgICAgICAgewogICAgICAg ICAgICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAg ICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgTmFtZVN5bWJvbCAqbmFt ZV9zeW1ib2wgPSBsZXhfc3RyZWFtIC0+IE5hbWVTeW1ib2woZmllbGRfYWNjZXNzIC0+IGlkZW50 aWZpZXJfdG9rZW4pOwogICAgICAgICAgICAgICAgdHlwZSA9IHBhY2thZ2UgLT4gRmluZFR5cGVT eW1ib2wobmFtZV9zeW1ib2wpOwoKICAgICAgICAgICAgICAgIGlmICh0eXBlKQogICAgICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlIC0+IFNvdXJjZVBlbmRpbmcoKSkK ICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5Qcm9jZXNzSGVhZGVycyh0eXBlIC0+IGZp bGVfc3ltYm9sKTsKICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gc3ltYm9sID0g dHlwZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgICAgICBGaWxlU3ltYm9sICpmaWxlX3N5bWJvbCA9IENvbnRy b2w6OkdldEZpbGUoY29udHJvbCwgcGFja2FnZSwgbmFtZV9zeW1ib2wpOwogICAgICAgICAgICAg ICAgICAgIGlmIChmaWxlX3N5bWJvbCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAg ICAgICAgICAgICAgIHR5cGUgPSBSZWFkVHlwZShmaWxlX3N5bWJvbCwgcGFja2FnZSwgbmFtZV9z eW1ib2wsIGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVyX3Rva2VuKTsKICAgICAgICAgICAgICAg ICAgICAgICAgZmllbGRfYWNjZXNzIC0+IHN5bWJvbCA9IHR5cGU7CiAgICAgICAgICAgICAgICAg ICAgfQogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBl bHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdl U3ltYm9sICpzdWJwYWNrYWdlID0gcGFja2FnZSAtPiBGaW5kUGFja2FnZVN5bWJvbChuYW1lX3N5 bWJvbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIHN1YnBhY2thZ2UpICAKICAgICAg ICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicGFja2Fn ZSA9IHBhY2thZ2UgLT4gSW5zZXJ0UGFja2FnZVN5bWJvbChuYW1lX3N5bWJvbCk7CiAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb250cm9sLkZpbmRQYXRoc1RvRGlyZWN0b3J5KHN1YnBhY2th Z2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZp ZWxkX2FjY2VzcyAtPiBzeW1ib2wgPSBzdWJwYWNrYWdlOwogICAgICAgICAgICAgICAgICAgIH0K ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzdWJf ZmllbGRfYWNjZXNzICYmIHN1Yl9maWVsZF9hY2Nlc3MgLT4gSXNTdXBlckFjY2VzcygpKQogICAg ICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoc3ViX2ZpZWxkX2FjY2VzcyAtPiBUeXBlKCkg PT0gY29udHJvbC5ub190eXBlKQogICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBz eW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdWJfZmll bGRfYWNjZXNzIC0+IFR5cGUoKSA9PSBjb250cm9sLk9iamVjdCgpKQogICAgICAgICAgICAgICAg ewogICAgICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6Ok9CSkVD VF9IQVNfTk9fU1VQRVJfVFlQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz dWJfZmllbGRfYWNjZXNzIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHN1Yl9maWVsZF9hY2Nlc3MgLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHN1Yl9maWVsZF9hY2Nlc3MgLT4gVHlwZSgpIC0+IENvbnRh aW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdWJfZmllbGRfYWNjZXNzIC0+IFR5cGUoKSAtPiBFeHRlcm5hbE5hbWUoKSk7 CiAgICAgICAgICAgICAgICAgICAgZmllbGRfYWNjZXNzIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9f dHlwZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gc3ViX2ZpZWxkX2FjY2VzcyAtPiBUeXBl KCkgLT4gc3VwZXI7CiAgICAgICAgICAgICAgICAgICAgRmluZFZhcmlhYmxlTWVtYmVyKHR5cGUs IHN1Yl9maWVsZF9hY2Nlc3MgLT4gVHlwZSgpLCBmaWVsZF9hY2Nlc3MpOwogICAgICAgICAgICAg ICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAg ICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgZWxzZSBpZiAoKHR5cGUgPSBzeW1ib2wgLT4g VHlwZUNhc3QoKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZpbmRWYXJpYWJsZU1l bWJlcih0eXBlLCBiYXNlIC0+IFR5cGUoKSwgZmllbGRfYWNjZXNzKTsKICAgICAgICAgICAgfQog ICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAg ICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICBlbHNlIGlmIChzeW1ib2wgLT4g VmFyaWFibGVDYXN0KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIChzdGF0aWNfY2Fz dDx2b2lkPiAgKCggc3ltYm9sIC0+IFZhcmlhYmxlQ2FzdCgpIC0+IElzVHlwZWQoKSApID8gMCA6 CShfX2Fzc2VydF9mYWlsICgic3ltYm9sIC0+IFZhcmlhYmxlQ2FzdCgpIC0+IElzVHlwZWQoKSIg LCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMjYwNSwgX19QUkVUVFlfRlVOQ1RJT05fXyAp LCAwKSkpIDsKCiAgICAgICAgICAgICAgICB0eXBlID0gc3ltYm9sIC0+IFZhcmlhYmxlQ2FzdCgp IC0+IFR5cGUoKTsKCiAgICAgICAgICAgICAgICBGaW5kVmFyaWFibGVNZW1iZXIodHlwZSwgdHlw ZSwgZmllbGRfYWNjZXNzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzeW1i b2wgLT4gTWV0aG9kQ2FzdCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAoc3RhdGlj X2Nhc3Q8dm9pZD4gICgoIHN5bWJvbCAtPiBNZXRob2RDYXN0KCkgLT4gSXNUeXBlZCgpICkgPyAw IDoJKF9fYXNzZXJ0X2ZhaWwgKCJzeW1ib2wgLT4gTWV0aG9kQ2FzdCgpIC0+IElzVHlwZWQoKSIg LCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMjYxMywgX19QUkVUVFlfRlVOQ1RJT05fXyAp LCAwKSkpIDsKCiAgICAgICAgICAgICAgICB0eXBlID0gc3ltYm9sIC0+IE1ldGhvZENhc3QoKSAt PiBUeXBlKCk7CgogICAgICAgICAgICAgICAgRmluZFZhcmlhYmxlTWVtYmVyKHR5cGUsIHR5cGUs IGZpZWxkX2FjY2Vzcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAgCiAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlVOS05P V05fUVVBTElGSUVEX05BTUVfQkFTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJh c2UgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlIC0+ IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCAtPiBO YW1lKCkpOwogICAgICAgICAgICAgICAgZmllbGRfYWNjZXNzIC0+IHN5bWJvbCA9IGNvbnRyb2wu bm9fdHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHR5cGUpCiAgICAg ICAgewogICAgICAgICAgICBUeXBlU3ltYm9sICpwYXJlbnRfdHlwZSA9ICh0eXBlIC0+IElzQXJy YXkoKSA/IHR5cGUgLT4gYmFzZV90eXBlIDogdHlwZSk7CiAgICAgICAgICAgIGlmICghIHBhcmVu dF90eXBlIC0+IFByaW1pdGl2ZSgpKQogICAgICAgICAgICAgICAgQWRkRGVwZW5kZW5jZSh0aGlz X3R5cGUsIHBhcmVudF90eXBlLCBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbiwgZmll bGRfYWNjZXNzIC0+IElzQ29uc3RhbnQoKSk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsK fQoKCnZvaWQgU2VtYW50aWM6OlByb2Nlc3NGaWVsZEFjY2VzcyhBc3QgKmV4cHIpCnsKICAgIEFz dEZpZWxkQWNjZXNzICpmaWVsZF9hY2Nlc3MgPSAoQXN0RmllbGRBY2Nlc3MgKikgZXhwcjsKCiAg ICBQcm9jZXNzQW1iaWd1b3VzTmFtZShmaWVsZF9hY2Nlc3MpOwoKICAgIFR5cGVTeW1ib2wgKnR5 cGU7CgogICAgaWYgKGZpZWxkX2FjY2VzcyAtPiBzeW1ib2wgIT0gY29udHJvbC5ub190eXBlKQog ICAgewogICAgICAgIFBhY2thZ2VTeW1ib2wgKnBhY2thZ2UgPSBmaWVsZF9hY2Nlc3MgLT4gc3lt Ym9sIC0+IFBhY2thZ2VDYXN0KCk7CiAgICAgICAgaWYgKHBhY2thZ2UpCiAgICAgICAgewogICAg ICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpVTktOT1dOX0FNQklHVU9VU19O QU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gTGVmdFRva2Vu KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBSaWdodFRva2Vu KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UgLT4gUGFja2FnZU5hbWUoKSk7 CiAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAg ICAgICAgfQogICAgICAgIGVsc2UgaWYgKCh0eXBlID0gZmllbGRfYWNjZXNzIC0+IHN5bWJvbCAt PiBUeXBlQ2FzdCgpKSAmJiAoISBmaWVsZF9hY2Nlc3MgLT4gSXNUaGlzQWNjZXNzKCkpKQogICAg ICAgIHsKICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VFlQRV9OT1Rf RklFTEQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBMZWZ0VG9r ZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYWNjZXNzIC0+IFJpZ2h0VG9r ZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAtPiBOYW1lKCkpOwogICAgICAg ICAgICBmaWVsZF9hY2Nlc3MgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgICAgIH0K ICAgICAgICBlbHNlICAKICAgICAgICB7CiAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAg KCggKCEgZmllbGRfYWNjZXNzIC0+IHN5bWJvbCAtPiBWYXJpYWJsZUNhc3QoKSkgfHwgZmllbGRf YWNjZXNzIC0+IHN5bWJvbCAtPiBWYXJpYWJsZUNhc3QoKSAtPiBJc1R5cGVkKCkgKSA/IDAgOgko X19hc3NlcnRfZmFpbCAoIighIGZpZWxkX2FjY2VzcyAtPiBzeW1ib2wgLT4gVmFyaWFibGVDYXN0 KCkpIHx8IGZpZWxkX2FjY2VzcyAtPiBzeW1ib2wgLT4gVmFyaWFibGVDYXN0KCkgLT4gSXNUeXBl ZCgpIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAyNjcwLCBfX1BSRVRUWV9GVU5DVElP Tl9fICksIDApKSkgOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCgp2b2lkIFNlbWFu dGljOjpQcm9jZXNzQ2hhcmFjdGVyTGl0ZXJhbChBc3QgKmV4cHIpCnsKICAgIEFzdENoYXJhY3Rl ckxpdGVyYWwgKmNoYXJfbGl0ZXJhbCA9IChBc3RDaGFyYWN0ZXJMaXRlcmFsICopIGV4cHI7Cgog ICAgTGl0ZXJhbFN5bWJvbCAqbGl0ZXJhbCA9IGxleF9zdHJlYW0gLT4gTGl0ZXJhbFN5bWJvbChj aGFyX2xpdGVyYWwgLT4gY2hhcmFjdGVyX2xpdGVyYWxfdG9rZW4pOwoKICAgIGlmICghIGxpdGVy YWwgLT4gdmFsdWUpCiAgICAgICAgY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnRDaGFyKGxp dGVyYWwpOwogICAgaWYgKGxpdGVyYWwgLT4gdmFsdWUgPT0gY29udHJvbC5CYWRWYWx1ZSgpKQog ICAgewogICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OklOVkFMSURfQ0hBUkFD VEVSX1ZBTFVFLAogICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbGl0ZXJhbCAtPiBMZWZ0VG9r ZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2xpdGVyYWwgLT4gUmlnaHRUb2tlbigp KTsKICAgICAgICBjaGFyX2xpdGVyYWwgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAg fQogICAgZWxzZQogICAgewogICAgICAgIGNoYXJfbGl0ZXJhbCAtPiB2YWx1ZSA9IGxpdGVyYWwg LT4gdmFsdWU7CiAgICAgICAgY2hhcl9saXRlcmFsIC0+IHN5bWJvbCA9IGNvbnRyb2wuY2hhcl90 eXBlOwogICAgfQp9CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vzc0ludGVnZXJMaXRlcmFsKEFzdCAq ZXhwcikKewogICAgQXN0SW50ZWdlckxpdGVyYWwgKmludF9saXRlcmFsID0gKEFzdEludGVnZXJM aXRlcmFsICopIGV4cHI7CgogICAgTGl0ZXJhbFN5bWJvbCAqbGl0ZXJhbCA9IGxleF9zdHJlYW0g LT4gTGl0ZXJhbFN5bWJvbChpbnRfbGl0ZXJhbCAtPiBpbnRlZ2VyX2xpdGVyYWxfdG9rZW4pOwoK ICAgIGlmICghIGxpdGVyYWwgLT4gdmFsdWUpCiAgICAgICAgY29udHJvbC5pbnRfcG9vbC5GaW5k T3JJbnNlcnRJbnQobGl0ZXJhbCk7CiAgICBpZiAobGl0ZXJhbCAtPiB2YWx1ZSA9PSBjb250cm9s LkJhZFZhbHVlKCkpCiAgICB7CiAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6 SU5WQUxJRF9JTlRfVkFMVUUsCiAgICAgICAgICAgICAgICAgICAgICAgaW50X2xpdGVyYWwgLT4g TGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgaW50X2xpdGVyYWwgLT4gUmlnaHRU b2tlbigpKTsKICAgICAgICBpbnRfbGl0ZXJhbCAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7 CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaW50X2xpdGVyYWwgLT4gdmFsdWUgPSBsaXRl cmFsIC0+IHZhbHVlOwogICAgICAgIGludF9saXRlcmFsIC0+IHN5bWJvbCA9IGNvbnRyb2wuaW50 X3R5cGU7CiAgICB9Cn0KCgp2b2lkIFNlbWFudGljOjpQcm9jZXNzTG9uZ0xpdGVyYWwoQXN0ICpl eHByKQp7CiAgICBBc3RMb25nTGl0ZXJhbCAqbG9uZ19saXRlcmFsID0gKEFzdExvbmdMaXRlcmFs ICopIGV4cHI7CgogICAgTGl0ZXJhbFN5bWJvbCAqbGl0ZXJhbCA9IGxleF9zdHJlYW0gLT4gTGl0 ZXJhbFN5bWJvbChsb25nX2xpdGVyYWwgLT4gbG9uZ19saXRlcmFsX3Rva2VuKTsKCiAgICBpZiAo ISBsaXRlcmFsIC0+IHZhbHVlKQogICAgICAgIGNvbnRyb2wubG9uZ19wb29sLkZpbmRPckluc2Vy dExvbmcobGl0ZXJhbCk7CiAgICBpZiAobGl0ZXJhbCAtPiB2YWx1ZSA9PSBjb250cm9sLkJhZFZh bHVlKCkpCiAgICB7CiAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6SU5WQUxJ RF9MT05HX1ZBTFVFLAogICAgICAgICAgICAgICAgICAgICAgIGxvbmdfbGl0ZXJhbCAtPiBMZWZ0 VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICBsb25nX2xpdGVyYWwgLT4gUmlnaHRUb2tl bigpKTsKICAgICAgICBsb25nX2xpdGVyYWwgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwog ICAgfQogICAgZWxzZQogICAgewogICAgICAgIGxvbmdfbGl0ZXJhbCAtPiB2YWx1ZSA9IGxpdGVy YWwgLT4gdmFsdWU7CiAgICAgICAgbG9uZ19saXRlcmFsIC0+IHN5bWJvbCA9IGNvbnRyb2wubG9u Z190eXBlOwogICAgfQp9CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vzc0Zsb2F0aW5nUG9pbnRMaXRl cmFsKEFzdCAqZXhwcikKewogICAgQXN0RmxvYXRpbmdQb2ludExpdGVyYWwgKmZsb2F0X2xpdGVy YWwgPSAoQXN0RmxvYXRpbmdQb2ludExpdGVyYWwgKikgZXhwcjsKCiAgICBMaXRlcmFsU3ltYm9s ICpsaXRlcmFsID0gbGV4X3N0cmVhbSAtPiBMaXRlcmFsU3ltYm9sKGZsb2F0X2xpdGVyYWwgLT4g ZmxvYXRpbmdfcG9pbnRfbGl0ZXJhbF90b2tlbik7CgogICAgaWYgKCEgbGl0ZXJhbCAtPiB2YWx1 ZSkKICAgICAgICBjb250cm9sLmZsb2F0X3Bvb2wuRmluZE9ySW5zZXJ0RmxvYXQobGl0ZXJhbCk7 CiAgICBpZiAobGl0ZXJhbCAtPiB2YWx1ZSA9PSBjb250cm9sLkJhZFZhbHVlKCkpCiAgICB7CiAg ICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6SU5WQUxJRF9GTE9BVF9WQUxVRSwK ICAgICAgICAgICAgICAgICAgICAgICBmbG9hdF9saXRlcmFsIC0+IExlZnRUb2tlbigpLAogICAg ICAgICAgICAgICAgICAgICAgIGZsb2F0X2xpdGVyYWwgLT4gUmlnaHRUb2tlbigpKTsKICAgICAg ICBmbG9hdF9saXRlcmFsIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgIH0KICAgIGVs c2UKICAgIHsKICAgICAgICBmbG9hdF9saXRlcmFsIC0+IHZhbHVlID0gbGl0ZXJhbCAtPiB2YWx1 ZTsKICAgICAgICBmbG9hdF9saXRlcmFsIC0+IHN5bWJvbCA9IGNvbnRyb2wuZmxvYXRfdHlwZTsK ICAgIH0KfQoKCnZvaWQgU2VtYW50aWM6OlByb2Nlc3NEb3VibGVMaXRlcmFsKEFzdCAqZXhwcikK ewogICAgQXN0RG91YmxlTGl0ZXJhbCAqZG91YmxlX2xpdGVyYWwgPSAoQXN0RG91YmxlTGl0ZXJh bCAqKSBleHByOwoKICAgIExpdGVyYWxTeW1ib2wgKmxpdGVyYWwgPSBsZXhfc3RyZWFtIC0+IExp dGVyYWxTeW1ib2woZG91YmxlX2xpdGVyYWwgLT4gZG91YmxlX2xpdGVyYWxfdG9rZW4pOwoKICAg IGlmICghIGxpdGVyYWwgLT4gdmFsdWUpCiAgICAgICAgY29udHJvbC5kb3VibGVfcG9vbC5GaW5k T3JJbnNlcnREb3VibGUobGl0ZXJhbCk7CiAgICBpZiAobGl0ZXJhbCAtPiB2YWx1ZSA9PSBjb250 cm9sLkJhZFZhbHVlKCkpCiAgICB7CiAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJv cjo6SU5WQUxJRF9ET1VCTEVfVkFMVUUsCiAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlX2xp dGVyYWwgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlX2xpdGVy YWwgLT4gUmlnaHRUb2tlbigpKTsKICAgICAgICBkb3VibGVfbGl0ZXJhbCAtPiBzeW1ib2wgPSBj b250cm9sLm5vX3R5cGU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZG91YmxlX2xpdGVy YWwgLT4gdmFsdWUgPSBsaXRlcmFsIC0+IHZhbHVlOwogICAgICAgIGRvdWJsZV9saXRlcmFsIC0+ IHN5bWJvbCA9IGNvbnRyb2wuZG91YmxlX3R5cGU7CiAgICB9Cn0KCgp2b2lkIFNlbWFudGljOjpQ cm9jZXNzVHJ1ZUxpdGVyYWwoQXN0ICpleHByKQp7CiAgICBBc3RFeHByZXNzaW9uICp0cnVlX2xp dGVyYWwgPSAoQXN0VHJ1ZUxpdGVyYWwgKikgZXhwcjsKCiAgICB0cnVlX2xpdGVyYWwgLT4gdmFs dWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPckluc2VydCgoaW50KSAxKTsKICAgIHRydWVfbGl0 ZXJhbCAtPiBzeW1ib2wgPSBjb250cm9sLmJvb2xlYW5fdHlwZTsKfQoKCnZvaWQgU2VtYW50aWM6 OlByb2Nlc3NGYWxzZUxpdGVyYWwoQXN0ICpleHByKQp7CiAgICBBc3RFeHByZXNzaW9uICpmYWxz ZV9saXRlcmFsID0gKEFzdEZhbHNlTGl0ZXJhbCAqKSBleHByOwoKICAgIGZhbHNlX2xpdGVyYWwg LT4gdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPckluc2VydCgoaW50KSAwKTsKICAgIGZh bHNlX2xpdGVyYWwgLT4gc3ltYm9sID0gY29udHJvbC5ib29sZWFuX3R5cGU7Cn0KCgp2b2lkIFNl bWFudGljOjpQcm9jZXNzU3RyaW5nTGl0ZXJhbChBc3QgKmV4cHIpCnsKICAgIEFzdFN0cmluZ0xp dGVyYWwgKnN0cmluZ19saXRlcmFsID0gKEFzdFN0cmluZ0xpdGVyYWwgKikgZXhwcjsKCiAgICBM aXRlcmFsU3ltYm9sICpsaXRlcmFsID0gbGV4X3N0cmVhbSAtPiBMaXRlcmFsU3ltYm9sKHN0cmlu Z19saXRlcmFsIC0+IHN0cmluZ19saXRlcmFsX3Rva2VuKTsKCiAgICBpZiAoISBsaXRlcmFsIC0+ IHZhbHVlKQogICAgICAgIGNvbnRyb2wuVXRmOF9wb29sLkZpbmRPckluc2VydFN0cmluZyhsaXRl cmFsKTsKICAgIGlmIChsaXRlcmFsIC0+IHZhbHVlID09IGNvbnRyb2wuQmFkVmFsdWUoKSkKICAg IHsKICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpJTlZBTElEX1NUUklOR19W QUxVRSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGl0ZXJhbCAtPiBMZWZ0VG9rZW4o KSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGl0ZXJhbCAtPiBSaWdodFRva2VuKCkp OwogICAgICAgIHN0cmluZ19saXRlcmFsIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAg IH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzdHJpbmdfbGl0ZXJhbCAtPiB2YWx1ZSA9IGxpdGVy YWwgLT4gdmFsdWU7CiAgICAgICAgc3RyaW5nX2xpdGVyYWwgLT4gc3ltYm9sID0gY29udHJvbC5T dHJpbmcoKTsKICAgIH0KfQoKCnZvaWQgU2VtYW50aWM6OlByb2Nlc3NBcnJheUFjY2VzcyhBc3Qg KmV4cHIpCnsKICAgIEFzdEFycmF5QWNjZXNzICphcnJheV9hY2Nlc3MgPSAoQXN0QXJyYXlBY2Nl c3MgKikgZXhwcjsKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBTeW1ib2xTZXQg KmV4Y2VwdGlvbl9zZXQgPSBUcnlFeGNlcHRpb25UYWJsZVN0YWNrKCkuVG9wKCk7CiAgICBpZiAo ZXhjZXB0aW9uX3NldCkKICAgIHsKICAgICAgICBleGNlcHRpb25fc2V0IC0+IEFkZEVsZW1lbnQo Y29udHJvbC5SdW50aW1lRXhjZXB0aW9uKCkpOwogICAgfQoKICAgIFByb2Nlc3NFeHByZXNzaW9u KGFycmF5X2FjY2VzcyAtPiBiYXNlKTsKICAgIFByb2Nlc3NFeHByZXNzaW9uKGFycmF5X2FjY2Vz cyAtPiBleHByZXNzaW9uKTsKICAgIGFycmF5X2FjY2VzcyAtPiBleHByZXNzaW9uID0gUHJvbW90 ZVVuYXJ5TnVtZXJpY0V4cHJlc3Npb24oYXJyYXlfYWNjZXNzIC0+IGV4cHJlc3Npb24pOwogICAg aWYgKGFycmF5X2FjY2VzcyAtPiBleHByZXNzaW9uIC0+IFR5cGUoKSAhPSBjb250cm9sLmludF90 eXBlICYmIGFycmF5X2FjY2VzcyAtPiBleHByZXNzaW9uIC0+IHN5bWJvbCAhPSBjb250cm9sLm5v X3R5cGUpCiAgICB7CiAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VFlQRV9O T1RfSU5URUdFUiwKICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9hY2Nlc3MgLT4gZXhwcmVz c2lvbiAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9hY2Nlc3Mg LT4gZXhwcmVzc2lvbiAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgYXJy YXlfYWNjZXNzIC0+IGV4cHJlc3Npb24gLT4gVHlwZSgpIC0+IE5hbWUoKSk7CiAgICB9CgogICAg VHlwZVN5bWJvbCAqYXJyYXlfdHlwZSA9IGFycmF5X2FjY2VzcyAtPiBiYXNlIC0+IFR5cGUoKTsK ICAgIGlmIChhcnJheV90eXBlIC0+IElzQXJyYXkoKSkKICAgICAgICBhcnJheV9hY2Nlc3MgLT4g c3ltYm9sID0gYXJyYXlfdHlwZSAtPiBBcnJheVN1YnR5cGUoKTsKICAgIGVsc2UKICAgIHsKICAg ICAgICBpZiAoYXJyYXlfdHlwZSAhPSBjb250cm9sLm5vX3R5cGUpCiAgICAgICAgICAgIFJlcG9y dFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlRZUEVfTk9UX0FSUkFZLAogICAgICAgICAgICAgICAg ICAgICAgICAgICBhcnJheV9hY2Nlc3MgLT4gYmFzZSAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgYXJyYXlfYWNjZXNzIC0+IGJhc2UgLT4gUmlnaHRUb2tlbigpLAog ICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9hY2Nlc3MgLT4gYmFzZSAtPiBUeXBlKCkg LT4gTmFtZSgpKTsKICAgICAgICBhcnJheV9hY2Nlc3MgLT4gc3ltYm9sID0gY29udHJvbC5ub190 eXBlOwogICAgfQoKICAgIHJldHVybjsKfQoKCk1ldGhvZFN5bWJvbCAqU2VtYW50aWM6OkZpbmRN ZXRob2RNZW1iZXIoVHlwZVN5bWJvbCAqdHlwZSwgVHlwZVN5bWJvbCAqZW52aXJvbm1lbnRfdHlw ZSwgQXN0TWV0aG9kSW52b2NhdGlvbiAqbWV0aG9kX2NhbGwpCnsKICAgIE1ldGhvZFN5bWJvbCAq bWV0aG9kID0gX19udWxsIDsKICAgIEFzdEZpZWxkQWNjZXNzICpmaWVsZF9hY2Nlc3MgPSBtZXRo b2RfY2FsbCAtPiBtZXRob2QgLT4gRmllbGRBY2Nlc3NDYXN0KCk7CgogICAgaWYgKHR5cGUgLT4g QmFkKCkpCiAgICB7CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICAgCiAgICAgICAgaWYgKE51bUVycm9ycygpID09IDApCiAgICAgICAgICAg IFJlcG9ydE1ldGhvZE5vdEZvdW5kKG1ldGhvZF9jYWxsLCBsZXhfc3RyZWFtIC0+IE5hbWVTdHJp bmcoZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW4pKTsKICAgICAgICBtZXRob2RfY2Fs bCAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICB9CiAgICBlbHNlIGlmICh0eXBlID09 IGNvbnRyb2wubnVsbF90eXBlIHx8IHR5cGUgLT4gUHJpbWl0aXZlKCkpCiAgICB7CiAgICAgICAg UmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VFlQRV9OT1RfUkVGRVJFTkNFLAogICAgICAg ICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBiYXNlIC0+IExlZnRUb2tlbigpLAogICAg ICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBiYXNlIC0+IFJpZ2h0VG9rZW4oKSwK ICAgICAgICAgICAgICAgICAgICAgICB0eXBlIC0+IE5hbWUoKSk7CiAgICAgICAgbWV0aG9kX2Nh bGwgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgfQogICAgZWxzZQogICAgewogICAg ICAgIFR5cGVTeW1ib2wgKnRoaXNfdHlwZSA9IFRoaXNUeXBlKCk7CiAgICAgICAgVHlwZUFjY2Vz c0NoZWNrKGZpZWxkX2FjY2VzcyAtPiBiYXNlLCB0eXBlKTsKCiAgICAgICAgbWV0aG9kID0gRmlu ZE1ldGhvZEluVHlwZSh0eXBlLCBtZXRob2RfY2FsbCk7CgogICAgICAgIGlmIChtZXRob2QpCiAg ICAgICAgewogICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIG1ldGhvZCAtPiBJc1R5 cGVkKCkgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoIm1ldGhvZCAtPiBJc1R5cGVkKCkiICwgIi4u Ly4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDI5MTEsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkp KSA7CgogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAg ICBpZiAodGhpc190eXBlICE9IG1ldGhvZCAtPiBjb250YWluaW5nX3R5cGUgJiYKICAgICAgICAg ICAgICAgIHRoaXNfdHlwZSAtPiBvdXRlcm1vc3RfdHlwZSA9PSBlbnZpcm9ubWVudF90eXBlIC0+ IG91dGVybW9zdF90eXBlICYmCiAgICAgICAgICAgICAgICAobWV0aG9kIC0+IEFDQ19QUklWQVRF KCkgfHwKICAgICAgICAgICAgICAgICAobWV0aG9kIC0+IEFDQ19QUk9URUNURUQoKSAmJgogICAg ICAgICAgICAgICAgICBtZXRob2QgLT4gY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdQYWNr YWdlKCkgIT0gZW52aXJvbm1lbnRfdHlwZSAtPiBDb250YWluaW5nUGFja2FnZSgpKSkpCiAgICAg ICAgICAgIHsKICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggKCEgbWV0aG9k IC0+IEFDQ19QUklWQVRFKCkpIHx8IG1ldGhvZCAtPiBjb250YWluaW5nX3R5cGUgPT0gZW52aXJv bm1lbnRfdHlwZSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiKCEgbWV0aG9kIC0+IEFDQ19QUklW QVRFKCkpIHx8IG1ldGhvZCAtPiBjb250YWluaW5nX3R5cGUgPT0gZW52aXJvbm1lbnRfdHlwZSIg LCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMjkyMiwgX19QUkVUVFlfRlVOQ1RJT05fXyAp LCAwKSkpIDsKCiAgICAgICAgICAgICAgICBpZiAobWV0aG9kIC0+IEFDQ19TVEFUSUMoKSkKICAg ICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBzeW1ib2wgPSBlbnZpcm9ubWVudF90eXBl IC0+IEdldFJlYWRBY2Nlc3NNZXRob2QobWV0aG9kKTsKICAgICAgICAgICAgICAgIGVsc2UKICAg ICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBBc3RNZXRob2RJbnZvY2F0aW9uICpv bGRfbWV0aG9kX2NhbGwgPSBtZXRob2RfY2FsbDsKCiAgICAgICAgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgQXN0TWV0aG9kSW52b2NhdGlvbiAqbWV0aG9kX2NhbGwgICAgICAgPSBjb21waWxhdGlvbl91 bml0IC0+IGFzdF9wb29sIC0+IEdlbk1ldGhvZEludm9jYXRpb24oKTsKICAgICAgICAgICAgICAg ICAgICBtZXRob2RfY2FsbCAtPiBtZXRob2QgICAgICAgICAgICAgICAgICA9IG9sZF9tZXRob2Rf Y2FsbCAtPiBtZXRob2Q7CiAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4gbGVmdF9w YXJlbnRoZXNpc190b2tlbiAgPSBvbGRfbWV0aG9kX2NhbGwgLT4gbGVmdF9wYXJlbnRoZXNpc190 b2tlbjsKICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiByaWdodF9wYXJlbnRoZXNp c190b2tlbiA9IG9sZF9tZXRob2RfY2FsbCAtPiByaWdodF9wYXJlbnRoZXNpc190b2tlbjsKICAg ICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBzeW1ib2wgICAgICAgICAgICAgICAgICA9 IGVudmlyb25tZW50X3R5cGUgLT4gR2V0UmVhZEFjY2Vzc01ldGhvZChtZXRob2QpOwogICAgICAg ICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IEFkZEFyZ3VtZW50KGZpZWxkX2FjY2VzcyAtPiBi YXNlKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9sZF9tZXRob2Rf Y2FsbCAtPiBOdW1Bcmd1bWVudHMoKTsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICBtZXRo b2RfY2FsbCAtPiBBZGRBcmd1bWVudChvbGRfbWV0aG9kX2NhbGwgLT4gQXJndW1lbnQoaSkpOwoK ICAgICAgICAgICAgICAgICAgICBvbGRfbWV0aG9kX2NhbGwgLT4gc3ltYm9sID0gbWV0aG9kOwog ICAgICAgICAgICAgICAgICAgIG9sZF9tZXRob2RfY2FsbCAtPiByZXNvbHV0aW9uX29wdCA9IG1l dGhvZF9jYWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVs c2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4gc3ltYm9sID0g bWV0aG9kOwogICAgICAgICAgICAgICAgTWVtYmVyQWNjZXNzQ2hlY2soZmllbGRfYWNjZXNzLCB0 eXBlLCBtZXRob2QpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgbWV0aG9k X2NhbGwgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgfQoKICAgIHJldHVybiBtZXRo b2Q7Cn0KCgp2b2lkIFNlbWFudGljOjpQcm9jZXNzTWV0aG9kTmFtZShBc3RNZXRob2RJbnZvY2F0 aW9uICptZXRob2RfY2FsbCkKewogICAgVHlwZVN5bWJvbCAqdGhpc190eXBlID0gVGhpc1R5cGUo KTsKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAg CiAgICAgCiAgICBTeW1ib2xTZXQgKmV4Y2VwdGlvbl9zZXQgPSBUcnlFeGNlcHRpb25UYWJsZVN0 YWNrKCkuVG9wKCk7CiAgICBpZiAoZXhjZXB0aW9uX3NldCkKICAgIHsKICAgICAgICBleGNlcHRp b25fc2V0IC0+IEFkZEVsZW1lbnQoY29udHJvbC5FcnJvcigpKTsKICAgIH0KCiAgICBBc3RTaW1w bGVOYW1lICpzaW1wbGVfbmFtZTsKICAgIGlmICgoc2ltcGxlX25hbWUgPSBtZXRob2RfY2FsbCAt PiBtZXRob2QgLT4gU2ltcGxlTmFtZUNhc3QoKSkpCiAgICB7CiAgICAgICAgU2VtYW50aWNFbnZp cm9ubWVudCAqd2hlcmVfZm91bmQ7CiAgICAgICAgTWV0aG9kU3ltYm9sICptZXRob2QgPSBGaW5k TWV0aG9kSW5FbnZpcm9ubWVudCh3aGVyZV9mb3VuZCwgc3RhdGVfc3RhY2suVG9wKCksIG1ldGhv ZF9jYWxsKTsKCiAgICAgICAgaWYgKCEgbWV0aG9kKQogICAgICAgICAgICBtZXRob2RfY2FsbCAt PiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAg ICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBtZXRob2QgLT4gSXNUeXBlZCgpICkgPyAwIDoJ KF9fYXNzZXJ0X2ZhaWwgKCJtZXRob2QgLT4gSXNUeXBlZCgpIiAsICIuLi8uLi9qaWtlcy9zcmMv ZXhwci5jcHAiLCAyOTg5LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICAg ICAgaWYgKCEgbWV0aG9kIC0+IEFDQ19TVEFUSUMoKSkKICAgICAgICAgICAgewogICAgICAgICAg ICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg IAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIAog ICAgICAgICAgICAgICAgaWYgKFN0YXRpY1JlZ2lvbigpKQogICAgICAgICAgICAgICAgewogICAg ICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6Ok1FVEhPRF9OT1Rf Q0xBU1NfTUVUSE9ELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZV9u YW1lIC0+IGlkZW50aWZpZXJfdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgbWV0aG9kX2NhbGwgLT4gcmlnaHRfcGFyZW50aGVzaXNfdG9rZW4sCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgbGV4X3N0cmVhbSAtPiBOYW1lU3RyaW5nKHNpbXBsZV9uYW1l IC0+IGlkZW50aWZpZXJfdG9rZW4pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg IGVsc2UgaWYgKEV4cGxpY2l0Q29uc3RydWN0b3JJbnZvY2F0aW9uKCkpCiAgICAgICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNfdHlwZSAtPiBJc1N1YmNsYXNzKG1ldGhv ZCAtPiBjb250YWluaW5nX3R5cGUpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6 OklOU1RBTkNFX01FVEhPRF9JTl9FWFBMSUNJVF9DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBMZWZ0VG9r ZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwg LT4gUmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt ZXRob2QgLT4gSGVhZGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IG1ldGhvZCAtPiBjb250YWluaW5nX3R5cGUgLT4gTmFtZSgpKTsKICAgICAgICAgICAgICAgICAg ICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG1ldGhvZF9j YWxsIC0+IHN5bWJvbCA9IG1ldGhvZDsKCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAg ICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHdoZXJlX2ZvdW5kICE9IHN0 YXRlX3N0YWNrLlRvcCgpKQogICAgICAgICAgICAgICAgQ3JlYXRlQWNjZXNzVG9TY29wZWRNZXRo b2QobWV0aG9kX2NhbGwsIHdoZXJlX2ZvdW5kIC0+IFR5cGUoKSk7CiAgICAgICAgfQogICAgfQog ICAgZWxzZQogICAgewogICAgICAgIEFzdEZpZWxkQWNjZXNzICpmaWVsZF9hY2Nlc3MgPSBtZXRo b2RfY2FsbCAtPiBtZXRob2QgLT4gRmllbGRBY2Nlc3NDYXN0KCk7CiAgICAgICAgQXN0RXhwcmVz c2lvbiogYmFzZSA9IGZpZWxkX2FjY2VzcyAtPiBiYXNlOwogICAgICAgIEFzdEZpZWxkQWNjZXNz ICpzdWJfZmllbGRfYWNjZXNzID0gYmFzZSAtPiBGaWVsZEFjY2Vzc0Nhc3QoKTsKCiAgICAgICAg aWYgKGJhc2UgLT4gU2ltcGxlTmFtZUNhc3QoKSB8fCBzdWJfZmllbGRfYWNjZXNzKQogICAgICAg ICAgICBQcm9jZXNzQW1iaWd1b3VzTmFtZShiYXNlKTsKICAgICAgICBlbHNlICAKICAgICAgICAg ICAgUHJvY2Vzc0V4cHJlc3Npb25PclN0cmluZ0NvbnN0YW50KGJhc2UpOwoKICAgICAgICBpZiAo YmFzZSAtPiBzeW1ib2wgPT0gY29udHJvbC5ub190eXBlKQogICAgICAgIHsKICAgICAgICAgICAg bWV0aG9kX2NhbGwgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgICAgICAgICByZXR1 cm47CiAgICAgICAgfQoKICAgICAgICBUeXBlU3ltYm9sICp0eXBlID0gX19udWxsIDsKICAgICAg ICBTeW1ib2wgKnN5bWJvbCA9IGJhc2UgLT4gc3ltYm9sOwoKICAgICAgICAgCiAgICAgICAgIAog ICAgICAgICAKICAgICAgICBpZiAoc3ViX2ZpZWxkX2FjY2VzcyAmJiBzdWJfZmllbGRfYWNjZXNz IC0+IElzU3VwZXJBY2Nlc3MoKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChzdWJfZmllbGRf YWNjZXNzIC0+IFR5cGUoKSA9PSBjb250cm9sLm5vX3R5cGUpCiAgICAgICAgICAgICAgICBtZXRo b2RfY2FsbCAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICAgICAgICAgIGVsc2UgaWYg KHN1Yl9maWVsZF9hY2Nlc3MgLT4gVHlwZSgpID09IGNvbnRyb2wuT2JqZWN0KCkpCiAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6Ok9CSkVD VF9IQVNfTk9fU1VQRVJfVFlQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9m aWVsZF9hY2Nlc3MgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBzdWJfZmllbGRfYWNjZXNzIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHN1Yl9maWVsZF9hY2Nlc3MgLT4gVHlwZSgpIC0+IENvbnRhaW5pbmdQYWNrYWdl KCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9m aWVsZF9hY2Nlc3MgLT4gVHlwZSgpIC0+IEV4dGVybmFsTmFtZSgpKTsKICAgICAgICAgICAgICAg IG1ldGhvZF9jYWxsIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgICAgICAgICAgfQog ICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE1ldGhvZFN5bWJv bCAqbWV0aG9kID0gRmluZE1ldGhvZE1lbWJlcihzdWJfZmllbGRfYWNjZXNzIC0+IFR5cGUoKSAt PiBzdXBlciwgc3ViX2ZpZWxkX2FjY2VzcyAtPiBUeXBlKCksIG1ldGhvZF9jYWxsKTsKICAgICAg ICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBiYXNlID0gQ29udmVydFRvVHlwZShzdWJfZmllbGRf YWNjZXNzLCBzdWJfZmllbGRfYWNjZXNzIC0+IFR5cGUoKSAtPiBzdXBlcik7CgogICAgICAgICAg ICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgIAogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAmJiBtZXRo b2QgLT4gQUNDX0FCU1RSQUNUKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg ICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6QUJTVFJBQ1RfTUVUSE9EX0lOVk9DQVRJ T04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYWNjZXNzIC0+IExl ZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2Vz cyAtPiBpZGVudGlmaWVyX3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGxleF9zdHJlYW0gLT4gTmFtZVN0cmluZyhmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tl bikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVs c2UgaWYgKCh0eXBlID0gc3ltYm9sIC0+IFR5cGVDYXN0KCkpKQogICAgICAgIHsKICAgICAgICAg ICAgaWYgKHR5cGUgLT4gQmFkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAKICAg ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAg ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmIChOdW1FcnJv cnMoKSA9PSAwKQogICAgICAgICAgICAgICAgICAgIFJlcG9ydE1ldGhvZE5vdEZvdW5kKG1ldGhv ZF9jYWxsLCBsZXhfc3RyZWFtIC0+IE5hbWVTdHJpbmcoZmllbGRfYWNjZXNzIC0+IGlkZW50aWZp ZXJfdG9rZW4pKTsKICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IHN5bWJvbCA9IGNvbnRy b2wubm9fdHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IGNv bnRyb2wubnVsbF90eXBlIHx8IHR5cGUgLT4gUHJpbWl0aXZlKCkpCiAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlRZUEVfTk9UX1JFRkVS RU5DRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgLT4gTGVmdFRva2VuKCks CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlIC0+IFJpZ2h0VG9rZW4oKSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgLT4gTmFtZSgpKTsKICAgICAgICAgICAg ICAgIG1ldGhvZF9jYWxsIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgICAgICAgICAg fQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGVBY2Nl c3NDaGVjayhiYXNlLCB0eXBlKTsKCiAgICAgICAgICAgICAgICBNZXRob2RTeW1ib2wgKm1ldGhv ZCA9IEZpbmRNZXRob2RJblR5cGUodHlwZSwgbWV0aG9kX2NhbGwpOwoKICAgICAgICAgICAgICAg IGlmIChtZXRob2QpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgKHN0YXRp Y19jYXN0PHZvaWQ+ICAoKCBtZXRob2QgLT4gSXNUeXBlZCgpICkgPyAwIDoJKF9fYXNzZXJ0X2Zh aWwgKCJtZXRob2QgLT4gSXNUeXBlZCgpIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAz MTIzLCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICAgICAgICAgICAgICBp ZiAoYmFzZSAtPiBJc05hbWUoKSAmJiAoISBtZXRob2QgLT4gQUNDX1NUQVRJQygpKSkKICAgICAg ICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNl bWFudGljRXJyb3I6Ok1FVEhPRF9OT1RfQ0xBU1NfTUVUSE9ELAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gTGVmdFRva2VuKCksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBpZGVudGlmaWVy X3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXhfc3RyZWFt IC0+IE5hbWVTdHJpbmcoZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW4pKTsKICAgICAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiYXNlIC0+IElzU3VwZXJF eHByZXNzaW9uKCkgJiYgbWV0aG9kIC0+IEFDQ19BQlNUUkFDVCgpKQogICAgICAgICAgICAgICAg ICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpBQlNUUkFDVF9NRVRIT0RfSU5W T0NBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYWNj ZXNzIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbiwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbGV4X3N0cmVhbSAtPiBOYW1lU3RyaW5nKGZpZWxkX2FjY2VzcyAt PiBpZGVudGlmaWVyX3Rva2VuKSk7CgogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIGlmICgg dGhpc190eXBlICE9IG1ldGhvZCAtPiBjb250YWluaW5nX3R5cGUgJiYKICAgICAgICAgICAgICAg ICAgICAgICAgIHRoaXNfdHlwZSAtPiBvdXRlcm1vc3RfdHlwZSA9PSB0eXBlIC0+IG91dGVybW9z dF90eXBlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAobWV0aG9kIC0+IEFDQ19QUklWQVRF KCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAobWV0aG9kIC0+IEFDQ19QUk9URUNURUQo KSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdl KCkgIT0gbWV0aG9kIC0+IGNvbnRhaW5pbmdfdHlwZSAtPiBDb250YWluaW5nUGFja2FnZSgpKSkp CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nh c3Q8dm9pZD4gICgoICghIG1ldGhvZCAtPiBBQ0NfUFJJVkFURSgpKSB8fCB0eXBlID09IG1ldGhv ZCAtPiBjb250YWluaW5nX3R5cGUgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoIighIG1ldGhvZCAt PiBBQ0NfUFJJVkFURSgpKSB8fCB0eXBlID09IG1ldGhvZCAtPiBjb250YWluaW5nX3R5cGUiICwg Ii4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDMxNTIsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwg MCkpKSA7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kIC0+IEFDQ19TVEFUSUMo KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IHN5bWJvbCA9IHR5 cGUgLT4gR2V0UmVhZEFjY2Vzc01ldGhvZChtZXRob2QpOwogICAgICAgICAgICAgICAgICAgICAg ICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEFzdE1ldGhvZEludm9jYXRpb24gKm9sZF9tZXRob2RfY2FsbCA9IG1ldGhvZF9jYWxsOwoK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEFzdE1ldGhvZEludm9jYXRpb24gKm1ldGhvZF9jYWxsICAgICAgID0gY29tcGlsYXRpb25f dW5pdCAtPiBhc3RfcG9vbCAtPiBHZW5NZXRob2RJbnZvY2F0aW9uKCk7CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBtZXRob2QgICAgICAgICAgICAgICAgICA9IG9s ZF9tZXRob2RfY2FsbCAtPiBtZXRob2Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRo b2RfY2FsbCAtPiBsZWZ0X3BhcmVudGhlc2lzX3Rva2VuICA9IG9sZF9tZXRob2RfY2FsbCAtPiBs ZWZ0X3BhcmVudGhlc2lzX3Rva2VuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9k X2NhbGwgLT4gcmlnaHRfcGFyZW50aGVzaXNfdG9rZW4gPSBvbGRfbWV0aG9kX2NhbGwgLT4gcmln aHRfcGFyZW50aGVzaXNfdG9rZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Rf Y2FsbCAtPiBzeW1ib2wgICAgICAgICAgICAgICAgICA9IHR5cGUgLT4gR2V0UmVhZEFjY2Vzc01l dGhvZChtZXRob2QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2NhbGwgLT4g QWRkQXJndW1lbnQoZmllbGRfYWNjZXNzIC0+IGJhc2UpOwogICAgICAgICAgICAgICAgICAgICAg ICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRfbWV0aG9kX2NhbGwgLT4gTnVtQXJndW1lbnRz KCk7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBB ZGRBcmd1bWVudChvbGRfbWV0aG9kX2NhbGwgLT4gQXJndW1lbnQoaSkpOwoKICAgICAgICAgICAg ICAgICAgICAgICAgICAgIG9sZF9tZXRob2RfY2FsbCAtPiBzeW1ib2wgPSBtZXRob2Q7CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBvbGRfbWV0aG9kX2NhbGwgLT4gcmVzb2x1dGlvbl9vcHQg PSBtZXRob2RfY2FsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg ICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAg ICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBzeW1ib2wgPSBtZXRob2Q7CiAgICAg ICAgICAgICAgICAgICAgICAgIE1lbWJlckFjY2Vzc0NoZWNrKGZpZWxkX2FjY2VzcywgdHlwZSwg bWV0aG9kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAg ICAgICAgICBlbHNlIG1ldGhvZF9jYWxsIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAg ICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAg ICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICBlbHNlIGlmIChzeW1ib2wgLT4gVmFyaWFi bGVDYXN0KCkpCiAgICAgICAgewogICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIHN5 bWJvbCAtPiBWYXJpYWJsZUNhc3QoKSAtPiBJc1R5cGVkKCkgKSA/IDAgOgkoX19hc3NlcnRfZmFp bCAoInN5bWJvbCAtPiBWYXJpYWJsZUNhc3QoKSAtPiBJc1R5cGVkKCkiICwgIi4uLy4uL2ppa2Vz L3NyYy9leHByLmNwcCIsIDMxOTMsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAg ICAgICAgICB0eXBlID0gc3ltYm9sIC0+IFZhcmlhYmxlQ2FzdCgpIC0+IFR5cGUoKTsKCiAgICAg ICAgICAgICh2b2lkKSBGaW5kTWV0aG9kTWVtYmVyKHR5cGUsIHR5cGUsIG1ldGhvZF9jYWxsKTsK ICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc3ltYm9sIC0+IE1ldGhvZENhc3QoKSkKICAgICAg ICB7CiAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggc3ltYm9sIC0+IE1ldGhvZENh c3QoKSAtPiBJc1R5cGVkKCkgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInN5bWJvbCAtPiBNZXRo b2RDYXN0KCkgLT4gSXNUeXBlZCgpIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAzMjAx LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICAgICAgdHlwZSA9IHN5bWJv bCAtPiBNZXRob2RDYXN0KCkgLT4gVHlwZSgpOwoKICAgICAgICAgICAgKHZvaWQpIEZpbmRNZXRo b2RNZW1iZXIodHlwZSwgdHlwZSwgbWV0aG9kX2NhbGwpOwogICAgICAgIH0KICAgICAgICBlbHNl ICAKICAgICAgICB7CiAgICAgICAgICAgIFBhY2thZ2VTeW1ib2wgKnBhY2thZ2UgPSBzeW1ib2wg LT4gUGFja2FnZUNhc3QoKTsKICAgICAgICAgICAgTmFtZVN5bWJvbCAqbmFtZV9zeW1ib2wgPSBs ZXhfc3RyZWFtIC0+IE5hbWVTeW1ib2woZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW4p OwoKICAgICAgICAgICAgaWYgKHBhY2thZ2UgJiYgKHBhY2thZ2UgLT4gRmluZFR5cGVTeW1ib2wo bmFtZV9zeW1ib2wpIHx8IENvbnRyb2w6OkdldEZpbGUoY29udHJvbCwgcGFja2FnZSwgbmFtZV9z eW1ib2wpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2Vt YW50aWNFcnJvcjo6VFlQRV9OT1RfTUVUSE9ELAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW4sCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gaWRlbnRpZmllcl90b2tlbiwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG5hbWVfc3ltYm9sIC0+IE5hbWUoKSk7CiAgICAgICAgICAgIH0K ICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSZXBvcnRTZW1F cnJvcihTZW1hbnRpY0Vycm9yOjpVTktOT1dOX1FVQUxJRklFRF9OQU1FX0JBU0UsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9hY2Nlc3MgLT4gYmFzZSAtPiBMZWZ0VG9rZW4o KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2FjY2VzcyAtPiBiYXNlIC0+ IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCAtPiBO YW1lKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IHN5bWJvbCA9 IGNvbnRyb2wubm9fdHlwZTsKICAgICAgICB9CgogICAgICAgIGlmICh0eXBlKQogICAgICAgIHsK ICAgICAgICAgICAgVHlwZVN5bWJvbCAqcGFyZW50X3R5cGUgPSAodHlwZSAtPiBJc0FycmF5KCkg PyB0eXBlIC0+IGJhc2VfdHlwZSA6IHR5cGUpOwogICAgICAgICAgICBpZiAoISBwYXJlbnRfdHlw ZSAtPiBQcmltaXRpdmUoKSkKICAgICAgICAgICAgICAgIEFkZERlcGVuZGVuY2UodGhpc190eXBl LCBwYXJlbnRfdHlwZSwgZmllbGRfYWNjZXNzIC0+IGlkZW50aWZpZXJfdG9rZW4pOwogICAgICAg IH0KICAgIH0KCiAgICBpZiAobWV0aG9kX2NhbGwgLT4gc3ltYm9sICE9IGNvbnRyb2wubm9fdHlw ZSkKICAgIHsKICAgICAgICBNZXRob2RTeW1ib2wgKm1ldGhvZCA9IChNZXRob2RTeW1ib2wgKikg bWV0aG9kX2NhbGwgLT4gc3ltYm9sOwoKICAgICAgICBpZiAoZXhjZXB0aW9uX3NldCkKICAgICAg ICB7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSBtZXRob2QgLT4gTnVtVGhyb3dzKCkgLSAxOyBp ID49IDA7IGktLSkKICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9zZXQgLT4gQWRkRWxlbWVudCht ZXRob2QgLT4gVGhyb3dzKGkpKTsKCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAg ICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoISBtZXRo b2QgLT4gQUNDX1NUQVRJQygpKQogICAgICAgICAgICAgICAgZXhjZXB0aW9uX3NldCAtPiBBZGRF bGVtZW50KGNvbnRyb2wuUnVudGltZUV4Y2VwdGlvbigpKTsKCiAgICAgICAgICAgICAKICAgICAg ICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAg ICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAg ICAgICAKICAgICAgICB9CgogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAK ICAgICAgICBpZiAoISAodGhpc190eXBlIC0+IEFub255bW91cygpICYmIFRoaXNNZXRob2QoKSAm JiBUaGlzTWV0aG9kKCkgLT4gSWRlbnRpdHkoKSA9PSBjb250cm9sLmJsb2NrX2luaXRfbmFtZV9z eW1ib2wpKQogICAgICAgIHsKICAgICAgICAgICAgZm9yIChpbnQgayA9IG1ldGhvZCAtPiBOdW1U aHJvd3MoKSAtIDE7IGsgPj0gMDsgay0tKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBU eXBlU3ltYm9sICpleGNlcHRpb24gPSBtZXRob2QgLT4gVGhyb3dzKGspOwogICAgICAgICAgICAg ICAgaWYgKCEgQ2F0Y2hhYmxlRXhjZXB0aW9uKGV4Y2VwdGlvbikpCiAgICAgICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VU5DQVRD SEFCTEVfTUVUSE9EX1RIUk9XTl9DSEVDS0VEX0VYQ0VQVElPTiwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RfY2FsbCAtPiBSaWdodFRva2VuKCksCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kIC0+IEhlYWRlcigpLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiAtPiBDb250YWluaW5nUGFja2Fn ZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ZXhjZXB0aW9uIC0+IEV4dGVybmFsTmFtZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAg ICAgfQogICAgICAgIH0KCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgbWV0 aG9kX2NhbGwgPSAobWV0aG9kX2NhbGwgLT4gcmVzb2x1dGlvbl9vcHQgPyAoQXN0TWV0aG9kSW52 b2NhdGlvbiAqKSBtZXRob2RfY2FsbCAtPiByZXNvbHV0aW9uX29wdCA6IG1ldGhvZF9jYWxsKTsK ICAgICAgICBtZXRob2QgPSAoTWV0aG9kU3ltYm9sICopIG1ldGhvZF9jYWxsIC0+IHN5bWJvbDsK CiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBtZXRob2RfY2FsbCAtPiBOdW1Bcmd1bWVu dHMoKSA9PSBtZXRob2QgLT4gTnVtRm9ybWFsUGFyYW1ldGVycygpICkgPyAwIDoJKF9fYXNzZXJ0 X2ZhaWwgKCJtZXRob2RfY2FsbCAtPiBOdW1Bcmd1bWVudHMoKSA9PSBtZXRob2QgLT4gTnVtRm9y bWFsUGFyYW1ldGVycygpIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAzMjkzLCBfX1BS RVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1l dGhvZF9jYWxsIC0+IE51bUFyZ3VtZW50cygpOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBB c3RFeHByZXNzaW9uICpleHByID0gbWV0aG9kX2NhbGwgLT4gQXJndW1lbnQoaSk7CiAgICAgICAg ICAgIGlmIChleHByIC0+IFR5cGUoKSAhPSBtZXRob2QgLT4gRm9ybWFsUGFyYW1ldGVyKGkpIC0+ IFR5cGUoKSkKICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsIC0+IEFyZ3VtZW50KGkpID0gQ29u dmVydFRvVHlwZShleHByLCBtZXRob2QgLT4gRm9ybWFsUGFyYW1ldGVyKGkpIC0+IFR5cGUoKSk7 CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKCnZvaWQgU2VtYW50aWM6OlByb2Nlc3NN ZXRob2RJbnZvY2F0aW9uKEFzdCAqZXhwcikKewogICAgQXN0TWV0aG9kSW52b2NhdGlvbiAqbWV0 aG9kX2NhbGwgPSAoQXN0TWV0aG9kSW52b2NhdGlvbiAqKSBleHByOwoKICAgIGJvb2wgbm9fYmFk X2FyZ3VtZW50ID0gdHJ1ZTsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZF9jYWxsIC0+ IE51bUFyZ3VtZW50cygpOyBpKyspCiAgICB7CiAgICAgICAgQXN0RXhwcmVzc2lvbiAqZXhwciA9 IG1ldGhvZF9jYWxsIC0+IEFyZ3VtZW50KGkpOwogICAgICAgIFByb2Nlc3NFeHByZXNzaW9uT3JT dHJpbmdDb25zdGFudChleHByKTsKICAgICAgICBub19iYWRfYXJndW1lbnQgPSBub19iYWRfYXJn dW1lbnQgJiYgKGV4cHIgLT4gc3ltYm9sICE9IGNvbnRyb2wubm9fdHlwZSk7CiAgICB9CgogICAg aWYgKG5vX2JhZF9hcmd1bWVudCkKICAgICAgICAgUHJvY2Vzc01ldGhvZE5hbWUobWV0aG9kX2Nh bGwpOwogICAgZWxzZSBtZXRob2RfY2FsbCAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7Cgog ICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBtZXRob2RfY2FsbCAtPiBzeW1ib2wgPT0gY29udHJv bC5ub190eXBlIHx8ICgoTWV0aG9kU3ltYm9sICopIG1ldGhvZF9jYWxsIC0+IHN5bWJvbCkgLT4g SXNUeXBlZCgpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJtZXRob2RfY2FsbCAtPiBzeW1ib2wg PT0gY29udHJvbC5ub190eXBlIHx8ICgoTWV0aG9kU3ltYm9sICopIG1ldGhvZF9jYWxsIC0+IHN5 bWJvbCkgLT4gSXNUeXBlZCgpIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAzMzI0LCBf X1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgIHJldHVybjsKfQoKCnZvaWQgU2VtYW50 aWM6OlByb2Nlc3NOdWxsTGl0ZXJhbChBc3QgKmV4cHIpCnsKICAgICAKICAgICAKICAgICAKICAg IEFzdE51bGxMaXRlcmFsICpudWxsX2xpdGVyYWwgPSAoQXN0TnVsbExpdGVyYWwgKikgZXhwcjsK ICAgIG51bGxfbGl0ZXJhbCAtPiBzeW1ib2wgPSBjb250cm9sLm51bGxfdHlwZTsKCiAgICByZXR1 cm47Cn0KCgp2b2lkIFNlbWFudGljOjpQcm9jZXNzVGhpc0V4cHJlc3Npb24oQXN0ICpleHByKQp7 CiAgICBBc3RUaGlzRXhwcmVzc2lvbiAqdGhpc19leHByZXNzaW9uID0gKEFzdFRoaXNFeHByZXNz aW9uICopIGV4cHI7CgogICAgaWYgKFN0YXRpY1JlZ2lvbigpKQogICAgewogICAgICAgIFJlcG9y dFNlbUVycm9yKFNlbWFudGljRXJyb3I6Ok1JU1BMQUNFRF9USElTX0VYUFJFU1NJT04sCiAgICAg ICAgICAgICAgICAgICAgICAgdGhpc19leHByZXNzaW9uIC0+IExlZnRUb2tlbigpLAogICAgICAg ICAgICAgICAgICAgICAgIHRoaXNfZXhwcmVzc2lvbiAtPiBSaWdodFRva2VuKCkpOwogICAgICAg IHRoaXNfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICB9CiAgICBl bHNlIGlmIChFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigpKQogICAgewogICAgICAgIFJl cG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlRISVNfSU5fRVhQTElDSVRfQ09OU1RSVUNUT1Jf SU5WT0NBVElPTiwKICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2V4cHJlc3Npb24gLT4gTGVm dFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgdGhpc19leHByZXNzaW9uIC0+IFJpZ2h0 VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICBsZXhfc3RyZWFtIC0+IE5hbWVTdHJpbmco dGhpc19leHByZXNzaW9uIC0+IHRoaXNfdG9rZW4pKTsKICAgICAgICB0aGlzX2V4cHJlc3Npb24g LT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgfQogICAgZWxzZSB0aGlzX2V4cHJlc3Np b24gLT4gc3ltYm9sID0gVGhpc1R5cGUoKTsKCiAgICByZXR1cm47Cn0KCgp2b2lkIFNlbWFudGlj OjpQcm9jZXNzU3VwZXJFeHByZXNzaW9uKEFzdCAqZXhwcikKewogICAgQXN0U3VwZXJFeHByZXNz aW9uICpzdXBlcl9leHByZXNzaW9uID0gKEFzdFN1cGVyRXhwcmVzc2lvbiAqKSBleHByOwoKICAg IGlmIChTdGF0aWNSZWdpb24oKSB8fCBUaGlzVHlwZSgpID09IGNvbnRyb2wuT2JqZWN0KCkpCiAg ICB7CiAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6Ok1JU1BMQUNFRF9TVVBF Ul9FWFBSRVNTSU9OLAogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcl9leHByZXNzaW9uIC0+ IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcl9leHByZXNzaW9uIC0+ IFJpZ2h0VG9rZW4oKSk7CiAgICAgICAgIHN1cGVyX2V4cHJlc3Npb24gLT4gc3ltYm9sID0gY29u dHJvbC5ub190eXBlOwogICAgfQogICAgZWxzZSBpZiAoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9j YXRpb24oKSkKICAgIHsKICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpTVVBF Ul9JTl9FWFBMSUNJVF9DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OLAogICAgICAgICAgICAgICAgICAg ICAgIHN1cGVyX2V4cHJlc3Npb24gLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAg ICAgc3VwZXJfZXhwcmVzc2lvbiAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAg ICAgbGV4X3N0cmVhbSAtPiBOYW1lU3RyaW5nKHN1cGVyX2V4cHJlc3Npb24gLT4gc3VwZXJfdG9r ZW4pKTsKICAgICAgICAgc3VwZXJfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5 cGU7CiAgICB9CiAgICBlbHNlIHN1cGVyX2V4cHJlc3Npb24gLT4gc3ltYm9sID0gVGhpc1R5cGUo KSAtPiBzdXBlcjsKfQoKCnZvaWQgU2VtYW50aWM6OlByb2Nlc3NQYXJlbnRoZXNpemVkRXhwcmVz c2lvbihBc3QgKmV4cHIpCnsKICAgIEFzdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uICpwYXJlbnRo ZXNpemVkID0gKEFzdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uICopIGV4cHI7CgogICAgIAogICAg IAogICAgIAogICAgIAogICAgUHJvY2Vzc0V4cHJlc3Npb24ocGFyZW50aGVzaXplZCAtPiBleHBy ZXNzaW9uKTsKICAgIHBhcmVudGhlc2l6ZWQgLT4gdmFsdWUgPSBwYXJlbnRoZXNpemVkIC0+IGV4 cHJlc3Npb24gLT4gdmFsdWU7CiAgICBwYXJlbnRoZXNpemVkIC0+IHN5bWJvbCA9IHBhcmVudGhl c2l6ZWQgLT4gZXhwcmVzc2lvbiAtPiBzeW1ib2w7Cn0KCgp2b2lkIFNlbWFudGljOjpVcGRhdGVH ZW5lcmF0ZWRMb2NhbENvbnN0cnVjdG9yKE1ldGhvZFN5bWJvbCAqY29uc3RydWN0b3IpCnsKICAg IFR5cGVTeW1ib2wgKmxvY2FsX3R5cGUgPSBjb25zdHJ1Y3RvciAtPiBjb250YWluaW5nX3R5cGU7 CiAgICBNZXRob2RTeW1ib2wgKmxvY2FsX2NvbnN0cnVjdG9yID0gY29uc3RydWN0b3IgLT4gTG9j YWxDb25zdHJ1Y3RvcigpOwoKICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggbG9jYWxfY29uc3Ry dWN0b3IgLT4gSXNHZW5lcmF0ZWRMb2NhbENvbnN0cnVjdG9yKCkgKSA/IDAgOgkoX19hc3NlcnRf ZmFpbCAoImxvY2FsX2NvbnN0cnVjdG9yIC0+IElzR2VuZXJhdGVkTG9jYWxDb25zdHJ1Y3Rvcigp IiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAzNDA5LCBfX1BSRVRUWV9GVU5DVElPTl9f ICksIDApKSkgOwoKICAgIEJsb2NrU3ltYm9sICpibG9ja19zeW1ib2wgPSBsb2NhbF9jb25zdHJ1 Y3RvciAtPiBibG9ja19zeW1ib2w7CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25zdHJ1Y3Rv ciAtPiBOdW1Gb3JtYWxQYXJhbWV0ZXJzKCk7IGkrKykKICAgIHsKICAgICAgICBWYXJpYWJsZVN5 bWJvbCAqcGFyYW0gPSBjb25zdHJ1Y3RvciAtPiBGb3JtYWxQYXJhbWV0ZXIoaSksCiAgICAgICAg ICAgICAgICAgICAgICAgKnN5bWJvbCA9IGJsb2NrX3N5bWJvbCAtPiBGaW5kVmFyaWFibGVTeW1i b2wocGFyYW0gLT4gSWRlbnRpdHkoKSk7CgogICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCgg c3ltYm9sICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJzeW1ib2wiICwgIi4uLy4uL2ppa2VzL3Ny Yy9leHByLmNwcCIsIDM0MTgsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgICAg IHN5bWJvbCAtPiBTZXRFeHRlcm5hbElkZW50aXR5KHBhcmFtIC0+IEV4dGVybmFsSWRlbnRpdHko KSk7ICAKICAgICAgICBzeW1ib2wgLT4gU2V0TG9jYWxWYXJpYWJsZUluZGV4KGJsb2NrX3N5bWJv bCAtPiBtYXhfdmFyaWFibGVfaW5kZXgrKyk7CiAgICAgICAgaWYgKGNvbnRyb2wuSXNEb3VibGVX b3JkVHlwZShzeW1ib2wgLT4gVHlwZSgpKSkKICAgICAgICAgICAgYmxvY2tfc3ltYm9sIC0+IG1h eF92YXJpYWJsZV9pbmRleCsrOwogICAgICAgIGxvY2FsX2NvbnN0cnVjdG9yIC0+IEFkZEZvcm1h bFBhcmFtZXRlcihzeW1ib2wpOwogICAgfQoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAK ICAgICAKICAgIFZhcmlhYmxlU3ltYm9sICpzdXBlcl90aGlzMF92YXJpYWJsZSA9IGJsb2NrX3N5 bWJvbCAtPiBGaW5kVmFyaWFibGVTeW1ib2woY29udHJvbC5NYWtlUGFyYW1ldGVyKDApKTsKICAg IGlmIChzdXBlcl90aGlzMF92YXJpYWJsZSkKICAgIHsKICAgICAgICBzdXBlcl90aGlzMF92YXJp YWJsZSAtPiBTZXRMb2NhbFZhcmlhYmxlSW5kZXgoYmxvY2tfc3ltYm9sIC0+IG1heF92YXJpYWJs ZV9pbmRleCsrKTsKICAgICAgICBsb2NhbF9jb25zdHJ1Y3RvciAtPiBBZGRGb3JtYWxQYXJhbWV0 ZXIoc3VwZXJfdGhpczBfdmFyaWFibGUpOwogICAgfQogICAgbG9jYWxfY29uc3RydWN0b3IgLT4g U2V0U2lnbmF0dXJlKGNvbnRyb2wpOwoKICAgICAKICAgICAKICAgICAKICAgIEFzdENvbnN0cnVj dG9yRGVjbGFyYXRpb24gKmNvbnN0cnVjdG9yX2RlY2xhcmF0aW9uID0gKEFzdENvbnN0cnVjdG9y RGVjbGFyYXRpb24gKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3RydWN0b3IgLT4gbWV0aG9kX29yX2NvbnN0cnVjdG9yX2RlY2xh cmF0aW9uOwoKICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggY29uc3RydWN0b3JfZGVjbGFyYXRp b24gLT4gQ29uc3RydWN0b3JEZWNsYXJhdGlvbkNhc3QoKSApID8gMCA6CShfX2Fzc2VydF9mYWls ICgiY29uc3RydWN0b3JfZGVjbGFyYXRpb24gLT4gQ29uc3RydWN0b3JEZWNsYXJhdGlvbkNhc3Qo KSIgLCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMzQ0NywgX19QUkVUVFlfRlVOQ1RJT05f XyApLCAwKSkpIDsKCiAgICBBc3RDb25zdHJ1Y3RvckJsb2NrICpjb25zdHJ1Y3Rvcl9ibG9jayA9 IGNvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIC0+IGNvbnN0cnVjdG9yX2JvZHk7CgogICAgaWYgKCEg KGNvbnN0cnVjdG9yX2Jsb2NrIC0+IGV4cGxpY2l0X2NvbnN0cnVjdG9yX2ludm9jYXRpb25fb3B0 ICYmCiAgICAgICAgICAgY29uc3RydWN0b3JfYmxvY2sgLT4gZXhwbGljaXRfY29uc3RydWN0b3Jf aW52b2NhdGlvbl9vcHQgLT4gVGhpc0NhbGxDYXN0KCkpKQogICAgewogICAgICAgIGNvbnN0cnVj dG9yX2Jsb2NrIC0+IEFsbG9jYXRlTG9jYWxJbml0U3RhdGVtZW50cyhsb2NhbF90eXBlIC0+IE51 bUNvbnN0cnVjdG9yUGFyYW1ldGVycygpKTsKCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAg CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgZm9yIChpbnQgaSA9IChsb2Nh bF90eXBlIC0+IEFDQ19TVEFUSUMoKSA/IDAgOiAxKTsgaSA8IGxvY2FsX3R5cGUgLT4gTnVtQ29u c3RydWN0b3JQYXJhbWV0ZXJzKCk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIFZhcmlhYmxl U3ltYm9sICpwYXJhbSA9IGxvY2FsX3R5cGUgLT4gQ29uc3RydWN0b3JQYXJhbWV0ZXIoaSksCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICpzeW1ib2wgPSBibG9ja19zeW1ib2wgLT4gRmluZFZh cmlhYmxlU3ltYm9sKHBhcmFtIC0+IElkZW50aXR5KCkpOwoKICAgICAgICAgICAgKHN0YXRpY19j YXN0PHZvaWQ+ICAoKCBzeW1ib2wgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInN5bWJvbCIgLCAi Li4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMzQ2NywgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAw KSkpIDsKCiAgICAgICAgICAgIEFzdFNpbXBsZU5hbWUgKmxocyA9IGNvbXBpbGF0aW9uX3VuaXQg LT4gYXN0X3Bvb2wgLT4gR2VuU2ltcGxlTmFtZShjb25zdHJ1Y3Rvcl9ibG9jayAtPiBsZWZ0X2Jy YWNlX3Rva2VuKTsKICAgICAgICAgICAgbGhzIC0+IHN5bWJvbCA9IHBhcmFtOwoKICAgICAgICAg ICAgQXN0U2ltcGxlTmFtZSAqcmhzID0gY29tcGlsYXRpb25fdW5pdCAtPiBhc3RfcG9vbCAtPiBH ZW5TaW1wbGVOYW1lKGNvbnN0cnVjdG9yX2Jsb2NrIC0+IGxlZnRfYnJhY2VfdG9rZW4pOwogICAg ICAgICAgICByaHMgLT4gc3ltYm9sID0gc3ltYm9sOwoKICAgICAgICAgICAgQXN0QXNzaWdubWVu dEV4cHJlc3Npb24gKmFzc2lnbiA9IGNvbXBpbGF0aW9uX3VuaXQgLT4gYXN0X3Bvb2wKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg LT4gR2VuQXNzaWdubWVudEV4cHJlc3Npb24oQXN0QXNzaWdubWVudEV4cHJlc3Npb246OlNJTVBM RV9FUVVBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3JfYmxv Y2sgLT4gbGVmdF9icmFjZV90b2tlbik7CiAgICAgICAgICAgIGFzc2lnbiAtPiBsZWZ0X2hhbmRf c2lkZSA9IGxoczsKICAgICAgICAgICAgYXNzaWduIC0+IGV4cHJlc3Npb24gICAgID0gcmhzOwog ICAgICAgICAgICBhc3NpZ24gLT4gc3ltYm9sICAgICAgICAgPSBsaHMgLT4gVHlwZSgpOwoKICAg ICAgICAgICAgQXN0RXhwcmVzc2lvblN0YXRlbWVudCAqc3RtdCA9IGNvbXBpbGF0aW9uX3VuaXQg LT4gYXN0X3Bvb2wgLT4gR2VuRXhwcmVzc2lvblN0YXRlbWVudCgpOwogICAgICAgICAgICBzdG10 IC0+IGV4cHJlc3Npb24gICAgICAgICAgID0gYXNzaWduOwogICAgICAgICAgICBzdG10IC0+IHNl bWljb2xvbl90b2tlbl9vcHQgID0gY29uc3RydWN0b3JfYmxvY2sgLT4gbGVmdF9icmFjZV90b2tl bjsKCiAgICAgICAgICAgIHN0bXQgLT4gaXNfcmVhY2hhYmxlID0gdHJ1ZTsKICAgICAgICAgICAg c3RtdCAtPiBjYW5fY29tcGxldGVfbm9ybWFsbHkgPSB0cnVlOwoKICAgICAgICAgICAgY29uc3Ry dWN0b3JfYmxvY2sgLT4gQWRkTG9jYWxJbml0U3RhdGVtZW50KHN0bXQpOwogICAgICAgIH0KICAg IH0KCiAgICAgCiAgICAgCiAgICAgCiAgICBBc3RTaW1wbGVOYW1lICpzaW1wbGVfbmFtZSA9IGNv bXBpbGF0aW9uX3VuaXQgLT4gYXN0X3Bvb2wgLT4gR2VuU2ltcGxlTmFtZShjb25zdHJ1Y3Rvcl9i bG9jayAtPiBsZWZ0X2JyYWNlX3Rva2VuKTsKICAgIHNpbXBsZV9uYW1lIC0+IHN5bWJvbCA9IGNv bnN0cnVjdG9yOwoKICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggISBjb25zdHJ1Y3RvciAtPiBJ c0dlbmVyYXRlZExvY2FsQ29uc3RydWN0b3IoKSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiISBj b25zdHJ1Y3RvciAtPiBJc0dlbmVyYXRlZExvY2FsQ29uc3RydWN0b3IoKSIgLCAiLi4vLi4vamlr ZXMvc3JjL2V4cHIuY3BwIiwgMzQ5OSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAg ICBBc3RNZXRob2RJbnZvY2F0aW9uICptZXRob2RfY2FsbCAgICAgICA9IGNvbXBpbGF0aW9uX3Vu aXQgLT4gYXN0X3Bvb2wgLT4gR2VuTWV0aG9kSW52b2NhdGlvbigpOwogICAgbWV0aG9kX2NhbGwg LT4gbWV0aG9kICAgICAgICAgICAgICAgICAgPSBzaW1wbGVfbmFtZTsKICAgIG1ldGhvZF9jYWxs IC0+IGxlZnRfcGFyZW50aGVzaXNfdG9rZW4gID0gY29uc3RydWN0b3JfYmxvY2sgLT4gbGVmdF9i cmFjZV90b2tlbjsKICAgIG1ldGhvZF9jYWxsIC0+IHJpZ2h0X3BhcmVudGhlc2lzX3Rva2VuID0g Y29uc3RydWN0b3JfYmxvY2sgLT4gbGVmdF9icmFjZV90b2tlbjsKICAgIG1ldGhvZF9jYWxsIC0+ IHN5bWJvbCAgICAgICAgICAgICAgICAgID0gc2ltcGxlX25hbWUgLT4gc3ltYm9sOwoKICAgIG1l dGhvZF9jYWxsIC0+IEFsbG9jYXRlQXJndW1lbnRzKGNvbnN0cnVjdG9yIC0+IE51bUZvcm1hbFBh cmFtZXRlcnMoKSArIDEpOwogICAgaWYgKCEgbG9jYWxfdHlwZSAtPiBBQ0NfU1RBVElDKCkpCiAg ICB7CiAgICAgICAgQXN0U2ltcGxlTmFtZSAqc2ltcGxlX25hbWUgPSBjb21waWxhdGlvbl91bml0 IC0+IGFzdF9wb29sIC0+IEdlblNpbXBsZU5hbWUoY29uc3RydWN0b3JfYmxvY2sgLT4gbGVmdF9i cmFjZV90b2tlbik7CiAgICAgICAgc2ltcGxlX25hbWUgLT4gc3ltYm9sID0gYmxvY2tfc3ltYm9s IC0+IEZpbmRWYXJpYWJsZVN5bWJvbChjb250cm9sLnRoaXMwX25hbWVfc3ltYm9sKTsKCiAgICAg ICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBzaW1wbGVfbmFtZSAtPiBzeW1ib2wgKSA/IDAgOgko X19hc3NlcnRfZmFpbCAoInNpbXBsZV9uYW1lIC0+IHN5bWJvbCIgLCAiLi4vLi4vamlrZXMvc3Jj L2V4cHIuY3BwIiwgMzUxMywgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICAgICAg bWV0aG9kX2NhbGwgLT4gQWRkQXJndW1lbnQoc2ltcGxlX25hbWUpOwogICAgfQoKICAgIGZvciAo aW50IGsgPSAwOyBrIDwgY29uc3RydWN0b3IgLT4gTnVtRm9ybWFsUGFyYW1ldGVycygpOyBrKysp CiAgICB7CiAgICAgICAgVmFyaWFibGVTeW1ib2wgKnBhcmFtID0gY29uc3RydWN0b3IgLT4gRm9y bWFsUGFyYW1ldGVyKGspLAogICAgICAgICAgICAgICAgICAgICAgICpzeW1ib2wgPSBibG9ja19z eW1ib2wgLT4gRmluZFZhcmlhYmxlU3ltYm9sKHBhcmFtIC0+IElkZW50aXR5KCkpOwogICAgICAg IEFzdFNpbXBsZU5hbWUgKnNpbXBsZV9uYW1lID0gY29tcGlsYXRpb25fdW5pdCAtPiBhc3RfcG9v bCAtPiBHZW5TaW1wbGVOYW1lKGNvbnN0cnVjdG9yX2Jsb2NrIC0+IGxlZnRfYnJhY2VfdG9rZW4p OwogICAgICAgIHNpbXBsZV9uYW1lIC0+IHN5bWJvbCA9IHN5bWJvbDsKICAgICAgICBtZXRob2Rf Y2FsbCAtPiBBZGRBcmd1bWVudChzaW1wbGVfbmFtZSk7CiAgICB9CgogICAgQXN0RXhwcmVzc2lv blN0YXRlbWVudCAqc3RtdCAgPSBjb21waWxhdGlvbl91bml0IC0+IGFzdF9wb29sIC0+IEdlbkV4 cHJlc3Npb25TdGF0ZW1lbnQoKTsKICAgIHN0bXQgLT4gZXhwcmVzc2lvbiAgICAgICAgICAgID0g bWV0aG9kX2NhbGw7CiAgICBzdG10IC0+IHNlbWljb2xvbl90b2tlbl9vcHQgICA9IGNvbnN0cnVj dG9yX2Jsb2NrIC0+IGxlZnRfYnJhY2VfdG9rZW47CgogICAgc3RtdCAtPiBpc19yZWFjaGFibGUg ICAgICAgICAgPSB0cnVlOwogICAgc3RtdCAtPiBjYW5fY29tcGxldGVfbm9ybWFsbHkgPSB0cnVl OwoKICAgIGNvbnN0cnVjdG9yX2Jsb2NrIC0+IG9yaWdpbmFsX2NvbnN0cnVjdG9yX2ludm9jYXRp b24gPSBzdG10OwoKICAgIHJldHVybjsKfQoKCnZvaWQgU2VtYW50aWM6OlVwZGF0ZUxvY2FsQ29u c3RydWN0b3JzKFR5cGVTeW1ib2wgKmlubmVyX3R5cGUpCnsKICAgIGlmICghIFRoaXNUeXBlKCkg LT4gSXNMb2NhbCgpKSAgCiAgICB7CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAg ICAgIAogICAgICAgIFR1cGxlPFR5cGVTeW1ib2wgKj4gbG9jYWxfY2xhc3Nlcyg4KTsKCiAgICAg ICAgVHlwZVN5bWJvbCAqb3V0ZXJtb3N0X3R5cGUgPSBpbm5lcl90eXBlIC0+IG91dGVybW9zdF90 eXBlOwogICAgICAgIGlmIChvdXRlcm1vc3RfdHlwZSAtPiBsb2NhbCkgIAogICAgICAgIHsKICAg ICAgICAgICAgZm9yIChUeXBlU3ltYm9sICpsb2NhbF90eXBlID0gKFR5cGVTeW1ib2wgKikgb3V0 ZXJtb3N0X3R5cGUgLT4gbG9jYWwgLT4gRmlyc3RFbGVtZW50KCk7CiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgbG9jYWxfdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2Nh bF90eXBlID0gKFR5cGVTeW1ib2wgKikgb3V0ZXJtb3N0X3R5cGUgLT4gbG9jYWwgLT4gTmV4dEVs ZW1lbnQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGxvY2FsX3R5cGUgLT4g Q2FuQWNjZXNzKGlubmVyX3R5cGUpKQogICAgICAgICAgICAgICAgICAgIGxvY2FsX2NsYXNzZXMu TmV4dCgpID0gbG9jYWxfdHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9y IChpbnQgaiA9IDA7IGogPCBvdXRlcm1vc3RfdHlwZSAtPiBudW1fYW5vbnltb3VzX3R5cGVzKCk7 IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChvdXRlcm1vc3RfdHlwZSAtPiBBbm9ueW1v dXNUeXBlKGopIC0+IENhbkFjY2Vzcyhpbm5lcl90eXBlKSkKICAgICAgICAgICAgICAgIGxvY2Fs X2NsYXNzZXMuTmV4dCgpID0gb3V0ZXJtb3N0X3R5cGUgLT4gQW5vbnltb3VzVHlwZShqKTsKICAg ICAgICB9CgogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAg CiAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBsb2NhbF9jbGFzc2VzLkxlbmd0aCgpOyBrKysp CiAgICAgICAgewogICAgICAgICAgICBUeXBlU3ltYm9sICp0YXJnZXRfbG9jYWxfdHlwZSA9IGxv Y2FsX2NsYXNzZXNba107CgogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldF9s b2NhbF90eXBlIC0+IE51bUxvY2FsQ29uc3RydWN0b3JDYWxsRW52aXJvbm1lbnRzKCk7IGkrKykK ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgU2VtYW50aWNFbnZpcm9ubWVudCAqZW52ID0g dGFyZ2V0X2xvY2FsX3R5cGUgLT4gTG9jYWxDb25zdHJ1Y3RvckNhbGxFbnZpcm9ubWVudChpKTsK ICAgICAgICAgICAgICAgIFR5cGVTeW1ib2wgKnNvdXJjZV9sb2NhbF90eXBlID0gZW52IC0+IFR5 cGUoKTsKICAgICAgICAgICAgICAgIGlmICghIHNvdXJjZV9sb2NhbF90eXBlIC0+IENhbkFjY2Vz cyh0YXJnZXRfbG9jYWxfdHlwZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg ICAgZm9yIChpbnQgaiA9ICh0YXJnZXRfbG9jYWxfdHlwZSAtPiBBQ0NfU1RBVElDKCkgPyAwIDog MSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBqIDwgdGFyZ2V0X2xvY2FsX3R5cGUgLT4gTnVt Q29uc3RydWN0b3JQYXJhbWV0ZXJzKCk7IGorKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAg ICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3ltYm9sICpsb2NhbCA9IHRhcmdldF9sb2NhbF90 eXBlIC0+IENvbnN0cnVjdG9yUGFyYW1ldGVyKGopIC0+IGFjY2Vzc2VkX2xvY2FsOwoKICAgICAg ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnYgLT4gc3ltYm9sX3RhYmxl LkZpbmRWYXJpYWJsZVN5bWJvbChsb2NhbCAtPiBJZGVudGl0eSgpKSAhPSBsb2NhbCkKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBzb3VyY2VfbG9jYWxfdHlwZSAtPiBGaW5kT3JJ bnNlcnRMb2NhbFNoYWRvdyhsb2NhbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg ICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICBmb3IgKGludCBsID0gMDsgbCA8IGxvY2FsX2NsYXNzZXMuTGVuZ3RoKCk7 IGwrKykKICAgICAgICB7CiAgICAgICAgICAgIFR5cGVTeW1ib2wgKmxvY2FsX3R5cGUgPSBsb2Nh bF9jbGFzc2VzW2xdOwoKICAgICAgICAgICAgQXN0Q2xhc3NEZWNsYXJhdGlvbiAqY2xhc3NfZGVj bGFyYXRpb24gPSBsb2NhbF90eXBlIC0+IGRlY2xhcmF0aW9uIC0+IENsYXNzRGVjbGFyYXRpb25D YXN0KCk7CiAgICAgICAgICAgIEFzdENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gKmNs YXNzX2NyZWF0aW9uID0gbG9jYWxfdHlwZSAtPiBkZWNsYXJhdGlvbiAtPiBDbGFzc0luc3RhbmNl Q3JlYXRpb25FeHByZXNzaW9uQ2FzdCgpOwoKICAgICAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ ICAoKCBjbGFzc19kZWNsYXJhdGlvbiB8fCBjbGFzc19jcmVhdGlvbiApID8gMCA6CShfX2Fzc2Vy dF9mYWlsICgiY2xhc3NfZGVjbGFyYXRpb24gfHwgY2xhc3NfY3JlYXRpb24iICwgIi4uLy4uL2pp a2VzL3NyYy9leHByLmNwcCIsIDM2MTAsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7Cgog ICAgICAgICAgICBBc3RDbGFzc0JvZHkgKmNsYXNzX2JvZHkgPSAoY2xhc3NfZGVjbGFyYXRpb24g PyBjbGFzc19kZWNsYXJhdGlvbiAtPiBjbGFzc19ib2R5IDogY2xhc3NfY3JlYXRpb24gLT4gY2xh c3NfYm9keV9vcHQpOwoKICAgICAgICAgICAgaWYgKGNsYXNzX2JvZHkgLT4gZGVmYXVsdF9jb25z dHJ1Y3RvcikKICAgICAgICAgICAgICAgICBVcGRhdGVHZW5lcmF0ZWRMb2NhbENvbnN0cnVjdG9y KGNsYXNzX2JvZHkgLT4gZGVmYXVsdF9jb25zdHJ1Y3RvciAtPiBjb25zdHJ1Y3Rvcl9zeW1ib2wp OwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAoaW50 IGkgPSAwOyBpIDwgY2xhc3NfYm9keSAtPiBOdW1Db25zdHJ1Y3RvcnMoKTsgaSsrKQogICAgICAg ICAgICAgICAgICAgIFVwZGF0ZUdlbmVyYXRlZExvY2FsQ29uc3RydWN0b3IoY2xhc3NfYm9keSAt PiBDb25zdHJ1Y3RvcihpKSAtPiBjb25zdHJ1Y3Rvcl9zeW1ib2wpOwoKICAgICAgICAgICAgICAg IGZvciAoaW50IGsgPSAwOyBrIDwgbG9jYWxfdHlwZSAtPiBOdW1Qcml2YXRlQWNjZXNzQ29uc3Ry dWN0b3JzKCk7IGsrKykKICAgICAgICAgICAgICAgICAgICBVcGRhdGVHZW5lcmF0ZWRMb2NhbENv bnN0cnVjdG9yKGxvY2FsX3R5cGUgLT4gUHJpdmF0ZUFjY2Vzc0NvbnN0cnVjdG9yKGspKTsKICAg ICAgICAgICAgfQoKICAgICAgICAgICAgbG9jYWxfdHlwZSAtPiBNYXJrTG9jYWxDbGFzc1Byb2Nl c3NpbmdDb21wbGV0ZWQoKTsKICAgICAgICB9CgogICAgICAgICAKICAgICAgICAgCiAgICAgICAg IAogICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgbG9jYWxfY2xhc3Nlcy5MZW5ndGgoKTsgbSsr KQogICAgICAgIHsKICAgICAgICAgICAgVHlwZVN5bWJvbCAqdGFyZ2V0X2xvY2FsX3R5cGUgPSBs b2NhbF9jbGFzc2VzW21dOwoKICAgICAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCB0YXJn ZXRfbG9jYWxfdHlwZSAtPiBMb2NhbENsYXNzUHJvY2Vzc2luZ0NvbXBsZXRlZCgpICkgPyAwIDoJ KF9fYXNzZXJ0X2ZhaWwgKCJ0YXJnZXRfbG9jYWxfdHlwZSAtPiBMb2NhbENsYXNzUHJvY2Vzc2lu Z0NvbXBsZXRlZCgpIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAzNjM1LCBfX1BSRVRU WV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0 YXJnZXRfbG9jYWxfdHlwZSAtPiBOdW1Mb2NhbENvbnN0cnVjdG9yQ2FsbEVudmlyb25tZW50cygp OyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFzdCAqY2FsbCA9IHRhcmdldF9s b2NhbF90eXBlIC0+IExvY2FsQ29uc3RydWN0b3JDYWxsRW52aXJvbm1lbnQoaSkgLT4gYXN0X2Nv bnN0cnVjdDsKICAgICAgICAgICAgICAgIFNlbWFudGljRW52aXJvbm1lbnQgKmVudiA9IHRhcmdl dF9sb2NhbF90eXBlIC0+IExvY2FsQ29uc3RydWN0b3JDYWxsRW52aXJvbm1lbnQoaSk7CiAgICAg ICAgICAgICAgICBUeXBlU3ltYm9sICpzb3VyY2VfbG9jYWxfdHlwZSA9IGVudiAtPiBUeXBlKCk7 CgogICAgICAgICAgICAgICAgQXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiAqY2xh c3NfY3JlYXRpb247CiAgICAgICAgICAgICAgICBBc3RTdXBlckNhbGwgKnN1cGVyX2NhbGw7CiAg ICAgICAgICAgICAgICBBc3RUaGlzQ2FsbCAqdGhpc19jYWxsOwoKICAgICAgICAgICAgICAgIGlm ICgoY2xhc3NfY3JlYXRpb24gPSBjYWxsIC0+IENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Np b25DYXN0KCkpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChjbGFz c19jcmVhdGlvbiAtPiBzeW1ib2wgIT0gY29udHJvbC5ub190eXBlKQogICAgICAgICAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZV9sb2NhbF90eXBlIC0+IENh bkFjY2Vzcyh0YXJnZXRfbG9jYWxfdHlwZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAodGFyZ2V0X2xvY2FsX3R5cGUg LT4gQUNDX1NUQVRJQygpID8gMCA6IDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBqIDwgdGFyZ2V0X2xvY2FsX3R5cGUgLT4gTnVtQ29uc3RydWN0b3JQYXJhbWV0ZXJzKCk7IGor KykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBBc3RTaW1wbGVOYW1lICpzaW1wbGVfbmFtZSA9IGNvbXBpbGF0aW9uX3VuaXQgLT4g YXN0X3Bvb2wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gR2VuU2ltcGxlTmFtZShjbGFzc19jcmVh dGlvbiAtPiBuZXdfdG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlh YmxlU3ltYm9sICp2YXJpYWJsZV9zeW1ib2wgPSB0YXJnZXRfbG9jYWxfdHlwZSAtPiBDb25zdHJ1 Y3RvclBhcmFtZXRlcihqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVf bmFtZSAtPiBzeW1ib2wgPSB2YXJpYWJsZV9zeW1ib2w7CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaWYgKHNvdXJjZV9sb2NhbF90eXBlICE9IHRhcmdldF9sb2NhbF90eXBlKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc2ltcGxlX25hbWUgLT4gc3ltYm9sID0gdmFyaWFibGVfc3ltYm9sIC0+IGFjY2Vz c2VkX2xvY2FsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfc3Rh Y2suUHVzaChzb3VyY2VfbG9jYWxfdHlwZSAtPiBzZW1hbnRpY19lbnZpcm9ubWVudCk7CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUFjY2Vzc1RvU2NvcGVkVmFyaWFi bGUoc2ltcGxlX25hbWUsIHRhcmdldF9sb2NhbF90eXBlKTsKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3RhdGVfc3RhY2suUG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX2NyZWF0aW9u IC0+IEFkZExvY2FsQXJndW1lbnQoc2ltcGxlX25hbWUpOwogICAgICAgICAgICAgICAgICAgICAg ICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAg IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAg ICAgZm9yIChpbnQgaiA9ICh0YXJnZXRfbG9jYWxfdHlwZSAtPiBBQ0NfU1RBVElDKCkgPyAwIDog MSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPCB0YXJnZXRfbG9jYWxfdHlw ZSAtPiBOdW1Db25zdHJ1Y3RvclBhcmFtZXRlcnMoKTsgaisrKQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3ltYm9s ICpsb2NhbCA9IHRhcmdldF9sb2NhbF90eXBlIC0+IENvbnN0cnVjdG9yUGFyYW1ldGVyKGopIC0+ IGFjY2Vzc2VkX2xvY2FsOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3RTaW1w bGVOYW1lICpzaW1wbGVfbmFtZSA9IGNvbXBpbGF0aW9uX3VuaXQgLT4gYXN0X3Bvb2wKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLT4gR2VuU2ltcGxlTmFtZShjbGFzc19jcmVhdGlvbiAtPiBuZXdfdG9r ZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX25hbWUgLT4gc3ltYm9s ID0gKGVudiAtPiBzeW1ib2xfdGFibGUuRmluZFZhcmlhYmxlU3ltYm9sKGxvY2FsIC0+IElkZW50 aXR5KCkpID09IGxvY2FsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgPyBsb2NhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc291cmNlX2xvY2FsX3R5cGUgLT4g RmluZE9ySW5zZXJ0TG9jYWxTaGFkb3cobG9jYWwpKTsKCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBzaW1wbGVfbmFtZSAtPiBzeW1ib2wgLT4g VmFyaWFibGVDYXN0KCkgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInNpbXBsZV9uYW1lIC0+IHN5 bWJvbCAtPiBWYXJpYWJsZUNhc3QoKSIgLCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMzY4 OSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY2xhc3NfY3JlYXRpb24gLT4gQWRkTG9jYWxBcmd1bWVudChzaW1wbGVfbmFtZSk7 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0K CiAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFN5bWJvbCAqY29uc3RydWN0b3IgPSAoTWV0 aG9kU3ltYm9sICopIGNsYXNzX2NyZWF0aW9uIC0+IGNsYXNzX3R5cGUgLT4gc3ltYm9sOwoKICAg ICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBjb25zdHJ1Y3RvciAp ID8gMCA6CShfX2Fzc2VydF9mYWlsICgiY29uc3RydWN0b3IiICwgIi4uLy4uL2ppa2VzL3NyYy9l eHByLmNwcCIsIDM2OTcsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CiAgICAgICAgICAg ICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggY29uc3RydWN0b3IgLT4gTWV0aG9k Q2FzdCgpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJjb25zdHJ1Y3RvciAtPiBNZXRob2RDYXN0 KCkiICwgIi4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDM2OTgsIF9fUFJFVFRZX0ZVTkNUSU9O X18gKSwgMCkpKSA7CiAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAg KCggISBjb25zdHJ1Y3RvciAtPiBJc0dlbmVyYXRlZExvY2FsQ29uc3RydWN0b3IoKSApID8gMCA6 CShfX2Fzc2VydF9mYWlsICgiISBjb25zdHJ1Y3RvciAtPiBJc0dlbmVyYXRlZExvY2FsQ29uc3Ry dWN0b3IoKSIgLCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMzY5OSwgX19QUkVUVFlfRlVO Q1RJT05fXyApLCAwKSkpIDsKICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHZv aWQ+ICAoKCBjb25zdHJ1Y3RvciAtPiBMb2NhbENvbnN0cnVjdG9yKCkgKSA/IDAgOgkoX19hc3Nl cnRfZmFpbCAoImNvbnN0cnVjdG9yIC0+IExvY2FsQ29uc3RydWN0b3IoKSIgLCAiLi4vLi4vamlr ZXMvc3JjL2V4cHIuY3BwIiwgMzcwMCwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAg ICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX2NyZWF0aW9uIC0+IGNsYXNzX3R5cGUgLT4gc3lt Ym9sID0gY29uc3RydWN0b3IgLT4gTG9jYWxDb25zdHJ1Y3RvcigpOwogICAgICAgICAgICAgICAg ICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKChzdXBlcl9j YWxsID0gY2FsbCAtPiBTdXBlckNhbGxDYXN0KCkpKQogICAgICAgICAgICAgICAgewogICAgICAg ICAgICAgICAgICAgIGlmIChzdXBlcl9jYWxsIC0+IHN5bWJvbCAtPiBNZXRob2RDYXN0KCkpCiAg ICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0g KHRhcmdldF9sb2NhbF90eXBlIC0+IEFDQ19TVEFUSUMoKSA/IDAgOiAxKTsKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBqIDwgdGFyZ2V0X2xvY2FsX3R5cGUgLT4gTnVtQ29uc3RydWN0b3JQ YXJhbWV0ZXJzKCk7IGorKykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAg ICAgICAgICAgICAgICAgVmFyaWFibGVTeW1ib2wgKmxvY2FsID0gdGFyZ2V0X2xvY2FsX3R5cGUg LT4gQ29uc3RydWN0b3JQYXJhbWV0ZXIoaikgLT4gYWNjZXNzZWRfbG9jYWwsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9jYWxfc2hhZG93ID0gc291cmNlX2xv Y2FsX3R5cGUgLT4gRmluZE9ySW5zZXJ0TG9jYWxTaGFkb3cobG9jYWwpOwoKICAgICAgICAgICAg ICAgICAgICAgICAgICAgIEFzdFNpbXBsZU5hbWUgKnNpbXBsZV9uYW1lID0gY29tcGlsYXRpb25f dW5pdCAtPiBhc3RfcG9vbCAtPiBHZW5TaW1wbGVOYW1lKHN1cGVyX2NhbGwgLT4gc3VwZXJfdG9r ZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX25hbWUgLT4gc3ltYm9sID0g ZW52IC0+IHN5bWJvbF90YWJsZS5GaW5kVmFyaWFibGVTeW1ib2wobG9jYWxfc2hhZG93IC0+IElk ZW50aXR5KCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lk PiAgKCggc2ltcGxlX25hbWUgLT4gc3ltYm9sIC0+IFZhcmlhYmxlQ2FzdCgpICkgPyAwIDoJKF9f YXNzZXJ0X2ZhaWwgKCJzaW1wbGVfbmFtZSAtPiBzeW1ib2wgLT4gVmFyaWFibGVDYXN0KCkiICwg Ii4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDM3MTgsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwg MCkpKSA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJfY2FsbCAtPiBBZGRMb2Nh bEFyZ3VtZW50KHNpbXBsZV9uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAg ICAgICAgICAgICAgICAgICAgTWV0aG9kU3ltYm9sICpjb25zdHJ1Y3RvciA9IChNZXRob2RTeW1i b2wgKikgc3VwZXJfY2FsbCAtPiBzeW1ib2w7CgogICAgICAgICAgICAgICAgICAgICAgICAoc3Rh dGljX2Nhc3Q8dm9pZD4gICgoIGNvbnN0cnVjdG9yIC0+IE1ldGhvZENhc3QoKSAmJiAoISBjb25z dHJ1Y3RvciAtPiBJc0dlbmVyYXRlZExvY2FsQ29uc3RydWN0b3IoKSkgKSA/IDAgOgkoX19hc3Nl cnRfZmFpbCAoImNvbnN0cnVjdG9yIC0+IE1ldGhvZENhc3QoKSAmJiAoISBjb25zdHJ1Y3RvciAt PiBJc0dlbmVyYXRlZExvY2FsQ29uc3RydWN0b3IoKSkiICwgIi4uLy4uL2ppa2VzL3NyYy9leHBy LmNwcCIsIDM3MjUsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CiAgICAgICAgICAgICAg ICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggY29uc3RydWN0b3IgLT4gTG9jYWxDb25z dHJ1Y3RvcigpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJjb25zdHJ1Y3RvciAtPiBMb2NhbENv bnN0cnVjdG9yKCkiICwgIi4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDM3MjYsIF9fUFJFVFRZ X0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcl9jYWxs IC0+IHN5bWJvbCA9IGNvbnN0cnVjdG9yIC0+IExvY2FsQ29uc3RydWN0b3IoKTsKICAgICAgICAg ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAg ICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGhpc19jYWxsID0gKEFzdFRoaXNDYWxs ICopIGNhbGw7CgogICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggdGhp c19jYWxsIC0+IFRoaXNDYWxsQ2FzdCgpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJ0aGlzX2Nh bGwgLT4gVGhpc0NhbGxDYXN0KCkiICwgIi4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDM3MzUs IF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CgogICAgICAgICAgICAgICAgICAgIGlmICh0 aGlzX2NhbGwgLT4gc3ltYm9sIC0+IE1ldGhvZENhc3QoKSkKICAgICAgICAgICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAodGFyZ2V0X2xvY2FsX3R5cGUg LT4gQUNDX1NUQVRJQygpID8gMCA6IDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGog PCB0YXJnZXRfbG9jYWxfdHlwZSAtPiBOdW1Db25zdHJ1Y3RvclBhcmFtZXRlcnMoKTsgaisrKQog ICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJp YWJsZVN5bWJvbCAqbG9jYWwgPSB0YXJnZXRfbG9jYWxfdHlwZSAtPiBDb25zdHJ1Y3RvclBhcmFt ZXRlcihqKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3RTaW1wbGVOYW1lICpzaW1w bGVfbmFtZSA9IGNvbXBpbGF0aW9uX3VuaXQgLT4gYXN0X3Bvb2wgLT4gR2VuU2ltcGxlTmFtZSh0 aGlzX2NhbGwgLT4gdGhpc190b2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1w bGVfbmFtZSAtPiBzeW1ib2wgPSBlbnYgLT4gc3ltYm9sX3RhYmxlLkZpbmRWYXJpYWJsZVN5bWJv bChsb2NhbCAtPiBJZGVudGl0eSgpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3Rh dGljX2Nhc3Q8dm9pZD4gICgoIHNpbXBsZV9uYW1lIC0+IHN5bWJvbCAtPiBWYXJpYWJsZUNhc3Qo KSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgic2ltcGxlX25hbWUgLT4gc3ltYm9sIC0+IFZhcmlh YmxlQ2FzdCgpIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCAzNzQ3LCBfX1BSRVRUWV9G VU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfY2Fs bCAtPiBBZGRMb2NhbEFyZ3VtZW50KHNpbXBsZV9uYW1lKTsKICAgICAgICAgICAgICAgICAgICAg ICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kU3ltYm9sICpjb25zdHJ1Y3RvciA9 IChNZXRob2RTeW1ib2wgKikgdGhpc19jYWxsIC0+IHN5bWJvbDsKCiAgICAgICAgICAgICAgICAg ICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggY29uc3RydWN0b3IgLT4gTWV0aG9kQ2FzdCgp ICYmICghIGNvbnN0cnVjdG9yIC0+IElzR2VuZXJhdGVkTG9jYWxDb25zdHJ1Y3RvcigpKSApID8g MCA6CShfX2Fzc2VydF9mYWlsICgiY29uc3RydWN0b3IgLT4gTWV0aG9kQ2FzdCgpICYmICghIGNv bnN0cnVjdG9yIC0+IElzR2VuZXJhdGVkTG9jYWxDb25zdHJ1Y3RvcigpKSIgLCAiLi4vLi4vamlr ZXMvc3JjL2V4cHIuY3BwIiwgMzc1NCwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKICAg ICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBjb25zdHJ1Y3RvciAt PiBMb2NhbENvbnN0cnVjdG9yKCkgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImNvbnN0cnVjdG9y IC0+IExvY2FsQ29uc3RydWN0b3IoKSIgLCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMzc1 NSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICAgICAgICAgICAgICAgICAgICAg IHRoaXNfY2FsbCAtPiBzeW1ib2wgPSBjb25zdHJ1Y3RvciAtPiBMb2NhbENvbnN0cnVjdG9yKCk7 CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAg ICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKCnZvaWQgU2VtYW50aWM6OkdldEFub255bW91 c0NvbnN0cnVjdG9yKEFzdENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gKmNsYXNzX2Ny ZWF0aW9uLCBUeXBlU3ltYm9sICphbm9ueW1vdXNfdHlwZSkKewogICAgTGV4U3RyZWFtOjpUb2tl bkluZGV4IGxlZnRfbG9jICA9IGNsYXNzX2NyZWF0aW9uIC0+IGNsYXNzX3R5cGUgLT4gTGVmdFRv a2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfbG9jID0gY2xhc3NfY3JlYXRp b24gLT4gcmlnaHRfcGFyZW50aGVzaXNfdG9rZW47CgogICAgVHlwZVN5bWJvbCAqc3VwZXJfdHlw ZSA9IGFub255bW91c190eXBlIC0+IHN1cGVyOwogICAgTWV0aG9kU3ltYm9sICpzdXBlcl9jb25z dHJ1Y3RvciA9IEZpbmRDb25zdHJ1Y3RvcihzdXBlcl90eXBlLCBjbGFzc19jcmVhdGlvbiwgbGVm dF9sb2MsIHJpZ2h0X2xvYyk7CiAgICBpZiAoISBzdXBlcl9jb25zdHJ1Y3RvcikKICAgIHsKICAg ICAgICBjbGFzc19jcmVhdGlvbiAtPiBjbGFzc190eXBlIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9f dHlwZTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBz dXBlcl9jb25zdHJ1Y3RvciAtPiBJc1R5cGVkKCkgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInN1 cGVyX2NvbnN0cnVjdG9yIC0+IElzVHlwZWQoKSIgLCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3Bw IiwgMzc4MSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICAgCiAgICAgCiAgICAg CiAgICBCbG9ja1N5bWJvbCAqYmxvY2tfc3ltYm9sID0gbmV3IEJsb2NrU3ltYm9sKHN1cGVyX2Nv bnN0cnVjdG9yIC0+IE51bUZvcm1hbFBhcmFtZXRlcnMoKSArIDMpOwogICAgYmxvY2tfc3ltYm9s IC0+IG1heF92YXJpYWJsZV9pbmRleCA9IDE7ICAKCiAgICBNZXRob2RTeW1ib2wgKmNvbnN0cnVj dG9yID0gYW5vbnltb3VzX3R5cGUgLT4gSW5zZXJ0Q29uc3RydWN0b3JTeW1ib2woY29udHJvbC5p bml0X25hbWVfc3ltYm9sKTsKICAgIGNvbnN0cnVjdG9yIC0+IFNldFR5cGUoY29udHJvbC52b2lk X3R5cGUpOwogICAgY29uc3RydWN0b3IgLT4gU2V0Q29udGFpbmluZ1R5cGUoYW5vbnltb3VzX3R5 cGUpOwogICAgY29uc3RydWN0b3IgLT4gU2V0QmxvY2tTeW1ib2woYmxvY2tfc3ltYm9sKTsKICAg IGNvbnN0cnVjdG9yIC0+IFNldEFDQ19QVUJMSUMoKTsKCiAgICAgCiAgICAgCiAgICAgCiAgICAg CiAgICBpbnQgbnVtX3Rocm93cyA9IHN1cGVyX2NvbnN0cnVjdG9yIC0+IE51bVRocm93cygpOwog ICAgaWYgKG51bV90aHJvd3MgPiAwKQogICAgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwg bnVtX3Rocm93czsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgVHlwZVN5bWJvbCAqZXhjZXB0 aW9uID0gc3VwZXJfY29uc3RydWN0b3IgLT4gVGhyb3dzKGkpOwogICAgICAgICAgICBSZXBvcnRT ZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpDT05TVFJVQ1RPUl9ET0VTX05PVF9USFJPV19TVVBFUl9F WENFUFRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NfY3JlYXRpb24gLT4gbmV3 X3Rva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX2NyZWF0aW9uIC0+IFJpZ2h0 VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb25zdGFudDo6VVNfRU1Q VFksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIC0+IENvbnRhaW5pbmdQYWNr YWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRp b24gLT4gRXh0ZXJuYWxOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJfY29u c3RydWN0b3IgLT4gY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFj a2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcl9jb25zdHJ1Y3RvciAt PiBjb250YWluaW5nX3R5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwoKICAgICAgICAgICAgY29uc3Ry dWN0b3IgLT4gQWRkVGhyb3dzKGV4Y2VwdGlvbik7CiAgICAgICAgfQogICAgfQoKICAgIFZhcmlh YmxlU3ltYm9sICp0aGlzMF92YXJpYWJsZSA9IF9fbnVsbCA7CiAgICBpZiAoYW5vbnltb3VzX3R5 cGUgLT4gSXNJbm5lcigpKQogICAgewogICAgICAgIHRoaXMwX3ZhcmlhYmxlID0gYmxvY2tfc3lt Ym9sIC0+IEluc2VydFZhcmlhYmxlU3ltYm9sKGNvbnRyb2wudGhpczBfbmFtZV9zeW1ib2wpOwog ICAgICAgIHRoaXMwX3ZhcmlhYmxlIC0+IE1hcmtTeW50aGV0aWMoKTsKICAgICAgICB0aGlzMF92 YXJpYWJsZSAtPiBTZXRUeXBlKGFub255bW91c190eXBlIC0+IENvbnRhaW5pbmdUeXBlKCkpOwog ICAgICAgIHRoaXMwX3ZhcmlhYmxlIC0+IFNldE93bmVyKGNvbnN0cnVjdG9yKTsKICAgICAgICB0 aGlzMF92YXJpYWJsZSAtPiBTZXRMb2NhbFZhcmlhYmxlSW5kZXgoYmxvY2tfc3ltYm9sIC0+IG1h eF92YXJpYWJsZV9pbmRleCsrKTsKICAgIH0KCiAgICBmb3IgKGludCBqID0gMDsgaiA8IHN1cGVy X2NvbnN0cnVjdG9yIC0+IE51bUZvcm1hbFBhcmFtZXRlcnMoKTsgaisrKQogICAgewogICAgICAg IFZhcmlhYmxlU3ltYm9sICpwYXJhbSA9IHN1cGVyX2NvbnN0cnVjdG9yIC0+IEZvcm1hbFBhcmFt ZXRlcihqKSwKICAgICAgICAgICAgICAgICAgICAgICAqc3ltYm9sID0gYmxvY2tfc3ltYm9sIC0+ IEluc2VydFZhcmlhYmxlU3ltYm9sKHBhcmFtIC0+IElkZW50aXR5KCkpOwogICAgICAgIHN5bWJv bCAtPiBTZXRUeXBlKHBhcmFtIC0+IFR5cGUoKSk7CiAgICAgICAgc3ltYm9sIC0+IFNldE93bmVy KGNvbnN0cnVjdG9yKTsKICAgICAgICBzeW1ib2wgLT4gU2V0TG9jYWxWYXJpYWJsZUluZGV4KGJs b2NrX3N5bWJvbCAtPiBtYXhfdmFyaWFibGVfaW5kZXgrKyk7CiAgICAgICAgaWYgKGNvbnRyb2wu SXNEb3VibGVXb3JkVHlwZShzeW1ib2wgLT4gVHlwZSgpKSkKICAgICAgICAgICAgYmxvY2tfc3lt Ym9sIC0+IG1heF92YXJpYWJsZV9pbmRleCsrOwogICAgICAgIGNvbnN0cnVjdG9yIC0+IEFkZEZv cm1hbFBhcmFtZXRlcihzeW1ib2wpOwogICAgfQoKICAgICAKICAgICAKICAgICAKICAgIEFzdFN1 cGVyQ2FsbCAqc3VwZXJfY2FsbCAgICAgICAgICAgICAgPSBjb21waWxhdGlvbl91bml0IC0+IGFz dF9wb29sIC0+IEdlblN1cGVyQ2FsbCgpOwogICAgc3VwZXJfY2FsbCAtPiBiYXNlX29wdCAgICAg ICAgICAgICAgICA9IGNsYXNzX2NyZWF0aW9uIC0+IGJhc2Vfb3B0OyAgCiAgICBzdXBlcl9jYWxs IC0+IGRvdF90b2tlbl9vcHQgICAgICAgICAgID0gY2xhc3NfY3JlYXRpb24gLT4gbmV3X3Rva2Vu OwogICAgc3VwZXJfY2FsbCAtPiBzdXBlcl90b2tlbiAgICAgICAgICAgICA9IGNsYXNzX2NyZWF0 aW9uIC0+IG5ld190b2tlbjsKICAgIHN1cGVyX2NhbGwgLT4gbGVmdF9wYXJlbnRoZXNpc190b2tl biAgPSBjbGFzc19jcmVhdGlvbiAtPiBuZXdfdG9rZW47CiAgICBzdXBlcl9jYWxsIC0+IHJpZ2h0 X3BhcmVudGhlc2lzX3Rva2VuID0gY2xhc3NfY3JlYXRpb24gLT4gbmV3X3Rva2VuOwogICAgc3Vw ZXJfY2FsbCAtPiBzZW1pY29sb25fdG9rZW4gICAgICAgICA9IGNsYXNzX2NyZWF0aW9uIC0+IG5l d190b2tlbjsKCiAgICBzdXBlcl9jYWxsIC0+IGlzX3JlYWNoYWJsZSAgICAgICAgICAgID0gdHJ1 ZTsKICAgIHN1cGVyX2NhbGwgLT4gY2FuX2NvbXBsZXRlX25vcm1hbGx5ICAgPSB0cnVlOwogICAg c3VwZXJfY2FsbCAtPiBzeW1ib2wgICAgICAgICAgICAgICAgICA9IHN1cGVyX2NvbnN0cnVjdG9y OwoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGlmIChhbm9ueW1vdXNfdHlwZSAt PiBBQ0NfU1RBVElDKCkpCiAgICAgICAgY2xhc3NfY3JlYXRpb24gLT4gYmFzZV9vcHQgPSBfX251 bGwgOwogICAgZWxzZQogICAgewogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAg ICAKICAgICAgICBpZiAoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9jYXRpb24oKSAmJiBhbm9ueW1v dXNfdHlwZSAtPiBDb250YWluaW5nVHlwZSgpID09IFRoaXNUeXBlKCkpCiAgICAgICAgewogICAg ICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpJTk5FUl9DT05TVFJVQ1RPUl9J Tl9FWFBMSUNJVF9DT05TVFJVQ1RPUl9JTlZPQ0FUSU9OLAogICAgICAgICAgICAgICAgICAgICAg ICAgICBjbGFzc19jcmVhdGlvbiAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgY2xhc3NfY3JlYXRpb24gLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAg ICAgICAgICBhbm9ueW1vdXNfdHlwZSAtPiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VO YW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub255bW91c190eXBlIC0+IEV4dGVy bmFsTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzVHlwZSgpIC0+IENvbnRh aW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgVGhpc1R5cGUoKSAtPiBFeHRlcm5hbE5hbWUoKSk7CiAgICAgICAgICAgIGNsYXNzX2NyZWF0 aW9uIC0+IGJhc2Vfb3B0ID0gX19udWxsIDsKICAgICAgICB9CiAgICAgICAgZWxzZSBjbGFzc19j cmVhdGlvbiAtPiBiYXNlX29wdCA9IENyZWF0ZUFjY2Vzc1RvVHlwZShjbGFzc19jcmVhdGlvbiwg YW5vbnltb3VzX3R5cGUgLT4gQ29udGFpbmluZ1R5cGUoKSk7CiAgICB9CgogICAgQXN0Q2xhc3NC b2R5ICpjbGFzc19ib2R5ID0gY2xhc3NfY3JlYXRpb24gLT4gY2xhc3NfYm9keV9vcHQ7CgogICAg QXN0UmV0dXJuU3RhdGVtZW50ICpyZXR1cm5fc3RhdGVtZW50ID0gY29tcGlsYXRpb25fdW5pdCAt PiBhc3RfcG9vbCAtPiBHZW5SZXR1cm5TdGF0ZW1lbnQoKTsKICAgIHJldHVybl9zdGF0ZW1lbnQg LT4gcmV0dXJuX3Rva2VuICAgICA9IGNsYXNzX2JvZHkgLT4gbGVmdF9icmFjZV90b2tlbjsKICAg IHJldHVybl9zdGF0ZW1lbnQgLT4gZXhwcmVzc2lvbl9vcHQgICA9IF9fbnVsbCA7CiAgICByZXR1 cm5fc3RhdGVtZW50IC0+IHNlbWljb2xvbl90b2tlbiAgPSBjbGFzc19ib2R5IC0+IGxlZnRfYnJh Y2VfdG9rZW47CiAgICByZXR1cm5fc3RhdGVtZW50IC0+IGlzX3JlYWNoYWJsZSAgICAgPSB0cnVl OwoKICAgIEFzdEJsb2NrICpibG9jayAgICAgICAgICAgICAgICA9IGNvbXBpbGF0aW9uX3VuaXQg LT4gYXN0X3Bvb2wgLT4gR2VuQmxvY2soKTsKICAgIGJsb2NrIC0+IGJsb2NrX3N5bWJvbCAgICAg ICAgICA9IGNvbnN0cnVjdG9yIC0+IGJsb2NrX3N5bWJvbCAtPiBJbnNlcnRCbG9ja1N5bWJvbCgx KTsgIAogICAgYmxvY2sgLT4gbGVmdF9icmFjZV90b2tlbiAgICAgID0gY2xhc3NfYm9keSAtPiBs ZWZ0X2JyYWNlX3Rva2VuOwogICAgYmxvY2sgLT4gcmlnaHRfYnJhY2VfdG9rZW4gICAgID0gY2xh c3NfYm9keSAtPiBsZWZ0X2JyYWNlX3Rva2VuOwoKICAgIGJsb2NrIC0+IGlzX3JlYWNoYWJsZSAg ICAgICAgICA9IHRydWU7CiAgICBibG9jayAtPiBjYW5fY29tcGxldGVfbm9ybWFsbHkgPSBmYWxz ZTsKICAgIGJsb2NrIC0+IEFsbG9jYXRlQmxvY2tTdGF0ZW1lbnRzKDEpOyAgCiAgICBibG9jayAt PiBBZGRTdGF0ZW1lbnQocmV0dXJuX3N0YXRlbWVudCk7CgogICAgQXN0Q29uc3RydWN0b3JCbG9j ayAqY29uc3RydWN0b3JfYmxvY2sgICAgICAgICAgICAgICAgICAgPSBjb21waWxhdGlvbl91bml0 IC0+IGFzdF9wb29sIC0+IEdlbkNvbnN0cnVjdG9yQmxvY2soKTsKICAgIGNvbnN0cnVjdG9yX2Js b2NrIC0+IGxlZnRfYnJhY2VfdG9rZW4gICAgICAgICAgICAgICAgICAgID0gY2xhc3NfYm9keSAt PiBsZWZ0X2JyYWNlX3Rva2VuOwogICAgY29uc3RydWN0b3JfYmxvY2sgLT4gZXhwbGljaXRfY29u c3RydWN0b3JfaW52b2NhdGlvbl9vcHQgPSBzdXBlcl9jYWxsOwogICAgY29uc3RydWN0b3JfYmxv Y2sgLT4gYmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBibG9jazsKICAgIGNv bnN0cnVjdG9yX2Jsb2NrIC0+IHJpZ2h0X2JyYWNlX3Rva2VuICAgICAgICAgICAgICAgICAgID0g Y2xhc3NfYm9keSAtPiBsZWZ0X2JyYWNlX3Rva2VuOwoKICAgIEFzdE1ldGhvZERlY2xhcmF0b3Ig Km1ldGhvZF9kZWNsYXJhdG9yICAgICAgID0gY29tcGlsYXRpb25fdW5pdCAtPiBhc3RfcG9vbCAt PiBHZW5NZXRob2REZWNsYXJhdG9yKCk7CiAgICBtZXRob2RfZGVjbGFyYXRvciAtPiBpZGVudGlm aWVyX3Rva2VuICAgICAgICA9IGxlZnRfbG9jOwogICAgbWV0aG9kX2RlY2xhcmF0b3IgLT4gbGVm dF9wYXJlbnRoZXNpc190b2tlbiAgPSBjbGFzc19jcmVhdGlvbiAtPiBsZWZ0X3BhcmVudGhlc2lz X3Rva2VuOwogICAgbWV0aG9kX2RlY2xhcmF0b3IgLT4gcmlnaHRfcGFyZW50aGVzaXNfdG9rZW4g PSByaWdodF9sb2M7CgogICAgQXN0Q29uc3RydWN0b3JEZWNsYXJhdGlvbiAqY29uc3RydWN0b3Jf ZGVjbGFyYXRpb24gID0gY29tcGlsYXRpb25fdW5pdCAtPiBhc3RfcG9vbCAtPiBHZW5Db25zdHJ1 Y3RvckRlY2xhcmF0aW9uKCk7CiAgICBjb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbiAtPiBjb25zdHJ1 Y3Rvcl9kZWNsYXJhdG9yICAgPSBtZXRob2RfZGVjbGFyYXRvcjsKICAgIGNvbnN0cnVjdG9yX2Rl Y2xhcmF0aW9uIC0+IGNvbnN0cnVjdG9yX2JvZHkgICAgICAgICA9IGNvbnN0cnVjdG9yX2Jsb2Nr OwoKICAgIGNvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIC0+IGNvbnN0cnVjdG9yX3N5bWJvbCA9IGNv bnN0cnVjdG9yOwogICAgY29uc3RydWN0b3IgLT4gbWV0aG9kX29yX2NvbnN0cnVjdG9yX2RlY2xh cmF0aW9uID0gY29uc3RydWN0b3JfZGVjbGFyYXRpb247CgogICAgIAogICAgIAogICAgIAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgVmFyaWFibGVTeW1ib2wgKnN1cGVyX3RoaXMw X3ZhcmlhYmxlID0gX19udWxsIDsKCiAgICBpZiAoYW5vbnltb3VzX3R5cGUgLT4gSXNMb2NhbCgp KQogICAgewogICAgICAgIEdlbmVyYXRlTG9jYWxDb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcik7Cgog ICAgICAgIE1ldGhvZFN5bWJvbCAqZ2VuZXJhdGVkX2NvbnN0cnVjdG9yID0gY29uc3RydWN0b3Ig LT4gTG9jYWxDb25zdHJ1Y3RvcigpOwoKICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoICEg Y29uc3RydWN0b3IgLT4gSXNHZW5lcmF0ZWRMb2NhbENvbnN0cnVjdG9yKCkgKSA/IDAgOgkoX19h c3NlcnRfZmFpbCAoIiEgY29uc3RydWN0b3IgLT4gSXNHZW5lcmF0ZWRMb2NhbENvbnN0cnVjdG9y KCkiICwgIi4uLy4uL2ppa2VzL3NyYy9leHByLmNwcCIsIDM5MzQsIF9fUFJFVFRZX0ZVTkNUSU9O X18gKSwgMCkpKSA7CiAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBnZW5lcmF0ZWRfY29u c3RydWN0b3IgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImdlbmVyYXRlZF9jb25zdHJ1Y3RvciIg LCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMzkzNSwgX19QUkVUVFlfRlVOQ1RJT05fXyAp LCAwKSkpIDsKCiAgICAgICAgYmxvY2tfc3ltYm9sID0gZ2VuZXJhdGVkX2NvbnN0cnVjdG9yIC0+ IGJsb2NrX3N5bWJvbDsgIAoKICAgICAgICBpZiAoc3VwZXJfY2FsbCAtPiBiYXNlX29wdCkKICAg ICAgICB7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAg ICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICBzdXBlcl90aGlzMF92YXJpYWJsZSA9IGJs b2NrX3N5bWJvbCAtPiBJbnNlcnRWYXJpYWJsZVN5bWJvbChjb250cm9sLk1ha2VQYXJhbWV0ZXIo MCkpOwogICAgICAgICAgICBzdXBlcl90aGlzMF92YXJpYWJsZSAtPiBNYXJrU3ludGhldGljKCk7 CiAgICAgICAgICAgIHN1cGVyX3RoaXMwX3ZhcmlhYmxlIC0+IFNldFR5cGUoc3VwZXJfY2FsbCAt PiBiYXNlX29wdCAtPiBUeXBlKCkpOwogICAgICAgICAgICBzdXBlcl90aGlzMF92YXJpYWJsZSAt PiBTZXRPd25lcihnZW5lcmF0ZWRfY29uc3RydWN0b3IpOwogICAgICAgICAgICBzdXBlcl90aGlz MF92YXJpYWJsZSAtPiBNYXJrQ29tcGxldGUoKTsKICAgICAgICB9CgogICAgICAgIGlmIChzdXBl cl90eXBlIC0+IElzTG9jYWwoKSkgIAogICAgICAgIHsKICAgICAgICAgICAgaWYgKHN1cGVyX3R5 cGUgLT4gTG9jYWxDbGFzc1Byb2Nlc3NpbmdDb21wbGV0ZWQoKSkKICAgICAgICAgICAgewogICAg ICAgICAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBzdXBlcl9jb25zdHJ1Y3RvciAtPiBM b2NhbENvbnN0cnVjdG9yKCkgJiYgKCEgc3VwZXJfY29uc3RydWN0b3IgLT4gSXNHZW5lcmF0ZWRM b2NhbENvbnN0cnVjdG9yKCkpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJzdXBlcl9jb25zdHJ1 Y3RvciAtPiBMb2NhbENvbnN0cnVjdG9yKCkgJiYgKCEgc3VwZXJfY29uc3RydWN0b3IgLT4gSXNH ZW5lcmF0ZWRMb2NhbENvbnN0cnVjdG9yKCkpIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAi LCAzOTU3LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICAgICAgICAgIHN1 cGVyX2NhbGwgLT4gc3ltYm9sID0gc3VwZXJfY29uc3RydWN0b3IgLT4gTG9jYWxDb25zdHJ1Y3Rv cigpOwoKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAoc3VwZXJfdHlwZSAtPiBBQ0NfU1RBVElD KCkgPyAwIDogMSk7IGkgPCBzdXBlcl90eXBlIC0+IE51bUNvbnN0cnVjdG9yUGFyYW1ldGVycygp OyBpKyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVTeW1i b2wgKmxvY2FsID0gc3VwZXJfdHlwZSAtPiBDb25zdHJ1Y3RvclBhcmFtZXRlcihpKSAtPiBhY2Nl c3NlZF9sb2NhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbG9jYWxfc2hh ZG93ID0gYW5vbnltb3VzX3R5cGUgLT4gRmluZE9ySW5zZXJ0TG9jYWxTaGFkb3cobG9jYWwpOwoK ICAgICAgICAgICAgICAgICAgICBBc3RTaW1wbGVOYW1lICpzaW1wbGVfbmFtZSA9IGNvbXBpbGF0 aW9uX3VuaXQgLT4gYXN0X3Bvb2wgLT4gR2VuU2ltcGxlTmFtZShzdXBlcl9jYWxsIC0+IHN1cGVy X3Rva2VuKTsKICAgICAgICAgICAgICAgICAgICBzaW1wbGVfbmFtZSAtPiBzeW1ib2wgPSBibG9j a19zeW1ib2wgLT4gRmluZFZhcmlhYmxlU3ltYm9sKGxvY2FsX3NoYWRvdyAtPiBJZGVudGl0eSgp KTsKCiAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQ+ICAoKCBzaW1wbGVfbmFt ZSAtPiBzeW1ib2wgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoInNpbXBsZV9uYW1lIC0+IHN5bWJv bCIgLCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgMzk3MiwgX19QUkVUVFlfRlVOQ1RJT05f XyApLCAwKSkpIDsKCiAgICAgICAgICAgICAgICAgICAgc3VwZXJfY2FsbCAtPiBBZGRMb2NhbEFy Z3VtZW50KHNpbXBsZV9uYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAg ICAgICAgICBlbHNlICAKICAgICAgICAgICAgICAgIHN1cGVyX3R5cGUgLT4gQWRkTG9jYWxDb25z dHJ1Y3RvckNhbGxFbnZpcm9ubWVudChHZXRFbnZpcm9ubWVudChzdXBlcl9jYWxsKSk7CiAgICAg ICAgfQogICAgfQogICAgZWxzZSBpZiAoc3VwZXJfY2FsbCAtPiBiYXNlX29wdCkKICAgIHsKICAg ICAgICBzdXBlcl90aGlzMF92YXJpYWJsZSA9IGJsb2NrX3N5bWJvbCAtPiBJbnNlcnRWYXJpYWJs ZVN5bWJvbChjb250cm9sLk1ha2VQYXJhbWV0ZXIoMCkpOwogICAgICAgIHN1cGVyX3RoaXMwX3Zh cmlhYmxlIC0+IE1hcmtTeW50aGV0aWMoKTsKICAgICAgICBzdXBlcl90aGlzMF92YXJpYWJsZSAt PiBTZXRUeXBlKHN1cGVyX2NhbGwgLT4gYmFzZV9vcHQgLT4gVHlwZSgpKTsKICAgICAgICBzdXBl cl90aGlzMF92YXJpYWJsZSAtPiBTZXRPd25lcihjb25zdHJ1Y3Rvcik7CiAgICAgICAgc3VwZXJf dGhpczBfdmFyaWFibGUgLT4gU2V0TG9jYWxWYXJpYWJsZUluZGV4KGJsb2NrX3N5bWJvbCAtPiBt YXhfdmFyaWFibGVfaW5kZXgrKyk7CgogICAgICAgIGNvbnN0cnVjdG9yIC0+IEFkZEZvcm1hbFBh cmFtZXRlcihzdXBlcl90aGlzMF92YXJpYWJsZSk7CiAgICB9CgogICAgIAogICAgIAogICAgIAog ICAgaWYgKHN1cGVyX3RoaXMwX3ZhcmlhYmxlKQogICAgewogICAgICAgIGNsYXNzX2NyZWF0aW9u IC0+IEFkZEFyZ3VtZW50KHN1cGVyX2NhbGwgLT4gYmFzZV9vcHQpOyAgCgogICAgICAgIEFzdFNp bXBsZU5hbWUgKnNpbXBsZV9uYW1lID0gY29tcGlsYXRpb25fdW5pdCAtPiBhc3RfcG9vbCAtPiBH ZW5TaW1wbGVOYW1lKGNsYXNzX2NyZWF0aW9uIC0+IG5ld190b2tlbik7CiAgICAgICAgc2ltcGxl X25hbWUgLT4gc3ltYm9sID0gc3VwZXJfdGhpczBfdmFyaWFibGU7CiAgICAgICAgc3VwZXJfY2Fs bCAtPiBiYXNlX29wdCA9IHNpbXBsZV9uYW1lOyAgCiAgICB9CgogICAgY29uc3RydWN0b3IgLT4g U2V0U2lnbmF0dXJlKGNvbnRyb2wsIHRoaXMwX3ZhcmlhYmxlKTsgIAoKICAgICAKICAgICAKICAg ICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIGZvciAoaW50IGsgPSAwOyBrIDwg c3VwZXJfY29uc3RydWN0b3IgLT4gTnVtRm9ybWFsUGFyYW1ldGVycygpOyBrKyspCiAgICB7CiAg ICAgICAgVmFyaWFibGVTeW1ib2wgKnBhcmFtID0gc3VwZXJfY29uc3RydWN0b3IgLT4gRm9ybWFs UGFyYW1ldGVyKGspLAogICAgICAgICAgICAgICAgICAgICAgICpzeW1ib2wgPSBibG9ja19zeW1i b2wgLT4gRmluZFZhcmlhYmxlU3ltYm9sKHBhcmFtIC0+IElkZW50aXR5KCkpOwoKICAgICAgICAo c3RhdGljX2Nhc3Q8dm9pZD4gICgoIHN5bWJvbCApID8gMCA6CShfX2Fzc2VydF9mYWlsICgic3lt Ym9sIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCA0MDE5LCBfX1BSRVRUWV9GVU5DVElP Tl9fICksIDApKSkgOwoKICAgICAgICBBc3RTaW1wbGVOYW1lICpzaW1wbGVfbmFtZSA9IGNvbXBp bGF0aW9uX3VuaXQgLT4gYXN0X3Bvb2wgLT4gR2VuU2ltcGxlTmFtZShjbGFzc19jcmVhdGlvbiAt PiBuZXdfdG9rZW4pOwogICAgICAgIHNpbXBsZV9uYW1lIC0+IHN5bWJvbCA9IHN5bWJvbDsKICAg ICAgICBzdXBlcl9jYWxsIC0+IEFkZEFyZ3VtZW50KHNpbXBsZV9uYW1lKTsKICAgIH0KCiAgICBj bGFzc19jcmVhdGlvbiAtPiBjbGFzc190eXBlIC0+IHN5bWJvbCA9IGNvbnN0cnVjdG9yOwoKICAg IHJldHVybjsKfQoKClR5cGVTeW1ib2wgKlNlbWFudGljOjpHZXRBbm9ueW1vdXNUeXBlKEFzdENs YXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24gKmNsYXNzX2NyZWF0aW9uLCBUeXBlU3ltYm9s ICpzdXBlcl90eXBlKQp7CiAgICBUeXBlU3ltYm9sICp0aGlzX3R5cGUgPSBUaGlzVHlwZSgpOwoK ICAgIGlmIChzdXBlcl90eXBlIC0+IEFDQ19GSU5BTCgpKQogICAgewogICAgICAgICBSZXBvcnRT ZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpTVVBFUl9JU19GSU5BTCwKICAgICAgICAgICAgICAgICAg ICAgICAgY2xhc3NfY3JlYXRpb24gLT4gY2xhc3NfdHlwZSAtPiBMZWZ0VG9rZW4oKSwKICAgICAg ICAgICAgICAgICAgICAgICAgY2xhc3NfY3JlYXRpb24gLT4gY2xhc3NfdHlwZSAtPiBSaWdodFRv a2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyX3R5cGUgLT4gQ29udGFpbmluZ1Bh Y2thZ2UoKSAtPiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcl90 eXBlIC0+IEV4dGVybmFsTmFtZSgpKTsKICAgIH0KCiAgICBBc3RDbGFzc0JvZHkgKmNsYXNzX2Jv ZHkgPSBjbGFzc19jcmVhdGlvbiAtPiBjbGFzc19ib2R5X29wdDsKICAgIFR5cGVTeW1ib2wgKm91 dGVybW9zdF90eXBlID0gdGhpc190eXBlIC0+IG91dGVybW9zdF90eXBlOwoKICAgICAKICAgICAK ICAgICAKICAgIEludFRvV3N0cmluZyB2YWx1ZShvdXRlcm1vc3RfdHlwZSAtPiBudW1fYW5vbnlt b3VzX3R5cGVzKCkgKyAxKTsKCiAgICBpbnQgbGVuZ3RoID0gdmFsdWUuTGVuZ3RoKCkgKyBvdXRl cm1vc3RfdHlwZSAtPiBOYW1lTGVuZ3RoKCkgKyAxOyAgCiAgICB3Y2hhcl90ICphbm9ueW1vdXNf bmFtZSA9IG5ldyB3Y2hhcl90W2xlbmd0aCArIDFdOwogICAgd2NzY3B5KGFub255bW91c19uYW1l LCBvdXRlcm1vc3RfdHlwZSAtPiBOYW1lKCkpOwogICAgd2NzY2F0KGFub255bW91c19uYW1lLCBT dHJpbmdDb25zdGFudDo6VVNfX0RTKTsKICAgIHdjc2NhdChhbm9ueW1vdXNfbmFtZSwgdmFsdWUu U3RyaW5nKCkpOwoKICAgIE5hbWVTeW1ib2wgKm5hbWVfc3ltYm9sID0gY29udHJvbC5GaW5kT3JJ bnNlcnROYW1lKGFub255bW91c19uYW1lLCBsZW5ndGgpOwoKICAgIChzdGF0aWNfY2FzdDx2b2lk PiAgKCggKCEgVGhpc01ldGhvZCgpKSB8fCBMb2NhbFN5bWJvbFRhYmxlKCkuVG9wKCkgKSA/IDAg OgkoX19hc3NlcnRfZmFpbCAoIighIFRoaXNNZXRob2QoKSkgfHwgTG9jYWxTeW1ib2xUYWJsZSgp LlRvcCgpIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCA0MDYxLCBfX1BSRVRUWV9GVU5D VElPTl9fICksIDApKSkgOwoKICAgIFR5cGVTeW1ib2wgKmlubmVyX3R5cGUgPSAoVGhpc01ldGhv ZCgpID8gTG9jYWxTeW1ib2xUYWJsZSgpLlRvcCgpIC0+IEluc2VydEFub255bW91c1R5cGVTeW1i b2wobmFtZV9zeW1ib2wpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA6IHRoaXNfdHlwZSAtPiBJbnNlcnRBbm9ueW1vdXNUeXBlU3ltYm9sKG5hbWVfc3ltYm9sKSk7 CiAgICBpbm5lcl90eXBlIC0+IFNldEFDQ19QUklWQVRFKCk7CiAgICBpbm5lcl90eXBlIC0+IE1h cmtBbm9ueW1vdXMoKTsKICAgIGlubmVyX3R5cGUgLT4gb3V0ZXJtb3N0X3R5cGUgPSBvdXRlcm1v c3RfdHlwZTsKICAgIGlubmVyX3R5cGUgLT4gc3VwZXJ0eXBlc19jbG9zdXJlID0gbmV3IFN5bWJv bFNldDsKICAgIGlubmVyX3R5cGUgLT4gc3VidHlwZXNfY2xvc3VyZSA9IG5ldyBTeW1ib2xTZXQ7 CiAgICBpbm5lcl90eXBlIC0+IHNlbWFudGljX2Vudmlyb25tZW50ID0gbmV3IFNlbWFudGljRW52 aXJvbm1lbnQoKFNlbWFudGljICopIHRoaXMsIGlubmVyX3R5cGUsIHN0YXRlX3N0YWNrLlRvcCgp KTsKICAgIGlubmVyX3R5cGUgLT4gZGVjbGFyYXRpb24gPSBjbGFzc19jcmVhdGlvbjsKICAgIGlu bmVyX3R5cGUgLT4gZmlsZV9zeW1ib2wgPSBzb3VyY2VfZmlsZV9zeW1ib2w7CiAgICBpbm5lcl90 eXBlIC0+IFNldE93bmVyKFRoaXNNZXRob2QoKSA/IChTeW1ib2wgKikgVGhpc01ldGhvZCgpIDog KFN5bWJvbCAqKSB0aGlzX3R5cGUpOwogICAgIAogICAgIAogICAgIAogICAgaW5uZXJfdHlwZSAt PiBTZXRTeW1ib2xUYWJsZShjbGFzc19ib2R5IC0+IE51bUNsYXNzQm9keURlY2xhcmF0aW9ucygp ICsgMyk7CiAgICBpbm5lcl90eXBlIC0+IFNldExvY2F0aW9uKCk7CiAgICBpbm5lcl90eXBlIC0+ IFNldFNpZ25hdHVyZShjb250cm9sKTsKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAg ICBpbm5lcl90eXBlIC0+IFNldEFDQ19GSU5BTCgpOwogICAgaWYgKFN0YXRpY1JlZ2lvbigpIHx8 IChFeHBsaWNpdENvbnN0cnVjdG9ySW52b2NhdGlvbigpICYmIGlubmVyX3R5cGUgLT4gQ29udGFp bmluZ1R5cGUoKSA9PSBUaGlzVHlwZSgpKSkKICAgICAgICAgaW5uZXJfdHlwZSAtPiBTZXRBQ0Nf U1RBVElDKCk7CiAgICBlbHNlIGlubmVyX3R5cGUgLT4gSW5zZXJ0VGhpcygwKTsKCiAgICBpZiAo c3VwZXJfdHlwZSAtPiBBQ0NfSU5URVJGQUNFKCkpCiAgICB7CiAgICAgICAgIGlubmVyX3R5cGUg LT4gQWRkSW50ZXJmYWNlKHN1cGVyX3R5cGUpOwogICAgICAgICBpbm5lcl90eXBlIC0+IHN1cGVy ID0gY29udHJvbC5PYmplY3QoKTsKICAgIH0KICAgIGVsc2UgaW5uZXJfdHlwZSAtPiBzdXBlciA9 IHN1cGVyX3R5cGU7CgogICAgb3V0ZXJtb3N0X3R5cGUgLT4gQWRkQW5vbnltb3VzVHlwZShpbm5l cl90eXBlKTsKICAgIGRlbGV0ZSBbXSBhbm9ueW1vdXNfbmFtZTsKCiAgICAgCiAgICAgCiAgICAg CiAgICBHZXRBbm9ueW1vdXNDb25zdHJ1Y3RvcihjbGFzc19jcmVhdGlvbiwgaW5uZXJfdHlwZSk7 CgogICAgIAogICAgIAogICAgIAogICAgQ2hlY2tDbGFzc01lbWJlcnMoaW5uZXJfdHlwZSwgY2xh c3NfYm9keSk7CiAgICBQcm9jZXNzTmVzdGVkVHlwZUhlYWRlcnMoaW5uZXJfdHlwZSwgY2xhc3Nf Ym9keSk7CiAgICBpZiAoaW5uZXJfdHlwZSAtPiBvd25lciAtPiBNZXRob2RDYXN0KCkpCiAgICAg ICAgIFByb2Nlc3NTdXBlclR5cGVzT2ZPdXRlclR5cGUoaW5uZXJfdHlwZSk7CiAgICBlbHNlIFBy b2Nlc3NOZXN0ZWRTdXBlclR5cGVzKGlubmVyX3R5cGUpOwoKICAgICAKICAgICAKICAgICAKICAg IGlmIChjbGFzc19ib2R5IC0+IFVucGFyc2VkQ2xhc3NCb2R5Q2FzdCgpKQogICAgewogICAgICAg IGlmICghIGNvbnRyb2wucGFyc2VyIC0+IEluaXRpYWxpemVyUGFyc2UobGV4X3N0cmVhbSwgY2xh c3NfYm9keSkpCiAgICAgICAgICAgICBjb21waWxhdGlvbl91bml0IC0+IGtpbmQgPSBBc3Q6OkJB RF9DT01QSUxBVElPTjsgIAogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlubmVy X3R5cGUgLT4gTWFya0hlYWRlclByb2Nlc3NlZCgpOwogICAgICAgICAgICBQcm9jZXNzTWVtYmVy cyhpbm5lcl90eXBlIC0+IHNlbWFudGljX2Vudmlyb25tZW50LCBjbGFzc19ib2R5KTsKICAgICAg ICAgICAgQ29tcGxldGVTeW1ib2xUYWJsZShpbm5lcl90eXBlIC0+IHNlbWFudGljX2Vudmlyb25t ZW50LCBjbGFzc19ib2R5IC0+IGxlZnRfYnJhY2VfdG9rZW4sIGNsYXNzX2JvZHkpOwogICAgICAg IH0KCiAgICAgICAgaWYgKCEgY29udHJvbC5wYXJzZXIgLT4gQm9keVBhcnNlKGxleF9zdHJlYW0s IGNsYXNzX2JvZHkpKQogICAgICAgICAgICAgY29tcGlsYXRpb25fdW5pdCAtPiBraW5kID0gQXN0 OjpCQURfQ09NUElMQVRJT047ICAKICAgICAgICBlbHNlIFByb2Nlc3NFeGVjdXRhYmxlQm9kaWVz KGlubmVyX3R5cGUgLT4gc2VtYW50aWNfZW52aXJvbm1lbnQsIGNsYXNzX2JvZHkpOwogICAgfQog ICAgZWxzZSAgCiAgICB7CiAgICAgICAgaW5uZXJfdHlwZSAtPiBNYXJrSGVhZGVyUHJvY2Vzc2Vk KCk7CiAgICAgICAgUHJvY2Vzc01lbWJlcnMoaW5uZXJfdHlwZSAtPiBzZW1hbnRpY19lbnZpcm9u bWVudCwgY2xhc3NfYm9keSk7CiAgICAgICAgQ29tcGxldGVTeW1ib2xUYWJsZShpbm5lcl90eXBl IC0+IHNlbWFudGljX2Vudmlyb25tZW50LCBjbGFzc19ib2R5IC0+IGxlZnRfYnJhY2VfdG9rZW4s IGNsYXNzX2JvZHkpOwogICAgICAgIFByb2Nlc3NFeGVjdXRhYmxlQm9kaWVzKGlubmVyX3R5cGUg LT4gc2VtYW50aWNfZW52aXJvbm1lbnQsIGNsYXNzX2JvZHkpOwogICAgfQoKICAgICAKICAgICAK ICAgICAKICAgICAKICAgIE1ldGhvZFN5bWJvbCAqY29uc3RydWN0b3IgPSBjbGFzc19jcmVhdGlv biAtPiBjbGFzc190eXBlIC0+IHN5bWJvbCAtPiBNZXRob2RDYXN0KCk7CiAgICBpZiAoY29uc3Ry dWN0b3IpCiAgICB7CiAgICAgICAgY2xhc3NfYm9keSAtPiBkZWZhdWx0X2NvbnN0cnVjdG9yID0g KEFzdENvbnN0cnVjdG9yRGVjbGFyYXRpb24gKikgY29uc3RydWN0b3IgLT4gbWV0aG9kX29yX2Nv bnN0cnVjdG9yX2RlY2xhcmF0aW9uOwoKICAgICAgICBpZiAoaW5uZXJfdHlwZSAtPiBJc0xvY2Fs KCkpCiAgICAgICAgewogICAgICAgICAgICBpbm5lcl90eXBlIC0+IEFkZExvY2FsQ29uc3RydWN0 b3JDYWxsRW52aXJvbm1lbnQoR2V0RW52aXJvbm1lbnQoY2xhc3NfY3JlYXRpb24pKTsKICAgICAg ICAgICAgVXBkYXRlTG9jYWxDb25zdHJ1Y3RvcnMoaW5uZXJfdHlwZSk7CiAgICAgICAgfQogICAg fQoKICAgICAKICAgICAKICAgICAKICAgIGlubmVyX3R5cGUgLT4gUmVzZXRBQ0NfU1RBVElDKCk7 CgogICAgcmV0dXJuIGlubmVyX3R5cGU7Cn0KCgp2b2lkIFNlbWFudGljOjpQcm9jZXNzQ2xhc3NJ bnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbihBc3QgKmV4cHIpCnsKICAgIEFzdENsYXNzSW5zdGFu Y2VDcmVhdGlvbkV4cHJlc3Npb24gKmNsYXNzX2NyZWF0aW9uID0gKEFzdENsYXNzSW5zdGFuY2VD cmVhdGlvbkV4cHJlc3Npb24gKikgZXhwcjsKCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAg CiAgICBTeW1ib2xTZXQgKmV4Y2VwdGlvbl9zZXQgPSBUcnlFeGNlcHRpb25UYWJsZVN0YWNrKCku VG9wKCk7CiAgICBpZiAoZXhjZXB0aW9uX3NldCkKICAgIHsKICAgICAgICBleGNlcHRpb25fc2V0 IC0+IEFkZEVsZW1lbnQoY29udHJvbC5FcnJvcigpKTsKICAgIH0KCiAgICBBc3QgKmFjdHVhbF90 eXBlID0gY2xhc3NfY3JlYXRpb24gLT4gY2xhc3NfdHlwZSAtPiB0eXBlOwogICAgVHlwZVN5bWJv bCAqdHlwZTsKICAgIGlmIChjbGFzc19jcmVhdGlvbiAtPiBiYXNlX29wdCkKICAgIHsKICAgICAg ICBQcm9jZXNzRXhwcmVzc2lvbihjbGFzc19jcmVhdGlvbiAtPiBiYXNlX29wdCk7CgogICAgICAg IFR5cGVTeW1ib2wgKmVuY2xvc2luZ190eXBlID0gY2xhc3NfY3JlYXRpb24gLT4gYmFzZV9vcHQg LT4gVHlwZSgpOwogICAgICAgIGlmIChlbmNsb3NpbmdfdHlwZSA9PSBjb250cm9sLm5vX3R5cGUp CiAgICAgICAgewogICAgICAgICAgICBjbGFzc19jcmVhdGlvbiAtPiBzeW1ib2wgPSBjb250cm9s Lm5vX3R5cGU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAo ZW5jbG9zaW5nX3R5cGUgPT0gY29udHJvbC5udWxsX3R5cGUgfHwgZW5jbG9zaW5nX3R5cGUgLT4g UHJpbWl0aXZlKCkpCiAgICAgICAgewogICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRp Y0Vycm9yOjpUWVBFX05PVF9SRUZFUkVOQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNs YXNzX2NyZWF0aW9uIC0+IGJhc2Vfb3B0IC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAg ICAgICAgICAgICBjbGFzc19jcmVhdGlvbiAtPiBiYXNlX29wdCAtPiBSaWdodFRva2VuKCksCiAg ICAgICAgICAgICAgICAgICAgICAgICAgIGVuY2xvc2luZ190eXBlIC0+IEV4dGVybmFsTmFtZSgp KTsKICAgICAgICAgICAgY2xhc3NfY3JlYXRpb24gLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBl OwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAgCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICB0eXBlID0gTXVzdEZpbmROZXN0ZWRUeXBlKGVuY2xvc2luZ190eXBlLCBh Y3R1YWxfdHlwZSk7CiAgICAgICAgaWYgKHR5cGUgLT4gQUNDX0lOVEVSRkFDRSgpKQogICAgICAg IHsKICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6SU5URVJGQUNFX05P VF9JTk5FUl9DTEFTUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX3R5cGUgLT4g TGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbF90eXBlIC0+IFJp Z2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAtPiBDb250YWluaW5n UGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5 cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgICAgICAgICBjbGFzc19jcmVhdGlvbiAtPiBzeW1i b2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAg ICAgaWYgKHR5cGUgLT4gQUNDX1NUQVRJQygpKQogICAgICAgIHsKICAgICAgICAgICAgUmVwb3J0 U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6U1RBVElDX05PVF9JTk5FUl9DTEFTUywKICAgICAgICAg ICAgICAgICAgICAgICAgICAgYWN0dWFsX3R5cGUgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAg ICAgICAgICAgICAgICAgIGFjdHVhbF90eXBlIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgdHlwZSAtPiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1l KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwog ICAgICAgICAgICBjbGFzc19jcmVhdGlvbiAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAg ICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAg dHlwZSA9IE11c3RGaW5kVHlwZShhY3R1YWxfdHlwZSk7CiAgICAgICAgaWYgKHR5cGUgLT4gSXNJ bm5lcigpKQogICAgICAgIHsKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAg ICAKICAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoRXhwbGljaXRDb25zdHJ1Y3Rvckludm9j YXRpb24oKSAmJiB0eXBlIC0+IENvbnRhaW5pbmdUeXBlKCkgPT0gVGhpc1R5cGUoKSkKICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6SU5O RVJfQ09OU1RSVUNUT1JfSU5fRVhQTElDSVRfQ09OU1RSVUNUT1JfSU5WT0NBVElPTiwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX2NyZWF0aW9uIC0+IExlZnRUb2tlbigpLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NfY3JlYXRpb24gLT4gUmlnaHRUb2tl bigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAtPiBDb250YWluaW5nUGFj a2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0 eXBlIC0+IEV4dGVybmFsTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhp c1R5cGUoKSAtPiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBUaGlzVHlwZSgpIC0+IEV4dGVybmFsTmFtZSgpKTsKICAg ICAgICAgICAgICAgIGNsYXNzX2NyZWF0aW9uIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsK ICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2xhc3Nf Y3JlYXRpb24gLT4gYmFzZV9vcHQgPSBDcmVhdGVBY2Nlc3NUb1R5cGUoY2xhc3NfY3JlYXRpb24s IHR5cGUgLT4gQ29udGFpbmluZ1R5cGUoKSk7CiAgICAgICAgfQogICAgfQoKICAgIGJvb2wgbm9f YmFkX2FyZ3VtZW50ID0gdHJ1ZTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NfY3JlYXRp b24gLT4gTnVtQXJndW1lbnRzKCk7IGkrKykKICAgIHsKICAgICAgICBBc3RFeHByZXNzaW9uICpl eHByID0gY2xhc3NfY3JlYXRpb24gLT4gQXJndW1lbnQoaSk7CiAgICAgICAgUHJvY2Vzc0V4cHJl c3Npb25PclN0cmluZ0NvbnN0YW50KGV4cHIpOwogICAgICAgIG5vX2JhZF9hcmd1bWVudCA9IG5v X2JhZF9hcmd1bWVudCAmJiAoZXhwciAtPiBzeW1ib2wgIT0gY29udHJvbC5ub190eXBlKTsKICAg IH0KCiAgICBUeXBlU3ltYm9sICphbm9ueW1vdXNfdHlwZSA9IF9fbnVsbCA7CgogICAgaWYgKCEg bm9fYmFkX2FyZ3VtZW50KQogICAgewogICAgICAgIGNsYXNzX2NyZWF0aW9uIC0+IGNsYXNzX3R5 cGUgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgICAgIGNsYXNzX2NyZWF0aW9uIC0+ IHN5bWJvbCA9IHR5cGU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgTWV0aG9kU3ltYm9s ICptZXRob2QgPSBGaW5kQ29uc3RydWN0b3IoKHR5cGUgLT4gQUNDX0lOVEVSRkFDRSgpID8gY29u dHJvbC5PYmplY3QoKSA6IHR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGNsYXNzX2NyZWF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGFjdHVhbF90eXBlIC0+IExlZnRUb2tlbigpLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX2NyZWF0aW9uIC0+IHJp Z2h0X3BhcmVudGhlc2lzX3Rva2VuKTsKCiAgICAgICAgaWYgKCEgbWV0aG9kKQogICAgICAgIHsK ICAgICAgICAgICAgY2xhc3NfY3JlYXRpb24gLT4gY2xhc3NfdHlwZSAtPiBzeW1ib2wgPSBjb250 cm9sLm5vX3R5cGU7CiAgICAgICAgICAgIGNsYXNzX2NyZWF0aW9uIC0+IHN5bWJvbCA9IHR5cGU7 CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIChzdGF0aWNfY2Fz dDx2b2lkPiAgKCggbWV0aG9kIC0+IElzVHlwZWQoKSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgi bWV0aG9kIC0+IElzVHlwZWQoKSIgLCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgNDI4Mywg X19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICAgICAgICAgIGlmIChjbGFzc19jcmVh dGlvbiAtPiBiYXNlX29wdCAmJgogICAgICAgICAgICAgICAgKGNsYXNzX2NyZWF0aW9uIC0+IGJh c2Vfb3B0IC0+IHN5bWJvbCAhPSBjb250cm9sLm5vX3R5cGUpICYmCiAgICAgICAgICAgICAgICAo Y2xhc3NfY3JlYXRpb24gLT4gYmFzZV9vcHQgLT4gVHlwZSgpICE9IG1ldGhvZCAtPiBjb250YWlu aW5nX3R5cGUgLT4gQ29udGFpbmluZ1R5cGUoKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggbWV0aG9kIC0+IGNvbnRhaW5pbmdfdHlwZSApID8g MCA6CShfX2Fzc2VydF9mYWlsICgibWV0aG9kIC0+IGNvbnRhaW5pbmdfdHlwZSIgLCAiLi4vLi4v amlrZXMvc3JjL2V4cHIuY3BwIiwgNDI4OSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsK ICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggbWV0aG9kIC0+IGNvbnRhaW5p bmdfdHlwZSAtPiBDb250YWluaW5nVHlwZSgpICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJtZXRo b2QgLT4gY29udGFpbmluZ190eXBlIC0+IENvbnRhaW5pbmdUeXBlKCkiICwgIi4uLy4uL2ppa2Vz L3NyYy9leHByLmNwcCIsIDQyOTAsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CiAgICAg ICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIGNsYXNzX2NyZWF0aW9uIC0+IGJhc2Vf b3B0IC0+IFR5cGUoKSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiY2xhc3NfY3JlYXRpb24gLT4g YmFzZV9vcHQgLT4gVHlwZSgpIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCA0MjkxLCBf X1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwogICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0 PHZvaWQ+ICAoKCBDYW5NZXRob2RJbnZvY2F0aW9uQ29udmVydChtZXRob2QgLT4gY29udGFpbmlu Z190eXBlIC0+IENvbnRhaW5pbmdUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgY2xhc3NfY3JlYXRpb24gLT4gYmFzZV9vcHQgLT4gVHlwZSgp KSApID8gMCA6CShfX2Fzc2VydF9mYWlsICgiQ2FuTWV0aG9kSW52b2NhdGlvbkNvbnZlcnQobWV0 aG9kIC0+IGNvbnRhaW5pbmdfdHlwZSAtPiBDb250YWluaW5nVHlwZSgpLCBjbGFzc19jcmVhdGlv biAtPiBiYXNlX29wdCAtPiBUeXBlKCkpIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5jcHAiLCA0 MjkzLCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwoKICAgICAgICAgICAgICAgIGNsYXNz X2NyZWF0aW9uIC0+IGJhc2Vfb3B0ID0gQ29udmVydFRvVHlwZShjbGFzc19jcmVhdGlvbiAtPiBi YXNlX29wdCwgbWV0aG9kIC0+IGNvbnRhaW5pbmdfdHlwZSAtPiBDb250YWluaW5nVHlwZSgpKTsK ICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc19jcmVh dGlvbiAtPiBOdW1Bcmd1bWVudHMoKTsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICBBc3RFeHByZXNzaW9uICpleHByID0gY2xhc3NfY3JlYXRpb24gLT4gQXJndW1lbnQoaSk7CiAg ICAgICAgICAgICAgICBpZiAoZXhwciAtPiBUeXBlKCkgIT0gbWV0aG9kIC0+IEZvcm1hbFBhcmFt ZXRlcihpKSAtPiBUeXBlKCkpCiAgICAgICAgICAgICAgICAgICAgY2xhc3NfY3JlYXRpb24gLT4g QXJndW1lbnQoaSkgPSBDb252ZXJ0VG9UeXBlKGV4cHIsIG1ldGhvZCAtPiBGb3JtYWxQYXJhbWV0 ZXIoaSkgLT4gVHlwZSgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNsYXNzX2Ny ZWF0aW9uIC0+IGNsYXNzX2JvZHlfb3B0KQogICAgICAgICAgICAgICAgYW5vbnltb3VzX3R5cGUg PSBHZXRBbm9ueW1vdXNUeXBlKGNsYXNzX2NyZWF0aW9uLCB0eXBlKTsKICAgICAgICAgICAgZWxz ZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAtPiBBQ0NfSU5URVJGQUNF KCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3Io U2VtYW50aWNFcnJvcjo6Tk9UX0FfQ0xBU1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgYWN0dWFsX3R5cGUgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgYWN0dWFsX3R5cGUgLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHR5cGUgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdl TmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgLT4gRXh0ZXJu YWxOYW1lKCkpOwogICAgICAgICAgICAgICAgICAgIGNsYXNzX2NyZWF0aW9uIC0+IHN5bWJvbCA9 IGNvbnRyb2wubm9fdHlwZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAg ICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlIC0+IEFDQ19BQlNUUkFDVCgpKQog ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFu dGljRXJyb3I6OkFCU1RSQUNUX1RZUEVfQ1JFQVRJT04sCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgYWN0dWFsX3R5cGUgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgYWN0dWFsX3R5cGUgLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgICAg ICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNsYXNzX2NyZWF0aW9uIC0+IGNsYXNzX3R5cGUg LT4gc3ltYm9sID0gbWV0aG9kOwoKICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb25fc2V0KQog ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtZXRob2Qg LT4gTnVtVGhyb3dzKCkgLSAxOyBpID49IDA7IGktLSkKICAgICAgICAgICAgICAgICAgICAgICAg ZXhjZXB0aW9uX3NldCAtPiBBZGRFbGVtZW50KG1ldGhvZCAtPiBUaHJvd3MoaSkpOwogICAgICAg ICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghIChUaGlzVHlwZSgpIC0+IEFub255bW91 cygpICYmIFRoaXNNZXRob2QoKSAmJiBUaGlzTWV0aG9kKCkgLT4gSWRlbnRpdHkoKSA9PSBjb250 cm9sLmJsb2NrX2luaXRfbmFtZV9zeW1ib2wpKQogICAgICAgICAgICAgICAgewogICAgICAgICAg ICAgICAgICAgIGZvciAoaW50IGsgPSBtZXRob2QgLT4gTnVtVGhyb3dzKCkgLSAxOyBrID49IDA7 IGstLSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVT eW1ib2wgKmV4Y2VwdGlvbiA9IG1ldGhvZCAtPiBUaHJvd3Moayk7CiAgICAgICAgICAgICAgICAg ICAgICAgIGlmICghIENhdGNoYWJsZUV4Y2VwdGlvbihleGNlcHRpb24pKQogICAgICAgICAgICAg ICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihT ZW1hbnRpY0Vycm9yOjpVTkNBVENIQUJMRV9DT05TVFJVQ1RPUl9USFJPV05fQ0hFQ0tFRF9FWENF UFRJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxf dHlwZSAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGFjdHVhbF90eXBlIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHR5cGUgLT4gRXh0ZXJuYWxOYW1lKCksCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24gLT4gQ29udGFpbmluZ1Bh Y2thZ2UoKSAtPiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZXhjZXB0aW9uIC0+IEV4dGVybmFsTmFtZSgpKTsKICAgICAgICAgICAgICAg ICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAg ICAgICAgfQoKICAgICAgICAgICAgY2xhc3NfY3JlYXRpb24gLT4gc3ltYm9sID0gKGFub255bW91 c190eXBlID8gYW5vbnltb3VzX3R5cGUgOiB0eXBlKTsKCiAgICAgICAgICAgICAKICAgICAgICAg ICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgKFRoaXNUeXBl KCkgIT0gdHlwZSAmJgogICAgICAgICAgICAgICAgVGhpc1R5cGUoKSAtPiBvdXRlcm1vc3RfdHlw ZSA9PSB0eXBlIC0+IG91dGVybW9zdF90eXBlICYmCiAgICAgICAgICAgICAgICBtZXRob2QgLT4g QUNDX1BSSVZBVEUoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCEgbWV0aG9k IC0+IExvY2FsQ29uc3RydWN0b3IoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg ICAgICBtZXRob2QgPSB0eXBlIC0+IEdldFJlYWRBY2Nlc3NNZXRob2QobWV0aG9kKTsKICAgICAg ICAgICAgICAgICAgICBjbGFzc19jcmVhdGlvbiAtPiBjbGFzc190eXBlIC0+IHN5bWJvbCA9IG1l dGhvZDsKCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAKICAgICAg ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgY2xhc3NfY3JlYXRpb24gLT4gQWRk TnVsbEFyZ3VtZW50KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAg ICAgZWxzZSBDb25zdHJ1Y3RvckFjY2Vzc0NoZWNrKGNsYXNzX2NyZWF0aW9uLCBtZXRob2QpOwoK ICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAog ICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgoISBhbm9ueW1vdXNfdHlwZSkgJiYgdHlwZSAt PiBJc0xvY2FsKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlIC0+IExv Y2FsQ2xhc3NQcm9jZXNzaW5nQ29tcGxldGVkKCkgJiYgbWV0aG9kIC0+IExvY2FsQ29uc3RydWN0 b3IoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8 dm9pZD4gICgoICEgbWV0aG9kIC0+IElzR2VuZXJhdGVkTG9jYWxDb25zdHJ1Y3RvcigpICkgPyAw IDoJKF9fYXNzZXJ0X2ZhaWwgKCIhIG1ldGhvZCAtPiBJc0dlbmVyYXRlZExvY2FsQ29uc3RydWN0 b3IoKSIgLCAiLi4vLi4vamlrZXMvc3JjL2V4cHIuY3BwIiwgNDM4NSwgX19QUkVUVFlfRlVOQ1RJ T05fXyApLCAwKSkpIDsKCiAgICAgICAgICAgICAgICAgICAgY2xhc3NfY3JlYXRpb24gLT4gY2xh c3NfdHlwZSAtPiBzeW1ib2wgPSBtZXRob2QgLT4gTG9jYWxDb25zdHJ1Y3RvcigpOwoKICAgICAg ICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dm9pZD4gICgoIG1ldGhvZCAtPiBMb2NhbENvbnN0 cnVjdG9yKCkgLT4gc2lnbmF0dXJlICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCJtZXRob2QgLT4g TG9jYWxDb25zdHJ1Y3RvcigpIC0+IHNpZ25hdHVyZSIgLCAiLi4vLi4vamlrZXMvc3JjL2V4cHIu Y3BwIiwgNDM4OSwgX19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKCiAgICAgICAgICAgICAg ICAgICAgZm9yIChpbnQgaSA9ICh0eXBlIC0+IEFDQ19TVEFUSUMoKSA/IDAgOiAxKTsgaSA8IHR5 cGUgLT4gTnVtQ29uc3RydWN0b3JQYXJhbWV0ZXJzKCk7IGkrKykKICAgICAgICAgICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3ltYm9sICpsb2NhbCA9IHR5cGUg LT4gQ29uc3RydWN0b3JQYXJhbWV0ZXIoaSkgLT4gYWNjZXNzZWRfbG9jYWw7CgogICAgICAgICAg ICAgICAgICAgICAgICBBc3RTaW1wbGVOYW1lICpzaW1wbGVfbmFtZSA9IGNvbXBpbGF0aW9uX3Vu aXQgLT4gYXN0X3Bvb2wgLT4gR2VuU2ltcGxlTmFtZShjbGFzc19jcmVhdGlvbiAtPiBuZXdfdG9r ZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAK ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg ICAgICAgICAgICAgICAgICAgIHNpbXBsZV9uYW1lIC0+IHN5bWJvbCA9ICh0eXBlIC0+IG93bmVy ID09IFRoaXNNZXRob2QoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgPyBsb2NhbAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUaGlzVHlwZSgpIC0+IEZp bmRPckluc2VydExvY2FsU2hhZG93KGxvY2FsKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNs YXNzX2NyZWF0aW9uIC0+IEFkZExvY2FsQXJndW1lbnQoc2ltcGxlX25hbWUpOwogICAgICAgICAg ICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgIAogICAg ICAgICAgICAgICAgICAgIHR5cGUgLT4gQWRkTG9jYWxDb25zdHJ1Y3RvckNhbGxFbnZpcm9ubWVu dChHZXRFbnZpcm9ubWVudChjbGFzc19jcmVhdGlvbikpOwogICAgICAgICAgICB9CiAgICAgICAg fQogICAgfQoKICAgIHJldHVybjsKfQoKCnZvaWQgU2VtYW50aWM6OlByb2Nlc3NBcnJheUNyZWF0 aW9uRXhwcmVzc2lvbihBc3QgKmV4cHIpCnsKICAgIEFzdEFycmF5Q3JlYXRpb25FeHByZXNzaW9u ICphcnJheV9jcmVhdGlvbiA9IChBc3RBcnJheUNyZWF0aW9uRXhwcmVzc2lvbiAqKSBleHByOwoK ICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIFN5bWJvbFNldCAqZXhjZXB0aW9uX3Nl dCA9IFRyeUV4Y2VwdGlvblRhYmxlU3RhY2soKS5Ub3AoKTsKICAgIGlmIChleGNlcHRpb25fc2V0 KQogICAgewogICAgICAgIGV4Y2VwdGlvbl9zZXQgLT4gQWRkRWxlbWVudChjb250cm9sLlJ1bnRp bWVFeGNlcHRpb24oKSk7CiAgICAgICAgZXhjZXB0aW9uX3NldCAtPiBBZGRFbGVtZW50KGNvbnRy b2wuRXJyb3IoKSk7CiAgICB9CgogICAgQXN0QXJyYXlUeXBlICphcnJheV90eXBlOwoKICAgIFR5 cGVTeW1ib2wgKnR5cGU7CgogICAgaWYgKChhcnJheV90eXBlID0gYXJyYXlfY3JlYXRpb24gLT4g YXJyYXlfdHlwZSAtPiBBcnJheVR5cGVDYXN0KCkpKQogICAgewogICAgICAgIEFzdFByaW1pdGl2 ZVR5cGUgKnByaW1pdGl2ZV90eXBlID0gYXJyYXlfdHlwZSAtPiB0eXBlIC0+IFByaW1pdGl2ZVR5 cGVDYXN0KCk7CiAgICAgICAgdHlwZSA9IChwcmltaXRpdmVfdHlwZSA/IEZpbmRQcmltaXRpdmVU eXBlKHByaW1pdGl2ZV90eXBlKSA6IE11c3RGaW5kVHlwZShhcnJheV90eXBlIC0+IHR5cGUpKTsK ICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBBc3RQcmltaXRpdmVUeXBlICpwcmltaXRpdmVf dHlwZSA9IGFycmF5X2NyZWF0aW9uIC0+IGFycmF5X3R5cGUgLT4gUHJpbWl0aXZlVHlwZUNhc3Qo KTsKICAgICAgICB0eXBlID0gKHByaW1pdGl2ZV90eXBlID8gRmluZFByaW1pdGl2ZVR5cGUocHJp bWl0aXZlX3R5cGUpIDogTXVzdEZpbmRUeXBlKGFycmF5X2NyZWF0aW9uIC0+IGFycmF5X3R5cGUp KTsKICAgIH0KCiAgICBpbnQgbnVtX2RpbWVuc2lvbnMgPSAoYXJyYXlfdHlwZSA/IGFycmF5X3R5 cGUgLT4gTnVtQnJhY2tldHMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg OiBhcnJheV9jcmVhdGlvbiAtPiBOdW1EaW1FeHBycygpICsgYXJyYXlfY3JlYXRpb24gLT4gTnVt QnJhY2tldHMoKSk7CgogICAgaWYgKG51bV9kaW1lbnNpb25zID4gMCkKICAgICAgICB0eXBlID0g dHlwZSAtPiBHZXRBcnJheVR5cGUoKFNlbWFudGljICopIHRoaXMsIG51bV9kaW1lbnNpb25zKTsK ICAgIGFycmF5X2NyZWF0aW9uIC0+IHN5bWJvbCA9IHR5cGU7CgogICAgZm9yIChpbnQgaSA9IDA7 IGkgPCBhcnJheV9jcmVhdGlvbiAtPiBOdW1EaW1FeHBycygpOyBpKyspCiAgICB7CiAgICAgICAg QXN0RGltRXhwciAqZGltX2V4cHIgPSBhcnJheV9jcmVhdGlvbiAtPiBEaW1FeHByKGkpOwogICAg ICAgIFByb2Nlc3NFeHByZXNzaW9uKGRpbV9leHByIC0+IGV4cHJlc3Npb24pOwogICAgICAgIEFz dEV4cHJlc3Npb24gKmV4cHIgPSBQcm9tb3RlVW5hcnlOdW1lcmljRXhwcmVzc2lvbihkaW1fZXhw ciAtPiBleHByZXNzaW9uKTsKICAgICAgICBpZiAoZXhwciAtPiBUeXBlKCkgIT0gY29udHJvbC5p bnRfdHlwZSAmJiBleHByIC0+IHN5bWJvbCAhPSBjb250cm9sLm5vX3R5cGUpCiAgICAgICAgewog ICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpUWVBFX05PVF9JTlRFR0VS LAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1fZXhwciAtPiBleHByZXNzaW9uIC0+IExl ZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1fZXhwciAtPiBleHByZXNz aW9uIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltX2V4cHIg LT4gZXhwcmVzc2lvbiAtPiBUeXBlKCkgLT4gTmFtZSgpKTsKICAgICAgICB9CiAgICAgICAgZGlt X2V4cHIgLT4gZXhwcmVzc2lvbiA9IGV4cHI7CiAgICB9CgogICAgaWYgKGFycmF5X2NyZWF0aW9u IC0+IGFycmF5X2luaXRpYWxpemVyX29wdCkKICAgICAgICBQcm9jZXNzQXJyYXlJbml0aWFsaXpl cigoQXN0QXJyYXlJbml0aWFsaXplciAqKSBhcnJheV9jcmVhdGlvbiAtPiBhcnJheV9pbml0aWFs aXplcl9vcHQsIHR5cGUpOwoKICAgIHJldHVybjsKfQoKCnZvaWQgU2VtYW50aWM6OlByb2Nlc3NQ b3N0VW5hcnlFeHByZXNzaW9uKEFzdCAqZXhwcikKewogICAgQXN0UG9zdFVuYXJ5RXhwcmVzc2lv biAqcG9zdGZpeF9leHByZXNzaW9uID0gKEFzdFBvc3RVbmFyeUV4cHJlc3Npb24gKikgZXhwcjsK CiAgICBQcm9jZXNzRXhwcmVzc2lvbihwb3N0Zml4X2V4cHJlc3Npb24gLT4gZXhwcmVzc2lvbik7 CiAgICBwb3N0Zml4X2V4cHJlc3Npb24gLT4gc3ltYm9sID0gcG9zdGZpeF9leHByZXNzaW9uIC0+ IGV4cHJlc3Npb24gLT4gc3ltYm9sOwoKICAgIGlmIChwb3N0Zml4X2V4cHJlc3Npb24gLT4gc3lt Ym9sICE9IGNvbnRyb2wubm9fdHlwZSkKICAgIHsKICAgICAgICBpZiAoISBwb3N0Zml4X2V4cHJl c3Npb24gLT4gZXhwcmVzc2lvbiAtPiBJc0xlZnRIYW5kU2lkZSgpKQogICAgICAgIHsKICAgICAg ICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6Tk9UX0FfTlVNRVJJQ19WQVJJQUJM RSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdGZpeF9leHByZXNzaW9uIC0+IGV4cHJl c3Npb24gLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RmaXhf ZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgcG9zdGZpeF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLT4gVHlwZSgpIC0+ IE5hbWUoKSk7CiAgICAgICAgICAgIHBvc3RmaXhfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBjb250 cm9sLm5vX3R5cGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCEgY29udHJvbC5Jc051bWVy aWMocG9zdGZpeF9leHByZXNzaW9uIC0+IFR5cGUoKSkpCiAgICAgICAgewogICAgICAgICAgICBS ZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpUWVBFX05PVF9OVU1FUklDLAogICAgICAgICAg ICAgICAgICAgICAgICAgICBwb3N0Zml4X2V4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiAtPiBMZWZ0 VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdGZpeF9leHByZXNzaW9uIC0+ IGV4cHJlc3Npb24gLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBw b3N0Zml4X2V4cHJlc3Npb24gLT4gVHlwZSgpIC0+IE5hbWUoKSk7CiAgICAgICAgICAgIHBvc3Rm aXhfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICAgICAgfQogICAg ICAgIGVsc2UgaWYgKCEgcG9zdGZpeF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLT4gQXJyYXlB Y2Nlc3NDYXN0KCkpICAKICAgICAgICB7CiAgICAgICAgICAgIE1ldGhvZFN5bWJvbCAqcmVhZF9t ZXRob2QgPSBfX251bGwgOwogICAgICAgICAgICBBc3RTaW1wbGVOYW1lICpzaW1wbGVfbmFtZSA9 IHBvc3RmaXhfZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC0+IFNpbXBsZU5hbWVDYXN0KCk7CiAg ICAgICAgICAgIGlmIChzaW1wbGVfbmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAg aWYgKHNpbXBsZV9uYW1lIC0+IHJlc29sdXRpb25fb3B0KQogICAgICAgICAgICAgICAgICAgcmVh ZF9tZXRob2QgPSBzaW1wbGVfbmFtZSAtPiByZXNvbHV0aW9uX29wdCAtPiBzeW1ib2wgLT4gTWV0 aG9kQ2FzdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgQXN0RmllbGRBY2Nlc3MgKmZpZWxkX2FjY2VzcyA9IChBc3RGaWVsZEFj Y2VzcyAqKSBwb3N0Zml4X2V4cHJlc3Npb24gLT4gZXhwcmVzc2lvbjsKICAgICAgICAgICAgICAg IGlmIChmaWVsZF9hY2Nlc3MgLT4gcmVzb2x1dGlvbl9vcHQpCiAgICAgICAgICAgICAgICAgICAg cmVhZF9tZXRob2QgPSBmaWVsZF9hY2Nlc3MgLT4gcmVzb2x1dGlvbl9vcHQgLT4gc3ltYm9sIC0+ IE1ldGhvZENhc3QoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgVmFyaWFibGVTeW1ib2wg KnZhcmlhYmxlX3N5bWJvbDsKICAgICAgICAgICAgaWYgKHJlYWRfbWV0aG9kKQogICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICB2YXJpYWJsZV9zeW1ib2wgPSAoVmFyaWFibGVTeW1ib2wgKikg cmVhZF9tZXRob2QgLT4gYWNjZXNzZWRfbWVtYmVyOwogICAgICAgICAgICAgICAgcG9zdGZpeF9l eHByZXNzaW9uIC0+IHdyaXRlX21ldGhvZCA9IHJlYWRfbWV0aG9kIC0+IGNvbnRhaW5pbmdfdHlw ZSAtPiBHZXRXcml0ZUFjY2Vzc01ldGhvZCh2YXJpYWJsZV9zeW1ib2wpOwogICAgICAgICAgICB9 CiAgICAgICAgICAgIGVsc2UgdmFyaWFibGVfc3ltYm9sID0gcG9zdGZpeF9leHByZXNzaW9uIC0+ IGV4cHJlc3Npb24gLT4gc3ltYm9sIC0+IFZhcmlhYmxlQ2FzdCgpOwogICAgICAgIH0KICAgIH0K CiAgICByZXR1cm47Cn0KCgp2b2lkIFNlbWFudGljOjpQcm9jZXNzUExVUyhBc3RQcmVVbmFyeUV4 cHJlc3Npb24gKmV4cHIpCnsKICAgIFByb2Nlc3NFeHByZXNzaW9uKGV4cHIgLT4gZXhwcmVzc2lv bik7CiAgICBleHByIC0+IGV4cHJlc3Npb24gPSBQcm9tb3RlVW5hcnlOdW1lcmljRXhwcmVzc2lv bihleHByIC0+IGV4cHJlc3Npb24pOwogICAgZXhwciAtPiB2YWx1ZSA9IGV4cHIgLT4gZXhwcmVz c2lvbiAtPiB2YWx1ZTsKICAgIGV4cHIgLT4gc3ltYm9sID0gZXhwciAtPiBleHByZXNzaW9uIC0+ IHN5bWJvbDsKfQoKCnZvaWQgU2VtYW50aWM6OlByb2Nlc3NNSU5VUyhBc3RQcmVVbmFyeUV4cHJl c3Npb24gKmV4cHIpCnsKICAgIEFzdEludGVnZXJMaXRlcmFsICppbnRfbGl0ZXJhbDsKICAgIEFz dExvbmdMaXRlcmFsICpsb25nX2xpdGVyYWw7CgogICAgaWYgKChpbnRfbGl0ZXJhbCA9IGV4cHIg LT4gZXhwcmVzc2lvbiAtPiBJbnRlZ2VyTGl0ZXJhbENhc3QoKSkpCiAgICB7CiAgICAgICAgTGl0 ZXJhbFN5bWJvbCAqbGl0ZXJhbCA9IGxleF9zdHJlYW0gLT4gTGl0ZXJhbFN5bWJvbChpbnRfbGl0 ZXJhbCAtPiBpbnRlZ2VyX2xpdGVyYWxfdG9rZW4pOwoKICAgICAgICBleHByIC0+IHZhbHVlID0g Y29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnROZWdhdGl2ZUludChsaXRlcmFsKTsKICAgICAg ICBpZiAoZXhwciAtPiB2YWx1ZSA9PSBjb250cm9sLkJhZFZhbHVlKCkpCiAgICAgICAgewogICAg ICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpJTlZBTElEX0lOVF9WQUxVRSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgZXhwciAtPiBSaWdodFRva2VuKCkpOwogICAgICAgICAgICBleHBy IC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBleHBy IC0+IHN5bWJvbCA9IGNvbnRyb2wuaW50X3R5cGU7CiAgICB9CiAgICBlbHNlIGlmICgobG9uZ19s aXRlcmFsID0gZXhwciAtPiBleHByZXNzaW9uIC0+IExvbmdMaXRlcmFsQ2FzdCgpKSkKICAgIHsK ICAgICAgICBMaXRlcmFsU3ltYm9sICpsaXRlcmFsID0gbGV4X3N0cmVhbSAtPiBMaXRlcmFsU3lt Ym9sKGxvbmdfbGl0ZXJhbCAtPiBsb25nX2xpdGVyYWxfdG9rZW4pOwoKICAgICAgICBleHByIC0+ IHZhbHVlID0gY29udHJvbC5sb25nX3Bvb2wuRmluZE9ySW5zZXJ0TmVnYXRpdmVMb25nKGxpdGVy YWwpOwogICAgICAgIGlmIChleHByIC0+IHZhbHVlID09IGNvbnRyb2wuQmFkVmFsdWUoKSkKICAg ICAgICB7CiAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OklOVkFMSURf TE9OR19WQUxVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBMZWZ0VG9rZW4o KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBSaWdodFRva2VuKCkpOwogICAg ICAgICAgICBleHByIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgICAgICB9CiAgICAg ICAgZWxzZSBleHByIC0+IHN5bWJvbCA9IGNvbnRyb2wubG9uZ190eXBlOwogICAgfQogICAgZWxz ZQogICAgewogICAgICAgIFByb2Nlc3NFeHByZXNzaW9uKGV4cHIgLT4gZXhwcmVzc2lvbik7Cgog ICAgICAgIGV4cHIgLT4gZXhwcmVzc2lvbiA9IFByb21vdGVVbmFyeU51bWVyaWNFeHByZXNzaW9u KGV4cHIgLT4gZXhwcmVzc2lvbik7CiAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBleHByIC0+IGV4 cHJlc3Npb24gLT4gc3ltYm9sOwogICAgICAgIGlmIChleHByIC0+IGV4cHJlc3Npb24gLT4gSXND b25zdGFudCgpKQogICAgICAgIHsKICAgICAgICAgICAgVHlwZVN5bWJvbCAqdHlwZSA9IGV4cHIg LT4gVHlwZSgpOwoKICAgICAgICAgICAgaWYgKCh0eXBlID09IGNvbnRyb2wuZG91YmxlX3R5cGUp KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBEb3VibGVMaXRlcmFsVmFsdWUgKmxpdGVy YWwgPSAoRG91YmxlTGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gZXhwcmVzc2lvbiAtPiB2YWx1ZTsK ICAgICAgICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmRvdWJsZV9wb29sLkZpbmRP ckluc2VydCgtbGl0ZXJhbCAtPiB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxz ZSBpZiAoKHR5cGUgPT0gY29udHJvbC5mbG9hdF90eXBlKSkKICAgICAgICAgICAgewogICAgICAg ICAgICAgICAgRmxvYXRMaXRlcmFsVmFsdWUgKmxpdGVyYWwgPSAoRmxvYXRMaXRlcmFsVmFsdWUg KikgZXhwciAtPiBleHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgZXhwciAtPiB2 YWx1ZSA9IGNvbnRyb2wuZmxvYXRfcG9vbC5GaW5kT3JJbnNlcnQoLWxpdGVyYWwgLT4gdmFsdWUp OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCh0eXBlID09IGNvbnRyb2wubG9u Z190eXBlKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTG9uZ0xpdGVyYWxWYWx1ZSAq bGl0ZXJhbCA9IChMb25nTGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gZXhwcmVzc2lvbiAtPiB2YWx1 ZTsKICAgICAgICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmxvbmdfcG9vbC5GaW5k T3JJbnNlcnQoLWxpdGVyYWwgLT4gdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVs c2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICpsaXRlcmFs ID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IGV4cHJlc3Npb24gLT4gdmFsdWU7CiAgICAg ICAgICAgICAgICBleHByIC0+IHZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQo LWxpdGVyYWwgLT4gdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJl dHVybjsKfQoKCnZvaWQgU2VtYW50aWM6OlByb2Nlc3NUV0lERExFKEFzdFByZVVuYXJ5RXhwcmVz c2lvbiAqZXhwcikKewogICAgUHJvY2Vzc0V4cHJlc3Npb24oZXhwciAtPiBleHByZXNzaW9uKTsK CiAgICBpZiAoZXhwciAtPiBleHByZXNzaW9uIC0+IHN5bWJvbCAhPSBjb250cm9sLm5vX3R5cGUg JiYgKCEgY29udHJvbC5Jc0ludGVncmFsKGV4cHIgLT4gZXhwcmVzc2lvbiAtPiBUeXBlKCkpKSkK ICAgIHsKICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpUWVBFX05PVF9JTlRF R1JBTCwKICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IGV4cHJlc3Npb24gLT4gTGVmdFRv a2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBleHByZXNzaW9uIC0+IFJpZ2h0 VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IGV4cHJlc3Npb24gLT4gVHlw ZSgpIC0+IE5hbWUoKSk7CiAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7 CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZXhwciAtPiBleHByZXNzaW9uID0gUHJvbW90 ZVVuYXJ5TnVtZXJpY0V4cHJlc3Npb24oZXhwciAtPiBleHByZXNzaW9uKTsKCiAgICAgICAgaWYg KGV4cHIgLT4gZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50KCkpCiAgICAgICAgewogICAgICAgICAg ICBpZiAoZXhwciAtPiBleHByZXNzaW9uIC0+IFR5cGUoKSA9PSBjb250cm9sLmxvbmdfdHlwZSkK ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTG9uZ0xpdGVyYWxWYWx1ZSAqbGl0ZXJhbCA9 IChMb25nTGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAg ICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmxvbmdfcG9vbC5GaW5kT3JJbnNlcnQo fmxpdGVyYWwgLT4gdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIAogICAg ICAgICAgICB7CiAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKmxpdGVyYWwgPSAoSW50 TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAg ICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPckluc2VydCh+bGl0ZXJh bCAtPiB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwciAtPiBzeW1i b2wgPSBleHByIC0+IGV4cHJlc3Npb24gLT4gc3ltYm9sOwogICAgfQoKICAgIHJldHVybjsKfQoK CnZvaWQgU2VtYW50aWM6OlByb2Nlc3NOT1QoQXN0UHJlVW5hcnlFeHByZXNzaW9uICpleHByKQp7 CiAgICBQcm9jZXNzRXhwcmVzc2lvbihleHByIC0+IGV4cHJlc3Npb24pOwoKICAgIGlmIChleHBy IC0+IGV4cHJlc3Npb24gLT4gc3ltYm9sICE9IGNvbnRyb2wubm9fdHlwZSAmJiBleHByIC0+IGV4 cHJlc3Npb24gLT4gVHlwZSgpICE9IGNvbnRyb2wuYm9vbGVhbl90eXBlKQogICAgewogICAgICAg IFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlRZUEVfTk9UX0JPT0xFQU4sCiAgICAgICAg ICAgICAgICAgICAgICAgZXhwciAtPiBleHByZXNzaW9uIC0+IExlZnRUb2tlbigpLAogICAgICAg ICAgICAgICAgICAgICAgIGV4cHIgLT4gZXhwcmVzc2lvbiAtPiBSaWdodFRva2VuKCksCiAgICAg ICAgICAgICAgICAgICAgICAgZXhwciAtPiBleHByZXNzaW9uIC0+IFR5cGUoKSAtPiBOYW1lKCkp OwogICAgICAgIGV4cHIgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgfQogICAgZWxz ZQogICAgewogICAgICAgIGlmIChleHByIC0+IGV4cHJlc3Npb24gLT4gSXNDb25zdGFudCgpKQog ICAgICAgIHsKICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICpsaXRlcmFsID0gKEludExpdGVy YWxWYWx1ZSAqKSBleHByIC0+IGV4cHJlc3Npb24gLT4gdmFsdWU7CiAgICAgICAgICAgIGV4cHIg LT4gdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPckluc2VydChsaXRlcmFsIC0+IHZhbHVl ID8gMCA6IDEpOwogICAgICAgIH0KICAgICAgICBleHByIC0+IHN5bWJvbCA9IGNvbnRyb2wuYm9v bGVhbl90eXBlOwogICAgfQoKICAgIHJldHVybjsKfQoKCnZvaWQgU2VtYW50aWM6OlByb2Nlc3NQ TFVTUExVU09yTUlOVVNNSU5VUyhBc3RQcmVVbmFyeUV4cHJlc3Npb24gKmV4cHIpCnsKICAgIFBy b2Nlc3NFeHByZXNzaW9uKGV4cHIgLT4gZXhwcmVzc2lvbik7CgogICAgaWYgKGV4cHIgLT4gZXhw cmVzc2lvbiAtPiBzeW1ib2wgIT0gY29udHJvbC5ub190eXBlKQogICAgewogICAgICAgIGlmICgh IGV4cHIgLT4gZXhwcmVzc2lvbiAtPiBJc0xlZnRIYW5kU2lkZSgpKQogICAgICAgIHsKICAgICAg ICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6Tk9UX0FfTlVNRVJJQ19WQVJJQUJM RSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBleHByZXNzaW9uIC0+IExlZnRU b2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IGV4cHJlc3Npb24gLT4g UmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IGV4cHJlc3Np b24gLT4gVHlwZSgpIC0+IE5hbWUoKSk7CiAgICAgICAgICAgIGV4cHIgLT4gc3ltYm9sID0gY29u dHJvbC5ub190eXBlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghIGNvbnRyb2wuSXNOdW1l cmljKGV4cHIgLT4gZXhwcmVzc2lvbiAtPiBUeXBlKCkpKQogICAgICAgIHsKICAgICAgICAgICAg UmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VFlQRV9OT1RfTlVNRVJJQywKICAgICAgICAg ICAgICAgICAgICAgICAgICAgZXhwciAtPiBleHByZXNzaW9uIC0+IExlZnRUb2tlbigpLAogICAg ICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IGV4cHJlc3Npb24gLT4gUmlnaHRUb2tlbigp LAogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IGV4cHJlc3Npb24gLT4gVHlwZSgp IC0+IE5hbWUoKSk7CiAgICAgICAgICAgIGV4cHIgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBl OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghIGV4cHIgLT4gZXhwcmVzc2lvbiAtPiBBcnJh eUFjY2Vzc0Nhc3QoKSkgIAogICAgICAgIHsKICAgICAgICAgICAgTWV0aG9kU3ltYm9sICpyZWFk X21ldGhvZCA9IF9fbnVsbCA7CiAgICAgICAgICAgIEFzdFNpbXBsZU5hbWUgKnNpbXBsZV9uYW1l ID0gZXhwciAtPiBleHByZXNzaW9uIC0+IFNpbXBsZU5hbWVDYXN0KCk7CiAgICAgICAgICAgIGlm IChzaW1wbGVfbmFtZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKHNpbXBsZV9u YW1lIC0+IHJlc29sdXRpb25fb3B0KQogICAgICAgICAgICAgICAgICAgcmVhZF9tZXRob2QgPSBz aW1wbGVfbmFtZSAtPiByZXNvbHV0aW9uX29wdCAtPiBzeW1ib2wgLT4gTWV0aG9kQ2FzdCgpOwog ICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAg ICAgQXN0RmllbGRBY2Nlc3MgKmZpZWxkX2FjY2VzcyA9IChBc3RGaWVsZEFjY2VzcyAqKSBleHBy IC0+IGV4cHJlc3Npb247CiAgICAgICAgICAgICAgICBpZiAoZmllbGRfYWNjZXNzIC0+IHJlc29s dXRpb25fb3B0KQogICAgICAgICAgICAgICAgICAgIHJlYWRfbWV0aG9kID0gZmllbGRfYWNjZXNz IC0+IHJlc29sdXRpb25fb3B0IC0+IHN5bWJvbCAtPiBNZXRob2RDYXN0KCk7CiAgICAgICAgICAg IH0KCiAgICAgICAgICAgIFZhcmlhYmxlU3ltYm9sICp2YXJpYWJsZV9zeW1ib2w7CiAgICAgICAg ICAgIGlmIChyZWFkX21ldGhvZCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyaWFi bGVfc3ltYm9sID0gKFZhcmlhYmxlU3ltYm9sICopIHJlYWRfbWV0aG9kIC0+IGFjY2Vzc2VkX21l bWJlcjsKICAgICAgICAgICAgICAgIGV4cHIgLT4gd3JpdGVfbWV0aG9kID0gcmVhZF9tZXRob2Qg LT4gY29udGFpbmluZ190eXBlIC0+IEdldFdyaXRlQWNjZXNzTWV0aG9kKHZhcmlhYmxlX3N5bWJv bCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB2YXJpYWJsZV9zeW1ib2wgPSBleHBy IC0+IGV4cHJlc3Npb24gLT4gc3ltYm9sIC0+IFZhcmlhYmxlQ2FzdCgpOwogICAgICAgIH0KICAg IH0KICAgIGV4cHIgLT4gc3ltYm9sID0gZXhwciAtPiBleHByZXNzaW9uIC0+IHN5bWJvbDsKCiAg ICByZXR1cm47Cn0KCgp2b2lkIFNlbWFudGljOjpQcm9jZXNzUHJlVW5hcnlFeHByZXNzaW9uKEFz dCAqZXhwcikKewogICAgQXN0UHJlVW5hcnlFeHByZXNzaW9uICpwcmVmaXhfZXhwcmVzc2lvbiA9 IChBc3RQcmVVbmFyeUV4cHJlc3Npb24gKikgZXhwcjsKICAgICh0aGlzIC0+KiBQcm9jZXNzUHJl VW5hcnlFeHByW3ByZWZpeF9leHByZXNzaW9uIC0+IHByZV91bmFyeV90YWddKShwcmVmaXhfZXhw cmVzc2lvbik7CgogICAgcmV0dXJuOwp9CgoKaW5saW5lIGJvb2wgU2VtYW50aWM6OkNhbldpZGVu aW5nUHJpbWl0aXZlQ29udmVydChUeXBlU3ltYm9sICp0YXJnZXRfdHlwZSwgVHlwZVN5bWJvbCAq c291cmNlX3R5cGUpCnsKICAgIGlmICh0YXJnZXRfdHlwZSA9PSBjb250cm9sLmRvdWJsZV90eXBl KQogICAgICAgICByZXR1cm4gKHNvdXJjZV90eXBlID09IGNvbnRyb2wuZmxvYXRfdHlwZSB8fCBz b3VyY2VfdHlwZSA9PSBjb250cm9sLmxvbmdfdHlwZSAgfHwgc291cmNlX3R5cGUgPT0gY29udHJv bC5pbnRfdHlwZSB8fAogICAgICAgICAgICAgICAgIHNvdXJjZV90eXBlID09IGNvbnRyb2wuY2hh cl90eXBlICB8fCBzb3VyY2VfdHlwZSA9PSBjb250cm9sLnNob3J0X3R5cGUgfHwgc291cmNlX3R5 cGUgPT0gY29udHJvbC5ieXRlX3R5cGUpOwogICAgZWxzZSBpZiAodGFyZ2V0X3R5cGUgPT0gY29u dHJvbC5mbG9hdF90eXBlKQogICAgICAgICByZXR1cm4gKHNvdXJjZV90eXBlID09IGNvbnRyb2wu bG9uZ190eXBlICB8fCBzb3VyY2VfdHlwZSA9PSBjb250cm9sLmludF90eXBlICAgfHwKICAgICAg ICAgICAgICAgICBzb3VyY2VfdHlwZSA9PSBjb250cm9sLmNoYXJfdHlwZSAgfHwgc291cmNlX3R5 cGUgPT0gY29udHJvbC5zaG9ydF90eXBlIHx8IHNvdXJjZV90eXBlID09IGNvbnRyb2wuYnl0ZV90 eXBlKTsKICAgIGVsc2UgaWYgKHRhcmdldF90eXBlID09IGNvbnRyb2wubG9uZ190eXBlKQogICAg ICAgICByZXR1cm4gKHNvdXJjZV90eXBlID09IGNvbnRyb2wuaW50X3R5cGUgICB8fCBzb3VyY2Vf dHlwZSA9PSBjb250cm9sLmNoYXJfdHlwZSAgfHwKICAgICAgICAgICAgICAgICBzb3VyY2VfdHlw ZSA9PSBjb250cm9sLnNob3J0X3R5cGUgfHwgc291cmNlX3R5cGUgPT0gY29udHJvbC5ieXRlX3R5 cGUpOwogICAgZWxzZSBpZiAodGFyZ2V0X3R5cGUgPT0gY29udHJvbC5pbnRfdHlwZSkKICAgICAg ICAgcmV0dXJuIChzb3VyY2VfdHlwZSA9PSBjb250cm9sLmNoYXJfdHlwZSAgfHwgc291cmNlX3R5 cGUgPT0gY29udHJvbC5zaG9ydF90eXBlIHx8IHNvdXJjZV90eXBlID09IGNvbnRyb2wuYnl0ZV90 eXBlKTsKICAgIGVsc2UgaWYgKHRhcmdldF90eXBlID09IGNvbnRyb2wuc2hvcnRfdHlwZSkKICAg ICAgICAgcmV0dXJuIHNvdXJjZV90eXBlID09IGNvbnRyb2wuYnl0ZV90eXBlOwoKICAgIHJldHVy biBmYWxzZTsKfQoKCmlubGluZSBib29sIFNlbWFudGljOjpDYW5OYXJyb3dpbmdQcmltaXRpdmVD b252ZXJ0KFR5cGVTeW1ib2wgKnRhcmdldF90eXBlLCBUeXBlU3ltYm9sICpzb3VyY2VfdHlwZSkK ewogICAgaWYgKHRhcmdldF90eXBlID09IGNvbnRyb2wuYnl0ZV90eXBlKQogICAgICAgICByZXR1 cm4gKHNvdXJjZV90eXBlID09IGNvbnRyb2wuZG91YmxlX3R5cGUgfHwgc291cmNlX3R5cGUgPT0g Y29udHJvbC5mbG9hdF90eXBlIHx8IHNvdXJjZV90eXBlID09IGNvbnRyb2wubG9uZ190eXBlIHx8 CiAgICAgICAgICAgICAgICAgc291cmNlX3R5cGUgPT0gY29udHJvbC5pbnRfdHlwZSAgICB8fCBz b3VyY2VfdHlwZSA9PSBjb250cm9sLmNoYXJfdHlwZSAgfHwgc291cmNlX3R5cGUgPT0gY29udHJv bC5zaG9ydF90eXBlKTsKICAgIGVsc2UgaWYgKHRhcmdldF90eXBlID09IGNvbnRyb2wuY2hhcl90 eXBlKQogICAgICAgICByZXR1cm4gKHNvdXJjZV90eXBlID09IGNvbnRyb2wuZG91YmxlX3R5cGUg fHwgc291cmNlX3R5cGUgPT0gY29udHJvbC5mbG9hdF90eXBlIHx8IHNvdXJjZV90eXBlID09IGNv bnRyb2wubG9uZ190eXBlIHx8CiAgICAgICAgICAgICAgICAgc291cmNlX3R5cGUgPT0gY29udHJv bC5pbnRfdHlwZSAgICB8fCBzb3VyY2VfdHlwZSA9PSBjb250cm9sLnNob3J0X3R5cGUgfHwgc291 cmNlX3R5cGUgPT0gY29udHJvbC5ieXRlX3R5cGUpOwogICAgZWxzZSBpZiAodGFyZ2V0X3R5cGUg PT0gY29udHJvbC5zaG9ydF90eXBlKQogICAgICAgICByZXR1cm4gKHNvdXJjZV90eXBlID09IGNv bnRyb2wuZG91YmxlX3R5cGUgfHwgc291cmNlX3R5cGUgPT0gY29udHJvbC5mbG9hdF90eXBlIHx8 CiAgICAgICAgICAgICAgICAgc291cmNlX3R5cGUgPT0gY29udHJvbC5sb25nX3R5cGUgICB8fCBz b3VyY2VfdHlwZSA9PSBjb250cm9sLmludF90eXBlICAgfHwgc291cmNlX3R5cGUgPT0gY29udHJv bC5jaGFyX3R5cGUpOwogICAgZWxzZSBpZiAodGFyZ2V0X3R5cGUgPT0gY29udHJvbC5pbnRfdHlw ZSkKICAgICAgICAgcmV0dXJuIChzb3VyY2VfdHlwZSA9PSBjb250cm9sLmRvdWJsZV90eXBlIHx8 IHNvdXJjZV90eXBlID09IGNvbnRyb2wuZmxvYXRfdHlwZSB8fCBzb3VyY2VfdHlwZSA9PSBjb250 cm9sLmxvbmdfdHlwZSk7CiAgICBlbHNlIGlmICh0YXJnZXRfdHlwZSA9PSBjb250cm9sLmxvbmdf dHlwZSkKICAgICAgICAgcmV0dXJuIChzb3VyY2VfdHlwZSA9PSBjb250cm9sLmRvdWJsZV90eXBl IHx8IHNvdXJjZV90eXBlID09IGNvbnRyb2wuZmxvYXRfdHlwZSk7CiAgICBlbHNlIGlmICh0YXJn ZXRfdHlwZSA9PSBjb250cm9sLmZsb2F0X3R5cGUpCiAgICAgICAgIHJldHVybiBzb3VyY2VfdHlw ZSA9PSBjb250cm9sLmRvdWJsZV90eXBlOwoKICAgIHJldHVybiBmYWxzZTsKfQoKCmJvb2wgU2Vt YW50aWM6OkNhbk1ldGhvZEludm9jYXRpb25Db252ZXJ0KFR5cGVTeW1ib2wgKnRhcmdldF90eXBl LCBUeXBlU3ltYm9sICpzb3VyY2VfdHlwZSkKewogICAgaWYgKHRhcmdldF90eXBlID09IGNvbnRy b2wubm9fdHlwZSB8fCBzb3VyY2VfdHlwZSA9PSBjb250cm9sLm5vX3R5cGUpCiAgICAgICAgcmV0 dXJuIGZhbHNlOwoKICAgIGlmIChzb3VyY2VfdHlwZSAtPiBQcmltaXRpdmUoKSkKICAgIHsKICAg ICAgICBpZiAoISB0YXJnZXRfdHlwZSAtPiBQcmltaXRpdmUoKSkKICAgICAgICAgICAgcmV0dXJu IGZhbHNlOwoKICAgICAgICByZXR1cm4gKHRhcmdldF90eXBlID09IHNvdXJjZV90eXBlIHx8IENh bldpZGVuaW5nUHJpbWl0aXZlQ29udmVydCh0YXJnZXRfdHlwZSwgc291cmNlX3R5cGUpKTsKICAg IH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAodGFyZ2V0X3R5cGUgLT4gUHJpbWl0aXZlKCkp CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgaWYgKHNvdXJjZV90eXBlIC0+IElz QXJyYXkoKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0YXJnZXRfdHlwZSAtPiBJc0FycmF5 KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGVTeW1ib2wgKnNvdXJjZV9zdWJ0 eXBlID0gc291cmNlX3R5cGUgLT4gQXJyYXlTdWJ0eXBlKCk7CiAgICAgICAgICAgICAgICBUeXBl U3ltYm9sICp0YXJnZXRfc3VidHlwZSA9IHRhcmdldF90eXBlIC0+IEFycmF5U3VidHlwZSgpOwog ICAgICAgICAgICAgICAgcmV0dXJuIChzb3VyY2Vfc3VidHlwZSAtPiBQcmltaXRpdmUoKSAmJiB0 YXJnZXRfc3VidHlwZSAtPiBQcmltaXRpdmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoc291cmNlX3N1YnR5cGUgPT0gdGFyZ2V0X3N1 YnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICA6IENhbk1ldGhvZEludm9jYXRpb25Db252ZXJ0KHRhcmdldF9zdWJ0eXBlLCBzb3VyY2Vf c3VidHlwZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAodGFyZ2V0X3R5cGUg PT0gY29udHJvbC5PYmplY3QoKSB8fAogICAgICAgICAgICAgICAgICAgIHRhcmdldF90eXBlID09 IGNvbnRyb2wuQ2xvbmVhYmxlKCkgfHwKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAodGFy Z2V0X3R5cGUgPT0gY29udHJvbC5TZXJpYWxpemFibGUoKSAmJiBzb3VyY2VfdHlwZSAtPiBJbXBs ZW1lbnRzKHRhcmdldF90eXBlKSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzb3VyY2Vf dHlwZSAtPiBBQ0NfSU5URVJGQUNFKCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAodGFyZ2V0 X3R5cGUgLT4gQUNDX0lOVEVSRkFDRSgpKQogICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2Vf dHlwZSAtPiBJc1N1YmludGVyZmFjZSh0YXJnZXRfdHlwZSk7CiAgICAgICAgICAgIGVsc2UgaWYg KHRhcmdldF90eXBlICE9IGNvbnRyb2wuT2JqZWN0KCkpICAKICAgICAgICAgICAgICAgICByZXR1 cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNvdXJjZV90eXBlICE9IGNvbnRy b2wubnVsbF90eXBlKSAgCiAgICAgICAgewogICAgICAgICAgICBpZiAodGFyZ2V0X3R5cGUgLT4g SXNBcnJheSgpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgZWxz ZSBpZiAodGFyZ2V0X3R5cGUgLT4gQUNDX0lOVEVSRkFDRSgpKQogICAgICAgICAgICAgICAgIHJl dHVybiBzb3VyY2VfdHlwZSAtPiBJbXBsZW1lbnRzKHRhcmdldF90eXBlKTsKICAgICAgICAgICAg ZWxzZSBpZiAoISBzb3VyY2VfdHlwZSAtPiBJc1N1YmNsYXNzKHRhcmdldF90eXBlKSkKICAgICAg ICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVl Owp9CgoKYm9vbCBTZW1hbnRpYzo6Q2FuQXNzaWdubWVudENvbnZlcnRSZWZlcmVuY2UoVHlwZVN5 bWJvbCAqdGFyZ2V0X3R5cGUsIFR5cGVTeW1ib2wgKnNvdXJjZV90eXBlKQp7CiAgICByZXR1cm4g KHRhcmdldF90eXBlID09IGNvbnRyb2wubm9fdHlwZSB8fAogICAgICAgICAgICBzb3VyY2VfdHlw ZSA9PSBjb250cm9sLm5vX3R5cGUgfHwKICAgICAgICAgICAgQ2FuTWV0aG9kSW52b2NhdGlvbkNv bnZlcnQodGFyZ2V0X3R5cGUsIHNvdXJjZV90eXBlKQogICAgICAgICAgICk7Cn0KCgpib29sIFNl bWFudGljOjpDYW5Bc3NpZ25tZW50Q29udmVydChUeXBlU3ltYm9sICp0YXJnZXRfdHlwZSwgQXN0 RXhwcmVzc2lvbiAqZXhwcikKewogICAgcmV0dXJuICh0YXJnZXRfdHlwZSA9PSBjb250cm9sLm5v X3R5cGUgfHwKICAgICAgICAgICAgZXhwciAtPiBzeW1ib2wgPT0gY29udHJvbC5ub190eXBlIHx8 CiAgICAgICAgICAgIENhbk1ldGhvZEludm9jYXRpb25Db252ZXJ0KHRhcmdldF90eXBlLCBleHBy IC0+IFR5cGUoKSkgfHwKICAgICAgICAgICAgSXNJbnRWYWx1ZVJlcHJlc2VudGFibGVJblR5cGUo ZXhwciwgdGFyZ2V0X3R5cGUpCiAgICAgICAgICAgKTsKfQoKCmJvb2wgU2VtYW50aWM6OkNhbkNh c3RDb252ZXJ0KFR5cGVTeW1ib2wgKnRhcmdldF90eXBlLCBUeXBlU3ltYm9sICpzb3VyY2VfdHlw ZSwgTGV4U3RyZWFtOjpUb2tlbkluZGV4IHRvaykKewogICAgaWYgKHNvdXJjZV90eXBlID09IHRh cmdldF90eXBlIHx8IHNvdXJjZV90eXBlID09IGNvbnRyb2wubm9fdHlwZSB8fCB0YXJnZXRfdHlw ZSA9PSBjb250cm9sLm5vX3R5cGUpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgaWYgKHNvdXJj ZV90eXBlIC0+IFByaW1pdGl2ZSgpKQogICAgewogICAgICAgIGlmICghIHRhcmdldF90eXBlIC0+ IFByaW1pdGl2ZSgpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgIHJldHVybiAo Q2FuV2lkZW5pbmdQcmltaXRpdmVDb252ZXJ0KHRhcmdldF90eXBlLCBzb3VyY2VfdHlwZSkgfHwg Q2FuTmFycm93aW5nUHJpbWl0aXZlQ29udmVydCh0YXJnZXRfdHlwZSwgc291cmNlX3R5cGUpKTsK ICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAodGFyZ2V0X3R5cGUgLT4gUHJpbWl0aXZl KCkpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgaWYgKHNvdXJjZV90eXBlIC0+ IElzQXJyYXkoKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0YXJnZXRfdHlwZSAtPiBJc0Fy cmF5KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFR5cGVTeW1ib2wgKnNvdXJjZV9z dWJ0eXBlID0gc291cmNlX3R5cGUgLT4gQXJyYXlTdWJ0eXBlKCk7CiAgICAgICAgICAgICAgICBU eXBlU3ltYm9sICp0YXJnZXRfc3VidHlwZSA9IHRhcmdldF90eXBlIC0+IEFycmF5U3VidHlwZSgp OwogICAgICAgICAgICAgICAgcmV0dXJuIChzb3VyY2Vfc3VidHlwZSAtPiBQcmltaXRpdmUoKSAm JiB0YXJnZXRfc3VidHlwZSAtPiBQcmltaXRpdmUoKQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoc291cmNlX3N1YnR5cGUgPT0gdGFyZ2V0 X3N1YnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA6IENhbkNhc3RDb252ZXJ0KHRhcmdldF9zdWJ0eXBlLCBzb3VyY2Vfc3VidHlwZSwg dG9rKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICh0YXJnZXRfdHlwZSA9PSBj b250cm9sLk9iamVjdCgpIHx8CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3R5cGUgPT0gY29u dHJvbC5DbG9uZWFibGUoKSB8fAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg ICAgICAgCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICh0YXJnZXRf dHlwZSA9PSBjb250cm9sLlNlcmlhbGl6YWJsZSgpICYmIHNvdXJjZV90eXBlIC0+IEltcGxlbWVu dHModGFyZ2V0X3R5cGUpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNvdXJjZV90eXBl IC0+IEFDQ19JTlRFUkZBQ0UoKSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh0YXJnZXRfdHlw ZSAtPiBBQ0NfSU5URVJGQUNFKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgh IHNvdXJjZV90eXBlIC0+IGV4cGFuZGVkX21ldGhvZF90YWJsZSkKICAgICAgICAgICAgICAgICAg ICBDb21wdXRlTWV0aG9kc0Nsb3N1cmUoc291cmNlX3R5cGUsIHRvayk7CiAgICAgICAgICAgICAg ICBpZiAoISB0YXJnZXRfdHlwZSAtPiBleHBhbmRlZF9tZXRob2RfdGFibGUpCiAgICAgICAgICAg ICAgICAgICAgQ29tcHV0ZU1ldGhvZHNDbG9zdXJlKHRhcmdldF90eXBlLCB0b2spOwoKICAgICAg ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIEV4cGFuZGVkTWV0aG9k VGFibGUgKnNvdXJjZV9tZXRob2RfdGFibGUgPSBzb3VyY2VfdHlwZSAtPiBleHBhbmRlZF9tZXRo b2RfdGFibGU7CiAgICAgICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgICAgIGZvciAoaSA9 IDA7IGkgPCBzb3VyY2VfbWV0aG9kX3RhYmxlIC0+IHN5bWJvbF9wb29sLkxlbmd0aCgpOyBpKysp CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTWV0aG9kU3ltYm9sICptZXRo b2QxID0gc291cmNlX21ldGhvZF90YWJsZSAtPiBzeW1ib2xfcG9vbFtpXSAtPiBtZXRob2Rfc3lt Ym9sOwogICAgICAgICAgICAgICAgICAgIE1ldGhvZFNoYWRvd1N5bWJvbCAqbWV0aG9kX3NoYWRv dzIgPSB0YXJnZXRfdHlwZSAtPiBleHBhbmRlZF9tZXRob2RfdGFibGUKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4g RmluZE92ZXJsb2FkTWV0aG9kU2hhZG93KG1ldGhvZDEsIChTZW1hbnRpYyAqKSB0aGlzLCB0b2sp OwogICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2Rfc2hhZG93MikKICAgICAgICAgICAgICAg ICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG1ldGhvZDEgLT4gSXNUeXBlZCgp KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kMSAtPiBQcm9jZXNzTWV0aG9kU2ln bmF0dXJlKChTZW1hbnRpYyAqKSB0aGlzLCB0b2spOwoKICAgICAgICAgICAgICAgICAgICAgICAg TWV0aG9kU3ltYm9sICptZXRob2QyID0gbWV0aG9kX3NoYWRvdzIgLT4gbWV0aG9kX3N5bWJvbDsK ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbWV0aG9kMiAtPiBJc1R5cGVkKCkpCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QyIC0+IFByb2Nlc3NNZXRob2RTaWduYXR1cmUo KFNlbWFudGljICopIHRoaXMsIHRvayk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRo b2QxIC0+IFR5cGUoKSAhPSBtZXRob2QyIC0+IFR5cGUoKSkKICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAg ICAgICAgICAgICAgICByZXR1cm4gKGkgPT0gc291cmNlX21ldGhvZF90YWJsZSAtPiBzeW1ib2xf cG9vbC5MZW5ndGgoKSk7ICAKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0YXJn ZXRfdHlwZSAtPiBBQ0NfRklOQUwoKSAmJiAoISB0YXJnZXRfdHlwZSAtPiBJbXBsZW1lbnRzKHNv dXJjZV90eXBlKSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAg ICAgICBlbHNlIGlmIChzb3VyY2VfdHlwZSAhPSBjb250cm9sLm51bGxfdHlwZSkgIAogICAgICAg IHsKICAgICAgICAgICAgaWYgKHRhcmdldF90eXBlIC0+IElzQXJyYXkoKSkKICAgICAgICAgICAg ewogICAgICAgICAgICAgICAgaWYgKHNvdXJjZV90eXBlICE9IGNvbnRyb2wuT2JqZWN0KCkpCiAg ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAg IGVsc2UgaWYgKHRhcmdldF90eXBlIC0+IEFDQ19JTlRFUkZBQ0UoKSkKICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgaWYgKHNvdXJjZV90eXBlIC0+IEFDQ19GSU5BTCgpICYmICghIHNvdXJj ZV90eXBlIC0+IEltcGxlbWVudHModGFyZ2V0X3R5cGUpKSkKICAgICAgICAgICAgICAgICAgICBy ZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoKCEgc291cmNl X3R5cGUgLT4gSXNTdWJjbGFzcyh0YXJnZXRfdHlwZSkpICYmICghIHRhcmdldF90eXBlIC0+IElz U3ViY2xhc3Moc291cmNlX3R5cGUpKSkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAg ICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwp9CgoKTGl0ZXJhbFZhbHVlICpTZW1hbnRp Yzo6Q2FzdFByaW1pdGl2ZVZhbHVlKFR5cGVTeW1ib2wgKnRhcmdldF90eXBlLCBBc3RFeHByZXNz aW9uICpleHByKQp7CiAgICBMaXRlcmFsVmFsdWUgKmxpdGVyYWxfdmFsdWUgPSBfX251bGwgOwog ICAgVHlwZVN5bWJvbCAqc291cmNlX3R5cGUgPSBleHByIC0+IFR5cGUoKTsKCiAgICBpZiAodGFy Z2V0X3R5cGUgPT0gc291cmNlX3R5cGUpCiAgICAgICAgbGl0ZXJhbF92YWx1ZSA9IGV4cHIgLT4g dmFsdWU7CiAgICBlbHNlIGlmIChzb3VyY2VfdHlwZSAhPSBjb250cm9sLm5vX3R5cGUpCiAgICB7 CiAgICAgICAgY2hhciBvdXRwdXRfc3RyaW5nWzI1XTsKICAgICAgICBpbnQgbGVuOwoKICAgICAg ICBpZiAodGFyZ2V0X3R5cGUgPT0gY29udHJvbC5TdHJpbmcoKSkKICAgICAgICB7CiAgICAgICAg ICAgIGlmIChzb3VyY2VfdHlwZSA9PSBjb250cm9sLmRvdWJsZV90eXBlKQogICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICBEb3VibGVMaXRlcmFsVmFsdWUgKmxpdGVyYWwgPSAoRG91YmxlTGl0 ZXJhbFZhbHVlICopIGV4cHIgLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBEb3VibGVUb1N0cmlu ZyBpZWVlX2RvdWJsZShsaXRlcmFsIC0+IHZhbHVlKTsKICAgICAgICAgICAgICAgIGxpdGVyYWxf dmFsdWUgPSBjb250cm9sLlV0ZjhfcG9vbC5GaW5kT3JJbnNlcnQoaWVlZV9kb3VibGUuU3RyaW5n KCksIGllZWVfZG91YmxlLkxlbmd0aCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNl IGlmIChzb3VyY2VfdHlwZSA9PSBjb250cm9sLmZsb2F0X3R5cGUpCiAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgIEZsb2F0TGl0ZXJhbFZhbHVlICpsaXRlcmFsID0gKEZsb2F0TGl0ZXJhbFZh bHVlICopIGV4cHIgLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBGbG9hdFRvU3RyaW5nIGllZWVf ZmxvYXQobGl0ZXJhbCAtPiB2YWx1ZSk7CiAgICAgICAgICAgICAgICBsaXRlcmFsX3ZhbHVlID0g Y29udHJvbC5VdGY4X3Bvb2wuRmluZE9ySW5zZXJ0KGllZWVfZmxvYXQuU3RyaW5nKCksIGllZWVf ZmxvYXQuTGVuZ3RoKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHNvdXJj ZV90eXBlID09IGNvbnRyb2wubG9uZ190eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICBMb25nTGl0ZXJhbFZhbHVlICpsaXRlcmFsID0gKExvbmdMaXRlcmFsVmFsdWUgKikgZXhwciAt PiB2YWx1ZTsKICAgICAgICAgICAgICAgIExvbmdUb0RlY1N0cmluZyBsb25nX2ludGVnZXIobGl0 ZXJhbCAtPiB2YWx1ZSk7CiAgICAgICAgICAgICAgICBsaXRlcmFsX3ZhbHVlID0gY29udHJvbC5V dGY4X3Bvb2wuRmluZE9ySW5zZXJ0KGxvbmdfaW50ZWdlci5TdHJpbmcoKSwgbG9uZ19pbnRlZ2Vy Lkxlbmd0aCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VfdHlw ZSA9PSBjb250cm9sLmNoYXJfdHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgSW50 TGl0ZXJhbFZhbHVlICpsaXRlcmFsID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHZhbHVl OwogICAgICAgICAgICAgICAgbGl0ZXJhbF92YWx1ZSA9IGNvbnRyb2wuVXRmOF9wb29sLkZpbmRP ckluc2VydChsaXRlcmFsIC0+IHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNl IGlmIChzb3VyY2VfdHlwZSA9PSBjb250cm9sLmJvb2xlYW5fdHlwZSkKICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICpsaXRlcmFsID0gKEludExpdGVyYWxWYWx1 ZSAqKSBleHByIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgaWYgKGxpdGVyYWwgLT4gdmFsdWUg PT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfc3RyaW5n WzBdID0gVV9mOwogICAgICAgICAgICAgICAgICAgIG91dHB1dF9zdHJpbmdbMV0gPSBVX2E7CiAg ICAgICAgICAgICAgICAgICAgb3V0cHV0X3N0cmluZ1syXSA9IFVfbDsKICAgICAgICAgICAgICAg ICAgICBvdXRwdXRfc3RyaW5nWzNdID0gVV9zOwogICAgICAgICAgICAgICAgICAgIG91dHB1dF9z dHJpbmdbNF0gPSBVX2U7CiAgICAgICAgICAgICAgICAgICAgbGVuID0gNTsKICAgICAgICAgICAg ICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgICAgICBvdXRwdXRfc3RyaW5nWzBdID0gVV90OwogICAgICAgICAgICAgICAgICAgIG91dHB1 dF9zdHJpbmdbMV0gPSBVX3I7CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3N0cmluZ1syXSA9 IFVfdTsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRfc3RyaW5nWzNdID0gVV9lOwogICAgICAg ICAgICAgICAgICAgIGxlbiA9IDQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBs aXRlcmFsX3ZhbHVlID0gY29udHJvbC5VdGY4X3Bvb2wuRmluZE9ySW5zZXJ0KG91dHB1dF9zdHJp bmcsIGxlbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY29udHJvbC5Jc1Np bXBsZUludGVnZXJWYWx1ZVR5cGUoc291cmNlX3R5cGUpKQogICAgICAgICAgICB7CiAgICAgICAg ICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKmxpdGVyYWwgPSAoSW50TGl0ZXJhbFZhbHVlICopIGV4 cHIgLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBJbnRUb1N0cmluZyBpbnRlZ2VyKGxpdGVyYWwg LT4gdmFsdWUpOwogICAgICAgICAgICAgICAgbGl0ZXJhbF92YWx1ZSA9IGNvbnRyb2wuVXRmOF9w b29sLkZpbmRPckluc2VydChpbnRlZ2VyLlN0cmluZygpLCBpbnRlZ2VyLkxlbmd0aCgpKTsKICAg ICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0YXJnZXRfdHlwZSA9PSBjb250 cm9sLmRvdWJsZV90eXBlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHNvdXJjZV90eXBlID09 IGNvbnRyb2wuZmxvYXRfdHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmxvYXRM aXRlcmFsVmFsdWUgKmxpdGVyYWwgPSAoRmxvYXRMaXRlcmFsVmFsdWUgKikgZXhwciAtPiB2YWx1 ZTsKICAgICAgICAgICAgICAgIGxpdGVyYWxfdmFsdWUgPSBjb250cm9sLmRvdWJsZV9wb29sLkZp bmRPckluc2VydChsaXRlcmFsIC0+IHZhbHVlLkRvdWJsZVZhbHVlKCkpOwogICAgICAgICAgICB9 CiAgICAgICAgICAgIGVsc2UgaWYgKHNvdXJjZV90eXBlID09IGNvbnRyb2wubG9uZ190eXBlKQog ICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMb25nTGl0ZXJhbFZhbHVlICpsaXRlcmFsID0g KExvbmdMaXRlcmFsVmFsdWUgKikgZXhwciAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIElFRUVk b3VibGUgdmFsdWUobGl0ZXJhbCAtPiB2YWx1ZSk7CiAgICAgICAgICAgICAgICBsaXRlcmFsX3Zh bHVlID0gY29udHJvbC5kb3VibGVfcG9vbC5GaW5kT3JJbnNlcnQodmFsdWUpOwogICAgICAgICAg ICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgSW50TGl0 ZXJhbFZhbHVlICpsaXRlcmFsID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHZhbHVlOwog ICAgICAgICAgICAgICAgSUVFRWRvdWJsZSB2YWx1ZShsaXRlcmFsIC0+IHZhbHVlKTsKICAgICAg ICAgICAgICAgIGxpdGVyYWxfdmFsdWUgPSBjb250cm9sLmRvdWJsZV9wb29sLkZpbmRPckluc2Vy dCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGFyZ2V0 X3R5cGUgPT0gY29udHJvbC5mbG9hdF90eXBlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHNv dXJjZV90eXBlID09IGNvbnRyb2wuZG91YmxlX3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAg ICAgICAgIERvdWJsZUxpdGVyYWxWYWx1ZSAqbGl0ZXJhbCA9IChEb3VibGVMaXRlcmFsVmFsdWUg KikgZXhwciAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIGxpdGVyYWxfdmFsdWUgPSBjb250cm9s LmZsb2F0X3Bvb2wuRmluZE9ySW5zZXJ0KGxpdGVyYWwgLT4gdmFsdWUuRmxvYXRWYWx1ZSgpKTsK ICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VfdHlwZSA9PSBjb250cm9s LmxvbmdfdHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTG9uZ0xpdGVyYWxWYWx1 ZSAqbGl0ZXJhbCA9IChMb25nTGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gdmFsdWU7CiAgICAgICAg ICAgICAgICBJRUVFZmxvYXQgdmFsdWUobGl0ZXJhbCAtPiB2YWx1ZSk7CiAgICAgICAgICAgICAg ICBsaXRlcmFsX3ZhbHVlID0gY29udHJvbC5mbG9hdF9wb29sLkZpbmRPckluc2VydCh2YWx1ZSk7 CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAg ICAgICBJbnRMaXRlcmFsVmFsdWUgKmxpdGVyYWwgPSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIg LT4gdmFsdWU7CiAgICAgICAgICAgICAgICBJRUVFZmxvYXQgdmFsdWUobGl0ZXJhbCAtPiB2YWx1 ZSk7CiAgICAgICAgICAgICAgICBsaXRlcmFsX3ZhbHVlID0gY29udHJvbC5mbG9hdF9wb29sLkZp bmRPckluc2VydCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBp ZiAodGFyZ2V0X3R5cGUgPT0gY29udHJvbC5sb25nX3R5cGUpCiAgICAgICAgewogICAgICAgICAg ICBpZiAoc291cmNlX3R5cGUgPT0gY29udHJvbC5kb3VibGVfdHlwZSkKICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgRG91YmxlTGl0ZXJhbFZhbHVlICpsaXRlcmFsID0gKERvdWJsZUxpdGVy YWxWYWx1ZSAqKSBleHByIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgbGl0ZXJhbF92YWx1ZSA9 IGNvbnRyb2wubG9uZ19wb29sLkZpbmRPckluc2VydChsaXRlcmFsIC0+IHZhbHVlLkxvbmdWYWx1 ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VfdHlwZSA9PSBj b250cm9sLmZsb2F0X3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZsb2F0TGl0 ZXJhbFZhbHVlICpsaXRlcmFsID0gKEZsb2F0TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gdmFsdWU7 CiAgICAgICAgICAgICAgICBsaXRlcmFsX3ZhbHVlID0gY29udHJvbC5sb25nX3Bvb2wuRmluZE9y SW5zZXJ0KGxpdGVyYWwgLT4gdmFsdWUuTG9uZ1ZhbHVlKCkpOwogICAgICAgICAgICB9CiAgICAg ICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVl ICpsaXRlcmFsID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHZhbHVlOwogICAgICAgICAg ICAgICAgbGl0ZXJhbF92YWx1ZSA9IGNvbnRyb2wubG9uZ19wb29sLkZpbmRPckluc2VydCgoTG9u Z0ludCkgbGl0ZXJhbCAtPiB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAg ZWxzZSBpZiAodGFyZ2V0X3R5cGUgPT0gY29udHJvbC5pbnRfdHlwZSkKICAgICAgICB7CiAgICAg ICAgICAgIGlmIChzb3VyY2VfdHlwZSA9PSBjb250cm9sLmRvdWJsZV90eXBlKQogICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICBEb3VibGVMaXRlcmFsVmFsdWUgKmxpdGVyYWwgPSAoRG91Ymxl TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBsaXRlcmFsX3Zh bHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQoKGxpdGVyYWwgLT4gdmFsdWUpLklu dFZhbHVlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHNvdXJjZV90eXBl ID09IGNvbnRyb2wuZmxvYXRfdHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmxv YXRMaXRlcmFsVmFsdWUgKmxpdGVyYWwgPSAoRmxvYXRMaXRlcmFsVmFsdWUgKikgZXhwciAtPiB2 YWx1ZTsKICAgICAgICAgICAgICAgIGxpdGVyYWxfdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZp bmRPckluc2VydChsaXRlcmFsIC0+IHZhbHVlLkludFZhbHVlKCkpOwogICAgICAgICAgICB9CiAg ICAgICAgICAgIGVsc2UgaWYgKHNvdXJjZV90eXBlID09IGNvbnRyb2wubG9uZ190eXBlKQogICAg ICAgICAgICB7CiAgICAgICAgICAgICAgICBMb25nTGl0ZXJhbFZhbHVlICpsaXRlcmFsID0gKExv bmdMaXRlcmFsVmFsdWUgKikgZXhwciAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIGxpdGVyYWxf dmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPckluc2VydCgoaTQpIChsaXRlcmFsIC0+IHZh bHVlKS5Mb3dXb3JkKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgbGl0ZXJhbF92 YWx1ZSA9IGV4cHIgLT4gdmFsdWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRhcmdldF90 eXBlID09IGNvbnRyb2wuY2hhcl90eXBlKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHNvdXJj ZV90eXBlID09IGNvbnRyb2wuZG91YmxlX3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgIERvdWJsZUxpdGVyYWxWYWx1ZSAqbGl0ZXJhbCA9IChEb3VibGVMaXRlcmFsVmFsdWUgKikg ZXhwciAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIGxpdGVyYWxfdmFsdWUgPSBjb250cm9sLmlu dF9wb29sLkZpbmRPckluc2VydCgoaTQpICh1MikgKGxpdGVyYWwgLT4gdmFsdWUuSW50VmFsdWUo KSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHNvdXJjZV90eXBlID09IGNv bnRyb2wuZmxvYXRfdHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRmxvYXRMaXRl cmFsVmFsdWUgKmxpdGVyYWwgPSAoRmxvYXRMaXRlcmFsVmFsdWUgKikgZXhwciAtPiB2YWx1ZTsK ICAgICAgICAgICAgICAgIGxpdGVyYWxfdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPcklu c2VydCgoaTQpICh1MikgKGxpdGVyYWwgLT4gdmFsdWUuSW50VmFsdWUoKSkpOwogICAgICAgICAg ICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHNvdXJjZV90eXBlID09IGNvbnRyb2wubG9uZ190eXBl KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMb25nTGl0ZXJhbFZhbHVlICpsaXRlcmFs ID0gKExvbmdMaXRlcmFsVmFsdWUgKikgZXhwciAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIGxp dGVyYWxfdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPckluc2VydCgoaTQpICh1MikgKGxp dGVyYWwgLT4gdmFsdWUpLkxvd1dvcmQoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxz ZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKmxpdGVyYWwg PSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBsaXRl cmFsX3ZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQoKGk0KSAodTIpIGxpdGVy YWwgLT4gdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRh cmdldF90eXBlID09IGNvbnRyb2wuc2hvcnRfdHlwZSkKICAgICAgICB7CiAgICAgICAgICAgIGlm IChzb3VyY2VfdHlwZSA9PSBjb250cm9sLmRvdWJsZV90eXBlKQogICAgICAgICAgICB7CiAgICAg ICAgICAgICAgICBEb3VibGVMaXRlcmFsVmFsdWUgKmxpdGVyYWwgPSAoRG91YmxlTGl0ZXJhbFZh bHVlICopIGV4cHIgLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBsaXRlcmFsX3ZhbHVlID0gY29u dHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQoKGk0KSAoaTIpIChsaXRlcmFsIC0+IHZhbHVlLklu dFZhbHVlKCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VfdHlw ZSA9PSBjb250cm9sLmZsb2F0X3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZs b2F0TGl0ZXJhbFZhbHVlICpsaXRlcmFsID0gKEZsb2F0TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4g dmFsdWU7CiAgICAgICAgICAgICAgICBsaXRlcmFsX3ZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5G aW5kT3JJbnNlcnQoKGk0KSAoaTIpIChsaXRlcmFsIC0+IHZhbHVlLkludFZhbHVlKCkpKTsKICAg ICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VfdHlwZSA9PSBjb250cm9sLmxv bmdfdHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTG9uZ0xpdGVyYWxWYWx1ZSAq bGl0ZXJhbCA9IChMb25nTGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gdmFsdWU7CiAgICAgICAgICAg ICAgICBsaXRlcmFsX3ZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQoKGk0KSAo aTIpIChsaXRlcmFsIC0+IHZhbHVlKS5Mb3dXb3JkKCkpOwogICAgICAgICAgICB9CiAgICAgICAg ICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICps aXRlcmFsID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHZhbHVlOwogICAgICAgICAgICAg ICAgbGl0ZXJhbF92YWx1ZSA9IGNvbnRyb2wuaW50X3Bvb2wuRmluZE9ySW5zZXJ0KChpNCkgKGky KSBsaXRlcmFsIC0+IHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNl IGlmICh0YXJnZXRfdHlwZSA9PSBjb250cm9sLmJ5dGVfdHlwZSkKICAgICAgICB7CiAgICAgICAg ICAgIGlmIChzb3VyY2VfdHlwZSA9PSBjb250cm9sLmRvdWJsZV90eXBlKQogICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICBEb3VibGVMaXRlcmFsVmFsdWUgKmxpdGVyYWwgPSAoRG91YmxlTGl0 ZXJhbFZhbHVlICopIGV4cHIgLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBsaXRlcmFsX3ZhbHVl ID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQoKGk0KSAoaTEpIChsaXRlcmFsIC0+IHZh bHVlLkludFZhbHVlKCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzb3Vy Y2VfdHlwZSA9PSBjb250cm9sLmZsb2F0X3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgIEZsb2F0TGl0ZXJhbFZhbHVlICpsaXRlcmFsID0gKEZsb2F0TGl0ZXJhbFZhbHVlICopIGV4 cHIgLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBsaXRlcmFsX3ZhbHVlID0gY29udHJvbC5pbnRf cG9vbC5GaW5kT3JJbnNlcnQoKGk0KSAoaTEpIChsaXRlcmFsIC0+IHZhbHVlLkludFZhbHVlKCkp KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzb3VyY2VfdHlwZSA9PSBjb250 cm9sLmxvbmdfdHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTG9uZ0xpdGVyYWxW YWx1ZSAqbGl0ZXJhbCA9IChMb25nTGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gdmFsdWU7CiAgICAg ICAgICAgICAgICBsaXRlcmFsX3ZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQo KGludCkgKGkxKSAobGl0ZXJhbCAtPiB2YWx1ZSkuTG93V29yZCgpKTsKICAgICAgICAgICAgfQog ICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEludExpdGVyYWxW YWx1ZSAqbGl0ZXJhbCA9IChJbnRMaXRlcmFsVmFsdWUgKikgZXhwciAtPiB2YWx1ZTsKICAgICAg ICAgICAgICAgIGxpdGVyYWxfdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPckluc2VydCgo aTQpIChpMSkgbGl0ZXJhbCAtPiB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9 CgogICAgcmV0dXJuIGxpdGVyYWxfdmFsdWU7Cn0KCgogCiAKIAppbmxpbmUgTGl0ZXJhbFZhbHVl ICpTZW1hbnRpYzo6Q2FzdFZhbHVlKFR5cGVTeW1ib2wgKnRhcmdldF90eXBlLCBBc3RFeHByZXNz aW9uICpleHByKQp7CiAgICByZXR1cm4gKExpdGVyYWxWYWx1ZSAqKSAoZXhwciAtPiBJc0NvbnN0 YW50KCkgJiYgKHRhcmdldF90eXBlIC0+IFByaW1pdGl2ZSgpIHx8IHRhcmdldF90eXBlID09IGNv bnRyb2wuU3RyaW5nKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgID8gQ2FzdFByaW1pdGl2ZVZhbHVlKHRhcmdldF90eXBlLCBleHByKQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IF9fbnVsbCApOwp9 CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vzc0Nhc3RFeHByZXNzaW9uKEFzdCAqZXhwcikKewogICAg QXN0Q2FzdEV4cHJlc3Npb24gKmNhc3RfZXhwcmVzc2lvbiA9IChBc3RDYXN0RXhwcmVzc2lvbiAq KSBleHByOwoKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIFN5bWJvbFNldCAqZXhj ZXB0aW9uX3NldCA9IFRyeUV4Y2VwdGlvblRhYmxlU3RhY2soKS5Ub3AoKTsKICAgIGlmIChleGNl cHRpb25fc2V0KQogICAgewogICAgICAgIGV4Y2VwdGlvbl9zZXQgLT4gQWRkRWxlbWVudChjb250 cm9sLlJ1bnRpbWVFeGNlcHRpb24oKSk7CiAgICB9CgogICAgIAogICAgIAogICAgIAogICAgIAog ICAgUHJvY2Vzc0V4cHJlc3Npb24oY2FzdF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24pOwoKICAg IFR5cGVTeW1ib2wgKnNvdXJjZV90eXBlID0gY2FzdF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24g LT4gVHlwZSgpOwoKICAgICAKICAgICAKICAgICAKICAgICAKICAgIEFzdFByaW1pdGl2ZVR5cGUg KnByaW1pdGl2ZV90eXBlID0gY2FzdF9leHByZXNzaW9uIC0+IHR5cGVfb3B0IC0+IFByaW1pdGl2 ZVR5cGVDYXN0KCk7CiAgICBUeXBlU3ltYm9sICp0YXJnZXRfdHlwZTsKICAgIGlmIChwcmltaXRp dmVfdHlwZSkKICAgICAgICAgdGFyZ2V0X3R5cGUgPSBGaW5kUHJpbWl0aXZlVHlwZShwcmltaXRp dmVfdHlwZSk7CiAgICBlbHNlIGlmIChjYXN0X2V4cHJlc3Npb24gLT4gdHlwZV9vcHQgLT4gSXNO YW1lKCkpCiAgICAgICAgIHRhcmdldF90eXBlID0gTXVzdEZpbmRUeXBlKGNhc3RfZXhwcmVzc2lv biAtPiB0eXBlX29wdCk7CiAgICBlbHNlCiAgICB7CiAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2Vt YW50aWNFcnJvcjo6SU5WQUxJRF9DQVNUX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgY2Fz dF9leHByZXNzaW9uIC0+IHR5cGVfb3B0IC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAg ICAgICAgIGNhc3RfZXhwcmVzc2lvbiAtPiB0eXBlX29wdCAtPiBSaWdodFRva2VuKCkpOwogICAg ICAgIGNhc3RfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CgogICAgICAg IHJldHVybjsKICAgIH0KCiAgICBpbnQgbnVtX2RpbWVuc2lvbnMgPSBjYXN0X2V4cHJlc3Npb24g LT4gTnVtQnJhY2tldHMoKTsKICAgIHRhcmdldF90eXBlID0gKG51bV9kaW1lbnNpb25zID09IDAg PyB0YXJnZXRfdHlwZSA6IHRhcmdldF90eXBlIC0+IEdldEFycmF5VHlwZSgoU2VtYW50aWMgKikg dGhpcywgbnVtX2RpbWVuc2lvbnMpKTsKCiAgICBpZiAoQ2FuQXNzaWdubWVudENvbnZlcnQodGFy Z2V0X3R5cGUsIGNhc3RfZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uKSkKICAgIHsKICAgICAgICBj YXN0X2V4cHJlc3Npb24gLT4gc3ltYm9sID0gdGFyZ2V0X3R5cGU7CiAgICAgICAgY2FzdF9leHBy ZXNzaW9uIC0+IHZhbHVlID0gQ2FzdFZhbHVlKHRhcmdldF90eXBlLCBjYXN0X2V4cHJlc3Npb24g LT4gZXhwcmVzc2lvbik7CiAgICB9CiAgICBlbHNlIGlmIChDYW5DYXN0Q29udmVydCh0YXJnZXRf dHlwZSwgc291cmNlX3R5cGUsIGNhc3RfZXhwcmVzc2lvbiAtPiByaWdodF9wYXJlbnRoZXNpc190 b2tlbl9vcHQpKQogICAgewogICAgICAgIGNhc3RfZXhwcmVzc2lvbiAtPiBraW5kID0gQXN0OjpD SEVDS19BTkRfQ0FTVDsKICAgICAgICBjYXN0X2V4cHJlc3Npb24gLT4gc3ltYm9sID0gdGFyZ2V0 X3R5cGU7CiAgICAgICAgY2FzdF9leHByZXNzaW9uIC0+IHZhbHVlID0gQ2FzdFZhbHVlKHRhcmdl dF90eXBlLCBjYXN0X2V4cHJlc3Npb24gLT4gZXhwcmVzc2lvbik7CiAgICB9CiAgICBlbHNlCiAg ICB7CiAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6SU5WQUxJRF9DQVNUX0NP TlZFUlNJT04sCiAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9leHByZXNzaW9uIC0+IGV4cHJl c3Npb24gLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9leHByZXNz aW9uIC0+IGV4cHJlc3Npb24gLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAg IHNvdXJjZV90eXBlIC0+IE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdHlw ZSAtPiBOYW1lKCkpOwogICAgICAgIGNhc3RfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBjb250cm9s Lm5vX3R5cGU7CiAgICB9CgogICAgcmV0dXJuOwp9CgoKQXN0RXhwcmVzc2lvbiAqU2VtYW50aWM6 OkNvbnZlcnRUb1R5cGUoQXN0RXhwcmVzc2lvbiAqZXhwciwgVHlwZVN5bWJvbCAqdHlwZSkKewog ICAgaWYgKGV4cHIgLT4gVHlwZSgpID09IGNvbnRyb2wubnVsbF90eXBlKQogICAgICAgIHJldHVy biBleHByOwoKICAgIExleFN0cmVhbTo6VG9rZW5JbmRleCBsb2MgPSBleHByIC0+IExlZnRUb2tl bigpOwoKICAgIEFzdENhc3RFeHByZXNzaW9uICpyZXN1bHQgPSBjb21waWxhdGlvbl91bml0IC0+ IGFzdF9wb29sIC0+IEdlbkNhc3RFeHByZXNzaW9uKCk7CiAgICByZXN1bHQgLT4gbGVmdF9wYXJl bnRoZXNpc190b2tlbl9vcHQgPSBsb2M7CiAgICByZXN1bHQgLT4gdHlwZV9vcHQgPSBfX251bGwg OwogICAgcmVzdWx0IC0+IHJpZ2h0X3BhcmVudGhlc2lzX3Rva2VuX29wdCA9IGxvYzsKICAgIHJl c3VsdCAtPiBleHByZXNzaW9uID0gZXhwcjsKCiAgICByZXN1bHQgLT4gc3ltYm9sID0gdHlwZTsK ICAgIHJlc3VsdCAtPiB2YWx1ZSA9IENhc3RWYWx1ZSh0eXBlLCBleHByKTsKCiAgICByZXR1cm4g cmVzdWx0Owp9CgoKQXN0RXhwcmVzc2lvbiAqU2VtYW50aWM6OlByb21vdGVVbmFyeU51bWVyaWNF eHByZXNzaW9uKEFzdEV4cHJlc3Npb24gKnVuYXJ5X2V4cHJlc3Npb24pCnsKICAgIFR5cGVTeW1i b2wgKnR5cGUgPSB1bmFyeV9leHByZXNzaW9uIC0+IFR5cGUoKTsKCiAgICBpZiAodHlwZSA9PSBj b250cm9sLm5vX3R5cGUpCiAgICAgICAgcmV0dXJuIHVuYXJ5X2V4cHJlc3Npb247CgogICAgaWYg KCEgY29udHJvbC5Jc051bWVyaWModHlwZSkpCiAgICB7CiAgICAgICBSZXBvcnRTZW1FcnJvcihT ZW1hbnRpY0Vycm9yOjpUWVBFX05PVF9OVU1FUklDLAogICAgICAgICAgICAgICAgICAgICAgdW5h cnlfZXhwcmVzc2lvbiAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgIHVuYXJ5 X2V4cHJlc3Npb24gLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgdHlwZSAt PiBOYW1lKCkpOwogICAgICAgIHVuYXJ5X2V4cHJlc3Npb24gLT4gc3ltYm9sID0gY29udHJvbC5u b190eXBlOwogICAgICAgIHJldHVybiB1bmFyeV9leHByZXNzaW9uOwogICAgfQoKICAgIHJldHVy biAoKHR5cGUgPT0gY29udHJvbC5ieXRlX3R5cGUgfHwgdHlwZSA9PSBjb250cm9sLnNob3J0X3R5 cGUgfHwgdHlwZSA9PSBjb250cm9sLmNoYXJfdHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgPyBDb252ZXJ0VG9UeXBlKHVuYXJ5X2V4cHJlc3Npb24s IGNvbnRyb2wuaW50X3R5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDogdW5hcnlfZXhwcmVzc2lvbik7Cn0KCgp2b2lkIFNlbWFudGljOjpCaW5hcnlO dW1lcmljUHJvbW90aW9uKEFzdEJpbmFyeUV4cHJlc3Npb24gKmJpbmFyeV9leHByZXNzaW9uKQp7 CiAgICBBc3RFeHByZXNzaW9uICpsZWZ0X2V4cHIgPSBiaW5hcnlfZXhwcmVzc2lvbiAtPiBsZWZ0 X2V4cHJlc3Npb247CiAgICBBc3RFeHByZXNzaW9uICpyaWdodF9leHByID0gYmluYXJ5X2V4cHJl c3Npb24gLT4gcmlnaHRfZXhwcmVzc2lvbjsKCiAgICBUeXBlU3ltYm9sICpsZWZ0X3R5cGUgID0g bGVmdF9leHByIC0+IFR5cGUoKSwKICAgICAgICAgICAgICAgKnJpZ2h0X3R5cGUgPSByaWdodF9l eHByIC0+IFR5cGUoKTsKCiAgICBpZiAobGVmdF90eXBlID09IGNvbnRyb2wubm9fdHlwZSB8fCBy aWdodF90eXBlID09IGNvbnRyb2wubm9fdHlwZSkKICAgIHsKICAgICAgICBiaW5hcnlfZXhwcmVz c2lvbiAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICAgICAgcmV0dXJuOwogICAgfQoK ICAgIGlmICghIGNvbnRyb2wuSXNOdW1lcmljKGxlZnRfdHlwZSkpCiAgICB7CiAgICAgICBSZXBv cnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpUWVBFX05PVF9OVU1FUklDLAogICAgICAgICAgICAg ICAgICAgICAgbGVmdF9leHByIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAg bGVmdF9leHByIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgIGxlZnRfdHlw ZSAtPiBOYW1lKCkpOwogICAgICAgIGJpbmFyeV9leHByZXNzaW9uIC0+IHN5bWJvbCA9IGNvbnRy b2wubm9fdHlwZTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBlbHNlIGlmICghIGNvbnRyb2wu SXNOdW1lcmljKHJpZ2h0X3R5cGUpKQogICAgewogICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50 aWNFcnJvcjo6VFlQRV9OT1RfTlVNRVJJQywKICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0X2V4 cHIgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICByaWdodF9leHByIC0+IFJp Z2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0X3R5cGUgLT4gTmFtZSgpKTsK ICAgICAgICBiaW5hcnlfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAg ICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChsZWZ0X3R5cGUgPT0gY29udHJvbC5kb3VibGVf dHlwZSkKICAgIHsKICAgICAgICBpZiAocmlnaHRfdHlwZSAhPSBjb250cm9sLmRvdWJsZV90eXBl KQogICAgICAgICAgICBiaW5hcnlfZXhwcmVzc2lvbiAtPiByaWdodF9leHByZXNzaW9uID0gQ29u dmVydFRvVHlwZShiaW5hcnlfZXhwcmVzc2lvbiAtPiByaWdodF9leHByZXNzaW9uLCBjb250cm9s LmRvdWJsZV90eXBlKTsKICAgICAgICBiaW5hcnlfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBjb250 cm9sLmRvdWJsZV90eXBlOwogICAgfQogICAgZWxzZSBpZiAocmlnaHRfdHlwZSA9PSBjb250cm9s LmRvdWJsZV90eXBlKQogICAgewogICAgICAgIGlmIChsZWZ0X3R5cGUgIT0gY29udHJvbC5kb3Vi bGVfdHlwZSkKICAgICAgICAgICAgYmluYXJ5X2V4cHJlc3Npb24gLT4gbGVmdF9leHByZXNzaW9u ID0gQ29udmVydFRvVHlwZShiaW5hcnlfZXhwcmVzc2lvbiAtPiBsZWZ0X2V4cHJlc3Npb24sIGNv bnRyb2wuZG91YmxlX3R5cGUpOwogICAgICAgIGJpbmFyeV9leHByZXNzaW9uIC0+IHN5bWJvbCA9 IGNvbnRyb2wuZG91YmxlX3R5cGU7CiAgICB9CiAgICBlbHNlIGlmIChsZWZ0X3R5cGUgPT0gY29u dHJvbC5mbG9hdF90eXBlKQogICAgewogICAgICAgIGlmIChyaWdodF90eXBlICE9IGNvbnRyb2wu ZmxvYXRfdHlwZSkKICAgICAgICAgICAgYmluYXJ5X2V4cHJlc3Npb24gLT4gcmlnaHRfZXhwcmVz c2lvbiA9IENvbnZlcnRUb1R5cGUoYmluYXJ5X2V4cHJlc3Npb24gLT4gcmlnaHRfZXhwcmVzc2lv biwgY29udHJvbC5mbG9hdF90eXBlKTsKICAgICAgICBiaW5hcnlfZXhwcmVzc2lvbiAtPiBzeW1i b2wgPSBjb250cm9sLmZsb2F0X3R5cGU7CiAgICB9CiAgICBlbHNlIGlmIChyaWdodF90eXBlID09 IGNvbnRyb2wuZmxvYXRfdHlwZSkKICAgIHsKICAgICAgICBpZiAobGVmdF90eXBlICE9IGNvbnRy b2wuZmxvYXRfdHlwZSkKICAgICAgICAgICAgYmluYXJ5X2V4cHJlc3Npb24gLT4gbGVmdF9leHBy ZXNzaW9uID0gQ29udmVydFRvVHlwZShiaW5hcnlfZXhwcmVzc2lvbiAtPiBsZWZ0X2V4cHJlc3Np b24sIGNvbnRyb2wuZmxvYXRfdHlwZSk7CiAgICAgICAgYmluYXJ5X2V4cHJlc3Npb24gLT4gc3lt Ym9sID0gY29udHJvbC5mbG9hdF90eXBlOwogICAgfQogICAgZWxzZSBpZiAobGVmdF90eXBlID09 IGNvbnRyb2wubG9uZ190eXBlKQogICAgewogICAgICAgIGlmIChyaWdodF90eXBlICE9IGNvbnRy b2wubG9uZ190eXBlKQogICAgICAgICAgICBiaW5hcnlfZXhwcmVzc2lvbiAtPiByaWdodF9leHBy ZXNzaW9uID0gQ29udmVydFRvVHlwZShiaW5hcnlfZXhwcmVzc2lvbiAtPiByaWdodF9leHByZXNz aW9uLCBjb250cm9sLmxvbmdfdHlwZSk7CiAgICAgICAgYmluYXJ5X2V4cHJlc3Npb24gLT4gc3lt Ym9sID0gY29udHJvbC5sb25nX3R5cGU7CiAgICB9CiAgICBlbHNlIGlmIChyaWdodF90eXBlID09 IGNvbnRyb2wubG9uZ190eXBlKQogICAgewogICAgICAgIGlmIChsZWZ0X3R5cGUgIT0gY29udHJv bC5sb25nX3R5cGUpCiAgICAgICAgICAgIGJpbmFyeV9leHByZXNzaW9uIC0+IGxlZnRfZXhwcmVz c2lvbiA9IENvbnZlcnRUb1R5cGUoYmluYXJ5X2V4cHJlc3Npb24gLT4gbGVmdF9leHByZXNzaW9u LCBjb250cm9sLmxvbmdfdHlwZSk7CiAgICAgICAgYmluYXJ5X2V4cHJlc3Npb24gLT4gc3ltYm9s ID0gY29udHJvbC5sb25nX3R5cGU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKGxl ZnRfdHlwZSAhPSBjb250cm9sLmludF90eXBlKQogICAgICAgICAgICBiaW5hcnlfZXhwcmVzc2lv biAtPiBsZWZ0X2V4cHJlc3Npb24gPSBDb252ZXJ0VG9UeXBlKGJpbmFyeV9leHByZXNzaW9uIC0+ IGxlZnRfZXhwcmVzc2lvbiwgY29udHJvbC5pbnRfdHlwZSk7CiAgICAgICAgaWYgKHJpZ2h0X3R5 cGUgIT0gY29udHJvbC5pbnRfdHlwZSkKICAgICAgICAgICAgYmluYXJ5X2V4cHJlc3Npb24gLT4g cmlnaHRfZXhwcmVzc2lvbiA9IENvbnZlcnRUb1R5cGUoYmluYXJ5X2V4cHJlc3Npb24gLT4gcmln aHRfZXhwcmVzc2lvbiwgY29udHJvbC5pbnRfdHlwZSk7CiAgICAgICAgYmluYXJ5X2V4cHJlc3Np b24gLT4gc3ltYm9sID0gY29udHJvbC5pbnRfdHlwZTsKICAgIH0KCiAgICByZXR1cm47Cn0KCgp2 b2lkIFNlbWFudGljOjpCaW5hcnlOdW1lcmljUHJvbW90aW9uKEFzdEFzc2lnbm1lbnRFeHByZXNz aW9uICphc3NpZ25tZW50X2V4cHJlc3Npb24pCnsKICAgIEFzdEV4cHJlc3Npb24gKmxlZnRfZXhw ciA9IGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAtPiBsZWZ0X2hhbmRfc2lkZTsKICAgIEFzdEV4cHJl c3Npb24gKnJpZ2h0X2V4cHIgPSBhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gZXhwcmVzc2lvbjsK CiAgICBUeXBlU3ltYm9sICpsZWZ0X3R5cGUgID0gbGVmdF9leHByIC0+IFR5cGUoKSwKICAgICAg ICAgICAgICAgKnJpZ2h0X3R5cGUgPSByaWdodF9leHByIC0+IFR5cGUoKTsKCiAgICBpZiAobGVm dF90eXBlID09IGNvbnRyb2wubm9fdHlwZSB8fCByaWdodF90eXBlID09IGNvbnRyb2wubm9fdHlw ZSkKICAgICAgICByZXR1cm47CgogICAgaWYgKCEgY29udHJvbC5Jc051bWVyaWMobGVmdF90eXBl KSkKICAgIHsKICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlRZUEVfTk9UX05V TUVSSUMsCiAgICAgICAgICAgICAgICAgICAgICBsZWZ0X2V4cHIgLT4gTGVmdFRva2VuKCksCiAg ICAgICAgICAgICAgICAgICAgICBsZWZ0X2V4cHIgLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAg ICAgICAgICAgICAgbGVmdF90eXBlIC0+IE5hbWUoKSk7CiAgICAgICAgcmV0dXJuOwogICAgfQog ICAgZWxzZSBpZiAoISBjb250cm9sLklzTnVtZXJpYyhyaWdodF90eXBlKSkKICAgIHsKICAgICAg IFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlRZUEVfTk9UX05VTUVSSUMsCiAgICAgICAg ICAgICAgICAgICAgICByaWdodF9leHByIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAg ICAgICAgcmlnaHRfZXhwciAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICBy aWdodF90eXBlIC0+IE5hbWUoKSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChsZWZ0 X3R5cGUgPT0gY29udHJvbC5kb3VibGVfdHlwZSkKICAgIHsKICAgICAgICBpZiAocmlnaHRfdHlw ZSAhPSBjb250cm9sLmRvdWJsZV90eXBlKQogICAgICAgICAgICBhc3NpZ25tZW50X2V4cHJlc3Np b24gLT4gZXhwcmVzc2lvbiA9IENvbnZlcnRUb1R5cGUoYXNzaWdubWVudF9leHByZXNzaW9uIC0+ IGV4cHJlc3Npb24sIGNvbnRyb2wuZG91YmxlX3R5cGUpOwogICAgfQogICAgZWxzZSBpZiAocmln aHRfdHlwZSA9PSBjb250cm9sLmRvdWJsZV90eXBlKQogICAgewogICAgICAgIGlmIChsZWZ0X3R5 cGUgIT0gY29udHJvbC5kb3VibGVfdHlwZSkKICAgICAgICAgICAgYXNzaWdubWVudF9leHByZXNz aW9uIC0+IGxlZnRfaGFuZF9zaWRlID0gQ29udmVydFRvVHlwZShhc3NpZ25tZW50X2V4cHJlc3Np b24gLT4gbGVmdF9oYW5kX3NpZGUsIGNvbnRyb2wuZG91YmxlX3R5cGUpOwogICAgfQogICAgZWxz ZSBpZiAobGVmdF90eXBlID09IGNvbnRyb2wuZmxvYXRfdHlwZSkKICAgIHsKICAgICAgICBpZiAo cmlnaHRfdHlwZSAhPSBjb250cm9sLmZsb2F0X3R5cGUpCiAgICAgICAgICAgIGFzc2lnbm1lbnRf ZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uID0gQ29udmVydFRvVHlwZShhc3NpZ25tZW50X2V4cHJl c3Npb24gLT4gZXhwcmVzc2lvbiwgY29udHJvbC5mbG9hdF90eXBlKTsKICAgIH0KICAgIGVsc2Ug aWYgKHJpZ2h0X3R5cGUgPT0gY29udHJvbC5mbG9hdF90eXBlKQogICAgewogICAgICAgIGlmIChs ZWZ0X3R5cGUgIT0gY29udHJvbC5mbG9hdF90eXBlKQogICAgICAgICAgICBhc3NpZ25tZW50X2V4 cHJlc3Npb24gLT4gbGVmdF9oYW5kX3NpZGUgPSBDb252ZXJ0VG9UeXBlKGFzc2lnbm1lbnRfZXhw cmVzc2lvbiAtPiBsZWZ0X2hhbmRfc2lkZSwgY29udHJvbC5mbG9hdF90eXBlKTsKICAgIH0KICAg IGVsc2UgaWYgKGxlZnRfdHlwZSA9PSBjb250cm9sLmxvbmdfdHlwZSkKICAgIHsKICAgICAgICBp ZiAocmlnaHRfdHlwZSAhPSBjb250cm9sLmxvbmdfdHlwZSkKICAgICAgICAgICAgYXNzaWdubWVu dF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24gPSBDb252ZXJ0VG9UeXBlKGFzc2lnbm1lbnRfZXhw cmVzc2lvbiAtPiBleHByZXNzaW9uLCBjb250cm9sLmxvbmdfdHlwZSk7CiAgICB9CiAgICBlbHNl IGlmIChyaWdodF90eXBlID09IGNvbnRyb2wubG9uZ190eXBlKQogICAgewogICAgICAgIGlmIChs ZWZ0X3R5cGUgIT0gY29udHJvbC5sb25nX3R5cGUpCiAgICAgICAgICAgIGFzc2lnbm1lbnRfZXhw cmVzc2lvbiAtPiBsZWZ0X2hhbmRfc2lkZSA9IENvbnZlcnRUb1R5cGUoYXNzaWdubWVudF9leHBy ZXNzaW9uIC0+IGxlZnRfaGFuZF9zaWRlLCBjb250cm9sLmxvbmdfdHlwZSk7CiAgICB9CiAgICBl bHNlCiAgICB7CiAgICAgICAgaWYgKGxlZnRfdHlwZSAhPSBjb250cm9sLmludF90eXBlKQogICAg ICAgICAgICBhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gbGVmdF9oYW5kX3NpZGUgPSBDb252ZXJ0 VG9UeXBlKGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAtPiBsZWZ0X2hhbmRfc2lkZSwgY29udHJvbC5p bnRfdHlwZSk7CiAgICAgICAgaWYgKHJpZ2h0X3R5cGUgIT0gY29udHJvbC5pbnRfdHlwZSkKICAg ICAgICAgICAgYXNzaWdubWVudF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24gPSBDb252ZXJ0VG9U eXBlKGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uLCBjb250cm9sLmludF90eXBl KTsKICAgIH0KCiAgICByZXR1cm47Cn0KCgp2b2lkIFNlbWFudGljOjpCaW5hcnlOdW1lcmljUHJv bW90aW9uKEFzdENvbmRpdGlvbmFsRXhwcmVzc2lvbiAqY29uZGl0aW9uYWxfZXhwcmVzc2lvbikK ewogICAgQXN0RXhwcmVzc2lvbiAqbGVmdF9leHByID0gY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAt PiB0cnVlX2V4cHJlc3Npb247CiAgICBBc3RFeHByZXNzaW9uICpyaWdodF9leHByID0gY29uZGl0 aW9uYWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9leHByZXNzaW9uOwoKICAgIFR5cGVTeW1ib2wgKmxl ZnRfdHlwZSAgPSBsZWZ0X2V4cHIgLT4gVHlwZSgpLAogICAgICAgICAgICAgICAqcmlnaHRfdHlw ZSA9IHJpZ2h0X2V4cHIgLT4gVHlwZSgpOwoKICAgIGlmIChsZWZ0X3R5cGUgPT0gY29udHJvbC5u b190eXBlIHx8IHJpZ2h0X3R5cGUgPT0gY29udHJvbC5ub190eXBlKQogICAgewogICAgICAgIGNv bmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgICAg IHJldHVybjsKICAgIH0KCiAgICBpZiAoISBjb250cm9sLklzTnVtZXJpYyhsZWZ0X3R5cGUpKQog ICAgewogICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VFlQRV9OT1RfTlVNRVJJ QywKICAgICAgICAgICAgICAgICAgICAgIGxlZnRfZXhwciAtPiBMZWZ0VG9rZW4oKSwKICAgICAg ICAgICAgICAgICAgICAgIGxlZnRfZXhwciAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAg ICAgICAgICBsZWZ0X3R5cGUgLT4gTmFtZSgpKTsKICAgICAgICBjb25kaXRpb25hbF9leHByZXNz aW9uIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgICAgICByZXR1cm47CiAgICB9CiAg ICBlbHNlIGlmICghIGNvbnRyb2wuSXNOdW1lcmljKHJpZ2h0X3R5cGUpKQogICAgewogICAgICAg UmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VFlQRV9OT1RfTlVNRVJJQywKICAgICAgICAg ICAgICAgICAgICAgIHJpZ2h0X2V4cHIgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAg ICAgICByaWdodF9leHByIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgIHJp Z2h0X3R5cGUgLT4gTmFtZSgpKTsKICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHN5 bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGxl ZnRfdHlwZSA9PSBjb250cm9sLmRvdWJsZV90eXBlKQogICAgewogICAgICAgIGlmIChyaWdodF90 eXBlICE9IGNvbnRyb2wuZG91YmxlX3R5cGUpCiAgICAgICAgICAgIGNvbmRpdGlvbmFsX2V4cHJl c3Npb24gLT4gZmFsc2VfZXhwcmVzc2lvbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnZl cnRUb1R5cGUoY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9leHByZXNzaW9uLCBjb250 cm9sLmRvdWJsZV90eXBlKTsKICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHN5bWJv bCA9IGNvbnRyb2wuZG91YmxlX3R5cGU7CiAgICB9CiAgICBlbHNlIGlmIChyaWdodF90eXBlID09 IGNvbnRyb2wuZG91YmxlX3R5cGUpCiAgICB7CiAgICAgICAgaWYgKGxlZnRfdHlwZSAhPSBjb250 cm9sLmRvdWJsZV90eXBlKQogICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHRy dWVfZXhwcmVzc2lvbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRUb1R5cGUoY29u ZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB0cnVlX2V4cHJlc3Npb24sIGNvbnRyb2wuZG91YmxlX3R5 cGUpOwogICAgICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gc3ltYm9sID0gY29udHJvbC5k b3VibGVfdHlwZTsKICAgIH0KICAgIGVsc2UgaWYgKGxlZnRfdHlwZSA9PSBjb250cm9sLmZsb2F0 X3R5cGUpCiAgICB7CiAgICAgICAgaWYgKHJpZ2h0X3R5cGUgIT0gY29udHJvbC5mbG9hdF90eXBl KQogICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IGZhbHNlX2V4cHJlc3Npb24g PQogICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0VG9UeXBlKGNvbmRpdGlvbmFsX2V4cHJl c3Npb24gLT4gZmFsc2VfZXhwcmVzc2lvbiwgY29udHJvbC5mbG9hdF90eXBlKTsKICAgICAgICBj b25kaXRpb25hbF9leHByZXNzaW9uIC0+IHN5bWJvbCA9IGNvbnRyb2wuZmxvYXRfdHlwZTsKICAg IH0KICAgIGVsc2UgaWYgKHJpZ2h0X3R5cGUgPT0gY29udHJvbC5mbG9hdF90eXBlKQogICAgewog ICAgICAgIGlmIChsZWZ0X3R5cGUgIT0gY29udHJvbC5mbG9hdF90eXBlKQogICAgICAgICAgICBj b25kaXRpb25hbF9leHByZXNzaW9uIC0+IHRydWVfZXhwcmVzc2lvbiA9CiAgICAgICAgICAgICAg ICAgICAgICAgIENvbnZlcnRUb1R5cGUoY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB0cnVlX2V4 cHJlc3Npb24sIGNvbnRyb2wuZmxvYXRfdHlwZSk7CiAgICAgICAgY29uZGl0aW9uYWxfZXhwcmVz c2lvbiAtPiBzeW1ib2wgPSBjb250cm9sLmZsb2F0X3R5cGU7CiAgICB9CiAgICBlbHNlIGlmIChs ZWZ0X3R5cGUgPT0gY29udHJvbC5sb25nX3R5cGUpCiAgICB7CiAgICAgICAgaWYgKHJpZ2h0X3R5 cGUgIT0gY29udHJvbC5sb25nX3R5cGUpCiAgICAgICAgICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Np b24gLT4gZmFsc2VfZXhwcmVzc2lvbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRU b1R5cGUoY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9leHByZXNzaW9uLCBjb250cm9s LmxvbmdfdHlwZSk7CiAgICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBj b250cm9sLmxvbmdfdHlwZTsKICAgIH0KICAgIGVsc2UgaWYgKHJpZ2h0X3R5cGUgPT0gY29udHJv bC5sb25nX3R5cGUpCiAgICB7CiAgICAgICAgaWYgKGxlZnRfdHlwZSAhPSBjb250cm9sLmxvbmdf dHlwZSkKICAgICAgICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB0cnVlX2V4cHJlc3Np b24gPSBDb252ZXJ0VG9UeXBlKGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gdHJ1ZV9leHByZXNz aW9uLCBjb250cm9sLmxvbmdfdHlwZSk7CiAgICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAt PiBzeW1ib2wgPSBjb250cm9sLmxvbmdfdHlwZTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAg ICBpZiAobGVmdF90eXBlICE9IGNvbnRyb2wuaW50X3R5cGUpCiAgICAgICAgICAgIGNvbmRpdGlv bmFsX2V4cHJlc3Npb24gLT4gdHJ1ZV9leHByZXNzaW9uID0gQ29udmVydFRvVHlwZShjb25kaXRp b25hbF9leHByZXNzaW9uIC0+IHRydWVfZXhwcmVzc2lvbiwgY29udHJvbC5pbnRfdHlwZSk7CiAg ICAgICAgaWYgKHJpZ2h0X3R5cGUgIT0gY29udHJvbC5pbnRfdHlwZSkKICAgICAgICAgICAgY29u ZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9leHByZXNzaW9uID0KICAgICAgICAgICAgICAg ICAgICAgICAgQ29udmVydFRvVHlwZShjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IGZhbHNlX2V4 cHJlc3Npb24sIGNvbnRyb2wuaW50X3R5cGUpOwogICAgICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Np b24gLT4gc3ltYm9sID0gY29udHJvbC5pbnRfdHlwZTsKICAgIH0KCiAgICByZXR1cm47Cn0KCgp2 b2lkIFNlbWFudGljOjpQcm9jZXNzUExVUyhBc3RCaW5hcnlFeHByZXNzaW9uICpleHByKQp7CiAg ICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBQcm9jZXNzRXhwcmVzc2lvbihleHByIC0+IGxlZnRf ZXhwcmVzc2lvbik7CiAgICBQcm9jZXNzRXhwcmVzc2lvbihleHByIC0+IHJpZ2h0X2V4cHJlc3Np b24pOwoKICAgIFR5cGVTeW1ib2wgKmxlZnRfdHlwZSAgPSBleHByIC0+IGxlZnRfZXhwcmVzc2lv biAtPiBUeXBlKCksCiAgICAgICAgICAgICAgICpyaWdodF90eXBlID0gZXhwciAtPiByaWdodF9l eHByZXNzaW9uIC0+IFR5cGUoKTsKCiAgICBpZiAobGVmdF90eXBlID09IGNvbnRyb2wubm9fdHlw ZSB8fCByaWdodF90eXBlID09IGNvbnRyb2wubm9fdHlwZSkKICAgICAgICBleHByIC0+IHN5bWJv bCA9IGNvbnRyb2wubm9fdHlwZTsKICAgIGVsc2UgaWYgKGxlZnRfdHlwZSA9PSBjb250cm9sLlN0 cmluZygpIHx8IHJpZ2h0X3R5cGUgPT0gY29udHJvbC5TdHJpbmcoKSkKICAgIHsKICAgICAgICAg CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgIFN5bWJvbFNl dCAqZXhjZXB0aW9uX3NldCA9IFRyeUV4Y2VwdGlvblRhYmxlU3RhY2soKS5Ub3AoKTsKICAgICAg ICBpZiAoZXhjZXB0aW9uX3NldCkKICAgICAgICB7CiAgICAgICAgICAgIGV4Y2VwdGlvbl9zZXQg LT4gQWRkRWxlbWVudChjb250cm9sLkVycm9yKCkpOwogICAgICAgIH0KCiAgICAgICAgIAogICAg ICAgICAKICAgICAgICAgCiAgICAgICAgaWYgKGxlZnRfdHlwZSAhPSBjb250cm9sLlN0cmluZygp KQogICAgICAgIHsKICAgICAgICAgICAgQWRkU3RyaW5nQ29udmVyc2lvbkRlcGVuZGVuY2UobGVm dF90eXBlLCBleHByIC0+IGJpbmFyeV9vcGVyYXRvcl90b2tlbik7CiAgICAgICAgICAgIGlmIChs ZWZ0X3R5cGUgPT0gY29udHJvbC52b2lkX3R5cGUpCiAgICAgICAgICAgICAgICAgUmVwb3J0U2Vt RXJyb3IoU2VtYW50aWNFcnJvcjo6Vk9JRF9UT19TVFJJTkcsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gTGVmdFRva2VuKCksCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gUmln aHRUb2tlbigpKTsKICAgICAgICAgICAgZWxzZSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiA9IENv bnZlcnRUb1R5cGUoZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24sIGNvbnRyb2wuU3RyaW5nKCkpOwog ICAgICAgIH0KCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgaWYgKHJpZ2h0 X3R5cGUgIT0gY29udHJvbC5TdHJpbmcoKSkKICAgICAgICB7CiAgICAgICAgICAgIEFkZFN0cmlu Z0NvbnZlcnNpb25EZXBlbmRlbmNlKHJpZ2h0X3R5cGUsIGV4cHIgLT4gYmluYXJ5X29wZXJhdG9y X3Rva2VuKTsKICAgICAgICAgICAgaWYgKHJpZ2h0X3R5cGUgPT0gY29udHJvbC52b2lkX3R5cGUp CiAgICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6Vk9JRF9UT19T VFJJTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiByaWdodF9leHBy ZXNzaW9uIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4 cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiBSaWdodFRva2VuKCkpOwogICAgICAgICAgICBlbHNl IGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiA9IENvbnZlcnRUb1R5cGUoZXhwciAtPiByaWdodF9l eHByZXNzaW9uLCBjb250cm9sLlN0cmluZygpKTsKICAgICAgICB9CgogICAgICAgIEFkZERlcGVu ZGVuY2UoVGhpc1R5cGUoKSwgY29udHJvbC5TdHJpbmdCdWZmZXIoKSwgZXhwciAtPiBiaW5hcnlf b3BlcmF0b3JfdG9rZW4pOwoKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAg CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAg ICAgCiAgICAgICAgIAoKICAgICAgICBleHByIC0+IHN5bWJvbCA9IGNvbnRyb2wuU3RyaW5nKCk7 CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgQmluYXJ5TnVtZXJpY1Byb21vdGlvbihleHBy KTsKCiAgICAgICAgaWYgKGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSAm JiBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gSXNDb25zdGFudCgpKQogICAgICAgIHsKICAg ICAgICAgICAgIGlmIChleHByIC0+IFR5cGUoKSA9PSBjb250cm9sLmRvdWJsZV90eXBlKQogICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgIERvdWJsZUxpdGVyYWxWYWx1ZSAqbGVmdCA9IChE b3VibGVMaXRlcmFsVmFsdWUgKikgZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gdmFsdWU7CiAg ICAgICAgICAgICAgICAgRG91YmxlTGl0ZXJhbFZhbHVlICpyaWdodCA9IChEb3VibGVMaXRlcmFs VmFsdWUgKikgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAgICAg ICAgICBleHByIC0+IHZhbHVlID0gY29udHJvbC5kb3VibGVfcG9vbC5GaW5kT3JJbnNlcnQobGVm dCAtPiB2YWx1ZSArIHJpZ2h0IC0+IHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAg IGVsc2UgaWYgKGV4cHIgLT4gVHlwZSgpID09IGNvbnRyb2wuZmxvYXRfdHlwZSkKICAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgICBGbG9hdExpdGVyYWxWYWx1ZSAqbGVmdCA9IChGbG9hdExp dGVyYWxWYWx1ZSAqKSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAg ICAgICAgICBGbG9hdExpdGVyYWxWYWx1ZSAqcmlnaHQgPSAoRmxvYXRMaXRlcmFsVmFsdWUgKikg ZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAgICAgICAgICBleHBy IC0+IHZhbHVlID0gY29udHJvbC5mbG9hdF9wb29sLkZpbmRPckluc2VydChsZWZ0IC0+IHZhbHVl ICsgcmlnaHQgLT4gdmFsdWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAo ZXhwciAtPiBUeXBlKCkgPT0gY29udHJvbC5sb25nX3R5cGUpCiAgICAgICAgICAgICB7CiAgICAg ICAgICAgICAgICAgTG9uZ0xpdGVyYWxWYWx1ZSAqbGVmdCA9IChMb25nTGl0ZXJhbFZhbHVlICop IGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgIExvbmdM aXRlcmFsVmFsdWUgKnJpZ2h0ID0gKExvbmdMaXRlcmFsVmFsdWUgKikgZXhwciAtPiByaWdodF9l eHByZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAgICAgICAgICBleHByIC0+IHZhbHVlID0gY29u dHJvbC5sb25nX3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgKyByaWdodCAtPiB2YWx1 ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlICAKICAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKmxlZnQgPSAoSW50TGl0ZXJhbFZhbHVlICop IGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgIEludExp dGVyYWxWYWx1ZSAqcmlnaHQgPSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gcmlnaHRfZXhw cmVzc2lvbiAtPiB2YWx1ZTsKCiAgICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRy b2wuaW50X3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgKyByaWdodCAtPiB2YWx1ZSk7 CiAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKCnZvaWQgU2Vt YW50aWM6OlByb2Nlc3NMRUZUX1NISUZUKEFzdEJpbmFyeUV4cHJlc3Npb24gKmV4cHIpCnsKICAg IFByb2Nlc3NFeHByZXNzaW9uKGV4cHIgLT4gbGVmdF9leHByZXNzaW9uKTsKICAgIFByb2Nlc3NF eHByZXNzaW9uKGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbik7CgogICAgVHlwZVN5bWJvbCAqbGVm dF90eXBlICA9IGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IFR5cGUoKSwKICAgICAgICAgICAg ICAgKnJpZ2h0X3R5cGUgPSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gVHlwZSgpOwoKICAg IGlmIChsZWZ0X3R5cGUgPT0gY29udHJvbC5ub190eXBlIHx8IHJpZ2h0X3R5cGUgPT0gY29udHJv bC5ub190eXBlKQogICAgICAgIGV4cHIgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAg ZWxzZSBpZiAoISBjb250cm9sLklzSW50ZWdyYWwobGVmdF90eXBlKSkKICAgIHsKICAgICAgICBS ZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpUWVBFX05PVF9JTlRFR1JBTCwKICAgICAgICAg ICAgICAgICAgICAgICBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBMZWZ0VG9rZW4oKSwKICAg ICAgICAgICAgICAgICAgICAgICBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBSaWdodFRva2Vu KCksCiAgICAgICAgICAgICAgICAgICAgICAgbGVmdF90eXBlIC0+IE5hbWUoKSk7CiAgICAgICAg ZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICB9CiAgICBlbHNlIGlmICghIGNv bnRyb2wuSXNJbnRlZ3JhbChyaWdodF90eXBlKSkKICAgIHsKICAgICAgICBSZXBvcnRTZW1FcnJv cihTZW1hbnRpY0Vycm9yOjpUWVBFX05PVF9JTlRFR1JBTCwKICAgICAgICAgICAgICAgICAgICAg ICBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAg ICAgICAgICAgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAg ICAgICAgICAgICAgICAgICByaWdodF90eXBlIC0+IE5hbWUoKSk7CiAgICAgICAgZXhwciAtPiBz eW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZXhw ciAtPiBsZWZ0X2V4cHJlc3Npb24gID0gUHJvbW90ZVVuYXJ5TnVtZXJpY0V4cHJlc3Npb24oZXhw ciAtPiBsZWZ0X2V4cHJlc3Npb24pOwogICAgICAgIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiA9 IFByb21vdGVVbmFyeU51bWVyaWNFeHByZXNzaW9uKGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbik7 CiAgICAgICAgaWYgKGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiBUeXBlKCkgPT0gY29udHJv bC5sb25nX3R5cGUpCiAgICAgICAgICAgIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiA9IENvbnZl cnRUb1R5cGUoZXhwciAtPiByaWdodF9leHByZXNzaW9uLCBjb250cm9sLmludF90eXBlKTsKICAg ICAgICBleHByIC0+IHN5bWJvbCA9IGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHN5bWJvbDsK CiAgICAgICAgaWYgKGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSAmJiBl eHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gSXNDb25zdGFudCgpKQogICAgICAgIHsKICAgICAg ICAgICAgaWYgKGV4cHIgLT4gVHlwZSgpID09IGNvbnRyb2wubG9uZ190eXBlKQogICAgICAgICAg ICB7CiAgICAgICAgICAgICAgICBMb25nTGl0ZXJhbFZhbHVlICpsZWZ0ID0gKExvbmdMaXRlcmFs VmFsdWUgKikgZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gdmFsdWU7CiAgICAgICAgICAgICAg ICBJbnRMaXRlcmFsVmFsdWUgKnJpZ2h0ID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJp Z2h0X2V4cHJlc3Npb24gLT4gdmFsdWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9 IGNvbnRyb2wubG9uZ19wb29sLkZpbmRPckluc2VydChsZWZ0IC0+IHZhbHVlIDw8IChyaWdodCAt PiB2YWx1ZSAmIExPTkdfU0hJRlRfTUFTSykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVs c2UgIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKmxlZnQg PSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwog ICAgICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICpyaWdodCA9IChJbnRMaXRlcmFsVmFsdWUg KikgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAgICAgICAgIGV4 cHIgLT4gdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPckluc2VydChsZWZ0IC0+IHZhbHVl IDw8IChyaWdodCAtPiB2YWx1ZSAmIElOVF9TSElGVF9NQVNLKSk7CiAgICAgICAgICAgIH0KICAg ICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vzc1JJR0hU X1NISUZUKEFzdEJpbmFyeUV4cHJlc3Npb24gKmV4cHIpCnsKICAgIFByb2Nlc3NFeHByZXNzaW9u KGV4cHIgLT4gbGVmdF9leHByZXNzaW9uKTsKICAgIFByb2Nlc3NFeHByZXNzaW9uKGV4cHIgLT4g cmlnaHRfZXhwcmVzc2lvbik7CgogICAgVHlwZVN5bWJvbCAqbGVmdF90eXBlICA9IGV4cHIgLT4g bGVmdF9leHByZXNzaW9uIC0+IFR5cGUoKSwKICAgICAgICAgICAgICAgKnJpZ2h0X3R5cGUgPSBl eHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gVHlwZSgpOwoKICAgIGlmIChsZWZ0X3R5cGUgPT0g Y29udHJvbC5ub190eXBlIHx8IHJpZ2h0X3R5cGUgPT0gY29udHJvbC5ub190eXBlKQogICAgICAg IGV4cHIgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgZWxzZSBpZiAoISBjb250cm9s LklzSW50ZWdyYWwobGVmdF90eXBlKSkKICAgIHsKICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1h bnRpY0Vycm9yOjpUWVBFX05PVF9JTlRFR1JBTCwKICAgICAgICAgICAgICAgICAgICAgICBleHBy IC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAg ICBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAg ICAgICAgICAgbGVmdF90eXBlIC0+IE5hbWUoKSk7CiAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBj b250cm9sLm5vX3R5cGU7CiAgICB9CiAgICBlbHNlIGlmICghIGNvbnRyb2wuSXNJbnRlZ3JhbChy aWdodF90eXBlKSkKICAgIHsKICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpU WVBFX05PVF9JTlRFR1JBTCwKICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IHJpZ2h0X2V4 cHJlc3Npb24gLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBy aWdodF9leHByZXNzaW9uIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICBy aWdodF90eXBlIC0+IE5hbWUoKSk7CiAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLm5v X3R5cGU7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZXhwciAtPiBsZWZ0X2V4cHJlc3Np b24gID0gUHJvbW90ZVVuYXJ5TnVtZXJpY0V4cHJlc3Npb24oZXhwciAtPiBsZWZ0X2V4cHJlc3Np b24pOwogICAgICAgIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiA9IFByb21vdGVVbmFyeU51bWVy aWNFeHByZXNzaW9uKGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbik7CiAgICAgICAgaWYgKGV4cHIg LT4gcmlnaHRfZXhwcmVzc2lvbiAtPiBUeXBlKCkgPT0gY29udHJvbC5sb25nX3R5cGUpCiAgICAg ICAgICAgIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiA9IENvbnZlcnRUb1R5cGUoZXhwciAtPiBy aWdodF9leHByZXNzaW9uLCBjb250cm9sLmludF90eXBlKTsKICAgICAgICBleHByIC0+IHN5bWJv bCA9IGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHN5bWJvbDsKCiAgICAgICAgaWYgKGV4cHIg LT4gbGVmdF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSAmJiBleHByIC0+IHJpZ2h0X2V4cHJl c3Npb24gLT4gSXNDb25zdGFudCgpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGV4cHIgLT4g VHlwZSgpID09IGNvbnRyb2wubG9uZ190eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICBMb25nTGl0ZXJhbFZhbHVlICpsZWZ0ID0gKExvbmdMaXRlcmFsVmFsdWUgKikgZXhwciAtPiBs ZWZ0X2V4cHJlc3Npb24gLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUg KnJpZ2h0ID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4g dmFsdWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wubG9uZ19wb29s LkZpbmRPckluc2VydChsZWZ0IC0+IHZhbHVlID4+IChyaWdodCAtPiB2YWx1ZSAmIExPTkdfU0hJ RlRfTUFTSykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIAogICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKmxlZnQgPSAoSW50TGl0ZXJhbFZhbHVl ICopIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgSW50 TGl0ZXJhbFZhbHVlICpyaWdodCA9IChJbnRMaXRlcmFsVmFsdWUgKikgZXhwciAtPiByaWdodF9l eHByZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250 cm9sLmludF9wb29sLkZpbmRPckluc2VydChsZWZ0IC0+IHZhbHVlID4+IChyaWdodCAtPiB2YWx1 ZSAmIElOVF9TSElGVF9NQVNLKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAg cmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vzc1VOU0lHTkVEX1JJR0hUX1NISUZUKEFz dEJpbmFyeUV4cHJlc3Npb24gKmV4cHIpCnsKICAgIFByb2Nlc3NFeHByZXNzaW9uKGV4cHIgLT4g bGVmdF9leHByZXNzaW9uKTsKICAgIFByb2Nlc3NFeHByZXNzaW9uKGV4cHIgLT4gcmlnaHRfZXhw cmVzc2lvbik7CgogICAgVHlwZVN5bWJvbCAqbGVmdF90eXBlICA9IGV4cHIgLT4gbGVmdF9leHBy ZXNzaW9uIC0+IFR5cGUoKSwKICAgICAgICAgICAgICAgKnJpZ2h0X3R5cGUgPSBleHByIC0+IHJp Z2h0X2V4cHJlc3Npb24gLT4gVHlwZSgpOwoKICAgIGlmIChsZWZ0X3R5cGUgPT0gY29udHJvbC5u b190eXBlIHx8IHJpZ2h0X3R5cGUgPT0gY29udHJvbC5ub190eXBlKQogICAgICAgIGV4cHIgLT4g c3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgZWxzZSBpZiAoISBjb250cm9sLklzSW50ZWdy YWwobGVmdF90eXBlKSkKICAgIHsKICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9y OjpUWVBFX05PVF9JTlRFR1JBTCwKICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IGxlZnRf ZXhwcmVzc2lvbiAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+ IGxlZnRfZXhwcmVzc2lvbiAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAg bGVmdF90eXBlIC0+IE5hbWUoKSk7CiAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLm5v X3R5cGU7CiAgICB9CiAgICBlbHNlIGlmICghIGNvbnRyb2wuSXNJbnRlZ3JhbChyaWdodF90eXBl KSkKICAgIHsKICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpUWVBFX05PVF9J TlRFR1JBTCwKICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24g LT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiByaWdodF9leHBy ZXNzaW9uIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICByaWdodF90eXBl IC0+IE5hbWUoKSk7CiAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAg ICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gID0gUHJv bW90ZVVuYXJ5TnVtZXJpY0V4cHJlc3Npb24oZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24pOwogICAg ICAgIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiA9IFByb21vdGVVbmFyeU51bWVyaWNFeHByZXNz aW9uKGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbik7CiAgICAgICAgaWYgKGV4cHIgLT4gcmlnaHRf ZXhwcmVzc2lvbiAtPiBUeXBlKCkgPT0gY29udHJvbC5sb25nX3R5cGUpCiAgICAgICAgICAgIGV4 cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiA9IENvbnZlcnRUb1R5cGUoZXhwciAtPiByaWdodF9leHBy ZXNzaW9uLCBjb250cm9sLmludF90eXBlKTsKICAgICAgICBleHByIC0+IHN5bWJvbCA9IGV4cHIg LT4gbGVmdF9leHByZXNzaW9uIC0+IHN5bWJvbDsKCiAgICAgICAgaWYgKGV4cHIgLT4gbGVmdF9l eHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSAmJiBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4g SXNDb25zdGFudCgpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGV4cHIgLT4gVHlwZSgpID09 IGNvbnRyb2wubG9uZ190eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMb25nTGl0 ZXJhbFZhbHVlICpsZWZ0ID0gKExvbmdMaXRlcmFsVmFsdWUgKikgZXhwciAtPiBsZWZ0X2V4cHJl c3Npb24gLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKnJpZ2h0ID0g KEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gdmFsdWU7Cgog ICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wubG9uZ19wb29sLkZpbmRPcklu c2VydCgoTG9uZ0ludCkKICAgICAgICAgICAgICAgICAgICAoKFVMb25nSW50KSBsZWZ0IC0+IHZh bHVlID4+IChyaWdodCAtPiB2YWx1ZSAmIExPTkdfU0hJRlRfTUFTSykpKTsKICAgICAgICAgICAg fQogICAgICAgICAgICBlbHNlICAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgSW50TGl0 ZXJhbFZhbHVlICpsZWZ0ID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IGxlZnRfZXhwcmVz c2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIEludExpdGVyYWxWYWx1ZSAqcmlnaHQgPSAo SW50TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKCiAg ICAgICAgICAgICAgICBleHByIC0+IHZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNl cnQoKGk0KQogICAgICAgICAgICAgICAgICAgICgodTQpIGxlZnQgLT4gdmFsdWUgPj4gKHJpZ2h0 IC0+IHZhbHVlICYgSU5UX1NISUZUX01BU0spKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAg ICB9CgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vzc0xFU1MoQXN0QmluYXJ5 RXhwcmVzc2lvbiAqZXhwcikKewogICAgUHJvY2Vzc0V4cHJlc3Npb24oZXhwciAtPiBsZWZ0X2V4 cHJlc3Npb24pOwogICAgUHJvY2Vzc0V4cHJlc3Npb24oZXhwciAtPiByaWdodF9leHByZXNzaW9u KTsKCiAgICBUeXBlU3ltYm9sICpsZWZ0X3R5cGUgID0gZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24g LT4gVHlwZSgpLAogICAgICAgICAgICAgICAqcmlnaHRfdHlwZSA9IGV4cHIgLT4gcmlnaHRfZXhw cmVzc2lvbiAtPiBUeXBlKCk7CgogICAgaWYgKGxlZnRfdHlwZSAhPSBjb250cm9sLm5vX3R5cGUg JiYgcmlnaHRfdHlwZSAhPSBjb250cm9sLm5vX3R5cGUpCiAgICB7CiAgICAgICAgQmluYXJ5TnVt ZXJpY1Byb21vdGlvbihleHByKTsKCiAgICAgICAgaWYgKGV4cHIgLT4gbGVmdF9leHByZXNzaW9u IC0+IElzQ29uc3RhbnQoKSAmJiBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gSXNDb25zdGFu dCgpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGV4cHIgLT4gVHlwZSgpID09IGNvbnRyb2wu ZG91YmxlX3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERvdWJsZUxpdGVyYWxW YWx1ZSAqbGVmdCA9IChEb3VibGVMaXRlcmFsVmFsdWUgKikgZXhwciAtPiBsZWZ0X2V4cHJlc3Np b24gLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBEb3VibGVMaXRlcmFsVmFsdWUgKnJpZ2h0ID0g KERvdWJsZUxpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gdmFsdWU7 CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wuaW50X3Bvb2wuRmluZE9y SW5zZXJ0KGxlZnQgLT4gdmFsdWUgPCByaWdodCAtPiB2YWx1ZSA/IDEgOiAwKTsKICAgICAgICAg ICAgfQogICAgICAgICAgICBlbHNlIGlmIChleHByIC0+IFR5cGUoKSA9PSBjb250cm9sLmZsb2F0 X3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZsb2F0TGl0ZXJhbFZhbHVlICps ZWZ0ID0gKEZsb2F0TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZh bHVlOwogICAgICAgICAgICAgICAgRmxvYXRMaXRlcmFsVmFsdWUgKnJpZ2h0ID0gKEZsb2F0TGl0 ZXJhbFZhbHVlICopIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKCiAgICAgICAg ICAgICAgICBleHByIC0+IHZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQobGVm dCAtPiB2YWx1ZSA8IHJpZ2h0IC0+IHZhbHVlID8gMSA6IDApOwogICAgICAgICAgICB9CiAgICAg ICAgICAgIGVsc2UgaWYgKGV4cHIgLT4gVHlwZSgpID09IGNvbnRyb2wubG9uZ190eXBlKQogICAg ICAgICAgIHsKICAgICAgICAgICAgICAgIExvbmdMaXRlcmFsVmFsdWUgKmxlZnQgPSAoTG9uZ0xp dGVyYWxWYWx1ZSAqKSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAg ICAgICAgIExvbmdMaXRlcmFsVmFsdWUgKnJpZ2h0ID0gKExvbmdMaXRlcmFsVmFsdWUgKikgZXhw ciAtPiByaWdodF9leHByZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAgICAgICAgIGV4cHIgLT4g dmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPckluc2VydChsZWZ0IC0+IHZhbHVlIDwgcmln aHQgLT4gdmFsdWUgPyAxIDogMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAgCiAg ICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEludExpdGVyYWxWYWx1ZSAqbGVmdCA9IChJbnRM aXRlcmFsVmFsdWUgKikgZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gdmFsdWU7CiAgICAgICAg ICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKnJpZ2h0ID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHBy IC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gdmFsdWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2 YWx1ZSA9IGNvbnRyb2wuaW50X3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgPCByaWdo dCAtPiB2YWx1ZSA/IDEgOiAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBl eHByIC0+IHN5bWJvbCA9IGNvbnRyb2wuYm9vbGVhbl90eXBlOwoKICAgIHJldHVybjsKfQoKCnZv aWQgU2VtYW50aWM6OlByb2Nlc3NHUkVBVEVSKEFzdEJpbmFyeUV4cHJlc3Npb24gKmV4cHIpCnsK ICAgIFByb2Nlc3NFeHByZXNzaW9uKGV4cHIgLT4gbGVmdF9leHByZXNzaW9uKTsKICAgIFByb2Nl c3NFeHByZXNzaW9uKGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbik7CgogICAgVHlwZVN5bWJvbCAq bGVmdF90eXBlICA9IGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IFR5cGUoKSwKICAgICAgICAg ICAgICAgKnJpZ2h0X3R5cGUgPSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gVHlwZSgpOwoK ICAgIGlmIChsZWZ0X3R5cGUgIT0gY29udHJvbC5ub190eXBlICYmIHJpZ2h0X3R5cGUgIT0gY29u dHJvbC5ub190eXBlKQogICAgewogICAgICAgIEJpbmFyeU51bWVyaWNQcm9tb3Rpb24oZXhwcik7 CgogICAgICAgIGlmIChleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50KCkgJiYg ZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSkKICAgICAgICB7CiAgICAg ICAgICAgIGlmIChleHByIC0+IFR5cGUoKSA9PSBjb250cm9sLmRvdWJsZV90eXBlKQogICAgICAg ICAgICB7CiAgICAgICAgICAgICAgICBEb3VibGVMaXRlcmFsVmFsdWUgKmxlZnQgPSAoRG91Ymxl TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAg ICAgICAgICAgRG91YmxlTGl0ZXJhbFZhbHVlICpyaWdodCA9IChEb3VibGVMaXRlcmFsVmFsdWUg KikgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAgICAgICAgIGV4 cHIgLT4gdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPckluc2VydChsZWZ0IC0+IHZhbHVl ID4gcmlnaHQgLT4gdmFsdWUgPyAxIDogMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxz ZSBpZiAoZXhwciAtPiBUeXBlKCkgPT0gY29udHJvbC5mbG9hdF90eXBlKQogICAgICAgICAgICB7 CiAgICAgICAgICAgICAgICBGbG9hdExpdGVyYWxWYWx1ZSAqbGVmdCA9IChGbG9hdExpdGVyYWxW YWx1ZSAqKSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgICAg IEZsb2F0TGl0ZXJhbFZhbHVlICpyaWdodCA9IChGbG9hdExpdGVyYWxWYWx1ZSAqKSBleHByIC0+ IHJpZ2h0X2V4cHJlc3Npb24gLT4gdmFsdWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1 ZSA9IGNvbnRyb2wuaW50X3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgPiByaWdodCAt PiB2YWx1ZSA/IDEgOiAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChleHBy IC0+IFR5cGUoKSA9PSBjb250cm9sLmxvbmdfdHlwZSkKICAgICAgICAgICAgewogICAgICAgICAg ICAgICAgTG9uZ0xpdGVyYWxWYWx1ZSAqbGVmdCA9IChMb25nTGl0ZXJhbFZhbHVlICopIGV4cHIg LT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgTG9uZ0xpdGVyYWxW YWx1ZSAqcmlnaHQgPSAoTG9uZ0xpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJlc3Np b24gLT4gdmFsdWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wuaW50 X3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgPiByaWdodCAtPiB2YWx1ZSA/IDEgOiAw KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlICAKICAgICAgICAgICAgewogICAgICAg ICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICpsZWZ0ID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHBy IC0+IGxlZnRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIEludExpdGVyYWxW YWx1ZSAqcmlnaHQgPSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lv biAtPiB2YWx1ZTsKCiAgICAgICAgICAgICAgICBleHByIC0+IHZhbHVlID0gY29udHJvbC5pbnRf cG9vbC5GaW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSA+IHJpZ2h0IC0+IHZhbHVlID8gMSA6IDAp OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGV4cHIgLT4gc3ltYm9sID0gY29u dHJvbC5ib29sZWFuX3R5cGU7CgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vz c0xFU1NfRVFVQUwoQXN0QmluYXJ5RXhwcmVzc2lvbiAqZXhwcikKewogICAgUHJvY2Vzc0V4cHJl c3Npb24oZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24pOwogICAgUHJvY2Vzc0V4cHJlc3Npb24oZXhw ciAtPiByaWdodF9leHByZXNzaW9uKTsKCiAgICBUeXBlU3ltYm9sICpsZWZ0X3R5cGUgID0gZXhw ciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gVHlwZSgpLAogICAgICAgICAgICAgICAqcmlnaHRfdHlw ZSA9IGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiBUeXBlKCk7CgogICAgaWYgKGxlZnRfdHlw ZSAhPSBjb250cm9sLm5vX3R5cGUgJiYgcmlnaHRfdHlwZSAhPSBjb250cm9sLm5vX3R5cGUpCiAg ICB7CiAgICAgICAgQmluYXJ5TnVtZXJpY1Byb21vdGlvbihleHByKTsKCiAgICAgICAgaWYgKGV4 cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSAmJiBleHByIC0+IHJpZ2h0X2V4 cHJlc3Npb24gLT4gSXNDb25zdGFudCgpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGV4cHIg LT4gVHlwZSgpID09IGNvbnRyb2wuZG91YmxlX3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAg ICAgICAgIERvdWJsZUxpdGVyYWxWYWx1ZSAqbGVmdCA9IChEb3VibGVMaXRlcmFsVmFsdWUgKikg ZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBEb3VibGVM aXRlcmFsVmFsdWUgKnJpZ2h0ID0gKERvdWJsZUxpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0 X2V4cHJlc3Npb24gLT4gdmFsdWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNv bnRyb2wuaW50X3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgPD0gcmlnaHQgLT4gdmFs dWUgPyAxIDogMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZXhwciAtPiBU eXBlKCkgPT0gY29udHJvbC5mbG9hdF90eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICBGbG9hdExpdGVyYWxWYWx1ZSAqbGVmdCA9IChGbG9hdExpdGVyYWxWYWx1ZSAqKSBleHByIC0+ IGxlZnRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIEZsb2F0TGl0ZXJhbFZh bHVlICpyaWdodCA9IChGbG9hdExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJlc3Np b24gLT4gdmFsdWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wuaW50 X3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgPD0gcmlnaHQgLT4gdmFsdWUgPyAxIDog MCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZXhwciAtPiBUeXBlKCkgPT0g Y29udHJvbC5sb25nX3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIExvbmdMaXRl cmFsVmFsdWUgKmxlZnQgPSAoTG9uZ0xpdGVyYWxWYWx1ZSAqKSBleHByIC0+IGxlZnRfZXhwcmVz c2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIExvbmdMaXRlcmFsVmFsdWUgKnJpZ2h0ID0g KExvbmdMaXRlcmFsVmFsdWUgKikgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IHZhbHVlOwoK ICAgICAgICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPcklu c2VydChsZWZ0IC0+IHZhbHVlIDw9IHJpZ2h0IC0+IHZhbHVlID8gMSA6IDApOwogICAgICAgICAg ICB9CiAgICAgICAgICAgIGVsc2UgIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBJbnRM aXRlcmFsVmFsdWUgKmxlZnQgPSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVmdF9leHBy ZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICpyaWdodCA9 IChJbnRMaXRlcmFsVmFsdWUgKikgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IHZhbHVlOwoK ICAgICAgICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPcklu c2VydChsZWZ0IC0+IHZhbHVlIDw9IHJpZ2h0IC0+IHZhbHVlID8gMSA6IDApOwogICAgICAgICAg ICB9CiAgICAgICAgfQogICAgfQoKICAgIGV4cHIgLT4gc3ltYm9sID0gY29udHJvbC5ib29sZWFu X3R5cGU7CgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vzc0dSRUFURVJfRVFV QUwoQXN0QmluYXJ5RXhwcmVzc2lvbiAqZXhwcikKewogICAgUHJvY2Vzc0V4cHJlc3Npb24oZXhw ciAtPiBsZWZ0X2V4cHJlc3Npb24pOwogICAgUHJvY2Vzc0V4cHJlc3Npb24oZXhwciAtPiByaWdo dF9leHByZXNzaW9uKTsKCiAgICBUeXBlU3ltYm9sICpsZWZ0X3R5cGUgID0gZXhwciAtPiBsZWZ0 X2V4cHJlc3Npb24gLT4gVHlwZSgpLAogICAgICAgICAgICAgICAqcmlnaHRfdHlwZSA9IGV4cHIg LT4gcmlnaHRfZXhwcmVzc2lvbiAtPiBUeXBlKCk7CgogICAgaWYgKGxlZnRfdHlwZSAhPSBjb250 cm9sLm5vX3R5cGUgJiYgcmlnaHRfdHlwZSAhPSBjb250cm9sLm5vX3R5cGUpCiAgICB7CiAgICAg ICAgQmluYXJ5TnVtZXJpY1Byb21vdGlvbihleHByKTsKCiAgICAgICAgaWYgKGV4cHIgLT4gbGVm dF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSAmJiBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24g LT4gSXNDb25zdGFudCgpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGV4cHIgLT4gVHlwZSgp ID09IGNvbnRyb2wuZG91YmxlX3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERv dWJsZUxpdGVyYWxWYWx1ZSAqbGVmdCA9IChEb3VibGVMaXRlcmFsVmFsdWUgKikgZXhwciAtPiBs ZWZ0X2V4cHJlc3Npb24gLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBEb3VibGVMaXRlcmFsVmFs dWUgKnJpZ2h0ID0gKERvdWJsZUxpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJlc3Np b24gLT4gdmFsdWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wuaW50 X3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgPj0gcmlnaHQgLT4gdmFsdWUgPyAxIDog MCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZXhwciAtPiBUeXBlKCkgPT0g Y29udHJvbC5mbG9hdF90eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGbG9hdExp dGVyYWxWYWx1ZSAqbGVmdCA9IChGbG9hdExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IGxlZnRfZXhw cmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIEZsb2F0TGl0ZXJhbFZhbHVlICpyaWdo dCA9IChGbG9hdExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gdmFs dWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wuaW50X3Bvb2wuRmlu ZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgPj0gcmlnaHQgLT4gdmFsdWUgPyAxIDogMCk7CiAgICAg ICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZXhwciAtPiBUeXBlKCkgPT0gY29udHJvbC5s b25nX3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIExvbmdMaXRlcmFsVmFsdWUg KmxlZnQgPSAoTG9uZ0xpdGVyYWxWYWx1ZSAqKSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiB2 YWx1ZTsKICAgICAgICAgICAgICAgIExvbmdMaXRlcmFsVmFsdWUgKnJpZ2h0ID0gKExvbmdMaXRl cmFsVmFsdWUgKikgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAg ICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPckluc2VydChsZWZ0 IC0+IHZhbHVlID49IHJpZ2h0IC0+IHZhbHVlID8gMSA6IDApOwogICAgICAgICAgICB9CiAgICAg ICAgICAgIGVsc2UgIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFs dWUgKmxlZnQgPSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+ IHZhbHVlOwogICAgICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICpyaWdodCA9IChJbnRMaXRl cmFsVmFsdWUgKikgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAg ICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmludF9wb29sLkZpbmRPckluc2VydChsZWZ0 IC0+IHZhbHVlID49IHJpZ2h0IC0+IHZhbHVlID8gMSA6IDApOwogICAgICAgICAgICB9CiAgICAg ICAgfQogICAgfQoKICAgIGV4cHIgLT4gc3ltYm9sID0gY29udHJvbC5ib29sZWFuX3R5cGU7Cgog ICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vzc0FORChBc3RCaW5hcnlFeHByZXNz aW9uICpleHByKQp7CiAgICBQcm9jZXNzRXhwcmVzc2lvbihleHByIC0+IGxlZnRfZXhwcmVzc2lv bik7CiAgICBQcm9jZXNzRXhwcmVzc2lvbihleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24pOwoKICAg IFR5cGVTeW1ib2wgKmxlZnRfdHlwZSAgPSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBUeXBl KCksCiAgICAgICAgICAgICAgICpyaWdodF90eXBlID0gZXhwciAtPiByaWdodF9leHByZXNzaW9u IC0+IFR5cGUoKTsKCiAgICBpZiAobGVmdF90eXBlID09IGNvbnRyb2wubm9fdHlwZSB8fCByaWdo dF90eXBlID09IGNvbnRyb2wubm9fdHlwZSkKICAgICAgICBleHByIC0+IHN5bWJvbCA9IGNvbnRy b2wubm9fdHlwZTsKICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAobGVmdF90eXBlID09IGNvbnRy b2wuYm9vbGVhbl90eXBlICYmIHJpZ2h0X3R5cGUgPT0gY29udHJvbC5ib29sZWFuX3R5cGUpCiAg ICAgICAgewogICAgICAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLmJvb2xlYW5fdHlw ZTsKICAgICAgICAgICAgIGlmIChleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50 KCkgJiYgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSkKICAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKmxlZnQgPSAoSW50TGl0ZXJh bFZhbHVlICopIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAg ICAgIEludExpdGVyYWxWYWx1ZSAqcmlnaHQgPSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4g cmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgICBleHByIC0+IHZhbHVl ID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSAmIHJpZ2h0IC0+ IHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsK ICAgICAgICAgICAgQmluYXJ5TnVtZXJpY1Byb21vdGlvbihleHByKTsKCiAgICAgICAgICAgIFR5 cGVTeW1ib2wgKmV4cHJfdHlwZSA9IGV4cHIgLT4gVHlwZSgpOwoKICAgICAgICAgICAgaWYgKGV4 cHJfdHlwZSAhPSBjb250cm9sLm5vX3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg IGlmICghIGNvbnRyb2wuSXNJbnRlZ3JhbChleHByX3R5cGUpKQogICAgICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlRZUEVfTk9U X0lOVEVHUkFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgLT4gTGVm dFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBSaWdo dFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eXBlIC0+ IE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLm5v X3R5cGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByIC0+ IGxlZnRfZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50KCkgJiYgZXhwciAtPiByaWdodF9leHByZXNz aW9uIC0+IElzQ29uc3RhbnQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAg ICBpZiAoZXhwcl90eXBlID09IGNvbnRyb2wubG9uZ190eXBlKQogICAgICAgICAgICAgICAgICAg IHsKICAgICAgICAgICAgICAgICAgICAgICAgTG9uZ0xpdGVyYWxWYWx1ZSAqbGVmdCA9IChMb25n TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAg ICAgICAgICAgICAgICAgICBMb25nTGl0ZXJhbFZhbHVlICpyaWdodCA9IChMb25nTGl0ZXJhbFZh bHVlICopIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKCiAgICAgICAgICAgICAg ICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmxvbmdfcG9vbC5GaW5kT3JJbnNlcnQo bGVmdCAtPiB2YWx1ZSAmIHJpZ2h0IC0+IHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgICAgICAgICAgZWxzZSAgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAg ICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKmxlZnQgPSAoSW50TGl0ZXJhbFZhbHVlICop IGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAg ICBJbnRMaXRlcmFsVmFsdWUgKnJpZ2h0ID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJp Z2h0X2V4cHJlc3Npb24gLT4gdmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+ IHZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSAmIHJp Z2h0IC0+IHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRp Yzo6UHJvY2Vzc1hPUihBc3RCaW5hcnlFeHByZXNzaW9uICpleHByKQp7CiAgICBQcm9jZXNzRXhw cmVzc2lvbihleHByIC0+IGxlZnRfZXhwcmVzc2lvbik7CiAgICBQcm9jZXNzRXhwcmVzc2lvbihl eHByIC0+IHJpZ2h0X2V4cHJlc3Npb24pOwoKICAgIFR5cGVTeW1ib2wgKmxlZnRfdHlwZSAgPSBl eHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBUeXBlKCksCiAgICAgICAgICAgICAgICpyaWdodF90 eXBlID0gZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IFR5cGUoKTsKCiAgICBpZiAobGVmdF90 eXBlID09IGNvbnRyb2wubm9fdHlwZSB8fCByaWdodF90eXBlID09IGNvbnRyb2wubm9fdHlwZSkK ICAgICAgICBleHByIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgIGVsc2UKICAgIHsK ICAgICAgICBpZiAobGVmdF90eXBlID09IGNvbnRyb2wuYm9vbGVhbl90eXBlICYmIHJpZ2h0X3R5 cGUgPT0gY29udHJvbC5ib29sZWFuX3R5cGUpCiAgICAgICAgewogICAgICAgICAgICAgZXhwciAt PiBzeW1ib2wgPSBjb250cm9sLmJvb2xlYW5fdHlwZTsKICAgICAgICAgICAgIGlmIChleHByIC0+ IGxlZnRfZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50KCkgJiYgZXhwciAtPiByaWdodF9leHByZXNz aW9uIC0+IElzQ29uc3RhbnQoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBJbnRM aXRlcmFsVmFsdWUgKmxlZnQgPSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVmdF9leHBy ZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgIEludExpdGVyYWxWYWx1ZSAqcmlnaHQg PSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsK ICAgICAgICAgICAgICAgICBleHByIC0+IHZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJ bnNlcnQobGVmdCAtPiB2YWx1ZSBeIHJpZ2h0IC0+IHZhbHVlKTsKICAgICAgICAgICAgIH0KICAg ICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgQmluYXJ5TnVtZXJpY1By b21vdGlvbihleHByKTsKCiAgICAgICAgICAgIFR5cGVTeW1ib2wgKmV4cHJfdHlwZSA9IGV4cHIg LT4gVHlwZSgpOwoKICAgICAgICAgICAgaWYgKGV4cHJfdHlwZSAhPSBjb250cm9sLm5vX3R5cGUp CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICghIGNvbnRyb2wuSXNJbnRlZ3JhbChl eHByX3R5cGUpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFJlcG9ydFNl bUVycm9yKFNlbWFudGljRXJyb3I6OlRZUEVfTk9UX0lOVEVHUkFMLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGV4cHIgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZXhwciAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgZXhwcl90eXBlIC0+IE5hbWUoKSk7CiAgICAgICAgICAgICAgICAg ICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICAgICAgICAgICAgICB9CiAg ICAgICAgICAgICAgICBlbHNlIGlmIChleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBJc0NvbnN0 YW50KCkgJiYgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSkKICAgICAg ICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXhwcl90eXBlID09IGNvbnRyb2wu bG9uZ190eXBlKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAg TG9uZ0xpdGVyYWxWYWx1ZSAqbGVmdCA9IChMb25nTGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVm dF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBMb25nTGl0ZXJh bFZhbHVlICpyaWdodCA9IChMb25nTGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gcmlnaHRfZXhwcmVz c2lvbiAtPiB2YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBj b250cm9sLmxvbmdfcG9vbC5GaW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSBeIHJpZ2h0IC0+IHZh bHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSAgCiAg ICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFs dWUgKmxlZnQgPSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+ IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKnJpZ2h0ID0g KEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gdmFsdWU7Cgog ICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IHZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5G aW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSBeIHJpZ2h0IC0+IHZhbHVlKTsKICAgICAgICAgICAg ICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9 CgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vzc0lPUihBc3RCaW5hcnlFeHBy ZXNzaW9uICpleHByKQp7CiAgICBQcm9jZXNzRXhwcmVzc2lvbihleHByIC0+IGxlZnRfZXhwcmVz c2lvbik7CiAgICBQcm9jZXNzRXhwcmVzc2lvbihleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24pOwoK ICAgIFR5cGVTeW1ib2wgKmxlZnRfdHlwZSAgPSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBU eXBlKCksCiAgICAgICAgICAgICAgICpyaWdodF90eXBlID0gZXhwciAtPiByaWdodF9leHByZXNz aW9uIC0+IFR5cGUoKTsKCiAgICBpZiAobGVmdF90eXBlID09IGNvbnRyb2wubm9fdHlwZSB8fCBy aWdodF90eXBlID09IGNvbnRyb2wubm9fdHlwZSkKICAgICAgICBleHByIC0+IHN5bWJvbCA9IGNv bnRyb2wubm9fdHlwZTsKICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAobGVmdF90eXBlID09IGNv bnRyb2wuYm9vbGVhbl90eXBlICYmIHJpZ2h0X3R5cGUgPT0gY29udHJvbC5ib29sZWFuX3R5cGUp CiAgICAgICAgewogICAgICAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLmJvb2xlYW5f dHlwZTsKICAgICAgICAgICAgIGlmIChleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBJc0NvbnN0 YW50KCkgJiYgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSkKICAgICAg ICAgICAgIHsKICAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKmxlZnQgPSAoSW50TGl0 ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAg ICAgICAgIEludExpdGVyYWxWYWx1ZSAqcmlnaHQgPSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIg LT4gcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgICBleHByIC0+IHZh bHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSB8IHJpZ2h0 IC0+IHZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAg IHsKICAgICAgICAgICAgQmluYXJ5TnVtZXJpY1Byb21vdGlvbihleHByKTsKCiAgICAgICAgICAg IFR5cGVTeW1ib2wgKmV4cHJfdHlwZSA9IGV4cHIgLT4gVHlwZSgpOwoKICAgICAgICAgICAgaWYg KGV4cHJfdHlwZSAhPSBjb250cm9sLm5vX3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAg ICAgIGlmICghIGNvbnRyb2wuSXNJbnRlZ3JhbChleHByX3R5cGUpKQogICAgICAgICAgICAgICAg ewogICAgICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlRZUEVf Tk9UX0lOVEVHUkFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgLT4g TGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBS aWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eXBl IC0+IE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9s Lm5vX3R5cGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChleHBy IC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50KCkgJiYgZXhwciAtPiByaWdodF9leHBy ZXNzaW9uIC0+IElzQ29uc3RhbnQoKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg ICAgICBpZiAoZXhwcl90eXBlID09IGNvbnRyb2wubG9uZ190eXBlKQogICAgICAgICAgICAgICAg ICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTG9uZ0xpdGVyYWxWYWx1ZSAqbGVmdCA9IChM b25nTGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAg ICAgICAgICAgICAgICAgICAgICBMb25nTGl0ZXJhbFZhbHVlICpyaWdodCA9IChMb25nTGl0ZXJh bFZhbHVlICopIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKCiAgICAgICAgICAg ICAgICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmxvbmdfcG9vbC5GaW5kT3JJbnNl cnQobGVmdCAtPiB2YWx1ZSB8IHJpZ2h0IC0+IHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgICAgICAgICAgZWxzZSAgCiAgICAgICAgICAgICAgICAgICAgewogICAgICAg ICAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKmxlZnQgPSAoSW50TGl0ZXJhbFZhbHVl ICopIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgICAg ICAgICBJbnRMaXRlcmFsVmFsdWUgKnJpZ2h0ID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+ IHJpZ2h0X2V4cHJlc3Npb24gLT4gdmFsdWU7CgogICAgICAgICAgICAgICAgICAgICAgICBleHBy IC0+IHZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSB8 IHJpZ2h0IC0+IHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9 CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1h bnRpYzo6UHJvY2Vzc0FORF9BTkQoQXN0QmluYXJ5RXhwcmVzc2lvbiAqZXhwcikKewogICAgUHJv Y2Vzc0V4cHJlc3Npb24oZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24pOwogICAgUHJvY2Vzc0V4cHJl c3Npb24oZXhwciAtPiByaWdodF9leHByZXNzaW9uKTsKCiAgICBUeXBlU3ltYm9sICpsZWZ0X3R5 cGUgID0gZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gVHlwZSgpLAogICAgICAgICAgICAgICAq cmlnaHRfdHlwZSA9IGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiBUeXBlKCk7CgogICAgaWYg KGxlZnRfdHlwZSAhPSBjb250cm9sLm5vX3R5cGUgJiYgcmlnaHRfdHlwZSAhPSBjb250cm9sLm5v X3R5cGUpCiAgICB7CiAgICAgICAgaWYgKGxlZnRfdHlwZSAhPSBjb250cm9sLmJvb2xlYW5fdHlw ZSkKICAgICAgICB7CiAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OlRZ UEVfTk9UX0JPT0xFQU4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgLT4gbGVmdF9l eHByZXNzaW9uIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBleHBy IC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAg ICAgICAgIGxlZnRfdHlwZSAtPiBOYW1lKCkpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChy aWdodF90eXBlICE9IGNvbnRyb2wuYm9vbGVhbl90eXBlKQogICAgICAgIHsKICAgICAgICAgICAg UmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VFlQRV9OT1RfQk9PTEVBTiwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IExlZnRUb2tlbigp LAogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4g UmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF90eXBlIC0+IE5h bWUoKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGV4cHIgLT4gbGVmdF9leHByZXNzaW9u IC0+IElzQ29uc3RhbnQoKSAmJiBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gSXNDb25zdGFu dCgpKQogICAgICAgIHsKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAK ICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICpsZWZ0ID0gKEludExpdGVyYWxWYWx1ZSAqKSBl eHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgSW50TGl0ZXJhbFZh bHVlICpyaWdodCA9IChJbnRMaXRlcmFsVmFsdWUgKikgZXhwciAtPiByaWdodF9leHByZXNzaW9u IC0+IHZhbHVlOwogICAgICAgICAgICBleHByIC0+IHZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5G aW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSAmJiByaWdodCAtPiB2YWx1ZSA/IDEgOiAwKTsKICAg ICAgICB9CiAgICB9CgogICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLmJvb2xlYW5fdHlwZTsK CiAgICByZXR1cm47Cn0KCgp2b2lkIFNlbWFudGljOjpQcm9jZXNzT1JfT1IoQXN0QmluYXJ5RXhw cmVzc2lvbiAqZXhwcikKewogICAgUHJvY2Vzc0V4cHJlc3Npb24oZXhwciAtPiBsZWZ0X2V4cHJl c3Npb24pOwogICAgUHJvY2Vzc0V4cHJlc3Npb24oZXhwciAtPiByaWdodF9leHByZXNzaW9uKTsK CiAgICBUeXBlU3ltYm9sICpsZWZ0X3R5cGUgID0gZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4g VHlwZSgpLAogICAgICAgICAgICAgICAqcmlnaHRfdHlwZSA9IGV4cHIgLT4gcmlnaHRfZXhwcmVz c2lvbiAtPiBUeXBlKCk7CgogICAgaWYgKGxlZnRfdHlwZSAhPSBjb250cm9sLm5vX3R5cGUgJiYg cmlnaHRfdHlwZSAhPSBjb250cm9sLm5vX3R5cGUpCiAgICB7CiAgICAgICAgaWYgKGxlZnRfdHlw ZSAhPSBjb250cm9sLmJvb2xlYW5fdHlwZSkKICAgICAgICB7CiAgICAgICAgICAgIFJlcG9ydFNl bUVycm9yKFNlbWFudGljRXJyb3I6OlRZUEVfTk9UX0JPT0xFQU4sCiAgICAgICAgICAgICAgICAg ICAgICAgICAgIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IExlZnRUb2tlbigpLAogICAgICAg ICAgICAgICAgICAgICAgICAgICBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBSaWdodFRva2Vu KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfdHlwZSAtPiBOYW1lKCkpOwogICAg ICAgIH0KICAgICAgICBlbHNlIGlmIChyaWdodF90eXBlICE9IGNvbnRyb2wuYm9vbGVhbl90eXBl KQogICAgICAgIHsKICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VFlQ RV9OT1RfQk9PTEVBTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiByaWdodF9l eHByZXNzaW9uIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBleHBy IC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAg ICAgICAgICByaWdodF90eXBlIC0+IE5hbWUoKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYg KGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSAmJiBleHByIC0+IHJpZ2h0 X2V4cHJlc3Npb24gLT4gSXNDb25zdGFudCgpKQogICAgICAgIHsKICAgICAgICAgICAgIAogICAg ICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICpsZWZ0 ID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsK ICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICpyaWdodCA9IChJbnRMaXRlcmFsVmFsdWUgKikg ZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICBleHByIC0+IHZh bHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSB8fCByaWdo dCAtPiB2YWx1ZSA/IDEgOiAwKTsKICAgICAgICB9CiAgICB9CgogICAgZXhwciAtPiBzeW1ib2wg PSBjb250cm9sLmJvb2xlYW5fdHlwZTsKCiAgICByZXR1cm47Cn0KCgp2b2lkIFNlbWFudGljOjpQ cm9jZXNzRVFVQUxfRVFVQUwoQXN0QmluYXJ5RXhwcmVzc2lvbiAqZXhwcikKewogICAgUHJvY2Vz c0V4cHJlc3Npb25PclN0cmluZ0NvbnN0YW50KGV4cHIgLT4gbGVmdF9leHByZXNzaW9uKTsKICAg IFByb2Nlc3NFeHByZXNzaW9uT3JTdHJpbmdDb25zdGFudChleHByIC0+IHJpZ2h0X2V4cHJlc3Np b24pOwoKICAgIFR5cGVTeW1ib2wgKmxlZnRfdHlwZSAgPSBleHByIC0+IGxlZnRfZXhwcmVzc2lv biAtPiBUeXBlKCksCiAgICAgICAgICAgICAgICpyaWdodF90eXBlID0gZXhwciAtPiByaWdodF9l eHByZXNzaW9uIC0+IFR5cGUoKTsKCiAgICBpZiAobGVmdF90eXBlICE9IGNvbnRyb2wubm9fdHlw ZSAmJiByaWdodF90eXBlICE9IGNvbnRyb2wubm9fdHlwZSkKICAgIHsKICAgICAgICBpZiAobGVm dF90eXBlICE9IHJpZ2h0X3R5cGUpCiAgICAgICAgewogICAgICAgICAgICBpZiAobGVmdF90eXBl IC0+IFByaW1pdGl2ZSgpICYmIHJpZ2h0X3R5cGUgLT4gUHJpbWl0aXZlKCkpCiAgICAgICAgICAg ICAgICAgQmluYXJ5TnVtZXJpY1Byb21vdGlvbihleHByKTsKICAgICAgICAgICAgZWxzZSBpZiAo Q2FuQ2FzdENvbnZlcnQobGVmdF90eXBlLCByaWdodF90eXBlLCBleHByIC0+IGJpbmFyeV9vcGVy YXRvcl90b2tlbikpCiAgICAgICAgICAgICAgICAgZXhwciAtPiByaWdodF9leHByZXNzaW9uID0g Q29udmVydFRvVHlwZShleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24sIGxlZnRfdHlwZSk7CiAgICAg ICAgICAgIGVsc2UgaWYgKENhbkNhc3RDb252ZXJ0KHJpZ2h0X3R5cGUsIGxlZnRfdHlwZSwgZXhw ciAtPiBiaW5hcnlfb3BlcmF0b3JfdG9rZW4pKQogICAgICAgICAgICAgICAgIGV4cHIgLT4gbGVm dF9leHByZXNzaW9uID0gQ29udmVydFRvVHlwZShleHByIC0+IGxlZnRfZXhwcmVzc2lvbiwgcmln aHRfdHlwZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAg UmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6SU5DT01QQVRJQkxFX1RZUEVfRk9SX0JJTkFS WV9FWFBSRVNTSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBMZWZ0 VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgLT4gUmlnaHRUb2tl bigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBsZWZ0X2V4cHJlc3Np b24gLT4gVHlwZSgpIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IFR5 cGUoKSAtPiBFeHRlcm5hbE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4 cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiBUeXBlKCkgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAt PiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBy aWdodF9leHByZXNzaW9uIC0+IFR5cGUoKSAtPiBFeHRlcm5hbE5hbWUoKSk7CiAgICAgICAgICAg IH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGxlZnRf dHlwZSA9PSBjb250cm9sLnZvaWRfdHlwZSkKICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9y KFNlbWFudGljRXJyb3I6OlZPSURfVFlQRV9JTl9FUVVBTElUWV9FWFBSRVNTSU9OLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGV4cHIgLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gVHlwZSgpIC0+IE5hbWUo KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lv biAtPiBUeXBlKCkgLT4gTmFtZSgpKTsKICAgICAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBsZWZ0 X3R5cGU7CiAgICAgICAgfQoKICAgICAgICBpZiAoZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4g SXNDb25zdGFudCgpICYmIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50KCkp CiAgICAgICAgewogICAgICAgICAgICBMaXRlcmFsVmFsdWUgKmxlZnQgPSBleHByIC0+IGxlZnRf ZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgTGl0ZXJhbFZhbHVlICpyaWdodCA9IGV4 cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKCiAgICAgICAgICAgIGlmIChleHByIC0+ IFR5cGUoKSA9PSBjb250cm9sLmRvdWJsZV90eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAg ICAgICBEb3VibGVMaXRlcmFsVmFsdWUgKmxlZnQgPSAoRG91YmxlTGl0ZXJhbFZhbHVlICopIGV4 cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgRG91YmxlTGl0 ZXJhbFZhbHVlICpyaWdodCA9IChEb3VibGVMaXRlcmFsVmFsdWUgKikgZXhwciAtPiByaWdodF9l eHByZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250 cm9sLmludF9wb29sLkZpbmRPckluc2VydChsZWZ0IC0+IHZhbHVlID09IHJpZ2h0IC0+IHZhbHVl ID8gMSA6IDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIgLT4gVHlw ZSgpID09IGNvbnRyb2wuZmxvYXRfdHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAg RmxvYXRMaXRlcmFsVmFsdWUgKmxlZnQgPSAoRmxvYXRMaXRlcmFsVmFsdWUgKikgZXhwciAtPiBs ZWZ0X2V4cHJlc3Npb24gLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBGbG9hdExpdGVyYWxWYWx1 ZSAqcmlnaHQgPSAoRmxvYXRMaXRlcmFsVmFsdWUgKikgZXhwciAtPiByaWdodF9leHByZXNzaW9u IC0+IHZhbHVlOwoKICAgICAgICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmludF9w b29sLkZpbmRPckluc2VydChsZWZ0IC0+IHZhbHVlID09IHJpZ2h0IC0+IHZhbHVlID8gMSA6IDAp OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wu aW50X3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgPT0gcmlnaHQgPyAxIDogMCk7CiAgICAgICAgfQog ICAgfQoKICAgIGV4cHIgLT4gc3ltYm9sID0gY29udHJvbC5ib29sZWFuX3R5cGU7CgogICAgcmV0 dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vzc05PVF9FUVVBTChBc3RCaW5hcnlFeHByZXNz aW9uICpleHByKQp7CiAgICBQcm9jZXNzRXhwcmVzc2lvbk9yU3RyaW5nQ29uc3RhbnQoZXhwciAt PiBsZWZ0X2V4cHJlc3Npb24pOwogICAgUHJvY2Vzc0V4cHJlc3Npb25PclN0cmluZ0NvbnN0YW50 KGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbik7CgogICAgVHlwZVN5bWJvbCAqbGVmdF90eXBlICA9 IGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IFR5cGUoKSwKICAgICAgICAgICAgICAgKnJpZ2h0 X3R5cGUgPSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gVHlwZSgpOwoKICAgIGlmIChsZWZ0 X3R5cGUgIT0gY29udHJvbC5ub190eXBlICYmIHJpZ2h0X3R5cGUgIT0gY29udHJvbC5ub190eXBl KQogICAgewogICAgICAgIGlmIChsZWZ0X3R5cGUgIT0gcmlnaHRfdHlwZSkKICAgICAgICB7CiAg ICAgICAgICAgIGlmIChsZWZ0X3R5cGUgLT4gUHJpbWl0aXZlKCkgJiYgcmlnaHRfdHlwZSAtPiBQ cmltaXRpdmUoKSkKICAgICAgICAgICAgICAgICBCaW5hcnlOdW1lcmljUHJvbW90aW9uKGV4cHIp OwogICAgICAgICAgICBlbHNlIGlmIChDYW5DYXN0Q29udmVydChsZWZ0X3R5cGUsIHJpZ2h0X3R5 cGUsIGV4cHIgLT4gYmluYXJ5X29wZXJhdG9yX3Rva2VuKSkKICAgICAgICAgICAgICAgICBleHBy IC0+IHJpZ2h0X2V4cHJlc3Npb24gPSBDb252ZXJ0VG9UeXBlKGV4cHIgLT4gcmlnaHRfZXhwcmVz c2lvbiwgbGVmdF90eXBlKTsKICAgICAgICAgICAgZWxzZSBpZiAoQ2FuQ2FzdENvbnZlcnQocmln aHRfdHlwZSwgbGVmdF90eXBlLCBleHByIC0+IGJpbmFyeV9vcGVyYXRvcl90b2tlbikpCiAgICAg ICAgICAgICAgICAgZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gPSBDb252ZXJ0VG9UeXBlKGV4cHIg LT4gbGVmdF9leHByZXNzaW9uLCByaWdodF90eXBlKTsKICAgICAgICAgICAgZWxzZQogICAgICAg ICAgICB7CiAgICAgICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpJTkNP TVBBVElCTEVfVFlQRV9GT1JfQklOQVJZX0VYUFJFU1NJT04sCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBleHByIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZXhwciAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBUeXBlKCkgLT4gQ29udGFpbmluZ1BhY2thZ2Uo KSAtPiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAt PiBsZWZ0X2V4cHJlc3Npb24gLT4gVHlwZSgpIC0+IEV4dGVybmFsTmFtZSgpLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IFR5cGUoKSAt PiBDb250YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gVHlwZSgpIC0+IEV4dGVy bmFsTmFtZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAg ewogICAgICAgICAgICBpZiAobGVmdF90eXBlID09IGNvbnRyb2wudm9pZF90eXBlKQogICAgICAg ICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6Vk9JRF9UWVBFX0lOX0VRVUFM SVRZX0VYUFJFU1NJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IExl ZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBSaWdodFRv a2VuKCkpOwogICAgICAgICAgICBleHByIC0+IHN5bWJvbCA9IGxlZnRfdHlwZTsKICAgICAgICB9 CgogICAgICAgIGlmIChleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50KCkgJiYg ZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSkKICAgICAgICB7CiAgICAg ICAgICAgIExpdGVyYWxWYWx1ZSAqbGVmdCA9IGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZh bHVlOwogICAgICAgICAgICBMaXRlcmFsVmFsdWUgKnJpZ2h0ID0gZXhwciAtPiByaWdodF9leHBy ZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAgICAgaWYgKGV4cHIgLT4gVHlwZSgpID09IGNvbnRy b2wuZG91YmxlX3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIERvdWJsZUxpdGVy YWxWYWx1ZSAqbGVmdCA9IChEb3VibGVMaXRlcmFsVmFsdWUgKikgZXhwciAtPiBsZWZ0X2V4cHJl c3Npb24gLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBEb3VibGVMaXRlcmFsVmFsdWUgKnJpZ2h0 ID0gKERvdWJsZUxpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gdmFs dWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wuaW50X3Bvb2wuRmlu ZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgIT0gcmlnaHQgLT4gdmFsdWUgPyAxIDogMCk7CiAgICAg ICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZXhwciAtPiBUeXBlKCkgPT0gY29udHJvbC5m bG9hdF90eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGbG9hdExpdGVyYWxWYWx1 ZSAqbGVmdCA9IChGbG9hdExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAt PiB2YWx1ZTsKICAgICAgICAgICAgICAgIEZsb2F0TGl0ZXJhbFZhbHVlICpyaWdodCA9IChGbG9h dExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gdmFsdWU7CgogICAg ICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wuaW50X3Bvb2wuRmluZE9ySW5zZXJ0 KGxlZnQgLT4gdmFsdWUgIT0gcmlnaHQgLT4gdmFsdWUgPyAxIDogMCk7CiAgICAgICAgICAgIH0K ICAgICAgICAgICAgZWxzZSBleHByIC0+IHZhbHVlID0gY29udHJvbC5pbnRfcG9vbC5GaW5kT3JJ bnNlcnQobGVmdCAhPSByaWdodCA/IDEgOiAwKTsKICAgICAgICB9CiAgICB9CgogICAgZXhwciAt PiBzeW1ib2wgPSBjb250cm9sLmJvb2xlYW5fdHlwZTsKCiAgICByZXR1cm47Cn0KCgp2b2lkIFNl bWFudGljOjpQcm9jZXNzU1RBUihBc3RCaW5hcnlFeHByZXNzaW9uICpleHByKQp7CiAgICBQcm9j ZXNzRXhwcmVzc2lvbihleHByIC0+IGxlZnRfZXhwcmVzc2lvbik7CiAgICBQcm9jZXNzRXhwcmVz c2lvbihleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24pOwoKICAgIFR5cGVTeW1ib2wgKmxlZnRfdHlw ZSAgPSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiBUeXBlKCksCiAgICAgICAgICAgICAgICpy aWdodF90eXBlID0gZXhwciAtPiByaWdodF9leHByZXNzaW9uIC0+IFR5cGUoKTsKCiAgICBpZiAo bGVmdF90eXBlID09IGNvbnRyb2wubm9fdHlwZSB8fCByaWdodF90eXBlID09IGNvbnRyb2wubm9f dHlwZSkKICAgICAgICBleHByIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgIGVsc2UK ICAgIHsKICAgICAgICBCaW5hcnlOdW1lcmljUHJvbW90aW9uKGV4cHIpOwoKICAgICAgICBpZiAo ZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gSXNDb25zdGFudCgpICYmIGV4cHIgLT4gcmlnaHRf ZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50KCkpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZXhw ciAtPiBUeXBlKCkgPT0gY29udHJvbC5kb3VibGVfdHlwZSkKICAgICAgICAgICAgewogICAgICAg ICAgICAgICAgRG91YmxlTGl0ZXJhbFZhbHVlICpsZWZ0ID0gKERvdWJsZUxpdGVyYWxWYWx1ZSAq KSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIERvdWJs ZUxpdGVyYWxWYWx1ZSAqcmlnaHQgPSAoRG91YmxlTGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gcmln aHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKCiAgICAgICAgICAgICAgICBleHByIC0+IHZhbHVlID0g Y29udHJvbC5kb3VibGVfcG9vbC5GaW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSAqIHJpZ2h0IC0+ IHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChleHByIC0+IFR5cGUo KSA9PSBjb250cm9sLmZsb2F0X3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZs b2F0TGl0ZXJhbFZhbHVlICpsZWZ0ID0gKEZsb2F0TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVm dF9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgRmxvYXRMaXRlcmFsVmFsdWUg KnJpZ2h0ID0gKEZsb2F0TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAt PiB2YWx1ZTsKCiAgICAgICAgICAgICAgICBleHByIC0+IHZhbHVlID0gY29udHJvbC5mbG9hdF9w b29sLkZpbmRPckluc2VydChsZWZ0IC0+IHZhbHVlICogcmlnaHQgLT4gdmFsdWUpOwogICAgICAg ICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIgLT4gVHlwZSgpID09IGNvbnRyb2wubG9u Z190eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBMb25nTGl0ZXJhbFZhbHVlICps ZWZ0ID0gKExvbmdMaXRlcmFsVmFsdWUgKikgZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gdmFs dWU7CiAgICAgICAgICAgICAgICBMb25nTGl0ZXJhbFZhbHVlICpyaWdodCA9IChMb25nTGl0ZXJh bFZhbHVlICopIGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKCiAgICAgICAgICAg ICAgICBleHByIC0+IHZhbHVlID0gY29udHJvbC5sb25nX3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQg LT4gdmFsdWUgKiByaWdodCAtPiB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxz ZSBpZiAoZXhwciAtPiBUeXBlKCkgPT0gY29udHJvbC5pbnRfdHlwZSkKICAgICAgICAgICAgewog ICAgICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICpsZWZ0ID0gKEludExpdGVyYWxWYWx1ZSAq KSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIEludExp dGVyYWxWYWx1ZSAqcmlnaHQgPSAoSW50TGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gcmlnaHRfZXhw cmVzc2lvbiAtPiB2YWx1ZTsKCiAgICAgICAgICAgICAgICBleHByIC0+IHZhbHVlID0gY29udHJv bC5pbnRfcG9vbC5GaW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSAqIHJpZ2h0IC0+IHZhbHVlKTsK ICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCgp2b2lkIFNlbWFu dGljOjpQcm9jZXNzTUlOVVMoQXN0QmluYXJ5RXhwcmVzc2lvbiAqZXhwcikKewogICAgUHJvY2Vz c0V4cHJlc3Npb24oZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24pOwogICAgUHJvY2Vzc0V4cHJlc3Np b24oZXhwciAtPiByaWdodF9leHByZXNzaW9uKTsKCiAgICBUeXBlU3ltYm9sICpsZWZ0X3R5cGUg ID0gZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gVHlwZSgpLAogICAgICAgICAgICAgICAqcmln aHRfdHlwZSA9IGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAtPiBUeXBlKCk7CgogICAgaWYgKGxl ZnRfdHlwZSA9PSBjb250cm9sLm5vX3R5cGUgfHwgcmlnaHRfdHlwZSA9PSBjb250cm9sLm5vX3R5 cGUpCiAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICBlbHNlCiAg ICB7CiAgICAgICAgQmluYXJ5TnVtZXJpY1Byb21vdGlvbihleHByKTsKCiAgICAgICAgaWYgKGV4 cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSAmJiBleHByIC0+IHJpZ2h0X2V4 cHJlc3Npb24gLT4gSXNDb25zdGFudCgpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGV4cHIg LT4gVHlwZSgpID09IGNvbnRyb2wuZG91YmxlX3R5cGUpCiAgICAgICAgICAgIHsKICAgICAgICAg ICAgICAgIERvdWJsZUxpdGVyYWxWYWx1ZSAqbGVmdCA9IChEb3VibGVMaXRlcmFsVmFsdWUgKikg ZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBEb3VibGVM aXRlcmFsVmFsdWUgKnJpZ2h0ID0gKERvdWJsZUxpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0 X2V4cHJlc3Npb24gLT4gdmFsdWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNv bnRyb2wuZG91YmxlX3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgLSByaWdodCAtPiB2 YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZXhwciAtPiBUeXBlKCkg PT0gY29udHJvbC5mbG9hdF90eXBlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGbG9h dExpdGVyYWxWYWx1ZSAqbGVmdCA9IChGbG9hdExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IGxlZnRf ZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgIEZsb2F0TGl0ZXJhbFZhbHVlICpy aWdodCA9IChGbG9hdExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4g dmFsdWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wuZmxvYXRfcG9v bC5GaW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSAtIHJpZ2h0IC0+IHZhbHVlKTsKICAgICAgICAg ICAgfQogICAgICAgICAgICBlbHNlIGlmIChleHByIC0+IFR5cGUoKSA9PSBjb250cm9sLmxvbmdf dHlwZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTG9uZ0xpdGVyYWxWYWx1ZSAqbGVm dCA9IChMb25nTGl0ZXJhbFZhbHVlICopIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IHZhbHVl OwogICAgICAgICAgICAgICAgTG9uZ0xpdGVyYWxWYWx1ZSAqcmlnaHQgPSAoTG9uZ0xpdGVyYWxW YWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gdmFsdWU7CgogICAgICAgICAgICAg ICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wubG9uZ19wb29sLkZpbmRPckluc2VydChsZWZ0IC0+ IHZhbHVlIC0gcmlnaHQgLT4gdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2Ug aWYgKGV4cHIgLT4gVHlwZSgpID09IGNvbnRyb2wuaW50X3R5cGUpCiAgICAgICAgICAgIHsKICAg ICAgICAgICAgICAgIEludExpdGVyYWxWYWx1ZSAqbGVmdCA9IChJbnRMaXRlcmFsVmFsdWUgKikg ZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gdmFsdWU7CiAgICAgICAgICAgICAgICBJbnRMaXRl cmFsVmFsdWUgKnJpZ2h0ID0gKEludExpdGVyYWxWYWx1ZSAqKSBleHByIC0+IHJpZ2h0X2V4cHJl c3Npb24gLT4gdmFsdWU7CgogICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wu aW50X3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgLSByaWdodCAtPiB2YWx1ZSk7CiAg ICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRp Yzo6UHJvY2Vzc1NMQVNIKEFzdEJpbmFyeUV4cHJlc3Npb24gKmV4cHIpCnsKICAgIFByb2Nlc3NF eHByZXNzaW9uKGV4cHIgLT4gbGVmdF9leHByZXNzaW9uKTsKICAgIFByb2Nlc3NFeHByZXNzaW9u KGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbik7CgogICAgVHlwZVN5bWJvbCAqbGVmdF90eXBlICA9 IGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+IFR5cGUoKSwKICAgICAgICAgICAgICAgKnJpZ2h0 X3R5cGUgPSBleHByIC0+IHJpZ2h0X2V4cHJlc3Npb24gLT4gVHlwZSgpOwoKICAgIGlmIChsZWZ0 X3R5cGUgPT0gY29udHJvbC5ub190eXBlIHx8IHJpZ2h0X3R5cGUgPT0gY29udHJvbC5ub190eXBl KQogICAgICAgIGV4cHIgLT4gc3ltYm9sID0gY29udHJvbC5ub190eXBlOwogICAgZWxzZQogICAg ewogICAgICAgIEJpbmFyeU51bWVyaWNQcm9tb3Rpb24oZXhwcik7CgogICAgICAgICAKICAgICAg ICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgU3ltYm9sU2V0ICpleGNl cHRpb25fc2V0ID0gVHJ5RXhjZXB0aW9uVGFibGVTdGFjaygpLlRvcCgpOwogICAgICAgIGlmIChl eGNlcHRpb25fc2V0KQogICAgICAgIHsKICAgICAgICAgICAgZXhjZXB0aW9uX3NldCAtPiBBZGRF bGVtZW50KGNvbnRyb2wuUnVudGltZUV4Y2VwdGlvbigpKTsKICAgICAgICB9CgogICAgICAgIEFz dEV4cHJlc3Npb24gKmxlZnRfZXhwcmVzc2lvbiA9IGV4cHIgLT4gbGVmdF9leHByZXNzaW9uLAog ICAgICAgICAgICAgICAgICAgICAgKnJpZ2h0X2V4cHJlc3Npb24gPSBleHByIC0+IHJpZ2h0X2V4 cHJlc3Npb247CiAgICAgICAgaWYgKHJpZ2h0X2V4cHJlc3Npb24gLT4gSXNDb25zdGFudCgpKQog ICAgICAgIHsKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAg ICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgoZXhwciAtPiBUeXBlKCkgPT0g Y29udHJvbC5pbnRfdHlwZSAmJiAoKEludExpdGVyYWxWYWx1ZSAqKSByaWdodF9leHByZXNzaW9u IC0+IHZhbHVlKSAtPiB2YWx1ZSA9PSAwKSB8fAogICAgICAgICAgICAgICAgKGV4cHIgLT4gVHlw ZSgpID09IGNvbnRyb2wubG9uZ190eXBlICYmICgoTG9uZ0xpdGVyYWxWYWx1ZSAqKSByaWdodF9l eHByZXNzaW9uIC0+IHZhbHVlKSAtPiB2YWx1ZSA9PSAwKSkKICAgICAgICAgICAgewogICAgICAg ICAgICAgICAgUmVwb3J0U2VtRXJyb3IobGVmdF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSA/ IFNlbWFudGljRXJyb3I6OlpFUk9fRElWSURFX0VSUk9SCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2VtYW50aWNFcnJvcjo6 WkVST19ESVZJREVfQ0FVVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIg LT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IFJp Z2h0VG9rZW4oKSk7CiAgICAgICAgICAgICAgICBleHByIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9f dHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChsZWZ0X2V4cHJlc3Npb24g LT4gSXNDb25zdGFudCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZXhwciAt PiBUeXBlKCkgPT0gY29udHJvbC5kb3VibGVfdHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAg ICAgICAgICAgICAgICBEb3VibGVMaXRlcmFsVmFsdWUgKmxlZnQgPSAoRG91YmxlTGl0ZXJhbFZh bHVlICopIGxlZnRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBEb3Vi bGVMaXRlcmFsVmFsdWUgKnJpZ2h0ID0gKERvdWJsZUxpdGVyYWxWYWx1ZSAqKSByaWdodF9leHBy ZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBleHByIC0+IHZhbHVlID0gY29u dHJvbC5kb3VibGVfcG9vbC5GaW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSAvIHJpZ2h0IC0+IHZh bHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIgLT4g VHlwZSgpID09IGNvbnRyb2wuZmxvYXRfdHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAg ICAgICAgICAgICBGbG9hdExpdGVyYWxWYWx1ZSAqbGVmdCA9IChGbG9hdExpdGVyYWxWYWx1ZSAq KSBsZWZ0X2V4cHJlc3Npb24gLT4gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgRmxvYXRMaXRl cmFsVmFsdWUgKnJpZ2h0ID0gKEZsb2F0TGl0ZXJhbFZhbHVlICopIHJpZ2h0X2V4cHJlc3Npb24g LT4gdmFsdWU7CgogICAgICAgICAgICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmZs b2F0X3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgLyByaWdodCAtPiB2YWx1ZSk7CiAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByIC0+IFR5cGUoKSA9 PSBjb250cm9sLmxvbmdfdHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAg ICBMb25nTGl0ZXJhbFZhbHVlICpsZWZ0ID0gKExvbmdMaXRlcmFsVmFsdWUgKikgbGVmdF9leHBy ZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIExvbmdMaXRlcmFsVmFsdWUgKnJp Z2h0ID0gKExvbmdMaXRlcmFsVmFsdWUgKikgcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKCiAg ICAgICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wubG9uZ19wb29sLkZpbmRP ckluc2VydChsZWZ0IC0+IHZhbHVlIC8gcmlnaHQgLT4gdmFsdWUpOwogICAgICAgICAgICAgICAg fQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwciAtPiBUeXBlKCkgPT0gY29udHJvbC5pbnRf dHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFs dWUgKmxlZnQgPSAoSW50TGl0ZXJhbFZhbHVlICopIGxlZnRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsK ICAgICAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKnJpZ2h0ID0gKEludExpdGVyYWxW YWx1ZSAqKSByaWdodF9leHByZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAg CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAKICAg ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNv bnRyb2wuaW50X3Bvb2wuRmluZE9ySW5zZXJ0KHJpZ2h0IC0+IHZhbHVlID09IC0xID8gLShsZWZ0 IC0+IHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxlZnQgLT4gdmFsdWUg LyByaWdodCAtPiB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAg ICB9CiAgICB9CgogICAgcmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vzc01PRChBc3RC aW5hcnlFeHByZXNzaW9uICpleHByKQp7CiAgICBQcm9jZXNzRXhwcmVzc2lvbihleHByIC0+IGxl ZnRfZXhwcmVzc2lvbik7CiAgICBQcm9jZXNzRXhwcmVzc2lvbihleHByIC0+IHJpZ2h0X2V4cHJl c3Npb24pOwoKICAgIFR5cGVTeW1ib2wgKmxlZnRfdHlwZSAgPSBleHByIC0+IGxlZnRfZXhwcmVz c2lvbiAtPiBUeXBlKCksCiAgICAgICAgICAgICAgICpyaWdodF90eXBlID0gZXhwciAtPiByaWdo dF9leHByZXNzaW9uIC0+IFR5cGUoKTsKCiAgICBpZiAobGVmdF90eXBlID09IGNvbnRyb2wubm9f dHlwZSB8fCByaWdodF90eXBlID09IGNvbnRyb2wubm9fdHlwZSkKICAgICAgICBleHByIC0+IHN5 bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgIGVsc2UKICAgIHsKICAgICAgICBCaW5hcnlOdW1l cmljUHJvbW90aW9uKGV4cHIpOwoKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAKICAgICAg ICAgCiAgICAgICAgIAogICAgICAgIFN5bWJvbFNldCAqZXhjZXB0aW9uX3NldCA9IFRyeUV4Y2Vw dGlvblRhYmxlU3RhY2soKS5Ub3AoKTsKICAgICAgICBpZiAoZXhjZXB0aW9uX3NldCkKICAgICAg ICB7CiAgICAgICAgICAgIGV4Y2VwdGlvbl9zZXQgLT4gQWRkRWxlbWVudChjb250cm9sLlJ1bnRp bWVFeGNlcHRpb24oKSk7CiAgICAgICAgfQoKICAgICAgICBBc3RFeHByZXNzaW9uICpsZWZ0X2V4 cHJlc3Npb24gPSBleHByIC0+IGxlZnRfZXhwcmVzc2lvbiwKICAgICAgICAgICAgICAgICAgICAg ICpyaWdodF9leHByZXNzaW9uID0gZXhwciAtPiByaWdodF9leHByZXNzaW9uOwogICAgICAgIGlm IChyaWdodF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSkKICAgICAgICB7CiAgICAgICAgICAg ICAKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAg IAogICAgICAgICAgICBpZiAoKGV4cHIgLT4gVHlwZSgpID09IGNvbnRyb2wuaW50X3R5cGUgJiYg KChJbnRMaXRlcmFsVmFsdWUgKikgcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZSkgLT4gdmFsdWUg PT0gMCkgfHwKICAgICAgICAgICAgICAgIChleHByIC0+IFR5cGUoKSA9PSBjb250cm9sLmxvbmdf dHlwZSAmJiAoKExvbmdMaXRlcmFsVmFsdWUgKikgcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZSkg LT4gdmFsdWUgPT0gMCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVy cm9yKGxlZnRfZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50KCkgPyBTZW1hbnRpY0Vycm9yOjpaRVJP X0RJVklERV9FUlJPUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA6IFNlbWFudGljRXJyb3I6OlpFUk9fRElWSURFX0NBVVRJT04s CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByIC0+IExlZnRUb2tlbigpLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBSaWdodFRva2VuKCkpOwogICAgICAg ICAgICAgICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICAgICAgICAgIH0K ICAgICAgICAgICAgZWxzZSBpZiAobGVmdF9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSkKICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGV4cHIgLT4gVHlwZSgpID09IGNvbnRyb2wu ZG91YmxlX3R5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgRG91Ymxl TGl0ZXJhbFZhbHVlICpsZWZ0ID0gKERvdWJsZUxpdGVyYWxWYWx1ZSAqKSBsZWZ0X2V4cHJlc3Np b24gLT4gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgRG91YmxlTGl0ZXJhbFZhbHVlICpyaWdo dCA9IChEb3VibGVMaXRlcmFsVmFsdWUgKikgcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAg ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBleHByIC0+IHZhbHVlID0gY29u dHJvbC5kb3VibGVfcG9vbC5GaW5kT3JJbnNlcnQobGVmdCAtPiB2YWx1ZSAlIHJpZ2h0IC0+IHZh bHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV4cHIgLT4g VHlwZSgpID09IGNvbnRyb2wuZmxvYXRfdHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAg ICAgICAgICAgICBGbG9hdExpdGVyYWxWYWx1ZSAqbGVmdCA9IChGbG9hdExpdGVyYWxWYWx1ZSAq KSBsZWZ0X2V4cHJlc3Npb24gLT4gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgRmxvYXRMaXRl cmFsVmFsdWUgKnJpZ2h0ID0gKEZsb2F0TGl0ZXJhbFZhbHVlICopIHJpZ2h0X2V4cHJlc3Npb24g LT4gdmFsdWU7CgogICAgICAgICAgICAgICAgICAgIGV4cHIgLT4gdmFsdWUgPSBjb250cm9sLmZs b2F0X3Bvb2wuRmluZE9ySW5zZXJ0KGxlZnQgLT4gdmFsdWUgJSByaWdodCAtPiB2YWx1ZSk7CiAg ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChleHByIC0+IFR5cGUoKSA9 PSBjb250cm9sLmxvbmdfdHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAg ICBMb25nTGl0ZXJhbFZhbHVlICpsZWZ0ID0gKExvbmdMaXRlcmFsVmFsdWUgKikgbGVmdF9leHBy ZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIExvbmdMaXRlcmFsVmFsdWUgKnJp Z2h0ID0gKExvbmdMaXRlcmFsVmFsdWUgKikgcmlnaHRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKCiAg ICAgICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNvbnRyb2wubG9uZ19wb29sLkZpbmRP ckluc2VydChsZWZ0IC0+IHZhbHVlICUgcmlnaHQgLT4gdmFsdWUpOwogICAgICAgICAgICAgICAg fQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZXhwciAtPiBUeXBlKCkgPT0gY29udHJvbC5pbnRf dHlwZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFs dWUgKmxlZnQgPSAoSW50TGl0ZXJhbFZhbHVlICopIGxlZnRfZXhwcmVzc2lvbiAtPiB2YWx1ZTsK ICAgICAgICAgICAgICAgICAgICBJbnRMaXRlcmFsVmFsdWUgKnJpZ2h0ID0gKEludExpdGVyYWxW YWx1ZSAqKSByaWdodF9leHByZXNzaW9uIC0+IHZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAg CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAKICAg ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgZXhwciAtPiB2YWx1ZSA9IGNv bnRyb2wuaW50X3Bvb2wuRmluZE9ySW5zZXJ0KChsZWZ0IC0+IHZhbHVlICA9PSAoc2lnbmVkKSAw eDgwMDAwMDAwICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtPiB2YWx1ZSA9PSAoc2lnbmVkKSAweGZmZmZm ZmZmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDogbGVmdCAtPiB2YWx1ZSAlIHJpZ2h0IC0+IHZhbHVlKTsKICAgICAgICAgICAgICAgIH0K ICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCgp2b2lkIFNlbWFu dGljOjpQcm9jZXNzSU5TVEFOQ0VPRihBc3RCaW5hcnlFeHByZXNzaW9uICpleHByKQp7CiAgICBQ cm9jZXNzRXhwcmVzc2lvbk9yU3RyaW5nQ29uc3RhbnQoZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24p OwogICAgUHJvY2Vzc0V4cHJlc3Npb24oZXhwciAtPiByaWdodF9leHByZXNzaW9uKTsKCiAgICBU eXBlU3ltYm9sICpsZWZ0X3R5cGUgID0gZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gVHlwZSgp LAogICAgICAgICAgICAgICAqcmlnaHRfdHlwZSA9IGV4cHIgLT4gcmlnaHRfZXhwcmVzc2lvbiAt PiBUeXBlKCk7CgogICAgaWYgKGxlZnRfdHlwZSAtPiBQcmltaXRpdmUoKSkKICAgIHsKICAgICAg ICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpUWVBFX05PVF9SRUZFUkVOQ0UsCiAgICAg ICAgICAgICAgICAgICAgICAgZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gTGVmdFRva2VuKCks CiAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBsZWZ0X2V4cHJlc3Npb24gLT4gUmlnaHRU b2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgIGV4cHIgLT4gbGVmdF9leHByZXNzaW9uIC0+ IFR5cGUoKSAtPiBOYW1lKCkpOwogICAgfQogICAgZWxzZSBpZiAoISBDYW5DYXN0Q29udmVydChy aWdodF90eXBlLCBsZWZ0X3R5cGUsIGV4cHIgLT4gYmluYXJ5X29wZXJhdG9yX3Rva2VuKSkgIAog ICAgewogICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OklOVkFMSURfSU5TVEFO Q0VPRl9DT05WRVJTSU9OLAogICAgICAgICAgICAgICAgICAgICAgIGV4cHIgLT4gTGVmdFRva2Vu KCksCiAgICAgICAgICAgICAgICAgICAgICAgZXhwciAtPiBSaWdodFRva2VuKCksCiAgICAgICAg ICAgICAgICAgICAgICAgbGVmdF90eXBlIC0+IENvbnRhaW5pbmdQYWNrYWdlKCkgLT4gUGFja2Fn ZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X3R5cGUgLT4gRXh0ZXJuYWxOYW1l KCksCiAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfdHlwZSAtPiBDb250YWluaW5nUGFja2Fn ZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfdHlwZSAt PiBFeHRlcm5hbE5hbWUoKSk7CiAgICB9CgogICAgZXhwciAtPiBzeW1ib2wgPSBjb250cm9sLmJv b2xlYW5fdHlwZTsKCiAgICByZXR1cm47Cn0KCgp2b2lkIFNlbWFudGljOjpQcm9jZXNzQmluYXJ5 RXhwcmVzc2lvbihBc3QgKmV4cHIpCnsKICAgIEFzdEJpbmFyeUV4cHJlc3Npb24gKmJpbmFyeV9l eHByZXNzaW9uID0gKEFzdEJpbmFyeUV4cHJlc3Npb24gKikgZXhwcjsKICAgICh0aGlzIC0+KiBQ cm9jZXNzQmluYXJ5RXhwcltiaW5hcnlfZXhwcmVzc2lvbiAtPiBiaW5hcnlfdGFnXSkoYmluYXJ5 X2V4cHJlc3Npb24pOwoKICAgIHJldHVybjsKfQoKCnZvaWQgU2VtYW50aWM6OlByb2Nlc3NUeXBl RXhwcmVzc2lvbihBc3QgKmV4cHIpCnsKICAgIEFzdFR5cGVFeHByZXNzaW9uICp0eXBlX2V4cHJl c3Npb24gPSAoQXN0VHlwZUV4cHJlc3Npb24gKikgZXhwcjsKCiAgICBBc3RBcnJheVR5cGUgKmFy cmF5X3R5cGUgPSB0eXBlX2V4cHJlc3Npb24gLT4gdHlwZSAtPiBBcnJheVR5cGVDYXN0KCk7CiAg ICBBc3QgKmFjdHVhbF90eXBlID0gKGFycmF5X3R5cGUgPyBhcnJheV90eXBlIC0+IHR5cGUgOiB0 eXBlX2V4cHJlc3Npb24gLT4gdHlwZSk7CgogICAgQXN0UHJpbWl0aXZlVHlwZSAqcHJpbWl0aXZl X3R5cGUgPSBhY3R1YWxfdHlwZSAtPiBQcmltaXRpdmVUeXBlQ2FzdCgpOwogICAgVHlwZVN5bWJv bCAqdHlwZSA9IChwcmltaXRpdmVfdHlwZSA/IEZpbmRQcmltaXRpdmVUeXBlKHByaW1pdGl2ZV90 eXBlKSA6IE11c3RGaW5kVHlwZShhY3R1YWxfdHlwZSkpOwoKICAgIGlmIChhcnJheV90eXBlKQog ICAgICAgIHR5cGUgPSB0eXBlIC0+IEdldEFycmF5VHlwZSgoU2VtYW50aWMgKikgdGhpcywgYXJy YXlfdHlwZSAtPiBOdW1CcmFja2V0cygpKTsKCiAgICB0eXBlX2V4cHJlc3Npb24gLT4gc3ltYm9s ID0gdHlwZTsKCiAgICByZXR1cm47Cn0KCgp2b2lkIFNlbWFudGljOjpQcm9jZXNzQ29uZGl0aW9u YWxFeHByZXNzaW9uKEFzdCAqZXhwcikKewogICAgQXN0Q29uZGl0aW9uYWxFeHByZXNzaW9uICpj b25kaXRpb25hbF9leHByZXNzaW9uID0gKEFzdENvbmRpdGlvbmFsRXhwcmVzc2lvbiAqKSBleHBy OwoKICAgIFByb2Nlc3NFeHByZXNzaW9uKGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gdGVzdF9l eHByZXNzaW9uKTsKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgIFByb2Nlc3NFeHBy ZXNzaW9uT3JTdHJpbmdDb25zdGFudChjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHRydWVfZXhw cmVzc2lvbik7CiAgICBQcm9jZXNzRXhwcmVzc2lvbk9yU3RyaW5nQ29uc3RhbnQoY29uZGl0aW9u YWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9leHByZXNzaW9uKTsKCiAgICBUeXBlU3ltYm9sICp0ZXN0 X3R5cGUgID0gY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB0ZXN0X2V4cHJlc3Npb24gLT4gVHlw ZSgpOwogICAgVHlwZVN5bWJvbCAqdHJ1ZV90eXBlICA9IGNvbmRpdGlvbmFsX2V4cHJlc3Npb24g LT4gdHJ1ZV9leHByZXNzaW9uIC0+IFR5cGUoKTsKICAgIFR5cGVTeW1ib2wgKmZhbHNlX3R5cGUg PSBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IGZhbHNlX2V4cHJlc3Npb24gLT4gVHlwZSgpOwoK ICAgIGlmICh0ZXN0X3R5cGUgPT0gY29udHJvbC5ub190eXBlIHx8IHRydWVfdHlwZSA9PSBjb250 cm9sLm5vX3R5cGUgfHwgZmFsc2VfdHlwZSA9PSBjb250cm9sLm5vX3R5cGUpCiAgICAgICAgY29u ZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBjb250cm9sLm5vX3R5cGU7CiAgICBlbHNl IGlmICh0ZXN0X3R5cGUgIT0gY29udHJvbC5ib29sZWFuX3R5cGUpCiAgICB7CiAgICAgICAgUmVw b3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VFlQRV9OT1RfQk9PTEVBTiwKICAgICAgICAgICAg ICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHRlc3RfZXhwcmVzc2lvbiAtPiBM ZWZ0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9u IC0+IHRlc3RfZXhwcmVzc2lvbiAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAg ICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB0ZXN0X2V4cHJlc3Npb24gLT4gVHlwZSgpIC0+ IE5hbWUoKSk7CiAgICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBjb250 cm9sLm5vX3R5cGU7CiAgICB9CiAgICBlbHNlIGlmICh0cnVlX3R5cGUgPT0gY29udHJvbC52b2lk X3R5cGUpCiAgICB7CiAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VFlQRV9J U19WT0lELAogICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4g dHJ1ZV9leHByZXNzaW9uIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgIGNv bmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gdHJ1ZV9leHByZXNzaW9uIC0+IFJpZ2h0VG9rZW4oKSwK ICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHRydWVfZXhw cmVzc2lvbiAtPiBUeXBlKCkgLT4gTmFtZSgpKTsKICAgICAgICBjb25kaXRpb25hbF9leHByZXNz aW9uIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgIH0KICAgIGVsc2UgaWYgKGZhbHNl X3R5cGUgPT0gY29udHJvbC52b2lkX3R5cGUpCiAgICB7CiAgICAgICAgUmVwb3J0U2VtRXJyb3Io U2VtYW50aWNFcnJvcjo6VFlQRV9JU19WT0lELAogICAgICAgICAgICAgICAgICAgICAgIGNvbmRp dGlvbmFsX2V4cHJlc3Npb24gLT4gZmFsc2VfZXhwcmVzc2lvbiAtPiBMZWZ0VG9rZW4oKSwKICAg ICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IGZhbHNlX2V4cHJl c3Npb24gLT4gUmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFs X2V4cHJlc3Npb24gLT4gZmFsc2VfZXhwcmVzc2lvbiAtPiBUeXBlKCkgLT4gTmFtZSgpKTsKICAg ICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsK ICAgIH0KICAgIGVsc2UgaWYgKHRydWVfdHlwZSAtPiBQcmltaXRpdmUoKSkKICAgIHsKICAgICAg ICBpZiAoISBmYWxzZV90eXBlIC0+IFByaW1pdGl2ZSgpIHx8CiAgICAgICAgICAgICh0cnVlX3R5 cGUgIT0gZmFsc2VfdHlwZSAmJiAodHJ1ZV90eXBlID09IGNvbnRyb2wuYm9vbGVhbl90eXBlIHx8 IGZhbHNlX3R5cGUgPT0gY29udHJvbC5ib29sZWFuX3R5cGUpKSkKICAgICAgICB7CiAgICAgICAg ICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6OklOQ09NUEFUSUJMRV9UWVBFX0ZPUl9D T05ESVRJT05BTF9FWFBSRVNTSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRp b25hbF9leHByZXNzaW9uIC0+IGZhbHNlX2V4cHJlc3Npb24gLT4gTGVmdFRva2VuKCksCiAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gZmFsc2VfZXhw cmVzc2lvbiAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRp dGlvbmFsX2V4cHJlc3Npb24gLT4gZmFsc2VfZXhwcmVzc2lvbiAtPiBUeXBlKCkgLT4gQ29udGFp bmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IGZhbHNlX2V4cHJlc3Npb24gLT4gVHlwZSgpIC0+ IEV4dGVybmFsTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbF9l eHByZXNzaW9uIC0+IHRydWVfZXhwcmVzc2lvbiAtPiBUeXBlKCkgLT4gQ29udGFpbmluZ1BhY2th Z2UoKSAtPiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRp b25hbF9leHByZXNzaW9uIC0+IHRydWVfZXhwcmVzc2lvbiAtPiBUeXBlKCkgLT4gRXh0ZXJuYWxO YW1lKCkpOwogICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHN5bWJvbCA9IGNv bnRyb2wubm9fdHlwZTsKICAgICAgICB9CiAgICAgICAgZWxzZSAgCiAgICAgICAgewogICAgICAg ICAgICBpZiAodHJ1ZV90eXBlID09IGZhbHNlX3R5cGUpCiAgICAgICAgICAgICAgICBjb25kaXRp b25hbF9leHByZXNzaW9uIC0+IHN5bWJvbCA9IHRydWVfdHlwZTsKICAgICAgICAgICAgZWxzZSAg CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh0cnVlX3R5cGUgPT0gY29udHJvbC5i eXRlX3R5cGUgJiYgZmFsc2VfdHlwZSA9PSBjb250cm9sLnNob3J0X3R5cGUpCiAgICAgICAgICAg ICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB0cnVl X2V4cHJlc3Npb24gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRUb1R5 cGUoY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB0cnVlX2V4cHJlc3Npb24sIGNvbnRyb2wuc2hv cnRfdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBz eW1ib2wgPSBjb250cm9sLnNob3J0X3R5cGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg ICAgICBlbHNlIGlmICh0cnVlX3R5cGUgPT0gY29udHJvbC5zaG9ydF90eXBlICYmIGZhbHNlX3R5 cGUgPT0gY29udHJvbC5ieXRlX3R5cGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAg ICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9leHByZXNzaW9uID0KICAgICAg ICAgICAgICAgICAgICAgICAgQ29udmVydFRvVHlwZShjb25kaXRpb25hbF9leHByZXNzaW9uIC0+ IGZhbHNlX2V4cHJlc3Npb24sIGNvbnRyb2wuc2hvcnRfdHlwZSk7CiAgICAgICAgICAgICAgICAg ICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBjb250cm9sLnNob3J0X3R5cGU7 CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChJc0ludFZhbHVlUmVw cmVzZW50YWJsZUluVHlwZShjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IGZhbHNlX2V4cHJlc3Np b24sIHRydWVfdHlwZSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29u ZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9leHByZXNzaW9uID0KICAgICAgICAgICAgICAg ICAgICAgICAgQ29udmVydFRvVHlwZShjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IGZhbHNlX2V4 cHJlc3Npb24sIHRydWVfdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWxfZXhw cmVzc2lvbiAtPiBzeW1ib2wgPSB0cnVlX3R5cGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAg ICAgICAgICBlbHNlIGlmIChJc0ludFZhbHVlUmVwcmVzZW50YWJsZUluVHlwZShjb25kaXRpb25h bF9leHByZXNzaW9uIC0+IHRydWVfZXhwcmVzc2lvbiwgZmFsc2VfdHlwZSkpCiAgICAgICAgICAg ICAgICB7CiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB0cnVl X2V4cHJlc3Npb24gPQogICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydFRvVHlwZShjb25k aXRpb25hbF9leHByZXNzaW9uIC0+IHRydWVfZXhwcmVzc2lvbiwgZmFsc2VfdHlwZSk7CiAgICAg ICAgICAgICAgICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBzeW1ib2wgPSBmYWxzZV90 eXBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBCaW5hcnlOdW1lcmlj UHJvbW90aW9uKGNvbmRpdGlvbmFsX2V4cHJlc3Npb24pOwogICAgICAgICAgICB9CgogICAgICAg ICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAg ICAgIGlmIChjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHRlc3RfZXhwcmVzc2lvbiAtPiBJc0Nv bnN0YW50KCkgJiYKICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gdHJ1 ZV9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSAmJgogICAgICAgICAgICAgICAgY29uZGl0aW9u YWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9leHByZXNzaW9uIC0+IElzQ29uc3RhbnQoKSkKICAgICAg ICAgICAgewogICAgICAgICAgICAgICAgSW50TGl0ZXJhbFZhbHVlICp0ZXN0ID0gKEludExpdGVy YWxWYWx1ZSAqKSBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHRlc3RfZXhwcmVzc2lvbiAtPiB2 YWx1ZTsKCiAgICAgICAgICAgICAgICBpZiAodGVzdCAtPiB2YWx1ZSkKICAgICAgICAgICAgICAg ICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB2YWx1ZSA9IGNvbmRpdGlvbmFsX2V4cHJl c3Npb24gLT4gdHJ1ZV9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAgICAgICAgICAgZWxzZQog ICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHZhbHVlID0gY29u ZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9leHByZXNzaW9uIC0+IHZhbHVlOwogICAgICAg ICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmICh0cnVlX3R5 cGUgPT0gZmFsc2VfdHlwZSkKICAgICAgICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBz eW1ib2wgPSB0cnVlX3R5cGU7CiAgICAgICAgZWxzZSBpZiAoZmFsc2VfdHlwZSAtPiBQcmltaXRp dmUoKSkKICAgICAgICB7CiAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFudGljRXJyb3I6 OklOQ09NUEFUSUJMRV9UWVBFX0ZPUl9DT05ESVRJT05BTF9FWFBSRVNTSU9OLAogICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IGZhbHNlX2V4cHJlc3Np b24gLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFs X2V4cHJlc3Npb24gLT4gZmFsc2VfZXhwcmVzc2lvbiAtPiBSaWdodFRva2VuKCksCiAgICAgICAg ICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gZmFsc2VfZXhwcmVz c2lvbiAtPiBUeXBlKCkgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdlTmFtZSgpLAog ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IGZhbHNl X2V4cHJlc3Npb24gLT4gVHlwZSgpIC0+IEV4dGVybmFsTmFtZSgpLAogICAgICAgICAgICAgICAg ICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHRydWVfZXhwcmVzc2lvbiAtPiBU eXBlKCkgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdlTmFtZSgpLAogICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHRydWVfZXhwcmVzc2lv biAtPiBUeXBlKCkgLT4gRXh0ZXJuYWxOYW1lKCkpOwogICAgICAgICAgICBjb25kaXRpb25hbF9l eHByZXNzaW9uIC0+IHN5bWJvbCA9IGNvbnRyb2wubm9fdHlwZTsKICAgICAgICAgICAgcmV0dXJu OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0cnVlX3R5cGUgPT0gY29udHJvbC5udWxsX3R5 cGUpCiAgICAgICAgICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gc3ltYm9sID0gZmFsc2Vf dHlwZTsKICAgICAgICBlbHNlIGlmIChmYWxzZV90eXBlID09IGNvbnRyb2wubnVsbF90eXBlKQog ICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHN5bWJvbCA9IHRydWVfdHlwZTsK ICAgICAgICBlbHNlIGlmIChDYW5Bc3NpZ25tZW50Q29udmVydChmYWxzZV90eXBlLCBjb25kaXRp b25hbF9leHByZXNzaW9uIC0+IHRydWVfZXhwcmVzc2lvbikpCiAgICAgICAgewogICAgICAgICAg ICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHRydWVfZXhwcmVzc2lvbiA9IENvbnZlcnRUb1R5 cGUoY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB0cnVlX2V4cHJlc3Npb24sIGZhbHNlX3R5cGUp OwogICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHN5bWJvbCA9IGZhbHNlX3R5 cGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKENhbkFzc2lnbm1lbnRDb252ZXJ0KHRydWVf dHlwZSwgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9leHByZXNzaW9uKSkKICAgICAg ICB7CiAgICAgICAgICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gZmFsc2VfZXhwcmVzc2lv biA9IENvbnZlcnRUb1R5cGUoY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9leHByZXNz aW9uLCB0cnVlX3R5cGUpOwogICAgICAgICAgICBjb25kaXRpb25hbF9leHByZXNzaW9uIC0+IHN5 bWJvbCA9IHRydWVfdHlwZTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAg ICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6SU5DT01QQVRJQkxFX1RZUEVfRk9S X0NPTkRJVElPTkFMX0VYUFJFU1NJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRp dGlvbmFsX2V4cHJlc3Npb24gLT4gZmFsc2VfZXhwcmVzc2lvbiAtPiBMZWZ0VG9rZW4oKSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9l eHByZXNzaW9uIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u ZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiBmYWxzZV9leHByZXNzaW9uIC0+IFR5cGUoKSAtPiBDb250 YWluaW5nUGFja2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAg ICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gZmFsc2VfZXhwcmVzc2lvbiAtPiBUeXBlKCkg LT4gRXh0ZXJuYWxOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFs X2V4cHJlc3Npb24gLT4gdHJ1ZV9leHByZXNzaW9uIC0+IFR5cGUoKSAtPiBDb250YWluaW5nUGFj a2FnZSgpIC0+IFBhY2thZ2VOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRp dGlvbmFsX2V4cHJlc3Npb24gLT4gdHJ1ZV9leHByZXNzaW9uIC0+IFR5cGUoKSAtPiBFeHRlcm5h bE5hbWUoKSk7CiAgICAgICAgICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gc3ltYm9sID0g Y29udHJvbC5ub190eXBlOwogICAgICAgIH0KCiAgICAgICAgIAogICAgICAgICAKICAgICAgICAg CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgIGlmIChjb25k aXRpb25hbF9leHByZXNzaW9uIC0+IHRlc3RfZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50KCkgJiYK ICAgICAgICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB0cnVlX2V4cHJlc3Npb24gLT4g SXNDb25zdGFudCgpICYmCiAgICAgICAgICAgIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gZmFs c2VfZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50KCkpCiAgICAgICAgewogICAgICAgICAgICAoc3Rh dGljX2Nhc3Q8dm9pZD4gICgoIGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gc3ltYm9sID09IGNv bnRyb2wuU3RyaW5nKCkgKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImNvbmRpdGlvbmFsX2V4cHJl c3Npb24gLT4gc3ltYm9sID09IGNvbnRyb2wuU3RyaW5nKCkiICwgIi4uLy4uL2ppa2VzL3NyYy9l eHByLmNwcCIsIDY5MjQsIF9fUFJFVFRZX0ZVTkNUSU9OX18gKSwgMCkpKSA7CiAgICAgICAgICAg ICAKCiAgICAgICAgICAgIEludExpdGVyYWxWYWx1ZSAqdGVzdCA9IChJbnRMaXRlcmFsVmFsdWUg KikgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB0ZXN0X2V4cHJlc3Npb24gLT4gdmFsdWU7CiAg ICAgICAgICAgIAogICAgICAgICAgICBpZiAodGVzdCAtPiB2YWx1ZSkKICAgICAgICAgICAgICAg IGNvbmRpdGlvbmFsX2V4cHJlc3Npb24gLT4gdmFsdWUgPSBjb25kaXRpb25hbF9leHByZXNzaW9u IC0+IHRydWVfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAg ICAgICAgY29uZGl0aW9uYWxfZXhwcmVzc2lvbiAtPiB2YWx1ZSA9IGNvbmRpdGlvbmFsX2V4cHJl c3Npb24gLT4gZmFsc2VfZXhwcmVzc2lvbiAtPiB2YWx1ZTsKICAgICAgICB9CiAgICB9CgogICAg cmV0dXJuOwp9CgoKdm9pZCBTZW1hbnRpYzo6UHJvY2Vzc0Fzc2lnbm1lbnRFeHByZXNzaW9uKEFz dCAqZXhwcikKewogICAgQXN0QXNzaWdubWVudEV4cHJlc3Npb24gKmFzc2lnbm1lbnRfZXhwcmVz c2lvbiA9IChBc3RBc3NpZ25tZW50RXhwcmVzc2lvbiAqKSBleHByOwoKICAgIEFzdEV4cHJlc3Np b24gKmxlZnRfaGFuZF9zaWRlID0gYXNzaWdubWVudF9leHByZXNzaW9uIC0+IGxlZnRfaGFuZF9z aWRlOwoKICAgIFByb2Nlc3NFeHByZXNzaW9uKGxlZnRfaGFuZF9zaWRlKTsKICAgIFByb2Nlc3NF eHByZXNzaW9uT3JTdHJpbmdDb25zdGFudChhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gZXhwcmVz c2lvbik7CiAgICBUeXBlU3ltYm9sICpsZWZ0X3R5cGUgPSBsZWZ0X2hhbmRfc2lkZSAtPiBUeXBl KCksCiAgICAgICAgICAgICAgICpyaWdodF90eXBlID0gYXNzaWdubWVudF9leHByZXNzaW9uIC0+ IGV4cHJlc3Npb24gLT4gVHlwZSgpOwoKICAgIGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAtPiBzeW1i b2wgPSBsZWZ0X3R5cGU7CgogICAgaWYgKGxlZnRfdHlwZSA9PSBjb250cm9sLm5vX3R5cGUgfHwg cmlnaHRfdHlwZSA9PSBjb250cm9sLm5vX3R5cGUpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmICgh IGxlZnRfaGFuZF9zaWRlIC0+IEFycmF5QWNjZXNzQ2FzdCgpKSAgCiAgICB7CiAgICAgICAgTWV0 aG9kU3ltYm9sICpyZWFkX21ldGhvZCA9IF9fbnVsbCA7CiAgICAgICAgQXN0U2ltcGxlTmFtZSAq c2ltcGxlX25hbWUgPSBsZWZ0X2hhbmRfc2lkZSAtPiBTaW1wbGVOYW1lQ2FzdCgpOwogICAgICAg IGlmIChzaW1wbGVfbmFtZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChzaW1wbGVfbmFtZSAt PiByZXNvbHV0aW9uX29wdCkKICAgICAgICAgICAgICAgcmVhZF9tZXRob2QgPSBzaW1wbGVfbmFt ZSAtPiByZXNvbHV0aW9uX29wdCAtPiBzeW1ib2wgLT4gTWV0aG9kQ2FzdCgpOwogICAgICAgIH0K ICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBBc3RGaWVsZEFjY2VzcyAqZmllbGRf YWNjZXNzID0gKEFzdEZpZWxkQWNjZXNzICopIGxlZnRfaGFuZF9zaWRlOwogICAgICAgICAgICBp ZiAoZmllbGRfYWNjZXNzIC0+IHJlc29sdXRpb25fb3B0KQogICAgICAgICAgICAgICAgcmVhZF9t ZXRob2QgPSBmaWVsZF9hY2Nlc3MgLT4gcmVzb2x1dGlvbl9vcHQgLT4gc3ltYm9sIC0+IE1ldGhv ZENhc3QoKTsKICAgICAgICB9CgogICAgICAgIGlmIChyZWFkX21ldGhvZCkKICAgICAgICB7CiAg ICAgICAgICAgIFZhcmlhYmxlU3ltYm9sICpzeW1ib2wgPSAoVmFyaWFibGVTeW1ib2wgKikgcmVh ZF9tZXRob2QgLT4gYWNjZXNzZWRfbWVtYmVyOwogICAgICAgICAgICBhc3NpZ25tZW50X2V4cHJl c3Npb24gLT4gd3JpdGVfbWV0aG9kID0gcmVhZF9tZXRob2QgLT4gY29udGFpbmluZ190eXBlIC0+ IEdldFdyaXRlQWNjZXNzTWV0aG9kKHN5bWJvbCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSAg CiAgICB7CiAgICAgICAgIAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAK ICAgICAgICBTeW1ib2xTZXQgKmV4Y2VwdGlvbl9zZXQgPSBUcnlFeGNlcHRpb25UYWJsZVN0YWNr KCkuVG9wKCk7CiAgICAgICAgaWYgKGV4Y2VwdGlvbl9zZXQgJiYgKCEgbGVmdF90eXBlIC0+IFBy aW1pdGl2ZSgpKSkKICAgICAgICB7CiAgICAgICAgICAgIGV4Y2VwdGlvbl9zZXQgLT4gQWRkRWxl bWVudChjb250cm9sLlJ1bnRpbWVFeGNlcHRpb24oKSk7CiAgICAgICAgfQogICAgfQoKICAgIGlm IChhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gYXNzaWdubWVudF90YWcgPT0gQXN0QXNzaWdubWVu dEV4cHJlc3Npb246OlNJTVBMRV9FUVVBTCkKICAgIHsKICAgICAgICBpZiAobGVmdF90eXBlICE9 IHJpZ2h0X3R5cGUpCiAgICAgICAgewogICAgICAgICAgICBpZiAoQ2FuQXNzaWdubWVudENvbnZl cnQobGVmdF90eXBlLCBhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gZXhwcmVzc2lvbikpCiAgICAg ICAgICAgICAgICBhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiA9IENvbnZlcnRU b1R5cGUoYXNzaWdubWVudF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24sIGxlZnRfdHlwZSk7CiAg ICAgICAgICAgIGVsc2UgaWYgKGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC0+ IElzQ29uc3RhbnQoKSAmJgogICAgICAgICAgICAgICAgICAgICBjb250cm9sLklzU2ltcGxlSW50 ZWdlclZhbHVlVHlwZShsZWZ0X3R5cGUpICYmCiAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wu SXNTaW1wbGVJbnRlZ2VyVmFsdWVUeXBlKGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAtPiBleHByZXNz aW9uIC0+IFR5cGUoKSkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChsZWZ0X3R5 cGUgPT0gY29udHJvbC5ieXRlX3R5cGUpCiAgICAgICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVy cm9yKFNlbWFudGljRXJyb3I6OklOVkFMSURfQllURV9WQUxVRSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgYXNzaWdubWVudF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLT4g TGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbm1l bnRfZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC0+IFJpZ2h0VG9rZW4oKSk7CiAgICAgICAgICAg ICAgICBlbHNlIGlmIChsZWZ0X3R5cGUgPT0gY29udHJvbC5zaG9ydF90eXBlKQogICAgICAgICAg ICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpJTlZBTElEX1NIT1JUX1ZB TFVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50X2V4cHJl c3Npb24gLT4gZXhwcmVzc2lvbiAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgYXNzaWdubWVudF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLT4gUmln aHRUb2tlbigpKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxlZnRfdHlwZSA9PSBjb250cm9s LmludF90eXBlKQogICAgICAgICAgICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vy cm9yOjpJTlZBTElEX0lOVF9WQUxVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgYXNzaWdubWVudF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLT4gTGVmdFRva2VuKCksCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAt PiBleHByZXNzaW9uIC0+IFJpZ2h0VG9rZW4oKSk7CiAgICAgICAgICAgICAgICBlbHNlICAKICAg ICAgICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6SU5WQUxJRF9D SEFSQUNURVJfVkFMVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2ln bm1lbnRfZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC0+IExlZnRUb2tlbigpLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gZXhwcmVz c2lvbiAtPiBSaWdodFRva2VuKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAg ICAgICAgICAgewogICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6 SU5DT01QQVRJQkxFX1RZUEVfRk9SX0FTU0lHTk1FTlQsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gUmlnaHRUb2tlbigp LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF90eXBlIC0+IENvbnRhaW5pbmdQ YWNrYWdlKCkgLT4gUGFja2FnZU5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGxlZnRfdHlwZSAtPiBFeHRlcm5hbE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHJpZ2h0X3R5cGUgLT4gQ29udGFpbmluZ1BhY2thZ2UoKSAtPiBQYWNrYWdlTmFtZSgpLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfdHlwZSAtPiBFeHRlcm5hbE5hbWUo KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAg CiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICAgCiAgICBpZiAo bGVmdF90eXBlID09IGNvbnRyb2wuU3RyaW5nKCkgJiYgYXNzaWdubWVudF9leHByZXNzaW9uIC0+ IGFzc2lnbm1lbnRfdGFnID09IEFzdEFzc2lnbm1lbnRFeHByZXNzaW9uOjpQTFVTX0VRVUFMKQog ICAgewogICAgICAgIGlmIChyaWdodF90eXBlICE9IGNvbnRyb2wuU3RyaW5nKCkpCiAgICAgICAg ewogICAgICAgICAgICBpZiAocmlnaHRfdHlwZSA9PSBjb250cm9sLnZvaWRfdHlwZSkKICAgICAg ICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpWT0lEX1RPX1NUUklORywK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4g ZXhwcmVzc2lvbiAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiAtPiBSaWdodFRva2VuKCkpOwog ICAgICAgICAgICBlbHNlIGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uID0gQ29u dmVydFRvVHlwZShhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gZXhwcmVzc2lvbiwgY29udHJvbC5T dHJpbmcoKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCEgbGVm dF90eXBlIC0+IFByaW1pdGl2ZSgpKQogICAgewogICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFu dGljRXJyb3I6OlRZUEVfTk9UX1BSSU1JVElWRSwKICAgICAgICAgICAgICAgICAgICAgICBsZWZ0 X2hhbmRfc2lkZSAtPiBMZWZ0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X2hh bmRfc2lkZSAtPiBSaWdodFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAgICAgbGVmdF90eXBl IC0+IE5hbWUoKSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghIHJpZ2h0X3R5cGUg LT4gUHJpbWl0aXZlKCkpCiAgICB7CiAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJv cjo6VFlQRV9OT1RfUFJJTUlUSVZFLAogICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRf ZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAg ICAgICAgIGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC0+IFJpZ2h0VG9rZW4o KSwKICAgICAgICAgICAgICAgICAgICAgICByaWdodF90eXBlIC0+IE5hbWUoKSk7CiAgICAgICAg cmV0dXJuOwogICAgfQoKICAgIHN3aXRjaChhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gYXNzaWdu bWVudF90YWcpCiAgICB7CiAgICAgICAgY2FzZSBBc3RBc3NpZ25tZW50RXhwcmVzc2lvbjo6UExV U19FUVVBTDoKICAgICAgICBjYXNlIEFzdEFzc2lnbm1lbnRFeHByZXNzaW9uOjpTVEFSX0VRVUFM OgogICAgICAgIGNhc2UgQXN0QXNzaWdubWVudEV4cHJlc3Npb246Ok1JTlVTX0VRVUFMOgogICAg ICAgICAgICBCaW5hcnlOdW1lcmljUHJvbW90aW9uKGFzc2lnbm1lbnRfZXhwcmVzc2lvbik7CiAg ICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQXN0QXNzaWdubWVudEV4cHJlc3Npb246OlNM QVNIX0VRVUFMOgogICAgICAgIGNhc2UgQXN0QXNzaWdubWVudEV4cHJlc3Npb246Ok1PRF9FUVVB TDoKICAgICAgICAgICAgQmluYXJ5TnVtZXJpY1Byb21vdGlvbihhc3NpZ25tZW50X2V4cHJlc3Np b24pOwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBc3RFeHByZXNzaW9uICpyaWdodF9l eHByZXNzaW9uID0gYXNzaWdubWVudF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb247CiAgICAgICAg ICAgICAgICBpZiAocmlnaHRfZXhwcmVzc2lvbiAtPiBJc0NvbnN0YW50KCkpCiAgICAgICAgICAg ICAgICB7CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAKICAgICAg ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg IGlmIChjb250cm9sLklzSW50ZWdyYWwobGVmdF90eXBlKSAmJgogICAgICAgICAgICAgICAgICAg ICAgICAocmlnaHRfZXhwcmVzc2lvbiAtPiBUeXBlKCkgPT0gY29udHJvbC5pbnRfdHlwZSAmJgog ICAgICAgICAgICAgICAgICAgICAgICAgRFlOQU1JQ19DQVNUPEludExpdGVyYWxWYWx1ZSAqLCBM aXRlcmFsVmFsdWUgKj4KICAgICAgICAgICAgICAgICAgICAgICAgIChyaWdodF9leHByZXNzaW9u IC0+IHZhbHVlKSAtPiB2YWx1ZSA9PSAwKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAocmln aHRfZXhwcmVzc2lvbiAtPiBUeXBlKCkgPT0gY29udHJvbC5sb25nX3R5cGUgJiYKICAgICAgICAg ICAgICAgICAgICAgICAgIERZTkFNSUNfQ0FTVDxMb25nTGl0ZXJhbFZhbHVlICosIExpdGVyYWxW YWx1ZSAqPgogICAgICAgICAgICAgICAgICAgICAgICAgKHJpZ2h0X2V4cHJlc3Npb24gLT4gdmFs dWUpIC0+IHZhbHVlID09IDApKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg ICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6WkVST19ESVZJREVfQ0FVVElP TiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWdubWVudF9leHBy ZXNzaW9uIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gUmlnaHRUb2tlbigpKTsKICAgICAgICAgICAg ICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJl YWs7CiAgICAgICAgY2FzZSBBc3RBc3NpZ25tZW50RXhwcmVzc2lvbjo6TEVGVF9TSElGVF9FUVVB TDoKICAgICAgICBjYXNlIEFzdEFzc2lnbm1lbnRFeHByZXNzaW9uOjpSSUdIVF9TSElGVF9FUVVB TDoKICAgICAgICBjYXNlIEFzdEFzc2lnbm1lbnRFeHByZXNzaW9uOjpVTlNJR05FRF9SSUdIVF9T SElGVF9FUVVBTDoKICAgICAgICAgICAgIGlmICghIGNvbnRyb2wuSXNJbnRlZ3JhbChsZWZ0X3R5 cGUpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFJlcG9ydFNlbUVycm9yKFNlbWFu dGljRXJyb3I6OlRZUEVfTk9UX0lOVEVHUkFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGxlZnRfaGFuZF9zaWRlIC0+IExlZnRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGxlZnRfaGFuZF9zaWRlIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBsZWZ0X3R5cGUgLT4gTmFtZSgpKTsKICAgICAgICAgICAgIH0KCiAg ICAgICAgICAgICBpZiAoISBjb250cm9sLklzSW50ZWdyYWwocmlnaHRfdHlwZSkpCiAgICAgICAg ICAgICB7CiAgICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJvcjo6VFlQ RV9OT1RfSU5URUdSQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWdubWVu dF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgYXNzaWdubWVudF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLT4g UmlnaHRUb2tlbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0X3R5cGUg LT4gTmFtZSgpKTsKICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICBhc3NpZ25tZW50X2V4cHJl c3Npb24gLT4gbGVmdF9oYW5kX3NpZGUgPSBQcm9tb3RlVW5hcnlOdW1lcmljRXhwcmVzc2lvbihs ZWZ0X2hhbmRfc2lkZSk7CiAgICAgICAgICAgICBhc3NpZ25tZW50X2V4cHJlc3Npb24gLT4gZXhw cmVzc2lvbiA9IFByb21vdGVVbmFyeU51bWVyaWNFeHByZXNzaW9uKGFzc2lnbm1lbnRfZXhwcmVz c2lvbiAtPiBleHByZXNzaW9uKTsKICAgICAgICAgICAgIGlmIChhc3NpZ25tZW50X2V4cHJlc3Np b24gLT4gZXhwcmVzc2lvbiAtPiBUeXBlKCkgPT0gY29udHJvbC5sb25nX3R5cGUpCiAgICAgICAg ICAgICAgICAgYXNzaWdubWVudF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24gPSBDb252ZXJ0VG9U eXBlKGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uLCBjb250cm9sLmludF90eXBl KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQXN0QXNzaWdubWVudEV4cHJlc3Np b246OkFORF9FUVVBTDoKICAgICAgICBjYXNlIEFzdEFzc2lnbm1lbnRFeHByZXNzaW9uOjpYT1Jf RVFVQUw6CiAgICAgICAgY2FzZSBBc3RBc3NpZ25tZW50RXhwcmVzc2lvbjo6SU9SX0VRVUFMOgog ICAgICAgICAgICAgaWYgKGxlZnRfdHlwZSA9PSBjb250cm9sLmJvb2xlYW5fdHlwZSkKICAgICAg ICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAocmlnaHRfdHlwZSAhPSBjb250cm9sLmJvb2xl YW5fdHlwZSkKICAgICAgICAgICAgICAgICAgICAgUmVwb3J0U2VtRXJyb3IoU2VtYW50aWNFcnJv cjo6VFlQRV9OT1RfQk9PTEVBTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg YXNzaWdubWVudF9leHByZXNzaW9uIC0+IGV4cHJlc3Npb24gLT4gTGVmdFRva2VuKCksCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAtPiBl eHByZXNzaW9uIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmlnaHRfdHlwZSAtPiBOYW1lKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAg ZWxzZQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICghIGNvbnRyb2wuSXNJbnRl Z3JhbChsZWZ0X3R5cGUpKQogICAgICAgICAgICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1h bnRpY0Vycm9yOjpUWVBFX05PVF9JTlRFR1JBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgbGVmdF9oYW5kX3NpZGUgLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGxlZnRfaGFuZF9zaWRlIC0+IFJpZ2h0VG9rZW4oKSwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF90eXBlIC0+IE5hbWUoKSk7CiAgICAg ICAgICAgICAgICAgaWYgKCEgY29udHJvbC5Jc0ludGVncmFsKHJpZ2h0X3R5cGUpKQogICAgICAg ICAgICAgICAgICAgICBSZXBvcnRTZW1FcnJvcihTZW1hbnRpY0Vycm9yOjpUWVBFX05PVF9JTlRF R1JBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWdubWVudF9leHBy ZXNzaW9uIC0+IGV4cHJlc3Npb24gLT4gTGVmdFRva2VuKCksCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRfZXhwcmVzc2lvbiAtPiBleHByZXNzaW9uIC0+IFJp Z2h0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRfdHlw ZSAtPiBOYW1lKCkpOwogICAgICAgICAgICAgICAgIEJpbmFyeU51bWVyaWNQcm9tb3Rpb24oYXNz aWdubWVudF9leHByZXNzaW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwog ICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIChzdGF0aWNfY2FzdDx2b2lkPiAgKCggZmFsc2Ug KSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoImZhbHNlIiAsICIuLi8uLi9qaWtlcy9zcmMvZXhwci5j cHAiLCA3MTU5LCBfX1BSRVRUWV9GVU5DVElPTl9fICksIDApKSkgOwogICAgICAgICAgICBicmVh azsKICAgIH0KCiAgICByZXR1cm47Cn0KCgoKCgo=