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 1u1pU8-008kxC-Vg for pgsql-hackers@arkaria.postgresql.org; Mon, 07 Apr 2025 16:38:09 +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 1u1pU7-0012wf-CC for pgsql-hackers@arkaria.postgresql.org; Mon, 07 Apr 2025 16:38:07 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1u1pU6-0012wX-LE for pgsql-hackers@lists.postgresql.org; Mon, 07 Apr 2025 16:38:07 +0000 Received: from mail-pj1-x102c.google.com ([2607:f8b0:4864:20::102c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1u1pU3-003VLF-2k for pgsql-hackers@lists.postgresql.org; Mon, 07 Apr 2025 16:38:06 +0000 Received: by mail-pj1-x102c.google.com with SMTP id 98e67ed59e1d1-301302a328bso4943745a91.2 for ; Mon, 07 Apr 2025 09:38:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1744043883; x=1744648683; 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=KGOjPb1/m7E9R6+PH+/cqdE/XXrrF6OrH4KFrhnnNoA=; b=LLhJVzooHK5X0VDnos5JEEST/oullt9oSfSq4B7pHtvVV+eBbhL8V5nDh3UM4fYg3G AqQpbbo7aOZXj+g/5pq1iVRv8GDySYH2K+qnXJUK9aeURReJ7lJ9Ox883OriqV3ScR3o 7a0scO6+PbjN2atnV12sz5CD6LLyWyZC/Iv+kXgi9f6A/9bC7+x3mjAAtOQsy48cRnUB EBkmPCqLd56ktl0z6nHCwEH9xW2JLh/IjDNHOLR8o9s0gLdQA/3jCHCgncP09Xh3QU03 7vAvJBDILcNU0Ls/qZJJm/319f9zU/qhMwm03BBe/my/OdRhOlf9Wb1jOcwJ7aljb//V x8+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744043883; x=1744648683; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=KGOjPb1/m7E9R6+PH+/cqdE/XXrrF6OrH4KFrhnnNoA=; b=MMsXAsGFNuOHKZk8jACz83opAlquYR33G3510e6TZv3860aLGMrpQHtdbxYG5asazL ilfCX1LUZCLDmZBkiP/idiNVgs7IkvFs98efmkgSr/xMGuEY54O/PQJNyQWb35mBSY5F x2VXFn2Zm/VA++yQRbQLU3EUp/Tkfm5Nm6LhwNhj+/1WFEn8uuRXyhkfkgdKWV2lrA82 oveuF4xgGb4qpO0R87Xl9sz9U6ztgTd2xmfNJuaVdUETCGrQvYMFHEJqXJyp8Xqg7L/W jUIoVohX3CdKNVJC7P/zqUJZo2vpwUZpTCtA1XwqOCVgiM4mNnMAajNhesAW197OQLuf YMQA== X-Forwarded-Encrypted: i=1; AJvYcCUBJRqNewgbk+mJD5+OYAoW644sLiQMDakMpprWkEFYv0X6xpztzM8BzBER6smJ3d43FxbBi1UfAo4bNoO8@lists.postgresql.org X-Gm-Message-State: AOJu0YwLxxadhyAKmW5/WBCyKZmZFhZhmxWCT9DI1oHl3mBhfsgtL99O xILc28L9nx0IOhxV5JHSQM2Se4LDIzUMr9K9N5QgrZVWLTkOuBv5dH5L6LJpEVW3KvOhH43ASJD q21TRJnhP+AyX07TrK8xZ78vSsQw= X-Gm-Gg: ASbGnctIEBb+LcjYsSjLJMvxHL0aLv+tWDHeU3wT631y6w42GOb30KK+17IREGnIvrh MvIkCAU6kabgYEtOo4UUH2cTqh/1k3NEpRhW7N4QovQsLka9QQs3/vpiVKXoJYcSr5taTMY+66K NI5dZ63yjTuNM7D2k4Oeilyrmqx/4= X-Google-Smtp-Source: AGHT+IGsQEhdlDBLyl9vpF5MiKYI3f3R0ZYj+1EtJbBbxid6KA1jGQi4O7sOYSI9K+PC3r0TmdLtmc5aZOBxY2tpZvs= X-Received: by 2002:a17:90b:3d46:b0:2fe:6942:3710 with SMTP id 98e67ed59e1d1-306a6120847mr16960776a91.3.1744043882593; Mon, 07 Apr 2025 09:38:02 -0700 (PDT) MIME-Version: 1.0 References: <568288111d505a81ebb2a89cea9eacb2@postgrespro.ru> In-Reply-To: From: Nazir Bilal Yavuz Date: Mon, 7 Apr 2025 19:37:50 +0300 X-Gm-Features: ATxdqUFI-wRj6PRtLs5doBTT3eZ7MczLUSklh2cKuPCVN8kLwOXrAqaVIqgIL6c Message-ID: Subject: Re: Add pg_buffercache_evict_all() and pg_buffercache_mark_dirty[_all]() functions To: Andres Freund Cc: Aidar Imamov , Joseph Koshakow , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="00000000000018a38d063232dc61" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000018a38d063232dc61 Content-Type: text/plain; charset="UTF-8" Hi, On Mon, 7 Apr 2025 at 16:38, Andres Freund wrote: > > Hi, > > On 2025-04-04 18:36:57 +0300, Nazir Bilal Yavuz wrote: > > v6 is attached. Additional changes prior to v5: > > > > * Tests are added. > > I don't think the mark-dirty stuff is quite ready to commit. Given that, could > you change the split of the patches so that the tests are for the evict > patches alone? I don't really see a need to add the tests separately from the > code introducing the relevant functionality. Done. > > * EvictRelUnpinnedBuffers() does not call EvictUnpinnedBuffer() now. I > > basically copied EvictUnpinnedBuffer() to the inside of > > EvictRelUnpinnedBuffers() with the needed updates. > > I think I'd instead introduce a EvictBufferInternal() that is used both by > EvictUnpinnedBuffer() and EvictRelUnpinnedBuffers(), that is expected to be > called with the buffer header lock held. Makes sense, done that way. I named it as 'EvictUnpinnedBufferInternal'. > > > > + relation_close(rel, AccessExclusiveLock); > > > > > > Hm. Why are we dropping the lock here early? It's probably ok, but it's not > > > clear to me why we should do so. > > > > We are dropping the lock after we processed the relation. I didn't > > understand what could be the problem here. Why do you think it is > > early? > > Most commonly we close relations without releasing the lock, instead relying > on the lock being released at the end of the transaction. I see. I was looking at pg_prewarm as an example and copied it from there. > > > I wonder if these functions ought to also return the number of buffers that > > > could not be evicted? > > > > I didn't add this as I thought this information could be gathered if wanted. > > How? A separate query will also return buffers that were since newly read in. Yes, correct. I missed that. > I think it'be better to just return all that information, given that we are > already dropping the function. Dropping objects in extension upgrades can be > painful for users, due to other objects potentially depending on the dropped > objects. So we shouldn't do that unnecessarily often. Done that way. pg_buffercache_evict_relation() and pg_buffercache_evict_all() return the total number of buffers processed. > > From 88624ea0f768ebf1a015cc0c06d2c72c822577a8 Mon Sep 17 00:00:00 2001 > > From: Nazir Bilal Yavuz > > Date: Fri, 4 Apr 2025 13:22:00 +0300 > > Subject: [PATCH v6 1/4] Return buffer flushed information in > > pg_buffercache_evict function > > > > pg_buffercache_evict() function shows buffer flushed information now. > > This feature will be used in the following commits. > > > > Author: Nazir Bilal Yavuz > > Suggested-by: Joseph Koshakow > > Reviewed-by: Aidar Imamov > > Reviewed-by: Andres Freund > > Discussion: https://postgr.es/m/CAN55FZ0h_YoSqqutxV6DES1RW8ig6wcA8CR9rJk358YRMxZFmw%40mail.gmail.com > > --- > > src/include/storage/bufmgr.h | 2 +- > > src/backend/storage/buffer/bufmgr.c | 11 +++++++++- > > src/test/modules/test_aio/test_aio.c | 4 ++-- > > doc/src/sgml/pgbuffercache.sgml | 15 ++++++++----- > > contrib/pg_buffercache/Makefile | 3 ++- > > contrib/pg_buffercache/meson.build | 1 + > > .../pg_buffercache--1.5--1.6.sql | 9 ++++++++ > > I think I'd squash this with the following changes, as it seems unnecessary to > increase the version by multiple steps in immediately successive commits. Done. > > +/* > > + * Try to evict all the shared buffers containing provided relation's pages. > > + * > > + * This function is intended for testing/development use only! > > + * > > + * We need this helper function because of the following reason. > > + * ReservePrivateRefCountEntry() needs to be called before acquiring the > > + * buffer header lock but ReservePrivateRefCountEntry() is static and it would > > + * be better to have it as static. Hence, it can't be called from outside of > > + * this file. This helper function is created to bypass that problem. > > > > + * Also, we should minimize the amount of code outside of storage/buffer that > > + * needs to know about BuferDescs etc., it is a layering violation to access > > + * that outside. > > + * > > FWIW, I think this explanation is kind of true, but the real reason is that > from a layering perspective this simply is bufmgr.c's responsibility, not > pg_buffercache's. I'd probably just drop these two paragraphs. Done. > > + if (!superuser()) > > + ereport(ERROR, > > + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), > > + errmsg("must be superuser to use %s()", > > + "pg_buffercache_evict_relation"))); > > FWIW, I'd upate the existing superuser check in the same file to use the same > string. And perhaps I'd just put the check into a small helper function that > is shared by pg_buffercache_evict() / pg_buffercache_evict() / > pg_buffercache_evict_all(). Done. I added the pg_buffercache_superuser_check() function. > > +/* > > + * Try to evict all shared buffers. > > + */ > > +Datum > > +pg_buffercache_evict_all(PG_FUNCTION_ARGS) > > +{ > > + Datum result; > > + TupleDesc tupledesc; > > + HeapTuple tuple; > > + Datum values[NUM_BUFFERCACHE_EVICT_ALL_ELEM]; > > + bool nulls[NUM_BUFFERCACHE_EVICT_ALL_ELEM] = {0}; > > + > > + int32 buffers_evicted = 0; > > + int32 buffers_flushed = 0; > > + bool flushed; > > + > > + if (get_call_result_type(fcinfo, NULL, &tupledesc) != TYPEFUNC_COMPOSITE) > > + elog(ERROR, "return type must be a row type"); > > + > > + if (!superuser()) > > + ereport(ERROR, > > + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), > > + errmsg("must be superuser to use %s()", > > + "pg_buffercache_evict_all"))); > > + > > + for (int buf = 1; buf <= NBuffers; buf++) > > + { > > + if (EvictUnpinnedBuffer(buf, &flushed)) > > + buffers_evicted++; > > + if (flushed) > > + buffers_flushed++; > > + } > > FWIW, I'd put this loop in bufmgr.c, in a similar helper function as for the > other cases. Done. I moved this loop to the EvictAllUnpinnedBuffers() function in bufmgr.c. > > --- a/contrib/pg_buffercache/sql/pg_buffercache.sql > > +++ b/contrib/pg_buffercache/sql/pg_buffercache.sql > > @@ -26,3 +26,54 @@ SET ROLE pg_monitor; > > SELECT count(*) > 0 FROM pg_buffercache; > > SELECT buffers_used + buffers_unused > 0 FROM pg_buffercache_summary(); > > SELECT count(*) > 0 FROM pg_buffercache_usage_counts(); > > +RESET role; > > + > > +------ > > +---- Test pg_buffercache_evict* and pg_buffercache_mark_dirty* functions > > +------ > > + > > +CREATE ROLE regress_buffercache_normal; > > +SET ROLE regress_buffercache_normal; > > + > > +-- These should fail because these are STRICT functions > > +SELECT * FROM pg_buffercache_evict(); > > +SELECT * FROM pg_buffercache_evict_relation(); > > +SELECT * FROM pg_buffercache_mark_dirty(); > > > +-- These should fail because they need to be called as SUPERUSER > > +SELECT * FROM pg_buffercache_evict(1); > > +SELECT * FROM pg_buffercache_evict_relation(1); > > +SELECT * FROM pg_buffercache_evict_all(); > > +SELECT * FROM pg_buffercache_mark_dirty(1); > > +SELECT * FROM pg_buffercache_mark_dirty_all(); > > + > > +RESET ROLE; > > +CREATE ROLE regress_buffercache_superuser SUPERUSER; > > +SET ROLE regress_buffercache_superuser; > > Not sure what we gain by creating this role? I missed that the role used for running the tests is already a superuser. Done. v7 is attached. I only attached pg_buffercache_evict* patch to run it on cfbot. -- Regards, Nazir Bilal Yavuz Microsoft --00000000000018a38d063232dc61 Content-Type: text/x-patch; charset="US-ASCII"; name="v7-0001-Add-pg_buffercache_evict_-relation-all-functions-.patch" Content-Disposition: attachment; filename="v7-0001-Add-pg_buffercache_evict_-relation-all-functions-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m97anr250 RnJvbSA5ZTE1ZjU0ZGFiNDdlOTNkZDYxOWE2MWI1YjNlZWYzODlmODE5YjM0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYXppciBCaWxhbCBZYXZ1eiA8YnlhdnV6ODFAZ21haWwuY29t PgpEYXRlOiBGcmksIDQgQXByIDIwMjUgMTM6MjI6MDAgKzAzMDAKU3ViamVjdDogW1BBVENIIHY3 XSBBZGQgcGdfYnVmZmVyY2FjaGVfZXZpY3RfW3JlbGF0aW9uIHwgYWxsXSgpIGZ1bmN0aW9ucyBm b3IKIHRlc3RpbmcKCnBnX2J1ZmZlcmNhY2hlX2V2aWN0KCkgZnVuY3Rpb24gc2hvd3MgYnVmZmVy IGZsdXNoZWQgaW5mb3JtYXRpb24gbm93LgpUaGlzIGZlYXR1cmUgd2lsbCBiZSB1c2VkIGluIHRo ZSBmb2xsb3dpbmcgZnVuY3Rpb25zLgoKcGdfYnVmZmVyY2FjaGVfZXZpY3RfcmVsYXRpb24oKTog RXZpY3RzIGFsbCBzaGFyZWQgYnVmZmVycyBpbiBhCnJlbGF0aW9uIGF0IG9uY2UuCnBnX2J1ZmZl cmNhY2hlX2V2aWN0X2FsbCgpOiBFdmljdHMgYWxsIHNoYXJlZCBidWZmZXJzIGF0IG9uY2UuCgpC b3RoIGZ1bmN0aW9ucyBwcm92aWRlIG1lY2hhbmlzbSB0byBldmljdCBtdWx0aXBsZSBzaGFyZWQg YnVmZmVycyBhdApvbmNlLiBUaGV5IGFyZSBkZXNpZ25lZCB0byBhZGRyZXNzIHRoZSBpbmVmZmlj aWVuY3kgb2YgcmVwZWF0ZWRseSBjYWxsaW5nCnBnX2J1ZmZlcmNhY2hlX2V2aWN0KCkgZm9yIGVh Y2ggaW5kaXZpZHVhbCBidWZmZXIsIHdoaWNoIGNhbiBiZQp0aW1lLWNvbnN1bWluZyB3aGVuIGRl YWxpbmcgd2l0aCBsYXJnZSBzaGFyZWQgYnVmZmVyIHBvb2xzLgooZS5nLiwgfjc5MG1zIHZzLiB+ MjcwbXMgZm9yIDE2R0Igb2Ygc2hhcmVkIGJ1ZmZlcnMpLgoKVGhlc2UgZnVuY3Rpb25zIGFyZSBp bnRlbmRlZCBmb3IgZGV2ZWxvcGVyIHRlc3RpbmcgYW5kIGRlYnVnZ2luZwpwdXJwb3NlcyBhbmQg YXJlIGF2YWlsYWJsZSB0byBzdXBlcnVzZXJzIG9ubHkuCgpUZXN0cyBmb3IgdGhpcyBmdW5jdGlv bnMgYXJlIGFkZGVkLiBBbHNvLCB0aGVyZSB3YXMgbm8gdGVzdCBmb3IKcGdfYnVmZmVyY2FjaGVf ZXZpY3QoKSwgdGVzdCBmb3IgdGhpcyBhZGRlZCB0b28uCgpBdXRob3I6IE5hemlyIEJpbGFsIFlh dnV6IDxieWF2dXo4MUBnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBBbmRyZXMgRnJldW5kIDxhbmRy ZXNAYW5hcmF6ZWwuZGU+ClJldmlld2VkLWJ5OiBBaWRhciBJbWFtb3YgPGEuaW1hbW92QHBvc3Rn cmVzcHJvLnJ1PgpSZXZpZXdlZC1ieTogSm9zZXBoIEtvc2hha293IDxrb3NoeTQ0QGdtYWlsLmNv bT4KRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS9DQU41NUZaMGhfWW9TcXF1dHhWNkRF UzFSVzhpZzZ3Y0E4Q1I5ckprMzU4WVJNeFpGbXclNDBtYWlsLmdtYWlsLmNvbQotLS0KIHNyYy9p bmNsdWRlL3N0b3JhZ2UvYnVmbWdyLmggICAgICAgICAgICAgICAgICB8ICAgNyArLQogc3JjL2Jh Y2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmbWdyLmMgICAgICAgICAgIHwgMTQ1ICsrKysrKysrKysr KysrKy0tLQogc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2Fpby90ZXN0X2Fpby5jICAgICAgICAgIHwg ICA0ICstCiBkb2Mvc3JjL3NnbWwvcGdidWZmZXJjYWNoZS5zZ21sICAgICAgICAgICAgICAgfCAg NzMgKysrKysrKystCiBjb250cmliL3BnX2J1ZmZlcmNhY2hlL01ha2VmaWxlICAgICAgICAgICAg ICAgfCAgIDMgKy0KIC4uLi9leHBlY3RlZC9wZ19idWZmZXJjYWNoZS5vdXQgICAgICAgICAgICAg ICB8ICA2MSArKysrKysrKwogY29udHJpYi9wZ19idWZmZXJjYWNoZS9tZXNvbi5idWlsZCAgICAg ICAgICAgIHwgICAxICsKIC4uLi9wZ19idWZmZXJjYWNoZS0tMS41LS0xLjYuc3FsICAgICAgICAg ICAgICB8ICAyNCArKysKIGNvbnRyaWIvcGdfYnVmZmVyY2FjaGUvcGdfYnVmZmVyY2FjaGUuY29u dHJvbCB8ICAgMiArLQogY29udHJpYi9wZ19idWZmZXJjYWNoZS9wZ19idWZmZXJjYWNoZV9wYWdl cy5jIHwgMTI2ICsrKysrKysrKysrKysrLQogY29udHJpYi9wZ19idWZmZXJjYWNoZS9zcWwvcGdf YnVmZmVyY2FjaGUuc3FsIHwgIDQxICsrKysrCiAxMSBmaWxlcyBjaGFuZ2VkLCA0NDkgaW5zZXJ0 aW9ucygrKSwgMzggZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgY29udHJpYi9wZ19i dWZmZXJjYWNoZS9wZ19idWZmZXJjYWNoZS0tMS41LS0xLjYuc3FsCgpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvc3RvcmFnZS9idWZtZ3IuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvYnVmbWdyLmgK aW5kZXggZjIxOTJjZWIyNzEuLjI5MTQwMjY0YzI0IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9z dG9yYWdlL2J1Zm1nci5oCisrKyBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvYnVmbWdyLmgKQEAgLTMw NCw3ICszMDQsMTIgQEAgZXh0ZXJuIHVpbnQzMiBHZXRBZGRpdGlvbmFsTG9jYWxQaW5MaW1pdCh2 b2lkKTsKIGV4dGVybiB2b2lkIExpbWl0QWRkaXRpb25hbFBpbnModWludDMyICphZGRpdGlvbmFs X3BpbnMpOwogZXh0ZXJuIHZvaWQgTGltaXRBZGRpdGlvbmFsTG9jYWxQaW5zKHVpbnQzMiAqYWRk aXRpb25hbF9waW5zKTsKIAotZXh0ZXJuIGJvb2wgRXZpY3RVbnBpbm5lZEJ1ZmZlcihCdWZmZXIg YnVmKTsKK2V4dGVybiBib29sIEV2aWN0VW5waW5uZWRCdWZmZXIoQnVmZmVyIGJ1ZiwgYm9vbCAq Zmx1c2hlZCk7CitleHRlcm4gdm9pZCBFdmljdEFsbFVucGlubmVkQnVmZmVycyhpbnQzMiAqYnVm ZmVyc19ldmljdGVkLAorCQkJCQkJCQkJaW50MzIgKmJ1ZmZlcnNfZmx1c2hlZCk7CitleHRlcm4g dm9pZCBFdmljdFJlbFVucGlubmVkQnVmZmVycyhSZWxhdGlvbiByZWwsIGludDMyICpidWZmZXJz X3Byb2Nlc3NlZCwKKwkJCQkJCQkJCWludDMyICpidWZmZXJzX2V2aWN0ZWQsCisJCQkJCQkJCQlp bnQzMiAqYnVmZmVyc19mbHVzaGVkKTsKIAogLyogaW4gYnVmX2luaXQuYyAqLwogZXh0ZXJuIHZv aWQgQnVmZmVyTWFuYWdlclNobWVtSW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3N0b3JhZ2UvYnVmZmVyL2J1Zm1nci5jIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVm bWdyLmMKaW5kZXggZmZhY2E1ZWU1NGQuLmE3N2Y1YzI3OTQwIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1 ZmZlci9idWZtZ3IuYwpAQCAtNjQ5NywzNyArNjQ5NywyNyBAQCBSZXNPd25lclByaW50QnVmZmVy UGluKERhdHVtIHJlcykKIH0KIAogLyoKLSAqIFRyeSB0byBldmljdCB0aGUgY3VycmVudCBibG9j ayBpbiBhIHNoYXJlZCBidWZmZXIuCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZXZpY3QgdW5waW5u ZWQgYnVmZmVyIHdob3NlIGJ1ZmZlciBoZWFkZXIgbG9jayBpcworICogYWxyZWFkeSBhY3F1aXJl ZC4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciB0ZXN0aW5nL2RldmVsb3Bt ZW50IHVzZSBvbmx5IQotICoKLSAqIFRvIHN1Y2NlZWQsIHRoZSBidWZmZXIgbXVzdCBub3QgYmUg cGlubmVkIG9uIGVudHJ5LCBzbyBpZiB0aGUgY2FsbGVyIGhhZCBhCi0gKiBwYXJ0aWN1bGFyIGJs b2NrIGluIG1pbmQsIGl0IG1pZ2h0IGFscmVhZHkgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IHNvbWUg b3RoZXIKLSAqIGJsb2NrIGJ5IHRoZSB0aW1lIHRoaXMgZnVuY3Rpb24gcnVucy4gIEl0J3MgYWxz byB1bnBpbm5lZCBvbiByZXR1cm4sIHNvIHRoZQotICogYnVmZmVyIG1pZ2h0IGJlIG9jY3VwaWVk IGFnYWluIGJ5IHRoZSB0aW1lIGNvbnRyb2wgaXMgcmV0dXJuZWQsIHBvdGVudGlhbGx5Ci0gKiBl dmVuIGJ5IHRoZSBzYW1lIGJsb2NrLiAgVGhpcyBpbmhlcmVudCByYWNpbmVzcyB3aXRob3V0IG90 aGVyIGludGVybG9ja2luZwotICogbWFrZXMgdGhlIGZ1bmN0aW9uIHVuc3VpdGFibGUgZm9yIG5v bi10ZXN0aW5nIHVzYWdlLgotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVyIHdhcyB2 YWxpZCBhbmQgaXQgaGFzIG5vdyBiZWVuIG1hZGUgaW52YWxpZC4KLSAqIFJldHVybnMgZmFsc2Ug aWYgaXQgd2Fzbid0IHZhbGlkLCBpZiBpdCBjb3VsZG4ndCBiZSBldmljdGVkIGR1ZSB0byBhIHBp biwKLSAqIG9yIGlmIHRoZSBidWZmZXIgYmVjb21lcyBkaXJ0eSBhZ2FpbiB3aGlsZSB3ZSdyZSB0 cnlpbmcgdG8gd3JpdGUgaXQgb3V0LgogICovCi1ib29sCi1FdmljdFVucGlubmVkQnVmZmVyKEJ1 ZmZlciBidWYpCitzdGF0aWMgYm9vbAorRXZpY3RVbnBpbm5lZEJ1ZmZlckludGVybmFsKEJ1ZmZl ciBidWYsIGJvb2wgKmZsdXNoZWQpCiB7CiAJQnVmZmVyRGVzYyAqZGVzYzsKIAl1aW50MzIJCWJ1 Zl9zdGF0ZTsKIAlib29sCQlyZXN1bHQ7CiAKLQkvKiBNYWtlIHN1cmUgd2UgY2FuIHBpbiB0aGUg YnVmZmVyLiAqLwotCVJlc291cmNlT3duZXJFbmxhcmdlKEN1cnJlbnRSZXNvdXJjZU93bmVyKTsK LQlSZXNlcnZlUHJpdmF0ZVJlZkNvdW50RW50cnkoKTsKKwlpZiAoZmx1c2hlZCkKKwkJKmZsdXNo ZWQgPSBmYWxzZTsKIAogCUFzc2VydCghQnVmZmVySXNMb2NhbChidWYpKTsKIAlkZXNjID0gR2V0 QnVmZmVyRGVzY3JpcHRvcihidWYgLSAxKTsKIAotCS8qIExvY2sgdGhlIGhlYWRlciBhbmQgY2hl Y2sgaWYgaXQncyB2YWxpZC4gKi8KLQlidWZfc3RhdGUgPSBMb2NrQnVmSGRyKGRlc2MpOworCWJ1 Zl9zdGF0ZSA9IHBnX2F0b21pY19yZWFkX3UzMigmKGRlc2MtPnN0YXRlKSk7CisJQXNzZXJ0KGJ1 Zl9zdGF0ZSAmIEJNX0xPQ0tFRCk7CisKIAlpZiAoKGJ1Zl9zdGF0ZSAmIEJNX1ZBTElEKSA9PSAw KQogCXsKIAkJVW5sb2NrQnVmSGRyKGRlc2MsIGJ1Zl9zdGF0ZSk7CkBAIC02NTQ4LDYgKzY1Mzgs OCBAQCBFdmljdFVucGlubmVkQnVmZmVyKEJ1ZmZlciBidWYpCiAJewogCQlMV0xvY2tBY3F1aXJl KEJ1ZmZlckRlc2NyaXB0b3JHZXRDb250ZW50TG9jayhkZXNjKSwgTFdfU0hBUkVEKTsKIAkJRmx1 c2hCdWZmZXIoZGVzYywgTlVMTCwgSU9PQkpFQ1RfUkVMQVRJT04sIElPQ09OVEVYVF9OT1JNQUwp OworCQlpZiAoZmx1c2hlZCkKKwkJCSpmbHVzaGVkID0gdHJ1ZTsKIAkJTFdMb2NrUmVsZWFzZShC dWZmZXJEZXNjcmlwdG9yR2V0Q29udGVudExvY2soZGVzYykpOwogCX0KIApAQCAtNjU1OSw2ICs2 NTUxLDEyMSBAQCBFdmljdFVucGlubmVkQnVmZmVyKEJ1ZmZlciBidWYpCiAJcmV0dXJuIHJlc3Vs dDsKIH0KIAorLyoKKyAqIFRyeSB0byBldmljdCB0aGUgY3VycmVudCBibG9jayBpbiBhIHNoYXJl ZCBidWZmZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgdGVzdGluZy9k ZXZlbG9wbWVudCB1c2Ugb25seSEKKyAqCisgKiBUbyBzdWNjZWVkLCB0aGUgYnVmZmVyIG11c3Qg bm90IGJlIHBpbm5lZCBvbiBlbnRyeSwgc28gaWYgdGhlIGNhbGxlciBoYWQgYQorICogcGFydGlj dWxhciBibG9jayBpbiBtaW5kLCBpdCBtaWdodCBhbHJlYWR5IGhhdmUgYmVlbiByZXBsYWNlZCBi eSBzb21lIG90aGVyCisgKiBibG9jayBieSB0aGUgdGltZSB0aGlzIGZ1bmN0aW9uIHJ1bnMuICBJ dCdzIGFsc28gdW5waW5uZWQgb24gcmV0dXJuLCBzbyB0aGUKKyAqIGJ1ZmZlciBtaWdodCBiZSBv Y2N1cGllZCBhZ2FpbiBieSB0aGUgdGltZSBjb250cm9sIGlzIHJldHVybmVkLCBwb3RlbnRpYWxs eQorICogZXZlbiBieSB0aGUgc2FtZSBibG9jay4gIFRoaXMgaW5oZXJlbnQgcmFjaW5lc3Mgd2l0 aG91dCBvdGhlciBpbnRlcmxvY2tpbmcKKyAqIG1ha2VzIHRoZSBmdW5jdGlvbiB1bnN1aXRhYmxl IGZvciBub24tdGVzdGluZyB1c2FnZS4KKyAqCisgKiAqZmx1c2hlZCBpcyBvcHRpb25hbC4gSWYg aXQgaXMgcHJvdmlkZWQsIGl0IGlzIHNldCB0byB0cnVlIGlmIHRoZSBidWZmZXIKKyAqIHdhcyBk aXJ0eSBhbmQgaGFzIGJlZW4gZmx1c2hlZC4gIEhvd2V2ZXIsIHRoaXMgZG9lcyBub3QgbmVjZXNz YXJpbHkgbWVhbgorICogdGhhdCB3ZSBmbHVzaGVkIHRoZSBidWZmZXIsIGl0IGNvdWxkIGhhdmUg YmVlbiBmbHVzaGVkIGJ5IHNvbWVvbmUgZWxzZS4KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhl IGJ1ZmZlciB3YXMgdmFsaWQgYW5kIGl0IGhhcyBub3cgYmVlbiBtYWRlIGludmFsaWQuCisgKiBS ZXR1cm5zIGZhbHNlIGlmIGl0IHdhc24ndCB2YWxpZCwgaWYgaXQgY291bGRuJ3QgYmUgZXZpY3Rl ZCBkdWUgdG8gYSBwaW4sCisgKiBvciBpZiB0aGUgYnVmZmVyIGJlY29tZXMgZGlydHkgYWdhaW4g d2hpbGUgd2UncmUgdHJ5aW5nIHRvIHdyaXRlIGl0IG91dC4KKyAqLworYm9vbAorRXZpY3RVbnBp bm5lZEJ1ZmZlcihCdWZmZXIgYnVmLCBib29sICpmbHVzaGVkKQoreworCS8qIE1ha2Ugc3VyZSB3 ZSBjYW4gcGluIHRoZSBidWZmZXIuICovCisJUmVzb3VyY2VPd25lckVubGFyZ2UoQ3VycmVudFJl c291cmNlT3duZXIpOworCVJlc2VydmVQcml2YXRlUmVmQ291bnRFbnRyeSgpOworCisJQXNzZXJ0 KCFCdWZmZXJJc0xvY2FsKGJ1ZikpOworCUxvY2tCdWZIZHIoR2V0QnVmZmVyRGVzY3JpcHRvcihi dWYgLSAxKSk7CisKKwlyZXR1cm4gRXZpY3RVbnBpbm5lZEJ1ZmZlckludGVybmFsKGJ1ZiwgZmx1 c2hlZCk7Cit9CisKKy8qCisgKiBUcnkgdG8gZXZpY3QgYWxsIHRoZSBzaGFyZWQgYnVmZmVycy4K KyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciB0ZXN0aW5nL2RldmVsb3BtZW50 IHVzZSBvbmx5IQorICoKKyAqIGJ1ZmZlcnNfZXZpY3RlZCBhbmQgYnVmZmVyc19mbHVzaGVkIGFy ZSBvcHRpb25hbC4gSWYgdGhleSBhcmUgcHJvdmlkZWQsCisgKiB0aGV5IGFyZSBzZXQgdGhlIHRv dGFsIG51bWJlciBvZiBidWZmZXJzIGV2aWN0ZWQgYW5kIGZsdXNoZWQgcmVzcGVjdGl2ZWx5Lgor ICovCit2b2lkCitFdmljdEFsbFVucGlubmVkQnVmZmVycyhpbnQzMiAqYnVmZmVyc19ldmljdGVk LCBpbnQzMiAqYnVmZmVyc19mbHVzaGVkKQoreworCWlmIChidWZmZXJzX2V2aWN0ZWQpCisJCSpi dWZmZXJzX2V2aWN0ZWQgPSAwOworCWlmIChidWZmZXJzX2ZsdXNoZWQpCisJCSpidWZmZXJzX2Zs dXNoZWQgPSAwOworCisJZm9yIChpbnQgYnVmID0gMTsgYnVmIDw9IE5CdWZmZXJzOyBidWYrKykK Kwl7CisJCWJvb2wJCWZsdXNoZWQ7CisKKwkJaWYgKEV2aWN0VW5waW5uZWRCdWZmZXIoYnVmLCAm Zmx1c2hlZCkgJiYgYnVmZmVyc19ldmljdGVkKQorCQkJKCpidWZmZXJzX2V2aWN0ZWQpKys7CisJ CWlmIChidWZmZXJzX2ZsdXNoZWQgJiYgZmx1c2hlZCkKKwkJCSgqYnVmZmVyc19mbHVzaGVkKSsr OworCX0KK30KKworLyoKKyAqIFRyeSB0byBldmljdCBhbGwgdGhlIHNoYXJlZCBidWZmZXJzIGNv bnRhaW5pbmcgcHJvdmlkZWQgcmVsYXRpb24ncyBwYWdlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9u IGlzIGludGVuZGVkIGZvciB0ZXN0aW5nL2RldmVsb3BtZW50IHVzZSBvbmx5IQorICoKKyAqIFRo ZSBjYWxsZXIgbXVzdCBob2xkIGF0IGxlYXN0IEFjY2Vzc1NoYXJlTG9jayBvbiB0aGUgcmVsYXRp b24gdG8gcHJldmVudAorICogdGhlIHJlbGF0aW9uIGZyb20gYmVpbmcgZHJvcHBlZC4KKyAqCisg KiBidWZmZXJzX3Byb2Nlc3NlZCwgYnVmZmVyc19ldmljdGVkIGFuZCBidWZmZXJzX2ZsdXNoZWQg YXJlIG9wdGlvbmFsLiBJZgorICogdGhleSBhcmUgcHJvdmlkZWQsIHRoZXkgYXJlIHNldCB0aGUg dG90YWwgbnVtYmVyIG9mIGJ1ZmZlcnMgcHJvY2Vzc2VkLAorICogZXZpY3RlZCBhbmQgZmx1c2hl ZCByZXNwZWN0aXZlbHkuCisgKi8KK3ZvaWQKK0V2aWN0UmVsVW5waW5uZWRCdWZmZXJzKFJlbGF0 aW9uIHJlbCwgaW50MzIgKmJ1ZmZlcnNfcHJvY2Vzc2VkLAorCQkJCQkJaW50MzIgKmJ1ZmZlcnNf ZXZpY3RlZCwgaW50MzIgKmJ1ZmZlcnNfZmx1c2hlZCkKK3sKKwlpZiAoYnVmZmVyc19wcm9jZXNz ZWQpCisJCSpidWZmZXJzX3Byb2Nlc3NlZCA9IDA7CisJaWYgKGJ1ZmZlcnNfZXZpY3RlZCkKKwkJ KmJ1ZmZlcnNfZXZpY3RlZCA9IDA7CisJaWYgKGJ1ZmZlcnNfZmx1c2hlZCkKKwkJKmJ1ZmZlcnNf Zmx1c2hlZCA9IDA7CisKKwlBc3NlcnQoIVJlbGF0aW9uVXNlc0xvY2FsQnVmZmVycyhyZWwpKTsK KworCWZvciAoaW50IGJ1ZiA9IDE7IGJ1ZiA8PSBOQnVmZmVyczsgYnVmKyspCisJeworCQl1aW50 MzIJCWJ1Zl9zdGF0ZSA9IDA7CisJCUJ1ZmZlckRlc2MgKmJ1ZkhkciA9IEdldEJ1ZmZlckRlc2Ny aXB0b3IoYnVmIC0gMSk7CisKKwkJLyogQW4gdW5sb2NrZWQgcHJlY2hlY2sgc2hvdWxkIGJlIHNh ZmUgYW5kIHNhdmVzIHNvbWUgY3ljbGVzLiAqLworCQlpZiAoIUJ1ZlRhZ01hdGNoZXNSZWxGaWxl TG9jYXRvcigmYnVmSGRyLT50YWcsICZyZWwtPnJkX2xvY2F0b3IpKQorCQkJY29udGludWU7CisK KwkJLyogTWFrZSBzdXJlIHdlIGNhbiBwaW4gdGhlIGJ1ZmZlci4gKi8KKwkJUmVzb3VyY2VPd25l ckVubGFyZ2UoQ3VycmVudFJlc291cmNlT3duZXIpOworCQlSZXNlcnZlUHJpdmF0ZVJlZkNvdW50 RW50cnkoKTsKKworCQlidWZfc3RhdGUgPSBMb2NrQnVmSGRyKGJ1Zkhkcik7CisJCWlmIChCdWZU YWdNYXRjaGVzUmVsRmlsZUxvY2F0b3IoJmJ1Zkhkci0+dGFnLCAmcmVsLT5yZF9sb2NhdG9yKSkK KwkJeworCQkJYm9vbAkJZmx1c2hlZDsKKworCQkJaWYgKEV2aWN0VW5waW5uZWRCdWZmZXJJbnRl cm5hbChidWYsICZmbHVzaGVkKSAmJiBidWZmZXJzX2V2aWN0ZWQpCisJCQkJKCpidWZmZXJzX2V2 aWN0ZWQpKys7CisJCQlpZiAoYnVmZmVyc19mbHVzaGVkICYmIGZsdXNoZWQpCisJCQkJKCpidWZm ZXJzX2ZsdXNoZWQpKys7CisJCQlpZiAoYnVmZmVyc19wcm9jZXNzZWQpCisJCQkJKCpidWZmZXJz X3Byb2Nlc3NlZCkrKzsKKwkJfQorCQllbHNlCisJCQlVbmxvY2tCdWZIZHIoYnVmSGRyLCBidWZf c3RhdGUpOworCX0KK30KKwogLyoKICAqIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFJ TyBoYW5kbGUgc3RhZ2luZyBjYWxsYmFjayBmb3IgcmVhZHYvd3JpdGV2CiAgKiBvbiBsb2NhbC9z aGFyZWQgYnVmZmVycy4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9haW8vdGVz dF9haW8uYyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9haW8vdGVzdF9haW8uYwppbmRleCBiZWYw ZWNkOTAwNy4uZjljZjZjZThhMjYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9h aW8vdGVzdF9haW8uYworKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfYWlvL3Rlc3RfYWlvLmMK QEAgLTIzNyw3ICsyMzcsNyBAQCBtb2RpZnlfcmVsX2Jsb2NrKFBHX0ZVTkNUSU9OX0FSR1MpCiAJ aWYgKEJ1ZmZlcklzTG9jYWwoYnVmKSkKIAkJSW52YWxpZGF0ZUxvY2FsQnVmZmVyKEdldExvY2Fs QnVmZmVyRGVzY3JpcHRvcigtYnVmIC0gMSksIHRydWUpOwogCWVsc2UKLQkJRXZpY3RVbnBpbm5l ZEJ1ZmZlcihidWYpOworCQlFdmljdFVucGlubmVkQnVmZmVyKGJ1ZiwgTlVMTCk7CiAKIAkvKgog CSAqIE5vdyBtb2RpZnkgdGhlIHBhZ2UgYXMgYXNrZWQgZm9yIGJ5IHRoZSBjYWxsZXIuCkBAIC00 OTMsNyArNDkzLDcgQEAgaW52YWxpZGF0ZV9yZWxfYmxvY2soUEdfRlVOQ1RJT05fQVJHUykKIAog CQkJaWYgKEJ1ZmZlcklzTG9jYWwoYnVmKSkKIAkJCQlJbnZhbGlkYXRlTG9jYWxCdWZmZXIoR2V0 TG9jYWxCdWZmZXJEZXNjcmlwdG9yKC1idWYgLSAxKSwgdHJ1ZSk7Ci0JCQllbHNlIGlmICghRXZp Y3RVbnBpbm5lZEJ1ZmZlcihidWYpKQorCQkJZWxzZSBpZiAoIUV2aWN0VW5waW5uZWRCdWZmZXIo YnVmLCBOVUxMKSkKIAkJCQllbG9nKEVSUk9SLCAiY291bGRuJ3QgZXZpY3QiKTsKIAkJfQogCX0K ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9wZ2J1ZmZlcmNhY2hlLnNnbWwgYi9kb2Mvc3JjL3Nn bWwvcGdidWZmZXJjYWNoZS5zZ21sCmluZGV4IDgwMmE1MTEyZDc3Li5jN2UxMGY5N2FiNiAxMDA2 NDQKLS0tIGEvZG9jL3NyYy9zZ21sL3BnYnVmZmVyY2FjaGUuc2dtbAorKysgYi9kb2Mvc3JjL3Nn bWwvcGdidWZmZXJjYWNoZS5zZ21sCkBAIC0yNywxMiArMjcsMjIgQEAKICAgPHByaW1hcnk+cGdf YnVmZmVyY2FjaGVfZXZpY3Q8L3ByaW1hcnk+CiAgPC9pbmRleHRlcm0+CiAKKyA8aW5kZXh0ZXJt PgorICA8cHJpbWFyeT5wZ19idWZmZXJjYWNoZV9ldmljdF9yZWxhdGlvbjwvcHJpbWFyeT4KKyA8 L2luZGV4dGVybT4KKworIDxpbmRleHRlcm0+CisgIDxwcmltYXJ5PnBnX2J1ZmZlcmNhY2hlX2V2 aWN0X2FsbDwvcHJpbWFyeT4KKyA8L2luZGV4dGVybT4KKwogIDxwYXJhPgogICBUaGlzIG1vZHVs ZSBwcm92aWRlcyB0aGUgPGZ1bmN0aW9uPnBnX2J1ZmZlcmNhY2hlX3BhZ2VzKCk8L2Z1bmN0aW9u PgogICBmdW5jdGlvbiAod3JhcHBlZCBpbiB0aGUgPHN0cnVjdG5hbWU+cGdfYnVmZmVyY2FjaGU8 L3N0cnVjdG5hbWU+IHZpZXcpLAogICB0aGUgPGZ1bmN0aW9uPnBnX2J1ZmZlcmNhY2hlX3N1bW1h cnkoKTwvZnVuY3Rpb24+IGZ1bmN0aW9uLCB0aGUKLSAgPGZ1bmN0aW9uPnBnX2J1ZmZlcmNhY2hl X3VzYWdlX2NvdW50cygpPC9mdW5jdGlvbj4gZnVuY3Rpb24gYW5kCi0gIHRoZSA8ZnVuY3Rpb24+ cGdfYnVmZmVyY2FjaGVfZXZpY3QoKTwvZnVuY3Rpb24+IGZ1bmN0aW9uLgorICA8ZnVuY3Rpb24+ cGdfYnVmZmVyY2FjaGVfdXNhZ2VfY291bnRzKCk8L2Z1bmN0aW9uPiBmdW5jdGlvbiwgdGhlCisg IDxmdW5jdGlvbj5wZ19idWZmZXJjYWNoZV9ldmljdCgpPC9mdW5jdGlvbj4sIHRoZQorICA8ZnVu Y3Rpb24+cGdfYnVmZmVyY2FjaGVfZXZpY3RfcmVsYXRpb24oKTwvZnVuY3Rpb24+IGZ1bmN0aW9u IGFuZCB0aGUKKyAgPGZ1bmN0aW9uPnBnX2J1ZmZlcmNhY2hlX2V2aWN0X2FsbCgpPC9mdW5jdGlv bj4gZnVuY3Rpb24uCiAgPC9wYXJhPgogCiAgPHBhcmE+CkBAIC02NSw2ICs3NSwxOSBAQAogICBm dW5jdGlvbiBpcyByZXN0cmljdGVkIHRvIHN1cGVydXNlcnMgb25seS4KICA8L3BhcmE+CiAKKyA8 cGFyYT4KKyAgVGhlIDxmdW5jdGlvbj5wZ19idWZmZXJjYWNoZV9ldmljdF9yZWxhdGlvbigpPC9m dW5jdGlvbj4gZnVuY3Rpb24gYWxsb3dzIGFsbAorICB1bnBpbm5lZCBzaGFyZWQgYnVmZmVycyBp biB0aGUgcmVsYXRpb24gdG8gYmUgZXZpY3RlZCBmcm9tIHRoZSBidWZmZXIgcG9vbAorICBnaXZl biBhIHJlbGF0aW9uIGlkZW50aWZpZXIuICBVc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyByZXN0cmlj dGVkIHRvCisgIHN1cGVydXNlcnMgb25seS4KKyA8L3BhcmE+CisKKyA8cGFyYT4KKyAgVGhlIDxm dW5jdGlvbj5wZ19idWZmZXJjYWNoZV9ldmljdF9hbGwoKTwvZnVuY3Rpb24+IGZ1bmN0aW9uIGFs bG93cyBhbGwKKyAgdW5waW5uZWQgc2hhcmVkIGJ1ZmZlcnMgdG8gYmUgZXZpY3RlZCBpbiB0aGUg YnVmZmVyIHBvb2wuICBVc2Ugb2YgdGhpcworICBmdW5jdGlvbiBpcyByZXN0cmljdGVkIHRvIHN1 cGVydXNlcnMgb25seS4KKyA8L3BhcmE+CisKICA8c2VjdDIgaWQ9InBnYnVmZmVyY2FjaGUtcGct YnVmZmVyY2FjaGUiPgogICA8dGl0bGU+VGhlIDxzdHJ1Y3RuYW1lPnBnX2J1ZmZlcmNhY2hlPC9z dHJ1Y3RuYW1lPiBWaWV3PC90aXRsZT4KIApAQCAtMzY5LDEyICszOTIsNDYgQEAKICAgPHBhcmE+ CiAgICBUaGUgPGZ1bmN0aW9uPnBnX2J1ZmZlcmNhY2hlX2V2aWN0KCk8L2Z1bmN0aW9uPiBmdW5j dGlvbiB0YWtlcyBhIGJ1ZmZlcgogICAgaWRlbnRpZmllciwgYXMgc2hvd24gaW4gdGhlIDxzdHJ1 Y3RmaWVsZD5idWZmZXJpZDwvc3RydWN0ZmllbGQ+IGNvbHVtbiBvZgotICAgdGhlIDxzdHJ1Y3Ru YW1lPnBnX2J1ZmZlcmNhY2hlPC9zdHJ1Y3RuYW1lPiB2aWV3LiAgSXQgcmV0dXJucyB0cnVlIG9u IHN1Y2Nlc3MsCi0gICBhbmQgZmFsc2UgaWYgdGhlIGJ1ZmZlciB3YXNuJ3QgdmFsaWQsIGlmIGl0 IGNvdWxkbid0IGJlIGV2aWN0ZWQgYmVjYXVzZSBpdAotICAgd2FzIHBpbm5lZCwgb3IgaWYgaXQg YmVjYW1lIGRpcnR5IGFnYWluIGFmdGVyIGFuIGF0dGVtcHQgdG8gd3JpdGUgaXQgb3V0LgotICAg VGhlIHJlc3VsdCBpcyBpbW1lZGlhdGVseSBvdXQgb2YgZGF0ZSB1cG9uIHJldHVybiwgYXMgdGhl IGJ1ZmZlciBtaWdodAotICAgYmVjb21lIHZhbGlkIGFnYWluIGF0IGFueSB0aW1lIGR1ZSB0byBj b25jdXJyZW50IGFjdGl2aXR5LiAgVGhlIGZ1bmN0aW9uIGlzCi0gICBpbnRlbmRlZCBmb3IgZGV2 ZWxvcGVyIHRlc3Rpbmcgb25seS4KKyAgIHRoZSA8c3RydWN0bmFtZT5wZ19idWZmZXJjYWNoZTwv c3RydWN0bmFtZT4gdmlldy4gIEl0IHJldHVybnMgdGhlCisgICBpbmZvcm1hdGlvbiBhYm91dCB3 aGV0aGVyIHRoZSBidWZmZXIgaXMgZXZpY3RlZCBhbmQgZmx1c2hlZC4gIGV2aWN0ZWQKKyAgIGNv bHVtbiBpcyB0cnVlIG9uIHN1Y2Nlc3MsIGFuZCBmYWxzZSBpZiB0aGUgYnVmZmVyIHdhc24ndCB2 YWxpZCwgaWYgaXQKKyAgIGNvdWxkbid0IGJlIGV2aWN0ZWQgYmVjYXVzZSBpdCB3YXMgcGlubmVk LCBvciBpZiBpdCBiZWNhbWUgZGlydHkgYWdhaW4KKyAgIGFmdGVyIGFuIGF0dGVtcHQgdG8gd3Jp dGUgaXQgb3V0LiAgZmx1c2hlZCBjb2x1bW4gaXMgdHJ1ZSBpZiB0aGUgYnVmZmVyIGlzCisgICBm bHVzaGVkLiAgVGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuIHRoYXQgYnVmZmVyIGlzIGZs dXNoZWQgYnkgdXMsIGl0CisgICBtaWdodCBiZSBmbHVzaGVkIGJ5IHNvbWVvbmUgZWxzZS4gIFRo ZSByZXN1bHQgaXMgaW1tZWRpYXRlbHkgb3V0IG9mIGRhdGUKKyAgIHVwb24gcmV0dXJuLCBhcyB0 aGUgYnVmZmVyIG1pZ2h0IGJlY29tZSB2YWxpZCBhZ2FpbiBhdCBhbnkgdGltZSBkdWUgdG8KKyAg IGNvbmN1cnJlbnQgYWN0aXZpdHkuIFRoZSBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgZGV2ZWxv cGVyIHRlc3Rpbmcgb25seS4KKyAgPC9wYXJhPgorIDwvc2VjdDI+CisKKyA8c2VjdDIgaWQ9InBn YnVmZmVyY2FjaGUtcGctYnVmZmVyY2FjaGUtZXZpY3QtcmVsYXRpb24iPgorICA8dGl0bGU+VGhl IDxzdHJ1Y3RuYW1lPnBnX2J1ZmZlcmNhY2hlX2V2aWN0X3JlbGF0aW9uPC9zdHJ1Y3RuYW1lPiBG dW5jdGlvbjwvdGl0bGU+CisgIDxwYXJhPgorICAgVGhlIDxmdW5jdGlvbj5wZ19idWZmZXJjYWNo ZV9ldmljdF9yZWxhdGlvbigpPC9mdW5jdGlvbj4gZnVuY3Rpb24gaXMgdmVyeQorICAgc2ltaWxh ciB0byB0aGUgPGZ1bmN0aW9uPnBnX2J1ZmZlcmNhY2hlX2V2aWN0KCk8L2Z1bmN0aW9uPiBmdW5j dGlvbi4gIFRoZQorICAgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSA8ZnVuY3Rpb24+cGdfYnVmZmVy Y2FjaGVfZXZpY3RfcmVsYXRpb24oKTwvZnVuY3Rpb24+CisgICB0YWtlcyBhIHJlbGF0aW9uIGlk ZW50aWZpZXIgaW5zdGVhZCBvZiBidWZmZXIgaWRlbnRpZmllci4gIFRoZW4sIGl0IHRyaWVzCisg ICB0byBldmljdCBhbGwgYnVmZmVycyBmb3IgYWxsIGZvcmtzIGluIHRoYXQgcmVsYXRpb24uICBJ dCByZXR1cm5zIHRoZSBudW1iZXIKKyAgIG9mIGV2aWN0ZWQgYW5kIGZsdXNoZWQgYnVmZmVycy4g IEZsdXNoZWQgYnVmZmVycyBhcmVuJ3QgbmVjZXNzYXJpbHkgZmx1c2hlZAorICAgYnkgdXMsIHRo ZXkgbWlnaHQgYmUgZmx1c2hlZCBieSBzb21lb25lIGVsc2UuICBUaGUgcmVzdWx0IGlzIGltbWVk aWF0ZWx5CisgICBvdXQgb2YgZGF0ZSB1cG9uIHJldHVybiwgYXMgdGhlIGJ1ZmZlciBtaWdodCBi ZWNvbWUgdmFsaWQgYWdhaW4gYXQgYW55IHRpbWUKKyAgIGR1ZSB0byBjb25jdXJyZW50IGFjdGl2 aXR5LiAgVGhlIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciBkZXZlbG9wZXIgdGVzdGluZworICAg b25seS4KKyAgPC9wYXJhPgorIDwvc2VjdDI+CisKKyA8c2VjdDIgaWQ9InBnYnVmZmVyY2FjaGUt cGctYnVmZmVyY2FjaGUtZXZpY3QtYWxsIj4KKyAgPHRpdGxlPlRoZSA8c3RydWN0bmFtZT5wZ19i dWZmZXJjYWNoZV9ldmljdF9hbGw8L3N0cnVjdG5hbWU+IEZ1bmN0aW9uPC90aXRsZT4KKyAgPHBh cmE+CisgICBUaGUgPGZ1bmN0aW9uPnBnX2J1ZmZlcmNhY2hlX2V2aWN0X2FsbCgpPC9mdW5jdGlv bj4gZnVuY3Rpb24gaXMgdmVyeQorICAgc2ltaWxhciB0byB0aGUgPGZ1bmN0aW9uPnBnX2J1ZmZl cmNhY2hlX2V2aWN0KCk8L2Z1bmN0aW9uPiBmdW5jdGlvbi4gIFRoZQorICAgZGlmZmVyZW5jZSBp cywgdGhlIDxmdW5jdGlvbj5wZ19idWZmZXJjYWNoZV9ldmljdF9hbGwoKTwvZnVuY3Rpb24+IGZ1 bmN0aW9uCisgICBkb2VzIG5vdCB0YWtlIGFuIGFyZ3VtZW50OyBpbnN0ZWFkIGl0IHRyaWVzIHRv IGV2aWN0IGFsbCBidWZmZXJzIGluIHRoZQorICAgYnVmZmVyIHBvb2wuICBJdCByZXR1cm5zIHRo ZSBudW1iZXIgb2YgZXZpY3RlZCBhbmQgZmx1c2hlZCBidWZmZXJzLgorICAgRmx1c2hlZCBidWZm ZXJzIGFyZW4ndCBuZWNlc3NhcmlseSBmbHVzaGVkIGJ5IHVzLCB0aGV5IG1pZ2h0IGJlIGZsdXNo ZWQgYnkKKyAgIHNvbWVvbmUgZWxzZS4gIFRoZSByZXN1bHQgaXMgaW1tZWRpYXRlbHkgb3V0IG9m IGRhdGUgdXBvbiByZXR1cm4sIGFzIHRoZQorICAgYnVmZmVyIG1pZ2h0IGJlY29tZSB2YWxpZCBh Z2FpbiBhdCBhbnkgdGltZSBkdWUgdG8gY29uY3VycmVudCBhY3Rpdml0eS4KKyAgIFRoZSBmdW5j dGlvbiBpcyBpbnRlbmRlZCBmb3IgZGV2ZWxvcGVyIHRlc3Rpbmcgb25seS4KICAgPC9wYXJhPgog IDwvc2VjdDI+CiAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfYnVmZmVyY2FjaGUvTWFrZWZpbGUg Yi9jb250cmliL3BnX2J1ZmZlcmNhY2hlL01ha2VmaWxlCmluZGV4IGVhZTY1ZWFkOWU1Li4yYTMz NjAyNTM3ZSAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ19idWZmZXJjYWNoZS9NYWtlZmlsZQorKysg Yi9jb250cmliL3BnX2J1ZmZlcmNhY2hlL01ha2VmaWxlCkBAIC04LDcgKzgsOCBAQCBPQkpTID0g XAogRVhURU5TSU9OID0gcGdfYnVmZmVyY2FjaGUKIERBVEEgPSBwZ19idWZmZXJjYWNoZS0tMS4y LnNxbCBwZ19idWZmZXJjYWNoZS0tMS4yLS0xLjMuc3FsIFwKIAlwZ19idWZmZXJjYWNoZS0tMS4x LS0xLjIuc3FsIHBnX2J1ZmZlcmNhY2hlLS0xLjAtLTEuMS5zcWwgXAotCXBnX2J1ZmZlcmNhY2hl LS0xLjMtLTEuNC5zcWwgcGdfYnVmZmVyY2FjaGUtLTEuNC0tMS41LnNxbAorCXBnX2J1ZmZlcmNh Y2hlLS0xLjMtLTEuNC5zcWwgcGdfYnVmZmVyY2FjaGUtLTEuNC0tMS41LnNxbCBcCisJcGdfYnVm ZmVyY2FjaGUtLTEuNS0tMS42LnNxbAogUEdGSUxFREVTQyA9ICJwZ19idWZmZXJjYWNoZSAtIG1v bml0b3Jpbmcgb2Ygc2hhcmVkIGJ1ZmZlciBjYWNoZSBpbiByZWFsLXRpbWUiCiAKIFJFR1JFU1Mg PSBwZ19idWZmZXJjYWNoZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9wZ19idWZmZXJjYWNoZS9leHBl Y3RlZC9wZ19idWZmZXJjYWNoZS5vdXQgYi9jb250cmliL3BnX2J1ZmZlcmNhY2hlL2V4cGVjdGVk L3BnX2J1ZmZlcmNhY2hlLm91dAppbmRleCBiNzQ1ZGM2OWVhZS4uYjQ0YWYwZmUyMWUgMTAwNjQ0 Ci0tLSBhL2NvbnRyaWIvcGdfYnVmZmVyY2FjaGUvZXhwZWN0ZWQvcGdfYnVmZmVyY2FjaGUub3V0 CisrKyBiL2NvbnRyaWIvcGdfYnVmZmVyY2FjaGUvZXhwZWN0ZWQvcGdfYnVmZmVyY2FjaGUub3V0 CkBAIC01NSwzICs1NSw2NCBAQCBTRUxFQ1QgY291bnQoKikgPiAwIEZST00gcGdfYnVmZmVyY2Fj aGVfdXNhZ2VfY291bnRzKCk7CiAgdAogKDEgcm93KQogCitSRVNFVCByb2xlOworLS0tLS0tCist LS0tIFRlc3QgcGdfYnVmZmVyY2FjaGVfZXZpY3QqIGZ1bmN0aW9ucworLS0tLS0tCitDUkVBVEUg Uk9MRSByZWdyZXNzX2J1ZmZlcmNhY2hlX25vcm1hbDsKK1NFVCBST0xFIHJlZ3Jlc3NfYnVmZmVy Y2FjaGVfbm9ybWFsOworLS0gVGhlc2Ugc2hvdWxkIGZhaWwgYmVjYXVzZSB0aGVzZSBhcmUgU1RS SUNUIGZ1bmN0aW9ucworU0VMRUNUICogRlJPTSBwZ19idWZmZXJjYWNoZV9ldmljdCgpOworRVJS T1I6ICBmdW5jdGlvbiBwZ19idWZmZXJjYWNoZV9ldmljdCgpIGRvZXMgbm90IGV4aXN0CitMSU5F IDE6IFNFTEVDVCAqIEZST00gcGdfYnVmZmVyY2FjaGVfZXZpY3QoKTsKKyAgICAgICAgICAgICAg ICAgICAgICBeCitISU5UOiAgTm8gZnVuY3Rpb24gbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSBhbmQg YXJndW1lbnQgdHlwZXMuIFlvdSBtaWdodCBuZWVkIHRvIGFkZCBleHBsaWNpdCB0eXBlIGNhc3Rz LgorU0VMRUNUICogRlJPTSBwZ19idWZmZXJjYWNoZV9ldmljdF9yZWxhdGlvbigpOworRVJST1I6 ICBmdW5jdGlvbiBwZ19idWZmZXJjYWNoZV9ldmljdF9yZWxhdGlvbigpIGRvZXMgbm90IGV4aXN0 CitMSU5FIDE6IFNFTEVDVCAqIEZST00gcGdfYnVmZmVyY2FjaGVfZXZpY3RfcmVsYXRpb24oKTsK KyAgICAgICAgICAgICAgICAgICAgICBeCitISU5UOiAgTm8gZnVuY3Rpb24gbWF0Y2hlcyB0aGUg Z2l2ZW4gbmFtZSBhbmQgYXJndW1lbnQgdHlwZXMuIFlvdSBtaWdodCBuZWVkIHRvIGFkZCBleHBs aWNpdCB0eXBlIGNhc3RzLgorLS0gVGhlc2Ugc2hvdWxkIGZhaWwgYmVjYXVzZSB0aGV5IG5lZWQg dG8gYmUgY2FsbGVkIGFzIFNVUEVSVVNFUgorU0VMRUNUICogRlJPTSBwZ19idWZmZXJjYWNoZV9l dmljdCgxKTsKK0VSUk9SOiAgbXVzdCBiZSBzdXBlcnVzZXIgdG8gdXNlIHBnX2J1ZmZlcmNhY2hl X2V2aWN0KCkKK1NFTEVDVCAqIEZST00gcGdfYnVmZmVyY2FjaGVfZXZpY3RfcmVsYXRpb24oMSk7 CitFUlJPUjogIG11c3QgYmUgc3VwZXJ1c2VyIHRvIHVzZSBwZ19idWZmZXJjYWNoZV9ldmljdF9y ZWxhdGlvbigpCitTRUxFQ1QgKiBGUk9NIHBnX2J1ZmZlcmNhY2hlX2V2aWN0X2FsbCgpOworRVJS T1I6ICBtdXN0IGJlIHN1cGVydXNlciB0byB1c2UgcGdfYnVmZmVyY2FjaGVfZXZpY3RfYWxsKCkK K1JFU0VUIFJPTEU7CistLSBUaGVzZSBzaG91bGQgZmFpbCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBj YWxsZWQgYnkgdmFsaWQgcmFuZ2Ugb2YgYnVmZmVycworLS0gTnVtYmVyIG9mIHRoZSBzaGFyZWQg YnVmZmVycyBhcmUgbGltaXRlZCBieSBtYXggaW50ZWdlcgorU0VMRUNUIDIxNDc0ODM2NDcgbWF4 X2J1ZmZlcnMgXGdzZXQKK1NFTEVDVCAqIEZST00gcGdfYnVmZmVyY2FjaGVfZXZpY3QoMCk7CitF UlJPUjogIGJhZCBidWZmZXIgSUQ6IDAKK1NFTEVDVCAqIEZST00gcGdfYnVmZmVyY2FjaGVfZXZp Y3QoOm1heF9idWZmZXJzKTsKK0VSUk9SOiAgYmFkIGJ1ZmZlciBJRDogMjE0NzQ4MzY0NworLS0g VGhpcyBzaG91bGQgZmFpbCBiZWNhdXNlIHBnX2J1ZmZlcmNhY2hlX2V2aWN0X3JlbGF0aW9uKCkg ZG9lc24ndCBhY2NlcHQKKy0tIGxvY2FsIHJlbGF0aW9ucworQ1JFQVRFIFRFTVAgVEFCTEUgdGVt cF9wZ19idWZmZXJjYWNoZSgpOworU0VMRUNUICogRlJPTSBwZ19idWZmZXJjYWNoZV9ldmljdF9y ZWxhdGlvbigndGVtcF9wZ19idWZmZXJjYWNoZScpOworRVJST1I6ICByZWxhdGlvbiB1c2VzIGxv Y2FsIGJ1ZmZlcnMsIHBnX2J1ZmZlcmNhY2hlX2V2aWN0X3JlbGF0aW9uKCkgaXMgaW50ZW5kZWQg dG8gYmUgdXNlZCBmb3Igc2hhcmVkIGJ1ZmZlcnMgb25seQorRFJPUCBUQUJMRSB0ZW1wX3BnX2J1 ZmZlcmNhY2hlOworLS0gVGhlc2Ugc2hvdWxkbid0IGZhaWwKK1NFTEVDVCBDT1VOVCgqKSA+IDAg RlJPTSBwZ19idWZmZXJjYWNoZV9ldmljdCgxKTsKKyA/Y29sdW1uPyAKKy0tLS0tLS0tLS0KKyB0 CisoMSByb3cpCisKK1NFTEVDVCBDT1VOVCgqKSA+IDAgRlJPTSBwZ19idWZmZXJjYWNoZV9ldmlj dF9hbGwoKTsKKyA/Y29sdW1uPyAKKy0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK0NSRUFURSBU QUJMRSBzaGFyZWRfcGdfYnVmZmVyY2FjaGUoKTsKK1NFTEVDVCBDT1VOVCgqKSA+IDAgRlJPTSBw Z19idWZmZXJjYWNoZV9ldmljdF9yZWxhdGlvbignc2hhcmVkX3BnX2J1ZmZlcmNhY2hlJyk7Cisg P2NvbHVtbj8gCistLS0tLS0tLS0tCisgdAorKDEgcm93KQorCitEUk9QIFRBQkxFIHNoYXJlZF9w Z19idWZmZXJjYWNoZTsKK1JFU0VUIFJPTEU7CitEUk9QIFJPTEUgcmVncmVzc19idWZmZXJjYWNo ZV9ub3JtYWw7CmRpZmYgLS1naXQgYS9jb250cmliL3BnX2J1ZmZlcmNhY2hlL21lc29uLmJ1aWxk IGIvY29udHJpYi9wZ19idWZmZXJjYWNoZS9tZXNvbi5idWlsZAppbmRleCAxMmQxZmU0ODcxNy4u OWIyZTkzOTM0MTAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdfYnVmZmVyY2FjaGUvbWVzb24uYnVp bGQKKysrIGIvY29udHJpYi9wZ19idWZmZXJjYWNoZS9tZXNvbi5idWlsZApAQCAtMjMsNiArMjMs NyBAQCBpbnN0YWxsX2RhdGEoCiAgICdwZ19idWZmZXJjYWNoZS0tMS4yLnNxbCcsCiAgICdwZ19i dWZmZXJjYWNoZS0tMS4zLS0xLjQuc3FsJywKICAgJ3BnX2J1ZmZlcmNhY2hlLS0xLjQtLTEuNS5z cWwnLAorICAncGdfYnVmZmVyY2FjaGUtLTEuNS0tMS42LnNxbCcsCiAgICdwZ19idWZmZXJjYWNo ZS5jb250cm9sJywKICAga3dhcmdzOiBjb250cmliX2RhdGFfYXJncywKICkKZGlmZiAtLWdpdCBh L2NvbnRyaWIvcGdfYnVmZmVyY2FjaGUvcGdfYnVmZmVyY2FjaGUtLTEuNS0tMS42LnNxbCBiL2Nv bnRyaWIvcGdfYnVmZmVyY2FjaGUvcGdfYnVmZmVyY2FjaGUtLTEuNS0tMS42LnNxbApuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZTM3ZmE2NjkzMGMKLS0tIC9kZXYvbnVs bAorKysgYi9jb250cmliL3BnX2J1ZmZlcmNhY2hlL3BnX2J1ZmZlcmNhY2hlLS0xLjUtLTEuNi5z cWwKQEAgLTAsMCArMSwyNCBAQAorXGVjaG8gVXNlICJBTFRFUiBFWFRFTlNJT04gcGdfYnVmZmVy Y2FjaGUgVVBEQVRFIFRPICcxLjYnIiB0byBsb2FkIHRoaXMgZmlsZS4gXHF1aXQKKworRFJPUCBG VU5DVElPTiBwZ19idWZmZXJjYWNoZV9ldmljdChpbnRlZ2VyKTsKK0NSRUFURSBGVU5DVElPTiBw Z19idWZmZXJjYWNoZV9ldmljdCgKKyAgICBJTiBpbnQsCisgICAgT1VUIGV2aWN0ZWQgYm9vbGVh biwKKyAgICBPVVQgZmx1c2hlZCBib29sZWFuKQorQVMgJ01PRFVMRV9QQVRITkFNRScsICdwZ19i dWZmZXJjYWNoZV9ldmljdCcKK0xBTkdVQUdFIEMgUEFSQUxMRUwgU0FGRSBWT0xBVElMRSBTVFJJ Q1Q7CisKK0NSRUFURSBGVU5DVElPTiBwZ19idWZmZXJjYWNoZV9ldmljdF9yZWxhdGlvbigKKyAg ICBJTiByZWdjbGFzcywKKyAgICBPVVQgYnVmZmVyc19wcm9jZXNzZWQgaW50NCwKKyAgICBPVVQg YnVmZmVyc19ldmljdGVkIGludDQsCisgICAgT1VUIGJ1ZmZlcnNfZmx1c2hlZCBpbnQ0KQorQVMg J01PRFVMRV9QQVRITkFNRScsICdwZ19idWZmZXJjYWNoZV9ldmljdF9yZWxhdGlvbicKK0xBTkdV QUdFIEMgUEFSQUxMRUwgU0FGRSBWT0xBVElMRSBTVFJJQ1Q7CisKK0NSRUFURSBGVU5DVElPTiBw Z19idWZmZXJjYWNoZV9ldmljdF9hbGwoCisgICAgT1VUIGJ1ZmZlcnNfcHJvY2Vzc2VkIGludDQs CisgICAgT1VUIGJ1ZmZlcnNfZXZpY3RlZCBpbnQ0LAorICAgIE9VVCBidWZmZXJzX2ZsdXNoZWQg aW50NCkKK0FTICdNT0RVTEVfUEFUSE5BTUUnLCAncGdfYnVmZmVyY2FjaGVfZXZpY3RfYWxsJwor TEFOR1VBR0UgQyBQQVJBTExFTCBTQUZFIFZPTEFUSUxFOwpkaWZmIC0tZ2l0IGEvY29udHJpYi9w Z19idWZmZXJjYWNoZS9wZ19idWZmZXJjYWNoZS5jb250cm9sIGIvY29udHJpYi9wZ19idWZmZXJj YWNoZS9wZ19idWZmZXJjYWNoZS5jb250cm9sCmluZGV4IDVlZTg3NWY3N2RkLi5iMDMwYmEzYTZm YSAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ19idWZmZXJjYWNoZS9wZ19idWZmZXJjYWNoZS5jb250 cm9sCisrKyBiL2NvbnRyaWIvcGdfYnVmZmVyY2FjaGUvcGdfYnVmZmVyY2FjaGUuY29udHJvbApA QCAtMSw1ICsxLDUgQEAKICMgcGdfYnVmZmVyY2FjaGUgZXh0ZW5zaW9uCiBjb21tZW50ID0gJ2V4 YW1pbmUgdGhlIHNoYXJlZCBidWZmZXIgY2FjaGUnCi1kZWZhdWx0X3ZlcnNpb24gPSAnMS41Jwor ZGVmYXVsdF92ZXJzaW9uID0gJzEuNicKIG1vZHVsZV9wYXRobmFtZSA9ICckbGliZGlyL3BnX2J1 ZmZlcmNhY2hlJwogcmVsb2NhdGFibGUgPSB0cnVlCmRpZmYgLS1naXQgYS9jb250cmliL3BnX2J1 ZmZlcmNhY2hlL3BnX2J1ZmZlcmNhY2hlX3BhZ2VzLmMgYi9jb250cmliL3BnX2J1ZmZlcmNhY2hl L3BnX2J1ZmZlcmNhY2hlX3BhZ2VzLmMKaW5kZXggNjI2MDJhZjE3NzUuLjNmZTJkYmNhNGJiIDEw MDY0NAotLS0gYS9jb250cmliL3BnX2J1ZmZlcmNhY2hlL3BnX2J1ZmZlcmNhY2hlX3BhZ2VzLmMK KysrIGIvY29udHJpYi9wZ19idWZmZXJjYWNoZS9wZ19idWZmZXJjYWNoZV9wYWdlcy5jCkBAIC05 LDE2ICs5LDIxIEBACiAjaW5jbHVkZSAicG9zdGdyZXMuaCIKIAogI2luY2x1ZGUgImFjY2Vzcy9o dHVwX2RldGFpbHMuaCIKKyNpbmNsdWRlICJhY2Nlc3MvcmVsYXRpb24uaCIKICNpbmNsdWRlICJj YXRhbG9nL3BnX3R5cGUuaCIKICNpbmNsdWRlICJmdW5jYXBpLmgiCiAjaW5jbHVkZSAic3RvcmFn ZS9idWZfaW50ZXJuYWxzLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9idWZtZ3IuaCIKKyNpbmNsdWRl ICJ1dGlscy9yZWwuaCIKIAogCiAjZGVmaW5lIE5VTV9CVUZGRVJDQUNIRV9QQUdFU19NSU5fRUxF TQk4CiAjZGVmaW5lIE5VTV9CVUZGRVJDQUNIRV9QQUdFU19FTEVNCTkKICNkZWZpbmUgTlVNX0JV RkZFUkNBQ0hFX1NVTU1BUllfRUxFTSA1CiAjZGVmaW5lIE5VTV9CVUZGRVJDQUNIRV9VU0FHRV9D T1VOVFNfRUxFTSA0CisjZGVmaW5lIE5VTV9CVUZGRVJDQUNIRV9FVklDVF9FTEVNIDIKKyNkZWZp bmUgTlVNX0JVRkZFUkNBQ0hFX0VWSUNUX1JFTEFUSU9OX0VMRU0gMworI2RlZmluZSBOVU1fQlVG RkVSQ0FDSEVfRVZJQ1RfQUxMX0VMRU0gMwogCiBQR19NT0RVTEVfTUFHSUNfRVhUKAogCQkJCQku bmFtZSA9ICJwZ19idWZmZXJjYWNoZSIsCkBAIC02Nyw2ICs3Miw4IEBAIFBHX0ZVTkNUSU9OX0lO Rk9fVjEocGdfYnVmZmVyY2FjaGVfcGFnZXMpOwogUEdfRlVOQ1RJT05fSU5GT19WMShwZ19idWZm ZXJjYWNoZV9zdW1tYXJ5KTsKIFBHX0ZVTkNUSU9OX0lORk9fVjEocGdfYnVmZmVyY2FjaGVfdXNh Z2VfY291bnRzKTsKIFBHX0ZVTkNUSU9OX0lORk9fVjEocGdfYnVmZmVyY2FjaGVfZXZpY3QpOwor UEdfRlVOQ1RJT05fSU5GT19WMShwZ19idWZmZXJjYWNoZV9ldmljdF9yZWxhdGlvbik7CitQR19G VU5DVElPTl9JTkZPX1YxKHBnX2J1ZmZlcmNhY2hlX2V2aWN0X2FsbCk7CiAKIERhdHVtCiBwZ19i dWZmZXJjYWNoZV9wYWdlcyhQR19GVU5DVElPTl9BUkdTKQpAQCAtMzUyLDIxICszNTksMTI4IEBA IHBnX2J1ZmZlcmNhY2hlX3VzYWdlX2NvdW50cyhQR19GVU5DVElPTl9BUkdTKQogCXJldHVybiAo RGF0dW0pIDA7CiB9CiAKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIHVz ZXIgaGFzIHN1cGVydXNlciBwcml2ZWxlZ2VzLgorICovCitzdGF0aWMgdm9pZAorcGdfYnVmZmVy Y2FjaGVfc3VwZXJ1c2VyX2NoZWNrKGNoYXIgKmZ1bmNfbmFtZSkKK3sKKwlpZiAoIXN1cGVydXNl cigpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfSU5TVUZGSUNJRU5U X1BSSVZJTEVHRSksCisJCQkJIGVycm1zZygibXVzdCBiZSBzdXBlcnVzZXIgdG8gdXNlICVzKCki LAorCQkJCQkJZnVuY19uYW1lKSkpOworfQorCiAvKgogICogVHJ5IHRvIGV2aWN0IGEgc2hhcmVk IGJ1ZmZlci4KICAqLwogRGF0dW0KIHBnX2J1ZmZlcmNhY2hlX2V2aWN0KFBHX0ZVTkNUSU9OX0FS R1MpCiB7Ci0JQnVmZmVyCQlidWYgPSBQR19HRVRBUkdfSU5UMzIoMCk7CisJRGF0dW0JCXJlc3Vs dDsKKwlUdXBsZURlc2MJdHVwbGVkZXNjOworCUhlYXBUdXBsZQl0dXBsZTsKKwlEYXR1bQkJdmFs dWVzW05VTV9CVUZGRVJDQUNIRV9FVklDVF9FTEVNXTsKKwlib29sCQludWxsc1tOVU1fQlVGRkVS Q0FDSEVfRVZJQ1RfRUxFTV0gPSB7MH07CiAKLQlpZiAoIXN1cGVydXNlcigpKQotCQllcmVwb3J0 KEVSUk9SLAotCQkJCShlcnJjb2RlKEVSUkNPREVfSU5TVUZGSUNJRU5UX1BSSVZJTEVHRSksCi0J CQkJIGVycm1zZygibXVzdCBiZSBzdXBlcnVzZXIgdG8gdXNlIHBnX2J1ZmZlcmNhY2hlX2V2aWN0 IGZ1bmN0aW9uIikpKTsKKwlCdWZmZXIJCWJ1ZiA9IFBHX0dFVEFSR19JTlQzMigwKTsKKwlib29s CQlmbHVzaGVkOworCisJaWYgKGdldF9jYWxsX3Jlc3VsdF90eXBlKGZjaW5mbywgTlVMTCwgJnR1 cGxlZGVzYykgIT0gVFlQRUZVTkNfQ09NUE9TSVRFKQorCQllbG9nKEVSUk9SLCAicmV0dXJuIHR5 cGUgbXVzdCBiZSBhIHJvdyB0eXBlIik7CisKKwlwZ19idWZmZXJjYWNoZV9zdXBlcnVzZXJfY2hl Y2soInBnX2J1ZmZlcmNhY2hlX2V2aWN0Iik7CiAKIAlpZiAoYnVmIDwgMSB8fCBidWYgPiBOQnVm ZmVycykKIAkJZWxvZyhFUlJPUiwgImJhZCBidWZmZXIgSUQ6ICVkIiwgYnVmKTsKIAotCVBHX1JF VFVSTl9CT09MKEV2aWN0VW5waW5uZWRCdWZmZXIoYnVmKSk7CisJdmFsdWVzWzBdID0gQm9vbEdl dERhdHVtKEV2aWN0VW5waW5uZWRCdWZmZXIoYnVmLCAmZmx1c2hlZCkpOworCXZhbHVlc1sxXSA9 IEJvb2xHZXREYXR1bShmbHVzaGVkKTsKKworCXR1cGxlID0gaGVhcF9mb3JtX3R1cGxlKHR1cGxl ZGVzYywgdmFsdWVzLCBudWxscyk7CisJcmVzdWx0ID0gSGVhcFR1cGxlR2V0RGF0dW0odHVwbGUp OworCisJUEdfUkVUVVJOX0RBVFVNKHJlc3VsdCk7Cit9CisKKy8qCisgKiBUcnkgdG8gZXZpY3Qg c3BlY2lmaWVkIHJlbGF0aW9uLgorICovCitEYXR1bQorcGdfYnVmZmVyY2FjaGVfZXZpY3RfcmVs YXRpb24oUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlEYXR1bQkJcmVzdWx0OworCVR1cGxlRGVzYwl0 dXBsZWRlc2M7CisJSGVhcFR1cGxlCXR1cGxlOworCURhdHVtCQl2YWx1ZXNbTlVNX0JVRkZFUkNB Q0hFX0VWSUNUX1JFTEFUSU9OX0VMRU1dOworCWJvb2wJCW51bGxzW05VTV9CVUZGRVJDQUNIRV9F VklDVF9SRUxBVElPTl9FTEVNXSA9IHswfTsKKworCU9pZAkJCXJlbE9pZDsKKwlSZWxhdGlvbgly ZWw7CisJaW50MzIJCWJ1ZmZlcnNfcHJvY2Vzc2VkID0gMDsKKwlpbnQzMgkJYnVmZmVyc19ldmlj dGVkID0gMDsKKwlpbnQzMgkJYnVmZmVyc19mbHVzaGVkID0gMDsKKworCWlmIChnZXRfY2FsbF9y ZXN1bHRfdHlwZShmY2luZm8sIE5VTEwsICZ0dXBsZWRlc2MpICE9IFRZUEVGVU5DX0NPTVBPU0lU RSkKKwkJZWxvZyhFUlJPUiwgInJldHVybiB0eXBlIG11c3QgYmUgYSByb3cgdHlwZSIpOworCisJ cGdfYnVmZmVyY2FjaGVfc3VwZXJ1c2VyX2NoZWNrKCJwZ19idWZmZXJjYWNoZV9ldmljdF9yZWxh dGlvbiIpOworCisJcmVsT2lkID0gUEdfR0VUQVJHX09JRCgwKTsKKworCXJlbCA9IHJlbGF0aW9u X29wZW4ocmVsT2lkLCBBY2Nlc3NTaGFyZUxvY2spOworCisJaWYgKFJlbGF0aW9uVXNlc0xvY2Fs QnVmZmVycyhyZWwpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfSU5W QUxJRF9QQVJBTUVURVJfVkFMVUUpLAorCQkJCSBlcnJtc2coInJlbGF0aW9uIHVzZXMgbG9jYWwg YnVmZmVycywgJXMoKSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBzaGFyZWQgYnVmZmVycyBv bmx5IiwKKwkJCQkJCSJwZ19idWZmZXJjYWNoZV9ldmljdF9yZWxhdGlvbiIpKSk7CisKKwlFdmlj dFJlbFVucGlubmVkQnVmZmVycyhyZWwsICZidWZmZXJzX3Byb2Nlc3NlZCwgJmJ1ZmZlcnNfZXZp Y3RlZCwKKwkJCQkJCQkmYnVmZmVyc19mbHVzaGVkKTsKKworCXJlbGF0aW9uX2Nsb3NlKHJlbCwg QWNjZXNzU2hhcmVMb2NrKTsKKworCXZhbHVlc1swXSA9IEludDMyR2V0RGF0dW0oYnVmZmVyc19w cm9jZXNzZWQpOworCXZhbHVlc1sxXSA9IEludDMyR2V0RGF0dW0oYnVmZmVyc19ldmljdGVkKTsK Kwl2YWx1ZXNbMl0gPSBJbnQzMkdldERhdHVtKGJ1ZmZlcnNfZmx1c2hlZCk7CisKKwl0dXBsZSA9 IGhlYXBfZm9ybV90dXBsZSh0dXBsZWRlc2MsIHZhbHVlcywgbnVsbHMpOworCXJlc3VsdCA9IEhl YXBUdXBsZUdldERhdHVtKHR1cGxlKTsKKworCVBHX1JFVFVSTl9EQVRVTShyZXN1bHQpOworfQor CisKKy8qCisgKiBUcnkgdG8gZXZpY3QgYWxsIHNoYXJlZCBidWZmZXJzLgorICovCitEYXR1bQor cGdfYnVmZmVyY2FjaGVfZXZpY3RfYWxsKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJRGF0dW0JCXJl c3VsdDsKKwlUdXBsZURlc2MJdHVwbGVkZXNjOworCUhlYXBUdXBsZQl0dXBsZTsKKwlEYXR1bQkJ dmFsdWVzW05VTV9CVUZGRVJDQUNIRV9FVklDVF9BTExfRUxFTV07CisJYm9vbAkJbnVsbHNbTlVN X0JVRkZFUkNBQ0hFX0VWSUNUX0FMTF9FTEVNXSA9IHswfTsKKworCWludDMyCQlidWZmZXJzX2V2 aWN0ZWQgPSAwOworCWludDMyCQlidWZmZXJzX2ZsdXNoZWQgPSAwOworCisJaWYgKGdldF9jYWxs X3Jlc3VsdF90eXBlKGZjaW5mbywgTlVMTCwgJnR1cGxlZGVzYykgIT0gVFlQRUZVTkNfQ09NUE9T SVRFKQorCQllbG9nKEVSUk9SLCAicmV0dXJuIHR5cGUgbXVzdCBiZSBhIHJvdyB0eXBlIik7CisK KwlwZ19idWZmZXJjYWNoZV9zdXBlcnVzZXJfY2hlY2soInBnX2J1ZmZlcmNhY2hlX2V2aWN0X2Fs bCIpOworCisJRXZpY3RBbGxVbnBpbm5lZEJ1ZmZlcnMoJmJ1ZmZlcnNfZXZpY3RlZCwgJmJ1ZmZl cnNfZmx1c2hlZCk7CisKKwl2YWx1ZXNbMF0gPSBJbnQzMkdldERhdHVtKE5CdWZmZXJzKTsKKwl2 YWx1ZXNbMV0gPSBJbnQzMkdldERhdHVtKGJ1ZmZlcnNfZXZpY3RlZCk7CisJdmFsdWVzWzJdID0g SW50MzJHZXREYXR1bShidWZmZXJzX2ZsdXNoZWQpOworCisJdHVwbGUgPSBoZWFwX2Zvcm1fdHVw bGUodHVwbGVkZXNjLCB2YWx1ZXMsIG51bGxzKTsKKwlyZXN1bHQgPSBIZWFwVHVwbGVHZXREYXR1 bSh0dXBsZSk7CisKKwlQR19SRVRVUk5fREFUVU0ocmVzdWx0KTsKIH0KZGlmZiAtLWdpdCBhL2Nv bnRyaWIvcGdfYnVmZmVyY2FjaGUvc3FsL3BnX2J1ZmZlcmNhY2hlLnNxbCBiL2NvbnRyaWIvcGdf YnVmZmVyY2FjaGUvc3FsL3BnX2J1ZmZlcmNhY2hlLnNxbAppbmRleCA5NDRmYmIxYmVhZS4uMmM0 YmQ4YzFlOWUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdfYnVmZmVyY2FjaGUvc3FsL3BnX2J1ZmZl cmNhY2hlLnNxbAorKysgYi9jb250cmliL3BnX2J1ZmZlcmNhY2hlL3NxbC9wZ19idWZmZXJjYWNo ZS5zcWwKQEAgLTI2LDMgKzI2LDQ0IEBAIFNFVCBST0xFIHBnX21vbml0b3I7CiBTRUxFQ1QgY291 bnQoKikgPiAwIEZST00gcGdfYnVmZmVyY2FjaGU7CiBTRUxFQ1QgYnVmZmVyc191c2VkICsgYnVm ZmVyc191bnVzZWQgPiAwIEZST00gcGdfYnVmZmVyY2FjaGVfc3VtbWFyeSgpOwogU0VMRUNUIGNv dW50KCopID4gMCBGUk9NIHBnX2J1ZmZlcmNhY2hlX3VzYWdlX2NvdW50cygpOworUkVTRVQgcm9s ZTsKKworLS0tLS0tCistLS0tIFRlc3QgcGdfYnVmZmVyY2FjaGVfZXZpY3QqIGZ1bmN0aW9ucwor LS0tLS0tCisKK0NSRUFURSBST0xFIHJlZ3Jlc3NfYnVmZmVyY2FjaGVfbm9ybWFsOworU0VUIFJP TEUgcmVncmVzc19idWZmZXJjYWNoZV9ub3JtYWw7CisKKy0tIFRoZXNlIHNob3VsZCBmYWlsIGJl Y2F1c2UgdGhlc2UgYXJlIFNUUklDVCBmdW5jdGlvbnMKK1NFTEVDVCAqIEZST00gcGdfYnVmZmVy Y2FjaGVfZXZpY3QoKTsKK1NFTEVDVCAqIEZST00gcGdfYnVmZmVyY2FjaGVfZXZpY3RfcmVsYXRp b24oKTsKKworLS0gVGhlc2Ugc2hvdWxkIGZhaWwgYmVjYXVzZSB0aGV5IG5lZWQgdG8gYmUgY2Fs bGVkIGFzIFNVUEVSVVNFUgorU0VMRUNUICogRlJPTSBwZ19idWZmZXJjYWNoZV9ldmljdCgxKTsK K1NFTEVDVCAqIEZST00gcGdfYnVmZmVyY2FjaGVfZXZpY3RfcmVsYXRpb24oMSk7CitTRUxFQ1Qg KiBGUk9NIHBnX2J1ZmZlcmNhY2hlX2V2aWN0X2FsbCgpOworCitSRVNFVCBST0xFOworCistLSBU aGVzZSBzaG91bGQgZmFpbCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBjYWxsZWQgYnkgdmFsaWQgcmFu Z2Ugb2YgYnVmZmVycworLS0gTnVtYmVyIG9mIHRoZSBzaGFyZWQgYnVmZmVycyBhcmUgbGltaXRl ZCBieSBtYXggaW50ZWdlcgorU0VMRUNUIDIxNDc0ODM2NDcgbWF4X2J1ZmZlcnMgXGdzZXQKK1NF TEVDVCAqIEZST00gcGdfYnVmZmVyY2FjaGVfZXZpY3QoMCk7CitTRUxFQ1QgKiBGUk9NIHBnX2J1 ZmZlcmNhY2hlX2V2aWN0KDptYXhfYnVmZmVycyk7CisKKy0tIFRoaXMgc2hvdWxkIGZhaWwgYmVj YXVzZSBwZ19idWZmZXJjYWNoZV9ldmljdF9yZWxhdGlvbigpIGRvZXNuJ3QgYWNjZXB0CistLSBs b2NhbCByZWxhdGlvbnMKK0NSRUFURSBURU1QIFRBQkxFIHRlbXBfcGdfYnVmZmVyY2FjaGUoKTsK K1NFTEVDVCAqIEZST00gcGdfYnVmZmVyY2FjaGVfZXZpY3RfcmVsYXRpb24oJ3RlbXBfcGdfYnVm ZmVyY2FjaGUnKTsKK0RST1AgVEFCTEUgdGVtcF9wZ19idWZmZXJjYWNoZTsKKworLS0gVGhlc2Ug c2hvdWxkbid0IGZhaWwKK1NFTEVDVCBDT1VOVCgqKSA+IDAgRlJPTSBwZ19idWZmZXJjYWNoZV9l dmljdCgxKTsKK1NFTEVDVCBDT1VOVCgqKSA+IDAgRlJPTSBwZ19idWZmZXJjYWNoZV9ldmljdF9h bGwoKTsKK0NSRUFURSBUQUJMRSBzaGFyZWRfcGdfYnVmZmVyY2FjaGUoKTsKK1NFTEVDVCBDT1VO VCgqKSA+IDAgRlJPTSBwZ19idWZmZXJjYWNoZV9ldmljdF9yZWxhdGlvbignc2hhcmVkX3BnX2J1 ZmZlcmNhY2hlJyk7CitEUk9QIFRBQkxFIHNoYXJlZF9wZ19idWZmZXJjYWNoZTsKKworUkVTRVQg Uk9MRTsKK0RST1AgUk9MRSByZWdyZXNzX2J1ZmZlcmNhY2hlX25vcm1hbDsKLS0gCjIuNDkuMAoK --00000000000018a38d063232dc61--