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.96) (envelope-from ) id 1vgbNq-00G0J5-2d for pgsql-hackers@arkaria.postgresql.org; Fri, 16 Jan 2026 04:24:27 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vgbMq-000gIs-2o for pgsql-hackers@arkaria.postgresql.org; Fri, 16 Jan 2026 04:23:25 +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.96) (envelope-from ) id 1vgbMq-000gIZ-1V for pgsql-hackers@lists.postgresql.org; Fri, 16 Jan 2026 04:23:24 +0000 Received: from mail-vs1-xe35.google.com ([2607:f8b0:4864:20::e35]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vgbMo-000kZX-0d for pgsql-hackers@lists.postgresql.org; Fri, 16 Jan 2026 04:23:24 +0000 Received: by mail-vs1-xe35.google.com with SMTP id ada2fe7eead31-5eea31b5c48so1150814137.1 for ; Thu, 15 Jan 2026 20:23:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1768537400; cv=none; d=google.com; s=arc-20240605; b=dHHO7E84WdnE2rvlvTtSjTYuyvYI3SYqMLczOLyWzPuxmajBhGIkIq7LmecwuP6fsl d93o28gBty5EwXpsuMzzvvfiXP4T1debkiEcBUul6yOwyhjBtqIek5g753cJK5BSzJVc bF5Vzoj5uzBanXETgcBQAFPh2zlOUq8kcGDQ9zEoLrlYf5IokJsEkuQSoMtE8OsDMxWx q2fRDLpv+aVJ9wmHT8BHKfXnB19BRkYqMmJYnO7JiajqNxdXsN7aU+A3VLcsSbDlLanX h2JADiYHu6b9cfEZ54AOXKcT/QXB4xACXDwWed0Bo4SjQ9Vu53iNSX3STz5G0HTf9DIy FwWQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=SEs5+sLHYYkj+tDniQAVd8UBmqWQUNyEgM9iZjbSnxk=; fh=tvS4T4+oR2J2hxK5aNJGfORVVBBvqUJPnvm76ijROZw=; b=La1G93Yo0+fV1faBNhjR956bF6CRJitxdCxYXzqLykRgf9u3JnkRSmHWXblgicXi2w exgCvBuF3vRUyUuY4PzlRItsFEthNm6oVoq5GJ8pQRfdQNgzJP6uVdPje2+lPVyuUwl9 3Ngq9bhdDLQ2uWFWvhR9s6QO80pB4Y2FMpqSx4mNGeoC0Q4zltPKAdZQ0ow0/j5+Y15x HSXCeQcrU51XggWSxN6UtXdMgKLMV5aoLJ2ZWlnPAA25ncoTbpp8ubsbpgvzhflR+InD P+j0Og0c8d0RbdMC8MTjh5bReKihD7xmEAKIvQ/LXdlErhHBNZtL9txabA/nvk1SICt3 iiyQ==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768537400; x=1769142200; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=SEs5+sLHYYkj+tDniQAVd8UBmqWQUNyEgM9iZjbSnxk=; b=J4/EeqtB3tJnoyF07Ov4/WCxMfA8POWsGGaJ5gYvTyJxfiyw1S+f2BfayuBF/f/gwt mI+LN36DbGqrcD9BeUIYisVlTHXVvq8qr2q83YX4dFqqr/BWdR77xXI9LELWmV6Qg5qV 2JGjnluVxFzcJ9chkeN9AzXH9f6FG6xd2JTHhVJdIV8w5YNcxXcWr5WY0RumEFJkxoFH IvixnGd6IRhn8IAu3QlpuAjLHPjZ/SS4/KjJWKurVVX6+Us9/fF6NaI7arnMrU7IY88f QqvkbVMbjHl0jMdd/k40eZksSGb0HC4vP2hzMgCLtkK6aN8VY/NVXucfeCGYWe1HwTcL fvYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768537400; x=1769142200; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=SEs5+sLHYYkj+tDniQAVd8UBmqWQUNyEgM9iZjbSnxk=; b=k8vZfdhHnRdalrFfkLMN4AZsc4BP4AKf9EkrYSpvay6hLYf2cR4SE92/Gm50UTJrhe 0bysYhaRU/ZeJ+RSbV08lPB6tJrBFR4Qqu11RPOs8Bndd2H/19YqaTPBL2QBcM7VoK1G kVf6Wax1ihOBD3PJ9ivqFaO2hnvW671YnG+A53ZBek3Y8HG7yymTlA73UOT0VliUlC1G cFYElS0RGA4UsQBvGAWFuOP+ysKis0Hgpob8za3QmisLMD0fUwkQRG7o6e767dxqsn+t KXJ+YTRI6OgPNwymydOIRy6VGGEB2jB4zdJkL4TA7WmeoIUix3y0DMEIBhyV/YMzY7rF Fxrw== X-Gm-Message-State: AOJu0YxpdVHOh3MlRvpxBRjr0pDHXJ2MAUqIPCiIWEXoSfxKIUH1ONJ2 k1siMc9UU5Z57v/9OBxNhyEpDNrsH+ELxNdPyWt//xxW+pnIcBEN2JHFOIDGtSVBP0uXC7eYLEn wYTEVraX/hchCg2d/uFPLZUJffUhk+Ak= X-Gm-Gg: AY/fxX4Nc902/a9ToqrJ7V9nVZD8HFwHEdMzz3emTtZ+RCRZEcRTdS33dFCKHdiEhyy yE5ALshj+38Fr4Q7P1WLohhKrwpSmBOvZqpJV50VM1dLs6IJ+padfC8TI2R16PlM2QvdJh6ubGT TGk3iAw+lgUxnxbPejlBICPr9JNpvwad8MYX8w57fYAyMjy5WAv8sSL0xo2zM00+JcIbabbxMnf 4kogZob5qnv5AtAns/KIcWS67ws8htM+PQBmq1Tru+YHh2fHEDuXhVD7yMMwp1tO5Uoxdg12pna yAOuzk7aR95fBzi8zAN3X8oy2RL683uiJNspZXveWEwucEY0es7AqAysGHarWojMJ5zRgn6tgQF 9lAi5DPhzFEipiacBuq1qPkBlm8Bv2/GT9z58xYCsM2bSSHfspZY8DP06yJbKcz2Z57MLMuiJ15 VErFNzJ0ZN X-Received: by 2002:a05:6102:f09:b0:5ed:d33:a65d with SMTP id ada2fe7eead31-5f1a55b6f17mr695866137.34.1768537400433; Thu, 15 Jan 2026 20:23:20 -0800 (PST) MIME-Version: 1.0 References: <202601131715.cheonohttbyj@alvherre.pgsql> <202601140902.x7lh6iq42pwq@alvherre.pgsql> In-Reply-To: <202601140902.x7lh6iq42pwq@alvherre.pgsql> From: jian he Date: Fri, 16 Jan 2026 12:22:43 +0800 X-Gm-Features: AZwV_QiRE6XXfn0qFAqoV0TPdxwjI1kTVC3sHFN_zbji3O53DY4xdRbl45vNdbs Message-ID: Subject: Re: using index to speedup add not null constraints to a table To: =?UTF-8?Q?=C3=81lvaro_Herrera?= Cc: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000867dfe064879b349" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000867dfe064879b349 Content-Type: text/plain; charset="UTF-8" hi. --------------------- create unlogged table t2_copy(col1 int, col2 int, col3 int, col4 int, col5 int) with (autovacuum_enabled = off, vacuum_index_cleanup=off); insert into t2_copy select g, g, g, g,g from generate_series(1, 10_000_000) g; set enable_seqscan to off; set enable_bitmapscan to off; set max_parallel_workers=0; set max_parallel_workers_per_gather=0; create index t2_copy_idx on t2_copy(col1, col2, col3, col4, col5); explain (costs off, analyze) select from t2_copy where col1 is NULL or col2 is NULL or col3 is NULL or col4 is null or col5 is null \watch i=0.1 c=10 drop index t2_copy_idx; create index t2_copy_idx1 on t2_copy(col1); create index t2_copy_idx2 on t2_copy(col2); create index t2_copy_idx3 on t2_copy(col3); create index t2_copy_idx4 on t2_copy(col4); create index t2_copy_idx5 on t2_copy(col5); explain (costs off, analyze) select from t2_copy where col1 is NULL or col2 is NULL or col3 is NULL or col4 is null or col5 is null \watch i=0.1 c=10 ------------------------------------------ By comparing the above two EXPLAIN, I found out that there will be regression for using one multiple column indexes fast verify mutiple not-null constraints. create unlogged table t3_copy(col1 int, col2 int, col3 int, col4 int); create index t3_copy_idx on t3_copy(col1, col2, col3, col4); alter table t3_copy add not null col1, add not null col2, add not null col3, add not null col4; In this case, scanning the t3_copy_idx index to check these four NOT NULL constraints is actually slower than a full table scan. Therefore, I further restricted the use of the index-scan mechanism for fast NOT NULL verification to scenarios where the attribute being checked is the leading column of the index. So, for the above example, to let alter table t3_copy add not null col1, add not null col2, add not null col3, add not null col4; utilize indexscan mechanism, we require four indexes, each index leading column is corresponding to the not-null constraint attribute. I have not yet addressed all of your other comments, as this represents a more of a major change. Therefore, I am submitting the attached patch first. index_check_notnull function, in v8 it is: + /* collect index attnums while loop */ + for (int i = 0; i < index->indnkeyatts; i++) + { + attr = TupleDescAttr(tupdesc, (index->indkey.values[i] - 1)); + + + } in v9, it's: + /* collect index attnums while loop */ + attr = TupleDescAttr(tupdesc, (index->indkey.values[0] - 1)); + I am not sure that regression tests would be helpful, since the test hinges on whether ereport(DEBUG1, ...) is reached. I am not sure about the concurrency implications; therefore, isolation tests are attached. maybe it's not necessary. -- jian https://www.enterprisedb.com --000000000000867dfe064879b349 Content-Type: text/x-patch; charset="US-ASCII"; name="v9-0001-using-indexscan-to-speedup-add-not-null-constraints.patch" Content-Disposition: attachment; filename="v9-0001-using-indexscan-to-speedup-add-not-null-constraints.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkgdftqy0 RnJvbSBhOTgzZTE0YjMyYjBiYTNhMzc5ODZhZjM1YTFmMmZjNmY3ZmFiNzE2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBqaWFuIGhlIDxqaWFuLnVuaXZlcnNhbGl0eUBnbWFpbC5jb20+ CkRhdGU6IEZyaSwgMTYgSmFuIDIwMjYgMTI6MTg6NDMgKzA4MDAKU3ViamVjdDogW1BBVENIIHY5 IDEvMV0gdXNpbmcgaW5kZXhzY2FuIHRvIHNwZWVkdXAgYWRkIG5vdCBudWxsIGNvbnN0cmFpbnRz CgpUaGlzIHBhdGNoIHRyaWVzIHRvIHVzZSBpbmRleF9iZWdpbnNjYW4oKSAvIGluZGV4X2dldG5l eHQoKSAvIGluZGV4X2VuZHNjYW4oKQptZW50aW9uZWQgaW4gWzFdIHRvIHNwZWVkdXAgYWRkaW5n IG5vdC1udWxsIGNvbnN0cmFpbnRzIHRvIHRoZSBleGlzdGluZyB0YWJsZS4KClRoZSBtYWluIGxv Z2ljIGhhcHBlbnMgaW4gcGhhc2UzIEFUUmV3cml0ZVRhYmxlCjEuIGNvbGxlY3QgYWxsIG5vdC1u dWxsIGNvbnN0cmFpbnRzLgoyLiBGb3IgZWFjaCBub3QtbnVsbCBjb25zdHJhaW50LCBjaGVjayB3 aGV0aGVyIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBpbmRleAphdmFpbGFibGUgZm9yIHZhbGlk YXRpb24uIElmIG5vdCwgdGhlbiBjYW4gbm90IHVzZSBpbmRleHNjYW4gdG8gdmVyaWZ5IG5vdC1u dWxsCmNvbnN0cmFpbnRzLgozLiBJZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy ZSB0cnVlCiAgKiB0YWJsZSBzY2FuIG9yIHJld3JpdGUgaXMgcmVxdWlyZWQsCiAgKiB0YWJsZSB3 YXNuJ3QgbG9ja2VkIHdpdGggYEFjY2Vzc0V4Y2x1c2l2ZUxvY2tgCiAgKiB0aGUgTk9UIE5VTEwg Y29uc3RyYWludCBhcHBsaWVzIHRvIGEgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1uCiB0aGVuIGlu ZGV4IHNjYW4gY2Fubm90IGJlIHVzZWQgZm9yIGZhc3QgdmFsaWRhdGlvbi4KNC4gSWYgYWxsIGNv bmRpdGlvbnMgYXJlIHNhdGlzZmllZCwgYXR0ZW1wdCB0byB1c2UgaW5kZXhzY2FuIHRvIHZlcmlm eQp3aGV0aGVyIHRoZSBjb2x1bW4gY29udGFpbnMgYW55IE5VTEwgdmFsdWVzLgoKY29uY3VycmVu Y3kgY29uY2VybjoKQUxURVIgVEFCTEUgU0VUIE5PVCBOVUxMIHdpbGwgdGFrZSBhbiBBQ0NFU1Mg RVhDTFVTSVZFIGxvY2ssIHNvIHRoZXJlIGlzIGxlc3MKdmFyaWFudCBvZiByYWNpbmcgaXNzdWUg Y2FuIG9jY3VyPyAgdG8gcHJvdmUgYWNjdXJhdGUsIEkgd3JvdGUgc29tZSBpc29sYXRpb24KdGVz dHMuIHNlZVsyXQoKcmVmZXJlbmNlczoKWzFdIGh0dHBzOi8vcG9zdGdyLmVzL20vQ0ElMkJUZ21v YTVOS3o4aUdXXzl2N3d6JTNELSUyQnpRRnUlM0RFNFNab2FUYVUxem5MYUVYUllwLVElNDBtYWls LmdtYWlsLmNvbQpbMl0gaHR0cHM6Ly9wb3N0Z3IuZXMvbS85MDAwNTZEMS0zMkRGLTQ5MjctODI1 MS0zRTBDMERDNDA3RkQlNDBhbmFyYXplbC5kZQoKZGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3Iu ZXMvbS9DQUNKdWZ4RmlXPTRrMWlzPUYxSj1yLUN4MVJ1QnlYUVBVcldCMzMxVTQ3clNuR3oraHdA bWFpbC5nbWFpbC5jb20KY29tbWl0ZmVzdCBlbnRyeTogaHR0cHM6Ly9jb21taXRmZXN0LnBvc3Rn cmVzcWwub3JnL3BhdGNoLzU0NDQKLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy90YWJsZWNtZHMu YyAgICAgICAgICAgICAgfCAxMTUgKysrKysrKysrLQogc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhl Y0luZGV4aW5nLmMgICAgICAgICAgIHwgMjA1ICsrKysrKysrKysrKysrKysrKwogc3JjL2luY2x1 ZGUvZXhlY3V0b3IvZXhlY3V0b3IuaCAgICAgICAgICAgICAgIHwgICAyICsKIC4uLi9leHBlY3Rl ZC9pbmRleHNjYW4tY2hlY2stbm90bnVsbC5vdXQgICAgICB8ICA5NyArKysrKysrKysKIHNyYy90 ZXN0L2lzb2xhdGlvbi9pc29sYXRpb25fc2NoZWR1bGUgICAgICAgICB8ICAgMSArCiAuLi4vc3Bl Y3MvaW5kZXhzY2FuLWNoZWNrLW5vdG51bGwuc3BlYyAgICAgICAgfCAgNDUgKysrKwogc3JjL3Rl c3QvbW9kdWxlcy90ZXN0X21pc2MvbWVzb24uYnVpbGQgICAgICAgIHwgICAxICsKIC4uLi90LzAx MV9pbmRleHNjYW5fdmFsaWRhdGVfbm90bnVsbC5wbCAgICAgICB8IDE0NiArKysrKysrKysrKysr CiA4IGZpbGVzIGNoYW5nZWQsIDYwNiBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQogY3Jl YXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9pbmRleHNjYW4tY2hl Y2stbm90bnVsbC5vdXQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9pc29sYXRpb24vc3Bl Y3MvaW5kZXhzY2FuLWNoZWNrLW5vdG51bGwuc3BlYwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90 ZXN0L21vZHVsZXMvdGVzdF9taXNjL3QvMDExX2luZGV4c2Nhbl92YWxpZGF0ZV9ub3RudWxsLnBs CgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdGFibGVjbWRzLmMgYi9zcmMvYmFj a2VuZC9jb21tYW5kcy90YWJsZWNtZHMuYwppbmRleCBmOTc2YzBlNWM3ZS4uYWY2ZWI4YjBhYzIg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jCisrKyBiL3NyYy9i YWNrZW5kL2NvbW1hbmRzL3RhYmxlY21kcy5jCkBAIC0yMTAsMTYgKzIxMCwxOSBAQCB0eXBlZGVm IHN0cnVjdCBBbHRlcmVkVGFibGVJbmZvCiAJTGlzdAkgICAqY2hhbmdlZFN0YXRpc3RpY3NEZWZz OwkvKiBzdHJpbmcgZGVmaW5pdGlvbnMgb2Ygc2FtZSAqLwogfSBBbHRlcmVkVGFibGVJbmZvOwog Ci0vKiBTdHJ1Y3QgZGVzY3JpYmluZyBvbmUgbmV3IGNvbnN0cmFpbnQgdG8gY2hlY2sgaW4gUGhh c2UgMyBzY2FuICovCi0vKiBOb3RlOiBuZXcgbm90LW51bGwgY29uc3RyYWludHMgYXJlIGhhbmRs ZWQgZWxzZXdoZXJlICovCisvKgorICogU3RydWN0IGRlc2NyaWJpbmcgb25lIG5ldyBjb25zdHJh aW50IHRvIGNoZWNrIGluIFBoYXNlIDMgc2Nhbi4gTm90ZTogbmV3CisgKiBub3QtbnVsbCBjb25z dHJhaW50cyBhcmUgaGFuZGxlZCBoZXJlIHRvby4KKyovCiB0eXBlZGVmIHN0cnVjdCBOZXdDb25z dHJhaW50CiB7CiAJY2hhcgkgICAqbmFtZTsJCQkvKiBDb25zdHJhaW50IG5hbWUsIG9yIE5VTEwg aWYgbm9uZSAqLwotCUNvbnN0clR5cGUJY29udHlwZTsJCS8qIENIRUNLIG9yIEZPUkVJR04gKi8K KwlDb25zdHJUeXBlCWNvbnR5cGU7CQkvKiBDSEVDSyBvciBGT1JFSUdOIG9yIE5PVCBOVUxMICov CiAJT2lkCQkJcmVmcmVsaWQ7CQkvKiBQSyByZWwsIGlmIEZPUkVJR04gKi8KIAlPaWQJCQlyZWZp bmRpZDsJCS8qIE9JRCBvZiBQSydzIGluZGV4LCBpZiBGT1JFSUdOICovCiAJYm9vbAkJY29ud2l0 aHBlcmlvZDsJLyogV2hldGhlciB0aGUgbmV3IEZPUkVJR04gS0VZIHVzZXMgUEVSSU9EICovCiAJ T2lkCQkJY29uaWQ7CQkJLyogT0lEIG9mIHBnX2NvbnN0cmFpbnQgZW50cnksIGlmIEZPUkVJR04g Ki8KKwlpbnQJCQlhdHRudW07CQkJLyogTk9UIE5VTEwgY29uc3RyYWludCBhdHRyaWJ1dGUgbnVt YmVyICovCiAJTm9kZQkgICAqcXVhbDsJCQkvKiBDaGVjayBleHByIG9yIENPTlNUUl9GT1JFSUdO IENvbnN0cmFpbnQgKi8KIAlFeHByU3RhdGUgICpxdWFsc3RhdGU7CQkvKiBFeGVjdXRpb24gc3Rh dGUgZm9yIENIRUNLIGV4cHIgKi8KIH0gTmV3Q29uc3RyYWludDsKQEAgLTYyMTcsNiArNjIyMCw5 IEBAIEFUUmV3cml0ZVRhYmxlKEFsdGVyZWRUYWJsZUluZm8gKnRhYiwgT2lkIE9JRE5ld0hlYXAp CiAJCQkJbmVlZHNjYW4gPSB0cnVlOwogCQkJCWNvbi0+cXVhbHN0YXRlID0gRXhlY1ByZXBhcmVF eHByKChFeHByICopIGV4cGFuZF9nZW5lcmF0ZWRfY29sdW1uc19pbl9leHByKGNvbi0+cXVhbCwg b2xkcmVsLCAxKSwgZXN0YXRlKTsKIAkJCQlicmVhazsKKwkJCWNhc2UgQ09OU1RSX05PVE5VTEw6 CisJCQkJLyogTm90aGluZyB0byBkbyBoZXJlICovCisJCQkJYnJlYWs7CiAJCQljYXNlIENPTlNU Ul9GT1JFSUdOOgogCQkJCS8qIE5vdGhpbmcgdG8gZG8gaGVyZSAqLwogCQkJCWJyZWFrOwpAQCAt NjI3MCwxMCArNjI3Niw3MyBAQCBBVFJld3JpdGVUYWJsZShBbHRlcmVkVGFibGVJbmZvICp0YWIs IE9pZCBPSUROZXdIZWFwKQogCQkJCQkJCQkJCQkJCQl3aG9sZWF0dC0+YXR0bnVtKTsKIAkJCX0K IAkJfQotCQlpZiAobm90bnVsbF9hdHRycyB8fCBub3RudWxsX3ZpcnR1YWxfYXR0cnMpCi0JCQlu ZWVkc2NhbiA9IHRydWU7CiAJfQogCisJLyoKKwkgKiBUaGUgY29uZGl0aW9ucyBmb3IgdXNpbmcg aW5kZXhzY2FuIG1lY2hhbmlzbSBmYXN0IHZlcmlmeWluZyBub3QtbnVsbAorCSAqIGNvbnN0cmFp bnRzIGFyZSBxdWl0ZSBzdHJpY3QuIEFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgbXVz dCBiZQorCSAqIG1ldC4KKwkgKgorCSAqIDEuIEFsdGVyZWRUYWJsZUluZm8tPnZlcmlmeV9uZXdf bm90bnVsbCBpcyB0cnVlLgorCSAqCisJICogMi4gSWYgdGFibGUgc2NhbiAoZm9yIG90aGVyIHJl YXNvbiwgbGlrZSBjaGVjayBjb25zdHJhaW50IHZlcmlmaWNhdGlvbikKKwkgKiBvciB0YWJsZSBy ZXdyaXRlIGlzIGV4cGVjdGVkIGxhdGVyLCB1c2luZyBpbmRleHNjYW4gaXMganVzdCB3YXN0ZXMK KwkgKiBjeWNsZXMuCisJICoKKwkgKiAzLiBJbmRleGVzIGNhbm5vdCBiZSBjcmVhdGVkIG9uIHZp cnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMsIHNvIGZhc3QKKwkgKiBjaGVja2luZyBub3QtbnVsbCBj b25zdHJhaW50cyBpcyBub3QgYXBwbGljYWJsZSB0byB0aGVtLgorCSAqCisJICogNC4gVGhpcyBh cHBsaWVzIHRvIHBsYWluIHJlbGF0aW9ucyBvbmx5LgorCSAqCisJICogNS4gVG8gcHJldmVudCBw b3NzaWJsZSBjb25jdXJyZW5jeSBpc3N1ZXMsIHRoZSB0YWJsZSBtdXN0IGFscmVhZHkgYmUKKwkg KiBsb2NrZWQgd2l0aCBhbiBBY2Nlc3NFeGNsdXNpdmVMb2NrLCB3aGljaCBpcyB0aGUgbG9jayBv YnRhaW5lZCBkdXJpbmcKKwkgKiBBTFRFUiBUQUJMRSBTRVQgTk9UIE5VTEwuCisJICovCisJaWYg KCFuZWVkc2NhbiAmJgorCQluZXdyZWwgPT0gTlVMTCAmJgorCQl0YWItPnZlcmlmeV9uZXdfbm90 bnVsbCAmJgorCQlub3RudWxsX3ZpcnR1YWxfYXR0cnMgPT0gTklMICYmCisJCW9sZHJlbC0+cmRf cmVsLT5yZWxraW5kID09IFJFTEtJTkRfUkVMQVRJT04gJiYKKwkJQ2hlY2tSZWxhdGlvbkxvY2tl ZEJ5TWUob2xkcmVsLCBBY2Nlc3NFeGNsdXNpdmVMb2NrLCBmYWxzZSkpCisJeworCQlMaXN0CSAg ICpub3RudWxsX2F0dG51bXMgPSBOSUw7CisKKwkJQXNzZXJ0KCF0YWItPnJld3JpdGUpOworCisJ CWZvcmVhY2gobCwgdGFiLT5jb25zdHJhaW50cykKKwkJeworCQkJRm9ybV9wZ19hdHRyaWJ1dGUg YXR0cjsKKwkJCU5ld0NvbnN0cmFpbnQgKmNvbiA9IGxmaXJzdChsKTsKKworCQkJaWYgKGNvbi0+ Y29udHlwZSAhPSBDT05TVFJfTk9UTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJYXR0ciA9IFR1 cGxlRGVzY0F0dHIobmV3VHVwRGVzYywgY29uLT5hdHRudW0gLSAxKTsKKworCQkJaWYgKGF0dHIt PmF0dGlzZHJvcHBlZCkKKwkJCQljb250aW51ZTsKKworCQkJQXNzZXJ0KGF0dHItPmF0dG5vdG51 bGwpOworCQkJQXNzZXJ0KGF0dHItPmF0dG51bSA9PSBjb24tPmF0dG51bSk7CisJCQlBc3NlcnQo YXR0ci0+YXR0Z2VuZXJhdGVkICE9IEFUVFJJQlVURV9HRU5FUkFURURfVklSVFVBTCk7CisKKwkJ CW5vdG51bGxfYXR0bnVtcyA9IGxpc3RfYXBwZW5kX3VuaXF1ZV9pbnQobm90bnVsbF9hdHRudW1z LAorCQkJCQkJCQkJCQkJCSBhdHRyLT5hdHRudW0pOworCQl9CisKKwkJaWYgKG5vdG51bGxfYXR0 bnVtcyAhPSBOSUwpCisJCXsKKwkJCWlmIChpbmRleF9jaGVja19ub3RudWxsKG9sZHJlbCwgbm90 bnVsbF9hdHRudW1zKSkKKwkJCQllcmVwb3J0KERFQlVHMSwKKwkJCQkJCWVycm1zZ19pbnRlcm5h bCgiYWxsIG5ldyBub3QtbnVsbCBjb25zdHJhaW50cyBvbiByZWxhdGlvbiBcIiVzXCIgaGF2ZSBi ZWVuIHZhbGlkYXRlZCBieSB1c2luZyBpbmRleCBzY2FuIiwKKwkJCQkJCQkJCQlSZWxhdGlvbkdl dFJlbGF0aW9uTmFtZShvbGRyZWwpKSk7CisJCQllbHNlCisJCQkJbmVlZHNjYW4gPSB0cnVlOwor CQl9CisJfQorCWVsc2UgaWYgKG5vdG51bGxfYXR0cnMgfHwgbm90bnVsbF92aXJ0dWFsX2F0dHJz KQorCQluZWVkc2NhbiA9IHRydWU7CisKIAlpZiAobmV3cmVsIHx8IG5lZWRzY2FuKQogCXsKIAkJ RXhwckNvbnRleHQgKmVjb250ZXh0OwpAQCAtNzk0OSw2ICs4MDE4LDcgQEAgQVRFeGVjU2V0Tm90 TnVsbChMaXN0ICoqd3F1ZXVlLCBSZWxhdGlvbiByZWwsIGNoYXIgKmNvbk5hbWUsIGNoYXIgKmNv bE5hbWUsCiAJQ29va2VkQ29uc3RyYWludCAqY2NvbjsKIAlMaXN0CSAgICpjb29rZWQ7CiAJYm9v bAkJaXNfbm9faW5oZXJpdCA9IGZhbHNlOworCUFsdGVyZWRUYWJsZUluZm8gKnRhYiA9IEFUR2V0 UXVldWVFbnRyeSh3cXVldWUsIHJlbCk7OwogCiAJLyogR3VhcmQgYWdhaW5zdCBzdGFjayBvdmVy ZmxvdyBkdWUgdG8gb3Zlcmx5IGRlZXAgaW5oZXJpdGFuY2UgdHJlZS4gKi8KIAljaGVja19zdGFj a19kZXB0aCgpOwpAQCAtODA3Nyw2ICs4MTQ3LDI0IEBAIEFURXhlY1NldE5vdE51bGwoTGlzdCAq KndxdWV1ZSwgUmVsYXRpb24gcmVsLCBjaGFyICpjb25OYW1lLCBjaGFyICpjb2xOYW1lLAogCWNv b2tlZCA9IEFkZFJlbGF0aW9uTmV3Q29uc3RyYWludHMocmVsLCBOSUwsIGxpc3RfbWFrZTEoY29u c3RyYWludCksCiAJCQkJCQkJCQkgICBmYWxzZSwgIXJlY3Vyc2luZywgZmFsc2UsIE5VTEwpOwog CWNjb24gPSBsaW5pdGlhbChjb29rZWQpOworCisJQXNzZXJ0KGNjb24tPmNvbnR5cGUgPT0gQ09O U1RSX05PVE5VTEwpOworCisJLyoKKwkgKiBXZSBtYXkgdXNpbmcgaW5kZXhzY2FuIHRvIHZlcnRp Znkgbm90LW51bGwgY29uc3RyYWludCBpbiBQaGFzZTMuICBBZGQKKwkgKiB0aGUgdG8tYmUtdmFs aWRhdGVkIG5vdC1udWxsIGNvbnN0cmFpbnQgdG8gUGhhc2UgMydzIHF1ZXVlLgorCSAqLworCWlm ICghY2Nvbi0+c2tpcF92YWxpZGF0aW9uKQorCXsKKwkJTmV3Q29uc3RyYWludCAqbmV3Y29uID0g cGFsbG9jMF9vYmplY3QoTmV3Q29uc3RyYWludCk7CisKKwkJbmV3Y29uLT5uYW1lID0gY2Nvbi0+ bmFtZTsKKwkJbmV3Y29uLT5jb250eXBlID0gQ09OU1RSX05PVE5VTEw7CisJCW5ld2Nvbi0+YXR0 bnVtID0gY2Nvbi0+YXR0bnVtOworCisJCXRhYi0+Y29uc3RyYWludHMgPSBsYXBwZW5kKHRhYi0+ Y29uc3RyYWludHMsIG5ld2Nvbik7CisJfQorCiAJT2JqZWN0QWRkcmVzc1NldChhZGRyZXNzLCBD b25zdHJhaW50UmVsYXRpb25JZCwgY2Nvbi0+Y29ub2lkKTsKIAogCUludm9rZU9iamVjdFBvc3RB bHRlckhvb2soUmVsYXRpb25SZWxhdGlvbklkLApAQCAtOTk4MywxMyArMTAwNzEsMTUgQEAgQVRB ZGRDaGVja05OQ29uc3RyYWludChMaXN0ICoqd3F1ZXVlLCBBbHRlcmVkVGFibGVJbmZvICp0YWIs IFJlbGF0aW9uIHJlbCwKIAl7CiAJCUNvb2tlZENvbnN0cmFpbnQgKmNjb24gPSAoQ29va2VkQ29u c3RyYWludCAqKSBsZmlyc3QobGNvbik7CiAKLQkJaWYgKCFjY29uLT5za2lwX3ZhbGlkYXRpb24g JiYgY2Nvbi0+Y29udHlwZSAhPSBDT05TVFJfTk9UTlVMTCkKKwkJaWYgKCFjY29uLT5za2lwX3Zh bGlkYXRpb24pCiAJCXsKIAkJCU5ld0NvbnN0cmFpbnQgKm5ld2NvbjsKIAogCQkJbmV3Y29uID0g cGFsbG9jMF9vYmplY3QoTmV3Q29uc3RyYWludCk7CiAJCQluZXdjb24tPm5hbWUgPSBjY29uLT5u YW1lOwogCQkJbmV3Y29uLT5jb250eXBlID0gY2Nvbi0+Y29udHlwZTsKKwkJCWlmIChjY29uLT5j b250eXBlID09IENPTlNUUl9OT1ROVUxMKQorCQkJCW5ld2Nvbi0+YXR0bnVtID0gY2Nvbi0+YXR0 bnVtOwogCQkJbmV3Y29uLT5xdWFsID0gY2Nvbi0+ZXhwcjsKIAogCQkJdGFiLT5jb25zdHJhaW50 cyA9IGxhcHBlbmQodGFiLT5jb25zdHJhaW50cywgbmV3Y29uKTsKQEAgLTEzMjU4LDYgKzEzMzQ4 LDcgQEAgUXVldWVOTkNvbnN0cmFpbnRWYWxpZGF0aW9uKExpc3QgKip3cXVldWUsIFJlbGF0aW9u IGNvbnJlbCwgUmVsYXRpb24gcmVsLAogCUxpc3QJICAgKmNoaWxkcmVuID0gTklMOwogCUF0dHJO dW1iZXIJYXR0bnVtOwogCWNoYXIJICAgKmNvbG5hbWU7CisJTmV3Q29uc3RyYWludCAqbmV3Y29u OwogCiAJY29uID0gKEZvcm1fcGdfY29uc3RyYWludCkgR0VUU1RSVUNUKGNvbnR1cGxlKTsKIAlB c3NlcnQoY29uLT5jb250eXBlID09IENPTlNUUkFJTlRfTk9UTlVMTCk7CkBAIC0xMzMyMSw3ICsx MzQxMiwxOSBAQCBRdWV1ZU5OQ29uc3RyYWludFZhbGlkYXRpb24oTGlzdCAqKndxdWV1ZSwgUmVs YXRpb24gY29ucmVsLCBSZWxhdGlvbiByZWwsCiAJLyogU2V0IGF0dG5vdG51bGwgYXBwcm9wcmlh dGVseSB3aXRob3V0IHF1ZXVlaW5nIGFub3RoZXIgdmFsaWRhdGlvbiAqLwogCXNldF9hdHRub3Ru dWxsKE5VTEwsIHJlbCwgYXR0bnVtLCB0cnVlLCBmYWxzZSk7CiAKKwkvKgorCSAqIFF1ZXVlIHZh bGlkYXRpb24gZm9yIHBoYXNlIDMuIEFMVEVSIFRBQkxFIFNFVCBOT1QgTlVMTCBhZGRzIGEgTk9U IE5VTEwKKwkgKiBjb25zdHJhaW50IHRvIEFsdGVyZWRUYWJsZUluZm8tPmNvbnN0cmFpbnRzLCBm b3IgY29uc2lzdGVuY3ksIGRvIHRoZQorCSAqIHNhbWUgaGVyZS4KKwkgKi8KKwluZXdjb24gPSBw YWxsb2MwX29iamVjdChOZXdDb25zdHJhaW50KTsKKwluZXdjb24tPm5hbWUgPSBjb2xuYW1lOwor CW5ld2Nvbi0+Y29udHlwZSA9IENPTlNUUl9OT1ROVUxMOworCW5ld2Nvbi0+YXR0bnVtID0gYXR0 bnVtOworCisJLyogRmluZCBvciBjcmVhdGUgd29yayBxdWV1ZSBlbnRyeSBmb3IgdGhpcyB0YWJs ZSAqLwogCXRhYiA9IEFUR2V0UXVldWVFbnRyeSh3cXVldWUsIHJlbCk7CisJdGFiLT5jb25zdHJh aW50cyA9IGxhcHBlbmQodGFiLT5jb25zdHJhaW50cywgbmV3Y29uKTsKIAl0YWItPnZlcmlmeV9u ZXdfbm90bnVsbCA9IHRydWU7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0 b3IvZXhlY0luZGV4aW5nLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcuYwpp bmRleCA2YWUwZjk1OTU5Mi4uMTdiYjliZjc2YjEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4 ZWN1dG9yL2V4ZWNJbmRleGluZy5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNJbmRl eGluZy5jCkBAIC0xMDksMTEgKzEwOSwxNCBAQAogI2luY2x1ZGUgImFjY2Vzcy9nZW5hbS5oIgog I2luY2x1ZGUgImFjY2Vzcy9yZWxzY2FuLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3RhYmxlYW0uaCIK KyNpbmNsdWRlICJhY2Nlc3MvdGFibGUuaCIKICNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIgogI2lu Y2x1ZGUgImNhdGFsb2cvaW5kZXguaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2FtX2QuaCIKICNp bmNsdWRlICJleGVjdXRvci9leGVjdXRvci5oIgogI2luY2x1ZGUgIm5vZGVzL25vZGVGdW5jcy5o IgogI2luY2x1ZGUgInN0b3JhZ2UvbG1nci5oIgorI2luY2x1ZGUgInV0aWxzL2ZtZ3JvaWRzLmgi CiAjaW5jbHVkZSAidXRpbHMvaW5qZWN0aW9uX3BvaW50LmgiCiAjaW5jbHVkZSAidXRpbHMvbXVs dGlyYW5nZXR5cGVzLmgiCiAjaW5jbHVkZSAidXRpbHMvcmFuZ2V0eXBlcy5oIgpAQCAtMTQ2LDYg KzE0OSw3IEBAIHN0YXRpYyBib29sIGluZGV4X2V4cHJlc3Npb25fY2hhbmdlZF93YWxrZXIoTm9k ZSAqbm9kZSwKIAkJCQkJCQkJCQkJQml0bWFwc2V0ICphbGxVcGRhdGVkQ29scyk7CiBzdGF0aWMg dm9pZCBFeGVjV2l0aG91dE92ZXJsYXBzTm90RW1wdHkoUmVsYXRpb24gcmVsLCBOYW1lRGF0YSBh dHRuYW1lLCBEYXR1bSBhdHR2YWwsCiAJCQkJCQkJCQkJY2hhciB0eXB0eXBlLCBPaWQgYXR0dHlw aWQpOworc3RhdGljIGJvb2wgaW5kZXhfY2hlY2tfbm90bnVsbF9pbnRlcm5hbChSZWxhdGlvbiBy ZWxhdGlvbiwgTGlzdCAqYXR0bnVtcywgTGlzdCAqaWR4cyk7CiAKIC8qIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCQlF eGVjT3BlbkluZGljZXMKQEAgLTExNzgsMyArMTE4MiwyMDQgQEAgRXhlY1dpdGhvdXRPdmVybGFw c05vdEVtcHR5KFJlbGF0aW9uIHJlbCwgTmFtZURhdGEgYXR0bmFtZSwgRGF0dW0gYXR0dmFsLCBj aGFyIHQKIAkJCQkgZXJybXNnKCJlbXB0eSBXSVRIT1VUIE9WRVJMQVBTIHZhbHVlIGZvdW5kIGlu IGNvbHVtbiBcIiVzXCIgaW4gcmVsYXRpb24gXCIlc1wiIiwKIAkJCQkJCU5hbWVTdHIoYXR0bmFt ZSksIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkpKSk7CiB9CisKKy8qCisgKiBub3RudWxs X2F0dG51bXM6IGxpc3Qgb2YgYXR0cmlidXRlIG51bWJlcnMgZm9yIGFsbCBuZXdseSBhZGRlZCBO T1QgTlVMTAorICogY29uc3RyYWludHMuCisgKgorICogRm9yIGVhY2ggTk9UIE5VTEwgYXR0cmli dXRlLCBmaXJzdCBjaGVjayB3aGV0aGVyIHRoZSByZWxhdGlvbiBoYXMgYSBzdWl0YWJsZQorICog aW5kZXggdG8gZmV0Y2ggdGhhdCBhdHRyaWJ1dGUgY29udGVudC4gSWYgc28sIHVzaW5nIGluZGV4 c2NhbiB0byB2ZXJpZnkgdGhhdAorICogYXR0cmlidXRlIGNvbnRhaW5zIG5vIE5VTEwgdmFsdWVz LgorICoKKyAqIFJldHVybmluZyB0cnVlIGluZGljYXRlcyB0aGF0IGFsbCBuZXcgTk9UIE5VTEwg Y29uc3RyYWludHMgaGF2ZSBiZWVuCisgKiB2YWxpZGF0ZWQgYW5kIHRoYXQgbm8gYWRkaXRpb25h bCB0YWJsZSBzY2FuIGlzIHJlcXVpcmVkLgorICovCitib29sCitpbmRleF9jaGVja19ub3RudWxs KFJlbGF0aW9uIHJlbGF0aW9uLCBMaXN0ICpub3RudWxsX2F0dG51bXMpCit7CisJUmVsYXRpb24J cGdfaW5kZXg7CisJUmVsYXRpb24JaW5kZXhfcmVsOworCVN5c1NjYW5EZXNjIGluZHNjYW47CisJ U2NhbktleURhdGEgc2tleTsKKwlIZWFwVHVwbGUJaHR1cDsKKwlGb3JtX3BnX2F0dHJpYnV0ZSBh dHRyOworCUxpc3QJICAgKmlkeHMgPSBOSUw7CisJTGlzdAkgICAqYXR0bnVtcyA9IE5JTDsKKwlU dXBsZURlc2MJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IocmVsYXRpb24pOworCisJLyogUHJl cGFyZSB0byBzY2FuIHBnX2luZGV4IGZvciBlbnRyaWVzIGhhdmluZyBpbmRyZWxpZCA9IHRoaXMg cmVsICovCisJU2NhbktleUluaXQoJnNrZXksCisJCQkJQW51bV9wZ19pbmRleF9pbmRyZWxpZCwK KwkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJT2JqZWN0SWRHZXREYXR1 bShSZWxhdGlvbkdldFJlbGlkKHJlbGF0aW9uKSkpOworCisJcGdfaW5kZXggPSB0YWJsZV9vcGVu KEluZGV4UmVsYXRpb25JZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwlpbmRzY2FuID0gc3lzdGFibGVf YmVnaW5zY2FuKHBnX2luZGV4LCBJbmRleEluZHJlbGlkSW5kZXhJZCwgdHJ1ZSwKKwkJCQkJCQkJ IE5VTEwsIDEsICZza2V5KTsKKworCXdoaWxlIChIZWFwVHVwbGVJc1ZhbGlkKGh0dXAgPSBzeXN0 YWJsZV9nZXRuZXh0KGluZHNjYW4pKSkKKwl7CisJCUZvcm1fcGdfaW5kZXggaW5kZXggPSAoRm9y bV9wZ19pbmRleCkgR0VUU1RSVUNUKGh0dXApOworCisJCS8qCisJCSAqIFdlIGNhbiBvbmx5IHVz ZSBub24tZGVmZXJyZWQsIHZhbGlkYXRlZCwgYW5kIGFsaXZlIGJ0cmVlIGluZGV4IHRvCisJCSAq IHZhbGlkYXRlIG5vdC1udWxsIGNvbnN0cmFpbnRzCisJCSAqLworCQlpZiAoIWluZGV4LT5pbmRp bW1lZGlhdGUgfHwgIWluZGV4LT5pbmRpc3ZhbGlkIHx8ICFpbmRleC0+aW5kaXNsaXZlKQorCQkJ Y29udGludWU7CisKKwkJLyogY2Fubm90IHVzZSBleHByZXNzaW9uIGluZGV4IG9yIHBhcnRpYWwg aW5kZXggdG9vICovCisJCWlmICghaGVhcF9hdHRpc251bGwoaHR1cCwgQW51bV9wZ19pbmRleF9p bmRleHBycywgTlVMTCkgfHwKKwkJCSFoZWFwX2F0dGlzbnVsbChodHVwLCBBbnVtX3BnX2luZGV4 X2luZHByZWQsIE5VTEwpKQorCQkJY29udGludWU7CisKKwkJaW5kZXhfcmVsID0gaW5kZXhfb3Bl bihpbmRleC0+aW5kZXhyZWxpZCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCQlpZiAoaW5kZXhfcmVs LT5yZF9yZWwtPnJlbGFtICE9IEJUUkVFX0FNX09JRCkKKwkJeworCQkJaW5kZXhfY2xvc2UoaW5k ZXhfcmVsLCBBY2Nlc3NTaGFyZUxvY2spOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWF0dHIg PSBUdXBsZURlc2NBdHRyKHR1cGRlc2MsIChpbmRleC0+aW5ka2V5LnZhbHVlc1swXSAtIDEpKTsK KworCQlpZiAobGlzdF9tZW1iZXJfaW50KG5vdG51bGxfYXR0bnVtcywgYXR0ci0+YXR0bnVtKSAm JgorCQkJIWxpc3RfbWVtYmVyX2ludChhdHRudW1zLCBhdHRyLT5hdHRudW0pKQorCQl7CisJCQlh dHRudW1zID0gbGFwcGVuZF9pbnQoYXR0bnVtcywgYXR0ci0+YXR0bnVtKTsKKwkJCWlkeHMgPSBs YXBwZW5kX29pZChpZHhzLCBpbmRleC0+aW5kZXhyZWxpZCk7CisJCX0KKwkJaW5kZXhfY2xvc2Uo aW5kZXhfcmVsLCBOb0xvY2spOworCX0KKwlzeXN0YWJsZV9lbmRzY2FuKGluZHNjYW4pOworCXRh YmxlX2Nsb3NlKHBnX2luZGV4LCBBY2Nlc3NTaGFyZUxvY2spOworCisJaWYgKGF0dG51bXMgPT0g TklMIHx8CisJCWxpc3RfbGVuZ3RoKG5vdG51bGxfYXR0bnVtcykgIT0gbGlzdF9sZW5ndGgoYXR0 bnVtcykpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogRWFjaCBOT1QgTlVMTCBjb25zdHJh aW50IHJlcXVpcmVzIGEgc3VpdGFibGUgaW5kZXggZm9yIGluZGV4LWJhc2VkCisJICogdmFsaWRh dGlvbi4gSWYgbm8gc3VjaCBpbmRleCBleGlzdHMsIHJlZ3VsYXIgdGFibGUgc2NhbiBpcyByZXF1 aXJlZCB0bworCSAqIHZhbGlkYXRlIHRoZSBOT1QgTlVMTCBjb25zdHJhaW50cy4KKwkgKi8KKwlm b3JlYWNoX2ludChhdHRubywgbm90bnVsbF9hdHRudW1zKQorCXsKKwkJaWYgKCFsaXN0X21lbWJl cl9pbnQoYXR0bnVtcywgYXR0bm8pKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiBp bmRleF9jaGVja19ub3RudWxsX2ludGVybmFsKHJlbGF0aW9uLCBhdHRudW1zLCBpZHhzKTsKK30K KworLyoKKyAqIFVzZSBpbmRleHNjYW4gbWVjaGFuaXNtIHRvIGZhc3QgdmVyaWZ5IGVhY2ggYXR0 cmlidXRlIGluICJhdHRudW1zIiBhcmUKKyAqIG5vdC1udWxsIG9yIG5vdC4KKyAqLworc3RhdGlj IGJvb2wKK2luZGV4X2NoZWNrX25vdG51bGxfaW50ZXJuYWwoUmVsYXRpb24gcmVsYXRpb24sIExp c3QgKmF0dG51bXMsIExpc3QgKmlkeHMpCit7CisJVHVwbGVUYWJsZVNsb3QgKmV4aXN0aW5nX3Ns b3Q7CisJYm9vbAkJYWxsX25vdF9udWxsID0gdHJ1ZTsKKwlMaXN0Q2VsbCAgICpsYywKKwkJCSAg ICpsYzI7CisKKwkvKgorCSAqIE5lZWQgYW4gRVN0YXRlIGZvciBzbG90IHRvIGhvbGQgdGhlIGN1 cnJlbnQgdHVwbGUuCisJICovCisJRVN0YXRlCSAgICplc3RhdGUgPSBDcmVhdGVFeGVjdXRvclN0 YXRlKCk7CisKKwlFeHByQ29udGV4dCAqZWNvbnRleHQgPSBHZXRQZXJUdXBsZUV4cHJDb250ZXh0 KGVzdGF0ZSk7CisKKwlmb3Jib3RoKGxjLCBhdHRudW1zLCBsYzIsIGlkeHMpCisJeworCQlTbmFw c2hvdERhdGEgRGlydHlTbmFwc2hvdDsKKwkJSW5kZXhTY2FuRGVzYyBpbmRleF9zY2FuOworCQlT Y2FuS2V5RGF0YSBzY2Fua2V5c1tJTkRFWF9NQVhfS0VZU107CisJCUluZGV4SW5mbyAgKmluZGV4 SW5mbzsKKwkJQXR0ck51bWJlcglza19hdHRubyA9IC0xOworCQlSZWxhdGlvbglpbmRleDsKKwkJ aW50CQkJaW5kbmtleWF0dHM7CisKKwkJQXR0ck51bWJlcglhdHRubyA9IGxmaXJzdF9pbnQobGMp OworCQlPaWQJCQlpbmRleG9pZCA9IGxmaXJzdF9vaWQobGMyKTsKKworCQlleGlzdGluZ19zbG90 ID0gdGFibGVfc2xvdF9jcmVhdGUocmVsYXRpb24sIE5VTEwpOworCisJCS8qIEFycmFuZ2UgZm9y IGVjb250ZXh0J3Mgc2NhbiB0dXBsZSB0byBiZSB0aGUgdHVwbGUgdW5kZXIgdGVzdCAqLworCQll Y29udGV4dC0+ZWN4dF9zY2FudHVwbGUgPSBleGlzdGluZ19zbG90OworCisJCWluZGV4ID0gaW5k ZXhfb3BlbihpbmRleG9pZCwgTm9Mb2NrKTsKKworCQlpbmRleEluZm8gPSBCdWlsZEluZGV4SW5m byhpbmRleCk7CisJCWluZG5rZXlhdHRzID0gSW5kZXhSZWxhdGlvbkdldE51bWJlck9mS2V5QXR0 cmlidXRlcyhpbmRleCk7CisKKwkJLyoKKwkJICogU2VhcmNoIHRoZSB0dXBsZXMgdGhhdCBhcmUg aW4gdGhlIGluZGV4IGZvciBhbnkgdmlvbGF0aW9ucywKKwkJICogaW5jbHVkaW5nIHR1cGxlcyB0 aGF0IGFyZW4ndCB2aXNpYmxlIHlldC4KKwkJICovCisJCUluaXREaXJ0eVNuYXBzaG90KERpcnR5 U25hcHNob3QpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kbmtleWF0dHM7IGkrKykKKwkJ eworCQkJaWYgKGluZGV4SW5mby0+aWlfSW5kZXhBdHRyTnVtYmVyc1tpXSA9PSBhdHRubykKKwkJ CXsKKwkJCQlza19hdHRubyA9IGkgKyAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYg KHNrX2F0dG5vID09IC0xKQorCQkJZWxvZyhFUlJPUiwgImNhY2hlIGxvb2t1cCBmYWlsZWQgZm9y IGF0dHJpYnV0ZSBudW1iZXIgJWQgb24gaW5kZXggJXUiLAorCQkJCSBpbmRleG9pZCwgYXR0bm8p OworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kbmtleWF0dHM7IGkrKykKKwkJeworCQkJLyog c2V0IHVwIGFuIElTIE5VTEwgc2NhbiBrZXkgc28gdGhhdCB3ZSBpZ25vcmUgbm90IG51bGxzICov CisJCQlTY2FuS2V5RW50cnlJbml0aWFsaXplKCZzY2Fua2V5c1tpXSwKKwkJCQkJCQkJICAgU0tf SVNOVUxMIHwgU0tfU0VBUkNITlVMTCwKKwkJCQkJCQkJICAgc2tfYXR0bm8sCS8qIGluZGV4IGNv bCB0byBzY2FuICovCisJCQkJCQkJCSAgIEludmFsaWRTdHJhdGVneSwgLyogbm8gc3RyYXRlZ3kg Ki8KKwkJCQkJCQkJICAgSW52YWxpZE9pZCwJLyogbm8gc3RyYXRlZ3kgc3VidHlwZSAqLworCQkJ CQkJCQkgICBJbnZhbGlkT2lkLAkvKiBubyBjb2xsYXRpb24gKi8KKwkJCQkJCQkJICAgSW52YWxp ZE9pZCwJLyogbm8gcmVnIHByb2MgZm9yIHRoaXMgKi8KKwkJCQkJCQkJICAgKERhdHVtKSAwKTsJ LyogY29uc3RhbnQgKi8KKwkJfQorCisJCWluZGV4X3NjYW4gPSBpbmRleF9iZWdpbnNjYW4ocmVs YXRpb24sIGluZGV4LCAmRGlydHlTbmFwc2hvdCwgTlVMTCwgaW5kbmtleWF0dHMsIDApOworCQlp bmRleF9yZXNjYW4oaW5kZXhfc2Nhbiwgc2NhbmtleXMsIGluZG5rZXlhdHRzLCBOVUxMLCAwKTsK KworCQl3aGlsZSAoaW5kZXhfZ2V0bmV4dF9zbG90KGluZGV4X3NjYW4sIEZvcndhcmRTY2FuRGly ZWN0aW9uLCBleGlzdGluZ19zbG90KSkKKwkJeworCQkJRGF0dW0JCXZhbHVlc1tJTkRFWF9NQVhf S0VZU107CisJCQlib29sCQludWxsc1tJTkRFWF9NQVhfS0VZU107CisKKwkJCS8qCisJCQkgKiBF eHRyYWN0IHRoZSBpbmRleCBjb2x1bW4gdmFsdWVzIGFuZCBpc251bGwgZmxhZ3MgZnJvbSB0aGUK KwkJCSAqIGV4aXN0aW5nIHR1cGxlLgorCQkJICovCisJCQlGb3JtSW5kZXhEYXR1bShpbmRleElu Zm8sIGV4aXN0aW5nX3Nsb3QsIGVzdGF0ZSwgdmFsdWVzLCBudWxscyk7CisKKwkJCWlmIChudWxs c1tza19hdHRubyAtIDFdKQorCQkJeworCQkJCWFsbF9ub3RfbnVsbCA9IGZhbHNlOworCQkJCWJy ZWFrOworCQkJfQorCQl9CisKKwkJaW5kZXhfZW5kc2NhbihpbmRleF9zY2FuKTsKKwkJaW5kZXhf Y2xvc2UoaW5kZXgsIE5vTG9jayk7CisJCUV4ZWNEcm9wU2luZ2xlVHVwbGVUYWJsZVNsb3QoZXhp c3Rpbmdfc2xvdCk7CisKKwkJLyogZXhpdCBlYXJsaWVyICovCisJCWlmICghYWxsX25vdF9udWxs KQorCQl7CisJCQlGcmVlRXhlY3V0b3JTdGF0ZShlc3RhdGUpOworCQkJcmV0dXJuIGZhbHNlOwor CQl9CisJfQorCUZyZWVFeGVjdXRvclN0YXRlKGVzdGF0ZSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30K ZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2V4ZWN1dG9yL2V4ZWN1dG9yLmggYi9zcmMvaW5jbHVk ZS9leGVjdXRvci9leGVjdXRvci5oCmluZGV4IDU5MjlhYWJjMzUzLi43ZjI0Y2FlZWFmYiAxMDA2 NDQKLS0tIGEvc3JjL2luY2x1ZGUvZXhlY3V0b3IvZXhlY3V0b3IuaAorKysgYi9zcmMvaW5jbHVk ZS9leGVjdXRvci9leGVjdXRvci5oCkBAIC03NTYsNiArNzU2LDggQEAgZXh0ZXJuIHZvaWQgY2hl Y2tfZXhjbHVzaW9uX2NvbnN0cmFpbnQoUmVsYXRpb24gaGVhcCwgUmVsYXRpb24gaW5kZXgsCiAJ CQkJCQkJCQkgICBjb25zdCBEYXR1bSAqdmFsdWVzLCBjb25zdCBib29sICppc251bGwsCiAJCQkJ CQkJCQkgICBFU3RhdGUgKmVzdGF0ZSwgYm9vbCBuZXdJbmRleCk7CiAKK2V4dGVybiBib29sIGlu ZGV4X2NoZWNrX25vdG51bGwoUmVsYXRpb24gcmVsYXRpb24sIExpc3QgKm5vdG51bGxfYXR0bnVt cyk7CisKIC8qCiAgKiBwcm90b3R5cGVzIGZyb20gZnVuY3Rpb25zIGluIGV4ZWNSZXBsaWNhdGlv bi5jCiAgKi8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9pbmRleHNj YW4tY2hlY2stbm90bnVsbC5vdXQgYi9zcmMvdGVzdC9pc29sYXRpb24vZXhwZWN0ZWQvaW5kZXhz Y2FuLWNoZWNrLW5vdG51bGwub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwLi5jNmE2NTJlMjUxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9l eHBlY3RlZC9pbmRleHNjYW4tY2hlY2stbm90bnVsbC5vdXQKQEAgLTAsMCArMSw5NyBAQAorUGFy c2VkIHRlc3Qgc3BlYyB3aXRoIDIgc2Vzc2lvbnMKKworc3RhcnRpbmcgcGVybXV0YXRpb246IHMx X2IxIHMyX2IxIHMxX2QxIHMyX2ExIHMxX2MxIHMyX2MxIHMxX3ExCitzdGVwIHMxX2IxOiBCRUdJ TiBJU09MQVRJT04gTEVWRUwgUkVQRUFUQUJMRSBSRUFEOworc3RlcCBzMl9iMTogQkVHSU4gSVNP TEFUSU9OIExFVkVMIFJFUEVBVEFCTEUgUkVBRDsKK3N0ZXAgczFfZDE6IERFTEVURSBGUk9NIHQ7 CitzdGVwIHMyX2ExOiBBTFRFUiBUQUJMRSB0IEFERCBDT05TVFJBSU5UIHQxX25uIE5PVCBOVUxM IGE7IDx3YWl0aW5nIC4uLj4KK3N0ZXAgczFfYzE6IENPTU1JVDsKK3N0ZXAgczJfYTE6IDwuLi4g Y29tcGxldGVkPgorc3RlcCBzMl9jMTogQ09NTUlUOworc3RlcCBzMV9xMTogU0VMRUNUIGNvbm5h bWUsIGNvbnJlbGlkOjpyZWdjbGFzcywgY29udHlwZSwgY29udmFsaWRhdGVkCisgICAgICAgICAg ICAgIEZST00gcGdfY29uc3RyYWludCBXSEVSRSBjb25uYW1lID0gJ3QxX25uJzsKKworY29ubmFt ZXxjb25yZWxpZHxjb250eXBlfGNvbnZhbGlkYXRlZAorLS0tLS0tLSstLS0tLS0tLSstLS0tLS0t Ky0tLS0tLS0tLS0tLQordDFfbm4gIHx0ICAgICAgIHxuICAgICAgfHQgICAgICAgICAgIAorKDEg cm93KQorCisKK3N0YXJ0aW5nIHBlcm11dGF0aW9uOiBzMV9iMiBzMl9iMSBzMV9kMSBzMl9hMSBz MV9jMSBzMl9jMSBzMV9xMQorc3RlcCBzMV9iMjogQkVHSU47CitzdGVwIHMyX2IxOiBCRUdJTiBJ U09MQVRJT04gTEVWRUwgUkVQRUFUQUJMRSBSRUFEOworc3RlcCBzMV9kMTogREVMRVRFIEZST00g dDsKK3N0ZXAgczJfYTE6IEFMVEVSIFRBQkxFIHQgQUREIENPTlNUUkFJTlQgdDFfbm4gTk9UIE5V TEwgYTsgPHdhaXRpbmcgLi4uPgorc3RlcCBzMV9jMTogQ09NTUlUOworc3RlcCBzMl9hMTogPC4u LiBjb21wbGV0ZWQ+CitzdGVwIHMyX2MxOiBDT01NSVQ7CitzdGVwIHMxX3ExOiBTRUxFQ1QgY29u bmFtZSwgY29ucmVsaWQ6OnJlZ2NsYXNzLCBjb250eXBlLCBjb252YWxpZGF0ZWQKKyAgICAgICAg ICAgICAgRlJPTSBwZ19jb25zdHJhaW50IFdIRVJFIGNvbm5hbWUgPSAndDFfbm4nOworCitjb25u YW1lfGNvbnJlbGlkfGNvbnR5cGV8Y29udmFsaWRhdGVkCistLS0tLS0tKy0tLS0tLS0tKy0tLS0t LS0rLS0tLS0tLS0tLS0tCit0MV9ubiAgfHQgICAgICAgfG4gICAgICB8dCAgICAgICAgICAgCiso MSByb3cpCisKKworc3RhcnRpbmcgcGVybXV0YXRpb246IHMxX2IxIHMyX2IyIHMxX2QxIHMyX2Ex IHMxX2MxIHMyX2MxIHMxX3ExCitzdGVwIHMxX2IxOiBCRUdJTiBJU09MQVRJT04gTEVWRUwgUkVQ RUFUQUJMRSBSRUFEOworc3RlcCBzMl9iMjogQkVHSU47CitzdGVwIHMxX2QxOiBERUxFVEUgRlJP TSB0Oworc3RlcCBzMl9hMTogQUxURVIgVEFCTEUgdCBBREQgQ09OU1RSQUlOVCB0MV9ubiBOT1Qg TlVMTCBhOyA8d2FpdGluZyAuLi4+CitzdGVwIHMxX2MxOiBDT01NSVQ7CitzdGVwIHMyX2ExOiA8 Li4uIGNvbXBsZXRlZD4KK3N0ZXAgczJfYzE6IENPTU1JVDsKK3N0ZXAgczFfcTE6IFNFTEVDVCBj b25uYW1lLCBjb25yZWxpZDo6cmVnY2xhc3MsIGNvbnR5cGUsIGNvbnZhbGlkYXRlZAorICAgICAg ICAgICAgICBGUk9NIHBnX2NvbnN0cmFpbnQgV0hFUkUgY29ubmFtZSA9ICd0MV9ubic7CisKK2Nv bm5hbWV8Y29ucmVsaWR8Y29udHlwZXxjb252YWxpZGF0ZWQKKy0tLS0tLS0rLS0tLS0tLS0rLS0t LS0tLSstLS0tLS0tLS0tLS0KK3QxX25uICB8dCAgICAgICB8biAgICAgIHx0ICAgICAgICAgICAK KygxIHJvdykKKworCitzdGFydGluZyBwZXJtdXRhdGlvbjogczFfYjEgczJfYjEgczJfYTEgczFf cjEgczJfcjEKK3N0ZXAgczFfYjE6IEJFR0lOIElTT0xBVElPTiBMRVZFTCBSRVBFQVRBQkxFIFJF QUQ7CitzdGVwIHMyX2IxOiBCRUdJTiBJU09MQVRJT04gTEVWRUwgUkVQRUFUQUJMRSBSRUFEOwor c3RlcCBzMl9hMTogQUxURVIgVEFCTEUgdCBBREQgQ09OU1RSQUlOVCB0MV9ubiBOT1QgTlVMTCBh OworRVJST1I6ICBjb2x1bW4gImEiIG9mIHJlbGF0aW9uICJ0IiBjb250YWlucyBudWxsIHZhbHVl cworc3RlcCBzMV9yMTogUk9MTEJBQ0s7CitzdGVwIHMyX3IxOiBST0xMQkFDSzsKKworc3RhcnRp bmcgcGVybXV0YXRpb246IHMxX2IxIHMyX2IyIHMyX2QxIHMxX2QxIHMyX3IxIHMxX2ExIHMxX3Ex IHMxX3IxCitzdGVwIHMxX2IxOiBCRUdJTiBJU09MQVRJT04gTEVWRUwgUkVQRUFUQUJMRSBSRUFE Oworc3RlcCBzMl9iMjogQkVHSU47CitzdGVwIHMyX2QxOiBEUk9QIElOREVYIHRfYWJfaWR4Owor c3RlcCBzMV9kMTogREVMRVRFIEZST00gdDsgPHdhaXRpbmcgLi4uPgorc3RlcCBzMl9yMTogUk9M TEJBQ0s7CitzdGVwIHMxX2QxOiA8Li4uIGNvbXBsZXRlZD4KK3N0ZXAgczFfYTE6IEFMVEVSIFRB QkxFIHQgQUREIENPTlNUUkFJTlQgdDFfbm4gTk9UIE5VTEwgYTsKK3N0ZXAgczFfcTE6IFNFTEVD VCBjb25uYW1lLCBjb25yZWxpZDo6cmVnY2xhc3MsIGNvbnR5cGUsIGNvbnZhbGlkYXRlZAorICAg ICAgICAgICAgICBGUk9NIHBnX2NvbnN0cmFpbnQgV0hFUkUgY29ubmFtZSA9ICd0MV9ubic7CisK K2Nvbm5hbWV8Y29ucmVsaWR8Y29udHlwZXxjb252YWxpZGF0ZWQKKy0tLS0tLS0rLS0tLS0tLS0r LS0tLS0tLSstLS0tLS0tLS0tLS0KK3QxX25uICB8dCAgICAgICB8biAgICAgIHx0ICAgICAgICAg ICAKKygxIHJvdykKKworc3RlcCBzMV9yMTogUk9MTEJBQ0s7CisKK3N0YXJ0aW5nIHBlcm11dGF0 aW9uOiBzMV9iMiBzMl9iMSBzMV9kMSBzMl9kMSBzMV9zMCBzMV9hMSBzMV9jMSBzMl9jMSBzMV9x MQorc3RlcCBzMV9iMjogQkVHSU47CitzdGVwIHMyX2IxOiBCRUdJTiBJU09MQVRJT04gTEVWRUwg UkVQRUFUQUJMRSBSRUFEOworc3RlcCBzMV9kMTogREVMRVRFIEZST00gdDsKK3N0ZXAgczJfZDE6 IERST1AgSU5ERVggdF9hYl9pZHg7IDx3YWl0aW5nIC4uLj4KK3N0ZXAgczFfczA6IFNBVkVQT0lO VCBzMDsKK3N0ZXAgczFfYTE6IEFMVEVSIFRBQkxFIHQgQUREIENPTlNUUkFJTlQgdDFfbm4gTk9U IE5VTEwgYTsKK3N0ZXAgczFfYzE6IENPTU1JVDsKK3N0ZXAgczJfZDE6IDwuLi4gY29tcGxldGVk Pgorc3RlcCBzMl9jMTogQ09NTUlUOworc3RlcCBzMV9xMTogU0VMRUNUIGNvbm5hbWUsIGNvbnJl bGlkOjpyZWdjbGFzcywgY29udHlwZSwgY29udmFsaWRhdGVkCisgICAgICAgICAgICAgIEZST00g cGdfY29uc3RyYWludCBXSEVSRSBjb25uYW1lID0gJ3QxX25uJzsKKworY29ubmFtZXxjb25yZWxp ZHxjb250eXBlfGNvbnZhbGlkYXRlZAorLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0t LS0tLQordDFfbm4gIHx0ICAgICAgIHxuICAgICAgfHQgICAgICAgICAgIAorKDEgcm93KQorCmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9pc29sYXRpb24vaXNvbGF0aW9uX3NjaGVkdWxlIGIvc3JjL3Rl c3QvaXNvbGF0aW9uL2lzb2xhdGlvbl9zY2hlZHVsZQppbmRleCAwMWZmMWM2NTg2Zi4uN2NlNmJi Y2FmODkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2lzb2xhdGlvbi9pc29sYXRpb25fc2NoZWR1bGUK KysrIGIvc3JjL3Rlc3QvaXNvbGF0aW9uL2lzb2xhdGlvbl9zY2hlZHVsZQpAQCAtNTgsNiArNTgs NyBAQCB0ZXN0OiBtZXJnZS1kZWxldGUKIHRlc3Q6IG1lcmdlLXVwZGF0ZQogdGVzdDogbWVyZ2Ut bWF0Y2gtcmVjaGVjawogdGVzdDogbWVyZ2Utam9pbgordGVzdDogaW5kZXhzY2FuLWNoZWNrLW5v dG51bGwKIHRlc3Q6IGRlbGV0ZS1hYm9ydC1zYXZlcHQKIHRlc3Q6IGRlbGV0ZS1hYm9ydC1zYXZl cHQtMgogdGVzdDogYWJvcnRlZC1rZXlyZXZva2UKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2lzb2xh dGlvbi9zcGVjcy9pbmRleHNjYW4tY2hlY2stbm90bnVsbC5zcGVjIGIvc3JjL3Rlc3QvaXNvbGF0 aW9uL3NwZWNzL2luZGV4c2Nhbi1jaGVjay1ub3RudWxsLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMDAuLjIyYWViMWE1ZDZlCi0tLSAvZGV2L251bGwKKysrIGIvc3Jj L3Rlc3QvaXNvbGF0aW9uL3NwZWNzL2luZGV4c2Nhbi1jaGVjay1ub3RudWxsLnNwZWMKQEAgLTAs MCArMSw0NSBAQAorCisjCisjIHVzaW5nIGluZGV4c2NhbiB0byBjaGVjayBhIGNvbHVtbiBub3Qt bnVsbCBjb25zdHJhaW50CisjIGlzIHNhdGlzZmllZCBvciBub3QuCisjCisKK3NldHVwCit7Cisg IENSRUFURSBUQUJMRSB0IChhIGludCwgYiBpbnQpOworICBDUkVBVEUgSU5ERVggdF9hYl9pZHgg b24gdChhLCBiKTsKKyAgSU5TRVJUIElOVE8gdCBWQUxVRVMgKG51bGwsIDEpOworICBJTlNFUlQg SU5UTyB0IFNFTEVDVCB4LCB4ICogMTAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwzKSBnKHgpOwor fQorCit0ZWFyZG93bgoreworICBEUk9QIFRBQkxFIHQ7Cit9CisKK3Nlc3Npb24gczEKK3N0ZXAg czFfYjEgIHsgQkVHSU4gSVNPTEFUSU9OIExFVkVMIFJFUEVBVEFCTEUgUkVBRDsgfQorc3RlcCBz MV9iMiAgeyBCRUdJTjsgfQorc3RlcCBzMV9kMSAgeyBERUxFVEUgRlJPTSB0O30KK3N0ZXAgczFf czAgIHsgU0FWRVBPSU5UIHMwO30KK3N0ZXAgczFfYTEgIHsgQUxURVIgVEFCTEUgdCBBREQgQ09O U1RSQUlOVCB0MV9ubiBOT1QgTlVMTCBhO30KK3N0ZXAgczFfcTEgIHsgU0VMRUNUIGNvbm5hbWUs IGNvbnJlbGlkOjpyZWdjbGFzcywgY29udHlwZSwgY29udmFsaWRhdGVkCisgICAgICAgICAgICAg IEZST00gcGdfY29uc3RyYWludCBXSEVSRSBjb25uYW1lID0gJ3QxX25uJzsKKyAgICAgICAgICAg IH0KK3N0ZXAgczFfcjEgIHsgUk9MTEJBQ0s7IH0KK3N0ZXAgczFfYzEgIHsgQ09NTUlUOyB9CisK K3Nlc3Npb24gczIKK3N0ZXAgczJfYjEgIHsgQkVHSU4gSVNPTEFUSU9OIExFVkVMIFJFUEVBVEFC TEUgUkVBRDsgfQorc3RlcCBzMl9iMiAgeyBCRUdJTjsgfQorc3RlcCBzMl9hMSAgeyBBTFRFUiBU QUJMRSB0IEFERCBDT05TVFJBSU5UIHQxX25uIE5PVCBOVUxMIGE7fQorc3RlcCBzMl9kMSAgeyBE Uk9QIElOREVYIHRfYWJfaWR4O30KK3N0ZXAgczJfcjEgIHsgUk9MTEJBQ0s7IH0KK3N0ZXAgczJf YzEgIHsgQ09NTUlUOyB9CisKK3Blcm11dGF0aW9uIHMxX2IxIHMyX2IxIHMxX2QxIHMyX2ExIHMx X2MxIHMyX2MxIHMxX3ExCitwZXJtdXRhdGlvbiBzMV9iMiBzMl9iMSBzMV9kMSBzMl9hMSBzMV9j MSBzMl9jMSBzMV9xMQorcGVybXV0YXRpb24gczFfYjEgczJfYjIgczFfZDEgczJfYTEgczFfYzEg czJfYzEgczFfcTEKK3Blcm11dGF0aW9uIHMxX2IxIHMyX2IxIHMyX2ExIHMxX3IxIHMyX3IxCitw ZXJtdXRhdGlvbiBzMV9iMSBzMl9iMiBzMl9kMSBzMV9kMSBzMl9yMSBzMV9hMSBzMV9xMSBzMV9y MQorcGVybXV0YXRpb24gczFfYjIgczJfYjEgczFfZDEgczJfZDEgczFfczAgczFfYTEgczFfYzEg czJfYzEgczFfcTEKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9taXNjL21lc29u LmJ1aWxkIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21pc2MvbWVzb24uYnVpbGQKaW5kZXggNmU4 ZGIxNjIxYTcuLjU2ZmFmMzU5YjI5IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3Rf bWlzYy9tZXNvbi5idWlsZAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy9tZXNvbi5i dWlsZApAQCAtMTksNiArMTksNyBAQCB0ZXN0cyArPSB7CiAgICAgICAndC8wMDhfcmVwbHNsb3Rf c2luZ2xlX3VzZXIucGwnLAogICAgICAgJ3QvMDA5X2xvZ190ZW1wX2ZpbGVzLnBsJywKICAgICAg ICd0LzAxMF9pbmRleF9jb25jdXJyZW50bHlfdXBzZXJ0LnBsJywKKyAgICAgICd0LzAxMV9pbmRl eHNjYW5fdmFsaWRhdGVfbm90bnVsbC5wbCcsCiAgICAgXSwKICAgICAjIFRoZSBpbmplY3Rpb24g cG9pbnRzIGFyZSBjbHVzdGVyLXdpZGUsIHNvIGRpc2FibGUgaW5zdGFsbGNoZWNrCiAgICAgJ3J1 bm5pbmdjaGVjayc6IGZhbHNlLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X21p c2MvdC8wMTFfaW5kZXhzY2FuX3ZhbGlkYXRlX25vdG51bGwucGwgYi9zcmMvdGVzdC9tb2R1bGVz L3Rlc3RfbWlzYy90LzAxMV9pbmRleHNjYW5fdmFsaWRhdGVfbm90bnVsbC5wbApuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMzhmY2M4NWRmNTgKLS0tIC9kZXYvbnVsbAor KysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy90LzAxMV9pbmRleHNjYW5fdmFsaWRhdGVf bm90bnVsbC5wbApAQCAtMCwwICsxLDE0NiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMjYsIFBvc3Rn cmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCisKKyMgVmVyaWZ5IHRoYXQgaW5kZXhzY2Fu IG1lY2hhbmlzbSBjYW4gc3BlZWR1cCBBTFRFUiBUQUJMRSBBREQgTk9UIE5VTEwKKwordXNlIHN0 cmljdDsKK3VzZSB3YXJuaW5ncyBGQVRBTCA9PiAnYWxsJzsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0 OjpDbHVzdGVyOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOwordXNlIFRlc3Q6Ok1vcmU7 CisKKyMgSW5pdGlhbGl6ZSBhIHRlc3QgY2x1c3RlcgorbXkgJG5vZGUgPSBQb3N0Z3JlU1FMOjpU ZXN0OjpDbHVzdGVyLT5uZXcoJ3ByaW1hcnknKTsKKyRub2RlLT5pbml0KCk7CisjIFR1cm4gbWVz c2FnZSBsZXZlbCB1cCB0byBERUJVRzEgc28gdGhhdCB3ZSBnZXQgdGhlIG1lc3NhZ2VzIHdlIHdh bnQgdG8gc2VlCiskbm9kZS0+YXBwZW5kX2NvbmYoJ3Bvc3RncmVzcWwuY29uZicsICdjbGllbnRf bWluX21lc3NhZ2VzID0gREVCVUcxJyk7Ciskbm9kZS0+c3RhcnQ7CisKKyMgUnVuIGEgU1FMIGNv bW1hbmQgYW5kIHJldHVybiBwc3FsJ3Mgc3RkZXJyIChpbmNsdWRpbmcgZGVidWcgbWVzc2FnZXMp CitzdWIgcnVuX3NxbF9jb21tYW5kCit7CisJbXkgJHNxbCA9IHNoaWZ0OworCW15ICRzdGRlcnI7 CisKKwkkbm9kZS0+cHNxbCgKKwkJJ3Bvc3RncmVzJywKKwkJJHNxbCwKKwkJc3RkZXJyID0+IFwk c3RkZXJyLAorCQlvbl9lcnJvcl9kaWUgPT4gMSwKKwkJb25fZXJyb3Jfc3RvcCA9PiAxKTsKKwly ZXR1cm4gJHN0ZGVycjsKK30KKworIyBDaGVjayB3aGV0aGVyIHJlc3VsdCBvZiBydW5fc3FsX2Nv bW1hbmQgc2hvd3MgdGhhdCB3ZSBkaWQgYSB2ZXJpZnkgcGFzcworc3ViIGlzX3RhYmxlX3Zlcmlm aWVkCit7CisJbXkgJG91dHB1dCA9IHNoaWZ0OworCXJldHVybiBpbmRleCgkb3V0cHV0LCAnREVC VUc6ICB2ZXJpZnlpbmcgdGFibGUnKSAhPSAtMTsKK30KKworIyBDaGVjayB3aGV0aGVyIHJlc3Vs dCBvZiBydW5fc3FsX2NvbW1hbmQgc2hvd3MgdGhhdCB3ZSBkaWQgYSB2ZXJpZnkgcGFzcworc3Vi IGlzX2luZGV4c2Nhbl92ZXJpdGlmeV9ub3RudWxsCit7CisJbXkgJG91dHB1dCA9IHNoaWZ0Owor CXJldHVybiBpbmRleCgkb3V0cHV0LCAnREVCVUc6ICBhbGwgbmV3IG5vdC1udWxsIGNvbnN0cmFp bnRzIG9uIHJlbGF0aW9uJykgIT0gLTE7Cit9CisKK215ICRvdXRwdXQ7CisKK25vdGUgInRlc3Qg QUxURVIgVEFCTEUgU0VUIE5PVCBOVUxMIHVzaW5nIGluZGV4c2NhbiB3aXRoIHBhcnRpdGlvbmVk IHRhYmxlIjsKKworcnVuX3NxbF9jb21tYW5kKAorICAgICdDUkVBVEUgVEFCTEUgdHAgKGEgaW50 LCBiIGludCwgYyBpbnQsIGQgaW50ICkgUEFSVElUSU9OIEJZIHJhbmdlKGEpOworICAgICBDUkVB VEUgVEFCTEUgdHBwMSBwYXJ0aXRpb24gb2YgdHAgZm9yIHZhbHVlcyBGUk9NICggMSApIHRvICgx MCk7CisgICAgIENSRUFURSBUQUJMRSB0cHAyIHBhcnRpdGlvbiBvZiB0cCBmb3IgdmFsdWVzIEZS T00gKCAxMCApIHRvICgyMSk7CisgICAgIElOU0VSVCBJTlRPIHRwIFNFTEVDVCBnLCBnICsgMTAs IGcgKyAxNSwgZyArIHJhbmRvbShtaW49PjE6OmludCwgbWF4PT4xMDo6aW50KSBGUk9NIGdlbmVy YXRlX3NlcmllcygxLDE5KSBnOworICAgICBDUkVBVEUgSU5ERVggT04gdHAoYik7ICcpOworCisk b3V0cHV0ID0gcnVuX3NxbF9jb21tYW5kKCdBTFRFUiBUQUJMRSB0cCBBTFRFUiBDT0xVTU4gYiBT RVQgTk9UIE5VTEw7Jyk7Citvayhpc19pbmRleHNjYW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0 KSwKKwknY29sdW1uIGIgd2lsbCB1c2UgaW5kZXhzY2FuIHRvIHZlcmlmeSBub3QtbnVsbCBzdGF0 dXMsIG5vIG5lZWQgc2NhbiB0YWJsZScpOworb2soICRvdXRwdXQgPX4KKwkgIG0vYWxsIG5ldyBu b3QtbnVsbCBjb25zdHJhaW50cyBvbiByZWxhdGlvbiAidHBwMSIgaGF2ZSBiZWVuIHZhbGlkYXRl ZCBieSB1c2luZyBpbmRleCBzY2FuLywKKwknYWxsIG5ld2x5IGFkZGVkIGNvbnN0cmFpbnRzIHBy b3ZlZCBieSBpbmRleHNjYW4nKTsKKworcnVuX3NxbF9jb21tYW5kKAorCSdBTFRFUiBUQUJMRSB0 cCBBTFRFUiBDT0xVTU4gYiBEUk9QIE5PVCBOVUxMOycpOworCisjIFVzaW5nIGluZGV4IHNjYW4g b24gcGFydGl0aW9ucyB0byBmYXN0IHZlcnRpZmluZyBub3QtbnVsbCBpcyBvaworJG91dHB1dCA9 IHJ1bl9zcWxfY29tbWFuZCgnQUxURVIgVEFCTEUgdHBwMSBBTFRFUiBDT0xVTU4gYiBTRVQgTk9U IE5VTEw7Jyk7Citvayhpc19pbmRleHNjYW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwgJ3Vz ZSBpbmRleHNjYW4gdG8gdmFsaWRhdGUgY29sdW1uIGIgbm90LW51bGwsIG5vIHRhYmxlIHNjYW4g aXMgcmVxdWlyZWQnKTsKK29rKCFpc190YWJsZV92ZXJpZmllZCgkb3V0cHV0KSwgJ25vIHRhYmxl IHNjYW4gZm9yIHBwMScpOworb2soICRvdXRwdXQgPX4KKwkgIG0vYWxsIG5ldyBub3QtbnVsbCBj b25zdHJhaW50cyBvbiByZWxhdGlvbiAidHBwMSIgaGF2ZSBiZWVuIHZhbGlkYXRlZCBieSB1c2lu ZyBpbmRleCBzY2FuLywKKwknYWxsIG5ld2x5IGFkZGVkIGNvbnN0cmFpbnRzIHByb3ZlZCBieSBp bmRleHNjYW4nKTsKKworcnVuX3NxbF9jb21tYW5kKAorCSdBTFRFUiBUQUJMRSB0cCBBTFRFUiBD T0xVTU4gYiBEUk9QIE5PVCBOVUxMOycpOworCisjIEluZGV4IHNjYW5zIGNhbm5vdCBiZSB1c2Vk IHRvIHZlcmlmeSBOT1QgTlVMTCBjb25zdHJhaW50cyB3aGVuIGEgdGFibGUgcmV3cml0ZSB3aWxs IGhhcHBlbgorJG91dHB1dCA9IHJ1bl9zcWxfY29tbWFuZCgKKwknQUxURVIgVEFCTEUgdHAgQUxU RVIgQ09MVU1OIGIgU0VUIE5PVCBOVUxMLCBBTFRFUiBDT0xVTU4gYiBTRVQgREFUQSBUWVBFIEJJ R0lOVDsnCispOworb2soIWlzX3RhYmxlX3ZlcmlmaWVkKCRvdXRwdXQpLCAnbm8gdGFibGUgc2Nh biBmb3IgdHAnKTsKK29rKCFpc19pbmRleHNjYW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwg J2Nhbm5vdCB1c2UgaW5kZXhzY2FuIHRvIHZlcmlmeSBub3QtbnVsbCBjb25zdHJhaW50cycpOwor CisjIHRlc3QgdXNpbmcgaW5kZXhzY2FuIHdpdGggbXVsdGlwbGUgbm90LW51bGwgY29uc3RyYWlu dHMKK3J1bl9zcWxfY29tbWFuZCgKKyAgICAnQUxURVIgVEFCTEUgdHAgQUxURVIgQ09MVU1OIGIg RFJPUCBOT1QgTlVMTDsKKwkgQ1JFQVRFIElOREVYIE9OIHRwKGMpOworCSBDUkVBVEUgSU5ERVgg T04gdHAoZCk7ICcpOworCisjIFVzaW5nIHRoZSBpbmRleCBzY2FuIG1lY2hhbmlzbSB0byB2ZXJp ZnkgTk9UIE5VTEwgY29uc3RyYWludHMgbXVzdCBhcHBseSB0byBhbGwgY29sdW1ucworJG91dHB1 dCA9IHJ1bl9zcWxfY29tbWFuZCgKKwknQUxURVIgVEFCTEUgdHAgQUxURVIgQ09MVU1OIGEgU0VU IE5PVCBOVUxMLCBBREQgQ09OU1RSQUlOVCBjX25uIE5PVCBOVUxMIGMnKTsKK29rKGlzX3RhYmxl X3ZlcmlmaWVkKCRvdXRwdXQpLCAndGFibGUgc2NhbiBmb3IgdHAnKTsKK29rKCFpc19pbmRleHNj YW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwgJ2Nhbm5vdCB1c2UgaW5kZXhzY2FuIHRvIHZl cmlmeSBub3QtbnVsbCBjb25zdHJhaW50cyBvbiB0YWJsZSB0cCcpOworCisjIEFsbCBjb2x1bW5z IGhhdmUgaW5kZXggb24gaXQsIHVzaW5nIGluZGV4c2NhbiB0byB2ZXJpZnkgbXVsdGlwbGUgbm90 LW51bGwKKyMgY29uc3RyYWludHMgd29ya3MganVzdCBmaW5lCiskb3V0cHV0ID0gcnVuX3NxbF9j b21tYW5kKAorCSdBTFRFUiBUQUJMRSB0cCBBTFRFUiBDT0xVTU4gZCBTRVQgTk9UIE5VTEwsIEFE RCBDT05TVFJBSU5UIGNfbm4gTk9UIE5VTEwgYywgQUxURVIgQ09MVU1OIGIgU0VUIE5PVCBOVUxM OycpOworb2soIWlzX3RhYmxlX3ZlcmlmaWVkKCRvdXRwdXQpLCAnbm8gdGFibGUgc2NhbiBmb3Ig dHAnKTsKK29rKGlzX2luZGV4c2Nhbl92ZXJpdGlmeV9ub3RudWxsKCRvdXRwdXQpLAorCSd1c2lu ZyBpbmRleHNjYW4gdG8gdmVyaWZ5IG5vdC1udWxsIGNvbnN0cmFpbnRzIG9uIGNvbHVtbiBiLCBj LCBkLCBubyBuZWVkIHRhYmxlIHNjYW4nKTsKKworIyB0ZXN0IHdpdGggbm9uLXBhcnRpdGlvbmVk IHRhYmxlIGFuZCBvdGhlciBub24tQnRyZWUgaW5kZXguCitydW5fc3FsX2NvbW1hbmQoCisgICAg J0NSRUFURSBUQUJMRSB0MShmMSBJTlQsIGYyIGludCwgZjMgaW50LGY0IGludCwgZjUgaW50KTsK KyAgICAgSU5TRVJUIElOVE8gdDEgc2VsZWN0IGcsIGcrMSwgZysyLCBnKzMsIGcrNCBGUk9NIGdl bmVyYXRlX3NlcmllcygxLCAxMDApIGc7CisgICAgIENSRUFURSBJTkRFWCB0MV9mMV9mMl9pZHgg T04gdDEoZjEsZjIpOworICAgICBDUkVBVEUgVU5JUVVFIElOREVYIHQxX2YzaWR4IE9OIHQxKGYz KTsKKyAgICAgQ1JFQVRFIElOREVYIHQxX2YzZjRpZHggT04gdDEoZjMpIGluY2x1ZGUoZjQpOwor ICAgICBDUkVBVEUgSU5ERVggaGFzaF9mNV9pZHggT04gdDEgVVNJTkcgaGFzaCAoZjUgaW50NF9v cHMpOyAnKTsKKworIyBBTFRFUiBUQUJMRSBWQUxJREFURSBDT05TVFJBSU5UIGNhbm5vdCB1c2Ug aW5kZXhzY2FuLCBiZWNhdXNlIGl0IG9ubHkgaG9sZCBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2sg bG9jay4KK3J1bl9zcWxfY29tbWFuZCgnQUxURVIgVEFCTEUgdDEgQUREIENPTlNUUkFJTlQgbm5f dDFfZjIgTk9UIE5VTEwgZjIgTk9UIFZBTElEOycpOworCiskb3V0cHV0ID0gcnVuX3NxbF9jb21t YW5kKAorCSdBTFRFUiBUQUJMRSB0MSBWQUxJREFURSBDT05TVFJBSU5UIG5uX3QxX2YyOycKKyk7 CitvayghaXNfaW5kZXhzY2FuX3Zlcml0aWZ5X25vdG51bGwoJG91dHB1dCksICdjYW5ub3QgdXNl IGluZGV4c2NhbiBmb3IgQUxURVIgVEFCTEUgVkFMSURBVEUgQ09OU1RSQUlOVCBjb21tYW5kJyk7 CitydW5fc3FsX2NvbW1hbmQoJ0FMVEVSIFRBQkxFIHQxIERST1AgQ09OU1RSQUlOVCBubl90MV9m MjsnKTsKKworcnVuX3NxbF9jb21tYW5kKCdBTFRFUiBUQUJMRSB0MSBBTFRFUiBDT0xVTU4gZjEg RFJPUCBOT1QgTlVMTDsnKTsKKworIyBjYW5ub3QgdXNlIGluZGV4c2NhbiBtZWNoYW5pc20gdG8g ZmFzdCBhZGQgbXVsdGlwbGUgbm90LW51bGwgY29uc3RyYWludHMKKyRvdXRwdXQgPSBydW5fc3Fs X2NvbW1hbmQoCisJJ0FMVEVSIFRBQkxFIHQxIEFMVEVSIENPTFVNTiBmMiBTRVQgTk9UIE5VTEws IEFMVEVSIENPTFVNTiBmMSBTRVQgTk9UIE5VTEw7JworKTsKK29rKCFpc19pbmRleHNjYW5fdmVy aXRpZnlfbm90bnVsbCgkb3V0cHV0KSwgJ2Nhbm5vdCB1c2UgaW5kZXhzY2FuIHRvIHZhbGlkYXRl IG11bHRpcGxlIG5vdC1udWxsIGNvbnN0cmFpbnRzIG9uIHQxJyk7CisKKyMgdXNpbmcgaW5kZXhz Y2FuIG1lY2hhbmlzbSB0byBmYXN0IGFkZCBhIG5vdC1udWxsIGNhbiBvbmx5IGFwcGx5IHRvIGtl eSBjb2x1bW5zLCBub3QgSU5DTFVERSBjb2x1bW4KKyRvdXRwdXQgPSBydW5fc3FsX2NvbW1hbmQo CisJJ0FMVEVSIFRBQkxFIHQxIEFERCBDT05TVFJBSU5UIG5uZjQgTk9UIE5VTEwgZjQ7JworKTsK K29rKCFpc19pbmRleHNjYW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwgJ2Nhbm5vdCB1c2Ug aW5kZXhzY2FuIHRvIHZhbGlkYXRlIG5vdC1udWxsIGNvbnN0cmFpbnQgb24gdDEnKTsKKworIyBp ZiBpbmRleCBpcyBub3QgYnRyZWUgaW5kZXggdGhlbiBjYW5ub3QgdXNlIGluZGV4c2NhbiBtZWNo YW5pc20gdG8gZmFzdCBhZGQgbm90LW51bGwgY29uc3RyYWludAorJG91dHB1dCA9IHJ1bl9zcWxf Y29tbWFuZCgKKwknQUxURVIgVEFCTEUgdDEgQUREIENPTlNUUkFJTlQgbm5fZjUgTk9UIE5VTEwg ZjU7JworKTsKK29rKCFpc19pbmRleHNjYW5fdmVyaXRpZnlfbm90bnVsbCgkb3V0cHV0KSwgJ2Nh bm5vdCB1c2UgaW5kZXhzY2FuIHRvIHZhbGlkYXRlIG5vdC1udWxsIGNvbnN0cmFpbnRzIG9uIHQx Jyk7CisKKyRub2RlLT5zdG9wKCdmYXN0Jyk7CisKK2RvbmVfdGVzdGluZygpOwotLSAKMi4zNC4x Cgo= --000000000000867dfe064879b349--