From mboxrd@z Thu Jan 1 00:00:00 1970 From: jcownie@etnus.com To: gcc-gnats@gcc.gnu.org Cc: Subject: debug/2714: Stabs truncated on AIX Date: Wed, 02 May 2001 09:36:00 -0000 Message-id: <20010502163540.11449.qmail@sourceware.cygnus.com> X-SW-Source: 2001-05/msg00024.html List-Id: >Number: 2714 >Category: debug >Synopsis: Stabs truncated on AIX >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Wed May 02 09:36:01 PDT 2001 >Closed-Date: >Last-Modified: >Originator: Bor Chan >Release: 2.95.2 >Organization: >Environment: AIX >Description: gcc believes that it can emit arbitrarily long stab strings on AIX (xcoffout.h contains #define DBX_CONTIN_LENGTH 0). Howeverm the assembler truncates stabs trings after 32767 characters. In C++ code using the STL it is possible to exceed this limit. >How-To-Repeat: Compile the code -g and then objdump --syms the .o file. Observe that the stabs for _Rb_tree, etc... is truncated after 32767 characters. >Fix: Turn on stab continuations in xcoff. You might also need to worry about the fact that IBM use ? as the continuation marker, rather than \ as the last character of a continued stab. >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="tv2737.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="tv2737.ii" IyAxICJ0djI3MzcuY3h4IgojIDEgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUu Mi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9p bmNsdWRlL2crKy0zL2lvc3RyZWFtIiAxIDMKIAogCgoKCiMgMSAiL2hvbWUvdHYvdG9vbHMvZ251 L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45 NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvaW9zdHJlYW0uaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKCiMgMSAiL2hvbWUvdHYvdG9vbHMv Z251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAv Mi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RyZWFtYnVmLmgiIDEgMwogCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKI3ByYWdtYSBpbnRlcmZhY2UKCgogICAKCgoKZXh0ZXJuICJD IiB7CiMgMSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGli L3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMv bGliaW8uaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL2hvbWUvdHYv dG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQu Mi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvaW5jbHVkZS9f R19jb25maWcuaCIgMSAzIDQKICAKCgoKCgoKCgoKdHlwZWRlZiAgICAgICAgICBpbnQgICBfR19p bnQ4X3QgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19RSV9fKSkpOwp0eXBlZGVmIHVuc2lnbmVk IGludCAgX0dfdWludDhfdCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX1FJX18pKSk7CnR5cGVk ZWYgICAgICAgICAgaW50ICBfR19pbnQxNl90IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fSElf XykpKTsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX0dfdWludDE2X3QgX19hdHRyaWJ1dGVfXygoX19t b2RlX18oX19ISV9fKSkpOwp0eXBlZGVmICAgICAgICAgIGludCAgX0dfaW50MzJfdCBfX2F0dHJp YnV0ZV9fKChfX21vZGVfXyhfX1NJX18pKSk7CnR5cGVkZWYgdW5zaWduZWQgaW50IF9HX3VpbnQz Ml90IF9fYXR0cmlidXRlX18oKF9fbW9kZV9fKF9fU0lfXykpKTsKdHlwZWRlZiAgICAgICAgICBp bnQgIF9HX2ludDY0X3QgX19hdHRyaWJ1dGVfXygoX19tb2RlX18oX19ESV9fKSkpOwp0eXBlZGVm IHVuc2lnbmVkIGludCBfR191aW50NjRfdCBfX2F0dHJpYnV0ZV9fKChfX21vZGVfXyhfX0RJX18p KSk7CgpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgbG9uZyBsb25nIF9HX2xsb25nOwpfX2V4dGVuc2lv bl9fIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9HX3VsbG9uZzsKCgoKCgoKCgp0eXBlZGVm IGludCBfR19jbG9ja190Owp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX0dfZGV2X3Q7CnR5cGVkZWYg bG9uZyBfR19mcG9zX3Q7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBfR19naWRfdDsKdHlwZWRlZiB1 bnNpZ25lZCBsb25nIF9HX2lub190Owp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX0dfbW9kZV90Owp0 eXBlZGVmIHNob3J0IF9HX25saW5rX3Q7CnR5cGVkZWYgbG9uZyBfR19vZmZfdDsKdHlwZWRlZiBp bnQgX0dfcGlkX3Q7CgoKCnR5cGVkZWYgaW50IF9HX3B0cmRpZmZfdDsKdHlwZWRlZiBpbnQgICBf R19zaWdzZXRfdDsKCgoKdHlwZWRlZiBsb25nIHVuc2lnbmVkIGludCBfR19zaXplX3Q7CnR5cGVk ZWYgbG9uZyBfR190aW1lX3Q7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBfR191aWRfdDsKdHlwZWRl ZiBzaG9ydCB1bnNpZ25lZCBpbnQgX0dfd2NoYXJfdDsKCgoKCgoKCgoKCgoKCgoKdHlwZWRlZiBz aWduZWQgaW50IF9HX3NzaXplX3Q7CnR5cGVkZWYgaW50IF9HX3dpbnRfdDsKdHlwZWRlZiBjaGFy ICogX0dfdmFfbGlzdDsKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi9ob21lL3R2L3Rvb2xzL2dudS9y czYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUu Mi9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMgNAoKCgoKCgogCgoKIyAxOSAiL2hvbWUvdHYvdG9vbHMv Z251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAv Mi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMgNAoKCgogCgoKIAoKCgoKCiAKCgojIDYxICIvaG9t ZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0t YWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMyA0CgoKIAoKCgoKCiAKCgoKCgoK CgoKCgoKCgoKCgoKIAoKCgoKCiAKCiAKCiMgMTMxICIvaG9tZS90di90b29scy9nbnUvcnM2MDAw L2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvaW5j bHVkZS9zdGRkZWYuaCIgMyA0CgoKIAoKIAoKIyAxOTAgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYw MDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi9p bmNsdWRlL3N0ZGRlZi5oIiAzIDQKCgoKIAoKCgoKIAoKIyAyNzEgIi9ob21lL3R2L3Rvb2xzL2du dS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIu OTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzIDQKCgojIDI4MyAiL2hvbWUvdHYvdG9vbHMvZ251L3Jz NjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4y L2luY2x1ZGUvc3RkZGVmLmgiIDMgNAoKCiAKCiAKCiMgMzE3ICIvaG9tZS90di90b29scy9nbnUv cnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1 LjIvaW5jbHVkZS9zdGRkZWYuaCIgMyA0CgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgODYg Ii9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBj LWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9wb3dlcnBjLWlibS1haXg0LjIuMS4w L2luY2x1ZGUvX0dfY29uZmlnLmgiIDIgMyA0CgoKIyAzMCAiL2hvbWUvdHYvdG9vbHMvZ251L3Jz NjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4y Ly4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvbGliaW8uaCIgMiAzCgoKCgoKCgoKCgoKCgoKCgoK IyA1NSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bv d2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvbGli aW8uaCIgMwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgojIDEwNCAiL2hv bWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJt LWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvbGliaW8uaCIgMwoK CgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoK c3RydWN0IF9JT19qdW1wX3Q7ICBzdHJ1Y3QgX0lPX0ZJTEU7CgogCiMgMTc0ICIvaG9tZS90di90 b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4y LjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9saWJpby5oIiAzCgoKCgoKCgoK CiAgICB0eXBlZGVmIHZvaWQgX0lPX2xvY2tfdDsKCgoKCgogCgpzdHJ1Y3QgX0lPX21hcmtlciB7 CiAgc3RydWN0IF9JT19tYXJrZXIgKl9uZXh0OwogIHN0cnVjdCBfSU9fRklMRSAqX3NidWY7CiAg IAoKICAgCiAgaW50IF9wb3M7CiMgMjA3ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0y Ljk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4v Li4vaW5jbHVkZS9nKystMy9saWJpby5oIiAzCgp9OwoKc3RydWN0IF9JT19GSUxFIHsKICBpbnQg X2ZsYWdzOwkJIAoKCiAgIAogICAKICBjaGFyKiBfSU9fcmVhZF9wdHI7CSAKICBjaGFyKiBfSU9f cmVhZF9lbmQ7CSAKICBjaGFyKiBfSU9fcmVhZF9iYXNlOwkgCiAgY2hhciogX0lPX3dyaXRlX2Jh c2U7CSAKICBjaGFyKiBfSU9fd3JpdGVfcHRyOwkgCiAgY2hhciogX0lPX3dyaXRlX2VuZDsJIAog IGNoYXIqIF9JT19idWZfYmFzZTsJIAogIGNoYXIqIF9JT19idWZfZW5kOwkgCiAgIAogIGNoYXIg Kl9JT19zYXZlX2Jhc2U7ICAKICBjaGFyICpfSU9fYmFja3VwX2Jhc2U7ICAgCiAgY2hhciAqX0lP X3NhdmVfZW5kOyAgCgogIHN0cnVjdCBfSU9fbWFya2VyICpfbWFya2VyczsKCiAgc3RydWN0IF9J T19GSUxFICpfY2hhaW47CgogIGludCBfZmlsZW5vOwogIGludCBfYmxrc2l6ZTsKCgoKICBfR19v ZmZfdCAgX29mZnNldDsKCgoKICAgCiAgdW5zaWduZWQgc2hvcnQgX2N1cl9jb2x1bW47CiAgY2hh ciBfdW51c2VkOwogIGNoYXIgX3Nob3J0YnVmWzFdOwoKICAgCgoKCgoKCgoKfTsKCgoKCgoKCgoK CgpzdHJ1Y3QgX0lPX0ZJTEVfcGx1czsKZXh0ZXJuIHN0cnVjdCBfSU9fRklMRV9wbHVzIF9JT19z dGRpbl8sIF9JT19zdGRvdXRfLCBfSU9fc3RkZXJyXzsKCgoKCgogCnR5cGVkZWYgc3RydWN0CnsK ICBfR19zc2l6ZV90ICAoKnJlYWQpICAoc3RydWN0IF9JT19GSUxFICosIHZvaWQgKiwgX0dfc3Np emVfdCApICA7CiAgX0dfc3NpemVfdCAgKCp3cml0ZSkgIChzdHJ1Y3QgX0lPX0ZJTEUgKiwgY29u c3Qgdm9pZCAqLCBfR19zc2l6ZV90ICkgIDsKICBfR19mcG9zX3QgICgqc2VlaykgIChzdHJ1Y3Qg X0lPX0ZJTEUgKiwgX0dfb2ZmX3QgLCBpbnQpICA7CiAgaW50ICgqY2xvc2UpICAoc3RydWN0IF9J T19GSUxFICopICA7Cn0gX0lPX2Nvb2tpZV9pb19mdW5jdGlvbnNfdDsKCiAKc3RydWN0IF9JT19j b29raWVfZmlsZQp7CiAgc3RydWN0IF9JT19GSUxFIGZpbGU7CiAgY29uc3Qgdm9pZCAqdnRhYmxl OwogIHZvaWQgKmNvb2tpZTsKICBfSU9fY29va2llX2lvX2Z1bmN0aW9uc190IGlvX2Z1bmN0aW9u czsKfTsKCgoKZXh0ZXJuICJDIiB7CgoKZXh0ZXJuIGludCBfX3VuZGVyZmxvdyAgKF9JT19GSUxF ICopICA7CmV4dGVybiBpbnQgX191ZmxvdyAgKF9JT19GSUxFICopICA7CmV4dGVybiBpbnQgX19v dmVyZmxvdyAgKF9JT19GSUxFICosIGludCkgIDsKCgoKCgoKCgoKCgoKCgoKCgpleHRlcm4gaW50 IF9JT19nZXRjICAoX0lPX0ZJTEUgKl9fZnApICA7CmV4dGVybiBpbnQgX0lPX3B1dGMgIChpbnQg X19jLCBfSU9fRklMRSAqX19mcCkgIDsKZXh0ZXJuIGludCBfSU9fZmVvZiAgKF9JT19GSUxFICpf X2ZwKSAgOwpleHRlcm4gaW50IF9JT19mZXJyb3IgIChfSU9fRklMRSAqX19mcCkgIDsKCmV4dGVy biBpbnQgX0lPX3BlZWtjX2xvY2tlZCAgKF9JT19GSUxFICpfX2ZwKSAgOwoKIAoKCgpleHRlcm4g dm9pZCBfSU9fZmxvY2tmaWxlICAoX0lPX0ZJTEUgKikgIDsKZXh0ZXJuIHZvaWQgX0lPX2Z1bmxv Y2tmaWxlICAoX0lPX0ZJTEUgKikgIDsKZXh0ZXJuIGludCBfSU9fZnRyeWxvY2tmaWxlICAoX0lP X0ZJTEUgKikgIDsKCgoKCgoKCgoKCgoKCmV4dGVybiBpbnQgX0lPX3Zmc2NhbmYgIChfSU9fRklM RSAqLCBjb25zdCBjaGFyICosIF9HX3ZhX2xpc3QgLCBpbnQgKikgIDsKZXh0ZXJuIGludCBfSU9f dmZwcmludGYgIChfSU9fRklMRSAqLCBjb25zdCBjaGFyICosIF9HX3ZhX2xpc3QgKSAgOwpleHRl cm4gX0dfc3NpemVfdCAgX0lPX3BhZG4gIChfSU9fRklMRSAqLCBpbnQsIF9HX3NzaXplX3QgKSAg OwpleHRlcm4gX0dfc2l6ZV90ICBfSU9fc2dldG4gIChfSU9fRklMRSAqLCB2b2lkICosIF9HX3Np emVfdCApICA7CgoKCgoKZXh0ZXJuIF9HX2Zwb3NfdCAgX0lPX3NlZWtvZmYgIChfSU9fRklMRSAq LCBfR19vZmZfdCAsIGludCwgaW50KSAgOwpleHRlcm4gX0dfZnBvc190ICBfSU9fc2Vla3BvcyAg KF9JT19GSUxFICosIF9HX2Zwb3NfdCAsIGludCkgIDsKCgpleHRlcm4gdm9pZCBfSU9fZnJlZV9i YWNrdXBfYXJlYSAgKF9JT19GSUxFICopICA7CgoKfQoKCgojIDM2ICIvaG9tZS90di90b29scy9n bnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8y Ljk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdHJlYW1idWYuaCIgMiAzCgp9CiAKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpleHRlcm4gIkMrKyIgewpjbGFzcyBpc3RyZWFtOyAgCmNs YXNzIG9zdHJlYW07IGNsYXNzIHN0cmVhbWJ1ZjsKCiAKCgoKCgoKCnR5cGVkZWYgX0dfb2ZmX3Qg IHN0cmVhbW9mZjsKdHlwZWRlZiBfR19mcG9zX3QgIHN0cmVhbXBvczsKCnR5cGVkZWYgX0dfc3Np emVfdCAgc3RyZWFtc2l6ZTsKCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBfX2ZtdGZsYWdzOwp0eXBl ZGVmIHVuc2lnbmVkIGNoYXIgX19pb3N0YXRlOwoKc3RydWN0IF9pb3NfZmllbGRzCnsgIAogICAg c3RyZWFtYnVmICpfc3RyYnVmOwogICAgb3N0cmVhbSogX3RpZTsKICAgIGludCBfd2lkdGg7CiAg ICBfX2ZtdGZsYWdzIF9mbGFnczsKICAgIHNob3J0ICBfZmlsbDsKICAgIF9faW9zdGF0ZSBfc3Rh dGU7CiAgICBfX2lvc3RhdGUgX2V4Y2VwdGlvbnM7CiAgICBpbnQgX3ByZWNpc2lvbjsKCiAgICB2 b2lkICpfYXJyYXlzOyAgCn07CgoKCgoKCgoKCgoKCgoKCiMgMTI0ICIvaG9tZS90di90b29scy9n bnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8y Ljk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdHJlYW1idWYuaCIgMwoKCmNsYXNzIGlv cyA6IHB1YmxpYyBfaW9zX2ZpZWxkcyB7CiAgaW9zJiBvcGVyYXRvcj0oaW9zJik7ICAgCiAgaW9z IChjb25zdCBpb3MmKTsgIAogIHB1YmxpYzoKICAgIHR5cGVkZWYgX19mbXRmbGFncyBmbXRmbGFn czsKICAgIHR5cGVkZWYgaW50IGlvc3RhdGU7CiAgICB0eXBlZGVmIGludCBvcGVubW9kZTsKICAg IHR5cGVkZWYgX0dfc3NpemVfdCAgc3RyZWFtc2l6ZTsKICAgIGVudW0gaW9fc3RhdGUgewoJZ29v ZGJpdCA9IDAgLAoJZW9mYml0ID0gMSAsCglmYWlsYml0ID0gMiAsCgliYWRiaXQgPSA0ICB9Owog ICAgZW51bSBvcGVuX21vZGUgewoJaW4gPSAxICwKCW91dCA9IDIgLAoJYXRlID0gNCAsCglhcHAg PSA4ICwKCXRydW5jID0gMTYgLAoJbm9jcmVhdGUgPSAzMiAsCglub3JlcGxhY2UgPSA2NCAsCgli aW4gPSAxMjggLCAgCgliaW5hcnkgPSAxMjggIH07CiAgICBlbnVtIHNlZWtfZGlyIHsgYmVnLCBj dXIsIGVuZH07CiAgICB0eXBlZGVmIGVudW0gc2Vla19kaXIgc2Vla2RpcjsKICAgICAKICAgIGVu dW0geyBza2lwd3M9IDAxICwKCSAgIGxlZnQ9IDAyICwgcmlnaHQ9IDA0ICwgaW50ZXJuYWw9IDAx MCAsCgkgICBkZWM9IDAyMCAsIG9jdD0gMDQwICwgaGV4PSAwMTAwICwKCSAgIHNob3diYXNlPSAw MjAwICwgc2hvd3BvaW50PSAwNDAwICwKCSAgIHVwcGVyY2FzZT0gMDEwMDAgLCBzaG93cG9zPSAw MjAwMCAsCgkgICBzY2llbnRpZmljPSAwNDAwMCAsIGZpeGVkPSAwMTAwMDAgLAoJICAgdW5pdGJ1 Zj0gMDIwMDAwICwgc3RkaW89IDA0MDAwMCAKCgoKCSAgIH07CiAgICBlbnVtIHsgIAoJYmFzZWZp ZWxkPWRlYytvY3QraGV4LAoJZmxvYXRmaWVsZCA9IHNjaWVudGlmaWMrZml4ZWQsCglhZGp1c3Rm aWVsZCA9IGxlZnQrcmlnaHQraW50ZXJuYWwKICAgIH07CgojIDE3NyAiL2hvbWUvdHYvdG9vbHMv Z251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAv Mi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RyZWFtYnVmLmgiIDMKCgogICAgb3N0 cmVhbSogdGllKCkgY29uc3QgeyByZXR1cm4gX3RpZTsgfQogICAgb3N0cmVhbSogdGllKG9zdHJl YW0qIHZhbCkgeyBvc3RyZWFtKiBzYXZlPV90aWU7IF90aWU9dmFsOyByZXR1cm4gc2F2ZTsgfQoK ICAgICAKICAgIHNob3J0ICBmaWxsKCkgY29uc3QgeyByZXR1cm4gX2ZpbGw7IH0KICAgIHNob3J0 ICBmaWxsKHNob3J0ICBuZXdmKQoJe3Nob3J0ICBvbGRmID0gX2ZpbGw7IF9maWxsID0gbmV3Zjsg cmV0dXJuIG9sZGY7fQogICAgZm10ZmxhZ3MgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBfZmxhZ3M7 IH0KICAgIGZtdGZsYWdzIGZsYWdzKGZtdGZsYWdzIG5ld192YWwpIHsKCWZtdGZsYWdzIG9sZF92 YWwgPSBfZmxhZ3M7IF9mbGFncyA9IG5ld192YWw7IHJldHVybiBvbGRfdmFsOyB9CiAgICBpbnQg cHJlY2lzaW9uKCkgY29uc3QgeyByZXR1cm4gX3ByZWNpc2lvbjsgfQogICAgaW50IHByZWNpc2lv bihpbnQgbmV3cCkgewoJdW5zaWduZWQgc2hvcnQgb2xkcCA9IF9wcmVjaXNpb247IF9wcmVjaXNp b24gPSAodW5zaWduZWQgc2hvcnQpbmV3cDsKCXJldHVybiBvbGRwOyB9CiAgICBmbXRmbGFncyBz ZXRmKGZtdGZsYWdzIHZhbCkgewoJZm10ZmxhZ3Mgb2xkYml0cyA9IF9mbGFnczsKCV9mbGFncyB8 PSB2YWw7IHJldHVybiBvbGRiaXRzOyB9CiAgICBmbXRmbGFncyBzZXRmKGZtdGZsYWdzIHZhbCwg Zm10ZmxhZ3MgbWFzaykgewoJZm10ZmxhZ3Mgb2xkYml0cyA9IF9mbGFnczsKCV9mbGFncyA9IChf ZmxhZ3MgJiB+bWFzaykgfCAodmFsICYgbWFzayk7IHJldHVybiBvbGRiaXRzOyB9CiAgICBmbXRm bGFncyB1bnNldGYoZm10ZmxhZ3MgbWFzaykgewoJZm10ZmxhZ3Mgb2xkYml0cyA9IF9mbGFnczsK CV9mbGFncyAmPSB+bWFzazsgcmV0dXJuIG9sZGJpdHM7IH0KICAgIGludCB3aWR0aCgpIGNvbnN0 IHsgcmV0dXJuIF93aWR0aDsgfQogICAgaW50IHdpZHRoKGludCB2YWwpIHsgaW50IHNhdmUgPSBf d2lkdGg7IF93aWR0aCA9IHZhbDsgcmV0dXJuIHNhdmU7IH0KCgoKCiAgICB2b2lkIF90aHJvd19m YWlsdXJlKCkgY29uc3QgeyB9CgogICAgdm9pZCBjbGVhcihpb3N0YXRlIHN0YXRlID0gMCkgewoJ X3N0YXRlID0gX3N0cmJ1ZiA/IHN0YXRlIDogc3RhdGV8YmFkYml0OwoJaWYgKF9zdGF0ZSAmIF9l eGNlcHRpb25zKSBfdGhyb3dfZmFpbHVyZSgpOyB9CiAgICB2b2lkIHNldChpb3N0YXRlIGZsYWcp IHsgX3N0YXRlIHw9IGZsYWc7CglpZiAoX3N0YXRlICYgX2V4Y2VwdGlvbnMpIF90aHJvd19mYWls dXJlKCk7IH0KICAgIHZvaWQgc2V0c3RhdGUoaW9zdGF0ZSBmbGFnKSB7IF9zdGF0ZSB8PSBmbGFn OyAgCglpZiAoX3N0YXRlICYgX2V4Y2VwdGlvbnMpIF90aHJvd19mYWlsdXJlKCk7IH0KICAgIGlu dCBnb29kKCkgY29uc3QgeyByZXR1cm4gX3N0YXRlID09IDA7IH0KICAgIGludCBlb2YoKSBjb25z dCB7IHJldHVybiBfc3RhdGUgJiBpb3M6OmVvZmJpdDsgfQogICAgaW50IGZhaWwoKSBjb25zdCB7 IHJldHVybiBfc3RhdGUgJiAoaW9zOjpiYWRiaXR8aW9zOjpmYWlsYml0KTsgfQogICAgaW50IGJh ZCgpIGNvbnN0IHsgcmV0dXJuIF9zdGF0ZSAmIGlvczo6YmFkYml0OyB9CiAgICBpb3N0YXRlIHJk c3RhdGUoKSBjb25zdCB7IHJldHVybiBfc3RhdGU7IH0KICAgIG9wZXJhdG9yIHZvaWQqKCkgY29u c3QgeyByZXR1cm4gZmFpbCgpID8gKHZvaWQqKTAgOiAodm9pZCopKC0xKTsgfQogICAgaW50IG9w ZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuIGZhaWwoKTsgfQogICAgaW9zdGF0ZSBleGNlcHRpb25z KCkgY29uc3QgeyByZXR1cm4gX2V4Y2VwdGlvbnM7IH0KICAgIHZvaWQgZXhjZXB0aW9ucyhpb3N0 YXRlIGVuYWJsZSkgewoJX2V4Y2VwdGlvbnMgPSBlbmFibGU7CglpZiAoX3N0YXRlICYgX2V4Y2Vw dGlvbnMpIF90aHJvd19mYWlsdXJlKCk7IH0KCiAgICBzdHJlYW1idWYqIHJkYnVmKCkgY29uc3Qg eyByZXR1cm4gX3N0cmJ1ZjsgfQogICAgc3RyZWFtYnVmKiByZGJ1ZihzdHJlYW1idWYgKl9zKSB7 CiAgICAgIHN0cmVhbWJ1ZiAqX29sZCA9IF9zdHJidWY7IF9zdHJidWYgPSBfczsgY2xlYXIgKCk7 IHJldHVybiBfb2xkOyB9CgogICAgc3RhdGljIGludCBzeW5jX3dpdGhfc3RkaW8oaW50IG9uKTsK ICAgIHN0YXRpYyB2b2lkIHN5bmNfd2l0aF9zdGRpbygpIHsgc3luY193aXRoX3N0ZGlvKDEpOyB9 CiAgICBzdGF0aWMgZm10ZmxhZ3MgYml0YWxsb2MoKTsKICAgIHN0YXRpYyBpbnQgeGFsbG9jKCk7 CiAgICB2b2lkKiYgcHdvcmQoaW50KTsKICAgIHZvaWQqIHB3b3JkKGludCkgY29uc3Q7CiAgICBs b25nJiBpd29yZChpbnQpOwogICAgbG9uZyBpd29yZChpbnQpIGNvbnN0OwoKCgoKCgoKCgogICAg IAogICAgY2xhc3MgSW5pdCB7CiAgICBwdWJsaWM6CiAgICAgIEluaXQgKCkgeyB9CiAgICB9OwoK ICBwcm90ZWN0ZWQ6CiAgICBpbmxpbmUgaW9zKHN0cmVhbWJ1Ziogc2IgPSAwLCBvc3RyZWFtKiB0 aWVfdG8gPSAwKTsKICAgIGlubGluZSB2aXJ0dWFsIH5pb3MoKTsKICAgIGlubGluZSB2b2lkIGlu aXQoc3RyZWFtYnVmKiBzYiwgb3N0cmVhbSogdGllID0gMCk7Cn07CgoKCgp0eXBlZGVmIGlvczo6 c2Vla19kaXIgX3NlZWtfZGlyOwoKCiAKIAogCiAKIAoKIAogCmNsYXNzIHN0cmVhbW1hcmtlciA6 IHByaXZhdGUgX0lPX21hcmtlciB7CiAgICBmcmllbmQgY2xhc3Mgc3RyZWFtYnVmOwogICAgdm9p ZCBzZXRfb2Zmc2V0KGludCBvZmZzZXQpIHsgX3BvcyA9IG9mZnNldDsgfQogIHB1YmxpYzoKICAg IHN0cmVhbW1hcmtlcihzdHJlYW1idWYgKnNiKTsKICAgIH5zdHJlYW1tYXJrZXIoKTsKICAgIGlu dCBzYXZpbmcoKSB7IHJldHVybiAgMTsgfQogICAgaW50IGRlbHRhKHN0cmVhbW1hcmtlciYpOwog ICAgaW50IGRlbHRhKCk7Cn07CgpzdHJ1Y3Qgc3RyZWFtYnVmIDogcHVibGljIF9JT19GSUxFIHsg IAogICAgZnJpZW5kIGNsYXNzIGlvczsKICAgIGZyaWVuZCBjbGFzcyBpc3RyZWFtOwogICAgZnJp ZW5kIGNsYXNzIG9zdHJlYW07CiAgICBmcmllbmQgY2xhc3Mgc3RyZWFtbWFya2VyOwogICAgY29u c3Qgdm9pZCAqJl92dGFibGUoKSB7IHJldHVybiAqKGNvbnN0IHZvaWQqKikoKF9JT19GSUxFKil0 aGlzICsgMSk7IH0KICBwcm90ZWN0ZWQ6CiAgICBzdGF0aWMgc3RyZWFtYnVmKiBfbGlzdF9hbGw7 ICAKICAgIF9JT19GSUxFKiYgeGNoYWluKCkgeyByZXR1cm4gX2NoYWluOyB9CiAgICB2b2lkIF91 bl9saW5rKCk7CiAgICB2b2lkIF9saW5rX2luKCk7CiAgICBjaGFyKiBncHRyKCkgY29uc3QKICAg ICAgeyByZXR1cm4gX2ZsYWdzICAmIDB4MTAwICA/IF9JT19zYXZlX2Jhc2UgOiBfSU9fcmVhZF9w dHI7IH0KICAgIGNoYXIqIHBwdHIoKSBjb25zdCB7IHJldHVybiBfSU9fd3JpdGVfcHRyOyB9CiAg ICBjaGFyKiBlZ3B0cigpIGNvbnN0CiAgICAgIHsgcmV0dXJuIF9mbGFncyAgJiAweDEwMCAgPyBf SU9fc2F2ZV9lbmQgOiBfSU9fcmVhZF9lbmQ7IH0KICAgIGNoYXIqIGVwcHRyKCkgY29uc3QgeyBy ZXR1cm4gX0lPX3dyaXRlX2VuZDsgfQogICAgY2hhciogcGJhc2UoKSBjb25zdCB7IHJldHVybiBf SU9fd3JpdGVfYmFzZTsgfQogICAgY2hhciogZWJhY2soKSBjb25zdAogICAgICB7IHJldHVybiBf ZmxhZ3MgICYgMHgxMDAgID8gX0lPX3NhdmVfYmFzZSA6IF9JT19yZWFkX2Jhc2U7fQogICAgY2hh ciogYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9JT19idWZfYmFzZTsgfQogICAgY2hhciogZWJ1Zigp IGNvbnN0IHsgcmV0dXJuIF9JT19idWZfZW5kOyB9CiAgICBpbnQgYmxlbigpIGNvbnN0IHsgcmV0 dXJuIF9JT19idWZfZW5kIC0gX0lPX2J1Zl9iYXNlOyB9CiAgICB2b2lkIHhwdXRfY2hhcihjaGFy IGMpIHsgKl9JT193cml0ZV9wdHIrKyA9IGM7IH0KICAgIGludCB4ZmxhZ3MoKSB7IHJldHVybiBf ZmxhZ3MgOyB9CiAgICBpbnQgeGZsYWdzKGludCBmKSB7aW50IGZsID0gX2ZsYWdzIDsgX2ZsYWdz ICA9IGY7IHJldHVybiBmbDt9CiAgICB2b2lkIHhzZXRmbGFncyhpbnQgZikgeyBfZmxhZ3MgIHw9 IGY7IH0KICAgIHZvaWQgeHNldGZsYWdzKGludCBmLCBpbnQgbWFzaykKICAgICAgeyBfZmxhZ3Mg ID0gKF9mbGFncyAgJiB+bWFzaykgfCAoZiAmIG1hc2spOyB9CiAgICB2b2lkIGdidW1wKGludCBu KQogICAgICB7IF9mbGFncyAgJiAweDEwMCAgPyAoX0lPX3NhdmVfYmFzZSs9bik6KF9JT19yZWFk X3B0cis9bik7fQogICAgdm9pZCBwYnVtcChpbnQgbikgeyBfSU9fd3JpdGVfcHRyICs9IG47IH0K ICAgIHZvaWQgc2V0YihjaGFyKiBiLCBjaGFyKiBlYiwgaW50IGE9MCk7CiAgICB2b2lkIHNldHAo Y2hhciogcCwgY2hhciogZXApCiAgICAgIHsgX0lPX3dyaXRlX2Jhc2U9X0lPX3dyaXRlX3B0cj1w OyBfSU9fd3JpdGVfZW5kPWVwOyB9CiAgICB2b2lkIHNldGcoY2hhciogZWIsIGNoYXIqIGcsIGNo YXIgKmVnKSB7CiAgICAgIGlmIChfZmxhZ3MgICYgMHgxMDAgKSBfSU9fZnJlZV9iYWNrdXBfYXJl YSh0aGlzKTsgCiAgICAgIF9JT19yZWFkX2Jhc2UgPSBlYjsgX0lPX3JlYWRfcHRyID0gZzsgX0lP X3JlYWRfZW5kID0gZWc7IH0KICAgIGNoYXIgKnNob3J0YnVmKCkgeyByZXR1cm4gX3Nob3J0YnVm OyB9CgogICAgaW50IGluX2JhY2t1cCgpIHsgcmV0dXJuIF9mbGFncyAmIDB4MTAwIDsgfQogICAg IAogICAgY2hhciAqR2Jhc2UoKSB7IHJldHVybiBpbl9iYWNrdXAoKSA/IF9JT19zYXZlX2Jhc2Ug OiBfSU9fcmVhZF9iYXNlOyB9CiAgICAgCiAgICBjaGFyICplR3B0cigpIHsgcmV0dXJuIGluX2Jh Y2t1cCgpID8gX0lPX3NhdmVfZW5kIDogX0lPX3JlYWRfZW5kOyB9CiAgICAgCiAgICBjaGFyICpC YmFzZSgpIHsgcmV0dXJuIGluX2JhY2t1cCgpID8gX0lPX3JlYWRfYmFzZSA6IF9JT19zYXZlX2Jh c2U7IH0KICAgIGNoYXIgKkJwdHIoKSB7IHJldHVybiBfSU9fYmFja3VwX2Jhc2U7IH0KICAgICAK ICAgIGNoYXIgKmVCcHRyKCkgeyByZXR1cm4gaW5fYmFja3VwKCkgPyBfSU9fcmVhZF9lbmQgOiBf SU9fc2F2ZV9lbmQ7IH0KICAgIGNoYXIgKk5iYXNlKCkgeyByZXR1cm4gX0lPX3NhdmVfYmFzZTsg fQogICAgY2hhciAqZU5wdHIoKSB7IHJldHVybiBfSU9fc2F2ZV9lbmQ7IH0KICAgIGludCBoYXZl X2JhY2t1cCgpIHsgcmV0dXJuIF9JT19zYXZlX2Jhc2UgIT0gX19udWxsIDsgfQogICAgaW50IGhh dmVfbWFya2VycygpIHsgcmV0dXJuIF9tYXJrZXJzICE9IF9fbnVsbCA7IH0KICAgIHZvaWQgZnJl ZV9iYWNrdXBfYXJlYSgpOwogICAgdm9pZCB1bnNhdmVfbWFya2VycygpOyAgCiAgICBpbnQgcHV0 X21vZGUoKSB7IHJldHVybiBfZmxhZ3MgJiAweDgwMCA7IH0KICAgIGludCBzd2l0Y2hfdG9fZ2V0 X21vZGUoKTsKICAgIAogICAgc3RyZWFtYnVmKGludCBmbGFncz0wKTsKICBwdWJsaWM6CiAgICBz dGF0aWMgaW50IGZsdXNoX2FsbCgpOwogICAgc3RhdGljIHZvaWQgZmx1c2hfYWxsX2xpbmVidWZm ZXJlZCgpOyAgCiAgICB2aXJ0dWFsIH5zdHJlYW1idWYoKTsKICAgIHZpcnR1YWwgaW50IG92ZXJm bG93KGludCBjID0gKC0xKSApOyAgCiAgICB2aXJ0dWFsIGludCB1bmRlcmZsb3coKTsgIAogICAg dmlydHVhbCBpbnQgdWZsb3coKTsgIAogICAgdmlydHVhbCBpbnQgcGJhY2tmYWlsKGludCBjKTsK IAogICAgdmlydHVhbCBzdHJlYW1zaXplIHhzcHV0bihjb25zdCBjaGFyKiBzLCBzdHJlYW1zaXpl IG4pOwogICAgdmlydHVhbCBzdHJlYW1zaXplIHhzZ2V0bihjaGFyKiBzLCBzdHJlYW1zaXplIG4p OwogICAgdmlydHVhbCBzdHJlYW1wb3Mgc2Vla29mZihzdHJlYW1vZmYsIF9zZWVrX2RpciwgaW50 IG1vZGU9aW9zOjppbnxpb3M6Om91dCk7CiAgICB2aXJ0dWFsIHN0cmVhbXBvcyBzZWVrcG9zKHN0 cmVhbXBvcyBwb3MsIGludCBtb2RlID0gaW9zOjppbnxpb3M6Om91dCk7CgogICAgc3RyZWFtcG9z IHB1YnNlZWtvZmYoc3RyZWFtb2ZmIG8sIF9zZWVrX2RpciBkLCBpbnQgbW9kZT1pb3M6OmlufGlv czo6b3V0KQogICAgICB7IHJldHVybiBfSU9fc2Vla29mZiAodGhpcywgbywgZCwgbW9kZSk7IH0K ICAgIHN0cmVhbXBvcyBwdWJzZWVrcG9zKHN0cmVhbXBvcyBwb3MsIGludCBtb2RlID0gaW9zOjpp bnxpb3M6Om91dCkKICAgICAgeyByZXR1cm4gX0lPX3NlZWtwb3MgKHRoaXMsIHBvcywgbW9kZSk7 IH0KICAgIHN0cmVhbXBvcyBzc2Vla29mZihzdHJlYW1vZmYsIF9zZWVrX2RpciwgaW50IG1vZGU9 aW9zOjppbnxpb3M6Om91dCk7CiAgICBzdHJlYW1wb3Mgc3NlZWtwb3Moc3RyZWFtcG9zIHBvcywg aW50IG1vZGUgPSBpb3M6OmlufGlvczo6b3V0KTsKICAgIHZpcnR1YWwgc3RyZWFtYnVmKiBzZXRi dWYoY2hhciogcCwgaW50IGxlbik7CiAgICB2aXJ0dWFsIGludCBzeW5jKCk7CiAgICB2aXJ0dWFs IGludCBkb2FsbG9jYXRlKCk7CgogICAgaW50IHNlZWttYXJrKHN0cmVhbW1hcmtlciYgbWFyaywg aW50IGRlbHRhID0gMCk7CiAgICBpbnQgc3B1dGJhY2tjKGNoYXIgYyk7CiAgICBpbnQgc3VuZ2V0 YygpOwogICAgaW50IHVuYnVmZmVyZWQoKSB7IHJldHVybiBfZmxhZ3MgJiAyICA/IDEgOiAwOyB9 CiAgICBpbnQgbGluZWJ1ZmZlcmVkKCkgeyByZXR1cm4gX2ZsYWdzICYgMHgyMDAgID8gMSA6IDA7 IH0KICAgIHZvaWQgdW5idWZmZXJlZChpbnQgaSkKCXsgaWYgKGkpIF9mbGFncyB8PSAyIDsgZWxz ZSBfZmxhZ3MgJj0gfjIgOyB9CiAgICB2b2lkIGxpbmVidWZmZXJlZChpbnQgaSkKCXsgaWYgKGkp IF9mbGFncyB8PSAweDIwMCA7IGVsc2UgX2ZsYWdzICY9IH4weDIwMCA7IH0KICAgIGludCBhbGxv Y2F0ZSgpIHsgIAoJaWYgKGJhc2UoKSB8fCB1bmJ1ZmZlcmVkKCkpIHJldHVybiAwOwoJZWxzZSBy ZXR1cm4gZG9hbGxvY2F0ZSgpOyB9CiAgICAgCiAgICB2b2lkIGFsbG9jYnVmKCkgeyBpZiAoYmFz ZSgpID09IF9fbnVsbCApIGRvYWxsb2NidWYoKTsgfQogICAgdm9pZCBkb2FsbG9jYnVmKCk7CiAg ICBpbnQgaW5fYXZhaWwoKSB7IHJldHVybiBfSU9fcmVhZF9lbmQgLSBfSU9fcmVhZF9wdHI7IH0K ICAgIGludCBvdXRfd2FpdGluZygpIHsgcmV0dXJuIF9JT193cml0ZV9wdHIgLSBfSU9fd3JpdGVf YmFzZTsgfQogICAgc3RyZWFtc2l6ZSBzcHV0bihjb25zdCBjaGFyKiBzLCBzdHJlYW1zaXplIG4p IHsgcmV0dXJuIHhzcHV0bihzLCBuKTsgfQogICAgc3RyZWFtc2l6ZSBwYWRuKGNoYXIgcGFkLCBz dHJlYW1zaXplIG4pIHsgcmV0dXJuIF9JT19wYWRuKHRoaXMsIHBhZCwgbik7IH0KICAgIHN0cmVh bXNpemUgc2dldG4oY2hhciogcywgc3RyZWFtc2l6ZSBuKSB7IHJldHVybiBfSU9fc2dldG4odGhp cywgcywgbik7IH0KICAgIGludCBpZ25vcmUoaW50KTsKICAgIGludCBnZXRfY29sdW1uKCk7CiAg ICBpbnQgc2V0X2NvbHVtbihpbnQpOwogICAgbG9uZyBzZ2V0bGluZShjaGFyKiBidWYsIF9HX3Np emVfdCAgbiwgY2hhciBkZWxpbSwgaW50IHB1dGJhY2tfZGVsaW0pOwogICAgaW50IHNwdXRjKGlu dCBjKSB7IHJldHVybiBfSU9fcHV0YyhjLCB0aGlzKTsgfQogICAgaW50IHNidW1wYygpIHsgcmV0 dXJuIF9JT19nZXRjKHRoaXMpOyB9CiAgICBpbnQgc2dldGMoKSB7IHJldHVybiAoKCAgdGhpcyAg KS0+X0lPX3JlYWRfcHRyID49ICggIHRoaXMgICktPl9JT19yZWFkX2VuZCAmJiBfX3VuZGVyZmxv dyAoICB0aGlzICApID09ICgtMSkgID8gKC0xKSAgOiAqKHVuc2lnbmVkIGNoYXIgKikgKCAgdGhp cyAgKS0+X0lPX3JlYWRfcHRyKSAgOyB9CiAgICBpbnQgc25leHRjKCkgewoJaWYgKF9JT19yZWFk X3B0ciA+PSBfSU9fcmVhZF9lbmQgJiYgX191bmRlcmZsb3codGhpcykgPT0gKC0xKSApCgkgIHJl dHVybiAoLTEpIDsKCWVsc2UgcmV0dXJuIF9JT19yZWFkX3B0cisrLCBzZ2V0YygpOyB9CiAgICB2 b2lkIHN0b3NzYygpIHsgaWYgKF9JT19yZWFkX3B0ciA8IF9JT19yZWFkX2VuZCkgX0lPX3JlYWRf cHRyKys7IH0KICAgIGludCB2c2NhbihjaGFyIGNvbnN0ICpmbXQwLCBfR192YV9saXN0ICBhcCwg aW9zKiBzdHJlYW0gPSBfX251bGwgKTsKICAgIGludCBzY2FuKGNoYXIgY29uc3QgKmZtdDAgLi4u KTsKICAgIGludCB2Zm9ybShjaGFyIGNvbnN0ICpmbXQwLCBfR192YV9saXN0ICBhcCk7CiAgICBp bnQgZm9ybShjaGFyIGNvbnN0ICpmbXQwIC4uLik7CgoKCgogICAgdmlydHVhbCBzdHJlYW1zaXpl IHN5c19yZWFkKGNoYXIqIGJ1Ziwgc3RyZWFtc2l6ZSBzaXplKTsKICAgIHZpcnR1YWwgc3RyZWFt c2l6ZSBzeXNfd3JpdGUoY29uc3QgY2hhciosIHN0cmVhbXNpemUpOwogICAgdmlydHVhbCBzdHJl YW1wb3Mgc3lzX3NlZWsoc3RyZWFtb2ZmLCBfc2Vla19kaXIpOwogICAgdmlydHVhbCBpbnQgc3lz X2Nsb3NlKCk7CiAgICB2aXJ0dWFsIGludCBzeXNfc3RhdCh2b2lkKik7ICAKCgoKCn07CgogCiAK CmNsYXNzIGZpbGVidWYgOiBwdWJsaWMgc3RyZWFtYnVmIHsKICBwcm90ZWN0ZWQ6CiAgICB2b2lk IGluaXQoKTsKICBwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50IG9wZW5wcm90OyAgCiAgICBm aWxlYnVmKCk7CiAgICBmaWxlYnVmKGludCBmZCk7CiAgICBmaWxlYnVmKGludCBmZCwgY2hhciog cCwgaW50IGxlbik7CgoKCiAgICB+ZmlsZWJ1ZigpOwogICAgZmlsZWJ1ZiogYXR0YWNoKGludCBm ZCk7CiAgICBmaWxlYnVmKiBvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpt b2RlKTsKICAgIGZpbGVidWYqIG9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGlvczo6b3Blbm1v ZGUgbW9kZSwgaW50IHByb3QgPSAwNjY0KTsKICAgIHZpcnR1YWwgaW50IHVuZGVyZmxvdygpOwog ICAgdmlydHVhbCBpbnQgb3ZlcmZsb3coaW50IGMgPSAoLTEpICk7CiAgICBpbnQgaXNfb3Blbigp IGNvbnN0IHsgcmV0dXJuIF9maWxlbm8gPj0gMDsgfQogICAgaW50IGZkKCkgY29uc3QgeyByZXR1 cm4gaXNfb3BlbigpID8gX2ZpbGVubyA6ICgtMSkgOyB9CiAgICBmaWxlYnVmKiBjbG9zZSgpOwog ICAgdmlydHVhbCBpbnQgZG9hbGxvY2F0ZSgpOwogICAgdmlydHVhbCBzdHJlYW1wb3Mgc2Vla29m ZihzdHJlYW1vZmYsIF9zZWVrX2RpciwgaW50IG1vZGU9aW9zOjppbnxpb3M6Om91dCk7CiAgICB2 aXJ0dWFsIHN0cmVhbWJ1Ziogc2V0YnVmKGNoYXIqIHAsIGludCBsZW4pOwogICAgc3RyZWFtc2l6 ZSB4c3B1dG4oY29uc3QgY2hhciogcywgc3RyZWFtc2l6ZSBuKTsKICAgIHN0cmVhbXNpemUgeHNn ZXRuKGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CiAgICB2aXJ0dWFsIGludCBzeW5jKCk7CiAgcHJv dGVjdGVkOiAgCiAKICAgIGludCBpc19yZWFkaW5nKCkgeyByZXR1cm4gZWJhY2soKSAhPSBlZ3B0 cigpOyB9CiAgICBjaGFyKiBjdXJfcHRyKCkgeyByZXR1cm4gaXNfcmVhZGluZygpID8gIGdwdHIo KSA6IHBwdHIoKTsgfQogICAgIAogICAgY2hhciogZmlsZV9wdHIoKSB7IHJldHVybiBlR3B0cigp OyB9CiAgICAgCiAgICB2aXJ0dWFsIHN0cmVhbXNpemUgc3lzX3JlYWQoY2hhciogYnVmLCBzdHJl YW1zaXplIHNpemUpOwogICAgdmlydHVhbCBzdHJlYW1wb3Mgc3lzX3NlZWsoc3RyZWFtb2ZmLCBf c2Vla19kaXIpOwogICAgdmlydHVhbCBzdHJlYW1zaXplIHN5c193cml0ZShjb25zdCBjaGFyKiwg c3RyZWFtc2l6ZSk7CiAgICB2aXJ0dWFsIGludCBzeXNfc3RhdCh2b2lkKik7ICAKICAgIHZpcnR1 YWwgaW50IHN5c19jbG9zZSgpOwoKCgoKfTsKCmlubGluZSB2b2lkIGlvczo6aW5pdChzdHJlYW1i dWYqIHNiLCBvc3RyZWFtKiB0aWVfdG8pIHsKCQlfc3RhdGUgPSBzYiA/IGlvczo6Z29vZGJpdCA6 IGlvczo6YmFkYml0OyBfZXhjZXB0aW9ucz0wOwoJCV9zdHJidWY9c2I7IF90aWUgPSB0aWVfdG87 IF93aWR0aD0wOyBfZmlsbD0nICc7CgoJCV9mbGFncz1pb3M6OnNraXB3c3xpb3M6OmRlYzsKCgoK CQlfcHJlY2lzaW9uPTY7IF9hcnJheXMgPSAwOyB9CgppbmxpbmUgaW9zOjppb3Moc3RyZWFtYnVm KiBzYiwgb3N0cmVhbSogdGllX3RvKSB7IGluaXQoc2IsIHRpZV90byk7IH0KCmlubGluZSBpb3M6 On5pb3MoKSB7CgoKCiAgICAgCiAgICAgCiAgICBvcGVyYXRvciBkZWxldGVbXSAoX2FycmF5cyk7 Cn0KfSAgCgojIDMxICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2dj Yy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9pb3N0cmVhbS5oIiAyIDMKCgpleHRlcm4gIkMrKyIgewpjbGFzcyBpc3RyZWFtOyBjbGFz cyBvc3RyZWFtOwp0eXBlZGVmIGlvcyYgKCpfX21hbmlwKShpb3MmKTsKdHlwZWRlZiBpc3RyZWFt JiAoKl9faW1hbmlwKShpc3RyZWFtJik7CnR5cGVkZWYgb3N0cmVhbSYgKCpfX29tYW5pcCkob3N0 cmVhbSYpOwoKZXh0ZXJuIGlzdHJlYW0mIHdzKGlzdHJlYW0mIGlucyk7CmV4dGVybiBvc3RyZWFt JiBmbHVzaChvc3RyZWFtJiBvdXRzKTsKZXh0ZXJuIG9zdHJlYW0mIGVuZGwob3N0cmVhbSYgb3V0 cyk7CmV4dGVybiBvc3RyZWFtJiBlbmRzKG9zdHJlYW0mIG91dHMpOwoKY2xhc3Mgb3N0cmVhbSA6 IHZpcnR1YWwgcHVibGljIGlvcwp7CiAgICAgCiAgICB2b2lkIGRvX29zZngoKTsKICBwdWJsaWM6 CiAgICBvc3RyZWFtKCkgeyB9CiAgICBvc3RyZWFtKHN0cmVhbWJ1Ziogc2IsIG9zdHJlYW0qIHRp ZWQ9IF9fbnVsbCApOwogICAgaW50IG9wZngoKSB7CglpZiAoIWdvb2QoKSkgcmV0dXJuIDA7Cgll bHNlIHsgaWYgKF90aWUpIF90aWUtPmZsdXNoKCk7ICA7IHJldHVybiAxO30gfQogICAgdm9pZCBv c2Z4KCkgeyAgOwoJCSAgaWYgKGZsYWdzKCkgJiAoaW9zOjp1bml0YnVmfGlvczo6c3RkaW8pKQoJ CSAgICAgIGRvX29zZngoKTsgfQogICAgb3N0cmVhbSYgZmx1c2goKTsKICAgIG9zdHJlYW0mIHB1 dChjaGFyIGMpIHsgX3N0cmJ1Zi0+c3B1dGMoYyk7IHJldHVybiAqdGhpczsgfQoKCgoKCiAgICBv c3RyZWFtJiB3cml0ZShjb25zdCBjaGFyICpzLCBzdHJlYW1zaXplIG4pOwogICAgb3N0cmVhbSYg d3JpdGUoY29uc3QgdW5zaWduZWQgY2hhciAqcywgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJldHVy biB3cml0ZSgoY29uc3QgY2hhciopcywgbik7fQogICAgb3N0cmVhbSYgd3JpdGUoY29uc3Qgc2ln bmVkIGNoYXIgKnMsIHN0cmVhbXNpemUgbikKICAgICAgeyByZXR1cm4gd3JpdGUoKGNvbnN0IGNo YXIqKXMsIG4pO30KICAgIG9zdHJlYW0mIHdyaXRlKGNvbnN0IHZvaWQgKnMsIHN0cmVhbXNpemUg bikKICAgICAgeyByZXR1cm4gd3JpdGUoKGNvbnN0IGNoYXIqKXMsIG4pO30KICAgIG9zdHJlYW0m IHNlZWtwKHN0cmVhbXBvcyk7CiAgICBvc3RyZWFtJiBzZWVrcChzdHJlYW1vZmYsIF9zZWVrX2Rp cik7CiAgICBzdHJlYW1wb3MgdGVsbHAoKTsKICAgIG9zdHJlYW0mIGZvcm0oY29uc3QgY2hhciAq Zm9ybWF0IC4uLik7CiAgICBvc3RyZWFtJiB2Zm9ybShjb25zdCBjaGFyICpmb3JtYXQsIF9HX3Zh X2xpc3QgIGFyZ3MpOwoKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoY2hhciBjKTsKICAgIG9zdHJl YW0mIG9wZXJhdG9yPDwodW5zaWduZWQgY2hhciBjKSB7IHJldHVybiAoKnRoaXMpIDw8IChjaGFy KWM7IH0KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoc2lnbmVkIGNoYXIgYykgeyByZXR1cm4gKCp0 aGlzKSA8PCAoY2hhciljOyB9CiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGNvbnN0IGNoYXIgKnMp OwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCB1bnNpZ25lZCBjaGFyICpzKQoJeyByZXR1 cm4gKCp0aGlzKSA8PCAoY29uc3QgY2hhciopczsgfQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChj b25zdCBzaWduZWQgY2hhciAqcykKCXsgcmV0dXJuICgqdGhpcykgPDwgKGNvbnN0IGNoYXIqKXM7 IH0KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoY29uc3Qgdm9pZCAqcCk7CiAgICBvc3RyZWFtJiBv cGVyYXRvcjw8KGludCBuKTsKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgaW50IG4p OwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChsb25nIG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8 PCh1bnNpZ25lZCBsb25nIG4pOwoKICAgIF9fZXh0ZW5zaW9uX18gb3N0cmVhbSYgb3BlcmF0b3I8 PChsb25nIGxvbmcgbik7CiAgICBfX2V4dGVuc2lvbl9fIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5z aWduZWQgbG9uZyBsb25nIG4pOwoKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoc2hvcnQgbikge3Jl dHVybiBvcGVyYXRvcjw8KChpbnQpbik7fQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25l ZCBzaG9ydCBuKSB7cmV0dXJuIG9wZXJhdG9yPDwoKHVuc2lnbmVkIGludCluKTt9CgogICAgb3N0 cmVhbSYgb3BlcmF0b3I8PChib29sIGIpIHsgcmV0dXJuIG9wZXJhdG9yPDwoKGludCliKTsgfQoK ICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoZG91YmxlIG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8 PChmbG9hdCBuKSB7IHJldHVybiBvcGVyYXRvcjw8KChkb3VibGUpbik7IH0KCgoKICAgIG9zdHJl YW0mIG9wZXJhdG9yPDwobG9uZyBkb3VibGUgbikgeyByZXR1cm4gb3BlcmF0b3I8PCgoZG91Ymxl KW4pOyB9CgogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChfX29tYW5pcCBmdW5jKSB7IHJldHVybiAo KmZ1bmMpKCp0aGlzKTsgfQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChfX21hbmlwIGZ1bmMpIHso KmZ1bmMpKCp0aGlzKTsgcmV0dXJuICp0aGlzO30KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoc3Ry ZWFtYnVmKik7CgoKCn07CgpjbGFzcyBpc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgaW9zCnsKICAg ICAKcHJvdGVjdGVkOgogICAgX0dfc2l6ZV90ICBfZ2NvdW50OwoKICAgIGludCBfc2tpcF93cygp OwogIHB1YmxpYzoKICAgIGlzdHJlYW0oKTogX2djb3VudCAoMCkgeyB9CiAgICBpc3RyZWFtKHN0 cmVhbWJ1Ziogc2IsIG9zdHJlYW0qdGllZD0gX19udWxsICk7CiAgICBpc3RyZWFtJiBnZXQoY2hh ciogcHRyLCBpbnQgbGVuLCBjaGFyIGRlbGltID0gJ1xuJyk7CiAgICBpc3RyZWFtJiBnZXQodW5z aWduZWQgY2hhciogcHRyLCBpbnQgbGVuLCBjaGFyIGRlbGltID0gJ1xuJykKCXsgcmV0dXJuIGdl dCgoY2hhciopcHRyLCBsZW4sIGRlbGltKTsgfQogICAgaXN0cmVhbSYgZ2V0KGNoYXImIGMpOwog ICAgaXN0cmVhbSYgZ2V0KHVuc2lnbmVkIGNoYXImIGMpIHsgcmV0dXJuIGdldCgoY2hhciYpYyk7 IH0KICAgIGlzdHJlYW0mIGdldGxpbmUoY2hhciogcHRyLCBpbnQgbGVuLCBjaGFyIGRlbGltID0g J1xuJyk7CiAgICBpc3RyZWFtJiBnZXRsaW5lKHVuc2lnbmVkIGNoYXIqIHB0ciwgaW50IGxlbiwg Y2hhciBkZWxpbSA9ICdcbicpCgl7IHJldHVybiBnZXRsaW5lKChjaGFyKilwdHIsIGxlbiwgZGVs aW0pOyB9CiAgICBpc3RyZWFtJiBnZXQoc2lnbmVkIGNoYXImIGMpICB7IHJldHVybiBnZXQoKGNo YXImKWMpOyB9CiAgICBpc3RyZWFtJiBnZXQoc2lnbmVkIGNoYXIqIHB0ciwgaW50IGxlbiwgY2hh ciBkZWxpbSA9ICdcbicpCgl7IHJldHVybiBnZXQoKGNoYXIqKXB0ciwgbGVuLCBkZWxpbSk7IH0K ICAgIGlzdHJlYW0mIGdldGxpbmUoc2lnbmVkIGNoYXIqIHB0ciwgaW50IGxlbiwgY2hhciBkZWxp bSA9ICdcbicpCgl7IHJldHVybiBnZXRsaW5lKChjaGFyKilwdHIsIGxlbiwgZGVsaW0pOyB9CiAg ICBpc3RyZWFtJiByZWFkKGNoYXIgKnB0ciwgc3RyZWFtc2l6ZSBuKTsKICAgIGlzdHJlYW0mIHJl YWQodW5zaWduZWQgY2hhciAqcHRyLCBzdHJlYW1zaXplIG4pCiAgICAgIHsgcmV0dXJuIHJlYWQo KGNoYXIqKXB0ciwgbik7IH0KICAgIGlzdHJlYW0mIHJlYWQoc2lnbmVkIGNoYXIgKnB0ciwgc3Ry ZWFtc2l6ZSBuKQogICAgICB7IHJldHVybiByZWFkKChjaGFyKilwdHIsIG4pOyB9CiAgICBpc3Ry ZWFtJiByZWFkKHZvaWQgKnB0ciwgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJldHVybiByZWFkKChj aGFyKilwdHIsIG4pOyB9CiAgICBpc3RyZWFtJiBnZXQoc3RyZWFtYnVmJiBzYiwgY2hhciBkZWxp bSA9ICdcbicpOwogICAgaXN0cmVhbSYgZ2V0cyhjaGFyICoqcywgY2hhciBkZWxpbSA9ICdcbicp OwogICAgaW50IGlwZngoaW50IG5lZWQgPSAwKSB7CglpZiAoIWdvb2QoKSkgeyBzZXQoaW9zOjpm YWlsYml0KTsgcmV0dXJuIDA7IH0KCWVsc2UgewoJICAgOwoJICBpZiAoX3RpZSAmJiAobmVlZCA9 PSAwIHx8IHJkYnVmKCktPmluX2F2YWlsKCkgPCBuZWVkKSkgX3RpZS0+Zmx1c2goKTsKCSAgaWYg KCFuZWVkICYmIChmbGFncygpICYgaW9zOjpza2lwd3MpKSByZXR1cm4gX3NraXBfd3MoKTsKCSAg ZWxzZSByZXR1cm4gMTsKCX0KICAgIH0KICAgIGludCBpcGZ4MCgpIHsgIAoJaWYgKCFnb29kKCkp IHsgc2V0KGlvczo6ZmFpbGJpdCk7IHJldHVybiAwOyB9CgllbHNlIHsKCSAgIDsKCSAgaWYgKF90 aWUpIF90aWUtPmZsdXNoKCk7CgkgIGlmIChmbGFncygpICYgaW9zOjpza2lwd3MpIHJldHVybiBf c2tpcF93cygpOwoJICBlbHNlIHJldHVybiAxOwoJfQogICAgfQogICAgaW50IGlwZngxKCkgeyAg CglpZiAoIWdvb2QoKSkgeyBzZXQoaW9zOjpmYWlsYml0KTsgcmV0dXJuIDA7IH0KCWVsc2UgewoJ ICAgOwoJICBpZiAoX3RpZSAmJiByZGJ1ZigpLT5pbl9hdmFpbCgpID09IDApIF90aWUtPmZsdXNo KCk7CgkgIHJldHVybiAxOwoJfQogICAgfQogICAgdm9pZCBpc2Z4KCkgeyAgOyB9CiAgICBpbnQg Z2V0KCkgeyBpZiAoIWlwZngxKCkpIHJldHVybiAoLTEpIDsKCQllbHNlIHsgaW50IGNoID0gX3N0 cmJ1Zi0+c2J1bXBjKCk7CgkJICAgICAgIGlmIChjaCA9PSAoLTEpICkgc2V0KGlvczo6ZW9mYml0 KTsKCQkgICAgICAgaXNmeCgpOwoJCSAgICAgICByZXR1cm4gY2g7CgkJICAgICB9IH0KICAgIGlu dCBwZWVrKCk7CiAgICBfR19zaXplX3QgIGdjb3VudCgpIHsgcmV0dXJuIF9nY291bnQ7IH0KICAg IGlzdHJlYW0mIGlnbm9yZShpbnQgbj0xLCBpbnQgZGVsaW0gPSAoLTEpICk7CiAgICBpbnQgc3lu YyAoKTsKICAgIGlzdHJlYW0mIHNlZWtnKHN0cmVhbXBvcyk7CiAgICBpc3RyZWFtJiBzZWVrZyhz dHJlYW1vZmYsIF9zZWVrX2Rpcik7CiAgICBzdHJlYW1wb3MgdGVsbGcoKTsKICAgIGlzdHJlYW0m IHB1dGJhY2soY2hhciBjaCkgewoJaWYgKGdvb2QoKSAmJiBfc3RyYnVmLT5zcHV0YmFja2MoY2gp ID09ICgtMSkgKSBjbGVhcihpb3M6OmJhZGJpdCk7CglyZXR1cm4gKnRoaXM7fQogICAgaXN0cmVh bSYgdW5nZXQoKSB7CglpZiAoZ29vZCgpICYmIF9zdHJidWYtPnN1bmdldGMoKSA9PSAoLTEpICkg Y2xlYXIoaW9zOjpiYWRiaXQpOwoJcmV0dXJuICp0aGlzO30KICAgIGlzdHJlYW0mIHNjYW4oY29u c3QgY2hhciAqZm9ybWF0IC4uLik7CiAgICBpc3RyZWFtJiB2c2Nhbihjb25zdCBjaGFyICpmb3Jt YXQsIF9HX3ZhX2xpc3QgIGFyZ3MpOwoKCgoKCgogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihjaGFy Kik7CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIGNoYXIqIHApIHsgcmV0dXJuIG9w ZXJhdG9yPj4oKGNoYXIqKXApOyB9CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHNpZ25lZCBjaGFy KnApIHsgcmV0dXJuIG9wZXJhdG9yPj4oKGNoYXIqKXApOyB9CiAgICBpc3RyZWFtJiBvcGVyYXRv cj4+KGNoYXImIGMpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBjaGFyJiBjKSB7 cmV0dXJuIG9wZXJhdG9yPj4oKGNoYXImKWMpO30KICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4oc2ln bmVkIGNoYXImIGMpIHtyZXR1cm4gb3BlcmF0b3I+PigoY2hhciYpYyk7fQogICAgaXN0cmVhbSYg b3BlcmF0b3I+PihpbnQmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4obG9uZyYpOwoKICAgIF9f ZXh0ZW5zaW9uX18gaXN0cmVhbSYgb3BlcmF0b3I+Pihsb25nIGxvbmcmKTsKICAgIF9fZXh0ZW5z aW9uX18gaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nIGxvbmcmKTsKCiAgICBpc3Ry ZWFtJiBvcGVyYXRvcj4+KHNob3J0Jik7CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVk IGludCYpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nJik7CiAgICBpc3Ry ZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0Jik7CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+ Pihib29sJik7CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihmbG9hdCYpOwogICAgaXN0cmVhbSYg b3BlcmF0b3I+Pihkb3VibGUmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4obG9uZyBkb3VibGUm KTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4oIF9fbWFuaXAgZnVuYykgeygqZnVuYykoKnRoaXMp OyByZXR1cm4gKnRoaXM7fQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihfX2ltYW5pcCBmdW5jKSB7 IHJldHVybiAoKmZ1bmMpKCp0aGlzKTsgfQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihzdHJlYW1i dWYqKTsKfTsKCmNsYXNzIGlvc3RyZWFtIDogcHVibGljIGlzdHJlYW0sIHB1YmxpYyBvc3RyZWFt CnsKICBwdWJsaWM6CiAgICBpb3N0cmVhbSgpIHsgfQogICAgaW9zdHJlYW0oc3RyZWFtYnVmKiBz Yiwgb3N0cmVhbSp0aWVkPSBfX251bGwgKTsKfTsKCmNsYXNzIF9JT19pc3RyZWFtX3dpdGhhc3Np Z24gOiBwdWJsaWMgaXN0cmVhbSB7CnB1YmxpYzoKICBfSU9faXN0cmVhbV93aXRoYXNzaWduJiBv cGVyYXRvcj0oaXN0cmVhbSYpOwogIF9JT19pc3RyZWFtX3dpdGhhc3NpZ24mIG9wZXJhdG9yPShf SU9faXN0cmVhbV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJldHVybiBvcGVyYXRvcj0gKHN0YXRp Y19jYXN0PGlzdHJlYW0mPiAocmhzKSk7IH0KfTsKCmNsYXNzIF9JT19vc3RyZWFtX3dpdGhhc3Np Z24gOiBwdWJsaWMgb3N0cmVhbSB7CnB1YmxpYzoKICBfSU9fb3N0cmVhbV93aXRoYXNzaWduJiBv cGVyYXRvcj0ob3N0cmVhbSYpOwogIF9JT19vc3RyZWFtX3dpdGhhc3NpZ24mIG9wZXJhdG9yPShf SU9fb3N0cmVhbV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJldHVybiBvcGVyYXRvcj0gKHN0YXRp Y19jYXN0PG9zdHJlYW0mPiAocmhzKSk7IH0KfTsKCmV4dGVybiBfSU9faXN0cmVhbV93aXRoYXNz aWduIGNpbjsKIApleHRlcm4gX0lPX29zdHJlYW1fd2l0aGFzc2lnbiBjb3V0LCBjZXJyOwoKZXh0 ZXJuIF9JT19vc3RyZWFtX3dpdGhhc3NpZ24gY2xvZwoKCgo7CgpleHRlcm4gaXN0cmVhbSYgbG9j ayhpc3RyZWFtJiBpbnMpOwpleHRlcm4gaXN0cmVhbSYgdW5sb2NrKGlzdHJlYW0mIGlucyk7CmV4 dGVybiBvc3RyZWFtJiBsb2NrKG9zdHJlYW0mIG91dHMpOwpleHRlcm4gb3N0cmVhbSYgdW5sb2Nr KG9zdHJlYW0mIG91dHMpOwoKc3RydWN0IElvc3RyZWFtX2luaXQgeyB9IDsgICAKCmlubGluZSBp b3MmIGRlYyhpb3MmIGkpCnsgaS5zZXRmKGlvczo6ZGVjLCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6 Om9jdCk7IHJldHVybiBpOyB9CmlubGluZSBpb3MmIGhleChpb3MmIGkpCnsgaS5zZXRmKGlvczo6 aGV4LCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJldHVybiBpOyB9CmlubGluZSBpb3Mm IG9jdChpb3MmIGkpCnsgaS5zZXRmKGlvczo6b2N0LCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9j dCk7IHJldHVybiBpOyB9Cn0gIAoKCiMgNiAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2Mt Mi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4u Ly4uL2luY2x1ZGUvZysrLTMvaW9zdHJlYW0iIDIgMwoKCiMgMSAidHYyNzM3LmN4eCIgMgoKIyAx ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJw Yy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdHJpbmci IDEgMwogCgoKCgojIDEgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIv Z2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRl L2crKy0zL3N0ZC9iYXN0cmluZy5oIiAxIDMKIAogCgogCiAKIAogCiAKCiAKIAogCiAKCiAKIAog CgogCiAKIAogCiAKCiAKIAoKCgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKIyAxICIvaG9tZS90di90 b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4y LjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9jc3RkZGVmIiAxIDMKIAogCgoK CiMgMSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bv d2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDEgMyA0CgoKCgoK CiAKCgoKCgoKCiAKCiAKCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi9ob21lL3R2L3Rvb2xzL2du dS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIu OTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAzIDQKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgog CgoKCgoKIAoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgp0eXBlZGVmIGludCBwdHJkaWZmX3Q7CgoK CgoKCgoKCiAKCgoKCiAKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnR5cGVk ZWYgbG9uZyB1bnNpZ25lZCBpbnQgc2l6ZV90OwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoK IAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgIHdpbnRfdDsK CgoKCiAKCiAKCiMgMzE3ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGli L2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIg MyA0CgoKCgogCgoKCgoKCgoKCgoKCgogCgoKCgoKCgojIDYgIi9ob21lL3R2L3Rvb2xzL2dudS9y czYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUu Mi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2NzdGRkZWYiIDIgMwoKCiMgMzUgIi9ob21lL3R2 L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0 LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0ZC9iYXN0cmluZy5oIiAy IDMKCiMgMSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGli L3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMv c3RkL3N0cmFpdHMuaCIgMSAzCiAKIAoKIAogCiAKIAogCgogCiAKIAogCgogCiAKIAoKIAogCiAK IAogCgogCiAKCgoKCgogCiNwcmFnbWEgaW50ZXJmYWNlICJzdGQvc3RyYWl0cy5oIgoKCgoKZXh0 ZXJuICJDKysiIHsKdGVtcGxhdGUgPGNsYXNzIGNoYXJUPgpzdHJ1Y3Qgc3RyaW5nX2NoYXJfdHJh aXRzIHsKICB0eXBlZGVmIGNoYXJUIGNoYXJfdHlwZTsgIAoKICAgCgogIHN0YXRpYyB2b2lkIGFz c2lnbiAoY2hhcl90eXBlJiBjMSwgY29uc3QgY2hhcl90eXBlJiBjMikKICAgIHsgYzEgPSBjMjsg fQogIHN0YXRpYyBib29sIGVxIChjb25zdCBjaGFyX3R5cGUmIGMxLCBjb25zdCBjaGFyX3R5cGUm IGMyKQogICAgeyByZXR1cm4gKGMxID09IGMyKTsgfQogIHN0YXRpYyBib29sIG5lIChjb25zdCBj aGFyX3R5cGUmIGMxLCBjb25zdCBjaGFyX3R5cGUmIGMyKQogICAgeyByZXR1cm4gIShjMSA9PSBj Mik7IH0KICBzdGF0aWMgYm9vbCBsdCAoY29uc3QgY2hhcl90eXBlJiBjMSwgY29uc3QgY2hhcl90 eXBlJiBjMikKICAgIHsgcmV0dXJuIChjMSA8IGMyKTsgfQogIHN0YXRpYyBjaGFyX3R5cGUgZW9z ICgpIHsgcmV0dXJuIGNoYXJfdHlwZSgpOyB9ICAKICBzdGF0aWMgYm9vbCBpc19kZWwoY2hhcl90 eXBlIGEpIHsgcmV0dXJuIDA7IH0KICAgCiAgCiAgIAoKICBzdGF0aWMgaW50IGNvbXBhcmUgKGNv bnN0IGNoYXJfdHlwZSogczEsIGNvbnN0IGNoYXJfdHlwZSogczIsIHNpemVfdCBuKQogICAgewog ICAgICBzaXplX3QgaTsKICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKCWlmIChuZSAoczFb aV0sIHMyW2ldKSkKCSAgcmV0dXJuIGx0IChzMVtpXSwgczJbaV0pID8gLTEgOiAxOwoKICAgICAg cmV0dXJuIDA7CiAgICB9CiAgICAKICBzdGF0aWMgc2l6ZV90IGxlbmd0aCAoY29uc3QgY2hhcl90 eXBlKiBzKQogICAgewogICAgICBzaXplX3QgbCA9IDA7CiAgICAgIHdoaWxlIChuZSAoKnMrKywg ZW9zICgpKSkKCSsrbDsKICAgICAgcmV0dXJuIGw7CiAgICB9CgogIHN0YXRpYyBjaGFyX3R5cGUq IGNvcHkgKGNoYXJfdHlwZSogczEsIGNvbnN0IGNoYXJfdHlwZSogczIsIHNpemVfdCBuKQogICAg ewogICAgICBmb3IgKDsgbi0tOyApCglhc3NpZ24gKHMxW25dLCBzMltuXSk7CiAgICAgIHJldHVy biBzMTsKICAgIH0KCiAgc3RhdGljIGNoYXJfdHlwZSogbW92ZSAoY2hhcl90eXBlKiBzMSwgY29u c3QgY2hhcl90eXBlKiBzMiwgc2l6ZV90IG4pCiAgICB7CiAgICAgIGNoYXJfdHlwZSBhW25dOwog ICAgICBzaXplX3QgaTsKICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKCWFzc2lnbiAoYVtp XSwgczJbaV0pOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQoJYXNzaWduIChzMVtpXSwg YVtpXSk7CiAgICAgIHJldHVybiBzMTsKICAgIH0KCiAgc3RhdGljIGNoYXJfdHlwZSogc2V0IChj aGFyX3R5cGUqIHMxLCBjb25zdCBjaGFyX3R5cGUmIGMsIHNpemVfdCBuKQogICAgewogICAgICBm b3IgKDsgbi0tOyApCglhc3NpZ24gKHMxW25dLCBjKTsKICAgICAgcmV0dXJuIHMxOwogICAgfQp9 OwoKY2xhc3MgaXN0cmVhbTsKY2xhc3Mgb3N0cmVhbTsKIyAxICIvaG9tZS90di90b29scy9nbnUv cnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1 LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9jY3R5cGUiIDEgMwogCiAKCgoKIyAxICIvdXNy L2luY2x1ZGUvY3R5cGUuaCIgMSAzIDQKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCiAK CgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL3N0YW5kYXJkcy5oIiAxIDMgNAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiMgNzYgIi91c3IvaW5jbHVkZS9zdGFuZGFyZHMuaCIgMyA0CgoKCgoK CgoKCgoKCgoKCgoKCiMgMzcgIi91c3IvaW5jbHVkZS9jdHlwZS5oIiAyIDMgNAoKCgoKCgoKCgoK CgoKCgoKCgojIDY5ICIvdXNyL2luY2x1ZGUvY3R5cGUuaCIgMyA0CgoJZXh0ZXJuIGludAlpc2Fs cGhhKGludCk7CglleHRlcm4gaW50CWlzYWxudW0oaW50KTsKCWV4dGVybiBpbnQJaXNjbnRybChp bnQpOwoJZXh0ZXJuIGludAlpc2RpZ2l0KGludCk7CglleHRlcm4gaW50CWlzZ3JhcGgoaW50KTsK CWV4dGVybiBpbnQJaXNsb3dlcihpbnQpOwoJZXh0ZXJuIGludAlpc3ByaW50KGludCk7CglleHRl cm4gaW50CWlzcHVuY3QoaW50KTsKCWV4dGVybiBpbnQJaXNzcGFjZShpbnQpOwoJZXh0ZXJuIGlu dAlpc3VwcGVyKGludCk7CglleHRlcm4gaW50CWlzeGRpZ2l0KGludCk7CglleHRlcm4gaW50CXRv dXBwZXIoaW50KTsKCWV4dGVybiBpbnQJdG9sb3dlcihpbnQpOwoKCgoKCgoKCgoKCgoKCXR5cGVk ZWYgdW5zaWduZWQgaW50CXdjdHlwZV90OwoKCgoKCgoKCgoKCglleHRlcm4gaW50CWlzYXNjaWko aW50KTsKCWV4dGVybiBpbnQJdG9hc2NpaShpbnQpOwoKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1 ZGUvc3lzL2xvY2FsZWRlZi5oIiAxIDMgNAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoK IAoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvaW5jbHVkZS9zeXMvbGltaXRzLmgiIDEg MyA0CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoK IAoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKIAoKCgoKCgoKCgoK CgoKCgoKCgogCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKIAoKCgoKCgoK IAoKCgoKCgoKCgoKCgoKCiAKCiAKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCiAKCgoKCgojIDEg Ii91c3IvaW5jbHVkZS9mbG9hdC5oIiAxIDMgNAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAK IAoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK IAoKCgoKCgogCgoKCgoKCgoKCgogCgoKCgoKCgoKCgogCgoKCgoKCgoKIyAxNzYgIi91c3IvaW5j bHVkZS9mbG9hdC5oIiAzIDQKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCglleHRlcm4g IHVuc2lnbmVkICAgaW50IFNJTkZJTklUWTsKCWV4dGVybiAgdW5zaWduZWQgICBpbnQgX0RCTElO RlsyXTsKCWV4dGVybiAgdW5zaWduZWQgICBpbnQgU1FOQU47CglleHRlcm4gIHVuc2lnbmVkICAg aW50IERRTkFOWzJdOwoJZXh0ZXJuICB1bnNpZ25lZCAgIGludCBTU05BTjsKCWV4dGVybiAgdW5z aWduZWQgICBpbnQgRFNOQU5bMl07CgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKdHlwZWRlZgl1 bnNpZ25lZCBzaG9ydCBmcHJuZF90OwoKCgoKCgoKCmZwcm5kX3QgZnBfcmVhZF9ybmQodm9pZCk7 CmZwcm5kX3QgZnBfc3dhcF9ybmQoZnBybmRfdCBybmQpOwoKCgoKIAoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCiMgMTkyICIvdXNyL2luY2x1ZGUvc3lzL2xpbWl0cy5oIiAyIDMgNAoKCgkJCSAKIyAy MjEgIi91c3IvaW5jbHVkZS9zeXMvbGltaXRzLmgiIDMgNAoKCiAKCgoKCgoKCgogCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgkJCQkJIAoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKIAoK CgoKIAoKCgoKCgoKCgoKIAoKCgoKCiAgCgoKCgojIDM5ICIvdXNyL2luY2x1ZGUvc3lzL2xvY2Fs ZWRlZi5oIiAyIDMgNAoKIyAxICIvdXNyL2luY2x1ZGUvc3lzL2xjX2NvcmUuaCIgMSAzIDQKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvaG9t ZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0t YWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVkZS9zeXMvdHlwZXMuaCIgMSAzIDQKIAogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIAoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgogCgoKCgoK CgoKCgoKIAoKCgoKCgoKCgoKCiMgNzggIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIu OTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi9pbmNsdWRlL3N5 cy90eXBlcy5oIiAzIDQKCgoKCgoKCgoKCgoKCnR5cGVkZWYgbG9uZwlmcG9zX3Q7CgoKCnR5cGVk ZWYgbG9uZyBsb25nIGZwb3M2NF90OwoKCgoKCgp0eXBlZGVmCWxvbmcJCXRpbWVfdDsKCgoKCnR5 cGVkZWYgaW50CQljbG9ja190OwoKCiMgMTE5ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2dj Yy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVk ZS9zeXMvdHlwZXMuaCIgMyA0CgoKCgoKIAoKCnR5cGVkZWYJdW5zaWduZWQgY2hhcgl1Y2hhcl90 Owp0eXBlZGVmCXVuc2lnbmVkIHNob3J0CXVzaG9ydF90Owp0eXBlZGVmCXVuc2lnbmVkIGludAl1 aW50X3Q7CnR5cGVkZWYgdW5zaWduZWQgbG9uZwl1bG9uZ190Owp0eXBlZGVmIHNpZ25lZCBpbnQJ c3NpemVfdDsKCiAKCgp0eXBlZGVmIGxvbmcJCWxldmVsX3Q7CnR5cGVkZWYJbG9uZwkJZGFkZHJf dDsJIAp0eXBlZGVmCWNoYXIgKgkJY2FkZHJfdDsJIAp0eXBlZGVmCXVsb25nX3QJCWlub190OwkJ IAp0eXBlZGVmIHNob3J0CQljbnRfdDsKdHlwZWRlZiB1bG9uZ190CQlkZXZfdDsJCSAKdHlwZWRl Zglsb25nCQljaGFuX3Q7CQkgCgoKCgp0eXBlZGVmIGxvbmcJCW9mZl90OwkJIAogCgoKdHlwZWRl ZiBsb25nIGxvbmcgCW9mZjY0X3Q7CgoKdHlwZWRlZglsb25nCQlwYWRkcl90Owp0eXBlZGVmCWxv bmcJCWtleV90Owp0eXBlZGVmIGxvbmcJCXRpbWVyX3Q7CSAKdHlwZWRlZglzaG9ydAkJbmxpbmtf dDsKdHlwZWRlZgl1bG9uZ190CQltb2RlX3Q7CQkgCnR5cGVkZWYgdWxvbmdfdAkJdWlkX3Q7CQkg CnR5cGVkZWYgdWxvbmdfdAkJZ2lkX3Q7CQkgCnR5cGVkZWYJdm9pZCAqCQltaWRfdDsJCSAKdHlw ZWRlZglpbnQJCXBpZF90OwkJIAp0eXBlZGVmIGludCAgICAgICAgICAgICB0aWRfdDsgICAgICAg ICAgIAp0eXBlZGVmIGNoYXIJCXNsYWJfdFsxMl07CSAKdHlwZWRlZiBsb25nICAgICAgICAgICAg bXR5cF90OwkJIAp0eXBlZGVmIGludCAgICAgICAgICAgICBib29sZWFuX3Q7CnR5cGVkZWYgbG9u ZwkJYmxrY250X3Q7CSAKdHlwZWRlZiB1bG9uZ190IAlmc2Jsa2NudF90OwkgCnR5cGVkZWYgdWxv bmdfdAkJZnNmaWxjbnRfdDsJIAoKCgoKCgoKdHlwZWRlZiB1bG9uZ190CQlpZF90OwkJIAp0eXBl ZGVmIHVuc2lnbmVkIGludAl1c2Vjb25kc190OwkgCgoKIAogCnR5cGVkZWYgc3RydWN0IHNpZ3Nl dF90CXsKCgl1bnNpZ25lZCBsb25nIGxvc2lnczsKCXVuc2lnbmVkIGxvbmcgaGlzaWdzOwoKCgoK fSBzaWdzZXRfdDsKCnR5cGVkZWYgaW50IHNpZ25hbF90OwoKIAoKCnR5cGVkZWYgc3RydWN0IGZz aWRfdCB7CgoJdWxvbmdfdAl2YWxbMl07CgoKCn0gZnNpZF90OwoKCgoKCgojIDEgIi91c3IvaW5j bHVkZS9zeXMvbV90eXBlcy5oIiAxIDMgNAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAog CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKdHlwZWRlZiBzdHJ1Y3QKCmxhYmVsX3QKCnsJ CSAKCglzdHJ1Y3QgbGFiZWxfdCAgICpwcmV2OwkJIAoJdWxvbmdfdCAgICAgICAgICAgaWFyOwkJ IAoJdWxvbmdfdCAgICAgICAgICAgc3RhY2s7CSAKCXVsb25nX3QgICAgICAgICAgIHRvYzsJCSAK CXVsb25nX3QgICAgICAgICAgIGNyOyAgICAgICAgICAgIAoJdWxvbmdfdCAgICAgICAgICAgaW50 cHJpOwkgCgl1bG9uZ190ICAgICAgICAgICByZWdbMTldOwkgCiMgNjYgIi91c3IvaW5jbHVkZS9z eXMvbV90eXBlcy5oIiAzIDQKCn0gbGFiZWxfdDsKCnR5cGVkZWYgbG9uZwkJdm1pZF90OwkJIAp0 eXBlZGVmIHVsb25nX3QJCXZtaGFuZGxlX3Q7CSAKCnR5cGVkZWYgc3RydWN0Cgp2bWFkZHJfdAoK ewkJIAoKCXZtaGFuZGxlX3QJc3J2YWw7CQkgCgljYWRkcl90CQlvZmZzZXQ7CQkgCgoKCgp9IHZt YWRkcl90OwoKdHlwZWRlZiBzdHJ1Y3QKCmFkc3BhY2VfdAoKewkJIAoKCXVsb25nX3QJCWFsbG9j OwkJIAoJdm1oYW5kbGVfdAlzcnZhbFsxNl07CSAKCgoKCn0gYWRzcGFjZV90OwoKCgojIDIxMSAi L2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMt aWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDIgMyA0CgoKCgoKdHlw ZWRlZiBjaGFyICoJCXZhX2xpc3Q7CgoKCgoKCgoKCgoKCgogCgoKdHlwZWRlZiB1c2hvcnRfdAlV bmlDaGFyOwoKIAoKCnR5cGVkZWYJdWNoYXJfdAkJdWNoYXI7CnR5cGVkZWYJdXNob3J0X3QJdXNo b3J0Owp0eXBlZGVmCXVpbnRfdAkJdWludDsKdHlwZWRlZiB1bG9uZ190CQl1bG9uZzsKCnR5cGVk ZWYJc3RydWN0IHsgaW50IHJbMV07IH0gKglwaHlzYWRyX3Q7CnR5cGVkZWYJcGh5c2Fkcl90CXBo eXNhZHI7CgogCnR5cGVkZWYJdW5zaWduZWQgY2hhcgl1X2NoYXI7CnR5cGVkZWYJdW5zaWduZWQg c2hvcnQJdV9zaG9ydDsKdHlwZWRlZgl1bnNpZ25lZCBpbnQJdV9pbnQ7CnR5cGVkZWYJdW5zaWdu ZWQgbG9uZwl1X2xvbmc7Cgp0eXBlZGVmCXN0cnVjdAlfcXVhZCB7IGxvbmcgdmFsWzJdOyB9IHF1 YWQ7CnR5cGVkZWYJbG9uZwlzd2Jsa190OwoKCgogCnN0cnVjdCBzaWdzZXQJewoJdW5zaWduZWQg bG9uZyBsb3NpZ3M7Cgl1bnNpZ25lZCBsb25nIGhpc2lnczsKfTsKCiAKc3RydWN0IGZzaWQgewoJ dW5zaWduZWQgbG9uZwl2YWxbMl07Cn07CgoKCgoKIAoKCgpzdHJ1Y3QgZmlsZWlkIHsgICAgICAg ICAgICAgICAgICAKCXVpbnRfdCAgZmlkX2xlbjsKCWlub190ICAgZmlkX2lubzsKCXVpbnRfdCAg ZmlkX2dlbjsKCWNoYXIgICAgZmlkX3hbKDMyICAtIHNpemVvZihmc2lkX3QpIC0gc2l6ZW9mKHVp bnRfdCkpICAtIChzaXplb2YoaW5vX3QpICsgMikgLSBzaXplb2YodWludF90KV07Cn07CgojIDI5 NSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2Vy cGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDMgNAoKCnN0cnVj dCBmaWQgewoJdWludF90CWZpZF9sZW47CgljaGFyCWZpZF9kYXRhWygzMiAgLSBzaXplb2YoZnNp ZF90KSAtIHNpemVvZih1aW50X3QpKSBdOwp9Owp0eXBlZGVmIHN0cnVjdCBmaWQgZmlkX3Q7Cgog CnN0cnVjdCBmaGFuZGxlIHsKCWNoYXIgeFszMiBdOwkJIAp9OwpzdHJ1Y3QgZmlsZWhhbmRsZSB7 CQkJIAoJZnNpZF90CQlmaF9mc2lkOwkJIAoJc3RydWN0IGZpbGVpZAlmaF9maWQ7CQkJIAp9Owp0 eXBlZGVmIHN0cnVjdCBmaGFuZGxlIGZoYW5kbGVfdDsKCgoKCgoKIApzdHJ1Y3QgdW5pcXVlX2lk IHsKICAgICAgIHVuc2lnbmVkIGxvbmcgd29yZDE7CiAgICAgICB1bnNpZ25lZCBsb25nIHdvcmQy OwogICAgICAgdW5zaWduZWQgbG9uZyB3b3JkMzsKICAgICAgIHVuc2lnbmVkIGxvbmcgd29yZDQ7 Cn07CnR5cGVkZWYgc3RydWN0IHVuaXF1ZV9pZCB1bmlxdWVfaWRfdDsKCiMgMzQ3ICIvaG9tZS90 di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4 NC4yLjEuMC8yLjk1LjIvaW5jbHVkZS9zeXMvdHlwZXMuaCIgMyA0CgoKCnR5cGVkZWYJbG9uZyBs b25nICBvZmZzZXRfdDsJCSAKCgoKCnR5cGVkZWYgbG9uZyBzb2ZmX3Q7CQkJIAoKCnR5cGVkZWYg bG9uZyBsb25nIGxvbmdsb25nX3Q7ICAgICAgICAgCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25n IHVfbG9uZ2xvbmdfdDsKCgoKCiMgMzYgIi91c3IvaW5jbHVkZS9zeXMvbGNfY29yZS5oIiAyIDMg NAoKCgoKCgoKCgoKdHlwZWRlZiBzdHJ1Y3QgewoKICAgIHVuc2lnbmVkIHNob3J0CglfX3R5cGVf aWQsCglfX21hZ2ljOwogICAgdW5zaWduZWQgbG9uZwoJX192ZXJzaW9uOwogICAgCiAgICBzaXpl X3QgIF9fc2l6ZTsKCn0gX0xDX29iamVjdF90OwoKIAoKCgoKCgoKCgoKCgoKIAoKCgoKIAoKCgoK CgoKCgogCgoKCgoKCgoKdHlwZWRlZiBzdHJ1Y3QgewogIAogICAgX0xDX29iamVjdF90ICBfX2hk cjsKCQogICAgIAoKICAgIGludCAgIF9fY2F0Z2V0cyAgOwogICAgaW50ICAgICAgICAgICAgICBf X2NhdGNsb3NlICA7CiAgICAKICAgICAKICAgIGludCAgIF9fY29tcHJlc3MgIDsKICAgIGludCAg IF9fZGVjb21wcmVzcyAgOwogICAgaW50ICAgICAgX19zdGFydF9jb21wcmVzcyAgOwogICAgaW50 ICAgICAgX19lbmRfY29tcHJlc3MgIDsKICAgIAogICAgIAogICAgaW50ICAgICAgX19pbml0ICA7 CiAgICB2b2lkICAgICpfX2RhdGE7Cn0gX0xDX2NvcmVfY2FyX3Q7Cgp0eXBlZGVmIHN0cnVjdCB7 CgogICAgX0xDX29iamVjdF90ICBfX2hkcjsKCiAgICAgCiAgICBpbnQgICAgX19ubF9sYW5naW5m byAgOwogICAgCiAgICAgCiAgICBpbnQgICAgX19tYnRvd2MgIDsKICAgIGludCAgICBfX21ic3Rv d2NzICA7CiAgICBpbnQgICAgICAgX193Y3RvbWIgIDsKICAgIGludCAgICBfX3djc3RvbWJzICA7 CiAgICAKICAgICAKICAgIGludCAgICAgICBfX21ibGVuICA7CiAgICAKICAgICAKICAgIGludCAg ICBfX3djc3dpZHRoICA7CiAgICBpbnQgICAgX193Y3dpZHRoICA7CiAgICAKICAgICAKICAgIGlu dCAgICAgICBfX21idG9wYyAgOwogICAgaW50ICAgICAgIF9fbWJzdG9wY3MgIDsKICAgIGludCAg ICAgICBfX3BjdG9tYiAgOwogICAgaW50ICAgICAgIF9fcGNzdG9tYnMgIDsKICAgIAogICAgIAog ICAgaW50ICAgIF9fY3NpZCAgOwogICAgaW50ICAgIF9fd2NzaWQgIDsKICAgIAogICAgIAogICAg aW50ICAgICAgIF9faW5pdCAgOwogICAgdm9pZCAgICAgKl9fZGF0YTsKfSBfTENfY29yZV9jaGFy bWFwX3Q7CgoKdHlwZWRlZiBzdHJ1Y3QgewogCiAgICBfTENfb2JqZWN0X3QgIF9faGRyOyAKICAg IAogICAgIAogICAgaW50ICAgICAgX190b3d1cHBlciAgOwogICAgaW50ICAgICAgX190b3dsb3dl ciAgOwogICAgCiAgICAgCiAgICBpbnQgICAgX19nZXRfd2N0eXBlICA7CiAgICBpbnQgICAgICAg ICAgICAgX19pc193Y3R5cGUgIDsKICAgIAogICAgIAogICAgaW50ICAgICAgICAgIF9faW5pdCAg OwogICAgdm9pZCAgICAgKl9fZGF0YTsKfSBfTENfY29yZV9jdHlwZV90OwoKdHlwZWRlZiBzdHJ1 Y3QgewoKICAgIF9MQ19vYmplY3RfdCAgX19oZHI7CgogICAgIAogICAgaW50ICAgICAgICBfX3N0 cmNvbGwgIDsKICAgIGludCAgICAgX19zdHJ4ZnJtICA7CiAgICAKICAgICAKICAgIGludCAgICAg ICAgX193Y3Njb2xsICA7CiAgICBpbnQgICAgIF9fd2NzeGZybSAgOwogICAgCiAgICAgCiAgICBp bnQgICAgICAgIF9fZm5tYXRjaCAgOwogICAgCiAgICAgCiAgICBpbnQgICAgICAgIF9fcmVnY29t cCAgOwogICAgaW50ICAgICBfX3JlZ2Vycm9yICA7CiAgICBpbnQgICAgICAgIF9fcmVnZXhlYyAg OwogICAgaW50ICAgICAgIF9fcmVnZnJlZSAgOwogICAgCiAgICAgCiAgICBpbnQgICAgICAgIF9f aW5pdCAgOwogICAgdm9pZCAgICAgKl9fZGF0YTsKfSBfTENfY29yZV9jb2xsYXRlX3Q7CgoKdHlw ZWRlZiBzdHJ1Y3QgewoKICAgIF9MQ19vYmplY3RfdCAgX19oZHI7CiAgICAKICAgICAKICAgIGlu dCAgICAgX19ubF9sYW5naW5mbyAgOwogICAgCiAgICAgCiAgICBpbnQgICAgIF9fc3RyZnRpbWUg IDsKICAgIGludCAgICAgX19zdHJwdGltZSAgOwogICAgCiAgICAgCiAgICBpbnQgICAgIF9fd2Nz ZnRpbWUgIDsKICAgIAogICAgIAogICAgaW50ICAgICAgICBfX2luaXQgIDsKICAgIHZvaWQgICAg ICpfX2RhdGE7Cn0gX0xDX2NvcmVfdGltZV90OwoKCnR5cGVkZWYgc3RydWN0IHsKCiAgICBfTENf b2JqZWN0X3QgIF9faGRyOwoKICAgICAKICAgIGludCAgICAgX19ubF9sYW5naW5mbyAgOwogICAg CiAgICAgCiAgICBpbnQgICAgIF9fc3RyZm1vbiAgOwogICAgCiAgICAgCiAgICBpbnQgICAgICAg IF9faW5pdCAgOwogICAgdm9pZCAgICAgKl9fZGF0YTsKfSBfTENfY29yZV9tb25ldGFyeV90OwoK CnR5cGVkZWYgc3RydWN0IHsKCiAgICBfTENfb2JqZWN0X3QgIF9faGRyOwoKICAgICAKICAgIGlu dCAgICAgX19ubF9sYW5naW5mbyAgOwogICAgCiAgICAgCiAgICBpbnQgICAgICAgIF9faW5pdCAg OwogICAgdm9pZCAgICAgKl9fZGF0YTsKfSBfTENfY29yZV9udW1lcmljX3Q7CgoKdHlwZWRlZiBz dHJ1Y3QgewoKICAgIF9MQ19vYmplY3RfdCAgX19oZHI7CiAgICAKICAgICAKICAgIGludCAgICBf X25sX2xhbmdpbmZvICA7CiAgICAKICAgICAKICAgIGludCAgICBfX3JwbWF0Y2ggIDsKICAgIAog ICAgIAogICAgaW50ICAgICAgIF9faW5pdCAgOwogICAgdm9pZCAgICAgICAgKl9fZGF0YTsKfSBf TENfY29yZV9yZXNwX3Q7Cgp0eXBlZGVmIHN0cnVjdCB7CgogICAgX0xDX29iamVjdF90IF9faGRy OwoKICAgICAKICAgIGludCAgICAgICAgICAgX19ubF9sYW5naW5mbyAgOwogICAgaW50ICAgX19s b2NhbGVjb252ICA7CiAgICAKICAgICAKICAgIGludCAgICAgX19pbml0ICA7CiAgICB2b2lkICAg ICAgICAgKl9fZGF0YTsKfSBfTENfY29yZV9sb2NhbGVfdDsKCgoKCiMgNDAgIi91c3IvaW5jbHVk ZS9zeXMvbG9jYWxlZGVmLmgiIDIgMyA0CgojIDEgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAv Z2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi9pbmNs dWRlL2xvY2FsZS5oIiAxIDMgNAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpzdHJ1Y3QgbGNvbnYgewogICBjaGFyICpkZWNpbWFsX3Bv aW50OwkJIAogICBjaGFyICp0aG91c2FuZHNfc2VwOwkJIAogICBjaGFyICpncm91cGluZzsJCSAK ICAgY2hhciAqaW50X2N1cnJfc3ltYm9sOwkgCiAgIGNoYXIgKmN1cnJlbmN5X3N5bWJvbDsJIAog ICBjaGFyICptb25fZGVjaW1hbF9wb2ludDsJIAogICBjaGFyICptb25fdGhvdXNhbmRzX3NlcDsJ IAogICBjaGFyICptb25fZ3JvdXBpbmc7CQkgCiAgIGNoYXIgKnBvc2l0aXZlX3NpZ247CQkgCiAg IGNoYXIgKm5lZ2F0aXZlX3NpZ247CQkgCiAgIGNoYXIgaW50X2ZyYWNfZGlnaXRzOwkgCiAgIGNo YXIgZnJhY19kaWdpdHM7CQkgCiAgIGNoYXIgcF9jc19wcmVjZWRlczsJCSAKICAgY2hhciBwX3Nl cF9ieV9zcGFjZTsJCSAKICAgY2hhciBuX2NzX3ByZWNlZGVzOwkJIAogICBjaGFyIG5fc2VwX2J5 X3NwYWNlOwkJIAogICBjaGFyIHBfc2lnbl9wb3NuOwkJIAogICBjaGFyIG5fc2lnbl9wb3NuOwkJ IAoKCiAgIGNoYXIgKmxlZnRfcGFyZW50aGVzaXM7CSAKICAgY2hhciAqcmlnaHRfcGFyZW50aGVz aXM7CSAKCgoKCgp9IDsKCgoKCgoKCgoKCgoKCgoKc3RydWN0IGxjb252ICpsb2NhbGVjb252KHZv aWQpOwpjaGFyICAgKnNldGxvY2FsZShpbnQsIGNvbnN0IGNoYXIgKik7CgoKCgoKdHlwZWRlZiBz dHJ1Y3QgbGNvbnYgbGNvbnY7CgoKCiMgNDEgIi91c3IvaW5jbHVkZS9zeXMvbG9jYWxlZGVmLmgi IDIgMyA0CgoKIyAxICIvdXNyL2luY2x1ZGUvc3lzL2xvY2FsZWRlZjMxLmgiIDEgMyA0CiAKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCgoKIAoKCgoKCgoKCgoKCgoKCiAKCgogCgoKdHlwZWRl ZiBzdHJ1Y3QgIGNvbGRlc2MgIHsgICAgICAgICAgICAgICAgICAgICAgCglzaG9ydCAgICAgY2Rf c3Ryb2ZmOyAgICAgICAgICAgICAgICAgICAgCglzaG9ydAkgIGNkX3JlcG9mZjsKCXNob3J0ICAg ICBjZF9jdmFsOwoJc2hvcnQJICBjZF9jdW5pcTsKfSBjb2xkZXNjX3Q7CgogCgoKdHlwZWRlZiBz dHJ1Y3QgY29sbGF0aW9uX3RhYmxlIHsgICAgICAgICAgICAgICAgIAoJc2hvcnQgICAgbGNfdmVy c2lvbjsgICAgICAgICAgICAgICAgICAgICAKCXNob3J0CSBsY19sZW5ndGg7CQkJIAoJY2hhciAg ICAgKmxjX2xvY2FsZV9uYW1lOwkJIAoJaW50ICAgICAgbGVuX2NvbGxhdGU7CglzaG9ydCAgICAq bGNfY29sbGF0ZTsgICAgICAgICAgICAgICAgICAgIAoJaW50ICAgICAgbGVuX2NvbHVuaXE7Cglz aG9ydCAgICAqbGNfY29sdW5pcTsgICAgICAgICAgICAgICAgICAgIAoJaW50ICAgICAgbGVuX2Nv bGRlc2M7Cgljb2xkZXNjX3QgKmxjX2NvbGRlc2M7ICAgICAgICAgICAgICAgICAgIAoJaW50CSBs ZW5fc3RyaW5nczsJCQkKCXdjaGFyX3QgICpsY19zdHJpbmdzOwkJCSAKCWludAkgaGlnaF9jdmFs dWU7CQkJIAp9IGNvbF90OwoKIAoKCgoKCnR5cGVkZWYgc3RydWN0IGNoYXJfY2xhc3NpZmljYXRp b25fdGFibGUgeyAgICAgICAKCXNob3J0ICAgICAgbGNfdmVyc2lvbjsgCQkgCglzaG9ydAkgICBs Y19sZW5ndGg7ICAJCSAKCXNob3J0ICAgICAgbGNfY29kZV90eXBlOyAJIAoJc2hvcnQgICAgICBt Yl9jdXJfbWF4OyAgIAkgCglzaG9ydCAgICAgIG1iX2N1cl9taW47ICAgCSAKCXNob3J0ICAgICAg bGNfZHNwX3dpZHRoOyAgICAgICAgICAgICAgICAgIAoJY2hhciAgICAgICAqbGNfbG9jYWxlX25h bWU7IAkgCglpbnQgICAgICAgIGxlbl9jYXNlY29udjsgICAJIAoJd2NoYXJfdCAgICAqbGNfY2Fz ZWNvbnY7ICAgCSAKCWludAkgICBsZW5fY3R5cGU7Cgl1bnNpZ25lZCBzaG9ydCAqbGNfY3R5cGU7 CSAJCn0gY3R5cGVfdDsKCiAKCgoKdHlwZWRlZglzdHJ1Y3QgbGNfbW9uZXRhcnlfdGFibGUgewoJ c2hvcnQgIAlsY192ZXJzaW9uOwoJc2hvcnQgCWxjX2xlbmd0aDsJCSAKCWNoYXIgICAJKmxjX2xv Y2FsZV9uYW1lOwkgCgljaGFyIAkqaW50X2N1cnJfc3ltYm9sOwkgCgljaGFyIAkqY3VycmVuY3lf c3ltYm9sOwkgCgljaGFyIAkqbW9uX2RlY2ltYWxfcG9pbnQ7CSAKCWNoYXIgCSptb25fdGhvdXNh bmRzX3NlcDsJIAoJY2hhciAJKm1vbl9ncm91cGluZzsJCSAKCWNoYXIgCSpwb3NpdGl2ZV9zaWdu OwkJIAoJY2hhciAJKm5lZ2F0aXZlX3NpZ247CQkgCgljaGFyIAlpbnRfZnJhY19kaWdpdHM7CSAK CWNoYXIgCWZyYWNfZGlnaXRzOwkJIAoJY2hhciAJcF9jc19wcmVjZWRlczsJCSAKCWNoYXIgCXBf c2VwX2J5X3NwYWNlOwkJIAoJY2hhciAJbl9jc19wcmVjZWRlczsJCSAKCWNoYXIgCW5fc2VwX2J5 X3NwYWNlOwkJIAoJY2hhciAJcF9zaWduX3Bvc247CQkgCgljaGFyIAluX3NpZ25fcG9zbjsJCSAK fSBtb25fdDsKCiAKCgoKdHlwZWRlZiBzdHJ1Y3QgbnVtZXJpY190YWJsZSB7ICAgICAgICAgICAg ICAgICAgIAoJc2hvcnQJbGNfdmVyc2lvbjsKCXNob3J0CWxjX2xlbmd0aDsJCSAKCWNoYXIgICAg KmxjX2xvY2FsZV9uYW1lOwkgCgljaGFyIAkqZGVjaW1hbF9wb2ludDsKCWNoYXIgCSp0aG91c2Fu ZHNfc2VwOwoJY2hhcgkqZ3JvdXBpbmc7Cn0gbnVtX3Q7CgogCgoKCnR5cGVkZWYgc3RydWN0IGxj X21lc3NhZ2VzX3RhYmxlIHsKCXNob3J0CWxjX3ZlcnNpb247CglzaG9ydAlsY19sZW5ndGg7CQkg CgljaGFyICAgICpsY19sb2NhbGVfbmFtZTsJIAoJY2hhciAJKm1lc3NhZ2VzOwkJIAoJY2hhciAJ Knllc19zdHJpbmc7CQkgCgljaGFyIAkqbm9fc3RyaW5nOwkJIAp9IG1zZ190OwoKIAoKCgp0eXBl ZGVmIHN0cnVjdCBsY190aW1lX3RhYmxlIHsKCXNob3J0ICAgbGNfdmVyc2lvbjsKCXNob3J0CWxj X2xlbmd0aDsJICAKCWNoYXIgICAgKmxjX2xvY2FsZV9uYW1lOyAgCgljaGFyICAgICp0X2ZtdDsg ICAgICAgICAgCgljaGFyICAgICpkX2ZtdDsgICAgICAgICAgCgljaGFyICAgICpubGxkYXRlOyAg ICAgICAgCgljaGFyICAgICpkX3RfZm10OyAgICAgICAgCgljaGFyICAgICphYmRheTsgICAgICAg ICAgCgljaGFyICAgICpkYXk7ICAgICAgICAgICAgCgljaGFyICAgICphYm1vbjsgICAgICAgICAg CgljaGFyICAgICptb247ICAgICAgICAgICAgCiAKCgoKCWNoYXIgICAgKm1pc2M7ICAgICAgICAg ICAKCWNoYXIgICAgKnRzdHJzOyAgICAgICAgICAKCWNoYXIgICAgKnR1bml0czsgICAgICAgICAK IAoKCgljaGFyCSp5ZWFyOwkJIAoJY2hhciAgICAqYW1fcG07ICAgICAgICAgIAp9IHRpbV90OwoK IAoKCgoKdHlwZWRlZiBzdHJ1Y3Qgd2NoYXJfbWFwcGluZ190YWJsZSB7ICAgICAgICAgICAgIAoJ c2hvcnQgICAgbGNfdmVyc2lvbjsKCXNob3J0CSBsY19sZW5ndGg7CQkJIAoJY2hhciAgICAgKmxj X2lkZW50aWZpZXI7Cn0gbWFwX3Q7CgoKIAoKCgoKCnR5cGVkZWYgc3RydWN0IGxvY2FsZWluZm9f dGFibGUgeyAgICAgICAgICAgCgljaGFyICAgICBsY19tYWcwLCBsY19tYWcxOyAgICAgICAKCXNo b3J0ICAgIGxjX3ZlcnNpb247ICAgICAgICAgICAgIAoJc2hvcnQgICAgbGNfY29kZV90eXBlOyAg ICAgICAgICAgICAgICAgCglzaG9ydAkgbGNfbGVuZ3RoOwkJIAoJY29sX3QgICAgKmxjX2NvbHRi bDsJCSAKCWN0eXBlX3QgICpsY19jaHJ0Ymw7CQkgCgltb25fdCAgICAqbGNfbW9udGJsOwkJIAoJ bnVtX3QgICAgKmxjX251bXRibDsJCSAKCXRpbV90ICAgICpsY190aW10Ymw7CQkgCgltc2dfdCAg ICAqbGNfbXNndGJsOwkJIAoJbWFwX3QgICAgKmxjX21hcHRibDsJCSAKfSBsb2NfdDsKCiMgNDMg Ii91c3IvaW5jbHVkZS9zeXMvbG9jYWxlZGVmLmgiIDIgMyA0CgoKCgoKCgoKCgoKCgoKCiAKCgoK CnR5cGVkZWYgc3RydWN0IHsKCiAgICBfTENfY29yZV9jaGFybWFwX3QgY29yZTsKICAgIAogICAg Y2hhciAgICAgKmNtX2NzbmFtZTsJIAogICAgCiAgICBzaXplX3QgICBjbV9tYl9jdXJfbWF4OyAg ICAgIAogICAgc2l6ZV90ICAgY21fbWJfY3VyX21pbjsJIAoKICAgIHVuc2lnbmVkIGNoYXIKCSAg ICAgY21fbWF4X2Rpc3Bfd2lkdGg7ICAKCQkJCSAKCiAgICB1bnNpZ25lZCAKCWNoYXIgKmNtX2Nz dGFiOwkJIAoKICAgIHN0cnVjdCBfX0xDX2xvY2FsZSAJCSAKICAgICAgICAgICAgICpsb2NfcmVj OwoKICAgIHZvaWQgICAgICpfX21ldGhfcHRyOwkgCiAgICB2b2lkICAgICAqX19kYXRhX3B0cjsJ IAogICAgCn0gX0xDX2NoYXJtYXBfdDsKCnR5cGVkZWYgc3RydWN0IF9MQ19jaGFybWFwX29iamhk bCBfTENfY2hhcm1hcF9vYmpoZGxfdDsKCnN0cnVjdCBfTENfY2hhcm1hcF9vYmpoZGwgewoJX0xD X2NoYXJtYXBfdCAqb2JqOwoKCgl2b2lkICooKiptZXRoKSgpOwoKCnN0cnVjdCBfTENfbG9jYWxl X29iamhkbCAqbG9jX2hkbDsJIAoJCQkJCSAKCQkJCQkgCn07CgoKIAoKCgoKdHlwZWRlZglzdHJ1 Y3QgewoKICAgIF9MQ19jb3JlX21vbmV0YXJ5X3QgICBjb3JlOwogICAgCiAgICBjaGFyICppbnRf Y3Vycl9zeW1ib2w7CSAgICAKICAgIGNoYXIgKmN1cnJlbmN5X3N5bWJvbDsJICAgIAogICAgY2hh ciAqbW9uX2RlY2ltYWxfcG9pbnQ7CSAgICAKICAgIGNoYXIgKm1vbl90aG91c2FuZHNfc2VwOwkg ICAgCiAgICBjaGFyICptb25fZ3JvdXBpbmc7CQkgICAgCiAgICBjaGFyICpwb3NpdGl2ZV9zaWdu OwkgICAgCiAgICBjaGFyICpuZWdhdGl2ZV9zaWduOwkgICAgCiAgICBzaWduZWQgY2hhciBpbnRf ZnJhY19kaWdpdHM7ICAgIAogICAgc2lnbmVkIGNoYXIgZnJhY19kaWdpdHM7CSAgICAKICAgIHNp Z25lZCBjaGFyIHBfY3NfcHJlY2VkZXM7CSAgICAKICAgIHNpZ25lZCBjaGFyIHBfc2VwX2J5X3Nw YWNlOwkgICAgCiAgICBzaWduZWQgY2hhciBuX2NzX3ByZWNlZGVzOwkgICAgCiAgICBzaWduZWQg Y2hhciBuX3NlcF9ieV9zcGFjZTsJICAgIAogICAgc2lnbmVkIGNoYXIgcF9zaWduX3Bvc247CSAg ICAKICAgIHNpZ25lZCBjaGFyIG5fc2lnbl9wb3NuOwkgICAgCiAgICBjaGFyICpkZWJpdF9zaWdu OwkJICAgIAogICAgY2hhciAqY3JlZGl0X3NpZ247CQkgICAgCiAgICBjaGFyICpsZWZ0X3BhcmVu dGhlc2lzOwkgICAgCiAgICBjaGFyICpyaWdodF9wYXJlbnRoZXNpczsJICAgIAogICAgCiAgICBz dHJ1Y3QgX19MQ19sb2NhbGUgCQkgICAgCiAgICAgICAgICAgICAqbG9jX3JlYzsJCSAgICAKCiAg ICB2b2lkICAgICAqX19tZXRoX3B0cjsJICAgIAogICAgdm9pZCAgICAgKl9fZGF0YV9wdHI7CSAg ICAKICAgIAp9IF9MQ19tb25ldGFyeV90OwoKdHlwZWRlZiBzdHJ1Y3QgX0xDX21vbmV0YXJ5X29i amhkbCBfTENfbW9uZXRhcnlfb2JqaGRsX3Q7CnN0cnVjdCBfTENfbW9uZXRhcnlfb2JqaGRsIHsK CV9MQ19tb25ldGFyeV90ICpvYmo7CgoKCXZvaWQgKigqKm1ldGgpKCk7CgoKc3RydWN0IF9MQ19s b2NhbGVfb2JqaGRsICpsb2NfaGRsOwkgCgkJCQkJIAoJCQkJCSAKfTsKCiAKCgoKCnR5cGVkZWYg c3RydWN0IHsKCiAgICBfTENfY29yZV9udW1lcmljX3QgY29yZTsKICAgIAogICAgY2hhciAgICAg KmRlY2ltYWxfcG9pbnQ7CiAgICBjaGFyICAgICAqdGhvdXNhbmRzX3NlcDsKICAgIHVuc2lnbmVk CgljaGFyICpncm91cGluZzsKICAgIAogICAgc3RydWN0IF9fTENfbG9jYWxlIAkJICAgIAogICAg ICAgICAgICAgKmxvY19yZWM7CQkgICAgCgogICAgdm9pZCAgICAgKl9fbWV0aF9wdHI7CSAgICAK ICAgIHZvaWQgICAgICpfX2RhdGFfcHRyOwkgICAgCiAgICAKfSBfTENfbnVtZXJpY190OwoKdHlw ZWRlZiBzdHJ1Y3QgX0xDX251bWVyaWNfb2JqaGRsIF9MQ19udW1lcmljX29iamhkbF90OwpzdHJ1 Y3QgX0xDX251bWVyaWNfb2JqaGRsIHsKCV9MQ19udW1lcmljX3QgKm9iajsKCgoJdm9pZCAqKCoq bWV0aCkoKTsKCgpzdHJ1Y3QgX0xDX2xvY2FsZV9vYmpoZGwgKmxvY19oZGw7CSAKCQkJCQkgCgkJ CQkJIAp9OwoKCiAKCgoKCnR5cGVkZWYgc3RydWN0ICB7CgogICAgX0xDX2NvcmVfcmVzcF90IGNv cmU7CgogICAgY2hhciAgICAgKnllc2V4cHI7CSAgICAgIAogICAgY2hhciAgICAgKm5vZXhwcjsJ ICAgICAgCiAgICBjaGFyICAgICAqeWVzc3RyOwkgICAgICAKICAgIGNoYXIgICAgICpub3N0cjsJ ICAgICAgCgogICAgc3RydWN0IF9fTENfbG9jYWxlCSAgICAgIAogICAgICAgICAgICAgKmxvY19y ZWM7CSAgICAgIAoKICAgIHZvaWQgICAgICpfX21ldGhfcHRyOyAgICAgCiAgICB2b2lkICAgICAq X19kYXRhX3B0cjsgICAgIAogICAgCn0gX0xDX3Jlc3BfdDsKCnR5cGVkZWYgc3RydWN0IF9MQ19y ZXNwX29iamhkbCBfTENfcmVzcF9vYmpoZGxfdDsKc3RydWN0IF9MQ19yZXNwX29iamhkbCB7Cglf TENfcmVzcF90ICpvYmo7CgoKCXZvaWQgKigqKm1ldGgpKCk7CgoKc3RydWN0IF9MQ19sb2NhbGVf b2JqaGRsICpsb2NfaGRsOwkgCgkJCQkJIAoJCQkJCSAKfTsKCgogCgoKCgp0eXBlZGVmIHN0cnVj dCB7CgogICAgX0xDX2NvcmVfdGltZV90IGNvcmU7CiAgICAKICAgIGNoYXIgKmRfZm10OyAgCiAg ICBjaGFyICp0X2ZtdDsgIAogICAgY2hhciAqZF90X2ZtdDsKICAgIGNoYXIgKnRfZm10X2FtcG07 CiAgICBjaGFyICphYmRheVs3XTsgIAogICAgY2hhciAqZGF5WzddOyAgICAKICAgIGNoYXIgKmFi bW9uWzEyXTsgIAogICAgY2hhciAqbW9uWzEyXTsgICAgCiAgICBjaGFyICphbV9wbVsyXTsKICAg IGNoYXIgKmVyYTsKICAgIGNoYXIgKmVyYV95ZWFyOwogICAgY2hhciAqZXJhX2RfZm10OwogICAg Y2hhciAqYWx0X2RpZ2l0czsKICAgIGNoYXIgKmVyYV9kX3RfZm10OwogICAgY2hhciAqZXJhX3Rf Zm10OwogICAgIAogICAgc3RydWN0IF9fTENfbG9jYWxlCSAgICAgIAogICAgICAgICAgICAgKmxv Y19yZWM7CSAgICAgIAoKICAgIHZvaWQgICAgICpfX21ldGhfcHRyOyAgICAgCiAgICB2b2lkICAg ICAqX19kYXRhX3B0cjsgICAgIAoKfSBfTENfdGltZV90OwoKdHlwZWRlZiBzdHJ1Y3QgX0xDX3Rp bWVfb2JqaGRsIF9MQ190aW1lX29iamhkbF90OwpzdHJ1Y3QgX0xDX3RpbWVfb2JqaGRsIHsKCV9M Q190aW1lX3QgKm9iajsKCgoJdm9pZCAqKCoqbWV0aCkoKTsKCgpzdHJ1Y3QgX0xDX2xvY2FsZV9v YmpoZGwgKmxvY19oZGw7CSAKCQkJCQkgCgkJCQkJIAp9OwoKCiAKCgoKdHlwZWRlZiBzdHJ1Y3Qg ewogICAgdW5zaWduZWQKCXNob3J0ICBuWzQgICsxXTsKfSBfTENfd2VpZ2h0X3Q7ICAgIAoKICAK IAoKCgp0eXBlZGVmIHN0cnVjdCB7CgogICAgY2hhciAgICAgICAgICpjZV9zeW07CSAKICAgIF9M Q193ZWlnaHRfdCBjZV93Z3Q7CSAKCQkJCSAKfSBfTENfY29sbGVsX3Q7CgoKIAoKCgp0eXBlZGVm IHN0cnVjdCB7CiAgICBfTENfd2VpZ2h0X3QgICBjdF93Z3Q7ICAgICAKCQkJICAgICAgIAoKICAg IF9MQ19jb2xsZWxfdCAgICpjdF9jb2xsZWw7IAoKfSBfTENfY29sdGJsX3Q7CgoKIAogCiAKCgoK IAoKCgp0eXBlZGVmIHN0cnVjdCB7CiAgICBjaGFyICp0Z3Rfd2d0X3N0cls0ICArMV07CiAgICAg CiAgICAgCn0gX0xDX3N1YnNfdDsKCgogCgoKCgp0eXBlZGVmIHN0cnVjdCB7CgogICAgX0xDX2Nv cmVfY29sbGF0ZV90IGNvcmU7CiAgICAKICAgIHVuc2lnbmVkCQkJICAgICAgICAgICAgIAoJY2hh ciAgICBjb19ub3JkOwkgICAgICAgICAgICAgCiAgICAKICAgIF9MQ193ZWlnaHRfdCBjb19zb3J0 OwkgICAgICAgICAgICAgCgkJCQkJICAgICAKICAgIAogICAgd2NoYXJfdCAgICAgY29fd2NfbWlu OwkJICAgICAKICAgIHdjaGFyX3QgICAgIGNvX3djX21heDsJCSAgICAgCiAgICAKICAgIHdjaGFy X3QgICAgIGNvX2NvbF9taW47CQkgICAgIAogICAgd2NoYXJfdCAgICAgY29fY29sX21heDsJCSAg ICAgCiAgICAKICAgIF9MQ19jb2x0YmxfdCAqY29fY29sdGJsOwkJICAgICAKCQkJCSAgICAgICAg ICAgICAKICAgIHVuc2lnbmVkCgljaGFyICAgIGNvX25zdWJzOwkJICAgICAKICAgIF9MQ19zdWJz X3QgICpjb19zdWJzOwkJICAgICAKICAgIAogICAgdW5zaWduZWQKCXNob3J0CWNvX3NwZWNpYWw7 CQkgICAgIAoJCQkJCSAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAoJCQkJCSAgICAgCgogICAgc3RydWN0IF9fTENfbG9jYWxlCSAgICAgICAgICAgICAg ICAgICAgIAogICAgICAgICAgICAgICAgKmxvY19yZWM7CSAgICAgICAgICAgICAKCiAgICB2b2lk ICAgICAgICAqX19tZXRoX3B0cjsgICAgICAgICAgICAgICAgIAogICAgdm9pZCAgICAgICAgKl9f ZGF0YV9wdHI7ICAgICAgICAgICAgICAgICAKCn0gX0xDX2NvbGxhdGVfdDsKCnR5cGVkZWYgc3Ry dWN0IF9MQ19jb2xsYXRlX29iamhkbCBfTENfY29sbGF0ZV9vYmpoZGxfdDsKc3RydWN0IF9MQ19j b2xsYXRlX29iamhkbCB7CglfTENfY29sbGF0ZV90ICpvYmo7CgoKCXZvaWQgKigqKm1ldGgpKCk7 CgoKc3RydWN0IF9MQ19sb2NhbGVfb2JqaGRsICpsb2NfaGRsOwkgCgkJCQkJIAoJCQkJCSAKfTsK CiAKCgoKCgoKCiAKCgoKdHlwZWRlZiBzdHJ1Y3QgewoKICAgIGNoYXIgICAgKm5hbWU7CiAgICB1 bnNpZ25lZAoJaW50IG1hc2s7Cgp9IF9MQ19jbGFzc25tX3Q7CgoKIAoKCgoKdHlwZWRlZiBzdHJ1 Y3QgewoKICBfTENfY29yZV9jdHlwZV90IGNvcmU7CiAKICAgCiAgd2NoYXJfdCAgICAgIG1pbl93 YzsKICB3Y2hhcl90ICAgICAgbWF4X3djOwoKICAgCiAgd2NoYXJfdCAgICAgICp1cHBlcjsKICB3 Y2hhcl90ICAgICAgKmxvd2VyOwogIAogICAKICB1bnNpZ25lZAogICAgICBpbnQgICAgICAqbWFz azsgICAgICAgICAKICB1bnNpZ25lZAogICAgICBpbnQgICAgICAqcW1hc2s7CSAgICAgIAogIHVu c2lnbmVkCiAgICAgIGNoYXIgICAgICpxaWR4OwkgICAgICAKCiAgIAogIHVuc2lnbmVkCiAgICAg IGNoYXIgICAgIG5jbGFzc2VzOwogX0xDX2NsYXNzbm1fdCAqY2xhc3NubXM7CiAgCiAgICBzdHJ1 Y3QgX19MQ19sb2NhbGUJICAgICAgCiAgICAgICAgICAgICAgICpsb2NfcmVjOyAgICAgIAoKICAg IHZvaWQgICAgICAgKl9fbWV0aF9wdHI7ICAgCiAgICB2b2lkICAgICAgICpfX2RhdGFfcHRyOyAg IAoKfSBfTENfY3R5cGVfdDsKCnR5cGVkZWYgc3RydWN0IF9MQ19jdHlwZV9vYmpoZGwgX0xDX2N0 eXBlX29iamhkbF90OwpzdHJ1Y3QgX0xDX2N0eXBlX29iamhkbCB7CglfTENfY3R5cGVfdCAqb2Jq OwoKCgl2b2lkICooKiptZXRoKSgpOwoKCnN0cnVjdCBfTENfbG9jYWxlX29iamhkbCAqbG9jX2hk bDsJIAoJCQkJCSAKCQkJCQkgCn07CgoKIAoKCgoKCiAKCgoKCgp0eXBlZGVmIHN0cnVjdCBfX0xD X2xvY2FsZSB7CgogICAgX0xDX2NvcmVfbG9jYWxlX3QgY29yZTsKICAgIAogICAgY2hhciAgICAg ICAgICAgKm5sX2luZm9bNjMgXTsKICAgIHN0cnVjdCBsY29udiAgICpubF9sY29udjsKICAgIAog ICAgX0xDX2NoYXJtYXBfb2JqaGRsX3QgIGxjX2NoYXJtYXA7CiAgICBfTENfY29sbGF0ZV9vYmpo ZGxfdCAgbGNfY29sbGF0ZTsKICAgIF9MQ19jdHlwZV9vYmpoZGxfdCAgICBsY19jdHlwZTsKICAg IF9MQ19tb25ldGFyeV9vYmpoZGxfdCBsY19tb25ldGFyeTsKICAgIF9MQ19udW1lcmljX29iamhk bF90ICBsY19udW1lcmljOwogICAgX0xDX3Jlc3Bfb2JqaGRsX3QgICAgIGxjX3Jlc3A7CiAgICBf TENfdGltZV9vYmpoZGxfdCAgICAgbGNfdGltZTsKICAgIAogICAgc3RydWN0IF9fTENfbG9jYWxl ICAgICpsb2NfcmVjOyAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAg ICAgICAgIAoKICAgIHZvaWQgICAgICAgICAgICAgICAgICAqX19tZXRoX3B0cjsgICAgIAogICAg dm9pZCAgICAgICAgICAgICAgICAgICpfX2RhdGFfcHRyOyAgICAgCgogICAgY2hhcgkJICAqX19u bF95ZXNzdHI7ICAgIAogICAgY2hhcgkJICAqX19ubF9ub3N0cjsgICAgIAogICAgY2hhcgkJICAq X19ubF9jcm5jeXN0cjsgIAoKfSBfTENfbG9jYWxlX3Q7Cgp0eXBlZGVmIHN0cnVjdCBfTENfbG9j YWxlX29iamhkbCBfTENfbG9jYWxlX29iamhkbF90OwpzdHJ1Y3QgX0xDX2xvY2FsZV9vYmpoZGwg ewoJX0xDX2xvY2FsZV90ICpvYmo7CgoKCXZvaWQgKigqKm1ldGgpKCk7CgoKc3RydWN0IF9MQ19s b2NhbGVfb2JqaGRsICpsb2NfaGRsOwkgCgkJCQkJIAoJCQkJCSAKfTsKCgogCgoKCgoKdHlwZWRl ZiBzdHJ1Y3QgX0xDX29iamVjdF9oYW5kbGUgX0xDX29iamVjdF9oYW5kbGVfdDsKc3RydWN0IF9M Q19vYmplY3RfaGFuZGxlIHsKICAgIHVuaW9uIHsKCV9MQ19vYmplY3RfdAkgICAgICBsY19vYmpl Y3Q7CglfTENfbG9jYWxlX29iamhkbF90ICAgbGNfbG9jYWxlOwogICAgICAgIF9MQ19jaGFybWFw X29iamhkbF90ICBsY19jaGFybWFwOwogICAgICAgIF9MQ19jb2xsYXRlX29iamhkbF90ICBsY19j b2xsYXRlOwogICAgICAgIF9MQ19jdHlwZV9vYmpoZGxfdCAgICBsY19jdHlwZTsKICAgICAgICBf TENfbW9uZXRhcnlfb2JqaGRsX3QgbGNfbW9uZXRhcnk7CiAgICAgICAgX0xDX251bWVyaWNfb2Jq aGRsX3QgIGxjX251bWVyaWM7CiAgICAgICAgX0xDX3Jlc3Bfb2JqaGRsX3QgICAgIGxjX3Jlc3A7 CiAgICAgICAgX0xDX3RpbWVfb2JqaGRsX3QgICAgIGxjX3RpbWU7CiAgICB9IG9iajsKCgogICAg dm9pZCAgICAqKCoqbWV0aCkoKTsKCgpzdHJ1Y3QgX0xDX2xvY2FsZV9vYmpoZGwgKmxvY19oZGw7 CSAKCQkJCQkgCgkJCQkJIAp9OwoKCnR5cGVkZWYgc3RydWN0IHsKICAgIF9MQ19vYmplY3RfdAlo ZHI7CQkgICAKICAgIF9MQ19sb2NhbGVfb2JqaGRsX3QgaGFuZGxlOwkJICAgCn0gX0xDX2xvYWRf b2JqZWN0X3Q7CgoKCgogCgoKZXh0ZXJuIF9MQ19jaGFybWFwX29iamhkbF90ICBfX2xjX2NoYXJt YXA7CmV4dGVybiBfTENfY29sbGF0ZV9vYmpoZGxfdCAgX19sY19jb2xsYXRlOwpleHRlcm4gX0xD X2N0eXBlX29iamhkbF90ICAgIF9fbGNfY3R5cGU7CmV4dGVybiBfTENfbW9uZXRhcnlfb2JqaGRs X3QgX19sY19tb25ldGFyeTsKZXh0ZXJuIF9MQ19udW1lcmljX29iamhkbF90ICBfX2xjX251bWVy aWM7CmV4dGVybiBfTENfcmVzcF9vYmpoZGxfdCAgICAgX19sY19yZXNwOwpleHRlcm4gX0xDX3Rp bWVfb2JqaGRsX3QgICAgIF9fbGNfdGltZTsKZXh0ZXJuIF9MQ19sb2NhbGVfb2JqaGRsX3QgICBf X2xjX2xvY2FsZTsKCgojIDEyMCAiL3Vzci9pbmNsdWRlL2N0eXBlLmgiIDIgMyA0CgoKCgoKCgoJ ZXh0ZXJuIGludAlpc193Y3R5cGUod2ludF90LCB3Y3R5cGVfdCk7CglleHRlcm4gd2N0eXBlX3QJ Z2V0X3djdHlwZShjaGFyICopOwoKCiMgMTc3ICIvdXNyL2luY2x1ZGUvY3R5cGUuaCIgMyA0CgoK CgoKCgoKCgoKIyA2ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2dj Yy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9jY3R5cGUiIDIgMwoKCiMgMTA1ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0y Ljk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4v Li4vaW5jbHVkZS9nKystMy9zdGQvc3RyYWl0cy5oIiAyIDMKCiMgMSAiL2hvbWUvdHYvdG9vbHMv Z251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAv Mi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvY3N0cmluZyIgMSAzCiAKIAoKCgoKIyAx ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJw Yy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVkZS9zdHJpbmcuaCIgMSAzIDQKIAogCiAKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKIAoK CgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKIyA4NiAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9n Y2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1 ZGUvc3RyaW5nLmgiIDMgNAoKICAgICAgICBleHRlcm4gdm9pZCAgICAgKm1lbWNocihjb25zdCB2 b2lkICosIGludCwgc2l6ZV90KTsKICAgICAgICBleHRlcm4gdm9pZCAgICAgKm1lbWNweSh2b2lk ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKICAgICAgICBleHRlcm4gdm9pZCAgICAgKm1lbXNl dCh2b2lkICosIGludCwgc2l6ZV90KTsKICAgICAgICBleHRlcm4gc2l6ZV90ICAgc3RyY3Nwbihj b25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CiAgICAgICAgZXh0ZXJuIHNpemVfdCAgIHN0cmxl bihjb25zdCBjaGFyICopOwogICAgICAgIGV4dGVybiBzaXplX3QgICBzdHJzcG4oY29uc3QgY2hh ciAqLCBjb25zdCBjaGFyICopOwoKCiMgMTE4ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2dj Yy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVk ZS9zdHJpbmcuaCIgMyA0CgogICAgICAgIGV4dGVybiB2b2lkICAgICAqbWVtbW92ZSh2b2lkICos IGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKICAgICAgICBleHRlcm4gY2hhciAgICAgKnN0cmNweShj aGFyICosIGNvbnN0IGNoYXIgKik7CiAgICAgICAgZXh0ZXJuIGNoYXIgICAgICpzdHJuY3B5KGNo YXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwogICAgICAgIGV4dGVybiBjaGFyICAgICAqc3Ry Y2F0KGNoYXIgKiwgY29uc3QgY2hhciAqKTsKICAgICAgICBleHRlcm4gY2hhciAgICAgKnN0cm5j YXQoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiAgICAgICAgZXh0ZXJuIGludCAgICAg IG1lbWNtcChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKixzaXplX3QpOwogICAgICAgIGV4dGVy biBpbnQgICAgICBzdHJjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwogICAgICAgIGV4 dGVybiBpbnQgICAgICBzdHJuY21wKGNvbnN0IGNoYXIgKixjb25zdCBjaGFyICosc2l6ZV90KTsK ICAgICAgICBleHRlcm4gaW50ICAgICAgc3RybmNvbGxlbihjb25zdCBjaGFyICosIGNvbnN0IGlu dCApOwogICAgICAgIGV4dGVybiBjaGFyICAgICAqc3RyY2hyKGNvbnN0IGNoYXIgKiwgaW50KTsK ICAgICAgICBleHRlcm4gY2hhciAgICAgKnN0cnBicmsoY29uc3QgY2hhciAqLCBjb25zdCBjaGFy ICopOwogICAgICAgIGV4dGVybiBjaGFyICAgICAqc3RycmNocihjb25zdCBjaGFyICosIGludCk7 CiAgICAgICAgZXh0ZXJuIGNoYXIgICAgICpzdHJzdHIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFy ICopOwogICAgICAgIGV4dGVybiBjaGFyICAgICAqc3RydG9rKGNoYXIgKiwgY29uc3QgY2hhciAq KTsKICAgICAgICBleHRlcm4gY2hhciAgICAgKnN0cmVycm9yKGludCk7CiAgICAgICAgZXh0ZXJu IGludCAgICAgIHN0cmNvbGwoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwogICAgICAgIGV4 dGVybiBzaXplX3Qgc3RyeGZybShjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKCgoKCgoK CgoKCgoKCgogICAgICAgIGV4dGVybiB2b2lkICAgICAqbWVtY2NweSh2b2lkICosIGNvbnN0IHZv aWQgKiwgaW50LCBzaXplX3QpOwoKCgoKCgoKCmV4dGVybiBjaGFyICpzdHJkdXAoY29uc3QgY2hh ciAqKTsKCgoKCgoKCiMgMTkzICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIv bGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVkZS9zdHJpbmcu aCIgMyA0CgogICAgICAgIGV4dGVybiBjaGFyICAgICAqaW5kZXgoY29uc3QgY2hhciAqLCBpbnQp OwogICAgICAgIGV4dGVybiBjaGFyICAgICAqcmluZGV4KGNvbnN0IGNoYXIgKiwgaW50KTsKICAg ICAgICBleHRlcm4gdm9pZCAgICAgc3dhYihjb25zdCB2b2lkICosIHZvaWQgKiwgc3NpemVfdCk7 IAogICAgICAgIGV4dGVybiB3Y2hhcl90ICAqd2NzY2F0KHdjaGFyX3QgKiwgY29uc3Qgd2NoYXJf dCAqKTsKICAgICAgICBleHRlcm4gd2NoYXJfdCAgKndjc2Nocihjb25zdCB3Y2hhcl90ICosIHdj aGFyX3QpOwogICAgICAgIGV4dGVybiBpbnQgICAgICB3Y3NjbXAoY29uc3Qgd2NoYXJfdCAqLCBj b25zdCB3Y2hhcl90ICopOwogICAgICAgIGV4dGVybiB3Y2hhcl90ICAqd2NzY3B5KHdjaGFyX3Qg KiwgY29uc3Qgd2NoYXJfdCAqKTsKICAgICAgICBleHRlcm4gc2l6ZV90ICAgd2NzY3Nwbihjb25z dCB3Y2hhcl90ICosIGNvbnN0IHdjaGFyX3QgKik7CiAgICAgICAgZXh0ZXJuIHNpemVfdCAgIHdj c2xlbihjb25zdCB3Y2hhcl90ICopOwogICAgICAgIGV4dGVybiB3Y2hhcl90ICAqd2NzbmNhdCh3 Y2hhcl90ICosIGNvbnN0IHdjaGFyX3QgKiwgc2l6ZV90KTsKICAgICAgICBleHRlcm4gaW50ICAg ICAgd2NzbmNtcChjb25zdCB3Y2hhcl90ICosIGNvbnN0IHdjaGFyX3QgKiwgc2l6ZV90KTsKICAg ICAgICBleHRlcm4gd2NoYXJfdCAgKndjc25jcHkod2NoYXJfdCAqLCBjb25zdCB3Y2hhcl90ICos IHNpemVfdCk7CiAgICAgICAgZXh0ZXJuIHdjaGFyX3QgICp3Y3NwYnJrKGNvbnN0IHdjaGFyX3Qg KiwgY29uc3Qgd2NoYXJfdCAqKTsKICAgICAgICBleHRlcm4gd2NoYXJfdCAgKndjc3JjaHIoY29u c3Qgd2NoYXJfdCAqLCB3Y2hhcl90KTsKICAgICAgICBleHRlcm4gc2l6ZV90ICAgd2Nzc3BuKGNv bnN0IHdjaGFyX3QgKiwgY29uc3Qgd2NoYXJfdCAqKTsKICAgICAgICBleHRlcm4gd2NoYXJfdCAg Kndjc3Rvayh3Y2hhcl90ICosIGNvbnN0IHdjaGFyX3QgKik7CiAgICAgICAgZXh0ZXJuIHdjaGFy X3QgICp3Y3N3Y3MoY29uc3Qgd2NoYXJfdCAqLCBjb25zdCB3Y2hhcl90ICopOwogICAgICAgIGV4 dGVybiBpbnQgICAgICB3Y3N3aWR0aChjb25zdCB3Y2hhcl90ICosIHNpemVfdCk7CiAgICAgICAg ZXh0ZXJuIGludCAgICAgIHdjd2lkdGgod2NoYXJfdCk7CiAgICAgICAgZXh0ZXJuIGludCAgICAg IHdjc2NvbGwoY29uc3Qgd2NoYXJfdCAqLCBjb25zdCB3Y2hhcl90ICopOwogICAgICAgIGV4dGVy biBzaXplX3Qgd2NzeGZybSh3Y2hhcl90ICosIGNvbnN0IHdjaGFyX3QgKiwgc2l6ZV90KTsKCgoK CgoKCgoKCgoKCgoKIAoKCgogCiMgMjYwICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0y Ljk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVkZS9z dHJpbmcuaCIgMyA0CgoKCiMgNyAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4y L2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2lu Y2x1ZGUvZysrLTMvY3N0cmluZyIgMiAzCgoKIyA5NCAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAw MC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4u Ly4uLy4uLy4uL2luY2x1ZGUvZysrLTMvY3N0cmluZyIgMwoKCgojIDEwNiAiL2hvbWUvdHYvdG9v bHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4x LjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RkL3N0cmFpdHMuaCIgMiAzCgoK c3RydWN0IHN0cmluZ19jaGFyX3RyYWl0cyA8Y2hhcj4gewogIHR5cGVkZWYgY2hhciBjaGFyX3R5 cGU7CgogIHN0YXRpYyB2b2lkIGFzc2lnbiAoY2hhcl90eXBlJiBjMSwgY29uc3QgY2hhcl90eXBl JiBjMikKICAgIHsgYzEgPSBjMjsgfQogIHN0YXRpYyBib29sIGVxIChjb25zdCBjaGFyX3R5cGUg JiBjMSwgY29uc3QgY2hhcl90eXBlJiBjMikKICAgIHsgcmV0dXJuIChjMSA9PSBjMik7IH0KICBz dGF0aWMgYm9vbCBuZSAoY29uc3QgY2hhcl90eXBlJiBjMSwgY29uc3QgY2hhcl90eXBlJiBjMikK ICAgIHsgcmV0dXJuIChjMSAhPSBjMik7IH0KICBzdGF0aWMgYm9vbCBsdCAoY29uc3QgY2hhcl90 eXBlJiBjMSwgY29uc3QgY2hhcl90eXBlJiBjMikKICAgIHsgcmV0dXJuIChjMSA8IGMyKTsgfQog IHN0YXRpYyBjaGFyX3R5cGUgZW9zICgpIHsgcmV0dXJuIDA7IH0KICBzdGF0aWMgYm9vbCBpc19k ZWwoY2hhcl90eXBlIGEpIHsgcmV0dXJuIGlzc3BhY2UoYSk7IH0KCiAgc3RhdGljIGludCBjb21w YXJlIChjb25zdCBjaGFyX3R5cGUqIHMxLCBjb25zdCBjaGFyX3R5cGUqIHMyLCBzaXplX3QgbikK ICAgIHsgcmV0dXJuIG1lbWNtcCAoczEsIHMyLCBuKTsgfQogIHN0YXRpYyBzaXplX3QgbGVuZ3Ro IChjb25zdCBjaGFyX3R5cGUqIHMpCiAgICB7IHJldHVybiBzdHJsZW4gKHMpOyB9CiAgc3RhdGlj IGNoYXJfdHlwZSogY29weSAoY2hhcl90eXBlKiBzMSwgY29uc3QgY2hhcl90eXBlKiBzMiwgc2l6 ZV90IG4pCiAgICB7IHJldHVybiAoY2hhcl90eXBlKikgbWVtY3B5IChzMSwgczIsIG4pOyB9CiAg c3RhdGljIGNoYXJfdHlwZSogbW92ZSAoY2hhcl90eXBlKiBzMSwgY29uc3QgY2hhcl90eXBlKiBz Miwgc2l6ZV90IG4pCiAgICB7IHJldHVybiAoY2hhcl90eXBlKikgbWVtbW92ZSAoczEsIHMyLCBu KTsgfQogIHN0YXRpYyBjaGFyX3R5cGUqIHNldCAoY2hhcl90eXBlKiBzMSwgY29uc3QgY2hhcl90 eXBlJiBjLCBzaXplX3QgbikKICAgIHsgcmV0dXJuIChjaGFyX3R5cGUqKSBtZW1zZXQgKHMxLCBj LCBuKTsgfQp9OwoKIyAxNTkgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9s aWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNs dWRlL2crKy0zL3N0ZC9zdHJhaXRzLmgiIDMKCn0gIAoKIyAzNiAiL2hvbWUvdHYvdG9vbHMvZ251 L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45 NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RkL2Jhc3RyaW5nLmgiIDIgMwoKCiAKIyAx ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJw Yy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9hbGxvYy5o IiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKIyAxICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2dj Yy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4v Li4vLi4vaW5jbHVkZS9nKystMy9zdGxfY29uZmlnLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCiAKIAogCiAKIAog CiAKIAogCiAKIAoKCiAKCiAKIAogCiAKIAogCiAKCgoKCgoKCgojIDE0OCAiL2hvbWUvdHYvdG9v bHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4x LjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2NvbmZpZy5oIiAzCgoKCgoK CgoKCgoKCgoKCgoKCgoKIyAxNzggIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUu Mi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9p bmNsdWRlL2crKy0zL3N0bF9jb25maWcuaCIgMwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCiMgMjM0ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1s aWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKyst My9zdGxfY29uZmlnLmgiIDMKCgojIDI0OCAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2Mt Mi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4u Ly4uL2luY2x1ZGUvZysrLTMvc3RsX2NvbmZpZy5oIiAzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKIAogCiAKIAoKCgoKCgoKCgoKCgoKCgoKCgogCiAKIyAzMTYgIi9ob21lL3R2 L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0 LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9jb25maWcuaCIgMwoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKIAogCiMgMTggIi9ob21lL3R2 L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0 LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2FsbG9jLmgiIDIgMwoKCgoj IDEgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dl cnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9h bGxvYy5oIiAxIDMKIAoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgogCiAKIAogCiAK IAoKCgoKCgoKCgoKCgoKIyAxICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIv bGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYu aCIgMSAzIDQKIyAzNDIgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIv Z2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAz IDQKCiMgNTMgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxp Yi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0z L3N0bF9hbGxvYy5oIiAyIDMKCiMgMSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45 NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvc3Rk bGliLmgiIDEgMyA0CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCgogCgoKCgoKCgoKCgoK CgoKIAoKCgoKCgoKCgoKCiAKCgoKCgogCgoKIAoKCgoKCgoKCiMgNzEgIi9ob21lL3R2L3Rvb2xz L2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4w LzIuOTUuMi9pbmNsdWRlL3N0ZGxpYi5oIiAzIDQKCgojIDgxICIvaG9tZS90di90b29scy9nbnUv cnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1 LjIvaW5jbHVkZS9zdGRsaWIuaCIgMyA0CgoKdHlwZWRlZiBzdHJ1Y3QgZGl2X3QgIHsJICAgICAg ICAgCglpbnQgcXVvdDsgICAgICAgICAgICAgICAgCglpbnQgcmVtOyAgICAgICAgICAgICAgICAg Cn0gZGl2X3Q7Cgp0eXBlZGVmIHN0cnVjdCBsZGl2X3QgIHsJIAoJbG9uZyBpbnQgcXVvdDsgICAg ICAgICAgIAoJbG9uZyBpbnQgcmVtOyAgICAgICAgICAgIAp9IGxkaXZfdDsKCgoKCgoKZXh0ZXJu IGludCBfX2dldG1iY3VybWF4ICh2b2lkKTsKZXh0ZXJuIGludCBfX2dldG1heGRpc3B3aWR0aCAo dm9pZCk7CgoKCgogCgoKCgoKCgoKCglleHRlcm4gaW50CSAJbWJsZW4oY29uc3QgY2hhciAqLCBz aXplX3QpOwoJZXh0ZXJuIHNpemVfdCAJbWJzdG93Y3Mod2NoYXJfdCAqLCBjb25zdCBjaGFyICos IHNpemVfdCk7CglleHRlcm4gaW50CQltYnRvd2Mod2NoYXJfdCAqLCBjb25zdCBjaGFyICosIHNp emVfdCk7CglleHRlcm4gc2l6ZV90CXdjc3RvbWJzKGNoYXIgKiwgY29uc3Qgd2NoYXJfdCAqLCBz aXplX3QpOwoJZXh0ZXJuIGludAkJd2N0b21iKGNoYXIgKiwgY29uc3Qgd2NoYXJfdCk7CgoKIAoK CiMgMTY1ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIv cG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVkZS9zdGRsaWIuaCIgMyA0CgogCgoK CglleHRlcm4gZG91YmxlIAlhdG9mKGNvbnN0IGNoYXIgKik7CglleHRlcm4gaW50IAlhdG9pKGNv bnN0IGNoYXIgKik7CglleHRlcm4gbG9uZyBpbnQgYXRvbChjb25zdCBjaGFyICopOwoJZXh0ZXJu IGRvdWJsZSAJc3RydG9kKGNvbnN0IGNoYXIgKiwgY2hhciAqICopOwoJZXh0ZXJuIGxvbmcgaW50 IHN0cnRvbChjb25zdCBjaGFyICosIGNoYXIgKiAqLCBpbnQpOwoJZXh0ZXJuIHVuc2lnbmVkIGxv bmcgaW50IHN0cnRvdWwoY29uc3QgY2hhciAqLCBjaGFyICogKiwgaW50KTsKCWV4dGVybiBpbnQg CXJhbmQodm9pZCk7CglleHRlcm4gdm9pZAlzcmFuZCh1bnNpZ25lZCBpbnQpOwoJZXh0ZXJuIHZv aWQgCSpjYWxsb2Moc2l6ZV90LCBzaXplX3QpOwoJZXh0ZXJuIHZvaWQJZnJlZSh2b2lkICopOwoJ ZXh0ZXJuIHZvaWQJKm1hbGxvYyhzaXplX3QpOwoJZXh0ZXJuIHZvaWQgCSpyZWFsbG9jKHZvaWQg Kiwgc2l6ZV90KTsKCWV4dGVybiB2b2lkCWFib3J0KHZvaWQpOwoJZXh0ZXJuIGludAlhdGV4aXQo dm9pZCAoKikodm9pZCkpOwoJZXh0ZXJuIHZvaWQJZXhpdChpbnQpOwoJZXh0ZXJuIGNoYXIJKmdl dGVudihjb25zdCBjaGFyICopOwoJZXh0ZXJuIGludCAJc3lzdGVtKGNvbnN0IGNoYXIgKik7Cgll eHRlcm4gdm9pZCAJKmJzZWFyY2goY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCwg c2l6ZV90LCBpbnQoKikoY29uc3Qgdm9pZCAqLGNvbnN0IHZvaWQgKikpOwoJZXh0ZXJuIHZvaWQg CXFzb3J0KHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsIGludCgqKShjb25zdCB2b2lkICosY29uc3Qg dm9pZCAqKSk7CgogCgoKCgoKCgoJCglleHRlcm4gaW50IAlhYnMoaW50KTsKCWV4dGVybiBzdHJ1 Y3QgZGl2X3QJZGl2KGludCwgaW50KTsKCWV4dGVybiBsb25nIGludAlsYWJzKGxvbmcgaW50KTsK CWV4dGVybiBzdHJ1Y3QgbGRpdl90IAlsZGl2KGxvbmcgaW50LCBsb25nIGludCk7CgoKCgoKCgoK CgoKCgoKIAoKCgoKCiMgMSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xp Yi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvc3lzL3dhaXQu aCIgMSAzIDQKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCiAKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvc3lzL3Jlc291cmNlLmgiIDEgMyA0CiAKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgojIDEgIi91c3IvaW5jbHVkZS9zeXMvdGltZS5oIiAxIDMgNAogCiAKIAogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoK CiAKCgoKCgoKIAoKCgoKCiAKCgoKCnN0cnVjdCB0aW1ldmFsIHsKCXRpbWVfdAkJdHZfc2VjOwkJ IAoJbG9uZwkJdHZfdXNlYzsJIAp9OwoKIAoKCnN0cnVjdAlpdGltZXJ2YWwgewoJc3RydWN0CQl0 aW1ldmFsIGl0X2ludGVydmFsOyAgCglzdHJ1Y3QJCXRpbWV2YWwgaXRfdmFsdWU7ICAKfTsKCgoK CgoKCmV4dGVybiBpbnQgZ2V0aXRpbWVyKGludCwgc3RydWN0IGl0aW1lcnZhbCAqKTsKZXh0ZXJu IGludCBzZXRpdGltZXIoaW50LCBjb25zdCBzdHJ1Y3QgaXRpbWVydmFsICosIHN0cnVjdCBpdGlt ZXJ2YWwgKik7CmV4dGVybiBpbnQgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICosIHZvaWQg Kik7CmV4dGVybiBpbnQgdXRpbWVzKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHRpbWV2YWwg Kik7CgoKIAoKCgoKCgoKCgogCgogCgoKdHlwZWRlZiBzdHJ1Y3QgCgpmZF9zZXQKCnsKICAgICAg ICBsb25nIGZkc19iaXRzWygyMDAwIC8gKHNpemVvZihsb25nKSAqIDgpICsxKSBdOyAgIAp9IGZk X3NldDsKCgoKCgogCgoKZXh0ZXJuIGludCBzZWxlY3QoaW50LCBmZF9zZXQgKiwgZmRfc2V0ICos IGZkX3NldCAqLCBzdHJ1Y3QgdGltZXZhbCAqKTsKCgoKCgojIDE1MyAiL3Vzci9pbmNsdWRlL3N5 cy90aW1lLmgiIDMgNAoKCgoKCgogCgoKCgoKIAoKCgkKIAoKCgoKCgoKCgoKIAoKCgoKCgoKCgoK CgoKCgoKCgoKCgogCgoKCgoKIAoKCgoKCgoJCQkJCSAKCgkJCQkJIAoJCQkJCSAKCgoKCgoKCiAK CgpzdHJ1Y3QgdGltZXN0cnVjX3QgewogICAgICAgIHVuc2lnbmVkIGxvbmcJdHZfc2VjOyAgICAg ICAgICAKICAgICAgICAJIGxvbmcJdHZfbnNlYzsgICAgICAgICAKfTsKCiAKCgpzdHJ1Y3QgaXRp bWVyc3RydWNfdCB7CiAgICAgICAgc3RydWN0ICB0aW1lc3RydWNfdCBpdF9pbnRlcnZhbDsgIAog ICAgICAgIHN0cnVjdCAgdGltZXN0cnVjX3QgaXRfdmFsdWU7ICAgICAKfTsKCnR5cGVkZWYgc3Ry dWN0IHRpbWViYXNlc3RydWN0IHsKCWludAkJZmxhZzsgICAgIAoJdW5zaWduZWQgbG9uZwl0Yl9o aWdoOyAgCgl1bnNpZ25lZCBsb25nCXRiX2xvdzsJICAKCX0gdGltZWJhc2VzdHJ1Y3RfdDsJCgpp bnQgcmVhZF9yZWFsX3RpbWUodGltZWJhc2VzdHJ1Y3RfdCAqLCBzaXplX3QpOwppbnQgdGltZV9i YXNlX3RvX3RpbWUodGltZWJhc2VzdHJ1Y3RfdCAqLCBzaXplX3QpOwoKCiMgMjYxICIvdXNyL2lu Y2x1ZGUvc3lzL3RpbWUuaCIgMyA0CgoKIAoKCgoKCgoKCgoKCiMgMjg0ICIvdXNyL2luY2x1ZGUv c3lzL3RpbWUuaCIgMyA0CgojIDMxMCAiL3Vzci9pbmNsdWRlL3N5cy90aW1lLmgiIDMgNAoKIAoK CgoKCgoKCgoKCiAKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoK CgoKIAoKCgpzdHJ1Y3QgdGltZXpvbmUgewoJaW50CQl0el9taW51dGVzd2VzdDsJIAoJaW50CQl0 el9kc3R0aW1lOwkgCn07CgoKCgoKCgoKCgoKCgoKCiMgNTIgIi91c3IvaW5jbHVkZS9zeXMvcmVz b3VyY2UuaCIgMiAzIDQKCgoKCgoKCgogCgoKCgoKIAoKCgp0eXBlZGVmIHVsb25nX3QgcmxpbV90 OwoKCgoKCgoKCnN0cnVjdCBybGltaXQgewoJcmxpbV90CXJsaW1fY3VyOwkJIAoJcmxpbV90CXJs aW1fbWF4OwkJIAp9OwoKc3RydWN0CXJ1c2FnZSB7CglzdHJ1Y3QgdGltZXZhbCBydV91dGltZTsJ IAoJc3RydWN0IHRpbWV2YWwgcnVfc3RpbWU7CSAKCWxvbmcJcnVfbWF4cnNzOwoKCWxvbmcJcnVf aXhyc3M7CQkgCglsb25nCXJ1X2lkcnNzOwkJIAoJbG9uZwlydV9pc3JzczsJCSAKCWxvbmcJcnVf bWluZmx0OwkJIAoJbG9uZwlydV9tYWpmbHQ7CQkgCglsb25nCXJ1X25zd2FwOwkJIAoJbG9uZwly dV9pbmJsb2NrOwkJIAoJbG9uZwlydV9vdWJsb2NrOwkJIAoJbG9uZwlydV9tc2dzbmQ7CQkgCgls b25nCXJ1X21zZ3JjdjsJCSAKCWxvbmcJcnVfbnNpZ25hbHM7CQkgCglsb25nCXJ1X252Y3N3OwkJ IAoJbG9uZwlydV9uaXZjc3c7CQkgCgp9OwoKIAoKCgoKCgoKCgoKCgoKCgoKCgpleHRlcm4gaW50 IGdldHByaW9yaXR5KGludCwgaWRfdCk7CmV4dGVybiBpbnQgc2V0cHJpb3JpdHkoaW50LCBpZF90 LCBpbnQpOwpleHRlcm4gaW50IGdldHJsaW1pdChpbnQsIHN0cnVjdCBybGltaXQgKik7CmV4dGVy biBpbnQgZ2V0cnVzYWdlKGludCwgc3RydWN0IHJ1c2FnZSAqKTsKZXh0ZXJuIGludCBzZXRybGlt aXQoaW50LCBjb25zdCBzdHJ1Y3QgcmxpbWl0ICopOwoKCgoKCiMgNDUgIi9ob21lL3R2L3Rvb2xz L2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4w LzIuOTUuMi9pbmNsdWRlL3N5cy93YWl0LmgiIDIgMyA0CgoKCgojIDEgIi9ob21lL3R2L3Rvb2xz L2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4w LzIuOTUuMi9pbmNsdWRlL3N5cy9zaWduYWwuaCIgMSAzIDQKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgogCgoKCgoK CgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpleHRlcm4gdm9pZCAoKnNpZ25hbChp bnQsIHZvaWQgKCopKGludCkpKShpbnQpOwoKCgoKCgoKZXh0ZXJuIGludCByYWlzZShpbnQpOwoK CnR5cGVkZWYgaW50IHNpZ19hdG9taWNfdDsgIAogCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgoKIAoKCgogCgoKCgoKCgoKCgoKCgoK CgoKCiAKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKIAoKCnR5cGVkZWYgc3RydWN0IHsKCWludCBz aV9zaWdubzsJCSAKCWludCBzaV9lcnJubzsJCSAKCWludCBzaV9jb2RlOwkJIAoJcGlkX3Qgc2lf cGlkOwkJIAoJdWlkX3Qgc2lfdWlkOwkJIAoJdm9pZCAqc2lfYWRkcjsJCSAKCWludCBzaV9zdGF0 dXM7CQkgCglsb25nIHNpX2JhbmQ7CQkgCglpbnQgX19wYWRbOF07CQkgCn0gc2lnaW5mb190OwoK CiAKCgpzdHJ1Y3Qgc2lnYWN0aW9uIHsKICAgdW5pb24gewoKCgoKCgoJdm9pZAkoKl9fc3VfaGFu ZGxlcikoaW50KTsJIAoKCgoJdm9pZCAgICAoKl9fc3Vfc2lnYWN0aW9uKSAoaW50LCBzaWdpbmZv X3QgKiwgdm9pZCAqKTsKCgoKICAgIH0gc2FfdW5pb247CglzaWdzZXRfdCBzYV9tYXNrOwkJIAoJ aW50CXNhX2ZsYWdzOwkJIAp9OwoKCgoKCgogCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvc3lz L2NvbnRleHQuaCIgMSAzIDQKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvc3lzL21fcGFyYW0uaCIgMSAzIDQKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoK CgoKIAoKCgoKCgoKCiAKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAzOSAiL3Vzci9pbmNs dWRlL3N5cy9jb250ZXh0LmgiIDIgMyA0CgojIDEgIi91c3IvaW5jbHVkZS9zeXMvbXN0c2F2ZS5o IiAxIDMgNAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCgoKCgoKCgoKCgoKCgogCgoK CgoKCgoKCgoKIAoKCgoKCgoKCgoKCgogCgoKCgoKc3RydWN0Cgptc3RzYXZlCgoKCnsKCglzdHJ1 Y3QgbXN0c2F2ZSAqcHJldjsJCSAKCWxhYmVsX3QJCSpram1wYnVmOwkgCgljaGFyCQkqc3RhY2tm aXg7CSAKCWNoYXIJCWludHByaTsgCSAKCWNoYXIJCWJhY2t0OwkJIAoJY2hhcgkJcnN2ZFsyXTsJ IAoJcGlkX3QJCWN1cmlkOwkJIAoKCWludAkJZXhjcF90eXBlOwkgCgl1bG9uZ190CQlpYXI7CQkg Cgl1bG9uZ190CQltc3I7CQkgCgl1bG9uZ190CQljcjsJCSAKCXVsb25nX3QJCWxyOwkJIAoJdWxv bmdfdAkJY3RyOwkJIAoJdWxvbmdfdAkJeGVyOwkJIAoJdWxvbmdfdAkJbXE7CQkgCiAJdWxvbmdf dAkJdGlkOwkJIAoJdWxvbmdfdAkJZnBzY3I7CQkgCgljaGFyCQlmcGV1OwkJIAoJY2hhciAgICAg ICAgICAgIGZwaW5mbzsgICAgICAgICAgCgljaGFyICAgICAgICAgICAgcGFkWzJdOyAgICAgICAg ICAKCQkJCQkgCgl1bG9uZ190ICAgICAgICAgZXhjZXB0WzVdOwkgCgljaGFyICAgICAgICAgICAg cGFkMVs0XTsgICAgICAgICAKCXVsb25nX3QgICAgICAgICBvX2lhcjsgICAgICAgICAgIAogICAg ICAgIHVsb25nX3QgICAgICAgICBvX3RvYzsgICAgICAgICAgIAoJdWxvbmdfdCAgICAgICAgIG9f YXJnMTsgICAgICAgICAgCgl1bG9uZ190CQlleGNicmFuY2g7CSAKCgoKCXVsb25nX3QgICAgICAg ICBmcHNjcng7ICAgICAgICAgIAoJdWxvbmdfdCAgICAgICAgIG9fdmFkZHI7ICAgICAgICAgCgl1 bG9uZ190CQljYWNoZWFsaWduWzddOwkgCglhZHNwYWNlX3QJYXM7CQkgCgl1bG9uZ190CQlncHJb MzIgXTsJIAoJZG91YmxlCQlmcHJbMzIgXTsJIAojIDE0NCAiL3Vzci9pbmNsdWRlL3N5cy9tc3Rz YXZlLmgiIDMgNAoKfTsKCgogCgoKCgoKCiAKCgoKCgoKIAoKCgogCgoKCgoKIAoKCgoKCiAKCgoK CgoKCgoKZXh0ZXJuIGNoYXIgX19wbWFwX3N0YWNrW107CgoKCgoKCgoKCgoKCgoKCgoKCgojIDI5 NCAiL3Vzci9pbmNsdWRlL3N5cy9tc3RzYXZlLmgiIDMgNAoKCQoKCgojIDQwICIvdXNyL2luY2x1 ZGUvc3lzL2NvbnRleHQuaCIgMiAzIDQKCgogCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKIyAxMTgg Ii91c3IvaW5jbHVkZS9zeXMvY29udGV4dC5oIiAzIDQKCiAKIAoKCgogCgoKCgoKCnN0cnVjdAlf X2ptcGJ1ZiB7CgoJc3RydWN0CW1zdHNhdmUgam1wX2NvbnRleHQ7CgoKCn07IAoKIyAxNDcgIi91 c3IvaW5jbHVkZS9zeXMvY29udGV4dC5oIiAzIDQKCgogCgoKCgpzdHJ1Y3QJX19zaWdjb250ZXh0 IHsKCglpbnQJCXNjX29uc3RhY2s7CSAKCXNpZ3NldF90CXNjX21hc2s7CSAKCWludAkJc2NfdWVy cm9yOwkgCglzdHJ1Y3QgX19qbXBidWYgc2Nfam1wYnVmOwkgCgoKCgoKCn07CgoKCgoKCiAKCgp0 eXBlZGVmIHN0cnVjdCB7Cgl2b2lkICAqc3Nfc3A7CQkgCglzaXplX3Qgc3Nfc2l6ZTsJCSAKCWlu dCAgICBzc19mbGFnczsJIAoJaW50ICAgIF9fcGFkWzRdOwkgCn0gc3RhY2tfdDsKCiAKCgoKCgp0 eXBlZGVmIHN0cnVjdCBfX2ptcGJ1ZiAgIG1jb250ZXh0X3Q7CnR5cGVkZWYgc3RydWN0IF9fdWNv bnRleHQgdWNvbnRleHRfdDsKCnN0cnVjdCBfX3Vjb250ZXh0IHsKCWludAkgICAgX19zY19vbnN0 YWNrOyAgCiAgICAgICAgc2lnc2V0X3QgICAgdWNfc2lnbWFzazsgICAKCiAgICAgICAgaW50CSAg ICBfX3NjX3VlcnJvcjsgIAoJbWNvbnRleHRfdCAgdWNfbWNvbnRleHQ7ICAKCXVjb250ZXh0X3Qg KnVjX2xpbms7ICAgICAgCglzdGFja190ICAgICB1Y19zdGFjazsgICAgIAoJaW50CSAgICBfX3Bh ZFs0XTsJICAKfTsKCgojIDI2OCAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4y L2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvc3lzL3Np Z25hbC5oIiAyIDMgNAoKCiAKCgpzdHJ1Y3QJc2lnc3RhY2sgewoJdm9pZAkqc3Nfc3A7CQkJIAoJ aW50CXNzX29uc3RhY2s7CQkgCn07CgoKCgoKCgoKCgoKCgoKCgogCgoKCgogCgoKCiAKCgoKCgoK IAoKCgoKCgoKCiAKCgoKCgoKCgogCgoKCgoKCgoKIAoKCiAKCgoKCgoKZXh0ZXJuIGludCBzaWdt YXNrKGludCk7CgogCgoKCgoKCgojIDQyNCAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2Mt Mi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUv c3lzL3NpZ25hbC5oIiAzIDQKCgoKCgoKCgoKCgoKCiAKCgpzdHJ1Y3Qgc2lnZXZlbnQgewoJdm9p ZAkgICAgICAgKnNldnRfdmFsdWU7CglzaWduYWxfdAlzZXZ0X3NpZ25vOwp9OwoKIAoKCgoKIAoK CgogIAoKCgoKIAoKCgoKCgoKCiAKCgogICAgICAgCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgpzdHJ1Y3QJc2lndmVjIHsKICAgdW5pb24g ewoKCgkKCgoKCXZvaWQgICAgKCpzdl9oYW5kbGVyKShpbnQpOwkgCgoKICAgICAgICAgCiAgICAg ICAgdm9pZCAgICAoKnN2X3NpZ2FjdGlvbikgKGludCwgc2lnaW5mb190ICosIHZvaWQgKik7CiAg IH0gc3ZfdW5pb247CglpbnQgICAgIHN2X21hc2s7ICAgICAgICAgCglpbnQgICAgIHN2X2ZsYWdz Owp9OyAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoK CgojIDU4NiAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGli L3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvc3lzL3NpZ25hbC5oIiAzIDQK CgogCgoKCgoKCgoKCgoKCmV4dGVybiBpbnQgc2lnd2FpdChjb25zdCBzaWdzZXRfdCAqLCBpbnQg Kik7CgpleHRlcm4gaW50IHNpZ2Jsb2NrKGludCk7CmV4dGVybiBpbnQgc2lnbG9jYWxtYXNrKGlu dCwgY29uc3Qgc2lnc2V0X3QgKik7CmV4dGVybiBpbnQgc2lndmVjKGludCwgc3RydWN0IHNpZ3Zl YyAqLCBzdHJ1Y3Qgc2lndmVjICopOwoKCgoKCgpleHRlcm4gaW50IHNpZ3NldG1hc2soaW50KTsK CgoKCgoKCiMgNjQ5ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2dj Yy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVkZS9zeXMvc2lnbmFsLmgi IDMgNAoKCmV4dGVybiBpbnQga2lsbChwaWRfdCwgaW50KTsKZXh0ZXJuIGludCBzaWdwcm9jbWFz ayhpbnQsIGNvbnN0IHNpZ3NldF90ICosIHNpZ3NldF90ICopOwpleHRlcm4gaW50IHNpZ3N1c3Bl bmQoY29uc3Qgc2lnc2V0X3QgKik7CgpleHRlcm4gaW50IHNpZ2FjdGlvbihpbnQsIGNvbnN0IHN0 cnVjdCBzaWdhY3Rpb24gKiwgc3RydWN0IHNpZ2FjdGlvbiAqKTsKCmV4dGVybiBpbnQgc2lnZW1w dHlzZXQoc2lnc2V0X3QgKik7CmV4dGVybiBpbnQgc2lnZmlsbHNldChzaWdzZXRfdCAqKTsKZXh0 ZXJuIGludCBzaWdhZGRzZXQoc2lnc2V0X3QgKiwgaW50KTsKZXh0ZXJuIGludCBzaWdkZWxzZXQo c2lnc2V0X3QgKiwgaW50KTsKZXh0ZXJuIGludCBzaWdpc21lbWJlcihjb25zdCBzaWdzZXRfdCAq LCBpbnQpOwpleHRlcm4gaW50IHNpZ3BlbmRpbmcoc2lnc2V0X3QgKik7CgoKZXh0ZXJuIHZvaWQg KCpic2Rfc2lnbmFsIChpbnQsIHZvaWQgKCopKGludCkpKShpbnQpOyAKZXh0ZXJuIGludCBraWxs cGcocGlkX3QsIGludCk7CmV4dGVybiBpbnQgc2lnaG9sZChpbnQpOwpleHRlcm4gaW50IHNpZ2ln bm9yZShpbnQpOwpleHRlcm4gaW50IHNpZ2ludGVycnVwdChpbnQsIGludCk7CmV4dGVybiBpbnQg c2lncGF1c2UoaW50KTsKZXh0ZXJuIGludCBzaWdyZWxzZShpbnQpOwpleHRlcm4gdm9pZCAoKnNp Z3NldChpbnQsIHZvaWQoKikoaW50KSkpKGludCk7CgpleHRlcm4gaW50IHNpZ2FsdHN0YWNrKGNv bnN0IHN0YWNrX3QgKiwgc3RhY2tfdCAqKTsKZXh0ZXJuIGludCBzaWdzdGFjayhzdHJ1Y3Qgc2ln c3RhY2sgKiwgc3RydWN0IHNpZ3N0YWNrICopOwoKCgoKCgoKCiMgNDkgIi9ob21lL3R2L3Rvb2xz L2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4w LzIuOTUuMi9pbmNsdWRlL3N5cy93YWl0LmgiIDIgMyA0CgoKCgogCgoKCgoKCgogCgoKCgoKCgoK IAoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoK CgogCgoKdHlwZWRlZiBlbnVtIHtQX0FMTCwgUF9QSUQsIFBfUEdJRH0gaWR0eXBlX3Q7CgoKCgoK CgoKCgoKCgoKCgpleHRlcm4gcGlkX3Qgd2FpdChpbnQgKik7CgpleHRlcm4gcGlkX3Qgd2FpdHBp ZChwaWRfdCwgaW50ICosIGludCk7CgoKCgoKCgoKCgpleHRlcm4gaW50IHdhaXRpZChpZHR5cGVf dCwgaWRfdCwgc2lnaW5mb190ICosIGludCk7CgoKCmV4dGVybiBwaWRfdCB3YWl0MyhpbnQgKiwg aW50LCBzdHJ1Y3QgcnVzYWdlICopOwoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKIyAyMjMgIi9ob21l L3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1h aXg0LjIuMS4wLzIuOTUuMi9pbmNsdWRlL3N0ZGxpYi5oIiAyIDMgNAoKCgojIDIzOCAiL2hvbWUv dHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFp eDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvc3RkbGliLmgiIDMgNAoKCiMgMjg3ICIvaG9tZS90di90 b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4y LjEuMC8yLjk1LjIvaW5jbHVkZS9zdGRsaWIuaCIgMyA0CgoJZXh0ZXJuIGRvdWJsZSAJCWRyYW5k NDgodm9pZCk7CglleHRlcm4gZG91YmxlIAkJZXJhbmQ0OCh1bnNpZ25lZCBzaG9ydFtdKTsKCWV4 dGVybiBsb25nIAkJanJhbmQ0OCh1bnNpZ25lZCBzaG9ydFtdKTsKCWV4dGVybiB2b2lkIAkJbGNv bmc0OCh1bnNpZ25lZCBzaG9ydCBpbnQgKik7CglleHRlcm4gbG9uZyAJCWxyYW5kNDgodm9pZCk7 CglleHRlcm4gbG9uZyAJCW1yYW5kNDgodm9pZCk7CglleHRlcm4gbG9uZyAJCW5yYW5kNDgodW5z aWduZWQgc2hvcnRbXSk7CglleHRlcm4gdW5zaWduZWQgc2hvcnQgCSpzZWVkNDgodW5zaWduZWQg c2hvcnRbXSk7CglleHRlcm4gdm9pZCAJCXNldGtleShjb25zdCBjaGFyICopOwoJZXh0ZXJuIHZv aWQgCQlzcmFuZDQ4KGxvbmcpOwoJZXh0ZXJuIGludCAJCXB1dGVudihjb25zdCBjaGFyICopOwoj IDMzMSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bv d2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvc3RkbGliLmgiIDMgNAoKCglleHRl cm4gbG9uZyBhNjRsKGNvbnN0IGNoYXIgKik7CglleHRlcm4gY2hhciAqZWN2dChkb3VibGUsIGlu dCwgaW50ICosIGludCAqKTsKCWV4dGVybiBjaGFyICpmY3Z0KGRvdWJsZSwgaW50LCBpbnQgKiwg aW50ICopOwoJZXh0ZXJuIGNoYXIgKmdjdnQoZG91YmxlLCBpbnQsIGNoYXIgKik7CglleHRlcm4g aW50ICBnZXRzdWJvcHQoY2hhciAqKiwgY2hhciAqY29uc3QgKiwgY2hhciAqKik7CglleHRlcm4g aW50ICBncmFudHB0KGludCk7CglleHRlcm4gY2hhciAqaW5pdHN0YXRlKHVuc2lnbmVkLCBjaGFy ICosIHNpemVfdCk7CglleHRlcm4gY2hhciAqbDY0YShsb25nKTsKCWV4dGVybiBjaGFyICpta3Rl bXAoY2hhciAqKTsKCWV4dGVybiBpbnQgIG1rc3RlbXAoY2hhciAqKTsKCWV4dGVybiBjaGFyICpw dHNuYW1lKGludCk7CglleHRlcm4gbG9uZyByYW5kb20odm9pZCk7CglleHRlcm4gY2hhciAqcmVh bHBhdGgoY29uc3QgY2hhciAqLCBjaGFyICopOwoJZXh0ZXJuIGNoYXIgKnNldHN0YXRlKGNoYXIg Kik7CglleHRlcm4gdm9pZCBzcmFuZG9tKHVuc2lnbmVkKTsKCWV4dGVybiBpbnQgIHR0eXNsb3Qo dm9pZCk7CglleHRlcm4gaW50ICB1bmxvY2twdChpbnQpOwoJZXh0ZXJuIHZvaWQgKnZhbGxvYyhz aXplX3QpOwoKCgoKCgogCgoKCiAKIAoKCgoKCgoKCgoKCgoKCiAKCgoKIyA0MDggIi9ob21lL3R2 L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0 LjIuMS4wLzIuOTUuMi9pbmNsdWRlL3N0ZGxpYi5oIiAzIDQKCgogCgoKCgoKCgoKCgoKCgoKCiAK CgoKCgoKCgoKZXh0ZXJuIGNoYXIgKm9wdGFyZzsKZXh0ZXJuIGludCBvcHRpbmQ7CmV4dGVybiBp bnQgb3B0ZXJyOwoKIAoKCgoKCgoKCgoKCglleHRlcm4gZmxvYXQgICAgYXRvZmYoY2hhciAqKTsK CWV4dGVybiBmbG9hdCAgICBzdHJ0b2YoY2hhciAqLCBjaGFyICoqKTsKCWV4dGVybiB2b2lkICAg ICBpbXVsX2RibChsb25nLCBsb25nLCBsb25nICopOwoJZXh0ZXJuIHZvaWQgICAgIHVtdWxfZGJs KHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgKik7CgoKCgoKCgoj IDQ3NSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bv d2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvc3RkbGliLmgiIDMgNAoKCWV4dGVy biBkb3VibGUJIHdjc3RvZChjb25zdCB3Y2hhcl90ICosIHdjaGFyX3QgKiopOwoJZXh0ZXJuIGxv bmcgaW50CSB3Y3N0b2woY29uc3Qgd2NoYXJfdCAqLCB3Y2hhcl90ICoqLCBpbnQpOwoJZXh0ZXJu IHVuc2lnbmVkIGxvbmcgaW50IHdjc3RvdWwoY29uc3Qgd2NoYXJfdCAqLCB3Y2hhcl90ICoqLCBp bnQpOwoKCWV4dGVybiBpbnQJCXJwbWF0Y2goY29uc3QgY2hhciAqKTsKCWV4dGVybiBpbnQJCWNs ZWFyZW52KHZvaWQpOwoJZXh0ZXJuIGludAkJZ2V0b3B0KGludCwgY2hhciogY29uc3QqLCBjb25z dCBjaGFyKik7CglleHRlcm4gY2hhcgkJKmdldHBhc3MoY29uc3QgY2hhciAqKTsKCgoKCiAKCgoK CgoKCgoKIAoKCgogCnR5cGVkZWYgc3RydWN0IGxsZGl2X3QgewogICAgIGxvbmcgbG9uZyBpbnQg cXVvdDsgIAogICAgIGxvbmcgbG9uZyBpbnQgcmVtIDsgIAp9IGxsZGl2X3Q7CiAKCgoKCgoKCgog CmV4dGVybiBsb25nIGxvbmcgaW50IGxsYWJzKCBsb25nIGxvbmcgaW50ICk7CmV4dGVybiBsbGRp dl90IGxsZGl2KCBsb25nIGxvbmcgaW50LCBsb25nIGxvbmcgaW50ICk7ICAKZXh0ZXJuIGxvbmcg bG9uZyBpbnQgc3RydG9sbCgKICAgICBjb25zdCBjaGFyICosCSAKICAgICBjaGFyICoqLAkJIAog ICAgIGludCApOwkJIApleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIGludCBzdHJ0b3VsbCgKICAg ICBjb25zdCBjaGFyICosCSAKICAgICBjaGFyICoqLAkJIAogICAgIGludCApOwkJIAogCgogCgoK CiAKCgoKIyA1NCAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2Mt bGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysr LTMvc3RsX2FsbG9jLmgiIDIgMwoKCiMgMSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2Mt Mi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4u Ly4uL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvaW5jbHVkZS9hc3NlcnQuaCIgMSAzIDQKIAoKCgoK CgoKCiMgMTkgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxp Yi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9wb3dlcnBjLWlibS1h aXg0LjIuMS4wL2luY2x1ZGUvYXNzZXJ0LmgiIDMgNAoKCgoKIAoKZXh0ZXJuICJDIiB7CmV4dGVy biB2b2lkIF9fZXByaW50ZiAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkLCBj b25zdCBjaGFyICopCiAgICBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKfQoKCgoKCgoKCgoK CgojIDUyICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIv cG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vcG93ZXJwYy1pYm0tYWl4 NC4yLjEuMC9pbmNsdWRlL2Fzc2VydC5oIiAzIDQKCgoKIyA1NiAiL2hvbWUvdHYvdG9vbHMvZ251 L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45 NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsbG9jLmgiIDIgMwoKCgoKCgoKCgoK CiMgNzggIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9w b3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0 bF9hbGxvYy5oIiAzCgojIDg3ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIv bGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5j bHVkZS9nKystMy9zdGxfYWxsb2MuaCIgMwoKIyA5NyAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAw MC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4u Ly4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsbG9jLmgiIDMKCiMgMTE1ICIvaG9tZS90di90 b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4y LjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxsb2MuaCIgMwoKCiAK CgoKCgoKIAoKCgoKCiAKIAoKCgoKCgoKCgp0ZW1wbGF0ZSA8aW50IF9faW5zdD4KY2xhc3MgX19t YWxsb2NfYWxsb2NfdGVtcGxhdGUgewoKcHJpdmF0ZToKCiAgc3RhdGljIHZvaWQqIF9TX29vbV9t YWxsb2Moc2l6ZV90KTsKICBzdGF0aWMgdm9pZCogX1Nfb29tX3JlYWxsb2Modm9pZCosIHNpemVf dCk7CgoKICBzdGF0aWMgdm9pZCAoKiBfX21hbGxvY19hbGxvY19vb21faGFuZGxlcikoKTsKCgpw dWJsaWM6CgogIHN0YXRpYyB2b2lkKiBhbGxvY2F0ZShzaXplX3QgX19uKQogIHsKICAgIHZvaWQq IF9fcmVzdWx0ID0gbWFsbG9jKF9fbik7CiAgICBpZiAoMCA9PSBfX3Jlc3VsdCkgX19yZXN1bHQg PSBfU19vb21fbWFsbG9jKF9fbik7CiAgICByZXR1cm4gX19yZXN1bHQ7CiAgfQoKICBzdGF0aWMg dm9pZCBkZWFsbG9jYXRlKHZvaWQqIF9fcCwgc2l6ZV90ICApCiAgewogICAgZnJlZShfX3ApOwog IH0KCiAgc3RhdGljIHZvaWQqIHJlYWxsb2NhdGUodm9pZCogX19wLCBzaXplX3QgICwgc2l6ZV90 IF9fbmV3X3N6KQogIHsKICAgIHZvaWQqIF9fcmVzdWx0ID0gcmVhbGxvYyhfX3AsIF9fbmV3X3N6 KTsKICAgIGlmICgwID09IF9fcmVzdWx0KSBfX3Jlc3VsdCA9IF9TX29vbV9yZWFsbG9jKF9fcCwg X19uZXdfc3opOwogICAgcmV0dXJuIF9fcmVzdWx0OwogIH0KCiAgc3RhdGljIHZvaWQgKCogX19z ZXRfbWFsbG9jX2hhbmRsZXIodm9pZCAoKl9fZikoKSkpKCkKICB7CiAgICB2b2lkICgqIF9fb2xk KSgpID0gX19tYWxsb2NfYWxsb2Nfb29tX2hhbmRsZXI7CiAgICBfX21hbGxvY19hbGxvY19vb21f aGFuZGxlciA9IF9fZjsKICAgIHJldHVybihfX29sZCk7CiAgfQoKfTsKCiAKCgp0ZW1wbGF0ZSA8 aW50IF9faW5zdD4Kdm9pZCAoKiBfX21hbGxvY19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+OjpfX21h bGxvY19hbGxvY19vb21faGFuZGxlcikoKSA9IDA7CgoKdGVtcGxhdGUgPGludCBfX2luc3Q+CnZv aWQqCl9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD46Ol9TX29vbV9tYWxsb2Moc2l6ZV90 IF9fbikKewogICAgdm9pZCAoKiBfX215X21hbGxvY19oYW5kbGVyKSgpOwogICAgdm9pZCogX19y ZXN1bHQ7CgogICAgZm9yICg7OykgewogICAgICAgIF9fbXlfbWFsbG9jX2hhbmRsZXIgPSBfX21h bGxvY19hbGxvY19vb21faGFuZGxlcjsKICAgICAgICBpZiAoMCA9PSBfX215X21hbGxvY19oYW5k bGVyKSB7IGNlcnIgPDwgIm91dCBvZiBtZW1vcnkiIDw8IGVuZGw7IGV4aXQoMSkgOyB9CiAgICAg ICAgKCpfX215X21hbGxvY19oYW5kbGVyKSgpOwogICAgICAgIF9fcmVzdWx0ID0gbWFsbG9jKF9f bik7CiAgICAgICAgaWYgKF9fcmVzdWx0KSByZXR1cm4oX19yZXN1bHQpOwogICAgfQp9Cgp0ZW1w bGF0ZSA8aW50IF9faW5zdD4Kdm9pZCogX19tYWxsb2NfYWxsb2NfdGVtcGxhdGU8X19pbnN0Pjo6 X1Nfb29tX3JlYWxsb2Modm9pZCogX19wLCBzaXplX3QgX19uKQp7CiAgICB2b2lkICgqIF9fbXlf bWFsbG9jX2hhbmRsZXIpKCk7CiAgICB2b2lkKiBfX3Jlc3VsdDsKCiAgICBmb3IgKDs7KSB7CiAg ICAgICAgX19teV9tYWxsb2NfaGFuZGxlciA9IF9fbWFsbG9jX2FsbG9jX29vbV9oYW5kbGVyOwog ICAgICAgIGlmICgwID09IF9fbXlfbWFsbG9jX2hhbmRsZXIpIHsgY2VyciA8PCAib3V0IG9mIG1l bW9yeSIgPDwgZW5kbDsgZXhpdCgxKSA7IH0KICAgICAgICAoKl9fbXlfbWFsbG9jX2hhbmRsZXIp KCk7CiAgICAgICAgX19yZXN1bHQgPSByZWFsbG9jKF9fcCwgX19uKTsKICAgICAgICBpZiAoX19y ZXN1bHQpIHJldHVybihfX3Jlc3VsdCk7CiAgICB9Cn0KCnR5cGVkZWYgX19tYWxsb2NfYWxsb2Nf dGVtcGxhdGU8MD4gbWFsbG9jX2FsbG9jOwoKdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxs b2M+CmNsYXNzIHNpbXBsZV9hbGxvYyB7CgpwdWJsaWM6CiAgICBzdGF0aWMgX1RwKiBhbGxvY2F0 ZShzaXplX3QgX19uKQogICAgICB7IHJldHVybiAwID09IF9fbiA/IDAgOiAoX1RwKikgX0FsbG9j OjphbGxvY2F0ZShfX24gKiBzaXplb2YgKF9UcCkpOyB9CiAgICBzdGF0aWMgX1RwKiBhbGxvY2F0 ZSh2b2lkKQogICAgICB7IHJldHVybiAoX1RwKikgX0FsbG9jOjphbGxvY2F0ZShzaXplb2YgKF9U cCkpOyB9CiAgICBzdGF0aWMgdm9pZCBkZWFsbG9jYXRlKF9UcCogX19wLCBzaXplX3QgX19uKQog ICAgICB7IGlmICgwICE9IF9fbikgX0FsbG9jOjpkZWFsbG9jYXRlKF9fcCwgX19uICogc2l6ZW9m IChfVHApKTsgfQogICAgc3RhdGljIHZvaWQgZGVhbGxvY2F0ZShfVHAqIF9fcCkKICAgICAgeyBf QWxsb2M6OmRlYWxsb2NhdGUoX19wLCBzaXplb2YgKF9UcCkpOyB9Cn07CgogCiAKIAogCiAKdGVt cGxhdGUgPGNsYXNzIF9BbGxvYz4KY2xhc3MgZGVidWdfYWxsb2MgewoKcHJpdmF0ZToKCiAgZW51 bSB7X1NfZXh0cmEgPSA4fTsgICAKICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg ICAgICAgICAgICAgICAgCgpwdWJsaWM6CgogIHN0YXRpYyB2b2lkKiBhbGxvY2F0ZShzaXplX3Qg X19uKQogIHsKICAgIGNoYXIqIF9fcmVzdWx0ID0gKGNoYXIqKV9BbGxvYzo6YWxsb2NhdGUoX19u ICsgX1NfZXh0cmEpOwogICAgKihzaXplX3QqKV9fcmVzdWx0ID0gX19uOwogICAgcmV0dXJuIF9f cmVzdWx0ICsgX1NfZXh0cmE7CiAgfQoKICBzdGF0aWMgdm9pZCBkZWFsbG9jYXRlKHZvaWQqIF9f cCwgc2l6ZV90IF9fbikKICB7CiAgICBjaGFyKiBfX3JlYWxfcCA9IChjaGFyKilfX3AgLSBfU19l eHRyYTsKICAgICgodm9pZCkgKCggKihzaXplX3QqKV9fcmVhbF9wID09IF9fbiApID8gMCA6IChf X2VwcmludGYgKCIlczoldTogZmFpbGVkIGFzc2VydGlvbiBgJXMnXG4iLAkgICIvaG9tZS90di90 b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4y LjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxsb2MuaCIgLCAgIDI2 MyAsICAiKihzaXplX3QqKV9fcmVhbF9wID09IF9fbiIgKSwgMCkgKSkgOwogICAgX0FsbG9jOjpk ZWFsbG9jYXRlKF9fcmVhbF9wLCBfX24gKyBfU19leHRyYSk7CiAgfQoKICBzdGF0aWMgdm9pZCog cmVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNpemVfdCBfX29sZF9zeiwgc2l6ZV90IF9fbmV3X3N6KQog IHsKICAgIGNoYXIqIF9fcmVhbF9wID0gKGNoYXIqKV9fcCAtIF9TX2V4dHJhOwogICAgKCh2b2lk KSAoKCAqKHNpemVfdCopX19yZWFsX3AgPT0gX19vbGRfc3ogKSA/IDAgOiAoX19lcHJpbnRmICgi JXM6JXU6IGZhaWxlZCBhc3NlcnRpb24gYCVzJ1xuIiwJICAiL2hvbWUvdHYvdG9vbHMvZ251L3Jz NjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4y Ly4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsbG9jLmgiICwgICAyNzAgLCAgIiooc2l6 ZV90KilfX3JlYWxfcCA9PSBfX29sZF9zeiIgKSwgMCkgKSkgOwogICAgY2hhciogX19yZXN1bHQg PSAoY2hhciopCiAgICAgIF9BbGxvYzo6cmVhbGxvY2F0ZShfX3JlYWxfcCwgX19vbGRfc3ogKyBf U19leHRyYSwgX19uZXdfc3ogKyBfU19leHRyYSk7CiAgICAqKHNpemVfdCopX19yZXN1bHQgPSBf X25ld19zejsKICAgIHJldHVybiBfX3Jlc3VsdCArIF9TX2V4dHJhOwogIH0KCn07CgoKCgoKCgoK CgogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCiAKIAogCiAKIAogCiAKIAogCgoKCgoKCgp0 ZW1wbGF0ZSA8Ym9vbCB0aHJlYWRzLCBpbnQgaW5zdD4KY2xhc3MgX19kZWZhdWx0X2FsbG9jX3Rl bXBsYXRlIHsKCnByaXZhdGU6CiAgIAogICAKCiAgICBlbnVtIHtfQUxJR04gPSA4fTsKICAgIGVu dW0ge19NQVhfQllURVMgPSAxMjh9OwogICAgZW51bSB7X05GUkVFTElTVFMgPSBfTUFYX0JZVEVT L19BTElHTn07CgogIHN0YXRpYyBzaXplX3QKICBfU19yb3VuZF91cChzaXplX3QgX19ieXRlcykK ICAgIHsgcmV0dXJuICgoKF9fYnl0ZXMpICsgX0FMSUdOLTEpICYgfihfQUxJR04gLSAxKSk7IH0K CnByaXZhdGUgOgogIHVuaW9uIF9PYmogewogICAgICAgIHVuaW9uIF9PYmoqIF9NX2ZyZWVfbGlz dF9saW5rOwogICAgICAgIGNoYXIgX01fY2xpZW50X2RhdGFbMV07ICAgICAKICB9Owpwcml2YXRl OgoKCgoKICAgIHN0YXRpYyBfT2JqKiAgIF9TX2ZyZWVfbGlzdFtfTkZSRUVMSVNUU107CgogIHN0 YXRpYyAgc2l6ZV90IF9TX2ZyZWVsaXN0X2luZGV4KHNpemVfdCBfX2J5dGVzKSB7CiAgICAgICAg cmV0dXJuICgoKF9fYnl0ZXMpICsgX0FMSUdOLTEpL19BTElHTiAtIDEpOwogIH0KCiAgIAogIHN0 YXRpYyB2b2lkKiBfU19yZWZpbGwoc2l6ZV90IF9fbik7CiAgIAogICAKICBzdGF0aWMgY2hhciog X1NfY2h1bmtfYWxsb2Moc2l6ZV90IF9fc2l6ZSwgaW50JiBfX25vYmpzKTsKCiAgIAogIHN0YXRp YyBjaGFyKiBfU19zdGFydF9mcmVlOwogIHN0YXRpYyBjaGFyKiBfU19lbmRfZnJlZTsKICBzdGF0 aWMgc2l6ZV90IF9TX2hlYXBfc2l6ZTsKCgoKCgoKCgoKCgoKCgoKIyAzODkgIi9ob21lL3R2L3Rv b2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIu MS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGxvYy5oIiAzCgoKICAg IGNsYXNzIF9Mb2NrIHsKICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgIF9Mb2NrKCkgeyAgOyB9 CiAgICAgICAgICAgIH5fTG9jaygpIHsgIDsgfQogICAgfTsKICAgIGZyaWVuZCBjbGFzcyBfTG9j azsKCnB1YmxpYzoKCiAgIAogIHN0YXRpYyB2b2lkKiBhbGxvY2F0ZShzaXplX3QgX19uKQogIHsK ICAgIF9PYmoqICAqIF9fbXlfZnJlZV9saXN0OwogICAgX09iaiogICBfX3Jlc3VsdDsKCiAgICBp ZiAoX19uID4gKHNpemVfdCkgX01BWF9CWVRFUykgewogICAgICAgIHJldHVybihtYWxsb2NfYWxs b2M6OmFsbG9jYXRlKF9fbikpOwogICAgfQogICAgX19teV9mcmVlX2xpc3QgPSBfU19mcmVlX2xp c3QgKyBfU19mcmVlbGlzdF9pbmRleChfX24pOwogICAgIAogICAgIAogICAgIAoKCgoKICAgIF9f cmVzdWx0ID0gKl9fbXlfZnJlZV9saXN0OwogICAgaWYgKF9fcmVzdWx0ID09IDApIHsKICAgICAg ICB2b2lkKiBfX3IgPSBfU19yZWZpbGwoX1Nfcm91bmRfdXAoX19uKSk7CiAgICAgICAgcmV0dXJu IF9fcjsKICAgIH0KICAgICpfX215X2ZyZWVfbGlzdCA9IF9fcmVzdWx0IC0+IF9NX2ZyZWVfbGlz dF9saW5rOwogICAgcmV0dXJuIChfX3Jlc3VsdCk7CiAgfTsKCiAgIAogIHN0YXRpYyB2b2lkIGRl YWxsb2NhdGUodm9pZCogX19wLCBzaXplX3QgX19uKQogIHsKICAgIF9PYmoqIF9fcSA9IChfT2Jq KilfX3A7CiAgICBfT2JqKiAgKiBfX215X2ZyZWVfbGlzdDsKCiAgICBpZiAoX19uID4gKHNpemVf dCkgX01BWF9CWVRFUykgewogICAgICAgIG1hbGxvY19hbGxvYzo6ZGVhbGxvY2F0ZShfX3AsIF9f bik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgX19teV9mcmVlX2xpc3QgPSBfU19mcmVlX2xp c3QgKyBfU19mcmVlbGlzdF9pbmRleChfX24pOwogICAgIAoKCgoKICAgIF9fcSAtPiBfTV9mcmVl X2xpc3RfbGluayA9ICpfX215X2ZyZWVfbGlzdDsKICAgICpfX215X2ZyZWVfbGlzdCA9IF9fcTsK ICAgICAKICB9CgogIHN0YXRpYyB2b2lkKiByZWFsbG9jYXRlKHZvaWQqIF9fcCwgc2l6ZV90IF9f b2xkX3N6LCBzaXplX3QgX19uZXdfc3opOwoKfSA7Cgp0eXBlZGVmIF9fZGVmYXVsdF9hbGxvY190 ZW1wbGF0ZTwgZmFsc2UgLCAwPiBhbGxvYzsKdHlwZWRlZiBfX2RlZmF1bHRfYWxsb2NfdGVtcGxh dGU8ZmFsc2UsIDA+IHNpbmdsZV9jbGllbnRfYWxsb2M7CgoKCiAKIAogCiAKdGVtcGxhdGUgPGJv b2wgX190aHJlYWRzLCBpbnQgX19pbnN0PgpjaGFyKgpfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8 X190aHJlYWRzLCBfX2luc3Q+OjpfU19jaHVua19hbGxvYyhzaXplX3QgX19zaXplLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQm IF9fbm9ianMpCnsKICAgIGNoYXIqIF9fcmVzdWx0OwogICAgc2l6ZV90IF9fdG90YWxfYnl0ZXMg PSBfX3NpemUgKiBfX25vYmpzOwogICAgc2l6ZV90IF9fYnl0ZXNfbGVmdCA9IF9TX2VuZF9mcmVl IC0gX1Nfc3RhcnRfZnJlZTsKCiAgICBpZiAoX19ieXRlc19sZWZ0ID49IF9fdG90YWxfYnl0ZXMp IHsKICAgICAgICBfX3Jlc3VsdCA9IF9TX3N0YXJ0X2ZyZWU7CiAgICAgICAgX1Nfc3RhcnRfZnJl ZSArPSBfX3RvdGFsX2J5dGVzOwogICAgICAgIHJldHVybihfX3Jlc3VsdCk7CiAgICB9IGVsc2Ug aWYgKF9fYnl0ZXNfbGVmdCA+PSBfX3NpemUpIHsKICAgICAgICBfX25vYmpzID0gKGludCkoX19i eXRlc19sZWZ0L19fc2l6ZSk7CiAgICAgICAgX190b3RhbF9ieXRlcyA9IF9fc2l6ZSAqIF9fbm9i anM7CiAgICAgICAgX19yZXN1bHQgPSBfU19zdGFydF9mcmVlOwogICAgICAgIF9TX3N0YXJ0X2Zy ZWUgKz0gX190b3RhbF9ieXRlczsKICAgICAgICByZXR1cm4oX19yZXN1bHQpOwogICAgfSBlbHNl IHsKICAgICAgICBzaXplX3QgX19ieXRlc190b19nZXQgPQoJICAyICogX190b3RhbF9ieXRlcyAr IF9TX3JvdW5kX3VwKF9TX2hlYXBfc2l6ZSA+PiA0KTsKICAgICAgICAgCiAgICAgICAgaWYgKF9f Ynl0ZXNfbGVmdCA+IDApIHsKICAgICAgICAgICAgX09iaiogICogX19teV9mcmVlX2xpc3QgPQog ICAgICAgICAgICAgICAgICAgICAgICBfU19mcmVlX2xpc3QgKyBfU19mcmVlbGlzdF9pbmRleChf X2J5dGVzX2xlZnQpOwoKICAgICAgICAgICAgKChfT2JqKilfU19zdGFydF9mcmVlKSAtPiBfTV9m cmVlX2xpc3RfbGluayA9ICpfX215X2ZyZWVfbGlzdDsKICAgICAgICAgICAgKl9fbXlfZnJlZV9s aXN0ID0gKF9PYmoqKV9TX3N0YXJ0X2ZyZWU7CiAgICAgICAgfQogICAgICAgIF9TX3N0YXJ0X2Zy ZWUgPSAoY2hhciopbWFsbG9jKF9fYnl0ZXNfdG9fZ2V0KTsKICAgICAgICBpZiAoMCA9PSBfU19z dGFydF9mcmVlKSB7CiAgICAgICAgICAgIHNpemVfdCBfX2k7CiAgICAgICAgICAgIF9PYmoqICAq IF9fbXlfZnJlZV9saXN0OwoJICAgIF9PYmoqIF9fcDsKICAgICAgICAgICAgIAogICAgICAgICAg ICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgZm9yIChfX2kgPSBfX3NpemU7IF9faSA8PSBf TUFYX0JZVEVTOyBfX2kgKz0gX0FMSUdOKSB7CiAgICAgICAgICAgICAgICBfX215X2ZyZWVfbGlz dCA9IF9TX2ZyZWVfbGlzdCArIF9TX2ZyZWVsaXN0X2luZGV4KF9faSk7CiAgICAgICAgICAgICAg ICBfX3AgPSAqX19teV9mcmVlX2xpc3Q7CiAgICAgICAgICAgICAgICBpZiAoMCAhPSBfX3ApIHsK ICAgICAgICAgICAgICAgICAgICAqX19teV9mcmVlX2xpc3QgPSBfX3AgLT4gX01fZnJlZV9saXN0 X2xpbms7CiAgICAgICAgICAgICAgICAgICAgX1Nfc3RhcnRfZnJlZSA9IChjaGFyKilfX3A7CiAg ICAgICAgICAgICAgICAgICAgX1NfZW5kX2ZyZWUgPSBfU19zdGFydF9mcmVlICsgX19pOwogICAg ICAgICAgICAgICAgICAgIHJldHVybihfU19jaHVua19hbGxvYyhfX3NpemUsIF9fbm9ianMpKTsK ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgfQogICAgICAgICAgICB9CgkgICAgX1NfZW5kX2ZyZWUgPSAwOwkgCiAgICAgICAgICAgIF9T X3N0YXJ0X2ZyZWUgPSAoY2hhciopbWFsbG9jX2FsbG9jOjphbGxvY2F0ZShfX2J5dGVzX3RvX2dl dCk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgfQog ICAgICAgIF9TX2hlYXBfc2l6ZSArPSBfX2J5dGVzX3RvX2dldDsKICAgICAgICBfU19lbmRfZnJl ZSA9IF9TX3N0YXJ0X2ZyZWUgKyBfX2J5dGVzX3RvX2dldDsKICAgICAgICByZXR1cm4oX1NfY2h1 bmtfYWxsb2MoX19zaXplLCBfX25vYmpzKSk7CiAgICB9Cn0KCgogCiAKIAp0ZW1wbGF0ZSA8Ym9v bCBfX3RocmVhZHMsIGludCBfX2luc3Q+CnZvaWQqCl9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxf X3RocmVhZHMsIF9faW5zdD46Ol9TX3JlZmlsbChzaXplX3QgX19uKQp7CiAgICBpbnQgX19ub2Jq cyA9IDIwOwogICAgY2hhciogX19jaHVuayA9IF9TX2NodW5rX2FsbG9jKF9fbiwgX19ub2Jqcyk7 CiAgICBfT2JqKiAgKiBfX215X2ZyZWVfbGlzdDsKICAgIF9PYmoqIF9fcmVzdWx0OwogICAgX09i aiogX19jdXJyZW50X29iajsKICAgIF9PYmoqIF9fbmV4dF9vYmo7CiAgICBpbnQgX19pOwoKICAg IGlmICgxID09IF9fbm9ianMpIHJldHVybihfX2NodW5rKTsKICAgIF9fbXlfZnJlZV9saXN0ID0g X1NfZnJlZV9saXN0ICsgX1NfZnJlZWxpc3RfaW5kZXgoX19uKTsKCiAgICAgCiAgICAgIF9fcmVz dWx0ID0gKF9PYmoqKV9fY2h1bms7CiAgICAgICpfX215X2ZyZWVfbGlzdCA9IF9fbmV4dF9vYmog PSAoX09iaiopKF9fY2h1bmsgKyBfX24pOwogICAgICBmb3IgKF9faSA9IDE7IDsgX19pKyspIHsK ICAgICAgICBfX2N1cnJlbnRfb2JqID0gX19uZXh0X29iajsKICAgICAgICBfX25leHRfb2JqID0g KF9PYmoqKSgoY2hhciopX19uZXh0X29iaiArIF9fbik7CiAgICAgICAgaWYgKF9fbm9ianMgLSAx ID09IF9faSkgewogICAgICAgICAgICBfX2N1cnJlbnRfb2JqIC0+IF9NX2ZyZWVfbGlzdF9saW5r ID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgX19j dXJyZW50X29iaiAtPiBfTV9mcmVlX2xpc3RfbGluayA9IF9fbmV4dF9vYmo7CiAgICAgICAgfQog ICAgICB9CiAgICByZXR1cm4oX19yZXN1bHQpOwp9Cgp0ZW1wbGF0ZSA8Ym9vbCB0aHJlYWRzLCBp bnQgaW5zdD4Kdm9pZCoKX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPHRocmVhZHMsIGluc3Q+Ojpy ZWFsbG9jYXRlKHZvaWQqIF9fcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNpemVfdCBfX29sZF9zeiwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX25ld19zeikKewogICAgdm9pZCog X19yZXN1bHQ7CiAgICBzaXplX3QgX19jb3B5X3N6OwoKICAgIGlmIChfX29sZF9zeiA+IChzaXpl X3QpIF9NQVhfQllURVMgJiYgX19uZXdfc3ogPiAoc2l6ZV90KSBfTUFYX0JZVEVTKSB7CiAgICAg ICAgcmV0dXJuKHJlYWxsb2MoX19wLCBfX25ld19zeikpOwogICAgfQogICAgaWYgKF9TX3JvdW5k X3VwKF9fb2xkX3N6KSA9PSBfU19yb3VuZF91cChfX25ld19zeikpIHJldHVybihfX3ApOwogICAg X19yZXN1bHQgPSBhbGxvY2F0ZShfX25ld19zeik7CiAgICBfX2NvcHlfc3ogPSBfX25ld19zeiA+ IF9fb2xkX3N6PyBfX29sZF9zeiA6IF9fbmV3X3N6OwogICAgbWVtY3B5KF9fcmVzdWx0LCBfX3As IF9fY29weV9zeik7CiAgICBkZWFsbG9jYXRlKF9fcCwgX19vbGRfc3opOwogICAgcmV0dXJuKF9f cmVzdWx0KTsKfQoKCgoKCgoKCgoKCgoKCgojIDYwMiAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAw MC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4u Ly4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsbG9jLmgiIDMKCgojIDY4OSAiL2hvbWUvdHYv dG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQu Mi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsbG9jLmgiIDMKCgp0 ZW1wbGF0ZSA8Ym9vbCBfX3RocmVhZHMsIGludCBfX2luc3Q+CmNoYXIqIF9fZGVmYXVsdF9hbGxv Y190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD46Ol9TX3N0YXJ0X2ZyZWUgPSAwOwoKdGVtcGxh dGUgPGJvb2wgX190aHJlYWRzLCBpbnQgX19pbnN0PgpjaGFyKiBfX2RlZmF1bHRfYWxsb2NfdGVt cGxhdGU8X190aHJlYWRzLCBfX2luc3Q+OjpfU19lbmRfZnJlZSA9IDA7Cgp0ZW1wbGF0ZSA8Ym9v bCBfX3RocmVhZHMsIGludCBfX2luc3Q+CnNpemVfdCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8 X190aHJlYWRzLCBfX2luc3Q+OjpfU19oZWFwX3NpemUgPSAwOwoKdGVtcGxhdGUgPGJvb2wgX190 aHJlYWRzLCBpbnQgX19pbnN0PgpfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBf X2luc3Q+OjpfT2JqKiAgCl9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5z dD4gOjpfU19mcmVlX2xpc3RbCiAgICBfTkZSRUVMSVNUUwpdID0gezAsIDAsIDAsIDAsIDAsIDAs IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIH07CiAKIAogCgoKCgoKCgoKCgogCiAKIAog CiAKIAogCgoKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmNsYXNzIGFsbG9jYXRvciB7CiAgdHlwZWRl ZiBhbGxvYyBfQWxsb2M7ICAgICAgICAgICAKcHVibGljOgogIHR5cGVkZWYgc2l6ZV90ICAgICBz aXplX3R5cGU7CiAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVm IF9UcCogICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIGNvbnN0IF9UcCogY29uc3RfcG9pbnRlcjsK ICB0eXBlZGVmIF9UcCYgICAgICAgcmVmZXJlbmNlOwogIHR5cGVkZWYgY29uc3QgX1RwJiBjb25z dF9yZWZlcmVuY2U7CiAgdHlwZWRlZiBfVHAgICAgICAgIHZhbHVlX3R5cGU7CgogIHRlbXBsYXRl IDxjbGFzcyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKICAgIHR5cGVkZWYgYWxsb2NhdG9yPF9UcDE+ IG90aGVyOwogIH07CgogIGFsbG9jYXRvcigpIHRocm93KCkgIHt9CiAgYWxsb2NhdG9yKGNvbnN0 IGFsbG9jYXRvciYpIHRocm93KCkgIHt9CiAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IGFsbG9jYXRv cihjb25zdCBhbGxvY2F0b3I8X1RwMT4mKSB0aHJvdygpICB7fQogIH5hbGxvY2F0b3IoKSB0aHJv dygpICB7fQoKICBwb2ludGVyIGFkZHJlc3MocmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4g Jl9feDsgfQogIGNvbnN0X3BvaW50ZXIgYWRkcmVzcyhjb25zdF9yZWZlcmVuY2UgX194KSBjb25z dCB7IHJldHVybiAmX194OyB9CgogICAKICAgCiAgX1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19u LCBjb25zdCB2b2lkKiA9IDApIHsKICAgIHJldHVybiBfX24gIT0gMCA/IHN0YXRpY19jYXN0PF9U cCo+KF9BbGxvYzo6YWxsb2NhdGUoX19uICogc2l6ZW9mKF9UcCkpKQogICAgICAgICAgICAgICAg ICAgIDogMDsKICB9CgogICAKICB2b2lkIGRlYWxsb2NhdGUocG9pbnRlciBfX3AsIHNpemVfdHlw ZSBfX24pCiAgICB7IF9BbGxvYzo6ZGVhbGxvY2F0ZShfX3AsIF9fbiAqIHNpemVvZihfVHApKTsg fQoKICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB0aHJvdygpIAogICAgeyByZXR1cm4gc2l6 ZV90KC0xKSAvIHNpemVvZihfVHApOyB9CgogIHZvaWQgY29uc3RydWN0KHBvaW50ZXIgX19wLCBj b25zdCBfVHAmIF9fdmFsKSB7IG5ldyhfX3ApIF9UcChfX3ZhbCk7IH0KICB2b2lkIGRlc3Ryb3ko cG9pbnRlciBfX3ApIHsgX19wLT5+X1RwKCk7IH0KfTsKCnRlbXBsYXRlPD4KY2xhc3MgYWxsb2Nh dG9yPHZvaWQ+IHsKICB0eXBlZGVmIHNpemVfdCAgICAgIHNpemVfdHlwZTsKICB0eXBlZGVmIHB0 cmRpZmZfdCAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIHZvaWQqICAgICAgIHBvaW50ZXI7 CiAgdHlwZWRlZiBjb25zdCB2b2lkKiBjb25zdF9wb2ludGVyOwogIHR5cGVkZWYgdm9pZCAgICAg ICAgdmFsdWVfdHlwZTsKCiAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQgewog ICAgdHlwZWRlZiBhbGxvY2F0b3I8X1RwMT4gb3RoZXI7CiAgfTsKfTsKCgp0ZW1wbGF0ZSA8Y2xh c3MgX1QxLCBjbGFzcyBfVDI+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgYWxsb2NhdG9y PF9UMT4mLCBjb25zdCBhbGxvY2F0b3I8X1QyPiYpCnsKICByZXR1cm4gdHJ1ZTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgppbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGFs bG9jYXRvcjxfVDE+JiwgY29uc3QgYWxsb2NhdG9yPF9UMj4mKQp7CiAgcmV0dXJuIGZhbHNlOwp9 CgogCiAKIAogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgpzdHJ1Y3Qg X19hbGxvY2F0b3IgewogIF9BbGxvYyBfX3VuZGVybHlpbmdfYWxsb2M7CgogIHR5cGVkZWYgc2l6 ZV90ICAgIHNpemVfdHlwZTsKICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CiAg dHlwZWRlZiBfVHAqICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiBjb25zdCBfVHAqIGNvbnN0X3Bv aW50ZXI7CiAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsKICB0eXBlZGVmIGNvbnN0IF9U cCYgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgX1RwICAgICAgICB2YWx1ZV90eXBlOwoKICB0 ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gc3RydWN0IHJlYmluZCB7CiAgICB0eXBlZGVmIF9fYWxsb2Nh dG9yPF9UcDEsIF9BbGxvYz4gb3RoZXI7CiAgfTsKCiAgX19hbGxvY2F0b3IoKSB0aHJvdygpICB7 fQogIF9fYWxsb2NhdG9yKGNvbnN0IF9fYWxsb2NhdG9yJiBfX2EpIHRocm93KCkgCiAgICA6IF9f dW5kZXJseWluZ19hbGxvYyhfX2EuX191bmRlcmx5aW5nX2FsbG9jKSB7fQogIHRlbXBsYXRlIDxj bGFzcyBfVHAxPgogIF9fYWxsb2NhdG9yKGNvbnN0IF9fYWxsb2NhdG9yPF9UcDEsIF9BbGxvYz4m IF9fYSkgdGhyb3coKSAKICAgIDogX191bmRlcmx5aW5nX2FsbG9jKF9fYS5fX3VuZGVybHlpbmdf YWxsb2MpIHt9CiAgfl9fYWxsb2NhdG9yKCkgdGhyb3coKSAge30KCiAgcG9pbnRlciBhZGRyZXNz KHJlZmVyZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuICZfX3g7IH0KICBjb25zdF9wb2ludGVyIGFk ZHJlc3MoY29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQoKICAgCiAg X1RwKiBhbGxvY2F0ZShzaXplX3R5cGUgX19uLCBjb25zdCB2b2lkKiA9IDApIHsKICAgIHJldHVy biBfX24gIT0gMAogICAgICAgID8gc3RhdGljX2Nhc3Q8X1RwKj4oX191bmRlcmx5aW5nX2FsbG9j LmFsbG9jYXRlKF9fbiAqIHNpemVvZihfVHApKSkKICAgICAgICA6IDA7CiAgfQoKICAgCiAgdm9p ZCBkZWFsbG9jYXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQogICAgeyBfX3VuZGVybHlp bmdfYWxsb2MuZGVhbGxvY2F0ZShfX3AsIF9fbiAqIHNpemVvZihfVHApKTsgfQoKICBzaXplX3R5 cGUgbWF4X3NpemUoKSBjb25zdCB0aHJvdygpIAogICAgeyByZXR1cm4gc2l6ZV90KC0xKSAvIHNp emVvZihfVHApOyB9CgogIHZvaWQgY29uc3RydWN0KHBvaW50ZXIgX19wLCBjb25zdCBfVHAmIF9f dmFsKSB7IG5ldyhfX3ApIF9UcChfX3ZhbCk7IH0KICB2b2lkIGRlc3Ryb3kocG9pbnRlciBfX3Ap IHsgX19wLT5+X1RwKCk7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CmNsYXNzIF9fYWxs b2NhdG9yPHZvaWQsIF9BbGxvYz4gewogIHR5cGVkZWYgc2l6ZV90ICAgICAgc2l6ZV90eXBlOwog IHR5cGVkZWYgcHRyZGlmZl90ICAgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgdm9pZCogICAg ICAgcG9pbnRlcjsKICB0eXBlZGVmIGNvbnN0IHZvaWQqIGNvbnN0X3BvaW50ZXI7CiAgdHlwZWRl ZiB2b2lkICAgICAgICB2YWx1ZV90eXBlOwoKICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gc3RydWN0 IHJlYmluZCB7CiAgICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcDEsIF9BbGxvYz4gb3RoZXI7CiAg fTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KaW5saW5lIGJvb2wgb3Bl cmF0b3I9PShjb25zdCBfX2FsbG9jYXRvcjxfVHAsIF9BbGxvYz4mIF9fYTEsCiAgICAgICAgICAg ICAgICAgICAgICAgY29uc3QgX19hbGxvY2F0b3I8X1RwLCBfQWxsb2M+JiBfX2EyKQp7CiAgcmV0 dXJuIF9fYTEuX191bmRlcmx5aW5nX2FsbG9jID09IF9fYTIuX191bmRlcmx5aW5nX2FsbG9jOwp9 CgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgppbmxpbmUgYm9vbCBvcGVyYXRv ciE9KGNvbnN0IF9fYWxsb2NhdG9yPF9UcCwgX0FsbG9jPiYgX19hMSwKICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBfX2FsbG9jYXRvcjxfVHAsIF9BbGxvYz4mIF9fYTIpCnsKICByZXR1cm4g X19hMS5fX3VuZGVybHlpbmdfYWxsb2MgIT0gX19hMi5fX3VuZGVybHlpbmdfYWxsb2M7Cn0KCgog CiAKIAoKdGVtcGxhdGUgPGludCBpbnN0PgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9f bWFsbG9jX2FsbG9jX3RlbXBsYXRlPGluc3Q+JiwKICAgICAgICAgICAgICAgICAgICAgICBjb25z dCBfX21hbGxvY19hbGxvY190ZW1wbGF0ZTxpbnN0PiYpCnsKICByZXR1cm4gdHJ1ZTsKfQoKCnRl bXBsYXRlIDxpbnQgX19pbnN0PgppbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9fbWFsbG9j X2FsbG9jX3RlbXBsYXRlPF9faW5zdD4mLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9f bWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD4mKQp7CiAgcmV0dXJuIGZhbHNlOwp9CgoKCnRl bXBsYXRlIDxib29sIF9fdGhyZWFkcywgaW50IF9faW5zdD4KaW5saW5lIGJvb2wgb3BlcmF0b3I9 PShjb25zdCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+JiwKICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJl YWRzLCBfX2luc3Q+JikKewogIHJldHVybiB0cnVlOwp9CgoKdGVtcGxhdGUgPGJvb2wgX190aHJl YWRzLCBpbnQgX19pbnN0PgppbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF9fZGVmYXVsdF9h bGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD4mLAogICAgICAgICAgICAgICAgICAgICAg IGNvbnN0IF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD4mKQp7CiAg cmV0dXJuIGZhbHNlOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CmlubGluZSBib29sIG9w ZXJhdG9yPT0oY29uc3QgZGVidWdfYWxsb2M8X0FsbG9jPiYsCiAgICAgICAgICAgICAgICAgICAg ICAgY29uc3QgZGVidWdfYWxsb2M8X0FsbG9jPiYpIHsKICByZXR1cm4gdHJ1ZTsKfQoKCnRlbXBs YXRlIDxjbGFzcyBfQWxsb2M+CmlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgZGVidWdfYWxs b2M8X0FsbG9jPiYsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVidWdfYWxsb2M8X0Fs bG9jPiYpIHsKICByZXR1cm4gZmFsc2U7Cn0KCgogCiAKIAogCiAKIAoKIAogCiAKIAogCiAKCiAK IAogCiAKIAogCiAKIAogCiAKIAoKIAoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9j YXRvcj4Kc3RydWN0IF9BbGxvY190cmFpdHMKewogIHN0YXRpYyBjb25zdCBib29sIF9TX2luc3Rh bmNlbGVzcyA9IGZhbHNlOwogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jYXRvcjo6ICAgcmViaW5k PF9UcD46Om90aGVyCiAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKfTsKCnRlbXBsYXRlIDxjbGFz cyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CmNvbnN0IGJvb2wgX0FsbG9jX3RyYWl0czxfVHAsIF9B bGxvY2F0b3I+OjpfU19pbnN0YW5jZWxlc3M7CgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFz cyBfVHAxPgpzdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIGFsbG9jYXRvcjxfVHAxPiA+CnsKICBz dGF0aWMgY29uc3QgYm9vbCBfU19pbnN0YW5jZWxlc3MgPSB0cnVlOwogIHR5cGVkZWYgc2ltcGxl X2FsbG9jPF9UcCwgYWxsb2M+IF9BbGxvY190eXBlOwogIHR5cGVkZWYgYWxsb2NhdG9yPF9UcD4g YWxsb2NhdG9yX3R5cGU7Cn07CgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBpbnQgX19pbnN0Pgpz dHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD4g Pgp7CiAgc3RhdGljIGNvbnN0IGJvb2wgX1NfaW5zdGFuY2VsZXNzID0gdHJ1ZTsKICB0eXBlZGVm IHNpbXBsZV9hbGxvYzxfVHAsIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD4gPiBfQWxs b2NfdHlwZTsKICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcCwgX19tYWxsb2NfYWxsb2NfdGVtcGxh dGU8X19pbnN0PiA+IGFsbG9jYXRvcl90eXBlOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGJv b2wgX190aHJlYWRzLCBpbnQgX19pbnN0PgpzdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIF9fZGVm YXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD4gPgp7CiAgc3RhdGljIGNvbnN0 IGJvb2wgX1NfaW5zdGFuY2VsZXNzID0gdHJ1ZTsKICB0eXBlZGVmIHNpbXBsZV9hbGxvYzxfVHAs IF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD4gPgogICAgICAgICAg X0FsbG9jX3R5cGU7CiAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAsIF9fZGVmYXVsdF9hbGxvY190 ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD4gPgogICAgICAgICAgYWxsb2NhdG9yX3R5cGU7Cn07 CgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgpzdHJ1Y3QgX0FsbG9jX3RyYWl0 czxfVHAsIGRlYnVnX2FsbG9jPF9BbGxvYz4gPgp7CiAgc3RhdGljIGNvbnN0IGJvb2wgX1NfaW5z dGFuY2VsZXNzID0gdHJ1ZTsKICB0eXBlZGVmIHNpbXBsZV9hbGxvYzxfVHAsIGRlYnVnX2FsbG9j PF9BbGxvYz4gPiBfQWxsb2NfdHlwZTsKICB0eXBlZGVmIF9fYWxsb2NhdG9yPF9UcCwgZGVidWdf YWxsb2M8X0FsbG9jPiA+IGFsbG9jYXRvcl90eXBlOwp9OwoKIAogCgp0ZW1wbGF0ZSA8Y2xhc3Mg X1RwLCBjbGFzcyBfVHAxLCBpbnQgX19pbnN0PgpzdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsCiAg ICAgICAgICAgICAgICAgICAgIF9fYWxsb2NhdG9yPF9UcDEsIF9fbWFsbG9jX2FsbG9jX3RlbXBs YXRlPF9faW5zdD4gPiA+CnsKICBzdGF0aWMgY29uc3QgYm9vbCBfU19pbnN0YW5jZWxlc3MgPSB0 cnVlOwogIHR5cGVkZWYgc2ltcGxlX2FsbG9jPF9UcCwgX19tYWxsb2NfYWxsb2NfdGVtcGxhdGU8 X19pbnN0PiA+IF9BbGxvY190eXBlOwogIHR5cGVkZWYgX19hbGxvY2F0b3I8X1RwLCBfX21hbGxv Y19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+ID4gYWxsb2NhdG9yX3R5cGU7Cn07CgoKdGVtcGxhdGUg PGNsYXNzIF9UcCwgY2xhc3MgX1RwMSwgYm9vbCBfX3RociwgaW50IF9faW5zdD4Kc3RydWN0IF9B bGxvY190cmFpdHM8X1RwLAogICAgICAgICAgICAgICAgICAgICAgX19hbGxvY2F0b3I8X1RwMSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0 ZTxfX3RociwgX19pbnN0PiA+ID4KewogIHN0YXRpYyBjb25zdCBib29sIF9TX2luc3RhbmNlbGVz cyA9IHRydWU7CiAgdHlwZWRlZiBzaW1wbGVfYWxsb2M8X1RwLCBfX2RlZmF1bHRfYWxsb2NfdGVt cGxhdGU8X190aHIsX19pbnN0PiA+CiAgICAgICAgICBfQWxsb2NfdHlwZTsKICB0eXBlZGVmIF9f YWxsb2NhdG9yPF9UcCwgX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyLF9faW5zdD4gPgog ICAgICAgICAgYWxsb2NhdG9yX3R5cGU7Cn07CgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3Mg X1RwMSwgY2xhc3MgX0FsbG9jPgpzdHJ1Y3QgX0FsbG9jX3RyYWl0czxfVHAsIF9fYWxsb2NhdG9y PF9UcDEsIGRlYnVnX2FsbG9jPF9BbGxvYz4gPiA+CnsKICBzdGF0aWMgY29uc3QgYm9vbCBfU19p bnN0YW5jZWxlc3MgPSB0cnVlOwogIHR5cGVkZWYgc2ltcGxlX2FsbG9jPF9UcCwgZGVidWdfYWxs b2M8X0FsbG9jPiA+IF9BbGxvY190eXBlOwogIHR5cGVkZWYgX19hbGxvY2F0b3I8X1RwLCBkZWJ1 Z19hbGxvYzxfQWxsb2M+ID4gYWxsb2NhdG9yX3R5cGU7Cn07CgoKCgoKCgoKIAoKCgoKCiAKIAog CiMgMjEgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9w b3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2Fs bG9jLmgiIDIgMwoKCgojIDQwICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIv bGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5j bHVkZS9nKystMy9hbGxvYy5oIiAzCgoKCgogCiAKIAojIDM5ICIvaG9tZS90di90b29scy9nbnUv cnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1 LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGQvYmFzdHJpbmcuaCIgMiAzCgoKZXh0ZXJu ICJDKysiIHsKY2xhc3MgaXN0cmVhbTsgY2xhc3Mgb3N0cmVhbTsKCiMgMSAiL2hvbWUvdHYvdG9v bHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4x LjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvaXRlcmF0b3IiIDEgMwogCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2dj Yy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4v Li4vLi4vaW5jbHVkZS9nKystMy9zdGxfcmVsb3BzLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgogCgoKCgoKCiAKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmlubGluZSBib29sIG9wZXJh dG9yIT0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSB7CiAgcmV0dXJuICEoX194ID09 IF9feSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmlubGluZSBib29sIG9wZXJhdG9yPihjb25z dCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIHsKICByZXR1cm4gX195IDwgX194Owp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IF9UcCYgX194LCBj b25zdCBfVHAmIF9feSkgewogIHJldHVybiAhKF9feSA8IF9feCk7Cn0KCnRlbXBsYXRlIDxjbGFz cyBfVHA+CmlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYg X195KSB7CiAgcmV0dXJuICEoX194IDwgX195KTsKfQoKIAoKCgogCiAKIAojIDMxICIvaG9tZS90 di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4 NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9pdGVyYXRvciIgMiAzCgoj IDEgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dl cnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMgNAojIDM0MiAi L2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMt aWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDMgNAoKIyAzMiAiL2hvbWUv dHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFp eDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvaXRlcmF0b3IiIDIgMwoK CgoKCgojIDEgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxp Yi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0z L3N0bF9pdGVyYXRvci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgog CgpzdHJ1Y3QgaW5wdXRfaXRlcmF0b3JfdGFnIHt9OwpzdHJ1Y3Qgb3V0cHV0X2l0ZXJhdG9yX3Rh ZyB7fTsKc3RydWN0IGZvcndhcmRfaXRlcmF0b3JfdGFnIDogcHVibGljIGlucHV0X2l0ZXJhdG9y X3RhZyB7fTsKc3RydWN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIDogcHVibGljIGZvcndh cmRfaXRlcmF0b3JfdGFnIHt9OwpzdHJ1Y3QgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgOiBw dWJsaWMgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcge307CgogCiAKIAogCgp0ZW1wbGF0ZSA8 Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+IHN0cnVjdCBpbnB1dF9pdGVyYXRvciB7CiAgdHlw ZWRlZiBpbnB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAg ICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIF9EaXN0YW5jZSAgICAgICAgICBk aWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfVHAqICAgICAgICAgICAgICAgcG9pbnRlcjsKICB0 eXBlZGVmIF9UcCYgICAgICAgICAgICAgICByZWZlcmVuY2U7Cn07CgpzdHJ1Y3Qgb3V0cHV0X2l0 ZXJhdG9yIHsKICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7 CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB2b2lk ICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAg ICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwp9 OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPiBzdHJ1Y3QgZm9yd2FyZF9p dGVyYXRvciB7CiAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29y eTsKICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBf RGlzdGFuY2UgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfVHAqICAgICAg ICAgICAgICAgICBwb2ludGVyOwogIHR5cGVkZWYgX1RwJiAgICAgICAgICAgICAgICAgcmVmZXJl bmNlOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4gc3RydWN0IGJp ZGlyZWN0aW9uYWxfaXRlcmF0b3IgewogIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90 YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAg ICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgX0Rpc3RhbmNlICAgICAgICAgICAgICAgICAgZGlmZmVy ZW5jZV90eXBlOwogIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsK ICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKfTsKCnRlbXBs YXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4gc3RydWN0IHJhbmRvbV9hY2Nlc3NfaXRl cmF0b3IgewogIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0 ZWdvcnk7CiAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwog IHR5cGVkZWYgX0Rpc3RhbmNlICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwogIHR5 cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIF9UcCYg ICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKfTsKCiMgOTggIi9ob21lL3R2L3Rvb2xz L2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4w LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9pdGVyYXRvci5oIiAzCgoKCgp0 ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgpzdHJ1Y3QgaXRlcmF0b3JfdHJhaXRzIHsKICB0eXBl ZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6aXRlcmF0b3JfY2F0ZWdvcnkgaXRlcmF0b3JfY2F0ZWdv cnk7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnZhbHVlX3R5cGUgICAgICAgIHZhbHVl X3R5cGU7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OmRpZmZlcmVuY2VfdHlwZSAgIGRp ZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6cG9pbnRlciAgICAg ICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9JdGVyYXRvcjo6cmVmZXJlbmNlICAg ICAgICAgcmVmZXJlbmNlOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGl0ZXJhdG9y X3RyYWl0czxfVHAqPiB7CiAgdHlwZWRlZiByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZyBpdGVy YXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1 ZV90eXBlOwogIHR5cGVkZWYgcHRyZGlmZl90ICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2Vf dHlwZTsKICB0eXBlZGVmIF9UcCogICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOwogIHR5 cGVkZWYgX1RwJiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKfTsKCnRlbXBsYXRl IDxjbGFzcyBfVHA+CnN0cnVjdCBpdGVyYXRvcl90cmFpdHM8Y29uc3QgX1RwKj4gewogIHR5cGVk ZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRl ZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIHB0cmRp ZmZfdCAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBjb25zdCBf VHAqICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAg ICAgICAgICAgICByZWZlcmVuY2U7Cn07CgogCiAKIAogCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0 ZXI+CmlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+OjppdGVyYXRvcl9jYXRl Z29yeQpfX2l0ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9JdGVyJikKewogIHR5cGVkZWYgdHlwZW5h bWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnkgX0NhdGVnb3J5Owog IHJldHVybiBfQ2F0ZWdvcnkoKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgppbmxpbmUgdHlw ZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6ZGlmZmVyZW5jZV90eXBlKgpfX2Rpc3RhbmNl X3R5cGUoY29uc3QgX0l0ZXImKQp7CiAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIGl0ZXJh dG9yX3RyYWl0czxfSXRlcj46OmRpZmZlcmVuY2VfdHlwZSo+KDApOwp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX0l0ZXI+CmlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+Ojp2YWx1ZV90 eXBlKgpfX3ZhbHVlX3R5cGUoY29uc3QgX0l0ZXImKQp7CiAgcmV0dXJuIHN0YXRpY19jYXN0PHR5 cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46OnZhbHVlX3R5cGUqPigwKTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9JdGVyPgppbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6 aXRlcmF0b3JfY2F0ZWdvcnkKaXRlcmF0b3JfY2F0ZWdvcnkoY29uc3QgX0l0ZXImIF9faSkgeyBy ZXR1cm4gX19pdGVyYXRvcl9jYXRlZ29yeShfX2kpOyB9CgoKdGVtcGxhdGUgPGNsYXNzIF9JdGVy PgppbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6ZGlmZmVyZW5jZV90eXBl KgpkaXN0YW5jZV90eXBlKGNvbnN0IF9JdGVyJiBfX2kpIHsgcmV0dXJuIF9fZGlzdGFuY2VfdHlw ZShfX2kpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXI+CmlubGluZSB0eXBlbmFtZSBpdGVyYXRv cl90cmFpdHM8X0l0ZXI+Ojp2YWx1ZV90eXBlKgp2YWx1ZV90eXBlKGNvbnN0IF9JdGVyJiBfX2kp IHsgcmV0dXJuIF9fdmFsdWVfdHlwZShfX2kpOyB9CgoKCgoKIyAyNTkgIi9ob21lL3R2L3Rvb2xz L2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4w LzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9pdGVyYXRvci5oIiAzCgoKdGVt cGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSB2b2lk IF9fZGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0 LAogICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSYgX19uLCBpbnB1dF9pdGVyYXRvcl90 YWcpCnsKICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsgKytfX2ZpcnN0OyArK19fbjsgfQp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+ CmlubGluZSB2b2lkIF9fZGlzdGFuY2UoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIAog ICAgICAgICAgICAgICAgICAgICAgIF9SYW5kb21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsIAogICAg ICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSYgX19uLCByYW5kb21fYWNjZXNzX2l0ZXJhdG9y X3RhZykKewogIF9fbiArPSBfX2xhc3QgLSBfX2ZpcnN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lu cHV0SXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIHZvaWQgZGlzdGFuY2UoX0lucHV0 SXRlcmF0b3IgX19maXJzdCwgCiAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9f bGFzdCwgX0Rpc3RhbmNlJiBfX24pCnsKICBfX2Rpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwgX19u LCBpdGVyYXRvcl9jYXRlZ29yeShfX2ZpcnN0KSk7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1 dEl0ZXJhdG9yPgppbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJhdG9y Pjo6ZGlmZmVyZW5jZV90eXBlCl9fZGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lu cHV0SXRlcmF0b3IgX19sYXN0LCBpbnB1dF9pdGVyYXRvcl90YWcpCnsKICB0eXBlbmFtZSBpdGVy YXRvcl90cmFpdHM8X0lucHV0SXRlcmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUgX19uID0gMDsKICB3 aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIHsKICAgICsrX19maXJzdDsgKytfX247CiAgfQogIHJl dHVybiBfX247Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3I+CmlubGlu ZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X1JhbmRvbUFjY2Vzc0l0ZXJhdG9yPjo6ZGlmZmVy ZW5jZV90eXBlCl9fZGlzdGFuY2UoX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fZmlyc3QsIF9SYW5k b21BY2Nlc3NJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRv cl90YWcpIHsKICByZXR1cm4gX19sYXN0IC0gX19maXJzdDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9J bnB1dEl0ZXJhdG9yPgppbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXJh dG9yPjo6ZGlmZmVyZW5jZV90eXBlCmRpc3RhbmNlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9J bnB1dEl0ZXJhdG9yIF9fbGFzdCkgewogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRz PF9JbnB1dEl0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnkgCiAgICBfQ2F0ZWdvcnk7CiAgcmV0 dXJuIF9fZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfQ2F0ZWdvcnkoKSk7Cn0KCgoKdGVtcGxh dGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIHZvaWQgX19hZHZh bmNlKF9JbnB1dEl0ZXImIF9faSwgX0Rpc3RhbmNlIF9fbiwgaW5wdXRfaXRlcmF0b3JfdGFnKSB7 CiAgd2hpbGUgKF9fbi0tKSArK19faTsKfQoKCgoKCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rp b25hbEl0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSB2b2lkIF9fYWR2YW5jZShfQmlk aXJlY3Rpb25hbEl0ZXJhdG9yJiBfX2ksIF9EaXN0YW5jZSBfX24sIAogICAgICAgICAgICAgICAg ICAgICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcpIHsKICBpZiAoX19uID49IDApCiAgICB3 aGlsZSAoX19uLS0pICsrX19pOwogIGVsc2UKICAgIHdoaWxlIChfX24rKykgLS1fX2k7Cn0KCgoK Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yLCBjbGFzcyBfRGlzdGFuY2U+ CmlubGluZSB2b2lkIF9fYWR2YW5jZShfUmFuZG9tQWNjZXNzSXRlcmF0b3ImIF9faSwgX0Rpc3Rh bmNlIF9fbiwgCiAgICAgICAgICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3Rh ZykgewogIF9faSArPSBfX247Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvciwgY2xh c3MgX0Rpc3RhbmNlPgppbmxpbmUgdm9pZCBhZHZhbmNlKF9JbnB1dEl0ZXJhdG9yJiBfX2ksIF9E aXN0YW5jZSBfX24pIHsKICBfX2FkdmFuY2UoX19pLCBfX24sIGl0ZXJhdG9yX2NhdGVnb3J5KF9f aSkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KY2xhc3MgYmFja19pbnNlcnRfaXRl cmF0b3Igewpwcm90ZWN0ZWQ6CiAgX0NvbnRhaW5lciogY29udGFpbmVyOwpwdWJsaWM6CiAgdHlw ZWRlZiBfQ29udGFpbmVyICAgICAgICAgIGNvbnRhaW5lcl90eXBlOwogIHR5cGVkZWYgb3V0cHV0 X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAg ICAgICAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgZGlmZmVyZW5j ZV90eXBlOwogIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBwb2ludGVyOwogIHR5cGVkZWYg dm9pZCAgICAgICAgICAgICAgICByZWZlcmVuY2U7CgogIGV4cGxpY2l0IGJhY2tfaW5zZXJ0X2l0 ZXJhdG9yKF9Db250YWluZXImIF9feCkgOiBjb250YWluZXIoJl9feCkge30KICBiYWNrX2luc2Vy dF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRh aW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkgeyAKICAgIGNvbnRhaW5lci0+cHVzaF9iYWNrKF9f dmFsdWUpOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29u dGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0KICBiYWNrX2luc2VydF9pdGVy YXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CiAgYmFja19p bnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhp czsgfQp9OwoKIyAzNzggIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIv Z2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRl L2crKy0zL3N0bF9pdGVyYXRvci5oIiAzCgoKdGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+Cmlu bGluZSBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiBiYWNrX2luc2VydGVyKF9Db250 YWluZXImIF9feCkgewogIHJldHVybiBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihf X3gpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KY2xhc3MgZnJvbnRfaW5zZXJ0X2l0 ZXJhdG9yIHsKcHJvdGVjdGVkOgogIF9Db250YWluZXIqIGNvbnRhaW5lcjsKcHVibGljOgogIHR5 cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWluZXJfdHlwZTsKICB0eXBlZGVmIG91dHB1 dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiB2b2lkICAgICAgICAg ICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVu Y2VfdHlwZTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVm IHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwoKICBleHBsaWNpdCBmcm9udF9pbnNlcnRf aXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7fQogIGZyb250X2lu c2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKICBvcGVyYXRvcj0oY29uc3QgdHlwZW5hbWUgX0Nv bnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkgeyAKICAgIGNvbnRhaW5lci0+cHVzaF9mcm9u dChfX3ZhbHVlKTsKICAgIHJldHVybiAqdGhpczsKICB9CiAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9y PF9Db250YWluZXI+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQogIGZyb250X2luc2Vy dF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CiAg ZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKGludCkgeyByZXR1 cm4gKnRoaXM7IH0KfTsKCiMgNDE3ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1 LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4v aW5jbHVkZS9nKystMy9zdGxfaXRlcmF0b3IuaCIgMwoKCnRlbXBsYXRlIDxjbGFzcyBfQ29udGFp bmVyPgppbmxpbmUgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+IGZyb250X2luc2Vy dGVyKF9Db250YWluZXImIF9feCkgewogIHJldHVybiBmcm9udF9pbnNlcnRfaXRlcmF0b3I8X0Nv bnRhaW5lcj4oX194KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXI+CmNsYXNzIGluc2Vy dF9pdGVyYXRvciB7CnByb3RlY3RlZDoKICBfQ29udGFpbmVyKiBjb250YWluZXI7CiAgdHlwZW5h bWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgaXRlcjsKcHVibGljOgogIHR5cGVkZWYgX0NvbnRhaW5l ciAgICAgICAgICBjb250YWluZXJfdHlwZTsKICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcg aXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5 cGU7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBl ZGVmIHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIHZvaWQgICAgICAgICAg ICAgICAgcmVmZXJlbmNlOwoKICBpbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194LCB0eXBl bmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBfX2kpIAogICAgOiBjb250YWluZXIoJl9feCksIGl0 ZXIoX19pKSB7fQogIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKICBvcGVyYXRvcj0oY29u c3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkgeyAKICAgIGl0ZXIg PSBjb250YWluZXItPmluc2VydChpdGVyLCBfX3ZhbHVlKTsKICAgICsraXRlcjsKICAgIHJldHVy biAqdGhpczsKICB9CiAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvciooKSB7 IHJldHVybiAqdGhpczsgfQogIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3Ir KygpIHsgcmV0dXJuICp0aGlzOyB9CiAgaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVy YXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KfTsKCiMgNDU5ICIvaG9tZS90di90b29scy9n bnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8y Ljk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfaXRlcmF0b3IuaCIgMwoKCnRlbXBs YXRlIDxjbGFzcyBfQ29udGFpbmVyLCBjbGFzcyBfSXRlcmF0b3I+CmlubGluZSAKaW5zZXJ0X2l0 ZXJhdG9yPF9Db250YWluZXI+IGluc2VydGVyKF9Db250YWluZXImIF9feCwgX0l0ZXJhdG9yIF9f aSkKewogIHR5cGVkZWYgdHlwZW5hbWUgX0NvbnRhaW5lcjo6aXRlcmF0b3IgX19pdGVyOwogIHJl dHVybiBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4oX194LCBfX2l0ZXIoX19pKSk7Cn0KCgp0 ZW1wbGF0ZSA8Y2xhc3MgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciwgY2xhc3MgX1RwLCBjbGFzcyBf UmVmZXJlbmNlID0gX1RwJiwgCiAgICAgICAgICBjbGFzcyBfRGlzdGFuY2UgPSBwdHJkaWZmX3Q+ IAoKCgoKY2xhc3MgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yIHsKICB0eXBlZGVmIHJl dmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBfVHAs IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SZWZlcmVuY2UsIF9E aXN0YW5jZT4gIF9TZWxmOwpwcm90ZWN0ZWQ6CiAgX0JpZGlyZWN0aW9uYWxJdGVyYXRvciBjdXJy ZW50OwpwdWJsaWM6CiAgdHlwZWRlZiBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyBpdGVyYXRv cl9jYXRlZ29yeTsKICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5 cGU7CiAgdHlwZWRlZiBfRGlzdGFuY2UgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7 CiAgdHlwZWRlZiBfVHAqICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyOwogIHR5cGVkZWYg X1JlZmVyZW5jZSAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwoKICByZXZlcnNlX2JpZGlyZWN0 aW9uYWxfaXRlcmF0b3IoKSB7fQogIGV4cGxpY2l0IHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVy YXRvcihfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIF9feCkKICAgIDogY3VycmVudChfX3gpIHt9CiAg X0JpZGlyZWN0aW9uYWxJdGVyYXRvciBiYXNlKCkgY29uc3QgeyByZXR1cm4gY3VycmVudDsgfQog IF9SZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgewogICAgX0JpZGlyZWN0aW9uYWxJdGVyYXRv ciBfX3RtcCA9IGN1cnJlbnQ7CiAgICByZXR1cm4gKi0tX190bXA7CiAgfQoKICBwb2ludGVyIG9w ZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQoKICBfU2VsZiYgb3Bl cmF0b3IrKygpIHsKICAgIC0tY3VycmVudDsKICAgIHJldHVybiAqdGhpczsKICB9CiAgX1NlbGYg b3BlcmF0b3IrKyhpbnQpIHsKICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CiAgICAtLWN1cnJlbnQ7 CiAgICByZXR1cm4gX190bXA7CiAgfQogIF9TZWxmJiBvcGVyYXRvci0tKCkgewogICAgKytjdXJy ZW50OwogICAgcmV0dXJuICp0aGlzOwogIH0KICBfU2VsZiBvcGVyYXRvci0tKGludCkgewogICAg X1NlbGYgX190bXAgPSAqdGhpczsKICAgICsrY3VycmVudDsKICAgIHJldHVybiBfX3RtcDsKICB9 Cn07CgojIDU1MCAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2Mt bGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysr LTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlciwgY2xhc3MgX1Rw LCBjbGFzcyBfUmVmLAogICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgYm9vbCBvcGVy YXRvcj09KAogICAgY29uc3QgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaUl0ZXIs IF9UcCwgX1JlZiwgX0Rpc3RhbmNlPiYgX194LCAKICAgIGNvbnN0IHJldmVyc2VfYmlkaXJlY3Rp b25hbF9pdGVyYXRvcjxfQmlJdGVyLCBfVHAsIF9SZWYsIF9EaXN0YW5jZT4mIF9feSkKewogIHJl dHVybiBfX3guYmFzZSgpID09IF9feS5iYXNlKCk7Cn0KCgoKIAogCiAKIAogCgp0ZW1wbGF0ZSA8 Y2xhc3MgX0l0ZXJhdG9yPgpjbGFzcyByZXZlcnNlX2l0ZXJhdG9yIAp7CnByb3RlY3RlZDoKICBf SXRlcmF0b3IgY3VycmVudDsKcHVibGljOgogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJh aXRzPF9JdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5CiAgICAgICAgICBpdGVyYXRvcl9jYXRl Z29yeTsKICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojp2YWx1 ZV90eXBlCiAgICAgICAgICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3Jf dHJhaXRzPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQogICAgICAgICAgZGlmZmVyZW5jZV90 eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnBvaW50 ZXIKICAgICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8 X0l0ZXJhdG9yPjo6cmVmZXJlbmNlCiAgICAgICAgICByZWZlcmVuY2U7CgogIHR5cGVkZWYgX0l0 ZXJhdG9yIGl0ZXJhdG9yX3R5cGU7CiAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRv cj4gX1NlbGY7CgpwdWJsaWM6CiAgcmV2ZXJzZV9pdGVyYXRvcigpIHt9CiAgZXhwbGljaXQgcmV2 ZXJzZV9pdGVyYXRvcihpdGVyYXRvcl90eXBlIF9feCkgOiBjdXJyZW50KF9feCkge30KCiAgcmV2 ZXJzZV9pdGVyYXRvcihjb25zdCBfU2VsZiYgX194KSA6IGN1cnJlbnQoX194LmN1cnJlbnQpIHt9 CgogIHRlbXBsYXRlIDxjbGFzcyBfSXRlcj4KICByZXZlcnNlX2l0ZXJhdG9yKGNvbnN0IHJldmVy c2VfaXRlcmF0b3I8X0l0ZXI+JiBfX3gpCiAgICA6IGN1cnJlbnQoX194LmJhc2UoKSkge30KCiAg ICAKICBpdGVyYXRvcl90eXBlIGJhc2UoKSBjb25zdCB7IHJldHVybiBjdXJyZW50OyB9CiAgcmVm ZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKICAgIF9JdGVyYXRvciBfX3RtcCA9IGN1cnJlbnQ7 CiAgICByZXR1cm4gKi0tX190bXA7CiAgfQoKICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7 IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQoKCiAgX1NlbGYmIG9wZXJhdG9yKysoKSB7CiAgICAt LWN1cnJlbnQ7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7 CiAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOwogICAgLS1jdXJyZW50OwogICAgcmV0dXJuIF9fdG1w OwogIH0KICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsKICAgICsrY3VycmVudDsKICAgIHJldHVybiAq dGhpczsKICB9CiAgX1NlbGYgb3BlcmF0b3ItLShpbnQpIHsKICAgIF9TZWxmIF9fdG1wID0gKnRo aXM7CiAgICArK2N1cnJlbnQ7CiAgICByZXR1cm4gX190bXA7CiAgfQoKICBfU2VsZiBvcGVyYXRv cisoZGlmZmVyZW5jZV90eXBlIF9fbikgY29uc3QgewogICAgcmV0dXJuIF9TZWxmKGN1cnJlbnQg LSBfX24pOwogIH0KICBfU2VsZiYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7CiAg ICBjdXJyZW50IC09IF9fbjsKICAgIHJldHVybiAqdGhpczsKICB9CiAgX1NlbGYgb3BlcmF0b3It KGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0IHsKICAgIHJldHVybiBfU2VsZihjdXJyZW50ICsg X19uKTsKICB9CiAgX1NlbGYmIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIF9fbikgewogICAg Y3VycmVudCArPSBfX247CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIHJlZmVyZW5jZSBvcGVyYXRv cltdKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNvbnN0IHsgcmV0dXJuICooKnRoaXMgKyBfX24pOyB9 ICAKfTsgCiAKdGVtcGxhdGUgPGNsYXNzIF9JdGVyYXRvcj4KaW5saW5lIGJvb2wgb3BlcmF0b3I9 PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCwgCiAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpIHsKICByZXR1 cm4gX194LmJhc2UoKSA9PSBfX3kuYmFzZSgpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9y PgppbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+ JiBfX3gsIAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRl cmF0b3I+JiBfX3kpIHsKICByZXR1cm4gX195LmJhc2UoKSA8IF9feC5iYXNlKCk7Cn0KCnRlbXBs YXRlIDxjbGFzcyBfSXRlcmF0b3I+CmlubGluZSB0eXBlbmFtZSByZXZlcnNlX2l0ZXJhdG9yPF9J dGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZQpvcGVyYXRvci0oY29uc3QgcmV2ZXJzZV9pdGVyYXRv cjxfSXRlcmF0b3I+JiBfX3gsIAogICAgICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRl cmF0b3I+JiBfX3kpIHsKICByZXR1cm4gX195LmJhc2UoKSAtIF9feC5iYXNlKCk7Cn0KCnRlbXBs YXRlIDxjbGFzcyBfSXRlcmF0b3I+CmlubGluZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4g Cm9wZXJhdG9yKyh0eXBlbmFtZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj46OmRpZmZlcmVu Y2VfdHlwZSBfX24sCiAgICAgICAgICBjb25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4m IF9feCkgewogIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4oX194LmJhc2UoKSAt IF9fbik7Cn0KCiMgODA1ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGli L2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVk ZS9nKystMy9zdGxfaXRlcmF0b3IuaCIgMwoKCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xh c3MgX0Rpc3QgPSBwdHJkaWZmX3Q+IApjbGFzcyBpc3RyZWFtX2l0ZXJhdG9yIHsKICBmcmllbmQg Ym9vbCBvcGVyYXRvcj09IDw+ICAoY29uc3QgaXN0cmVhbV9pdGVyYXRvciYsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXN0cmVhbV9pdGVyYXRv ciYpOwpwcm90ZWN0ZWQ6CiAgaXN0cmVhbSogX01fc3RyZWFtOwogIF9UcCBfTV92YWx1ZTsKICBi b29sIF9NX2VuZF9tYXJrZXI7CiAgdm9pZCBfTV9yZWFkKCkgewogICAgX01fZW5kX21hcmtlciA9 ICgqX01fc3RyZWFtKSA/IHRydWUgOiBmYWxzZTsKICAgIGlmIChfTV9lbmRfbWFya2VyKSAqX01f c3RyZWFtID4+IF9NX3ZhbHVlOwogICAgX01fZW5kX21hcmtlciA9ICgqX01fc3RyZWFtKSA/IHRy dWUgOiBmYWxzZTsKICB9CnB1YmxpYzoKICB0eXBlZGVmIGlucHV0X2l0ZXJhdG9yX3RhZyAgaXRl cmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7 CiAgdHlwZWRlZiBfRGlzdCAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVm IGNvbnN0IF9UcCogICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIGNvbnN0IF9UcCYgICAgICAg ICAgcmVmZXJlbmNlOwoKICBpc3RyZWFtX2l0ZXJhdG9yKCkgOiBfTV9zdHJlYW0oJmNpbiksIF9N X2VuZF9tYXJrZXIoZmFsc2UpIHt9CiAgaXN0cmVhbV9pdGVyYXRvcihpc3RyZWFtJiBfX3MpIDog X01fc3RyZWFtKCZfX3MpIHsgX01fcmVhZCgpOyB9CiAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNv bnN0IHsgcmV0dXJuIF9NX3ZhbHVlOyB9CgogIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsg cmV0dXJuICYob3BlcmF0b3IqKCkpOyB9CgogIGlzdHJlYW1faXRlcmF0b3I8X1RwLCBfRGlzdD4m IG9wZXJhdG9yKysoKSB7IAogICAgX01fcmVhZCgpOyAKICAgIHJldHVybiAqdGhpczsKICB9CiAg aXN0cmVhbV9pdGVyYXRvcjxfVHAsIF9EaXN0PiBvcGVyYXRvcisrKGludCkgIHsKICAgIGlzdHJl YW1faXRlcmF0b3I8X1RwLCBfRGlzdD4gX190bXAgPSAqdGhpczsKICAgIF9NX3JlYWQoKTsKICAg IHJldHVybiBfX3RtcDsKICB9Cn07CgojIDg2NCAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9n Y2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4u Ly4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgp0ZW1wbGF0ZSA8Y2xhc3Mg X1RwLCBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgaXN0cmVh bV9pdGVyYXRvcjxfVHAsIF9EaXN0YW5jZT4mIF9feCwKICAgICAgICAgICAgICAgICAgICAgICBj b25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYgX195KSB7CiAgcmV0dXJuIChf X3guX01fc3RyZWFtID09IF9feS5fTV9zdHJlYW0gJiYKICAgICAgICAgIF9feC5fTV9lbmRfbWFy a2VyID09IF9feS5fTV9lbmRfbWFya2VyKSB8fAogICAgICAgICBfX3guX01fZW5kX21hcmtlciA9 PSBmYWxzZSAmJiBfX3kuX01fZW5kX21hcmtlciA9PSBmYWxzZTsKfQoKdGVtcGxhdGUgPGNsYXNz IF9UcD4KY2xhc3Mgb3N0cmVhbV9pdGVyYXRvciB7CnByb3RlY3RlZDoKICBvc3RyZWFtKiBfTV9z dHJlYW07CiAgY29uc3QgY2hhciogX01fc3RyaW5nOwpwdWJsaWM6CiAgdHlwZWRlZiBvdXRwdXRf aXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgdm9pZCAgICAgICAgICAg ICAgICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNl X3R5cGU7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiB2 b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKCiAgb3N0cmVhbV9pdGVyYXRvcihvc3RyZWFt JiBfX3MpIDogX01fc3RyZWFtKCZfX3MpLCBfTV9zdHJpbmcoMCkge30KICBvc3RyZWFtX2l0ZXJh dG9yKG9zdHJlYW0mIF9fcywgY29uc3QgY2hhciogX19jKSAKICAgIDogX01fc3RyZWFtKCZfX3Mp LCBfTV9zdHJpbmcoX19jKSAge30KICBvc3RyZWFtX2l0ZXJhdG9yPF9UcD4mIG9wZXJhdG9yPShj b25zdCBfVHAmIF9fdmFsdWUpIHsgCiAgICAqX01fc3RyZWFtIDw8IF9fdmFsdWU7CiAgICBpZiAo X01fc3RyaW5nKSAqX01fc3RyZWFtIDw8IF9NX3N0cmluZzsKICAgIHJldHVybiAqdGhpczsKICB9 CiAgb3N0cmVhbV9pdGVyYXRvcjxfVHA+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQog IG9zdHJlYW1faXRlcmF0b3I8X1RwPiYgb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9IAog IG9zdHJlYW1faXRlcmF0b3I8X1RwPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0aGlzOyB9 IAp9OwoKIyA5MDcgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2Nj LWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2cr Ky0zL3N0bF9pdGVyYXRvci5oIiAzCgoKIAoKCgogCiAKIAojIDM4ICIvaG9tZS90di90b29scy9n bnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8y Ljk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9pdGVyYXRvciIgMiAzCgoKCgogCiAKIAoj IDQ0ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93 ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGQv YmFzdHJpbmcuaCIgMiAzCgoKCgpleHRlcm4gdm9pZCBfX291dF9vZl9yYW5nZSAoY29uc3QgY2hh ciAqKTsKZXh0ZXJuIHZvaWQgX19sZW5ndGhfZXJyb3IgKGNvbnN0IGNoYXIgKik7CgoKCgoKCgoK CgoKCgoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMgPSBzdHJpbmdfY2hhcl90 cmFpdHM8Y2hhclQ+LAoJICBjbGFzcyBBbGxvY2F0b3IgPSBhbGxvYyA+CmNsYXNzIGJhc2ljX3N0 cmluZwp7CnByaXZhdGU6CiAgc3RydWN0IFJlcCB7CiAgICBzaXplX3QgbGVuLCByZXMsIHJlZjsK ICAgIGJvb2wgc2VsZmlzaDsKCiAgICBjaGFyVCogZGF0YSAoKSB7IHJldHVybiByZWludGVycHJl dF9jYXN0PGNoYXJUICo+KHRoaXMgKyAxKTsgfQogICAgY2hhclQmIG9wZXJhdG9yW10gKHNpemVf dCBzKSB7IHJldHVybiBkYXRhICgpIFtzXTsgfQogICAgY2hhclQqIGdyYWIgKCkgeyBpZiAoc2Vs ZmlzaCkgcmV0dXJuIGNsb25lICgpOyArK3JlZjsgcmV0dXJuIGRhdGEgKCk7IH0KIyAxMDggIi9o b21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWli bS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0ZC9iYXN0cmlu Zy5oIiAzCgogICAgdm9pZCByZWxlYXNlICgpIHsgaWYgKC0tcmVmID09IDApIGRlbGV0ZSB0aGlz OyB9CgoKICAgIGlubGluZSBzdGF0aWMgdm9pZCAqIG9wZXJhdG9yIG5ldyAoc2l6ZV90LCBzaXpl X3QpOwogICAgaW5saW5lIHN0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSAodm9pZCAqKTsKICAg IGlubGluZSBzdGF0aWMgUmVwKiBjcmVhdGUgKHNpemVfdCk7CiAgICBjaGFyVCogY2xvbmUgKCk7 CgogICAgaW5saW5lIHZvaWQgY29weSAoc2l6ZV90LCBjb25zdCBjaGFyVCAqLCBzaXplX3QpOwog ICAgaW5saW5lIHZvaWQgbW92ZSAoc2l6ZV90LCBjb25zdCBjaGFyVCAqLCBzaXplX3QpOwogICAg aW5saW5lIHZvaWQgc2V0ICAoc2l6ZV90LCBjb25zdCBjaGFyVCwgICBzaXplX3QpOwoKICAgIGlu bGluZSBzdGF0aWMgYm9vbCBleGNlc3Nfc2xvcCAoc2l6ZV90LCBzaXplX3QpOwogICAgaW5saW5l IHN0YXRpYyBzaXplX3QgZnJvYl9zaXplIChzaXplX3QpOwoKICBwcml2YXRlOgogICAgUmVwICZv cGVyYXRvcj0gKGNvbnN0IFJlcCAmKTsKICB9OwoKcHVibGljOgogCiAgdHlwZWRlZgkgICB0cmFp dHMJCXRyYWl0c190eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzOjpjaGFyX3R5cGUJdmFs dWVfdHlwZTsKICB0eXBlZGVmCSAgIEFsbG9jYXRvcgkJYWxsb2NhdG9yX3R5cGU7CgogIHR5cGVk ZWYgc2l6ZV90IHNpemVfdHlwZTsKICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7 CiAgdHlwZWRlZiBjaGFyVCYgcmVmZXJlbmNlOwogIHR5cGVkZWYgY29uc3QgY2hhclQmIGNvbnN0 X3JlZmVyZW5jZTsKICB0eXBlZGVmIGNoYXJUKiBwb2ludGVyOwogIHR5cGVkZWYgY29uc3QgY2hh clQqIGNvbnN0X3BvaW50ZXI7CiAgdHlwZWRlZiBwb2ludGVyIGl0ZXJhdG9yOwogIHR5cGVkZWYg Y29uc3RfcG9pbnRlciBjb25zdF9pdGVyYXRvcjsKICB0eXBlZGVmIDo6cmV2ZXJzZV9pdGVyYXRv cjxpdGVyYXRvcj4gcmV2ZXJzZV9pdGVyYXRvcjsKICB0eXBlZGVmIDo6cmV2ZXJzZV9pdGVyYXRv cjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKICBzdGF0aWMgY29uc3Qg c2l6ZV90eXBlIG5wb3MgPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KC0xKTsKCnByaXZhdGU6CiAg UmVwICpyZXAgKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxSZXAgKj4oZGF0KSAt IDE7IH0KICB2b2lkIHJlcHVwIChSZXAgKnApIHsgcmVwICgpLT5yZWxlYXNlICgpOyBkYXQgPSBw LT5kYXRhICgpOyB9CgpwdWJsaWM6CiAgY29uc3QgY2hhclQqIGRhdGEgKCkgY29uc3QKICAgIHsg cmV0dXJuIHJlcCAoKS0+ZGF0YSgpOyB9CiAgc2l6ZV90eXBlIGxlbmd0aCAoKSBjb25zdAogICAg eyByZXR1cm4gcmVwICgpLT5sZW47IH0KICBzaXplX3R5cGUgc2l6ZSAoKSBjb25zdAogICAgeyBy ZXR1cm4gcmVwICgpLT5sZW47IH0KICBzaXplX3R5cGUgY2FwYWNpdHkgKCkgY29uc3QKICAgIHsg cmV0dXJuIHJlcCAoKS0+cmVzOyB9CiAgc2l6ZV90eXBlIG1heF9zaXplICgpIGNvbnN0CiAgICB7 IHJldHVybiAobnBvcyAtIDEpL3NpemVvZiAoY2hhclQpOyB9CQkgCiAgYm9vbCBlbXB0eSAoKSBj b25zdAogICAgeyByZXR1cm4gc2l6ZSAoKSA9PSAwOyB9CgogCiAgYmFzaWNfc3RyaW5nJiBvcGVy YXRvcj0gKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyKQogICAgewogICAgICBpZiAoJnN0ciAhPSB0 aGlzKSB7IHJlcCAoKS0+cmVsZWFzZSAoKTsgZGF0ID0gc3RyLnJlcCAoKS0+Z3JhYiAoKTsgfQog ICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogIGV4cGxpY2l0IGJhc2ljX3N0cmluZyAoKTogZGF0 IChuaWxSZXAuZ3JhYiAoKSkgeyB9CiAgYmFzaWNfc3RyaW5nIChjb25zdCBiYXNpY19zdHJpbmcm IHN0cik6IGRhdCAoc3RyLnJlcCAoKS0+Z3JhYiAoKSkgeyB9CiAgYmFzaWNfc3RyaW5nIChjb25z dCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4gPSBucG9zKQog ICAgOiBkYXQgKG5pbFJlcC5ncmFiICgpKSB7IGFzc2lnbiAoc3RyLCBwb3MsIG4pOyB9CiAgYmFz aWNfc3RyaW5nIChjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIG4pCiAgICA6IGRhdCAobmlsUmVw LmdyYWIgKCkpIHsgYXNzaWduIChzLCBuKTsgfQogIGJhc2ljX3N0cmluZyAoY29uc3QgY2hhclQq IHMpCiAgICA6IGRhdCAobmlsUmVwLmdyYWIgKCkpIHsgYXNzaWduIChzKTsgfQogIGJhc2ljX3N0 cmluZyAoc2l6ZV90eXBlIG4sIGNoYXJUIGMpCiAgICA6IGRhdCAobmlsUmVwLmdyYWIgKCkpIHsg YXNzaWduIChuLCBjKTsgfQoKICB0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yPgogICAgYmFz aWNfc3RyaW5nKElucHV0SXRlcmF0b3IgYmVnaW4sIElucHV0SXRlcmF0b3IgZW5kKQoKCgogICAg OiBkYXQgKG5pbFJlcC5ncmFiICgpKSB7IGFzc2lnbiAoYmVnaW4sIGVuZCk7IH0KCiAgfmJhc2lj X3N0cmluZyAoKQogICAgeyByZXAgKCktPnJlbGVhc2UgKCk7IH0KCiAgdm9pZCBzd2FwIChiYXNp Y19zdHJpbmcgJnMpIHsgY2hhclQgKmQgPSBkYXQ7IGRhdCA9IHMuZGF0OyBzLmRhdCA9IGQ7IH0K CiAgYmFzaWNfc3RyaW5nJiBhcHBlbmQgKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5 cGUgcG9zID0gMCwKCQkJc2l6ZV90eXBlIG4gPSBucG9zKQogICAgeyByZXR1cm4gcmVwbGFjZSAo bGVuZ3RoICgpLCAwLCBzdHIsIHBvcywgbik7IH0KICBiYXNpY19zdHJpbmcmIGFwcGVuZCAoY29u c3QgY2hhclQqIHMsIHNpemVfdHlwZSBuKQogICAgeyByZXR1cm4gcmVwbGFjZSAobGVuZ3RoICgp LCAwLCBzLCBuKTsgfQogIGJhc2ljX3N0cmluZyYgYXBwZW5kIChjb25zdCBjaGFyVCogcykKICAg IHsgcmV0dXJuIGFwcGVuZCAocywgdHJhaXRzOjpsZW5ndGggKHMpKTsgfQogIGJhc2ljX3N0cmlu ZyYgYXBwZW5kIChzaXplX3R5cGUgbiwgY2hhclQgYykKICAgIHsgcmV0dXJuIHJlcGxhY2UgKGxl bmd0aCAoKSwgMCwgbiwgYyk7IH0KCiAgdGVtcGxhdGU8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KICAg IGJhc2ljX3N0cmluZyYgYXBwZW5kKElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3Ig bGFzdCkKCgoKICAgIHsgcmV0dXJuIHJlcGxhY2UgKGllbmQgKCksIGllbmQgKCksIGZpcnN0LCBs YXN0KTsgfQoKICBiYXNpY19zdHJpbmcmIGFzc2lnbiAoY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIs IHNpemVfdHlwZSBwb3MgPSAwLAoJCQlzaXplX3R5cGUgbiA9IG5wb3MpCiAgICB7IHJldHVybiBy ZXBsYWNlICgwLCBucG9zLCBzdHIsIHBvcywgbik7IH0KICBiYXNpY19zdHJpbmcmIGFzc2lnbiAo Y29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBuKQogICAgeyByZXR1cm4gcmVwbGFjZSAoMCwgbnBv cywgcywgbik7IH0KICBiYXNpY19zdHJpbmcmIGFzc2lnbiAoY29uc3QgY2hhclQqIHMpCiAgICB7 IHJldHVybiBhc3NpZ24gKHMsIHRyYWl0czo6bGVuZ3RoIChzKSk7IH0KICBiYXNpY19zdHJpbmcm IGFzc2lnbiAoc2l6ZV90eXBlIG4sIGNoYXJUIGMpCiAgICB7IHJldHVybiByZXBsYWNlICgwLCBu cG9zLCBuLCBjKTsgfQoKICB0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yPgogICAgYmFzaWNf c3RyaW5nJiBhc3NpZ24oSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBsYXN0KQoK CgogICAgeyByZXR1cm4gcmVwbGFjZSAoaWJlZ2luICgpLCBpZW5kICgpLCBmaXJzdCwgbGFzdCk7 IH0KCiAgYmFzaWNfc3RyaW5nJiBvcGVyYXRvcj0gKGNvbnN0IGNoYXJUKiBzKQogICAgeyByZXR1 cm4gYXNzaWduIChzKTsgfQogIGJhc2ljX3N0cmluZyYgb3BlcmF0b3I9IChjaGFyVCBjKQogICAg eyByZXR1cm4gYXNzaWduICgxLCBjKTsgfQoKICBiYXNpY19zdHJpbmcmIG9wZXJhdG9yKz0gKGNv bnN0IGJhc2ljX3N0cmluZyYgcmhzKQogICAgeyByZXR1cm4gYXBwZW5kIChyaHMpOyB9CiAgYmFz aWNfc3RyaW5nJiBvcGVyYXRvcis9IChjb25zdCBjaGFyVCogcykKICAgIHsgcmV0dXJuIGFwcGVu ZCAocyk7IH0KICBiYXNpY19zdHJpbmcmIG9wZXJhdG9yKz0gKGNoYXJUIGMpCiAgICB7IHJldHVy biBhcHBlbmQgKDEsIGMpOyB9CgogIGJhc2ljX3N0cmluZyYgaW5zZXJ0IChzaXplX3R5cGUgcG9z MSwgY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIsCgkJCXNpemVfdHlwZSBwb3MyID0gMCwgc2l6ZV90 eXBlIG4gPSBucG9zKQogICAgeyByZXR1cm4gcmVwbGFjZSAocG9zMSwgMCwgc3RyLCBwb3MyLCBu KTsgfQogIGJhc2ljX3N0cmluZyYgaW5zZXJ0IChzaXplX3R5cGUgcG9zLCBjb25zdCBjaGFyVCog cywgc2l6ZV90eXBlIG4pCiAgICB7IHJldHVybiByZXBsYWNlIChwb3MsIDAsIHMsIG4pOyB9CiAg YmFzaWNfc3RyaW5nJiBpbnNlcnQgKHNpemVfdHlwZSBwb3MsIGNvbnN0IGNoYXJUKiBzKQogICAg eyByZXR1cm4gaW5zZXJ0IChwb3MsIHMsIHRyYWl0czo6bGVuZ3RoIChzKSk7IH0KICBiYXNpY19z dHJpbmcmIGluc2VydCAoc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4sIGNoYXJUIGMpCiAgICB7 IHJldHVybiByZXBsYWNlIChwb3MsIDAsIG4sIGMpOyB9CiAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJh dG9yIHAsIGNoYXJUIGMpCiAgICB7IHNpemVfdHlwZSBfX28gPSBwIC0gaWJlZ2luICgpOwogICAg ICBpbnNlcnQgKHAgLSBpYmVnaW4gKCksIDEsIGMpOyBzZWxmaXNoICgpOwogICAgICByZXR1cm4g aWJlZ2luICgpICsgX19vOyB9CiAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIHAsIHNpemVfdHlw ZSBuLCBjaGFyVCBjKQogICAgeyBzaXplX3R5cGUgX19vID0gcCAtIGliZWdpbiAoKTsKICAgICAg aW5zZXJ0IChwIC0gaWJlZ2luICgpLCBuLCBjKTsgc2VsZmlzaCAoKTsKICAgICAgcmV0dXJuIGli ZWdpbiAoKSArIF9fbzsgfQoKICB0ZW1wbGF0ZTxjbGFzcyBJbnB1dEl0ZXJhdG9yPgogICAgdm9p ZCBpbnNlcnQoaXRlcmF0b3IgcCwgSW5wdXRJdGVyYXRvciBmaXJzdCwgSW5wdXRJdGVyYXRvciBs YXN0KQoKCgogICAgeyByZXBsYWNlIChwLCBwLCBmaXJzdCwgbGFzdCk7IH0KCiAgYmFzaWNfc3Ry aW5nJiBlcmFzZSAoc2l6ZV90eXBlIHBvcyA9IDAsIHNpemVfdHlwZSBuID0gbnBvcykKICAgIHsg cmV0dXJuIHJlcGxhY2UgKHBvcywgbiwgKHNpemVfdHlwZSkwLCAoY2hhclQpMCk7IH0KICBpdGVy YXRvciBlcmFzZShpdGVyYXRvciBwKQogICAgeyBzaXplX3R5cGUgX19vID0gcCAtIGJlZ2luKCk7 CiAgICAgIHJlcGxhY2UgKF9fbywgMSwgKHNpemVfdHlwZSkwLCAoY2hhclQpMCk7IHNlbGZpc2gg KCk7CiAgICAgIHJldHVybiBpYmVnaW4oKSArIF9fbzsgfQogIGl0ZXJhdG9yIGVyYXNlKGl0ZXJh dG9yIGYsIGl0ZXJhdG9yIGwpCiAgICB7IHNpemVfdHlwZSBfX28gPSBmIC0gaWJlZ2luKCk7CiAg ICAgIHJlcGxhY2UgKF9fbywgbC1mLCAoc2l6ZV90eXBlKTAsIChjaGFyVCkwKTtzZWxmaXNoICgp OwogICAgICByZXR1cm4gaWJlZ2luKCkgKyBfX287IH0KCiAgYmFzaWNfc3RyaW5nJiByZXBsYWNl IChzaXplX3R5cGUgcG9zMSwgc2l6ZV90eXBlIG4xLCBjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwK CQkJIHNpemVfdHlwZSBwb3MyID0gMCwgc2l6ZV90eXBlIG4yID0gbnBvcyk7CiAgYmFzaWNfc3Ry aW5nJiByZXBsYWNlIChzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbjEsIGNvbnN0IGNoYXJUKiBz LAoJCQkgc2l6ZV90eXBlIG4yKTsKICBiYXNpY19zdHJpbmcmIHJlcGxhY2UgKHNpemVfdHlwZSBw b3MsIHNpemVfdHlwZSBuMSwgY29uc3QgY2hhclQqIHMpCiAgICB7IHJldHVybiByZXBsYWNlIChw b3MsIG4xLCBzLCB0cmFpdHM6Omxlbmd0aCAocykpOyB9CiAgYmFzaWNfc3RyaW5nJiByZXBsYWNl IChzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbjEsIHNpemVfdHlwZSBuMiwgY2hhclQgYyk7CiAg YmFzaWNfc3RyaW5nJiByZXBsYWNlIChzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbiwgY2hhclQg YykKICAgIHsgcmV0dXJuIHJlcGxhY2UgKHBvcywgbiwgMSwgYyk7IH0KICBiYXNpY19zdHJpbmcm IHJlcGxhY2UgKGl0ZXJhdG9yIGkxLCBpdGVyYXRvciBpMiwgY29uc3QgYmFzaWNfc3RyaW5nJiBz dHIpCiAgICB7IHJldHVybiByZXBsYWNlIChpMSAtIGliZWdpbiAoKSwgaTIgLSBpMSwgc3RyKTsg fQogIGJhc2ljX3N0cmluZyYgcmVwbGFjZSAoaXRlcmF0b3IgaTEsIGl0ZXJhdG9yIGkyLCBjb25z dCBjaGFyVCogcywgc2l6ZV90eXBlIG4pCiAgICB7IHJldHVybiByZXBsYWNlIChpMSAtIGliZWdp biAoKSwgaTIgLSBpMSwgcywgbik7IH0KICBiYXNpY19zdHJpbmcmIHJlcGxhY2UgKGl0ZXJhdG9y IGkxLCBpdGVyYXRvciBpMiwgY29uc3QgY2hhclQqIHMpCiAgICB7IHJldHVybiByZXBsYWNlIChp MSAtIGliZWdpbiAoKSwgaTIgLSBpMSwgcyk7IH0KICBiYXNpY19zdHJpbmcmIHJlcGxhY2UgKGl0 ZXJhdG9yIGkxLCBpdGVyYXRvciBpMiwgc2l6ZV90eXBlIG4sIGNoYXJUIGMpCiAgICB7IHJldHVy biByZXBsYWNlIChpMSAtIGliZWdpbiAoKSwgaTIgLSBpMSwgbiwgYyk7IH0KCiAgdGVtcGxhdGU8 Y2xhc3MgSW5wdXRJdGVyYXRvcj4KICAgIGJhc2ljX3N0cmluZyYgcmVwbGFjZShpdGVyYXRvciBp MSwgaXRlcmF0b3IgaTIsCgkJCSAgSW5wdXRJdGVyYXRvciBqMSwgSW5wdXRJdGVyYXRvciBqMik7 CgoKCgoKcHJpdmF0ZToKICBzdGF0aWMgY2hhclQgZW9zICgpIHsgcmV0dXJuIHRyYWl0czo6ZW9z ICgpOyB9CiAgdm9pZCB1bmlxdWUgKCkgeyBpZiAocmVwICgpLT5yZWYgPiAxKSBhbGxvYyAobGVu Z3RoICgpLCB0cnVlKTsgfQogIHZvaWQgc2VsZmlzaCAoKSB7IHVuaXF1ZSAoKTsgcmVwICgpLT5z ZWxmaXNoID0gdHJ1ZTsgfQoKcHVibGljOgogIGNoYXJUIG9wZXJhdG9yW10gKHNpemVfdHlwZSBw b3MpIGNvbnN0CiAgICB7CiAgICAgIGlmIChwb3MgPT0gbGVuZ3RoICgpKQoJcmV0dXJuIGVvcyAo KTsKICAgICAgcmV0dXJuIGRhdGEgKClbcG9zXTsKICAgIH0KCiAgcmVmZXJlbmNlIG9wZXJhdG9y W10gKHNpemVfdHlwZSBwb3MpCiAgICB7IHNlbGZpc2ggKCk7IHJldHVybiAoKnJlcCAoKSlbcG9z XTsgfQoKICByZWZlcmVuY2UgYXQgKHNpemVfdHlwZSBwb3MpCiAgICB7CiAgICAgIGRvIHsgaWYg KCBwb3MgPj0gbGVuZ3RoICgpICkgX19vdXRfb2ZfcmFuZ2UgKCJwb3MgPj0gbGVuZ3RoICgpIik7 IH0gd2hpbGUgKDApIDsKICAgICAgcmV0dXJuICgqdGhpcylbcG9zXTsKICAgIH0KICBjb25zdF9y ZWZlcmVuY2UgYXQgKHNpemVfdHlwZSBwb3MpIGNvbnN0CiAgICB7CiAgICAgIGRvIHsgaWYgKCBw b3MgPj0gbGVuZ3RoICgpICkgX19vdXRfb2ZfcmFuZ2UgKCJwb3MgPj0gbGVuZ3RoICgpIik7IH0g d2hpbGUgKDApIDsKICAgICAgcmV0dXJuIGRhdGEgKClbcG9zXTsKICAgIH0KCnByaXZhdGU6CiAg dm9pZCB0ZXJtaW5hdGUgKCkgY29uc3QKICAgIHsgdHJhaXRzOjphc3NpZ24gKCgqcmVwICgpKVts ZW5ndGggKCldLCBlb3MgKCkpOyB9CgpwdWJsaWM6CiAgY29uc3QgY2hhclQqIGNfc3RyICgpIGNv bnN0CiAgICB7IGlmIChsZW5ndGggKCkgPT0gMCkgcmV0dXJuICIiOyB0ZXJtaW5hdGUgKCk7IHJl dHVybiBkYXRhICgpOyB9CiAgdm9pZCByZXNpemUgKHNpemVfdHlwZSBuLCBjaGFyVCBjKTsKICB2 b2lkIHJlc2l6ZSAoc2l6ZV90eXBlIG4pCiAgICB7IHJlc2l6ZSAobiwgZW9zICgpKTsgfQogIHZv aWQgcmVzZXJ2ZSAoc2l6ZV90eXBlKSB7IH0KCiAgc2l6ZV90eXBlIGNvcHkgKGNoYXJUKiBzLCBz aXplX3R5cGUgbiwgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OwoKICBzaXplX3R5cGUgZmluZCAo Y29uc3QgYmFzaWNfc3RyaW5nJiBzdHIsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdAogICAgeyBy ZXR1cm4gZmluZCAoc3RyLmRhdGEoKSwgcG9zLCBzdHIubGVuZ3RoKCkpOyB9CiAgc2l6ZV90eXBl IGZpbmQgKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbikgY29uc3Q7 CiAgc2l6ZV90eXBlIGZpbmQgKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29u c3QKICAgIHsgcmV0dXJuIGZpbmQgKHMsIHBvcywgdHJhaXRzOjpsZW5ndGggKHMpKTsgfQogIHNp emVfdHlwZSBmaW5kIChjaGFyVCBjLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CgogIHNpemVf dHlwZSByZmluZCAoY29uc3QgYmFzaWNfc3RyaW5nJiBzdHIsIHNpemVfdHlwZSBwb3MgPSBucG9z KSBjb25zdAogICAgeyByZXR1cm4gcmZpbmQgKHN0ci5kYXRhKCksIHBvcywgc3RyLmxlbmd0aCgp KTsgfQogIHNpemVfdHlwZSByZmluZCAoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MsIHNp emVfdHlwZSBuKSBjb25zdDsKICBzaXplX3R5cGUgcmZpbmQgKGNvbnN0IGNoYXJUKiBzLCBzaXpl X3R5cGUgcG9zID0gbnBvcykgY29uc3QKICAgIHsgcmV0dXJuIHJmaW5kIChzLCBwb3MsIHRyYWl0 czo6bGVuZ3RoIChzKSk7IH0KICBzaXplX3R5cGUgcmZpbmQgKGNoYXJUIGMsIHNpemVfdHlwZSBw b3MgPSBucG9zKSBjb25zdDsKCiAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YgKGNvbnN0IGJhc2lj X3N0cmluZyYgc3RyLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3QKICAgIHsgcmV0dXJuIGZpbmRf Zmlyc3Rfb2YgKHN0ci5kYXRhKCksIHBvcywgc3RyLmxlbmd0aCgpKTsgfQogIHNpemVfdHlwZSBm aW5kX2ZpcnN0X29mIChjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4p IGNvbnN0OwogIHNpemVfdHlwZSBmaW5kX2ZpcnN0X29mIChjb25zdCBjaGFyVCogcywgc2l6ZV90 eXBlIHBvcyA9IDApIGNvbnN0CiAgICB7IHJldHVybiBmaW5kX2ZpcnN0X29mIChzLCBwb3MsIHRy YWl0czo6bGVuZ3RoIChzKSk7IH0KICBzaXplX3R5cGUgZmluZF9maXJzdF9vZiAoY2hhclQgYywg c2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0CiAgICB7IHJldHVybiBmaW5kIChjLCBwb3MpOyB9Cgog IHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YgKGNvbnN0IGJhc2ljX3N0cmluZyYgc3RyLCBzaXplX3R5 cGUgcG9zID0gbnBvcykgY29uc3QKICAgIHsgcmV0dXJuIGZpbmRfbGFzdF9vZiAoc3RyLmRhdGEo KSwgcG9zLCBzdHIubGVuZ3RoKCkpOyB9CiAgc2l6ZV90eXBlIGZpbmRfbGFzdF9vZiAoY29uc3Qg Y2hhclQqIHMsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25zdDsKICBzaXplX3R5cGUg ZmluZF9sYXN0X29mIChjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0 CiAgICB7IHJldHVybiBmaW5kX2xhc3Rfb2YgKHMsIHBvcywgdHJhaXRzOjpsZW5ndGggKHMpKTsg fQogIHNpemVfdHlwZSBmaW5kX2xhc3Rfb2YgKGNoYXJUIGMsIHNpemVfdHlwZSBwb3MgPSBucG9z KSBjb25zdAogICAgeyByZXR1cm4gcmZpbmQgKGMsIHBvcyk7IH0KCiAgc2l6ZV90eXBlIGZpbmRf Zmlyc3Rfbm90X29mIChjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvcyA9IDAp IGNvbnN0CiAgICB7IHJldHVybiBmaW5kX2ZpcnN0X25vdF9vZiAoc3RyLmRhdGEoKSwgcG9zLCBz dHIubGVuZ3RoKCkpOyB9CiAgc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mIChjb25zdCBjaGFy VCogcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0OwogIHNpemVfdHlwZSBmaW5k X2ZpcnN0X25vdF9vZiAoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdAog ICAgeyByZXR1cm4gZmluZF9maXJzdF9ub3Rfb2YgKHMsIHBvcywgdHJhaXRzOjpsZW5ndGggKHMp KTsgfQogIHNpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZiAoY2hhclQgYywgc2l6ZV90eXBlIHBv cyA9IDApIGNvbnN0OwoKICBzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZiAoY29uc3QgYmFzaWNf c3RyaW5nJiBzdHIsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdAogICAgeyByZXR1cm4gZmlu ZF9sYXN0X25vdF9vZiAoc3RyLmRhdGEoKSwgcG9zLCBzdHIubGVuZ3RoKCkpOyB9CiAgc2l6ZV90 eXBlIGZpbmRfbGFzdF9ub3Rfb2YgKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zLCBzaXpl X3R5cGUgbikgY29uc3Q7CiAgc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YgKGNvbnN0IGNoYXJU KiBzLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3QKICAgIHsgcmV0dXJuIGZpbmRfbGFzdF9u b3Rfb2YgKHMsIHBvcywgdHJhaXRzOjpsZW5ndGggKHMpKTsgfQogIHNpemVfdHlwZSBmaW5kX2xh c3Rfbm90X29mIChjaGFyVCBjLCBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Q7CgogIGJhc2lj X3N0cmluZyBzdWJzdHIgKHNpemVfdHlwZSBwb3MgPSAwLCBzaXplX3R5cGUgbiA9IG5wb3MpIGNv bnN0CiAgICB7IHJldHVybiBiYXNpY19zdHJpbmcgKCp0aGlzLCBwb3MsIG4pOyB9CgogIGludCBj b21wYXJlIChjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvcyA9IDAsIHNpemVf dHlwZSBuID0gbnBvcykgY29uc3Q7CiAgIAogIGludCBjb21wYXJlIChjb25zdCBjaGFyVCogcywg c2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0OwogIGludCBjb21wYXJlIChjb25zdCBj aGFyVCogcywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0CiAgICB7IHJldHVybiBjb21wYXJlIChz LCBwb3MsIHRyYWl0czo6bGVuZ3RoIChzKSk7IH0KCiAgaXRlcmF0b3IgYmVnaW4gKCkgeyBzZWxm aXNoICgpOyByZXR1cm4gJigqdGhpcylbMF07IH0KICBpdGVyYXRvciBlbmQgKCkgeyBzZWxmaXNo ICgpOyByZXR1cm4gJigqdGhpcylbbGVuZ3RoICgpXTsgfQoKcHJpdmF0ZToKICBpdGVyYXRvciBp YmVnaW4gKCkgY29uc3QgeyByZXR1cm4gJigqcmVwICgpKVswXTsgfQogIGl0ZXJhdG9yIGllbmQg KCkgY29uc3QgeyByZXR1cm4gJigqcmVwICgpKVtsZW5ndGggKCldOyB9CgpwdWJsaWM6CiAgY29u c3RfaXRlcmF0b3IgYmVnaW4gKCkgY29uc3QgeyByZXR1cm4gaWJlZ2luICgpOyB9CiAgY29uc3Rf aXRlcmF0b3IgZW5kICgpIGNvbnN0IHsgcmV0dXJuIGllbmQgKCk7IH0KCiAgcmV2ZXJzZV9pdGVy YXRvciAgICAgICByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yIChlbmQgKCkpOyB9 CiAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdAogICAgeyByZXR1cm4gY29u c3RfcmV2ZXJzZV9pdGVyYXRvciAoZW5kICgpKTsgfQogIHJldmVyc2VfaXRlcmF0b3IgICAgICAg cmVuZCgpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IgKGJlZ2luICgpKTsgfQogIGNvbnN0X3Jl dmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0CiAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0 ZXJhdG9yIChiZWdpbiAoKSk7IH0KCnByaXZhdGU6CiAgdm9pZCBhbGxvYyAoc2l6ZV90eXBlIHNp emUsIGJvb2wgc2F2ZSk7CiAgc3RhdGljIHNpemVfdHlwZSBfZmluZCAoY29uc3QgY2hhclQqIHB0 ciwgY2hhclQgYywgc2l6ZV90eXBlIHhwb3MsIHNpemVfdHlwZSBsZW4pOwogIGlubGluZSBib29s IGNoZWNrX3JlYWxsb2MgKHNpemVfdHlwZSBzKSBjb25zdDsKCiAgc3RhdGljIFJlcCBuaWxSZXA7 CiAgY2hhclQgKmRhdDsKfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywg Y2xhc3MgQWxsb2NhdG9yPiB0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KYmFzaWNfc3Ry aW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFp dHMsIEFsbG9jYXRvcj46OgpyZXBsYWNlIChpdGVyYXRvciBpMSwgaXRlcmF0b3IgaTIsIElucHV0 SXRlcmF0b3IgajEsIElucHV0SXRlcmF0b3IgajIpCgoKCgoKewogIGNvbnN0IHNpemVfdHlwZSBs ZW4gPSBsZW5ndGggKCk7CiAgc2l6ZV90eXBlIHBvcyA9IGkxIC0gaWJlZ2luICgpOwogIHNpemVf dHlwZSBuMSA9IGkyIC0gaTE7CiAgc2l6ZV90eXBlIG4yID0gajIgLSBqMTsKCiAgZG8geyBpZiAo IHBvcyA+IGxlbiApIF9fb3V0X29mX3JhbmdlICgicG9zID4gbGVuIik7IH0gd2hpbGUgKDApIDsK ICBpZiAobjEgPiBsZW4gLSBwb3MpCiAgICBuMSA9IGxlbiAtIHBvczsKICBkbyB7IGlmICggbGVu IC0gbjEgPiBtYXhfc2l6ZSAoKSAtIG4yICkgX19sZW5ndGhfZXJyb3IgKCJsZW4gLSBuMSA+IG1h eF9zaXplICgpIC0gbjIiKTsgfSB3aGlsZSAoMCkgOwogIHNpemVfdCBuZXdsZW4gPSBsZW4gLSBu MSArIG4yOwoKICBpZiAoY2hlY2tfcmVhbGxvYyAobmV3bGVuKSkKICAgIHsKICAgICAgUmVwICpw ID0gUmVwOjpjcmVhdGUgKG5ld2xlbik7CiAgICAgIHAtPmNvcHkgKDAsIGRhdGEgKCksIHBvcyk7 CiAgICAgIHAtPmNvcHkgKHBvcyArIG4yLCBkYXRhICgpICsgcG9zICsgbjEsIGxlbiAtIChwb3Mg KyBuMSkpOwogICAgICBmb3IgKDsgajEgIT0gajI7ICsrajEsICsrcG9zKQoJdHJhaXRzOjphc3Np Z24gKCgqcClbcG9zXSwgKmoxKTsKICAgICAgcmVwdXAgKHApOwogICAgfQogIGVsc2UKICAgIHsK ICAgICAgcmVwICgpLT5tb3ZlIChwb3MgKyBuMiwgZGF0YSAoKSArIHBvcyArIG4xLCBsZW4gLSAo cG9zICsgbjEpKTsKICAgICAgZm9yICg7IGoxICE9IGoyOyArK2oxLCArK3BvcykKCXRyYWl0czo6 YXNzaWduICgoKnJlcCAoKSlbcG9zXSwgKmoxKTsKICAgIH0KICByZXAgKCktPmxlbiA9IG5ld2xl bjsKCiAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0 cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBB bGxvY2F0b3I+Cm9wZXJhdG9yKyAoY29uc3QgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBB bGxvY2F0b3I+JiBsaHMsCgkgICBjb25zdCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFs bG9jYXRvcj4mIHJocykKewogIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9y PiBzdHIgKGxocyk7CiAgc3RyLmFwcGVuZCAocmhzKTsKICByZXR1cm4gc3RyOwp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYmFz aWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+Cm9wZXJhdG9yKyAoY29uc3QgY2hh clQqIGxocywgY29uc3QgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiBy aHMpCnsKICBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4gc3RyIChsaHMp OwogIHN0ci5hcHBlbmQgKHJocyk7CiAgcmV0dXJuIHN0cjsKfQoKdGVtcGxhdGUgPGNsYXNzIGNo YXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIGJhc2ljX3N0cmluZyA8 Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPgpvcGVyYXRvcisgKGNoYXJUIGxocywgY29uc3QgYmFz aWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpCnsKICBiYXNpY19zdHJp bmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4gc3RyICgxLCBsaHMpOwogIHN0ci5hcHBlbmQg KHJocyk7CiAgcmV0dXJuIHN0cjsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFp dHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywg QWxsb2NhdG9yPgpvcGVyYXRvcisgKGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywg QWxsb2NhdG9yPiYgbGhzLCBjb25zdCBjaGFyVCogcmhzKQp7CiAgYmFzaWNfc3RyaW5nIDxjaGFy VCwgdHJhaXRzLCBBbGxvY2F0b3I+IHN0ciAobGhzKTsKICBzdHIuYXBwZW5kIChyaHMpOwogIHJl dHVybiBzdHI7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBB bGxvY2F0b3I+CmlubGluZSBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4K b3BlcmF0b3IrIChjb25zdCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4m IGxocywgY2hhclQgcmhzKQp7CiAgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0 b3I+IHN0ciAobGhzKTsKICBzdHIuYXBwZW5kICgxLCByaHMpOwogIHJldHVybiBzdHI7Cn0KCnRl bXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmlubGlu ZSBib29sCm9wZXJhdG9yPT0gKGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxs b2NhdG9yPiYgbGhzLAoJICAgIGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxs b2NhdG9yPiYgcmhzKQp7CiAgcmV0dXJuIChsaHMuY29tcGFyZSAocmhzKSA9PSAwKTsKfQoKdGVt cGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5l IGJvb2wKb3BlcmF0b3I9PSAoY29uc3QgY2hhclQqIGxocywgY29uc3QgYmFzaWNfc3RyaW5nIDxj aGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+JiByaHMpCnsKICByZXR1cm4gKHJocy5jb21wYXJlIChs aHMpID09IDApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3Mg QWxsb2NhdG9yPgppbmxpbmUgYm9vbApvcGVyYXRvcj09IChjb25zdCBiYXNpY19zdHJpbmcgPGNo YXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywgY29uc3QgY2hhclQqIHJocykKewogIHJldHVy biAobGhzLmNvbXBhcmUgKHJocykgPT0gMCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xh c3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmlubGluZSBib29sCm9wZXJhdG9yIT0gKGNvbnN0 IGNoYXJUKiBsaHMsIGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9y PiYgcmhzKQp7CiAgcmV0dXJuIChyaHMuY29tcGFyZSAobGhzKSAhPSAwKTsKfQoKdGVtcGxhdGUg PGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIGJvb2wK b3BlcmF0b3IhPSAoY29uc3QgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+ JiBsaHMsIGNvbnN0IGNoYXJUKiByaHMpCnsKICByZXR1cm4gKGxocy5jb21wYXJlIChyaHMpICE9 IDApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2Nh dG9yPgppbmxpbmUgYm9vbApvcGVyYXRvcjwgKGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRy YWl0cywgQWxsb2NhdG9yPiYgbGhzLAoJICAgIGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRy YWl0cywgQWxsb2NhdG9yPiYgcmhzKQp7CiAgcmV0dXJuIChsaHMuY29tcGFyZSAocmhzKSA8IDAp Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9y PgppbmxpbmUgYm9vbApvcGVyYXRvcjwgKGNvbnN0IGNoYXJUKiBsaHMsIGNvbnN0IGJhc2ljX3N0 cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKQp7CiAgcmV0dXJuIChyaHMuY29t cGFyZSAobGhzKSA+IDApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywg Y2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYm9vbApvcGVyYXRvcjwgKGNvbnN0IGJhc2ljX3N0cmlu ZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLCBjb25zdCBjaGFyVCogcmhzKQp7CiAg cmV0dXJuIChsaHMuY29tcGFyZSAocmhzKSA8IDApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQs IGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYm9vbApvcGVyYXRvcj4gKGNv bnN0IGNoYXJUKiBsaHMsIGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2Nh dG9yPiYgcmhzKQp7CiAgcmV0dXJuIChyaHMuY29tcGFyZSAobGhzKSA8IDApOwp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYm9v bApvcGVyYXRvcj4gKGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9y PiYgbGhzLCBjb25zdCBjaGFyVCogcmhzKQp7CiAgcmV0dXJuIChsaHMuY29tcGFyZSAocmhzKSA+ IDApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2Nh dG9yPgppbmxpbmUgYm9vbApvcGVyYXRvcjw9IChjb25zdCBjaGFyVCogbGhzLCBjb25zdCBiYXNp Y19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocykKewogIHJldHVybiAocmhz LmNvbXBhcmUgKGxocykgPj0gMCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJh aXRzLCBjbGFzcyBBbGxvY2F0b3I+CmlubGluZSBib29sCm9wZXJhdG9yPD0gKGNvbnN0IGJhc2lj X3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLCBjb25zdCBjaGFyVCogcmhz KQp7CiAgcmV0dXJuIChsaHMuY29tcGFyZSAocmhzKSA8PSAwKTsKfQoKdGVtcGxhdGUgPGNsYXNz IGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5lIGJvb2wKb3BlcmF0 b3I+PSAoY29uc3QgY2hhclQqIGxocywgY29uc3QgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRz LCBBbGxvY2F0b3I+JiByaHMpCnsKICByZXR1cm4gKHJocy5jb21wYXJlIChsaHMpIDw9IDApOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgpp bmxpbmUgYm9vbApvcGVyYXRvcj49IChjb25zdCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMs IEFsbG9jYXRvcj4mIGxocywgY29uc3QgY2hhclQqIHJocykKewogIHJldHVybiAobGhzLmNvbXBh cmUgKHJocykgPj0gMCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBj bGFzcyBBbGxvY2F0b3I+CmlubGluZSBib29sCm9wZXJhdG9yIT0gKGNvbnN0IGJhc2ljX3N0cmlu ZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLAoJICAgIGNvbnN0IGJhc2ljX3N0cmlu ZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKQp7CiAgcmV0dXJuIChsaHMuY29tcGFy ZSAocmhzKSAhPSAwKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNs YXNzIEFsbG9jYXRvcj4KaW5saW5lIGJvb2wKb3BlcmF0b3I+IChjb25zdCBiYXNpY19zdHJpbmcg PGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywKCSAgIGNvbnN0IGJhc2ljX3N0cmluZyA8 Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKQp7CiAgcmV0dXJuIChsaHMuY29tcGFyZSAo cmhzKSA+IDApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3Mg QWxsb2NhdG9yPgppbmxpbmUgYm9vbApvcGVyYXRvcjw9IChjb25zdCBiYXNpY19zdHJpbmcgPGNo YXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIGxocywKCSAgICBjb25zdCBiYXNpY19zdHJpbmcgPGNo YXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mIHJocykKewogIHJldHVybiAobGhzLmNvbXBhcmUgKHJo cykgPD0gMCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBB bGxvY2F0b3I+CmlubGluZSBib29sCm9wZXJhdG9yPj0gKGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hh clQsIHRyYWl0cywgQWxsb2NhdG9yPiYgbGhzLAoJICAgIGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hh clQsIHRyYWl0cywgQWxsb2NhdG9yPiYgcmhzKQp7CiAgcmV0dXJuIChsaHMuY29tcGFyZSAocmhz KSA+PSAwKTsKfQoKY2xhc3MgaXN0cmVhbTsgY2xhc3Mgb3N0cmVhbTsKdGVtcGxhdGUgPGNsYXNz IGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4gaXN0cmVhbSYKb3BlcmF0b3I+ PiAoaXN0cmVhbSYsIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYpOwp0 ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPiBvc3Ry ZWFtJgpvcGVyYXRvcjw8IChvc3RyZWFtJiwgY29uc3QgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJh aXRzLCBBbGxvY2F0b3I+Jik7CnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBj bGFzcyBBbGxvY2F0b3I+IGlzdHJlYW0mCmdldGxpbmUgKGlzdHJlYW0mLCBiYXNpY19zdHJpbmcg PGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj4mLCBjaGFyVCBkZWxpbSA9ICdcbicpOwoKfSAgCgoj IDEgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dl cnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0ZC9i YXN0cmluZy5jYyIgMSAzCiAKIAoKIAogCiAKIAogCgogCiAKIAogCgogCiAKIAoKIAogCiAKIAog CgogCiAKCmV4dGVybiAiQysrIiB7CnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRz LCBjbGFzcyBBbGxvY2F0b3I+CmlubGluZSB2b2lkICogYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJh aXRzLCBBbGxvY2F0b3I+OjpSZXA6OgpvcGVyYXRvciBuZXcgKHNpemVfdCBzLCBzaXplX3QgZXh0 cmEpCnsKICByZXR1cm4gQWxsb2NhdG9yOjphbGxvY2F0ZShzICsgZXh0cmEgKiBzaXplb2YgKGNo YXJUKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxv Y2F0b3I+CmlubGluZSB2b2lkIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9y Pjo6UmVwOjoKb3BlcmF0b3IgZGVsZXRlICh2b2lkICogcHRyKQp7CiAgQWxsb2NhdG9yOjpkZWFs bG9jYXRlKHB0ciwgc2l6ZW9mKFJlcCkgKwoJCQlyZWludGVycHJldF9jYXN0PFJlcCAqPihwdHIp LT5yZXMgKgoJCQlzaXplb2YgKGNoYXJUKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xh c3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmlubGluZSBzaXplX3QgYmFzaWNfc3RyaW5nIDxj aGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjpSZXA6Ogpmcm9iX3NpemUgKHNpemVfdCBzKQp7CiAg c2l6ZV90IGkgPSAxNjsKICB3aGlsZSAoaSA8IHMpIGkgKj0gMjsKICByZXR1cm4gaTsKfQoKdGVt cGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW5saW5l IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6UmVwICoKYmFzaWNfc3Ry aW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjpSZXA6OgpjcmVhdGUgKHNpemVfdCBleHRy YSkKewogIGV4dHJhID0gZnJvYl9zaXplIChleHRyYSArIDEpOwogIFJlcCAqcCA9IG5ldyAoZXh0 cmEpIFJlcDsKICBwLT5yZXMgPSBleHRyYTsKICBwLT5yZWYgPSAxOwogIHAtPnNlbGZpc2ggPSBm YWxzZTsKICByZXR1cm4gcDsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMs IGNsYXNzIEFsbG9jYXRvcj4KY2hhclQgKiBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFs bG9jYXRvcj46OlJlcDo6CmNsb25lICgpCnsKICBSZXAgKnAgPSBSZXA6OmNyZWF0ZSAobGVuKTsK ICBwLT5jb3B5ICgwLCBkYXRhICgpLCBsZW4pOwogIHAtPmxlbiA9IGxlbjsKICByZXR1cm4gcC0+ ZGF0YSAoKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFs bG9jYXRvcj4KaW5saW5lIGJvb2wgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0 b3I+OjpSZXA6OgpleGNlc3Nfc2xvcCAoc2l6ZV90IHMsIHNpemVfdCByKQp7CiAgcmV0dXJuIDIg KiAocyA8PSAxNiA/IDE2IDogcykgPCByOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNz IHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgYm9vbCBiYXNpY19zdHJpbmcgPGNoYXJU LCB0cmFpdHMsIEFsbG9jYXRvcj46OgpjaGVja19yZWFsbG9jIChiYXNpY19zdHJpbmc6OnNpemVf dHlwZSBzKSBjb25zdAp7CiAgcyArPSBzaXplb2YgKGNoYXJUKTsKICByZXAgKCktPnNlbGZpc2gg PSBmYWxzZTsKICByZXR1cm4gKHJlcCAoKS0+cmVmID4gMQoJICB8fCBzID4gY2FwYWNpdHkgKCkK CSAgfHwgUmVwOjpleGNlc3Nfc2xvcCAocywgY2FwYWNpdHkgKCkpKTsKfQoKdGVtcGxhdGUgPGNs YXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4Kdm9pZCBiYXNpY19zdHJp bmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OgphbGxvYyAoYmFzaWNfc3RyaW5nOjpzaXpl X3R5cGUgc2l6ZSwgYm9vbCBzYXZlKQp7CiAgaWYgKCEgY2hlY2tfcmVhbGxvYyAoc2l6ZSkpCiAg ICByZXR1cm47CgogIFJlcCAqcCA9IFJlcDo6Y3JlYXRlIChzaXplKTsKCiAgaWYgKHNhdmUpCiAg ICB7CiAgICAgIHAtPmNvcHkgKDAsIGRhdGEgKCksIGxlbmd0aCAoKSk7CiAgICAgIHAtPmxlbiA9 IGxlbmd0aCAoKTsKICAgIH0KICBlbHNlCiAgICBwLT5sZW4gPSAwOwoKICByZXB1cCAocCk7Cn0K CnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmJh c2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYKYmFzaWNfc3RyaW5nIDxjaGFy VCwgdHJhaXRzLCBBbGxvY2F0b3I+OjoKcmVwbGFjZSAoc2l6ZV90eXBlIHBvczEsIHNpemVfdHlw ZSBuMSwKCSBjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvczIsIHNpemVfdHlw ZSBuMikKewogIGNvbnN0IHNpemVfdCBsZW4yID0gc3RyLmxlbmd0aCAoKTsKCiAgaWYgKHBvczEg PT0gMCAmJiBuMSA+PSBsZW5ndGggKCkgJiYgcG9zMiA9PSAwICYmIG4yID49IGxlbjIpCiAgICBy ZXR1cm4gb3BlcmF0b3I9IChzdHIpOwoKICBkbyB7IGlmICggcG9zMiA+IGxlbjIgKSBfX291dF9v Zl9yYW5nZSAoInBvczIgPiBsZW4yIik7IH0gd2hpbGUgKDApIDsKCiAgaWYgKG4yID4gbGVuMiAt IHBvczIpCiAgICBuMiA9IGxlbjIgLSBwb3MyOwoKICByZXR1cm4gcmVwbGFjZSAocG9zMSwgbjEs IHN0ci5kYXRhICgpICsgcG9zMiwgbjIpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNz IHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgppbmxpbmUgdm9pZCBiYXNpY19zdHJpbmcgPGNoYXJU LCB0cmFpdHMsIEFsbG9jYXRvcj46OlJlcDo6CmNvcHkgKHNpemVfdCBwb3MsIGNvbnN0IGNoYXJU ICpzLCBzaXplX3QgbikKewogIGlmIChuKQogICAgdHJhaXRzOjpjb3B5IChkYXRhICgpICsgcG9z LCBzLCBuKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFs bG9jYXRvcj4KaW5saW5lIHZvaWQgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0 b3I+OjpSZXA6Ogptb3ZlIChzaXplX3QgcG9zLCBjb25zdCBjaGFyVCAqcywgc2l6ZV90IG4pCnsK ICBpZiAobikKICAgIHRyYWl0czo6bW92ZSAoZGF0YSAoKSArIHBvcywgcywgbik7Cn0KCnRlbXBs YXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmJhc2ljX3N0 cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPiYKYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJh aXRzLCBBbGxvY2F0b3I+OjoKcmVwbGFjZSAoc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4xLCBj b25zdCBjaGFyVCogcywgc2l6ZV90eXBlIG4yKQp7CiAgY29uc3Qgc2l6ZV90eXBlIGxlbiA9IGxl bmd0aCAoKTsKICBkbyB7IGlmICggcG9zID4gbGVuICkgX19vdXRfb2ZfcmFuZ2UgKCJwb3MgPiBs ZW4iKTsgfSB3aGlsZSAoMCkgOwogIGlmIChuMSA+IGxlbiAtIHBvcykKICAgIG4xID0gbGVuIC0g cG9zOwogIGRvIHsgaWYgKCBsZW4gLSBuMSA+IG1heF9zaXplICgpIC0gbjIgKSBfX2xlbmd0aF9l cnJvciAoImxlbiAtIG4xID4gbWF4X3NpemUgKCkgLSBuMiIpOyB9IHdoaWxlICgwKSA7CiAgc2l6 ZV90IG5ld2xlbiA9IGxlbiAtIG4xICsgbjI7CgogIGlmIChjaGVja19yZWFsbG9jIChuZXdsZW4p KQogICAgewogICAgICBSZXAgKnAgPSBSZXA6OmNyZWF0ZSAobmV3bGVuKTsKICAgICAgcC0+Y29w eSAoMCwgZGF0YSAoKSwgcG9zKTsKICAgICAgcC0+Y29weSAocG9zICsgbjIsIGRhdGEgKCkgKyBw b3MgKyBuMSwgbGVuIC0gKHBvcyArIG4xKSk7CiAgICAgIHAtPmNvcHkgKHBvcywgcywgbjIpOwog ICAgICByZXB1cCAocCk7CiAgICB9CiAgZWxzZQogICAgewogICAgICByZXAgKCktPm1vdmUgKHBv cyArIG4yLCBkYXRhICgpICsgcG9zICsgbjEsIGxlbiAtIChwb3MgKyBuMSkpOwogICAgICByZXAg KCktPmNvcHkgKHBvcywgcywgbjIpOwogICAgfQogIHJlcCAoKS0+bGVuID0gbmV3bGVuOwoKICBy ZXR1cm4gKnRoaXM7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFz cyBBbGxvY2F0b3I+CmlubGluZSB2b2lkIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxs b2NhdG9yPjo6UmVwOjoKc2V0IChzaXplX3QgcG9zLCBjb25zdCBjaGFyVCBjLCBzaXplX3QgbikK ewogIHRyYWl0czo6c2V0ICAoZGF0YSAoKSArIHBvcywgYywgbik7Cn0KCnRlbXBsYXRlIDxjbGFz cyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmJhc2ljX3N0cmluZyA8Y2hh clQsIHRyYWl0cywgQWxsb2NhdG9yPiYgYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxv Y2F0b3I+OjoKcmVwbGFjZSAoc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4xLCBzaXplX3R5cGUg bjIsIGNoYXJUIGMpCnsKICBjb25zdCBzaXplX3QgbGVuID0gbGVuZ3RoICgpOwogIGRvIHsgaWYg KCBwb3MgPiBsZW4gKSBfX291dF9vZl9yYW5nZSAoInBvcyA+IGxlbiIpOyB9IHdoaWxlICgwKSA7 CiAgaWYgKG4xID4gbGVuIC0gcG9zKQogICAgbjEgPSBsZW4gLSBwb3M7CiAgZG8geyBpZiAoIGxl biAtIG4xID4gbWF4X3NpemUgKCkgLSBuMiApIF9fbGVuZ3RoX2Vycm9yICgibGVuIC0gbjEgPiBt YXhfc2l6ZSAoKSAtIG4yIik7IH0gd2hpbGUgKDApIDsKICBzaXplX3QgbmV3bGVuID0gbGVuIC0g bjEgKyBuMjsKCiAgaWYgKGNoZWNrX3JlYWxsb2MgKG5ld2xlbikpCiAgICB7CiAgICAgIFJlcCAq cCA9IFJlcDo6Y3JlYXRlIChuZXdsZW4pOwogICAgICBwLT5jb3B5ICgwLCBkYXRhICgpLCBwb3Mp OwogICAgICBwLT5jb3B5IChwb3MgKyBuMiwgZGF0YSAoKSArIHBvcyArIG4xLCBsZW4gLSAocG9z ICsgbjEpKTsKICAgICAgcC0+c2V0ICAocG9zLCBjLCBuMik7CiAgICAgIHJlcHVwIChwKTsKICAg IH0KICBlbHNlCiAgICB7CiAgICAgIHJlcCAoKS0+bW92ZSAocG9zICsgbjIsIGRhdGEgKCkgKyBw b3MgKyBuMSwgbGVuIC0gKHBvcyArIG4xKSk7CiAgICAgIHJlcCAoKS0+c2V0ICAocG9zLCBjLCBu Mik7CiAgICB9CiAgcmVwICgpLT5sZW4gPSBuZXdsZW47CgogIHJldHVybiAqdGhpczsKfQoKdGVt cGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4Kdm9pZCBi YXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OgpyZXNpemUgKHNpemVfdHlw ZSBuLCBjaGFyVCBjKQp7CiAgZG8geyBpZiAoIG4gPiBtYXhfc2l6ZSAoKSApIF9fbGVuZ3RoX2Vy cm9yICgibiA+IG1heF9zaXplICgpIik7IH0gd2hpbGUgKDApIDsKCiAgaWYgKG4gPiBsZW5ndGgg KCkpCiAgICBhcHBlbmQgKG4gLSBsZW5ndGggKCksIGMpOwogIGVsc2UKICAgIGVyYXNlIChuKTsK fQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4K YmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjpzaXplX3R5cGUKYmFzaWNf c3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjoKY29weSAoY2hhclQqIHMsIHNpemVf dHlwZSBuLCBzaXplX3R5cGUgcG9zKSBjb25zdAp7CiAgZG8geyBpZiAoIHBvcyA+IGxlbmd0aCAo KSApIF9fb3V0X29mX3JhbmdlICgicG9zID4gbGVuZ3RoICgpIik7IH0gd2hpbGUgKDApIDsKCiAg aWYgKG4gPiBsZW5ndGggKCkgLSBwb3MpCiAgICBuID0gbGVuZ3RoICgpIC0gcG9zOwoKICB0cmFp dHM6OmNvcHkgKHMsIGRhdGEgKCkgKyBwb3MsIG4pOwogIHJldHVybiBuOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgpiYXNpY19zdHJpbmcg PGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OnNpemVfdHlwZQpiYXNpY19zdHJpbmcgPGNoYXJU LCB0cmFpdHMsIEFsbG9jYXRvcj46OgpmaW5kIChjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBv cywgc2l6ZV90eXBlIG4pIGNvbnN0CnsKICBzaXplX3QgeHBvcyA9IHBvczsKICBmb3IgKDsgeHBv cyArIG4gPD0gbGVuZ3RoICgpOyArK3hwb3MpCiAgICBpZiAodHJhaXRzOjplcSAoZGF0YSAoKSBb eHBvc10sICpzKQoJJiYgdHJhaXRzOjpjb21wYXJlIChkYXRhICgpICsgeHBvcywgcywgbikgPT0g MCkKICAgICAgcmV0dXJuIHhwb3M7CiAgcmV0dXJuIG5wb3M7Cn0KCnRlbXBsYXRlIDxjbGFzcyBj aGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmlubGluZSBiYXNpY19zdHJpbmcg PGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OnNpemVfdHlwZQpiYXNpY19zdHJpbmcgPGNoYXJU LCB0cmFpdHMsIEFsbG9jYXRvcj46OgpfZmluZCAoY29uc3QgY2hhclQqIHB0ciwgY2hhclQgYywg c2l6ZV90eXBlIHhwb3MsIHNpemVfdHlwZSBsZW4pCnsKICBmb3IgKDsgeHBvcyA8IGxlbjsgKyt4 cG9zKQogICAgaWYgKHRyYWl0czo6ZXEgKHB0ciBbeHBvc10sIGMpKQogICAgICByZXR1cm4geHBv czsKICByZXR1cm4gbnBvczsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMs IGNsYXNzIEFsbG9jYXRvcj4KYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+ OjpzaXplX3R5cGUKYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjoKZmlu ZCAoY2hhclQgYywgc2l6ZV90eXBlIHBvcykgY29uc3QKewogIHJldHVybiBfZmluZCAoZGF0YSAo KSwgYywgcG9zLCBsZW5ndGggKCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRy YWl0cywgY2xhc3MgQWxsb2NhdG9yPgpiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9j YXRvcj46OnNpemVfdHlwZQpiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46 OgpyZmluZCAoY29uc3QgY2hhclQqIHMsIHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25z dAp7CiAgaWYgKG4gPiBsZW5ndGggKCkpCiAgICByZXR1cm4gbnBvczsKCiAgc2l6ZV90IHhwb3Mg PSBsZW5ndGggKCkgLSBuOwogIGlmICh4cG9zID4gcG9zKQogICAgeHBvcyA9IHBvczsKCiAgZm9y ICgrK3hwb3M7IHhwb3MtLSA+IDA7ICkKICAgIGlmICh0cmFpdHM6OmVxIChkYXRhICgpIFt4cG9z XSwgKnMpCgkmJiB0cmFpdHM6OmNvbXBhcmUgKGRhdGEgKCkgKyB4cG9zLCBzLCBuKSA9PSAwKQog ICAgICByZXR1cm4geHBvczsKICByZXR1cm4gbnBvczsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJU LCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJh aXRzLCBBbGxvY2F0b3I+OjpzaXplX3R5cGUKYmFzaWNfc3RyaW5nIDxjaGFyVCwgdHJhaXRzLCBB bGxvY2F0b3I+OjoKcmZpbmQgKGNoYXJUIGMsIHNpemVfdHlwZSBwb3MpIGNvbnN0CnsKICBpZiAo MSA+IGxlbmd0aCAoKSkKICAgIHJldHVybiBucG9zOwoKICBzaXplX3QgeHBvcyA9IGxlbmd0aCAo KSAtIDE7CiAgaWYgKHhwb3MgPiBwb3MpCiAgICB4cG9zID0gcG9zOwoKICBmb3IgKCsreHBvczsg eHBvcy0tID4gMDsgKQogICAgaWYgKHRyYWl0czo6ZXEgKGRhdGEgKCkgW3hwb3NdLCBjKSkKICAg ICAgcmV0dXJuIHhwb3M7CiAgcmV0dXJuIG5wb3M7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwg Y2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0 cywgQWxsb2NhdG9yPjo6c2l6ZV90eXBlCmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxs b2NhdG9yPjo6CmZpbmRfZmlyc3Rfb2YgKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUgcG9zLCBz aXplX3R5cGUgbikgY29uc3QKewogIHNpemVfdCB4cG9zID0gcG9zOwogIGZvciAoOyB4cG9zIDwg bGVuZ3RoICgpOyArK3hwb3MpCiAgICBpZiAoX2ZpbmQgKHMsIGRhdGEgKCkgW3hwb3NdLCAwLCBu KSAhPSBucG9zKQogICAgICByZXR1cm4geHBvczsKICByZXR1cm4gbnBvczsKfQoKdGVtcGxhdGUg PGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KYmFzaWNfc3RyaW5n IDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjpzaXplX3R5cGUKYmFzaWNfc3RyaW5nIDxjaGFy VCwgdHJhaXRzLCBBbGxvY2F0b3I+OjoKZmluZF9sYXN0X29mIChjb25zdCBjaGFyVCogcywgc2l6 ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4pIGNvbnN0CnsKICBpZiAobGVuZ3RoKCkgPT0gMCkKICAg IHJldHVybiBucG9zOwogIHNpemVfdCB4cG9zID0gbGVuZ3RoICgpIC0gMTsKICBpZiAoeHBvcyA+ IHBvcykKICAgIHhwb3MgPSBwb3M7CiAgZm9yICgrK3hwb3M7IHhwb3MtLSA+IDA7KQogICAgaWYg KF9maW5kIChzLCBkYXRhICgpIFt4cG9zXSwgMCwgbikgIT0gbnBvcykKICAgICAgcmV0dXJuIHhw b3M7CiAgcmV0dXJuIG5wb3M7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRz LCBjbGFzcyBBbGxvY2F0b3I+CmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9y Pjo6c2l6ZV90eXBlCmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6CmZp bmRfZmlyc3Rfbm90X29mIChjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBl IG4pIGNvbnN0CnsKICBzaXplX3QgeHBvcyA9IHBvczsKICBmb3IgKDsgeHBvcyA8IGxlbmd0aCAo KTsgKyt4cG9zKQogICAgaWYgKF9maW5kIChzLCBkYXRhICgpIFt4cG9zXSwgMCwgbikgPT0gbnBv cykKICAgICAgcmV0dXJuIHhwb3M7CiAgcmV0dXJuIG5wb3M7Cn0KCnRlbXBsYXRlIDxjbGFzcyBj aGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0b3I+CmJhc2ljX3N0cmluZyA8Y2hhclQs IHRyYWl0cywgQWxsb2NhdG9yPjo6c2l6ZV90eXBlCmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0 cywgQWxsb2NhdG9yPjo6CmZpbmRfZmlyc3Rfbm90X29mIChjaGFyVCBjLCBzaXplX3R5cGUgcG9z KSBjb25zdAp7CiAgc2l6ZV90IHhwb3MgPSBwb3M7CiAgZm9yICg7IHhwb3MgPCBsZW5ndGggKCk7 ICsreHBvcykKICAgIGlmICh0cmFpdHM6Om5lIChkYXRhICgpIFt4cG9zXSwgYykpCiAgICAgIHJl dHVybiB4cG9zOwogIHJldHVybiBucG9zOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNz IHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgpiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFs bG9jYXRvcj46OnNpemVfdHlwZQpiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRv cj46OgpmaW5kX2xhc3Rfbm90X29mIChjb25zdCBjaGFyVCogcywgc2l6ZV90eXBlIHBvcywgc2l6 ZV90eXBlIG4pIGNvbnN0CnsKICBpZiAobGVuZ3RoKCkgPT0gMCkKICAgIHJldHVybiBucG9zOwog IHNpemVfdCB4cG9zID0gbGVuZ3RoICgpIC0gMTsKICBpZiAoeHBvcyA+IHBvcykKICAgIHhwb3Mg PSBwb3M7CiAgZm9yICgrK3hwb3M7IHhwb3MtLSA+IDA7KQogICAgaWYgKF9maW5kIChzLCBkYXRh ICgpIFt4cG9zXSwgMCwgbikgPT0gbnBvcykKICAgICAgcmV0dXJuIHhwb3M7CiAgcmV0dXJuIG5w b3M7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBBbGxvY2F0 b3I+CmJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6c2l6ZV90eXBlCmJh c2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0cywgQWxsb2NhdG9yPjo6CmZpbmRfbGFzdF9ub3Rfb2Yg KGNoYXJUIGMsIHNpemVfdHlwZSBwb3MpIGNvbnN0CnsKICBpZiAobGVuZ3RoKCkgPT0gMCkKICAg IHJldHVybiBucG9zOwogIHNpemVfdCB4cG9zID0gbGVuZ3RoICgpIC0gMTsKICBpZiAoeHBvcyA+ IHBvcykKICAgIHhwb3MgPSBwb3M7CiAgZm9yICgrK3hwb3M7IHhwb3MtLSA+IDA7KQogICAgaWYg KHRyYWl0czo6bmUgKGRhdGEgKCkgW3hwb3NdLCBjKSkKICAgICAgcmV0dXJuIHhwb3M7CiAgcmV0 dXJuIG5wb3M7Cn0KCnRlbXBsYXRlIDxjbGFzcyBjaGFyVCwgY2xhc3MgdHJhaXRzLCBjbGFzcyBB bGxvY2F0b3I+CmludCBiYXNpY19zdHJpbmcgPGNoYXJULCB0cmFpdHMsIEFsbG9jYXRvcj46Ogpj b21wYXJlIChjb25zdCBiYXNpY19zdHJpbmcmIHN0ciwgc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBl IG4pIGNvbnN0CnsKICBkbyB7IGlmICggcG9zID4gbGVuZ3RoICgpICkgX19vdXRfb2ZfcmFuZ2Ug KCJwb3MgPiBsZW5ndGggKCkiKTsgfSB3aGlsZSAoMCkgOwoKICBzaXplX3QgcmxlbiA9IGxlbmd0 aCAoKSAtIHBvczsKICBpZiAocmxlbiA+IG4pCiAgICBybGVuID0gbjsKICBpZiAocmxlbiA+IHN0 ci5sZW5ndGggKCkpCiAgICBybGVuID0gc3RyLmxlbmd0aCAoKTsKICBpbnQgciA9IHRyYWl0czo6 Y29tcGFyZSAoZGF0YSAoKSArIHBvcywgc3RyLmRhdGEgKCksIHJsZW4pOwogIGlmIChyICE9IDAp CiAgICByZXR1cm4gcjsKICBpZiAocmxlbiA9PSBuKQogICAgcmV0dXJuIDA7CiAgcmV0dXJuIChs ZW5ndGggKCkgLSBwb3MpIC0gc3RyLmxlbmd0aCAoKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJU LCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KaW50IGJhc2ljX3N0cmluZyA8Y2hhclQs IHRyYWl0cywgQWxsb2NhdG9yPjo6CmNvbXBhcmUgKGNvbnN0IGNoYXJUKiBzLCBzaXplX3R5cGUg cG9zLCBzaXplX3R5cGUgbikgY29uc3QKewogIGRvIHsgaWYgKCBwb3MgPiBsZW5ndGggKCkgKSBf X291dF9vZl9yYW5nZSAoInBvcyA+IGxlbmd0aCAoKSIpOyB9IHdoaWxlICgwKSA7CgogIHNpemVf dCBybGVuID0gbGVuZ3RoICgpIC0gcG9zOwogIGlmIChybGVuID4gbikKICAgIHJsZW4gPSBuOwog IGludCByID0gdHJhaXRzOjpjb21wYXJlIChkYXRhICgpICsgcG9zLCBzLCBybGVuKTsKICBpZiAo ciAhPSAwKQogICAgcmV0dXJuIHI7CiAgcmV0dXJuIChsZW5ndGggKCkgLSBwb3MpIC0gbjsKfQoK Cgp0ZW1wbGF0ZSA8Y2xhc3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgpp c3RyZWFtICYKb3BlcmF0b3I+PiAoaXN0cmVhbSAmaXMsIGJhc2ljX3N0cmluZyA8Y2hhclQsIHRy YWl0cywgQWxsb2NhdG9yPiAmcykKewogIGludCB3ID0gaXMud2lkdGggKDApOwogIGlmIChpcy5p cGZ4MCAoKSkKICAgIHsKICAgICAgcmVnaXN0ZXIgc3RyZWFtYnVmICpzYiA9IGlzLnJkYnVmICgp OwogICAgICBzLnJlc2l6ZSAoMCk7CiAgICAgIHdoaWxlICgxKQoJewoJICBpbnQgY2ggPSBzYi0+ c2J1bXBjICgpOwoJICBpZiAoY2ggPT0gKC0xKSApCgkgICAgewoJICAgICAgaXMuc2V0c3RhdGUg KGlvczo6ZW9mYml0KTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCSAgZWxzZSBpZiAodHJhaXRzOjpp c19kZWwgKGNoKSkKCSAgICB7CgkgICAgICBzYi0+c3VuZ2V0YyAoKTsKCSAgICAgIGJyZWFrOwoJ ICAgIH0KCSAgcyArPSBzdGF0aWNfY2FzdDxjaGFyVD4gKGNoKTsKCSAgaWYgKC0tdyA9PSAxKQoJ ICAgIGJyZWFrOwoJfQogICAgfQoKICBpcy5pc2Z4ICgpOwogIGlmIChzLmxlbmd0aCAoKSA9PSAw KQogICAgaXMuc2V0c3RhdGUgKGlvczo6ZmFpbGJpdCk7CgogIHJldHVybiBpczsKfQoKdGVtcGxh dGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4Kb3N0cmVhbSAm Cm9wZXJhdG9yPDwgKG9zdHJlYW0gJm8sIGNvbnN0IGJhc2ljX3N0cmluZyA8Y2hhclQsIHRyYWl0 cywgQWxsb2NhdG9yPiYgcykKewogIHJldHVybiBvLndyaXRlIChzLmRhdGEgKCksIHMubGVuZ3Ro ICgpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9j YXRvcj4KaXN0cmVhbSYKZ2V0bGluZSAoaXN0cmVhbSAmaXMsIGJhc2ljX3N0cmluZyA8Y2hhclQs IHRyYWl0cywgQWxsb2NhdG9yPiYgcywgY2hhclQgZGVsaW0pCnsKICBpZiAoaXMuaXBmeDEgKCkp CiAgICB7CiAgICAgIF9HX3NpemVfdCAgY291bnQgPSAwOwogICAgICBzdHJlYW1idWYgKnNiID0g aXMucmRidWYgKCk7CiAgICAgIHMucmVzaXplICgwKTsKCiAgICAgIHdoaWxlICgxKQoJewoJICBp bnQgY2ggPSBzYi0+c2J1bXBjICgpOwoJICBpZiAoY2ggPT0gKC0xKSApCgkgICAgewoJICAgICAg aXMuc2V0c3RhdGUgKGNvdW50ID09IDAKCQkJICAgPyAoaW9zOjpmYWlsYml0fGlvczo6ZW9mYml0 KQoJCQkgICA6IGlvczo6ZW9mYml0KTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCgkgICsrY291bnQ7 CgoJICBpZiAoY2ggPT0gZGVsaW0pCgkgICAgYnJlYWs7CgoJICBzICs9IHN0YXRpY19jYXN0PGNo YXJUPiAoY2gpOwoKCSAgaWYgKHMubGVuZ3RoICgpID09IHMubnBvcyAtIDEpCgkgICAgewoJICAg ICAgaXMuc2V0c3RhdGUgKGlvczo6ZmFpbGJpdCk7CgkgICAgICBicmVhazsKCSAgICB9Cgl9CiAg ICB9CgogICAKICAgCiAgaXMuaXNmeCAoKTsKCiAgcmV0dXJuIGlzOwp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgY2hhclQsIGNsYXNzIHRyYWl0cywgY2xhc3MgQWxsb2NhdG9yPgpiYXNpY19zdHJpbmcgPGNo YXJULCB0cmFpdHMsIEFsbG9jYXRvcj46OlJlcApiYXNpY19zdHJpbmc8Y2hhclQsIHRyYWl0cywg QWxsb2NhdG9yPjo6bmlsUmVwID0geyAwLCAwLCAxLCBmYWxzZSB9OwoKdGVtcGxhdGUgPGNsYXNz IGNoYXJULCBjbGFzcyB0cmFpdHMsIGNsYXNzIEFsbG9jYXRvcj4KY29uc3QgYmFzaWNfc3RyaW5n IDxjaGFyVCwgdHJhaXRzLCBBbGxvY2F0b3I+OjpzaXplX3R5cGUKYmFzaWNfc3RyaW5nIDxjaGFy VCwgdHJhaXRzLCBBbGxvY2F0b3I+OjpucG9zOwoKfSAgCiMgNjUyICIvaG9tZS90di90b29scy9n bnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8y Ljk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGQvYmFzdHJpbmcuaCIgMiAzCgoKCiMg NiAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2Vy cGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RyaW5n IiAyIDMKCgpleHRlcm4gIkMrKyIgewp0eXBlZGVmIGJhc2ljX3N0cmluZyA8Y2hhcj4gc3RyaW5n OwogCn0gIAoKCiMgMiAidHYyNzM3LmN4eCIgMgoKIyAxICIvaG9tZS90di90b29scy9nbnUvcnM2 MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIv Li4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9tYXAiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKIyAxICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2dj Yy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9zdGxfdHJlZS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoK CiAKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2Mt Mi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4u Ly4uL2luY2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNlLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKIyAxICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2dj Yy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4v Li4vLi4vaW5jbHVkZS9nKystMy9zdGxfcGFpci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKIAoKCgoKCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CnN0cnVjdCBw YWlyIHsKICB0eXBlZGVmIF9UMSBmaXJzdF90eXBlOwogIHR5cGVkZWYgX1QyIHNlY29uZF90eXBl OwoKICBfVDEgZmlyc3Q7CiAgX1QyIHNlY29uZDsKICBwYWlyKCkgOiBmaXJzdChfVDEoKSksIHNl Y29uZChfVDIoKSkge30KICBwYWlyKGNvbnN0IF9UMSYgX19hLCBjb25zdCBfVDImIF9fYikgOiBm aXJzdChfX2EpLCBzZWNvbmQoX19iKSB7fQoKCiAgdGVtcGxhdGUgPGNsYXNzIF9VMSwgY2xhc3Mg X1UyPgogIHBhaXIoY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9fcCkgOiBmaXJzdChfX3AuZmlyc3Qp LCBzZWNvbmQoX19wLnNlY29uZCkge30KCn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBf VDI+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29u c3QgcGFpcjxfVDEsIF9UMj4mIF9feSkKeyAKICByZXR1cm4gX194LmZpcnN0ID09IF9feS5maXJz dCAmJiBfX3guc2Vjb25kID09IF9feS5zZWNvbmQ7IAp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBj bGFzcyBfVDI+CmlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194 LCBjb25zdCBwYWlyPF9UMSwgX1QyPiYgX195KQp7IAogIHJldHVybiBfX3guZmlyc3QgPCBfX3ku Zmlyc3QgfHwgCiAgICAgICAgICghKF9feS5maXJzdCA8IF9feC5maXJzdCkgJiYgX194LnNlY29u ZCA8IF9feS5zZWNvbmQpOyAKfQoKdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgppbmxp bmUgcGFpcjxfVDEsIF9UMj4gbWFrZV9wYWlyKGNvbnN0IF9UMSYgX194LCBjb25zdCBfVDImIF9f eSkKewogIHJldHVybiBwYWlyPF9UMSwgX1QyPihfX3gsIF9feSk7Cn0KCiAKCgoKIAogCiAKIyA0 MiAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2Vy cGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2Fs Z29iYXNlLmgiIDIgMwoKCgojIDEgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUu Mi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9p bmNsdWRlL2crKy0zL3R5cGVfdHJhaXRzLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnN0cnVjdCBfX3RydWVfdHlwZSB7Cn07Cgpz dHJ1Y3QgX19mYWxzZV90eXBlIHsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBfX3R5 cGVfdHJhaXRzIHsgCiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgIHRoaXNfZHVtbXlfbWVtYmVy X211c3RfYmVfZmlyc3Q7CiAgICAgICAgICAgICAgICAgICAgCgoKCgoKICAgIAoKCgoKCgoKCiAK CiAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0 b3I7CiAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0 b3I7CiAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3Bl cmF0b3I7CiAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7 CiAgIHR5cGVkZWYgX19mYWxzZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKCgogCiAKIAoKCgp0 ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBlX3RyYWl0czxib29sPiB7CiAgIHR5cGVkZWYgX190cnVl X3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3Ry dWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1 ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190 cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlw ZSAgICBpc19QT0RfdHlwZTsKfTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8 Y2hhcj4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29u c3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25z dHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50 X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0 b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07Cgp0ZW1wbGF0ZTw+ ICBzdHJ1Y3QgX190eXBlX3RyYWl0czxzaWduZWQgY2hhcj4gewogICB0eXBlZGVmIF9fdHJ1ZV90 eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVl X3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVf dHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1 ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUg ICAgaXNfUE9EX3R5cGU7Cn07Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBlX3RyYWl0czx1bnNp Z25lZCBjaGFyPiB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVs dF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5 X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2ln bm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVz dHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCgoKdGVt cGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8d2NoYXJfdD4gewogICB0eXBlZGVmIF9fdHJ1 ZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190 cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3Ry dWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5 cGUgICAgaXNfUE9EX3R5cGU7Cn07CgoKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJhaXRz PHNob3J0PiB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9j b25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2Nv bnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1l bnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1 Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCnRlbXBsYXRl PD4gIHN0cnVjdCBfX3R5cGVfdHJhaXRzPHVuc2lnbmVkIHNob3J0PiB7CiAgIHR5cGVkZWYgX190 cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBf X3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVf dHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJhaXRz PGludD4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29u c3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25z dHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50 X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0 b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07Cgp0ZW1wbGF0ZTw+ ICBzdHJ1Y3QgX190eXBlX3RyYWl0czx1bnNpZ25lZCBpbnQ+IHsKICAgdHlwZWRlZiBfX3RydWVf dHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1 ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVl X3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3Ry dWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBl ICAgIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8bG9u Zz4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3Ry dWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1 Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29w ZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7 CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07Cgp0ZW1wbGF0ZTw+ICBz dHJ1Y3QgX190eXBlX3RyYWl0czx1bnNpZ25lZCBsb25nPiB7CiAgIHR5cGVkZWYgX190cnVlX3R5 cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVf dHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90 eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVl X3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAg ICBpc19QT0RfdHlwZTsKfTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8bG9u ZyBsb25nPiB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9j b25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2Nv bnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1l bnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1 Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCnRlbXBsYXRl PD4gIHN0cnVjdCBfX3R5cGVfdHJhaXRzPHVuc2lnbmVkIGxvbmcgbG9uZz4gewogICB0eXBlZGVm IF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190 cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07CgoKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVf dHJhaXRzPGZsb2F0PiB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVm YXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9j b3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fz c2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxf ZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCnRl bXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJhaXRzPGRvdWJsZT4gewogICB0eXBlZGVmIF9fdHJ1 ZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190 cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3Ry dWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5 cGUgICAgaXNfUE9EX3R5cGU7Cn07Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBlX3RyYWl0czxs b25nIGRvdWJsZT4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2RlZmF1 bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29w eV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9hc3Np Z25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Rl c3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07CgoKCnRl bXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBfX3R5cGVfdHJhaXRzPF9UcCo+IHsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKIyAyOTUgIi9ob21lL3R2L3Rvb2xzL2dudS9y czYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUu Mi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3R5cGVfdHJhaXRzLmgiIDMKCgoKIAogCgp0ZW1w bGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0lzX2ludGVnZXIgewogIHR5cGVkZWYgX19mYWxzZV90 eXBlIF9JbnRlZ3JhbDsKfTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRlZ2VyPGJvb2w+ IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCgoKdGVtcGxhdGU8PiAgc3Ry dWN0IF9Jc19pbnRlZ2VyPGNoYXI+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsK fTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfSXNfaW50ZWdlcjxzaWduZWQgY2hhcj4gewogIHR5cGVk ZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRl Z2VyPHVuc2lnbmVkIGNoYXI+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsK CgoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRlZ2VyPHdjaGFyX3Q+IHsKICB0eXBlZGVmIF9f dHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRlZ2Vy PHNob3J0PiB7CiAgdHlwZWRlZiBfX3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07Cgp0ZW1wbGF0ZTw+ ICBzdHJ1Y3QgX0lzX2ludGVnZXI8dW5zaWduZWQgc2hvcnQ+IHsKICB0eXBlZGVmIF9fdHJ1ZV90 eXBlIF9JbnRlZ3JhbDsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfSXNfaW50ZWdlcjxpbnQ+IHsK ICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBf SXNfaW50ZWdlcjx1bnNpZ25lZCBpbnQ+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3Jh bDsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfSXNfaW50ZWdlcjxsb25nPiB7CiAgdHlwZWRlZiBf X3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX0lzX2ludGVnZXI8 dW5zaWduZWQgbG9uZz4gewogIHR5cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKCgp0 ZW1wbGF0ZTw+ICBzdHJ1Y3QgX0lzX2ludGVnZXI8bG9uZyBsb25nPiB7CiAgdHlwZWRlZiBfX3Ry dWVfdHlwZSBfSW50ZWdyYWw7Cn07Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX0lzX2ludGVnZXI8dW5z aWduZWQgbG9uZyBsb25nPiB7CiAgdHlwZWRlZiBfX3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07CgoK CgoKIAogCiAKIyA0NSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9n Y2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUv ZysrLTMvc3RsX2FsZ29iYXNlLmgiIDIgMwoKCgoKIyAxICIvaG9tZS90di90b29scy9nbnUvcnM2 MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIv aW5jbHVkZS9saW1pdHMuaCIgMSAzIDQKIAoKCiAKCgoKCgogCiMgMSAiL2hvbWUvdHYvdG9vbHMv Z251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAv Mi45NS4yL2luY2x1ZGUvc3lzbGltaXRzLmgiIDEgMyA0CiAKCgoKCgojIDEgIi9ob21lL3R2L3Rv b2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIu MS4wLzIuOTUuMi9pbmNsdWRlL2xpbWl0cy5oIiAxIDMgNAogCgoKIAoKIyAxMTQgIi9ob21lL3R2 L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0 LjIuMS4wLzIuOTUuMi9pbmNsdWRlL2xpbWl0cy5oIiAzIDQKCgoKIyAxICIvdXNyL2luY2x1ZGUv bGltaXRzLmgiIDEgMyA0CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCgoKCgoKCgoK CgoKCgojIDExNyAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2Mt bGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvbGltaXRzLmgiIDIgMyA0 CgoKCgojIDcgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxp Yi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi9pbmNsdWRlL3N5c2xpbWl0cy5oIiAyIDMg NAoKCiMgMTEgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxp Yi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi9pbmNsdWRlL2xpbWl0cy5oIiAyIDMgNAoK CgoKCiAKCgoKIAoKCgogCgoKCgogCgoKCgoKIAoKCgogCgoKCgoKCgoKCgoKCiAKCiAKCgoKCiAK CgoKIAoKCgoKCgoKCiAKCgoKIAoKCgoKCgoKCgoKCgoKIAoKCgoKIAoKCgoKCgoKCiAKCgoKCgoK IAoKCgoKCgoKCgojIDQ5ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGli L2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVk ZS9nKystMy9zdGxfYWxnb2Jhc2UuaCIgMiAzCgoKIyAxICIvaG9tZS90di90b29scy9nbnUvcnM2 MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIv aW5jbHVkZS9zdGRkZWYuaCIgMSAzIDQKIyAzNDIgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAv Z2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi9pbmNs dWRlL3N0ZGRlZi5oIiAzIDQKCiMgNTEgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIu OTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8u Li9pbmNsdWRlL2crKy0zL3N0bF9hbGdvYmFzZS5oIiAyIDMKCiMgMSAiL2hvbWUvdHYvdG9vbHMv Z251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAv Mi45NS4yL2luY2x1ZGUvbmV3LmgiIDEgMyA0CiAKCgoKCiMgMSAiL2hvbWUvdHYvdG9vbHMvZ251 L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45 NS4yL2luY2x1ZGUvbmV3IiAxIDMgNAogCiAKCgoKCiNwcmFnbWEgaW50ZXJmYWNlICJuZXciCiMg MSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2Vy cGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yL2luY2x1ZGUvc3RkZGVmLmgiIDEgMyA0CiMgMzQyICIv aG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1p Ym0tYWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVkZS9zdGRkZWYuaCIgMyA0CgojIDggIi9ob21lL3R2 L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0 LjIuMS4wLzIuOTUuMi9pbmNsdWRlL25ldyIgMiAzIDQKCiMgMSAiL2hvbWUvdHYvdG9vbHMvZ251 L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45 NS4yL2luY2x1ZGUvZXhjZXB0aW9uIiAxIDMgNAogCiAKCgoKCiNwcmFnbWEgaW50ZXJmYWNlICJl eGNlcHRpb24iCgpleHRlcm4gIkMrKyIgewoKbmFtZXNwYWNlIHN0ZCB7CgpjbGFzcyBleGNlcHRp b24gewpwdWJsaWM6CiAgZXhjZXB0aW9uICgpIHsgfQogIHZpcnR1YWwgfmV4Y2VwdGlvbiAoKSB7 IH0KICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQgKCkgY29uc3Q7Cn07CgpjbGFzcyBiYWRfZXhj ZXB0aW9uIDogcHVibGljIGV4Y2VwdGlvbiB7CnB1YmxpYzoKICBiYWRfZXhjZXB0aW9uICgpIHsg fQogIHZpcnR1YWwgfmJhZF9leGNlcHRpb24gKCkgeyB9Cn07Cgp0eXBlZGVmIHZvaWQgKCp0ZXJt aW5hdGVfaGFuZGxlcikgKCk7CnR5cGVkZWYgdm9pZCAoKnVuZXhwZWN0ZWRfaGFuZGxlcikgKCk7 Cgp0ZXJtaW5hdGVfaGFuZGxlciBzZXRfdGVybWluYXRlICh0ZXJtaW5hdGVfaGFuZGxlcik7CnZv aWQgdGVybWluYXRlICgpIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKdW5leHBlY3Rl ZF9oYW5kbGVyIHNldF91bmV4cGVjdGVkICh1bmV4cGVjdGVkX2hhbmRsZXIpOwp2b2lkIHVuZXhw ZWN0ZWQgKCkgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwpib29sIHVuY2F1Z2h0X2V4 Y2VwdGlvbiAoKTsKCn0gIAoKfSAgCgoKIyA5ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2dj Yy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVk ZS9uZXciIDIgMyA0CgoKZXh0ZXJuICJDKysiIHsKCm5hbWVzcGFjZSBzdGQgewoKICBjbGFzcyBi YWRfYWxsb2MgOiBwdWJsaWMgZXhjZXB0aW9uIHsKICBwdWJsaWM6CiAgICB2aXJ0dWFsIGNvbnN0 IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuICJiYWRfYWxsb2MiOyB9CiAgfTsK CiAgc3RydWN0IG5vdGhyb3dfdCB7fTsKICBleHRlcm4gY29uc3Qgbm90aHJvd190IG5vdGhyb3c7 CiAgdHlwZWRlZiB2b2lkICgqbmV3X2hhbmRsZXIpKCk7CiAgbmV3X2hhbmRsZXIgc2V0X25ld19o YW5kbGVyIChuZXdfaGFuZGxlcik7Cgp9ICAKCiAKdm9pZCAqb3BlcmF0b3IgbmV3IChzaXplX3Qp IHRocm93IChzdGQ6OmJhZF9hbGxvYyk7CnZvaWQgKm9wZXJhdG9yIG5ld1tdIChzaXplX3QpIHRo cm93IChzdGQ6OmJhZF9hbGxvYyk7CnZvaWQgb3BlcmF0b3IgZGVsZXRlICh2b2lkICopIHRocm93 KCk7CnZvaWQgb3BlcmF0b3IgZGVsZXRlW10gKHZvaWQgKikgdGhyb3coKTsKdm9pZCAqb3BlcmF0 b3IgbmV3IChzaXplX3QsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKTsKdm9pZCAqb3Bl cmF0b3IgbmV3W10gKHNpemVfdCwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpOwp2b2lk IG9wZXJhdG9yIGRlbGV0ZSAodm9pZCAqLCBjb25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCk7 CnZvaWQgb3BlcmF0b3IgZGVsZXRlW10gKHZvaWQgKiwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0 aHJvdygpOwoKIAppbmxpbmUgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgdm9pZCAqcGxhY2Up IHRocm93KCkgeyByZXR1cm4gcGxhY2U7IH0KaW5saW5lIHZvaWQgKm9wZXJhdG9yIG5ld1tdKHNp emVfdCwgdm9pZCAqcGxhY2UpIHRocm93KCkgeyByZXR1cm4gcGxhY2U7IH0KfSAgCgoKIyA2ICIv aG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1p Ym0tYWl4NC4yLjEuMC8yLjk1LjIvaW5jbHVkZS9uZXcuaCIgMiAzIDQKCgp1c2luZyBzdGQ6Om5l d19oYW5kbGVyOwp1c2luZyBzdGQ6OnNldF9uZXdfaGFuZGxlcjsKCgojIDUyICIvaG9tZS90di90 b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4y LjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxnb2Jhc2UuaCIgMiAz CgoKCgoKCgogCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyMSwgY2xhc3MgX0Zvcndh cmRJdGVyMiwgY2xhc3MgX1RwPgppbmxpbmUgdm9pZCBfX2l0ZXJfc3dhcChfRm9yd2FyZEl0ZXIx IF9fYSwgX0ZvcndhcmRJdGVyMiBfX2IsIF9UcCopIHsKICBfVHAgX190bXAgPSAqX19hOwogICpf X2EgPSAqX19iOwogICpfX2IgPSBfX3RtcDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRl cjEsIGNsYXNzIF9Gb3J3YXJkSXRlcjI+CmlubGluZSB2b2lkIGl0ZXJfc3dhcChfRm9yd2FyZEl0 ZXIxIF9fYSwgX0ZvcndhcmRJdGVyMiBfX2IpIHsKICBfX2l0ZXJfc3dhcChfX2EsIF9fYiwgX192 YWx1ZV90eXBlKCBfX2EgKSApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgdm9pZCBz d2FwKF9UcCYgX19hLCBfVHAmIF9fYikgewogIF9UcCBfX3RtcCA9IF9fYTsKICBfX2EgPSBfX2I7 CiAgX19iID0gX190bXA7Cn0KCiAKIAoKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUg Y29uc3QgX1RwJiBtaW4oY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iKSB7CiAgcmV0dXJu IF9fYiA8IF9fYSA/IF9fYiA6IF9fYTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcD4KaW5saW5lIGNv bnN0IF9UcCYgbWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikgewogIHJldHVybiAg X19hIDwgX19iID8gX19iIDogX19hOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9D b21wYXJlPgppbmxpbmUgY29uc3QgX1RwJiBtaW4oY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYg X19iLCBfQ29tcGFyZSBfX2NvbXApIHsKICByZXR1cm4gX19jb21wKF9fYiwgX19hKSA/IF9fYiA6 IF9fYTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CmlubGluZSBjb25z dCBfVHAmIG1heChjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IsIF9Db21wYXJlIF9fY29t cCkgewogIHJldHVybiBfX2NvbXAoX19hLCBfX2IpID8gX19iIDogX19hOwp9CgogCiAKCiAKIAog CiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwg Y2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgX091dHB1dEl0ZXIgX19jb3B5KF9JbnB1dEl0ZXIgX19m aXJzdCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1 dEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaXRlcmF0b3Jf dGFnLCBfRGlzdGFuY2UqKQp7CiAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3Vs dCwgKytfX2ZpcnN0KQogICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CiAgcmV0dXJuIF9fcmVzdWx0 Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9PdXRwdXRJdGVy LCBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSBfT3V0cHV0SXRlcgpfX2NvcHkoX1JhbmRvbUFjY2Vz c0l0ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAogICAgICAgX091dHB1dEl0 ZXIgX19yZXN1bHQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBfRGlzdGFuY2UqKQp7CiAg Zm9yIChfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24pIHsK ICAgICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OwogICAgKytfX2ZpcnN0OwogICAgKytfX3Jlc3VsdDsK ICB9CiAgcmV0dXJuIF9fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgX1Rw KgpfX2NvcHlfdHJpdmlhbChjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LCBf VHAqIF9fcmVzdWx0KSB7CiAgbWVtbW92ZShfX3Jlc3VsdCwgX19maXJzdCwgc2l6ZW9mKF9UcCkg KiAoX19sYXN0IC0gX19maXJzdCkpOwogIHJldHVybiBfX3Jlc3VsdCArIChfX2xhc3QgLSBfX2Zp cnN0KTsKfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIs IGNsYXNzIF9Cb29sVHlwZT4Kc3RydWN0IF9fY29weV9kaXNwYXRjaCB7CiAgc3RhdGljIF9PdXRw dXRJdGVyIGNvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAg ICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgewogICAgdHlwZWRlZiB0 eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9D YXRlZ29yeTsKICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXI+ OjpkaWZmZXJlbmNlX3R5cGUgX0Rpc3RhbmNlOwogICAgcmV0dXJuIF9fY29weShfX2ZpcnN0LCBf X2xhc3QsIF9fcmVzdWx0LCBfQ2F0ZWdvcnkoKSwgKF9EaXN0YW5jZSopIDApOwogIH0KfTsKCnRl bXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBfX2NvcHlfZGlzcGF0Y2g8X1RwKiwgX1RwKiwgX190 cnVlX3R5cGU+CnsKICBzdGF0aWMgX1RwKiBjb3B5KGNvbnN0IF9UcCogX19maXJzdCwgY29uc3Qg X1RwKiBfX2xhc3QsIF9UcCogX19yZXN1bHQpIHsKICAgIHJldHVybiBfX2NvcHlfdHJpdmlhbChf X2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpz dHJ1Y3QgX19jb3B5X2Rpc3BhdGNoPGNvbnN0IF9UcCosIF9UcCosIF9fdHJ1ZV90eXBlPgp7CiAg c3RhdGljIF9UcCogY29weShjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LCBf VHAqIF9fcmVzdWx0KSB7CiAgICByZXR1cm4gX19jb3B5X3RyaXZpYWwoX19maXJzdCwgX19sYXN0 LCBfX3Jlc3VsdCk7CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9P dXRwdXRJdGVyPgppbmxpbmUgX091dHB1dEl0ZXIgY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9J bnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jl c3VsdCkgewogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXI+Ojp2 YWx1ZV90eXBlIF9UcDsKICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFz X3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcgogICAgICAgICAgX1RyaXZpYWw7CiAgcmV0dXJu IF9fY29weV9kaXNwYXRjaDxfSW5wdXRJdGVyLCBfT3V0cHV0SXRlciwgX1RyaXZpYWw+CiAgICA6 OmNvcHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7Cn0KCiMgMjEzICIvaG9tZS90di90b29s cy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEu MC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxnb2Jhc2UuaCIgMwoKCiAK IAoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlv bmFsSXRlcjIsIAogICAgICAgICAgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgX0JpZGlyZWN0aW9u YWxJdGVyMiBfX2NvcHlfYmFja3dhcmQoX0JpZGlyZWN0aW9uYWxJdGVyMSBfX2ZpcnN0LCAKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9CaWRpcmVjdGlvbmFsSXRl cjEgX19sYXN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9C aWRpcmVjdGlvbmFsSXRlcjIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9EaXN0YW5jZSopCnsKICB3aGlsZSAoX19maXJz dCAhPSBfX2xhc3QpCiAgICAqLS1fX3Jlc3VsdCA9ICotLV9fbGFzdDsKICByZXR1cm4gX19yZXN1 bHQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlciwgY2xhc3MgX0JpZGlyZWN0 aW9uYWxJdGVyLCBjbGFzcyBfRGlzdGFuY2U+CmlubGluZSBfQmlkaXJlY3Rpb25hbEl0ZXIgX19j b3B5X2JhY2t3YXJkKF9SYW5kb21BY2Nlc3NJdGVyIF9fZmlyc3QsIAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBfUmFuZG9tQWNjZXNzSXRlciBfX2xhc3QsIAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIg X19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRv bV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfRGlzdGFuY2UqKQp7CiAgZm9yIChfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19m aXJzdDsgX19uID4gMDsgLS1fX24pCiAgICAqLS1fX3Jlc3VsdCA9ICotLV9fbGFzdDsKICByZXR1 cm4gX19yZXN1bHQ7Cn0KCgoKIAogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVjdGlvbmFs SXRlcjEsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlcjIsCiAgICAgICAgICBjbGFzcyBfQm9vbFR5 cGU+CnN0cnVjdCBfX2NvcHlfYmFja3dhcmRfZGlzcGF0Y2gKewogIHR5cGVkZWYgdHlwZW5hbWUg aXRlcmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcjE+OjppdGVyYXRvcl9jYXRlZ29yeSAK ICAgICAgICAgIF9DYXQ7CiAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0JpZGly ZWN0aW9uYWxJdGVyMT46OmRpZmZlcmVuY2VfdHlwZQogICAgICAgICAgX0Rpc3RhbmNlOwoKICBz dGF0aWMgX0JpZGlyZWN0aW9uYWxJdGVyMiBjb3B5KF9CaWRpcmVjdGlvbmFsSXRlcjEgX19maXJz dCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIx IF9fbGFzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25h bEl0ZXIyIF9fcmVzdWx0KSB7CiAgICByZXR1cm4gX19jb3B5X2JhY2t3YXJkKF9fZmlyc3QsIF9f bGFzdCwgX19yZXN1bHQsIF9DYXQoKSwgKF9EaXN0YW5jZSopIDApOwogIH0KfTsKCnRlbXBsYXRl IDxjbGFzcyBfVHA+CnN0cnVjdCBfX2NvcHlfYmFja3dhcmRfZGlzcGF0Y2g8X1RwKiwgX1RwKiwg X190cnVlX3R5cGU+CnsKICBzdGF0aWMgX1RwKiBjb3B5KGNvbnN0IF9UcCogX19maXJzdCwgY29u c3QgX1RwKiBfX2xhc3QsIF9UcCogX19yZXN1bHQpIHsKICAgIGNvbnN0IHB0cmRpZmZfdCBfTnVt ID0gX19sYXN0IC0gX19maXJzdDsKICAgIG1lbW1vdmUoX19yZXN1bHQgLSBfTnVtLCBfX2ZpcnN0 LCBzaXplb2YoX1RwKSAqIF9OdW0pOwogICAgcmV0dXJuIF9fcmVzdWx0IC0gX051bTsKICB9Cn07 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgX19jb3B5X2JhY2t3YXJkX2Rpc3BhdGNoPGNv bnN0IF9UcCosIF9UcCosIF9fdHJ1ZV90eXBlPgp7CiAgc3RhdGljIF9UcCogY29weShjb25zdCBf VHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LCBfVHAqIF9fcmVzdWx0KSB7CiAgICByZXR1 cm4gIF9fY29weV9iYWNrd2FyZF9kaXNwYXRjaDxfVHAqLCBfVHAqLCBfX3RydWVfdHlwZT4KICAg ICAgOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOwogIH0KfTsKCnRlbXBsYXRlIDxj bGFzcyBfQkkxLCBjbGFzcyBfQkkyPgppbmxpbmUgX0JJMiBjb3B5X2JhY2t3YXJkKF9CSTEgX19m aXJzdCwgX0JJMSBfX2xhc3QsIF9CSTIgX19yZXN1bHQpIHsKICB0eXBlZGVmIHR5cGVuYW1lIF9f dHlwZV90cmFpdHM8dHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9CSTI+Ojp2YWx1ZV90eXBlPgog ICAgICAgICAgICAgICAgICAgICAgICA6Omhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3IK ICAgICAgICAgIF9Ucml2aWFsOwogIHJldHVybiBfX2NvcHlfYmFja3dhcmRfZGlzcGF0Y2g8X0JJ MSwgX0JJMiwgX1RyaXZpYWw+CiAgICAgICAgICAgICAgOjpjb3B5KF9fZmlyc3QsIF9fbGFzdCwg X19yZXN1bHQpOwp9CgojIDMwMyAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4y L2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2lu Y2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNlLmgiIDMKCgogCiAKCnRlbXBsYXRlIDxjbGFzcyBfSW5w dXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX091dHB1dEl0ZXI+CnBhaXI8X0lucHV0SXRlciwg X091dHB1dEl0ZXI+IF9fY29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0ZXIgX19yZXN1 bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9y X3RhZykgewogIGZvciAoIDsgX19jb3VudCA+IDA7IC0tX19jb3VudCkgewogICAgKl9fcmVzdWx0 ID0gKl9fZmlyc3Q7CiAgICArK19fZmlyc3Q7CiAgICArK19fcmVzdWx0OwogIH0KICByZXR1cm4g cGFpcjxfSW5wdXRJdGVyLCBfT3V0cHV0SXRlcj4oX19maXJzdCwgX19yZXN1bHQpOwp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1JBSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9PdXRwdXRJdGVyPgppbmxp bmUgcGFpcjxfUkFJdGVyLCBfT3V0cHV0SXRlcj4KX19jb3B5X24oX1JBSXRlciBfX2ZpcnN0LCBf U2l6ZSBfX2NvdW50LAogICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKICAgICAgICAgcmFu ZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpIHsKICBfUkFJdGVyIF9fbGFzdCA9IF9fZmlyc3QgKyBf X2NvdW50OwogIHJldHVybiBwYWlyPF9SQUl0ZXIsIF9PdXRwdXRJdGVyPihfX2xhc3QsIGNvcHko X19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRl ciwgY2xhc3MgX1NpemUsIGNsYXNzIF9PdXRwdXRJdGVyPgppbmxpbmUgcGFpcjxfSW5wdXRJdGVy LCBfT3V0cHV0SXRlcj4KX19jb3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50 LCBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgewogIHJldHVybiBfX2NvcHlfbihfX2ZpcnN0LCBfX2Nv dW50LCBfX3Jlc3VsdCwKICAgICAgICAgICAgICAgICAgX19pdGVyYXRvcl9jYXRlZ29yeSggX19m aXJzdCApICk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xh c3MgX091dHB1dEl0ZXI+CmlubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9PdXRwdXRJdGVyPgpjb3B5 X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LCBfT3V0cHV0SXRlciBfX3Jlc3Vs dCkgewogIHJldHVybiBfX2NvcHlfbihfX2ZpcnN0LCBfX2NvdW50LCBfX3Jlc3VsdCk7Cn0KCiAK IAoKCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4Kdm9pZCBmaWxsKF9G b3J3YXJkSXRlciBfX2ZpcnN0LCBfRm9yd2FyZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9fdmFs dWUpIHsKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCiAgICAqX19maXJz dCA9IF9fdmFsdWU7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfT3V0cHV0SXRlciwgY2xhc3MgX1NpemUs IGNsYXNzIF9UcD4KX091dHB1dEl0ZXIgZmlsbF9uKF9PdXRwdXRJdGVyIF9fZmlyc3QsIF9TaXpl IF9fbiwgY29uc3QgX1RwJiBfX3ZhbHVlKSB7CiAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytf X2ZpcnN0KQogICAgKl9fZmlyc3QgPSBfX3ZhbHVlOwogIHJldHVybiBfX2ZpcnN0Owp9CgogCiAK CnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+CnBhaXI8X0lu cHV0SXRlcjEsIF9JbnB1dEl0ZXIyPiBtaXNtYXRjaChfSW5wdXRJdGVyMSBfX2ZpcnN0MSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIxIF9fbGFzdDEs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2Zp cnN0MikgewogIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmICpfX2ZpcnN0MSA9PSAqX19m aXJzdDIpIHsKICAgICsrX19maXJzdDE7CiAgICArK19fZmlyc3QyOwogIH0KICByZXR1cm4gcGFp cjxfSW5wdXRJdGVyMSwgX0lucHV0SXRlcjI+KF9fZmlyc3QxLCBfX2ZpcnN0Mik7Cn0KCnRlbXBs YXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9CaW5hcnlQ cmVkaWNhdGU+CnBhaXI8X0lucHV0SXRlcjEsIF9JbnB1dEl0ZXIyPiBtaXNtYXRjaChfSW5wdXRJ dGVyMSBfX2ZpcnN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9J bnB1dEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkgewogIHdoaWxlIChfX2ZpcnN0 MSAhPSBfX2xhc3QxICYmIF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QxLCAqX19maXJzdDIpKSB7CiAg ICArK19fZmlyc3QxOwogICAgKytfX2ZpcnN0MjsKICB9CiAgcmV0dXJuIHBhaXI8X0lucHV0SXRl cjEsIF9JbnB1dEl0ZXIyPihfX2ZpcnN0MSwgX19maXJzdDIpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyPgppbmxpbmUgYm9vbCBlcXVhbChfSW5wdXRJ dGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgX0lu cHV0SXRlcjIgX19maXJzdDIpIHsKICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDE7ICsrX19m aXJzdDEsICsrX19maXJzdDIpCiAgICBpZiAoKl9fZmlyc3QxICE9ICpfX2ZpcnN0MikKICAgICAg cmV0dXJuIGZhbHNlOwogIHJldHVybiB0cnVlOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRl cjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBjbGFzcyBfQmluYXJ5UHJlZGljYXRlPgppbmxpbmUgYm9v bCBlcXVhbChfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAg ICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9CaW5hcnlQcmVkaWNhdGUgX19iaW5h cnlfcHJlZCkgewogIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytf X2ZpcnN0MikKICAgIGlmICghX19iaW5hcnlfcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpCiAg ICAgIHJldHVybiBmYWxzZTsKICByZXR1cm4gdHJ1ZTsKfQoKIAogCiAKCnRlbXBsYXRlIDxjbGFz cyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0SXRlcjI+CmJvb2wgbGV4aWNvZ3JhcGhpY2FsX2Nv bXBhcmUoX0lucHV0SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9f bGFzdDIpIHsKICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19s YXN0MgogICAgICAgIDsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikgewogICAgaWYgKCpfX2ZpcnN0 MSA8ICpfX2ZpcnN0MikKICAgICAgcmV0dXJuIHRydWU7CiAgICBpZiAoKl9fZmlyc3QyIDwgKl9f Zmlyc3QxKQogICAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiBfX2ZpcnN0MSA9PSBfX2xh c3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDI7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVy MSwgY2xhc3MgX0lucHV0SXRlcjIsIGNsYXNzIF9Db21wYXJlPgpib29sIGxleGljb2dyYXBoaWNh bF9jb21wYXJlKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyLCBfSW5wdXRJdGVy MiBfX2xhc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db21wYXJlIF9fY29tcCkg ewogIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyCiAg ICAgICAgOyArK19fZmlyc3QxLCArK19fZmlyc3QyKSB7CiAgICBpZiAoX19jb21wKCpfX2ZpcnN0 MSwgKl9fZmlyc3QyKSkKICAgICAgcmV0dXJuIHRydWU7CiAgICBpZiAoX19jb21wKCpfX2ZpcnN0 MiwgKl9fZmlyc3QxKSkKICAgICAgcmV0dXJuIGZhbHNlOwogIH0KICByZXR1cm4gX19maXJzdDEg PT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyOwp9CgppbmxpbmUgYm9vbCAKbGV4aWNv Z3JhcGhpY2FsX2NvbXBhcmUoY29uc3QgdW5zaWduZWQgY2hhciogX19maXJzdDEsCiAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDEsCiAgICAgICAgICAg ICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZmlyc3QyLAogICAgICAgICAgICAg ICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2xhc3QyKQp7CiAgY29uc3Qgc2l6ZV90 IF9fbGVuMSA9IF9fbGFzdDEgLSBfX2ZpcnN0MTsKICBjb25zdCBzaXplX3QgX19sZW4yID0gX19s YXN0MiAtIF9fZmlyc3QyOwogIGNvbnN0IGludCBfX3Jlc3VsdCA9IG1lbWNtcChfX2ZpcnN0MSwg X19maXJzdDIsIG1pbihfX2xlbjEsIF9fbGVuMikpOwogIHJldHVybiBfX3Jlc3VsdCAhPSAwID8g X19yZXN1bHQgPCAwIDogX19sZW4xIDwgX19sZW4yOwp9CgppbmxpbmUgYm9vbCBsZXhpY29ncmFw aGljYWxfY29tcGFyZShjb25zdCBjaGFyKiBfX2ZpcnN0MSwgY29uc3QgY2hhciogX19sYXN0MSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogX19maXJzdDIs IGNvbnN0IGNoYXIqIF9fbGFzdDIpCnsKCgoKCgoKICByZXR1cm4gbGV4aWNvZ3JhcGhpY2FsX2Nv bXBhcmUoKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2ZpcnN0MSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2xhc3QxLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QyLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciopIF9f bGFzdDIpOwoKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVy Mj4KaW50IF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfSW5wdXRJdGVyMSBfX2ZpcnN0 MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MikKewogIHdoaWxlIChf X2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIpIHsKICAgIGlmICgqX19m aXJzdDEgPCAqX19maXJzdDIpCiAgICAgIHJldHVybiAtMTsKICAgIGlmICgqX19maXJzdDIgPCAq X19maXJzdDEpCiAgICAgIHJldHVybiAxOwogICAgKytfX2ZpcnN0MTsKICAgICsrX19maXJzdDI7 CiAgfQogIGlmIChfX2ZpcnN0MiA9PSBfX2xhc3QyKSB7CiAgICByZXR1cm4gIShfX2ZpcnN0MSA9 PSBfX2xhc3QxKTsKICB9CiAgZWxzZSB7CiAgICByZXR1cm4gLTE7CiAgfQp9CgppbmxpbmUgaW50 Cl9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2Zp cnN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIq IF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBj aGFyKiBfX2ZpcnN0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2ln bmVkIGNoYXIqIF9fbGFzdDIpCnsKICBjb25zdCBwdHJkaWZmX3QgX19sZW4xID0gX19sYXN0MSAt IF9fZmlyc3QxOwogIGNvbnN0IHB0cmRpZmZfdCBfX2xlbjIgPSBfX2xhc3QyIC0gX19maXJzdDI7 CiAgY29uc3QgaW50IF9fcmVzdWx0ID0gbWVtY21wKF9fZmlyc3QxLCBfX2ZpcnN0MiwgbWluKF9f bGVuMSwgX19sZW4yKSk7CiAgcmV0dXJuIF9fcmVzdWx0ICE9IDAgPyBfX3Jlc3VsdCAKICAgICAg ICAgICAgICAgICAgICAgICA6IChfX2xlbjEgPT0gX19sZW4yID8gMCA6IChfX2xlbjEgPCBfX2xl bjIgPyAtMSA6IDEpKTsKfQoKaW5saW5lIGludCAKX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8z d2F5KGNvbnN0IGNoYXIqIF9fZmlyc3QxLCBjb25zdCBjaGFyKiBfX2xhc3QxLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogX19maXJzdDIsIGNvbnN0IGNoYXIqIF9f bGFzdDIpCnsKCgoKCgoKCiAgcmV0dXJuIF9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheSgo Y29uc3QgdW5zaWduZWQgY2hhciopIF9fZmlyc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2xhc3QxLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBfX2Zp cnN0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1bnNp Z25lZCBjaGFyKikgX19sYXN0Mik7Cgp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNs YXNzIF9JbnB1dEl0ZXIyPgppbnQgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfSW5wdXRJ dGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIpCnsK ICByZXR1cm4gX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KF9fZmlyc3QxLCBfX2xhc3Qx LCBfX2ZpcnN0MiwgX19sYXN0Mik7Cn0KCiAKCgoKIAogCiAKIyA1NiAiL2hvbWUvdHYvdG9vbHMv Z251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAv Mi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX3RyZWUuaCIgMiAzCgoKIyAxICIv aG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1p Ym0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfY29uc3Ry dWN0LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKIAoKIAogCgp0 ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgdm9pZCBkZXN0cm95KF9UcCogX19wb2ludGVyKSB7 CiAgX19wb2ludGVyLT5+X1RwKCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4K aW5saW5lIHZvaWQgY29uc3RydWN0KF9UMSogX19wLCBjb25zdCBfVDImIF9fdmFsdWUpIHsKICBu ZXcgKF9fcCkgX1QxKF9fdmFsdWUpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxPgppbmxpbmUgdm9p ZCBjb25zdHJ1Y3QoX1QxKiBfX3ApIHsKICBuZXcgKF9fcCkgX1QxKCk7Cn0KCnRlbXBsYXRlIDxj bGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgppbmxpbmUgdm9pZApfX2Rlc3Ryb3lfYXV4KF9Gb3J3YXJk SXRlcmF0b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsIF9fZmFsc2VfdHlwZSkK ewogIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKICAgIGRlc3Ryb3koJipf X2ZpcnN0KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CmlubGluZSB2b2lk IF9fZGVzdHJveV9hdXgoX0ZvcndhcmRJdGVyYXRvciwgX0ZvcndhcmRJdGVyYXRvciwgX190cnVl X3R5cGUpIHt9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvciwgY2xhc3MgX1RwPgpp bmxpbmUgdm9pZApfX2Rlc3Ryb3koX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0 ZXJhdG9yIF9fbGFzdCwgX1RwKikKewogIHR5cGVkZWYgdHlwZW5hbWUgX190eXBlX3RyYWl0czxf VHA+OjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yCiAgICAgICAgICBfVHJpdmlhbF9kZXN0cnVjdG9y OwogIF9fZGVzdHJveV9hdXgoX19maXJzdCwgX19sYXN0LCBfVHJpdmlhbF9kZXN0cnVjdG9yKCkp Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KaW5saW5lIHZvaWQgZGVzdHJv eShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KSB7CiAg X19kZXN0cm95KF9fZmlyc3QsIF9fbGFzdCwgX192YWx1ZV90eXBlKCBfX2ZpcnN0ICkgKTsKfQoK aW5saW5lIHZvaWQgZGVzdHJveShjaGFyKiwgY2hhciopIHt9CmlubGluZSB2b2lkIGRlc3Ryb3ko d2NoYXJfdCosIHdjaGFyX3QqKSB7fQoKIAoKCgogCiAKIAojIDU4ICIvaG9tZS90di90b29scy9n bnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8y Ljk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfdHJlZS5oIiAyIDMKCiMgMSAiL2hv bWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGliL3Bvd2VycGMtaWJt LWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2Z1bmN0aW9u LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCnRlbXBsYXRlIDxj bGFzcyBfQXJnLCBjbGFzcyBfUmVzdWx0PgpzdHJ1Y3QgdW5hcnlfZnVuY3Rpb24gewogIHR5cGVk ZWYgX0FyZyBhcmd1bWVudF90eXBlOwogIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRfdHlwZTsKfTsK CnRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzIsIGNsYXNzIF9SZXN1bHQ+CnN0cnVj dCBiaW5hcnlfZnVuY3Rpb24gewogIHR5cGVkZWYgX0FyZzEgZmlyc3RfYXJndW1lbnRfdHlwZTsK ICB0eXBlZGVmIF9BcmcyIHNlY29uZF9hcmd1bWVudF90eXBlOwogIHR5cGVkZWYgX1Jlc3VsdCBy ZXN1bHRfdHlwZTsKfTsgICAgICAKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBwbHVzIDog cHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLF9UcD4gewogIF9UcCBvcGVyYXRvcigpKGNv bnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ICsgX195OyB9 Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgbWludXMgOiBwdWJsaWMgYmluYXJ5X2Z1 bmN0aW9uPF9UcCxfVHAsX1RwPiB7CiAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNv bnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggLSBfX3k7IH0KfTsKCnRlbXBsYXRlIDxj bGFzcyBfVHA+CnN0cnVjdCBtdWx0aXBsaWVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAs X1RwLF9UcD4gewogIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9f eSkgY29uc3QgeyByZXR1cm4gX194ICogX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpz dHJ1Y3QgZGl2aWRlcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxfVHA+IHsKICBf VHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0 dXJuIF9feCAvIF9feTsgfQp9OwoKIAoKdGVtcGxhdGUgPGNsYXNzIF9UcD4gaW5saW5lIF9UcCBp ZGVudGl0eV9lbGVtZW50KHBsdXM8X1RwPikgewogIHJldHVybiBfVHAoMCk7Cn0KdGVtcGxhdGUg PGNsYXNzIF9UcD4gaW5saW5lIF9UcCBpZGVudGl0eV9lbGVtZW50KG11bHRpcGxpZXM8X1RwPikg ewogIHJldHVybiBfVHAoMSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBtb2R1bHVz IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLF9UcD4gCnsKICBfVHAgb3BlcmF0b3Io KShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCAlIF9f eTsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IG5lZ2F0ZSA6IHB1YmxpYyB1bmFy eV9mdW5jdGlvbjxfVHAsX1RwPiAKewogIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194KSBj b25zdCB7IHJldHVybiAtX194OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgZXF1 YWxfdG8gOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsYm9vbD4gCnsKICBib29sIG9w ZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBf X3ggPT0gX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3Qgbm90X2VxdWFsX3Rv IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLGJvb2w+IAp7CiAgYm9vbCBvcGVyYXRv cigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ICE9 IF9feTsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGdyZWF0ZXIgOiBwdWJsaWMg YmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsYm9vbD4gCnsKICBib29sIG9wZXJhdG9yKCkoY29uc3Qg X1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggPiBfX3k7IH0KfTsK CnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBsZXNzIDogcHVibGljIGJpbmFyeV9mdW5jdGlv bjxfVHAsX1RwLGJvb2w+IAp7CiAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25z dCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194IDwgX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xh c3MgX1RwPgpzdHJ1Y3QgZ3JlYXRlcl9lcXVhbCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1Rw LF9UcCxib29sPgp7CiAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAm IF9feSkgY29uc3QgeyByZXR1cm4gX194ID49IF9feTsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9U cD4Kc3RydWN0IGxlc3NfZXF1YWwgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsYm9v bD4gCnsKICBib29sIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBj b25zdCB7IHJldHVybiBfX3ggPD0gX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1 Y3QgbG9naWNhbF9hbmQgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsYm9vbD4Kewog IGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsg cmV0dXJuIF9feCAmJiBfX3k7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBsb2dp Y2FsX29yIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLGJvb2w+CnsKICBib29sIG9w ZXJhdG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBf X3ggfHwgX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgbG9naWNhbF9ub3Qg OiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLGJvb2w+CnsKICBib29sIG9wZXJhdG9yKCkoY29u c3QgX1RwJiBfX3gpIGNvbnN0IHsgcmV0dXJuICFfX3g7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBf UHJlZGljYXRlPgpjbGFzcyB1bmFyeV9uZWdhdGUKICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0 eXBlbmFtZSBfUHJlZGljYXRlOjphcmd1bWVudF90eXBlLCBib29sPiB7CnByb3RlY3RlZDoKICBf UHJlZGljYXRlIF9NX3ByZWQ7CnB1YmxpYzoKICBleHBsaWNpdCB1bmFyeV9uZWdhdGUoY29uc3Qg X1ByZWRpY2F0ZSYgX194KSA6IF9NX3ByZWQoX194KSB7fQogIGJvb2wgb3BlcmF0b3IoKShjb25z dCB0eXBlbmFtZSBfUHJlZGljYXRlOjphcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0IHsKICAgIHJl dHVybiAhX01fcHJlZChfX3gpOwogIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgpp bmxpbmUgdW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+IApub3QxKGNvbnN0IF9QcmVkaWNhdGUmIF9f cHJlZCkKewogIHJldHVybiB1bmFyeV9uZWdhdGU8X1ByZWRpY2F0ZT4oX19wcmVkKTsKfQoKdGVt cGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+IApjbGFzcyBiaW5hcnlfbmVnYXRlIAogIDogcHVibGlj IGJpbmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfUHJlZGljYXRlOjpmaXJzdF9hcmd1bWVudF90eXBl LAogICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBfUHJlZGljYXRlOjpzZWNvbmRf YXJndW1lbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbD4gewpwcm90ZWN0 ZWQ6CiAgX1ByZWRpY2F0ZSBfTV9wcmVkOwpwdWJsaWM6CiAgZXhwbGljaXQgYmluYXJ5X25lZ2F0 ZShjb25zdCBfUHJlZGljYXRlJiBfX3gpIDogX01fcHJlZChfX3gpIHt9CiAgYm9vbCBvcGVyYXRv cigpKGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OmZpcnN0X2FyZ3VtZW50X3R5cGUmIF9feCwg CiAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIF9QcmVkaWNhdGU6OnNlY29uZF9hcmd1 bWVudF90eXBlJiBfX3kpIGNvbnN0CiAgewogICAgcmV0dXJuICFfTV9wcmVkKF9feCwgX195KTsg CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9QcmVkaWNhdGU+CmlubGluZSBiaW5hcnlfbmVnYXRl PF9QcmVkaWNhdGU+IApub3QyKGNvbnN0IF9QcmVkaWNhdGUmIF9fcHJlZCkKewogIHJldHVybiBi aW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+KF9fcHJlZCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfT3Bl cmF0aW9uPiAKY2xhc3MgYmluZGVyMXN0CiAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5h bWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGU+IHsKcHJvdGVjdGVkOgogIF9P cGVyYXRpb24gb3A7CiAgdHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1lbnRfdHlwZSB2 YWx1ZTsKcHVibGljOgogIGJpbmRlcjFzdChjb25zdCBfT3BlcmF0aW9uJiBfX3gsCiAgICAgICAg ICAgIGNvbnN0IHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUmIF9feSkK ICAgICAgOiBvcChfX3gpLCB2YWx1ZShfX3kpIHt9CiAgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVz dWx0X3R5cGUKICBvcGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9PcGVyYXRpb246OnNlY29uZF9h cmd1bWVudF90eXBlJiBfX3gpIGNvbnN0IHsKICAgIHJldHVybiBvcCh2YWx1ZSwgX194KTsgCiAg fQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24sIGNsYXNzIF9UcD4KaW5saW5lIGJpbmRl cjFzdDxfT3BlcmF0aW9uPiAKYmluZDFzdChjb25zdCBfT3BlcmF0aW9uJiBfX29wZXIsIGNvbnN0 IF9UcCYgX194KSAKewogIHR5cGVkZWYgdHlwZW5hbWUgX09wZXJhdGlvbjo6Zmlyc3RfYXJndW1l bnRfdHlwZSBfQXJnMV90eXBlOwogIHJldHVybiBiaW5kZXIxc3Q8X09wZXJhdGlvbj4oX19vcGVy LCBfQXJnMV90eXBlKF9feCkpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbj4gCmNsYXNz IGJpbmRlcjJuZAogIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9PcGVyYXRpb246 OmZpcnN0X2FyZ3VtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUg X09wZXJhdGlvbjo6cmVzdWx0X3R5cGU+IHsKcHJvdGVjdGVkOgogIF9PcGVyYXRpb24gb3A7CiAg dHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgdmFsdWU7CnB1YmxpYzoK ICBiaW5kZXIybmQoY29uc3QgX09wZXJhdGlvbiYgX194LAogICAgICAgICAgICBjb25zdCB0eXBl bmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSYgX195KSAKICAgICAgOiBvcChf X3gpLCB2YWx1ZShfX3kpIHt9CiAgdHlwZW5hbWUgX09wZXJhdGlvbjo6cmVzdWx0X3R5cGUKICBv cGVyYXRvcigpKGNvbnN0IHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUm IF9feCkgY29uc3QgewogICAgcmV0dXJuIG9wKF9feCwgdmFsdWUpOyAKICB9Cn07Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX09wZXJhdGlvbiwgY2xhc3MgX1RwPgppbmxpbmUgYmluZGVyMm5kPF9PcGVyYXRp b24+IApiaW5kMm5kKGNvbnN0IF9PcGVyYXRpb24mIF9fb3BlciwgY29uc3QgX1RwJiBfX3gpIAp7 CiAgdHlwZWRlZiB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlwZSBfQXJn Ml90eXBlOwogIHJldHVybiBiaW5kZXIybmQ8X09wZXJhdGlvbj4oX19vcGVyLCBfQXJnMl90eXBl KF9feCkpOwp9CgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRp b24yPgpjbGFzcyB1bmFyeV9jb21wb3NlCiAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5h bWUgX09wZXJhdGlvbjI6OmFyZ3VtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAg dHlwZW5hbWUgX09wZXJhdGlvbjE6OnJlc3VsdF90eXBlPiAKewpwcm90ZWN0ZWQ6CiAgX09wZXJh dGlvbjEgX19vcDE7CiAgX09wZXJhdGlvbjIgX19vcDI7CnB1YmxpYzoKICB1bmFyeV9jb21wb3Nl KGNvbnN0IF9PcGVyYXRpb24xJiBfX3gsIGNvbnN0IF9PcGVyYXRpb24yJiBfX3kpIAogICAgOiBf X29wMShfX3gpLCBfX29wMihfX3kpIHt9CiAgdHlwZW5hbWUgX09wZXJhdGlvbjE6OnJlc3VsdF90 eXBlCiAgb3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uMjo6YXJndW1lbnRfdHlw ZSYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX19vcDEoX19vcDIoX194KSk7CiAgfQp9OwoKdGVt cGxhdGUgPGNsYXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMj4KaW5saW5lIHVuYXJ5 X2NvbXBvc2U8X09wZXJhdGlvbjEsX09wZXJhdGlvbjI+IApjb21wb3NlMShjb25zdCBfT3BlcmF0 aW9uMSYgX19vcDEsIGNvbnN0IF9PcGVyYXRpb24yJiBfX29wMikKewogIHJldHVybiB1bmFyeV9j b21wb3NlPF9PcGVyYXRpb24xLF9PcGVyYXRpb24yPihfX29wMSwgX19vcDIpOwp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX09wZXJhdGlvbjEsIGNsYXNzIF9PcGVyYXRpb24yLCBjbGFzcyBfT3BlcmF0aW9u Mz4KY2xhc3MgYmluYXJ5X2NvbXBvc2UKICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFt ZSBfT3BlcmF0aW9uMjo6YXJndW1lbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0 eXBlbmFtZSBfT3BlcmF0aW9uMTo6cmVzdWx0X3R5cGU+IHsKcHJvdGVjdGVkOgogIF9PcGVyYXRp b24xIF9NX29wMTsKICBfT3BlcmF0aW9uMiBfTV9vcDI7CiAgX09wZXJhdGlvbjMgX01fb3AzOwpw dWJsaWM6CiAgYmluYXJ5X2NvbXBvc2UoY29uc3QgX09wZXJhdGlvbjEmIF9feCwgY29uc3QgX09w ZXJhdGlvbjImIF9feSwgCiAgICAgICAgICAgICAgICAgY29uc3QgX09wZXJhdGlvbjMmIF9feikg CiAgICA6IF9NX29wMShfX3gpLCBfTV9vcDIoX195KSwgX01fb3AzKF9feikgeyB9CiAgdHlwZW5h bWUgX09wZXJhdGlvbjE6OnJlc3VsdF90eXBlCiAgb3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBf T3BlcmF0aW9uMjo6YXJndW1lbnRfdHlwZSYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX01fb3Ax KF9NX29wMihfX3gpLCBfTV9vcDMoX194KSk7CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9PcGVy YXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMiwgY2xhc3MgX09wZXJhdGlvbjM+CmlubGluZSBiaW5h cnlfY29tcG9zZTxfT3BlcmF0aW9uMSwgX09wZXJhdGlvbjIsIF9PcGVyYXRpb24zPiAKY29tcG9z ZTIoY29uc3QgX09wZXJhdGlvbjEmIF9fb3AxLCBjb25zdCBfT3BlcmF0aW9uMiYgX19vcDIsIAog ICAgICAgICBjb25zdCBfT3BlcmF0aW9uMyYgX19vcDMpCnsKICByZXR1cm4gYmluYXJ5X2NvbXBv c2U8X09wZXJhdGlvbjEsX09wZXJhdGlvbjIsX09wZXJhdGlvbjM+CiAgICAoX19vcDEsIF9fb3Ay LCBfX29wMyk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQXJnLCBjbGFzcyBfUmVzdWx0PgpjbGFzcyBw b2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9BcmcsIF9S ZXN1bHQ+IHsKcHJvdGVjdGVkOgogIF9SZXN1bHQgKCpfTV9wdHIpKF9BcmcpOwpwdWJsaWM6CiAg cG9pbnRlcl90b191bmFyeV9mdW5jdGlvbigpIHt9CiAgZXhwbGljaXQgcG9pbnRlcl90b191bmFy eV9mdW5jdGlvbihfUmVzdWx0ICgqX194KShfQXJnKSkgOiBfTV9wdHIoX194KSB7fQogIF9SZXN1 bHQgb3BlcmF0b3IoKShfQXJnIF9feCkgY29uc3QgeyByZXR1cm4gX01fcHRyKF9feCk7IH0KfTsK CnRlbXBsYXRlIDxjbGFzcyBfQXJnLCBjbGFzcyBfUmVzdWx0PgppbmxpbmUgcG9pbnRlcl90b191 bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PiBwdHJfZnVuKF9SZXN1bHQgKCpfX3gpKF9Bcmcp KQp7CiAgcmV0dXJuIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb248X0FyZywgX1Jlc3VsdD4oX194 KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMiwgY2xhc3MgX1Jlc3VsdD4K Y2xhc3MgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24gOiAKICBwdWJsaWMgYmluYXJ5X2Z1bmN0 aW9uPF9BcmcxLF9BcmcyLF9SZXN1bHQ+IHsKcHJvdGVjdGVkOgogICAgX1Jlc3VsdCAoKl9NX3B0 cikoX0FyZzEsIF9BcmcyKTsKcHVibGljOgogICAgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24o KSB7fQogICAgZXhwbGljaXQgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb24oX1Jlc3VsdCAoKl9f eCkoX0FyZzEsIF9BcmcyKSkgCiAgICAgIDogX01fcHRyKF9feCkge30KICAgIF9SZXN1bHQgb3Bl cmF0b3IoKShfQXJnMSBfX3gsIF9BcmcyIF9feSkgY29uc3QgewogICAgICByZXR1cm4gX01fcHRy KF9feCwgX195KTsKICAgIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzIs IGNsYXNzIF9SZXN1bHQ+CmlubGluZSBwb2ludGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSxf QXJnMixfUmVzdWx0PiAKcHRyX2Z1bihfUmVzdWx0ICgqX194KShfQXJnMSwgX0FyZzIpKSB7CiAg cmV0dXJuIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uPF9BcmcxLF9BcmcyLF9SZXN1bHQ+KF9f eCk7Cn0KCiAKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IF9JZGVudGl0eSA6IHB1YmxpYyB1 bmFyeV9mdW5jdGlvbjxfVHAsX1RwPiB7CiAgY29uc3QgX1RwJiBvcGVyYXRvcigpKGNvbnN0IF9U cCYgX194KSBjb25zdCB7IHJldHVybiBfX3g7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+IHN0 cnVjdCBpZGVudGl0eSA6IHB1YmxpYyBfSWRlbnRpdHk8X1RwPiB7fTsKCiAKdGVtcGxhdGUgPGNs YXNzIF9QYWlyPgpzdHJ1Y3QgX1NlbGVjdDFzdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfUGFp ciwgdHlwZW5hbWUgX1BhaXI6OmZpcnN0X3R5cGU+IHsKICBjb25zdCB0eXBlbmFtZSBfUGFpcjo6 Zmlyc3RfdHlwZSYgb3BlcmF0b3IoKShjb25zdCBfUGFpciYgX194KSBjb25zdCB7CiAgICByZXR1 cm4gX194LmZpcnN0OwogIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfUGFpcj4Kc3RydWN0IF9TZWxl Y3QybmQgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1BhaXIsIHR5cGVuYW1lIF9QYWlyOjpzZWNv bmRfdHlwZT4KewogIGNvbnN0IHR5cGVuYW1lIF9QYWlyOjpzZWNvbmRfdHlwZSYgb3BlcmF0b3Io KShjb25zdCBfUGFpciYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX194LnNlY29uZDsKICB9Cn07 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+IHN0cnVjdCBzZWxlY3Qxc3QgOiBwdWJsaWMgX1NlbGVj dDFzdDxfUGFpcj4ge307CnRlbXBsYXRlIDxjbGFzcyBfUGFpcj4gc3RydWN0IHNlbGVjdDJuZCA6 IHB1YmxpYyBfU2VsZWN0Mm5kPF9QYWlyPiB7fTsKCiAKdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBj bGFzcyBfQXJnMj4Kc3RydWN0IF9Qcm9qZWN0MXN0IDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxf QXJnMSwgX0FyZzIsIF9BcmcxPiB7CiAgX0FyZzEgb3BlcmF0b3IoKShjb25zdCBfQXJnMSYgX194 LCBjb25zdCBfQXJnMiYpIGNvbnN0IHsgcmV0dXJuIF9feDsgfQp9OwoKdGVtcGxhdGUgPGNsYXNz IF9BcmcxLCBjbGFzcyBfQXJnMj4Kc3RydWN0IF9Qcm9qZWN0Mm5kIDogcHVibGljIGJpbmFyeV9m dW5jdGlvbjxfQXJnMSwgX0FyZzIsIF9BcmcyPiB7CiAgX0FyZzIgb3BlcmF0b3IoKShjb25zdCBf QXJnMSYsIGNvbnN0IF9BcmcyJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feTsgfQp9OwoKdGVtcGxh dGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4gCnN0cnVjdCBwcm9qZWN0MXN0IDogcHVibGlj IF9Qcm9qZWN0MXN0PF9BcmcxLCBfQXJnMj4ge307Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNs YXNzIF9BcmcyPgpzdHJ1Y3QgcHJvamVjdDJuZCA6IHB1YmxpYyBfUHJvamVjdDJuZDxfQXJnMSwg X0FyZzI+IHt9OwoKIAogCiAKdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CnN0cnVjdCBjb25zdGFu dF92b2lkX2Z1bgp7CiAgdHlwZWRlZiBfUmVzdWx0IHJlc3VsdF90eXBlOwogIHJlc3VsdF90eXBl IF9fdmFsOwogIGNvbnN0YW50X3ZvaWRfZnVuKGNvbnN0IHJlc3VsdF90eXBlJiBfX3YpIDogX192 YWwoX192KSB7fQogIGNvbnN0IHJlc3VsdF90eXBlJiBvcGVyYXRvcigpKCkgY29uc3QgeyByZXR1 cm4gX192YWw7IH0KfTsgIAoKCnRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfQXJndW1l bnQgPSBfUmVzdWx0PgoKCgpzdHJ1Y3QgY29uc3RhbnRfdW5hcnlfZnVuIDogcHVibGljIHVuYXJ5 X2Z1bmN0aW9uPF9Bcmd1bWVudCwgX1Jlc3VsdD4gewogIF9SZXN1bHQgX01fdmFsOwogIGNvbnN0 YW50X3VuYXJ5X2Z1bihjb25zdCBfUmVzdWx0JiBfX3YpIDogX01fdmFsKF9fdikge30KICBjb25z dCBfUmVzdWx0JiBvcGVyYXRvcigpKGNvbnN0IF9Bcmd1bWVudCYpIGNvbnN0IHsgcmV0dXJuIF9N X3ZhbDsgfQp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0LCBjbGFzcyBfQXJnMSA9IF9SZXN1 bHQsIGNsYXNzIF9BcmcyID0gX0FyZzE+CgoKCnN0cnVjdCBjb25zdGFudF9iaW5hcnlfZnVuIDog cHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSwgX0FyZzIsIF9SZXN1bHQ+IHsKICBfUmVzdWx0 IF9NX3ZhbDsKICBjb25zdGFudF9iaW5hcnlfZnVuKGNvbnN0IF9SZXN1bHQmIF9fdikgOiBfTV92 YWwoX192KSB7fQogIGNvbnN0IF9SZXN1bHQmIG9wZXJhdG9yKCkoY29uc3QgX0FyZzEmLCBjb25z dCBfQXJnMiYpIGNvbnN0IHsKICAgIHJldHVybiBfTV92YWw7CiAgfQp9OwoKdGVtcGxhdGUgPGNs YXNzIF9SZXN1bHQ+CmlubGluZSBjb25zdGFudF92b2lkX2Z1bjxfUmVzdWx0PiBjb25zdGFudDAo Y29uc3QgX1Jlc3VsdCYgX192YWwpCnsKICByZXR1cm4gY29uc3RhbnRfdm9pZF9mdW48X1Jlc3Vs dD4oX192YWwpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdD4KaW5saW5lIGNvbnN0YW50X3Vu YXJ5X2Z1bjxfUmVzdWx0LF9SZXN1bHQ+IGNvbnN0YW50MShjb25zdCBfUmVzdWx0JiBfX3ZhbCkK ewogIHJldHVybiBjb25zdGFudF91bmFyeV9mdW48X1Jlc3VsdCxfUmVzdWx0PihfX3ZhbCk7Cn0K CnRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0PgppbmxpbmUgY29uc3RhbnRfYmluYXJ5X2Z1bjxfUmVz dWx0LF9SZXN1bHQsX1Jlc3VsdD4gCmNvbnN0YW50Mihjb25zdCBfUmVzdWx0JiBfX3ZhbCkKewog IHJldHVybiBjb25zdGFudF9iaW5hcnlfZnVuPF9SZXN1bHQsX1Jlc3VsdCxfUmVzdWx0PihfX3Zh bCk7Cn0KCiAKIApjbGFzcyBzdWJ0cmFjdGl2ZV9ybmcgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248 dW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQ+IHsKcHJpdmF0ZToKICB1bnNpZ25lZCBpbnQgX01f dGFibGVbNTVdOwogIHNpemVfdCBfTV9pbmRleDE7CiAgc2l6ZV90IF9NX2luZGV4MjsKcHVibGlj OgogIHVuc2lnbmVkIGludCBvcGVyYXRvcigpKHVuc2lnbmVkIGludCBfX2xpbWl0KSB7CiAgICBf TV9pbmRleDEgPSAoX01faW5kZXgxICsgMSkgJSA1NTsKICAgIF9NX2luZGV4MiA9IChfTV9pbmRl eDIgKyAxKSAlIDU1OwogICAgX01fdGFibGVbX01faW5kZXgxXSA9IF9NX3RhYmxlW19NX2luZGV4 MV0gLSBfTV90YWJsZVtfTV9pbmRleDJdOwogICAgcmV0dXJuIF9NX3RhYmxlW19NX2luZGV4MV0g JSBfX2xpbWl0OwogIH0KCiAgdm9pZCBfTV9pbml0aWFsaXplKHVuc2lnbmVkIGludCBfX3NlZWQp CiAgewogICAgdW5zaWduZWQgaW50IF9fayA9IDE7CiAgICBfTV90YWJsZVs1NF0gPSBfX3NlZWQ7 CiAgICBzaXplX3QgX19pOwogICAgZm9yIChfX2kgPSAwOyBfX2kgPCA1NDsgX19pKyspIHsKICAg ICAgICBzaXplX3QgX19paSA9ICgyMSAqIChfX2kgKyAxKSAlIDU1KSAtIDE7CiAgICAgICAgX01f dGFibGVbX19paV0gPSBfX2s7CiAgICAgICAgX19rID0gX19zZWVkIC0gX19rOwogICAgICAgIF9f c2VlZCA9IF9NX3RhYmxlW19faWldOwogICAgfQogICAgZm9yIChpbnQgX19sb29wID0gMDsgX19s b29wIDwgNDsgX19sb29wKyspIHsKICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IDU1OyBfX2kr KykKICAgICAgICAgICAgX01fdGFibGVbX19pXSA9IF9NX3RhYmxlW19faV0gLSBfTV90YWJsZVso MSArIF9faSArIDMwKSAlIDU1XTsKICAgIH0KICAgIF9NX2luZGV4MSA9IDA7CiAgICBfTV9pbmRl eDIgPSAzMTsKICB9CgogIHN1YnRyYWN0aXZlX3JuZyh1bnNpZ25lZCBpbnQgX19zZWVkKSB7IF9N X2luaXRpYWxpemUoX19zZWVkKTsgfQogIHN1YnRyYWN0aXZlX3JuZygpIHsgX01faW5pdGlhbGl6 ZSgxNjE4MDMzOTh1KTsgfQp9OwoKCiAKCiAKIAogCiAKIAogCiAKCiAKIAogCiAKIAoKIAogCiAK IAogCgoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcD4KY2xhc3MgbWVtX2Z1bl90IDog cHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCosX1JldD4gewpwdWJsaWM6CiAgZXhwbGljaXQgbWVt X2Z1bl90KF9SZXQgKF9UcDo6Kl9fcGYpKCkpIDogX01fZihfX3BmKSB7fQogIF9SZXQgb3BlcmF0 b3IoKShfVHAqIF9fcCkgY29uc3QgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKCk7IH0KcHJpdmF0ZToK ICBfUmV0IChfVHA6OipfTV9mKSgpOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9U cD4KY2xhc3MgY29uc3RfbWVtX2Z1bl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IF9U cCosX1JldD4gewpwdWJsaWM6CiAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bl90KF9SZXQgKF9UcDo6 Kl9fcGYpKCkgY29uc3QpIDogX01fZihfX3BmKSB7fQogIF9SZXQgb3BlcmF0b3IoKShjb25zdCBf VHAqIF9fcCkgY29uc3QgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKCk7IH0KcHJpdmF0ZToKICBfUmV0 IChfVHA6OipfTV9mKSgpIGNvbnN0Owp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBf VHA+CmNsYXNzIG1lbV9mdW5fcmVmX3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLF9SZXQ+ IHsKcHVibGljOgogIGV4cGxpY2l0IG1lbV9mdW5fcmVmX3QoX1JldCAoX1RwOjoqX19wZikoKSkg OiBfTV9mKF9fcGYpIHt9CiAgX1JldCBvcGVyYXRvcigpKF9UcCYgX19yKSBjb25zdCB7IHJldHVy biAoX19yLipfTV9mKSgpOyB9CnByaXZhdGU6CiAgX1JldCAoX1RwOjoqX01fZikoKTsKfTsKCnRl bXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CmNsYXNzIGNvbnN0X21lbV9mdW5fcmVmX3Qg OiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1RwLF9SZXQ+IHsKcHVibGljOgogIGV4cGxpY2l0IGNv bnN0X21lbV9mdW5fcmVmX3QoX1JldCAoX1RwOjoqX19wZikoKSBjb25zdCkgOiBfTV9mKF9fcGYp IHt9CiAgX1JldCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX19yKSBjb25zdCB7IHJldHVybiAoX19y LipfTV9mKSgpOyB9CnByaXZhdGU6CiAgX1JldCAoX1RwOjoqX01fZikoKSBjb25zdDsKfTsKCnRl bXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIG1lbV9mdW4x X3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCosX0FyZyxfUmV0PiB7CnB1YmxpYzoKICBl eHBsaWNpdCBtZW1fZnVuMV90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpKSA6IF9NX2YoX19wZikg e30KICBfUmV0IG9wZXJhdG9yKCkoX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7IHJldHVybiAo X19wLT4qX01fZikoX194KTsgfQpwcml2YXRlOgogIF9SZXQgKF9UcDo6Kl9NX2YpKF9BcmcpOwp9 OwoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KY2xhc3MgY29u c3RfbWVtX2Z1bjFfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3QgX1RwKixfQXJnLF9S ZXQ+IHsKcHVibGljOgogIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3QoX1JldCAoX1RwOjoqX19w ZikoX0FyZykgY29uc3QpIDogX01fZihfX3BmKSB7fQogIF9SZXQgb3BlcmF0b3IoKShjb25zdCBf VHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0CiAgICB7IHJldHVybiAoX19wLT4qX01fZikoX194KTsg fQpwcml2YXRlOgogIF9SZXQgKF9UcDo6Kl9NX2YpKF9BcmcpIGNvbnN0Owp9OwoKdGVtcGxhdGUg PGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KY2xhc3MgbWVtX2Z1bjFfcmVmX3Qg OiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLF9SZXQ+IHsKcHVibGljOgogIGV4cGxp Y2l0IG1lbV9mdW4xX3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpKSA6IF9NX2YoX19wZikg e30KICBfUmV0IG9wZXJhdG9yKCkoX1RwJiBfX3IsIF9BcmcgX194KSBjb25zdCB7IHJldHVybiAo X19yLipfTV9mKShfX3gpOyB9CnByaXZhdGU6CiAgX1JldCAoX1RwOjoqX01fZikoX0FyZyk7Cn07 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgpjbGFzcyBjb25z dF9tZW1fZnVuMV9yZWZfdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9BcmcsX1JldD4g ewpwdWJsaWM6CiAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bjFfcmVmX3QoX1JldCAoX1RwOjoqX19w ZikoX0FyZykgY29uc3QpIDogX01fZihfX3BmKSB7fQogIF9SZXQgb3BlcmF0b3IoKShjb25zdCBf VHAmIF9fciwgX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIChfX3IuKl9NX2YpKF9feCk7IH0KcHJp dmF0ZToKICBfUmV0IChfVHA6OipfTV9mKShfQXJnKSBjb25zdDsKfTsKCgoKdGVtcGxhdGUgPGNs YXNzIF9UcD4KY2xhc3MgbWVtX2Z1bl90PHZvaWQsIF9UcD4gOiBwdWJsaWMgdW5hcnlfZnVuY3Rp b248X1RwKix2b2lkPiB7CnB1YmxpYzoKICBleHBsaWNpdCBtZW1fZnVuX3Qodm9pZCAoX1RwOjoq X19wZikoKSkgOiBfTV9mKF9fcGYpIHt9CiAgdm9pZCBvcGVyYXRvcigpKF9UcCogX19wKSBjb25z dCB7IChfX3AtPipfTV9mKSgpOyB9CnByaXZhdGU6CiAgdm9pZCAoX1RwOjoqX01fZikoKTsKfTsK CnRlbXBsYXRlIDxjbGFzcyBfVHA+CmNsYXNzIGNvbnN0X21lbV9mdW5fdDx2b2lkLCBfVHA+IDog cHVibGljIHVuYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosdm9pZD4gewpwdWJsaWM6CiAgZXhwbGlj aXQgY29uc3RfbWVtX2Z1bl90KHZvaWQgKF9UcDo6Kl9fcGYpKCkgY29uc3QpIDogX01fZihfX3Bm KSB7fQogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBfVHAqIF9fcCkgY29uc3QgeyAoX19wLT4qX01f ZikoKTsgfQpwcml2YXRlOgogIHZvaWQgKF9UcDo6Kl9NX2YpKCkgY29uc3Q7Cn07Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX1RwPgpjbGFzcyBtZW1fZnVuX3JlZl90PHZvaWQsIF9UcD4gOiBwdWJsaWMgdW5h cnlfZnVuY3Rpb248X1RwLHZvaWQ+IHsKcHVibGljOgogIGV4cGxpY2l0IG1lbV9mdW5fcmVmX3Qo dm9pZCAoX1RwOjoqX19wZikoKSkgOiBfTV9mKF9fcGYpIHt9CiAgdm9pZCBvcGVyYXRvcigpKF9U cCYgX19yKSBjb25zdCB7IChfX3IuKl9NX2YpKCk7IH0KcHJpdmF0ZToKICB2b2lkIChfVHA6Oipf TV9mKSgpOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4KY2xhc3MgY29uc3RfbWVtX2Z1bl9yZWZf dDx2b2lkLCBfVHA+IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCx2b2lkPiB7CnB1YmxpYzoK ICBleHBsaWNpdCBjb25zdF9tZW1fZnVuX3JlZl90KHZvaWQgKF9UcDo6Kl9fcGYpKCkgY29uc3Qp IDogX01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9fcikgY29uc3Qg eyAoX19yLipfTV9mKSgpOyB9CnByaXZhdGU6CiAgdm9pZCAoX1RwOjoqX01fZikoKSBjb25zdDsK fTsKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIG1lbV9mdW4xX3Q8dm9p ZCwgX1RwLCBfQXJnPiA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwKixfQXJnLHZvaWQ+IHsK cHVibGljOgogIGV4cGxpY2l0IG1lbV9mdW4xX3Qodm9pZCAoX1RwOjoqX19wZikoX0FyZykpIDog X01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0 IHsgKF9fcC0+Kl9NX2YpKF9feCk7IH0KcHJpdmF0ZToKICB2b2lkIChfVHA6OipfTV9mKShfQXJn KTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIGNvbnN0X21lbV9m dW4xX3Q8dm9pZCwgX1RwLCBfQXJnPiAKICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248Y29uc3Qg X1RwKixfQXJnLHZvaWQ+IHsKcHVibGljOgogIGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3Qodm9p ZCAoX1RwOjoqX19wZikoX0FyZykgY29uc3QpIDogX01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0 b3IoKShjb25zdCBfVHAqIF9fcCwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKF9feCk7 IH0KcHJpdmF0ZToKICB2b2lkIChfVHA6OipfTV9mKShfQXJnKSBjb25zdDsKfTsKCnRlbXBsYXRl IDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIG1lbV9mdW4xX3JlZl90PHZvaWQsIF9UcCwg X0FyZz4KICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9Bcmcsdm9pZD4gewpwdWJsaWM6 CiAgZXhwbGljaXQgbWVtX2Z1bjFfcmVmX3Qodm9pZCAoX1RwOjoqX19wZikoX0FyZykpIDogX01f ZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShfVHAmIF9fciwgX0FyZyBfX3gpIGNvbnN0IHsg KF9fci4qX01fZikoX194KTsgfQpwcml2YXRlOgogIHZvaWQgKF9UcDo6Kl9NX2YpKF9BcmcpOwp9 OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KY2xhc3MgY29uc3RfbWVtX2Z1bjFf cmVmX3Q8dm9pZCwgX1RwLCBfQXJnPgogIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX0Fy Zyx2b2lkPiB7CnB1YmxpYzoKICBleHBsaWNpdCBjb25zdF9tZW1fZnVuMV9yZWZfdCh2b2lkIChf VHA6OipfX3BmKShfQXJnKSBjb25zdCkgOiBfTV9mKF9fcGYpIHt9CiAgdm9pZCBvcGVyYXRvcigp KGNvbnN0IF9UcCYgX19yLCBfQXJnIF9feCkgY29uc3QgeyAoX19yLipfTV9mKShfX3gpOyB9CnBy aXZhdGU6CiAgdm9pZCAoX1RwOjoqX01fZikoX0FyZykgY29uc3Q7Cn07CgoKCiAKIAogCiAKCnRl bXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CmlubGluZSBtZW1fZnVuX3Q8X1JldCxfVHA+ IG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKSgpKQogIHsgcmV0dXJuIG1lbV9mdW5fdDxfUmV0LF9U cD4oX19mKTsgfQoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcD4KaW5saW5lIGNvbnN0 X21lbV9mdW5fdDxfUmV0LF9UcD4gbWVtX2Z1bihfUmV0IChfVHA6OipfX2YpKCkgY29uc3QpCiAg eyByZXR1cm4gY29uc3RfbWVtX2Z1bl90PF9SZXQsX1RwPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX1JldCwgY2xhc3MgX1RwPgppbmxpbmUgbWVtX2Z1bl9yZWZfdDxfUmV0LF9UcD4gbWVtX2Z1 bl9yZWYoX1JldCAoX1RwOjoqX19mKSgpKSAKICB7IHJldHVybiBtZW1fZnVuX3JlZl90PF9SZXQs X1RwPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwPgppbmxpbmUgY29u c3RfbWVtX2Z1bl9yZWZfdDxfUmV0LF9UcD4gbWVtX2Z1bl9yZWYoX1JldCAoX1RwOjoqX19mKSgp IGNvbnN0KQogIHsgcmV0dXJuIGNvbnN0X21lbV9mdW5fcmVmX3Q8X1JldCxfVHA+KF9fZik7IH0K CnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBtZW1f ZnVuMV90PF9SZXQsX1RwLF9Bcmc+IG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKShfQXJnKSkKICB7 IHJldHVybiBtZW1fZnVuMV90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRlbXBsYXRlIDxjbGFz cyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBjb25zdF9tZW1fZnVuMV90PF9S ZXQsX1RwLF9Bcmc+IG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkKICB7IHJl dHVybiBjb25zdF9tZW1fZnVuMV90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRlbXBsYXRlIDxj bGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBtZW1fZnVuMV9yZWZfdDxf UmV0LF9UcCxfQXJnPiBtZW1fZnVuX3JlZihfUmV0IChfVHA6OipfX2YpKF9BcmcpKQogIHsgcmV0 dXJuIG1lbV9mdW4xX3JlZl90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRlbXBsYXRlIDxjbGFz cyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBjb25zdF9tZW1fZnVuMV9yZWZf dDxfUmV0LF9UcCxfQXJnPgptZW1fZnVuX3JlZihfUmV0IChfVHA6OipfX2YpKF9BcmcpIGNvbnN0 KQogIHsgcmV0dXJuIGNvbnN0X21lbV9mdW4xX3JlZl90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0K CnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBtZW1f ZnVuMV90PF9SZXQsX1RwLF9Bcmc+IG1lbV9mdW4xKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykpCiAg eyByZXR1cm4gbWVtX2Z1bjFfdDxfUmV0LF9UcCxfQXJnPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgY29uc3RfbWVtX2Z1bjFfdDxf UmV0LF9UcCxfQXJnPiBtZW1fZnVuMShfUmV0IChfVHA6OipfX2YpKF9BcmcpIGNvbnN0KQogIHsg cmV0dXJuIGNvbnN0X21lbV9mdW4xX3Q8X1JldCxfVHAsX0FyZz4oX19mKTsgfQoKdGVtcGxhdGUg PGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KaW5saW5lIG1lbV9mdW4xX3JlZl90 PF9SZXQsX1RwLF9Bcmc+IG1lbV9mdW4xX3JlZihfUmV0IChfVHA6OipfX2YpKF9BcmcpKQogIHsg cmV0dXJuIG1lbV9mdW4xX3JlZl90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRlbXBsYXRlIDxj bGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBjb25zdF9tZW1fZnVuMV9y ZWZfdDxfUmV0LF9UcCxfQXJnPgptZW1fZnVuMV9yZWYoX1JldCAoX1RwOjoqX19mKShfQXJnKSBj b25zdCkKICB7IHJldHVybiBjb25zdF9tZW1fZnVuMV9yZWZfdDxfUmV0LF9UcCxfQXJnPihfX2Yp OyB9CgogCgoKCiAKIAogCiMgNTkgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUu Mi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9p bmNsdWRlL2crKy0zL3N0bF90cmVlLmgiIDIgMwoKCiAgCgoKCgoKdHlwZWRlZiBib29sIF9SYl90 cmVlX0NvbG9yX3R5cGU7CmNvbnN0IF9SYl90cmVlX0NvbG9yX3R5cGUgX1NfcmJfdHJlZV9yZWQg PSBmYWxzZTsKY29uc3QgX1JiX3RyZWVfQ29sb3JfdHlwZSBfU19yYl90cmVlX2JsYWNrID0gdHJ1 ZTsKCnN0cnVjdCBfUmJfdHJlZV9ub2RlX2Jhc2UKewogIHR5cGVkZWYgX1JiX3RyZWVfQ29sb3Jf dHlwZSBfQ29sb3JfdHlwZTsKICB0eXBlZGVmIF9SYl90cmVlX25vZGVfYmFzZSogX0Jhc2VfcHRy OwoKICBfQ29sb3JfdHlwZSBfTV9jb2xvcjsgCiAgX0Jhc2VfcHRyIF9NX3BhcmVudDsKICBfQmFz ZV9wdHIgX01fbGVmdDsKICBfQmFzZV9wdHIgX01fcmlnaHQ7CgogIHN0YXRpYyBfQmFzZV9wdHIg X1NfbWluaW11bShfQmFzZV9wdHIgX194KQogIHsKICAgIHdoaWxlIChfX3gtPl9NX2xlZnQgIT0g MCkgX194ID0gX194LT5fTV9sZWZ0OwogICAgcmV0dXJuIF9feDsKICB9CgogIHN0YXRpYyBfQmFz ZV9wdHIgX1NfbWF4aW11bShfQmFzZV9wdHIgX194KQogIHsKICAgIHdoaWxlIChfX3gtPl9NX3Jp Z2h0ICE9IDApIF9feCA9IF9feC0+X01fcmlnaHQ7CiAgICByZXR1cm4gX194OwogIH0KfTsKCnRl bXBsYXRlIDxjbGFzcyBfVmFsdWU+CnN0cnVjdCBfUmJfdHJlZV9ub2RlIDogcHVibGljIF9SYl90 cmVlX25vZGVfYmFzZQp7CiAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlPF9WYWx1ZT4qIF9MaW5rX3R5 cGU7CiAgX1ZhbHVlIF9NX3ZhbHVlX2ZpZWxkOwp9OwoKCnN0cnVjdCBfUmJfdHJlZV9iYXNlX2l0 ZXJhdG9yCnsKICB0eXBlZGVmIF9SYl90cmVlX25vZGVfYmFzZTo6X0Jhc2VfcHRyIF9CYXNlX3B0 cjsKICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5 OwogIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKICBfQmFzZV9wdHIgX01fbm9k ZTsKCiAgdm9pZCBfTV9pbmNyZW1lbnQoKQogIHsKICAgIGlmIChfTV9ub2RlLT5fTV9yaWdodCAh PSAwKSB7CiAgICAgIF9NX25vZGUgPSBfTV9ub2RlLT5fTV9yaWdodDsKICAgICAgd2hpbGUgKF9N X25vZGUtPl9NX2xlZnQgIT0gMCkKICAgICAgICBfTV9ub2RlID0gX01fbm9kZS0+X01fbGVmdDsK ICAgIH0KICAgIGVsc2UgewogICAgICBfQmFzZV9wdHIgX195ID0gX01fbm9kZS0+X01fcGFyZW50 OwogICAgICB3aGlsZSAoX01fbm9kZSA9PSBfX3ktPl9NX3JpZ2h0KSB7CiAgICAgICAgX01fbm9k ZSA9IF9feTsKICAgICAgICBfX3kgPSBfX3ktPl9NX3BhcmVudDsKICAgICAgfQogICAgICBpZiAo X01fbm9kZS0+X01fcmlnaHQgIT0gX195KQogICAgICAgIF9NX25vZGUgPSBfX3k7CiAgICB9CiAg fQoKICB2b2lkIF9NX2RlY3JlbWVudCgpCiAgewogICAgaWYgKF9NX25vZGUtPl9NX2NvbG9yID09 IF9TX3JiX3RyZWVfcmVkICYmCiAgICAgICAgX01fbm9kZS0+X01fcGFyZW50LT5fTV9wYXJlbnQg PT0gX01fbm9kZSkKICAgICAgX01fbm9kZSA9IF9NX25vZGUtPl9NX3JpZ2h0OwogICAgZWxzZSBp ZiAoX01fbm9kZS0+X01fbGVmdCAhPSAwKSB7CiAgICAgIF9CYXNlX3B0ciBfX3kgPSBfTV9ub2Rl LT5fTV9sZWZ0OwogICAgICB3aGlsZSAoX195LT5fTV9yaWdodCAhPSAwKQogICAgICAgIF9feSA9 IF9feS0+X01fcmlnaHQ7CiAgICAgIF9NX25vZGUgPSBfX3k7CiAgICB9CiAgICBlbHNlIHsKICAg ICAgX0Jhc2VfcHRyIF9feSA9IF9NX25vZGUtPl9NX3BhcmVudDsKICAgICAgd2hpbGUgKF9NX25v ZGUgPT0gX195LT5fTV9sZWZ0KSB7CiAgICAgICAgX01fbm9kZSA9IF9feTsKICAgICAgICBfX3kg PSBfX3ktPl9NX3BhcmVudDsKICAgICAgfQogICAgICBfTV9ub2RlID0gX195OwogICAgfQogIH0K fTsKCnRlbXBsYXRlIDxjbGFzcyBfVmFsdWUsIGNsYXNzIF9SZWYsIGNsYXNzIF9QdHI+CnN0cnVj dCBfUmJfdHJlZV9pdGVyYXRvciA6IHB1YmxpYyBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yCnsKICB0 eXBlZGVmIF9WYWx1ZSB2YWx1ZV90eXBlOwogIHR5cGVkZWYgX1JlZiByZWZlcmVuY2U7CiAgdHlw ZWRlZiBfUHRyIHBvaW50ZXI7CiAgdHlwZWRlZiBfUmJfdHJlZV9pdGVyYXRvcjxfVmFsdWUsIF9W YWx1ZSYsIF9WYWx1ZSo+ICAgICAgICAgICAgIAogICAgaXRlcmF0b3I7CiAgdHlwZWRlZiBfUmJf dHJlZV9pdGVyYXRvcjxfVmFsdWUsIGNvbnN0IF9WYWx1ZSYsIGNvbnN0IF9WYWx1ZSo+IAogICAg Y29uc3RfaXRlcmF0b3I7CiAgdHlwZWRlZiBfUmJfdHJlZV9pdGVyYXRvcjxfVmFsdWUsIF9SZWYs IF9QdHI+ICAgICAgICAgICAgICAgICAgIAogICAgX1NlbGY7CiAgdHlwZWRlZiBfUmJfdHJlZV9u b2RlPF9WYWx1ZT4qIF9MaW5rX3R5cGU7CgogIF9SYl90cmVlX2l0ZXJhdG9yKCkge30KICBfUmJf dHJlZV9pdGVyYXRvcihfTGlua190eXBlIF9feCkgeyBfTV9ub2RlID0gX194OyB9CiAgX1JiX3Ry ZWVfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3ImIF9faXQpIHsgX01fbm9kZSA9IF9faXQuX01fbm9k ZTsgfQoKICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gX0xpbmtfdHlwZShf TV9ub2RlKS0+X01fdmFsdWVfZmllbGQ7IH0KCiAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3Qg eyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KCgogIF9TZWxmJiBvcGVyYXRvcisrKCkgeyBfTV9p bmNyZW1lbnQoKTsgcmV0dXJuICp0aGlzOyB9CiAgX1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsKICAg IF9TZWxmIF9fdG1wID0gKnRoaXM7CiAgICBfTV9pbmNyZW1lbnQoKTsKICAgIHJldHVybiBfX3Rt cDsKICB9CiAgICAKICBfU2VsZiYgb3BlcmF0b3ItLSgpIHsgX01fZGVjcmVtZW50KCk7IHJldHVy biAqdGhpczsgfQogIF9TZWxmIG9wZXJhdG9yLS0oaW50KSB7CiAgICBfU2VsZiBfX3RtcCA9ICp0 aGlzOwogICAgX01fZGVjcmVtZW50KCk7CiAgICByZXR1cm4gX190bXA7CiAgfQp9OwoKaW5saW5l IGJvb2wgb3BlcmF0b3I9PShjb25zdCBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yJiBfX3gsCiAgICAg ICAgICAgICAgICAgICAgICAgY29uc3QgX1JiX3RyZWVfYmFzZV9pdGVyYXRvciYgX195KSB7CiAg cmV0dXJuIF9feC5fTV9ub2RlID09IF9feS5fTV9ub2RlOwp9CgppbmxpbmUgYm9vbCBvcGVyYXRv ciE9KGNvbnN0IF9SYl90cmVlX2Jhc2VfaXRlcmF0b3ImIF9feCwKICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9yJiBfX3kpIHsKICByZXR1cm4gX194Ll9N X25vZGUgIT0gX195Ll9NX25vZGU7Cn0KCiMgMjE0ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAw L2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4v Li4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfdHJlZS5oIiAzCgoKaW5saW5lIHZvaWQgCl9SYl90 cmVlX3JvdGF0ZV9sZWZ0KF9SYl90cmVlX25vZGVfYmFzZSogX194LCBfUmJfdHJlZV9ub2RlX2Jh c2UqJiBfX3Jvb3QpCnsKICBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9feSA9IF9feC0+X01fcmlnaHQ7 CiAgX194LT5fTV9yaWdodCA9IF9feS0+X01fbGVmdDsKICBpZiAoX195LT5fTV9sZWZ0ICE9MCkK ICAgIF9feS0+X01fbGVmdC0+X01fcGFyZW50ID0gX194OwogIF9feS0+X01fcGFyZW50ID0gX194 LT5fTV9wYXJlbnQ7CgogIGlmIChfX3ggPT0gX19yb290KQogICAgX19yb290ID0gX195OwogIGVs c2UgaWYgKF9feCA9PSBfX3gtPl9NX3BhcmVudC0+X01fbGVmdCkKICAgIF9feC0+X01fcGFyZW50 LT5fTV9sZWZ0ID0gX195OwogIGVsc2UKICAgIF9feC0+X01fcGFyZW50LT5fTV9yaWdodCA9IF9f eTsKICBfX3ktPl9NX2xlZnQgPSBfX3g7CiAgX194LT5fTV9wYXJlbnQgPSBfX3k7Cn0KCmlubGlu ZSB2b2lkIApfUmJfdHJlZV9yb3RhdGVfcmlnaHQoX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3gsIF9S Yl90cmVlX25vZGVfYmFzZSomIF9fcm9vdCkKewogIF9SYl90cmVlX25vZGVfYmFzZSogX195ID0g X194LT5fTV9sZWZ0OwogIF9feC0+X01fbGVmdCA9IF9feS0+X01fcmlnaHQ7CiAgaWYgKF9feS0+ X01fcmlnaHQgIT0gMCkKICAgIF9feS0+X01fcmlnaHQtPl9NX3BhcmVudCA9IF9feDsKICBfX3kt Pl9NX3BhcmVudCA9IF9feC0+X01fcGFyZW50OwoKICBpZiAoX194ID09IF9fcm9vdCkKICAgIF9f cm9vdCA9IF9feTsKICBlbHNlIGlmIChfX3ggPT0gX194LT5fTV9wYXJlbnQtPl9NX3JpZ2h0KQog ICAgX194LT5fTV9wYXJlbnQtPl9NX3JpZ2h0ID0gX195OwogIGVsc2UKICAgIF9feC0+X01fcGFy ZW50LT5fTV9sZWZ0ID0gX195OwogIF9feS0+X01fcmlnaHQgPSBfX3g7CiAgX194LT5fTV9wYXJl bnQgPSBfX3k7Cn0KCmlubGluZSB2b2lkIApfUmJfdHJlZV9yZWJhbGFuY2UoX1JiX3RyZWVfbm9k ZV9iYXNlKiBfX3gsIF9SYl90cmVlX25vZGVfYmFzZSomIF9fcm9vdCkKewogIF9feC0+X01fY29s b3IgPSBfU19yYl90cmVlX3JlZDsKICB3aGlsZSAoX194ICE9IF9fcm9vdCAmJiBfX3gtPl9NX3Bh cmVudC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQpIHsKICAgIGlmIChfX3gtPl9NX3BhcmVu dCA9PSBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LT5fTV9sZWZ0KSB7CiAgICAgIF9SYl90cmVl X25vZGVfYmFzZSogX195ID0gX194LT5fTV9wYXJlbnQtPl9NX3BhcmVudC0+X01fcmlnaHQ7CiAg ICAgIGlmIChfX3kgJiYgX195LT5fTV9jb2xvciA9PSBfU19yYl90cmVlX3JlZCkgewogICAgICAg IF9feC0+X01fcGFyZW50LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfYmxhY2s7CiAgICAgICAgX195 LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfYmxhY2s7CiAgICAgICAgX194LT5fTV9wYXJlbnQtPl9N X3BhcmVudC0+X01fY29sb3IgPSBfU19yYl90cmVlX3JlZDsKICAgICAgICBfX3ggPSBfX3gtPl9N X3BhcmVudC0+X01fcGFyZW50OwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmIChfX3gg PT0gX194LT5fTV9wYXJlbnQtPl9NX3JpZ2h0KSB7CiAgICAgICAgICBfX3ggPSBfX3gtPl9NX3Bh cmVudDsKICAgICAgICAgIF9SYl90cmVlX3JvdGF0ZV9sZWZ0KF9feCwgX19yb290KTsKICAgICAg ICB9CiAgICAgICAgX194LT5fTV9wYXJlbnQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsK ICAgICAgICBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVf cmVkOwogICAgICAgIF9SYl90cmVlX3JvdGF0ZV9yaWdodChfX3gtPl9NX3BhcmVudC0+X01fcGFy ZW50LCBfX3Jvb3QpOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgX1JiX3RyZWVfbm9k ZV9iYXNlKiBfX3kgPSBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LT5fTV9sZWZ0OwogICAgICBp ZiAoX195ICYmIF9feS0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQpIHsKICAgICAgICBfX3gt Pl9NX3BhcmVudC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOwogICAgICAgIF9feS0+X01f Y29sb3IgPSBfU19yYl90cmVlX2JsYWNrOwogICAgICAgIF9feC0+X01fcGFyZW50LT5fTV9wYXJl bnQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9yZWQ7CiAgICAgICAgX194ID0gX194LT5fTV9wYXJl bnQtPl9NX3BhcmVudDsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBpZiAoX194ID09IF9f eC0+X01fcGFyZW50LT5fTV9sZWZ0KSB7CiAgICAgICAgICBfX3ggPSBfX3gtPl9NX3BhcmVudDsK ICAgICAgICAgIF9SYl90cmVlX3JvdGF0ZV9yaWdodChfX3gsIF9fcm9vdCk7CiAgICAgICAgfQog ICAgICAgIF9feC0+X01fcGFyZW50LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfYmxhY2s7CiAgICAg ICAgX194LT5fTV9wYXJlbnQtPl9NX3BhcmVudC0+X01fY29sb3IgPSBfU19yYl90cmVlX3JlZDsK ICAgICAgICBfUmJfdHJlZV9yb3RhdGVfbGVmdChfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LCBf X3Jvb3QpOwogICAgICB9CiAgICB9CiAgfQogIF9fcm9vdC0+X01fY29sb3IgPSBfU19yYl90cmVl X2JsYWNrOwp9CgppbmxpbmUgX1JiX3RyZWVfbm9kZV9iYXNlKgpfUmJfdHJlZV9yZWJhbGFuY2Vf Zm9yX2VyYXNlKF9SYl90cmVlX25vZGVfYmFzZSogX196LAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9SYl90cmVlX25vZGVfYmFzZSomIF9fcm9vdCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqJiBfX2xlZnRtb3N0LAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgIF9SYl90cmVlX25vZGVfYmFzZSomIF9fcmlnaHRtb3N0KQp7CiAgX1JiX3Ry ZWVfbm9kZV9iYXNlKiBfX3kgPSBfX3o7CiAgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3ggPSAwOwog IF9SYl90cmVlX25vZGVfYmFzZSogX194X3BhcmVudCA9IDA7CiAgaWYgKF9feS0+X01fbGVmdCA9 PSAwKSAgICAgIAogICAgX194ID0gX195LT5fTV9yaWdodDsgICAgICAKICBlbHNlCiAgICBpZiAo X195LT5fTV9yaWdodCA9PSAwKSAgIAogICAgICBfX3ggPSBfX3ktPl9NX2xlZnQ7ICAgICAKICAg IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgCiAgICAgIF9feSA9IF9feS0+X01fcmlnaHQ7ICAg IAogICAgICB3aGlsZSAoX195LT5fTV9sZWZ0ICE9IDApCiAgICAgICAgX195ID0gX195LT5fTV9s ZWZ0OwogICAgICBfX3ggPSBfX3ktPl9NX3JpZ2h0OwogICAgfQogIGlmIChfX3kgIT0gX196KSB7 ICAgICAgICAgICAKICAgIF9fei0+X01fbGVmdC0+X01fcGFyZW50ID0gX195OyAKICAgIF9feS0+ X01fbGVmdCA9IF9fei0+X01fbGVmdDsKICAgIGlmIChfX3kgIT0gX196LT5fTV9yaWdodCkgewog ICAgICBfX3hfcGFyZW50ID0gX195LT5fTV9wYXJlbnQ7CiAgICAgIGlmIChfX3gpIF9feC0+X01f cGFyZW50ID0gX195LT5fTV9wYXJlbnQ7CiAgICAgIF9feS0+X01fcGFyZW50LT5fTV9sZWZ0ID0g X194OyAgICAgICAKICAgICAgX195LT5fTV9yaWdodCA9IF9fei0+X01fcmlnaHQ7CiAgICAgIF9f ei0+X01fcmlnaHQtPl9NX3BhcmVudCA9IF9feTsKICAgIH0KICAgIGVsc2UKICAgICAgX194X3Bh cmVudCA9IF9feTsgIAogICAgaWYgKF9fcm9vdCA9PSBfX3opCiAgICAgIF9fcm9vdCA9IF9feTsK ICAgIGVsc2UgaWYgKF9fei0+X01fcGFyZW50LT5fTV9sZWZ0ID09IF9feikKICAgICAgX196LT5f TV9wYXJlbnQtPl9NX2xlZnQgPSBfX3k7CiAgICBlbHNlIAogICAgICBfX3otPl9NX3BhcmVudC0+ X01fcmlnaHQgPSBfX3k7CiAgICBfX3ktPl9NX3BhcmVudCA9IF9fei0+X01fcGFyZW50OwogICAg IDo6c3dhcChfX3ktPl9NX2NvbG9yLCBfX3otPl9NX2NvbG9yKTsKICAgIF9feSA9IF9fejsKICAg ICAKICB9CiAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgX194X3BhcmVudCA9 IF9feS0+X01fcGFyZW50OwogICAgaWYgKF9feCkgX194LT5fTV9wYXJlbnQgPSBfX3ktPl9NX3Bh cmVudDsgICAKICAgIGlmIChfX3Jvb3QgPT0gX196KQogICAgICBfX3Jvb3QgPSBfX3g7CiAgICBl bHNlIAogICAgICBpZiAoX196LT5fTV9wYXJlbnQtPl9NX2xlZnQgPT0gX196KQogICAgICAgIF9f ei0+X01fcGFyZW50LT5fTV9sZWZ0ID0gX194OwogICAgICBlbHNlCiAgICAgICAgX196LT5fTV9w YXJlbnQtPl9NX3JpZ2h0ID0gX194OwogICAgaWYgKF9fbGVmdG1vc3QgPT0gX196KSAKICAgICAg aWYgKF9fei0+X01fcmlnaHQgPT0gMCkgICAgICAgICAKICAgICAgICBfX2xlZnRtb3N0ID0gX196 LT5fTV9wYXJlbnQ7CiAgICAgCiAgICAgIGVsc2UKICAgICAgICBfX2xlZnRtb3N0ID0gX1JiX3Ry ZWVfbm9kZV9iYXNlOjpfU19taW5pbXVtKF9feCk7CiAgICBpZiAoX19yaWdodG1vc3QgPT0gX196 KSAgCiAgICAgIGlmIChfX3otPl9NX2xlZnQgPT0gMCkgICAgICAgICAgCiAgICAgICAgX19yaWdo dG1vc3QgPSBfX3otPl9NX3BhcmVudDsgIAogICAgIAogICAgICBlbHNlICAgICAgICAgICAgICAg ICAgICAgICAKICAgICAgICBfX3JpZ2h0bW9zdCA9IF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWF4 aW11bShfX3gpOwogIH0KICBpZiAoX195LT5fTV9jb2xvciAhPSBfU19yYl90cmVlX3JlZCkgeyAK ICAgIHdoaWxlIChfX3ggIT0gX19yb290ICYmIChfX3ggPT0gMCB8fCBfX3gtPl9NX2NvbG9yID09 IF9TX3JiX3RyZWVfYmxhY2spKQogICAgICBpZiAoX194ID09IF9feF9wYXJlbnQtPl9NX2xlZnQp IHsKICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9fdyA9IF9feF9wYXJlbnQtPl9NX3JpZ2h0 OwogICAgICAgIGlmIChfX3ctPl9NX2NvbG9yID09IF9TX3JiX3RyZWVfcmVkKSB7CiAgICAgICAg ICBfX3ctPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsKICAgICAgICAgIF9feF9wYXJlbnQt Pl9NX2NvbG9yID0gX1NfcmJfdHJlZV9yZWQ7CiAgICAgICAgICBfUmJfdHJlZV9yb3RhdGVfbGVm dChfX3hfcGFyZW50LCBfX3Jvb3QpOwogICAgICAgICAgX193ID0gX194X3BhcmVudC0+X01fcmln aHQ7CiAgICAgICAgfQogICAgICAgIGlmICgoX193LT5fTV9sZWZ0ID09IDAgfHwgCiAgICAgICAg ICAgICBfX3ctPl9NX2xlZnQtPl9NX2NvbG9yID09IF9TX3JiX3RyZWVfYmxhY2spICYmCiAgICAg ICAgICAgIChfX3ctPl9NX3JpZ2h0ID09IDAgfHwgCiAgICAgICAgICAgICBfX3ctPl9NX3JpZ2h0 LT5fTV9jb2xvciA9PSBfU19yYl90cmVlX2JsYWNrKSkgewogICAgICAgICAgX193LT5fTV9jb2xv ciA9IF9TX3JiX3RyZWVfcmVkOwogICAgICAgICAgX194ID0gX194X3BhcmVudDsKICAgICAgICAg IF9feF9wYXJlbnQgPSBfX3hfcGFyZW50LT5fTV9wYXJlbnQ7CiAgICAgICAgfSBlbHNlIHsKICAg ICAgICAgIGlmIChfX3ctPl9NX3JpZ2h0ID09IDAgfHwgCiAgICAgICAgICAgICAgX193LT5fTV9y aWdodC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9ibGFjaykgewogICAgICAgICAgICBpZiAoX193 LT5fTV9sZWZ0KSBfX3ctPl9NX2xlZnQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsKICAg ICAgICAgICAgX193LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOwogICAgICAgICAgICBfUmJf dHJlZV9yb3RhdGVfcmlnaHQoX193LCBfX3Jvb3QpOwogICAgICAgICAgICBfX3cgPSBfX3hfcGFy ZW50LT5fTV9yaWdodDsKICAgICAgICAgIH0KICAgICAgICAgIF9fdy0+X01fY29sb3IgPSBfX3hf cGFyZW50LT5fTV9jb2xvcjsKICAgICAgICAgIF9feF9wYXJlbnQtPl9NX2NvbG9yID0gX1NfcmJf dHJlZV9ibGFjazsKICAgICAgICAgIGlmIChfX3ctPl9NX3JpZ2h0KSBfX3ctPl9NX3JpZ2h0LT5f TV9jb2xvciA9IF9TX3JiX3RyZWVfYmxhY2s7CiAgICAgICAgICBfUmJfdHJlZV9yb3RhdGVfbGVm dChfX3hfcGFyZW50LCBfX3Jvb3QpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9 IGVsc2UgeyAgICAgICAgICAgICAgICAgICAKICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9f dyA9IF9feF9wYXJlbnQtPl9NX2xlZnQ7CiAgICAgICAgaWYgKF9fdy0+X01fY29sb3IgPT0gX1Nf cmJfdHJlZV9yZWQpIHsKICAgICAgICAgIF9fdy0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNr OwogICAgICAgICAgX194X3BhcmVudC0+X01fY29sb3IgPSBfU19yYl90cmVlX3JlZDsKICAgICAg ICAgIF9SYl90cmVlX3JvdGF0ZV9yaWdodChfX3hfcGFyZW50LCBfX3Jvb3QpOwogICAgICAgICAg X193ID0gX194X3BhcmVudC0+X01fbGVmdDsKICAgICAgICB9CiAgICAgICAgaWYgKChfX3ctPl9N X3JpZ2h0ID09IDAgfHwgCiAgICAgICAgICAgICBfX3ctPl9NX3JpZ2h0LT5fTV9jb2xvciA9PSBf U19yYl90cmVlX2JsYWNrKSAmJgogICAgICAgICAgICAoX193LT5fTV9sZWZ0ID09IDAgfHwgCiAg ICAgICAgICAgICBfX3ctPl9NX2xlZnQtPl9NX2NvbG9yID09IF9TX3JiX3RyZWVfYmxhY2spKSB7 CiAgICAgICAgICBfX3ctPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9yZWQ7CiAgICAgICAgICBfX3gg PSBfX3hfcGFyZW50OwogICAgICAgICAgX194X3BhcmVudCA9IF9feF9wYXJlbnQtPl9NX3BhcmVu dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKF9fdy0+X01fbGVmdCA9PSAwIHx8IAog ICAgICAgICAgICAgIF9fdy0+X01fbGVmdC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9ibGFjaykg ewogICAgICAgICAgICBpZiAoX193LT5fTV9yaWdodCkgX193LT5fTV9yaWdodC0+X01fY29sb3Ig PSBfU19yYl90cmVlX2JsYWNrOwogICAgICAgICAgICBfX3ctPl9NX2NvbG9yID0gX1NfcmJfdHJl ZV9yZWQ7CiAgICAgICAgICAgIF9SYl90cmVlX3JvdGF0ZV9sZWZ0KF9fdywgX19yb290KTsKICAg ICAgICAgICAgX193ID0gX194X3BhcmVudC0+X01fbGVmdDsKICAgICAgICAgIH0KICAgICAgICAg IF9fdy0+X01fY29sb3IgPSBfX3hfcGFyZW50LT5fTV9jb2xvcjsKICAgICAgICAgIF9feF9wYXJl bnQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsKICAgICAgICAgIGlmIChfX3ctPl9NX2xl ZnQpIF9fdy0+X01fbGVmdC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOwogICAgICAgICAg X1JiX3RyZWVfcm90YXRlX3JpZ2h0KF9feF9wYXJlbnQsIF9fcm9vdCk7CiAgICAgICAgICBicmVh azsKICAgICAgICB9CiAgICAgIH0KICAgIGlmIChfX3gpIF9feC0+X01fY29sb3IgPSBfU19yYl90 cmVlX2JsYWNrOwogIH0KICByZXR1cm4gX195Owp9CgogCiAKIAogCgoKCiAKdGVtcGxhdGUgPGNs YXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBib29sIF9TX2luc3RhbmNlbGVzcz4KY2xhc3MgX1JiX3Ry ZWVfYWxsb2NfYmFzZSB7CnB1YmxpYzoKICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8 X1RwLCBfQWxsb2M+OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKICBhbGxvY2F0b3Jf dHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fbm9kZV9hbGxvY2F0b3I7IH0K CiAgX1JiX3RyZWVfYWxsb2NfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQogICAgOiBf TV9ub2RlX2FsbG9jYXRvcihfX2EpLCBfTV9oZWFkZXIoMCkge30KCnByb3RlY3RlZDoKICB0eXBl bmFtZSBfQWxsb2NfdHJhaXRzPF9SYl90cmVlX25vZGU8X1RwPiwgX0FsbG9jPjo6YWxsb2NhdG9y X3R5cGUKICAgICAgICAgICBfTV9ub2RlX2FsbG9jYXRvcjsKICBfUmJfdHJlZV9ub2RlPF9UcD4q IF9NX2hlYWRlcjsKCiAgX1JiX3RyZWVfbm9kZTxfVHA+KiBfTV9nZXRfbm9kZSgpIAogICAgeyBy ZXR1cm4gX01fbm9kZV9hbGxvY2F0b3IuYWxsb2NhdGUoMSk7IH0KICB2b2lkIF9NX3B1dF9ub2Rl KF9SYl90cmVlX25vZGU8X1RwPiogX19wKSAKICAgIHsgX01fbm9kZV9hbGxvY2F0b3IuZGVhbGxv Y2F0ZShfX3AsIDEpOyB9Cn07CgogCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4K Y2xhc3MgX1JiX3RyZWVfYWxsb2NfYmFzZTxfVHAsIF9BbGxvYywgdHJ1ZT4gewpwdWJsaWM6CiAg dHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9UcCwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5 cGUgYWxsb2NhdG9yX3R5cGU7CiAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0 IHsgcmV0dXJuIGFsbG9jYXRvcl90eXBlKCk7IH0KCiAgX1JiX3RyZWVfYWxsb2NfYmFzZShjb25z dCBhbGxvY2F0b3JfdHlwZSYpIDogX01faGVhZGVyKDApIHt9Cgpwcm90ZWN0ZWQ6CiAgX1JiX3Ry ZWVfbm9kZTxfVHA+KiBfTV9oZWFkZXI7CgogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0 czxfUmJfdHJlZV9ub2RlPF9UcD4sIF9BbGxvYz46Ol9BbGxvY190eXBlCiAgICAgICAgICBfQWxs b2NfdHlwZTsKCiAgX1JiX3RyZWVfbm9kZTxfVHA+KiBfTV9nZXRfbm9kZSgpCiAgICB7IHJldHVy biBfQWxsb2NfdHlwZTo6YWxsb2NhdGUoMSk7IH0KICB2b2lkIF9NX3B1dF9ub2RlKF9SYl90cmVl X25vZGU8X1RwPiogX19wKQogICAgeyBfQWxsb2NfdHlwZTo6ZGVhbGxvY2F0ZShfX3AsIDEpOyB9 Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CnN0cnVjdCBfUmJfdHJlZV9i YXNlCiAgOiBwdWJsaWMgX1JiX3RyZWVfYWxsb2NfYmFzZTxfVHAsIF9BbGxvYywKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjpfU19pbnN0 YW5jZWxlc3M+CnsKICB0eXBlZGVmIF9SYl90cmVlX2FsbG9jX2Jhc2U8X1RwLCBfQWxsb2MsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+Ojpf U19pbnN0YW5jZWxlc3M+CiAgICAgICAgICBfQmFzZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNl OjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKCiAgX1JiX3RyZWVfYmFzZShjb25zdCBh bGxvY2F0b3JfdHlwZSYgX19hKSAKICAgIDogX0Jhc2UoX19hKSB7IF9NX2hlYWRlciA9IF9NX2dl dF9ub2RlKCk7IH0KICB+X1JiX3RyZWVfYmFzZSgpIHsgX01fcHV0X25vZGUoX01faGVhZGVyKTsg fQoKfTsKCiMgNTE5ICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2dj Yy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9zdGxfdHJlZS5oIiAzCgoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwg Y2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9Db21wYXJlLAogICAgICAgICAgY2xhc3MgX0FsbG9j ID0gYWxsb2NhdG9yPCBfVmFsdWUgPiAgPgpjbGFzcyBfUmJfdHJlZSA6IHByb3RlY3RlZCBfUmJf dHJlZV9iYXNlPF9WYWx1ZSwgX0FsbG9jPiB7CiAgdHlwZWRlZiBfUmJfdHJlZV9iYXNlPF9WYWx1 ZSwgX0FsbG9jPiBfQmFzZTsKcHJvdGVjdGVkOgogIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNl KiBfQmFzZV9wdHI7CiAgdHlwZWRlZiBfUmJfdHJlZV9ub2RlPF9WYWx1ZT4gX1JiX3RyZWVfbm9k ZTsKICB0eXBlZGVmIF9SYl90cmVlX0NvbG9yX3R5cGUgX0NvbG9yX3R5cGU7CnB1YmxpYzoKICB0 eXBlZGVmIF9LZXkga2V5X3R5cGU7CiAgdHlwZWRlZiBfVmFsdWUgdmFsdWVfdHlwZTsKICB0eXBl ZGVmIHZhbHVlX3R5cGUqIHBvaW50ZXI7CiAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiBjb25z dF9wb2ludGVyOwogIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOwogIHR5cGVkZWYgY29u c3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgX1JiX3RyZWVfbm9kZSog X0xpbmtfdHlwZTsKICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CiAgdHlwZWRlZiBwdHJkaWZm X3QgZGlmZmVyZW5jZV90eXBlOwoKICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3Jf dHlwZSBhbGxvY2F0b3JfdHlwZTsKICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29u c3QgeyByZXR1cm4gX0Jhc2U6OmdldF9hbGxvY2F0b3IoKTsgfQoKcHJvdGVjdGVkOgoKCgoKCgpw cm90ZWN0ZWQ6CgogIF9MaW5rX3R5cGUgX01fY3JlYXRlX25vZGUoY29uc3QgdmFsdWVfdHlwZSYg X194KQogIHsKICAgIF9MaW5rX3R5cGUgX190bXAgPSBfTV9nZXRfbm9kZSgpOwogICAgdHJ5ICB7 CiAgICAgIGNvbnN0cnVjdCgmX190bXAtPl9NX3ZhbHVlX2ZpZWxkLCBfX3gpOwogICAgfQogICAg Y2F0Y2goLi4uKSB7ICBfTV9wdXRfbm9kZShfX3RtcCkgOyB0aHJvdzsgfSA7CiAgICByZXR1cm4g X190bXA7CiAgfQoKICBfTGlua190eXBlIF9NX2Nsb25lX25vZGUoX0xpbmtfdHlwZSBfX3gpCiAg ewogICAgX0xpbmtfdHlwZSBfX3RtcCA9IF9NX2NyZWF0ZV9ub2RlKF9feC0+X01fdmFsdWVfZmll bGQpOwogICAgX190bXAtPl9NX2NvbG9yID0gX194LT5fTV9jb2xvcjsKICAgIF9fdG1wLT5fTV9s ZWZ0ID0gMDsKICAgIF9fdG1wLT5fTV9yaWdodCA9IDA7CiAgICByZXR1cm4gX190bXA7CiAgfQoK ICB2b2lkIGRlc3Ryb3lfbm9kZShfTGlua190eXBlIF9fcCkKICB7CiAgICBkZXN0cm95KCZfX3At Pl9NX3ZhbHVlX2ZpZWxkKTsKICAgIF9NX3B1dF9ub2RlKF9fcCk7CiAgfQoKcHJvdGVjdGVkOgog IHNpemVfdHlwZSBfTV9ub2RlX2NvdW50OyAgCiAgX0NvbXBhcmUgX01fa2V5X2NvbXBhcmU7Cgog IF9MaW5rX3R5cGUmIF9NX3Jvb3QoKSBjb25zdCAKICAgIHsgcmV0dXJuIChfTGlua190eXBlJikg X01faGVhZGVyLT5fTV9wYXJlbnQ7IH0KICBfTGlua190eXBlJiBfTV9sZWZ0bW9zdCgpIGNvbnN0 IAogICAgeyByZXR1cm4gKF9MaW5rX3R5cGUmKSBfTV9oZWFkZXItPl9NX2xlZnQ7IH0KICBfTGlu a190eXBlJiBfTV9yaWdodG1vc3QoKSBjb25zdCAKICAgIHsgcmV0dXJuIChfTGlua190eXBlJikg X01faGVhZGVyLT5fTV9yaWdodDsgfQoKICBzdGF0aWMgX0xpbmtfdHlwZSYgX1NfbGVmdChfTGlu a190eXBlIF9feCkKICAgIHsgcmV0dXJuIChfTGlua190eXBlJikoX194LT5fTV9sZWZ0KTsgfQog IHN0YXRpYyBfTGlua190eXBlJiBfU19yaWdodChfTGlua190eXBlIF9feCkKICAgIHsgcmV0dXJu IChfTGlua190eXBlJikoX194LT5fTV9yaWdodCk7IH0KICBzdGF0aWMgX0xpbmtfdHlwZSYgX1Nf cGFyZW50KF9MaW5rX3R5cGUgX194KQogICAgeyByZXR1cm4gKF9MaW5rX3R5cGUmKShfX3gtPl9N X3BhcmVudCk7IH0KICBzdGF0aWMgcmVmZXJlbmNlIF9TX3ZhbHVlKF9MaW5rX3R5cGUgX194KQog ICAgeyByZXR1cm4gX194LT5fTV92YWx1ZV9maWVsZDsgfQogIHN0YXRpYyBjb25zdCBfS2V5JiBf U19rZXkoX0xpbmtfdHlwZSBfX3gpCiAgICB7IHJldHVybiBfS2V5T2ZWYWx1ZSgpKF9TX3ZhbHVl KF9feCkpOyB9CiAgc3RhdGljIF9Db2xvcl90eXBlJiBfU19jb2xvcihfTGlua190eXBlIF9feCkK ICAgIHsgcmV0dXJuIChfQ29sb3JfdHlwZSYpKF9feC0+X01fY29sb3IpOyB9CgogIHN0YXRpYyBf TGlua190eXBlJiBfU19sZWZ0KF9CYXNlX3B0ciBfX3gpCiAgICB7IHJldHVybiAoX0xpbmtfdHlw ZSYpKF9feC0+X01fbGVmdCk7IH0KICBzdGF0aWMgX0xpbmtfdHlwZSYgX1NfcmlnaHQoX0Jhc2Vf cHRyIF9feCkKICAgIHsgcmV0dXJuIChfTGlua190eXBlJikoX194LT5fTV9yaWdodCk7IH0KICBz dGF0aWMgX0xpbmtfdHlwZSYgX1NfcGFyZW50KF9CYXNlX3B0ciBfX3gpCiAgICB7IHJldHVybiAo X0xpbmtfdHlwZSYpKF9feC0+X01fcGFyZW50KTsgfQogIHN0YXRpYyByZWZlcmVuY2UgX1NfdmFs dWUoX0Jhc2VfcHRyIF9feCkKICAgIHsgcmV0dXJuICgoX0xpbmtfdHlwZSlfX3gpLT5fTV92YWx1 ZV9maWVsZDsgfQogIHN0YXRpYyBjb25zdCBfS2V5JiBfU19rZXkoX0Jhc2VfcHRyIF9feCkKICAg IHsgcmV0dXJuIF9LZXlPZlZhbHVlKCkoX1NfdmFsdWUoX0xpbmtfdHlwZShfX3gpKSk7fSAKICBz dGF0aWMgX0NvbG9yX3R5cGUmIF9TX2NvbG9yKF9CYXNlX3B0ciBfX3gpCiAgICB7IHJldHVybiAo X0NvbG9yX3R5cGUmKShfTGlua190eXBlKF9feCktPl9NX2NvbG9yKTsgfQoKICBzdGF0aWMgX0xp bmtfdHlwZSBfU19taW5pbXVtKF9MaW5rX3R5cGUgX194KSAKICAgIHsgcmV0dXJuIChfTGlua190 eXBlKSAgX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19taW5pbXVtKF9feCk7IH0KCiAgc3RhdGljIF9M aW5rX3R5cGUgX1NfbWF4aW11bShfTGlua190eXBlIF9feCkKICAgIHsgcmV0dXJuIChfTGlua190 eXBlKSBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21heGltdW0oX194KTsgfQoKcHVibGljOgogIHR5 cGVkZWYgX1JiX3RyZWVfaXRlcmF0b3I8dmFsdWVfdHlwZSwgcmVmZXJlbmNlLCBwb2ludGVyPiBp dGVyYXRvcjsKICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIGNvbnN0X3Jl ZmVyZW5jZSwgY29uc3RfcG9pbnRlcj4gCiAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKCgogIHR5 cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVy YXRvcjsKICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0 b3I7CgoKCgoKCgogCgpwcml2YXRlOgogIGl0ZXJhdG9yIF9NX2luc2VydChfQmFzZV9wdHIgX194 LCBfQmFzZV9wdHIgX195LCBjb25zdCB2YWx1ZV90eXBlJiBfX3YpOwogIF9MaW5rX3R5cGUgX01f Y29weShfTGlua190eXBlIF9feCwgX0xpbmtfdHlwZSBfX3ApOwogIHZvaWQgX01fZXJhc2UoX0xp bmtfdHlwZSBfX3gpOwoKcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK ICBfUmJfdHJlZSgpCiAgICA6IF9CYXNlKGFsbG9jYXRvcl90eXBlKCkpLCBfTV9ub2RlX2NvdW50 KDApLCBfTV9rZXlfY29tcGFyZSgpCiAgICB7IF9NX2VtcHR5X2luaXRpYWxpemUoKTsgfQoKICBf UmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21wKQogICAgOiBfQmFzZShhbGxvY2F0b3JfdHlw ZSgpKSwgX01fbm9kZV9jb3VudCgwKSwgX01fa2V5X2NvbXBhcmUoX19jb21wKSAKICAgIHsgX01f ZW1wdHlfaW5pdGlhbGl6ZSgpOyB9CgogIF9SYl90cmVlKGNvbnN0IF9Db21wYXJlJiBfX2NvbXAs IGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCiAgICA6IF9CYXNlKF9fYSksIF9NX25vZGVfY291 bnQoMCksIF9NX2tleV9jb21wYXJlKF9fY29tcCkgCiAgICB7IF9NX2VtcHR5X2luaXRpYWxpemUo KTsgfQoKICBfUmJfdHJlZShjb25zdCBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxf Q29tcGFyZSxfQWxsb2M+JiBfX3gpIAogICAgOiBfQmFzZShfX3guZ2V0X2FsbG9jYXRvcigpKSwK ICAgICAgX01fbm9kZV9jb3VudCgwKSwgX01fa2V5X2NvbXBhcmUoX194Ll9NX2tleV9jb21wYXJl KQogIHsgCiAgICBpZiAoX194Ll9NX3Jvb3QoKSA9PSAwKQogICAgICBfTV9lbXB0eV9pbml0aWFs aXplKCk7CiAgICBlbHNlIHsKICAgICAgX1NfY29sb3IoX01faGVhZGVyKSA9IF9TX3JiX3RyZWVf cmVkOwogICAgICBfTV9yb290KCkgPSBfTV9jb3B5KF9feC5fTV9yb290KCksIF9NX2hlYWRlcik7 CiAgICAgIF9NX2xlZnRtb3N0KCkgPSBfU19taW5pbXVtKF9NX3Jvb3QoKSk7CiAgICAgIF9NX3Jp Z2h0bW9zdCgpID0gX1NfbWF4aW11bShfTV9yb290KCkpOwogICAgfQogICAgX01fbm9kZV9jb3Vu dCA9IF9feC5fTV9ub2RlX2NvdW50OwogIH0KICB+X1JiX3RyZWUoKSB7IGNsZWFyKCk7IH0KICBf UmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+JiAKICBvcGVy YXRvcj0oY29uc3QgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0Fs bG9jPiYgX194KTsKCnByaXZhdGU6CiAgdm9pZCBfTV9lbXB0eV9pbml0aWFsaXplKCkgewogICAg X1NfY29sb3IoX01faGVhZGVyKSA9IF9TX3JiX3RyZWVfcmVkOyAgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIF9NX3Jvb3QoKSA9IDA7CiAgICBfTV9sZWZ0 bW9zdCgpID0gX01faGVhZGVyOwogICAgX01fcmlnaHRtb3N0KCkgPSBfTV9oZWFkZXI7CiAgfQoK cHVibGljOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgX0NvbXBhcmUg a2V5X2NvbXAoKSBjb25zdCB7IHJldHVybiBfTV9rZXlfY29tcGFyZTsgfQogIGl0ZXJhdG9yIGJl Z2luKCkgeyByZXR1cm4gX01fbGVmdG1vc3QoKTsgfQogIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkg Y29uc3QgeyByZXR1cm4gX01fbGVmdG1vc3QoKTsgfQogIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJu IF9NX2hlYWRlcjsgfQogIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX2hl YWRlcjsgfQogIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVy YXRvcihlbmQoKSk7IH0KICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsg CiAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IAogIH0KICByZXZlcnNl X2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CiAg Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyAKICAgIHJldHVybiBjb25zdF9y ZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOwogIH0gCiAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0 dXJuIF9NX25vZGVfY291bnQgPT0gMDsgfQogIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1 cm4gX01fbm9kZV9jb3VudDsgfQogIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJu IHNpemVfdHlwZSgtMSk7IH0KCiAgdm9pZCBzd2FwKF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlP ZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4mIF9fdCkgewogICAgIDo6c3dhcChfTV9oZWFkZXIsIF9f dC5fTV9oZWFkZXIpOwogICAgIDo6c3dhcChfTV9ub2RlX2NvdW50LCBfX3QuX01fbm9kZV9jb3Vu dCk7CiAgICAgOjpzd2FwKF9NX2tleV9jb21wYXJlLCBfX3QuX01fa2V5X2NvbXBhcmUpOwogIH0K ICAgIApwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIHBhaXI8aXRl cmF0b3IsYm9vbD4gaW5zZXJ0X3VuaXF1ZShjb25zdCB2YWx1ZV90eXBlJiBfX3gpOwogIGl0ZXJh dG9yIGluc2VydF9lcXVhbChjb25zdCB2YWx1ZV90eXBlJiBfX3gpOwoKICBpdGVyYXRvciBpbnNl cnRfdW5pcXVlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCk7CiAg aXRlcmF0b3IgaW5zZXJ0X2VxdWFsKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5 cGUmIF9feCk7CgoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgdm9pZCBpbnNl cnRfdW5pcXVlKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7 CiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQgaW5zZXJ0X2VxdWFsKF9J bnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCk7CgoKCgoKCgogIHZv aWQgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbik7CiAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtl eV90eXBlJiBfX3gpOwogIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19s YXN0KTsKICB2b2lkIGVyYXNlKGNvbnN0IGtleV90eXBlKiBfX2ZpcnN0LCBjb25zdCBrZXlfdHlw ZSogX19sYXN0KTsKICB2b2lkIGNsZWFyKCkgewogICAgaWYgKF9NX25vZGVfY291bnQgIT0gMCkg ewogICAgICBfTV9lcmFzZShfTV9yb290KCkpOwogICAgICBfTV9sZWZ0bW9zdCgpID0gX01faGVh ZGVyOwogICAgICBfTV9yb290KCkgPSAwOwogICAgICBfTV9yaWdodG1vc3QoKSA9IF9NX2hlYWRl cjsKICAgICAgX01fbm9kZV9jb3VudCA9IDA7CiAgICB9CiAgfSAgICAgIAoKcHVibGljOgogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBpdGVyYXRvciBmaW5kKGNvbnN0IGtleV90 eXBlJiBfX3gpOwogIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29u c3Q7CiAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0OwogIGl0ZXJh dG9yIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpOwogIGNvbnN0X2l0ZXJhdG9yIGxv d2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0OwogIGl0ZXJhdG9yIHVwcGVyX2Jv dW5kKGNvbnN0IGtleV90eXBlJiBfX3gpOwogIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNv bnN0IGtleV90eXBlJiBfX3gpIGNvbnN0OwogIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+IGVxdWFs X3JhbmdlKGNvbnN0IGtleV90eXBlJiBfX3gpOwogIHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0 X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdDsKCnB1Ymxp YzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgYm9vbCBfX3JiX3ZlcmlmeSgp IGNvbnN0Owp9OwoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tl eU9mVmFsdWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KaW5saW5l IGJvb2wgCm9wZXJhdG9yPT0oY29uc3QgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUs X0NvbXBhcmUsX0FsbG9jPiYgX194LCAKICAgICAgICAgICBjb25zdCBfUmJfdHJlZTxfS2V5LF9W YWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+JiBfX3kpCnsKICByZXR1cm4gX194LnNp emUoKSA9PSBfX3kuc2l6ZSgpICYmCiAgICAgICAgIGVxdWFsKF9feC5iZWdpbigpLCBfX3guZW5k KCksIF9feS5iZWdpbigpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwg Y2xhc3MgX0tleU9mVmFsdWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxv Yz4KaW5saW5lIGJvb2wgCm9wZXJhdG9yPChjb25zdCBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5 T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+JiBfX3gsIAogICAgICAgICAgY29uc3QgX1JiX3RyZWU8 X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPiYgX195KQp7CiAgcmV0dXJu IGxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9feC5iZWdpbigpLCBfX3guZW5kKCksIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBfX3kuYmVnaW4oKSwgX195LmVuZCgpKTsKfQoKCgp0 ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAg ICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgppbmxpbmUgdm9pZCAKc3dhcChf UmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+JiBfX3gsIAog ICAgIF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4mIF9f eSkKewogIF9feC5zd2FwKF9feSk7Cn0KCgoKCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBf VmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCAKICAgICAgICAgIGNsYXNzIF9Db21wYXJlLCBjbGFz cyBfQWxsb2M+Cl9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxv Yz4mIApfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+CiAg OjpvcGVyYXRvcj0oY29uc3QgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBh cmUsX0FsbG9jPiYgX194KQp7CiAgaWYgKHRoaXMgIT0gJl9feCkgewogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKICAgIGNsZWFyKCk7CiAgICBfTV9ub2RlX2NvdW50ID0gMDsKICAg IF9NX2tleV9jb21wYXJlID0gX194Ll9NX2tleV9jb21wYXJlOyAgICAgICAgCiAgICBpZiAoX194 Ll9NX3Jvb3QoKSA9PSAwKSB7CiAgICAgIF9NX3Jvb3QoKSA9IDA7CiAgICAgIF9NX2xlZnRtb3N0 KCkgPSBfTV9oZWFkZXI7CiAgICAgIF9NX3JpZ2h0bW9zdCgpID0gX01faGVhZGVyOwogICAgfQog ICAgZWxzZSB7CiAgICAgIF9NX3Jvb3QoKSA9IF9NX2NvcHkoX194Ll9NX3Jvb3QoKSwgX01faGVh ZGVyKTsKICAgICAgX01fbGVmdG1vc3QoKSA9IF9TX21pbmltdW0oX01fcm9vdCgpKTsKICAgICAg X01fcmlnaHRtb3N0KCkgPSBfU19tYXhpbXVtKF9NX3Jvb3QoKSk7CiAgICAgIF9NX25vZGVfY291 bnQgPSBfX3guX01fbm9kZV9jb3VudDsKICAgIH0KICB9CiAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAg ICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5 LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+OjppdGVyYXRvcgpfUmJfdHJlZTxf S2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+CiAgOjpfTV9pbnNlcnQoX0Jh c2VfcHRyIF9feF8sIF9CYXNlX3B0ciBfX3lfLCBjb25zdCBfVmFsdWUmIF9fdikKewogIF9MaW5r X3R5cGUgX194ID0gKF9MaW5rX3R5cGUpIF9feF87CiAgX0xpbmtfdHlwZSBfX3kgPSAoX0xpbmtf dHlwZSkgX195XzsKICBfTGlua190eXBlIF9fejsKCiAgaWYgKF9feSA9PSBfTV9oZWFkZXIgfHwg X194ICE9IDAgfHwgCiAgICAgIF9NX2tleV9jb21wYXJlKF9LZXlPZlZhbHVlKCkoX192KSwgX1Nf a2V5KF9feSkpKSB7CiAgICBfX3ogPSBfTV9jcmVhdGVfbm9kZShfX3YpOwogICAgX1NfbGVmdChf X3kpID0gX196OyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCiAgICBpZiAoX195ID09IF9NX2hlYWRlcikgewogICAgICBfTV9yb290KCkgPSBf X3o7CiAgICAgIF9NX3JpZ2h0bW9zdCgpID0gX196OwogICAgfQogICAgZWxzZSBpZiAoX195ID09 IF9NX2xlZnRtb3N0KCkpCiAgICAgIF9NX2xlZnRtb3N0KCkgPSBfX3o7ICAgIAogIH0KICBlbHNl IHsKICAgIF9feiA9IF9NX2NyZWF0ZV9ub2RlKF9fdik7CiAgICBfU19yaWdodChfX3kpID0gX196 OwogICAgaWYgKF9feSA9PSBfTV9yaWdodG1vc3QoKSkKICAgICAgX01fcmlnaHRtb3N0KCkgPSBf X3o7ICAgCiAgfQogIF9TX3BhcmVudChfX3opID0gX195OwogIF9TX2xlZnQoX196KSA9IDA7CiAg X1NfcmlnaHQoX196KSA9IDA7CiAgX1JiX3RyZWVfcmViYWxhbmNlKF9feiwgX01faGVhZGVyLT5f TV9wYXJlbnQpOwogICsrX01fbm9kZV9jb3VudDsKICByZXR1cm4gaXRlcmF0b3IoX196KTsKfQoK dGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAog ICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KdHlwZW5hbWUgX1JiX3RyZWU8 X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6aXRlcmF0b3IKX1JiX3Ry ZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6aW5zZXJ0X2Vx dWFsKGNvbnN0IF9WYWx1ZSYgX192KQp7CiAgX0xpbmtfdHlwZSBfX3kgPSBfTV9oZWFkZXI7CiAg X0xpbmtfdHlwZSBfX3ggPSBfTV9yb290KCk7CiAgd2hpbGUgKF9feCAhPSAwKSB7CiAgICBfX3kg PSBfX3g7CiAgICBfX3ggPSBfTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdiksIF9TX2tl eShfX3gpKSA/IAogICAgICAgICAgICBfU19sZWZ0KF9feCkgOiBfU19yaWdodChfX3gpOwogIH0K ICByZXR1cm4gX01faW5zZXJ0KF9feCwgX195LCBfX3YpOwp9CgoKdGVtcGxhdGUgPGNsYXNzIF9L ZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAgICAgICAgY2xhc3MgX0Nv bXBhcmUsIGNsYXNzIF9BbGxvYz4KcGFpcjx0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxf S2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+OjppdGVyYXRvciwgCiAgICAgYm9vbD4KX1JiX3Ry ZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6aW5zZXJ0X3Vu aXF1ZShjb25zdCBfVmFsdWUmIF9fdikKewogIF9MaW5rX3R5cGUgX195ID0gX01faGVhZGVyOwog IF9MaW5rX3R5cGUgX194ID0gX01fcm9vdCgpOwogIGJvb2wgX19jb21wID0gdHJ1ZTsKICB3aGls ZSAoX194ICE9IDApIHsKICAgIF9feSA9IF9feDsKICAgIF9fY29tcCA9IF9NX2tleV9jb21wYXJl KF9LZXlPZlZhbHVlKCkoX192KSwgX1Nfa2V5KF9feCkpOwogICAgX194ID0gX19jb21wID8gX1Nf bGVmdChfX3gpIDogX1NfcmlnaHQoX194KTsKICB9CiAgaXRlcmF0b3IgX19qID0gaXRlcmF0b3Io X195KTsgICAKICBpZiAoX19jb21wKQogICAgaWYgKF9faiA9PSBiZWdpbigpKSAgICAgCiAgICAg IHJldHVybiBwYWlyPGl0ZXJhdG9yLGJvb2w+KF9NX2luc2VydChfX3gsIF9feSwgX192KSwgdHJ1 ZSk7CiAgICBlbHNlCiAgICAgIC0tX19qOwogIGlmIChfTV9rZXlfY29tcGFyZShfU19rZXkoX19q Ll9NX25vZGUpLCBfS2V5T2ZWYWx1ZSgpKF9fdikpKQogICAgcmV0dXJuIHBhaXI8aXRlcmF0b3Is Ym9vbD4oX01faW5zZXJ0KF9feCwgX195LCBfX3YpLCB0cnVlKTsKICByZXR1cm4gcGFpcjxpdGVy YXRvcixib29sPihfX2osIGZhbHNlKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBf VmFsLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3Mg X0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwgX0NvbXBh cmUsIF9BbGxvYz46Oml0ZXJhdG9yIApfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS2V5T2ZWYWx1ZSwg X0NvbXBhcmUsIF9BbGxvYz4KICA6Omluc2VydF91bmlxdWUoaXRlcmF0b3IgX19wb3NpdGlvbiwg Y29uc3QgX1ZhbCYgX192KQp7CiAgaWYgKF9fcG9zaXRpb24uX01fbm9kZSA9PSBfTV9oZWFkZXIt Pl9NX2xlZnQpIHsgIAogICAgaWYgKHNpemUoKSA+IDAgJiYgCiAgICAgICAgX01fa2V5X2NvbXBh cmUoX0tleU9mVmFsdWUoKShfX3YpLCBfU19rZXkoX19wb3NpdGlvbi5fTV9ub2RlKSkpCiAgICAg IHJldHVybiBfTV9pbnNlcnQoX19wb3NpdGlvbi5fTV9ub2RlLCBfX3Bvc2l0aW9uLl9NX25vZGUs IF9fdik7CiAgICAgCiAgICBlbHNlCiAgICAgIHJldHVybiBpbnNlcnRfdW5pcXVlKF9fdikuZmly c3Q7CiAgfSBlbHNlIGlmIChfX3Bvc2l0aW9uLl9NX25vZGUgPT0gX01faGVhZGVyKSB7ICAKICAg IGlmIChfTV9rZXlfY29tcGFyZShfU19rZXkoX01fcmlnaHRtb3N0KCkpLCBfS2V5T2ZWYWx1ZSgp KF9fdikpKQogICAgICByZXR1cm4gX01faW5zZXJ0KDAsIF9NX3JpZ2h0bW9zdCgpLCBfX3YpOwog ICAgZWxzZQogICAgICByZXR1cm4gaW5zZXJ0X3VuaXF1ZShfX3YpLmZpcnN0OwogIH0gZWxzZSB7 CiAgICBpdGVyYXRvciBfX2JlZm9yZSA9IF9fcG9zaXRpb247CiAgICAtLV9fYmVmb3JlOwogICAg aWYgKF9NX2tleV9jb21wYXJlKF9TX2tleShfX2JlZm9yZS5fTV9ub2RlKSwgX0tleU9mVmFsdWUo KShfX3YpKSAKICAgICAgICAmJiBfTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdiksIF9T X2tleShfX3Bvc2l0aW9uLl9NX25vZGUpKSkgewogICAgICBpZiAoX1NfcmlnaHQoX19iZWZvcmUu X01fbm9kZSkgPT0gMCkKICAgICAgICByZXR1cm4gX01faW5zZXJ0KDAsIF9fYmVmb3JlLl9NX25v ZGUsIF9fdik7IAogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIF9NX2luc2VydChfX3Bvc2l0aW9u Ll9NX25vZGUsIF9fcG9zaXRpb24uX01fbm9kZSwgX192KTsKICAgICAKICAgIH0gZWxzZQogICAg ICByZXR1cm4gaW5zZXJ0X3VuaXF1ZShfX3YpLmZpcnN0OwogIH0KfQoKdGVtcGxhdGUgPGNsYXNz IF9LZXksIGNsYXNzIF9WYWwsIGNsYXNzIF9LZXlPZlZhbHVlLCAKICAgICAgICAgIGNsYXNzIF9D b21wYXJlLCBjbGFzcyBfQWxsb2M+CnR5cGVuYW1lIF9SYl90cmVlPF9LZXksX1ZhbCxfS2V5T2ZW YWx1ZSxfQ29tcGFyZSxfQWxsb2M+OjppdGVyYXRvciAKX1JiX3RyZWU8X0tleSxfVmFsLF9LZXlP ZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4KICA6Omluc2VydF9lcXVhbChpdGVyYXRvciBfX3Bvc2l0 aW9uLCBjb25zdCBfVmFsJiBfX3YpCnsKICBpZiAoX19wb3NpdGlvbi5fTV9ub2RlID09IF9NX2hl YWRlci0+X01fbGVmdCkgeyAgCiAgICBpZiAoc2l6ZSgpID4gMCAmJiAKICAgICAgICBfTV9rZXlf Y29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdiksIF9TX2tleShfX3Bvc2l0aW9uLl9NX25vZGUpKSkK ICAgICAgcmV0dXJuIF9NX2luc2VydChfX3Bvc2l0aW9uLl9NX25vZGUsIF9fcG9zaXRpb24uX01f bm9kZSwgX192KTsKICAgICAKICAgIGVsc2UKICAgICAgcmV0dXJuIGluc2VydF9lcXVhbChfX3Yp OwogIH0gZWxzZSBpZiAoX19wb3NpdGlvbi5fTV9ub2RlID09IF9NX2hlYWRlcikgeyAKICAgIGlm ICghX01fa2V5X2NvbXBhcmUoX0tleU9mVmFsdWUoKShfX3YpLCBfU19rZXkoX01fcmlnaHRtb3N0 KCkpKSkKICAgICAgcmV0dXJuIF9NX2luc2VydCgwLCBfTV9yaWdodG1vc3QoKSwgX192KTsKICAg IGVsc2UKICAgICAgcmV0dXJuIGluc2VydF9lcXVhbChfX3YpOwogIH0gZWxzZSB7CiAgICBpdGVy YXRvciBfX2JlZm9yZSA9IF9fcG9zaXRpb247CiAgICAtLV9fYmVmb3JlOwogICAgaWYgKCFfTV9r ZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdiksIF9TX2tleShfX2JlZm9yZS5fTV9ub2RlKSkK ICAgICAgICAmJiAhX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9fcG9zaXRpb24uX01fbm9kZSksIF9L ZXlPZlZhbHVlKCkoX192KSkpIHsKICAgICAgaWYgKF9TX3JpZ2h0KF9fYmVmb3JlLl9NX25vZGUp ID09IDApCiAgICAgICAgcmV0dXJuIF9NX2luc2VydCgwLCBfX2JlZm9yZS5fTV9ub2RlLCBfX3Yp OyAKICAgICAgZWxzZQogICAgICAgIHJldHVybiBfTV9pbnNlcnQoX19wb3NpdGlvbi5fTV9ub2Rl LCBfX3Bvc2l0aW9uLl9NX25vZGUsIF9fdik7CiAgICAgCiAgICB9IGVsc2UKICAgICAgcmV0dXJu IGluc2VydF9lcXVhbChfX3YpOwogIH0KfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3Mg X1ZhbCwgY2xhc3MgX0tvViwgY2xhc3MgX0NtcCwgY2xhc3MgX0FsbG9jPgogIHRlbXBsYXRlPGNs YXNzIF9JST4Kdm9pZCBfUmJfdHJlZTxfS2V5LF9WYWwsX0tvVixfQ21wLF9BbGxvYz4KICA6Omlu c2VydF9lcXVhbChfSUkgX19maXJzdCwgX0lJIF9fbGFzdCkKewogIGZvciAoIDsgX19maXJzdCAh PSBfX2xhc3Q7ICsrX19maXJzdCkKICAgIGluc2VydF9lcXVhbCgqX19maXJzdCk7Cn0KCnRlbXBs YXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsLCBjbGFzcyBfS29WLCBjbGFzcyBfQ21wLCBjbGFz cyBfQWxsb2M+IAogIHRlbXBsYXRlPGNsYXNzIF9JST4Kdm9pZCBfUmJfdHJlZTxfS2V5LF9WYWws X0tvVixfQ21wLF9BbGxvYz4KICA6Omluc2VydF91bmlxdWUoX0lJIF9fZmlyc3QsIF9JSSBfX2xh c3QpIHsKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmlyc3QpCiAgICBpbnNlcnRf dW5pcXVlKCpfX2ZpcnN0KTsKfQoKIyAxMDIxICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2dj Yy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4v Li4vLi4vaW5jbHVkZS9nKystMy9zdGxfdHJlZS5oIiAzCgogICAgICAgICAKdGVtcGxhdGUgPGNs YXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAgICAgICAgY2xh c3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KaW5saW5lIHZvaWQgX1JiX3RyZWU8X0tleSxfVmFs dWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6ZXJhc2UoaXRlcmF0b3IgX19wb3Np dGlvbikKewogIF9MaW5rX3R5cGUgX195ID0gCiAgICAoX0xpbmtfdHlwZSkgX1JiX3RyZWVfcmVi YWxhbmNlX2Zvcl9lcmFzZShfX3Bvc2l0aW9uLl9NX25vZGUsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBfTV9oZWFkZXItPl9NX3BhcmVudCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2hlYWRlci0+X01fbGVmdCwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2hlYWRlci0+ X01fcmlnaHQpOwogIGRlc3Ryb3lfbm9kZShfX3kpOwogIC0tX01fbm9kZV9jb3VudDsKfQoKdGVt cGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAg ICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KdHlwZW5hbWUgX1JiX3RyZWU8X0tl eSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6c2l6ZV90eXBlIApfUmJfdHJl ZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+OjplcmFzZShjb25zdCBf S2V5JiBfX3gpCnsKICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBfX3AgPSBlcXVhbF9yYW5nZShf X3gpOwogIHNpemVfdHlwZSBfX24gPSAwOwogIGRpc3RhbmNlKF9fcC5maXJzdCwgX19wLnNlY29u ZCwgX19uKTsKICBlcmFzZShfX3AuZmlyc3QsIF9fcC5zZWNvbmQpOwogIHJldHVybiBfX247Cn0K CnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsLCBjbGFzcyBfS29WLCBjbGFzcyBfQ29t cGFyZSwgY2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LCBfVmFsLCBfS29WLCBf Q29tcGFyZSwgX0FsbG9jPjo6X0xpbmtfdHlwZSAKX1JiX3RyZWU8X0tleSxfVmFsLF9Lb1YsX0Nv bXBhcmUsX0FsbG9jPgogIDo6X01fY29weShfTGlua190eXBlIF9feCwgX0xpbmtfdHlwZSBfX3Ap CnsKICAgICAgICAgICAgICAgICAgICAgICAgIAogIF9MaW5rX3R5cGUgX190b3AgPSBfTV9jbG9u ZV9ub2RlKF9feCk7CiAgX190b3AtPl9NX3BhcmVudCA9IF9fcDsKIAogIHRyeSAgewogICAgaWYg KF9feC0+X01fcmlnaHQpCiAgICAgIF9fdG9wLT5fTV9yaWdodCA9IF9NX2NvcHkoX1NfcmlnaHQo X194KSwgX190b3ApOwogICAgX19wID0gX190b3A7CiAgICBfX3ggPSBfU19sZWZ0KF9feCk7Cgog ICAgd2hpbGUgKF9feCAhPSAwKSB7CiAgICAgIF9MaW5rX3R5cGUgX195ID0gX01fY2xvbmVfbm9k ZShfX3gpOwogICAgICBfX3AtPl9NX2xlZnQgPSBfX3k7CiAgICAgIF9feS0+X01fcGFyZW50ID0g X19wOwogICAgICBpZiAoX194LT5fTV9yaWdodCkKICAgICAgICBfX3ktPl9NX3JpZ2h0ID0gX01f Y29weShfU19yaWdodChfX3gpLCBfX3kpOwogICAgICBfX3AgPSBfX3k7CiAgICAgIF9feCA9IF9T X2xlZnQoX194KTsKICAgIH0KICB9CiAgY2F0Y2goLi4uKSB7ICBfTV9lcmFzZShfX3RvcCkgOyB0 aHJvdzsgfSA7CgogIHJldHVybiBfX3RvcDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNz IF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNs YXNzIF9BbGxvYz4Kdm9pZCBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFy ZSxfQWxsb2M+CiAgOjpfTV9lcmFzZShfTGlua190eXBlIF9feCkKewogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKICB3aGlsZSAoX194ICE9IDApIHsKICAgIF9NX2VyYXNlKF9TX3Jp Z2h0KF9feCkpOwogICAgX0xpbmtfdHlwZSBfX3kgPSBfU19sZWZ0KF9feCk7CiAgICBkZXN0cm95 X25vZGUoX194KTsKICAgIF9feCA9IF9feTsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBj bGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCAKICAgICAgICAgIGNsYXNzIF9Db21wYXJl LCBjbGFzcyBfQWxsb2M+CnZvaWQgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0Nv bXBhcmUsX0FsbG9jPgogIDo6ZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0 KQp7CiAgaWYgKF9fZmlyc3QgPT0gYmVnaW4oKSAmJiBfX2xhc3QgPT0gZW5kKCkpCiAgICBjbGVh cigpOwogIGVsc2UKICAgIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgZXJhc2UoX19maXJzdCsr KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFs dWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4Kdm9pZCBfUmJfdHJl ZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+CiAgOjplcmFzZShjb25z dCBfS2V5KiBfX2ZpcnN0LCBjb25zdCBfS2V5KiBfX2xhc3QpIAp7CiAgd2hpbGUgKF9fZmlyc3Qg IT0gX19sYXN0KSBlcmFzZSgqX19maXJzdCsrKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNs YXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUs IGNsYXNzIF9BbGxvYz4KdHlwZW5hbWUgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUs X0NvbXBhcmUsX0FsbG9jPjo6aXRlcmF0b3IgCl9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZh bHVlLF9Db21wYXJlLF9BbGxvYz46OmZpbmQoY29uc3QgX0tleSYgX19rKQp7CiAgX0xpbmtfdHlw ZSBfX3kgPSBfTV9oZWFkZXI7ICAgICAgIAogIF9MaW5rX3R5cGUgX194ID0gX01fcm9vdCgpOyAg ICAgICAKCiAgd2hpbGUgKF9feCAhPSAwKSAKICAgIGlmICghX01fa2V5X2NvbXBhcmUoX1Nfa2V5 KF9feCksIF9faykpCiAgICAgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gpOwogICAgZWxz ZQogICAgICBfX3ggPSBfU19yaWdodChfX3gpOwoKICBpdGVyYXRvciBfX2ogPSBpdGVyYXRvcihf X3kpOyAgIAogIHJldHVybiAoX19qID09IGVuZCgpIHx8IF9NX2tleV9jb21wYXJlKF9faywgX1Nf a2V5KF9fai5fTV9ub2RlKSkpID8gCiAgICAgZW5kKCkgOiBfX2o7Cn0KCnRlbXBsYXRlIDxjbGFz cyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCAKICAgICAgICAgIGNsYXNz IF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CnR5cGVuYW1lIF9SYl90cmVlPF9LZXksX1ZhbHVlLF9L ZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yIApfUmJfdHJlZTxfS2V5 LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+OjpmaW5kKGNvbnN0IF9LZXkmIF9f aykgY29uc3QKewogIF9MaW5rX3R5cGUgX195ID0gX01faGVhZGVyOyAgCiAgX0xpbmtfdHlwZSBf X3ggPSBfTV9yb290KCk7ICAKCiAgd2hpbGUgKF9feCAhPSAwKSB7CiAgICBpZiAoIV9NX2tleV9j b21wYXJlKF9TX2tleShfX3gpLCBfX2spKQogICAgICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQo X194KTsKICAgIGVsc2UKICAgICAgX194ID0gX1NfcmlnaHQoX194KTsKICB9CiAgY29uc3RfaXRl cmF0b3IgX19qID0gY29uc3RfaXRlcmF0b3IoX195KTsgICAKICByZXR1cm4gKF9faiA9PSBlbmQo KSB8fCBfTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleShfX2ouX01fbm9kZSkpKSA/CiAgICBlbmQo KSA6IF9fajsKfQoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tl eU9mVmFsdWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KdHlwZW5h bWUgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6c2l6 ZV90eXBlIApfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+ CiAgOjpjb3VudChjb25zdCBfS2V5JiBfX2spIGNvbnN0CnsKICBwYWlyPGNvbnN0X2l0ZXJhdG9y LCBjb25zdF9pdGVyYXRvcj4gX19wID0gZXF1YWxfcmFuZ2UoX19rKTsKICBzaXplX3R5cGUgX19u ID0gMDsKICBkaXN0YW5jZShfX3AuZmlyc3QsIF9fcC5zZWNvbmQsIF9fbik7CiAgcmV0dXJuIF9f bjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFs dWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KdHlwZW5hbWUgX1Ji X3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6aXRlcmF0b3Ig Cl9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4KICA6Omxv d2VyX2JvdW5kKGNvbnN0IF9LZXkmIF9faykKewogIF9MaW5rX3R5cGUgX195ID0gX01faGVhZGVy OyAgCiAgX0xpbmtfdHlwZSBfX3ggPSBfTV9yb290KCk7ICAKCiAgd2hpbGUgKF9feCAhPSAwKSAK ICAgIGlmICghX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9feCksIF9faykpCiAgICAgIF9feSA9IF9f eCwgX194ID0gX1NfbGVmdChfX3gpOwogICAgZWxzZQogICAgICBfX3ggPSBfU19yaWdodChfX3gp OwoKICByZXR1cm4gaXRlcmF0b3IoX195KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNz IF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNs YXNzIF9BbGxvYz4KdHlwZW5hbWUgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0Nv bXBhcmUsX0FsbG9jPjo6Y29uc3RfaXRlcmF0b3IgCl9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlP ZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4KICA6Omxvd2VyX2JvdW5kKGNvbnN0IF9LZXkmIF9faykg Y29uc3QKewogIF9MaW5rX3R5cGUgX195ID0gX01faGVhZGVyOyAgCiAgX0xpbmtfdHlwZSBfX3gg PSBfTV9yb290KCk7ICAKCiAgd2hpbGUgKF9feCAhPSAwKSAKICAgIGlmICghX01fa2V5X2NvbXBh cmUoX1Nfa2V5KF9feCksIF9faykpCiAgICAgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gp OwogICAgZWxzZQogICAgICBfX3ggPSBfU19yaWdodChfX3gpOwoKICByZXR1cm4gY29uc3RfaXRl cmF0b3IoX195KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3Mg X0tleU9mVmFsdWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KdHlw ZW5hbWUgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6 aXRlcmF0b3IgCl9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxv Yz4KICA6OnVwcGVyX2JvdW5kKGNvbnN0IF9LZXkmIF9faykKewogIF9MaW5rX3R5cGUgX195ID0g X01faGVhZGVyOyAgCiAgX0xpbmtfdHlwZSBfX3ggPSBfTV9yb290KCk7ICAKCiAgIHdoaWxlIChf X3ggIT0gMCkgCiAgICAgaWYgKF9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9feCkpKQogICAg ICAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CiAgICAgZWxzZQogICAgICAgX194ID0g X1NfcmlnaHQoX194KTsKCiAgIHJldHVybiBpdGVyYXRvcihfX3kpOwp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFz cyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxf S2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+Ojpjb25zdF9pdGVyYXRvciAKX1JiX3RyZWU8X0tl eSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6dXBwZXJfYm91bmQoY29u c3QgX0tleSYgX19rKSBjb25zdAp7CiAgX0xpbmtfdHlwZSBfX3kgPSBfTV9oZWFkZXI7ICAKICBf TGlua190eXBlIF9feCA9IF9NX3Jvb3QoKTsgIAoKICAgd2hpbGUgKF9feCAhPSAwKSAKICAgICBp ZiAoX01fa2V5X2NvbXBhcmUoX19rLCBfU19rZXkoX194KSkpCiAgICAgICBfX3kgPSBfX3gsIF9f eCA9IF9TX2xlZnQoX194KTsKICAgICBlbHNlCiAgICAgICBfX3ggPSBfU19yaWdodChfX3gpOwoK ICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9feSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBj bGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCAKICAgICAgICAgIGNsYXNzIF9Db21wYXJl LCBjbGFzcyBfQWxsb2M+CmlubGluZSAKcGFpcjx0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWx1 ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+OjppdGVyYXRvciwKICAgICB0eXBlbmFtZSBf UmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+OjppdGVyYXRv cj4KX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6 ZXF1YWxfcmFuZ2UoY29uc3QgX0tleSYgX19rKQp7CiAgcmV0dXJuIHBhaXI8aXRlcmF0b3IsIGl0 ZXJhdG9yPihsb3dlcl9ib3VuZChfX2spLCB1cHBlcl9ib3VuZChfX2spKTsKfQoKdGVtcGxhdGUg PGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tvViwgY2xhc3MgX0NvbXBhcmUsIGNs YXNzIF9BbGxvYz4KaW5saW5lIApwYWlyPHR5cGVuYW1lIF9SYl90cmVlPF9LZXksIF9WYWx1ZSwg X0tvViwgX0NvbXBhcmUsIF9BbGxvYz46OmNvbnN0X2l0ZXJhdG9yLAogICAgIHR5cGVuYW1lIF9S Yl90cmVlPF9LZXksIF9WYWx1ZSwgX0tvViwgX0NvbXBhcmUsIF9BbGxvYz46OmNvbnN0X2l0ZXJh dG9yPgpfUmJfdHJlZTxfS2V5LCBfVmFsdWUsIF9Lb1YsIF9Db21wYXJlLCBfQWxsb2M+CiAgOjpl cXVhbF9yYW5nZShjb25zdCBfS2V5JiBfX2spIGNvbnN0CnsKICByZXR1cm4gcGFpcjxjb25zdF9p dGVyYXRvcixjb25zdF9pdGVyYXRvcj4obG93ZXJfYm91bmQoX19rKSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfYm91bmQoX19rKSk7Cn0KCmlubGlu ZSBpbnQgCl9fYmxhY2tfY291bnQoX1JiX3RyZWVfbm9kZV9iYXNlKiBfX25vZGUsIF9SYl90cmVl X25vZGVfYmFzZSogX19yb290KQp7CiAgaWYgKF9fbm9kZSA9PSAwKQogICAgcmV0dXJuIDA7CiAg ZWxzZSB7CiAgICBpbnQgX19iYyA9IF9fbm9kZS0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9ibGFj ayA/IDEgOiAwOwogICAgaWYgKF9fbm9kZSA9PSBfX3Jvb3QpCiAgICAgIHJldHVybiBfX2JjOwog ICAgZWxzZQogICAgICByZXR1cm4gX19iYyArIF9fYmxhY2tfY291bnQoX19ub2RlLT5fTV9wYXJl bnQsIF9fcm9vdCk7CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBj bGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9j Pgpib29sIF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz46 Ol9fcmJfdmVyaWZ5KCkgY29uc3QKewogIGlmIChfTV9ub2RlX2NvdW50ID09IDAgfHwgYmVnaW4o KSA9PSBlbmQoKSkKICAgIHJldHVybiBfTV9ub2RlX2NvdW50ID09IDAgJiYgYmVnaW4oKSA9PSBl bmQoKSAmJgogICAgICBfTV9oZWFkZXItPl9NX2xlZnQgPT0gX01faGVhZGVyICYmIF9NX2hlYWRl ci0+X01fcmlnaHQgPT0gX01faGVhZGVyOwogIAogIGludCBfX2xlbiA9IF9fYmxhY2tfY291bnQo X01fbGVmdG1vc3QoKSwgX01fcm9vdCgpKTsKICBmb3IgKGNvbnN0X2l0ZXJhdG9yIF9faXQgPSBi ZWdpbigpOyBfX2l0ICE9IGVuZCgpOyArK19faXQpIHsKICAgIF9MaW5rX3R5cGUgX194ID0gKF9M aW5rX3R5cGUpIF9faXQuX01fbm9kZTsKICAgIF9MaW5rX3R5cGUgX19MID0gX1NfbGVmdChfX3gp OwogICAgX0xpbmtfdHlwZSBfX1IgPSBfU19yaWdodChfX3gpOwoKICAgIGlmIChfX3gtPl9NX2Nv bG9yID09IF9TX3JiX3RyZWVfcmVkKQogICAgICBpZiAoKF9fTCAmJiBfX0wtPl9NX2NvbG9yID09 IF9TX3JiX3RyZWVfcmVkKSB8fAogICAgICAgICAgKF9fUiAmJiBfX1ItPl9NX2NvbG9yID09IF9T X3JiX3RyZWVfcmVkKSkKICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgaWYgKF9fTCAmJiBfTV9r ZXlfY29tcGFyZShfU19rZXkoX194KSwgX1Nfa2V5KF9fTCkpKQogICAgICByZXR1cm4gZmFsc2U7 CiAgICBpZiAoX19SICYmIF9NX2tleV9jb21wYXJlKF9TX2tleShfX1IpLCBfU19rZXkoX194KSkp CiAgICAgIHJldHVybiBmYWxzZTsKCiAgICBpZiAoIV9fTCAmJiAhX19SICYmIF9fYmxhY2tfY291 bnQoX194LCBfTV9yb290KCkpICE9IF9fbGVuKQogICAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBp ZiAoX01fbGVmdG1vc3QoKSAhPSBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21pbmltdW0oX01fcm9v dCgpKSkKICAgIHJldHVybiBmYWxzZTsKICBpZiAoX01fcmlnaHRtb3N0KCkgIT0gX1JiX3RyZWVf bm9kZV9iYXNlOjpfU19tYXhpbXVtKF9NX3Jvb3QoKSkpCiAgICByZXR1cm4gZmFsc2U7CgogIHJl dHVybiB0cnVlOwp9CgogCiAKCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNs YXNzIF9LZXlPZlZhbHVlLCBjbGFzcyBfQ29tcGFyZSwKICAgICAgICAgIGNsYXNzIF9BbGxvYyA9 IGFsbG9jYXRvcjwgX1ZhbHVlID4gID4Kc3RydWN0IHJiX3RyZWUgOiBwdWJsaWMgX1JiX3RyZWU8 X0tleSwgX1ZhbHVlLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4KewogIHR5cGVkZWYg X1JiX3RyZWU8X0tleSwgX1ZhbHVlLCBfS2V5T2ZWYWx1ZSwgX0NvbXBhcmUsIF9BbGxvYz4gX0Jh c2U7CiAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5 cGU7CgogIHJiX3RyZWUoY29uc3QgX0NvbXBhcmUmIF9fY29tcCA9IF9Db21wYXJlKCksCiAgICAg ICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDog X0Jhc2UoX19jb21wLCBfX2EpIHt9CiAgCiAgfnJiX3RyZWUoKSB7fQp9OwoKCgoKCiAgCgoKCiAK IAogCiMgMzEgIi9ob21lL3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxp Yi9wb3dlcnBjLWlibS1haXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0z L21hcCIgMiAzCgoKIyAxICIvaG9tZS90di90b29scy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGli L2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEuMC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVk ZS9nKystMy9zdGxfbWFwLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoK CiAKCgoKCgoKCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJl ID0gbGVzczxfS2V5PiwKICAgICAgICAgIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjwgX1RwID4g ID4KCgoKCmNsYXNzIG1hcCB7CnB1YmxpYzoKCiAKCiAgdHlwZWRlZiBfS2V5ICAgICAgICAgICAg ICAgICAga2V5X3R5cGU7CiAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgZGF0YV90eXBl OwogIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgIG1hcHBlZF90eXBlOwogIHR5cGVkZWYg cGFpcjxjb25zdCBfS2V5LCBfVHA+IHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBfQ29tcGFyZSAgICAg ICAgICAgICAga2V5X2NvbXBhcmU7CiAgICAKICBjbGFzcyB2YWx1ZV9jb21wYXJlCiAgICA6IHB1 YmxpYyBiaW5hcnlfZnVuY3Rpb248dmFsdWVfdHlwZSwgdmFsdWVfdHlwZSwgYm9vbD4gewogIGZy aWVuZCBjbGFzcyBtYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPjsKICBwcm90ZWN0ZWQgOgog ICAgX0NvbXBhcmUgX01fY29tcDsKICAgIHZhbHVlX2NvbXBhcmUoX0NvbXBhcmUgX19jKSA6IF9N X2NvbXAoX19jKSB7fQogIHB1YmxpYzoKICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCB2YWx1ZV90 eXBlJiBfX3gsIGNvbnN0IHZhbHVlX3R5cGUmIF9feSkgY29uc3QgewogICAgICByZXR1cm4gX01f Y29tcChfX3guZmlyc3QsIF9feS5maXJzdCk7CiAgICB9CiAgfTsKCnByaXZhdGU6CiAgdHlwZWRl ZiBfUmJfdHJlZTxrZXlfdHlwZSwgdmFsdWVfdHlwZSwgCiAgICAgICAgICAgICAgICAgICBfU2Vs ZWN0MXN0PHZhbHVlX3R5cGU+LCBrZXlfY29tcGFyZSwgX0FsbG9jPiBfUmVwX3R5cGU7CiAgX1Jl cF90eXBlIF9NX3Q7ICAgCnB1YmxpYzoKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cG9p bnRlciBwb2ludGVyOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9wb2ludGVy IGNvbnN0X3BvaW50ZXI7CiAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJlZmVyZW5jZSBy ZWZlcmVuY2U7CiAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBj b25zdF9yZWZlcmVuY2U7CiAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6Oml0ZXJhdG9yIGl0 ZXJhdG9yOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciBjb25z dF9pdGVyYXRvcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6cmV2ZXJzZV9pdGVyYXRv ciByZXZlcnNlX2l0ZXJhdG9yOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9y ZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CiAgdHlwZWRlZiB0eXBlbmFt ZSBfUmVwX3R5cGU6OnNpemVfdHlwZSBzaXplX3R5cGU7CiAgdHlwZWRlZiB0eXBlbmFtZSBfUmVw X3R5cGU6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiB0eXBlbmFt ZSBfUmVwX3R5cGU6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwoKICAgCgogIG1hcCgp IDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKSB7fQogIGV4cGxpY2l0IG1hcChj b25zdCBfQ29tcGFyZSYgX19jb21wLAogICAgICAgICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlw ZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDogX01fdChfX2NvbXAsIF9fYSkge30KCgog IHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICBtYXAoX0lucHV0SXRlcmF0b3IgX19m aXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQogICAgOiBfTV90KF9Db21wYXJlKCksIGFsbG9j YXRvcl90eXBlKCkpCiAgICB7IF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOyB9 CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICBtYXAoX0lucHV0SXRlcmF0b3Ig X19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LCBjb25zdCBfQ29tcGFyZSYgX19jb21wLAog ICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDog X01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19sYXN0KTsg fQojIDEyMyAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGli L3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMv c3RsX21hcC5oIiAzCgoKICBtYXAoY29uc3QgbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4m IF9feCkgOiBfTV90KF9feC5fTV90KSB7fQogIG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+ JgogIG9wZXJhdG9yPShjb25zdCBtYXA8X0tleSwgX1RwLCBfQ29tcGFyZSwgX0FsbG9jPiYgX194 KQogIHsKICAgIF9NX3QgPSBfX3guX01fdDsKICAgIHJldHVybiAqdGhpczsgCiAgfQoKICAgCgog IGtleV9jb21wYXJlIGtleV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9 CiAgdmFsdWVfY29tcGFyZSB2YWx1ZV9jb21wKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfY29tcGFy ZShfTV90LmtleV9jb21wKCkpOyB9CiAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNv bnN0IHsgcmV0dXJuIF9NX3QuZ2V0X2FsbG9jYXRvcigpOyB9CgogIGl0ZXJhdG9yIGJlZ2luKCkg eyByZXR1cm4gX01fdC5iZWdpbigpOyB9CiAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7 IHJldHVybiBfTV90LmJlZ2luKCk7IH0KICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV90LmVu ZCgpOyB9CiAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5lbmQoKTsg fQogIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQog IGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fdC5yYmVn aW4oKTsgfQogIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9 CiAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5yZW5k KCk7IH0KICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fdC5lbXB0eSgpOyB9CiAgc2l6 ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBfTV90LnNpemUoKTsgfQogIHNpemVfdHlwZSBt YXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQogIF9UcCYgb3BlcmF0 b3JbXShjb25zdCBrZXlfdHlwZSYgX19rKSB7CiAgICBpdGVyYXRvciBfX2kgPSBsb3dlcl9ib3Vu ZChfX2spOwogICAgIAogICAgaWYgKF9faSA9PSBlbmQoKSB8fCBrZXlfY29tcCgpKF9faywgKCpf X2kpLmZpcnN0KSkKICAgICAgX19pID0gaW5zZXJ0KF9faSwgdmFsdWVfdHlwZShfX2ssIF9UcCgp KSk7CiAgICByZXR1cm4gKCpfX2kpLnNlY29uZDsKICB9CiAgdm9pZCBzd2FwKG1hcDxfS2V5LF9U cCxfQ29tcGFyZSxfQWxsb2M+JiBfX3gpIHsgX01fdC5zd2FwKF9feC5fTV90KTsgfQoKICAgCgog IHBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0KGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgCiAgICB7 IHJldHVybiBfTV90Lmluc2VydF91bmlxdWUoX194KTsgfQogIGl0ZXJhdG9yIGluc2VydChpdGVy YXRvciBwb3NpdGlvbiwgY29uc3QgdmFsdWVfdHlwZSYgX194KQogICAgeyByZXR1cm4gX01fdC5p bnNlcnRfdW5pcXVlKHBvc2l0aW9uLCBfX3gpOyB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJ dGVyYXRvcj4KICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVy YXRvciBfX2xhc3QpIHsKICAgIF9NX3QuaW5zZXJ0X3VuaXF1ZShfX2ZpcnN0LCBfX2xhc3QpOwog IH0KCgoKCgoKCgoKICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pIHsgX01fdC5lcmFz ZShfX3Bvc2l0aW9uKTsgfQogIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlfdHlwZSYgX194KSB7 IHJldHVybiBfTV90LmVyYXNlKF9feCk7IH0KICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3Qs IGl0ZXJhdG9yIF9fbGFzdCkKICAgIHsgX01fdC5lcmFzZShfX2ZpcnN0LCBfX2xhc3QpOyB9CiAg dm9pZCBjbGVhcigpIHsgX01fdC5jbGVhcigpOyB9CgogICAKCiAgaXRlcmF0b3IgZmluZChjb25z dCBrZXlfdHlwZSYgX194KSB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQogIGNvbnN0X2l0ZXJh dG9yIGZpbmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QgeyByZXR1cm4gX01fdC5maW5kKF9f eCk7IH0KICBzaXplX3R5cGUgY291bnQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QgeyByZXR1 cm4gX01fdC5jb3VudChfX3gpOyB9CiAgaXRlcmF0b3IgbG93ZXJfYm91bmQoY29uc3Qga2V5X3R5 cGUmIF9feCkge3JldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IH0KICBjb25zdF9pdGVyYXRv ciBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX01f dC5sb3dlcl9ib3VuZChfX3gpOyAKICB9CiAgaXRlcmF0b3IgdXBwZXJfYm91bmQoY29uc3Qga2V5 X3R5cGUmIF9feCkge3JldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IH0KICBjb25zdF9pdGVy YXRvciB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdCB7CiAgICByZXR1cm4g X01fdC51cHBlcl9ib3VuZChfX3gpOyAKICB9CiAgCiAgcGFpcjxpdGVyYXRvcixpdGVyYXRvcj4g ZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgewogICAgcmV0dXJuIF9NX3QuZXF1YWxf cmFuZ2UoX194KTsKICB9CiAgcGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRvcj4gZXF1 YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9NX3QuZXF1 YWxfcmFuZ2UoX194KTsKICB9CiAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PSA8PiAgKGNvbnN0IG1h cCYsIGNvbnN0IG1hcCYpOwogIGZyaWVuZCBib29sIG9wZXJhdG9yPCA8PiAgKGNvbnN0IG1hcCYs IGNvbnN0IG1hcCYpOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3Mg X0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBtYXA8 X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYgX194LCAKICAgICAgICAgICAgICAgICAgICAgICBj b25zdCBtYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYgX195KSB7CiAgcmV0dXJuIF9feC5f TV90ID09IF9feS5fTV90Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFz cyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgppbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgbWFw PF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4mIF9feCwgCiAgICAgICAgICAgICAgICAgICAgICBj b25zdCBtYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYgX195KSB7CiAgcmV0dXJuIF9feC5f TV90IDwgX195Ll9NX3Q7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xh c3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KaW5saW5lIHZvaWQgc3dhcChtYXA8X0tleSxfVHAs X0NvbXBhcmUsX0FsbG9jPiYgX194LCAKICAgICAgICAgICAgICAgICBtYXA8X0tleSxfVHAsX0Nv bXBhcmUsX0FsbG9jPiYgX195KSB7CiAgX194LnN3YXAoX195KTsKfQoKCgoKCgoKCiAKCgoKIAog CiAKIyAzMyAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9nY2MtbGli L3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMv bWFwIiAyIDMKCiMgMSAiL2hvbWUvdHYvdG9vbHMvZ251L3JzNjAwMC9nY2MtMi45NS4yL2xpYi9n Y2MtbGliL3Bvd2VycGMtaWJtLWFpeDQuMi4xLjAvMi45NS4yLy4uLy4uLy4uLy4uL2luY2x1ZGUv ZysrLTMvc3RsX211bHRpbWFwLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoK CgoKCiAKCgoKCgoKCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21w YXJlID0gbGVzczxfS2V5PiwKICAgICAgICAgIGNsYXNzIF9BbGxvYyA9IGFsbG9jYXRvcjwgX1Rw ID4gID4KCgoKCmNsYXNzIG11bHRpbWFwIHsKcHVibGljOgoKIAoKICB0eXBlZGVmIF9LZXkgICAg ICAgICAgICAgICAgICBrZXlfdHlwZTsKICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICBk YXRhX3R5cGU7CiAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgbWFwcGVkX3R5cGU7CiAg dHlwZWRlZiBwYWlyPGNvbnN0IF9LZXksIF9UcD4gdmFsdWVfdHlwZTsKICB0eXBlZGVmIF9Db21w YXJlICAgICAgICAgICAgICBrZXlfY29tcGFyZTsKCiAgY2xhc3MgdmFsdWVfY29tcGFyZSA6IHB1 YmxpYyBiaW5hcnlfZnVuY3Rpb248dmFsdWVfdHlwZSwgdmFsdWVfdHlwZSwgYm9vbD4gewogIGZy aWVuZCBjbGFzcyBtdWx0aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+OwogIHByb3RlY3Rl ZDoKICAgIF9Db21wYXJlIF9NX2NvbXA7CiAgICB2YWx1ZV9jb21wYXJlKF9Db21wYXJlIF9fYykg OiBfTV9jb21wKF9fYykge30KICBwdWJsaWM6CiAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgdmFs dWVfdHlwZSYgX194LCBjb25zdCB2YWx1ZV90eXBlJiBfX3kpIGNvbnN0IHsKICAgICAgcmV0dXJu IF9NX2NvbXAoX194LmZpcnN0LCBfX3kuZmlyc3QpOwogICAgfQogIH07Cgpwcml2YXRlOgogIHR5 cGVkZWYgX1JiX3RyZWU8a2V5X3R5cGUsIHZhbHVlX3R5cGUsIAogICAgICAgICAgICAgICAgICBf U2VsZWN0MXN0PHZhbHVlX3R5cGU+LCBrZXlfY29tcGFyZSwgX0FsbG9jPiBfUmVwX3R5cGU7CiAg X1JlcF90eXBlIF9NX3Q7ICAgCnB1YmxpYzoKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6 cG9pbnRlciBwb2ludGVyOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9wb2lu dGVyIGNvbnN0X3BvaW50ZXI7CiAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJlZmVyZW5j ZSByZWZlcmVuY2U7CiAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OmNvbnN0X3JlZmVyZW5j ZSBjb25zdF9yZWZlcmVuY2U7CiAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6Oml0ZXJhdG9y IGl0ZXJhdG9yOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9pdGVyYXRvciBj b25zdF9pdGVyYXRvcjsgCiAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJldmVyc2VfaXRl cmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29u c3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOwogIHR5cGVkZWYgdHlw ZW5hbWUgX1JlcF90eXBlOjpzaXplX3R5cGUgc2l6ZV90eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUg X1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgdHlw ZW5hbWUgX1JlcF90eXBlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKCiAKCiAgbXVs dGltYXAoKSA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkgeyB9CiAgZXhwbGlj aXQgbXVsdGltYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKICAgICAgICAgICAgICAgICAgICBj b25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDogX01fdChf X2NvbXAsIF9fYSkgeyB9CgoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgbXVs dGltYXAoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KQogICAg OiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBlKCkpCiAgICB7IF9NX3QuaW5zZXJ0X2Vx dWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9y PgogIG11bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFz dCwKICAgICAgICAgICBjb25zdCBfQ29tcGFyZSYgX19jb21wLAogICAgICAgICAgIGNvbnN0IGFs bG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQogICAgOiBfTV90KF9fY29tcCwg X19hKSB7IF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7IH0KIyAxMjEgIi9ob21l L3R2L3Rvb2xzL2dudS9yczYwMDAvZ2NjLTIuOTUuMi9saWIvZ2NjLWxpYi9wb3dlcnBjLWlibS1h aXg0LjIuMS4wLzIuOTUuMi8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9tdWx0aW1hcC5o IiAzCgoKICBtdWx0aW1hcChjb25zdCBtdWx0aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+ JiBfX3gpIDogX01fdChfX3guX01fdCkgeyB9CiAgbXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUs X0FsbG9jPiYKICBvcGVyYXRvcj0oY29uc3QgbXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0Fs bG9jPiYgX194KSB7CiAgICBfTV90ID0gX194Ll9NX3Q7CiAgICByZXR1cm4gKnRoaXM7IAogIH0K CiAgIAoKICBrZXlfY29tcGFyZSBrZXlfY29tcCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qua2V5X2Nv bXAoKTsgfQogIHZhbHVlX2NvbXBhcmUgdmFsdWVfY29tcCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVl X2NvbXBhcmUoX01fdC5rZXlfY29tcCgpKTsgfQogIGFsbG9jYXRvcl90eXBlIGdldF9hbGxvY2F0 b3IoKSBjb25zdCB7IHJldHVybiBfTV90LmdldF9hbGxvY2F0b3IoKTsgfQoKICBpdGVyYXRvciBi ZWdpbigpIHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQogIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkg Y29uc3QgeyByZXR1cm4gX01fdC5iZWdpbigpOyB9CiAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4g X01fdC5lbmQoKTsgfQogIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9NX3Qu ZW5kKCk7IH0KICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIF9NX3QucmJlZ2lu KCk7IH0KICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9N X3QucmJlZ2luKCk7IH0KICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiBfTV90LnJl bmQoKTsgfQogIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIF9N X3QucmVuZCgpOyB9CiAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZW1wdHkoKTsg fQogIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gX01fdC5zaXplKCk7IH0KICBzaXpl X3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBfTV90Lm1heF9zaXplKCk7IH0KICB2b2lk IHN3YXAobXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYgX194KSB7IF9NX3Quc3dh cChfX3guX01fdCk7IH0KCiAgIAoKICBpdGVyYXRvciBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSYg X194KSB7IHJldHVybiBfTV90Lmluc2VydF9lcXVhbChfX3gpOyB9CiAgaXRlcmF0b3IgaW5zZXJ0 KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IHZhbHVlX3R5cGUmIF9feCkgewogICAgcmV0dXJu IF9NX3QuaW5zZXJ0X2VxdWFsKF9fcG9zaXRpb24sIF9feCk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xh c3MgX0lucHV0SXRlcmF0b3I+CiAgdm9pZCBpbnNlcnQoX0lucHV0SXRlcmF0b3IgX19maXJzdCwg X0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CiAgICBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBf X2xhc3QpOwogIH0KCgoKCgoKCgogIHZvaWQgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikgeyBf TV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CiAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IGtleV90eXBl JiBfX3gpIHsgcmV0dXJuIF9NX3QuZXJhc2UoX194KTsgfQogIHZvaWQgZXJhc2UoaXRlcmF0b3Ig X19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQogICAgeyBfTV90LmVyYXNlKF9fZmlyc3QsIF9fbGFz dCk7IH0KICB2b2lkIGNsZWFyKCkgeyBfTV90LmNsZWFyKCk7IH0KCiAgIAoKICBpdGVyYXRvciBm aW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CiAgY29u c3RfaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdCB7IHJldHVybiBfTV90 LmZpbmQoX194KTsgfQogIHNpemVfdHlwZSBjb3VudChjb25zdCBrZXlfdHlwZSYgX194KSBjb25z dCB7IHJldHVybiBfTV90LmNvdW50KF9feCk7IH0KICBpdGVyYXRvciBsb3dlcl9ib3VuZChjb25z dCBrZXlfdHlwZSYgX194KSB7cmV0dXJuIF9NX3QubG93ZXJfYm91bmQoX194KTsgfQogIGNvbnN0 X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0IHsKICAgIHJl dHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IAogIH0KICBpdGVyYXRvciB1cHBlcl9ib3VuZChj b25zdCBrZXlfdHlwZSYgX194KSB7cmV0dXJuIF9NX3QudXBwZXJfYm91bmQoX194KTsgfQogIGNv bnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0IHsKICAg IHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IAogIH0KICAgcGFpcjxpdGVyYXRvcixpdGVy YXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgewogICAgcmV0dXJuIF9NX3Qu ZXF1YWxfcmFuZ2UoX194KTsKICB9CiAgcGFpcjxjb25zdF9pdGVyYXRvcixjb25zdF9pdGVyYXRv cj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9N X3QuZXF1YWxfcmFuZ2UoX194KTsKICB9CiAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PSA8PiAgKGNv bnN0IG11bHRpbWFwJiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCBtdWx0aW1hcCYpOwogIGZyaWVuZCBib29sIG9wZXJhdG9yPCA8PiAgKGNvbnN0 IG11bHRpbWFwJiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNvbnN0IG11bHRpbWFwJik7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBj bGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0 IG11bHRpbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4mIF9feCwgCiAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgbXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYgX195KSB7 CiAgcmV0dXJuIF9feC5fTV90ID09IF9feS5fTV90Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwg Y2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgppbmxpbmUgYm9vbCBvcGVy YXRvcjwoY29uc3QgbXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYgX194LCAKICAg ICAgICAgICAgICAgICAgICAgIGNvbnN0IG11bHRpbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxv Yz4mIF9feSkgewogIHJldHVybiBfX3guX01fdCA8IF9feS5fTV90Owp9CgoKCnRlbXBsYXRlIDxj bGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CmlubGlu ZSB2b2lkIHN3YXAobXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYgX194LCAKICAg ICAgICAgICAgICAgICBtdWx0aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3kpIHsK ICBfX3guc3dhcChfX3kpOwp9CgoKCgoKCgoKIAoKCgogCiAKIAojIDM0ICIvaG9tZS90di90b29s cy9nbnUvcnM2MDAwL2djYy0yLjk1LjIvbGliL2djYy1saWIvcG93ZXJwYy1pYm0tYWl4NC4yLjEu MC8yLjk1LjIvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9tYXAiIDIgMwoKCgoKIAogCiAKIyAz ICJ0djI3MzcuY3h4IiAyCgojIDEgIi91c3IvaW5jbHVkZS9zaWduYWwuaCIgMSAzIDQKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgNCAidHYyNzM3 LmN4eCIgMgoKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2b2lkIGVuYWJsZV9jb3JlXyAoKQp7CiAg c3RydWN0IHNpZ2FjdGlvbiBzYTsKCiAgc2lnYWN0aW9uICgxMSAsIDAsICZzYSk7CiAgc2Euc2Ff ZmxhZ3MgfD0gMHgwMDAwMDA0MCA7CiAgc2lnYWN0aW9uICgxMSAsICZzYSwgMCk7CgogIHNpZ2Fj dGlvbiAoMTAgLCAwLCAmc2EpOwogIHNhLnNhX2ZsYWdzIHw9IDB4MDAwMDAwNDAgOwogIHNpZ2Fj dGlvbiAoMTAgLCAmc2EsIDApOwp9Cgp2b2lkIG1hcF9kZW1vKCk7CgppbnQgbWFpbigpCnsKICBl bmFibGVfY29yZV8gKCk7CiAgbWFwX2RlbW8oKTsKfQoKdm9pZCBtYXBfZGVtbygpCnsKICAgdHlw ZWRlZiBtYXA8c3RyaW5nLCBmbG9hdD4gU3RyaW5nRmxvYXRNYXA7CiAgIFN0cmluZ0Zsb2F0TWFw IGNvbGw7CiAgIFN0cmluZ0Zsb2F0TWFwOjppdGVyYXRvciBwb3M7CiAgIAogICAgCiAgIGNvbGxb IlZBVCJdID0gMC4xNzU7CiAgIGNvbGxbIlBpIl0gID0gMy4xNDE1OTI2NTM1OwogICBjb2xsWyJh biBhcmJpdHJhcnkgbnVtYmVyIl0gPSA0OTgzLjIyMzsKICAgY29sbFsiTnVsbCJdID0gMDsKICAg CiAgICAKICAgZm9yIChwb3MgPSBjb2xsLmJlZ2luKCk7IHBvcyAhPSBjb2xsLmVuZCgpOyArK3Bv cykgewogICAgIGNvdXQgPDwgImtleTogXCIiIDw8IHBvcy0+Zmlyc3QgPDwgIlwiICIKICAgICAg ICAgIDw8ICJ2YWx1ZTogIiA8PCBwb3MtPnNlY29uZCA8PGVuZGw7CiAgIH0gCiAgIAogICAqKGlu dCAqKTAgPSAxOwp9Cg==