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 1sZvlx-005KK2-Le for pgsql-hackers@arkaria.postgresql.org; Fri, 02 Aug 2024 17:08:57 +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 1sZvlw-002EYS-4t for pgsql-hackers@arkaria.postgresql.org; Fri, 02 Aug 2024 17:08:56 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sZvlv-002EYK-M8 for pgsql-hackers@lists.postgresql.org; Fri, 02 Aug 2024 17:08:55 +0000 Received: from mail-ej1-x634.google.com ([2a00:1450:4864:20::634]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sZvls-002o2W-V9 for pgsql-hackers@postgresql.org; Fri, 02 Aug 2024 17:08:55 +0000 Received: by mail-ej1-x634.google.com with SMTP id a640c23a62f3a-a7a8caef11fso982156566b.0 for ; Fri, 02 Aug 2024 10:08:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1722618531; x=1723223331; darn=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=6M0PWnz9906jV3WfkMDMa8sZQgvCTh3oU1x6suFvI/g=; b=J6VPp9rvM7KsS9GrhjM1qmqXQRnZ+WrTEgrcDcfzBBqVekjVmTEAm/TJ/OlhpAiIZT lDwTd/S0iF2iAKbwGcixl79kZevKtDAgSIsmmk7IMwg7Uc2BXWOBxhRPhiFlUCCWVSP6 Duhy8RIyyHh9QDzNbHM3yFoppTP1PMsR0uAVtpkf9VV515ouMj6TlT/epqmTd1r9eynJ 6xsj/jZg5/+6/D8u9BTa163rlVYNXGN3OPUCJlCmehO9H5e+tQ+n+IbEhSLn4VcDQAVh mfU/HODBGqh8eT7nPMFulgEGEYUXYQfYm8s9drM7cLC5oB6zxAZJdcWKk8qVUEDKLh3s Ffrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722618531; x=1723223331; 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=6M0PWnz9906jV3WfkMDMa8sZQgvCTh3oU1x6suFvI/g=; b=CjF4a1bLBCvx2C9tTlUbheMp8LcYUtzlZE7qBegOQcyF0V+BXbigO74yxDgXKui5Vf DA03NwV6h/hhipxj/JSULLfrFCmsWD8wJxNfbII6U6Xr+thxqU7OzTzHPLmSQ26rVGAK ppmgDgBssT4G6kykiROOXZwvv0TwYZ+HMgclHPZYCzMO8FqocH2tqygzAMDAg7qY5a6N EgoMzo5ZWhKR/9oo8aMQ3HQ0v0F6TSGRadGb9cQeCcPCw4MES++2hjD92HyZ08xrPgEf NbZdJZ6cmTcnLwHG0DI/FZM4pJ6DG/wThDkeNa+k/ixxf3jp8Q/DKnKTnWqpmUXTIrbz 15gw== X-Forwarded-Encrypted: i=1; AJvYcCUsG94cCONzn63uxbx9ZN1+dsGEMZiug3S1PVyW1RLSyGCxx1R63ncEuFk2/hG9Eg/6O8FvBTKJPTZ84srTnmpto++WrQjE+mIrDdMu X-Gm-Message-State: AOJu0Yyxa8mEqolkMKFP4Qs3l3r3la9YD1sRYJNDs+JQD/sgfY5g/JhT zu0cdYtPb/6km3uGnHwl2BlPnB1jbHPHPRO3bmpuPsUK/mrSTZ0+Nzf6Sa1rVC2sUBL5Wftouag pWA5s4H25hQyf2K7jkGonnrtqL6A= X-Google-Smtp-Source: AGHT+IE/IoivZQJKRtaI1I4kbKTNNxH3J2IY1pku0i5ywaMSaHjjQCoVo4hshCYDEJrZ8FjdDu63qA3sGb1TbALuGHU= X-Received: by 2002:a17:907:6ea1:b0:a7a:93c9:3925 with SMTP id a640c23a62f3a-a7dc4dc1853mr300640366b.6.1722618530735; Fri, 02 Aug 2024 10:08:50 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Michail Nikolaev Date: Fri, 2 Aug 2024 19:08:39 +0200 Message-ID: Subject: Re: [BUG?] check_exclusion_or_unique_constraint false negative To: Amit Kapila Cc: "Hayato Kuroda (Fujitsu)" , PostgreSQL Hackers , Andres Freund Content-Type: multipart/mixed; boundary="0000000000009bca77061eb6610b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000009bca77061eb6610b Content-Type: multipart/alternative; boundary="0000000000009bca77061eb66109" --0000000000009bca77061eb66109 Content-Type: text/plain; charset="UTF-8" Hello, Amit! > I think it is rather less likely or not possible in a parallel apply > case because such conflicting updates (updates on the same tuple) > should be serialized at the publisher itself. So one of the updates > will be after the commit that has the second update. Glad to hear! But anyway, such logic looks very fragile to me. > I haven't tried the test based on your description of the general > problem with DirtySnapshot scan. In case of logical replication, we > will LOG update_missing type of conflict and the user may need to take > some manual action based on that. Current it is just DEBUG1, so it will be probably missed by the user. > * XXX should this be promoted to ereport(LOG) perhaps? > */ > elog(DEBUG1, > "logical replication did not find row to be updated " > "in replication target relation \"%s\"", > RelationGetRelationName(localrel)); > } > I have not tried a test so I could > be wrong as well. I am not sure we can do anything specific to logical > replication for this but feel free to suggest if you have ideas to > solve this problem in general or specific to logical replication. I've implemented a solution to address the problem more generally, attached the patch (and also the link [1]). Here's a summary of the changes: * For each tuple skipped because it was deleted, we now accumulate the maximum xmax. * Before the scan begins, we store the value of the latest completed transaction. * If no tuples are found in the index, we check the max(xmax) value. If this value is newer than the latest completed transaction stored before the scan, it indicates that a tuple was deleted by another transaction after the scan started. To ensure all tuples are correctly processed we then rescan the index. Also added a test case to cover this scenario using the new injection point mechanism and updated the b-tree index documentation to include a description of this case. I'll add this into the next commitfest. Best regards, Mikhail. [1]: https://github.com/postgres/postgres/compare/master...michail-nikolaev:postgres:concurrent_unique --0000000000009bca77061eb66109 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello, Amit!

> I think it is r= ather less likely or not possible in a parallel apply
> case because = such conflicting updates (updates on the same tuple)
> should be seri= alized at the publisher itself. So one of the updates
> will be after= the commit that has the second update.

Glad to hear! But anyway, su= ch logic looks very fragile to me.

> I haven't tried the test= based on your description of the general
> problem with DirtySnapsho= t scan. In case of logical replication, we
> will LOG update_missing = type of conflict and the user may need to take
> some manual action b= ased on that.

Current it is just DEBUG1, so it will be probably=C2= =A0missed by the user.

> * XXX should this be promoted to erep= ort(LOG) perhaps?
> */
> elog(DEBUG1,
> "logic= al replication did not find row to be updated "
> "in re= plication target relation \"%s\"",
> RelationGetRel= ationName(localrel));
> }

