Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tUuGz-003k0F-IT for pgsql-hackers@arkaria.postgresql.org; Mon, 06 Jan 2025 21:04:30 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tUuGy-00DBzg-V2 for pgsql-hackers@arkaria.postgresql.org; Mon, 06 Jan 2025 21:04:28 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tUuFB-00CyfW-1r for pgsql-hackers@lists.postgresql.org; Mon, 06 Jan 2025 21:02:36 +0000 Received: from relay3-d.mail.gandi.net ([217.70.183.195]) by magus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1tUuF6-000E4m-2f for pgsql-hackers@postgresql.org; Mon, 06 Jan 2025 21:02:36 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id 16CD260002; Mon, 6 Jan 2025 21:02:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vondra.me; s=gm1; t=1736197350; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=h1daU7AZRwk486E6BwAuk1mIR9KELxZzkMaLsIlfdII=; b=mfm++/bFMs4HKQW4JjuHBL04CjedFF8aNdUc37Rlc3Kj1xD8ObAFMD5J29kCp55bMDd3lT 38fewHADKOPB0tueBzvXnF9GLz2eSJpyajcjh6WNePwG59jZ2yCyL4XDdKl7vMt9kCAiqb SDSlLYdNd7mt2vkw7X+fP3oEG9I+e9fXxyDFS8Yug94KSVi05WQOxfduoylKMhjhi9n16F 4d+zkYXkK9A0xs0AJXLJRFyUpM/c4cmnxN2mLu3c+6SZ/ZNyfm3z1ZrsT5zIxHlC/IvTon 0wPDhpvxuXfrSKIh4iICS4V0phvN2+9Xtoaraozj3Oesqh4W2CPSUlfRrIfe2g== Content-Type: multipart/mixed; boundary="------------0AyQ79lCUO75yOC3vfsys20E" Message-ID: <5a899047-65fc-47c5-9c35-1035f44956c6@vondra.me> Date: Mon, 6 Jan 2025 22:02:28 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Enhancing Memory Context Statistics Reporting To: Rahila Syed , torikoshia Cc: PostgreSQL-development References: <202411141148.vqxmwtn2ln25@alvherre.pgsql> <7d4db5cf-8d72-4ee1-8f2e-f88ef9615f27@vondra.me> <637b3ae3-b9eb-4d83-a942-5f7483911ea4@vondra.me> <29ced66e28ec696d1ac29747bd901df2@oss.nttdata.com> Content-Language: en-US From: Tomas Vondra In-Reply-To: X-GND-Sasl: tomas@vondra.me List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------0AyQ79lCUO75yOC3vfsys20E Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi Rahila, Thanks for the updated and rebased patch. I've tried the pgbench test again, to see if it gets stuck somewhere, and I'm observing this on a new / idle cluster: $ pgbench -n -f test.sql -P 1 test -T 60 pgbench (18devel) progress: 1.0 s, 1647.9 tps, lat 0.604 ms stddev 0.438, 0 failed progress: 2.0 s, 1374.3 tps, lat 0.727 ms stddev 0.386, 0 failed progress: 3.0 s, 1514.4 tps, lat 0.661 ms stddev 0.330, 0 failed progress: 4.0 s, 1563.4 tps, lat 0.639 ms stddev 0.212, 0 failed progress: 5.0 s, 1665.0 tps, lat 0.600 ms stddev 0.177, 0 failed progress: 6.0 s, 1538.0 tps, lat 0.650 ms stddev 0.192, 0 failed progress: 7.0 s, 1491.4 tps, lat 0.670 ms stddev 0.261, 0 failed progress: 8.0 s, 1539.5 tps, lat 0.649 ms stddev 0.443, 0 failed progress: 9.0 s, 1517.0 tps, lat 0.659 ms stddev 0.167, 0 failed progress: 10.0 s, 1594.0 tps, lat 0.627 ms stddev 0.227, 0 failed progress: 11.0 s, 28.0 tps, lat 0.705 ms stddev 0.277, 0 failed progress: 12.0 s, 0.0 tps, lat 0.000 ms stddev 0.000, 0 failed progress: 13.0 s, 0.0 tps, lat 0.000 ms stddev 0.000, 0 failed progress: 14.0 s, 0.0 tps, lat 0.000 ms stddev 0.000, 0 failed progress: 15.0 s, 0.0 tps, lat 0.000 ms stddev 0.000, 0 failed progress: 16.0 s, 1480.6 tps, lat 4.043 ms stddev 130.113, 0 failed progress: 17.0 s, 1524.9 tps, lat 0.655 ms stddev 0.286, 0 failed progress: 18.0 s, 1246.0 tps, lat 0.802 ms stddev 0.330, 0 failed progress: 19.0 s, 1383.1 tps, lat 0.722 ms stddev 0.934, 0 failed progress: 20.0 s, 1432.7 tps, lat 0.698 ms stddev 0.199, 0 failed ... There's always a period of 10-15 seconds when everything seems to be working fine, and then a couple seconds when it gets stuck, with the usual LOG: Wait for 69454 process to publish stats timed out, trying again The PIDs I've seen were for checkpointer, autovacuum launcher, ... all of that are processes that should be handling the signal, so how come it gets stuck every now and then? The system is entirely idle, there's no contention for the shmem stuff, etc. Could it be forgetting about the signal in some cases, or something like that? The test.sql is super simple: SELECT * FROM pg_get_process_memory_contexts( (SELECT pid FROM pg_stat_activity WHERE pid != pg_backend_pid() ORDER BY random() LIMIT 1) , false); Aside from this, I went through the patch to do a regular review, so here's the main comments in somewhat random order: 1) The SGML docs talk about "contexts at level" but I don't think that's defined/explained anywhere, there are different ways to assign levels in a tree-like structure, so it's unclear if levels are assigned from the top or bottom. 2) volatile sig_atomic_t PublishMemoryContextPending = false; I'd move this right after LogMemoryContextPending (to match the other places that add new stuff). 3) typedef enum PrintDetails I suppose this should have some comments, explaining what the typedef is for. Also, "details" sounds pretty generic, perhaps "destination" or maybe "target" would be better? 4) The memcpy here seems unnecessary - the string is going to be static in the binary, no need to copy it. In which case the whole switch is going to be the same as in PutMemoryContextsStatsTupleStore, so maybe move that into a separate function? + switch (context->type) + { + case T_AllocSetContext: + type = "AllocSet"; + strncpy(memctx_info[curr_id].type, type, strlen(type)); + break; + case T_GenerationContext: + type = "Generation"; + strncpy(memctx_info[curr_id].type, type, strlen(type)); + break; + case T_SlabContext: + type = "Slab"; + strncpy(memctx_info[curr_id].type, type, strlen(type)); + break; + case T_BumpContext: + type = "Bump"; + strncpy(memctx_info[curr_id].type, type, strlen(type)); + break; + default: + type = "???"; + strncpy(memctx_info[curr_id].type, type, strlen(type)); + break; + } 5) The comment about hash table in ProcessGetMemoryContextInterrupt seems pretty far from hash_create(), so maybe move it. 6) ProcessGetMemoryContextInterrupt seems pretty long / complex, with multiple nested loops, it'd be good to split it into smaller parts that are easier to understand. 7) I'm not sure if/why we need to move MemoryContextId to memutils.h. 8) The new stuff in memutils.h is added to the wrong place, into a section labeled "Memory-context-type-specific functions" (which it certainly is not) 9) autovacuum.c adds the ProcessGetMemoryContextInterrupt() call after ProcessCatchupInterrupt() - that's not wrong, but I'd move it right after ProcessLogMemoryContextInterrupt(), just like everywhere else. 10) The pg_get_process_memory_contexts comment says: Signal a backend or an auxiliary process to send its ... But this is not just about the signal, it also waits for the results and produces the result set. 11) pg_get_process_memory_contexts - Wouldn't it be better to move the InitMaterializedSRF() call until after the privilege check, etc.? 12) The pg_get_process_memory_contexts comment should explain why it's superuser-only function. Presumably it has similar DoS risks as the other functions, because if not why would we have the restriction? 13) I reworded and expanded the pg_get_process_memory_contexts comment a bit, and re-wrapped it too. But I think it also needs to explain how it communicates with the other process (sending signal, sending data through a DSA, ...). And also how the timeouts work. 14) I'm a bit confused about the DSA allocations (but I also haven't worked with DSA very much, so maybe it's fine). Presumably the 16MB is upper limit, we won't use that all the time. We allocate 1MB, but allow it to grow up to 16MB, correct? 16MB seems like a lot, certainly enough for this purpose - if it's not, I don't think we can come up with a better limit. 15) In any case, I don't think the 16 should be hardcoded as a magic constant in multiple places. That's bound to be error-prone. 16) I've reformatted / reindented / wrapped the code in various places, to make it easier to read and more consistent with the nearby code. I also added a bunch of comments explaining what the block of code is meant to do (I mean, what it aims to do). 16) A comment in pg_get_process_memory_contexts says: Pin the mapping so that it doesn't throw a warning That doesn't seem very useful. It's not clear what kind of warning this hides, but more importantly - we're not doing stuff to hide some sort of warning, we do it to prevent what the warning is about. 17) pg_get_process_memory_contexts has a bunch of error cases, where we need to detach the DSA and return NULL. Would be better to do a label with a goto, I think. 18) I think pg_get_process_memory_contexts will have issues if this happens in the first loop: if ((memCtxState[procNumber].proc_id == pid) && DsaPointerIsValid(memCtxState[procNumber].memstats_dsa_pointer)) break; Because then we end up with memctx_info pointing to garbage after the loop. I don't know how hard is to hit this, I guess it can happen in many processes calling pg_get_process_memory_contexts? 19) Minor comment and formatting of MemCtxShmemSize / MemCtxShmemInit. 20) MemoryContextInfo etc. need to be added to typedefs.list, so that pgindent can do the right thing. 21) I think ProcessGetMemoryContextInterrupt has a bug because it uses get_summary before reading it from the shmem. Attached are two patches - 0001 is the original patch, 0002 has most of my review comments (mentioned above), and a couple additional changes to comments/formatting, etc. Those are suggestions rather than issues. regards -- Tomas Vondra --------------0AyQ79lCUO75yOC3vfsys20E Content-Type: text/x-patch; charset=UTF-8; name="vtomas-0001-Function-to-report-memory-context-stats-of-an.patch" Content-Disposition: attachment; filename*0="vtomas-0001-Function-to-report-memory-context-stats-of-an.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBiZTEyODAzZThkYmM2NzE1OTVmNzk0NTY5M2IzZjcwYWJiMmI4NzQ1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBSYWhpbGEgU3llZCA8cmFoaWxhc3llZC45MEBnbWFp bC5jb20+CkRhdGU6IFN1biwgMTUgU2VwIDIwMjQgMTc6NTY6MDYgKzA1MzAKU3ViamVjdDog W1BBVENIIHZ0b21hcyAxLzJdIEZ1bmN0aW9uIHRvIHJlcG9ydCBtZW1vcnkgY29udGV4dCBz dGF0cyBvZiBhbnkKIGJhY2tlbmQKClRoaXMgZnVuY3Rpb24gc2VuZHMgYSBzaWduYWwgdG8g YSBiYWNrZW5kIHRvIHB1Ymxpc2gKc3RhdGlzdGljcyBvZiBhbGwgaXRzIG1lbW9yeSBjb250 ZXh0cy4gU2lnbmFsIGhhbmRsZXIKc2V0cyBhIGZsYWcsIHdoaWNoIGNhdXNlcyB0aGUgcmVs ZXZhbnQgYmFja2VuZCB0byBjb3B5IGl0cwpNZW1vcnlDb250ZXh0U3RhdHMgdG8gYSBEU0Es IGFzIHBhcnQKb2YgbmV4dCBDSEVDS19GT1JfSU5URVJSVVBUUygpLgpJdCB0aGVyZSBhcmUg bW9yZSB0aGF0IDE2TUIgd29ydGggb2Ygc3RhdGlzdGljcywgdGhlCnJlbWFpbmluZyBzdGF0 aXN0aWNzIGFyZSBjb3BpZWQgYXMgYSBjdW11bGF0aXZlCnRvdGFsIG9mIHRoZSByZW1haW5p bmcgY29udGV4dHMuCk9uY2UgaXRzIGRvbmUsIGl0IHNpZ25hbHMgdGhlIGNsaWVudCBiYWNr ZW5kIHVzaW5nCmEgY29uZGl0aW9uIHZhcmlhYmxlLiBUaGUgY2xpZW50IGJhY2tlbmQKdGhl biB3YWtlcyB1cCwgcmVhZHMgdGhlIHNoYXJlZCBtZW1vcnkgYW5kCnJldHVybnMgdGhlc2Ug dmFsdWVzIGluIHRoZSBmb3JtIG9mIHNldCBvZiByZWNvcmRzLApvbmUgZm9yIGVhY2ggbWVt b3J5IGNvbnRleHQsIHRvIHRoZSB1c2VyLCBmb2xsb3dlZApieSBhIGN1bXVsYXRpdmUgdG90 YWwgb2YgdGhlIHJlbWFpbmluZyBjb250ZXh0cywKaWYgYW55LgoKRWFjaCBiYWNrZW5kIGFu ZCBhdXhpbGlhcnkgcHJvY2VzcyBoYXMgaXRzIG93biBzbG90CmZvciByZXBvcnRpbmcgdGhl IHN0YXRzLiBUaGVyZSBpcyBhbiBhcnJheSBvZiBzdWNoCm1lbW9yeSBzbG90cyBvZiBzaXpl IE1heEJhY2tlbmRzK051bW9mQXV4aWxpYXJ5CnByb2Nlc3NlcyBpbiBmaXhlZCBzaGFyZWQg bWVtb3J5LiBFYWNoIG9mIHRoZXNlIHNsb3RzIHBvaW50CnRvIGEgRFNBLCB3aGljaCBjb250 YWlucyB0aGUgc3RhdHMgdG8gYmUgc2hhcmVkIGJ5IHRoZQpjb3JyZXNwb25kaW5nIHByb2Nl c3MuCkVhY2ggc2xvdCBoYXMgaXRzIG93biBMVyBsb2NrIGFuZCBjb25kaXRpb24gdmFyaWFi bGUgZm9yCnN5bmNocm9uaXphdGlvbiBhbmQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZQpw dWJsaXNoaW5nIHByb2Nlc3MgYW5kIHRoZSBjbGllbnQgYmFja2VuZC4KLS0tCiBkb2Mvc3Jj L3NnbWwvZnVuYy5zZ21sICAgICAgICAgICAgICAgICAgICAgICAgfCAgMjYgKysKIHNyYy9i YWNrZW5kL3Bvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5jICAgICAgICAgICB8ICAgNCArCiBzcmMv YmFja2VuZC9wb3N0bWFzdGVyL2NoZWNrcG9pbnRlci5jICAgICAgICAgfCAgIDQgKwogc3Jj L2JhY2tlbmQvcG9zdG1hc3Rlci9pbnRlcnJ1cHQuYyAgICAgICAgICAgIHwgICA0ICsKIHNy Yy9iYWNrZW5kL3Bvc3RtYXN0ZXIvcGdhcmNoLmMgICAgICAgICAgICAgICB8ICAgNCArCiBz cmMvYmFja2VuZC9wb3N0bWFzdGVyL3N0YXJ0dXAuYyAgICAgICAgICAgICAgfCAgIDQgKwog c3JjL2JhY2tlbmQvcG9zdG1hc3Rlci93YWxzdW1tYXJpemVyLmMgICAgICAgIHwgICA0ICsK IHNyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2kuYyAgICAgICAgICAgICAgICB8ICAgMiAr CiBzcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9wcm9jc2lnbmFsLmMgICAgICAgICAgfCAgIDMg Kwogc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jICAgICAgICAgICAgICAgICAgIHwgICAz ICsKIC4uLi91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50X25hbWVzLnR4dCAgICAgICB8ICAg MSArCiBzcmMvYmFja2VuZC91dGlscy9hZHQvbWN4dGZ1bmNzLmMgICAgICAgICAgICAgfCAy NzQgKysrKysrKysrKy0KIHNyYy9iYWNrZW5kL3V0aWxzL2luaXQvZ2xvYmFscy5jICAgICAg ICAgICAgICB8ICAgMSArCiBzcmMvYmFja2VuZC91dGlscy9tbWdyL21jeHQuYyAgICAgICAg ICAgICAgICAgfCA0MjQgKysrKysrKysrKysrKysrKystCiBzcmMvaW5jbHVkZS9jYXRhbG9n L3BnX3Byb2MuZGF0ICAgICAgICAgICAgICAgfCAgMTAgKwogc3JjL2luY2x1ZGUvbWlzY2Fk bWluLmggICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKIHNyYy9pbmNsdWRlL3N0b3Jh Z2UvcHJvY3NpZ25hbC5oICAgICAgICAgICAgICB8ICAgMSArCiBzcmMvaW5jbHVkZS91dGls cy9tZW11dGlscy5oICAgICAgICAgICAgICAgICAgfCAgNTEgKysrCiBzcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dCAgICAgICAgfCAgMTIgKwogc3JjL3Rlc3QvcmVn cmVzcy9zcWwvc3lzdmlld3Muc3FsICAgICAgICAgICAgIHwgIDEyICsKIDIwIGZpbGVzIGNo YW5nZWQsIDgyMiBpbnNlcnRpb25zKCspLCAyMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9kb2Mvc3JjL3NnbWwvZnVuYy5zZ21sIGIvZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbAppbmRl eCA0NzM3MGU1ODFhZS4uNWQwMzk5NTA4ZWEgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9m dW5jLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbApAQCAtMjgzNTgsNiArMjgz NTgsMzIgQEAgYWNsICAgICAgfCB7cG9zdGdyZXM9YXJ3ZER4dG0vcG9zdGdyZXMsZm9vPXIv cG9zdGdyZXN9CiAgICAgICAgPC9wYXJhPjwvZW50cnk+CiAgICAgICA8L3Jvdz4KIAorICAg ICAgPHJvdz4KKyAgICAgICA8ZW50cnkgcm9sZT0iZnVuY190YWJsZV9lbnRyeSI+PHBhcmEg cm9sZT0iZnVuY19zaWduYXR1cmUiPgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAg PHByaW1hcnk+cGdfZ2V0X3Byb2Nlc3NfbWVtb3J5X2NvbnRleHRzPC9wcmltYXJ5PgorICAg ICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGZ1bmN0aW9uPnBnX2dldF9wcm9jZXNzX21l bW9yeV9jb250ZXh0czwvZnVuY3Rpb24+ICggPHBhcmFtZXRlcj5waWQ8L3BhcmFtZXRlcj4g PHR5cGU+aW50ZWdlcjwvdHlwZT4sIDxwYXJhbWV0ZXI+Z2V0X3N1bW1hcnk8L3BhcmFtZXRl cj4gPHR5cGU+Ym9vbGVhbjwvdHlwZT4gKQorICAgICAgICA8cmV0dXJudmFsdWU+c2V0b2Yg cmVjb3JkPC9yZXR1cm52YWx1ZT4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+Cisg ICAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZXF1ZXN0cyB0byBkaXNwbGF5IHRoZSBt ZW1vcnkgY29udGV4dHMgb2YgYQorICAgICAgICBQb3N0Z3JlU1FMIHByb2Nlc3Mgd2l0aCB0 aGUgc3BlY2lmaWVkIHByb2Nlc3MgSUQgKFBJRCkuIEl0IHRha2VzIHR3bworICAgICAgICBh cmd1bWVudHM6IFBJRCBhbmQgYSBib29sZWFuLCBnZXRfc3VtbWFyeS4gVGhlIGZ1bmN0aW9u IGNhbiBzZW5kIHJlcXVlc3RzCisgICAgICAgIHRvIGJvdGggYmFja2VuZCBhbmQgYXV4aWxp YXJ5IHByb2Nlc3Nlcy4KKworICAgICAgICBBZnRlciByZWNlaXZpbmcgbWVtb3J5IGNvbnRl eHQgc3RhdGlzdGljcyBmcm9tIHRoZSB0YXJnZXQgcHJvY2VzcywgaXQKKyAgICAgICAgcmV0 dXJucyB0aGUgcmVzdWx0cyBhcyBvbmUgcm93IHBlciBjb250ZXh0LiBUaGUgbnVtX2FnZ19j b250ZXh0cyBjb2x1bW4KKyAgICAgICAgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY29udGV4 dHMgYWdncmVnYXRlZCBpbiB0aGUgZGlzcGxheWVkIHN0YXRpc3RpY3MuCisKKyAgICAgICAg V2hlbiBnZXRfc3VtbWFyeSBpcyBzZXQgdG8gdHJ1ZSwgbWVtb3J5IGNvbnRleHQgc3RhdGlz dGljcyBhdCBsZXZlbHMgMSBhbmQgMiwKKyAgICAgICAgYXJlIGRpc3BsYXllZCB3aXRoIGVh Y2ggbGV2ZWwgMiBjb250ZXh0IHNob3dpbmcgYSBjdW11bGF0aXZlIHRvdGFsIG9mIGFsbAor ICAgICAgICBpdHMgY2hpbGQgY29udGV4dHMuCisgICAgICAgIFdoZW4gZ2V0X3N1bW1hcnkg aXMgc2V0IHRvIGZhbHNlLCB0aGUgbnVtX2FnZ19jb250ZXh0cyB2YWx1ZSBpcyAxLCBpbmRp Y2F0aW5nCisgICAgICAgIHRoYXQgaW5kaXZpZHVhbCBzdGF0aXN0aWNzIGFyZSBiZWluZyBk aXNwbGF5ZWQuCisgICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4KKwogICAg ICAgPHJvdz4KICAgICAgICA8ZW50cnkgcm9sZT0iZnVuY190YWJsZV9lbnRyeSI+PHBhcmEg cm9sZT0iZnVuY19zaWduYXR1cmUiPgogICAgICAgICA8aW5kZXh0ZXJtPgpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9hdXRvdmFjdXVtLmMgYi9zcmMvYmFja2VuZC9w b3N0bWFzdGVyL2F1dG92YWN1dW0uYwppbmRleCAzZjgyNjUzMmI4OC4uZWI0Yzk4YTE3YmMg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5jCisrKyBi L3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5jCkBAIC03NjgsNiArNzY4LDEw IEBAIEhhbmRsZUF1dG9WYWNMYXVuY2hlckludGVycnVwdHModm9pZCkKIAogCS8qIFByb2Nl c3Mgc2ludmFsIGNhdGNodXAgaW50ZXJydXB0cyB0aGF0IGhhcHBlbmVkIHdoaWxlIHNsZWVw aW5nICovCiAJUHJvY2Vzc0NhdGNodXBJbnRlcnJ1cHQoKTsKKworCS8qIFB1Ymxpc2ggbWVt b3J5IGNvbnRleHRzIG9mIHRoaXMgcHJvY2VzcyAqLworCWlmIChQdWJsaXNoTWVtb3J5Q29u dGV4dFBlbmRpbmcpCisJCVByb2Nlc3NHZXRNZW1vcnlDb250ZXh0SW50ZXJydXB0KCk7CiB9 CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL2NoZWNrcG9pbnRl ci5jIGIvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9jaGVja3BvaW50ZXIuYwppbmRleCA5YmZk MGZkNjY1Yy4uZWU4MzYwYWQ2ZmEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3Bvc3RtYXN0 ZXIvY2hlY2twb2ludGVyLmMKKysrIGIvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9jaGVja3Bv aW50ZXIuYwpAQCAtNjE2LDYgKzYxNiwxMCBAQCBIYW5kbGVDaGVja3BvaW50ZXJJbnRlcnJ1 cHRzKHZvaWQpCiAJLyogUGVyZm9ybSBsb2dnaW5nIG9mIG1lbW9yeSBjb250ZXh0cyBvZiB0 aGlzIHByb2Nlc3MgKi8KIAlpZiAoTG9nTWVtb3J5Q29udGV4dFBlbmRpbmcpCiAJCVByb2Nl c3NMb2dNZW1vcnlDb250ZXh0SW50ZXJydXB0KCk7CisKKwkvKiBQdWJsaXNoIG1lbW9yeSBj b250ZXh0cyBvZiB0aGlzIHByb2Nlc3MgKi8KKwlpZiAoUHVibGlzaE1lbW9yeUNvbnRleHRQ ZW5kaW5nKQorCQlQcm9jZXNzR2V0TWVtb3J5Q29udGV4dEludGVycnVwdCgpOwogfQogCiAv KgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9pbnRlcnJ1cHQuYyBiL3Ny Yy9iYWNrZW5kL3Bvc3RtYXN0ZXIvaW50ZXJydXB0LmMKaW5kZXggYmU2OWU0YzcxMzYuLjk0 ODFhNWNkMjQxIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL2ludGVycnVw dC5jCisrKyBiL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvaW50ZXJydXB0LmMKQEAgLTQ4LDYg KzQ4LDEwIEBAIEhhbmRsZU1haW5Mb29wSW50ZXJydXB0cyh2b2lkKQogCS8qIFBlcmZvcm0g bG9nZ2luZyBvZiBtZW1vcnkgY29udGV4dHMgb2YgdGhpcyBwcm9jZXNzICovCiAJaWYgKExv Z01lbW9yeUNvbnRleHRQZW5kaW5nKQogCQlQcm9jZXNzTG9nTWVtb3J5Q29udGV4dEludGVy cnVwdCgpOworCisJLyogUHVibGlzaCBtZW1vcnkgY29udGV4dHMgb2YgdGhpcyBwcm9jZXNz ICovCisJaWYgKFB1Ymxpc2hNZW1vcnlDb250ZXh0UGVuZGluZykKKwkJUHJvY2Vzc0dldE1l bW9yeUNvbnRleHRJbnRlcnJ1cHQoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL3Bvc3RtYXN0ZXIvcGdhcmNoLmMgYi9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3BnYXJj aC5jCmluZGV4IDEyZWU4MTVhNjI2Li5jZDFlY2I2YjkzZCAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvcG9zdG1hc3Rlci9wZ2FyY2guYworKysgYi9zcmMvYmFja2VuZC9wb3N0bWFzdGVy L3BnYXJjaC5jCkBAIC04NjUsNiArODY1LDEwIEBAIEhhbmRsZVBnQXJjaEludGVycnVwdHMo dm9pZCkKIAlpZiAoTG9nTWVtb3J5Q29udGV4dFBlbmRpbmcpCiAJCVByb2Nlc3NMb2dNZW1v cnlDb250ZXh0SW50ZXJydXB0KCk7CiAKKwkvKiBQdWJsaXNoIG1lbW9yeSBjb250ZXh0cyBv ZiB0aGlzIHByb2Nlc3MgKi8KKwlpZiAoUHVibGlzaE1lbW9yeUNvbnRleHRQZW5kaW5nKQor CQlQcm9jZXNzR2V0TWVtb3J5Q29udGV4dEludGVycnVwdCgpOworCiAJaWYgKENvbmZpZ1Jl bG9hZFBlbmRpbmcpCiAJewogCQljaGFyCSAgICphcmNoaXZlTGliID0gcHN0cmR1cChYTG9n QXJjaGl2ZUxpYnJhcnkpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9z dGFydHVwLmMgYi9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3N0YXJ0dXAuYwppbmRleCA1OWQy MTMwMzFiMy4uZDY3MDk1NGM0ZTkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3Bvc3RtYXN0 ZXIvc3RhcnR1cC5jCisrKyBiL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvc3RhcnR1cC5jCkBA IC0xOTIsNiArMTkyLDEwIEBAIEhhbmRsZVN0YXJ0dXBQcm9jSW50ZXJydXB0cyh2b2lkKQog CS8qIFBlcmZvcm0gbG9nZ2luZyBvZiBtZW1vcnkgY29udGV4dHMgb2YgdGhpcyBwcm9jZXNz ICovCiAJaWYgKExvZ01lbW9yeUNvbnRleHRQZW5kaW5nKQogCQlQcm9jZXNzTG9nTWVtb3J5 Q29udGV4dEludGVycnVwdCgpOworCisJLyogUHVibGlzaCBtZW1vcnkgY29udGV4dHMgb2Yg dGhpcyBwcm9jZXNzICovCisJaWYgKFB1Ymxpc2hNZW1vcnlDb250ZXh0UGVuZGluZykKKwkJ UHJvY2Vzc0dldE1lbW9yeUNvbnRleHRJbnRlcnJ1cHQoKTsKIH0KIAogCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3dhbHN1bW1hcml6ZXIuYyBiL3NyYy9iYWNrZW5k L3Bvc3RtYXN0ZXIvd2Fsc3VtbWFyaXplci5jCmluZGV4IGZmYmYwNDM5MzU4Li5iMWE1ZTg2 YTg1YyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci93YWxzdW1tYXJpemVy LmMKKysrIGIvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci93YWxzdW1tYXJpemVyLmMKQEAgLTg3 Niw2ICs4NzYsMTAgQEAgSGFuZGxlV2FsU3VtbWFyaXplckludGVycnVwdHModm9pZCkKIAkv KiBQZXJmb3JtIGxvZ2dpbmcgb2YgbWVtb3J5IGNvbnRleHRzIG9mIHRoaXMgcHJvY2VzcyAq LwogCWlmIChMb2dNZW1vcnlDb250ZXh0UGVuZGluZykKIAkJUHJvY2Vzc0xvZ01lbW9yeUNv bnRleHRJbnRlcnJ1cHQoKTsKKworCS8qIFB1Ymxpc2ggbWVtb3J5IGNvbnRleHRzIG9mIHRo aXMgcHJvY2VzcyAqLworCWlmIChQdWJsaXNoTWVtb3J5Q29udGV4dFBlbmRpbmcpCisJCVBy b2Nlc3NHZXRNZW1vcnlDb250ZXh0SW50ZXJydXB0KCk7CiB9CiAKIC8qCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9pcGNpLmMgYi9zcmMvYmFja2VuZC9zdG9yYWdl L2lwYy9pcGNpLmMKaW5kZXggMTc0ZWVkNzAzNjcuLjRhNzBlYWJmN2YzIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9pcGNpLmMKKysrIGIvc3JjL2JhY2tlbmQvc3Rv cmFnZS9pcGMvaXBjaS5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSAic3RvcmFnZS9z aW52YWxhZHQuaCIKICNpbmNsdWRlICJ1dGlscy9ndWMuaCIKICNpbmNsdWRlICJ1dGlscy9p bmplY3Rpb25fcG9pbnQuaCIKKyNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogCiAvKiBH VUNzICovCiBpbnQJCQlzaGFyZWRfbWVtb3J5X3R5cGUgPSBERUZBVUxUX1NIQVJFRF9NRU1P UllfVFlQRTsKQEAgLTM0MCw2ICszNDEsNyBAQCBDcmVhdGVPckF0dGFjaFNobWVtU3RydWN0 cyh2b2lkKQogCVN0YXRzU2htZW1Jbml0KCk7CiAJV2FpdEV2ZW50Q3VzdG9tU2htZW1Jbml0 KCk7CiAJSW5qZWN0aW9uUG9pbnRTaG1lbUluaXQoKTsKKwlNZW1DdHhTaG1lbUluaXQoKTsK IH0KIAogLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3Byb2NzaWdu YWwuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3Byb2NzaWduYWwuYwppbmRleCA3NDAx YjZlNjI1ZS4uZTQyNWI5ZWViMDMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uv aXBjL3Byb2NzaWduYWwuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9wcm9jc2ln bmFsLmMKQEAgLTY4OCw2ICs2ODgsOSBAQCBwcm9jc2lnbmFsX3NpZ3VzcjFfaGFuZGxlcihT SUdOQUxfQVJHUykKIAlpZiAoQ2hlY2tQcm9jU2lnbmFsKFBST0NTSUdfTE9HX01FTU9SWV9D T05URVhUKSkKIAkJSGFuZGxlTG9nTWVtb3J5Q29udGV4dEludGVycnVwdCgpOwogCisJaWYg KENoZWNrUHJvY1NpZ25hbChQUk9DU0lHX0dFVF9NRU1PUllfQ09OVEVYVCkpCisJCUhhbmRs ZUdldE1lbW9yeUNvbnRleHRJbnRlcnJ1cHQoKTsKKwogCWlmIChDaGVja1Byb2NTaWduYWwo UFJPQ1NJR19QQVJBTExFTF9BUFBMWV9NRVNTQUdFKSkKIAkJSGFuZGxlUGFyYWxsZWxBcHBs eU1lc3NhZ2VJbnRlcnJ1cHQoKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdGNvcC9w b3N0Z3Jlcy5jIGIvc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jCmluZGV4IGMwMWNmZjlk NjUwLi4wZWFlOWJlMTIyYiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jl cy5jCisrKyBiL3NyYy9iYWNrZW5kL3Rjb3AvcG9zdGdyZXMuYwpAQCAtMzQ5Nyw2ICszNDk3 LDkgQEAgUHJvY2Vzc0ludGVycnVwdHModm9pZCkKIAlpZiAoTG9nTWVtb3J5Q29udGV4dFBl bmRpbmcpCiAJCVByb2Nlc3NMb2dNZW1vcnlDb250ZXh0SW50ZXJydXB0KCk7CiAKKwlpZiAo UHVibGlzaE1lbW9yeUNvbnRleHRQZW5kaW5nKQorCQlQcm9jZXNzR2V0TWVtb3J5Q29udGV4 dEludGVycnVwdCgpOworCiAJaWYgKFBhcmFsbGVsQXBwbHlNZXNzYWdlUGVuZGluZykKIAkJ SGFuZGxlUGFyYWxsZWxBcHBseU1lc3NhZ2VzKCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50X25hbWVzLnR4dCBiL3NyYy9iYWNrZW5k L3V0aWxzL2FjdGl2aXR5L3dhaXRfZXZlbnRfbmFtZXMudHh0CmluZGV4IDBiNTNjYmE4MDdk Li42OGExNzY5OTY3NSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkv d2FpdF9ldmVudF9uYW1lcy50eHQKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkv d2FpdF9ldmVudF9uYW1lcy50eHQKQEAgLTE1OCw2ICsxNTgsNyBAQCBXQUxfUkVDRUlWRVJf RVhJVAkiV2FpdGluZyBmb3IgdGhlIFdBTCByZWNlaXZlciB0byBleGl0LiIKIFdBTF9SRUNF SVZFUl9XQUlUX1NUQVJUCSJXYWl0aW5nIGZvciBzdGFydHVwIHByb2Nlc3MgdG8gc2VuZCBp bml0aWFsIGRhdGEgZm9yIHN0cmVhbWluZyByZXBsaWNhdGlvbi4iCiBXQUxfU1VNTUFSWV9S RUFEWQkiV2FpdGluZyBmb3IgYSBuZXcgV0FMIHN1bW1hcnkgdG8gYmUgZ2VuZXJhdGVkLiIK IFhBQ1RfR1JPVVBfVVBEQVRFCSJXYWl0aW5nIGZvciB0aGUgZ3JvdXAgbGVhZGVyIHRvIHVw ZGF0ZSB0cmFuc2FjdGlvbiBzdGF0dXMgYXQgdHJhbnNhY3Rpb24gZW5kLiIKK01FTV9DVFhf UFVCTElTSAkiV2FpdGluZyBmb3IgYmFja2VuZCB0byBwdWJsaXNoIG1lbW9yeSBpbmZvcm1h dGlvbi4iCiAKIEFCSV9jb21wYXRpYmlsaXR5OgogCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC91dGlscy9hZHQvbWN4dGZ1bmNzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvbWN4dGZ1 bmNzLmMKaW5kZXggMzk2YzJmMjIzYjQuLmMwNjdjZGY4NzA5IDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC91dGlscy9hZHQvbWN4dGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMv YWR0L21jeHRmdW5jcy5jCkBAIC0xNywyOCArMTcsMjUgQEAKIAogI2luY2x1ZGUgImZ1bmNh cGkuaCIKICNpbmNsdWRlICJtYi9wZ193Y2hhci5oIgorI2luY2x1ZGUgIm1pc2NhZG1pbi5o IgorI2luY2x1ZGUgImFjY2Vzcy90d29waGFzZS5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdf YXV0aGlkX2QuaCIKKyNpbmNsdWRlICJub2Rlcy9wZ19saXN0LmgiCiAjaW5jbHVkZSAic3Rv cmFnZS9wcm9jLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9wcm9jYXJyYXkuaCIKKyNpbmNsdWRl ICJ1dGlscy9hY2wuaCIKICNpbmNsdWRlICJ1dGlscy9hcnJheS5oIgogI2luY2x1ZGUgInV0 aWxzL2J1aWx0aW5zLmgiCiAjaW5jbHVkZSAidXRpbHMvaHNlYXJjaC5oIgorI2luY2x1ZGUg InV0aWxzL21lbXV0aWxzLmgiCisjaW5jbHVkZSAidXRpbHMvd2FpdF9ldmVudF90eXBlcy5o IgogCiAvKiAtLS0tLS0tLS0tCiAgKiBUaGUgbWF4IGJ5dGVzIGZvciBzaG93aW5nIGlkZW50 aWZpZXJzIG9mIE1lbW9yeUNvbnRleHQuCiAgKiAtLS0tLS0tLS0tCiAgKi8KLSNkZWZpbmUg TUVNT1JZX0NPTlRFWFRfSURFTlRfRElTUExBWV9TSVpFCTEwMjQKIAotLyoKLSAqIE1lbW9y eUNvbnRleHRJZAotICoJCVVzZWQgZm9yIHN0b3JhZ2Ugb2YgdHJhbnNpZW50IGlkZW50aWZp ZXJzIGZvcgotICoJCXBnX2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cy4KLSAqLwotdHlw ZWRlZiBzdHJ1Y3QgTWVtb3J5Q29udGV4dElkCi17Ci0JTWVtb3J5Q29udGV4dCBjb250ZXh0 OwotCWludAkJCWNvbnRleHRfaWQ7Ci19CQkJTWVtb3J5Q29udGV4dElkOworc3RydWN0IE1l bW9yeUNvbnRleHRTdGF0ZSAqbWVtQ3R4U3RhdGUgPSBOVUxMOwogCiAvKgogICogaW50X2xp c3RfdG9fYXJyYXkKQEAgLTcxLDcgKzY4LDcgQEAgUHV0TWVtb3J5Q29udGV4dHNTdGF0c1R1 cGxlU3RvcmUoVHVwbGVzdG9yZXN0YXRlICp0dXBzdG9yZSwKIAkJCQkJCQkJIFR1cGxlRGVz YyB0dXBkZXNjLCBNZW1vcnlDb250ZXh0IGNvbnRleHQsCiAJCQkJCQkJCSBIVEFCICpjb250 ZXh0X2lkX2xvb2t1cCkKIHsKLSNkZWZpbmUgUEdfR0VUX0JBQ0tFTkRfTUVNT1JZX0NPTlRF WFRTX0NPTFMJMTAKKyNkZWZpbmUgUEdfR0VUX0JBQ0tFTkRfTUVNT1JZX0NPTlRFWFRTX0NP TFMJMTEKIAogCURhdHVtCQl2YWx1ZXNbUEdfR0VUX0JBQ0tFTkRfTUVNT1JZX0NPTlRFWFRT X0NPTFNdOwogCWJvb2wJCW51bGxzW1BHX0dFVF9CQUNLRU5EX01FTU9SWV9DT05URVhUU19D T0xTXTsKQEAgLTMwNSwzICszMDIsMjU2IEBAIHBnX2xvZ19iYWNrZW5kX21lbW9yeV9jb250 ZXh0cyhQR19GVU5DVElPTl9BUkdTKQogCiAJUEdfUkVUVVJOX0JPT0wodHJ1ZSk7CiB9CisK Ky8qCisgKiBwZ19nZXRfcHJvY2Vzc19tZW1vcnlfY29udGV4dHMKKyAqCQlTaWduYWwgYSBi YWNrZW5kIG9yIGFuIGF1eGlsaWFyeSBwcm9jZXNzIHRvIHNlbmQgaXRzIG1lbW9yeSBjb250 ZXh0cy4KKyAqCisgKiBPbiByZWNlaXB0IG9mIHRoaXMgc2lnbmFsLCBhIGJhY2tlbmQgb3Ig YW4gYXV4aWxpYXJ5IHByb2Nlc3Mgc2V0cyB0aGUgZmxhZworICogaW4gdGhlIHNpZ25hbCBo YW5kbGVyLCB3aGljaCBjYXVzZXMgdGhlIG5leHQgQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKQor ICogb3IgcHJvY2Vzcy1zcGVjaWZpYyBpbnRlcnJ1cHQgaGFuZGxlciB0byBjb3B5IHRoZSBt ZW1vcnkgY29udGV4dCBzdGF0aXN0aWNzCisgKiBpbiBhIGR5bmFtaWMgc2hhcmVkIG1lbW9y eSBzcGFjZS4gVGhlIHN0YXRpc3RpY3MgZm9yIGNvbnRleHRzIHRoYXQgZG8gbm90IGZpdCBp bgorICogc2hhcmVkIG1lbW9yeSBhcmVhIGFyZSBzdG9yZWQgYXMgYSBjdW11bGF0aXZlIHRv dGFsIG9mIHRob3NlIGNvbnRleHRzLAorICogYXQgdGhlIGVuZCBpbiB0aGUgZHluYW1pYyBz aGFyZWQgbWVtb3J5LgorICogV2FpdCBmb3IgdGhlIGJhY2tlbmQgdG8gc2VuZCBzaWduYWwg b24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSBhZnRlcgorICogd3JpdGluZyBzdGF0aXN0aWNz IHRvIGEgc2hhcmVkIG1lbW9yeS4KKyAqIE9uY2UgY29uZGl0aW9uIHZhcmlhYmxlIGNvbWVz IG91dCBvZiBzbGVlcCwgY2hlY2sgaWYgdGhlIHJlcXVpcmVkCisgKiBiYWNrZW5kcyBzdGF0 aXN0aWNzIGFyZSBhdmFpbGFibGUgdG8gcmVhZCBhbmQgZGlzcGxheS4KKyAqLworRGF0dW0K K3BnX2dldF9wcm9jZXNzX21lbW9yeV9jb250ZXh0cyhQR19GVU5DVElPTl9BUkdTKQorewor CWludAkJCXBpZCA9IFBHX0dFVEFSR19JTlQzMigwKTsKKwlib29sCQlnZXRfc3VtbWFyeSA9 IFBHX0dFVEFSR19CT09MKDEpOworCVBHUFJPQwkgICAqcHJvYzsKKwlQcm9jTnVtYmVyCXBy b2NOdW1iZXIgPSBJTlZBTElEX1BST0NfTlVNQkVSOworCWludAkJCWk7CisJUmV0dXJuU2V0 SW5mbyAqcnNpbmZvID0gKFJldHVyblNldEluZm8gKikgZmNpbmZvLT5yZXN1bHRpbmZvOwor CWRzYV9hcmVhICAgKmFyZWE7CisJZHNhX2hhbmRsZQloYW5kbGU7CisJTWVtb3J5Q29udGV4 dEluZm8gKm1lbWN0eF9pbmZvOworCU1lbW9yeUNvbnRleHQgb2xkQ29udGV4dDsKKwlpbnQJ CQludW1fcmV0cmllcyA9IDA7CisKKwlJbml0TWF0ZXJpYWxpemVkU1JGKGZjaW5mbywgMCk7 CisKKwkvKgorCSAqIE9ubHkgc3VwZXJ1c2VycyBvciB1c2VycyB3aXRoIHBnX3JlYWRfYWxs X3N0YXRzIHByaXZpbGVnZXMgY2FuIHZpZXcgdGhlCisJICogbWVtb3J5IGNvbnRleHQgc3Rh dGlzdGljcyBvZiBhbm90aGVyIHByb2Nlc3MKKwkgKi8KKwlpZiAoIWhhc19wcml2c19vZl9y b2xlKEdldFVzZXJJZCgpLCBST0xFX1BHX1JFQURfQUxMX1NUQVRTKSkKKwkJZXJlcG9ydChF UlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX09CSkVDVF9OT1RfSU5fUFJFUkVRVUlTSVRF X1NUQVRFKSwKKwkJCQkgZXJybXNnKCJtZW1vcnkgY29udGV4dCBzdGF0aXN0aWNzIHByaXZp bGVnZSBlcnJvciIpKSk7CisKKwkvKgorCSAqIFNlZSBpZiB0aGUgcHJvY2VzcyB3aXRoIGdp dmVuIHBpZCBpcyBhIGJhY2tlbmQgb3IgYW4gYXV4aWxpYXJ5IHByb2Nlc3MuCisJICovCisJ cHJvYyA9IEJhY2tlbmRQaWRHZXRQcm9jKHBpZCk7CisJaWYgKHByb2MgPT0gTlVMTCkKKwkJ cHJvYyA9IEF1eGlsaWFyeVBpZEdldFByb2MocGlkKTsKKworCS8qCisJICogQmFja2VuZFBp ZEdldFByb2MoKSBhbmQgQXV4aWxpYXJ5UGlkR2V0UHJvYygpIHJldHVybiBOVUxMIGlmIHRo ZSBwaWQKKwkgKiBpc24ndCB2YWxpZDsgYnV0IGJ5IHRoZSB0aW1lIHdlIHJlYWNoIGtpbGwo KSwgYSBwcm9jZXNzIGZvciB3aGljaCB3ZQorCSAqIGdldCBhIHZhbGlkIHByb2MgaGVyZSBt aWdodCBoYXZlIHRlcm1pbmF0ZWQgb24gaXRzIG93bi4gIFRoZXJlJ3Mgbm8gd2F5CisJICog dG8gYWNxdWlyZSBhIGxvY2sgb24gYW4gYXJiaXRyYXJ5IHByb2Nlc3MgdG8gcHJldmVudCB0 aGF0LiBCdXQgc2luY2UKKwkgKiB0aGlzIG1lY2hhbmlzbSBpcyB1c3VhbGx5IHVzZWQgdG8g ZGVidWcgYSBiYWNrZW5kIG9yIGFuIGF1eGlsaWFyeQorCSAqIHByb2Nlc3MgcnVubmluZyBh bmQgY29uc3VtaW5nIGxvdHMgb2YgbWVtb3J5LCB0aGF0IGl0IG1pZ2h0IGVuZCBvbiBpdHMK KwkgKiBvd24gZmlyc3QgYW5kIGl0cyBtZW1vcnkgY29udGV4dHMgYXJlIG5vdCBsb2dnZWQg aXMgbm90IGEgcHJvYmxlbS4KKwkgKi8KKwlpZiAocHJvYyA9PSBOVUxMKQorCXsKKwkJLyoK KwkJICogVGhpcyBpcyBqdXN0IGEgd2FybmluZyBzbyBhIGxvb3AtdGhyb3VnaC1yZXN1bHRz ZXQgd2lsbCBub3QgYWJvcnQKKwkJICogaWYgb25lIGJhY2tlbmQgdGVybWluYXRlZCBvbiBp dHMgb3duIGR1cmluZyB0aGUgcnVuLgorCQkgKi8KKwkJZXJlcG9ydChXQVJOSU5HLAorCQkJ CShlcnJtc2coIlBJRCAlZCBpcyBub3QgYSBQb3N0Z3JlU1FMIHNlcnZlciBwcm9jZXNzIiwg cGlkKSkpOworCQlQR19SRVRVUk5fTlVMTCgpOworCX0KKworCXByb2NOdW1iZXIgPSBHZXRO dW1iZXJGcm9tUEdQcm9jKHByb2MpOworCWlmIChwcm9jTnVtYmVyID09IE15UHJvY051bWJl cikKKwl7CisJCWVyZXBvcnQoV0FSTklORywKKwkJCQkoZXJybXNnKCJjYW5ub3QgcmV0dXJu IHN0YXRpc3RpY3MgZm9yIGxvY2FsIGJhY2tlbmQiKSwKKwkJCQkgZXJyaGludCgiVXNlIHBn X2JhY2tlbmRfbWVtb3J5X2NvbnRleHRzIHZpZXcgaW5zdGVhZCIpKSk7CisJCVBHX1JFVFVS Tl9OVUxMKCk7CisJfQorCisJLyoKKwkgKiBSZXR1cm4gc3RhdGlzdGljcyBvZiB0b3AgbGV2 ZWwgMSBhbmQgMiBjb250ZXh0cywgaWYgZ2V0X3N1bW1hcnkgaXMKKwkgKiB0cnVlLgorCSAq LworCUxXTG9ja0FjcXVpcmUoJm1lbUN0eFN0YXRlW3Byb2NOdW1iZXJdLmx3X2xvY2ssIExX X0VYQ0xVU0lWRSk7CisJbWVtQ3R4U3RhdGVbcHJvY051bWJlcl0uZ2V0X3N1bW1hcnkgPSBn ZXRfc3VtbWFyeTsKKworCS8qCisJICogQ3JlYXRlIGEgRFNBIHNlZ21lbnQgd2l0aCBtYXhp bXVtIHNpemUgb2YgMTZNQiwgc2VuZCBoYW5kbGUgdG8gdGhlCisJICogcHVibGlzaGluZyBw cm9jZXNzIGZvciBzdG9yaW5nIHRoZSBzdGF0cy4gSWYgbnVtYmVyIG9mIGNvbnRleHRzIGV4 Y2VlZAorCSAqIDE2TUIsIGEgY3VtdWxhdGl2ZSB0b3RhbCBpcyBzdG9yZWQgZm9yIHN1Y2gg Y29udGV4dHMuCisJICovCisJaWYgKG1lbUN0eFN0YXRlW3Byb2NOdW1iZXJdLm1lbXN0YXRz X2RzYV9oYW5kbGUgPT0gRFNBX0hBTkRMRV9JTlZBTElEKQorCXsKKwkJb2xkQ29udGV4dCA9 IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhUb3BNZW1vcnlDb250ZXh0KTsKKwkJYXJlYSA9IGRz YV9jcmVhdGVfZXh0KG1lbUN0eFN0YXRlW3Byb2NOdW1iZXJdLmx3X2xvY2sudHJhbmNoZSwg RFNBX0RFRkFVTFRfSU5JVF9TRUdNRU5UX1NJWkUsCisJCQkJCQkJICAxNiAqIERTQV9ERUZB VUxUX0lOSVRfU0VHTUVOVF9TSVpFKTsKKwkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZENv bnRleHQpOworCQloYW5kbGUgPSBkc2FfZ2V0X2hhbmRsZShhcmVhKTsKKwkJbWVtQ3R4U3Rh dGVbcHJvY051bWJlcl0ubWVtc3RhdHNfZHNhX2hhbmRsZSA9IGhhbmRsZTsKKwkJLyogUGlu IHRoZSBtYXBwaW5nIHNvIHRoYXQgaXQgZG9lc24ndCB0aHJvdyBhIHdhcm5pbmcgKi8KKwkJ ZHNhX3BpbihhcmVhKTsKKwkJZHNhX3Bpbl9tYXBwaW5nKGFyZWEpOworCX0KKwllbHNlCisJ eworCQlhcmVhID0gZHNhX2F0dGFjaChtZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5tZW1zdGF0 c19kc2FfaGFuZGxlKTsKKwkJZHNhX3Bpbl9tYXBwaW5nKGFyZWEpOworCX0KKwlMV0xvY2tS ZWxlYXNlKCZtZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5sd19sb2NrKTsKKwlpZiAoU2VuZFBy b2NTaWduYWwocGlkLCBQUk9DU0lHX0dFVF9NRU1PUllfQ09OVEVYVCwgcHJvY051bWJlcikg PCAwKQorCXsKKwkJZXJlcG9ydChXQVJOSU5HLAorCQkJCShlcnJtc2coImNvdWxkIG5vdCBz ZW5kIHNpZ25hbCB0byBwcm9jZXNzICVkOiAlbSIsIHBpZCkpKTsKKwkJZHNhX2RldGFjaChh cmVhKTsKKwkJUEdfUkVUVVJOX05VTEwoKTsKKwl9CisKKwkvKgorCSAqIFdhaXQgZm9yIGEg YmFja2VuZCB0byBwdWJsaXNoIHN0YXRzLCBpbmRpY2F0ZWQgYnkgYSB2YWxpZCBkc2EgcG9p bnRlcgorCSAqIHNldCBieSB0aGUgYmFja2VuZC4KKwkgKi8KKwlDb25kaXRpb25WYXJpYWJs ZVByZXBhcmVUb1NsZWVwKCZtZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5tZW1jdHhfY3YpOwor CXdoaWxlICgxKQorCXsKKwkJcHJvYyA9IEJhY2tlbmRQaWRHZXRQcm9jKHBpZCk7CisJCWlm IChwcm9jID09IE5VTEwpCisJCQlwcm9jID0gQXV4aWxpYXJ5UGlkR2V0UHJvYyhwaWQpOwor CQlpZiAocHJvYyA9PSBOVUxMKQorCQl7CisJCQllcmVwb3J0KFdBUk5JTkcsCisJCQkJCShl cnJtc2coIlBJRCAlZCBpcyBub3QgYSBQb3N0Z3JlU1FMIHNlcnZlciBwcm9jZXNzIiwgcGlk KSkpOworCQkJZHNhX2RldGFjaChhcmVhKTsKKwkJCVBHX1JFVFVSTl9OVUxMKCk7CisJCX0K KyNkZWZpbmUgTUVNU1RBVFNfV0FJVF9USU1FT1VUIDUwMDAKKyNkZWZpbmUgTUFYX1JFVFJJ RVMgMjAKKwkJaWYgKENvbmRpdGlvblZhcmlhYmxlVGltZWRTbGVlcCgmbWVtQ3R4U3RhdGVb cHJvY051bWJlcl0ubWVtY3R4X2N2LCBNRU1TVEFUU19XQUlUX1RJTUVPVVQsCisJCQkJCQkJ CQkJV0FJVF9FVkVOVF9NRU1fQ1RYX1BVQkxJU0gpKQorCQl7CisJCQllcmVwb3J0KExPRywK KwkJCQkJKGVycm1zZygiV2FpdCBmb3IgJWQgcHJvY2VzcyB0byBwdWJsaXNoIHN0YXRzIHRp bWVkIG91dCwgdHJ5aW5nIGFnYWluIiwgcGlkKSkpOworCQkJaWYgKG51bV9yZXRyaWVzID4g TUFYX1JFVFJJRVMpCisJCQl7CisJCQkJZHNhX2RldGFjaChhcmVhKTsKKwkJCQlQR19SRVRV Uk5fTlVMTCgpOworCQkJfQorCQkJbnVtX3JldHJpZXMgPSBudW1fcmV0cmllcyArIDE7CisJ CX0KKworCQkvKgorCQkgKiBXZSBleHBlY3QgdG8gY29tZSBvdXQgb2Ygc2xlZXAgd2hlbiB0 aGUgcmVxdWVzdGVkIHByb2Nlc3MgaGFzCisJCSAqIGZpbmlzaGVkIHB1Ymxpc2hpbmcgdGhl IHN0YXRpc3RpY3MsIHZlcmlmaWVkIHVzaW5nIHRoZSBhIHZhbGlkIGRzYQorCQkgKiBwb2lu dGVyLgorCQkgKgorCQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgaW5mb3JtYXRpb24gYmVsb25n cyB0byBwaWQgd2UgcmVxdWVzdGVkCisJCSAqIGluZm9ybWF0aW9uIGZvciwgT3RoZXJ3aXNl IGxvb3AgYmFjayBhbmQgd2FpdCBmb3IgdGhlIHNlcnZlcgorCQkgKiBwcm9jZXNzIHRvIGZp bmlzaCBwdWJsaXNoaW5nIHN0YXRpc3RpY3MuCisJCSAqLworCQlMV0xvY2tBY3F1aXJlKCZt ZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5sd19sb2NrLCBMV19FWENMVVNJVkUpOworCisJCWlm IChtZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5wcm9jX2lkID09IHBpZCAmJiBEc2FQb2ludGVy SXNWYWxpZChtZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5tZW1zdGF0c19kc2FfcG9pbnRlcikp CisJCQlicmVhazsKKwkJZWxzZQorCQkJTFdMb2NrUmVsZWFzZSgmbWVtQ3R4U3RhdGVbcHJv Y051bWJlcl0ubHdfbG9jayk7CisJfQorCWlmIChEc2FQb2ludGVySXNWYWxpZChtZW1DdHhT dGF0ZVtwcm9jTnVtYmVyXS5tZW1zdGF0c19kc2FfcG9pbnRlcikpCisJCW1lbWN0eF9pbmZv ID0gKE1lbW9yeUNvbnRleHRJbmZvICopIGRzYV9nZXRfYWRkcmVzcyhhcmVhLCBtZW1DdHhT dGF0ZVtwcm9jTnVtYmVyXS5tZW1zdGF0c19kc2FfcG9pbnRlcik7CisJLyogQmFja2VuZCBo YXMgZmluaXNoZWQgcHVibGlzaGluZyB0aGUgc3RhdHMsIHJlYWQgdGhlbSAqLworCWZvciAo aSA9IDA7IGkgPCBtZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5pbl9tZW1vcnlfc3RhdHM7IGkr KykKKwl7CisJCUFycmF5VHlwZSAgKnBhdGhfYXJyYXk7CisJCWludAkJCXBhdGhfbGVuZ3Ro OworCQlEYXR1bQkJdmFsdWVzW1BHX0dFVF9CQUNLRU5EX01FTU9SWV9DT05URVhUU19DT0xT XTsKKwkJYm9vbAkJbnVsbHNbUEdfR0VUX0JBQ0tFTkRfTUVNT1JZX0NPTlRFWFRTX0NPTFNd OworCisJCW1lbXNldCh2YWx1ZXMsIDAsIHNpemVvZih2YWx1ZXMpKTsKKwkJbWVtc2V0KG51 bGxzLCAwLCBzaXplb2YobnVsbHMpKTsKKworCQlpZiAoc3RybGVuKG1lbWN0eF9pbmZvW2ld Lm5hbWUpICE9IDApCisJCQl2YWx1ZXNbMF0gPSBDU3RyaW5nR2V0VGV4dERhdHVtKG1lbWN0 eF9pbmZvW2ldLm5hbWUpOworCQllbHNlCisJCQludWxsc1swXSA9IHRydWU7CisJCWlmIChz dHJsZW4obWVtY3R4X2luZm9baV0uaWRlbnQpICE9IDApCisJCQl2YWx1ZXNbMV0gPSBDU3Ry aW5nR2V0VGV4dERhdHVtKG1lbWN0eF9pbmZvW2ldLmlkZW50KTsKKwkJZWxzZQorCQkJbnVs bHNbMV0gPSB0cnVlOworCisJCXZhbHVlc1syXSA9IENTdHJpbmdHZXRUZXh0RGF0dW0obWVt Y3R4X2luZm9baV0udHlwZSk7CisJCXBhdGhfbGVuZ3RoID0gbWVtY3R4X2luZm9baV0ucGF0 aF9sZW5ndGg7CisJCXBhdGhfYXJyYXkgPSBjb25zdHJ1Y3RfYXJyYXlfYnVpbHRpbihtZW1j dHhfaW5mb1tpXS5wYXRoLCBwYXRoX2xlbmd0aCwgSU5UNE9JRCk7CisJCXZhbHVlc1szXSA9 IFBvaW50ZXJHZXREYXR1bShwYXRoX2FycmF5KTsKKwkJdmFsdWVzWzRdID0gSW50NjRHZXRE YXR1bShtZW1jdHhfaW5mb1tpXS50b3RhbHNwYWNlKTsKKwkJdmFsdWVzWzVdID0gSW50NjRH ZXREYXR1bShtZW1jdHhfaW5mb1tpXS5uYmxvY2tzKTsKKwkJdmFsdWVzWzZdID0gSW50NjRH ZXREYXR1bShtZW1jdHhfaW5mb1tpXS5mcmVlc3BhY2UpOworCQl2YWx1ZXNbN10gPSBJbnQ2 NEdldERhdHVtKG1lbWN0eF9pbmZvW2ldLmZyZWVjaHVua3MpOworCQl2YWx1ZXNbOF0gPSBJ bnQ2NEdldERhdHVtKG1lbWN0eF9pbmZvW2ldLnRvdGFsc3BhY2UgLSBtZW1jdHhfaW5mb1tp XS5mcmVlc3BhY2UpOworCQl2YWx1ZXNbOV0gPSBJbnQzMkdldERhdHVtKG1lbWN0eF9pbmZv W2ldLm51bV9jb250ZXh0cyk7CisJCXR1cGxlc3RvcmVfcHV0dmFsdWVzKHJzaW5mby0+c2V0 UmVzdWx0LCByc2luZm8tPnNldERlc2MsIHZhbHVlcywgbnVsbHMpOworCX0KKwkvKiBJZiB0 aGVyZSBhcmUgbW9yZSBjb250ZXh0cywgZGlzcGxheSBhIGN1bXVsYXRpdmUgdG90YWwgb2Yg dGhvc2UgKi8KKwlpZiAobWVtQ3R4U3RhdGVbcHJvY051bWJlcl0udG90YWxfc3RhdHMgPiBp KQorCXsKKwkJRGF0dW0JCXZhbHVlc1tQR19HRVRfQkFDS0VORF9NRU1PUllfQ09OVEVYVFNf Q09MU107CisJCWJvb2wJCW51bGxzW1BHX0dFVF9CQUNLRU5EX01FTU9SWV9DT05URVhUU19D T0xTXTsKKworCQl2YWx1ZXNbMF0gPSBDU3RyaW5nR2V0VGV4dERhdHVtKG1lbWN0eF9pbmZv W2ldLm5hbWUpOworCQludWxsc1sxXSA9IHRydWU7CisJCW51bGxzWzJdID0gdHJ1ZTsKKwkJ bnVsbHNbM10gPSB0cnVlOworCQl2YWx1ZXNbNF0gPSBJbnQ2NEdldERhdHVtKG1lbWN0eF9p bmZvW2ldLnRvdGFsc3BhY2UpOworCQl2YWx1ZXNbNV0gPSBJbnQ2NEdldERhdHVtKG1lbWN0 eF9pbmZvW2ldLm5ibG9ja3MpOworCQl2YWx1ZXNbNl0gPSBJbnQ2NEdldERhdHVtKG1lbWN0 eF9pbmZvW2ldLmZyZWVzcGFjZSk7CisJCXZhbHVlc1s3XSA9IEludDY0R2V0RGF0dW0obWVt Y3R4X2luZm9baV0uZnJlZWNodW5rcyk7CisJCXZhbHVlc1s4XSA9IEludDY0R2V0RGF0dW0o bWVtY3R4X2luZm9baV0udG90YWxzcGFjZSAtIG1lbWN0eF9pbmZvW2ldLmZyZWVzcGFjZSk7 CisJCXZhbHVlc1s5XSA9IEludDMyR2V0RGF0dW0obWVtY3R4X2luZm9baV0ubnVtX2NvbnRl eHRzKTsKKwkJdHVwbGVzdG9yZV9wdXR2YWx1ZXMocnNpbmZvLT5zZXRSZXN1bHQsIHJzaW5m by0+c2V0RGVzYywgdmFsdWVzLCBudWxscyk7CisJfQorCUxXTG9ja1JlbGVhc2UoJm1lbUN0 eFN0YXRlW3Byb2NOdW1iZXJdLmx3X2xvY2spOworCUNvbmRpdGlvblZhcmlhYmxlQ2FuY2Vs U2xlZXAoKTsKKwlkc2FfZGV0YWNoKGFyZWEpOworCVBHX1JFVFVSTl9OVUxMKCk7Cit9CisK K3N0YXRpYyBTaXplCitNZW1DdHhTaG1lbVNpemUodm9pZCkKK3sKKwlTaXplCQlzaXplOwor CVNpemUJCVRvdGFsUHJvY3MgPSBhZGRfc2l6ZShNYXhCYWNrZW5kcywgYWRkX3NpemUoTlVN X0FVWElMSUFSWV9QUk9DUywgbWF4X3ByZXBhcmVkX3hhY3RzKSk7CisKKwlzaXplID0gVG90 YWxQcm9jcyAqIHNpemVvZihNZW1vcnlDb250ZXh0U3RhdGUpOworCXJldHVybiBzaXplOwor fQorCit2b2lkCitNZW1DdHhTaG1lbUluaXQodm9pZCkKK3sKKwlib29sCQlmb3VuZDsKKwlT aXplCQlUb3RhbFByb2NzID0gYWRkX3NpemUoTWF4QmFja2VuZHMsIGFkZF9zaXplKE5VTV9B VVhJTElBUllfUFJPQ1MsIG1heF9wcmVwYXJlZF94YWN0cykpOworCisJbWVtQ3R4U3RhdGUg PSAoTWVtb3J5Q29udGV4dFN0YXRlICopIFNobWVtSW5pdFN0cnVjdCgiTWVtb3J5Q29udGV4 dFN0YXRlIiwKKwkJCQkJCQkJCQkJCQkJIE1lbUN0eFNobWVtU2l6ZSgpLAorCQkJCQkJCQkJ CQkJCQkgJmZvdW5kKTsKKwlpZiAoIWZvdW5kKQorCXsKKwkJZm9yIChpbnQgaSA9IDA7IGkg PCBUb3RhbFByb2NzOyBpKyspCisJCXsKKwkJCUNvbmRpdGlvblZhcmlhYmxlSW5pdCgmbWVt Q3R4U3RhdGVbaV0ubWVtY3R4X2N2KTsKKwkJCUxXTG9ja0luaXRpYWxpemUoJm1lbUN0eFN0 YXRlW2ldLmx3X2xvY2ssIExXTG9ja05ld1RyYW5jaGVJZCgpKTsKKwkJCUxXTG9ja1JlZ2lz dGVyVHJhbmNoZShtZW1DdHhTdGF0ZVtpXS5sd19sb2NrLnRyYW5jaGUsICJtZW1fY29udGV4 dF9zdGF0c19yZXBvcnRpbmciKTsKKwkJCW1lbUN0eFN0YXRlW2ldLm1lbXN0YXRzX2RzYV9o YW5kbGUgPSBEU0FfSEFORExFX0lOVkFMSUQ7CisJCQltZW1DdHhTdGF0ZVtpXS5tZW1zdGF0 c19kc2FfcG9pbnRlciA9IEludmFsaWREc2FQb2ludGVyOworCQl9CisJfQorfQpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvaW5pdC9nbG9iYWxzLmMgYi9zcmMvYmFja2VuZC91 dGlscy9pbml0L2dsb2JhbHMuYwppbmRleCBiODQ0ZjlmZGFlZi4uNmJjMjUzZGE1ZGEgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2luaXQvZ2xvYmFscy5jCisrKyBiL3NyYy9i YWNrZW5kL3V0aWxzL2luaXQvZ2xvYmFscy5jCkBAIC00Miw2ICs0Miw3IEBAIHZvbGF0aWxl IHNpZ19hdG9taWNfdCBJZGxlU3RhdHNVcGRhdGVUaW1lb3V0UGVuZGluZyA9IGZhbHNlOwog dm9sYXRpbGUgdWludDMyIEludGVycnVwdEhvbGRvZmZDb3VudCA9IDA7CiB2b2xhdGlsZSB1 aW50MzIgUXVlcnlDYW5jZWxIb2xkb2ZmQ291bnQgPSAwOwogdm9sYXRpbGUgdWludDMyIENy aXRTZWN0aW9uQ291bnQgPSAwOwordm9sYXRpbGUgc2lnX2F0b21pY190IFB1Ymxpc2hNZW1v cnlDb250ZXh0UGVuZGluZyA9IGZhbHNlOwogCiBpbnQJCQlNeVByb2NQaWQ7CiBwZ190aW1l X3QJTXlTdGFydFRpbWU7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9tbWdyL21j eHQuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL21tZ3IvbWN4dC5jCmluZGV4IGFhNmRhMGQwMzUy Li4yNDVhYmE1OTg3YyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9tY3h0 LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9tY3h0LmMKQEAgLTE5LDE2ICsxOSwy MiBAQAogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAorI2luY2x1ZGUgPG1hdGguaD4K ICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCiAjaW5jbHVkZSAibWIvcGdfd2NoYXIuaCIKICNp bmNsdWRlICJtaXNjYWRtaW4uaCIKKyNpbmNsdWRlICJub2Rlcy9wZ19saXN0LmgiCisjaW5j bHVkZSAic3RvcmFnZS9mZC5oIgorI2luY2x1ZGUgInN0b3JhZ2UvbHdsb2NrLmgiCisjaW5j bHVkZSAic3RvcmFnZS9kc20uaCIKKyNpbmNsdWRlICJ1dGlscy9kc2EuaCIKKyNpbmNsdWRl ICJ1dGlscy9oc2VhcmNoLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtZGVidWcuaCIKICNpbmNs dWRlICJ1dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL21lbXV0aWxzX2ludGVy bmFsLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHNfbWVtb3J5Y2h1bmsuaCIKIAotCiBz dGF0aWMgdm9pZCBCb2d1c0ZyZWUodm9pZCAqcG9pbnRlcik7CiBzdGF0aWMgdm9pZCAqQm9n dXNSZWFsbG9jKHZvaWQgKnBvaW50ZXIsIFNpemUgc2l6ZSwgaW50IGZsYWdzKTsKIHN0YXRp YyBNZW1vcnlDb250ZXh0IEJvZ3VzR2V0Q2h1bmtDb250ZXh0KHZvaWQgKnBvaW50ZXIpOwpA QCAtMTM1LDYgKzE0MSwxMiBAQCBzdGF0aWMgY29uc3QgTWVtb3J5Q29udGV4dE1ldGhvZHMg bWN4dF9tZXRob2RzW10gPSB7CiB9OwogCiAjdW5kZWYgQk9HVVNfTUNUWAordHlwZWRlZiBl bnVtIFByaW50RGV0YWlscworeworCVBSSU5UX1NUQVRTX1RPX1NUREVSUiA9IDAsCisJUFJJ TlRfU1RBVFNfVE9fTE9HUywKKwlQUklOVF9TVEFUU19OT05FCit9CQkJUHJpbnREZXRhaWxz OwogCiAvKgogICogQ3VycmVudE1lbW9yeUNvbnRleHQKQEAgLTE2MiwxMCArMTc0LDExIEBA IHN0YXRpYyB2b2lkIE1lbW9yeUNvbnRleHRDYWxsUmVzZXRDYWxsYmFja3MoTWVtb3J5Q29u dGV4dCBjb250ZXh0KTsKIHN0YXRpYyB2b2lkIE1lbW9yeUNvbnRleHRTdGF0c0ludGVybmFs KE1lbW9yeUNvbnRleHQgY29udGV4dCwgaW50IGxldmVsLAogCQkJCQkJCQkJICAgaW50IG1h eF9sZXZlbCwgaW50IG1heF9jaGlsZHJlbiwKIAkJCQkJCQkJCSAgIE1lbW9yeUNvbnRleHRD b3VudGVycyAqdG90YWxzLAotCQkJCQkJCQkJICAgYm9vbCBwcmludF90b19zdGRlcnIpOwor CQkJCQkJCQkJICAgUHJpbnREZXRhaWxzIHByaW50X2xvY2F0aW9uLCBpbnQgKm51bV9jb250 ZXh0cyk7CiBzdGF0aWMgdm9pZCBNZW1vcnlDb250ZXh0U3RhdHNQcmludChNZW1vcnlDb250 ZXh0IGNvbnRleHQsIHZvaWQgKnBhc3N0aHJ1LAogCQkJCQkJCQkJY29uc3QgY2hhciAqc3Rh dHNfc3RyaW5nLAogCQkJCQkJCQkJYm9vbCBwcmludF90b19zdGRlcnIpOworc3RhdGljIHZv aWQgUHVibGlzaE1lbW9yeUNvbnRleHQoTWVtb3J5Q29udGV4dEluZm8gKiBtZW1jdHhfaW5m b3MsIGludCBjdXJyX2lkLCBNZW1vcnlDb250ZXh0IGNvbnRleHQsIExpc3QgKnBhdGgsIGNo YXIgKmNsaXBwZWRfaWRlbnQsIE1lbW9yeUNvbnRleHRDb3VudGVycyBzdGF0LCBpbnQgbnVt X2NvbnRleHRzKTsKIAogLyoKICAqIFlvdSBzaG91bGQgbm90IGRvIG1lbW9yeSBhbGxvY2F0 aW9ucyB3aXRoaW4gYSBjcml0aWNhbCBzZWN0aW9uLCBiZWNhdXNlCkBAIC04MzEsMTEgKzg0 NCwxOSBAQCBNZW1vcnlDb250ZXh0U3RhdHNEZXRhaWwoTWVtb3J5Q29udGV4dCBjb250ZXh0 LAogCQkJCQkJIGJvb2wgcHJpbnRfdG9fc3RkZXJyKQogewogCU1lbW9yeUNvbnRleHRDb3Vu dGVycyBncmFuZF90b3RhbHM7CisJaW50CQkJbnVtX2NvbnRleHRzOworCVByaW50RGV0YWls cyBwcmludF9sb2NhdGlvbjsKIAogCW1lbXNldCgmZ3JhbmRfdG90YWxzLCAwLCBzaXplb2Yo Z3JhbmRfdG90YWxzKSk7CiAKKwlpZiAocHJpbnRfdG9fc3RkZXJyKQorCQlwcmludF9sb2Nh dGlvbiA9IFBSSU5UX1NUQVRTX1RPX1NUREVSUjsKKwllbHNlCisJCXByaW50X2xvY2F0aW9u ID0gUFJJTlRfU1RBVFNfVE9fTE9HUzsKKworCS8qIG51bV9jb250ZXh0cyByZXBvcnQgbnVt YmVyIG9mIGNvbnRleHRzIGFnZ3JlZ2F0ZWQgaW4gdGhlIG91dHB1dCAqLwogCU1lbW9yeUNv bnRleHRTdGF0c0ludGVybmFsKGNvbnRleHQsIDAsIG1heF9sZXZlbCwgbWF4X2NoaWxkcmVu LAotCQkJCQkJCSAgICZncmFuZF90b3RhbHMsIHByaW50X3RvX3N0ZGVycik7CisJCQkJCQkJ ICAgJmdyYW5kX3RvdGFscywgcHJpbnRfbG9jYXRpb24sICZudW1fY29udGV4dHMpOwogCiAJ aWYgKHByaW50X3RvX3N0ZGVycikKIAkJZnByaW50ZihzdGRlcnIsCkBAIC04NzYsMTggKzg5 Nyw0MyBAQCBzdGF0aWMgdm9pZAogTWVtb3J5Q29udGV4dFN0YXRzSW50ZXJuYWwoTWVtb3J5 Q29udGV4dCBjb250ZXh0LCBpbnQgbGV2ZWwsCiAJCQkJCQkgICBpbnQgbWF4X2xldmVsLCBp bnQgbWF4X2NoaWxkcmVuLAogCQkJCQkJICAgTWVtb3J5Q29udGV4dENvdW50ZXJzICp0b3Rh bHMsCi0JCQkJCQkgICBib29sIHByaW50X3RvX3N0ZGVycikKKwkJCQkJCSAgIFByaW50RGV0 YWlscyBwcmludF9sb2NhdGlvbiwgaW50ICpudW1fY29udGV4dHMpCiB7CiAJTWVtb3J5Q29u dGV4dCBjaGlsZDsKIAlpbnQJCQlpY2hpbGQ7CisJYm9vbAkJcHJpbnRfdG9fc3RkZXJyID0g dHJ1ZTsKIAogCUFzc2VydChNZW1vcnlDb250ZXh0SXNWYWxpZChjb250ZXh0KSk7CiAKLQkv KiBFeGFtaW5lIHRoZSBjb250ZXh0IGl0c2VsZiAqLwotCWNvbnRleHQtPm1ldGhvZHMtPnN0 YXRzKGNvbnRleHQsCi0JCQkJCQkJTWVtb3J5Q29udGV4dFN0YXRzUHJpbnQsCi0JCQkJCQkJ JmxldmVsLAotCQkJCQkJCXRvdGFscywgcHJpbnRfdG9fc3RkZXJyKTsKKwlpZiAocHJpbnRf bG9jYXRpb24gPT0gUFJJTlRfU1RBVFNfVE9fU1RERVJSKQorCQlwcmludF90b19zdGRlcnIg PSB0cnVlOworCWVsc2UgaWYgKHByaW50X2xvY2F0aW9uID09IFBSSU5UX1NUQVRTX1RPX0xP R1MpCisJCXByaW50X3RvX3N0ZGVyciA9IGZhbHNlOworCisJaWYgKHByaW50X2xvY2F0aW9u ICE9IFBSSU5UX1NUQVRTX05PTkUpCisJeworCQkvKiBFeGFtaW5lIHRoZSBjb250ZXh0IGl0 c2VsZiAqLworCQljb250ZXh0LT5tZXRob2RzLT5zdGF0cyhjb250ZXh0LAorCQkJCQkJCQlN ZW1vcnlDb250ZXh0U3RhdHNQcmludCwKKwkJCQkJCQkJJmxldmVsLAorCQkJCQkJCQl0b3Rh bHMsIHByaW50X3RvX3N0ZGVycik7CisJfQorCS8qIERvIG5vdCBwcmludCB0aGUgc3RhdGlz dGljcyAqLworCisJLyoKKwkgKiBwcmludF90b19zdGRlcnIgaXMgYSBuby1vcCBpZiBubyBz dGF0aXN0aWNzIGFyZSBnb2luZyB0byBiZSBwcmludGVkIGkuZQorCSAqIHByaW50X2xvY2F0 aW9uID09IFBSSU5UX1NUQVRTX05PTkUKKwkgKi8KKwllbHNlCisJeworCQkvKiBFeGFtaW5l IHRoZSBjb250ZXh0IGl0c2VsZiAqLworCQljb250ZXh0LT5tZXRob2RzLT5zdGF0cyhjb250 ZXh0LAorCQkJCQkJCQlOVUxMLAorCQkJCQkJCQlOVUxMLAorCQkJCQkJCQl0b3RhbHMsIHBy aW50X3RvX3N0ZGVycik7CisJfQorCS8qIEluY3JlbWVudCB0aGUgY29udGV4dCBjb3VudCAq LworCSpudW1fY29udGV4dHMgPSAqbnVtX2NvbnRleHRzICsgMTsKIAogCS8qCiAJICogRXhh bWluZSBjaGlsZHJlbi4KQEAgLTkwNyw3ICs5NTMsNyBAQCBNZW1vcnlDb250ZXh0U3RhdHNJ bnRlcm5hbChNZW1vcnlDb250ZXh0IGNvbnRleHQsIGludCBsZXZlbCwKIAkJCU1lbW9yeUNv bnRleHRTdGF0c0ludGVybmFsKGNoaWxkLCBsZXZlbCArIDEsCiAJCQkJCQkJCQkgICBtYXhf bGV2ZWwsIG1heF9jaGlsZHJlbiwKIAkJCQkJCQkJCSAgIHRvdGFscywKLQkJCQkJCQkJCSAg IHByaW50X3RvX3N0ZGVycik7CisJCQkJCQkJCQkgICBwcmludF9sb2NhdGlvbiwgbnVtX2Nv bnRleHRzKTsKIAkJfQogCX0KIApAQCAtOTI1LDYgKzk3MSw3IEBAIE1lbW9yeUNvbnRleHRT dGF0c0ludGVybmFsKE1lbW9yeUNvbnRleHQgY29udGV4dCwgaW50IGxldmVsLAogCQkJaWNo aWxkKys7CiAJCQljaGlsZCA9IE1lbW9yeUNvbnRleHRUcmF2ZXJzZU5leHQoY2hpbGQsIGNv bnRleHQpOwogCQl9CisJCSpudW1fY29udGV4dHMgPSAqbnVtX2NvbnRleHRzICsgaWNoaWxk OwogCiAJCWlmIChwcmludF90b19zdGRlcnIpCiAJCXsKQEAgLTkzOSw3ICs5ODYsNyBAQCBN ZW1vcnlDb250ZXh0U3RhdHNJbnRlcm5hbChNZW1vcnlDb250ZXh0IGNvbnRleHQsIGludCBs ZXZlbCwKIAkJCQkJbG9jYWxfdG90YWxzLmZyZWVjaHVua3MsCiAJCQkJCWxvY2FsX3RvdGFs cy50b3RhbHNwYWNlIC0gbG9jYWxfdG90YWxzLmZyZWVzcGFjZSk7CiAJCX0KLQkJZWxzZQor CQllbHNlIGlmIChwcmludF9sb2NhdGlvbiAhPSBQUklOVF9TVEFUU19OT05FKQogCQkJZXJl cG9ydChMT0dfU0VSVkVSX09OTFksCiAJCQkJCShlcnJoaWRlc3RtdCh0cnVlKSwKIAkJCQkJ IGVycmhpZGVjb250ZXh0KHRydWUpLApAQCAtMTI3Niw2ICsxMzIzLDIxIEBAIEhhbmRsZUxv Z01lbW9yeUNvbnRleHRJbnRlcnJ1cHQodm9pZCkKIAkvKiBsYXRjaCB3aWxsIGJlIHNldCBi eSBwcm9jc2lnbmFsX3NpZ3VzcjFfaGFuZGxlciAqLwogfQogCisvKgorICogSGFuZGxlR2V0 TWVtb3J5Q29udGV4dEludGVycnVwdAorICoJCUhhbmRsZSByZWNlaXB0IG9mIGFuIGludGVy cnVwdCBpbmRpY2F0aW5nIHB1Ymxpc2hpbmcgb2YgbWVtb3J5CisgKgkJY29udGV4dHMuCisg KgorICogQWxsIHRoZSBhY3R1YWwgd29yayBpcyBkZWZlcnJlZCB0byBQcm9jZXNzTG9nTWVt b3J5Q29udGV4dEludGVycnVwdCgpCisgKi8KK3ZvaWQKK0hhbmRsZUdldE1lbW9yeUNvbnRl eHRJbnRlcnJ1cHQodm9pZCkKK3sKKwlJbnRlcnJ1cHRQZW5kaW5nID0gdHJ1ZTsKKwlQdWJs aXNoTWVtb3J5Q29udGV4dFBlbmRpbmcgPSB0cnVlOworCS8qIGxhdGNoIHdpbGwgYmUgc2V0 IGJ5IHByb2NzaWduYWxfc2lndXNyMV9oYW5kbGVyICovCit9CisKIC8qCiAgKiBQcm9jZXNz TG9nTWVtb3J5Q29udGV4dEludGVycnVwdAogICogCQlQZXJmb3JtIGxvZ2dpbmcgb2YgbWVt b3J5IGNvbnRleHRzIG9mIHRoaXMgYmFja2VuZCBwcm9jZXNzLgpAQCAtMTMxMyw2ICsxMzc1 LDM0NiBAQCBQcm9jZXNzTG9nTWVtb3J5Q29udGV4dEludGVycnVwdCh2b2lkKQogCU1lbW9y eUNvbnRleHRTdGF0c0RldGFpbChUb3BNZW1vcnlDb250ZXh0LCAxMDAsIDEwMCwgZmFsc2Up OwogfQogCisvKgorICogUnVuIGJ5IGVhY2ggYmFja2VuZCB0byBwdWJsaXNoIHRoZWlyIG1l bW9yeSBjb250ZXh0CisgKiBzdGF0aXN0aWNzLiBJdCBwZXJmb3JtcyBhIGJyZWFkdGggZmly c3Qgc2VhcmNoCisgKiBvbiB0aGUgbWVtb3J5IGNvbnRleHQgdHJlZSwgc28gdGhhdCB0aGUg cGFyZW50cworICogZ2V0IGEgY2hhbmNlIHRvIHJlcG9ydCBzdGF0cyBiZWZvcmUgdGhlaXIg Y2hpbGRyZW4uCisgKgorICogU3RhdGlzdGljcyBhcmUgc2hhcmVkIHZpYSBkeW5hbWljIHNo YXJlZCBtZW1vcnkgd2hpY2gKKyAqIGNhbiBob2xkIHN0YXRpc3RpY3Mgb2YgYXBwcm94IDY3 MDAgY29udGV4dHMuIFJlbWFpbmluZworICogY29udGV4dHMgc3RhdGlzdGljcyBpcyBjYXB0 dXJlZCBhcyBhIGN1bXVsYXRpdmUgdG90YWwuCisgKi8KK3ZvaWQKK1Byb2Nlc3NHZXRNZW1v cnlDb250ZXh0SW50ZXJydXB0KHZvaWQpCit7CisJLyogU3RvcmUgdGhlIG1lbW9yeSBjb250 ZXh0IGRldGFpbHMgaW4gc2hhcmVkIG1lbW9yeSAqLworCisJTGlzdAkgICAqY29udGV4dHM7 CisKKwlIQVNIQ1RMCQljdGw7CisJSFRBQgkgICAqY29udGV4dF9pZF9sb29rdXA7CisJaW50 CQkJY29udGV4dF9pZCA9IDA7CisJYm9vbAkJZm91bmQ7CisJTWVtb3J5Q29udGV4dCBzdGF0 X2N4dDsKKwlNZW1vcnlDb250ZXh0SW5mbyAqbWVtaW5mbzsKKwlib29sCQlnZXRfc3VtbWFy eSA9IGZhbHNlOworCWRzYV9hcmVhICAgKmFyZWE7CisJaW50CQkJbnVtX3N0YXRzOworCWlu dAkJCWlkeCA9IE15UHJvY051bWJlcjsKKwlpbnQJCQlzdGF0c19jb3VudCA9IDA7CisJTWVt b3J5Q29udGV4dENvdW50ZXJzIHN0YXQ7CisKKwlQdWJsaXNoTWVtb3J5Q29udGV4dFBlbmRp bmcgPSBmYWxzZTsKKworCS8qCisJICogVGhlIGhhc2ggdGFibGUgaXMgdXNlZCBmb3IgY29u c3RydWN0aW5nICJwYXRoIiBjb2x1bW4gb2YKKwkgKiBwZ19nZXRfcHJvY2Vzc19tZW1vcnlf Y29udGV4dCBpcyB2aWV3LCBzaW1pbGFyIHRvIGl0cyBsb2NhbCBiYWNrZW5kCisJICogY291 dGVycGFydC4KKwkgKi8KKworCS8qCisJICogTWFrZSBhIG5ldyBjb250ZXh0IHRoYXQgd2ls bCBjb250YWluIHRoZSBoYXNoIHRhYmxlLCB0byBlYXNlIHRoZQorCSAqIGNsZWFudXAKKwkg Ki8KKworCXN0YXRfY3h0ID0gQWxsb2NTZXRDb250ZXh0Q3JlYXRlKEN1cnJlbnRNZW1vcnlD b250ZXh0LAorCQkJCQkJCQkJICJNZW1vcnkgY29udGV4dCBzdGF0aXN0aWNzIiwKKwkJCQkJ CQkJCSBBTExPQ1NFVF9ERUZBVUxUX1NJWkVTKTsKKworCWN0bC5rZXlzaXplID0gc2l6ZW9m KE1lbW9yeUNvbnRleHQpOworCWN0bC5lbnRyeXNpemUgPSBzaXplb2YoTWVtb3J5Q29udGV4 dElkKTsKKwljdGwuaGN4dCA9IHN0YXRfY3h0OworCisJY29udGV4dF9pZF9sb29rdXAgPSBo YXNoX2NyZWF0ZSgicGdfZ2V0X3JlbW90ZV9iYWNrZW5kX21lbW9yeV9jb250ZXh0cyIsCisJ CQkJCQkJCQkyNTYsCisJCQkJCQkJCQkmY3RsLAorCQkJCQkJCQkJSEFTSF9FTEVNIHwgSEFT SF9CTE9CUyB8IEhBU0hfQ09OVEVYVCk7CisKKwljb250ZXh0cyA9IGxpc3RfbWFrZTEoVG9w TWVtb3J5Q29udGV4dCk7CisKKwkvKiBDb21wdXRlIHRoZSBudW1iZXIgb2Ygc3RhdHMgdGhh dCBjYW4gZml0IGluIHRoZSBEU00gc2VnICovCisJbnVtX3N0YXRzID0gZmxvb3IoMTYgKiBE U0FfREVGQVVMVF9JTklUX1NFR01FTlRfU0laRSAvIHNpemVvZihNZW1vcnlDb250ZXh0SW5m bykpOworCisJLyoKKwkgKiBUcmF2ZXJzZSB0aGUgbWVtb3J5IGNvbnRleHQgdHJlZSB0byBm aW5kIHRvdGFsIG51bWJlciBvZiBjb250ZXh0cy4gSWYKKwkgKiBzdW1tYXJ5IGlzIHJlcXVl c3RlZCBmaW5kIHRoZSB0b3RhbCBudW1iZXIgb2YgY29udGV4dHMgYXQgbGV2ZWwgMSBhbmQK KwkgKiAyLgorCSAqLworCWZvcmVhY2hfcHRyKE1lbW9yeUNvbnRleHREYXRhLCBjdXIsIGNv bnRleHRzKQorCXsKKwkJTWVtb3J5Q29udGV4dElkICplbnRyeTsKKworCQllbnRyeSA9IChN ZW1vcnlDb250ZXh0SWQgKikgaGFzaF9zZWFyY2goY29udGV4dF9pZF9sb29rdXAsICZjdXIs CisJCQkJCQkJCQkJCQlIQVNIX0VOVEVSLCAmZm91bmQpOworCQlzdGF0c19jb3VudCA9IHN0 YXRzX2NvdW50ICsgMTsKKwkJLyogY29udGV4dCBpZCBzdGFydHMgd2l0aCAxICovCisJCWVu dHJ5LT5jb250ZXh0X2lkID0gc3RhdHNfY291bnQ7CisKKwkJLyogQXBwZW5kIHRoZSBjaGls ZHJlbiBvZiB0aGUgY3VycmVudCBjb250ZXh0IHRvIHRoZSBtYWluIGxpc3QgKi8KKwkJZm9y IChNZW1vcnlDb250ZXh0IGMgPSBjdXItPmZpcnN0Y2hpbGQ7IGMgIT0gTlVMTDsgYyA9IGMt Pm5leHRjaGlsZCkKKwkJeworCQkJaWYgKGdldF9zdW1tYXJ5KQorCQkJeworCQkJCWVudHJ5 ID0gKE1lbW9yeUNvbnRleHRJZCAqKSBoYXNoX3NlYXJjaChjb250ZXh0X2lkX2xvb2t1cCwg JmMsCisJCQkJCQkJCQkJCQkJCUhBU0hfRU5URVIsICZmb3VuZCk7CisJCQkJc3RhdHNfY291 bnQgPSBzdGF0c19jb3VudCArIDE7CisJCQkJZW50cnktPmNvbnRleHRfaWQgPSBzdGF0c19j b3VudDsKKwkJCX0KKwkJCWNvbnRleHRzID0gbGFwcGVuZChjb250ZXh0cywgYyk7CisJCX0K KwkJLyogSW4gc3VtbWFyeSBvbmx5IHRoZSBmaXJzdCBsZXZlbCBjb250ZXh0cyBhcmUgZGlz cGxheWVkICovCisJCWlmIChnZXRfc3VtbWFyeSkKKwkJCWJyZWFrOworCX0KKworCS8qCisJ ICogQWxsb2NhdGUgbWVtb3J5IGluIHRoaXMgcHJvY2VzcydzIGRzYSBmb3Igc3RvcmluZyBz dGF0aXN0aWNzIG9mIHRoZSB0aGUKKwkgKiBtZW1vcnkgY29udGV4dHMgdXB0byBudW1fc3Rh dHMsIGZvciBjb250ZXh0cyB0aGF0IGRvbid0IGZpdCBpbiB0aGUgRFNBCisJICogc2VnbWVu dCwgYSBjdW11bGF0aXZlIHRvdGFsIGlzIHdyaXR0ZW4gYXMgdGhlIGxhc3QgcmVjb3JkIGlu IHRoZSBEU0EKKwkgKiBzZWdtZW50LgorCSAqLworCXN0YXRzX2NvdW50ID0gc3RhdHNfY291 bnQgPiBudW1fc3RhdHMgPyBudW1fc3RhdHMgOiBzdGF0c19jb3VudDsKKworCS8qIEF0dGFj aCB0byBEU0Egc2VnbWVudCAqLworCUxXTG9ja0FjcXVpcmUoJm1lbUN0eFN0YXRlW2lkeF0u bHdfbG9jaywgTFdfRVhDTFVTSVZFKTsKKwlhcmVhID0gZHNhX2F0dGFjaChtZW1DdHhTdGF0 ZVtpZHhdLm1lbXN0YXRzX2RzYV9oYW5kbGUpOworCW1lbUN0eFN0YXRlW2lkeF0ucHJvY19p ZCA9IE15UHJvY1BpZDsKKwlnZXRfc3VtbWFyeSA9IG1lbUN0eFN0YXRlW2lkeF0uZ2V0X3N1 bW1hcnk7CisKKwkvKiBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIHByZXZpb3VzbHkgYnkg dGhlIHNhbWUgcHJvY2VzcyAqLworCWlmIChEc2FQb2ludGVySXNWYWxpZChtZW1DdHhTdGF0 ZVtpZHhdLm1lbXN0YXRzX2RzYV9wb2ludGVyKSkKKwl7CisJCWRzYV9mcmVlKGFyZWEsIG1l bUN0eFN0YXRlW2lkeF0ubWVtc3RhdHNfZHNhX3BvaW50ZXIpOworCQltZW1DdHhTdGF0ZVtp ZHhdLm1lbXN0YXRzX2RzYV9wb2ludGVyID0gSW52YWxpZERzYVBvaW50ZXI7CisJfQorCW1l bUN0eFN0YXRlW2lkeF0ubWVtc3RhdHNfZHNhX3BvaW50ZXIgPSBkc2FfYWxsb2NhdGUwKGFy ZWEsIHN0YXRzX2NvdW50ICogc2l6ZW9mKE1lbW9yeUNvbnRleHRJbmZvKSk7CisJbWVtaW5m byA9IChNZW1vcnlDb250ZXh0SW5mbyAqKSBkc2FfZ2V0X2FkZHJlc3MoYXJlYSwgbWVtQ3R4 U3RhdGVbaWR4XS5tZW1zdGF0c19kc2FfcG9pbnRlcik7CisKKwlpZiAoZ2V0X3N1bW1hcnkp CisJeworCQlpbnQJCQljdHhfaWQgPSAwOworCQlMaXN0CSAgICpwYXRoID0gTklMOworCisJ CS8qIENvcHkgVG9wTWVtb3J5Q29udGV4dCBzdGF0aXN0aWNzIHRvIERTQSAqLworCQlwYXRo ID0gbGNvbnNfaW50KDEsIHBhdGgpOworCQltZW1zZXQoJnN0YXQsIDAsIHNpemVvZihzdGF0 KSk7CisJCSgqVG9wTWVtb3J5Q29udGV4dC0+bWV0aG9kcy0+c3RhdHMpIChUb3BNZW1vcnlD b250ZXh0LCBOVUxMLCBOVUxMLCAmc3RhdCwgdHJ1ZSk7CisJCVB1Ymxpc2hNZW1vcnlDb250 ZXh0KG1lbWluZm8sIGN0eF9pZCwgVG9wTWVtb3J5Q29udGV4dCwgcGF0aCwgTlVMTCwgc3Rh dCwgMSk7CisJCWN0eF9pZCA9IGN0eF9pZCArIDE7CisKKwkJLyoKKwkJICogQ29weSBzdGF0 aXN0aWNzIGZvciBlYWNoIG9mIFRvcE1lbW9yeUNvbnRleHRzIGNoaWxkcmVuKFhYWC4gTWFr ZSBpdAorCQkgKiBjYXBwZWQgYXQgMTAwKS4gVGhpcyBpbmNsdWRlcyBzdGF0aXN0aWNzIG9m IGFsbCBvZiB0aGVpciBjaGlsZHJlbgorCQkgKiB1cHRvIGxldmVsIDEwMAorCQkgKi8KKwkJ Zm9yIChNZW1vcnlDb250ZXh0IGMgPSBUb3BNZW1vcnlDb250ZXh0LT5maXJzdGNoaWxkOyBj ICE9IE5VTEw7IGMgPSBjLT5uZXh0Y2hpbGQpCisJCXsKKwkJCU1lbW9yeUNvbnRleHRDb3Vu dGVycyBncmFuZF90b3RhbHM7CisJCQlpbnQJCQludW1fY29udGV4dHMgPSAwOworCQkJY2hh cgkJY2xpcHBlZF9pZGVudFtNRU1PUllfQ09OVEVYVF9JREVOVF9ESVNQTEFZX1NJWkVdOwor CisJCQlwYXRoID0gTklMOworCQkJbWVtc2V0KCZncmFuZF90b3RhbHMsIDAsIHNpemVvZihn cmFuZF90b3RhbHMpKTsKKworCQkJTWVtb3J5Q29udGV4dFN0YXRzSW50ZXJuYWwoYywgMCwg MTAwLCAxMDAsICZncmFuZF90b3RhbHMsIFBSSU5UX1NUQVRTX05PTkUsICZudW1fY29udGV4 dHMpOworCisJCQkvKgorCQkJICogRmlndXJlIG91dCB0aGUgdHJhbnNpZW50IGNvbnRleHRf aWQgb2YgdGhpcyBjb250ZXh0IGFuZCBlYWNoIG9mCisJCQkgKiBpdHMgYW5jZXN0b3JzLgor CQkJICovCisJCQlmb3IgKE1lbW9yeUNvbnRleHQgY3VyX2NvbnRleHQgPSBjOyBjdXJfY29u dGV4dCAhPSBOVUxMOyBjdXJfY29udGV4dCA9IGN1cl9jb250ZXh0LT5wYXJlbnQpCisJCQl7 CisJCQkJTWVtb3J5Q29udGV4dElkICpjdXJfZW50cnk7CisKKwkJCQljdXJfZW50cnkgPSBo YXNoX3NlYXJjaChjb250ZXh0X2lkX2xvb2t1cCwgJmN1cl9jb250ZXh0LCBIQVNIX0ZJTkQs ICZmb3VuZCk7CisKKwkJCQlpZiAoIWZvdW5kKQorCQkJCXsKKwkJCQkJZWxvZyhMT0csICJo YXNoIHRhYmxlIGNvcnJ1cHRlZCwgY2FuJ3QgY29uc3RydWN0IHBhdGggdmFsdWUiKTsKKwkJ CQkJYnJlYWs7CisJCQkJfQorCQkJCXBhdGggPSBsY29uc19pbnQoY3VyX2VudHJ5LT5jb250 ZXh0X2lkLCBwYXRoKTsKKwkJCX0KKwkJCS8qIFRyaW0gYW5kIGNvcHkgdGhlIGlkZW50aWZp ZXIgaWYgaXQgaXMgbm90IHNldCB0byBOVUxMICovCisJCQlpZiAoYy0+aWRlbnQgIT0gTlVM TCkKKwkJCXsKKwkJCQlpbnQJCQlpZGxlbiA9IHN0cmxlbihjLT5pZGVudCk7CisKKwkJCQkv KgorCQkJCSAqIFNvbWUgaWRlbnRpZmllcnMgc3VjaCBhcyBTUUwgcXVlcnkgc3RyaW5nIGNh biBiZSB2ZXJ5IGxvbmcsCisJCQkJICogdHJ1bmNhdGUgb3ZlcnNpemUgaWRlbnRpZmllcnMu CisJCQkJICovCisJCQkJaWYgKGlkbGVuID49IE1FTU9SWV9DT05URVhUX0lERU5UX0RJU1BM QVlfU0laRSkKKwkJCQkJaWRsZW4gPSBwZ19tYmNsaXBsZW4oYy0+aWRlbnQsIGlkbGVuLCBN RU1PUllfQ09OVEVYVF9JREVOVF9ESVNQTEFZX1NJWkUgLSAxKTsKKworCQkJCW1lbWNweShj bGlwcGVkX2lkZW50LCBjLT5pZGVudCwgaWRsZW4pOworCQkJCWNsaXBwZWRfaWRlbnRbaWRs ZW5dID0gJ1wwJzsKKwkJCX0KKwkJCVB1Ymxpc2hNZW1vcnlDb250ZXh0KG1lbWluZm8sIGN0 eF9pZCwgYywgcGF0aCwgKGMtPmlkZW50ICE9IE5VTEwgPyBjbGlwcGVkX2lkZW50IDogTlVM TCksIGdyYW5kX3RvdGFscywgbnVtX2NvbnRleHRzKTsKKwkJCWN0eF9pZCA9IGN0eF9pZCAr IDE7CisJCX0KKwkJLyogRm9yIHN1bW1hcnkgbW9kZSwgdG90YWxfc3RhdHMgYW5kIGluX21l bW9yeV9zdGF0cyByZW1haW4gdGhlIHNhbWUgKi8KKwkJbWVtQ3R4U3RhdGVbaWR4XS5pbl9t ZW1vcnlfc3RhdHMgPSBjdHhfaWQ7CisJCW1lbUN0eFN0YXRlW2lkeF0udG90YWxfc3RhdHMg PSBjdHhfaWQ7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlmb3JlYWNoX3B0cihNZW1vcnlD b250ZXh0RGF0YSwgY3VyLCBjb250ZXh0cykKKwl7CisJCUxpc3QJICAgKnBhdGggPSBOSUw7 CisJCWNoYXIJCWNsaXBwZWRfaWRlbnRbTUVNT1JZX0NPTlRFWFRfSURFTlRfRElTUExBWV9T SVpFXTsKKworCQkvKgorCQkgKiBGaWd1cmUgb3V0IHRoZSB0cmFuc2llbnQgY29udGV4dF9p ZCBvZiB0aGlzIGNvbnRleHQgYW5kIGVhY2ggb2YgaXRzCisJCSAqIGFuY2VzdG9ycy4KKwkJ ICovCisJCWZvciAoTWVtb3J5Q29udGV4dCBjdXJfY29udGV4dCA9IGN1cjsgY3VyX2NvbnRl eHQgIT0gTlVMTDsgY3VyX2NvbnRleHQgPSBjdXJfY29udGV4dC0+cGFyZW50KQorCQl7CisJ CQlNZW1vcnlDb250ZXh0SWQgKmN1cl9lbnRyeTsKKworCQkJY3VyX2VudHJ5ID0gaGFzaF9z ZWFyY2goY29udGV4dF9pZF9sb29rdXAsICZjdXJfY29udGV4dCwgSEFTSF9GSU5ELCAmZm91 bmQpOworCisJCQlpZiAoIWZvdW5kKQorCQkJeworCQkJCWVsb2coTE9HLCAiaGFzaCB0YWJs ZSBjb3JydXB0ZWQsIGNhbid0IGNvbnN0cnVjdCBwYXRoIHZhbHVlIik7CisJCQkJYnJlYWs7 CisJCQl9CisJCQlwYXRoID0gbGNvbnNfaW50KGN1cl9lbnRyeS0+Y29udGV4dF9pZCwgcGF0 aCk7CisJCX0KKwkJLyogVHJpbSBhbmQgY29weSB0aGUgaWRlbnRpZmllciBpZiBpdCBpcyBu b3Qgc2V0IHRvIE5VTEwgKi8KKwkJaWYgKGN1ci0+aWRlbnQgIT0gTlVMTCkKKwkJeworCQkJ aW50CQkJaWRsZW4gPSBzdHJsZW4oY3VyLT5pZGVudCk7CisKKwkJCS8qCisJCQkgKiBTb21l IGlkZW50aWZpZXJzIHN1Y2ggYXMgU1FMIHF1ZXJ5IHN0cmluZyBjYW4gYmUgdmVyeSBsb25n LAorCQkJICogdHJ1bmNhdGUgb3ZlcnNpemUgaWRlbnRpZmllcnMuCisJCQkgKi8KKwkJCWlm IChpZGxlbiA+PSBNRU1PUllfQ09OVEVYVF9JREVOVF9ESVNQTEFZX1NJWkUpCisJCQkJaWRs ZW4gPSBwZ19tYmNsaXBsZW4oY3VyLT5pZGVudCwgaWRsZW4sIE1FTU9SWV9DT05URVhUX0lE RU5UX0RJU1BMQVlfU0laRSAtIDEpOworCisJCQltZW1jcHkoY2xpcHBlZF9pZGVudCwgY3Vy LT5pZGVudCwgaWRsZW4pOworCQkJY2xpcHBlZF9pZGVudFtpZGxlbl0gPSAnXDAnOworCQl9 CisJCWlmIChjb250ZXh0X2lkIDw9IChudW1fc3RhdHMgLSAyKSkKKwkJeworCQkJLyogRXhh bWluZSB0aGUgY29udGV4dCBzdGF0cyAqLworCQkJbWVtc2V0KCZzdGF0LCAwLCBzaXplb2Yo c3RhdCkpOworCQkJKCpjdXItPm1ldGhvZHMtPnN0YXRzKSAoY3VyLCBOVUxMLCBOVUxMLCAm c3RhdCwgdHJ1ZSk7CisJCQkvKiBDb3B5IHN0YXRpc3RpY3MgdG8gRFNNIG1lbW9yeSAqLwor CQkJUHVibGlzaE1lbW9yeUNvbnRleHQobWVtaW5mbywgY29udGV4dF9pZCwgY3VyLCBwYXRo LCAoY3VyLT5pZGVudCAhPSBOVUxMID8gY2xpcHBlZF9pZGVudCA6IE5VTEwpLCBzdGF0LCAx KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIEV4YW1pbmUgdGhlIGNvbnRleHQgc3RhdHMg Ki8KKwkJCW1lbXNldCgmc3RhdCwgMCwgc2l6ZW9mKHN0YXQpKTsKKwkJCSgqY3VyLT5tZXRo b2RzLT5zdGF0cykgKGN1ciwgTlVMTCwgTlVMTCwgJnN0YXQsIHRydWUpOworCisJCQltZW1p bmZvW251bV9zdGF0cyAtIDFdLnRvdGFsc3BhY2UgKz0gc3RhdC50b3RhbHNwYWNlOworCQkJ bWVtaW5mb1tudW1fc3RhdHMgLSAxXS5uYmxvY2tzICs9IHN0YXQubmJsb2NrczsKKwkJCW1l bWluZm9bbnVtX3N0YXRzIC0gMV0uZnJlZXNwYWNlICs9IHN0YXQuZnJlZXNwYWNlOworCQkJ bWVtaW5mb1tudW1fc3RhdHMgLSAxXS5mcmVlY2h1bmtzICs9IHN0YXQuZnJlZWNodW5rczsK KwkJfQorCisJCS8qCisJCSAqIERTQSBtYXggbGltaXQgaXMgcmVhY2hlZCwgd3JpdGUgdG90 YWwgb2YgdGhlIHJlbWFpbmluZyBzdGF0aXN0aWNzLgorCQkgKi8KKwkJaWYgKGNvbnRleHRf aWQgPT0gKG51bV9zdGF0cyAtIDIpICYmIGNvbnRleHRfaWQgPCAoc3RhdHNfY291bnQgLSAx KSkKKwkJeworCQkJbWVtQ3R4U3RhdGVbaWR4XS5pbl9tZW1vcnlfc3RhdHMgPSBjb250ZXh0 X2lkICsgMTsKKwkJCXN0cm5jcHkobWVtaW5mb1tudW1fc3RhdHMgLSAxXS5uYW1lLCAiUmVt YWluaW5nIFRvdGFscyIsIDE2KTsKKwkJfQorCQljb250ZXh0X2lkKys7CisJfQorCWlmIChj b250ZXh0X2lkIDwgKG51bV9zdGF0cyAtIDIpKQorCXsKKwkJbWVtQ3R4U3RhdGVbaWR4XS5p bl9tZW1vcnlfc3RhdHMgPSBjb250ZXh0X2lkOworCX0KKwkvKiBSZXBvcnQgbnVtYmVyIG9m IGFnZ3JlZ2F0ZWQgbWVtb3J5IGNvbnRleHRzICovCisJZWxzZQorCXsKKwkJbWVtaW5mb1tu dW1fc3RhdHMgLSAxXS5udW1fY29udGV4dHMgPSBjb250ZXh0X2lkIC0gbWVtQ3R4U3RhdGVb aWR4XS5pbl9tZW1vcnlfc3RhdHM7CisJfQorCW1lbUN0eFN0YXRlW2lkeF0udG90YWxfc3Rh dHMgPSBjb250ZXh0X2lkOworY2xlYW51cDoKKworCS8qCisJICogU2lnbmFsIGFsbCB0aGUg d2FpdGluZyBjbGllbnQgYmFja2VuZHMgYWZ0ZXIgc2V0dGluZyB0aGUgZXhpdCBjb25kaXRp b24KKwkgKiBmbGFnCisJICovCisJTFdMb2NrUmVsZWFzZSgmbWVtQ3R4U3RhdGVbaWR4XS5s d19sb2NrKTsKKwlDb25kaXRpb25WYXJpYWJsZUJyb2FkY2FzdCgmbWVtQ3R4U3RhdGVbaWR4 XS5tZW1jdHhfY3YpOworCS8qIERlbGV0ZSB0aGUgaGFzaCB0YWJsZSBtZW1vcnkgY29udGV4 dCAqLworCU1lbW9yeUNvbnRleHREZWxldGUoc3RhdF9jeHQpOworCisJZHNhX2RldGFjaChh cmVhKTsKK30KKworc3RhdGljIHZvaWQKK1B1Ymxpc2hNZW1vcnlDb250ZXh0KE1lbW9yeUNv bnRleHRJbmZvICogbWVtY3R4X2luZm8sIGludCBjdXJyX2lkLCBNZW1vcnlDb250ZXh0IGNv bnRleHQsIExpc3QgKnBhdGgsIGNoYXIgKmNsaXBwZWRfaWRlbnQsIE1lbW9yeUNvbnRleHRD b3VudGVycyBzdGF0LCBpbnQgbnVtX2NvbnRleHRzKQoreworCWNoYXIJICAgKnR5cGU7CisK KwlpZiAoY29udGV4dC0+bmFtZSAhPSBOVUxMKQorCXsKKwkJQXNzZXJ0KHN0cmxlbihjb250 ZXh0LT5uYW1lKSA8IE1FTU9SWV9DT05URVhUX0lERU5UX0RJU1BMQVlfU0laRSk7CisJCXN0 cm5jcHkobWVtY3R4X2luZm9bY3Vycl9pZF0ubmFtZSwgY29udGV4dC0+bmFtZSwgc3RybGVu KGNvbnRleHQtPm5hbWUpKTsKKwl9CisJZWxzZQorCQltZW1jdHhfaW5mb1tjdXJyX2lkXS5u YW1lWzBdID0gJ1wwJzsKKworCWlmIChjbGlwcGVkX2lkZW50ICE9IE5VTEwpCisJeworCQkv KgorCQkgKiBUbyBiZSBjb25zaXN0ZW50IHdpdGggbG9nZ2luZyBvdXRwdXQsIHdlIGxhYmVs IGR5bmFoYXNoIGNvbnRleHRzCisJCSAqIHdpdGgganVzdCB0aGUgaGFzaCB0YWJsZSBuYW1l IGFzIHdpdGggTWVtb3J5Q29udGV4dFN0YXRzUHJpbnQoKS4KKwkJICovCisJCWlmICghc3Ry bmNtcChjb250ZXh0LT5uYW1lLCAiZHluYWhhc2giLCA4KSkKKwkJeworCQkJc3RybmNweSht ZW1jdHhfaW5mb1tjdXJyX2lkXS5uYW1lLCBjbGlwcGVkX2lkZW50LCBzdHJsZW4oY2xpcHBl ZF9pZGVudCkpOworCQkJbWVtY3R4X2luZm9bY3Vycl9pZF0uaWRlbnRbMF0gPSAnXDAnOwor CQl9CisJCWVsc2UKKwkJCXN0cm5jcHkobWVtY3R4X2luZm9bY3Vycl9pZF0uaWRlbnQsIGNs aXBwZWRfaWRlbnQsIHN0cmxlbihjbGlwcGVkX2lkZW50KSk7CisJfQorCWVsc2UKKwkJbWVt Y3R4X2luZm9bY3Vycl9pZF0uaWRlbnRbMF0gPSAnXDAnOworCisJbWVtY3R4X2luZm9bY3Vy cl9pZF0ucGF0aF9sZW5ndGggPSBsaXN0X2xlbmd0aChwYXRoKTsKKwlmb3JlYWNoX2ludChp LCBwYXRoKQorCQltZW1jdHhfaW5mb1tjdXJyX2lkXS5wYXRoW2ZvcmVhY2hfY3VycmVudF9p bmRleChpKV0gPSBJbnQzMkdldERhdHVtKGkpOworCisJc3dpdGNoIChjb250ZXh0LT50eXBl KQorCXsKKwkJY2FzZSBUX0FsbG9jU2V0Q29udGV4dDoKKwkJCXR5cGUgPSAiQWxsb2NTZXQi OworCQkJc3RybmNweShtZW1jdHhfaW5mb1tjdXJyX2lkXS50eXBlLCB0eXBlLCBzdHJsZW4o dHlwZSkpOworCQkJYnJlYWs7CisJCWNhc2UgVF9HZW5lcmF0aW9uQ29udGV4dDoKKwkJCXR5 cGUgPSAiR2VuZXJhdGlvbiI7CisJCQlzdHJuY3B5KG1lbWN0eF9pbmZvW2N1cnJfaWRdLnR5 cGUsIHR5cGUsIHN0cmxlbih0eXBlKSk7CisJCQlicmVhazsKKwkJY2FzZSBUX1NsYWJDb250 ZXh0OgorCQkJdHlwZSA9ICJTbGFiIjsKKwkJCXN0cm5jcHkobWVtY3R4X2luZm9bY3Vycl9p ZF0udHlwZSwgdHlwZSwgc3RybGVuKHR5cGUpKTsKKwkJCWJyZWFrOworCQljYXNlIFRfQnVt cENvbnRleHQ6CisJCQl0eXBlID0gIkJ1bXAiOworCQkJc3RybmNweShtZW1jdHhfaW5mb1tj dXJyX2lkXS50eXBlLCB0eXBlLCBzdHJsZW4odHlwZSkpOworCQkJYnJlYWs7CisJCWRlZmF1 bHQ6CisJCQl0eXBlID0gIj8/PyI7CisJCQlzdHJuY3B5KG1lbWN0eF9pbmZvW2N1cnJfaWRd LnR5cGUsIHR5cGUsIHN0cmxlbih0eXBlKSk7CisJCQlicmVhazsKKwl9CisJbWVtY3R4X2lu Zm9bY3Vycl9pZF0udG90YWxzcGFjZSA9IHN0YXQudG90YWxzcGFjZTsKKwltZW1jdHhfaW5m b1tjdXJyX2lkXS5uYmxvY2tzID0gc3RhdC5uYmxvY2tzOworCW1lbWN0eF9pbmZvW2N1cnJf aWRdLmZyZWVzcGFjZSA9IHN0YXQuZnJlZXNwYWNlOworCW1lbWN0eF9pbmZvW2N1cnJfaWRd LmZyZWVjaHVua3MgPSBzdGF0LmZyZWVjaHVua3M7CisJbWVtY3R4X2luZm9bY3Vycl9pZF0u bnVtX2NvbnRleHRzID0gbnVtX2NvbnRleHRzOworfQorCiB2b2lkICoKIHBhbGxvYyhTaXpl IHNpemUpCiB7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0 IGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAppbmRleCBiMzdlOGE2Zjg4Mi4u NGQ2YWUwNzI4YWMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5k YXQKKysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdApAQCAtODQ0OSw2ICs4 NDQ5LDE2IEBACiAgIHByb3JldHR5cGUgPT4gJ2Jvb2wnLCBwcm9hcmd0eXBlcyA9PiAnaW50 NCcsCiAgIHByb3NyYyA9PiAncGdfbG9nX2JhY2tlbmRfbWVtb3J5X2NvbnRleHRzJyB9LAog CisjIHB1Ymxpc2hpbmcgbWVtb3J5IGNvbnRleHRzIG9mIHRoZSBzcGVjaWZpZWQgcG9zdGdy ZXMgcHJvY2VzcworeyBvaWQgPT4gJzIxNzMnLCBkZXNjciA9PiAncHVibGlzaCBtZW1vcnkg Y29udGV4dHMgb2YgdGhlIHNwZWNpZmllZCBiYWNrZW5kJywKKyAgcHJvbmFtZSA9PiAncGdf Z2V0X3Byb2Nlc3NfbWVtb3J5X2NvbnRleHRzJywgcHJvdm9sYXRpbGUgPT4gJ3YnLAorICBw cm9yb3dzID0+ICcxMDAnLCBwcm9yZXRzZXQgPT4gJ3QnLCBwcm9wYXJhbGxlbCA9PiAncics CisgIHByb3JldHR5cGUgPT4gJ3JlY29yZCcsIHByb2FyZ3R5cGVzID0+ICdpbnQ0IGJvb2wn LAorICBwcm9hbGxhcmd0eXBlcyA9PiAne2ludDQsYm9vbCx0ZXh0LHRleHQsdGV4dCxfaW50 NCxpbnQ4LGludDgsaW50OCxpbnQ4LGludDgsaW50NH0nLAorICBwcm9hcmdtb2RlcyA9PiAn e2ksaSxvLG8sbyxvLG8sbyxvLG8sbyxvfScsCisgIHByb2FyZ25hbWVzID0+ICd7b2lkLCBz dW1tYXJ5LCBuYW1lLCBpZGVudCwgdHlwZSwgcGF0aCwgdG90YWxfYnl0ZXMsIHRvdGFsX25i bG9ja3MsIGZyZWVfYnl0ZXMsIGZyZWVfY2h1bmtzLCB1c2VkX2J5dGVzLCBudW1fYWdnX2Nv bnRleHRzfScsCisgIHByb3NyYyA9PiAncGdfZ2V0X3Byb2Nlc3NfbWVtb3J5X2NvbnRleHRz JyB9LAorCiAjIG5vbi1wZXJzaXN0ZW50IHNlcmllcyBnZW5lcmF0b3IKIHsgb2lkID0+ICcx MDY2JywgZGVzY3IgPT4gJ25vbi1wZXJzaXN0ZW50IHNlcmllcyBnZW5lcmF0b3InLAogICBw cm9uYW1lID0+ICdnZW5lcmF0ZV9zZXJpZXMnLCBwcm9yb3dzID0+ICcxMDAwJywKZGlmZiAt LWdpdCBhL3NyYy9pbmNsdWRlL21pc2NhZG1pbi5oIGIvc3JjL2luY2x1ZGUvbWlzY2FkbWlu LmgKaW5kZXggZDAxNmE5YzkyNDguLmZjNzVlYTE0M2MzIDEwMDY0NAotLS0gYS9zcmMvaW5j bHVkZS9taXNjYWRtaW4uaAorKysgYi9zcmMvaW5jbHVkZS9taXNjYWRtaW4uaApAQCAtOTYs NiArOTYsNyBAQCBleHRlcm4gUEdETExJTVBPUlQgdm9sYXRpbGUgc2lnX2F0b21pY190IElk bGVTZXNzaW9uVGltZW91dFBlbmRpbmc7CiBleHRlcm4gUEdETExJTVBPUlQgdm9sYXRpbGUg c2lnX2F0b21pY190IFByb2NTaWduYWxCYXJyaWVyUGVuZGluZzsKIGV4dGVybiBQR0RMTElN UE9SVCB2b2xhdGlsZSBzaWdfYXRvbWljX3QgTG9nTWVtb3J5Q29udGV4dFBlbmRpbmc7CiBl eHRlcm4gUEdETExJTVBPUlQgdm9sYXRpbGUgc2lnX2F0b21pY190IElkbGVTdGF0c1VwZGF0 ZVRpbWVvdXRQZW5kaW5nOworZXh0ZXJuIFBHRExMSU1QT1JUIHZvbGF0aWxlIHNpZ19hdG9t aWNfdCBQdWJsaXNoTWVtb3J5Q29udGV4dFBlbmRpbmc7CiAKIGV4dGVybiBQR0RMTElNUE9S VCB2b2xhdGlsZSBzaWdfYXRvbWljX3QgQ2hlY2tDbGllbnRDb25uZWN0aW9uUGVuZGluZzsK IGV4dGVybiBQR0RMTElNUE9SVCB2b2xhdGlsZSBzaWdfYXRvbWljX3QgQ2xpZW50Q29ubmVj dGlvbkxvc3Q7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL3Byb2NzaWduYWwu aCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvcHJvY3NpZ25hbC5oCmluZGV4IDAyMmZkOGVkOTMz Li40NzdhYjk5MzM4NiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9wcm9jc2ln bmFsLmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9wcm9jc2lnbmFsLmgKQEAgLTM1LDYg KzM1LDcgQEAgdHlwZWRlZiBlbnVtCiAJUFJPQ1NJR19XQUxTTkRfSU5JVF9TVE9QUElORywJ LyogYXNrIHdhbHNlbmRlcnMgdG8gcHJlcGFyZSBmb3Igc2h1dGRvd24gICovCiAJUFJPQ1NJ R19CQVJSSUVSLAkJCS8qIGdsb2JhbCBiYXJyaWVyIGludGVycnVwdCAgKi8KIAlQUk9DU0lH X0xPR19NRU1PUllfQ09OVEVYVCwgLyogYXNrIGJhY2tlbmQgdG8gbG9nIHRoZSBtZW1vcnkg Y29udGV4dHMgKi8KKwlQUk9DU0lHX0dFVF9NRU1PUllfQ09OVEVYVCwgLyogYXNrIGJhY2tl bmQgdG8gbG9nIHRoZSBtZW1vcnkgY29udGV4dHMgKi8KIAlQUk9DU0lHX1BBUkFMTEVMX0FQ UExZX01FU1NBR0UsIC8qIE1lc3NhZ2UgZnJvbSBwYXJhbGxlbCBhcHBseSB3b3JrZXJzICov CiAKIAkvKiBSZWNvdmVyeSBjb25mbGljdCByZWFzb25zICovCmRpZmYgLS1naXQgYS9zcmMv aW5jbHVkZS91dGlscy9tZW11dGlscy5oIGIvc3JjL2luY2x1ZGUvdXRpbHMvbWVtdXRpbHMu aAppbmRleCA4YWJjMjZhYmNlMi4uOWZhYzM5NGFhZDMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNs dWRlL3V0aWxzL21lbXV0aWxzLmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvbWVtdXRpbHMu aApAQCAtMTgsNiArMTgsOSBAQAogI2RlZmluZSBNRU1VVElMU19ICiAKICNpbmNsdWRlICJu b2Rlcy9tZW1ub2Rlcy5oIgorI2luY2x1ZGUgInN0b3JhZ2UvY29uZGl0aW9uX3ZhcmlhYmxl LmgiCisjaW5jbHVkZSAic3RvcmFnZS9sbWdyLmgiCisjaW5jbHVkZSAidXRpbHMvZHNhLmgi CiAKIAogLyoKQEAgLTQ4LDcgKzUxLDExIEBACiAKICNkZWZpbmUgQWxsb2NIdWdlU2l6ZUlz VmFsaWQoc2l6ZSkJKChTaXplKSAoc2l6ZSkgPD0gTWF4QWxsb2NIdWdlU2l6ZSkKIAorI2Rl ZmluZSBNRU1PUllfQ09OVEVYVF9JREVOVF9ESVNQTEFZX1NJWkUJMTAyNAogCisjZGVmaW5l IE1FTV9DT05URVhUX1NITUVNX1NUQVRTX1NJWkUJMzAKKyNkZWZpbmUgTUVNX0NPTlRFWFRf TUFYX0xFVkVMCTY0CisjZGVmaW5lIE1BWF9UWVBFX1NUUklOR19MRU5HVEgJNjQKIC8qCiAg KiBTdGFuZGFyZCB0b3AtbGV2ZWwgbWVtb3J5IGNvbnRleHRzLgogICoKQEAgLTExNSw2ICsx MjIsNTAgQEAgZXh0ZXJuIE1lbW9yeUNvbnRleHQgQWxsb2NTZXRDb250ZXh0Q3JlYXRlSW50 ZXJuYWwoTWVtb3J5Q29udGV4dCBwYXJlbnQsCiAJCQkJCQkJCQkJCQkgICBTaXplIGluaXRC bG9ja1NpemUsCiAJCQkJCQkJCQkJCQkgICBTaXplIG1heEJsb2NrU2l6ZSk7CiAKKy8qIER5 bmFtaWMgc2hhcmVkIG1lbW9yeSBzdGF0ZSBmb3IgTWVtb3J5IENvbnRleHQgU3RhdGlzdGlj cyByZXBvcnRpbmcgKi8KK3R5cGVkZWYgc3RydWN0IE1lbW9yeUNvbnRleHRJbmZvCit7CisJ Y2hhcgkJbmFtZVtNRU1PUllfQ09OVEVYVF9JREVOVF9ESVNQTEFZX1NJWkVdOworCWNoYXIJ CWlkZW50W01FTU9SWV9DT05URVhUX0lERU5UX0RJU1BMQVlfU0laRV07CisJRGF0dW0JCXBh dGhbTUVNX0NPTlRFWFRfTUFYX0xFVkVMXTsKKwljaGFyCQl0eXBlW01BWF9UWVBFX1NUUklO R19MRU5HVEhdOworCWludAkJCXBhdGhfbGVuZ3RoOworCWludDY0CQl0b3RhbHNwYWNlOwor CWludDY0CQluYmxvY2tzOworCWludDY0CQlmcmVlc3BhY2U7CisJaW50NjQJCWZyZWVjaHVu a3M7CisJaW50CQkJbnVtX2NvbnRleHRzOworfQkJCU1lbW9yeUNvbnRleHRJbmZvOworCit0 eXBlZGVmIHN0cnVjdCBNZW1vcnlDb250ZXh0U3RhdGUKK3sKKwlDb25kaXRpb25WYXJpYWJs ZSBtZW1jdHhfY3Y7CisJTFdMb2NrCQlsd19sb2NrOworCWludAkJCXByb2NfaWQ7CisJaW50 CQkJaW5fbWVtb3J5X3N0YXRzOworCWludAkJCXRvdGFsX3N0YXRzOworCWJvb2wJCWdldF9z dW1tYXJ5OworCWRzYV9oYW5kbGUJbWVtc3RhdHNfZHNhX2hhbmRsZTsKKwlkc2FfcG9pbnRl ciBtZW1zdGF0c19kc2FfcG9pbnRlcjsKKworfQkJCU1lbW9yeUNvbnRleHRTdGF0ZTsKKwor LyoKKyAqIE1lbW9yeUNvbnRleHRJZAorICoJCVVzZWQgZm9yIHN0b3JhZ2Ugb2YgdHJhbnNp ZW50IGlkZW50aWZpZXJzIGZvcgorICoJCXBnX2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0 cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTWVtb3J5Q29udGV4dElkCit7CisJTWVtb3J5Q29u dGV4dCBjb250ZXh0OworCWludAkJCWNvbnRleHRfaWQ7Cit9CQkJTWVtb3J5Q29udGV4dElk OworCitleHRlcm4gUEdETExJTVBPUlQgTWVtb3J5Q29udGV4dFN0YXRlICogbWVtQ3R4U3Rh dGU7CitleHRlcm4gdm9pZCBQcm9jZXNzR2V0TWVtb3J5Q29udGV4dEludGVycnVwdCh2b2lk KTsKK2V4dGVybiB2b2lkIEhhbmRsZUdldE1lbW9yeUNvbnRleHRJbnRlcnJ1cHQodm9pZCk7 CitleHRlcm4gdm9pZCBNZW1DdHhTaG1lbUluaXQodm9pZCk7CisKIC8qCiAgKiBUaGlzIHdy YXBwZXIgbWFjcm8gZXhpc3RzIHRvIGNoZWNrIGZvciBub24tY29uc3RhbnQgc3RyaW5ncyB1 c2VkIGFzIGNvbnRleHQKICAqIG5hbWVzOyB0aGF0J3Mgbm8gbG9uZ2VyIHN1cHBvcnRlZC4g IChVc2UgTWVtb3J5Q29udGV4dFNldElkZW50aWZpZXIgaWYgeW91CmRpZmYgLS1naXQgYS9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dCBiL3NyYy90ZXN0L3JlZ3Jl c3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0CmluZGV4IDkxMDg5YWMyMTVmLi41ZTMzODIxMzJj MyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQK KysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQKQEAgLTIyMywz ICsyMjMsMTUgQEAgc2VsZWN0IGNvdW50KGRpc3RpbmN0IHV0Y19vZmZzZXQpID49IDI0IGFz IG9rIGZyb20gcGdfdGltZXpvbmVfYWJicmV2czsKICB0CiAoMSByb3cpCiAKK0RPICQkCitE RUNMQVJFCisgICAgY2hlY2twb2ludGVyX3BpZCBpbnQ7CisgICAgciBSRUNPUkQ7CitCRUdJ TgorICAgICAgICBTRUxFQ1QgcGlkIGZyb20gcGdfc3RhdF9hY3Rpdml0eSB3aGVyZSBiYWNr ZW5kX3R5cGU9J2NoZWNrcG9pbnRlcicgSU5UTyBjaGVja3BvaW50ZXJfcGlkOworCisgICAg ICAgIHNlbGVjdCB0eXBlLCBuYW1lLCBpZGVudAorICAgICAgICBmcm9tIHBnX2dldF9wcm9j ZXNzX21lbW9yeV9jb250ZXh0cyhjaGVja3BvaW50ZXJfcGlkLCBmYWxzZSkgd2hlcmUgcGF0 aCA9ICd7MH0nIGludG8gcjsKKwlSQUlTRSBOT1RJQ0UgJyUnLCByOworRU5EICQkOworTk9U SUNFOiAgKEFsbG9jU2V0LFRvcE1lbW9yeUNvbnRleHQsKQpkaWZmIC0tZ2l0IGEvc3JjL3Rl c3QvcmVncmVzcy9zcWwvc3lzdmlld3Muc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3lz dmlld3Muc3FsCmluZGV4IGIyYTc5MjM3NTQzLi5mMzEyN2ZlYTQwMCAxMDA2NDQKLS0tIGEv c3JjL3Rlc3QvcmVncmVzcy9zcWwvc3lzdmlld3Muc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jl c3Mvc3FsL3N5c3ZpZXdzLnNxbApAQCAtOTgsMyArOTgsMTUgQEAgc2V0IHRpbWV6b25lX2Fi YnJldmlhdGlvbnMgPSAnQXVzdHJhbGlhJzsKIHNlbGVjdCBjb3VudChkaXN0aW5jdCB1dGNf b2Zmc2V0KSA+PSAyNCBhcyBvayBmcm9tIHBnX3RpbWV6b25lX2FiYnJldnM7CiBzZXQgdGlt ZXpvbmVfYWJicmV2aWF0aW9ucyA9ICdJbmRpYSc7CiBzZWxlY3QgY291bnQoZGlzdGluY3Qg dXRjX29mZnNldCkgPj0gMjQgYXMgb2sgZnJvbSBwZ190aW1lem9uZV9hYmJyZXZzOworCitE TyAkJAorREVDTEFSRQorICAgIGNoZWNrcG9pbnRlcl9waWQgaW50OworICAgIHIgUkVDT1JE OworQkVHSU4KKyAgICAgICAgU0VMRUNUIHBpZCBmcm9tIHBnX3N0YXRfYWN0aXZpdHkgd2hl cmUgYmFja2VuZF90eXBlPSdjaGVja3BvaW50ZXInIElOVE8gY2hlY2twb2ludGVyX3BpZDsK KworICAgICAgICBzZWxlY3QgdHlwZSwgbmFtZSwgaWRlbnQKKyAgICAgICAgZnJvbSBwZ19n ZXRfcHJvY2Vzc19tZW1vcnlfY29udGV4dHMoY2hlY2twb2ludGVyX3BpZCwgZmFsc2UpIHdo ZXJlIHBhdGggPSAnezB9JyBpbnRvIHI7CisJUkFJU0UgTk9USUNFICclJywgcjsKK0VORCAk JDsKLS0gCjIuNDcuMQoK --------------0AyQ79lCUO75yOC3vfsys20E Content-Type: text/x-patch; charset=UTF-8; name="vtomas-0002-review.patch" Content-Disposition: attachment; filename="vtomas-0002-review.patch" Content-Transfer-Encoding: base64 RnJvbSAwZWY1MzZhMjY0MDM5NzNiMDgxZmQxNGRlNzllMDQ3Y2QwY2QxYTEzIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzQHZvbmRyYS5tZT4K RGF0ZTogTW9uLCA2IEphbiAyMDI1IDE5OjIyOjE0ICswMTAwClN1YmplY3Q6IFtQQVRDSCB2 dG9tYXMgMi8yXSByZXZpZXcKCi0tLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L21jeHRmdW5j cy5jIHwgMTA5ICsrKysrKysrKysrKysrKysrKysrKysrKystLS0tLQogc3JjL2JhY2tlbmQv dXRpbHMvbW1nci9tY3h0LmMgICAgIHwgIDkzICsrKysrKysrKysrKysrKysrLS0tLS0tLS0K IHNyYy9pbmNsdWRlL3V0aWxzL21lbXV0aWxzLmggICAgICB8ICAgNSArLQogMyBmaWxlcyBj aGFuZ2VkLCAxNTkgaW5zZXJ0aW9ucygrKSwgNDggZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L21jeHRmdW5jcy5jIGIvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L21jeHRmdW5jcy5jCmluZGV4IGMwNjdjZGY4NzA5Li5mM2ZmZDY5MzdhNSAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L21jeHRmdW5jcy5jCisrKyBiL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9tY3h0ZnVuY3MuYwpAQCAtMzA3LDE2ICszMDcsMjYgQEAgcGdf bG9nX2JhY2tlbmRfbWVtb3J5X2NvbnRleHRzKFBHX0ZVTkNUSU9OX0FSR1MpCiAgKiBwZ19n ZXRfcHJvY2Vzc19tZW1vcnlfY29udGV4dHMKICAqCQlTaWduYWwgYSBiYWNrZW5kIG9yIGFu IGF1eGlsaWFyeSBwcm9jZXNzIHRvIHNlbmQgaXRzIG1lbW9yeSBjb250ZXh0cy4KICAqCisg KiBCeSBkZWZhdWx0LCBvbmx5IHN1cGVydXNlcnMgYXJlIGFsbG93ZWQgdG8gc2lnbmFsIHRv IHJldHVybiB0aGUgbWVtb3J5CisgKiBjb250ZXh0cyBiZWNhdXNlIGFsbG93aW5nIGFueSB1 c2VycyB0byBpc3N1ZSB0aGlzIHJlcXVlc3QgYXQgYW4gdW5ib3VuZGVkCisgKiByYXRlIHdv dWxkIGNhdXNlIGxvdHMgb2YgbG9nIG1lc3NhZ2VzIGFuZCB3aGljaCBjYW4gbGVhZCB0byBk ZW5pYWwgb2YKKyAqIHNlcnZpY2UuIEFkZGl0aW9uYWwgcm9sZXMgY2FuIGJlIHBlcm1pdHRl ZCB3aXRoIEdSQU5ULgorICoKICAqIE9uIHJlY2VpcHQgb2YgdGhpcyBzaWduYWwsIGEgYmFj a2VuZCBvciBhbiBhdXhpbGlhcnkgcHJvY2VzcyBzZXRzIHRoZSBmbGFnCiAgKiBpbiB0aGUg c2lnbmFsIGhhbmRsZXIsIHdoaWNoIGNhdXNlcyB0aGUgbmV4dCBDSEVDS19GT1JfSU5URVJS VVBUUygpCi0gKiBvciBwcm9jZXNzLXNwZWNpZmljIGludGVycnVwdCBoYW5kbGVyIHRvIGNv cHkgdGhlIG1lbW9yeSBjb250ZXh0IHN0YXRpc3RpY3MKLSAqIGluIGEgZHluYW1pYyBzaGFy ZWQgbWVtb3J5IHNwYWNlLiBUaGUgc3RhdGlzdGljcyBmb3IgY29udGV4dHMgdGhhdCBkbyBu b3QgZml0IGluCi0gKiBzaGFyZWQgbWVtb3J5IGFyZWEgYXJlIHN0b3JlZCBhcyBhIGN1bXVs YXRpdmUgdG90YWwgb2YgdGhvc2UgY29udGV4dHMsCi0gKiBhdCB0aGUgZW5kIGluIHRoZSBk eW5hbWljIHNoYXJlZCBtZW1vcnkuCi0gKiBXYWl0IGZvciB0aGUgYmFja2VuZCB0byBzZW5k IHNpZ25hbCBvbiB0aGUgY29uZGl0aW9uIHZhcmlhYmxlIGFmdGVyCi0gKiB3cml0aW5nIHN0 YXRpc3RpY3MgdG8gYSBzaGFyZWQgbWVtb3J5LgotICogT25jZSBjb25kaXRpb24gdmFyaWFi bGUgY29tZXMgb3V0IG9mIHNsZWVwLCBjaGVjayBpZiB0aGUgcmVxdWlyZWQKLSAqIGJhY2tl bmRzIHN0YXRpc3RpY3MgYXJlIGF2YWlsYWJsZSB0byByZWFkIGFuZCBkaXNwbGF5LgorICog b3IgcHJvY2Vzcy1zcGVjaWZpYyBpbnRlcnJ1cHQgaGFuZGxlciB0byBjb3B5IHRoZSBtZW1v cnkgY29udGV4dCBkZXRhaWxzCisgKiB0byBhIGR5bmFtaWMgc2hhcmVkIG1lbW9yeSBzcGFj ZS4KKyAqCisgKiBUaGUgc2hhcmVkIG1lbW9yeSBidWZmZXIgaGFzIGEgbGltaXRlZCBzaXpl IC0gaXQgdGhlIHByb2Nlc3MgaGFzIHRvbyBtYW55CisgKiBtZW1vcnkgY29udGV4dHMsIHRo ZSBtZW1vcnkgY29udGV4dHMgaW50byB0aGF0IGRvIG5vdCBmaXQgYXJlIHN1bW1hcml6ZWQK KyAqIGFuZCByZXByZXNlbnRlZCBhcyBjdW11bGF0aXZlIHRvdGFsIGF0IHRoZSBlbmQgb2Yg dGhlIGJ1ZmZlci4KKyAqCisgKiBPbmNlIGNvbmRpdGlvbiB2YXJpYWJsZSBjb21lcyBvdXQg b2Ygc2xlZXAsIGNoZWNrIGlmIHRoZSBtZW1vcnkgY29udGV4dAorICogaW5mb3JtYXRpb24g aXMgYXZhaWxhYmxlIGZvciByZWFkIGFuZCBkaXNwbGF5LgorICoKKyAqIFhYWCBFeHBsYWlu IGhvdyB0aGUgYmFja2VuZHMgY29tbXVuaWNhdGUgdGhyb3VnaCBjb25kaXRpb24gdmFyaWFi bGVzLgorICoKKyAqIFhYWCBFeHBsYWluIHdoYXQgaGFwcGVucyB3aXRoIHRpbWVvdXRzLCBl dGMuCiAgKi8KIERhdHVtCiBwZ19nZXRfcHJvY2Vzc19tZW1vcnlfY29udGV4dHMoUEdfRlVO Q1RJT05fQVJHUykKQEAgLTMzMyw2ICszNDMsNyBAQCBwZ19nZXRfcHJvY2Vzc19tZW1vcnlf Y29udGV4dHMoUEdfRlVOQ1RJT05fQVJHUykKIAlNZW1vcnlDb250ZXh0IG9sZENvbnRleHQ7 CiAJaW50CQkJbnVtX3JldHJpZXMgPSAwOwogCisJLyogWFhYIFNob3VsZG4ndCB0aGlzIGJl IGFmdGVyIHRoZSBwcml2aWxlZ2UgY2hlY2sgZXRjLj8gKi8KIAlJbml0TWF0ZXJpYWxpemVk U1JGKGZjaW5mbywgMCk7CiAKIAkvKgpAQCAtMzgzLDI0ICszOTQsNTAgQEAgcGdfZ2V0X3By b2Nlc3NfbWVtb3J5X2NvbnRleHRzKFBHX0ZVTkNUSU9OX0FSR1MpCiAJLyoKIAkgKiBSZXR1 cm4gc3RhdGlzdGljcyBvZiB0b3AgbGV2ZWwgMSBhbmQgMiBjb250ZXh0cywgaWYgZ2V0X3N1 bW1hcnkgaXMKIAkgKiB0cnVlLgorCSAqCisJICogWFhYIElzIHRoaXMgY29tbWVudCBzdGls bCBhY2N1cmF0ZT8gT3IgYXJlIHdlIHJldHVybmluZyBpbmZvcm1hdGlvbgorCSAqIGFib3V0 IG1vcmUgY29udGV4dHM/IE9yIG1vcmUgcHJlY2lzZWx5LCBpc24ndCB0aGF0IGlycmVsZXZh bnQgaGVyZT8KKwkgKiBXZSBqdXN0IHByb2Nlc3Mgd2hhdGV2ZXIgdGhlIHByb2Nlc3MgcHV0 cyBpbnRvIHRoZSBEU0EsIHJpZ2h0PworCSAqCisJICogWFhYIEknZCBtb3ZlIHRoaXMgY29t bWVudCB1bnRpbCBhZnRlciB3ZSB3YWtlIHVwIGFuZCBhcmUgcmVhZHkgdG8KKwkgKiBwcm9j ZXNzIHRoZSBpbmZvcm1hdGlvbiwgY2xvc2UgdG8gdGhlIGNvbW1lbnQ6CisJICoKKwkgKgkJ QmFja2VuZCBoYXMgZmluaXNoZWQgcHVibGlzaGluZyB0aGUgc3RhdHMsIHJlYWQgdGhlbQog CSAqLwotCUxXTG9ja0FjcXVpcmUoJm1lbUN0eFN0YXRlW3Byb2NOdW1iZXJdLmx3X2xvY2ss IExXX0VYQ0xVU0lWRSk7Ci0JbWVtQ3R4U3RhdGVbcHJvY051bWJlcl0uZ2V0X3N1bW1hcnkg PSBnZXRfc3VtbWFyeTsKIAogCS8qCiAJICogQ3JlYXRlIGEgRFNBIHNlZ21lbnQgd2l0aCBt YXhpbXVtIHNpemUgb2YgMTZNQiwgc2VuZCBoYW5kbGUgdG8gdGhlCiAJICogcHVibGlzaGlu ZyBwcm9jZXNzIGZvciBzdG9yaW5nIHRoZSBzdGF0cy4gSWYgbnVtYmVyIG9mIGNvbnRleHRz IGV4Y2VlZAogCSAqIDE2TUIsIGEgY3VtdWxhdGl2ZSB0b3RhbCBpcyBzdG9yZWQgZm9yIHN1 Y2ggY29udGV4dHMuCisJICoKKwkgKiBYWFggMTZNQiBzZWVtcyBsaWtlIGFuIGF3ZnVsbHkg bGFyZ2UgYW1vdW50IG9mIG1lbW9yeSwgcGFydGljdWxhcmx5CisJICogZm9yIHNtYWxsIG1h Y2hpbmVzLiBNYXliZSBpdCBzaG91bGQgYmUgY29uZmlndXJhYmxlIGFzIGEgcGFyYW1ldGVy CisJICogb2YgdGhlIFNRTCBmdW5jdGlvbj8gSW4gYW55IGNhc2UsIGl0IHNob3VsZCBub3Qg YmUgaGFyZGNvZGVkIGFzIGEKKwkgKiBtYWdpYyBjb25zdGFudC4gTWF5YmUgYWRkIGEgI2Rl ZmluZSBjb25zdGFudD8KIAkgKi8KKwlMV0xvY2tBY3F1aXJlKCZtZW1DdHhTdGF0ZVtwcm9j TnVtYmVyXS5sd19sb2NrLCBMV19FWENMVVNJVkUpOworCisJbWVtQ3R4U3RhdGVbcHJvY051 bWJlcl0uZ2V0X3N1bW1hcnkgPSBnZXRfc3VtbWFyeTsKKwogCWlmIChtZW1DdHhTdGF0ZVtw cm9jTnVtYmVyXS5tZW1zdGF0c19kc2FfaGFuZGxlID09IERTQV9IQU5ETEVfSU5WQUxJRCkK IAl7CiAJCW9sZENvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oVG9wTWVtb3J5Q29u dGV4dCk7Ci0JCWFyZWEgPSBkc2FfY3JlYXRlX2V4dChtZW1DdHhTdGF0ZVtwcm9jTnVtYmVy XS5sd19sb2NrLnRyYW5jaGUsIERTQV9ERUZBVUxUX0lOSVRfU0VHTUVOVF9TSVpFLAorCisJ CWFyZWEgPSBkc2FfY3JlYXRlX2V4dChtZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5sd19sb2Nr LnRyYW5jaGUsCisJCQkJCQkJICBEU0FfREVGQVVMVF9JTklUX1NFR01FTlRfU0laRSwKIAkJ CQkJCQkgIDE2ICogRFNBX0RFRkFVTFRfSU5JVF9TRUdNRU5UX1NJWkUpOworCiAJCU1lbW9y eUNvbnRleHRTd2l0Y2hUbyhvbGRDb250ZXh0KTsKKwogCQloYW5kbGUgPSBkc2FfZ2V0X2hh bmRsZShhcmVhKTsKKwogCQltZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5tZW1zdGF0c19kc2Ff aGFuZGxlID0gaGFuZGxlOwotCQkvKiBQaW4gdGhlIG1hcHBpbmcgc28gdGhhdCBpdCBkb2Vz bid0IHRocm93IGEgd2FybmluZyAqLworCisJCS8qIFBpbiB0aGUgbWFwcGluZyBzbyB0aGF0 IGl0IGRvZXNuJ3QgdGhyb3cgYSB3YXJuaW5nCisJCSAqCisJCSAqIFhYWCBXZSBkb24ndCBw aW4gc3R1ZmYgInNvIHRoYXQgaXQgZG9lc24ndCB0aHJvdyBhIHdhcm5pbmciLiBTdXJlbHkK KwkJICogdGhlIHdhcm5pbmcgaGFzIGEgcmVhc29uLCBzbyBtYXliZSBtZW50aW9uIHRoYXQ/ CisJCSAqLwogCQlkc2FfcGluKGFyZWEpOwogCQlkc2FfcGluX21hcHBpbmcoYXJlYSk7CiAJ fQpAQCAtNDA5LDExICs0NDYsMjAgQEAgcGdfZ2V0X3Byb2Nlc3NfbWVtb3J5X2NvbnRleHRz KFBHX0ZVTkNUSU9OX0FSR1MpCiAJCWFyZWEgPSBkc2FfYXR0YWNoKG1lbUN0eFN0YXRlW3By b2NOdW1iZXJdLm1lbXN0YXRzX2RzYV9oYW5kbGUpOwogCQlkc2FfcGluX21hcHBpbmcoYXJl YSk7CiAJfQorCiAJTFdMb2NrUmVsZWFzZSgmbWVtQ3R4U3RhdGVbcHJvY051bWJlcl0ubHdf bG9jayk7CisKKwkvKgorCSAqIFNlbmQgYSBzaWduYWwgdG8gdGhlIGF1eGlsaWFyeSBwcm9j ZXNzLCBpbmZvcm1pbmcgaXQgd2Ugd2FudCBpdCB0bworCSAqIHByb2R1Y2UgaW5mb3JtYXRp b24gYWJvdXQgbWVtb3J5IGNvbnRleHRzLgorCSAqLwogCWlmIChTZW5kUHJvY1NpZ25hbChw aWQsIFBST0NTSUdfR0VUX01FTU9SWV9DT05URVhULCBwcm9jTnVtYmVyKSA8IDApCiAJewog CQllcmVwb3J0KFdBUk5JTkcsCiAJCQkJKGVycm1zZygiY291bGQgbm90IHNlbmQgc2lnbmFs IHRvIHByb2Nlc3MgJWQ6ICVtIiwgcGlkKSkpOworCisJCS8qIFhYWCBXZSBkbyBleGFjdGx5 IHRoaXMgaW4gYSBudW1iZXIgb2YgcGxhY2VzLiBNYXliZSBpdCdkIGJlIGJldHRlcgorCQkg KiB0byBkZWZpbmUgYW4gImVycm9yIiBsYWJlbCBhdCB0aGUgZW5kLCBhbmQgZ290byB0byBp dD8gKi8KIAkJZHNhX2RldGFjaChhcmVhKTsKIAkJUEdfUkVUVVJOX05VTEwoKTsKIAl9CkBA IC00NjEsMTMgKzUwNywyMiBAQCBwZ19nZXRfcHJvY2Vzc19tZW1vcnlfY29udGV4dHMoUEdf RlVOQ1RJT05fQVJHUykKIAkJICovCiAJCUxXTG9ja0FjcXVpcmUoJm1lbUN0eFN0YXRlW3By b2NOdW1iZXJdLmx3X2xvY2ssIExXX0VYQ0xVU0lWRSk7CiAKLQkJaWYgKG1lbUN0eFN0YXRl W3Byb2NOdW1iZXJdLnByb2NfaWQgPT0gcGlkICYmIERzYVBvaW50ZXJJc1ZhbGlkKG1lbUN0 eFN0YXRlW3Byb2NOdW1iZXJdLm1lbXN0YXRzX2RzYV9wb2ludGVyKSkKKwkJLyoKKwkJICog WFhYIEV4cGxhaW4gaG93IGNvdWxkIGl0IGhhcHBlbiB0aGF0IHRoZSBQSUQgZG9lcyBub3Qg bWF0Y2guCisJCSAqLworCQlpZiAoKG1lbUN0eFN0YXRlW3Byb2NOdW1iZXJdLnByb2NfaWQg PT0gcGlkKSAmJgorCQkJRHNhUG9pbnRlcklzVmFsaWQobWVtQ3R4U3RhdGVbcHJvY051bWJl cl0ubWVtc3RhdHNfZHNhX3BvaW50ZXIpKQogCQkJYnJlYWs7CiAJCWVsc2UKIAkJCUxXTG9j a1JlbGVhc2UoJm1lbUN0eFN0YXRlW3Byb2NOdW1iZXJdLmx3X2xvY2spOwogCX0KKwogCWlm IChEc2FQb2ludGVySXNWYWxpZChtZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5tZW1zdGF0c19k c2FfcG9pbnRlcikpCiAJCW1lbWN0eF9pbmZvID0gKE1lbW9yeUNvbnRleHRJbmZvICopIGRz YV9nZXRfYWRkcmVzcyhhcmVhLCBtZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5tZW1zdGF0c19k c2FfcG9pbnRlcik7CisKKwkvKiBYWFggV2hhdCBpZiB0aGUgbWVtc3RhdHNfZHNhX3BvaW50 ZXIgaXMgbm90IHZhbGlkPyBJcyBpdCBldmVuIHBvc3NpYmxlPyAKKwkgKiBJZiBpdCBpcywg d2UgaGF2ZSBnYXJiYWdlIGluIG1lbWN0eF9pbmZvLiBNYXliZSBzaG91bGQgYmUgYW4gQXNz ZXJ0KCk/ICovCisKIAkvKiBCYWNrZW5kIGhhcyBmaW5pc2hlZCBwdWJsaXNoaW5nIHRoZSBz dGF0cywgcmVhZCB0aGVtICovCiAJZm9yIChpID0gMDsgaSA8IG1lbUN0eFN0YXRlW3Byb2NO dW1iZXJdLmluX21lbW9yeV9zdGF0czsgaSsrKQogCXsKQEAgLTQ4OSwxNyArNTQ0LDIxIEBA IHBnX2dldF9wcm9jZXNzX21lbW9yeV9jb250ZXh0cyhQR19GVU5DVElPTl9BUkdTKQogCQkJ bnVsbHNbMV0gPSB0cnVlOwogCiAJCXZhbHVlc1syXSA9IENTdHJpbmdHZXRUZXh0RGF0dW0o bWVtY3R4X2luZm9baV0udHlwZSk7CisKIAkJcGF0aF9sZW5ndGggPSBtZW1jdHhfaW5mb1tp XS5wYXRoX2xlbmd0aDsKIAkJcGF0aF9hcnJheSA9IGNvbnN0cnVjdF9hcnJheV9idWlsdGlu KG1lbWN0eF9pbmZvW2ldLnBhdGgsIHBhdGhfbGVuZ3RoLCBJTlQ0T0lEKTsKIAkJdmFsdWVz WzNdID0gUG9pbnRlckdldERhdHVtKHBhdGhfYXJyYXkpOworCiAJCXZhbHVlc1s0XSA9IElu dDY0R2V0RGF0dW0obWVtY3R4X2luZm9baV0udG90YWxzcGFjZSk7CiAJCXZhbHVlc1s1XSA9 IEludDY0R2V0RGF0dW0obWVtY3R4X2luZm9baV0ubmJsb2Nrcyk7CiAJCXZhbHVlc1s2XSA9 IEludDY0R2V0RGF0dW0obWVtY3R4X2luZm9baV0uZnJlZXNwYWNlKTsKIAkJdmFsdWVzWzdd ID0gSW50NjRHZXREYXR1bShtZW1jdHhfaW5mb1tpXS5mcmVlY2h1bmtzKTsKIAkJdmFsdWVz WzhdID0gSW50NjRHZXREYXR1bShtZW1jdHhfaW5mb1tpXS50b3RhbHNwYWNlIC0gbWVtY3R4 X2luZm9baV0uZnJlZXNwYWNlKTsKIAkJdmFsdWVzWzldID0gSW50MzJHZXREYXR1bShtZW1j dHhfaW5mb1tpXS5udW1fY29udGV4dHMpOworCiAJCXR1cGxlc3RvcmVfcHV0dmFsdWVzKHJz aW5mby0+c2V0UmVzdWx0LCByc2luZm8tPnNldERlc2MsIHZhbHVlcywgbnVsbHMpOwogCX0K KwogCS8qIElmIHRoZXJlIGFyZSBtb3JlIGNvbnRleHRzLCBkaXNwbGF5IGEgY3VtdWxhdGl2 ZSB0b3RhbCBvZiB0aG9zZSAqLwogCWlmIChtZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS50b3Rh bF9zdGF0cyA+IGkpCiAJewpAQCAtNTE2LDI5ICs1NzUsNDEgQEAgcGdfZ2V0X3Byb2Nlc3Nf bWVtb3J5X2NvbnRleHRzKFBHX0ZVTkNUSU9OX0FSR1MpCiAJCXZhbHVlc1s3XSA9IEludDY0 R2V0RGF0dW0obWVtY3R4X2luZm9baV0uZnJlZWNodW5rcyk7CiAJCXZhbHVlc1s4XSA9IElu dDY0R2V0RGF0dW0obWVtY3R4X2luZm9baV0udG90YWxzcGFjZSAtIG1lbWN0eF9pbmZvW2ld LmZyZWVzcGFjZSk7CiAJCXZhbHVlc1s5XSA9IEludDMyR2V0RGF0dW0obWVtY3R4X2luZm9b aV0ubnVtX2NvbnRleHRzKTsKKwogCQl0dXBsZXN0b3JlX3B1dHZhbHVlcyhyc2luZm8tPnNl dFJlc3VsdCwgcnNpbmZvLT5zZXREZXNjLCB2YWx1ZXMsIG51bGxzKTsKIAl9CisKIAlMV0xv Y2tSZWxlYXNlKCZtZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5sd19sb2NrKTsKKwogCUNvbmRp dGlvblZhcmlhYmxlQ2FuY2VsU2xlZXAoKTsKKwogCWRzYV9kZXRhY2goYXJlYSk7CiAJUEdf UkVUVVJOX05VTEwoKTsKIH0KIAorLyoKKyAqIFNoYXJlZCBtZW1vcnkgc2l6aW5nIGZvciBy ZXBvcnRpbmcgbWVtb3J5IGNvbnRleHQgaW5mb3JtYXRpb24uCisgKi8KIHN0YXRpYyBTaXpl CiBNZW1DdHhTaG1lbVNpemUodm9pZCkKIHsKLQlTaXplCQlzaXplOwotCVNpemUJCVRvdGFs UHJvY3MgPSBhZGRfc2l6ZShNYXhCYWNrZW5kcywgYWRkX3NpemUoTlVNX0FVWElMSUFSWV9Q Uk9DUywgbWF4X3ByZXBhcmVkX3hhY3RzKSk7CisJU2l6ZQkJVG90YWxQcm9jcyA9CisJCWFk ZF9zaXplKE1heEJhY2tlbmRzLCBhZGRfc2l6ZShOVU1fQVVYSUxJQVJZX1BST0NTLCBtYXhf cHJlcGFyZWRfeGFjdHMpKTsKIAotCXNpemUgPSBUb3RhbFByb2NzICogc2l6ZW9mKE1lbW9y eUNvbnRleHRTdGF0ZSk7Ci0JcmV0dXJuIHNpemU7CisJcmV0dXJuIG11bF9zaXplKFRvdGFs UHJvY3MsIHNpemVvZihNZW1vcnlDb250ZXh0U3RhdGUpKTsKIH0KIAorLyoKKyAqIEluaXQg c2hhcmVkIG1lbW9yeSBmb3IgcmVwb3J0aW5nIG1lbW9yeSBjb250ZXh0IGluZm9ybWF0aW9u LgorICoKKyAqIFhYWCBTaG91bGQgdGhpcyBjaGVjayBJc1VuZGVyUG9zdG1hc3Rlciwgc2lt aWxhcmx5IHRvIGUuZy4gQ29tbWl0VHNTaG1lbUluaXQ/CisgKi8KIHZvaWQKIE1lbUN0eFNo bWVtSW5pdCh2b2lkKQogewogCWJvb2wJCWZvdW5kOwotCVNpemUJCVRvdGFsUHJvY3MgPSBh ZGRfc2l6ZShNYXhCYWNrZW5kcywgYWRkX3NpemUoTlVNX0FVWElMSUFSWV9QUk9DUywgbWF4 X3ByZXBhcmVkX3hhY3RzKSk7CisJU2l6ZQkJVG90YWxQcm9jcyA9CisJCWFkZF9zaXplKE1h eEJhY2tlbmRzLCBhZGRfc2l6ZShOVU1fQVVYSUxJQVJZX1BST0NTLCBtYXhfcHJlcGFyZWRf eGFjdHMpKTsKIAogCW1lbUN0eFN0YXRlID0gKE1lbW9yeUNvbnRleHRTdGF0ZSAqKSBTaG1l bUluaXRTdHJ1Y3QoIk1lbW9yeUNvbnRleHRTdGF0ZSIsCiAJCQkJCQkJCQkJCQkJCSBNZW1D dHhTaG1lbVNpemUoKSwKQEAgLTU0OCw4ICs2MTksMTAgQEAgTWVtQ3R4U2htZW1Jbml0KHZv aWQpCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgVG90YWxQcm9jczsgaSsrKQogCQl7CiAJCQlD b25kaXRpb25WYXJpYWJsZUluaXQoJm1lbUN0eFN0YXRlW2ldLm1lbWN0eF9jdik7CisKIAkJ CUxXTG9ja0luaXRpYWxpemUoJm1lbUN0eFN0YXRlW2ldLmx3X2xvY2ssIExXTG9ja05ld1Ry YW5jaGVJZCgpKTsKIAkJCUxXTG9ja1JlZ2lzdGVyVHJhbmNoZShtZW1DdHhTdGF0ZVtpXS5s d19sb2NrLnRyYW5jaGUsICJtZW1fY29udGV4dF9zdGF0c19yZXBvcnRpbmciKTsKKwogCQkJ bWVtQ3R4U3RhdGVbaV0ubWVtc3RhdHNfZHNhX2hhbmRsZSA9IERTQV9IQU5ETEVfSU5WQUxJ RDsKIAkJCW1lbUN0eFN0YXRlW2ldLm1lbXN0YXRzX2RzYV9wb2ludGVyID0gSW52YWxpZERz YVBvaW50ZXI7CiAJCX0KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL21tZ3IvbWN4 dC5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9tY3h0LmMKaW5kZXggMjQ1YWJhNTk4N2Mu Ljg5OTJhMDFlZTMyIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9tbWdyL21jeHQu YworKysgYi9zcmMvYmFja2VuZC91dGlscy9tbWdyL21jeHQuYwpAQCAtMTc4LDcgKzE3OCwx MSBAQCBzdGF0aWMgdm9pZCBNZW1vcnlDb250ZXh0U3RhdHNJbnRlcm5hbChNZW1vcnlDb250 ZXh0IGNvbnRleHQsIGludCBsZXZlbCwKIHN0YXRpYyB2b2lkIE1lbW9yeUNvbnRleHRTdGF0 c1ByaW50KE1lbW9yeUNvbnRleHQgY29udGV4dCwgdm9pZCAqcGFzc3RocnUsCiAJCQkJCQkJ CQljb25zdCBjaGFyICpzdGF0c19zdHJpbmcsCiAJCQkJCQkJCQlib29sIHByaW50X3RvX3N0 ZGVycik7Ci1zdGF0aWMgdm9pZCBQdWJsaXNoTWVtb3J5Q29udGV4dChNZW1vcnlDb250ZXh0 SW5mbyAqIG1lbWN0eF9pbmZvcywgaW50IGN1cnJfaWQsIE1lbW9yeUNvbnRleHQgY29udGV4 dCwgTGlzdCAqcGF0aCwgY2hhciAqY2xpcHBlZF9pZGVudCwgTWVtb3J5Q29udGV4dENvdW50 ZXJzIHN0YXQsIGludCBudW1fY29udGV4dHMpOworc3RhdGljIHZvaWQgUHVibGlzaE1lbW9y eUNvbnRleHQoTWVtb3J5Q29udGV4dEluZm8gKiBtZW1jdHhfaW5mb3MsCisJCQkJCQkJCSBp bnQgY3Vycl9pZCwgTWVtb3J5Q29udGV4dCBjb250ZXh0LAorCQkJCQkJCQkgTGlzdCAqcGF0 aCwgY2hhciAqY2xpcHBlZF9pZGVudCwKKwkJCQkJCQkJIE1lbW9yeUNvbnRleHRDb3VudGVy cyBzdGF0LAorCQkJCQkJCQkgaW50IG51bV9jb250ZXh0cyk7CiAKIC8qCiAgKiBZb3Ugc2hv dWxkIG5vdCBkbyBtZW1vcnkgYWxsb2NhdGlvbnMgd2l0aGluIGEgY3JpdGljYWwgc2VjdGlv biwgYmVjYXVzZQpAQCAtMTM3NiwyMCArMTM4MCwyMiBAQCBQcm9jZXNzTG9nTWVtb3J5Q29u dGV4dEludGVycnVwdCh2b2lkKQogfQogCiAvKgotICogUnVuIGJ5IGVhY2ggYmFja2VuZCB0 byBwdWJsaXNoIHRoZWlyIG1lbW9yeSBjb250ZXh0Ci0gKiBzdGF0aXN0aWNzLiBJdCBwZXJm b3JtcyBhIGJyZWFkdGggZmlyc3Qgc2VhcmNoCi0gKiBvbiB0aGUgbWVtb3J5IGNvbnRleHQg dHJlZSwgc28gdGhhdCB0aGUgcGFyZW50cwotICogZ2V0IGEgY2hhbmNlIHRvIHJlcG9ydCBz dGF0cyBiZWZvcmUgdGhlaXIgY2hpbGRyZW4uCisgKiBQcm9jZXNzR2V0TWVtb3J5Q29udGV4 dEludGVycnVwdAorICoJCUdlbmVyYXRlIGluZm9ybWF0aW9uIGFib3V0IG1lbW9yeSBjb250 ZXh0cyB1c2VkIGJ5IHRoZSBwcm9jZXNzLgogICoKLSAqIFN0YXRpc3RpY3MgYXJlIHNoYXJl ZCB2aWEgZHluYW1pYyBzaGFyZWQgbWVtb3J5IHdoaWNoCi0gKiBjYW4gaG9sZCBzdGF0aXN0 aWNzIG9mIGFwcHJveCA2NzAwIGNvbnRleHRzLiBSZW1haW5pbmcKLSAqIGNvbnRleHRzIHN0 YXRpc3RpY3MgaXMgY2FwdHVyZWQgYXMgYSBjdW11bGF0aXZlIHRvdGFsLgorICogUGVyZm9y bXMgYSBicmVhZHRoIGZpcnN0IHNlYXJjaCBvbiB0aGUgbWVtb3J5IGNvbnRleHQgdHJlZSwg c28gdGhhdCB0aGUKKyAqIHBhcmVudHMgZ2V0IGEgY2hhbmNlIHRvIHJlcG9ydCBzdGF0cyBi ZWZvcmUgdGhlaXIgY2hpbGRyZW4uCisgKgorICogU3RhdGlzdGljcyBhcmUgc2hhcmVkIHZp YSBkeW5hbWljIHNoYXJlZCBtZW1vcnkgd2hpY2ggY2FuIGhvbGQgc3RhdGlzdGljcworICog b2YgYXBwcm94IDY3MDAgY29udGV4dHMuIFJlbWFpbmluZyBjb250ZXh0cyBzdGF0aXN0aWNz IGlzIGNhcHR1cmVkIGFzIGEKKyAqIGN1bXVsYXRpdmUgdG90YWwuCisgKgorICogWFhYIFNl ZW1zIGEgYml0IGZyYWdpbGUgdG8gbWVudGlvbiB0aGUgbnVtYmVyIG9mIGNvbnRleHRzIGhl cmUgLSBpZiB0aGUKKyAqIERTQSBzaXplIGNoYW5nZXMgKGluIG1jeHRmdW5jcy5jKSwgdGhp cyB3aWxsIGdldCBzdGFsZS4KICAqLwogdm9pZAogUHJvY2Vzc0dldE1lbW9yeUNvbnRleHRJ bnRlcnJ1cHQodm9pZCkKIHsKLQkvKiBTdG9yZSB0aGUgbWVtb3J5IGNvbnRleHQgZGV0YWls cyBpbiBzaGFyZWQgbWVtb3J5ICovCi0KIAlMaXN0CSAgICpjb250ZXh0czsKIAogCUhBU0hD VEwJCWN0bDsKQEAgLTE0MDcsMjEgKzE0MTMsMTggQEAgUHJvY2Vzc0dldE1lbW9yeUNvbnRl eHRJbnRlcnJ1cHQodm9pZCkKIAogCVB1Ymxpc2hNZW1vcnlDb250ZXh0UGVuZGluZyA9IGZh bHNlOwogCi0JLyoKLQkgKiBUaGUgaGFzaCB0YWJsZSBpcyB1c2VkIGZvciBjb25zdHJ1Y3Rp bmcgInBhdGgiIGNvbHVtbiBvZgotCSAqIHBnX2dldF9wcm9jZXNzX21lbW9yeV9jb250ZXh0 IGlzIHZpZXcsIHNpbWlsYXIgdG8gaXRzIGxvY2FsIGJhY2tlbmQKLQkgKiBjb3V0ZXJwYXJ0 LgotCSAqLwotCiAJLyoKIAkgKiBNYWtlIGEgbmV3IGNvbnRleHQgdGhhdCB3aWxsIGNvbnRh aW4gdGhlIGhhc2ggdGFibGUsIHRvIGVhc2UgdGhlCi0JICogY2xlYW51cAorCSAqIGNsZWFu dXAuCiAJICovCi0KIAlzdGF0X2N4dCA9IEFsbG9jU2V0Q29udGV4dENyZWF0ZShDdXJyZW50 TWVtb3J5Q29udGV4dCwKIAkJCQkJCQkJCSAiTWVtb3J5IGNvbnRleHQgc3RhdGlzdGljcyIs CiAJCQkJCQkJCQkgQUxMT0NTRVRfREVGQVVMVF9TSVpFUyk7CiAKKwkvKgorCSAqIFRoZSBo YXNoIHRhYmxlIHVzZWQgZm9yIGNvbnN0cnVjdGluZyAicGF0aCIgY29sdW1uIG9mIHRoZSB2 aWV3LCBzaW1pbGFyCisJICogdG8gaXRzIGxvY2FsIGJhY2tlbmQgY291bnRlcnBhcnQuCisJ ICovCiAJY3RsLmtleXNpemUgPSBzaXplb2YoTWVtb3J5Q29udGV4dCk7CiAJY3RsLmVudHJ5 c2l6ZSA9IHNpemVvZihNZW1vcnlDb250ZXh0SWQpOwogCWN0bC5oY3h0ID0gc3RhdF9jeHQ7 CkBAIC0xNDMxLDM5ICsxNDM0LDY1IEBAIFByb2Nlc3NHZXRNZW1vcnlDb250ZXh0SW50ZXJy dXB0KHZvaWQpCiAJCQkJCQkJCQkmY3RsLAogCQkJCQkJCQkJSEFTSF9FTEVNIHwgSEFTSF9C TE9CUyB8IEhBU0hfQ09OVEVYVCk7CiAKKwkvKiBMaXN0IG9mIGNvbnRleHRzIHRvIHByb2Nl c3MgaW4gdGhlIG5leHQgcm91bmQgLSBzdGFydCBhdCB0aGUgdG9wLiAqLwogCWNvbnRleHRz ID0gbGlzdF9tYWtlMShUb3BNZW1vcnlDb250ZXh0KTsKIAogCS8qIENvbXB1dGUgdGhlIG51 bWJlciBvZiBzdGF0cyB0aGF0IGNhbiBmaXQgaW4gdGhlIERTTSBzZWcgKi8KKwkvKgorCSAq IFhYWCBEb24ndCBoYXJkY29kZSB0aGUgc2l6ZSBpbiB0d28gcGxhY2VzLiBEZWZpbmUgYSBj b25zdGFudCBvcgorCSAqIHNvbWV0aGluZyBsaWtlIHRoYXQsIHNvIHRoYXQgd2UgY2FuIGNo YW5nZSBvbmUgcGxhY2UgYW5kIGl0IHN0YXlzCisJICogaW4gc3luYy4gT3IgZXZlbiBiZXR0 ZXIsIGRlZmluZSBpdCBqdXN0IGluIG1jeHRmdW5jcy5jLCBhbmQgc3RvcmUKKwkgKiB0aGUg c2l6ZSBpbiB0aGUgc2htZW0uCisJICoKKwkgKiBYWFggVGhlIG5hbWUgaXMgbWlzbGVhZGlu ZyAtIHRoaXMgaXMgbm90IHRoZSBudW1iZXIgb2Ygc3RhdHMgd2UncmUKKwkgKiBhYm91dCB0 byBwcm9kdWNlLCBpdCdzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHdlIGNhbiBm aXQgaW50bworCSAqIHRoZSBzaG1lbS4gSSdkIG5hbWUgdGhpcyBtYXhfc3RhdHMuCisJICoK KwkgKiBYWFggQWxzbywgd2hhdCBpZiB3ZSBmaWxsIGV4YWN0bHkgdGhpcyBudW1iZXIgb2Yg Y29udGV4dHM/IFdvbid0IHdlCisJICogbG9zZSB0aGUgbGFzdCBlbnRyeSBiZWNhdXNlIGl0 IHdpbGwgYmUgb3ZlcndpdHRlbiBieSB0aGUgc3VtbWFyeT8KKwkgKi8KIAludW1fc3RhdHMg PSBmbG9vcigxNiAqIERTQV9ERUZBVUxUX0lOSVRfU0VHTUVOVF9TSVpFIC8gc2l6ZW9mKE1l bW9yeUNvbnRleHRJbmZvKSk7CiAKIAkvKgogCSAqIFRyYXZlcnNlIHRoZSBtZW1vcnkgY29u dGV4dCB0cmVlIHRvIGZpbmQgdG90YWwgbnVtYmVyIG9mIGNvbnRleHRzLiBJZgogCSAqIHN1 bW1hcnkgaXMgcmVxdWVzdGVkIGZpbmQgdGhlIHRvdGFsIG51bWJlciBvZiBjb250ZXh0cyBh dCBsZXZlbCAxIGFuZAogCSAqIDIuCisJICoKKwkgKiBYWFggSSdtIGNvbmZ1c2VkIGFib3V0 IGhvdyB0aGlzIGludGVyYWN0cyB3aXRoIHRoZSBnZXRfc3VtbWFyeSBmbGFnLgorCSAqIElu IGZhY3QsIHRoaXMgYWx3YXlzIHVzZXMgZ2V0X3N1bW1hcnk9ZmFsc2UsIGJlY2F1c2Ugd2Ug b25seSByZWFkIHRoZQorCSAqIGZsYWcgZnJvbSBzaG1lbSBsYXRlci4gU2VlbXMgbGlrZSBh IGJ1Zy4KIAkgKi8KIAlmb3JlYWNoX3B0cihNZW1vcnlDb250ZXh0RGF0YSwgY3VyLCBjb250 ZXh0cykKIAl7Ci0JCU1lbW9yeUNvbnRleHRJZCAqZW50cnk7CisJCU1lbW9yeUNvbnRleHRJ ZCAgICAqZW50cnk7CiAKIAkJZW50cnkgPSAoTWVtb3J5Q29udGV4dElkICopIGhhc2hfc2Vh cmNoKGNvbnRleHRfaWRfbG9va3VwLCAmY3VyLAogCQkJCQkJCQkJCQkJSEFTSF9FTlRFUiwg JmZvdW5kKTsKLQkJc3RhdHNfY291bnQgPSBzdGF0c19jb3VudCArIDE7CisJCUFzc2VydCgh Zm91bmQpOworCiAJCS8qIGNvbnRleHQgaWQgc3RhcnRzIHdpdGggMSAqLwotCQllbnRyeS0+ Y29udGV4dF9pZCA9IHN0YXRzX2NvdW50OworCQllbnRyeS0+Y29udGV4dF9pZCA9ICgrK3N0 YXRzX2NvdW50KTsKIAotCQkvKiBBcHBlbmQgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50 IGNvbnRleHQgdG8gdGhlIG1haW4gbGlzdCAqLworCQkvKiBBcHBlbmQgdGhlIGNoaWxkcmVu IG9mIHRoZSBjdXJyZW50IGNvbnRleHQgdG8gdGhlIG1haW4gbGlzdC4gKi8KIAkJZm9yIChN ZW1vcnlDb250ZXh0IGMgPSBjdXItPmZpcnN0Y2hpbGQ7IGMgIT0gTlVMTDsgYyA9IGMtPm5l eHRjaGlsZCkKIAkJeworCQkJLyogWFhYIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgd2UgbmVl ZCB0byBjaGVjayBnZXRfc3VtbWFyeSBoZXJlPyAqLwogCQkJaWYgKGdldF9zdW1tYXJ5KQog CQkJewogCQkJCWVudHJ5ID0gKE1lbW9yeUNvbnRleHRJZCAqKSBoYXNoX3NlYXJjaChjb250 ZXh0X2lkX2xvb2t1cCwgJmMsCiAJCQkJCQkJCQkJCQkJCUhBU0hfRU5URVIsICZmb3VuZCk7 Ci0JCQkJc3RhdHNfY291bnQgPSBzdGF0c19jb3VudCArIDE7Ci0JCQkJZW50cnktPmNvbnRl eHRfaWQgPSBzdGF0c19jb3VudDsKKwkJCQlBc3NlcnQoIWZvdW5kKTsKKworCQkJCWVudHJ5 LT5jb250ZXh0X2lkID0gKCsrc3RhdHNfY291bnQpOwogCQkJfQorCiAJCQljb250ZXh0cyA9 IGxhcHBlbmQoY29udGV4dHMsIGMpOwogCQl9Ci0JCS8qIEluIHN1bW1hcnkgb25seSB0aGUg Zmlyc3QgbGV2ZWwgY29udGV4dHMgYXJlIGRpc3BsYXllZCAqLworCisJCS8qIEluIHN1bW1h cnkgb25seSB0aGUgZmlyc3QgbGV2ZWwgY29udGV4dHMgYXJlIGRpc3BsYXllZAorCQkgKgor CQkgKiBYWFggUHJvYmFibHkgc2hvdWxkIHNheSAiZmlyc3QgdHdvIGxldmVscyI/CisJCSAq LwogCQlpZiAoZ2V0X3N1bW1hcnkpCiAJCQlicmVhazsKIAl9CkBAIC0xNDc0LDIzICsxNTAz LDMwIEBAIFByb2Nlc3NHZXRNZW1vcnlDb250ZXh0SW50ZXJydXB0KHZvaWQpCiAJICogc2Vn bWVudCwgYSBjdW11bGF0aXZlIHRvdGFsIGlzIHdyaXR0ZW4gYXMgdGhlIGxhc3QgcmVjb3Jk IGluIHRoZSBEU0EKIAkgKiBzZWdtZW50LgogCSAqLwotCXN0YXRzX2NvdW50ID0gc3RhdHNf Y291bnQgPiBudW1fc3RhdHMgPyBudW1fc3RhdHMgOiBzdGF0c19jb3VudDsKKwlzdGF0c19j b3VudCA9IChzdGF0c19jb3VudCA+IG51bV9zdGF0cykgPyBudW1fc3RhdHMgOiBzdGF0c19j b3VudDsKIAogCS8qIEF0dGFjaCB0byBEU0Egc2VnbWVudCAqLwogCUxXTG9ja0FjcXVpcmUo Jm1lbUN0eFN0YXRlW2lkeF0ubHdfbG9jaywgTFdfRVhDTFVTSVZFKTsKIAlhcmVhID0gZHNh X2F0dGFjaChtZW1DdHhTdGF0ZVtpZHhdLm1lbXN0YXRzX2RzYV9oYW5kbGUpOworCiAJbWVt Q3R4U3RhdGVbaWR4XS5wcm9jX2lkID0gTXlQcm9jUGlkOworCisJLyogWFhYIHRoaXMgaXMg d2hlcmUgd2UgZ2V0IHRoZSBnZXRfc3VtbWFyeSBmbGFnICovCiAJZ2V0X3N1bW1hcnkgPSBt ZW1DdHhTdGF0ZVtpZHhdLmdldF9zdW1tYXJ5OwogCi0JLyogRnJlZSB0aGUgbWVtb3J5IGFs bG9jYXRlZCBwcmV2aW91c2x5IGJ5IHRoZSBzYW1lIHByb2Nlc3MgKi8KKwkvKiBGcmVlIHRo ZSBtZW1vcnkgYWxsb2NhdGVkIHByZXZpb3VzbHkgYnkgdGhlIHNhbWUgcHJvY2Vzcy4gKi8K IAlpZiAoRHNhUG9pbnRlcklzVmFsaWQobWVtQ3R4U3RhdGVbaWR4XS5tZW1zdGF0c19kc2Ff cG9pbnRlcikpCiAJewogCQlkc2FfZnJlZShhcmVhLCBtZW1DdHhTdGF0ZVtpZHhdLm1lbXN0 YXRzX2RzYV9wb2ludGVyKTsKIAkJbWVtQ3R4U3RhdGVbaWR4XS5tZW1zdGF0c19kc2FfcG9p bnRlciA9IEludmFsaWREc2FQb2ludGVyOwogCX0KKwogCW1lbUN0eFN0YXRlW2lkeF0ubWVt c3RhdHNfZHNhX3BvaW50ZXIgPSBkc2FfYWxsb2NhdGUwKGFyZWEsIHN0YXRzX2NvdW50ICog c2l6ZW9mKE1lbW9yeUNvbnRleHRJbmZvKSk7CiAJbWVtaW5mbyA9IChNZW1vcnlDb250ZXh0 SW5mbyAqKSBkc2FfZ2V0X2FkZHJlc3MoYXJlYSwgbWVtQ3R4U3RhdGVbaWR4XS5tZW1zdGF0 c19kc2FfcG9pbnRlcik7CiAKKwkvKiBYWFggSSBmaW5kIHRoaXMgcmVhbGx5IGhhcmQgdG8g dW5kZXJzdGFuZCwgd2l0aCB0aGUgbmVzdGVkIGxvb3BzIGV0Yy4KKwkgKiBJIHN1Z2dlc3Qg YnJlYWtpbmcgdGhpcyB1cCBpbnRvIHNtYWxsZXIgZnVuY3Rpb25zLCBhbmQgY2FsbGluZyB0 aGVtCisJICogKGVhc2llciB0byB1bmRlcnN0YW5kKSB0aGFuIGh1Z2UgbHVtcCBvZiBjb2Rl LiAqLwogCWlmIChnZXRfc3VtbWFyeSkKIAl7CiAJCWludAkJCWN0eF9pZCA9IDA7CkBAIC0x NTA2LDcgKzE1NDIsNyBAQCBQcm9jZXNzR2V0TWVtb3J5Q29udGV4dEludGVycnVwdCh2b2lk KQogCQkvKgogCQkgKiBDb3B5IHN0YXRpc3RpY3MgZm9yIGVhY2ggb2YgVG9wTWVtb3J5Q29u dGV4dHMgY2hpbGRyZW4oWFhYLiBNYWtlIGl0CiAJCSAqIGNhcHBlZCBhdCAxMDApLiBUaGlz IGluY2x1ZGVzIHN0YXRpc3RpY3Mgb2YgYWxsIG9mIHRoZWlyIGNoaWxkcmVuCi0JCSAqIHVw dG8gbGV2ZWwgMTAwCisJCSAqIHVwdG8gbGV2ZWwgMTAwLgogCQkgKi8KIAkJZm9yIChNZW1v cnlDb250ZXh0IGMgPSBUb3BNZW1vcnlDb250ZXh0LT5maXJzdGNoaWxkOyBjICE9IE5VTEw7 IGMgPSBjLT5uZXh0Y2hpbGQpCiAJCXsKQEAgLTE2NTEsNiArMTY4Nyw3IEBAIGNsZWFudXA6 CiAJZHNhX2RldGFjaChhcmVhKTsKIH0KIAorLyogWFhYIHRoaXMgcmVhbGx5IG5lZWRzIHNv bWUgYmV0dGVyIGZvcm1hdHRpbmcgYW5kIGNvbW1lbnRzICovCiBzdGF0aWMgdm9pZAogUHVi bGlzaE1lbW9yeUNvbnRleHQoTWVtb3J5Q29udGV4dEluZm8gKiBtZW1jdHhfaW5mbywgaW50 IGN1cnJfaWQsIE1lbW9yeUNvbnRleHQgY29udGV4dCwgTGlzdCAqcGF0aCwgY2hhciAqY2xp cHBlZF9pZGVudCwgTWVtb3J5Q29udGV4dENvdW50ZXJzIHN0YXQsIGludCBudW1fY29udGV4 dHMpCiB7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGlscy9tZW11dGlscy5oIGIvc3Jj L2luY2x1ZGUvdXRpbHMvbWVtdXRpbHMuaAppbmRleCA5ZmFjMzk0YWFkMy4uNDljN2JmNWMz NzYgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL21lbXV0aWxzLmgKKysrIGIvc3Jj L2luY2x1ZGUvdXRpbHMvbWVtdXRpbHMuaApAQCAtMTIzLDggKzEyMyw5IEBAIGV4dGVybiBN ZW1vcnlDb250ZXh0IEFsbG9jU2V0Q29udGV4dENyZWF0ZUludGVybmFsKE1lbW9yeUNvbnRl eHQgcGFyZW50LAogCQkJCQkJCQkJCQkJICAgU2l6ZSBtYXhCbG9ja1NpemUpOwogCiAvKiBE eW5hbWljIHNoYXJlZCBtZW1vcnkgc3RhdGUgZm9yIE1lbW9yeSBDb250ZXh0IFN0YXRpc3Rp Y3MgcmVwb3J0aW5nICovCi10eXBlZGVmIHN0cnVjdCBNZW1vcnlDb250ZXh0SW5mbwordHlw ZWRlZiBzdHJ1Y3QgTWVtb3J5Q29udGV4dEluZm8JLyogWFhYIEknZCBuYW1lIHRoaXMgTWVt b3J5Q29udGV4dEVudHJ5ICovCiB7CisJLyogWFhYIGlzbid0IDIgeCAxa0IgZm9yIGV2ZXJ5 IGNvbnRleHQgYSBiaXQgdG9vIG11Y2g/IE1heWJlIGJldHRlciB0byBtYWtlIGl0IHZhcmlh YmxlLWxlbmd0aD8gKi8KIAljaGFyCQluYW1lW01FTU9SWV9DT05URVhUX0lERU5UX0RJU1BM QVlfU0laRV07CiAJY2hhcgkJaWRlbnRbTUVNT1JZX0NPTlRFWFRfSURFTlRfRElTUExBWV9T SVpFXTsKIAlEYXR1bQkJcGF0aFtNRU1fQ09OVEVYVF9NQVhfTEVWRUxdOwpAQCAtMTM1LDcg KzEzNiw3IEBAIHR5cGVkZWYgc3RydWN0IE1lbW9yeUNvbnRleHRJbmZvCiAJaW50NjQJCWZy ZWVzcGFjZTsKIAlpbnQ2NAkJZnJlZWNodW5rczsKIAlpbnQJCQludW1fY29udGV4dHM7Ci19 CQkJTWVtb3J5Q29udGV4dEluZm87Cit9CQkJTWVtb3J5Q29udGV4dEluZm87CS8qIFhYWCBu ZWVkcyB0byBiZSBhZGRlZCB0byB0eXBlZGVmcywgc28gdGhhdCBwZ2luZGVudCB3b3JrcyAq LwogCiB0eXBlZGVmIHN0cnVjdCBNZW1vcnlDb250ZXh0U3RhdGUKIHsKLS0gCjIuNDcuMQoK --------------0AyQ79lCUO75yOC3vfsys20E--