> I have not tried a test so I co= uld
> be wrong as well. I am not sure we can do anything specific to = logical
> replication for this but feel free to suggest if you have i= deas to
> solve this problem in general or specific to logical replic= ation.

I've implemented a solution to address the problem more g= enerally, attached the patch (and also the link [1]).

Here's a s= ummary of the changes:

* For each tuple skipped because it was delet= ed, we now accumulate the maximum xmax.
* Before the scan begins, we sto= re the value of the latest completed transaction.
* If no tuples are fou= nd in the index, we check the max(xmax) value. If this value is newer than = the latest completed transaction stored before the scan, it indicates that = a tuple was deleted by another transaction after the scan started. To ensur= e all tuples are correctly processed we then rescan the index.


Also added a test case to cover = this scenario using the new injection point mechanism and=C2=A0
updated = the b-tree index documentation to include a description of this case.
I'll add this into the next commitfest.

Best regards,
Mikha= il.

[1]: https://github.com/postgres/postgres/compare/master...michail-= nikolaev:postgres:concurrent_unique
--0000000000009bca77061eb66109-- --0000000000009bca77061eb6610b Content-Type: application/x-patch; name="v1-0001-fix-for-lost-record-in-case-of-DirtySnapshot-inde.patch" Content-Disposition: attachment; filename="v1-0001-fix-for-lost-record-in-case-of-DirtySnapshot-inde.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lzcvwe9r0 RnJvbSBiNjM5Mzc5YzM5M2M3MGNhMzIyYmFiNTcyMjI1MTNlNzFjOTZhZDc4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBua2V5IDxua2V5QHRvbG9rYS5haT4KRGF0ZTogRnJpLCAyIEF1 ZyAyMDI0IDE2OjIwOjMyICswMjAwClN1YmplY3Q6IFtQQVRDSCB2MV0gZml4IGZvciBsb3N0IHJl Y29yZCBpbiBjYXNlIG9mIERpcnR5U25hcHNob3QgaW5kZXggc2NhbnMgKwogZG9jcyArIHRlc3QK Ci0tLQogY29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXR0dXBsZS5jICAgICAgICAgICAgIHwgIDIg Ky0KIHNyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbV9oYW5kbGVyLmMgICAgICB8ICAyICst CiBzcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1fdmlzaWJpbGl0eS5jICAgfCAyMCArKysr KysrLQogc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9SRUFETUUgICAgICAgICAgICAgIHwgMTAg KysrKwogc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRpbnNlcnQuYyAgICAgICAgIHwgIDIg Ky0KIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3ZhcnN1cC5jICAgICAgICAgICB8IDExICsr KysrCiBzcmMvYmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcuYyAgICAgICAgICAgfCAyOSAr KysrKysrKysrKy0KIHNyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNSZXBsaWNhdGlvbi5jICAgICAg ICB8IDI2ICsrKysrKysrKy0KIHNyYy9iYWNrZW5kL3JlcGxpY2F0aW9uL2xvZ2ljYWwvb3JpZ2lu LmMgICAgICB8ICAyICstCiBzcmMvaW5jbHVkZS9hY2Nlc3MvdHJhbnNhbS5oICAgICAgICAgICAg ICAgICAgfCAxNiArKysrKysrCiBzcmMvaW5jbHVkZS91dGlscy9zbmFwbWdyLmggICAgICAgICAg ICAgICAgICAgfCAgOCArKystCiBzcmMvaW5jbHVkZS91dGlscy9zbmFwc2hvdC5oICAgICAgICAg ICAgICAgICAgfCAgNSArLQogLi4uL3Rlc3RfbWlzYy90LzAwNl9kaXJ0eV9pbmRleF9zY2FuLnBs ICAgICAgIHwgNDcgKysrKysrKysrKysrKysrKysrKwogMTMgZmlsZXMgY2hhbmdlZCwgMTY4IGlu c2VydGlvbnMoKyksIDEyIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0 L21vZHVsZXMvdGVzdF9taXNjL3QvMDA2X2RpcnR5X2luZGV4X3NjYW4ucGwKCmRpZmYgLS1naXQg YS9jb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdHR1cGxlLmMgYi9jb250cmliL3Bnc3RhdHR1cGxl L3Bnc3RhdHR1cGxlLmMKaW5kZXggM2JkOGI5NjE5Ny4uNGQxYjQ2OWQ4ZSAxMDA2NDQKLS0tIGEv Y29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXR0dXBsZS5jCisrKyBiL2NvbnRyaWIvcGdzdGF0dHVw bGUvcGdzdGF0dHVwbGUuYwpAQCAtMzMyLDcgKzMzMiw3IEBAIHBnc3RhdF9oZWFwKFJlbGF0aW9u IHJlbCwgRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8pCiAJc2NhbiA9IHRhYmxlX2JlZ2luc2Nhbl9z dHJhdChyZWwsIFNuYXBzaG90QW55LCAwLCBOVUxMLCB0cnVlLCBmYWxzZSk7CiAJaHNjYW4gPSAo SGVhcFNjYW5EZXNjKSBzY2FuOwogCi0JSW5pdERpcnR5U25hcHNob3QoU25hcHNob3REaXJ0eSk7 CisJSW5pdERpcnR5U25hcHNob3QoU25hcHNob3REaXJ0eSwgTlVMTCk7CiAKIAluYmxvY2tzID0g aHNjYW4tPnJzX25ibG9ja3M7CS8qICMgYmxvY2tzIHRvIGJlIHNjYW5uZWQgKi8KIApkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIuYyBiL3NyYy9iYWNr ZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbV9oYW5kbGVyLmMKaW5kZXggNmY4YjFiNzkyOS4uN2VhNGIy MDVkNSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIu YworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFuZGxlci5jCkBAIC00MDQs NyArNDA0LDcgQEAgdHVwbGVfbG9ja19yZXRyeToKIAkJCSAqCiAJCQkgKiBMb29wIGhlcmUgdG8g ZGVhbCB3aXRoIHVwZGF0ZWQgb3IgYnVzeSB0dXBsZXMKIAkJCSAqLwotCQkJSW5pdERpcnR5U25h cHNob3QoU25hcHNob3REaXJ0eSk7CisJCQlJbml0RGlydHlTbmFwc2hvdChTbmFwc2hvdERpcnR5 LCBOVUxMKTsKIAkJCWZvciAoOzspCiAJCQl7CiAJCQkJaWYgKEl0ZW1Qb2ludGVySW5kaWNhdGVz TW92ZWRQYXJ0aXRpb25zKHRpZCkpCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvaGVh cC9oZWFwYW1fdmlzaWJpbGl0eS5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX3Zp c2liaWxpdHkuYwppbmRleCA5MjQzZmVlZDAxLi45MWRlNWRjZWExIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1fdmlzaWJpbGl0eS5jCisrKyBiL3NyYy9iYWNrZW5k L2FjY2Vzcy9oZWFwL2hlYXBhbV92aXNpYmlsaXR5LmMKQEAgLTcxOSw2ICs3MTksMTIgQEAgSGVh cFR1cGxlU2F0aXNmaWVzVXBkYXRlKEhlYXBUdXBsZSBodHVwLCBDb21tYW5kSWQgY3VyY2lkLAog CQlyZXR1cm4gVE1fRGVsZXRlZDsJCS8qIGRlbGV0ZWQgYnkgb3RoZXIgKi8KIH0KIAoraW5saW5l IHN0YXRpYyB2b2lkIFVwZGF0ZURpcnR5TWF4WG1heChTbmFwc2hvdCBzbmFwc2hvdCwgVHJhbnNh Y3Rpb25JZCB4bWF4KQoreworCWlmIChzbmFwc2hvdC0+eGlwICE9IE5VTEwpCisJCXNuYXBzaG90 LT54aXBbMF0gPSBUcmFuc2FjdGlvbklkTmV3ZXIoeG1heCwgc25hcHNob3QtPnhpcFswXSk7Cit9 CisKIC8qCiAgKiBIZWFwVHVwbGVTYXRpc2ZpZXNEaXJ0eQogICoJCVRydWUgaWZmIGhlYXAgdHVw bGUgaXMgdmFsaWQgaW5jbHVkaW5nIGVmZmVjdHMgb2Ygb3BlbiB0cmFuc2FjdGlvbnMuCkBAIC03 MzcsNyArNzQzLDkgQEAgSGVhcFR1cGxlU2F0aXNmaWVzVXBkYXRlKEhlYXBUdXBsZSBodHVwLCBD b21tYW5kSWQgY3VyY2lkLAogICogU2ltaWxhcmx5IGZvciBzbmFwc2hvdC0+eG1heCBhbmQgdGhl IHR1cGxlJ3MgeG1heC4gIElmIHRoZSB0dXBsZSB3YXMKICAqIGluc2VydGVkIHNwZWN1bGF0aXZl bHksIG1lYW5pbmcgdGhhdCB0aGUgaW5zZXJ0ZXIgbWlnaHQgc3RpbGwgYmFjayBkb3duCiAgKiBv biB0aGUgaW5zZXJ0aW9uIHdpdGhvdXQgYWJvcnRpbmcgdGhlIHdob2xlIHRyYW5zYWN0aW9uLCB0 aGUgYXNzb2NpYXRlZAotICogdG9rZW4gaXMgYWxzbyByZXR1cm5lZCBpbiBzbmFwc2hvdC0+c3Bl Y3VsYXRpdmVUb2tlbi4KKyAqIHRva2VuIGlzIGFsc28gcmV0dXJuZWQgaW4gc25hcHNob3QtPnNw ZWN1bGF0aXZlVG9rZW4uIElmIHhpcCBpcyAhPSBOVUxMCisgKiB4aXBbMF0gbWF5IGJlIHNldCB0 byB4aWQgb2YgZGVsZXRlciBpZiBpdCBuZXdlciB0aGFuIHByZXZpb3VzbHkgc3RvcmUKKyAqIHZh bHVlLgogICovCiBzdGF0aWMgYm9vbAogSGVhcFR1cGxlU2F0aXNmaWVzRGlydHkoSGVhcFR1cGxl IGh0dXAsIFNuYXBzaG90IHNuYXBzaG90LApAQCAtNzUwLDYgKzc1OCwxMCBAQCBIZWFwVHVwbGVT YXRpc2ZpZXNEaXJ0eShIZWFwVHVwbGUgaHR1cCwgU25hcHNob3Qgc25hcHNob3QsCiAKIAlzbmFw c2hvdC0+eG1pbiA9IHNuYXBzaG90LT54bWF4ID0gSW52YWxpZFRyYW5zYWN0aW9uSWQ7CiAJc25h cHNob3QtPnNwZWN1bGF0aXZlVG9rZW4gPSAwOworCS8qCisJICogV2UgaW50ZW50aW9uYWxseSBr ZWVwIHNuYXBzaG90LT54aXAgdmFsdWVzIHVuY2hhbmdlZCBhcyB0aGV5IHNob3VsZAorCSAqIGJl IHJlc2V0IGJ5IGxvZ2ljIG91dCBvZiB0aGUgc2luZ2xlIGhlYXAgZmV0Y2guCisJICovCiAKIAlp ZiAoIUhlYXBUdXBsZUhlYWRlclhtaW5Db21taXR0ZWQodHVwbGUpKQogCXsKQEAgLTg3MCw2ICs4 ODIsNyBAQCBIZWFwVHVwbGVTYXRpc2ZpZXNEaXJ0eShIZWFwVHVwbGUgaHR1cCwgU25hcHNob3Qg c25hcHNob3QsCiAJewogCQlpZiAoSEVBUF9YTUFYX0lTX0xPQ0tFRF9PTkxZKHR1cGxlLT50X2lu Zm9tYXNrKSkKIAkJCXJldHVybiB0cnVlOworCQlVcGRhdGVEaXJ0eU1heFhtYXgoc25hcHNob3Qs IEhlYXBUdXBsZUhlYWRlckdldFJhd1htYXgodHVwbGUpKTsKIAkJcmV0dXJuIGZhbHNlOwkJCS8q IHVwZGF0ZWQgYnkgb3RoZXIgKi8KIAl9CiAKQEAgLTg5Myw3ICs5MDYsMTAgQEAgSGVhcFR1cGxl U2F0aXNmaWVzRGlydHkoSGVhcFR1cGxlIGh0dXAsIFNuYXBzaG90IHNuYXBzaG90LAogCQkJcmV0 dXJuIHRydWU7CiAJCX0KIAkJaWYgKFRyYW5zYWN0aW9uSWREaWRDb21taXQoeG1heCkpCisJCXsK KwkJCVVwZGF0ZURpcnR5TWF4WG1heChzbmFwc2hvdCwgeG1heCk7CiAJCQlyZXR1cm4gZmFsc2U7 CisJCX0KIAkJLyogaXQgbXVzdCBoYXZlIGFib3J0ZWQgb3IgY3Jhc2hlZCAqLwogCQlyZXR1cm4g dHJ1ZTsKIAl9CkBAIC05MDIsNiArOTE4LDcgQEAgSGVhcFR1cGxlU2F0aXNmaWVzRGlydHkoSGVh cFR1cGxlIGh0dXAsIFNuYXBzaG90IHNuYXBzaG90LAogCXsKIAkJaWYgKEhFQVBfWE1BWF9JU19M T0NLRURfT05MWSh0dXBsZS0+dF9pbmZvbWFzaykpCiAJCQlyZXR1cm4gdHJ1ZTsKKwkJVXBkYXRl RGlydHlNYXhYbWF4KHNuYXBzaG90LCBIZWFwVHVwbGVIZWFkZXJHZXRSYXdYbWF4KHR1cGxlKSk7 CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTkzMSw2ICs5NDgsNyBAQCBIZWFwVHVwbGVTYXRp c2ZpZXNEaXJ0eShIZWFwVHVwbGUgaHR1cCwgU25hcHNob3Qgc25hcHNob3QsCiAKIAlTZXRIaW50 Qml0cyh0dXBsZSwgYnVmZmVyLCBIRUFQX1hNQVhfQ09NTUlUVEVELAogCQkJCUhlYXBUdXBsZUhl YWRlckdldFJhd1htYXgodHVwbGUpKTsKKwlVcGRhdGVEaXJ0eU1heFhtYXgoc25hcHNob3QsIEhl YXBUdXBsZUhlYWRlckdldFJhd1htYXgodHVwbGUpKTsKIAlyZXR1cm4gZmFsc2U7CQkJCS8qIHVw ZGF0ZWQgYnkgb3RoZXIgKi8KIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL25i dHJlZS9SRUFETUUgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL1JFQURNRQppbmRleCA1MmU2 NDZjN2Y3Li42ZGU3MmEyOWNhIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVl L1JFQURNRQorKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL1JFQURNRQpAQCAtNDg5LDYg KzQ4OSwxNiBAQCBvbiB0aGUgbGVhZiBwYWdlIGF0IGFsbCB3aGVuIHRoZSBwYWdlJ3MgTFNOIGhh cyBjaGFuZ2VkLiAgKFRoYXQgd29uJ3Qgd29yawogd2l0aCBhbiB1bmxvZ2dlZCBpbmRleCwgc28g Zm9yIG5vdyB3ZSBkb24ndCBldmVyIGFwcGx5IHRoZSAiZG9uJ3QgaG9sZAogb250byBwaW4iIG9w dGltaXphdGlvbiB0aGVyZS4pCiAKK0Rlc3BpdGUgdGhlIGxvY2tpbmcgcHJvdG9jb2wgaW4gcGxh Y2UsIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIHJlY2VpdmUgYW4KK2luY29ycmVjdCByZXN1bHQg ZHVyaW5nIG5vbi1NVkNDIHNjYW5zLiBUaGlzIGlzc3VlIGNhbiBvY2N1ciBpZiBhIGNvbmN1cnJl bnQKK3RyYW5zYWN0aW9uIGRlbGV0ZXMgYSB0dXBsZSBhbmQgaW5zZXJ0cyBhIG5ldyB0dXBsZSB3 aXRoIGEgbmV3IFRJRCBpbiB0aGUKK3NhbWUgcGFnZS4gSWYgdGhlIHNjYW4gaGFzIGFscmVhZHkg dmlzaXRlZCB0aGUgcGFnZSBhbmQgY2FjaGVkIGl0cyBjb250ZW50CitpbiB0aGUgYnVmZmVyIGNh Y2hlLCBpdCBtaWdodCBza2lwIHRoZSBvbGQgdHVwbGUgZHVlIHRvIGRlbGV0aW9uIGFuZCBtaXNz Cit0aGUgbmV3IHR1cGxlIGJlY2F1c2Ugb2YgdGhlIGNhY2hlLiBUaGlzIGlzIGEga25vd24gbGlt aXRhdGlvbiBvZiB0aGUKK1NuYXBzaG90RGlydHkgYW5kIFNuYXBzaG90QW55IG5vbi1NVkNDIHNj YW5zLiBIb3dldmVyLCBmb3IgU25hcHNob3REaXJ0eSwKK2l0IGlzIHBvc3NpYmxlIHRvIHdvcmsg YXJvdW5kIHRoaXMgbGltaXRhdGlvbiBieSB1c2luZyB0aGUgcmV0dXJuZWQgbWF4KHhtYXgpCit0 byBjb21wYXJlIGl0IHdpdGggdGhlIGxhdGVzdCBjb21taXR0ZWQgdHJhbnNhY3Rpb24gYmVmb3Jl IHRoZSBzY2FuIHN0YXJ0ZWQuCisKIEZhc3RwYXRoIEZvciBJbmRleCBJbnNlcnRpb24KIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNz L25idHJlZS9uYnRpbnNlcnQuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0aW5zZXJ0 LmMKaW5kZXggN2U4OTAyZTQ4Yy4uOTQzYWVlMDg3YSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv YWNjZXNzL25idHJlZS9uYnRpbnNlcnQuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVl L25idGluc2VydC5jCkBAIC00MjcsNyArNDI3LDcgQEAgX2J0X2NoZWNrX3VuaXF1ZShSZWxhdGlv biByZWwsIEJUSW5zZXJ0U3RhdGUgaW5zZXJ0c3RhdGUsIFJlbGF0aW9uIGhlYXBSZWwsCiAJLyog QXNzdW1lIHVuaXF1ZSB1bnRpbCB3ZSBmaW5kIGEgZHVwbGljYXRlICovCiAJKmlzX3VuaXF1ZSA9 IHRydWU7CiAKLQlJbml0RGlydHlTbmFwc2hvdChTbmFwc2hvdERpcnR5KTsKKwlJbml0RGlydHlT bmFwc2hvdChTbmFwc2hvdERpcnR5LCBOVUxMKTsKIAogCXBhZ2UgPSBCdWZmZXJHZXRQYWdlKGlu c2VydHN0YXRlLT5idWYpOwogCW9wYXF1ZSA9IEJUUGFnZUdldE9wYXF1ZShwYWdlKTsKZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3ZhcnN1cC5jIGIvc3JjL2JhY2tlbmQv YWNjZXNzL3RyYW5zYW0vdmFyc3VwLmMKaW5kZXggZmI2YTg2YWZjYi4uNTIxMDk2MzViNCAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vdmFyc3VwLmMKKysrIGIvc3JjL2Jh Y2tlbmQvYWNjZXNzL3RyYW5zYW0vdmFyc3VwLmMKQEAgLTI5Niw2ICsyOTYsMTcgQEAgUmVhZE5l eHRGdWxsVHJhbnNhY3Rpb25JZCh2b2lkKQogCXJldHVybiBmdWxsWGlkOwogfQogCitGdWxsVHJh bnNhY3Rpb25JZCBSZWFkTGFzdENvbXBsZXRlZEZ1bGxUcmFuc2FjdGlvbklkKHZvaWQpCit7CisJ RnVsbFRyYW5zYWN0aW9uSWQgZnVsbFhpZDsKKworCUxXTG9ja0FjcXVpcmUoWGlkR2VuTG9jaywg TFdfU0hBUkVEKTsKKwlmdWxsWGlkID0gVHJhbnNhbVZhcmlhYmxlcy0+bGF0ZXN0Q29tcGxldGVk WGlkOworCUxXTG9ja1JlbGVhc2UoWGlkR2VuTG9jayk7CisKKwlyZXR1cm4gZnVsbFhpZDsKK30K KwogLyoKICAqIEFkdmFuY2UgbmV4dFhpZCB0byB0aGUgdmFsdWUgYWZ0ZXIgYSBnaXZlbiB4aWQu ICBUaGUgZXBvY2ggaXMgaW5mZXJyZWQuCiAgKiBUaGlzIG11c3Qgb25seSBiZSBjYWxsZWQgZHVy aW5nIHJlY292ZXJ5IG9yIGZyb20gdHdvLXBoYXNlIHN0YXJ0LXVwIGNvZGUuCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcuYyBiL3NyYy9iYWNrZW5kL2V4ZWN1 dG9yL2V4ZWNJbmRleGluZy5jCmluZGV4IDlmMDViMzY1NGMuLjQ1NzY3YjRlMjAgMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNJbmRleGluZy5jCisrKyBiL3NyYy9iYWNrZW5k L2V4ZWN1dG9yL2V4ZWNJbmRleGluZy5jCkBAIC0xMTUsNiArMTE1LDcgQEAKICNpbmNsdWRlICJu b2Rlcy9ub2RlRnVuY3MuaCIKICNpbmNsdWRlICJzdG9yYWdlL2xtZ3IuaCIKICNpbmNsdWRlICJ1 dGlscy9zbmFwbWdyLmgiCisjaW5jbHVkZSAidXRpbHMvaW5qZWN0aW9uX3BvaW50LmgiCiAKIC8q IHdhaXRNb2RlIGFyZ3VtZW50IHRvIGNoZWNrX2V4Y2x1c2lvbl9vcl91bmlxdWVfY29uc3RyYWlu dCgpICovCiB0eXBlZGVmIGVudW0KQEAgLTcwMiw2ICs3MDMsOCBAQCBjaGVja19leGNsdXNpb25f b3JfdW5pcXVlX2NvbnN0cmFpbnQoUmVsYXRpb24gaGVhcCwgUmVsYXRpb24gaW5kZXgsCiAJSW5k ZXhTY2FuRGVzYyBpbmRleF9zY2FuOwogCVNjYW5LZXlEYXRhIHNjYW5rZXlzW0lOREVYX01BWF9L RVlTXTsKIAlTbmFwc2hvdERhdGEgRGlydHlTbmFwc2hvdDsKKwlUcmFuc2FjdGlvbklkIG1heFht YXgsCisJCQkJICBsYXRlc3RDb21wbGV0ZWRYaWQ7CiAJaW50CQkJaTsKIAlib29sCQljb25mbGlj dDsKIAlib29sCQlmb3VuZF9zZWxmOwpAQCAtNzM4LDkgKzc0MSwxMCBAQCBjaGVja19leGNsdXNp b25fb3JfdW5pcXVlX2NvbnN0cmFpbnQoUmVsYXRpb24gaGVhcCwgUmVsYXRpb24gaW5kZXgsCiAK IAkvKgogCSAqIFNlYXJjaCB0aGUgdHVwbGVzIHRoYXQgYXJlIGluIHRoZSBpbmRleCBmb3IgYW55 IHZpb2xhdGlvbnMsIGluY2x1ZGluZwotCSAqIHR1cGxlcyB0aGF0IGFyZW4ndCB2aXNpYmxlIHll dC4KKwkgKiB0dXBsZXMgdGhhdCBhcmVuJ3QgdmlzaWJsZSB5ZXQuIEFsc28sIGRldGVjdCBjYXNl cyBpbmRleCBzY2FuIHNraXAgdGhlCisJICogdHVwbGUgaW4gY2FzZSBvZiBwYXJhbGxlbCB1cGRh dGUgYWZ0ZXIgaW5kZXggcGFnZSBjb250ZW50IHdhcyBjYWNoZWQuCiAJICovCi0JSW5pdERpcnR5 U25hcHNob3QoRGlydHlTbmFwc2hvdCk7CisJSW5pdERpcnR5U25hcHNob3QoRGlydHlTbmFwc2hv dCwgJm1heFhtYXgpOwogCiAJZm9yIChpID0gMDsgaSA8IGluZG5rZXlhdHRzOyBpKyspCiAJewpA QCAtNzc0LDYgKzc3OCwxMiBAQCBjaGVja19leGNsdXNpb25fb3JfdW5pcXVlX2NvbnN0cmFpbnQo UmVsYXRpb24gaGVhcCwgUmVsYXRpb24gaW5kZXgsCiByZXRyeToKIAljb25mbGljdCA9IGZhbHNl OwogCWZvdW5kX3NlbGYgPSBmYWxzZTsKKwkvKgorCSAqIEVhY2ggdGltZSB3ZSByZXRyeSAtIHJl bWVtYmVyIGxhc3QgY29tcGxldGVkIHRyYW5zYWN0aW9uIGJlZm9yZSBzdGFydAorCSAqIG9mIHRo ZSBzY2FuLiBBc28gcmVzZXQgbWF4WG1heC4KKwkgKi8KKwlsYXRlc3RDb21wbGV0ZWRYaWQgPSBY aWRGcm9tRnVsbFRyYW5zYWN0aW9uSWQoUmVhZExhc3RDb21wbGV0ZWRGdWxsVHJhbnNhY3Rpb25J ZCgpKTsKKwltYXhYbWF4ID0gSW52YWxpZFRyYW5zYWN0aW9uSWQ7CiAJaW5kZXhfc2NhbiA9IGlu ZGV4X2JlZ2luc2NhbihoZWFwLCBpbmRleCwgJkRpcnR5U25hcHNob3QsIGluZG5rZXlhdHRzLCAw KTsKIAlpbmRleF9yZXNjYW4oaW5kZXhfc2Nhbiwgc2NhbmtleXMsIGluZG5rZXlhdHRzLCBOVUxM LCAwKTsKIApAQCAtODg5LDYgKzg5OSwxOSBAQCByZXRyeToKIAl9CiAKIAlpbmRleF9lbmRzY2Fu KGluZGV4X3NjYW4pOworCS8qCisJICogQ2hlY2sgZm9yIHRoZSBjYXNlIHdoZW4gaW5kZXggc2Nh biBmZXRjaGVkIHJlY29yZHMgYmVmb3JlIHNvbWUgb3RoZXIKKwkgKiB0cmFuc2FjdGlvbiBkZWxl dGVkIHR1cGxlIGFuZCBpbnNlcnRlZCBhIG5ldyBvbmUuCisJICovCisJaWYgKCFjb25mbGljdCAm JiBUcmFuc2FjdGlvbklkSXNWYWxpZChtYXhYbWF4KSAmJiAhVHJhbnNhY3Rpb25JZElzQ3VycmVu dFRyYW5zYWN0aW9uSWQobWF4WG1heCkpCisJeworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIHNraXBw ZWQgc29tZSB0dXBsZSBiZWNhdXNlIGl0IHdhcyBkZWxldGVkLCBidXQgZGVsZXRpb24gaGFwcGVu ZWQgYWZ0ZXIKKwkJICogc3RhcnQgb2YgdGhlIGluZGV4IHNjYW4gLSByZXRyeSB0byBiZSBzdXJl LgorCQkgKi8KKwkJaWYgKFRyYW5zYWN0aW9uSWRQcmVjZWRlcyhsYXRlc3RDb21wbGV0ZWRYaWQs IG1heFhtYXgpKQorCQkJZ290byByZXRyeTsKKwl9CiAKIAkvKgogCSAqIE9yZGluYXJpbHksIGF0 IHRoaXMgcG9pbnQgdGhlIHNlYXJjaCBzaG91bGQgaGF2ZSBmb3VuZCB0aGUgb3JpZ2luYWxseQpA QCAtOTAyLDYgKzkyNSw4IEBAIHJldHJ5OgogCiAJRXhlY0Ryb3BTaW5nbGVUdXBsZVRhYmxlU2xv dChleGlzdGluZ19zbG90KTsKIAorCWlmICghY29uZmxpY3QpCisJCUlOSkVDVElPTl9QT0lOVCgi Y2hlY2tfZXhjbHVzaW9uX29yX3VuaXF1ZV9jb25zdHJhaW50X25vX2NvbmZsaWN0Iik7CiAJcmV0 dXJuICFjb25mbGljdDsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhl Y1JlcGxpY2F0aW9uLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjUmVwbGljYXRpb24uYwpp bmRleCBkMGE4OWNkNTc3Li5mYmRkYjY0NDJiIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9leGVj dXRvci9leGVjUmVwbGljYXRpb24uYworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjUmVw bGljYXRpb24uYwpAQCAtMTgzLDYgKzE4Myw4IEBAIFJlbGF0aW9uRmluZFJlcGxUdXBsZUJ5SW5k ZXgoUmVsYXRpb24gcmVsLCBPaWQgaWR4b2lkLAogCUluZGV4U2NhbkRlc2Mgc2NhbjsKIAlTbmFw c2hvdERhdGEgc25hcDsKIAlUcmFuc2FjdGlvbklkIHh3YWl0OworCVRyYW5zYWN0aW9uSWQgbWF4 WG1heCwKKwkJCQkgIGxhdGVzdENvbXBsZXRlZFhpZDsKIAlSZWxhdGlvbglpZHhyZWw7CiAJYm9v bAkJZm91bmQ7CiAJVHlwZUNhY2hlRW50cnkgKiplcSA9IE5VTEw7CkBAIC0xOTMsNyArMTk1LDcg QEAgUmVsYXRpb25GaW5kUmVwbFR1cGxlQnlJbmRleChSZWxhdGlvbiByZWwsIE9pZCBpZHhvaWQs CiAKIAlpc0lkeFNhZmVUb1NraXBEdXBsaWNhdGVzID0gKEdldFJlbGF0aW9uSWRlbnRpdHlPclBL KHJlbCkgPT0gaWR4b2lkKTsKIAotCUluaXREaXJ0eVNuYXBzaG90KHNuYXApOworCUluaXREaXJ0 eVNuYXBzaG90KHNuYXAsICZtYXhYbWF4KTsKIAogCS8qIEJ1aWxkIHNjYW4ga2V5LiAqLwogCXNr ZXlfYXR0b2ZmID0gYnVpbGRfcmVwbGluZGV4X3NjYW5fa2V5KHNrZXksIHJlbCwgaWR4cmVsLCBz ZWFyY2hzbG90KTsKQEAgLTIwMyw2ICsyMDUsMTIgQEAgUmVsYXRpb25GaW5kUmVwbFR1cGxlQnlJ bmRleChSZWxhdGlvbiByZWwsIE9pZCBpZHhvaWQsCiAKIHJldHJ5OgogCWZvdW5kID0gZmFsc2U7 CisJLyoKKwkgKiBFYWNoIHRpbWUgd2UgcmV0cnkgLSByZW1lbWJlciBsYXN0IGNvbXBsZXRlZCB0 cmFuc2FjdGlvbiBiZWZvcmUgc3RhcnQKKyAJICogb2YgdGhlIHNjYW4uIEFzbyByZXNldCBtYXhY bWF4LgorIAkgKi8KKwltYXhYbWF4ID0gSW52YWxpZFRyYW5zYWN0aW9uSWQ7CisJbGF0ZXN0Q29t cGxldGVkWGlkID0gWGlkRnJvbUZ1bGxUcmFuc2FjdGlvbklkKFJlYWRMYXN0Q29tcGxldGVkRnVs bFRyYW5zYWN0aW9uSWQoKSk7CiAKIAlpbmRleF9yZXNjYW4oc2Nhbiwgc2tleSwgc2tleV9hdHRv ZmYsIE5VTEwsIDApOwogCkBAIC0yNDIsNiArMjUwLDIwIEBAIHJldHJ5OgogCQlicmVhazsKIAl9 CiAKKwkvKgorCSAqIENoZWNrIGZvciB0aGUgY2FzZSB3aGVuIGluZGV4IHNjYW4gZmV0Y2hlZCBy ZWNvcmRzIGJlZm9yZSBzb21lIG90aGVyCisJICogdHJhbnNhY3Rpb24gZGVsZXRlZCB0dXBsZSBh bmQgaW5zZXJ0ZWQgYSBuZXcgb25lLgorCSAqLworCWlmICghZm91bmQgJiYgVHJhbnNhY3Rpb25J ZElzVmFsaWQobWF4WG1heCkgJiYgIVRyYW5zYWN0aW9uSWRJc0N1cnJlbnRUcmFuc2FjdGlvbklk KG1heFhtYXgpKQorCXsKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBza2lwcGVkIHNvbWUgdHVwbGUg YmVjYXVzZSBpdCB3YXMgZGVsZXRlZCwgYnV0IGRlbGV0aW9uIGhhcHBlbmVkIGFmdGVyCisJCSAq IHN0YXJ0IG9mIHRoZSBpbmRleCBzY2FuIC0gcmV0cnkgdG8gYmUgc3VyZS4KKwkJICovCisJCWlm IChUcmFuc2FjdGlvbklkUHJlY2VkZXMobGF0ZXN0Q29tcGxldGVkWGlkLCBtYXhYbWF4KSkKKwkJ CWdvdG8gcmV0cnk7CisJfQorCiAJLyogRm91bmQgdHVwbGUsIHRyeSB0byBsb2NrIGl0IGluIHRo ZSBsb2NrbW9kZS4gKi8KIAlpZiAoZm91bmQpCiAJewpAQCAtMzkxLDcgKzQxMyw3IEBAIFJlbGF0 aW9uRmluZFJlcGxUdXBsZVNlcShSZWxhdGlvbiByZWwsIExvY2tUdXBsZU1vZGUgbG9ja21vZGUs CiAJZXEgPSBwYWxsb2MwKHNpemVvZigqZXEpICogb3V0c2xvdC0+dHRzX3R1cGxlRGVzY3JpcHRv ci0+bmF0dHMpOwogCiAJLyogU3RhcnQgYSBoZWFwIHNjYW4uICovCi0JSW5pdERpcnR5U25hcHNo b3Qoc25hcCk7CisJSW5pdERpcnR5U25hcHNob3Qoc25hcCwgTlVMTCk7CiAJc2NhbiA9IHRhYmxl X2JlZ2luc2NhbihyZWwsICZzbmFwLCAwLCBOVUxMKTsKIAlzY2Fuc2xvdCA9IHRhYmxlX3Nsb3Rf Y3JlYXRlKHJlbCwgTlVMTCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3JlcGxpY2F0aW9u L2xvZ2ljYWwvb3JpZ2luLmMgYi9zcmMvYmFja2VuZC9yZXBsaWNhdGlvbi9sb2dpY2FsL29yaWdp bi5jCmluZGV4IDQxOWU0ODE0ZjAuLjA0YmEwZDliYTEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3JlcGxpY2F0aW9uL2xvZ2ljYWwvb3JpZ2luLmMKKysrIGIvc3JjL2JhY2tlbmQvcmVwbGljYXRp b24vbG9naWNhbC9vcmlnaW4uYwpAQCAtMjc4LDcgKzI3OCw3IEBAIHJlcGxvcmlnaW5fY3JlYXRl KGNvbnN0IGNoYXIgKnJvbmFtZSkKIAkgKiB0byB0aGUgZXhjbHVzaXZlIGxvY2sgdGhlcmUncyBu byBkYW5nZXIgdGhhdCBuZXcgcm93cyBjYW4gYXBwZWFyIHdoaWxlCiAJICogd2UncmUgY2hlY2tp bmcuCiAJICovCi0JSW5pdERpcnR5U25hcHNob3QoU25hcHNob3REaXJ0eSk7CisJSW5pdERpcnR5 U25hcHNob3QoU25hcHNob3REaXJ0eSwgTlVMTCk7CiAKIAlyZWwgPSB0YWJsZV9vcGVuKFJlcGxp Y2F0aW9uT3JpZ2luUmVsYXRpb25JZCwgRXhjbHVzaXZlTG9jayk7CiAKZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL2FjY2Vzcy90cmFuc2FtLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvdHJhbnNhbS5o CmluZGV4IDI4YTJkMjg3ZmQuLmFhZTBhZDkwYzIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2Fj Y2Vzcy90cmFuc2FtLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3RyYW5zYW0uaApAQCAtMjg4 LDYgKzI4OCw3IEBAIGV4dGVybiB2b2lkIFZhcnN1cFNobWVtSW5pdCh2b2lkKTsKIGV4dGVybiBG dWxsVHJhbnNhY3Rpb25JZCBHZXROZXdUcmFuc2FjdGlvbklkKGJvb2wgaXNTdWJYYWN0KTsKIGV4 dGVybiB2b2lkIEFkdmFuY2VOZXh0RnVsbFRyYW5zYWN0aW9uSWRQYXN0WGlkKFRyYW5zYWN0aW9u SWQgeGlkKTsKIGV4dGVybiBGdWxsVHJhbnNhY3Rpb25JZCBSZWFkTmV4dEZ1bGxUcmFuc2FjdGlv bklkKHZvaWQpOworZXh0ZXJuIEZ1bGxUcmFuc2FjdGlvbklkIFJlYWRMYXN0Q29tcGxldGVkRnVs bFRyYW5zYWN0aW9uSWQodm9pZCk7CiBleHRlcm4gdm9pZCBTZXRUcmFuc2FjdGlvbklkTGltaXQo VHJhbnNhY3Rpb25JZCBvbGRlc3RfZGF0ZnJvemVueGlkLAogCQkJCQkJCQkgIE9pZCBvbGRlc3Rf ZGF0b2lkKTsKIGV4dGVybiB2b2lkIEFkdmFuY2VPbGRlc3RDbG9nWGlkKFRyYW5zYWN0aW9uSWQg b2xkZXN0X2RhdGZyb3plbnhpZCk7CkBAIC0zNDQsNiArMzQ1LDIxIEBAIFRyYW5zYWN0aW9uSWRP bGRlcihUcmFuc2FjdGlvbklkIGEsIFRyYW5zYWN0aW9uSWQgYikKIAlyZXR1cm4gYjsKIH0KIAor LyogcmV0dXJuIHRoZSBuZXdlciBvZiB0aGUgdHdvIElEcyAqLworc3RhdGljIGlubGluZSBUcmFu c2FjdGlvbklkCitUcmFuc2FjdGlvbklkTmV3ZXIoVHJhbnNhY3Rpb25JZCBhLCBUcmFuc2FjdGlv bklkIGIpCit7CisJaWYgKCFUcmFuc2FjdGlvbklkSXNWYWxpZChhKSkKKwkJcmV0dXJuIGI7CisK KwlpZiAoIVRyYW5zYWN0aW9uSWRJc1ZhbGlkKGIpKQorCQlyZXR1cm4gYTsKKworCWlmIChUcmFu c2FjdGlvbklkUHJlY2VkZXMoYSwgYikpCisJCXJldHVybiBiOworCXJldHVybiBhOworfQorCiAv KiByZXR1cm4gdGhlIG9sZGVyIG9mIHRoZSB0d28gSURzLCBhc3N1bWluZyB0aGV5J3JlIGJvdGgg bm9ybWFsICovCiBzdGF0aWMgaW5saW5lIFRyYW5zYWN0aW9uSWQKIE5vcm1hbFRyYW5zYWN0aW9u SWRPbGRlcihUcmFuc2FjdGlvbklkIGEsIFRyYW5zYWN0aW9uSWQgYikKZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL3V0aWxzL3NuYXBtZ3IuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL3NuYXBtZ3IuaApp bmRleCA5Mzk4YTg0MDUxLi41ZTZmM2E3ZTc2IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGls cy9zbmFwbWdyLmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvc25hcG1nci5oCkBAIC0zNiw5ICsz NiwxMyBAQCBleHRlcm4gUEdETExJTVBPUlQgU25hcHNob3REYXRhIENhdGFsb2dTbmFwc2hvdERh dGE7CiAgKiBXZSBkb24ndCBwcm92aWRlIGEgc3RhdGljIFNuYXBzaG90RGlydHkgdmFyaWFibGUg YmVjYXVzZSBpdCB3b3VsZCBiZQogICogbm9uLXJlZW50cmFudC4gIEluc3RlYWQsIHVzZXJzIG9m IHRoYXQgc25hcHNob3QgdHlwZSBzaG91bGQgZGVjbGFyZSBhCiAgKiBsb2NhbCB2YXJpYWJsZSBv ZiB0eXBlIFNuYXBzaG90RGF0YSwgYW5kIGluaXRpYWxpemUgaXQgd2l0aCB0aGlzIG1hY3JvLgor ICogcHhpZCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIE5VTEwuIElmIGl0IGlzIG5vdCBOVUxMLCBw eGlkWzBdIHdpbGwgYmUgc2V0CisgKiB0byB0aGUgdHJhbnNhY3Rpb24gSUQgb2YgZGVsZXRpbmcg dHJhbnNhY3Rpb24gaWYgdGhlIHR1cGxlIGlzIGRlbGV0ZWQKKyAqIGFuZCBpdCBuZXdlciB0aGFu IHB4aWRbMF0uCiAgKi8KLSNkZWZpbmUgSW5pdERpcnR5U25hcHNob3Qoc25hcHNob3RkYXRhKSAg XAotCSgoc25hcHNob3RkYXRhKS5zbmFwc2hvdF90eXBlID0gU05BUFNIT1RfRElSVFkpCisjZGVm aW5lIEluaXREaXJ0eVNuYXBzaG90KHNuYXBzaG90ZGF0YSwgcHhpZCkgIFwKKwkoKHNuYXBzaG90 ZGF0YSkuc25hcHNob3RfdHlwZSA9IFNOQVBTSE9UX0RJUlRZLCBcCisJIChzbmFwc2hvdGRhdGEp LnhpcCA9IChweGlkKSkKIAogLyoKICAqIFNpbWlsYXJseSwgc29tZSBpbml0aWFsaXphdGlvbiBp cyByZXF1aXJlZCBmb3IgYSBOb25WYWN1dW1hYmxlIHNuYXBzaG90LgpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvdXRpbHMvc25hcHNob3QuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL3NuYXBzaG90LmgK aW5kZXggOGQxZTMxZTg4OC4uYTY4MTE0ZTUwMCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRp bHMvc25hcHNob3QuaAorKysgYi9zcmMvaW5jbHVkZS91dGlscy9zbmFwc2hvdC5oCkBAIC05Niw3 ICs5NiwxMCBAQCB0eXBlZGVmIGVudW0gU25hcHNob3RUeXBlCiAJICogeG1heC4gIElmIHRoZSB0 dXBsZSB3YXMgaW5zZXJ0ZWQgc3BlY3VsYXRpdmVseSwgbWVhbmluZyB0aGF0IHRoZQogCSAqIGlu c2VydGVyIG1pZ2h0IHN0aWxsIGJhY2sgZG93biBvbiB0aGUgaW5zZXJ0aW9uIHdpdGhvdXQgYWJv cnRpbmcgdGhlCiAJICogd2hvbGUgdHJhbnNhY3Rpb24sIHRoZSBhc3NvY2lhdGVkIHRva2VuIGlz IGFsc28gcmV0dXJuZWQgaW4KLQkgKiBzbmFwc2hvdC0+c3BlY3VsYXRpdmVUb2tlbi4gIFNlZSBh bHNvIEluaXREaXJ0eVNuYXBzaG90KCkuCisJICogc25hcHNob3QtPnNwZWN1bGF0aXZlVG9rZW4u IElmIHhpcCBpcyBub24tTlVMTCwgdGhlIHhpZCBvZiB0aGUKKwkgKiBkZWxldGluZyB0cmFuc2Fj dGlvbiBpcyBzdG9yZWQgaW50byB4aXBbMF0gaWYgaXQgbmV3ZXIgdGhhbiBleGlzdGluZworCSAq IHhpcFswXSB2YWx1ZS4KKwkgKiBTZWUgYWxzbyBJbml0RGlydHlTbmFwc2hvdCgpLgogCSAqIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KIAkgKi8KIAlTTkFQU0hPVF9ESVJUWSwKZGlmZiAtLWdpdCBhL3NyYy90 ZXN0L21vZHVsZXMvdGVzdF9taXNjL3QvMDA2X2RpcnR5X2luZGV4X3NjYW4ucGwgYi9zcmMvdGVz dC9tb2R1bGVzL3Rlc3RfbWlzYy90LzAwNl9kaXJ0eV9pbmRleF9zY2FuLnBsCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjRkMTE2ZTY1OWUKLS0tIC9kZXYvbnVsbAorKysg Yi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfbWlzYy90LzAwNl9kaXJ0eV9pbmRleF9zY2FuLnBsCkBA IC0wLDAgKzEsNDcgQEAKKworIyBDb3B5cmlnaHQgKGMpIDIwMjQsIFBvc3RncmVTUUwgR2xvYmFs IERldmVsb3BtZW50IEdyb3VwCisKKyMgVGVzdCBpc3N1ZSB3aXRoIGxvc3QgdHVwbGUgaW4gY2Fz ZSBvZiBEaXJ0eVNuYXBzaG90IGluZGV4IHNjYW5zCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdz OworCit1c2UgQ29uZmlnOwordXNlIEVycm5vOworCit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6Q2x1 c3RlcjsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGlsczsKK3VzZSBUZXN0OjpNb3JlOworCitp ZiAoJEVOVntlbmFibGVfaW5qZWN0aW9uX3BvaW50c30gbmUgJ3llcycpCit7CisJcGxhbiBza2lw X2FsbCA9PiAnSW5qZWN0aW9uIHBvaW50cyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQnOwor fQorCitteSAoJG5vZGUsICRyZXN1bHQpOworJG5vZGUgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVz dGVyLT5uZXcoJ0RpcnR5U2Nhbl90ZXN0Jyk7Ciskbm9kZS0+aW5pdDsKKyRub2RlLT5hcHBlbmRf Y29uZigncG9zdGdyZXNxbC5jb25mJywgJ2ZzeW5jID0gb2ZmJyk7Ciskbm9kZS0+YXBwZW5kX2Nv bmYoJ3Bvc3RncmVzcWwuY29uZicsICdhdXRvdmFjdXVtID0gb2ZmJyk7Ciskbm9kZS0+c3RhcnQ7 Ciskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsIHEoQ1JFQVRFIEVYVEVOU0lPTiBpbmplY3Rp b25fcG9pbnRzKSk7Ciskbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsIHEoQ1JFQVRFIFRBQkxF IHRibChpIGludCBwcmltYXJ5IGtleSwgbiBpbnQpKSk7CisKKyRub2RlLT5zYWZlX3BzcWwoJ3Bv c3RncmVzJywgcShJTlNFUlQgSU5UTyB0YmwgVkFMVUVTKDQyLDEpKSk7Ciskbm9kZS0+c2FmZV9w c3FsKCdwb3N0Z3JlcycsIHEoU0VMRUNUIGluamVjdGlvbl9wb2ludHNfYXR0YWNoKCdjaGVja19l eGNsdXNpb25fb3JfdW5pcXVlX2NvbnN0cmFpbnRfbm9fY29uZmxpY3QnLCAnZXJyb3InKSkpOwor Ciskbm9kZS0+cGdiZW5jaCgKKwknLS1uby12YWN1dW0gLS1jbGllbnQ9NDAgLS10cmFuc2FjdGlv bnM9MTAwMCcsCisJMCwKKwlbcXJ7YWN0dWFsbHkgcHJvY2Vzc2VkfV0sCisJW3Fye14kfV0sCisJ J2NvbmN1cnJlbnQgVVBTRVJUJywKKwl7CisJCSdvbl9jb25mbGljdHMnID0+IHEoCisJCQlJTlNF UlQgSU5UTyB0YmwgVkFMVUVTKDQyLDEpIG9uIGNvbmZsaWN0KGkpIGRvIHVwZGF0ZSBzZXQgbiA9 IEVYQ0xVREVELm4gKyAxOworCQkpCisJfSk7CisKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVz JywgcShTRUxFQ1QgaW5qZWN0aW9uX3BvaW50c19kZXRhY2goJ2NoZWNrX2V4Y2x1c2lvbl9vcl91 bmlxdWVfY29uc3RyYWludF9ub19jb25mbGljdCcpKSk7CisKKyRub2RlLT5zdG9wOworZG9uZV90 ZXN0aW5nKCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQotLSAKMi4zNC4xCgo= --0000000000009bca77061eb6610b--