GNU bug report logs - #79982
[PATCH] Add vtable buffer slot

Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.

Package: emacs; Reported by: Stéphane Marks <shipmints@HIDDEN>; Keywords: patch; dated Wed, 10 Dec 2025 14:55:01 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 20 Dec 2025 12:31:01 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sat Dec 20 07:31:01 2025
Received: from localhost ([127.0.0.1]:48429 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vWw6u-0001M5-PT
	for submit <at> debbugs.gnu.org; Sat, 20 Dec 2025 07:31:01 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10]:50524)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1vWw6s-000171-L3
 for 79982 <at> debbugs.gnu.org; Sat, 20 Dec 2025 07:30:59 -0500
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1vWw6m-0005Zq-9r; Sat, 20 Dec 2025 07:30:52 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From:
 Date; bh=rHoZ3aFnlZ7CJPtjhUot2XheNhoBHenXs7t/8ryQkLM=; b=A4Ox4Pm2ilWr1djuiOyw
 c9+h4cBzfO+hoTPXiaJxVCSMGr+PO/mjgi+Ba/djsDnOnwGOIdEWv4ozgbMTNC5Axx+xhVajFqqLN
 X0WV/KOSDE1quMDSR+iUiLAMzEKw6BPpB+ZOCdWzxxmlWtT0uHkag5MWqt3WKfshkTshUMEw4QfRX
 4mS3/a/uvA4M3dXgKpPRfpCH5sh67veyOc6VAZmlwNbLHI+Uf1nf6GYRQ05l0SJcfEsS338B8ijxj
 uChzTtYIjHKEU0ZElpsieiCRTL59cYto2grkihF1n9oUsAVEtPS5zF+7KteyxjlMcmTbzPARQRmTr
 djNLabxmsqFH5Q==;
Date: Sat, 20 Dec 2025 14:30:49 +0200
Message-Id: <86ldixz66e.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
In-Reply-To: <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 (message from =?utf-8?Q?St=C3=A9phane?= Marks on Wed, 10 Dec 2025 17:18:31
 -0500)
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot,
 [PATCH] Add vtable buffer slot
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 79982
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 79982 <at> debbugs.gnu.org, visuweshm@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
>  Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
>  79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
>  Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
>  Augusto Stoffel <arstoffel@HIDDEN>
> From: Stéphane Marks <shipmints@HIDDEN>
> Date: Wed, 10 Dec 2025 17:18:31 -0500
> 
> Thanks.  Revised patch, attached.  With regard to point vs. window-point, the code seems no worse off than
> before?  There is a suite of additional fixes coming that address keeping point stable during operations and
> we can see if there are any ill effects when we get to testing those changes.

I wanted to install this, but vtable-tests fail here:

  Test test-vtable--limit-string-with-face-remapped-buffer backtrace:
    signal(ert-test-failed (((should (eq 2 (length (vtable--limit-string
    ert-fail(((should (eq 2 (length (vtable--limit-string text 50 (curre
    (if (unwind-protect (setq value-67 (apply fn-65 args-66)) (setq form
    (let (form-description-69) (if (unwind-protect (setq value-67 (apply
    (let ((value-67 'ert-form-evaluation-aborted-68)) (let (form-descrip
    (let* ((fn-65 #'eq) (args-66 (condition-case err (list 2 (length (vt
    (if (> emacs-major-version 30) (let* ((fn-65 #'eq) (args-66 (conditi
    (let ((text (propertize "XXXXX" 'face 'variable-pitch))) (face-remap
    (progn (let ((text (propertize "XXXXX" 'face 'variable-pitch))) (fac
    (unwind-protect (progn (let ((text (propertize "XXXXX" 'face 'variab
    (save-current-buffer (set-buffer temp-buffer) (unwind-protect (progn
    (let ((temp-buffer (generate-new-buffer " *temp*" t))) (save-current
    #f(lambda () [t] (let ((temp-buffer (generate-new-buffer " *temp*" t
    #f(compiled-function () #<bytecode 0x10250e872e3136f3>)()
    handler-bind-1(#f(compiled-function () #<bytecode 0x10250e872e3136f3
    ert--run-test-internal(#s(ert--test-execution-info :test #s(ert-test
    ert-run-test(#s(ert-test :name test-vtable--limit-string-with-face-r
    ert-run-or-rerun-test(#s(ert--stats :selector (not (or ... ...)) :te
    ert-run-tests((not (or (tag :unstable) (tag :nativecomp))) #f(compil
    ert-run-tests-batch((not (or (tag :unstable) (tag :nativecomp))))
    ert-run-tests-batch-and-exit((not (or (tag :unstable) (tag :nativeco
    eval((ert-run-tests-batch-and-exit '(not (or (tag :unstable) (tag :n
    command-line-1(("-L" ";." "-l" "ert" "--eval" "(setq treesit-extra-l
    command-line()
    normal-top-level()
  Test test-vtable--limit-string-with-face-remapped-buffer condition:
      (ert-test-failed
       ((should (eq 2 (length ...))) :form (eq 2 5) :value nil))
     FAILED  1/7  test-vtable--limit-string-with-face-remapped-buffer (0.002743 sec) at lisp/emacs-lisp/vtable-tests.el:127

Could you please fix this and resubmit?

Also, please take this opportunity to fix the log message: add the bug
number and make sure lines are at most 70 columns wide.





Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 17 Dec 2025 15:03:32 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 17 10:03:32 2025
Received: from localhost ([127.0.0.1]:43488 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vVt3r-0008Vj-Qi
	for submit <at> debbugs.gnu.org; Wed, 17 Dec 2025 10:03:32 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10]:58388)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <eliz@HIDDEN>) id 1vVt3o-0008VS-1d
 for 79982 <at> debbugs.gnu.org; Wed, 17 Dec 2025 10:03:29 -0500
Received: from fencepost.gnu.org ([2001:470:142:3::e])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <eliz@HIDDEN>)
 id 1vVt3h-00058e-Qh; Wed, 17 Dec 2025 10:03:21 -0500
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org;
 s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From:
 Date; bh=hx957mBzqsmR6CCAj05Q7Cjbl+DgfH0CePzrLTQ4kq8=; b=aPi4hFOtuSbGA/fFDNr0
 wqhdS+AagndQRJwqpKpabz3v0wFIALtWtRETP4k4ATqxL26ml16LvAl/H5cfZN87AAvGGUYdcN6NU
 phuxp+uqgdGklHKaGuX6D2RWxCj+NYUk5lXdF3mbsNGghf29UOEg87OBtGibiRtHncYMCRDF2DBkp
 4g0qrf6HbIOIrg1mQU4QoVw/t+buyKDuIl4n28aGmEmMqRgdkCZuZoE69csoct8k2MLjeLNDRQnOk
 2Vl9d0y2YGaaeBMRl+2vT5apCsiMkS7VFxNClDHCtWUwI5p8bVmAKxRq1HNIQSASZhTZ4ws2xhiY1
 HZMFq3+W8yOTow==;
Date: Wed, 17 Dec 2025 17:02:46 +0200
Message-Id: <86h5tp40dl.fsf@HIDDEN>
From: Eli Zaretskii <eliz@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
In-Reply-To: <CAN+1HbrakfBTBa+zYxNrFgDXqNd+vN4DmO4CgzKfwPwTmgaj7A@HIDDEN>
 (message from =?utf-8?Q?St=C3=A9phane?= Marks on Wed, 17 Dec 2025 09:28:02
 -0500)
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot,
 [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <ierzf7ndebe.fsf_-_@HIDDEN>
 <CAN+1HbrMnL=PJt0d-ePEd5y15zDWVZQK0wJYEi5+b+wY3VK4DQ@HIDDEN>
 <CAN+1HbqXgFw0eh_asmGkNuJ9Lv-vfm10SELQs6U9M2U3p=QUog@HIDDEN>
 <iertsxvd878.fsf@HIDDEN>
 <CAN+1HbpOOT9RXTQeGW8je=uz0aV=19oYWwhu3Dj=GGkFmOdkgw@HIDDEN>
 <CAN+1HbrqF3OqdZQxgWWWmOjTd4UW4Vu64X5mS28M2N50TgzCgQ@HIDDEN>
 <ierv7i7xv64.fsf@HIDDEN>
 <CAN+1Hbriar_5zAHd-cTSqDJOUgYzxJPM9i+2CLCPbXRt_DRwQA@HIDDEN>
 <CAN+1HboS10cjaUJ=ztDWuL0OMur0U3Nzfj=NpSKcrmqZ6eD82A@HIDDEN>
 <CAO=BR8OAWvVan4emACKBG2+pMs2KeTfR7+VWdQ5dQcWECJEegw@HIDDEN>
 <CAN+1HbrakfBTBa+zYxNrFgDXqNd+vN4DmO4CgzKfwPwTmgaj7A@HIDDEN>
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 79982
Cc: sbaugh@HIDDEN, krisbalintona@HIDDEN, joostkremers@HIDDEN,
 ijqq@HIDDEN, 79982 <at> debbugs.gnu.org, visuweshm@HIDDEN,
 adam@HIDDEN, larsi@HIDDEN, arstoffel@HIDDEN
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

> From: Stéphane Marks <shipmints@HIDDEN>
> Date: Wed, 17 Dec 2025 09:28:02 -0500
> Cc: Kristoffer Balintona <krisbalintona@HIDDEN>, Joost Kremers <joostkremers@HIDDEN>, 
> 	ijqq@HIDDEN, 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>, 
> 	Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>, 
> 	Augusto Stoffel <arstoffel@HIDDEN>, Eli Zaretskii <eliz@HIDDEN>
> 
> Eli, would you please commit the attached patch? And thank you.

Thanks, but there's no need to ping me so soon after your discussion
reached an agreement.  I had the patch in my queue and intended to get
to installing it in a couple of days, after reading that your
discussion got to completion.

Please ping me only if you see that a week or two have passed and
nothing happened.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 17 Dec 2025 14:28:26 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 17 09:28:26 2025
Received: from localhost ([127.0.0.1]:42305 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vVsVt-0006H2-3f
	for submit <at> debbugs.gnu.org; Wed, 17 Dec 2025 09:28:25 -0500
Received: from mail-vs1-xe36.google.com ([2607:f8b0:4864:20::e36]:45245)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vVsVn-0006FR-6P
 for 79982 <at> debbugs.gnu.org; Wed, 17 Dec 2025 09:28:23 -0500
Received: by mail-vs1-xe36.google.com with SMTP id
 ada2fe7eead31-5dd6fbe50c0so2004119137.2
 for <79982 <at> debbugs.gnu.org>; Wed, 17 Dec 2025 06:28:19 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765981693; x=1766586493; darn=debbugs.gnu.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=5YRR+jUbDaMGjt/nvrNooQxsTXLsY9/X7y0r37nVpUs=;
 b=eJn7YXpMQCJOJyvGDBo6YxzzmOrhZfCVM6agutJovlQk03pJvtPF2M1fD5YhVNk6fF
 CYC9ySLTTFhB0/jdu9ESXbmiQVYSU1C757vbw/B7ldYFTNvneE2E9OI7fBBUNKTDtd38
 5i1s9jK7U+tnjLvePwn9vy+RQZ5kd+F3/cwQmqiKwa4JIo3M9if1mKFHWqUlrNHDtvAY
 AuUQCtUuOHPVmwUoLnnDFWEmTl3Nldv5VT8i8enVbP2HTvkEgjWPjLtopIqlQEIdBPZg
 X167vg0qsJX0k0GvlF5TMOhuARnjv8mYrE0/IX0edIaiejv1n1eBMrarjXTnXNmtMqkn
 JQgw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765981693; x=1766586493;
 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=5YRR+jUbDaMGjt/nvrNooQxsTXLsY9/X7y0r37nVpUs=;
 b=W8Ja56cDVCb/myuAG2zm01nMlFNVLghWTljywvc3Ye2WQpghv/Ea3aTyWobxf/oTBW
 l+bkDbn9/S9bLidLyLdcaIwFiusYrOLjV1IvPTBxuDdp5mhD3pH+x/ax5Wg6ZKu9SouV
 /Dh3aAEZ3wTwShrPlviOs1YOZxSVMoLaXEl1bhIElSIjdW6xrUMzp/RSKMt3TSjT2+Ub
 uRyIqBGwJ0TkT9u9qbvzEWh8mOXf81QS8Tzk1YOcgfMHJ2t/jPjfcd5nfwfhaFxomsdE
 GkkQK1MMyryM1IX9/HkK0EQDz03B/pbm0AjhyUZ4yEpU+CHz2y0W3O/JU2azpSoel54s
 6R6A==
X-Forwarded-Encrypted: i=1;
 AJvYcCU8cKRINkH/DM5f58cHCEAlSlngB//Hwx6PEBQjjqmdUgiYQ21RektPBDqCz6Cs3MW6NL5KUg==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YzbYy4c6sDTJiLvDV4khWPaGJJvqo65Hkz+0h56vw3gUF4DboRB
 fvY5q1AiMaG3afEDLZu6GGJYtHn7oi6LeSal9NfLnlmluOySBIRcTm0vbvjhEK68QPyDJeaJ8Th
 3CZ5LpC8pMhqdJrej8mlu2XPshyga244=
X-Gm-Gg: AY/fxX4sHsW3LSes00jBhCTg7kQ4UriTYrmrIofRXK/Q25FAk2pEnNYeVMq/R7srWnT
 38wbPCoAPromhryFvv/N14yB11jPUCo9PRfuBbGdJemoQ/QPZEjXctoWvult6YGEmi9/51DuCh3
 w+w7rOSkzAr6uQOTlTAkmJCitgTR4/LjC9n/mU0RF7Ea+E+wVsOyVNGExcBH1x9/KLzd3hU+glZ
 8a+LUYjXHr51DGbxul2IDdUIKkan/QL9yshILBj+Ab1hwkbU8riRvNT2gwdEEtQAWG6EOo=
X-Google-Smtp-Source: AGHT+IFWi4BJyReLkLKbI1aTnrjnavFDRX3ugEcTYIIEV+w58bIAzIx203RYxrRZQtqOsClT7JlbFk8IQe60VRUvDQE=
X-Received: by 2002:a05:6102:1515:b0:5db:fe41:747b with SMTP id
 ada2fe7eead31-5e8276a329bmr5183583137.18.1765981693428; Wed, 17 Dec 2025
 06:28:13 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <ierzf7ndebe.fsf_-_@HIDDEN>
 <CAN+1HbrMnL=PJt0d-ePEd5y15zDWVZQK0wJYEi5+b+wY3VK4DQ@HIDDEN>
 <CAN+1HbqXgFw0eh_asmGkNuJ9Lv-vfm10SELQs6U9M2U3p=QUog@HIDDEN>
 <iertsxvd878.fsf@HIDDEN>
 <CAN+1HbpOOT9RXTQeGW8je=uz0aV=19oYWwhu3Dj=GGkFmOdkgw@HIDDEN>
 <CAN+1HbrqF3OqdZQxgWWWmOjTd4UW4Vu64X5mS28M2N50TgzCgQ@HIDDEN>
 <ierv7i7xv64.fsf@HIDDEN>
 <CAN+1Hbriar_5zAHd-cTSqDJOUgYzxJPM9i+2CLCPbXRt_DRwQA@HIDDEN>
 <CAN+1HboS10cjaUJ=ztDWuL0OMur0U3Nzfj=NpSKcrmqZ6eD82A@HIDDEN>
 <CAO=BR8OAWvVan4emACKBG2+pMs2KeTfR7+VWdQ5dQcWECJEegw@HIDDEN>
In-Reply-To: <CAO=BR8OAWvVan4emACKBG2+pMs2KeTfR7+VWdQ5dQcWECJEegw@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Wed, 17 Dec 2025 09:28:02 -0500
X-Gm-Features: AQt7F2oFr1-2_gbNPiUtdjlNnLa2Cyvq2_jbve4uRf39i0P9N8XKhJVhF6-l91w
Message-ID: <CAN+1HbrakfBTBa+zYxNrFgDXqNd+vN4DmO4CgzKfwPwTmgaj7A@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot,
 [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/mixed; boundary="0000000000008478ad064626a743"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>, Eli Zaretskii <eliz@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--0000000000008478ad064626a743
Content-Type: multipart/alternative; boundary="0000000000008478ac064626a741"

--0000000000008478ac064626a741
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Eli, would you please commit the attached patch? And thank you.

On Wed, Dec 17, 2025 at 9:12=E2=80=AFAM Spencer Baugh <sbaugh@HIDDEN=
m> wrote:

> Yes, looks good to me
>
> On Wed, Dec 17, 2025, 8:42=E2=80=AFAM St=C3=A9phane Marks <shipmints@gmai=
l.com> wrote:
>
>> On Mon, Dec 15, 2025 at 6:29=E2=80=AFPM St=C3=A9phane Marks <shipmints@g=
mail.com>
>> wrote:
>>
>>> On Mon, Dec 15, 2025 at 5:00=E2=80=AFPM Spencer Baugh <sbaugh@janestree=
t.com>
>>> wrote:
>>>
>>>> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>>>>
>>>> > On Fri, Dec 12, 2025 at 10:48=E2=80=AFAM St=C3=A9phane Marks <shipmi=
nts@HIDDEN>
>>>> wrote:
>>>> >
>>>> >  On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh <
>>>> sbaugh@HIDDEN> wrote:
>>>> >
>>>> >  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>>>> >
>>>> >  > On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks <
>>>> shipmints@HIDDEN> wrote:
>>>> >  >
>>>> >  >  On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh <
>>>> sbaugh@HIDDEN> wrote:
>>>> >  >
>>>> >  >  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>>>> >  >  > --- a/lisp/emacs-lisp/vtable.el
>>>> >  >  > +++ b/lisp/emacs-lisp/vtable.el
>>>> >  >  > @@ -398,56 +403,58 @@ vtable-insert-object
>>>> >  >  ...
>>>> >  >  > +      (with-current-buffer (vtable-buffer table)
>>>> >  >  > +        (save-excursion
>>>> >  >
>>>> >  >  So in the end I think the only way to keep the diff to
>>>> vtable-insert-object small is
>>>> >  >  if you use (set-buffer (vtable-buffer table)) here instead of
>>>> >  >  with-current-buffer.  It's a bit less normal, but it at least
>>>> avoids
>>>> >  >  some unnecessary indentation.
>>>> >  >
>>>> >  >  That is, instead of
>>>> >  >  (with-current-buffer (vtable-buffer table)
>>>> >  >    (save-excursion
>>>> >  >      ...))
>>>> >  >
>>>> >  >  do
>>>> >  >
>>>> >  >  (save-excursion
>>>> >  >    (set-buffer (vtable-buffer table))
>>>> >  >    ...)
>>>> >  >
>>>> >  >  (save-excursion saves and restores the current buffer)
>>>> >  >
>>>> >  >  Thanks for making all these changes.  I think after that we
>>>> should be
>>>> >  >  good to go.
>>>> >  >
>>>> >  >  While I appreciate the desire for tiny diffs, I prefer that the
>>>> stanzas used in update insert remove functions remain
>>>> >  consistent
>>>> >  >  and we avoid a special comment explaining why insert is special
>>>> saying this was just for indentation.  Hrumph.
>>>> >  >
>>>> >  > The alternative would be to make them all save-excursion,
>>>> set-buffer, if you think that's worthy.
>>>> >
>>>> >  IMO that's worth doing.  It also saves indentation, so it's actuall=
y
>>>> >  somewhat useful in all the places we're currently adding a
>>>> >  with-current-buffer, even if it doesn't avoid a big reindent diff.
>>>> >
>>>> >  I forgot about the compiler warning
>>>> >
>>>> >    emacs-lisp/vtable.el:376:10: Warning: Use =E2=80=98with-current-b=
uffer=E2=80=99
>>>> rather than save-excursion+set-buffer
>>>> >
>>>> >  We may also need save-excursion twice, once for what is the ambient
>>>> current buffer, and the second to ensure that point doesn't
>>>> >  move around in the vtable-buffer.  Both of these, I think, are
>>>> satisfied via with-current-buffer and we avoid the warning.  So,
>>>> >  perhaps, we should bite the bullet and swallow the extra indentatio=
n
>>>> in vtable-insert-object and use the more robust and simpler
>>>> >  w-c-b.
>>>> >
>>>> > I can get a revised patch out quickly.  Can we agree on using
>>>> with-current-buffer and suffer the few extra indented diff lines?
>>>>
>>>> Yes, okay, I agree it's fine.  I don't think you need to revise anythi=
ng
>>>> there, your most recent patch is fine.  (Except for the other issue I
>>>> just emailed about)
>>>>
>>>
>>> Thanks for catching the buffer-local let bindings.
>>>
>>> Here's a revised patch.  Up next, a simpler patch optimizing
>>> vtable--limit-string with a string-length heuristic, and which a bunch =
of
>>> us have tested.
>>>
>>
>> Looks good to you?  I can assume we'll commit this, or very close to it,
>> and start submitting other patches.  There are a lot of changes and the
>> more parsimonious the patches, the more time this will take and I think =
we
>> all agree vtable needs a lot of help on top of Lars's great start and I'=
d
>> like to see the suite of changes in Emacs 31 so there's not that much ti=
me,
>> if Eli wants to cut a branch soon.
>>
>

--0000000000008478ac064626a741
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div class=3D"gmail_default" style=3D"font-family:monospac=
e">Eli, would you please commit the attached patch? And thank you.</div></d=
iv><br><div class=3D"gmail_quote gmail_quote_container"><div dir=3D"ltr" cl=
ass=3D"gmail_attr">On Wed, Dec 17, 2025 at 9:12=E2=80=AFAM Spencer Baugh &l=
t;<a href=3D"mailto:sbaugh@HIDDEN">sbaugh@HIDDEN</a>&gt; wr=
ote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px=
 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D=
"auto">Yes, looks good to me</div><br><div class=3D"gmail_quote"><div dir=
=3D"ltr" class=3D"gmail_attr">On Wed, Dec 17, 2025, 8:42=E2=80=AFAM St=C3=
=A9phane Marks &lt;<a href=3D"mailto:shipmints@HIDDEN" target=3D"_blank"=
>shipmints@HIDDEN</a>&gt; wrote:<br></div><blockquote class=3D"gmail_quo=
te" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204=
);padding-left:1ex"><div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_d=
efault" style=3D"font-family:monospace"><span style=3D"font-family:Arial,He=
lvetica,sans-serif">On Mon, Dec 15, 2025 at 6:29=E2=80=AFPM St=C3=A9phane M=
arks &lt;<a href=3D"mailto:shipmints@HIDDEN" rel=3D"noreferrer" target=
=3D"_blank">shipmints@HIDDEN</a>&gt; wrote:</span></div></div><div class=
=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px =
0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=
=3D"ltr"><div dir=3D"ltr"><div style=3D"font-family:monospace"><span style=
=3D"font-family:Arial,Helvetica,sans-serif">On Mon, Dec 15, 2025 at 5:00=E2=
=80=AFPM Spencer Baugh &lt;<a href=3D"mailto:sbaugh@HIDDEN" rel=3D"=
noreferrer" target=3D"_blank">sbaugh@HIDDEN</a>&gt; wrote:</span></=
div></div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" styl=
e=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);paddin=
g-left:1ex">St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@HIDDEN" =
rel=3D"noreferrer" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br=
>
<br>
&gt; On Fri, Dec 12, 2025 at 10:48=E2=80=AFAM St=C3=A9phane Marks &lt;<a hr=
ef=3D"mailto:shipmints@HIDDEN" rel=3D"noreferrer" target=3D"_blank">ship=
mints@HIDDEN</a>&gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh &lt;<a hr=
ef=3D"mailto:sbaugh@HIDDEN" rel=3D"noreferrer" target=3D"_blank">sb=
augh@HIDDEN</a>&gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@HIDDEN" r=
el=3D"noreferrer" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
&gt;<br>
&gt;=C2=A0 &gt; On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks=
 &lt;<a href=3D"mailto:shipmints@HIDDEN" rel=3D"noreferrer" target=3D"_b=
lank">shipmints@HIDDEN</a>&gt; wrote:<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh=
 &lt;<a href=3D"mailto:sbaugh@HIDDEN" rel=3D"noreferrer" target=3D"=
_blank">sbaugh@HIDDEN</a>&gt; wrote:<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@g=
mail.com" rel=3D"noreferrer" target=3D"_blank">shipmints@HIDDEN</a>&gt; =
writes:<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; --- a/lisp/emacs-lisp/vtable.el<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; +++ b/lisp/emacs-lisp/vtable.el<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; @@ -398,56 +403,58 @@ vtable-insert-object<br>
&gt;=C2=A0 &gt;=C2=A0 ...<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; +=C2=A0 =C2=A0 =C2=A0 (with-current-buffer (vtab=
le-buffer table)<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-excursion<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 So in the end I think the only way to keep the diff t=
o vtable-insert-object small is<br>
&gt;=C2=A0 &gt;=C2=A0 if you use (set-buffer (vtable-buffer table)) here in=
stead of<br>
&gt;=C2=A0 &gt;=C2=A0 with-current-buffer.=C2=A0 It&#39;s a bit less normal=
, but it at least avoids<br>
&gt;=C2=A0 &gt;=C2=A0 some unnecessary indentation.<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 That is, instead of<br>
&gt;=C2=A0 &gt;=C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 (save-excursion<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 =C2=A0 ...))<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 do<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 (save-excursion<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 (set-buffer (vtable-buffer table))<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 ...)<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 (save-excursion saves and restores the current buffer=
)<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 Thanks for making all these changes.=C2=A0 I think af=
ter that we should be<br>
&gt;=C2=A0 &gt;=C2=A0 good to go.<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 While I appreciate the desire for tiny diffs, I prefe=
r that the stanzas used in update insert remove functions remain<br>
&gt;=C2=A0 consistent<br>
&gt;=C2=A0 &gt;=C2=A0 and we avoid a special comment explaining why insert =
is special saying this was just for indentation.=C2=A0 Hrumph.<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt; The alternative would be to make them all save-excursion, s=
et-buffer, if you think that&#39;s worthy.<br>
&gt;<br>
&gt;=C2=A0 IMO that&#39;s worth doing.=C2=A0 It also saves indentation, so =
it&#39;s actually<br>
&gt;=C2=A0 somewhat useful in all the places we&#39;re currently adding a<b=
r>
&gt;=C2=A0 with-current-buffer, even if it doesn&#39;t avoid a big reindent=
 diff.<br>
&gt;<br>
&gt;=C2=A0 I forgot about the compiler warning<br>
&gt;<br>
&gt;=C2=A0 =C2=A0 emacs-lisp/vtable.el:376:10: Warning: Use =E2=80=98with-c=
urrent-buffer=E2=80=99 rather than save-excursion+set-buffer<br>
&gt;<br>
&gt;=C2=A0 We may also need save-excursion twice, once for what is the ambi=
ent current buffer, and the second to ensure that point doesn&#39;t<br>
&gt;=C2=A0 move around in the vtable-buffer.=C2=A0 Both of these, I think, =
are satisfied via with-current-buffer and we avoid the warning.=C2=A0 So,<b=
r>
&gt;=C2=A0 perhaps, we should bite the bullet and swallow the extra indenta=
tion in vtable-insert-object and use the more robust and simpler<br>
&gt;=C2=A0 w-c-b.<br>
&gt;<br>
&gt; I can get a revised patch out quickly.=C2=A0 Can we agree on using wit=
h-current-buffer and suffer the few extra indented diff lines?<br>
<br>
Yes, okay, I agree it&#39;s fine.=C2=A0 I don&#39;t think you need to revis=
e anything<br>
there, your most recent patch is fine.=C2=A0 (Except for the other issue I<=
br>
just emailed about)<br></blockquote><div><br></div><div style=3D"font-famil=
y:monospace">Thanks for catching the buffer-local let bindings.</div><div s=
tyle=3D"font-family:monospace"><br></div><div style=3D"font-family:monospac=
e">Here&#39;s a revised patch.=C2=A0 Up next, a simpler patch optimizing vt=
able--limit-string with a string-length heuristic, and which a bunch of us =
have tested.<br></div></div></div></blockquote><div><br></div><div class=3D=
"gmail_default" style=3D"font-family:monospace">Looks good to you?=C2=A0 I =
can assume we&#39;ll commit this, or very close to it, and start submitting=
 other patches.=C2=A0 There are a lot of changes and the more parsimonious =
the patches, the more time this will take and I think we all agree vtable n=
eeds a lot of help on top of Lars&#39;s great start and I&#39;d like to see=
 the suite of changes in Emacs 31 so there&#39;s not that much time, if Eli=
 wants to cut a branch soon.</div></div></div>
</blockquote></div>
</blockquote></div>

--0000000000008478ac064626a741--

--0000000000008478ad064626a743
Content-Type: application/octet-stream; 
	name="0001-Add-vtable-buffer-slot.patch"
Content-Disposition: attachment; 
	filename="0001-Add-vtable-buffer-slot.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_mja3w1ir0>
X-Attachment-Id: f_mja3w1ir0

RnJvbSA4MTk1M2IwMTBmODNlNjQ0YzJmNTUwNTlhNDkyYzViZmI2YTEzYmE3IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo
aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMTAgRGVjIDIwMjUgMDk6MjA6MDIgLTA1MDAK
U3ViamVjdDogW1BBVENIXSBBZGQgdnRhYmxlIGJ1ZmZlciBzbG90CgpUaGlzIHNvbHZlcyBmb3Ig
YmFja2dyb3VuZCB2dGFibGUgbXV0YXRpb25zLCBpLmUuLCB1cGRhdGVzCmluaXRpYXRlZCBmcm9t
IGJ1ZmZlcnMgb3RoZXIgdGhhbiB0aGUgdnRhYmxlIGJ1ZmZlciwgYW5kIGZvcgpidWZmZXItYWRq
dXN0ZWQgc3RyaW5nLXBpeGVsLXdpZHRoIGNvbXB1dGF0aW9ucy4KCiogbGlzcC9lbWFjcy1saXNw
L3Z0YWJsZS5lbCAodnRhYmxlKTogTmV3ICctYnVmZmVyJyBzbG90LgoodnRhYmxlLWJ1ZmZlcik6
Cih2dGFibGUtc2V0LWJ1ZmZlcik6IE5ldyBmdW5jdGlvbi4KKHZ0YWJsZS11cGRhdGUtb2JqZWN0
KToKKHZ0YWJsZS1yZW1vdmUtb2JqZWN0KToKKHZ0YWJsZS1pbnNlcnQtb2JqZWN0KTogV3JhcCBv
cGVyYXRpb24gd2l0aCB0aGUgdnRhYmxlIGJ1ZmZlci4KKHZ0YWJsZS0taW5zZXJ0KTogU3BsaXQg
ZnJvbSBvbGQgJ3Z0YWJsZS1pbnNlcnQnLgoodnRhYmxlLWluc2VydCk6IEluc2VydCB0YWJsZSBh
bmQgcmVjb3JkIHRoZSBidWZmZXIuCih2dGFibGUtLWluc2VydC1saW5lKToKKHZ0YWJsZS0taW5z
ZXJ0LWhlYWRlci1saW5lKTogVXNlICd2dGFibGUtYnVmZmVyJyBmb3IgcGl4ZWwtd2lkdGggY29t
cHV0YXRpb24uCih2dGFibGUtLWxpbWl0LXN0cmluZyk6Cih2dGFibGUtLWNoYXItd2lkdGgpOiBQ
YXNzIGJ1ZmZlciB0byAnc3RyaW5nLXBpeGVsLXdpZHRoJy4KKHZ0YWJsZS1yZXZlcnQpOiBOZXcg
b3B0aW9uYWwgdGFibGUgYXJndW1lbnQuCih2dGFibGUtLWFsdGVyLWNvbHVtbi13aWR0aCk6Cih2
dGFibGUtcmV2ZXJ0LWNvbW1hbmQpOgoodnRhYmxlLXNvcnQtYnktY3VycmVudC1jb2x1bW4pOiBD
YWxsICd2dGFibGUtcmV2ZXJ0JyB3aXRoIHRoZSB0YWJsZS4KCiogdGVzdC9saXNwL2VtYWNzLWxp
c3AvdnRhYmxlLXRlc3RzLmVsCih2dGFibGUtdGVzdHMtLW1ha2Utbm8taGVhZGVyLTItb2JqZWN0
LXRhYmxlKTogTmV3IGhlbHBlcgpmdW5jdGlvbi4KKHRlc3QtdnN0YWJsZS1jb21wdXRlLWNvbHVt
bnMpOiBDb3JyZWN0IHR5cG8gaW4gdGVzdCBuYW1lLiAgVXNlCm5ldyBoZWxwZXIgZnVuY3Rpb24u
Cih0ZXN0LXZ0YWJsZS11bmlxdWUtYnVmZmVyKQoodGVzdC12dGFibGUtbm9uLWN1cnJlbnQtYnVm
ZmVyLWluc2VydC1vYmplY3QpCih0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItcmVtb3Zl
LW9iamVjdCkKKHRlc3QtdnRhYmxlLW5vbi1jdXJyZW50LWJ1ZmZlci11cGRhdGUtb2JqZWN0KQoo
dGVzdC12dGFibGUtLWxpbWl0LXN0cmluZy13aXRoLWZhY2UtcmVtYXBwZWQtYnVmZmVyKTogTmV3
IHRlc3QuCi0tLQogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAgICAgICAgICAgIHwgMzIxICsr
KysrKysrKysrKysrKy0tLS0tLS0tLS0tLQogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRl
c3RzLmVsIHwgIDg0ICsrKysrKy0KIDIgZmlsZXMgY2hhbmdlZCwgMjU2IGluc2VydGlvbnMoKyks
IDE0OSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVs
IGIvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbAppbmRleCBiY2RkMjgwZmI5Mi4uMjk3OTFlMmFh
YTAgMTAwNjQ0Ci0tLSBhL2xpc3AvZW1hY3MtbGlzcC92dGFibGUuZWwKKysrIGIvbGlzcC9lbWFj
cy1saXNwL3Z0YWJsZS5lbApAQCAtNjcsOCArNjcsMTAgQEAgdnRhYmxlCiAgICAoZWxsaXBzaXMg
OmluaXRhcmcgOmVsbGlwc2lzIDphY2Nlc3NvciB2dGFibGUtZWxsaXBzaXMpCiAgICAoY29sdW1u
LWNvbG9ycyA6aW5pdGFyZyA6Y29sdW1uLWNvbG9ycyA6YWNjZXNzb3IgdnRhYmxlLWNvbHVtbi1j
b2xvcnMpCiAgICAocm93LWNvbG9ycyA6aW5pdGFyZyA6cm93LWNvbG9ycyA6YWNjZXNzb3IgdnRh
YmxlLXJvdy1jb2xvcnMpCisgICAoYnVmZmVyIDppbml0Zm9ybSBuaWwgOmFjY2Vzc29yIHZ0YWJs
ZS1idWZmZXIpCiAgICAoLWNhY2hlZC1jb2xvcnMgOmluaXRmb3JtIG5pbCkKICAgICgtY2FjaGUg
OmluaXRmb3JtIChtYWtlLWhhc2gtdGFibGUgOnRlc3QgIydlcXVhbCkpCisgICAoLWN1cnJlbnQt
Y2FjaGUgOmluaXRmb3JtIG5pbCA6YWNjZXNzb3IgdnRhYmxlLS1jdXJyZW50LWNhY2hlKQogICAg
KC1jYWNoZWQta2V5bWFwIDppbml0Zm9ybSBuaWwpCiAgICAoLWhhcy1jb2x1bW4tc3BlYyA6aW5p
dGZvcm0gbmlsKSkKICAgIkFuIG9iamVjdCB0byBob2xkIHRoZSBkYXRhIGZvciBhIHRhYmxlLiIp
CkBAIC0yODcsOCArMjg5LDcgQEAgdnRhYmxlLXVwZGF0ZS1vYmplY3QKIFRBQkxFIG11c3QgYmUg
YXQgcG9pbnQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiIKICAgKHVubGVzcyBvbGQtb2JqZWN0CiAg
ICAgKHNldHEgb2xkLW9iamVjdCBvYmplY3QpKQotICAobGV0KiAoKG9iamVjdHMgKHZ0YWJsZS1v
YmplY3RzIHRhYmxlKSkKLSAgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KSkKKyAgKGxldCAo
KG9iamVjdHMgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkpCiAgICAgOzsgRmlyc3QgcmVwbGFjZSB0
aGUgb2JqZWN0IGluIHRoZSBvYmplY3Qgc3RvcmFnZS4KICAgICAoaWYgKGVxIG9sZC1vYmplY3Qg
KGNhciBvYmplY3RzKSkKICAgICAgICAgOzsgSXQncyBhdCB0aGUgaGVhZCwgc28gcmVwbGFjZSBp
dCB0aGVyZS4KQEAgLTMwMSwzMSArMzAyLDMyIEBAIHZ0YWJsZS11cGRhdGUtb2JqZWN0CiAgICAg
ICAodW5sZXNzIChjZHIgb2JqZWN0cykKICAgICAgICAgKGVycm9yICJDYW4ndCBmaW5kIHRoZSBv
bGQgb2JqZWN0IikpCiAgICAgICAoc2V0Y2FyIChjZHIgb2JqZWN0cykgb2JqZWN0KSkKLSAgICA7
OyBUaGVuIHVwZGF0ZSB0aGUgcmVuZGVyZWQgdnRhYmxlIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4K
LSAgICAoaWYtbGV0KiAoKGNhY2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKQotICAgICAgICAg
ICAgIChsaW5lLW51bWJlciAoc2VxLXBvc2l0aW9uICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hl
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC1vYmplY3QKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChhIGIpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXF1YWwgKGNhciBhKSBiKSkp
KQotICAgICAgICAgICAgIChsaW5lIChlbHQgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpIGxp
bmUtbnVtYmVyKSkpCi0gICAgICAgIChwcm9nbgotICAgICAgICAgIChzZXRjYXIgbGluZSBvYmpl
Y3QpCi0gICAgICAgICAgKHNldGNkciBsaW5lICh2dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUg
dGFibGUgb2JqZWN0KSkKLSAgICAgICAgICA7OyAuLi4gYW5kIHJlZGlzcGxheSB0aGUgbGluZSBp
biBxdWVzdGlvbi4KLSAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgICAgICAgICh2dGFi
bGUtZ290by1vYmplY3Qgb2xkLW9iamVjdCkKLSAgICAgICAgICAgIChsZXQgKChrZXltYXAgKGdl
dC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1hcCkpCi0gICAgICAgICAgICAgICAgICAoc3Rh
cnQgKHBvaW50KSkpCi0gICAgICAgICAgICAgIChkZWxldGUtbGluZSkKLSAgICAgICAgICAgICAg
KHZ0YWJsZS0taW5zZXJ0LWxpbmUgdGFibGUgbGluZSBsaW5lLW51bWJlcgotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLXNwYWNlciB0YWJsZSkpCi0g
ICAgICAgICAgICAgIChhZGQtdGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkgKGxpc3QgJ2tl
eW1hcCBrZXltYXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAndnRhYmxlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZS1jYWNoZSBjYWNoZSkpKSkKLSAgICAgICAg
ICA7OyBXZSBtYXkgaGF2ZSBpbnNlcnRlZCBhIG5vbi1udW1lcmljYWwgdmFsdWUgaW50byBhIHBy
ZXZpb3VzbHkKLSAgICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUu
Ci0gICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAoY2RyIGxpbmUp
KSkKKyAgICA7OyBUaGVuIHVwZGF0ZSB0aGUgcmVuZGVyZWQgdnRhYmxlIGluIGl0cyBidWZmZXIu
CisgICAgKGlmLWxldCogKChjYWNoZSAodnRhYmxlLS1jdXJyZW50LWNhY2hlIHRhYmxlKSkKKyAg
ICAgICAgICAgICAgKGxpbmUtbnVtYmVyIChzZXEtcG9zaXRpb24gKHZ0YWJsZS0tY2FjaGUtbGlu
ZXMgY2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC1v
YmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAo
YSBiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCAo
Y2FyIGEpIGIpKSkpCisgICAgICAgICAgICAgIChsaW5lIChlbHQgKHZ0YWJsZS0tY2FjaGUtbGlu
ZXMgY2FjaGUpIGxpbmUtbnVtYmVyKSkpCisgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2
dGFibGUtYnVmZmVyIHRhYmxlKQorICAgICAgICAgIChsZXQgKChpbmhpYml0LXJlYWQtb25seSB0
KQorICAgICAgICAgICAgICAgIChpbmhpYml0LW1vZGlmaWNhdGlvbi1ob29rcyB0KSkKKyAgICAg
ICAgICAgIChzZXRjYXIgbGluZSBvYmplY3QpCisgICAgICAgICAgICAoc2V0Y2RyIGxpbmUgKHZ0
YWJsZS0tY29tcHV0ZS1jYWNoZWQtbGluZSB0YWJsZSBvYmplY3QpKQorICAgICAgICAgICAgOzsg
Li4uIGFuZCByZWRpc3BsYXkgdGhlIGxpbmUgaW4gcXVlc3Rpb24uCisgICAgICAgICAgICAoc2F2
ZS1leGN1cnNpb24KKyAgICAgICAgICAgICAgKHZ0YWJsZS1nb3RvLW9iamVjdCBvbGQtb2JqZWN0
KQorICAgICAgICAgICAgICAobGV0ICgoa2V5bWFwIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQp
ICdrZXltYXApKQorICAgICAgICAgICAgICAgICAgICAoc3RhcnQgKHBvaW50KSkpCisgICAgICAg
ICAgICAgICAgKGRlbGV0ZS1saW5lKQorICAgICAgICAgICAgICAgICh2dGFibGUtLWluc2VydC1s
aW5lIHRhYmxlIGxpbmUgbGluZS1udW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKSkKKyAgICAgICAgICAgICAg
ICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9pbnQpIChsaXN0ICdrZXltYXAga2V5bWFw
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAndnRhYmxlIHRhYmxlKSkpKQorICAgICAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5zZXJ0ZWQg
YSBub24tbnVtZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5CisgICAgICAgICAgICA7OyBh
bGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUuCisgICAgICAgICAgICAodnRhYmxlLS1y
ZWNvbXB1dGUtbnVtZXJpY2FsIHRhYmxlIChjZHIgbGluZSkpKSkKICAgICAgIChlcnJvciAiQ2Fu
J3QgZmluZCBjYWNoZWQgb2JqZWN0IGluIHZ0YWJsZSIpKSkpCiAKIChkZWZ1biB2dGFibGUtcmVt
b3ZlLW9iamVjdCAodGFibGUgb2JqZWN0KQpAQCAtMzM0LDE0ICszMzYsMTYgQEAgdnRhYmxlLXJl
bW92ZS1vYmplY3QKICAgOzsgRmlyc3QgcmVtb3ZlIGZyb20gdGhlIG9iamVjdHMuCiAgIChzZXRm
ICh2dGFibGUtb2JqZWN0cyB0YWJsZSkgKGRlbHEgb2JqZWN0ICh2dGFibGUtb2JqZWN0cyB0YWJs
ZSkpKQogICA7OyBUaGVuIGFkanVzdCB0aGUgY2FjaGUgYW5kIGRpc3BsYXkuCi0gIChzYXZlLWV4
Y3Vyc2lvbgotICAgICh2dGFibGUtZ290by10YWJsZSB0YWJsZSkKLSAgICAobGV0ICgoY2FjaGUg
KHZ0YWJsZS0tY3VycmVudC1jYWNoZSkpCi0gICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQp
KQotICAgICAgKHNldGNhciBjYWNoZSAoZGVscSAoYXNzcSBvYmplY3QgKHZ0YWJsZS0tY2FjaGUt
bGluZXMgY2FjaGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS1s
aW5lcyBjYWNoZSkpKQotICAgICAgKHdoZW4gKHZ0YWJsZS1nb3RvLW9iamVjdCBvYmplY3QpCi0g
ICAgICAgIChkZWxldGUtbGluZSkpKSkpCisgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUt
YnVmZmVyIHRhYmxlKQorICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgKHZ0YWJsZS1nb3RvLXRh
YmxlIHRhYmxlKQorICAgICAgKGxldCAoKGNhY2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUgdGFi
bGUpKQorICAgICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQpCisgICAgICAgICAgICAoaW5o
aWJpdC1tb2RpZmljYXRpb24taG9va3MgdCkpCisgICAgICAgIChzZXRjYXIgY2FjaGUgKGRlbHEg
KGFzc3Egb2JqZWN0ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkpKQorICAgICAgICAod2hl
biAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVjdCkKKyAgICAgICAgICAoZGVsZXRlLWxpbmUpKSkp
KSkKIAogOzsgRklYTUU6IFRoZSBmYWN0IHRoYXQgdGhlIGBsb2NhdGlvbicgYXJndW1lbnQgb2YK
IDs7IGB2dGFibGUtaW5zZXJ0LW9iamVjdCcgY2FuIGJlIGFuIGludGVnZXIgYW5kIGlzIHRoZW4g
aW50ZXJwcmV0ZWQgYXMKQEAgLTM2OSw4ICszNzMsOSBAQCB2dGFibGUtaW5zZXJ0LW9iamVjdAog
ICAgICAgKHByb2duCiAgICAgICAgIChzZXRmICh2dGFibGUtb2JqZWN0cyB0YWJsZSkgKGxpc3Qg
b2JqZWN0KSkKICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAodnRh
YmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpCi0gICAgICAgICh2dGFibGUt
Z290by10YWJsZSB0YWJsZSkKLSAgICAgICAgKHZ0YWJsZS1yZXZlcnQtY29tbWFuZCkpCisgICAg
ICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKQorICAgICAgICAg
ICh2dGFibGUtZ290by10YWJsZSB0YWJsZSkKKyAgICAgICAgICAodnRhYmxlLXJldmVydC1jb21t
YW5kKSkpCiAgICAgOzsgRmlyc3QgaW5zZXJ0IGludG8gdGhlIG9iamVjdHMuCiAgICAgKGxldCAo
KHBvcyAoaWYgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAoaWYgKGludGVnZXJwIGxvY2F0
aW9uKQpAQCAtMzk4LDU2ICs0MDMsNTggQEAgdnRhYmxlLWluc2VydC1vYmplY3QKICAgICAgICAg
ICA7OyBPdGhlcndpc2UsIGFwcGVuZCB0aGUgb2JqZWN0LgogICAgICAgICAgIChuY29uYyAodnRh
YmxlLW9iamVjdHMgdGFibGUpIChsaXN0IG9iamVjdCkpKSkpCiAgICAgOzsgVGhlbiBhZGp1c3Qg
dGhlIGNhY2hlIGFuZCBkaXNwbGF5LgotICAgIChzYXZlLWV4Y3Vyc2lvbgotICAgICAgKHZ0YWJs
ZS1nb3RvLXRhYmxlIHRhYmxlKQotICAgICAgKGxldCogKChjYWNoZSAodnRhYmxlLS1jdXJyZW50
LWNhY2hlKSkKLSAgICAgICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkKLSAgICAgICAgICAg
ICAoa2V5bWFwIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICdrZXltYXApKQotICAgICAgICAg
ICAgIChlbGxpcHNpcyAoaWYgKHZ0YWJsZS1lbGxpcHNpcyB0YWJsZSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChwcm9wZXJ0aXplICh0cnVuY2F0ZS1zdHJpbmctZWxsaXBzaXMpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFjZSAodnRhYmxlLWZhY2UgdGFi
bGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICIiKSkKLSAgICAgICAgICAgICAoZWxsaXBz
aXMtd2lkdGggKHN0cmluZy1waXhlbC13aWR0aCBlbGxpcHNpcykpCi0gICAgICAgICAgICAgKGxp
bmVzICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkKLSAgICAgICAgICAgICAoZWxlbSAoaWYg
bG9jYXRpb24gIDsgVGhpcyBiaW5kaW5nIG1pcnJvcnMgdGhlIGJpbmRpbmcgb2YgYHBvcycgYWJv
dmUuCi0gICAgICAgICAgICAgICAgICAgICAgIChpZiAoaW50ZWdlcnAgbG9jYXRpb24pCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAobnRoIGxvY2F0aW9uIGxpbmVzKQotICAgICAgICAgICAg
ICAgICAgICAgICAgIChvciAoYXNzcSBsb2NhdGlvbiBsaW5lcykKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGFuZCBiZWZvcmUgKGNhciBsaW5lcykpKSkKLSAgICAgICAgICAgICAgICAg
ICAgIChpZiBiZWZvcmUgKGNhciBsaW5lcykpKSkKLSAgICAgICAgICAgICAocG9zIChtZW1xIGVs
ZW0gbGluZXMpKQotICAgICAgICAgICAgIChsaW5lIChjb25zIG9iamVjdCAodnRhYmxlLS1jb21w
dXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpKSkKLSAgICAgICAgKGlmIChvciBiZWZvcmUK
LSAgICAgICAgICAgICAgICAoYW5kIHBvcyAoaW50ZWdlcnAgbG9jYXRpb24pKSkKLSAgICAgICAg
ICAgIDs7IEFkZCB0aGUgbmV3IG9iamVjdCBiZWZvcmU6LgotICAgICAgICAgICAgKGxldCAoKG9s
ZC1saW5lIChjYXIgcG9zKSkpCi0gICAgICAgICAgICAgIChzZXRjYXIgcG9zIGxpbmUpCi0gICAg
ICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIG9sZC1saW5lIChjZHIgcG9zKSkpCi0gICAgICAg
ICAgICAgICh1bmxlc3MgKHZ0YWJsZS1nb3RvLW9iamVjdCAoY2FyIGVsZW0pKQotICAgICAgICAg
ICAgICAgICh2dGFibGUtYmVnaW5uaW5nLW9mLXRhYmxlKSkpCi0gICAgICAgICAgOzsgT3RoZXJ3
aXNlLCBhZGQgdGhlIG9iamVjdCBhZnRlci4KLSAgICAgICAgICAoaWYgcG9zCi0gICAgICAgICAg
ICAgIDs7IFNwbGljZSB0aGUgb2JqZWN0IGludG8gdGhlIGxpc3QuCi0gICAgICAgICAgICAgIChw
cm9nbgotICAgICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIGxpbmUgKGNkciBwb3MpKSkK
LSAgICAgICAgICAgICAgICAoaWYgKHZ0YWJsZS1nb3RvLW9iamVjdCBsb2NhdGlvbikKLSAgICAg
ICAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAxKSAgOyBJbnNlcnQgKmFmdGVyKi4KLSAgICAg
ICAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCi0gICAgICAgICAgICA7OyBPdGhl
cndpc2UsIGFwcGVuZCB0aGUgb2JqZWN0LgotICAgICAgICAgICAgKHNldGNhciBjYWNoZSAobmNv
bmMgbGluZXMgKGxpc3QgbGluZSkpKQotICAgICAgICAgICAgKHZ0YWJsZS1lbmQtb2YtdGFibGUp
KSkKLSAgICAgICAgKGxldCAoKHN0YXJ0IChwb2ludCkpKQotICAgICAgICAgIDs7IEZJWE1FOiBX
ZSBoYXZlIHRvIGFkanVzdCBjb2xvcnMgaW4gbGluZXMgYmVsb3cgdGhpcyBpZiB3ZQotICAgICAg
ICAgIDs7IGhhdmUgOnJvdy1jb2xvcnMuCi0gICAgICAgICAgKHZ0YWJsZS0taW5zZXJ0LWxpbmUg
dGFibGUgbGluZSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2Fj
aGUtd2lkdGhzIGNhY2hlKSAodnRhYmxlLS1zcGFjZXIgdGFibGUpCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZWxsaXBzaXMgZWxsaXBzaXMtd2lkdGgpCi0gICAgICAgICAgKGFkZC10
ZXh0LXByb3BlcnRpZXMgc3RhcnQgKHBvaW50KSAobGlzdCAna2V5bWFwIGtleW1hcAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJs
ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0
YWJsZS1jYWNoZSBjYWNoZSkpKQotICAgICAgICA7OyBXZSBtYXkgaGF2ZSBpbnNlcnRlZCBhIG5v
bi1udW1lcmljYWwgdmFsdWUgaW50byBhIHByZXZpb3VzbHkKLSAgICAgICAgOzsgYWxsLW51bWVy
aWNhbCB0YWJsZSwgc28gcmVjb21wdXRlLgotICAgICAgICAodnRhYmxlLS1yZWNvbXB1dGUtbnVt
ZXJpY2FsIHRhYmxlIChjZHIgbGluZSkpKSkpKQorICAgIChsZXQqICgoY2FjaGUgKHZ0YWJsZS0t
Y3VycmVudC1jYWNoZSB0YWJsZSkpCisgICAgICAgICAgIChsaW5lcyAodnRhYmxlLS1jYWNoZS1s
aW5lcyBjYWNoZSkpCisgICAgICAgICAgIChlbGVtIChpZiBsb2NhdGlvbiAgOyBUaGlzIGJpbmRp
bmcgbWlycm9ycyB0aGUgYmluZGluZyBvZiBgcG9zJyBhYm92ZS4KKyAgICAgICAgICAgICAgICAg
ICAgIChpZiAoaW50ZWdlcnAgbG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgKG50
aCBsb2NhdGlvbiBsaW5lcykKKyAgICAgICAgICAgICAgICAgICAgICAgKG9yIChhc3NxIGxvY2F0
aW9uIGxpbmVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBiZWZvcmUgKGNhciBs
aW5lcykpKSkKKyAgICAgICAgICAgICAgICAgICAoaWYgYmVmb3JlIChjYXIgbGluZXMpKSkpCisg
ICAgICAgICAgIChwb3MgKG1lbXEgZWxlbSBsaW5lcykpCisgICAgICAgICAgIChsaW5lIChjb25z
IG9iamVjdCAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpKSkKKyAg
ICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKQorICAgICAgICAo
bGV0ICgoaW5oaWJpdC1yZWFkLW9ubHkgdCkKKyAgICAgICAgICAgICAgKGluaGliaXQtbW9kaWZp
Y2F0aW9uLWhvb2tzIHQpKQorICAgICAgICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgICAgICAg
KHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlKQorICAgICAgICAgICAgKGlmIChvciBiZWZvcmUKKyAg
ICAgICAgICAgICAgICAgICAgKGFuZCBwb3MgKGludGVnZXJwIGxvY2F0aW9uKSkpCisgICAgICAg
ICAgICAgICAgOzsgQWRkIHRoZSBuZXcgb2JqZWN0IGJlZm9yZTouCisgICAgICAgICAgICAgICAg
KGxldCAoKG9sZC1saW5lIChjYXIgcG9zKSkpCisgICAgICAgICAgICAgICAgICAoc2V0Y2FyIHBv
cyBsaW5lKQorICAgICAgICAgICAgICAgICAgKHNldGNkciBwb3MgKGNvbnMgb2xkLWxpbmUgKGNk
ciBwb3MpKSkKKyAgICAgICAgICAgICAgICAgICh1bmxlc3MgKHZ0YWJsZS1nb3RvLW9iamVjdCAo
Y2FyIGVsZW0pKQorICAgICAgICAgICAgICAgICAgICAodnRhYmxlLWJlZ2lubmluZy1vZi10YWJs
ZSkpKQorICAgICAgICAgICAgICA7OyBPdGhlcndpc2UsIGFkZCB0aGUgb2JqZWN0IGFmdGVyLgor
ICAgICAgICAgICAgICAoaWYgcG9zCisgICAgICAgICAgICAgICAgICA7OyBTcGxpY2UgdGhlIG9i
amVjdCBpbnRvIHRoZSBsaXN0LgorICAgICAgICAgICAgICAgICAgKHByb2duCisgICAgICAgICAg
ICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIGxpbmUgKGNkciBwb3MpKSkKKyAgICAgICAgICAg
ICAgICAgICAgKGlmICh2dGFibGUtZ290by1vYmplY3QgbG9jYXRpb24pCisgICAgICAgICAgICAg
ICAgICAgICAgICAoZm9yd2FyZC1saW5lIDEpICA7IEluc2VydCAqYWZ0ZXIqLgorICAgICAgICAg
ICAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCisgICAgICAgICAgICAgICAgOzsg
T3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVjdC4KKyAgICAgICAgICAgICAgICAoc2V0Y2FyIGNh
Y2hlIChuY29uYyBsaW5lcyAobGlzdCBsaW5lKSkpCisgICAgICAgICAgICAgICAgKHZ0YWJsZS1l
bmQtb2YtdGFibGUpKSkKKyAgICAgICAgICAgIChsZXQqICgoc3RhcnQgKHBvaW50KSkKKyAgICAg
ICAgICAgICAgICAgICAoZWxsaXBzaXMgKGlmICh2dGFibGUtZWxsaXBzaXMgdGFibGUpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAodHJ1bmNhdGUtc3RyaW5n
LWVsbGlwc2lzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
J2ZhY2UgKHZ0YWJsZS1mYWNlIHRhYmxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiIikpCisgICAgICAgICAgICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwt
d2lkdGggZWxsaXBzaXMgKGN1cnJlbnQtYnVmZmVyKSkpCisgICAgICAgICAgICAgICAgICAgKGtl
eW1hcCAoZ2V0LXRleHQtcHJvcGVydHkgKHBvaW50KSAna2V5bWFwKSkpCisgICAgICAgICAgICAg
IDs7IEZJWE1FOiBXZSBoYXZlIHRvIGFkanVzdCBjb2xvcnMgaW4gbGluZXMgYmVsb3cgdGhpcyBp
ZiB3ZQorICAgICAgICAgICAgICA7OyBoYXZlIDpyb3ctY29sb3JzLgorICAgICAgICAgICAgICAo
dnRhYmxlLS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIDAKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKHZ0YWJsZS0tY2FjaGUtd2lkdGhzIGNhY2hlKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1zcGFjZXIgdGFibGUpCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGVsbGlwc2lzIGVsbGlwc2lzLXdpZHRoKQorICAgICAgICAg
ICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9pbnQpIChsaXN0ICdrZXltYXAga2V5
bWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgJ3Z0YWJsZSB0YWJsZSkpKQorICAgICAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5zZXJ0ZWQg
YSBub24tbnVtZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5CisgICAgICAgICAgICA7OyBh
bGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUuCisgICAgICAgICAgICAodnRhYmxlLS1y
ZWNvbXB1dGUtbnVtZXJpY2FsIHRhYmxlIChjZHIgbGluZSkpKSkpKSkpCiAKIChkZWZ1biB2dGFi
bGUtY29sdW1uICh0YWJsZSBpbmRleCkKICAgIlJldHVybiB0aGUgbmFtZSBvZiB0aGUgSU5ERVh0
aCBjb2x1bW4gaW4gVEFCTEUuIgpAQCAtNTIwLDE0ICs1MjcsMTQgQEAgdnRhYmxlLS1jYWNoZS13
aWR0aHMKIChkZWZ1biB2dGFibGUtLWNhY2hlLWxpbmVzIChjYWNoZSkKICAgKGNhciBjYWNoZSkp
CiAKLShkZWZ1biB2dGFibGUtaW5zZXJ0ICh0YWJsZSkKKyhkZWZ1biB2dGFibGUtLWluc2VydCAo
dGFibGUpCiAgIChsZXQqICgoc3BhY2VyICh2dGFibGUtLXNwYWNlciB0YWJsZSkpCiAgICAgICAg
ICAoc3RhcnQgKHBvaW50KSkKICAgICAgICAgIChlbGxpcHNpcyAoaWYgKHZ0YWJsZS1lbGxpcHNp
cyB0YWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnRpemUgKHRydW5jYXRlLXN0
cmluZy1lbGxpcHNpcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhY2Ug
KHZ0YWJsZS1mYWNlIHRhYmxlKSkKICAgICAgICAgICAgICAgICAgICAgICIiKSkKLSAgICAgICAg
IChlbGxpcHNpcy13aWR0aCAoc3RyaW5nLXBpeGVsLXdpZHRoIGVsbGlwc2lzKSkKKyAgICAgICAg
IChlbGxpcHNpcy13aWR0aCAoc3RyaW5nLXBpeGVsLXdpZHRoIGVsbGlwc2lzICh2dGFibGUtYnVm
ZmVyIHRhYmxlKSkpCiAgICAgICAgICA7OyBXZSBtYWludGFpbiBhIGNhY2hlIHBlciBzY3JlZW4v
d2luZG93IHdpZHRoLCBzbyB0aGF0IHdlIHJlbmRlcgogICAgICAgICAgOzsgY29ycmVjdGx5IGlm
IEVtYWNzIGlzIG9wZW4gb24gdHdvIGRpZmZlcmVudCBzY3JlZW5zIChvciB0aGUKICAgICAgICAg
IDs7IHVzZXIgcmVzaXplcyB0aGUgZnJhbWUpLgpAQCAtNTQ5LDggKzU1Niw3IEBAIHZ0YWJsZS1p
bnNlcnQKICAgICAgICAgKGFkZC10ZXh0LXByb3BlcnRpZXMgc3RhcnQgKHBvaW50KQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAna2V5bWFwIHZ0YWJsZS1oZWFkZXItbGluZS1t
YXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlYXItbm9uc3RpY2t5IHQK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlLWNhY2hlIGNhY2hlKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZSkpCiAgICAgICAgIChz
ZXRxIHN0YXJ0IChwb2ludCkpKSkKICAgICAodnRhYmxlLS1zb3J0IHRhYmxlIGNhY2hlKQogICAg
IDs7IEluc2VydCB0aGUgZGF0YS4KQEAgLTU2MSwxMyArNTY3LDM1IEBAIHZ0YWJsZS1pbnNlcnQK
ICAgICAgICAgKHNldHEgbGluZS1udW1iZXIgKDErIGxpbmUtbnVtYmVyKSkpKQogICAgIChhZGQt
dGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkKICAgICAgICAgICAgICAgICAgICAgICAgICAo
bGlzdCAncmVhci1ub25zdGlja3kgdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2
dGFibGUgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlLWNhY2hl
IGNhY2hlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlIHRhYmxlKSkK
KyAgICAoc2V0ZiAodnRhYmxlLS1jdXJyZW50LWNhY2hlIHRhYmxlKSBjYWNoZSkKICAgICAoZ290
by1jaGFyIHN0YXJ0KSkpCiAKKyhkZWZ1biB2dGFibGUtaW5zZXJ0ICh0YWJsZSkKKyAgIkluc2Vy
dCBUQUJMRSBpbnRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KK1RoZSBjdXJyZW50IGJ1ZmZlciB3aWxs
IGJlIHJlY29yZGVkIGFzIFRBQkxFJ3MgYnVmZmVyLiAgSWYgdGhlIHRhYmxlIGlzCitpbnNlcnRl
ZCBpbnRvIGEgYnVmZmVyIG90aGVyIHRoYW4gaXRzIG9yaWdpbmF0aW5nIGJ1ZmZlciwgc2lnbmFs
IGFuCitlcnJvci4gIEEgdGFibGUgbWF5IGJlIHJlaW5zZXJ0ZWQgaW50byBpdHMgb3duIGJ1ZmZl
ciwgYnV0IGluc2VydCBvbmx5CitvbmUgaW5zdGFuY2UgcGVyIGJ1ZmZlci4gIFRoaXMgcmVzdHJp
Y3Rpb24gbmVlZHMgdG8gYmUgZW5mb3JjZWQgYnkgdGhlCitjYWxsZXIuIgorICAoaWYtbGV0KiAo
KHRhYmxlLWJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJsZSkpKQorICAgICAgKHdoZW4gKG5vdCAo
ZXEgdGFibGUtYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpKQorICAgICAgICAoZXJyb3IgIkEgdnRh
YmxlIGNhbm5vdCBiZSBpbnNlcnRlZCBpbnRvIG1vcmUgdGhhbiBvbmUgYnVmZmVyIikpKQorICAo
c2V0ZiAodnRhYmxlLWJ1ZmZlciB0YWJsZSkgKGN1cnJlbnQtYnVmZmVyKSkKKyAgKGxldCAoKGlu
aGliaXQtcmVhZC1vbmx5IHQpCisgICAgICAgIChpbmhpYml0LW1vZGlmaWNhdGlvbi1ob29rcyB0
KSkKKyAgICAodnRhYmxlLS1pbnNlcnQgdGFibGUpKSkKKworKGRlZnVuIHZ0YWJsZS1zZXQtYnVm
ZmVyICh0YWJsZSBidWZmZXIpCisgICJBc3NvY2lhdGUgQlVGRkVSIHdpdGggVEFCTEUuCitVc2Ug
dGhpcyBmdW5jdGlvbiB3aXRoIGNhcmUsIGFuZCBlbnN1cmUgeW91ciB2dGFibGUgaW5zdGFuY2Ug
cmVuZGVycworaXRzZWxmIGluIHRoZSBuZXcgYnVmZmVyLiIKKyAgKHNldGYgKHZ0YWJsZS1idWZm
ZXIgdGFibGUpIGJ1ZmZlcikpCisKIChkZWZ1biB2dGFibGUtLWluc2VydC1saW5lICh0YWJsZSBs
aW5lIGxpbmUtbnVtYmVyIHdpZHRocyBzcGFjZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAmb3B0aW9uYWwgZWxsaXBzaXMgZWxsaXBzaXMtd2lkdGgpCiAgIChsZXQgKChzdGFy
dCAocG9pbnQpKQorICAgICAgICAoYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKSkKICAgICAg
ICAgKGNvbHVtbnMgKHZ0YWJsZS1jb2x1bW5zIHRhYmxlKSkKICAgICAgICAgKGNvbHVtbi1jb2xv
cnMKICAgICAgICAgIChhbmQgKHZ0YWJsZS1jb2x1bW4tY29sb3JzIHRhYmxlKQpAQCAtNjA3LDE2
ICs2MzUsMTggQEAgdnRhYmxlLS1pbnNlcnQtbGluZQogICAgICAgICAgICAgICAgICAgICAgIChj
b25jYXQKICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tbGltaXQtc3RyaW5nCiAgICAg
ICAgICAgICAgICAgICAgICAgICBwcmUtY29tcHV0ZWQgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yIGVsbGlwc2lzLXdpZHRo
IDApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgZWxsaXBz
aXMtd2lkdGggMCkpCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpCiAgICAgICAgICAg
ICAgICAgICAgICAgIGVsbGlwc2lzKQogICAgICAgICAgICAgICAgICAgICBwcmUtY29tcHV0ZWQp
KQogICAgICAgICAgICAgICAgICA7OyBSZWNvbXB1dGUgd2lkdGhzLgogICAgICAgICAgICAgICAg
ICAodAotICAgICAgICAgICAgICAgICAgKGlmICg+IChzdHJpbmctcGl4ZWwtd2lkdGggdmFsdWUp
IChlbHQgd2lkdGhzIGluZGV4KSkKKyAgICAgICAgICAgICAgICAgIChpZiAoPiAoc3RyaW5nLXBp
eGVsLXdpZHRoIHZhbHVlIGJ1ZmZlcikgKGVsdCB3aWR0aHMgaW5kZXgpKQogICAgICAgICAgICAg
ICAgICAgICAgIChjb25jYXQKICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tbGltaXQt
c3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAoLSAoZWx0IHdpZHRocyBpbmRl
eCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciBlbGxpcHNpcy13aWR0aCAw
KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgZWxsaXBzaXMtd2lkdGgg
MCkpCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpCiAgICAgICAgICAgICAgICAgICAg
ICAgIGVsbGlwc2lzKQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpKSkKICAgICAgICAgICAg
ICAgIChzdGFydCAocG9pbnQpKQpAQCAtNjMwLDE0ICs2NjAsMTUgQEAgdnRhYmxlLS1pbnNlcnQt
bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAnc3BhY2UKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgOndpZHRoIChsaXN0CiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKCsgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1waXhlbC13aWR0aCBkaXNw
bGF5ZWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChz
dHJpbmctcGl4ZWwtd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZGlzcGxheWVkIGJ1ZmZlcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGlmIGxhc3QgMCBzcGFjZXIpKSkpKSkpCiAgICAgICAgICAgICAgOzsg
QWxpZ24gdG8gdGhlIHJpZ2h0LgogICAgICAgICAgICAgIChpbnNlcnQgKHByb3BlcnRpemUgIiAi
ICdkaXNwbGF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAnc3BhY2UK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3aWR0aCAobGlzdCAoLSAo
ZWx0IHdpZHRocyBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoc3RyaW5nLXBpeGVsLXdpZHRoCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZCkpKSkpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bs
YXllZCBidWZmZXIpKSkpKQogICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkKQogICAgICAg
ICAgICAgICh1bmxlc3MgbGFzdAogICAgICAgICAgICAgICAgKGluc2VydCAocHJvcGVydGl6ZSAi
ICIgJ2Rpc3BsYXkKQEAgLTY2NCwxNiArNjk1LDYgQEAgdnRhYmxlLS1pbnNlcnQtbGluZQogKGRl
ZnVuIHZ0YWJsZS0tY2FjaGUta2V5ICgpCiAgIChjb25zIChmcmFtZS10ZXJtaW5hbCkgKHdpbmRv
dy13aWR0aCkpKQogCi0oZGVmdW4gdnRhYmxlLS1jdXJyZW50LWNhY2hlICgpCi0gICJSZXR1cm4g
dGhlIGN1cnJlbnQgY2FjaGUgZm9yIHRoZSB0YWJsZSBhdCBwb2ludC4KLQotSW4gYHZ0YWJsZS1p
bnNlcnQnLCB0aGUgbGluZXMgYW5kIHdpZHRocyBvZiB0aGUgdnRhYmxlIHRleHQgYXJlIGNvbXB1
dGVkCi1iYXNlZCBvbiB0aGUgY3VycmVudCBzZWxlY3RlZCBmcmFtZSBhbmQgd2luZG93IGFuZCBz
dG9yZWQgaW4gYSBjYWNoZS4KLVN1YnNlcXVlbnQgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdGV4dCBv
ZiB0aGUgdnRhYmxlIHNob3VsZCB1c2UgdGhhdCBjYWNoZQotdmlhIHRoaXMgZnVuY3Rpb24gcmF0
aGVyIHRoYW4gYnkgY2FsbGluZyBgdnRhYmxlLS1jYWNoZS1rZXknIHRvIGxvb2sgdXAKLXRoZSBj
YWNoZS4iCi0gIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICd2dGFibGUtY2FjaGUpKQotCiAo
ZGVmdW4gdnRhYmxlLS1jbGVhci1jYWNoZSAodGFibGUpCiAgIChzZXRmIChnZXRoYXNoICh2dGFi
bGUtLWNhY2hlLWtleSkgKHNsb3QtdmFsdWUgdGFibGUgJy1jYWNoZSkpIG5pbCkpCiAKQEAgLTcx
OCw2ICs3MzksNyBAQCB2dGFibGUtLWluZGljYXRvcgogKGRlZnVuIHZ0YWJsZS0taW5zZXJ0LWhl
YWRlci1saW5lICh0YWJsZSB3aWR0aHMgc3BhY2VyKQogICA7OyBJbnNlcnQgdGhlIGhlYWRlciBk
aXJlY3RseSBpbnRvIHRoZSBidWZmZXIuCiAgIChsZXQgKChzdGFydCAocG9pbnQpKQorICAgICAg
ICAoYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKSkKICAgICAgICAgKGRpdmlkZXIgKHZ0YWJs
ZS1kaXZpZGVyIHRhYmxlKSkKICAgICAgICAgKGNtYXAgKGRlZmluZS1rZXltYXAKICAgICAgICAg
ICAgICAgICAiPGhlYWRlci1saW5lPiA8ZHJhZy1tb3VzZS0xPiIgIyd2dGFibGUtLWRyYWctcmVz
aXplLWNvbHVtbgpAQCAtNzM3LDE0ICs3NTksMTUgQEAgdnRhYmxlLS1pbnNlcnQtaGVhZGVyLWxp
bmUKICAgICAgICAgICAgICAgICAgICAgICdrZXltYXAgY21hcCkpCiAgICAgICAgICAgICAgIChz
dGFydCAocG9pbnQpKQogICAgICAgICAgICAgICAoaW5kaWNhdG9yICh2dGFibGUtLWluZGljYXRv
ciB0YWJsZSBpbmRleCkpCi0gICAgICAgICAgICAgIChpbmRpY2F0b3Itd2lkdGggKHN0cmluZy1w
aXhlbC13aWR0aCBpbmRpY2F0b3IpKQorICAgICAgICAgICAgICAoaW5kaWNhdG9yLXdpZHRoIChz
dHJpbmctcGl4ZWwtd2lkdGggaW5kaWNhdG9yIGJ1ZmZlcikpCiAgICAgICAgICAgICAgIChsYXN0
ICg9IGluZGV4ICgxLSAobGVuZ3RoICh2dGFibGUtY29sdW1ucyB0YWJsZSkpKSkpCiAgICAgICAg
ICAgICAgIGRpc3BsYXllZCkKICAgICAgICAgIChzZXRxIGRpc3BsYXllZAotICAgICAgICAgICAg
ICAgKGlmICg+IChzdHJpbmctcGl4ZWwtd2lkdGggbmFtZSkKKyAgICAgICAgICAgICAgIChpZiAo
PiAoc3RyaW5nLXBpeGVsLXdpZHRoIG5hbWUgYnVmZmVyKQogICAgICAgICAgICAgICAgICAgICAg
ICgtIChlbHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgpKQogICAgICAgICAgICAgICAg
ICAgICh2dGFibGUtLWxpbWl0LXN0cmluZwotICAgICAgICAgICAgICAgICAgICBuYW1lICgtIChl
bHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgpKQorICAgICAgICAgICAgICAgICAgICBu
YW1lICgtIChlbHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgpCisgICAgICAgICAgICAg
ICAgICAgIGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgbmFtZSkpCiAgICAgICAgICAobGV0KiAo
KGluZGljYXRvci1sZWFkLXdpZHRoCiAgICAgICAgICAgICAgICAgIDs7IFdlIHdhbnQgdGhlIGlu
ZGljYXRvciB0byBub3QgYmUgcXVpdGUgZmx1c2ggcmlnaHQuCkBAIC03NTMsNyArNzc2LDcgQEAg
dnRhYmxlLS1pbnNlcnQtaGVhZGVyLWxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbmRpY2F0b3ItbGVhZC13aWR0aCkpCiAgICAgICAgICAgICAgICAgKGZpbGwt
d2lkdGgKICAgICAgICAgICAgICAgICAgKCsgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCi0gICAgICAg
ICAgICAgICAgICAgICAgIChzdHJpbmctcGl4ZWwtd2lkdGggZGlzcGxheWVkKQorICAgICAgICAg
ICAgICAgICAgICAgICAoc3RyaW5nLXBpeGVsLXdpZHRoIGRpc3BsYXllZCBidWZmZXIpCiAgICAg
ICAgICAgICAgICAgICAgICAgIGluZGljYXRvci13aWR0aAogICAgICAgICAgICAgICAgICAgICAg
ICBpbmRpY2F0b3ItbGVhZC13aWR0aCkKICAgICAgICAgICAgICAgICAgICAgKGlmIGxhc3QgMCBz
cGFjZXIpKSkpCkBAIC03NzEsNyArNzk0LDggQEAgdnRhYmxlLS1pbnNlcnQtaGVhZGVyLWxpbmUK
ICAgICAgICAgICAgICA7OyBUaGlzIGlzIHRoZSBmaW5hbCBjb2x1bW4sIGFuZCB3ZSBoYXZlIGEg
c29ydGluZwogICAgICAgICAgICAgIDs7IGluZGljYXRvciwgYW5kIHRoZSB0YWJsZSBpcyB0b28g
d2lkZSBmb3IgdGhlIHdpbmRvdy4KICAgICAgICAgICAgICAobGV0KiAoKHByZS1pbmRpY2F0b3Ig
KHN0cmluZy1waXhlbC13aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50LW1pbikgKHBvaW50KSkpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50LW1pbikgKHBvaW50
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikpCiAgICAgICAg
ICAgICAgICAgICAgIChwcmUtZmlsbAogICAgICAgICAgICAgICAgICAgICAgKC0gKHdpbmRvdy13
aWR0aCBuaWwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1pbmRpY2F0b3IKQEAgLTg1
MCwxNCArODc0LDE2IEBAIHZ0YWJsZS0tc2V0LWhlYWRlci1saW5lCiAgICAgICAgICAgIChidWZm
ZXItc3Vic3RyaW5nIChwb2ludC1taW4pICgxLSAocG9pbnQtbWF4KSkpKSkpCiAgICh2dGFibGUt
aGVhZGVyLW1vZGUgMSkpCiAKLShkZWZ1biB2dGFibGUtLWxpbWl0LXN0cmluZyAoc3RyaW5nIHBp
eGVscykKKworKGRlZnVuIHZ0YWJsZS0tbGltaXQtc3RyaW5nIChzdHJpbmcgcGl4ZWxzIGJ1ZmZl
cikKICAgKHdoaWxlIChhbmQgKGxlbmd0aD4gc3RyaW5nIDApCi0gICAgICAgICAgICAgICg+IChz
dHJpbmctcGl4ZWwtd2lkdGggc3RyaW5nKSBwaXhlbHMpKQorICAgICAgICAgICAgICAoPiAoc3Ry
aW5nLXBpeGVsLXdpZHRoIHN0cmluZyBidWZmZXIpIHBpeGVscykpCiAgICAgKHNldHEgc3RyaW5n
IChzdWJzdHJpbmcgc3RyaW5nIDAgKDEtIChsZW5ndGggc3RyaW5nKSkpKSkKICAgc3RyaW5nKQog
CiAoZGVmdW4gdnRhYmxlLS1jaGFyLXdpZHRoICh0YWJsZSkKLSAgKHN0cmluZy1waXhlbC13aWR0
aCAocHJvcGVydGl6ZSAieCIgJ2ZhY2UgKHZ0YWJsZS1mYWNlIHRhYmxlKSkpKQorICAoc3RyaW5n
LXBpeGVsLXdpZHRoIChwcm9wZXJ0aXplICJ4IiAnZmFjZSAodnRhYmxlLWZhY2UgdGFibGUpKQor
ICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtYnVmZmVyIHRhYmxlKSkpCiAKIChkZWZ1biB2
dGFibGUtLWNvbXB1dGUtd2lkdGggKHRhYmxlIHNwZWMpCiAgIChjb25kCkBAIC05MzYsNyArOTYy
LDcgQEAgdnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lCiAgICAgICAgOzsgV2Ugc3Rhc2ggdGhl
IGNvbXB1dGVkIHdpZHRoIGFuZCBzdHJpbmcgaGVyZSAtLSBpZiB0aGVyZSBhcmUKICAgICAgICA7
OyBubyBmb3JtYXR0ZXJzL2Rpc3BsYXllcnMsIHdlJ2xsIGJlIHVzaW5nIHRoZSBzdHJpbmcsIGFu
ZAogICAgICAgIDs7IHRoZW4gd29uJ3QgaGF2ZSB0byByZWNyZWF0ZSBpdC4KLSAgICAgICAobGlz
dCB2YWx1ZSAoc3RyaW5nLXBpeGVsLXdpZHRoIHN0cmluZykgc3RyaW5nKSkpCisgICAgICAgKGxp
c3QgdmFsdWUgKHN0cmluZy1waXhlbC13aWR0aCBzdHJpbmcgKHZ0YWJsZS1idWZmZXIgdGFibGUp
KSBzdHJpbmcpKSkKICAgICh2dGFibGUtY29sdW1ucyB0YWJsZSkpKQogCiAoZGVmdW4gdnRhYmxl
LS1tYWtlLWtleW1hcCAodGFibGUpCkBAIC05NjcsMjAgKzk5MywyMiBAQCB2dGFibGUtLW1ha2Ut
a2V5bWFwCiAgICAgICAgICAgKHZ0YWJsZS1rZXltYXAgdGFibGUpKQogICAgICAgbWFwKSkpCiAK
LShkZWZ1biB2dGFibGUtcmV2ZXJ0ICgpCi0gICJSZWdlbmVyYXRlIHRoZSB0YWJsZSB1bmRlciBw
b2ludC4iCi0gIChsZXQgKCh0YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKQotICAgICAgICAo
b2JqZWN0ICh2dGFibGUtY3VycmVudC1vYmplY3QpKQotICAgICAgICAoY29sdW1uICh2dGFibGUt
Y3VycmVudC1jb2x1bW4pKQotICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkpCi0gICAgKHVu
bGVzcyB0YWJsZQotICAgICAgKHVzZXItZXJyb3IgIk5vIHRhYmxlIHVuZGVyIHBvaW50IikpCi0g
ICAgKGRlbGV0ZS1yZWdpb24gKHZ0YWJsZS1iZWdpbm5pbmctb2YtdGFibGUpICh2dGFibGUtZW5k
LW9mLXRhYmxlKSkKLSAgICAodnRhYmxlLWluc2VydCB0YWJsZSkKLSAgICAod2hlbiBvYmplY3QK
LSAgICAgICh2dGFibGUtZ290by1vYmplY3Qgb2JqZWN0KSkKLSAgICAod2hlbiBjb2x1bW4KLSAg
ICAgICh2dGFibGUtZ290by1jb2x1bW4gY29sdW1uKSkpKQorKGRlZnVuIHZ0YWJsZS1yZXZlcnQg
KCZvcHRpb25hbCB0YWJsZSkKKyAgIlJlZ2VuZXJhdGUgVEFCTEUsIGRlZmF1bHRpbmcgdG8gdGhl
IHRhYmxlIHVuZGVyIHBvaW50LiIKKyAgKHNldHEgdGFibGUgKG9yIHRhYmxlICh2dGFibGUtY3Vy
cmVudC10YWJsZSkpKQorICAodW5sZXNzIHRhYmxlCisgICAgKHVzZXItZXJyb3IgIk5vIHRhYmxl
IHVuZGVyIHBvaW50IikpCisgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRh
YmxlKQorICAgIChsZXQgKChvYmplY3QgKHZ0YWJsZS1jdXJyZW50LW9iamVjdCkpCisgICAgICAg
ICAgKGNvbHVtbiAodnRhYmxlLWN1cnJlbnQtY29sdW1uKSkKKyAgICAgICAgICAoaW5oaWJpdC1y
ZWFkLW9ubHkgdCkKKyAgICAgICAgICAoaW5oaWJpdC1tb2RpZmljYXRpb24taG9va3MgdCkpCisg
ICAgICAoZGVsZXRlLXJlZ2lvbiAodnRhYmxlLWJlZ2lubmluZy1vZi10YWJsZSkgKHZ0YWJsZS1l
bmQtb2YtdGFibGUpKQorICAgICAgKHZ0YWJsZS0taW5zZXJ0IHRhYmxlKQorICAgICAgKHdoZW4g
b2JqZWN0CisgICAgICAgICh2dGFibGUtZ290by1vYmplY3Qgb2JqZWN0KSkKKyAgICAgICh3aGVu
IGNvbHVtbgorICAgICAgICAodnRhYmxlLWdvdG8tY29sdW1uIGNvbHVtbikpKSkpCiAKIDs7OyBD
b21tYW5kcy4KIApAQCAtMTAwNiwxNCArMTAzNCwxNCBAQCB2dGFibGUtbmFycm93LWN1cnJlbnQt
Y29sdW1uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtICgqICh2dGFibGUtLWNo
YXItd2lkdGggdGFibGUpIChvciBuIDEpKSkpKSkKIAogKGRlZnVuIHZ0YWJsZS0tYWx0ZXItY29s
dW1uLXdpZHRoICh0YWJsZSBjb2x1bW4gZGVsdGEpCi0gIChsZXQgKCh3aWR0aHMgKHZ0YWJsZS0t
Y2FjaGUtd2lkdGhzICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKSkpCisgIChsZXQgKCh3aWR0aHMg
KHZ0YWJsZS0tY2FjaGUtd2lkdGhzICh2dGFibGUtLWN1cnJlbnQtY2FjaGUgdGFibGUpKSkpCiAg
ICAgKHNldGYgKGFyZWYgd2lkdGhzIGNvbHVtbikKICAgICAgICAgICAobWF4ICgqICh2dGFibGUt
LWNoYXItd2lkdGggdGFibGUpIDIpCiAgICAgICAgICAgICAgICAoKyAoYXJlZiB3aWR0aHMgY29s
dW1uKSBkZWx0YSkpKQogICAgIDs7IFN0b3JlIHRoZSB3aWR0aCBzbyBpdCdsbCBiZSByZXNwZWN0
ZWQgb24gYSByZXZlcnQuCiAgICAgKHNldGYgKHZ0YWJsZS1jb2x1bW4td2lkdGggKGVsdCAodnRh
YmxlLWNvbHVtbnMgdGFibGUpIGNvbHVtbikpCiAgICAgICAgICAgKGZvcm1hdCAiJWRweCIgKGFy
ZWYgd2lkdGhzIGNvbHVtbikpKQotICAgICh2dGFibGUtcmV2ZXJ0KSkpCisgICAgKHZ0YWJsZS1y
ZXZlcnQgdGFibGUpKSkKIAogKGRlZnVuIHZ0YWJsZS13aWRlbi1jdXJyZW50LWNvbHVtbiAoJm9w
dGlvbmFsIG4pCiAgICJXaWRlbiB0aGUgY3VycmVudCBjb2x1bW4gYnkgTiBjaGFyYWN0ZXJzLgpA
QCAtMTAyOCwyNCArMTA1NiwyOSBAQCB2dGFibGUtcHJldmlvdXMtY29sdW1uCiAgIChpbnRlcmFj
dGl2ZSkKICAgKHZ0YWJsZS1nb3RvLWNvbHVtbgogICAgKG1heCAwICgxLSAob3IgKHZ0YWJsZS1j
dXJyZW50LWNvbHVtbikKLSAgICAgICAgICAgICAgICAgIChsZW5ndGggKHZ0YWJsZS0tY2FjaGUt
d2lkdGhzICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKSkpKSkpKQorICAgICAgICAgICAgICAgICAg
KGxlbmd0aCAodnRhYmxlLS1jYWNoZS13aWR0aHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICh2dGFibGUtLWN1cnJlbnQtY2FjaGUgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpKSkpKSkpCiAK
IChkZWZ1biB2dGFibGUtbmV4dC1jb2x1bW4gKCkKICAgIkdvIHRvIHRoZSBuZXh0IGNvbHVtbi4i
CiAgIChpbnRlcmFjdGl2ZSkKICAgKHdoZW4gKHZ0YWJsZS1jdXJyZW50LWNvbHVtbikKICAgICAo
dnRhYmxlLWdvdG8tY29sdW1uCi0gICAgIChtaW4gKDEtIChsZW5ndGggKHZ0YWJsZS0tY2FjaGUt
d2lkdGhzICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKSkpCisgICAgIChtaW4gKDEtIChsZW5ndGgg
KHZ0YWJsZS0tY2FjaGUtd2lkdGhzCisgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWN1
cnJlbnQtY2FjaGUgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpKSkKICAgICAgICAgICAoMSsgKHZ0
YWJsZS1jdXJyZW50LWNvbHVtbikpKSkpKQogCi0oZGVmdW4gdnRhYmxlLXJldmVydC1jb21tYW5k
ICgpCi0gICJSZS1xdWVyeSBkYXRhIGFuZCByZWdlbmVyYXRlIHRoZSB0YWJsZSB1bmRlciBwb2lu
dC4iCisoZGVmdW4gdnRhYmxlLXJldmVydC1jb21tYW5kICgmb3B0aW9uYWwgdGFibGUpCisgICJS
ZS1xdWVyeSBkYXRhIGFuZCByZWdlbmVyYXRlIFRBQkxFLgorSWYgVEFCTEUgaXMgbmlsLCB1c2Ug
dGhlIHRhYmxlIHVuZGVyIHBvaW50LiIKICAgKGludGVyYWN0aXZlKQotICAobGV0ICgodGFibGUg
KHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpCi0gICAgKHdoZW4gKHZ0YWJsZS1vYmplY3RzLWZ1bmN0
aW9uIHRhYmxlKQotICAgICAgKHNldGYgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSAoZnVuY2FsbCAo
dnRhYmxlLW9iamVjdHMtZnVuY3Rpb24gdGFibGUpKSkpCi0gICAgKHZ0YWJsZS0tY2xlYXItY2Fj
aGUgdGFibGUpKQotICAodnRhYmxlLXJldmVydCkpCisgIChzZXRxIHRhYmxlIChvciB0YWJsZSAo
dnRhYmxlLWN1cnJlbnQtdGFibGUpKSkKKyAgKHVubGVzcyB0YWJsZQorICAgICh1c2VyLWVycm9y
ICJObyB0YWJsZSBmb3VuZCIpKQorICAod2hlbiAodnRhYmxlLW9iamVjdHMtZnVuY3Rpb24gdGFi
bGUpCisgICAgKHNldGYgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSAoZnVuY2FsbCAodnRhYmxlLW9i
amVjdHMtZnVuY3Rpb24gdGFibGUpKSkpCisgICh2dGFibGUtLWNsZWFyLWNhY2hlIHRhYmxlKQor
ICAodnRhYmxlLXJldmVydCB0YWJsZSkpCiAKIChkZWZ1biB2dGFibGUtc29ydC1ieS1jdXJyZW50
LWNvbHVtbiAoKQogICAiU29ydCB0aGUgdGFibGUgdW5kZXIgcG9pbnQgYnkgdGhlIGNvbHVtbiB1
bmRlciBwb2ludC4iCkBAIC0xMDY3LDggKzExMDAsOCBAQCB2dGFibGUtc29ydC1ieS1jdXJyZW50
LWNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoZXEgKGNkciBs
YXN0KSAnYXNjZW5kKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVz
Y2VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzY2VuZCkKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzY2VuZCkpKSkpKQotICAodnRhYmxlLXJldmVy
dCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc2NlbmQpKSkpKQorICAgICh2
dGFibGUtcmV2ZXJ0IHRhYmxlKSkpCiAKIChkZWZ1biB2dGFibGUtaGVhZGVyLWxpbmUtc29ydCAo
ZSkKICAgIlNvcnQgYSB2dGFibGUgZnJvbSB0aGUgaGVhZGVyIGxpbmUuIgpkaWZmIC0tZ2l0IGEv
dGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsIGIvdGVzdC9saXNwL2VtYWNzLWxp
c3AvdnRhYmxlLXRlc3RzLmVsCmluZGV4IDc0ZmI4Y2M4MTM5Li5lMDMyOGUzMWJjNSAxMDA2NDQK
LS0tIGEvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsCisrKyBiL3Rlc3QvbGlz
cC9lbWFjcy1saXNwL3Z0YWJsZS10ZXN0cy5lbApAQCAtMjcsMTYgKzI3LDE5IEBACiAocmVxdWly
ZSAnZXJ0KQogKHJlcXVpcmUgJ2VydC14KQogCi0oZXJ0LWRlZnRlc3QgdGVzdC12c3RhYmxlLWNv
bXB1dGUtY29sdW1ucyAoKQorKGRlZnVuIHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFkZXItMi1v
YmplY3QtdGFibGUgKCkKKyAgKG1ha2UtdnRhYmxlIDpjb2x1bW5zICcoImEiICJiIiAiYyIpCisg
ICAgICAgICAgICAgICA6b2JqZWN0cyAnKCgiZm9vIiAxIDIpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICgiYmFyIiAzIDp6b3QpKQorICAgICAgICAgICAgICAgOmluc2VydCBuaWwpKQorCiso
ZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtY29tcHV0ZS1jb2x1bW5zICgpCiAgIChzaG91bGQKICAg
IChlcXVhbCAobWFwY2FyCiAgICAgICAgICAgIChsYW1iZGEgKGNvbHVtbikKICAgICAgICAgICAg
ICAodnRhYmxlLWNvbHVtbi1hbGlnbiBjb2x1bW4pKQogICAgICAgICAgICAodnRhYmxlLS1jb21w
dXRlLWNvbHVtbnMKLSAgICAgICAgICAgIChtYWtlLXZ0YWJsZSA6Y29sdW1ucyAnKCJhIiAiYiIg
ImMiKQotICAgICAgICAgICAgICAgICAgICAgICAgIDpvYmplY3RzICcoKCJmb28iIDEgMikKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYmFyIiAzIDp6b3QpKQotICAgICAg
ICAgICAgICAgICAgICAgICAgIDppbnNlcnQgbmlsKSkpCisgICAgICAgICAgICAodnRhYmxlLXRl
c3RzLS1tYWtlLW5vLWhlYWRlci0yLW9iamVjdC10YWJsZSkpKQogICAgICAgICAgICcobGVmdCBy
aWdodCBsZWZ0KSkpKQogCiAoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtaW5zZXJ0LW9iamVjdCAo
KQpAQCAtNjksNCArNzIsNzUgQEAgdGVzdC12dGFibGUtaW5zZXJ0LW9iamVjdAogICAgICAgICAg
ICAgICAobWFwY2FyICMnY2FkciAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkpCiAgICAgICAgICAg
KG51bWJlci1zZXF1ZW5jZSAwIDExKSkpKQogCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtdW5p
cXVlLWJ1ZmZlciAoKQorICAobGV0ICgodGFibGUgKHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFk
ZXItMi1vYmplY3QtdGFibGUpKSkKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgKHZ0YWJs
ZS1pbnNlcnQgdGFibGUpCisgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgICAoc2hvdWxk
LWVycm9yICh2dGFibGUtaW5zZXJ0IHRhYmxlKSkpCisgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgor
ICAgICAgICAodnRhYmxlLXNldC1idWZmZXIgdGFibGUgKGN1cnJlbnQtYnVmZmVyKSkKKyAgICAg
ICAgKHZ0YWJsZS1pbnNlcnQgdGFibGUpKSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUt
cmVhZC1vbmx5LWJ1ZmZlciAoKQorICAobGV0ICgodGFibGUgKHZ0YWJsZS10ZXN0cy0tbWFrZS1u
by1oZWFkZXItMi1vYmplY3QtdGFibGUpKSkKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAg
KHNldHEgYnVmZmVyLXJlYWQtb25seSB0KQorICAgICAgKHZ0YWJsZS1pbnNlcnQgdGFibGUpKSkp
CisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItaW5zZXJ0LW9i
amVjdCAoKQorICAobGV0ICgodGFibGUgKHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFkZXItMi1v
YmplY3QtdGFibGUpKQorICAgICAgICAob2JqICcoImJheiIgNCA1KSkpCisgICAgKHdpdGgtdGVt
cC1idWZmZXIKKyAgICAgICh2dGFibGUtaW5zZXJ0IHRhYmxlKQorICAgICAgKHNob3VsZCAoPSAo
Y291bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpIDIpKQorICAgICAgKHdpdGgtdGVt
cC1idWZmZXIKKyAgICAgICAgKHZ0YWJsZS1pbnNlcnQtb2JqZWN0IHRhYmxlIG9iaikpCisgICAg
ICAoc2hvdWxkICg9IChjb3VudC1saW5lcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkgMykpKSkp
CisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItcmVtb3ZlLW9i
amVjdCAoKQorICAobGV0ICgodGFibGUgKHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFkZXItMi1v
YmplY3QtdGFibGUpKQorICAgICAgICAob2JqICcoImJheiIgNCA1KSkpCisgICAgKHdpdGgtdGVt
cC1idWZmZXIKKyAgICAgICh2dGFibGUtaW5zZXJ0IHRhYmxlKQorICAgICAgKHZ0YWJsZS1pbnNl
cnQtb2JqZWN0IHRhYmxlIG9iaikKKyAgICAgIChzaG91bGQgKD0gKGNvdW50LWxpbmVzIChwb2lu
dC1taW4pIChwb2ludC1tYXgpKSAzKSkKKyAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAg
ICh2dGFibGUtcmVtb3ZlLW9iamVjdCB0YWJsZSBvYmopKQorICAgICAgKHNob3VsZCAoPSAoY291
bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpIDIpKSkpKQorCisoZXJ0LWRlZnRlc3Qg
dGVzdC12dGFibGUtbm9uLWN1cnJlbnQtYnVmZmVyLXVwZGF0ZS1vYmplY3QgKCkKKyAgKGxldCAo
KHRhYmxlICh2dGFibGUtdGVzdHMtLW1ha2Utbm8taGVhZGVyLTItb2JqZWN0LXRhYmxlKSkKKyAg
ICAgICAgKG9iaiAnKCJiYXoiIDQgNSkpCisgICAgICAgIChvYmotMiAnKCJxdXgiIDYgNykpKQor
ICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAodnRhYmxlLWluc2VydCB0YWJsZSkKKyAgICAg
ICh2dGFibGUtaW5zZXJ0LW9iamVjdCB0YWJsZSBvYmopCisgICAgICAoc2hvdWxkICg9IChjb3Vu
dC1saW5lcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkgMykpCisgICAgICAobGV0ICgobGluZS0y
IChwcm9nbgorICAgICAgICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisg
ICAgICAgICAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAyKQorICAgICAgICAgICAgICAgICAg
ICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkgKHBvaW50LW1heCkpKSkpCisgICAgICAgICh3
aXRoLXRlbXAtYnVmZmVyCisgICAgICAgICAgKHZ0YWJsZS11cGRhdGUtb2JqZWN0IHRhYmxlIG9i
ai0yIG9iaikpCisgICAgICAgIChsZXQgKChsaW5lLTItbmV3IChwcm9nbgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGZvcndhcmQtbGluZSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChidWZmZXItc3Vic3RyaW5nIChwb2ludCkgKHBvaW50LW1heCkpKSkpCisgICAgICAgICAgKHNo
b3VsZCAoPSAoY291bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpIDMpKQorICAgICAg
ICAgIChzaG91bGQgKG5vdCAoc3RyaW5nPSBsaW5lLTIgbGluZS0yLW5ldykpKSkpKSkpCisKKyhl
cnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS0tbGltaXQtc3RyaW5nLXdpdGgtZmFjZS1yZW1hcHBlZC1i
dWZmZXIgKCkKKyAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAobGV0ICgodGV4dCAocHJvcGVydGl6
ZSAiWFhYWFgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhY2UgJ3ZhcmlhYmxlLXBp
dGNoKSkpCisgICAgICAoZmFjZS1yZW1hcC1hZGQtcmVsYXRpdmUgJ2RlZmF1bHQgOmhlaWdodCAx
LjUpCisgICAgICAoaWYgKD4gZW1hY3MtbWFqb3ItdmVyc2lvbiAzMCkKKyAgICAgICAgICAoc2hv
dWxkIChlcQorICAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgICAgICAgICAgICAobGVuZ3Ro
ICh2dGFibGUtLWxpbWl0LXN0cmluZyB0ZXh0IDUwIChjdXJyZW50LWJ1ZmZlcikpKSkpCisgICAg
ICAgIChzaG91bGQgKGVxCisgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgICAgICAgICAgKGxl
bmd0aCAodnRhYmxlLS1saW1pdC1zdHJpbmcgdGV4dCA1MCkpKSkpKSkpCisKIDs7OyB2dGFibGUt
dGVzdHMuZWwgZW5kcyBoZXJlCi0tIAoyLjQ3LjEKCg==
--0000000000008478ad064626a743--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 17 Dec 2025 14:13:03 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 17 09:13:03 2025
Received: from localhost ([127.0.0.1]:42079 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vVsH0-000557-De
	for submit <at> debbugs.gnu.org; Wed, 17 Dec 2025 09:13:03 -0500
Received: from mxout1.mail.janestreet.com ([38.105.200.78]:47759)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <sbaugh@HIDDEN>)
 id 1vVsGx-00054Z-2k
 for 79982 <at> debbugs.gnu.org; Wed, 17 Dec 2025 09:13:00 -0500
Received: from mail-lf1-f69.google.com ([209.85.167.69])
 by mxgoog2.mail.janestreet.com with esmtps (TLS1.3:TLS_AES_128_GCM_SHA256:128)
 (Exim 4.99) id 1vVsGq-00000009b0i-3K3U for 79982 <at> debbugs.gnu.org;
 Wed, 17 Dec 2025 09:12:53 -0500
Received: by mail-lf1-f69.google.com with SMTP id
 2adb3069b0e04-597d583f5ecso4073118e87.3
 for <79982 <at> debbugs.gnu.org>; Wed, 17 Dec 2025 06:12:52 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=janestreet.com; s=google; t=1765980772; x=1766585572; darn=debbugs.gnu.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=1izPC4vAK5wgr4UylXU3XbP1kR3XJmmmGzhpgxoV4Tw=;
 b=Ht6yCq74hz1DfaVaB4mdjlJ6hludgKTzbV8Xs7w2VM/aXEKIh7pmRzRgVVaXXE4ME0
 2cwArgMROSqYXsQP3cGfyjJIFw3Qftv3Su8vHxZnKdpGqcZXG/Bnhwrrc400h5HAc5kI
 zq2Ci0vDTHw69ITfORO8fA8ouosfzwBe9ZCP0=
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com;
 s=waixah; t=1765980773;
 bh=1izPC4vAK5wgr4UylXU3XbP1kR3XJmmmGzhpgxoV4Tw=;
 h=References:In-Reply-To:From:Date:Subject:To:Cc;
 b=q8KHfvgTE/+bhnNoaE5olDh90f8UEfnxIbk3C5KwAGK7uTw7GCPFxLNVv2IFlU7tA
 oelLWlWHaA92muFGE4YeFkKPi0OTMSy1O+t8h3YDv4pQwKKUq+BKUi7wW+5Ljk1U5e
 Vc2GVejJwrao5HQt4riJ4bMCKOIPLxY+S6CuimAdnVkbUXQMRij3SdNuiqFnXW/Xm5
 N3Yu3v58i+u0wgwsJ7yovHxe1DHROiQs3djRj8z99CtuxusvTyK9dv7PiTV0xDqmZo
 tFpc8h46kddPAxNKrpZM6eH7UqebDNKvjQ/Cy0kzejyZtx9CT+P+NyKGhUgVyTz0xJ
 HyuZ1a3tsNChw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765980772; x=1766585572;
 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=1izPC4vAK5wgr4UylXU3XbP1kR3XJmmmGzhpgxoV4Tw=;
 b=Z17Z+uaNdPuZtJt0kzcX9bUpltQjSxBEoJQK/6jwEDGean/d5/fO71tLJczORaoZpq
 lEZ/lPtFxZIk05p+dGASKaUjSQHG3IfcU4mCyRAiATG0CBivkrDz2LdsZpo+7tW8qD05
 IH26S+tevvV3708foGHIqUdgsx3KLHgpW338oBFgkGRYkr0+rDTb1T9Qbhq3+7334LD2
 n1j/Xj0dWH8CobNWnI5R3hCUBzRWiBSjauLWXMuZ00M74aaMFSpqS+KTkhNBRZNtrajx
 k0/Wfh3KtyUqB5s8QMh9Cmm+7FTt0ssT9c/yOxQoHtiqKxOc5M2gZDjlufVyi+OcVSvs
 M//g==
X-Forwarded-Encrypted: i=1;
 AJvYcCVn3j3+j6MCGyOOLtvlLF+8CU7M8VFMHl9Db07idiV3TAB5AjUdw+F1FoTj2LWHmFU4Hh5wlA==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YxfiOLE/pJINrZ2tmGu23PVCpNaBVMZjB6Av8rWQUF7HdUGR7O1
 jb6s8RNUuUWqoAQTS73Y5fv0a4LmREUY2hf2hX67HHnprt4KMYxFXJhmwPH60cmxYcd+11FnEOR
 /cyWR0JnhciST+DVGQVszqQ48VhqyciRGvrbXJQhYpztHPFSWVfGFMmZG6BCHdKY+dMtarZmGxp
 RMohZL1KDqioNJQWwoAy22HhKUOHfZJQ==
X-Gm-Gg: AY/fxX7AI5fByW0icEtOtOOFHvd/tZR5ohyluguPJfZLSYfepxNjWyoc0+mhSB+gR7h
 aCBz5NbW2a6ttPFbBkx3wBi6CFrKyCk79Q7Bm/bhcrUeOdCF0G0oWWUyLLRfOmrloYT3PYRBXgn
 K+l44pjLvdlPKVjO/953TZ4/nMnPThn2BdEA/rqbMev32RVADQJndRXpeFamXJ8NcxFRCPuYOL0
 KMhuX64WXdk0iNXHcQMQrNEAMr5V5Tb8ggUnzvd+NiG948YWw==
X-Received: by 2002:a05:6512:3c8c:b0:595:9da3:fe6a with SMTP id
 2adb3069b0e04-598faa22af3mr6510155e87.10.1765980771344; 
 Wed, 17 Dec 2025 06:12:51 -0800 (PST)
X-Google-Smtp-Source: AGHT+IG/j5n/ocohdgHtCbR0XUty5NQPbYbYUQhpkgsHoghV3j+JQHIsDJfnatysT+yJF0tsFLMdgL3Nij0bghWnTog=
X-Received: by 2002:a05:6512:3c8c:b0:595:9da3:fe6a with SMTP id
 2adb3069b0e04-598faa22af3mr6510130e87.10.1765980770724; Wed, 17 Dec 2025
 06:12:50 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <ierzf7ndebe.fsf_-_@HIDDEN>
 <CAN+1HbrMnL=PJt0d-ePEd5y15zDWVZQK0wJYEi5+b+wY3VK4DQ@HIDDEN>
 <CAN+1HbqXgFw0eh_asmGkNuJ9Lv-vfm10SELQs6U9M2U3p=QUog@HIDDEN>
 <iertsxvd878.fsf@HIDDEN>
 <CAN+1HbpOOT9RXTQeGW8je=uz0aV=19oYWwhu3Dj=GGkFmOdkgw@HIDDEN>
 <CAN+1HbrqF3OqdZQxgWWWmOjTd4UW4Vu64X5mS28M2N50TgzCgQ@HIDDEN>
 <ierv7i7xv64.fsf@HIDDEN>
 <CAN+1Hbriar_5zAHd-cTSqDJOUgYzxJPM9i+2CLCPbXRt_DRwQA@HIDDEN>
 <CAN+1HboS10cjaUJ=ztDWuL0OMur0U3Nzfj=NpSKcrmqZ6eD82A@HIDDEN>
In-Reply-To: <CAN+1HboS10cjaUJ=ztDWuL0OMur0U3Nzfj=NpSKcrmqZ6eD82A@HIDDEN>
From: Spencer Baugh <sbaugh@HIDDEN>
Date: Wed, 17 Dec 2025 09:12:40 -0500
X-Gm-Features: AQt7F2pzF_Lhlhg1QbVrL9aue5d3FQeq93EIV7VX1dqwW38PuiCMLqnHuc1Byt8
Message-ID: <CAO=BR8OAWvVan4emACKBG2+pMs2KeTfR7+VWdQ5dQcWECJEegw@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot,
 [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
To: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Content-Type: multipart/alternative; boundary="00000000000084fbf506462670cd"
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

--00000000000084fbf506462670cd
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Yes, looks good to me

On Wed, Dec 17, 2025, 8:42=E2=80=AFAM St=C3=A9phane Marks <shipmints@gmail.=
com> wrote:

> On Mon, Dec 15, 2025 at 6:29=E2=80=AFPM St=C3=A9phane Marks <shipmints@gm=
ail.com>
> wrote:
>
>> On Mon, Dec 15, 2025 at 5:00=E2=80=AFPM Spencer Baugh <sbaugh@janestreet=
.com>
>> wrote:
>>
>>> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>>>
>>> > On Fri, Dec 12, 2025 at 10:48=E2=80=AFAM St=C3=A9phane Marks <shipmin=
ts@HIDDEN>
>>> wrote:
>>> >
>>> >  On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh <sbaugh@janes=
treet.com>
>>> wrote:
>>> >
>>> >  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>>> >
>>> >  > On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks <shipm=
ints@HIDDEN>
>>> wrote:
>>> >  >
>>> >  >  On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh <
>>> sbaugh@HIDDEN> wrote:
>>> >  >
>>> >  >  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>>> >  >  > --- a/lisp/emacs-lisp/vtable.el
>>> >  >  > +++ b/lisp/emacs-lisp/vtable.el
>>> >  >  > @@ -398,56 +403,58 @@ vtable-insert-object
>>> >  >  ...
>>> >  >  > +      (with-current-buffer (vtable-buffer table)
>>> >  >  > +        (save-excursion
>>> >  >
>>> >  >  So in the end I think the only way to keep the diff to
>>> vtable-insert-object small is
>>> >  >  if you use (set-buffer (vtable-buffer table)) here instead of
>>> >  >  with-current-buffer.  It's a bit less normal, but it at least
>>> avoids
>>> >  >  some unnecessary indentation.
>>> >  >
>>> >  >  That is, instead of
>>> >  >  (with-current-buffer (vtable-buffer table)
>>> >  >    (save-excursion
>>> >  >      ...))
>>> >  >
>>> >  >  do
>>> >  >
>>> >  >  (save-excursion
>>> >  >    (set-buffer (vtable-buffer table))
>>> >  >    ...)
>>> >  >
>>> >  >  (save-excursion saves and restores the current buffer)
>>> >  >
>>> >  >  Thanks for making all these changes.  I think after that we shoul=
d
>>> be
>>> >  >  good to go.
>>> >  >
>>> >  >  While I appreciate the desire for tiny diffs, I prefer that the
>>> stanzas used in update insert remove functions remain
>>> >  consistent
>>> >  >  and we avoid a special comment explaining why insert is special
>>> saying this was just for indentation.  Hrumph.
>>> >  >
>>> >  > The alternative would be to make them all save-excursion,
>>> set-buffer, if you think that's worthy.
>>> >
>>> >  IMO that's worth doing.  It also saves indentation, so it's actually
>>> >  somewhat useful in all the places we're currently adding a
>>> >  with-current-buffer, even if it doesn't avoid a big reindent diff.
>>> >
>>> >  I forgot about the compiler warning
>>> >
>>> >    emacs-lisp/vtable.el:376:10: Warning: Use =E2=80=98with-current-bu=
ffer=E2=80=99
>>> rather than save-excursion+set-buffer
>>> >
>>> >  We may also need save-excursion twice, once for what is the ambient
>>> current buffer, and the second to ensure that point doesn't
>>> >  move around in the vtable-buffer.  Both of these, I think, are
>>> satisfied via with-current-buffer and we avoid the warning.  So,
>>> >  perhaps, we should bite the bullet and swallow the extra indentation
>>> in vtable-insert-object and use the more robust and simpler
>>> >  w-c-b.
>>> >
>>> > I can get a revised patch out quickly.  Can we agree on using
>>> with-current-buffer and suffer the few extra indented diff lines?
>>>
>>> Yes, okay, I agree it's fine.  I don't think you need to revise anythin=
g
>>> there, your most recent patch is fine.  (Except for the other issue I
>>> just emailed about)
>>>
>>
>> Thanks for catching the buffer-local let bindings.
>>
>> Here's a revised patch.  Up next, a simpler patch optimizing
>> vtable--limit-string with a string-length heuristic, and which a bunch o=
f
>> us have tested.
>>
>
> Looks good to you?  I can assume we'll commit this, or very close to it,
> and start submitting other patches.  There are a lot of changes and the
> more parsimonious the patches, the more time this will take and I think w=
e
> all agree vtable needs a lot of help on top of Lars's great start and I'd
> like to see the suite of changes in Emacs 31 so there's not that much tim=
e,
> if Eli wants to cut a branch soon.
>

--00000000000084fbf506462670cd
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"auto">Yes, looks good to me</div><br><div class=3D"gmail_quote =
gmail_quote_container"><div dir=3D"ltr" class=3D"gmail_attr">On Wed, Dec 17=
, 2025, 8:42=E2=80=AFAM St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints=
@gmail.com">shipmints@HIDDEN</a>&gt; wrote:<br></div><blockquote class=
=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padd=
ing-left:1ex"><div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default=
" style=3D"font-family:monospace"><span style=3D"font-family:Arial,Helvetic=
a,sans-serif">On Mon, Dec 15, 2025 at 6:29=E2=80=AFPM St=C3=A9phane Marks &=
lt;<a href=3D"mailto:shipmints@HIDDEN" target=3D"_blank" rel=3D"noreferr=
er">shipmints@HIDDEN</a>&gt; wrote:</span></div></div><div class=3D"gmai=
l_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8e=
x;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"=
><div dir=3D"ltr"><div style=3D"font-family:monospace"><span style=3D"font-=
family:Arial,Helvetica,sans-serif">On Mon, Dec 15, 2025 at 5:00=E2=80=AFPM =
Spencer Baugh &lt;<a href=3D"mailto:sbaugh@HIDDEN" target=3D"_blank=
" rel=3D"noreferrer">sbaugh@HIDDEN</a>&gt; wrote:</span></div></div=
><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"marg=
in:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1e=
x">St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@HIDDEN" target=3D=
"_blank" rel=3D"noreferrer">shipmints@HIDDEN</a>&gt; writes:<br>
<br>
&gt; On Fri, Dec 12, 2025 at 10:48=E2=80=AFAM St=C3=A9phane Marks &lt;<a hr=
ef=3D"mailto:shipmints@HIDDEN" target=3D"_blank" rel=3D"noreferrer">ship=
mints@HIDDEN</a>&gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh &lt;<a hr=
ef=3D"mailto:sbaugh@HIDDEN" target=3D"_blank" rel=3D"noreferrer">sb=
augh@HIDDEN</a>&gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@HIDDEN" t=
arget=3D"_blank" rel=3D"noreferrer">shipmints@HIDDEN</a>&gt; writes:<br>
&gt;<br>
&gt;=C2=A0 &gt; On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks=
 &lt;<a href=3D"mailto:shipmints@HIDDEN" target=3D"_blank" rel=3D"norefe=
rrer">shipmints@HIDDEN</a>&gt; wrote:<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh=
 &lt;<a href=3D"mailto:sbaugh@HIDDEN" target=3D"_blank" rel=3D"nore=
ferrer">sbaugh@HIDDEN</a>&gt; wrote:<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@g=
mail.com" target=3D"_blank" rel=3D"noreferrer">shipmints@HIDDEN</a>&gt; =
writes:<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; --- a/lisp/emacs-lisp/vtable.el<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; +++ b/lisp/emacs-lisp/vtable.el<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; @@ -398,56 +403,58 @@ vtable-insert-object<br>
&gt;=C2=A0 &gt;=C2=A0 ...<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; +=C2=A0 =C2=A0 =C2=A0 (with-current-buffer (vtab=
le-buffer table)<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-excursion<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 So in the end I think the only way to keep the diff t=
o vtable-insert-object small is<br>
&gt;=C2=A0 &gt;=C2=A0 if you use (set-buffer (vtable-buffer table)) here in=
stead of<br>
&gt;=C2=A0 &gt;=C2=A0 with-current-buffer.=C2=A0 It&#39;s a bit less normal=
, but it at least avoids<br>
&gt;=C2=A0 &gt;=C2=A0 some unnecessary indentation.<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 That is, instead of<br>
&gt;=C2=A0 &gt;=C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 (save-excursion<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 =C2=A0 ...))<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 do<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 (save-excursion<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 (set-buffer (vtable-buffer table))<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 ...)<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 (save-excursion saves and restores the current buffer=
)<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 Thanks for making all these changes.=C2=A0 I think af=
ter that we should be<br>
&gt;=C2=A0 &gt;=C2=A0 good to go.<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 While I appreciate the desire for tiny diffs, I prefe=
r that the stanzas used in update insert remove functions remain<br>
&gt;=C2=A0 consistent<br>
&gt;=C2=A0 &gt;=C2=A0 and we avoid a special comment explaining why insert =
is special saying this was just for indentation.=C2=A0 Hrumph.<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt; The alternative would be to make them all save-excursion, s=
et-buffer, if you think that&#39;s worthy.<br>
&gt;<br>
&gt;=C2=A0 IMO that&#39;s worth doing.=C2=A0 It also saves indentation, so =
it&#39;s actually<br>
&gt;=C2=A0 somewhat useful in all the places we&#39;re currently adding a<b=
r>
&gt;=C2=A0 with-current-buffer, even if it doesn&#39;t avoid a big reindent=
 diff.<br>
&gt;<br>
&gt;=C2=A0 I forgot about the compiler warning<br>
&gt;<br>
&gt;=C2=A0 =C2=A0 emacs-lisp/vtable.el:376:10: Warning: Use =E2=80=98with-c=
urrent-buffer=E2=80=99 rather than save-excursion+set-buffer<br>
&gt;<br>
&gt;=C2=A0 We may also need save-excursion twice, once for what is the ambi=
ent current buffer, and the second to ensure that point doesn&#39;t<br>
&gt;=C2=A0 move around in the vtable-buffer.=C2=A0 Both of these, I think, =
are satisfied via with-current-buffer and we avoid the warning.=C2=A0 So,<b=
r>
&gt;=C2=A0 perhaps, we should bite the bullet and swallow the extra indenta=
tion in vtable-insert-object and use the more robust and simpler<br>
&gt;=C2=A0 w-c-b.<br>
&gt;<br>
&gt; I can get a revised patch out quickly.=C2=A0 Can we agree on using wit=
h-current-buffer and suffer the few extra indented diff lines?<br>
<br>
Yes, okay, I agree it&#39;s fine.=C2=A0 I don&#39;t think you need to revis=
e anything<br>
there, your most recent patch is fine.=C2=A0 (Except for the other issue I<=
br>
just emailed about)<br></blockquote><div><br></div><div style=3D"font-famil=
y:monospace">Thanks for catching the buffer-local let bindings.</div><div s=
tyle=3D"font-family:monospace"><br></div><div style=3D"font-family:monospac=
e">Here&#39;s a revised patch.=C2=A0 Up next, a simpler patch optimizing vt=
able--limit-string with a string-length heuristic, and which a bunch of us =
have tested.<br></div></div></div></blockquote><div><br></div><div class=3D=
"gmail_default" style=3D"font-family:monospace">Looks good to you?=C2=A0 I =
can assume we&#39;ll commit this, or very close to it, and start submitting=
 other patches.=C2=A0 There are a lot of changes and the more parsimonious =
the patches, the more time this will take and I think we all agree vtable n=
eeds a lot of help on top of Lars&#39;s great start and I&#39;d like to see=
 the suite of changes in Emacs 31 so there&#39;s not that much time, if Eli=
 wants to cut a branch soon.</div></div></div>
</blockquote></div>

--00000000000084fbf506462670cd--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 17 Dec 2025 13:43:08 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 17 08:43:07 2025
Received: from localhost ([127.0.0.1]:41638 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vVro3-0002wA-7X
	for submit <at> debbugs.gnu.org; Wed, 17 Dec 2025 08:43:07 -0500
Received: from mail-ua1-x933.google.com ([2607:f8b0:4864:20::933]:56500)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vVro0-0002vf-Bt
 for 79982 <at> debbugs.gnu.org; Wed, 17 Dec 2025 08:43:05 -0500
Received: by mail-ua1-x933.google.com with SMTP id
 a1e0cc1a2514c-9413e5ee53eso2324254241.0
 for <79982 <at> debbugs.gnu.org>; Wed, 17 Dec 2025 05:43:04 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765978979; x=1766583779; darn=debbugs.gnu.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=xtsJNdwx8+HR4YvuydV1EbPTVkMrKbTPRkhdaP0yUN0=;
 b=ExakFvmueF6ur5sQZ8AJGwouhkbVff8VRYF3rAFCiT8CinhxlYRfX1ZSUAO8Ug6uqO
 ZSgRymrRMnApjXf0bDt2dgeOGzNdh9Vl+OfR6sP1sYYnBn6A+A9KJhpB0bTEBsK1lUYJ
 r321Fj0xsVelkaY44AZFModS5/+s3oTIhZLroU/ZU6EmCjb+s5/o5mv57UKcpaY5cXb/
 bXqc9MQ5jzkeANES0AQ5sxs9QD/MIdAfLdT4+OCzKvko2cj/QC/diG3l/NWzgKI6gvUI
 X4SrsHMKKq8iF9XZz3QZwNisZdlUFJFj8+jsmLf2FYKGZI+LxjwcfDfYRXc5QKGhlACC
 WIRg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765978979; x=1766583779;
 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=xtsJNdwx8+HR4YvuydV1EbPTVkMrKbTPRkhdaP0yUN0=;
 b=UlOWnG3U836tyF/AxZuakl+m7hAzkyqwlvZi7XQ6m+4Pq21wcsNaiWlP80au0sw9Ey
 DQOJZc8N6KHU5TOUjD9J7+Vap0hZDJgMx3oUtExjQQ+Zrdx+6PgyJf4tkoa8oC2pawJ0
 GIOghqTJTruDOMoqXJxeDLIZOhhbyWxdEwKoZI/D9XJnBULIU/ckzv4oMewhrCgL5J8D
 EXRY8todBhuxIFd9tWqjo4BNcXjivkO2fDSAsKe8S0u3YAr5rV1cehHjXWjdIBymqB07
 4teb8pgS58EfPEo2WrZwD0l/rUof/yqMsARJEVPsArT2i3XqrzIepavB1VfaFB2UA51r
 n5VQ==
X-Forwarded-Encrypted: i=1;
 AJvYcCVhQCfWjwV1Gquo6bzMUBTCude1LhOli33STkaA0A0I6u5f6jyVg9DifejshPZpPxsyl9RNTg==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YxT+nU/2QpxEzTaYEbpQXMum2lrpJ25CFg3rd7PUQqHx+rDmuEh
 MUIEJf1M2zBHsa4/LA4DIcPVuAyydSK+2ah9dL9/d/LaDcR65zQiEyxps6Xi+ft46533M4D3aS8
 lQQ2n3qp7OSFn/YBHtYPCOeO/VWA3+ms=
X-Gm-Gg: AY/fxX7KSouga9zz67r2Ns90WRkvU+jOxy9sLonKlwhmjohUoIw3t/uMyWz42RzMw36
 7kwY7Zh5qHNNOmf+ToOeL4jAgT+udFwKDi+ZW7HB1nNp9tDzXsjWS5V1jqDGTM3GhP03rL5bPOr
 uY7/APbHWS8DTUfE+Lc2cyRCyR6VWNR1S5iLGt+v+5LqpEeFhFQ7b6UZMPYqM9HhtO5N7ZiLFnl
 yW/AUjPQ57yMqqGAk1SsxW3ENneo8JhGNPymo8ew74dJWkGM3PQjL2fKQ7yxk26BWUooFE=
X-Google-Smtp-Source: AGHT+IGaEm2l3ihLabdSY52b00KDdoVWB816VtPhDtY8pej2ewO5XvdoxKJvc+U4lXOo0tO95+adaOYv1BTi7Yj1igI=
X-Received: by 2002:a05:6102:6442:b0:5de:93bb:c56a with SMTP id
 ada2fe7eead31-5e827835874mr7439484137.34.1765978978684; Wed, 17 Dec 2025
 05:42:58 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <ierzf7ndebe.fsf_-_@HIDDEN>
 <CAN+1HbrMnL=PJt0d-ePEd5y15zDWVZQK0wJYEi5+b+wY3VK4DQ@HIDDEN>
 <CAN+1HbqXgFw0eh_asmGkNuJ9Lv-vfm10SELQs6U9M2U3p=QUog@HIDDEN>
 <iertsxvd878.fsf@HIDDEN>
 <CAN+1HbpOOT9RXTQeGW8je=uz0aV=19oYWwhu3Dj=GGkFmOdkgw@HIDDEN>
 <CAN+1HbrqF3OqdZQxgWWWmOjTd4UW4Vu64X5mS28M2N50TgzCgQ@HIDDEN>
 <ierv7i7xv64.fsf@HIDDEN>
 <CAN+1Hbriar_5zAHd-cTSqDJOUgYzxJPM9i+2CLCPbXRt_DRwQA@HIDDEN>
In-Reply-To: <CAN+1Hbriar_5zAHd-cTSqDJOUgYzxJPM9i+2CLCPbXRt_DRwQA@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Wed, 17 Dec 2025 08:42:47 -0500
X-Gm-Features: AQt7F2rxYC-5HC7nFGm1Re7LmhIf7YOPsJyX8GRopbBNuVbq3WsW21JRL-fq4NQ
Message-ID: <CAN+1HboS10cjaUJ=ztDWuL0OMur0U3Nzfj=NpSKcrmqZ6eD82A@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot,
 [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/alternative; boundary="000000000000b490e506462605cd"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--000000000000b490e506462605cd
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Mon, Dec 15, 2025 at 6:29=E2=80=AFPM St=C3=A9phane Marks <shipmints@gmai=
l.com> wrote:

> On Mon, Dec 15, 2025 at 5:00=E2=80=AFPM Spencer Baugh <sbaugh@janestreet.=
com>
> wrote:
>
>> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>>
>> > On Fri, Dec 12, 2025 at 10:48=E2=80=AFAM St=C3=A9phane Marks <shipmint=
s@HIDDEN>
>> wrote:
>> >
>> >  On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh <sbaugh@janest=
reet.com>
>> wrote:
>> >
>> >  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>> >
>> >  > On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks <shipmi=
nts@HIDDEN>
>> wrote:
>> >  >
>> >  >  On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh <
>> sbaugh@HIDDEN> wrote:
>> >  >
>> >  >  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>> >  >  > --- a/lisp/emacs-lisp/vtable.el
>> >  >  > +++ b/lisp/emacs-lisp/vtable.el
>> >  >  > @@ -398,56 +403,58 @@ vtable-insert-object
>> >  >  ...
>> >  >  > +      (with-current-buffer (vtable-buffer table)
>> >  >  > +        (save-excursion
>> >  >
>> >  >  So in the end I think the only way to keep the diff to
>> vtable-insert-object small is
>> >  >  if you use (set-buffer (vtable-buffer table)) here instead of
>> >  >  with-current-buffer.  It's a bit less normal, but it at least avoi=
ds
>> >  >  some unnecessary indentation.
>> >  >
>> >  >  That is, instead of
>> >  >  (with-current-buffer (vtable-buffer table)
>> >  >    (save-excursion
>> >  >      ...))
>> >  >
>> >  >  do
>> >  >
>> >  >  (save-excursion
>> >  >    (set-buffer (vtable-buffer table))
>> >  >    ...)
>> >  >
>> >  >  (save-excursion saves and restores the current buffer)
>> >  >
>> >  >  Thanks for making all these changes.  I think after that we should
>> be
>> >  >  good to go.
>> >  >
>> >  >  While I appreciate the desire for tiny diffs, I prefer that the
>> stanzas used in update insert remove functions remain
>> >  consistent
>> >  >  and we avoid a special comment explaining why insert is special
>> saying this was just for indentation.  Hrumph.
>> >  >
>> >  > The alternative would be to make them all save-excursion,
>> set-buffer, if you think that's worthy.
>> >
>> >  IMO that's worth doing.  It also saves indentation, so it's actually
>> >  somewhat useful in all the places we're currently adding a
>> >  with-current-buffer, even if it doesn't avoid a big reindent diff.
>> >
>> >  I forgot about the compiler warning
>> >
>> >    emacs-lisp/vtable.el:376:10: Warning: Use =E2=80=98with-current-buf=
fer=E2=80=99
>> rather than save-excursion+set-buffer
>> >
>> >  We may also need save-excursion twice, once for what is the ambient
>> current buffer, and the second to ensure that point doesn't
>> >  move around in the vtable-buffer.  Both of these, I think, are
>> satisfied via with-current-buffer and we avoid the warning.  So,
>> >  perhaps, we should bite the bullet and swallow the extra indentation
>> in vtable-insert-object and use the more robust and simpler
>> >  w-c-b.
>> >
>> > I can get a revised patch out quickly.  Can we agree on using
>> with-current-buffer and suffer the few extra indented diff lines?
>>
>> Yes, okay, I agree it's fine.  I don't think you need to revise anything
>> there, your most recent patch is fine.  (Except for the other issue I
>> just emailed about)
>>
>
> Thanks for catching the buffer-local let bindings.
>
> Here's a revised patch.  Up next, a simpler patch optimizing
> vtable--limit-string with a string-length heuristic, and which a bunch of
> us have tested.
>

Looks good to you?  I can assume we'll commit this, or very close to it,
and start submitting other patches.  There are a lot of changes and the
more parsimonious the patches, the more time this will take and I think we
all agree vtable needs a lot of help on top of Lars's great start and I'd
like to see the suite of changes in Emacs 31 so there's not that much time,
if Eli wants to cut a branch soon.

--000000000000b490e506462605cd
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Mon, Dec 15, 2025 at 6:29=E2=80=AFPM St=C3=A9phane Marks &lt;<a href=3D"=
mailto:shipmints@HIDDEN">shipmints@HIDDEN</a>&gt; wrote:</span></div>=
</div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=3D=
"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(2=
04,204,204);padding-left:1ex"><div dir=3D"ltr"><div dir=3D"ltr"><div style=
=3D"font-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-=
serif">On Mon, Dec 15, 2025 at 5:00=E2=80=AFPM Spencer Baugh &lt;<a href=3D=
"mailto:sbaugh@HIDDEN" target=3D"_blank">sbaugh@HIDDEN</a>&=
gt; wrote:</span></div></div><div class=3D"gmail_quote"><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rg=
b(204,204,204);padding-left:1ex">St=C3=A9phane Marks &lt;<a href=3D"mailto:=
shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<=
br>
<br>
&gt; On Fri, Dec 12, 2025 at 10:48=E2=80=AFAM St=C3=A9phane Marks &lt;<a hr=
ef=3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>=
&gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh &lt;<a hr=
ef=3D"mailto:sbaugh@HIDDEN" target=3D"_blank">sbaugh@HIDDEN=
</a>&gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@HIDDEN" t=
arget=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
&gt;<br>
&gt;=C2=A0 &gt; On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks=
 &lt;<a href=3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@gma=
il.com</a>&gt; wrote:<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh=
 &lt;<a href=3D"mailto:sbaugh@HIDDEN" target=3D"_blank">sbaugh@jane=
street.com</a>&gt; wrote:<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@g=
mail.com" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; --- a/lisp/emacs-lisp/vtable.el<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; +++ b/lisp/emacs-lisp/vtable.el<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; @@ -398,56 +403,58 @@ vtable-insert-object<br>
&gt;=C2=A0 &gt;=C2=A0 ...<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; +=C2=A0 =C2=A0 =C2=A0 (with-current-buffer (vtab=
le-buffer table)<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-excursion<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 So in the end I think the only way to keep the diff t=
o vtable-insert-object small is<br>
&gt;=C2=A0 &gt;=C2=A0 if you use (set-buffer (vtable-buffer table)) here in=
stead of<br>
&gt;=C2=A0 &gt;=C2=A0 with-current-buffer.=C2=A0 It&#39;s a bit less normal=
, but it at least avoids<br>
&gt;=C2=A0 &gt;=C2=A0 some unnecessary indentation.<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 That is, instead of<br>
&gt;=C2=A0 &gt;=C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 (save-excursion<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 =C2=A0 ...))<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 do<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 (save-excursion<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 (set-buffer (vtable-buffer table))<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 ...)<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 (save-excursion saves and restores the current buffer=
)<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 Thanks for making all these changes.=C2=A0 I think af=
ter that we should be<br>
&gt;=C2=A0 &gt;=C2=A0 good to go.<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 While I appreciate the desire for tiny diffs, I prefe=
r that the stanzas used in update insert remove functions remain<br>
&gt;=C2=A0 consistent<br>
&gt;=C2=A0 &gt;=C2=A0 and we avoid a special comment explaining why insert =
is special saying this was just for indentation.=C2=A0 Hrumph.<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt; The alternative would be to make them all save-excursion, s=
et-buffer, if you think that&#39;s worthy.<br>
&gt;<br>
&gt;=C2=A0 IMO that&#39;s worth doing.=C2=A0 It also saves indentation, so =
it&#39;s actually<br>
&gt;=C2=A0 somewhat useful in all the places we&#39;re currently adding a<b=
r>
&gt;=C2=A0 with-current-buffer, even if it doesn&#39;t avoid a big reindent=
 diff.<br>
&gt;<br>
&gt;=C2=A0 I forgot about the compiler warning<br>
&gt;<br>
&gt;=C2=A0 =C2=A0 emacs-lisp/vtable.el:376:10: Warning: Use =E2=80=98with-c=
urrent-buffer=E2=80=99 rather than save-excursion+set-buffer<br>
&gt;<br>
&gt;=C2=A0 We may also need save-excursion twice, once for what is the ambi=
ent current buffer, and the second to ensure that point doesn&#39;t<br>
&gt;=C2=A0 move around in the vtable-buffer.=C2=A0 Both of these, I think, =
are satisfied via with-current-buffer and we avoid the warning.=C2=A0 So,<b=
r>
&gt;=C2=A0 perhaps, we should bite the bullet and swallow the extra indenta=
tion in vtable-insert-object and use the more robust and simpler<br>
&gt;=C2=A0 w-c-b.<br>
&gt;<br>
&gt; I can get a revised patch out quickly.=C2=A0 Can we agree on using wit=
h-current-buffer and suffer the few extra indented diff lines?<br>
<br>
Yes, okay, I agree it&#39;s fine.=C2=A0 I don&#39;t think you need to revis=
e anything<br>
there, your most recent patch is fine.=C2=A0 (Except for the other issue I<=
br>
just emailed about)<br></blockquote><div><br></div><div style=3D"font-famil=
y:monospace">Thanks for catching the buffer-local let bindings.</div><div s=
tyle=3D"font-family:monospace"><br></div><div style=3D"font-family:monospac=
e">Here&#39;s a revised patch.=C2=A0 Up next, a simpler patch optimizing vt=
able--limit-string with a string-length heuristic, and which a bunch of us =
have tested.<br></div></div></div></blockquote><div><br></div><div class=3D=
"gmail_default" style=3D"font-family:monospace">Looks good to you?=C2=A0 I =
can assume we&#39;ll commit this, or very close to it, and start submitting=
 other patches.=C2=A0 There are a lot of changes and the more parsimonious =
the patches, the more time this will take and I think we all agree vtable n=
eeds a lot of help on top of Lars&#39;s great start and I&#39;d like to see=
 the suite of changes in Emacs 31 so there&#39;s not that much time, if Eli=
 wants to cut a branch soon.</div></div></div>

--000000000000b490e506462605cd--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 15 Dec 2025 23:30:00 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Dec 15 18:30:00 2025
Received: from localhost ([127.0.0.1]:45795 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vVI0t-0007r2-7n
	for submit <at> debbugs.gnu.org; Mon, 15 Dec 2025 18:29:59 -0500
Received: from mail-vs1-xe34.google.com ([2607:f8b0:4864:20::e34]:44105)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vVI0p-0007qi-Cs
 for 79982 <at> debbugs.gnu.org; Mon, 15 Dec 2025 18:29:56 -0500
Received: by mail-vs1-xe34.google.com with SMTP id
 ada2fe7eead31-5dfc6be7df3so1469266137.0
 for <79982 <at> debbugs.gnu.org>; Mon, 15 Dec 2025 15:29:55 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765841389; x=1766446189; darn=debbugs.gnu.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=mLZLIQseJIt+1N6loCr5N/ju2xxGMD1GMIjmSb2S2qk=;
 b=JvvQOcvLoWcNHcSfMSZANqq434p9Ndmw/Zv+qRjUb2FaXzpAGvyiD63MdjOb5Jk3tm
 DUKARBdeFy9pqybuLIgmqy97kG3rnzMSBSqIO96Dw9uNyNqM+hWc9+t0d1gUZMNvWre3
 QmOpP6JLXJHeApXPzHrnEBlj5WmtwLYtUZlGR5BD+tSATRFr0Z1uqkXLKm8Jxq2vVCRF
 TEWvD9xVEWoaVpBxWa5W+Tz2aBB4Bgq1Jy0RMPccnIasY706Y0OYpsatOiwwkM7oyTW7
 3TWXJMryWFc4918SXvy4EDsDStm3xrTlxB1iWbbfhShIV5JJPKVJhQ4YrpdUjNoGVFWO
 Abfw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765841389; x=1766446189;
 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=mLZLIQseJIt+1N6loCr5N/ju2xxGMD1GMIjmSb2S2qk=;
 b=FWc8eVrjCWUHehyTQXpnQ9NeQgP4lItCYpmMXFWWv3lfTAolDO7MaLnYT9zOsxtz/4
 5ywgmETq9k2s4DnjHjhCVOpJo008AzzIPpnLhnR5eEeAMKysGY5aeU7IRyTvw48Zie6Q
 70jK47dQGlPdm7cVUsoSNj7Ad6328VFnBcpQCQQ49HXDHif4NjcZc0gKwO7kbfzMR33I
 WWUYh8jFxtA/5p7380HNgd/tnfNmJBIncnSug7eIdTWgkIy9T8tN+Un28gJN4Y6hJo7l
 r6yIIGq8wFeVuheiHaNalq4L/QXQO15eHQ29GrPI0yt8dThtt3BJ2zD2ZpdS5fa24sZT
 SfCw==
X-Forwarded-Encrypted: i=1;
 AJvYcCVSTRuR3SzlZXMRiNtYNf2CfLgFV8Rlt+sW2JUalF0bmSZLZC9n+LN3IZXKA3sVNZSP4aPRSA==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yw4WQaC8lklI/MnOprgArw4rMmw224T4Z/unbC8uxRE2tUNqalB
 Z0YZ4owwUYpV3gmErLsj4SazA6/vkBAErGpXtu174Odo+BPV21iTqZdT8SIBcDpJYqM2LeNCXyn
 /U/tz3bUvTOeRYHVupahvn7KlYag+rvk=
X-Gm-Gg: AY/fxX7+bAxFypejaqW2Cz/wPRi50sd82Hw+b8eHqZcb8Q2ImTyvkY16QcIik0VJxdf
 gYKVRFNT2A5KGvRdj/5yqxa8UNmLHiOJBwBKs4vUu6wC9oNHuKN9diUt3FFzrkW5AN6E5Vb7Rcf
 YebRRSG7jrqQ/+px2zdL9z0mml5L5x3dg30GgrSjKb3gvjJjwdmGlW5J72z+vX4Ps/LUsPsxiMq
 /jQnNuig+zSlBWS4/HyjYoMpegcGh+bNbbPV9XTSzzAPpbVwXYW1m47mLxxjxUWZPi/Iao=
X-Google-Smtp-Source: AGHT+IHOROuMlvgwN9+Tw6NUhyJ/xspvK5Pey1+PU4vhEjssPTWNhJi7QCtqUqbpmmlaIsvT4cvmIrnpt4RltuV/BYQ=
X-Received: by 2002:a05:6102:4b08:b0:5db:e297:2c6c with SMTP id
 ada2fe7eead31-5e8278498demr4266942137.42.1765841389468; Mon, 15 Dec 2025
 15:29:49 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <ierzf7ndebe.fsf_-_@HIDDEN>
 <CAN+1HbrMnL=PJt0d-ePEd5y15zDWVZQK0wJYEi5+b+wY3VK4DQ@HIDDEN>
 <CAN+1HbqXgFw0eh_asmGkNuJ9Lv-vfm10SELQs6U9M2U3p=QUog@HIDDEN>
 <iertsxvd878.fsf@HIDDEN>
 <CAN+1HbpOOT9RXTQeGW8je=uz0aV=19oYWwhu3Dj=GGkFmOdkgw@HIDDEN>
 <CAN+1HbrqF3OqdZQxgWWWmOjTd4UW4Vu64X5mS28M2N50TgzCgQ@HIDDEN>
 <ierv7i7xv64.fsf@HIDDEN>
In-Reply-To: <ierv7i7xv64.fsf@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Mon, 15 Dec 2025 18:29:36 -0500
X-Gm-Features: AQt7F2pRcbFBRP2J54UfyeYxOntbk27cI5Vusw375EcYL1N_BbxYuK855YZ1e6o
Message-ID: <CAN+1Hbriar_5zAHd-cTSqDJOUgYzxJPM9i+2CLCPbXRt_DRwQA@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot,
 [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/mixed; boundary="000000000000bfd80b064605fc16"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--000000000000bfd80b064605fc16
Content-Type: multipart/alternative; boundary="000000000000bfd80a064605fc14"

--000000000000bfd80a064605fc14
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Mon, Dec 15, 2025 at 5:00=E2=80=AFPM Spencer Baugh <sbaugh@HIDDEN=
m> wrote:

> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>
> > On Fri, Dec 12, 2025 at 10:48=E2=80=AFAM St=C3=A9phane Marks <shipmints=
@gmail.com>
> wrote:
> >
> >  On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh <sbaugh@janestr=
eet.com>
> wrote:
> >
> >  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
> >
> >  > On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks <shipmin=
ts@HIDDEN>
> wrote:
> >  >
> >  >  On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh <sbaugh@janes=
treet.com>
> wrote:
> >  >
> >  >  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
> >  >  > --- a/lisp/emacs-lisp/vtable.el
> >  >  > +++ b/lisp/emacs-lisp/vtable.el
> >  >  > @@ -398,56 +403,58 @@ vtable-insert-object
> >  >  ...
> >  >  > +      (with-current-buffer (vtable-buffer table)
> >  >  > +        (save-excursion
> >  >
> >  >  So in the end I think the only way to keep the diff to
> vtable-insert-object small is
> >  >  if you use (set-buffer (vtable-buffer table)) here instead of
> >  >  with-current-buffer.  It's a bit less normal, but it at least avoid=
s
> >  >  some unnecessary indentation.
> >  >
> >  >  That is, instead of
> >  >  (with-current-buffer (vtable-buffer table)
> >  >    (save-excursion
> >  >      ...))
> >  >
> >  >  do
> >  >
> >  >  (save-excursion
> >  >    (set-buffer (vtable-buffer table))
> >  >    ...)
> >  >
> >  >  (save-excursion saves and restores the current buffer)
> >  >
> >  >  Thanks for making all these changes.  I think after that we should =
be
> >  >  good to go.
> >  >
> >  >  While I appreciate the desire for tiny diffs, I prefer that the
> stanzas used in update insert remove functions remain
> >  consistent
> >  >  and we avoid a special comment explaining why insert is special
> saying this was just for indentation.  Hrumph.
> >  >
> >  > The alternative would be to make them all save-excursion, set-buffer=
,
> if you think that's worthy.
> >
> >  IMO that's worth doing.  It also saves indentation, so it's actually
> >  somewhat useful in all the places we're currently adding a
> >  with-current-buffer, even if it doesn't avoid a big reindent diff.
> >
> >  I forgot about the compiler warning
> >
> >    emacs-lisp/vtable.el:376:10: Warning: Use =E2=80=98with-current-buff=
er=E2=80=99
> rather than save-excursion+set-buffer
> >
> >  We may also need save-excursion twice, once for what is the ambient
> current buffer, and the second to ensure that point doesn't
> >  move around in the vtable-buffer.  Both of these, I think, are
> satisfied via with-current-buffer and we avoid the warning.  So,
> >  perhaps, we should bite the bullet and swallow the extra indentation i=
n
> vtable-insert-object and use the more robust and simpler
> >  w-c-b.
> >
> > I can get a revised patch out quickly.  Can we agree on using
> with-current-buffer and suffer the few extra indented diff lines?
>
> Yes, okay, I agree it's fine.  I don't think you need to revise anything
> there, your most recent patch is fine.  (Except for the other issue I
> just emailed about)
>

Thanks for catching the buffer-local let bindings.

Here's a revised patch.  Up next, a simpler patch optimizing
vtable--limit-string with a string-length heuristic, and which a bunch of
us have tested.

-St=C3=A9phane

--000000000000bfd80a064605fc14
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Mon, Dec 15, 2025 at 5:00=E2=80=AFPM Spencer Baugh &lt;<a href=3D"mailto=
:sbaugh@HIDDEN">sbaugh@HIDDEN</a>&gt; wrote:</span></div></=
div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=3D"g=
mail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204=
,204,204);padding-left:1ex">St=C3=A9phane Marks &lt;<a href=3D"mailto:shipm=
ints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
<br>
&gt; On Fri, Dec 12, 2025 at 10:48=E2=80=AFAM St=C3=A9phane Marks &lt;<a hr=
ef=3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>=
&gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh &lt;<a hr=
ef=3D"mailto:sbaugh@HIDDEN" target=3D"_blank">sbaugh@HIDDEN=
</a>&gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@HIDDEN" t=
arget=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
&gt;<br>
&gt;=C2=A0 &gt; On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks=
 &lt;<a href=3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@gma=
il.com</a>&gt; wrote:<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh=
 &lt;<a href=3D"mailto:sbaugh@HIDDEN" target=3D"_blank">sbaugh@jane=
street.com</a>&gt; wrote:<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@g=
mail.com" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; --- a/lisp/emacs-lisp/vtable.el<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; +++ b/lisp/emacs-lisp/vtable.el<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; @@ -398,56 +403,58 @@ vtable-insert-object<br>
&gt;=C2=A0 &gt;=C2=A0 ...<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; +=C2=A0 =C2=A0 =C2=A0 (with-current-buffer (vtab=
le-buffer table)<br>
&gt;=C2=A0 &gt;=C2=A0 &gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-excursion<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 So in the end I think the only way to keep the diff t=
o vtable-insert-object small is<br>
&gt;=C2=A0 &gt;=C2=A0 if you use (set-buffer (vtable-buffer table)) here in=
stead of<br>
&gt;=C2=A0 &gt;=C2=A0 with-current-buffer.=C2=A0 It&#39;s a bit less normal=
, but it at least avoids<br>
&gt;=C2=A0 &gt;=C2=A0 some unnecessary indentation.<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 That is, instead of<br>
&gt;=C2=A0 &gt;=C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 (save-excursion<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 =C2=A0 ...))<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 do<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 (save-excursion<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 (set-buffer (vtable-buffer table))<br>
&gt;=C2=A0 &gt;=C2=A0 =C2=A0 ...)<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 (save-excursion saves and restores the current buffer=
)<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 Thanks for making all these changes.=C2=A0 I think af=
ter that we should be<br>
&gt;=C2=A0 &gt;=C2=A0 good to go.<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt;=C2=A0 While I appreciate the desire for tiny diffs, I prefe=
r that the stanzas used in update insert remove functions remain<br>
&gt;=C2=A0 consistent<br>
&gt;=C2=A0 &gt;=C2=A0 and we avoid a special comment explaining why insert =
is special saying this was just for indentation.=C2=A0 Hrumph.<br>
&gt;=C2=A0 &gt;<br>
&gt;=C2=A0 &gt; The alternative would be to make them all save-excursion, s=
et-buffer, if you think that&#39;s worthy.<br>
&gt;<br>
&gt;=C2=A0 IMO that&#39;s worth doing.=C2=A0 It also saves indentation, so =
it&#39;s actually<br>
&gt;=C2=A0 somewhat useful in all the places we&#39;re currently adding a<b=
r>
&gt;=C2=A0 with-current-buffer, even if it doesn&#39;t avoid a big reindent=
 diff.<br>
&gt;<br>
&gt;=C2=A0 I forgot about the compiler warning<br>
&gt;<br>
&gt;=C2=A0 =C2=A0 emacs-lisp/vtable.el:376:10: Warning: Use =E2=80=98with-c=
urrent-buffer=E2=80=99 rather than save-excursion+set-buffer<br>
&gt;<br>
&gt;=C2=A0 We may also need save-excursion twice, once for what is the ambi=
ent current buffer, and the second to ensure that point doesn&#39;t<br>
&gt;=C2=A0 move around in the vtable-buffer.=C2=A0 Both of these, I think, =
are satisfied via with-current-buffer and we avoid the warning.=C2=A0 So,<b=
r>
&gt;=C2=A0 perhaps, we should bite the bullet and swallow the extra indenta=
tion in vtable-insert-object and use the more robust and simpler<br>
&gt;=C2=A0 w-c-b.<br>
&gt;<br>
&gt; I can get a revised patch out quickly.=C2=A0 Can we agree on using wit=
h-current-buffer and suffer the few extra indented diff lines?<br>
<br>
Yes, okay, I agree it&#39;s fine.=C2=A0 I don&#39;t think you need to revis=
e anything<br>
there, your most recent patch is fine.=C2=A0 (Except for the other issue I<=
br>
just emailed about)<br></blockquote><div><br></div><div class=3D"gmail_defa=
ult" style=3D"font-family:monospace">Thanks for catching the buffer-local l=
et bindings.</div><div class=3D"gmail_default" style=3D"font-family:monospa=
ce"><br></div><div class=3D"gmail_default" style=3D"font-family:monospace">=
Here&#39;s a revised patch.=C2=A0 Up next, a simpler patch optimizing vtabl=
e--limit-string with a string-length heuristic, and which a bunch of us hav=
e tested.</div><div class=3D"gmail_default" style=3D"font-family:monospace"=
><br></div><div class=3D"gmail_default" style=3D"font-family:monospace">-St=
=C3=A9phane=C2=A0</div></div></div>

--000000000000bfd80a064605fc14--

--000000000000bfd80b064605fc16
Content-Type: application/octet-stream; 
	name="0001-Add-vtable-buffer-slot.patch"
Content-Disposition: attachment; 
	filename="0001-Add-vtable-buffer-slot.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_mj7sd06a0>
X-Attachment-Id: f_mj7sd06a0

RnJvbSA4MTk1M2IwMTBmODNlNjQ0YzJmNTUwNTlhNDkyYzViZmI2YTEzYmE3IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo
aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMTAgRGVjIDIwMjUgMDk6MjA6MDIgLTA1MDAK
U3ViamVjdDogW1BBVENIXSBBZGQgdnRhYmxlIGJ1ZmZlciBzbG90CgpUaGlzIHNvbHZlcyBmb3Ig
YmFja2dyb3VuZCB2dGFibGUgbXV0YXRpb25zLCBpLmUuLCB1cGRhdGVzCmluaXRpYXRlZCBmcm9t
IGJ1ZmZlcnMgb3RoZXIgdGhhbiB0aGUgdnRhYmxlIGJ1ZmZlciwgYW5kIGZvcgpidWZmZXItYWRq
dXN0ZWQgc3RyaW5nLXBpeGVsLXdpZHRoIGNvbXB1dGF0aW9ucy4KCiogbGlzcC9lbWFjcy1saXNw
L3Z0YWJsZS5lbCAodnRhYmxlKTogTmV3ICctYnVmZmVyJyBzbG90LgoodnRhYmxlLWJ1ZmZlcik6
Cih2dGFibGUtc2V0LWJ1ZmZlcik6IE5ldyBmdW5jdGlvbi4KKHZ0YWJsZS11cGRhdGUtb2JqZWN0
KToKKHZ0YWJsZS1yZW1vdmUtb2JqZWN0KToKKHZ0YWJsZS1pbnNlcnQtb2JqZWN0KTogV3JhcCBv
cGVyYXRpb24gd2l0aCB0aGUgdnRhYmxlIGJ1ZmZlci4KKHZ0YWJsZS0taW5zZXJ0KTogU3BsaXQg
ZnJvbSBvbGQgJ3Z0YWJsZS1pbnNlcnQnLgoodnRhYmxlLWluc2VydCk6IEluc2VydCB0YWJsZSBh
bmQgcmVjb3JkIHRoZSBidWZmZXIuCih2dGFibGUtLWluc2VydC1saW5lKToKKHZ0YWJsZS0taW5z
ZXJ0LWhlYWRlci1saW5lKTogVXNlICd2dGFibGUtYnVmZmVyJyBmb3IgcGl4ZWwtd2lkdGggY29t
cHV0YXRpb24uCih2dGFibGUtLWxpbWl0LXN0cmluZyk6Cih2dGFibGUtLWNoYXItd2lkdGgpOiBQ
YXNzIGJ1ZmZlciB0byAnc3RyaW5nLXBpeGVsLXdpZHRoJy4KKHZ0YWJsZS1yZXZlcnQpOiBOZXcg
b3B0aW9uYWwgdGFibGUgYXJndW1lbnQuCih2dGFibGUtLWFsdGVyLWNvbHVtbi13aWR0aCk6Cih2
dGFibGUtcmV2ZXJ0LWNvbW1hbmQpOgoodnRhYmxlLXNvcnQtYnktY3VycmVudC1jb2x1bW4pOiBD
YWxsICd2dGFibGUtcmV2ZXJ0JyB3aXRoIHRoZSB0YWJsZS4KCiogdGVzdC9saXNwL2VtYWNzLWxp
c3AvdnRhYmxlLXRlc3RzLmVsCih2dGFibGUtdGVzdHMtLW1ha2Utbm8taGVhZGVyLTItb2JqZWN0
LXRhYmxlKTogTmV3IGhlbHBlcgpmdW5jdGlvbi4KKHRlc3QtdnN0YWJsZS1jb21wdXRlLWNvbHVt
bnMpOiBDb3JyZWN0IHR5cG8gaW4gdGVzdCBuYW1lLiAgVXNlCm5ldyBoZWxwZXIgZnVuY3Rpb24u
Cih0ZXN0LXZ0YWJsZS11bmlxdWUtYnVmZmVyKQoodGVzdC12dGFibGUtbm9uLWN1cnJlbnQtYnVm
ZmVyLWluc2VydC1vYmplY3QpCih0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItcmVtb3Zl
LW9iamVjdCkKKHRlc3QtdnRhYmxlLW5vbi1jdXJyZW50LWJ1ZmZlci11cGRhdGUtb2JqZWN0KQoo
dGVzdC12dGFibGUtLWxpbWl0LXN0cmluZy13aXRoLWZhY2UtcmVtYXBwZWQtYnVmZmVyKTogTmV3
IHRlc3QuCi0tLQogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAgICAgICAgICAgIHwgMzIxICsr
KysrKysrKysrKysrKy0tLS0tLS0tLS0tLQogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRl
c3RzLmVsIHwgIDg0ICsrKysrKy0KIDIgZmlsZXMgY2hhbmdlZCwgMjU2IGluc2VydGlvbnMoKyks
IDE0OSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVs
IGIvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbAppbmRleCBiY2RkMjgwZmI5Mi4uMjk3OTFlMmFh
YTAgMTAwNjQ0Ci0tLSBhL2xpc3AvZW1hY3MtbGlzcC92dGFibGUuZWwKKysrIGIvbGlzcC9lbWFj
cy1saXNwL3Z0YWJsZS5lbApAQCAtNjcsOCArNjcsMTAgQEAgdnRhYmxlCiAgICAoZWxsaXBzaXMg
OmluaXRhcmcgOmVsbGlwc2lzIDphY2Nlc3NvciB2dGFibGUtZWxsaXBzaXMpCiAgICAoY29sdW1u
LWNvbG9ycyA6aW5pdGFyZyA6Y29sdW1uLWNvbG9ycyA6YWNjZXNzb3IgdnRhYmxlLWNvbHVtbi1j
b2xvcnMpCiAgICAocm93LWNvbG9ycyA6aW5pdGFyZyA6cm93LWNvbG9ycyA6YWNjZXNzb3IgdnRh
YmxlLXJvdy1jb2xvcnMpCisgICAoYnVmZmVyIDppbml0Zm9ybSBuaWwgOmFjY2Vzc29yIHZ0YWJs
ZS1idWZmZXIpCiAgICAoLWNhY2hlZC1jb2xvcnMgOmluaXRmb3JtIG5pbCkKICAgICgtY2FjaGUg
OmluaXRmb3JtIChtYWtlLWhhc2gtdGFibGUgOnRlc3QgIydlcXVhbCkpCisgICAoLWN1cnJlbnQt
Y2FjaGUgOmluaXRmb3JtIG5pbCA6YWNjZXNzb3IgdnRhYmxlLS1jdXJyZW50LWNhY2hlKQogICAg
KC1jYWNoZWQta2V5bWFwIDppbml0Zm9ybSBuaWwpCiAgICAoLWhhcy1jb2x1bW4tc3BlYyA6aW5p
dGZvcm0gbmlsKSkKICAgIkFuIG9iamVjdCB0byBob2xkIHRoZSBkYXRhIGZvciBhIHRhYmxlLiIp
CkBAIC0yODcsOCArMjg5LDcgQEAgdnRhYmxlLXVwZGF0ZS1vYmplY3QKIFRBQkxFIG11c3QgYmUg
YXQgcG9pbnQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiIKICAgKHVubGVzcyBvbGQtb2JqZWN0CiAg
ICAgKHNldHEgb2xkLW9iamVjdCBvYmplY3QpKQotICAobGV0KiAoKG9iamVjdHMgKHZ0YWJsZS1v
YmplY3RzIHRhYmxlKSkKLSAgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KSkKKyAgKGxldCAo
KG9iamVjdHMgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkpCiAgICAgOzsgRmlyc3QgcmVwbGFjZSB0
aGUgb2JqZWN0IGluIHRoZSBvYmplY3Qgc3RvcmFnZS4KICAgICAoaWYgKGVxIG9sZC1vYmplY3Qg
KGNhciBvYmplY3RzKSkKICAgICAgICAgOzsgSXQncyBhdCB0aGUgaGVhZCwgc28gcmVwbGFjZSBp
dCB0aGVyZS4KQEAgLTMwMSwzMSArMzAyLDMyIEBAIHZ0YWJsZS11cGRhdGUtb2JqZWN0CiAgICAg
ICAodW5sZXNzIChjZHIgb2JqZWN0cykKICAgICAgICAgKGVycm9yICJDYW4ndCBmaW5kIHRoZSBv
bGQgb2JqZWN0IikpCiAgICAgICAoc2V0Y2FyIChjZHIgb2JqZWN0cykgb2JqZWN0KSkKLSAgICA7
OyBUaGVuIHVwZGF0ZSB0aGUgcmVuZGVyZWQgdnRhYmxlIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4K
LSAgICAoaWYtbGV0KiAoKGNhY2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKQotICAgICAgICAg
ICAgIChsaW5lLW51bWJlciAoc2VxLXBvc2l0aW9uICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hl
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC1vYmplY3QKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChhIGIpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXF1YWwgKGNhciBhKSBiKSkp
KQotICAgICAgICAgICAgIChsaW5lIChlbHQgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpIGxp
bmUtbnVtYmVyKSkpCi0gICAgICAgIChwcm9nbgotICAgICAgICAgIChzZXRjYXIgbGluZSBvYmpl
Y3QpCi0gICAgICAgICAgKHNldGNkciBsaW5lICh2dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUg
dGFibGUgb2JqZWN0KSkKLSAgICAgICAgICA7OyAuLi4gYW5kIHJlZGlzcGxheSB0aGUgbGluZSBp
biBxdWVzdGlvbi4KLSAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgICAgICAgICh2dGFi
bGUtZ290by1vYmplY3Qgb2xkLW9iamVjdCkKLSAgICAgICAgICAgIChsZXQgKChrZXltYXAgKGdl
dC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1hcCkpCi0gICAgICAgICAgICAgICAgICAoc3Rh
cnQgKHBvaW50KSkpCi0gICAgICAgICAgICAgIChkZWxldGUtbGluZSkKLSAgICAgICAgICAgICAg
KHZ0YWJsZS0taW5zZXJ0LWxpbmUgdGFibGUgbGluZSBsaW5lLW51bWJlcgotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLXNwYWNlciB0YWJsZSkpCi0g
ICAgICAgICAgICAgIChhZGQtdGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkgKGxpc3QgJ2tl
eW1hcCBrZXltYXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAndnRhYmxlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZS1jYWNoZSBjYWNoZSkpKSkKLSAgICAgICAg
ICA7OyBXZSBtYXkgaGF2ZSBpbnNlcnRlZCBhIG5vbi1udW1lcmljYWwgdmFsdWUgaW50byBhIHBy
ZXZpb3VzbHkKLSAgICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUu
Ci0gICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAoY2RyIGxpbmUp
KSkKKyAgICA7OyBUaGVuIHVwZGF0ZSB0aGUgcmVuZGVyZWQgdnRhYmxlIGluIGl0cyBidWZmZXIu
CisgICAgKGlmLWxldCogKChjYWNoZSAodnRhYmxlLS1jdXJyZW50LWNhY2hlIHRhYmxlKSkKKyAg
ICAgICAgICAgICAgKGxpbmUtbnVtYmVyIChzZXEtcG9zaXRpb24gKHZ0YWJsZS0tY2FjaGUtbGlu
ZXMgY2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC1v
YmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAo
YSBiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCAo
Y2FyIGEpIGIpKSkpCisgICAgICAgICAgICAgIChsaW5lIChlbHQgKHZ0YWJsZS0tY2FjaGUtbGlu
ZXMgY2FjaGUpIGxpbmUtbnVtYmVyKSkpCisgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2
dGFibGUtYnVmZmVyIHRhYmxlKQorICAgICAgICAgIChsZXQgKChpbmhpYml0LXJlYWQtb25seSB0
KQorICAgICAgICAgICAgICAgIChpbmhpYml0LW1vZGlmaWNhdGlvbi1ob29rcyB0KSkKKyAgICAg
ICAgICAgIChzZXRjYXIgbGluZSBvYmplY3QpCisgICAgICAgICAgICAoc2V0Y2RyIGxpbmUgKHZ0
YWJsZS0tY29tcHV0ZS1jYWNoZWQtbGluZSB0YWJsZSBvYmplY3QpKQorICAgICAgICAgICAgOzsg
Li4uIGFuZCByZWRpc3BsYXkgdGhlIGxpbmUgaW4gcXVlc3Rpb24uCisgICAgICAgICAgICAoc2F2
ZS1leGN1cnNpb24KKyAgICAgICAgICAgICAgKHZ0YWJsZS1nb3RvLW9iamVjdCBvbGQtb2JqZWN0
KQorICAgICAgICAgICAgICAobGV0ICgoa2V5bWFwIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQp
ICdrZXltYXApKQorICAgICAgICAgICAgICAgICAgICAoc3RhcnQgKHBvaW50KSkpCisgICAgICAg
ICAgICAgICAgKGRlbGV0ZS1saW5lKQorICAgICAgICAgICAgICAgICh2dGFibGUtLWluc2VydC1s
aW5lIHRhYmxlIGxpbmUgbGluZS1udW1iZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKSkKKyAgICAgICAgICAgICAg
ICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9pbnQpIChsaXN0ICdrZXltYXAga2V5bWFw
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAndnRhYmxlIHRhYmxlKSkpKQorICAgICAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5zZXJ0ZWQg
YSBub24tbnVtZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5CisgICAgICAgICAgICA7OyBh
bGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUuCisgICAgICAgICAgICAodnRhYmxlLS1y
ZWNvbXB1dGUtbnVtZXJpY2FsIHRhYmxlIChjZHIgbGluZSkpKSkKICAgICAgIChlcnJvciAiQ2Fu
J3QgZmluZCBjYWNoZWQgb2JqZWN0IGluIHZ0YWJsZSIpKSkpCiAKIChkZWZ1biB2dGFibGUtcmVt
b3ZlLW9iamVjdCAodGFibGUgb2JqZWN0KQpAQCAtMzM0LDE0ICszMzYsMTYgQEAgdnRhYmxlLXJl
bW92ZS1vYmplY3QKICAgOzsgRmlyc3QgcmVtb3ZlIGZyb20gdGhlIG9iamVjdHMuCiAgIChzZXRm
ICh2dGFibGUtb2JqZWN0cyB0YWJsZSkgKGRlbHEgb2JqZWN0ICh2dGFibGUtb2JqZWN0cyB0YWJs
ZSkpKQogICA7OyBUaGVuIGFkanVzdCB0aGUgY2FjaGUgYW5kIGRpc3BsYXkuCi0gIChzYXZlLWV4
Y3Vyc2lvbgotICAgICh2dGFibGUtZ290by10YWJsZSB0YWJsZSkKLSAgICAobGV0ICgoY2FjaGUg
KHZ0YWJsZS0tY3VycmVudC1jYWNoZSkpCi0gICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQp
KQotICAgICAgKHNldGNhciBjYWNoZSAoZGVscSAoYXNzcSBvYmplY3QgKHZ0YWJsZS0tY2FjaGUt
bGluZXMgY2FjaGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS1s
aW5lcyBjYWNoZSkpKQotICAgICAgKHdoZW4gKHZ0YWJsZS1nb3RvLW9iamVjdCBvYmplY3QpCi0g
ICAgICAgIChkZWxldGUtbGluZSkpKSkpCisgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUt
YnVmZmVyIHRhYmxlKQorICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgKHZ0YWJsZS1nb3RvLXRh
YmxlIHRhYmxlKQorICAgICAgKGxldCAoKGNhY2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUgdGFi
bGUpKQorICAgICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQpCisgICAgICAgICAgICAoaW5o
aWJpdC1tb2RpZmljYXRpb24taG9va3MgdCkpCisgICAgICAgIChzZXRjYXIgY2FjaGUgKGRlbHEg
KGFzc3Egb2JqZWN0ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkpKQorICAgICAgICAod2hl
biAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVjdCkKKyAgICAgICAgICAoZGVsZXRlLWxpbmUpKSkp
KSkKIAogOzsgRklYTUU6IFRoZSBmYWN0IHRoYXQgdGhlIGBsb2NhdGlvbicgYXJndW1lbnQgb2YK
IDs7IGB2dGFibGUtaW5zZXJ0LW9iamVjdCcgY2FuIGJlIGFuIGludGVnZXIgYW5kIGlzIHRoZW4g
aW50ZXJwcmV0ZWQgYXMKQEAgLTM2OSw4ICszNzMsOSBAQCB2dGFibGUtaW5zZXJ0LW9iamVjdAog
ICAgICAgKHByb2duCiAgICAgICAgIChzZXRmICh2dGFibGUtb2JqZWN0cyB0YWJsZSkgKGxpc3Qg
b2JqZWN0KSkKICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAodnRh
YmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpCi0gICAgICAgICh2dGFibGUt
Z290by10YWJsZSB0YWJsZSkKLSAgICAgICAgKHZ0YWJsZS1yZXZlcnQtY29tbWFuZCkpCisgICAg
ICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKQorICAgICAgICAg
ICh2dGFibGUtZ290by10YWJsZSB0YWJsZSkKKyAgICAgICAgICAodnRhYmxlLXJldmVydC1jb21t
YW5kKSkpCiAgICAgOzsgRmlyc3QgaW5zZXJ0IGludG8gdGhlIG9iamVjdHMuCiAgICAgKGxldCAo
KHBvcyAoaWYgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAoaWYgKGludGVnZXJwIGxvY2F0
aW9uKQpAQCAtMzk4LDU2ICs0MDMsNTggQEAgdnRhYmxlLWluc2VydC1vYmplY3QKICAgICAgICAg
ICA7OyBPdGhlcndpc2UsIGFwcGVuZCB0aGUgb2JqZWN0LgogICAgICAgICAgIChuY29uYyAodnRh
YmxlLW9iamVjdHMgdGFibGUpIChsaXN0IG9iamVjdCkpKSkpCiAgICAgOzsgVGhlbiBhZGp1c3Qg
dGhlIGNhY2hlIGFuZCBkaXNwbGF5LgotICAgIChzYXZlLWV4Y3Vyc2lvbgotICAgICAgKHZ0YWJs
ZS1nb3RvLXRhYmxlIHRhYmxlKQotICAgICAgKGxldCogKChjYWNoZSAodnRhYmxlLS1jdXJyZW50
LWNhY2hlKSkKLSAgICAgICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkKLSAgICAgICAgICAg
ICAoa2V5bWFwIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICdrZXltYXApKQotICAgICAgICAg
ICAgIChlbGxpcHNpcyAoaWYgKHZ0YWJsZS1lbGxpcHNpcyB0YWJsZSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChwcm9wZXJ0aXplICh0cnVuY2F0ZS1zdHJpbmctZWxsaXBzaXMpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFjZSAodnRhYmxlLWZhY2UgdGFi
bGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICIiKSkKLSAgICAgICAgICAgICAoZWxsaXBz
aXMtd2lkdGggKHN0cmluZy1waXhlbC13aWR0aCBlbGxpcHNpcykpCi0gICAgICAgICAgICAgKGxp
bmVzICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkKLSAgICAgICAgICAgICAoZWxlbSAoaWYg
bG9jYXRpb24gIDsgVGhpcyBiaW5kaW5nIG1pcnJvcnMgdGhlIGJpbmRpbmcgb2YgYHBvcycgYWJv
dmUuCi0gICAgICAgICAgICAgICAgICAgICAgIChpZiAoaW50ZWdlcnAgbG9jYXRpb24pCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAobnRoIGxvY2F0aW9uIGxpbmVzKQotICAgICAgICAgICAg
ICAgICAgICAgICAgIChvciAoYXNzcSBsb2NhdGlvbiBsaW5lcykKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGFuZCBiZWZvcmUgKGNhciBsaW5lcykpKSkKLSAgICAgICAgICAgICAgICAg
ICAgIChpZiBiZWZvcmUgKGNhciBsaW5lcykpKSkKLSAgICAgICAgICAgICAocG9zIChtZW1xIGVs
ZW0gbGluZXMpKQotICAgICAgICAgICAgIChsaW5lIChjb25zIG9iamVjdCAodnRhYmxlLS1jb21w
dXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpKSkKLSAgICAgICAgKGlmIChvciBiZWZvcmUK
LSAgICAgICAgICAgICAgICAoYW5kIHBvcyAoaW50ZWdlcnAgbG9jYXRpb24pKSkKLSAgICAgICAg
ICAgIDs7IEFkZCB0aGUgbmV3IG9iamVjdCBiZWZvcmU6LgotICAgICAgICAgICAgKGxldCAoKG9s
ZC1saW5lIChjYXIgcG9zKSkpCi0gICAgICAgICAgICAgIChzZXRjYXIgcG9zIGxpbmUpCi0gICAg
ICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIG9sZC1saW5lIChjZHIgcG9zKSkpCi0gICAgICAg
ICAgICAgICh1bmxlc3MgKHZ0YWJsZS1nb3RvLW9iamVjdCAoY2FyIGVsZW0pKQotICAgICAgICAg
ICAgICAgICh2dGFibGUtYmVnaW5uaW5nLW9mLXRhYmxlKSkpCi0gICAgICAgICAgOzsgT3RoZXJ3
aXNlLCBhZGQgdGhlIG9iamVjdCBhZnRlci4KLSAgICAgICAgICAoaWYgcG9zCi0gICAgICAgICAg
ICAgIDs7IFNwbGljZSB0aGUgb2JqZWN0IGludG8gdGhlIGxpc3QuCi0gICAgICAgICAgICAgIChw
cm9nbgotICAgICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIGxpbmUgKGNkciBwb3MpKSkK
LSAgICAgICAgICAgICAgICAoaWYgKHZ0YWJsZS1nb3RvLW9iamVjdCBsb2NhdGlvbikKLSAgICAg
ICAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAxKSAgOyBJbnNlcnQgKmFmdGVyKi4KLSAgICAg
ICAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCi0gICAgICAgICAgICA7OyBPdGhl
cndpc2UsIGFwcGVuZCB0aGUgb2JqZWN0LgotICAgICAgICAgICAgKHNldGNhciBjYWNoZSAobmNv
bmMgbGluZXMgKGxpc3QgbGluZSkpKQotICAgICAgICAgICAgKHZ0YWJsZS1lbmQtb2YtdGFibGUp
KSkKLSAgICAgICAgKGxldCAoKHN0YXJ0IChwb2ludCkpKQotICAgICAgICAgIDs7IEZJWE1FOiBX
ZSBoYXZlIHRvIGFkanVzdCBjb2xvcnMgaW4gbGluZXMgYmVsb3cgdGhpcyBpZiB3ZQotICAgICAg
ICAgIDs7IGhhdmUgOnJvdy1jb2xvcnMuCi0gICAgICAgICAgKHZ0YWJsZS0taW5zZXJ0LWxpbmUg
dGFibGUgbGluZSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2Fj
aGUtd2lkdGhzIGNhY2hlKSAodnRhYmxlLS1zcGFjZXIgdGFibGUpCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZWxsaXBzaXMgZWxsaXBzaXMtd2lkdGgpCi0gICAgICAgICAgKGFkZC10
ZXh0LXByb3BlcnRpZXMgc3RhcnQgKHBvaW50KSAobGlzdCAna2V5bWFwIGtleW1hcAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJs
ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0
YWJsZS1jYWNoZSBjYWNoZSkpKQotICAgICAgICA7OyBXZSBtYXkgaGF2ZSBpbnNlcnRlZCBhIG5v
bi1udW1lcmljYWwgdmFsdWUgaW50byBhIHByZXZpb3VzbHkKLSAgICAgICAgOzsgYWxsLW51bWVy
aWNhbCB0YWJsZSwgc28gcmVjb21wdXRlLgotICAgICAgICAodnRhYmxlLS1yZWNvbXB1dGUtbnVt
ZXJpY2FsIHRhYmxlIChjZHIgbGluZSkpKSkpKQorICAgIChsZXQqICgoY2FjaGUgKHZ0YWJsZS0t
Y3VycmVudC1jYWNoZSB0YWJsZSkpCisgICAgICAgICAgIChsaW5lcyAodnRhYmxlLS1jYWNoZS1s
aW5lcyBjYWNoZSkpCisgICAgICAgICAgIChlbGVtIChpZiBsb2NhdGlvbiAgOyBUaGlzIGJpbmRp
bmcgbWlycm9ycyB0aGUgYmluZGluZyBvZiBgcG9zJyBhYm92ZS4KKyAgICAgICAgICAgICAgICAg
ICAgIChpZiAoaW50ZWdlcnAgbG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgKG50
aCBsb2NhdGlvbiBsaW5lcykKKyAgICAgICAgICAgICAgICAgICAgICAgKG9yIChhc3NxIGxvY2F0
aW9uIGxpbmVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBiZWZvcmUgKGNhciBs
aW5lcykpKSkKKyAgICAgICAgICAgICAgICAgICAoaWYgYmVmb3JlIChjYXIgbGluZXMpKSkpCisg
ICAgICAgICAgIChwb3MgKG1lbXEgZWxlbSBsaW5lcykpCisgICAgICAgICAgIChsaW5lIChjb25z
IG9iamVjdCAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpKSkKKyAg
ICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKQorICAgICAgICAo
bGV0ICgoaW5oaWJpdC1yZWFkLW9ubHkgdCkKKyAgICAgICAgICAgICAgKGluaGliaXQtbW9kaWZp
Y2F0aW9uLWhvb2tzIHQpKQorICAgICAgICAgIChzYXZlLWV4Y3Vyc2lvbgorICAgICAgICAgICAg
KHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlKQorICAgICAgICAgICAgKGlmIChvciBiZWZvcmUKKyAg
ICAgICAgICAgICAgICAgICAgKGFuZCBwb3MgKGludGVnZXJwIGxvY2F0aW9uKSkpCisgICAgICAg
ICAgICAgICAgOzsgQWRkIHRoZSBuZXcgb2JqZWN0IGJlZm9yZTouCisgICAgICAgICAgICAgICAg
KGxldCAoKG9sZC1saW5lIChjYXIgcG9zKSkpCisgICAgICAgICAgICAgICAgICAoc2V0Y2FyIHBv
cyBsaW5lKQorICAgICAgICAgICAgICAgICAgKHNldGNkciBwb3MgKGNvbnMgb2xkLWxpbmUgKGNk
ciBwb3MpKSkKKyAgICAgICAgICAgICAgICAgICh1bmxlc3MgKHZ0YWJsZS1nb3RvLW9iamVjdCAo
Y2FyIGVsZW0pKQorICAgICAgICAgICAgICAgICAgICAodnRhYmxlLWJlZ2lubmluZy1vZi10YWJs
ZSkpKQorICAgICAgICAgICAgICA7OyBPdGhlcndpc2UsIGFkZCB0aGUgb2JqZWN0IGFmdGVyLgor
ICAgICAgICAgICAgICAoaWYgcG9zCisgICAgICAgICAgICAgICAgICA7OyBTcGxpY2UgdGhlIG9i
amVjdCBpbnRvIHRoZSBsaXN0LgorICAgICAgICAgICAgICAgICAgKHByb2duCisgICAgICAgICAg
ICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIGxpbmUgKGNkciBwb3MpKSkKKyAgICAgICAgICAg
ICAgICAgICAgKGlmICh2dGFibGUtZ290by1vYmplY3QgbG9jYXRpb24pCisgICAgICAgICAgICAg
ICAgICAgICAgICAoZm9yd2FyZC1saW5lIDEpICA7IEluc2VydCAqYWZ0ZXIqLgorICAgICAgICAg
ICAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCisgICAgICAgICAgICAgICAgOzsg
T3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVjdC4KKyAgICAgICAgICAgICAgICAoc2V0Y2FyIGNh
Y2hlIChuY29uYyBsaW5lcyAobGlzdCBsaW5lKSkpCisgICAgICAgICAgICAgICAgKHZ0YWJsZS1l
bmQtb2YtdGFibGUpKSkKKyAgICAgICAgICAgIChsZXQqICgoc3RhcnQgKHBvaW50KSkKKyAgICAg
ICAgICAgICAgICAgICAoZWxsaXBzaXMgKGlmICh2dGFibGUtZWxsaXBzaXMgdGFibGUpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAodHJ1bmNhdGUtc3RyaW5n
LWVsbGlwc2lzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
J2ZhY2UgKHZ0YWJsZS1mYWNlIHRhYmxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiIikpCisgICAgICAgICAgICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwt
d2lkdGggZWxsaXBzaXMgKGN1cnJlbnQtYnVmZmVyKSkpCisgICAgICAgICAgICAgICAgICAgKGtl
eW1hcCAoZ2V0LXRleHQtcHJvcGVydHkgKHBvaW50KSAna2V5bWFwKSkpCisgICAgICAgICAgICAg
IDs7IEZJWE1FOiBXZSBoYXZlIHRvIGFkanVzdCBjb2xvcnMgaW4gbGluZXMgYmVsb3cgdGhpcyBp
ZiB3ZQorICAgICAgICAgICAgICA7OyBoYXZlIDpyb3ctY29sb3JzLgorICAgICAgICAgICAgICAo
dnRhYmxlLS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIDAKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKHZ0YWJsZS0tY2FjaGUtd2lkdGhzIGNhY2hlKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1zcGFjZXIgdGFibGUpCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGVsbGlwc2lzIGVsbGlwc2lzLXdpZHRoKQorICAgICAgICAg
ICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9pbnQpIChsaXN0ICdrZXltYXAga2V5
bWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgJ3Z0YWJsZSB0YWJsZSkpKQorICAgICAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5zZXJ0ZWQg
YSBub24tbnVtZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5CisgICAgICAgICAgICA7OyBh
bGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUuCisgICAgICAgICAgICAodnRhYmxlLS1y
ZWNvbXB1dGUtbnVtZXJpY2FsIHRhYmxlIChjZHIgbGluZSkpKSkpKSkpCiAKIChkZWZ1biB2dGFi
bGUtY29sdW1uICh0YWJsZSBpbmRleCkKICAgIlJldHVybiB0aGUgbmFtZSBvZiB0aGUgSU5ERVh0
aCBjb2x1bW4gaW4gVEFCTEUuIgpAQCAtNTIwLDE0ICs1MjcsMTQgQEAgdnRhYmxlLS1jYWNoZS13
aWR0aHMKIChkZWZ1biB2dGFibGUtLWNhY2hlLWxpbmVzIChjYWNoZSkKICAgKGNhciBjYWNoZSkp
CiAKLShkZWZ1biB2dGFibGUtaW5zZXJ0ICh0YWJsZSkKKyhkZWZ1biB2dGFibGUtLWluc2VydCAo
dGFibGUpCiAgIChsZXQqICgoc3BhY2VyICh2dGFibGUtLXNwYWNlciB0YWJsZSkpCiAgICAgICAg
ICAoc3RhcnQgKHBvaW50KSkKICAgICAgICAgIChlbGxpcHNpcyAoaWYgKHZ0YWJsZS1lbGxpcHNp
cyB0YWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnRpemUgKHRydW5jYXRlLXN0
cmluZy1lbGxpcHNpcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhY2Ug
KHZ0YWJsZS1mYWNlIHRhYmxlKSkKICAgICAgICAgICAgICAgICAgICAgICIiKSkKLSAgICAgICAg
IChlbGxpcHNpcy13aWR0aCAoc3RyaW5nLXBpeGVsLXdpZHRoIGVsbGlwc2lzKSkKKyAgICAgICAg
IChlbGxpcHNpcy13aWR0aCAoc3RyaW5nLXBpeGVsLXdpZHRoIGVsbGlwc2lzICh2dGFibGUtYnVm
ZmVyIHRhYmxlKSkpCiAgICAgICAgICA7OyBXZSBtYWludGFpbiBhIGNhY2hlIHBlciBzY3JlZW4v
d2luZG93IHdpZHRoLCBzbyB0aGF0IHdlIHJlbmRlcgogICAgICAgICAgOzsgY29ycmVjdGx5IGlm
IEVtYWNzIGlzIG9wZW4gb24gdHdvIGRpZmZlcmVudCBzY3JlZW5zIChvciB0aGUKICAgICAgICAg
IDs7IHVzZXIgcmVzaXplcyB0aGUgZnJhbWUpLgpAQCAtNTQ5LDggKzU1Niw3IEBAIHZ0YWJsZS1p
bnNlcnQKICAgICAgICAgKGFkZC10ZXh0LXByb3BlcnRpZXMgc3RhcnQgKHBvaW50KQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAna2V5bWFwIHZ0YWJsZS1oZWFkZXItbGluZS1t
YXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlYXItbm9uc3RpY2t5IHQK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlLWNhY2hlIGNhY2hlKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZSkpCiAgICAgICAgIChz
ZXRxIHN0YXJ0IChwb2ludCkpKSkKICAgICAodnRhYmxlLS1zb3J0IHRhYmxlIGNhY2hlKQogICAg
IDs7IEluc2VydCB0aGUgZGF0YS4KQEAgLTU2MSwxMyArNTY3LDM1IEBAIHZ0YWJsZS1pbnNlcnQK
ICAgICAgICAgKHNldHEgbGluZS1udW1iZXIgKDErIGxpbmUtbnVtYmVyKSkpKQogICAgIChhZGQt
dGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkKICAgICAgICAgICAgICAgICAgICAgICAgICAo
bGlzdCAncmVhci1ub25zdGlja3kgdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2
dGFibGUgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlLWNhY2hl
IGNhY2hlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlIHRhYmxlKSkK
KyAgICAoc2V0ZiAodnRhYmxlLS1jdXJyZW50LWNhY2hlIHRhYmxlKSBjYWNoZSkKICAgICAoZ290
by1jaGFyIHN0YXJ0KSkpCiAKKyhkZWZ1biB2dGFibGUtaW5zZXJ0ICh0YWJsZSkKKyAgIkluc2Vy
dCBUQUJMRSBpbnRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KK1RoZSBjdXJyZW50IGJ1ZmZlciB3aWxs
IGJlIHJlY29yZGVkIGFzIFRBQkxFJ3MgYnVmZmVyLiAgSWYgdGhlIHRhYmxlIGlzCitpbnNlcnRl
ZCBpbnRvIGEgYnVmZmVyIG90aGVyIHRoYW4gaXRzIG9yaWdpbmF0aW5nIGJ1ZmZlciwgc2lnbmFs
IGFuCitlcnJvci4gIEEgdGFibGUgbWF5IGJlIHJlaW5zZXJ0ZWQgaW50byBpdHMgb3duIGJ1ZmZl
ciwgYnV0IGluc2VydCBvbmx5CitvbmUgaW5zdGFuY2UgcGVyIGJ1ZmZlci4gIFRoaXMgcmVzdHJp
Y3Rpb24gbmVlZHMgdG8gYmUgZW5mb3JjZWQgYnkgdGhlCitjYWxsZXIuIgorICAoaWYtbGV0KiAo
KHRhYmxlLWJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJsZSkpKQorICAgICAgKHdoZW4gKG5vdCAo
ZXEgdGFibGUtYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpKQorICAgICAgICAoZXJyb3IgIkEgdnRh
YmxlIGNhbm5vdCBiZSBpbnNlcnRlZCBpbnRvIG1vcmUgdGhhbiBvbmUgYnVmZmVyIikpKQorICAo
c2V0ZiAodnRhYmxlLWJ1ZmZlciB0YWJsZSkgKGN1cnJlbnQtYnVmZmVyKSkKKyAgKGxldCAoKGlu
aGliaXQtcmVhZC1vbmx5IHQpCisgICAgICAgIChpbmhpYml0LW1vZGlmaWNhdGlvbi1ob29rcyB0
KSkKKyAgICAodnRhYmxlLS1pbnNlcnQgdGFibGUpKSkKKworKGRlZnVuIHZ0YWJsZS1zZXQtYnVm
ZmVyICh0YWJsZSBidWZmZXIpCisgICJBc3NvY2lhdGUgQlVGRkVSIHdpdGggVEFCTEUuCitVc2Ug
dGhpcyBmdW5jdGlvbiB3aXRoIGNhcmUsIGFuZCBlbnN1cmUgeW91ciB2dGFibGUgaW5zdGFuY2Ug
cmVuZGVycworaXRzZWxmIGluIHRoZSBuZXcgYnVmZmVyLiIKKyAgKHNldGYgKHZ0YWJsZS1idWZm
ZXIgdGFibGUpIGJ1ZmZlcikpCisKIChkZWZ1biB2dGFibGUtLWluc2VydC1saW5lICh0YWJsZSBs
aW5lIGxpbmUtbnVtYmVyIHdpZHRocyBzcGFjZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAmb3B0aW9uYWwgZWxsaXBzaXMgZWxsaXBzaXMtd2lkdGgpCiAgIChsZXQgKChzdGFy
dCAocG9pbnQpKQorICAgICAgICAoYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKSkKICAgICAg
ICAgKGNvbHVtbnMgKHZ0YWJsZS1jb2x1bW5zIHRhYmxlKSkKICAgICAgICAgKGNvbHVtbi1jb2xv
cnMKICAgICAgICAgIChhbmQgKHZ0YWJsZS1jb2x1bW4tY29sb3JzIHRhYmxlKQpAQCAtNjA3LDE2
ICs2MzUsMTggQEAgdnRhYmxlLS1pbnNlcnQtbGluZQogICAgICAgICAgICAgICAgICAgICAgIChj
b25jYXQKICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tbGltaXQtc3RyaW5nCiAgICAg
ICAgICAgICAgICAgICAgICAgICBwcmUtY29tcHV0ZWQgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yIGVsbGlwc2lzLXdpZHRo
IDApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgZWxsaXBz
aXMtd2lkdGggMCkpCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpCiAgICAgICAgICAg
ICAgICAgICAgICAgIGVsbGlwc2lzKQogICAgICAgICAgICAgICAgICAgICBwcmUtY29tcHV0ZWQp
KQogICAgICAgICAgICAgICAgICA7OyBSZWNvbXB1dGUgd2lkdGhzLgogICAgICAgICAgICAgICAg
ICAodAotICAgICAgICAgICAgICAgICAgKGlmICg+IChzdHJpbmctcGl4ZWwtd2lkdGggdmFsdWUp
IChlbHQgd2lkdGhzIGluZGV4KSkKKyAgICAgICAgICAgICAgICAgIChpZiAoPiAoc3RyaW5nLXBp
eGVsLXdpZHRoIHZhbHVlIGJ1ZmZlcikgKGVsdCB3aWR0aHMgaW5kZXgpKQogICAgICAgICAgICAg
ICAgICAgICAgIChjb25jYXQKICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tbGltaXQt
c3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAoLSAoZWx0IHdpZHRocyBpbmRl
eCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciBlbGxpcHNpcy13aWR0aCAw
KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgZWxsaXBzaXMtd2lkdGgg
MCkpCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpCiAgICAgICAgICAgICAgICAgICAg
ICAgIGVsbGlwc2lzKQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpKSkKICAgICAgICAgICAg
ICAgIChzdGFydCAocG9pbnQpKQpAQCAtNjMwLDE0ICs2NjAsMTUgQEAgdnRhYmxlLS1pbnNlcnQt
bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAnc3BhY2UKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgOndpZHRoIChsaXN0CiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKCsgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1waXhlbC13aWR0aCBkaXNw
bGF5ZWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChz
dHJpbmctcGl4ZWwtd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZGlzcGxheWVkIGJ1ZmZlcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGlmIGxhc3QgMCBzcGFjZXIpKSkpKSkpCiAgICAgICAgICAgICAgOzsg
QWxpZ24gdG8gdGhlIHJpZ2h0LgogICAgICAgICAgICAgIChpbnNlcnQgKHByb3BlcnRpemUgIiAi
ICdkaXNwbGF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAnc3BhY2UK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3aWR0aCAobGlzdCAoLSAo
ZWx0IHdpZHRocyBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoc3RyaW5nLXBpeGVsLXdpZHRoCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZCkpKSkpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bs
YXllZCBidWZmZXIpKSkpKQogICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkKQogICAgICAg
ICAgICAgICh1bmxlc3MgbGFzdAogICAgICAgICAgICAgICAgKGluc2VydCAocHJvcGVydGl6ZSAi
ICIgJ2Rpc3BsYXkKQEAgLTY2NCwxNiArNjk1LDYgQEAgdnRhYmxlLS1pbnNlcnQtbGluZQogKGRl
ZnVuIHZ0YWJsZS0tY2FjaGUta2V5ICgpCiAgIChjb25zIChmcmFtZS10ZXJtaW5hbCkgKHdpbmRv
dy13aWR0aCkpKQogCi0oZGVmdW4gdnRhYmxlLS1jdXJyZW50LWNhY2hlICgpCi0gICJSZXR1cm4g
dGhlIGN1cnJlbnQgY2FjaGUgZm9yIHRoZSB0YWJsZSBhdCBwb2ludC4KLQotSW4gYHZ0YWJsZS1p
bnNlcnQnLCB0aGUgbGluZXMgYW5kIHdpZHRocyBvZiB0aGUgdnRhYmxlIHRleHQgYXJlIGNvbXB1
dGVkCi1iYXNlZCBvbiB0aGUgY3VycmVudCBzZWxlY3RlZCBmcmFtZSBhbmQgd2luZG93IGFuZCBz
dG9yZWQgaW4gYSBjYWNoZS4KLVN1YnNlcXVlbnQgaW50ZXJhY3Rpb24gd2l0aCB0aGUgdGV4dCBv
ZiB0aGUgdnRhYmxlIHNob3VsZCB1c2UgdGhhdCBjYWNoZQotdmlhIHRoaXMgZnVuY3Rpb24gcmF0
aGVyIHRoYW4gYnkgY2FsbGluZyBgdnRhYmxlLS1jYWNoZS1rZXknIHRvIGxvb2sgdXAKLXRoZSBj
YWNoZS4iCi0gIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICd2dGFibGUtY2FjaGUpKQotCiAo
ZGVmdW4gdnRhYmxlLS1jbGVhci1jYWNoZSAodGFibGUpCiAgIChzZXRmIChnZXRoYXNoICh2dGFi
bGUtLWNhY2hlLWtleSkgKHNsb3QtdmFsdWUgdGFibGUgJy1jYWNoZSkpIG5pbCkpCiAKQEAgLTcx
OCw2ICs3MzksNyBAQCB2dGFibGUtLWluZGljYXRvcgogKGRlZnVuIHZ0YWJsZS0taW5zZXJ0LWhl
YWRlci1saW5lICh0YWJsZSB3aWR0aHMgc3BhY2VyKQogICA7OyBJbnNlcnQgdGhlIGhlYWRlciBk
aXJlY3RseSBpbnRvIHRoZSBidWZmZXIuCiAgIChsZXQgKChzdGFydCAocG9pbnQpKQorICAgICAg
ICAoYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKSkKICAgICAgICAgKGRpdmlkZXIgKHZ0YWJs
ZS1kaXZpZGVyIHRhYmxlKSkKICAgICAgICAgKGNtYXAgKGRlZmluZS1rZXltYXAKICAgICAgICAg
ICAgICAgICAiPGhlYWRlci1saW5lPiA8ZHJhZy1tb3VzZS0xPiIgIyd2dGFibGUtLWRyYWctcmVz
aXplLWNvbHVtbgpAQCAtNzM3LDE0ICs3NTksMTUgQEAgdnRhYmxlLS1pbnNlcnQtaGVhZGVyLWxp
bmUKICAgICAgICAgICAgICAgICAgICAgICdrZXltYXAgY21hcCkpCiAgICAgICAgICAgICAgIChz
dGFydCAocG9pbnQpKQogICAgICAgICAgICAgICAoaW5kaWNhdG9yICh2dGFibGUtLWluZGljYXRv
ciB0YWJsZSBpbmRleCkpCi0gICAgICAgICAgICAgIChpbmRpY2F0b3Itd2lkdGggKHN0cmluZy1w
aXhlbC13aWR0aCBpbmRpY2F0b3IpKQorICAgICAgICAgICAgICAoaW5kaWNhdG9yLXdpZHRoIChz
dHJpbmctcGl4ZWwtd2lkdGggaW5kaWNhdG9yIGJ1ZmZlcikpCiAgICAgICAgICAgICAgIChsYXN0
ICg9IGluZGV4ICgxLSAobGVuZ3RoICh2dGFibGUtY29sdW1ucyB0YWJsZSkpKSkpCiAgICAgICAg
ICAgICAgIGRpc3BsYXllZCkKICAgICAgICAgIChzZXRxIGRpc3BsYXllZAotICAgICAgICAgICAg
ICAgKGlmICg+IChzdHJpbmctcGl4ZWwtd2lkdGggbmFtZSkKKyAgICAgICAgICAgICAgIChpZiAo
PiAoc3RyaW5nLXBpeGVsLXdpZHRoIG5hbWUgYnVmZmVyKQogICAgICAgICAgICAgICAgICAgICAg
ICgtIChlbHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgpKQogICAgICAgICAgICAgICAg
ICAgICh2dGFibGUtLWxpbWl0LXN0cmluZwotICAgICAgICAgICAgICAgICAgICBuYW1lICgtIChl
bHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgpKQorICAgICAgICAgICAgICAgICAgICBu
YW1lICgtIChlbHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgpCisgICAgICAgICAgICAg
ICAgICAgIGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgbmFtZSkpCiAgICAgICAgICAobGV0KiAo
KGluZGljYXRvci1sZWFkLXdpZHRoCiAgICAgICAgICAgICAgICAgIDs7IFdlIHdhbnQgdGhlIGlu
ZGljYXRvciB0byBub3QgYmUgcXVpdGUgZmx1c2ggcmlnaHQuCkBAIC03NTMsNyArNzc2LDcgQEAg
dnRhYmxlLS1pbnNlcnQtaGVhZGVyLWxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbmRpY2F0b3ItbGVhZC13aWR0aCkpCiAgICAgICAgICAgICAgICAgKGZpbGwt
d2lkdGgKICAgICAgICAgICAgICAgICAgKCsgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCi0gICAgICAg
ICAgICAgICAgICAgICAgIChzdHJpbmctcGl4ZWwtd2lkdGggZGlzcGxheWVkKQorICAgICAgICAg
ICAgICAgICAgICAgICAoc3RyaW5nLXBpeGVsLXdpZHRoIGRpc3BsYXllZCBidWZmZXIpCiAgICAg
ICAgICAgICAgICAgICAgICAgIGluZGljYXRvci13aWR0aAogICAgICAgICAgICAgICAgICAgICAg
ICBpbmRpY2F0b3ItbGVhZC13aWR0aCkKICAgICAgICAgICAgICAgICAgICAgKGlmIGxhc3QgMCBz
cGFjZXIpKSkpCkBAIC03NzEsNyArNzk0LDggQEAgdnRhYmxlLS1pbnNlcnQtaGVhZGVyLWxpbmUK
ICAgICAgICAgICAgICA7OyBUaGlzIGlzIHRoZSBmaW5hbCBjb2x1bW4sIGFuZCB3ZSBoYXZlIGEg
c29ydGluZwogICAgICAgICAgICAgIDs7IGluZGljYXRvciwgYW5kIHRoZSB0YWJsZSBpcyB0b28g
d2lkZSBmb3IgdGhlIHdpbmRvdy4KICAgICAgICAgICAgICAobGV0KiAoKHByZS1pbmRpY2F0b3Ig
KHN0cmluZy1waXhlbC13aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50LW1pbikgKHBvaW50KSkpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50LW1pbikgKHBvaW50
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikpCiAgICAgICAg
ICAgICAgICAgICAgIChwcmUtZmlsbAogICAgICAgICAgICAgICAgICAgICAgKC0gKHdpbmRvdy13
aWR0aCBuaWwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1pbmRpY2F0b3IKQEAgLTg1
MCwxNCArODc0LDE2IEBAIHZ0YWJsZS0tc2V0LWhlYWRlci1saW5lCiAgICAgICAgICAgIChidWZm
ZXItc3Vic3RyaW5nIChwb2ludC1taW4pICgxLSAocG9pbnQtbWF4KSkpKSkpCiAgICh2dGFibGUt
aGVhZGVyLW1vZGUgMSkpCiAKLShkZWZ1biB2dGFibGUtLWxpbWl0LXN0cmluZyAoc3RyaW5nIHBp
eGVscykKKworKGRlZnVuIHZ0YWJsZS0tbGltaXQtc3RyaW5nIChzdHJpbmcgcGl4ZWxzIGJ1ZmZl
cikKICAgKHdoaWxlIChhbmQgKGxlbmd0aD4gc3RyaW5nIDApCi0gICAgICAgICAgICAgICg+IChz
dHJpbmctcGl4ZWwtd2lkdGggc3RyaW5nKSBwaXhlbHMpKQorICAgICAgICAgICAgICAoPiAoc3Ry
aW5nLXBpeGVsLXdpZHRoIHN0cmluZyBidWZmZXIpIHBpeGVscykpCiAgICAgKHNldHEgc3RyaW5n
IChzdWJzdHJpbmcgc3RyaW5nIDAgKDEtIChsZW5ndGggc3RyaW5nKSkpKSkKICAgc3RyaW5nKQog
CiAoZGVmdW4gdnRhYmxlLS1jaGFyLXdpZHRoICh0YWJsZSkKLSAgKHN0cmluZy1waXhlbC13aWR0
aCAocHJvcGVydGl6ZSAieCIgJ2ZhY2UgKHZ0YWJsZS1mYWNlIHRhYmxlKSkpKQorICAoc3RyaW5n
LXBpeGVsLXdpZHRoIChwcm9wZXJ0aXplICJ4IiAnZmFjZSAodnRhYmxlLWZhY2UgdGFibGUpKQor
ICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtYnVmZmVyIHRhYmxlKSkpCiAKIChkZWZ1biB2
dGFibGUtLWNvbXB1dGUtd2lkdGggKHRhYmxlIHNwZWMpCiAgIChjb25kCkBAIC05MzYsNyArOTYy
LDcgQEAgdnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lCiAgICAgICAgOzsgV2Ugc3Rhc2ggdGhl
IGNvbXB1dGVkIHdpZHRoIGFuZCBzdHJpbmcgaGVyZSAtLSBpZiB0aGVyZSBhcmUKICAgICAgICA7
OyBubyBmb3JtYXR0ZXJzL2Rpc3BsYXllcnMsIHdlJ2xsIGJlIHVzaW5nIHRoZSBzdHJpbmcsIGFu
ZAogICAgICAgIDs7IHRoZW4gd29uJ3QgaGF2ZSB0byByZWNyZWF0ZSBpdC4KLSAgICAgICAobGlz
dCB2YWx1ZSAoc3RyaW5nLXBpeGVsLXdpZHRoIHN0cmluZykgc3RyaW5nKSkpCisgICAgICAgKGxp
c3QgdmFsdWUgKHN0cmluZy1waXhlbC13aWR0aCBzdHJpbmcgKHZ0YWJsZS1idWZmZXIgdGFibGUp
KSBzdHJpbmcpKSkKICAgICh2dGFibGUtY29sdW1ucyB0YWJsZSkpKQogCiAoZGVmdW4gdnRhYmxl
LS1tYWtlLWtleW1hcCAodGFibGUpCkBAIC05NjcsMjAgKzk5MywyMiBAQCB2dGFibGUtLW1ha2Ut
a2V5bWFwCiAgICAgICAgICAgKHZ0YWJsZS1rZXltYXAgdGFibGUpKQogICAgICAgbWFwKSkpCiAK
LShkZWZ1biB2dGFibGUtcmV2ZXJ0ICgpCi0gICJSZWdlbmVyYXRlIHRoZSB0YWJsZSB1bmRlciBw
b2ludC4iCi0gIChsZXQgKCh0YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKQotICAgICAgICAo
b2JqZWN0ICh2dGFibGUtY3VycmVudC1vYmplY3QpKQotICAgICAgICAoY29sdW1uICh2dGFibGUt
Y3VycmVudC1jb2x1bW4pKQotICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkpCi0gICAgKHVu
bGVzcyB0YWJsZQotICAgICAgKHVzZXItZXJyb3IgIk5vIHRhYmxlIHVuZGVyIHBvaW50IikpCi0g
ICAgKGRlbGV0ZS1yZWdpb24gKHZ0YWJsZS1iZWdpbm5pbmctb2YtdGFibGUpICh2dGFibGUtZW5k
LW9mLXRhYmxlKSkKLSAgICAodnRhYmxlLWluc2VydCB0YWJsZSkKLSAgICAod2hlbiBvYmplY3QK
LSAgICAgICh2dGFibGUtZ290by1vYmplY3Qgb2JqZWN0KSkKLSAgICAod2hlbiBjb2x1bW4KLSAg
ICAgICh2dGFibGUtZ290by1jb2x1bW4gY29sdW1uKSkpKQorKGRlZnVuIHZ0YWJsZS1yZXZlcnQg
KCZvcHRpb25hbCB0YWJsZSkKKyAgIlJlZ2VuZXJhdGUgVEFCTEUsIGRlZmF1bHRpbmcgdG8gdGhl
IHRhYmxlIHVuZGVyIHBvaW50LiIKKyAgKHNldHEgdGFibGUgKG9yIHRhYmxlICh2dGFibGUtY3Vy
cmVudC10YWJsZSkpKQorICAodW5sZXNzIHRhYmxlCisgICAgKHVzZXItZXJyb3IgIk5vIHRhYmxl
IHVuZGVyIHBvaW50IikpCisgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRh
YmxlKQorICAgIChsZXQgKChvYmplY3QgKHZ0YWJsZS1jdXJyZW50LW9iamVjdCkpCisgICAgICAg
ICAgKGNvbHVtbiAodnRhYmxlLWN1cnJlbnQtY29sdW1uKSkKKyAgICAgICAgICAoaW5oaWJpdC1y
ZWFkLW9ubHkgdCkKKyAgICAgICAgICAoaW5oaWJpdC1tb2RpZmljYXRpb24taG9va3MgdCkpCisg
ICAgICAoZGVsZXRlLXJlZ2lvbiAodnRhYmxlLWJlZ2lubmluZy1vZi10YWJsZSkgKHZ0YWJsZS1l
bmQtb2YtdGFibGUpKQorICAgICAgKHZ0YWJsZS0taW5zZXJ0IHRhYmxlKQorICAgICAgKHdoZW4g
b2JqZWN0CisgICAgICAgICh2dGFibGUtZ290by1vYmplY3Qgb2JqZWN0KSkKKyAgICAgICh3aGVu
IGNvbHVtbgorICAgICAgICAodnRhYmxlLWdvdG8tY29sdW1uIGNvbHVtbikpKSkpCiAKIDs7OyBD
b21tYW5kcy4KIApAQCAtMTAwNiwxNCArMTAzNCwxNCBAQCB2dGFibGUtbmFycm93LWN1cnJlbnQt
Y29sdW1uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtICgqICh2dGFibGUtLWNo
YXItd2lkdGggdGFibGUpIChvciBuIDEpKSkpKSkKIAogKGRlZnVuIHZ0YWJsZS0tYWx0ZXItY29s
dW1uLXdpZHRoICh0YWJsZSBjb2x1bW4gZGVsdGEpCi0gIChsZXQgKCh3aWR0aHMgKHZ0YWJsZS0t
Y2FjaGUtd2lkdGhzICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKSkpCisgIChsZXQgKCh3aWR0aHMg
KHZ0YWJsZS0tY2FjaGUtd2lkdGhzICh2dGFibGUtLWN1cnJlbnQtY2FjaGUgdGFibGUpKSkpCiAg
ICAgKHNldGYgKGFyZWYgd2lkdGhzIGNvbHVtbikKICAgICAgICAgICAobWF4ICgqICh2dGFibGUt
LWNoYXItd2lkdGggdGFibGUpIDIpCiAgICAgICAgICAgICAgICAoKyAoYXJlZiB3aWR0aHMgY29s
dW1uKSBkZWx0YSkpKQogICAgIDs7IFN0b3JlIHRoZSB3aWR0aCBzbyBpdCdsbCBiZSByZXNwZWN0
ZWQgb24gYSByZXZlcnQuCiAgICAgKHNldGYgKHZ0YWJsZS1jb2x1bW4td2lkdGggKGVsdCAodnRh
YmxlLWNvbHVtbnMgdGFibGUpIGNvbHVtbikpCiAgICAgICAgICAgKGZvcm1hdCAiJWRweCIgKGFy
ZWYgd2lkdGhzIGNvbHVtbikpKQotICAgICh2dGFibGUtcmV2ZXJ0KSkpCisgICAgKHZ0YWJsZS1y
ZXZlcnQgdGFibGUpKSkKIAogKGRlZnVuIHZ0YWJsZS13aWRlbi1jdXJyZW50LWNvbHVtbiAoJm9w
dGlvbmFsIG4pCiAgICJXaWRlbiB0aGUgY3VycmVudCBjb2x1bW4gYnkgTiBjaGFyYWN0ZXJzLgpA
QCAtMTAyOCwyNCArMTA1NiwyOSBAQCB2dGFibGUtcHJldmlvdXMtY29sdW1uCiAgIChpbnRlcmFj
dGl2ZSkKICAgKHZ0YWJsZS1nb3RvLWNvbHVtbgogICAgKG1heCAwICgxLSAob3IgKHZ0YWJsZS1j
dXJyZW50LWNvbHVtbikKLSAgICAgICAgICAgICAgICAgIChsZW5ndGggKHZ0YWJsZS0tY2FjaGUt
d2lkdGhzICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKSkpKSkpKQorICAgICAgICAgICAgICAgICAg
KGxlbmd0aCAodnRhYmxlLS1jYWNoZS13aWR0aHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICh2dGFibGUtLWN1cnJlbnQtY2FjaGUgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpKSkpKSkpCiAK
IChkZWZ1biB2dGFibGUtbmV4dC1jb2x1bW4gKCkKICAgIkdvIHRvIHRoZSBuZXh0IGNvbHVtbi4i
CiAgIChpbnRlcmFjdGl2ZSkKICAgKHdoZW4gKHZ0YWJsZS1jdXJyZW50LWNvbHVtbikKICAgICAo
dnRhYmxlLWdvdG8tY29sdW1uCi0gICAgIChtaW4gKDEtIChsZW5ndGggKHZ0YWJsZS0tY2FjaGUt
d2lkdGhzICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKSkpCisgICAgIChtaW4gKDEtIChsZW5ndGgg
KHZ0YWJsZS0tY2FjaGUtd2lkdGhzCisgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWN1
cnJlbnQtY2FjaGUgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpKSkKICAgICAgICAgICAoMSsgKHZ0
YWJsZS1jdXJyZW50LWNvbHVtbikpKSkpKQogCi0oZGVmdW4gdnRhYmxlLXJldmVydC1jb21tYW5k
ICgpCi0gICJSZS1xdWVyeSBkYXRhIGFuZCByZWdlbmVyYXRlIHRoZSB0YWJsZSB1bmRlciBwb2lu
dC4iCisoZGVmdW4gdnRhYmxlLXJldmVydC1jb21tYW5kICgmb3B0aW9uYWwgdGFibGUpCisgICJS
ZS1xdWVyeSBkYXRhIGFuZCByZWdlbmVyYXRlIFRBQkxFLgorSWYgVEFCTEUgaXMgbmlsLCB1c2Ug
dGhlIHRhYmxlIHVuZGVyIHBvaW50LiIKICAgKGludGVyYWN0aXZlKQotICAobGV0ICgodGFibGUg
KHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpCi0gICAgKHdoZW4gKHZ0YWJsZS1vYmplY3RzLWZ1bmN0
aW9uIHRhYmxlKQotICAgICAgKHNldGYgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSAoZnVuY2FsbCAo
dnRhYmxlLW9iamVjdHMtZnVuY3Rpb24gdGFibGUpKSkpCi0gICAgKHZ0YWJsZS0tY2xlYXItY2Fj
aGUgdGFibGUpKQotICAodnRhYmxlLXJldmVydCkpCisgIChzZXRxIHRhYmxlIChvciB0YWJsZSAo
dnRhYmxlLWN1cnJlbnQtdGFibGUpKSkKKyAgKHVubGVzcyB0YWJsZQorICAgICh1c2VyLWVycm9y
ICJObyB0YWJsZSBmb3VuZCIpKQorICAod2hlbiAodnRhYmxlLW9iamVjdHMtZnVuY3Rpb24gdGFi
bGUpCisgICAgKHNldGYgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSAoZnVuY2FsbCAodnRhYmxlLW9i
amVjdHMtZnVuY3Rpb24gdGFibGUpKSkpCisgICh2dGFibGUtLWNsZWFyLWNhY2hlIHRhYmxlKQor
ICAodnRhYmxlLXJldmVydCB0YWJsZSkpCiAKIChkZWZ1biB2dGFibGUtc29ydC1ieS1jdXJyZW50
LWNvbHVtbiAoKQogICAiU29ydCB0aGUgdGFibGUgdW5kZXIgcG9pbnQgYnkgdGhlIGNvbHVtbiB1
bmRlciBwb2ludC4iCkBAIC0xMDY3LDggKzExMDAsOCBAQCB2dGFibGUtc29ydC1ieS1jdXJyZW50
LWNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoZXEgKGNkciBs
YXN0KSAnYXNjZW5kKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVz
Y2VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzY2VuZCkKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzY2VuZCkpKSkpKQotICAodnRhYmxlLXJldmVy
dCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc2NlbmQpKSkpKQorICAgICh2
dGFibGUtcmV2ZXJ0IHRhYmxlKSkpCiAKIChkZWZ1biB2dGFibGUtaGVhZGVyLWxpbmUtc29ydCAo
ZSkKICAgIlNvcnQgYSB2dGFibGUgZnJvbSB0aGUgaGVhZGVyIGxpbmUuIgpkaWZmIC0tZ2l0IGEv
dGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsIGIvdGVzdC9saXNwL2VtYWNzLWxp
c3AvdnRhYmxlLXRlc3RzLmVsCmluZGV4IDc0ZmI4Y2M4MTM5Li5lMDMyOGUzMWJjNSAxMDA2NDQK
LS0tIGEvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsCisrKyBiL3Rlc3QvbGlz
cC9lbWFjcy1saXNwL3Z0YWJsZS10ZXN0cy5lbApAQCAtMjcsMTYgKzI3LDE5IEBACiAocmVxdWly
ZSAnZXJ0KQogKHJlcXVpcmUgJ2VydC14KQogCi0oZXJ0LWRlZnRlc3QgdGVzdC12c3RhYmxlLWNv
bXB1dGUtY29sdW1ucyAoKQorKGRlZnVuIHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFkZXItMi1v
YmplY3QtdGFibGUgKCkKKyAgKG1ha2UtdnRhYmxlIDpjb2x1bW5zICcoImEiICJiIiAiYyIpCisg
ICAgICAgICAgICAgICA6b2JqZWN0cyAnKCgiZm9vIiAxIDIpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICgiYmFyIiAzIDp6b3QpKQorICAgICAgICAgICAgICAgOmluc2VydCBuaWwpKQorCiso
ZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtY29tcHV0ZS1jb2x1bW5zICgpCiAgIChzaG91bGQKICAg
IChlcXVhbCAobWFwY2FyCiAgICAgICAgICAgIChsYW1iZGEgKGNvbHVtbikKICAgICAgICAgICAg
ICAodnRhYmxlLWNvbHVtbi1hbGlnbiBjb2x1bW4pKQogICAgICAgICAgICAodnRhYmxlLS1jb21w
dXRlLWNvbHVtbnMKLSAgICAgICAgICAgIChtYWtlLXZ0YWJsZSA6Y29sdW1ucyAnKCJhIiAiYiIg
ImMiKQotICAgICAgICAgICAgICAgICAgICAgICAgIDpvYmplY3RzICcoKCJmb28iIDEgMikKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYmFyIiAzIDp6b3QpKQotICAgICAg
ICAgICAgICAgICAgICAgICAgIDppbnNlcnQgbmlsKSkpCisgICAgICAgICAgICAodnRhYmxlLXRl
c3RzLS1tYWtlLW5vLWhlYWRlci0yLW9iamVjdC10YWJsZSkpKQogICAgICAgICAgICcobGVmdCBy
aWdodCBsZWZ0KSkpKQogCiAoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtaW5zZXJ0LW9iamVjdCAo
KQpAQCAtNjksNCArNzIsNzUgQEAgdGVzdC12dGFibGUtaW5zZXJ0LW9iamVjdAogICAgICAgICAg
ICAgICAobWFwY2FyICMnY2FkciAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkpCiAgICAgICAgICAg
KG51bWJlci1zZXF1ZW5jZSAwIDExKSkpKQogCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtdW5p
cXVlLWJ1ZmZlciAoKQorICAobGV0ICgodGFibGUgKHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFk
ZXItMi1vYmplY3QtdGFibGUpKSkKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgKHZ0YWJs
ZS1pbnNlcnQgdGFibGUpCisgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgICAoc2hvdWxk
LWVycm9yICh2dGFibGUtaW5zZXJ0IHRhYmxlKSkpCisgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgor
ICAgICAgICAodnRhYmxlLXNldC1idWZmZXIgdGFibGUgKGN1cnJlbnQtYnVmZmVyKSkKKyAgICAg
ICAgKHZ0YWJsZS1pbnNlcnQgdGFibGUpKSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUt
cmVhZC1vbmx5LWJ1ZmZlciAoKQorICAobGV0ICgodGFibGUgKHZ0YWJsZS10ZXN0cy0tbWFrZS1u
by1oZWFkZXItMi1vYmplY3QtdGFibGUpKSkKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAg
KHNldHEgYnVmZmVyLXJlYWQtb25seSB0KQorICAgICAgKHZ0YWJsZS1pbnNlcnQgdGFibGUpKSkp
CisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItaW5zZXJ0LW9i
amVjdCAoKQorICAobGV0ICgodGFibGUgKHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFkZXItMi1v
YmplY3QtdGFibGUpKQorICAgICAgICAob2JqICcoImJheiIgNCA1KSkpCisgICAgKHdpdGgtdGVt
cC1idWZmZXIKKyAgICAgICh2dGFibGUtaW5zZXJ0IHRhYmxlKQorICAgICAgKHNob3VsZCAoPSAo
Y291bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpIDIpKQorICAgICAgKHdpdGgtdGVt
cC1idWZmZXIKKyAgICAgICAgKHZ0YWJsZS1pbnNlcnQtb2JqZWN0IHRhYmxlIG9iaikpCisgICAg
ICAoc2hvdWxkICg9IChjb3VudC1saW5lcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkgMykpKSkp
CisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItcmVtb3ZlLW9i
amVjdCAoKQorICAobGV0ICgodGFibGUgKHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFkZXItMi1v
YmplY3QtdGFibGUpKQorICAgICAgICAob2JqICcoImJheiIgNCA1KSkpCisgICAgKHdpdGgtdGVt
cC1idWZmZXIKKyAgICAgICh2dGFibGUtaW5zZXJ0IHRhYmxlKQorICAgICAgKHZ0YWJsZS1pbnNl
cnQtb2JqZWN0IHRhYmxlIG9iaikKKyAgICAgIChzaG91bGQgKD0gKGNvdW50LWxpbmVzIChwb2lu
dC1taW4pIChwb2ludC1tYXgpKSAzKSkKKyAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAg
ICh2dGFibGUtcmVtb3ZlLW9iamVjdCB0YWJsZSBvYmopKQorICAgICAgKHNob3VsZCAoPSAoY291
bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpIDIpKSkpKQorCisoZXJ0LWRlZnRlc3Qg
dGVzdC12dGFibGUtbm9uLWN1cnJlbnQtYnVmZmVyLXVwZGF0ZS1vYmplY3QgKCkKKyAgKGxldCAo
KHRhYmxlICh2dGFibGUtdGVzdHMtLW1ha2Utbm8taGVhZGVyLTItb2JqZWN0LXRhYmxlKSkKKyAg
ICAgICAgKG9iaiAnKCJiYXoiIDQgNSkpCisgICAgICAgIChvYmotMiAnKCJxdXgiIDYgNykpKQor
ICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAodnRhYmxlLWluc2VydCB0YWJsZSkKKyAgICAg
ICh2dGFibGUtaW5zZXJ0LW9iamVjdCB0YWJsZSBvYmopCisgICAgICAoc2hvdWxkICg9IChjb3Vu
dC1saW5lcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkgMykpCisgICAgICAobGV0ICgobGluZS0y
IChwcm9nbgorICAgICAgICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisg
ICAgICAgICAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAyKQorICAgICAgICAgICAgICAgICAg
ICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkgKHBvaW50LW1heCkpKSkpCisgICAgICAgICh3
aXRoLXRlbXAtYnVmZmVyCisgICAgICAgICAgKHZ0YWJsZS11cGRhdGUtb2JqZWN0IHRhYmxlIG9i
ai0yIG9iaikpCisgICAgICAgIChsZXQgKChsaW5lLTItbmV3IChwcm9nbgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGZvcndhcmQtbGluZSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChidWZmZXItc3Vic3RyaW5nIChwb2ludCkgKHBvaW50LW1heCkpKSkpCisgICAgICAgICAgKHNo
b3VsZCAoPSAoY291bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpIDMpKQorICAgICAg
ICAgIChzaG91bGQgKG5vdCAoc3RyaW5nPSBsaW5lLTIgbGluZS0yLW5ldykpKSkpKSkpCisKKyhl
cnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS0tbGltaXQtc3RyaW5nLXdpdGgtZmFjZS1yZW1hcHBlZC1i
dWZmZXIgKCkKKyAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAobGV0ICgodGV4dCAocHJvcGVydGl6
ZSAiWFhYWFgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhY2UgJ3ZhcmlhYmxlLXBp
dGNoKSkpCisgICAgICAoZmFjZS1yZW1hcC1hZGQtcmVsYXRpdmUgJ2RlZmF1bHQgOmhlaWdodCAx
LjUpCisgICAgICAoaWYgKD4gZW1hY3MtbWFqb3ItdmVyc2lvbiAzMCkKKyAgICAgICAgICAoc2hv
dWxkIChlcQorICAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgICAgICAgICAgICAobGVuZ3Ro
ICh2dGFibGUtLWxpbWl0LXN0cmluZyB0ZXh0IDUwIChjdXJyZW50LWJ1ZmZlcikpKSkpCisgICAg
ICAgIChzaG91bGQgKGVxCisgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgICAgICAgICAgKGxl
bmd0aCAodnRhYmxlLS1saW1pdC1zdHJpbmcgdGV4dCA1MCkpKSkpKSkpCisKIDs7OyB2dGFibGUt
dGVzdHMuZWwgZW5kcyBoZXJlCi0tIAoyLjQ3LjEKCg==
--000000000000bfd80b064605fc16--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 15 Dec 2025 22:00:28 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Dec 15 17:00:28 2025
Received: from localhost ([127.0.0.1]:44960 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vVGcF-0002X0-JR
	for submit <at> debbugs.gnu.org; Mon, 15 Dec 2025 17:00:27 -0500
Received: from mxout5.mail.janestreet.com ([64.215.233.18]:40609)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <sbaugh@HIDDEN>)
 id 1vVGcD-0002UR-8W
 for 79982 <at> debbugs.gnu.org; Mon, 15 Dec 2025 17:00:25 -0500
From: Spencer Baugh <sbaugh@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer
 slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
In-Reply-To: <CAN+1HbrqF3OqdZQxgWWWmOjTd4UW4Vu64X5mS28M2N50TgzCgQ@HIDDEN>
 (=?utf-8?Q?=22St=C3=A9phane?= Marks"'s message of "Mon, 15 Dec 2025
 16:22:08 -0500")
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <ierzf7ndebe.fsf_-_@HIDDEN>
 <CAN+1HbrMnL=PJt0d-ePEd5y15zDWVZQK0wJYEi5+b+wY3VK4DQ@HIDDEN>
 <CAN+1HbqXgFw0eh_asmGkNuJ9Lv-vfm10SELQs6U9M2U3p=QUog@HIDDEN>
 <iertsxvd878.fsf@HIDDEN>
 <CAN+1HbpOOT9RXTQeGW8je=uz0aV=19oYWwhu3Dj=GGkFmOdkgw@HIDDEN>
 <CAN+1HbrqF3OqdZQxgWWWmOjTd4UW4Vu64X5mS28M2N50TgzCgQ@HIDDEN>
Date: Mon, 15 Dec 2025 17:00:19 -0500
Message-ID: <ierv7i7xv64.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com;
 s=waixah; t=1765836020;
 bh=iwdwyohFR1M6fsJCbX8YFzl9oKWGsJImXH+qhD72zEc=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date;
 b=dQTMagdn+sH1FIbBUtiH/93iBasPDhuPoOwM/y9LajyXcItpgm6aJsw0AiQnATROY
 b0nbSHPc4+Dpb9mgEEVAps0N575EWl6RNVx6p313jLVjH8DYN3ETkdDwu/E/s+W/z1
 55yYpTEhLuK//kMMwSz7Cd+1cG6N88mBKoGWRpTl1lIdmFM/9+3JcaiK6ckFRnuR15
 BbpeT1p0UrpWPII5+f4LYxucSBifroWOcSZ1UdFl3K4S9GN8gP9EI6ORyYIHNEoaQm
 AorNGHd4xz/ttJCz0pwPbbDRdqcYcVTowopBkP6xMbXzX187cAtZALAD+m9Mto7/2k
 kmyGnnFwDmMiA==
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

St=C3=A9phane Marks <shipmints@HIDDEN> writes:

> On Fri, Dec 12, 2025 at 10:48=E2=80=AFAM St=C3=A9phane Marks <shipmints@g=
mail.com> wrote:
>
>  On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh <sbaugh@janestree=
t.com> wrote:
>
>  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>
>  > On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks <shipmints=
@gmail.com> wrote:
>  >
>  >  On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh <sbaugh@janestr=
eet.com> wrote:
>  >
>  >  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>  >  > --- a/lisp/emacs-lisp/vtable.el
>  >  > +++ b/lisp/emacs-lisp/vtable.el
>  >  > @@ -398,56 +403,58 @@ vtable-insert-object
>  >  ...
>  >  > +      (with-current-buffer (vtable-buffer table)
>  >  > +        (save-excursion
>  >
>  >  So in the end I think the only way to keep the diff to vtable-insert-=
object small is
>  >  if you use (set-buffer (vtable-buffer table)) here instead of
>  >  with-current-buffer.  It's a bit less normal, but it at least avoids
>  >  some unnecessary indentation.
>  >
>  >  That is, instead of
>  >  (with-current-buffer (vtable-buffer table)
>  >    (save-excursion
>  >      ...))
>  >
>  >  do
>  >
>  >  (save-excursion
>  >    (set-buffer (vtable-buffer table))
>  >    ...)
>  >
>  >  (save-excursion saves and restores the current buffer)
>  >
>  >  Thanks for making all these changes.  I think after that we should be
>  >  good to go.
>  >
>  >  While I appreciate the desire for tiny diffs, I prefer that the stanz=
as used in update insert remove functions remain
>  consistent
>  >  and we avoid a special comment explaining why insert is special sayin=
g this was just for indentation.  Hrumph.
>  >
>  > The alternative would be to make them all save-excursion, set-buffer, =
if you think that's worthy.
>
>  IMO that's worth doing.  It also saves indentation, so it's actually
>  somewhat useful in all the places we're currently adding a
>  with-current-buffer, even if it doesn't avoid a big reindent diff.
>
>  I forgot about the compiler warning
>
>    emacs-lisp/vtable.el:376:10: Warning: Use =E2=80=98with-current-buffer=
=E2=80=99 rather than save-excursion+set-buffer
>
>  We may also need save-excursion twice, once for what is the ambient curr=
ent buffer, and the second to ensure that point doesn't
>  move around in the vtable-buffer.  Both of these, I think, are satisfied=
 via with-current-buffer and we avoid the warning.  So,
>  perhaps, we should bite the bullet and swallow the extra indentation in =
vtable-insert-object and use the more robust and simpler
>  w-c-b.
>
> I can get a revised patch out quickly.  Can we agree on using with-curren=
t-buffer and suffer the few extra indented diff lines?

Yes, okay, I agree it's fine.  I don't think you need to revise anything
there, your most recent patch is fine.  (Except for the other issue I
just emailed about)




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 15 Dec 2025 21:59:49 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Dec 15 16:59:49 2025
Received: from localhost ([127.0.0.1]:44945 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vVGbc-0002Ne-Mm
	for submit <at> debbugs.gnu.org; Mon, 15 Dec 2025 16:59:49 -0500
Received: from mxout5.mail.janestreet.com ([64.215.233.18]:58173)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <sbaugh@HIDDEN>)
 id 1vVGba-0002NF-Dx
 for 79982 <at> debbugs.gnu.org; Mon, 15 Dec 2025 16:59:47 -0500
From: Spencer Baugh <sbaugh@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer
 slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
In-Reply-To: <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 (=?utf-8?Q?=22St=C3=A9phane?= Marks"'s message of "Thu, 11 Dec 2025
 16:07:24 -0500")
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
Date: Mon, 15 Dec 2025 16:59:40 -0500
Message-ID: <iery0n3xv77.fsf_-_@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com;
 s=waixah; t=1765835980;
 bh=OV+pvyaFl2cEJGCDY1DQo75qyq7UVTMFlDZD6LgZECw=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date;
 b=pU6UZ05IzzOxD/hzZUTqDeQPkcvnIwaM3wjMwkO3NEzFcEzkrgF5YZP+4iGV91dJQ
 tAMMdufgnbtdLfu0pePK2J0o+U85efd9w98tTeWJF5iXVoSlwz5R3RpBF4NKd1yM+e
 xpPwxgzDDHj1Wj645r36vg6j0JkC0gkYwNV70UCSZHKF4rYXt1k1F4B6Jy1pqew1OW
 F6vFlV5yvf9usxnN5sspqZm4Phr7oa+WWaSx0brMgVcfJ4SKR/4w6Yo3dnukGqExRP
 DGYqInFE3Yv/Cu8xXMB3gREvhBlucCSILgjrmeD6foZpqdqutP6VgMM0y6eDlOuwXG
 Nks93NDMTvsMQ==
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

St=C3=A9phane Marks <shipmints@HIDDEN> writes:
> @@ -398,56 +403,58 @@ vtable-insert-object
>            ;; Otherwise, append the object.
>            (nconc (vtable-objects table) (list object)))))
>      ;; Then adjust the cache and display.
> -    (save-excursion
> -      (vtable-goto-table table)
> -      (let* ((cache (vtable--current-cache))
> -             (inhibit-read-only t)
> -             (keymap (get-text-property (point) 'keymap))
> -             (ellipsis (if (vtable-ellipsis table)
> -                           (propertize (truncate-string-ellipsis)
> -                                       'face (vtable-face table))
> -                         ""))
> -             (ellipsis-width (string-pixel-width ellipsis))
> -             (lines (vtable--cache-lines cache))
> -             (elem (if location  ; This binding mirrors the binding of `=
pos' above.
> -                       (if (integerp location)
> -                           (nth location lines)
> -                         (or (assq location lines)
> -                             (and before (car lines))))
> -                     (if before (car lines))))
> -             (pos (memq elem lines))
> -             (line (cons object (vtable--compute-cached-line table objec=
t))))
> -        (if (or before
> -                (and pos (integerp location)))
> -            ;; Add the new object before:.
> -            (let ((old-line (car pos)))
> -              (setcar pos line)
> -              (setcdr pos (cons old-line (cdr pos)))
> -              (unless (vtable-goto-object (car elem))
> -                (vtable-beginning-of-table)))
> -          ;; Otherwise, add the object after.
> -          (if pos
> -              ;; Splice the object into the list.
> -              (progn
> -                (setcdr pos (cons line (cdr pos)))
> -                (if (vtable-goto-object location)
> -                    (forward-line 1)  ; Insert *after*.
> -                  (vtable-end-of-table)))
> -            ;; Otherwise, append the object.
> -            (setcar cache (nconc lines (list line)))
> -            (vtable-end-of-table)))
> -        (let ((start (point)))
> -          ;; FIXME: We have to adjust colors in lines below this if we
> -          ;; have :row-colors.
> -          (vtable--insert-line table line 0
> -                               (vtable--cache-widths cache) (vtable--spa=
cer table)
> -                               ellipsis ellipsis-width)
> -          (add-text-properties start (point) (list 'keymap keymap
> -                                                   'vtable table
> -                                                   'vtable-cache cache)))
> -        ;; We may have inserted a non-numerical value into a previously
> -        ;; all-numerical table, so recompute.
> -        (vtable--recompute-numerical table (cdr line))))))
> +    (let* ((cache (vtable--current-cache table))
> +           (inhibit-read-only t)
> +           (inhibit-modification-hooks t)
> +           (lines (vtable--cache-lines cache))
> +           (elem (if location  ; This binding mirrors the binding of `po=
s' above.
> +                     (if (integerp location)
> +                         (nth location lines)
> +                       (or (assq location lines)
> +                           (and before (car lines))))
> +                   (if before (car lines))))
> +           (pos (memq elem lines))
> +           (line (cons object (vtable--compute-cached-line table object)=
)))
> +      (with-current-buffer (vtable-buffer table)
> +        (save-excursion
> +          (vtable-goto-table table)
> +          (if (or before
> +                  (and pos (integerp location)))
> +              ;; Add the new object before:.
> +              (let ((old-line (car pos)))
> +                (setcar pos line)
> +                (setcdr pos (cons old-line (cdr pos)))
> +                (unless (vtable-goto-object (car elem))
> +                  (vtable-beginning-of-table)))
> +            ;; Otherwise, add the object after.
> +            (if pos
> +                ;; Splice the object into the list.
> +                (progn
> +                  (setcdr pos (cons line (cdr pos)))
> +                  (if (vtable-goto-object location)
> +                      (forward-line 1)  ; Insert *after*.
> +                    (vtable-end-of-table)))
> +              ;; Otherwise, append the object.
> +              (setcar cache (nconc lines (list line)))
> +              (vtable-end-of-table)))
> +          (let* ((start (point))
> +                 (ellipsis (if (vtable-ellipsis table)
> +                               (propertize (truncate-string-ellipsis)
> +                                           'face (vtable-face table))
> +                             ""))
> +                 (ellipsis-width (string-pixel-width ellipsis (current-b=
uffer)))
> +                 (keymap (get-text-property (point) 'keymap)))

The inhibit-read-only and inhibit-modification-hooks bindings should be
here, inside the with-current-buffer, not in the outer let-binding.  The
bindings are ineffective when done in this order if there are
buffer-local bindings for inhibit-read-only or
inhibit-modification-hooks.  It might be nice to just have a single test
checking that things work if there are such buffer-local bindings.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 15 Dec 2025 21:22:33 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Dec 15 16:22:33 2025
Received: from localhost ([127.0.0.1]:44624 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vVG1Y-0000Ij-B9
	for submit <at> debbugs.gnu.org; Mon, 15 Dec 2025 16:22:33 -0500
Received: from mail-vk1-xa2c.google.com ([2607:f8b0:4864:20::a2c]:48150)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vVG1U-0000HF-TR
 for 79982 <at> debbugs.gnu.org; Mon, 15 Dec 2025 16:22:30 -0500
Received: by mail-vk1-xa2c.google.com with SMTP id
 71dfb90a1353d-559a4d6b511so601782e0c.0
 for <79982 <at> debbugs.gnu.org>; Mon, 15 Dec 2025 13:22:28 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765833743; x=1766438543; darn=debbugs.gnu.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=LqHZtTgQCoF3WyiMjTlhA3ftMQVSNB2tbbG5fWFBJAI=;
 b=aNe9iiP2n+0vBkauFxCLXVof+qr/Ot61YqZCOArzRN/1EQ3ro5FaMlJdJTyLYHe7um
 0VqULkZ4y1/SkAlEAV6VowluNNmzr93SldwJQmKoc4PGibhzpCAxXY6GSB8Z3wpDLirb
 NjTgej2ZuGdjBhRngzlQx/cL+jRxfXNotoIL1EY/RO2Zsz66tDzTYGSNo188Bqu7+IXb
 W9Nc1Yf+t65pA2SEm4z8c8kjKJwLH1KmiYEkV7cN9SmywyE2+r2bJJybyXYfTQGFsYoh
 Vn3COSNP++2giwSfUc0ylbhn3MSYzzWWpPG85NpqMsV26+P0wB2CE7fnFoPSn+xo9eW+
 GgPQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765833743; x=1766438543;
 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=LqHZtTgQCoF3WyiMjTlhA3ftMQVSNB2tbbG5fWFBJAI=;
 b=qb+KjGYs6zVD1ZSZtg7kM4rERpU0rQP9I3jmPxDSL9YNdlEcbWVXbBX55oZnUJtCKN
 yfnhu2krddSZeBa4ugCY+GWJUMrSh8CgmX3D/qMcR1UZ35SuowEqInAFrkr5pZ3OuVuD
 ngg62Am7YbdcdNpOkw7kzXYbxjtIsy/Z78tV3XXVPKCKjsmE75sa/vUgpQOyOYA1mQwB
 uIiJz0O5am14KA9+SX2gyuMrXC+6CaH/V2MYkuUN0FiPKhIPTnIo8AczEVfvlAZbQ8+i
 Nzbs/Q9lLEwQFBU1buV8klstqtu/w7pViTgqFZiHnK3qK0TSQHJ8F1WImlEd2aZixJ/w
 l5SA==
X-Forwarded-Encrypted: i=1;
 AJvYcCWRvTDuvepBTc64PQhndyefvDBKBztXhnm6t2/VCOCewLQbXTzi2ZZTZNgDKECzEV8J4Jn3/A==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yz+dhM5xG6ggr//BkVOGzCB/h7y8yGWOt8br8CHBUEDK5ecOv+b
 yuaOVx9tYosMuOtJfbjQuFEvdwtvQMeP6SeDGDJKDwZuAfnxRy4IO5wS7ykqfh1GpwkBBSIKDfk
 DiwkYa/D4cCsMMgRGMV+kBgJdHqcN4yM=
X-Gm-Gg: AY/fxX4Qqxbf7A4BAJkBbctU40DGttPBmM93VWN3Ar0ELu4G+I8Tlp4+4Bq97zJyaX+
 U8/yBzIuR5oDITmqZUwrnYsLVkLw7GgGkRVV7+L+bfgGxo4kJnbGmjjUsh/J+97cDn3n9lV7E2A
 MQk0tO0gZVm/VDOMnjZ789PJ9Qhd2squkknQ3d0GkOOKp/orW6uIuieWefYtWzlVXwlmz8lsx1f
 jVtioj+hTiE/IxdCA3ZajWLrBFRky4/iFkRgA7hYRHMbTpyR17ZzBbo2InyoqGttBFjSes=
X-Google-Smtp-Source: AGHT+IFtbDyKL3P7WeG6Xlnx+PT4j53YIfhcYsyILHAB/uulnZ1cCwmGmqyj4+RU/rZYYkocqgGU9E2U2Sb2sELoBWw=
X-Received: by 2002:a05:6122:6586:b0:54a:1e96:e958 with SMTP id
 71dfb90a1353d-55fed465536mr3480840e0c.0.1765833742865; Mon, 15 Dec 2025
 13:22:22 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <ierzf7ndebe.fsf_-_@HIDDEN>
 <CAN+1HbrMnL=PJt0d-ePEd5y15zDWVZQK0wJYEi5+b+wY3VK4DQ@HIDDEN>
 <CAN+1HbqXgFw0eh_asmGkNuJ9Lv-vfm10SELQs6U9M2U3p=QUog@HIDDEN>
 <iertsxvd878.fsf@HIDDEN>
 <CAN+1HbpOOT9RXTQeGW8je=uz0aV=19oYWwhu3Dj=GGkFmOdkgw@HIDDEN>
In-Reply-To: <CAN+1HbpOOT9RXTQeGW8je=uz0aV=19oYWwhu3Dj=GGkFmOdkgw@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Mon, 15 Dec 2025 16:22:08 -0500
X-Gm-Features: AQt7F2qMX0h-38bvRgaUrwyqC5_xK8TIdCW04qWPg5DxOzh63vzIhXB1dQ6XWu8
Message-ID: <CAN+1HbrqF3OqdZQxgWWWmOjTd4UW4Vu64X5mS28M2N50TgzCgQ@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot,
 [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/alternative; boundary="000000000000f9d96f0646043442"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--000000000000f9d96f0646043442
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, Dec 12, 2025 at 10:48=E2=80=AFAM St=C3=A9phane Marks <shipmints@gma=
il.com> wrote:

> On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh <sbaugh@janestreet=
.com>
> wrote:
>
>> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>>
>> > On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks <shipmints=
@gmail.com>
>> wrote:
>> >
>> >  On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh <sbaugh@janestr=
eet.com>
>> wrote:
>> >
>> >  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>> >  > --- a/lisp/emacs-lisp/vtable.el
>> >  > +++ b/lisp/emacs-lisp/vtable.el
>> >  > @@ -398,56 +403,58 @@ vtable-insert-object
>> >  ...
>> >  > +      (with-current-buffer (vtable-buffer table)
>> >  > +        (save-excursion
>> >
>> >  So in the end I think the only way to keep the diff to
>> vtable-insert-object small is
>> >  if you use (set-buffer (vtable-buffer table)) here instead of
>> >  with-current-buffer.  It's a bit less normal, but it at least avoids
>> >  some unnecessary indentation.
>> >
>> >  That is, instead of
>> >  (with-current-buffer (vtable-buffer table)
>> >    (save-excursion
>> >      ...))
>> >
>> >  do
>> >
>> >  (save-excursion
>> >    (set-buffer (vtable-buffer table))
>> >    ...)
>> >
>> >  (save-excursion saves and restores the current buffer)
>> >
>> >  Thanks for making all these changes.  I think after that we should be
>> >  good to go.
>> >
>> >  While I appreciate the desire for tiny diffs, I prefer that the
>> stanzas used in update insert remove functions remain consistent
>> >  and we avoid a special comment explaining why insert is special sayin=
g
>> this was just for indentation.  Hrumph.
>> >
>> > The alternative would be to make them all save-excursion, set-buffer,
>> if you think that's worthy.
>>
>> IMO that's worth doing.  It also saves indentation, so it's actually
>> somewhat useful in all the places we're currently adding a
>> with-current-buffer, even if it doesn't avoid a big reindent diff.
>>
>
> I forgot about the compiler warning
>
>   emacs-lisp/vtable.el:376:10: Warning: Use =E2=80=98with-current-buffer=
=E2=80=99 rather
> than save-excursion+set-buffer
>
> We may also need save-excursion twice, once for what is the ambient
> current buffer, and the second to ensure that point doesn't move around i=
n
> the vtable-buffer.  Both of these, I think, are satisfied via
> with-current-buffer and we avoid the warning.  So, perhaps, we should bit=
e
> the bullet and swallow the extra indentation in vtable-insert-object and
> use the more robust and simpler w-c-b.
>

I can get a revised patch out quickly.  Can we agree on using
with-current-buffer and suffer the few extra indented diff lines?

--000000000000f9d96f0646043442
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Fri, Dec 12, 2025 at 10:48=E2=80=AFAM St=C3=A9phane Marks &lt;<a href=3D=
"mailto:shipmints@HIDDEN">shipmints@HIDDEN</a>&gt; wrote:</span></div=
></div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rg=
b(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div dir=3D"ltr"><div sty=
le=3D"font-family:monospace"><span style=3D"font-family:Arial,Helvetica,san=
s-serif">On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh &lt;<a href=
=3D"mailto:sbaugh@HIDDEN" target=3D"_blank">sbaugh@HIDDEN</=
a>&gt; wrote:</span></div></div><div class=3D"gmail_quote"><blockquote clas=
s=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid r=
gb(204,204,204);padding-left:1ex">St=C3=A9phane Marks &lt;<a href=3D"mailto=
:shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:=
<br>
<br>
&gt; On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks &lt;<a hre=
f=3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&=
gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh &lt;<a hre=
f=3D"mailto:sbaugh@HIDDEN" target=3D"_blank">sbaugh@HIDDEN<=
/a>&gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@HIDDEN" t=
arget=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
&gt;=C2=A0 &gt; --- a/lisp/emacs-lisp/vtable.el<br>
&gt;=C2=A0 &gt; +++ b/lisp/emacs-lisp/vtable.el<br>
&gt;=C2=A0 &gt; @@ -398,56 +403,58 @@ vtable-insert-object<br>
&gt;=C2=A0 ...<br>
&gt;=C2=A0 &gt; +=C2=A0 =C2=A0 =C2=A0 (with-current-buffer (vtable-buffer t=
able)<br>
&gt;=C2=A0 &gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-excursion<br>
&gt;<br>
&gt;=C2=A0 So in the end I think the only way to keep the diff to vtable-in=
sert-object small is<br>
&gt;=C2=A0 if you use (set-buffer (vtable-buffer table)) here instead of<br=
>
&gt;=C2=A0 with-current-buffer.=C2=A0 It&#39;s a bit less normal, but it at=
 least avoids<br>
&gt;=C2=A0 some unnecessary indentation.<br>
&gt;<br>
&gt;=C2=A0 That is, instead of<br>
&gt;=C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt;=C2=A0 =C2=A0 (save-excursion<br>
&gt;=C2=A0 =C2=A0 =C2=A0 ...))<br>
&gt;<br>
&gt;=C2=A0 do<br>
&gt;<br>
&gt;=C2=A0 (save-excursion<br>
&gt;=C2=A0 =C2=A0 (set-buffer (vtable-buffer table))<br>
&gt;=C2=A0 =C2=A0 ...)<br>
&gt;<br>
&gt;=C2=A0 (save-excursion saves and restores the current buffer)<br>
&gt;<br>
&gt;=C2=A0 Thanks for making all these changes.=C2=A0 I think after that we=
 should be<br>
&gt;=C2=A0 good to go.<br>
&gt;<br>
&gt;=C2=A0 While I appreciate the desire for tiny diffs, I prefer that the =
stanzas used in update insert remove functions remain consistent<br>
&gt;=C2=A0 and we avoid a special comment explaining why insert is special =
saying this was just for indentation.=C2=A0 Hrumph.<br>
&gt;<br>
&gt; The alternative would be to make them all save-excursion, set-buffer, =
if you think that&#39;s worthy.<br>
<br>
IMO that&#39;s worth doing.=C2=A0 It also saves indentation, so it&#39;s ac=
tually<br>
somewhat useful in all the places we&#39;re currently adding a<br>
with-current-buffer, even if it doesn&#39;t avoid a big reindent diff.<br><=
/blockquote><div><br></div><div><font face=3D"monospace">I forgot about the=
 compiler warning</font></div><div><font face=3D"monospace"><br></font></di=
v><div><font face=3D"monospace">=C2=A0=C2=A0emacs-lisp/vtable.el:376:10: Wa=
rning: Use =E2=80=98with-current-buffer=E2=80=99 rather than save-excursion=
+set-buffer</font></div><font face=3D"monospace"><br></font></div><div clas=
s=3D"gmail_quote"><div><font face=3D"monospace">We may also need save-excur=
sion twice, once for what is the ambient current buffer, and the second to =
ensure that point doesn&#39;t move around in the vtable-buffer.=C2=A0 Both =
of these, I think, are satisfied via with-current-buffer and we avoid the w=
arning.=C2=A0 So, perhaps, we should bite the bullet and swallow the extra =
indentation in vtable-insert-object and use the more robust and simpler w-c=
-b.</font></div></div></div></blockquote><div><br></div><div class=3D"gmail=
_default" style=3D"font-family:monospace">I can get a revised patch out qui=
ckly.=C2=A0 Can we agree on using with-current-buffer and suffer the few ex=
tra indented diff lines?</div></div></div>

--000000000000f9d96f0646043442--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 12 Dec 2025 15:48:26 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Dec 12 10:48:26 2025
Received: from localhost ([127.0.0.1]:58153 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vU5Na-0004JU-7H
	for submit <at> debbugs.gnu.org; Fri, 12 Dec 2025 10:48:26 -0500
Received: from mail-vk1-xa2c.google.com ([2607:f8b0:4864:20::a2c]:42090)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vU5NX-0004J6-TM
 for 79982 <at> debbugs.gnu.org; Fri, 12 Dec 2025 10:48:24 -0500
Received: by mail-vk1-xa2c.google.com with SMTP id
 71dfb90a1353d-55b219b2242so646304e0c.0
 for <79982 <at> debbugs.gnu.org>; Fri, 12 Dec 2025 07:48:23 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765554498; x=1766159298; darn=debbugs.gnu.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=y6NH860imTXchbhiHbpjXLlTfMPnD8DV0pXdK/aJDfc=;
 b=m10Q/WK1eNIQ9MkpqIapruycwv1euAZEqhEnGv8MZAgpzhvEGSLgTL7rM4+2qmsvea
 kAVAn+FwXNCcej0d+7KfHLtHx0h/983nzpd84UVkl7x9YbZ2f7jWQwwwQZv1gGI+K2oK
 FjxDdj8JKJFZ2XJ0g4G4UhcsZsL8T6RutJme5t6iaceV86trk9VFqpW4+ye9o2zaUqFV
 jD/qLqhJBzBHo4j8PVI9fdDkgtQN8Hv+rZPr2R1oCefKdeyvrrep+Gs+ce2fIOFG7S6V
 +kpQ6i2PyrNtQcHC/STr7BCoVK9RDLQulY2ZgLdu4BZWILa1yJltoK+2dOWKTIm74aOz
 N9hw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765554498; x=1766159298;
 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=y6NH860imTXchbhiHbpjXLlTfMPnD8DV0pXdK/aJDfc=;
 b=wxyTwWvOYB+hMjDhiRSUoSfJynchGqrr1iag6r/z30d+Ai3hM/xTz7niOHF9e/KF0A
 UTxe86rWxydh5ULIy0gYYxcwA852M7CiKtBhS/p6g0A+VCH5kX+VoNms6JINSPZWRiOq
 Pa9uM8d9P5G0NJAUqg9xKayUOQmHtPRQkbejzY6PFIkazeMy5VFVF0FraTEbLPGh9/se
 rL823RfCsXC9fzruGtcdYMlWN1+dZtxw4nWjaObKdEnz2vzTOwO2WgAT1szYfHrq0oyp
 dFIIWBC6VHSv+KBBpwWreMab3g2YgBH69Z4rlNxsfA9Z2VAyKE7voDgzvRRDkTnnc6Pv
 Eg3A==
X-Forwarded-Encrypted: i=1;
 AJvYcCWa/KtffuHYVnVn7zcSTtf+PWOJkvmUY370q1DG/FbfQPUV7gUdsaVBOur5hId1o3ZMXYu2ag==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YwjZZ25k96wia9fzeY40VTq/bgN32aPm3XH8GfeSwA6XRmH6uh6
 IbJWBD6un33FgOjb63MDDm8iWOcBKJd41bUN5F4VzZZTa7RaUQnF/a4mswD3x4u1EryfRjrF/KB
 UgFd3HtrupQeJHyFgdlowlcA1pdaAas8=
X-Gm-Gg: AY/fxX7jmiJ739bFy5w3d9Hsn3z8pRnqFvpOp3RyMmjbANBZMXEWTQtC4WMLD9HU++r
 YUKmjiabQY9IdoRvKBKk6O2Us6zi89DawBEQK8ft8prQD8GrDCM2TgnI1Hw/cIlaGKmg6MTzgVl
 3uy5KspUMmYXLLx0H1CI6l+udPZ0pm4ZMlgr25ZRU6BrMpgBroykGc2CkddvN0SlDkKiSKWmhiV
 Ftp6MzPF+2cdanaaCRHbYAcmuQAiwIBj9UaE2PVUA5/lNuz0n3kR48NqV+vnUnfnWhpJes=
X-Google-Smtp-Source: AGHT+IH8jKIk+ZPc4YOE4HDHrHwWLweslR/rZIds4IlMI3CIOH0cjmLGIFdj0fiBfLAmT4Ya44LCPPhBl3iMv1KhsCg=
X-Received: by 2002:a05:6122:4f86:b0:559:6b7f:b0f4 with SMTP id
 71dfb90a1353d-55fecbc7e3cmr934815e0c.5.1765554498115; Fri, 12 Dec 2025
 07:48:18 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <ierzf7ndebe.fsf_-_@HIDDEN>
 <CAN+1HbrMnL=PJt0d-ePEd5y15zDWVZQK0wJYEi5+b+wY3VK4DQ@HIDDEN>
 <CAN+1HbqXgFw0eh_asmGkNuJ9Lv-vfm10SELQs6U9M2U3p=QUog@HIDDEN>
 <iertsxvd878.fsf@HIDDEN>
In-Reply-To: <iertsxvd878.fsf@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Fri, 12 Dec 2025 10:48:06 -0500
X-Gm-Features: AQt7F2p3FYLQaPqzX58pN0TvNxNKzu1PcyaYDySeDQUcMz3K3DklE-mgHOFNqKw
Message-ID: <CAN+1HbpOOT9RXTQeGW8je=uz0aV=19oYWwhu3Dj=GGkFmOdkgw@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot,
 [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/alternative; boundary="000000000000b11c490645c33064"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--000000000000b11c490645c33064
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh <sbaugh@HIDDEN=
om>
wrote:

> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>
> > On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks <shipmints@=
gmail.com>
> wrote:
> >
> >  On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh <sbaugh@janestre=
et.com>
> wrote:
> >
> >  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
> >  > --- a/lisp/emacs-lisp/vtable.el
> >  > +++ b/lisp/emacs-lisp/vtable.el
> >  > @@ -398,56 +403,58 @@ vtable-insert-object
> >  ...
> >  > +      (with-current-buffer (vtable-buffer table)
> >  > +        (save-excursion
> >
> >  So in the end I think the only way to keep the diff to
> vtable-insert-object small is
> >  if you use (set-buffer (vtable-buffer table)) here instead of
> >  with-current-buffer.  It's a bit less normal, but it at least avoids
> >  some unnecessary indentation.
> >
> >  That is, instead of
> >  (with-current-buffer (vtable-buffer table)
> >    (save-excursion
> >      ...))
> >
> >  do
> >
> >  (save-excursion
> >    (set-buffer (vtable-buffer table))
> >    ...)
> >
> >  (save-excursion saves and restores the current buffer)
> >
> >  Thanks for making all these changes.  I think after that we should be
> >  good to go.
> >
> >  While I appreciate the desire for tiny diffs, I prefer that the stanza=
s
> used in update insert remove functions remain consistent
> >  and we avoid a special comment explaining why insert is special saying
> this was just for indentation.  Hrumph.
> >
> > The alternative would be to make them all save-excursion, set-buffer, i=
f
> you think that's worthy.
>
> IMO that's worth doing.  It also saves indentation, so it's actually
> somewhat useful in all the places we're currently adding a
> with-current-buffer, even if it doesn't avoid a big reindent diff.
>

I forgot about the compiler warning

  emacs-lisp/vtable.el:376:10: Warning: Use =E2=80=98with-current-buffer=E2=
=80=99 rather
than save-excursion+set-buffer

We may also need save-excursion twice, once for what is the ambient current
buffer, and the second to ensure that point doesn't move around in the
vtable-buffer.  Both of these, I think, are satisfied via
with-current-buffer and we avoid the warning.  So, perhaps, we should bite
the bullet and swallow the extra indentation in vtable-insert-object and
use the more robust and simpler w-c-b.

--000000000000b11c490645c33064
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Fri, Dec 12, 2025 at 10:35=E2=80=AFAM Spencer Baugh &lt;<a href=3D"mailt=
o:sbaugh@HIDDEN">sbaugh@HIDDEN</a>&gt; wrote:</span></div><=
/div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=3D"=
gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(20=
4,204,204);padding-left:1ex">St=C3=A9phane Marks &lt;<a href=3D"mailto:ship=
mints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
<br>
&gt; On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks &lt;<a hre=
f=3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&=
gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh &lt;<a hre=
f=3D"mailto:sbaugh@HIDDEN" target=3D"_blank">sbaugh@HIDDEN<=
/a>&gt; wrote:<br>
&gt;<br>
&gt;=C2=A0 St=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@HIDDEN" t=
arget=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
&gt;=C2=A0 &gt; --- a/lisp/emacs-lisp/vtable.el<br>
&gt;=C2=A0 &gt; +++ b/lisp/emacs-lisp/vtable.el<br>
&gt;=C2=A0 &gt; @@ -398,56 +403,58 @@ vtable-insert-object<br>
&gt;=C2=A0 ...<br>
&gt;=C2=A0 &gt; +=C2=A0 =C2=A0 =C2=A0 (with-current-buffer (vtable-buffer t=
able)<br>
&gt;=C2=A0 &gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-excursion<br>
&gt;<br>
&gt;=C2=A0 So in the end I think the only way to keep the diff to vtable-in=
sert-object small is<br>
&gt;=C2=A0 if you use (set-buffer (vtable-buffer table)) here instead of<br=
>
&gt;=C2=A0 with-current-buffer.=C2=A0 It&#39;s a bit less normal, but it at=
 least avoids<br>
&gt;=C2=A0 some unnecessary indentation.<br>
&gt;<br>
&gt;=C2=A0 That is, instead of<br>
&gt;=C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt;=C2=A0 =C2=A0 (save-excursion<br>
&gt;=C2=A0 =C2=A0 =C2=A0 ...))<br>
&gt;<br>
&gt;=C2=A0 do<br>
&gt;<br>
&gt;=C2=A0 (save-excursion<br>
&gt;=C2=A0 =C2=A0 (set-buffer (vtable-buffer table))<br>
&gt;=C2=A0 =C2=A0 ...)<br>
&gt;<br>
&gt;=C2=A0 (save-excursion saves and restores the current buffer)<br>
&gt;<br>
&gt;=C2=A0 Thanks for making all these changes.=C2=A0 I think after that we=
 should be<br>
&gt;=C2=A0 good to go.<br>
&gt;<br>
&gt;=C2=A0 While I appreciate the desire for tiny diffs, I prefer that the =
stanzas used in update insert remove functions remain consistent<br>
&gt;=C2=A0 and we avoid a special comment explaining why insert is special =
saying this was just for indentation.=C2=A0 Hrumph.<br>
&gt;<br>
&gt; The alternative would be to make them all save-excursion, set-buffer, =
if you think that&#39;s worthy.<br>
<br>
IMO that&#39;s worth doing.=C2=A0 It also saves indentation, so it&#39;s ac=
tually<br>
somewhat useful in all the places we&#39;re currently adding a<br>
with-current-buffer, even if it doesn&#39;t avoid a big reindent diff.<br><=
/blockquote><div><br></div><div class=3D"gmail_default" style=3D""><font fa=
ce=3D"monospace">I forgot about the compiler warning</font></div><div class=
=3D"gmail_default" style=3D""><font face=3D"monospace"><br></font></div><di=
v class=3D"gmail_default" style=3D""><font face=3D"monospace">=C2=A0=C2=A0e=
macs-lisp/vtable.el:376:10: Warning: Use =E2=80=98with-current-buffer=E2=80=
=99 rather than save-excursion+set-buffer</font></div><font face=3D"monospa=
ce"><br></font></div><div class=3D"gmail_quote gmail_quote_container"><div =
class=3D"gmail_default" style=3D""><font face=3D"monospace">We may also nee=
d save-excursion twice, once for what is the ambient current buffer, and th=
e second to ensure that point doesn&#39;t move around in the vtable-buffer.=
=C2=A0 Both of these, I think, are satisfied via with-current-buffer and we=
 avoid the warning.=C2=A0 So, perhaps, we should bite the bullet and swallo=
w the extra indentation in vtable-insert-object and use the more robust and=
 simpler w-c-b.</font></div><br></div></div>

--000000000000b11c490645c33064--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 12 Dec 2025 15:35:32 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Dec 12 10:35:31 2025
Received: from localhost ([127.0.0.1]:58069 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vU5B5-0003Y5-Gg
	for submit <at> debbugs.gnu.org; Fri, 12 Dec 2025 10:35:31 -0500
Received: from mxout5.mail.janestreet.com ([64.215.233.18]:40487)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <sbaugh@HIDDEN>)
 id 1vU5B3-0003Va-BM
 for 79982 <at> debbugs.gnu.org; Fri, 12 Dec 2025 10:35:29 -0500
From: Spencer Baugh <sbaugh@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer
 slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
In-Reply-To: <CAN+1HbqXgFw0eh_asmGkNuJ9Lv-vfm10SELQs6U9M2U3p=QUog@HIDDEN>
 (=?utf-8?Q?=22St=C3=A9phane?= Marks"'s message of "Fri, 12 Dec 2025
 09:34:35 -0500")
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <ierzf7ndebe.fsf_-_@HIDDEN>
 <CAN+1HbrMnL=PJt0d-ePEd5y15zDWVZQK0wJYEi5+b+wY3VK4DQ@HIDDEN>
 <CAN+1HbqXgFw0eh_asmGkNuJ9Lv-vfm10SELQs6U9M2U3p=QUog@HIDDEN>
Date: Fri, 12 Dec 2025 10:35:23 -0500
Message-ID: <iertsxvd878.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com;
 s=waixah; t=1765553723;
 bh=CUoTKLuBeJQ/tIdgBAHksGfEsicxf/kqA5zcM2XDLAk=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date;
 b=hONtOuYPWs5BVbSflJdG/2Al8gaMdyhHn75UPMJCc9vAyL1I15RPvI42PxiSWemxA
 DVvqAW0iDCK+pKei+e7cwRegG2piGC7E1yeKqDDTT6vpNlUfjtzsMuFInH30mfrLbg
 RuZb03fKzW9ONkPOzwGp05qb91fUHYrRrrdn9fShzKFQTtEXcCs6SeKe7fCDWgHNns
 7icBsl8MPlnCv3eimIo9F8n4cIki8jS/F1gSaU8G+WkSjkDdQRR5VLlSihGiFoJU1g
 JjenYhH4mJf7KWqxu6uOgKWHRuQ88hOh6atBw9X+54KZ/BrXgAkguV7ToKtxdqVWpB
 LEVpNSM91jaOQ==
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

St=C3=A9phane Marks <shipmints@HIDDEN> writes:

> On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks <shipmints@gm=
ail.com> wrote:
>
>  On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh <sbaugh@janestreet=
.com> wrote:
>
>  St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>  > --- a/lisp/emacs-lisp/vtable.el
>  > +++ b/lisp/emacs-lisp/vtable.el
>  > @@ -398,56 +403,58 @@ vtable-insert-object
>  ...
>  > +      (with-current-buffer (vtable-buffer table)
>  > +        (save-excursion
>
>  So in the end I think the only way to keep the diff to vtable-insert-obj=
ect small is
>  if you use (set-buffer (vtable-buffer table)) here instead of
>  with-current-buffer.  It's a bit less normal, but it at least avoids
>  some unnecessary indentation.
>
>  That is, instead of
>  (with-current-buffer (vtable-buffer table)
>    (save-excursion
>      ...))
>
>  do
>
>  (save-excursion
>    (set-buffer (vtable-buffer table))
>    ...)
>
>  (save-excursion saves and restores the current buffer)
>
>  Thanks for making all these changes.  I think after that we should be
>  good to go.
>
>  While I appreciate the desire for tiny diffs, I prefer that the stanzas =
used in update insert remove functions remain consistent
>  and we avoid a special comment explaining why insert is special saying t=
his was just for indentation.  Hrumph.
>
> The alternative would be to make them all save-excursion, set-buffer, if =
you think that's worthy.

IMO that's worth doing.  It also saves indentation, so it's actually
somewhat useful in all the places we're currently adding a
with-current-buffer, even if it doesn't avoid a big reindent diff.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 12 Dec 2025 14:34:59 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Dec 12 09:34:59 2025
Received: from localhost ([127.0.0.1]:56918 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vU4EU-0007I6-HJ
	for submit <at> debbugs.gnu.org; Fri, 12 Dec 2025 09:34:59 -0500
Received: from mail-ua1-x934.google.com ([2607:f8b0:4864:20::934]:52669)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vU4EQ-0007Ha-6s
 for 79982 <at> debbugs.gnu.org; Fri, 12 Dec 2025 09:34:54 -0500
Received: by mail-ua1-x934.google.com with SMTP id
 a1e0cc1a2514c-93f56a97064so376663241.1
 for <79982 <at> debbugs.gnu.org>; Fri, 12 Dec 2025 06:34:54 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765550088; x=1766154888; darn=debbugs.gnu.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=RF55PXNgYoRcaeEt7KYGfUwopuCI5nQIUwCRIKav+Yk=;
 b=kd65f43mg/vTW831x94C9G2PPEfS75AaMJCO+ZnI8rBJzxyjKInP4EqXzF5Ru98BXA
 AH9tDq85R+3KBi/ZRb5FRyr7OZIhrm/j3QRC0Lrtkqo1W4lJ3GzcFtMt3sV3UPo33zqm
 ic4MLTm8IWj0/TGMcFnIIdprHDIx/u8gTwQBt3ZprK0ulAhzVKqcTm6fHm5egjzh9iNB
 yTvMS85CLq912czSpwC6UdxtQrJL7GrwsNfMT5BPKA6bt5Q1qhdfk3FJzRmZplnX+WeD
 ez7k3VQzW4JLLWlv1iUwfkC7flscdr2aqUK9/5qS6tRGY2rF8zptiNJiuzkF+Pv358Ot
 9eTg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765550088; x=1766154888;
 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=RF55PXNgYoRcaeEt7KYGfUwopuCI5nQIUwCRIKav+Yk=;
 b=sfqrsUQ3Z7ACTeVziUBC7PZvmO5C0I75Sik9x5PR8zcopXESsrvky6KXC++czgyyX6
 hz9T7aul2IYSs4afU/PPkdpgq4wRGrHlFMZ9BNoACsuQKi5ESpq6n9L8gB8YXHE6sXjv
 GGUrF+yXb/gl9DSS5v5s3UK4/Wcn0p8XPagHUi0KSpxUkB7Veygw6qMQGCaGbt91MW6F
 xRo0572482F7TnQiyf7qvuc3quB0YxG0IheQjmFB0WRCzyLqfgrYKhvyFzQwWalxjY5C
 bKCDMYjCxFfaWwolcsKEc+vgdEcasJM9SJIXeSK70A2/0iShZ2AgSOj6jczKqECSY/YP
 tafw==
X-Forwarded-Encrypted: i=1;
 AJvYcCVpvzJLzpGGhWaL8dULQhfwfFycudOdVE0EQJmmipDyl0SRs6eQcoIr601mdjmUYFQet3iNKA==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yz2a31TtWU5UA/e2mQpURAMVXl3khQ/TDcjACqrLYZnF0QQdJFo
 2aTJReeqb+wIRbZTQHctNivbv4J+h5LwX9l1mQ8VVhh7IlFWZGJRdwWezEPUsIziXvMnfYT/Io4
 JSh3VNvBnxw3JynuCzH6Opwrr7ibsnG8=
X-Gm-Gg: AY/fxX6Mb4giKhROMGSlqY0U+kb7YqdihRCYbGB1YEJPGcTbqPAnRn1oWajGlz2DRTF
 YwOw4wL2mGdDGIILXhq9LEFvmd7kEJjihyFnQW90kjyteBdvlfafuqbA0G8+TCmL2GiK5PJni0q
 Y+8TItPgaLdRMKL1Z8s1IVwEsI1LpxIolLNs3HBge/1AJ7mobSyp1PWe4ItQNCJNSI4ljB+3nn+
 KbErElRuQ4Yx1bfg1fotDZ+Ar/u5SyGskqjqcO8qXJolR9MgOWovkSRmaQFDMqndcK5Vb4=
X-Google-Smtp-Source: AGHT+IE5VmxrrUOL0p+di98D8wTepzGh/GbjhVdmRpHMkWsOJ3DB425VCkSlsfT5MbzkJx9tweTdwQ+Sxm1hpu9D12M=
X-Received: by 2002:a05:6102:c8c:b0:5db:f573:a2c with SMTP id
 ada2fe7eead31-5e82768bf77mr556544137.13.1765550088398; Fri, 12 Dec 2025
 06:34:48 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <ierzf7ndebe.fsf_-_@HIDDEN>
 <CAN+1HbrMnL=PJt0d-ePEd5y15zDWVZQK0wJYEi5+b+wY3VK4DQ@HIDDEN>
In-Reply-To: <CAN+1HbrMnL=PJt0d-ePEd5y15zDWVZQK0wJYEi5+b+wY3VK4DQ@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Fri, 12 Dec 2025 09:34:35 -0500
X-Gm-Features: AQt7F2qzRsQmJuSiHacEXWUfXecGxdvo-gCEUpJ--Jn2kVSTIAT83Gfh8zxLc0U
Message-ID: <CAN+1HbqXgFw0eh_asmGkNuJ9Lv-vfm10SELQs6U9M2U3p=QUog@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot,
 [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/alternative; boundary="000000000000da2d040645c229dc"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--000000000000da2d040645c229dc
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks <shipmints@gmai=
l.com> wrote:

> On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh <sbaugh@janestreet.=
com>
> wrote:
>
>> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>> > --- a/lisp/emacs-lisp/vtable.el
>> > +++ b/lisp/emacs-lisp/vtable.el
>> > @@ -398,56 +403,58 @@ vtable-insert-object
>> ...
>> > +      (with-current-buffer (vtable-buffer table)
>> > +        (save-excursion
>>
>> So in the end I think the only way to keep the diff to
>> vtable-insert-object small is
>> if you use (set-buffer (vtable-buffer table)) here instead of
>> with-current-buffer.  It's a bit less normal, but it at least avoids
>> some unnecessary indentation.
>>
>> That is, instead of
>> (with-current-buffer (vtable-buffer table)
>>   (save-excursion
>>     ...))
>>
>> do
>>
>> (save-excursion
>>   (set-buffer (vtable-buffer table))
>>   ...)
>>
>> (save-excursion saves and restores the current buffer)
>>
>> Thanks for making all these changes.  I think after that we should be
>> good to go.
>>
>
> While I appreciate the desire for tiny diffs, I prefer that the stanzas
> used in update insert remove functions remain consistent and we avoid a
> special comment explaining why insert is special saying this was just for
> indentation.  Hrumph.
>

The alternative would be to make them all save-excursion, set-buffer, if
you think that's worthy.

--000000000000da2d040645c229dc
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Fri, Dec 12, 2025 at 9:33=E2=80=AFAM St=C3=A9phane Marks &lt;<a href=3D"=
mailto:shipmints@HIDDEN">shipmints@HIDDEN</a>&gt; wrote:</span></div>=
</div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=3D=
"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(2=
04,204,204);padding-left:1ex"><div dir=3D"ltr"><div dir=3D"ltr"><div style=
=3D"font-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-=
serif">On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh &lt;<a href=3D=
"mailto:sbaugh@HIDDEN" target=3D"_blank">sbaugh@HIDDEN</a>&=
gt; wrote:</span></div></div><div class=3D"gmail_quote"><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rg=
b(204,204,204);padding-left:1ex">St=C3=A9phane Marks &lt;<a href=3D"mailto:=
shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<=
br>
&gt; --- a/lisp/emacs-lisp/vtable.el<br>
&gt; +++ b/lisp/emacs-lisp/vtable.el<br>
&gt; @@ -398,56 +403,58 @@ vtable-insert-object<br><span class=3D"gmail_def=
ault" style=3D"font-family:monospace">...</span><br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-excursion<br>
<br>
So in the end I think the only way to keep the diff to vtable-insert-object=
 small is<br>
if you use (set-buffer (vtable-buffer table)) here instead of<br>
with-current-buffer.=C2=A0 It&#39;s a bit less normal, but it at least avoi=
ds<br>
some unnecessary indentation.<br>
<br>
That is, instead of<br>
(with-current-buffer (vtable-buffer table)<br>
=C2=A0 (save-excursion<br>
=C2=A0 =C2=A0 ...))<br>
<br>
do<br>
<br>
(save-excursion<br>
=C2=A0 (set-buffer (vtable-buffer table))<br>
=C2=A0 ...)<br>
<br>
(save-excursion saves and restores the current buffer)<br>
<br>
Thanks for making all these changes.=C2=A0 I think after that we should be<=
br>
good to go.<br></blockquote><div><br></div><div style=3D"font-family:monosp=
ace">While I appreciate the desire for tiny diffs, I prefer that the stanza=
s used in update insert remove functions remain consistent and we avoid a s=
pecial comment explaining why insert is special saying this was just for in=
dentation.=C2=A0 Hrumph.</div></div></div></blockquote><div><br></div><div =
class=3D"gmail_default" style=3D"font-family:monospace">The alternative wou=
ld be to make them all save-excursion, set-buffer, if you think that&#39;s =
worthy.</div></div></div>

--000000000000da2d040645c229dc--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 12 Dec 2025 14:34:07 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Dec 12 09:34:07 2025
Received: from localhost ([127.0.0.1]:56914 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vU4De-0007FW-FE
	for submit <at> debbugs.gnu.org; Fri, 12 Dec 2025 09:34:07 -0500
Received: from mail-ua1-x92b.google.com ([2607:f8b0:4864:20::92b]:51490)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vU4Db-0007F3-BC
 for 79982 <at> debbugs.gnu.org; Fri, 12 Dec 2025 09:34:04 -0500
Received: by mail-ua1-x92b.google.com with SMTP id
 a1e0cc1a2514c-93f56804894so760051241.3
 for <79982 <at> debbugs.gnu.org>; Fri, 12 Dec 2025 06:34:03 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765550037; x=1766154837; darn=debbugs.gnu.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=mo3ztBsVNhKCQ4E9YhNVuhWO2wIja1bXCUcDnfmTAm0=;
 b=i/PHWLpTdLkpel3sCuJTIuchkDfsTiTHeEM6IPkZmvneWJHcMB4/nEMT95uh7RX7bV
 FP77irJO/CuFNJUDogGPpVy6ZnAvLSgXQQ5ZGgTecdGTNrV5OP95biTmnlnlj5DF5tX/
 vuKNTrFpaf9cIwhuH4Gw1ApLk8EwYd4VeoHNSlg2OTmJAx7eC7YDnsz6UxBXuIJgYh8S
 gIAgkpv5xOua4LeHq6IcW1yejk/PWjJup72x8NsA9ektbW54gyuCdPqt5B/F9fclckif
 ovJ6dhvBSDN0bjKDC4uk+rDCxwITSqyzBTcvs3qRz/2yCzE+wTZfcm4RknwbMBKDy33d
 lZng==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765550037; x=1766154837;
 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=mo3ztBsVNhKCQ4E9YhNVuhWO2wIja1bXCUcDnfmTAm0=;
 b=dMb87s/atN8k8PiGeTWklM/iOVGkSj62S+RL+z+8zzyU3aoHZclEVOeNznuGO6GrXR
 VxGJWwkO31q4XCdWGlDfimbjm3i7e65uerZBulG5YNBoMkka2dOM8Pyxd/W6HYMZ59Mh
 0L7igUGkqZLrqTBsAUzRcUdVOAXnwl9gDLHXXryJWiFO+zsNxKj/y2imUXTyaEfw3IbH
 pn3XudjOOejIymLCxSaWeyHPJNQTZqEmdrRWFaPpoHQqHWFN/GiqTXf8UESO+HELpNMj
 rrc412MOaxJjY2qxuZBg9ea6oHYvcQSu8J+Yv+u6XNtoShLxEXnP6CGjsbf/BGaPoOuk
 3OKw==
X-Forwarded-Encrypted: i=1;
 AJvYcCU9s5F3U1dUXME74UyxxKkZ7CuxMwgkwQdNvDgvWWfim/EdnSGst5/sp3LJBghYQKL0l4bIwA==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YyjiWzSZOB43nnj1W5fEacfEh7ipc9X4ME4O5KBnyN/m/Yi6zt7
 CT7MoLhKKF/E0QcszYAQgwtnTntawe2jqz3Xp504OFw+60xcSV0+/GkhJxjasShrIha1kwT+oQA
 BAJv8O60mliJhigOPmXIVYANsPlLSUXE=
X-Gm-Gg: AY/fxX6GCj6qVfo22xWJ3o91gTiJx2LbXKE/HhUA70jqITJ49ppbxtdXXpzWaL92qo/
 LLFcrv77DWyvanDr4smb94fM2x7ZJ/Bcw+TIng7hcfr90zMnnApJ7qXNc1Nmt7F48SGmm+yYUql
 bi6HuojQ2yiQKWujRLzGiqsu2Tt6Ar5aeFX+qZkngKbIczbzI3GtWgrr+Ru9wl6OEqYy7ucJxQT
 oYT0wnNtz8UvR5iWtELVHJSfBf1HP6vHHjCecb/A3l419SHkaUb9zvao7lb9Bmmtw6GBNc=
X-Google-Smtp-Source: AGHT+IGvdc3aDHzX05G/xVW1EPysQYRKJ9dzkGYK2W00Tm+YCpFx1EfUwBrXGnQKGc7xMN3E4AqWtfgXKsT/Zx3Svbs=
X-Received: by 2002:a05:6102:5a98:b0:5e8:1dcb:4dfd with SMTP id
 ada2fe7eead31-5e827472534mr671809137.5.1765550037448; Fri, 12 Dec 2025
 06:33:57 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <ierzf7ndebe.fsf_-_@HIDDEN>
In-Reply-To: <ierzf7ndebe.fsf_-_@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Fri, 12 Dec 2025 09:33:45 -0500
X-Gm-Features: AQt7F2pBtgbC1JGiOeGS48mhDd2xTj1_6PTyzIevxj3m0yuxq_JjyeyuWR2NhbQ
Message-ID: <CAN+1HbrMnL=PJt0d-ePEd5y15zDWVZQK0wJYEi5+b+wY3VK4DQ@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot,
 [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/alternative; boundary="000000000000d0b9a60645c22673"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--000000000000d0b9a60645c22673
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh <sbaugh@HIDDEN=
m> wrote:

> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
> > --- a/lisp/emacs-lisp/vtable.el
> > +++ b/lisp/emacs-lisp/vtable.el
> > @@ -398,56 +403,58 @@ vtable-insert-object
> ...
> > +      (with-current-buffer (vtable-buffer table)
> > +        (save-excursion
>
> So in the end I think the only way to keep the diff to
> vtable-insert-object small is
> if you use (set-buffer (vtable-buffer table)) here instead of
> with-current-buffer.  It's a bit less normal, but it at least avoids
> some unnecessary indentation.
>
> That is, instead of
> (with-current-buffer (vtable-buffer table)
>   (save-excursion
>     ...))
>
> do
>
> (save-excursion
>   (set-buffer (vtable-buffer table))
>   ...)
>
> (save-excursion saves and restores the current buffer)
>
> Thanks for making all these changes.  I think after that we should be
> good to go.
>

While I appreciate the desire for tiny diffs, I prefer that the stanzas
used in update insert remove functions remain consistent and we avoid a
special comment explaining why insert is special saying this was just for
indentation.  Hrumph.

--000000000000d0b9a60645c22673
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Fri, Dec 12, 2025 at 8:23=E2=80=AFAM Spencer Baugh &lt;<a href=3D"mailto=
:sbaugh@HIDDEN">sbaugh@HIDDEN</a>&gt; wrote:</span></div></=
div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=3D"g=
mail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204=
,204,204);padding-left:1ex">St=C3=A9phane Marks &lt;<a href=3D"mailto:shipm=
ints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
&gt; --- a/lisp/emacs-lisp/vtable.el<br>
&gt; +++ b/lisp/emacs-lisp/vtable.el<br>
&gt; @@ -398,56 +403,58 @@ vtable-insert-object<br><span class=3D"gmail_def=
ault" style=3D"font-family:monospace">...</span><br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-excursion<br>
<br>
So in the end I think the only way to keep the diff to vtable-insert-object=
 small is<br>
if you use (set-buffer (vtable-buffer table)) here instead of<br>
with-current-buffer.=C2=A0 It&#39;s a bit less normal, but it at least avoi=
ds<br>
some unnecessary indentation.<br>
<br>
That is, instead of<br>
(with-current-buffer (vtable-buffer table)<br>
=C2=A0 (save-excursion<br>
=C2=A0 =C2=A0 ...))<br>
<br>
do<br>
<br>
(save-excursion<br>
=C2=A0 (set-buffer (vtable-buffer table))<br>
=C2=A0 ...)<br>
<br>
(save-excursion saves and restores the current buffer)<br>
<br>
Thanks for making all these changes.=C2=A0 I think after that we should be<=
br>
good to go.<br></blockquote><div><br></div><div class=3D"gmail_default" sty=
le=3D"font-family:monospace">While I appreciate the desire for tiny diffs, =
I prefer that the stanzas used in update insert remove functions remain con=
sistent and we avoid a special comment explaining why insert is special say=
ing this was just for indentation.=C2=A0 Hrumph.</div></div></div>

--000000000000d0b9a60645c22673--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 12 Dec 2025 13:26:09 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Dec 12 08:26:09 2025
Received: from localhost ([127.0.0.1]:56301 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vU39s-0002Ww-ED
	for submit <at> debbugs.gnu.org; Fri, 12 Dec 2025 08:26:08 -0500
Received: from mxout5.mail.janestreet.com ([64.215.233.18]:59961)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <sbaugh@HIDDEN>)
 id 1vU39q-0002WH-0W
 for 79982 <at> debbugs.gnu.org; Fri, 12 Dec 2025 08:26:06 -0500
From: Spencer Baugh <sbaugh@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer
 slot, [PATCH] Add vtable buffer slot
In-Reply-To: <CAN+1Hbq8bF6Fz-on6WS8QsKxnN4RxLAgVcWRc9ZNs2fO4V22hQ@HIDDEN>
 (=?utf-8?Q?=22St=C3=A9phane?= Marks"'s message of "Fri, 12 Dec 2025
 06:36:58 -0500")
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <87a4zo6kaq.fsf@HIDDEN>
 <CAN+1Hbq8bF6Fz-on6WS8QsKxnN4RxLAgVcWRc9ZNs2fO4V22hQ@HIDDEN>
Date: Fri, 12 Dec 2025 08:26:00 -0500
Message-ID: <ierwm2rde6v.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com;
 s=waixah; t=1765545960;
 bh=zXhPBRvWic82GWJv7TcqklJXzNU6Z2C/mlrMjkVYiks=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date;
 b=WgLym1Lg04z3POu5xubYKGwNX/jPU0cyd5/sno+Lwe6dNBVFnlmxQx4McSgofLvxf
 YEHIyHDcSdHn/kZxT/gyoZNb1CCGRlQ02qD7G6r0VWM4Y01MAyGrjhbD+idODmwlVP
 +Irp72PYNIspm9Vc3y/KvoRiafNZ1gIirpiiy88l95gQX+mV0xGtZep37XdKEjSqNk
 ADZbAubgSjjKQI87wjbUHhkGwyJN07WWmK3EcjUyMJ70k0RH8qxdpoBDscYLukR4b3
 EDUAPFjokwzxwfLMvDHO0xxFNLLNBl0VwdkFzug4de19ivt67HY6RkAA8AVa5RxuqY
 Yfh71QzFNJlLA==
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

St=C3=A9phane Marks <shipmints@HIDDEN> writes:

> On Fri, Dec 12, 2025 at 5:55=E2=80=AFAM Augusto Stoffel <arstoffel@gmail.=
com> wrote:
>
>  On Thu, 11 Dec 2025 at 16:07, St=C3=A9phane Marks <shipmints@HIDDEN> =
wrote:
>
>  > I put the vtable-set-buffer function back in because I recalled that
>  > Augusto's comint-mime implementation uses a multi-buffer approach to
>  > get a vtable into a comint buffer.  It first inserts into a temp
>  > buffer and then blasts the buffer-string into the comint buffer and it
>  > expects to be able to manipulate that vtable in that comint buffer
>  > despite its foreign origin.  comint-mime would invoke this to reset
>  > the buffer (yes, this is not backward compatible for his use case but
>  > he's the only one I've found and I'm aware of and it's been brought
>  > up).
>
>  I implemented it that way because it "just worked", but it seems
>  perfectly reasonable to declare that a vtable is tied to a buffer,
>  period.  I recommend picking the approach that simplifies the
>  implementation and future uses of vtable.  comint-mime can be changed
>  (in fact, it has to be changed anyway).
>
>  While I'm not fully into the loop regarding this discussion, it seems to
>  me that the vtable's buffer should not part of the public interface and
>  the ability to move a vtable between buffers should not be a supported
>  feature.
>
> I don't mind the safety hatch, though.  Other people might do something c=
lever like you did with the HTML renderer.  I wrote a mild
> admonishment in the docstring.

I agree with Augusto that eventually we probably shouldn't support
changing vtables between buffers.  But, at the moment, removing support
for changing vtables between buffers doesn't simplify the code at all.
So I agree with leaving it in for now and just writing an admonishment
in the docstring, as you did.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 12 Dec 2025 13:23:28 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Dec 12 08:23:28 2025
Received: from localhost ([127.0.0.1]:56292 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vU37H-0002LT-4B
	for submit <at> debbugs.gnu.org; Fri, 12 Dec 2025 08:23:27 -0500
Received: from mxout5.mail.janestreet.com ([64.215.233.18]:48997)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <sbaugh@HIDDEN>)
 id 1vU37D-0002L9-95
 for 79982 <at> debbugs.gnu.org; Fri, 12 Dec 2025 08:23:24 -0500
From: Spencer Baugh <sbaugh@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer
 slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
In-Reply-To: <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 (=?utf-8?Q?=22St=C3=A9phane?= Marks"'s message of "Thu, 11 Dec 2025
 16:07:24 -0500")
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
Date: Fri, 12 Dec 2025 08:23:17 -0500
Message-ID: <ierzf7ndebe.fsf_-_@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com;
 s=waixah; t=1765545797;
 bh=MrVP6UsKXZhhQ680tNKF+FS3xRwUWlWajIznmRzKY78=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date;
 b=sNRJyyBlX0Tvnv2xpL8oeQ3bucKdbJRz2Ujs1mzwuOF00UmBxSsbfKbpWCqxmKaTp
 bHWzYd9DZIvxC4T/DNyB7oTrcCxxGHwkXsDN93QnUuXW6lU0WwiAaVLHI6b7bUbMwM
 savKkXXukAGX7cZhUuCwNIa4vJUlWLrX/GWJloIfPxlpUsmwzPGzDZ4ulG9ujvAc2X
 AiMXoJYGBjv7yXZkxvkpiull+ItWK+Sar/rVsr+ttD/bGbk3gn0KxRoiD3HoxbqMOA
 lL+KvPzuptcBi/7gztg+9euFoHVh7LpLn9h/3/a3/YocCGePnwX4V9MsnQr+7qmB4R
 rx+JbpzevsD0g==
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

St=C3=A9phane Marks <shipmints@HIDDEN> writes:
> --- a/lisp/emacs-lisp/vtable.el
> +++ b/lisp/emacs-lisp/vtable.el
> @@ -398,56 +403,58 @@ vtable-insert-object
>            ;; Otherwise, append the object.
>            (nconc (vtable-objects table) (list object)))))
>      ;; Then adjust the cache and display.
> -    (save-excursion
> -      (vtable-goto-table table)
> -      (let* ((cache (vtable--current-cache))
> -             (inhibit-read-only t)
> -             (keymap (get-text-property (point) 'keymap))
> -             (ellipsis (if (vtable-ellipsis table)
> -                           (propertize (truncate-string-ellipsis)
> -                                       'face (vtable-face table))
> -                         ""))
> -             (ellipsis-width (string-pixel-width ellipsis))
> -             (lines (vtable--cache-lines cache))
> -             (elem (if location  ; This binding mirrors the binding of `=
pos' above.
> -                       (if (integerp location)
> -                           (nth location lines)
> -                         (or (assq location lines)
> -                             (and before (car lines))))
> -                     (if before (car lines))))
> -             (pos (memq elem lines))
> -             (line (cons object (vtable--compute-cached-line table objec=
t))))
> -        (if (or before
> -                (and pos (integerp location)))
> -            ;; Add the new object before:.
> -            (let ((old-line (car pos)))
> -              (setcar pos line)
> -              (setcdr pos (cons old-line (cdr pos)))
> -              (unless (vtable-goto-object (car elem))
> -                (vtable-beginning-of-table)))
> -          ;; Otherwise, add the object after.
> -          (if pos
> -              ;; Splice the object into the list.
> -              (progn
> -                (setcdr pos (cons line (cdr pos)))
> -                (if (vtable-goto-object location)
> -                    (forward-line 1)  ; Insert *after*.
> -                  (vtable-end-of-table)))
> -            ;; Otherwise, append the object.
> -            (setcar cache (nconc lines (list line)))
> -            (vtable-end-of-table)))
> -        (let ((start (point)))
> -          ;; FIXME: We have to adjust colors in lines below this if we
> -          ;; have :row-colors.
> -          (vtable--insert-line table line 0
> -                               (vtable--cache-widths cache) (vtable--spa=
cer table)
> -                               ellipsis ellipsis-width)
> -          (add-text-properties start (point) (list 'keymap keymap
> -                                                   'vtable table
> -                                                   'vtable-cache cache)))
> -        ;; We may have inserted a non-numerical value into a previously
> -        ;; all-numerical table, so recompute.
> -        (vtable--recompute-numerical table (cdr line))))))
> +    (let* ((cache (vtable--current-cache table))
> +           (inhibit-read-only t)
> +           (inhibit-modification-hooks t)
> +           (lines (vtable--cache-lines cache))
> +           (elem (if location  ; This binding mirrors the binding of `po=
s' above.
> +                     (if (integerp location)
> +                         (nth location lines)
> +                       (or (assq location lines)
> +                           (and before (car lines))))
> +                   (if before (car lines))))
> +           (pos (memq elem lines))
> +           (line (cons object (vtable--compute-cached-line table object)=
)))
> +      (with-current-buffer (vtable-buffer table)
> +        (save-excursion

So in the end I think the only way to keep the diff to vtable-insert-object=
 small is
if you use (set-buffer (vtable-buffer table)) here instead of
with-current-buffer.  It's a bit less normal, but it at least avoids
some unnecessary indentation.

That is, instead of
(with-current-buffer (vtable-buffer table)
  (save-excursion
    ...))

do

(save-excursion
  (set-buffer (vtable-buffer table))
  ...)

(save-excursion saves and restores the current buffer)

Thanks for making all these changes.  I think after that we should be
good to go.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 12 Dec 2025 11:37:19 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Dec 12 06:37:19 2025
Received: from localhost ([127.0.0.1]:55478 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vU1SY-0000wk-KQ
	for submit <at> debbugs.gnu.org; Fri, 12 Dec 2025 06:37:19 -0500
Received: from mail-vs1-xe2b.google.com ([2607:f8b0:4864:20::e2b]:61937)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vU1SW-0000wT-0S
 for 79982 <at> debbugs.gnu.org; Fri, 12 Dec 2025 06:37:16 -0500
Received: by mail-vs1-xe2b.google.com with SMTP id
 ada2fe7eead31-5dfccb35b10so729882137.3
 for <79982 <at> debbugs.gnu.org>; Fri, 12 Dec 2025 03:37:15 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765539430; x=1766144230; darn=debbugs.gnu.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=4lWp1z1qm5gimARgCinlQ2lC4285X5e/PriMkm9eQuc=;
 b=SvlCJPoLkF1WwHLgxndBekiWf/3qzqAsdFXCkkdPpJ9qaxQW+5OIdzwo2GUzuTr9sD
 jyeQQtBpwQgGnxdBgJNNBsrpuFHIb+Q2aP6qkeaspvt4dGW3Lf39QVYF7R/UYxQ8Q+mp
 OK8wWNd9SAg3spTji6yd6VZAFXgvzYdylRVDMshe4sw5S4UFA+Bg6MfGYOiZx/AHOiNr
 w5GhtmjQ9Mm3NbVrSyRAz/nLIAXUZX9WhZ15YQ54hXaxxyt5riEsv2lUNl0fwPKF2tk2
 Lrqov9cRiWLFWPmmFRLUfuqFJA3zRoenD0yamgYAsqhiXlmOm5WFxZpnMM3JxuKOPS/9
 3ZoA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765539430; x=1766144230;
 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=4lWp1z1qm5gimARgCinlQ2lC4285X5e/PriMkm9eQuc=;
 b=jvqfaxTiSyXoaLUqQuNQ9+2j2uklkxc9gkqQcRY7B+9J8h5S/WIY62VvXDKpYEWnEC
 k5whLfr+mXQ6cy1W4vUOn8DPfTQEzcW+ffsuxi5ugUd11AVElJZQ+fnsw1hQnDZ3jFcu
 3D9fMx4V8fcG/z8WsCDxenINHq1CjlulSrdRDDLYblDzOZjUfpWvS5s6eg56GY64eiZu
 1nMFliwSj5wERZtNrhjMZ1nPG4Ejd+tgugRfz+GgbZeFiSqe5M5ApO7a+Yabl+fe9W2W
 PssPa69+sG2NJBvXARja+CGGMfD8ro3allj14L2s8mPbrvvb2UPQGw5pL8sinZSN/2nX
 BJ4Q==
X-Forwarded-Encrypted: i=1;
 AJvYcCWk0pmNDtPXedOrCSZVqB4GeRgUQFCZ3C5AAfUhWpwzVDI5fC3+ftiYFvmEZNJAOJ6jb7iFGg==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Ywzl4VyTqXoawuYQsKJbg+Ruj6z76CuJpjmbCtLc28hGcw0bgWg
 1Pvzq1g8EUaoEZluN1/Gmg+cKpuIv7PMpQ5Vm4KP2aEU8/s9m+To3m8zyZIohFy0TVFdpiCD8ns
 GdxWBdd96u1qMR/a6uEnSCJ3USIrLdv4=
X-Gm-Gg: AY/fxX6rgI+vZ1Q2dnsctl/JQShnj+tQfzsUKqLQe+B1apw+1EYJgdEZUCCPlgDfQW9
 URZ+VePLhLKRbxscqW4kOAc36xO98TqnLrzzGCJcGhZU/S41F5rU7+Zla7dhWm1Ly4XNQQ+Qje9
 drDaJGGe+SLOgGpIyaVJOMutjcrMh8bYC12BB5U1gz5ucPE5LKBsHn/WYTGBKVCMLCGYe9MwMqk
 drrvDSE93uuXAQdUyWeVv+03uaqRM260X3F8ScD/sP2R+BNcS5b9LDScGCKMwZ2gffIPlU=
X-Google-Smtp-Source: AGHT+IEx0CR1Djps8TeZdnjW11h23BJ/MpLG/qda+KG6TAFs+A4xMKjV5c8tGtgct8qz8fR95SOobKKMZ2grcM5sOVQ=
X-Received: by 2002:a05:6102:dcb:b0:5df:a9ed:72a2 with SMTP id
 ada2fe7eead31-5e8276cf6e3mr351509137.19.1765539430200; Fri, 12 Dec 2025
 03:37:10 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
 <87a4zo6kaq.fsf@HIDDEN>
In-Reply-To: <87a4zo6kaq.fsf@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Fri, 12 Dec 2025 06:36:58 -0500
X-Gm-Features: AQt7F2r1MqOs5CWd1_R7h2G1LEdo958Lu8QNhVKvLOb42kOLw7e7j_s3nWKk0PI
Message-ID: <CAN+1Hbq8bF6Fz-on6WS8QsKxnN4RxLAgVcWRc9ZNs2fO4V22hQ@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot,
 [PATCH] Add vtable buffer slot
To: Augusto Stoffel <arstoffel@HIDDEN>
Content-Type: multipart/alternative; boundary="00000000000092f8f00645bfaeb8"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Spencer Baugh <sbaugh@HIDDEN>,
 Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--00000000000092f8f00645bfaeb8
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, Dec 12, 2025 at 5:55=E2=80=AFAM Augusto Stoffel <arstoffel@HIDDEN=
m> wrote:

> On Thu, 11 Dec 2025 at 16:07, St=C3=A9phane Marks <shipmints@HIDDEN> w=
rote:
>
> > I put the vtable-set-buffer function back in because I recalled that
> > Augusto's comint-mime implementation uses a multi-buffer approach to
> > get a vtable into a comint buffer.  It first inserts into a temp
> > buffer and then blasts the buffer-string into the comint buffer and it
> > expects to be able to manipulate that vtable in that comint buffer
> > despite its foreign origin.  comint-mime would invoke this to reset
> > the buffer (yes, this is not backward compatible for his use case but
> > he's the only one I've found and I'm aware of and it's been brought
> > up).
>
> I implemented it that way because it "just worked", but it seems
> perfectly reasonable to declare that a vtable is tied to a buffer,
> period.  I recommend picking the approach that simplifies the
> implementation and future uses of vtable.  comint-mime can be changed
> (in fact, it has to be changed anyway).
>
> While I'm not fully into the loop regarding this discussion, it seems to
> me that the vtable's buffer should not part of the public interface and
> the ability to move a vtable between buffers should not be a supported
> feature.
>

I don't mind the safety hatch, though.  Other people might do something
clever like you did with the HTML renderer.  I wrote a mild admonishment in
the docstring.

--00000000000092f8f00645bfaeb8
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Fri, Dec 12, 2025 at 5:55=E2=80=AFAM Augusto Stoffel &lt;<a href=3D"mail=
to:arstoffel@HIDDEN">arstoffel@HIDDEN</a>&gt; wrote:</span></div></di=
v><div class=3D"gmail_quote gmail_quote_container"><blockquote class=3D"gma=
il_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,2=
04,204);padding-left:1ex">On Thu, 11 Dec 2025 at 16:07, St=C3=A9phane Marks=
 &lt;<a href=3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@gma=
il.com</a>&gt; wrote:<br>
<br>
&gt; I put the vtable-set-buffer function back in because I recalled that<b=
r>
&gt; Augusto&#39;s comint-mime implementation uses a multi-buffer approach =
to<br>
&gt; get a vtable into a comint buffer.=C2=A0 It first inserts into a temp<=
br>
&gt; buffer and then blasts the buffer-string into the comint buffer and it=
<br>
&gt; expects to be able to manipulate that vtable in that comint buffer<br>
&gt; despite its foreign origin.=C2=A0 comint-mime would invoke this to res=
et<br>
&gt; the buffer (yes, this is not backward compatible for his use case but<=
br>
&gt; he&#39;s the only one I&#39;ve found and I&#39;m aware of and it&#39;s=
 been brought<br>
&gt; up).<br>
<br>
I implemented it that way because it &quot;just worked&quot;, but it seems<=
br>
perfectly reasonable to declare that a vtable is tied to a buffer,<br>
period.=C2=A0 I recommend picking the approach that simplifies the<br>
implementation and future uses of vtable.=C2=A0 comint-mime can be changed<=
br>
(in fact, it has to be changed anyway).<br>
<br>
While I&#39;m not fully into the loop regarding this discussion, it seems t=
o<br>
me that the vtable&#39;s buffer should not part of the public interface and=
<br>
the ability to move a vtable between buffers should not be a supported<br>
feature.<br></blockquote><div><br></div><div class=3D"gmail_default" style=
=3D"font-family:monospace">I don&#39;t mind the safety hatch, though.=C2=A0=
 Other people might do something clever like you did with the HTML renderer=
.=C2=A0 I wrote a mild admonishment in the docstring.</div></div></div>

--00000000000092f8f00645bfaeb8--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 12 Dec 2025 10:56:08 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Fri Dec 12 05:56:08 2025
Received: from localhost ([127.0.0.1]:55111 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vU0oi-0006GF-6W
	for submit <at> debbugs.gnu.org; Fri, 12 Dec 2025 05:56:08 -0500
Received: from mail-ed1-x52b.google.com ([2a00:1450:4864:20::52b]:56677)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <arstoffel@HIDDEN>)
 id 1vU0of-0006Ff-K3
 for 79982 <at> debbugs.gnu.org; Fri, 12 Dec 2025 05:56:06 -0500
Received: by mail-ed1-x52b.google.com with SMTP id
 4fb4d7f45d1cf-6496c4ed38aso1538602a12.1
 for <79982 <at> debbugs.gnu.org>; Fri, 12 Dec 2025 02:56:05 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765536959; x=1766141759; darn=debbugs.gnu.org;
 h=content-transfer-encoding:mime-version:message-id:date:references
 :in-reply-to:subject:cc:to:from:from:to:cc:subject:date:message-id
 :reply-to; bh=n/jNcn5NErdu5lkvu6kJNcF468yqF8/R0XCfQrEDfm0=;
 b=ToM9HLxHu3JsZqAgQ1a0dBi5tifYZmdgn3eIkXqlYW7kCrOSjdyni6xWUxoaN3aj9n
 TQdprMqT2iuxdIY4SCS/o553EZ+rU9gm2fkcaL2idGPCp4kjGG5ry74YRvnooiZkrCHv
 MI7YS7mNKKTnaiAV7B4INQ84GPjiuFXLfEGQ+qIlyqVI1c3P+vT70Jzv46YIbXqmXjZM
 D5wvIUGYUcHFx+6fowFsLnxK1YpVxKZz/sL7yolJLReltabMpt9vGyqHgi8OMvbdnR9D
 bcba/wWXscqowLFCXuJnjxG4CF8GbqB5tHYhcrNHpbRtFS+TV6oQxQmclnXXiWyzxsiE
 Fn0w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765536959; x=1766141759;
 h=content-transfer-encoding:mime-version:message-id:date:references
 :in-reply-to:subject:cc:to:from:x-gm-gg:x-gm-message-state:from:to
 :cc:subject:date:message-id:reply-to;
 bh=n/jNcn5NErdu5lkvu6kJNcF468yqF8/R0XCfQrEDfm0=;
 b=fql24DUUeLBSLFzGG853qSb7QDdm8yIKpp4ckd0PFulmgK3+FOCAfcqlPVuKExJYiS
 gubky8J5X8kO4D6DGqiXtEOzAflmIUB2xNEQyoR5l8ZLoZWl86PZUXKPjmNj/gLD9J1+
 pZUI+qHCl+1O8q9E2yLEiNCWAv0iY/8yYDQ3angExyORRgQ3EVye80hOv5Jazwqx9vs5
 FsDZYLkQXCbrqTSWi12UBEYe/9ig8WPFq1005DycwLlWyN4vUhUMjOGh7BwlhllHMv9l
 5xRc2Xx4/COFTJOubE9aZTmholu28Ge+ZTWdSI/KwOy/faZw3qsrQdCIbuVs2U6D9H5O
 jj3Q==
X-Forwarded-Encrypted: i=1;
 AJvYcCUrSb1M0q4I1lWdkoBnttTUoygjtXdU0ghYD8FST0tA3sCM3sq8xIU4lflwTegAz0gmPHkyMQ==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YziGVSXbkX+GMYHL4y1XiANn4wKhYLu9pbIE2ZmPnZDLSOSMssK
 L2Mz8Fpx2NJmn7IQCEg2hYrwR2/8efAqwHozkLN3BLao0j1O6XtWzDT5
X-Gm-Gg: AY/fxX5xUsCfoRvDX+XIF3jGbGDuejbzFiS8gBrJEPgoLnJsFGrs8gCib3wI2pPs8c4
 rjXTV7FIRA1GKbo85ivwTHnbgb9TcrKAoN/bcf6sBxXlV7Qx2BFii45/IHfHRtzMFYpXng0E8RR
 l4GRPYx8MFTMkwoarTwionUHtzdlZwXZm3Tw8k3b8hVUFFzGOdUWR3Zp8ekyWnIz9VyeAA2jQzv
 9NMMeXe9BljGUoDsG9+JU/QKOSnRyTY/RVNaz+1XL72GIuAPlq84W2kYh1VXzDnyQFbTS9r+fp0
 Ay7LJUyWqJEmJGXz//iHXR8Bh+Ncb7Xx4Iyd0DQXlEMUeb3RcfwrS0iNIdOUE6DUwNoq8D7peJP
 f5IOZLgdHdZPHslWCw4zznfvSjyyJGSi3ARTo40JNf2Eow4LyNbkhTcU3/iZ/O+4=
X-Google-Smtp-Source: AGHT+IELRjY9IYjKVRwCsWQ5Lk8R9P5tb9Kq1Ryynf0SYSD+xhteGkau5jK1jI+vNfvVHImHFkMlVw==
X-Received: by 2002:a17:907:2d2b:b0:b76:ece3:510a with SMTP id
 a640c23a62f3a-b7d23776e1fmr173614666b.21.1765536958513; 
 Fri, 12 Dec 2025 02:55:58 -0800 (PST)
Received: from ars3 ([2a02:8109:8a95:9a00::17a2])
 by smtp.gmail.com with ESMTPSA id
 a640c23a62f3a-b7cfa51701csm531058566b.39.2025.12.12.02.55.57
 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);
 Fri, 12 Dec 2025 02:55:57 -0800 (PST)
From: Augusto Stoffel <arstoffel@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer
 slot, [PATCH] Add vtable buffer slot
In-Reply-To: <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
 <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
Date: Fri, 12 Dec 2025 11:55:57 +0100
Message-ID: <87a4zo6kaq.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Spencer Baugh <sbaugh@HIDDEN>,
 Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

On Thu, 11 Dec 2025 at 16:07, St=C3=A9phane Marks <shipmints@HIDDEN> wro=
te:

> I put the vtable-set-buffer function back in because I recalled that
> Augusto's comint-mime implementation uses a multi-buffer approach to
> get a vtable into a comint buffer.  It first inserts into a temp
> buffer and then blasts the buffer-string into the comint buffer and it
> expects to be able to manipulate that vtable in that comint buffer
> despite its foreign origin.  comint-mime would invoke this to reset
> the buffer (yes, this is not backward compatible for his use case but
> he's the only one I've found and I'm aware of and it's been brought
> up).

I implemented it that way because it "just worked", but it seems
perfectly reasonable to declare that a vtable is tied to a buffer,
period.  I recommend picking the approach that simplifies the
implementation and future uses of vtable.  comint-mime can be changed
(in fact, it has to be changed anyway).

While I'm not fully into the loop regarding this discussion, it seems to
me that the vtable's buffer should not part of the public interface and
the ability to move a vtable between buffers should not be a supported
feature.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 11 Dec 2025 21:07:44 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 11 16:07:44 2025
Received: from localhost ([127.0.0.1]:48468 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vTnt1-0003AY-R5
	for submit <at> debbugs.gnu.org; Thu, 11 Dec 2025 16:07:44 -0500
Received: from mail-vk1-xa2c.google.com ([2607:f8b0:4864:20::a2c]:52529)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vTnsz-0003AI-RF
 for 79982 <at> debbugs.gnu.org; Thu, 11 Dec 2025 16:07:42 -0500
Received: by mail-vk1-xa2c.google.com with SMTP id
 71dfb90a1353d-55cb8cabb4bso190622e0c.1
 for <79982 <at> debbugs.gnu.org>; Thu, 11 Dec 2025 13:07:41 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765487256; x=1766092056; darn=debbugs.gnu.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=zuw++VRMv53mQuM4gQRDKPhOPq/d3AEbbVvsPdGCYyc=;
 b=eXu0wgvWdqYHp+HF/nI8bJhvK4rbk1l3wInisdjWiM/+aepBbpo0CmKhi1GChkKjlp
 Bt9U+cx6SkZyROWvU0NvviWY4cn+KNG6Qng9St5Q0z/HybBp6eC5YNvX7r6MXmeqibYm
 kfnBK6ee2rzah3HqYad64kJub5yWq+iOTC7P4NG/gwTE+FFX2Tm2qaqKLvJoxyeuSB8v
 mAUUL7kdm0FFVjPR9IhwrYegpiVbdv5p5jXKAzuHlOPgxKnB/9r3Nju7iAsH8l6V51ny
 g8dBO9y64JTcCsHXRN4/DCwHFE2vUCCPxwPO4576Y8a7DC1oaERCCL2He/khGYvWFsYV
 vf1A==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765487256; x=1766092056;
 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=zuw++VRMv53mQuM4gQRDKPhOPq/d3AEbbVvsPdGCYyc=;
 b=K5QcclcP+eY12v2AcAwhJqW/DJ88zwKy2zBTynz3sMz9KLF8E5TEaSXnxDyVvmIdOR
 gc2qu6KuaedgfP4Sw/kMBcGrZFzBPFujwJhiv6DQZgnQRoKlzPW0UISCtaWIAMFbQy+E
 pyQ+BE3PzO0pWp3DM+LSsSgkLZov7EeJqXwMs08iMOqlgk+4KNyCJF6baq6gMwPrZhik
 XLZO6SH1oRfd0b+ghH3WeCxyAN5ZZBi15KLgWQb2ubMQMl0UEKzBMo8GwWA/bFwuokMH
 DjYc6toFYB+2rVTmLmgBLOdr3ObR+/ICodAwLGJWLMgs7OJMTZV2OkgpiKZm/7jDYbNP
 2ILg==
X-Forwarded-Encrypted: i=1;
 AJvYcCWGeGjI8mDxIIreX7qQY4mxWnDW+kRiDXJqV8cW8s3nKqdC3ntdAFAkWHprI7XuXeFtTwzv6g==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yyap6vt9UsIxBtVVzlBp69ZKZUk5D+JCpyml95ot9YfpPJZ3wqW
 ZM25ZCnihG8WQOIi97EuZLCSkUvaAtxAcnbNx+N5KvKV6H32w7pJaGugcdNHu2Sek6aQetDLg30
 x/69CENAu1KkwwMo4Hn3MOETI0Tqa2Eg=
X-Gm-Gg: AY/fxX6Jr5/IQU00SOzD2N82NCzjhhpBLT7rC6lv9SuywAQR6ehoCNEPkCcC1kiR6xB
 K5WkX2woNC6jxt0xHMwww3xKqkro4DDC4nTsguN/cF4d+CAdwNJ4sIfdy1VGSoFPt69dQHwWvya
 fa38GMQydLtjb4TnddoVmm6mbWl7Zq4QMTqv9UGICtWlfMQGVNwb2DnyvPc/iY8GXXXo7q/eG8M
 S2AsRohk2r2OHgnnqTlqFepZNGsYTSgiDkY//SXv3LDdmJVMrD7j1xo17PmqQAWoeFBdCE=
X-Google-Smtp-Source: AGHT+IH3xPZ6Jc0lDbuSdF7wL4jSc5rXIonIR8fSxYOn9XHWxWDVcLSwDanb9z7KWc7D4J9zlARKtqEQuTMIVVWrOew=
X-Received: by 2002:a05:6102:6442:b0:5db:e721:8624 with SMTP id
 ada2fe7eead31-5e5716f0612mr2654754137.1.1765487255756; Thu, 11 Dec 2025
 13:07:35 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 <ier8qf8ssxp.fsf_-_@HIDDEN>
In-Reply-To: <ier8qf8ssxp.fsf_-_@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Thu, 11 Dec 2025 16:07:24 -0500
X-Gm-Features: AQt7F2pIlxQ8d7yMWkNHm71pDppIx-q0ZZuE1HPw3d-VtCz1l4iXMe4dwRyVntI
Message-ID: <CAN+1HbrtXJKodGRsGkRvH2dpx4spUjzSc7xN22jd_zeTiqcYcg@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot,
 [PATCH] Add vtable buffer slot
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/mixed; boundary="000000000000bc39a50645b38899"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--000000000000bc39a50645b38899
Content-Type: multipart/alternative; boundary="000000000000bc39a30645b38897"

--000000000000bc39a30645b38897
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, Dec 11, 2025 at 2:46=E2=80=AFPM Spencer Baugh <sbaugh@HIDDEN=
m> wrote:

> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>
> > On Thu, Dec 11, 2025 at 1:23=E2=80=AFPM Spencer Baugh <sbaugh@janestree=
t.com>
> wrote:
> >  Can we move these let-bindings out to the outer let-binding now?
> >
> > I'd prefer if they stay close to where they're being used, at least
> here, where the cache update is clearly separate from the buffer
> > update.
>
> Good point.  Actually, so these bindings actually probably should be in
> the same let-binding as (let ((start (point))) ...), a few lines later.
> Since they're only used in that part of the code.
>

Sure.

>  > + (keymap (get-text-property (point) 'keymap)))
> >
> >  I guess we could get this from vtable-keymap now?  In which case it ca=
n
> >  also move to the outer let-binding?
> >
> > It would have to be from the -cached-keymap slot.  Let's leave the
> keymaps as is for the time being.  We have patches to refine
> > and expand their functionality coming.
>
> That's fair, but I think if we move these let-bindings down to the (let
> ((start (point)))) binding, that avoids reindenting the rest of this
> function.  Which makes this diff much smaller, which is nice.
>

I put the vtable-set-buffer function back in because I recalled
that Augusto's comint-mime implementation uses a multi-buffer approach to
get a vtable into a comint buffer.  It first inserts into a temp buffer and
then blasts the buffer-string into the comint buffer and it expects to be
able to manipulate that vtable in that comint buffer despite its foreign
origin.  comint-mime would invoke this to reset the buffer (yes, this is
not backward compatible for his use case but he's the only one I've found
and I'm aware of and it's been brought up).


> > +(defun vtable-insert (table)
> > +  "Insert TABLE into the current buffer.
> > +The current buffer will be recorded as TABLE's buffer.  If the table i=
s
> > +inserted into a buffer other than its originating buffer, signal an
> > +error.  A table may be reinserted into its own buffer, but insert only
> > +one instance per buffer.  This restriction needs to be enforced by the
> > +caller."
> > +  (and-let* ((table-buffer (vtable-buffer table))
> > +             (not (eq table-buffer (current-buffer))))
> > +    (error "A vtable cannot be inserted into more than one buffer"))
> > +  (setf (vtable-buffer table) (current-buffer))
> > +  (let ((inhibit-read-only t)
> > +        (inhibit-modification-hooks t))
>
> Hm, why do we need these inhibit-read-only and
> inhibit-modification-hooks?  Those are new, right?  They make sense,
> though.  Could we cover it with a test?
>

Test added, at least for the read-only case.  Mod hooks are a performance
issue and we could have a pedantic test for that but it's fussy for me at
the moment.

I also went ahead and put inhibit-modification-hooks in the other places it
needs to be (those were in my mega patch).

> -(defun vtable-revert-command ()
> > +(defun vtable-revert-command (&optional table)
> >    "Re-query data and regenerate the table under point."
>
> This docstring should mention TABLE.


Yep.

Patch attached.

-St=C3=A9phane

--000000000000bc39a30645b38897
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Thu, Dec 11, 2025 at 2:46=E2=80=AFPM Spencer Baugh &lt;<a href=3D"mailto=
:sbaugh@HIDDEN">sbaugh@HIDDEN</a>&gt; wrote:</span></div></=
div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=3D"g=
mail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204=
,204,204);padding-left:1ex">St=C3=A9phane Marks &lt;<a href=3D"mailto:shipm=
ints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
<br>
&gt; On Thu, Dec 11, 2025 at 1:23=E2=80=AFPM Spencer Baugh &lt;<a href=3D"m=
ailto:sbaugh@HIDDEN" target=3D"_blank">sbaugh@HIDDEN</a>&gt=
; wrote:<br>
&gt;=C2=A0 Can we move these let-bindings out to the outer let-binding now?=
<br>
&gt;<br>
&gt; I&#39;d prefer if they stay close to where they&#39;re being used, at =
least here, where the cache update is clearly separate from the buffer<br>
&gt; update.<br>
<br>
Good point.=C2=A0 Actually, so these bindings actually probably should be i=
n<br>
the same let-binding as (let ((start (point))) ...), a few lines later.<br>
Since they&#39;re only used in that part of the code.<br></blockquote><div>=
<br></div><div class=3D"gmail_default" style=3D"font-family:monospace">Sure=
.</div><div class=3D"gmail_default" style=3D"font-family:monospace"><br></d=
iv><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bord=
er-left:1px solid rgb(204,204,204);padding-left:1ex">
&gt;=C2=A0 &gt; + (keymap (get-text-property (point) &#39;keymap)))<br>
&gt;<br>
&gt;=C2=A0 I guess we could get this from vtable-keymap now?=C2=A0 In which=
 case it can<br>
&gt;=C2=A0 also move to the outer let-binding?<br>
&gt;<br>
&gt; It would have to be from the -cached-keymap slot.=C2=A0 Let&#39;s leav=
e the keymaps as is for the time being.=C2=A0 We have patches to refine<br>
&gt; and expand their functionality coming.<br>
<br>
That&#39;s fair, but I think if we move these let-bindings down to the (let=
<br>
((start (point)))) binding, that avoids reindenting the rest of this<br>
function.=C2=A0 Which makes this diff much smaller, which is nice.<br></blo=
ckquote><div><br></div><div><div class=3D"gmail_default" style=3D"font-fami=
ly:monospace">I put the vtable-set-buffer function back in because I recall=
ed that=C2=A0Augusto&#39;s comint-mime implementation uses a multi-buffer a=
pproach to get a vtable into a comint buffer.=C2=A0 It first inserts into a=
 temp buffer and then blasts the buffer-string into the comint buffer and i=
t expects to be able to manipulate that vtable in that comint buffer despit=
e its foreign origin.=C2=A0 comint-mime would=C2=A0invoke this to reset the=
 buffer (yes, this is not backward compatible for his use case but he&#39;s=
 the only one I&#39;ve found and I&#39;m aware of and it&#39;s been brought=
 up).</div></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex">&gt; +(defun vtable-insert (table)<br>
&gt; +=C2=A0 &quot;Insert TABLE into the current buffer.<br>
&gt; +The current buffer will be recorded as TABLE&#39;s buffer.=C2=A0 If t=
he table is<br>
&gt; +inserted into a buffer other than its originating buffer, signal an<b=
r>
&gt; +error.=C2=A0 A table may be reinserted into its own buffer, but inser=
t only<br>
&gt; +one instance per buffer.=C2=A0 This restriction needs to be enforced =
by the<br>
&gt; +caller.&quot;<br>
&gt; +=C2=A0 (and-let* ((table-buffer (vtable-buffer table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(not (eq table-buffer=
 (current-buffer))))<br>
&gt; +=C2=A0 =C2=A0 (error &quot;A vtable cannot be inserted into more than=
 one buffer&quot;))<br>
&gt; +=C2=A0 (setf (vtable-buffer table) (current-buffer))<br>
&gt; +=C2=A0 (let ((inhibit-read-only t)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (inhibit-modification-hooks t))<br>
<br>
Hm, why do we need these inhibit-read-only and<br>
inhibit-modification-hooks?=C2=A0 Those are new, right?=C2=A0 They make sen=
se,<br>
though.=C2=A0 Could we cover it with a test?<br></blockquote><div><br></div=
><div><div class=3D"gmail_default" style=3D"font-family:monospace">Test add=
ed,=C2=A0at least for the read-only case.=C2=A0 Mod hooks are a performance=
 issue and we could have a pedantic test for that but it&#39;s fussy for me=
 at the moment.</div><div class=3D"gmail_default" style=3D"font-family:mono=
space"><br></div><div class=3D"gmail_default" style=3D"font-family:monospac=
e">I also went ahead and put inhibit-modification-hooks in the other places=
 it needs to be (those were in my mega patch).</div></div><div class=3D"gma=
il_default" style=3D"font-family:monospace"><br></div><blockquote class=3D"=
gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(20=
4,204,204);padding-left:1ex">
&gt; -(defun vtable-revert-command ()<br>
&gt; +(defun vtable-revert-command (&amp;optional table)<br>
&gt;=C2=A0 =C2=A0 &quot;Re-query data and regenerate the table under point.=
&quot;<br>
<br>
This docstring should mention TABLE<span class=3D"gmail_default" style=3D"f=
ont-family:monospace">.</span></blockquote><div><br></div><div class=3D"gma=
il_default" style=3D"font-family:monospace">Yep.</div><div class=3D"gmail_d=
efault" style=3D"font-family:monospace"><br></div><div class=3D"gmail_defau=
lt" style=3D"font-family:monospace">Patch attached.</div><div class=3D"gmai=
l_default" style=3D"font-family:monospace"><br></div><div class=3D"gmail_de=
fault" style=3D"font-family:monospace">-St=C3=A9phane=C2=A0</div></div></di=
v>

--000000000000bc39a30645b38897--

--000000000000bc39a50645b38899
Content-Type: application/octet-stream; 
	name="0001-Add-vtable-buffer-slot.patch"
Content-Disposition: attachment; 
	filename="0001-Add-vtable-buffer-slot.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_mj1xiq820>
X-Attachment-Id: f_mj1xiq820

RnJvbSAwNzZhZDYwMGViYmU4ZjA2M2Y4ZmYyMTdkNWQ0NDkxOTNkOTAwZGU3IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo
aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMTAgRGVjIDIwMjUgMDk6MjA6MDIgLTA1MDAK
U3ViamVjdDogW1BBVENIXSBBZGQgdnRhYmxlIGJ1ZmZlciBzbG90CgpUaGlzIHNvbHZlcyBmb3Ig
YmFja2dyb3VuZCB2dGFibGUgbXV0YXRpb25zLCBpLmUuLCB1cGRhdGVzCmluaXRpYXRlZCBmcm9t
IGJ1ZmZlcnMgb3RoZXIgdGhhbiB0aGUgdnRhYmxlIGJ1ZmZlciwgYW5kIGZvcgpidWZmZXItYWRq
dXN0ZWQgc3RyaW5nLXBpeGVsLXdpZHRoIGNvbXB1dGF0aW9ucy4KCiogbGlzcC9lbWFjcy1saXNw
L3Z0YWJsZS5lbCAodnRhYmxlKTogTmV3ICctYnVmZmVyJyBzbG90LgoodnRhYmxlLWJ1ZmZlcik6
Cih2dGFibGUtc2V0LWJ1ZmZlcik6IE5ldyBmdW5jdGlvbi4KKHZ0YWJsZS11cGRhdGUtb2JqZWN0
KToKKHZ0YWJsZS1yZW1vdmUtb2JqZWN0KToKKHZ0YWJsZS1pbnNlcnQtb2JqZWN0KTogV3JhcCBv
cGVyYXRpb24gd2l0aCB0aGUgdnRhYmxlIGJ1ZmZlci4KKHZ0YWJsZS0taW5zZXJ0KTogU3BsaXQg
ZnJvbSBvbGQgJ3Z0YWJsZS1pbnNlcnQnLgoodnRhYmxlLWluc2VydCk6IEluc2VydCB0YWJsZSBh
bmQgcmVjb3JkIHRoZSBidWZmZXIuCih2dGFibGUtLWluc2VydC1saW5lKToKKHZ0YWJsZS0taW5z
ZXJ0LWhlYWRlci1saW5lKTogVXNlICd2dGFibGUtYnVmZmVyJyBmb3IgcGl4ZWwtd2lkdGggY29t
cHV0YXRpb24uCih2dGFibGUtLWxpbWl0LXN0cmluZyk6Cih2dGFibGUtLWNoYXItd2lkdGgpOiBQ
YXNzIGJ1ZmZlciB0byAnc3RyaW5nLXBpeGVsLXdpZHRoJy4KKHZ0YWJsZS1yZXZlcnQpOiBOZXcg
b3B0aW9uYWwgdGFibGUgYXJndW1lbnQuCih2dGFibGUtLWFsdGVyLWNvbHVtbi13aWR0aCk6Cih2
dGFibGUtcmV2ZXJ0LWNvbW1hbmQpOgoodnRhYmxlLXNvcnQtYnktY3VycmVudC1jb2x1bW4pOiBD
YWxsICd2dGFibGUtcmV2ZXJ0JyB3aXRoIHRoZSB0YWJsZS4KCiogdGVzdC9saXNwL2VtYWNzLWxp
c3AvdnRhYmxlLXRlc3RzLmVsCih2dGFibGUtdGVzdHMtLW1ha2Utbm8taGVhZGVyLTItb2JqZWN0
LXRhYmxlKTogTmV3IGhlbHBlcgpmdW5jdGlvbi4KKHRlc3QtdnN0YWJsZS1jb21wdXRlLWNvbHVt
bnMpOiBDb3JyZWN0IHR5cG8gaW4gdGVzdCBuYW1lLiAgVXNlCm5ldyBoZWxwZXIgZnVuY3Rpb24u
Cih0ZXN0LXZ0YWJsZS11bmlxdWUtYnVmZmVyKQoodGVzdC12dGFibGUtbm9uLWN1cnJlbnQtYnVm
ZmVyLWluc2VydC1vYmplY3QpCih0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItcmVtb3Zl
LW9iamVjdCkKKHRlc3QtdnRhYmxlLW5vbi1jdXJyZW50LWJ1ZmZlci11cGRhdGUtb2JqZWN0KQoo
dGVzdC12dGFibGUtLWxpbWl0LXN0cmluZy13aXRoLWZhY2UtcmVtYXBwZWQtYnVmZmVyKTogTmV3
IHRlc3QuCi0tLQogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAgICAgICAgICAgIHwgMjg5ICsr
KysrKysrKysrKysrKy0tLS0tLS0tLS0tLQogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRl
c3RzLmVsIHwgIDg0ICsrKysrKystCiAyIGZpbGVzIGNoYW5nZWQsIDI0MCBpbnNlcnRpb25zKCsp
LCAxMzMgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5l
bCBiL2xpc3AvZW1hY3MtbGlzcC92dGFibGUuZWwKaW5kZXggYmNkZDI4MGZiOTIuLjgxMTUxMjNk
NjAxIDEwMDY0NAotLS0gYS9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVsCisrKyBiL2xpc3AvZW1h
Y3MtbGlzcC92dGFibGUuZWwKQEAgLTY3LDggKzY3LDEwIEBAIHZ0YWJsZQogICAgKGVsbGlwc2lz
IDppbml0YXJnIDplbGxpcHNpcyA6YWNjZXNzb3IgdnRhYmxlLWVsbGlwc2lzKQogICAgKGNvbHVt
bi1jb2xvcnMgOmluaXRhcmcgOmNvbHVtbi1jb2xvcnMgOmFjY2Vzc29yIHZ0YWJsZS1jb2x1bW4t
Y29sb3JzKQogICAgKHJvdy1jb2xvcnMgOmluaXRhcmcgOnJvdy1jb2xvcnMgOmFjY2Vzc29yIHZ0
YWJsZS1yb3ctY29sb3JzKQorICAgKGJ1ZmZlciA6aW5pdGZvcm0gbmlsIDphY2Nlc3NvciB2dGFi
bGUtYnVmZmVyKQogICAgKC1jYWNoZWQtY29sb3JzIDppbml0Zm9ybSBuaWwpCiAgICAoLWNhY2hl
IDppbml0Zm9ybSAobWFrZS1oYXNoLXRhYmxlIDp0ZXN0ICMnZXF1YWwpKQorICAgKC1jdXJyZW50
LWNhY2hlIDppbml0Zm9ybSBuaWwgOmFjY2Vzc29yIHZ0YWJsZS0tY3VycmVudC1jYWNoZSkKICAg
ICgtY2FjaGVkLWtleW1hcCA6aW5pdGZvcm0gbmlsKQogICAgKC1oYXMtY29sdW1uLXNwZWMgOmlu
aXRmb3JtIG5pbCkpCiAgICJBbiBvYmplY3QgdG8gaG9sZCB0aGUgZGF0YSBmb3IgYSB0YWJsZS4i
KQpAQCAtMjg4LDcgKzI5MCw4IEBAIHZ0YWJsZS11cGRhdGUtb2JqZWN0CiAgICh1bmxlc3Mgb2xk
LW9iamVjdAogICAgIChzZXRxIG9sZC1vYmplY3Qgb2JqZWN0KSkKICAgKGxldCogKChvYmplY3Rz
ICh2dGFibGUtb2JqZWN0cyB0YWJsZSkpCi0gICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkp
CisgICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkKKyAgICAgICAgIChpbmhpYml0LW1vZGlm
aWNhdGlvbi1ob29rcyB0KSkKICAgICA7OyBGaXJzdCByZXBsYWNlIHRoZSBvYmplY3QgaW4gdGhl
IG9iamVjdCBzdG9yYWdlLgogICAgIChpZiAoZXEgb2xkLW9iamVjdCAoY2FyIG9iamVjdHMpKQog
ICAgICAgICA7OyBJdCdzIGF0IHRoZSBoZWFkLCBzbyByZXBsYWNlIGl0IHRoZXJlLgpAQCAtMzAx
LDE0ICszMDQsMTQgQEAgdnRhYmxlLXVwZGF0ZS1vYmplY3QKICAgICAgICh1bmxlc3MgKGNkciBv
YmplY3RzKQogICAgICAgICAoZXJyb3IgIkNhbid0IGZpbmQgdGhlIG9sZCBvYmplY3QiKSkKICAg
ICAgIChzZXRjYXIgKGNkciBvYmplY3RzKSBvYmplY3QpKQotICAgIDs7IFRoZW4gdXBkYXRlIHRo
ZSByZW5kZXJlZCB2dGFibGUgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgotICAgIChpZi1sZXQqICgo
Y2FjaGUgKHZ0YWJsZS0tY3VycmVudC1jYWNoZSkpCi0gICAgICAgICAgICAgKGxpbmUtbnVtYmVy
IChzZXEtcG9zaXRpb24gKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLW9iamVjdAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGEgYikKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCAoY2FyIGEpIGIpKSkpCi0gICAgICAgICAgICAg
KGxpbmUgKGVsdCAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkgbGluZS1udW1iZXIpKSkKLSAg
ICAgICAgKHByb2duCisgICAgOzsgVGhlbiB1cGRhdGUgdGhlIHJlbmRlcmVkIHZ0YWJsZSBpbiBp
dHMgYnVmZmVyLgorICAgIChpZi1sZXQqICgoY2FjaGUgKHZ0YWJsZS0tY3VycmVudC1jYWNoZSB0
YWJsZSkpCisgICAgICAgICAgICAgIChsaW5lLW51bWJlciAoc2VxLXBvc2l0aW9uICh2dGFibGUt
LWNhY2hlLWxpbmVzIGNhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBvbGQtb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChsYW1iZGEgKGEgYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoZXF1YWwgKGNhciBhKSBiKSkpKQorICAgICAgICAgICAgICAobGluZSAoZWx0ICh2dGFibGUt
LWNhY2hlLWxpbmVzIGNhY2hlKSBsaW5lLW51bWJlcikpKQorICAgICAgICAod2l0aC1jdXJyZW50
LWJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJsZSkKICAgICAgICAgICAoc2V0Y2FyIGxpbmUgb2Jq
ZWN0KQogICAgICAgICAgIChzZXRjZHIgbGluZSAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5l
IHRhYmxlIG9iamVjdCkpCiAgICAgICAgICAgOzsgLi4uIGFuZCByZWRpc3BsYXkgdGhlIGxpbmUg
aW4gcXVlc3Rpb24uCkBAIC0zMjEsOCArMzI0LDcgQEAgdnRhYmxlLXVwZGF0ZS1vYmplY3QKICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2FjaGUtd2lkdGhzIGNh
Y2hlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1zcGFjZXIg
dGFibGUpKQogICAgICAgICAgICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9pbnQp
IChsaXN0ICdrZXltYXAga2V5bWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2dGFibGUtY2FjaGUgY2FjaGUpKSkp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
J3Z0YWJsZSB0YWJsZSkpKSkKICAgICAgICAgICA7OyBXZSBtYXkgaGF2ZSBpbnNlcnRlZCBhIG5v
bi1udW1lcmljYWwgdmFsdWUgaW50byBhIHByZXZpb3VzbHkKICAgICAgICAgICA7OyBhbGwtbnVt
ZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUuCiAgICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRl
LW51bWVyaWNhbCB0YWJsZSAoY2RyIGxpbmUpKSkKQEAgLTMzNCwxNCArMzM2LDE2IEBAIHZ0YWJs
ZS1yZW1vdmUtb2JqZWN0CiAgIDs7IEZpcnN0IHJlbW92ZSBmcm9tIHRoZSBvYmplY3RzLgogICAo
c2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpIChkZWxxIG9iamVjdCAodnRhYmxlLW9iamVjdHMg
dGFibGUpKSkKICAgOzsgVGhlbiBhZGp1c3QgdGhlIGNhY2hlIGFuZCBkaXNwbGF5LgotICAoc2F2
ZS1leGN1cnNpb24KLSAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCi0gICAgKGxldCAoKGNh
Y2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKQotICAgICAgICAgIChpbmhpYml0LXJlYWQtb25s
eSB0KSkKLSAgICAgIChzZXRjYXIgY2FjaGUgKGRlbHEgKGFzc3Egb2JqZWN0ICh2dGFibGUtLWNh
Y2hlLWxpbmVzIGNhY2hlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2Fj
aGUtbGluZXMgY2FjaGUpKSkKLSAgICAgICh3aGVuICh2dGFibGUtZ290by1vYmplY3Qgb2JqZWN0
KQotICAgICAgICAoZGVsZXRlLWxpbmUpKSkpKQorICAod2l0aC1jdXJyZW50LWJ1ZmZlciAodnRh
YmxlLWJ1ZmZlciB0YWJsZSkKKyAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgICh2dGFibGUtZ290
by10YWJsZSB0YWJsZSkKKyAgICAgIChsZXQgKChjYWNoZSAodnRhYmxlLS1jdXJyZW50LWNhY2hl
IHRhYmxlKSkKKyAgICAgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KQorICAgICAgICAgICAg
KGluaGliaXQtbW9kaWZpY2F0aW9uLWhvb2tzIHQpKQorICAgICAgICAoc2V0Y2FyIGNhY2hlIChk
ZWxxIChhc3NxIG9iamVjdCAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpKSkKKyAgICAgICAg
KHdoZW4gKHZ0YWJsZS1nb3RvLW9iamVjdCBvYmplY3QpCisgICAgICAgICAgKGRlbGV0ZS1saW5l
KSkpKSkpCiAKIDs7IEZJWE1FOiBUaGUgZmFjdCB0aGF0IHRoZSBgbG9jYXRpb24nIGFyZ3VtZW50
IG9mCiA7OyBgdnRhYmxlLWluc2VydC1vYmplY3QnIGNhbiBiZSBhbiBpbnRlZ2VyIGFuZCBpcyB0
aGVuIGludGVycHJldGVkIGFzCkBAIC0zNjksOCArMzczLDkgQEAgdnRhYmxlLWluc2VydC1vYmpl
Y3QKICAgICAgIChwcm9nbgogICAgICAgICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpIChs
aXN0IG9iamVjdCkpCiAgICAgICAgICh2dGFibGUtLXJlY29tcHV0ZS1udW1lcmljYWwgdGFibGUg
KHZ0YWJsZS0tY29tcHV0ZS1jYWNoZWQtbGluZSB0YWJsZSBvYmplY3QpKQotICAgICAgICAodnRh
YmxlLWdvdG8tdGFibGUgdGFibGUpCi0gICAgICAgICh2dGFibGUtcmV2ZXJ0LWNvbW1hbmQpKQor
ICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJsZSkKKyAgICAg
ICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCisgICAgICAgICAgKHZ0YWJsZS1yZXZlcnQt
Y29tbWFuZCkpKQogICAgIDs7IEZpcnN0IGluc2VydCBpbnRvIHRoZSBvYmplY3RzLgogICAgIChs
ZXQgKChwb3MgKGlmIGxvY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgKGlmIChpbnRlZ2VycCBs
b2NhdGlvbikKQEAgLTM5OCw1NiArNDAzLDU4IEBAIHZ0YWJsZS1pbnNlcnQtb2JqZWN0CiAgICAg
ICAgICAgOzsgT3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVjdC4KICAgICAgICAgICAobmNvbmMg
KHZ0YWJsZS1vYmplY3RzIHRhYmxlKSAobGlzdCBvYmplY3QpKSkpKQogICAgIDs7IFRoZW4gYWRq
dXN0IHRoZSBjYWNoZSBhbmQgZGlzcGxheS4KLSAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgICh2
dGFibGUtZ290by10YWJsZSB0YWJsZSkKLSAgICAgIChsZXQqICgoY2FjaGUgKHZ0YWJsZS0tY3Vy
cmVudC1jYWNoZSkpCi0gICAgICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQpCi0gICAgICAg
ICAgICAgKGtleW1hcCAoZ2V0LXRleHQtcHJvcGVydHkgKHBvaW50KSAna2V5bWFwKSkKLSAgICAg
ICAgICAgICAoZWxsaXBzaXMgKGlmICh2dGFibGUtZWxsaXBzaXMgdGFibGUpCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAodHJ1bmNhdGUtc3RyaW5nLWVsbGlwc2lzKQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhY2UgKHZ0YWJsZS1mYWNl
IHRhYmxlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIikpCi0gICAgICAgICAgICAgKGVs
bGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggZWxsaXBzaXMpKQotICAgICAgICAgICAg
IChsaW5lcyAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkpCi0gICAgICAgICAgICAgKGVsZW0g
KGlmIGxvY2F0aW9uICA7IFRoaXMgYmluZGluZyBtaXJyb3JzIHRoZSBiaW5kaW5nIG9mIGBwb3Mn
IGFib3ZlLgotICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGludGVnZXJwIGxvY2F0aW9uKQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKG50aCBsb2NhdGlvbiBsaW5lcykKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAob3IgKGFzc3EgbG9jYXRpb24gbGluZXMpCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChhbmQgYmVmb3JlIChjYXIgbGluZXMpKSkpCi0gICAgICAgICAgICAg
ICAgICAgICAoaWYgYmVmb3JlIChjYXIgbGluZXMpKSkpCi0gICAgICAgICAgICAgKHBvcyAobWVt
cSBlbGVtIGxpbmVzKSkKLSAgICAgICAgICAgICAobGluZSAoY29ucyBvYmplY3QgKHZ0YWJsZS0t
Y29tcHV0ZS1jYWNoZWQtbGluZSB0YWJsZSBvYmplY3QpKSkpCi0gICAgICAgIChpZiAob3IgYmVm
b3JlCi0gICAgICAgICAgICAgICAgKGFuZCBwb3MgKGludGVnZXJwIGxvY2F0aW9uKSkpCi0gICAg
ICAgICAgICA7OyBBZGQgdGhlIG5ldyBvYmplY3QgYmVmb3JlOi4KLSAgICAgICAgICAgIChsZXQg
KChvbGQtbGluZSAoY2FyIHBvcykpKQotICAgICAgICAgICAgICAoc2V0Y2FyIHBvcyBsaW5lKQot
ICAgICAgICAgICAgICAoc2V0Y2RyIHBvcyAoY29ucyBvbGQtbGluZSAoY2RyIHBvcykpKQotICAg
ICAgICAgICAgICAodW5sZXNzICh2dGFibGUtZ290by1vYmplY3QgKGNhciBlbGVtKSkKLSAgICAg
ICAgICAgICAgICAodnRhYmxlLWJlZ2lubmluZy1vZi10YWJsZSkpKQotICAgICAgICAgIDs7IE90
aGVyd2lzZSwgYWRkIHRoZSBvYmplY3QgYWZ0ZXIuCi0gICAgICAgICAgKGlmIHBvcwotICAgICAg
ICAgICAgICA7OyBTcGxpY2UgdGhlIG9iamVjdCBpbnRvIHRoZSBsaXN0LgotICAgICAgICAgICAg
ICAocHJvZ24KLSAgICAgICAgICAgICAgICAoc2V0Y2RyIHBvcyAoY29ucyBsaW5lIChjZHIgcG9z
KSkpCi0gICAgICAgICAgICAgICAgKGlmICh2dGFibGUtZ290by1vYmplY3QgbG9jYXRpb24pCi0g
ICAgICAgICAgICAgICAgICAgIChmb3J3YXJkLWxpbmUgMSkgIDsgSW5zZXJ0ICphZnRlciouCi0g
ICAgICAgICAgICAgICAgICAodnRhYmxlLWVuZC1vZi10YWJsZSkpKQotICAgICAgICAgICAgOzsg
T3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVjdC4KLSAgICAgICAgICAgIChzZXRjYXIgY2FjaGUg
KG5jb25jIGxpbmVzIChsaXN0IGxpbmUpKSkKLSAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRh
YmxlKSkpCi0gICAgICAgIChsZXQgKChzdGFydCAocG9pbnQpKSkKLSAgICAgICAgICA7OyBGSVhN
RTogV2UgaGF2ZSB0byBhZGp1c3QgY29sb3JzIGluIGxpbmVzIGJlbG93IHRoaXMgaWYgd2UKLSAg
ICAgICAgICA7OyBoYXZlIDpyb3ctY29sb3JzLgotICAgICAgICAgICh2dGFibGUtLWluc2VydC1s
aW5lIHRhYmxlIGxpbmUgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUt
LWNhY2hlLXdpZHRocyBjYWNoZSkgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGVsbGlwc2lzIGVsbGlwc2lzLXdpZHRoKQotICAgICAgICAgIChh
ZGQtdGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkgKGxpc3QgJ2tleW1hcCBrZXltYXAKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2dGFibGUg
dGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICd2dGFibGUtY2FjaGUgY2FjaGUpKSkKLSAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5zZXJ0ZWQg
YSBub24tbnVtZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5Ci0gICAgICAgIDs7IGFsbC1u
dW1lcmljYWwgdGFibGUsIHNvIHJlY29tcHV0ZS4KLSAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRl
LW51bWVyaWNhbCB0YWJsZSAoY2RyIGxpbmUpKSkpKSkKKyAgICAobGV0KiAoKGNhY2hlICh2dGFi
bGUtLWN1cnJlbnQtY2FjaGUgdGFibGUpKQorICAgICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkg
dCkKKyAgICAgICAgICAgKGluaGliaXQtbW9kaWZpY2F0aW9uLWhvb2tzIHQpCisgICAgICAgICAg
IChsaW5lcyAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkpCisgICAgICAgICAgIChlbGVtIChp
ZiBsb2NhdGlvbiAgOyBUaGlzIGJpbmRpbmcgbWlycm9ycyB0aGUgYmluZGluZyBvZiBgcG9zJyBh
Ym92ZS4KKyAgICAgICAgICAgICAgICAgICAgIChpZiAoaW50ZWdlcnAgbG9jYXRpb24pCisgICAg
ICAgICAgICAgICAgICAgICAgICAgKG50aCBsb2NhdGlvbiBsaW5lcykKKyAgICAgICAgICAgICAg
ICAgICAgICAgKG9yIChhc3NxIGxvY2F0aW9uIGxpbmVzKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKGFuZCBiZWZvcmUgKGNhciBsaW5lcykpKSkKKyAgICAgICAgICAgICAgICAgICAoaWYg
YmVmb3JlIChjYXIgbGluZXMpKSkpCisgICAgICAgICAgIChwb3MgKG1lbXEgZWxlbSBsaW5lcykp
CisgICAgICAgICAgIChsaW5lIChjb25zIG9iamVjdCAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1s
aW5lIHRhYmxlIG9iamVjdCkpKSkKKyAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUt
YnVmZmVyIHRhYmxlKQorICAgICAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgICAgICAodnRhYmxl
LWdvdG8tdGFibGUgdGFibGUpCisgICAgICAgICAgKGlmIChvciBiZWZvcmUKKyAgICAgICAgICAg
ICAgICAgIChhbmQgcG9zIChpbnRlZ2VycCBsb2NhdGlvbikpKQorICAgICAgICAgICAgICA7OyBB
ZGQgdGhlIG5ldyBvYmplY3QgYmVmb3JlOi4KKyAgICAgICAgICAgICAgKGxldCAoKG9sZC1saW5l
IChjYXIgcG9zKSkpCisgICAgICAgICAgICAgICAgKHNldGNhciBwb3MgbGluZSkKKyAgICAgICAg
ICAgICAgICAoc2V0Y2RyIHBvcyAoY29ucyBvbGQtbGluZSAoY2RyIHBvcykpKQorICAgICAgICAg
ICAgICAgICh1bmxlc3MgKHZ0YWJsZS1nb3RvLW9iamVjdCAoY2FyIGVsZW0pKQorICAgICAgICAg
ICAgICAgICAgKHZ0YWJsZS1iZWdpbm5pbmctb2YtdGFibGUpKSkKKyAgICAgICAgICAgIDs7IE90
aGVyd2lzZSwgYWRkIHRoZSBvYmplY3QgYWZ0ZXIuCisgICAgICAgICAgICAoaWYgcG9zCisgICAg
ICAgICAgICAgICAgOzsgU3BsaWNlIHRoZSBvYmplY3QgaW50byB0aGUgbGlzdC4KKyAgICAgICAg
ICAgICAgICAocHJvZ24KKyAgICAgICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIGxpbmUg
KGNkciBwb3MpKSkKKyAgICAgICAgICAgICAgICAgIChpZiAodnRhYmxlLWdvdG8tb2JqZWN0IGxv
Y2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgIChmb3J3YXJkLWxpbmUgMSkgIDsgSW5zZXJ0
ICphZnRlciouCisgICAgICAgICAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCisg
ICAgICAgICAgICAgIDs7IE90aGVyd2lzZSwgYXBwZW5kIHRoZSBvYmplY3QuCisgICAgICAgICAg
ICAgIChzZXRjYXIgY2FjaGUgKG5jb25jIGxpbmVzIChsaXN0IGxpbmUpKSkKKyAgICAgICAgICAg
ICAgKHZ0YWJsZS1lbmQtb2YtdGFibGUpKSkKKyAgICAgICAgICAobGV0KiAoKHN0YXJ0IChwb2lu
dCkpCisgICAgICAgICAgICAgICAgIChlbGxpcHNpcyAoaWYgKHZ0YWJsZS1lbGxpcHNpcyB0YWJs
ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAodHJ1bmNhdGUt
c3RyaW5nLWVsbGlwc2lzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICdmYWNlICh2dGFibGUtZmFjZSB0YWJsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICIiKSkKKyAgICAgICAgICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwt
d2lkdGggZWxsaXBzaXMgKGN1cnJlbnQtYnVmZmVyKSkpCisgICAgICAgICAgICAgICAgIChrZXlt
YXAgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1hcCkpKQorICAgICAgICAgICAgOzsg
RklYTUU6IFdlIGhhdmUgdG8gYWRqdXN0IGNvbG9ycyBpbiBsaW5lcyBiZWxvdyB0aGlzIGlmIHdl
CisgICAgICAgICAgICA7OyBoYXZlIDpyb3ctY29sb3JzLgorICAgICAgICAgICAgKHZ0YWJsZS0t
aW5zZXJ0LWxpbmUgdGFibGUgbGluZSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAodnRhYmxlLS1zcGFjZXIgdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBlbGxpcHNpcyBlbGxpcHNpcy13aWR0aCkKKyAgICAgICAgICAgIChhZGQtdGV4dC1w
cm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkgKGxpc3QgJ2tleW1hcCBrZXltYXAKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZSkp
KQorICAgICAgICAgIDs7IFdlIG1heSBoYXZlIGluc2VydGVkIGEgbm9uLW51bWVyaWNhbCB2YWx1
ZSBpbnRvIGEgcHJldmlvdXNseQorICAgICAgICAgIDs7IGFsbC1udW1lcmljYWwgdGFibGUsIHNv
IHJlY29tcHV0ZS4KKyAgICAgICAgICAodnRhYmxlLS1yZWNvbXB1dGUtbnVtZXJpY2FsIHRhYmxl
IChjZHIgbGluZSkpKSkpKSkKIAogKGRlZnVuIHZ0YWJsZS1jb2x1bW4gKHRhYmxlIGluZGV4KQog
ICAiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBJTkRFWHRoIGNvbHVtbiBpbiBUQUJMRS4iCkBAIC01
MjAsMTQgKzUyNywxNCBAQCB2dGFibGUtLWNhY2hlLXdpZHRocwogKGRlZnVuIHZ0YWJsZS0tY2Fj
aGUtbGluZXMgKGNhY2hlKQogICAoY2FyIGNhY2hlKSkKIAotKGRlZnVuIHZ0YWJsZS1pbnNlcnQg
KHRhYmxlKQorKGRlZnVuIHZ0YWJsZS0taW5zZXJ0ICh0YWJsZSkKICAgKGxldCogKChzcGFjZXIg
KHZ0YWJsZS0tc3BhY2VyIHRhYmxlKSkKICAgICAgICAgIChzdGFydCAocG9pbnQpKQogICAgICAg
ICAgKGVsbGlwc2lzIChpZiAodnRhYmxlLWVsbGlwc2lzIHRhYmxlKQogICAgICAgICAgICAgICAg
ICAgICAgICAocHJvcGVydGl6ZSAodHJ1bmNhdGUtc3RyaW5nLWVsbGlwc2lzKQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFjZSAodnRhYmxlLWZhY2UgdGFibGUpKQogICAg
ICAgICAgICAgICAgICAgICAgIiIpKQotICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmct
cGl4ZWwtd2lkdGggZWxsaXBzaXMpKQorICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmct
cGl4ZWwtd2lkdGggZWxsaXBzaXMgKHZ0YWJsZS1idWZmZXIgdGFibGUpKSkKICAgICAgICAgIDs7
IFdlIG1haW50YWluIGEgY2FjaGUgcGVyIHNjcmVlbi93aW5kb3cgd2lkdGgsIHNvIHRoYXQgd2Ug
cmVuZGVyCiAgICAgICAgICA7OyBjb3JyZWN0bHkgaWYgRW1hY3MgaXMgb3BlbiBvbiB0d28gZGlm
ZmVyZW50IHNjcmVlbnMgKG9yIHRoZQogICAgICAgICAgOzsgdXNlciByZXNpemVzIHRoZSBmcmFt
ZSkuCkBAIC01NDksOCArNTU2LDcgQEAgdnRhYmxlLWluc2VydAogICAgICAgICAoYWRkLXRleHQt
cHJvcGVydGllcyBzdGFydCAocG9pbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChs
aXN0ICdrZXltYXAgdnRhYmxlLWhlYWRlci1saW5lLW1hcAogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAncmVhci1ub25zdGlja3kgdAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAndnRhYmxlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICd2dGFibGUtY2FjaGUgY2FjaGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAndnRhYmxlIHRhYmxlKSkKICAgICAgICAgKHNldHEgc3RhcnQgKHBvaW50KSkpKQogICAg
ICh2dGFibGUtLXNvcnQgdGFibGUgY2FjaGUpCiAgICAgOzsgSW5zZXJ0IHRoZSBkYXRhLgpAQCAt
NTYxLDEzICs1NjcsMzUgQEAgdnRhYmxlLWluc2VydAogICAgICAgICAoc2V0cSBsaW5lLW51bWJl
ciAoMSsgbGluZS1udW1iZXIpKSkpCiAgICAgKGFkZC10ZXh0LXByb3BlcnRpZXMgc3RhcnQgKHBv
aW50KQogICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0ICdyZWFyLW5vbnN0aWNreSB0Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICd2dGFibGUtY2FjaGUgY2FjaGUpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICd2dGFibGUgdGFibGUpKQorICAgIChzZXRmICh2dGFibGUtLWN1cnJl
bnQtY2FjaGUgdGFibGUpIGNhY2hlKQogICAgIChnb3RvLWNoYXIgc3RhcnQpKSkKIAorKGRlZnVu
IHZ0YWJsZS1pbnNlcnQgKHRhYmxlKQorICAiSW5zZXJ0IFRBQkxFIGludG8gdGhlIGN1cnJlbnQg
YnVmZmVyLgorVGhlIGN1cnJlbnQgYnVmZmVyIHdpbGwgYmUgcmVjb3JkZWQgYXMgVEFCTEUncyBi
dWZmZXIuICBJZiB0aGUgdGFibGUgaXMKK2luc2VydGVkIGludG8gYSBidWZmZXIgb3RoZXIgdGhh
biBpdHMgb3JpZ2luYXRpbmcgYnVmZmVyLCBzaWduYWwgYW4KK2Vycm9yLiAgQSB0YWJsZSBtYXkg
YmUgcmVpbnNlcnRlZCBpbnRvIGl0cyBvd24gYnVmZmVyLCBidXQgaW5zZXJ0IG9ubHkKK29uZSBp
bnN0YW5jZSBwZXIgYnVmZmVyLiAgVGhpcyByZXN0cmljdGlvbiBuZWVkcyB0byBiZSBlbmZvcmNl
ZCBieSB0aGUKK2NhbGxlci4iCisgIChpZi1sZXQqICgodGFibGUtYnVmZmVyICh2dGFibGUtYnVm
ZmVyIHRhYmxlKSkpCisgICAgICAod2hlbiAobm90IChlcSB0YWJsZS1idWZmZXIgKGN1cnJlbnQt
YnVmZmVyKSkpCisgICAgICAgIChlcnJvciAiQSB2dGFibGUgY2Fubm90IGJlIGluc2VydGVkIGlu
dG8gbW9yZSB0aGFuIG9uZSBidWZmZXIiKSkpCisgIChzZXRmICh2dGFibGUtYnVmZmVyIHRhYmxl
KSAoY3VycmVudC1idWZmZXIpKQorICAobGV0ICgoaW5oaWJpdC1yZWFkLW9ubHkgdCkKKyAgICAg
ICAgKGluaGliaXQtbW9kaWZpY2F0aW9uLWhvb2tzIHQpKQorICAgICh2dGFibGUtLWluc2VydCB0
YWJsZSkpKQorCisoZGVmdW4gdnRhYmxlLXNldC1idWZmZXIgKHRhYmxlIGJ1ZmZlcikKKyAgIkFz
c29jaWF0ZSBCVUZGRVIgd2l0aCBUQUJMRS4KK1VzZSB0aGlzIGZ1bmN0aW9uIHdpdGggY2FyZSwg
YW5kIGVuc3VyZSB5b3VyIHZ0YWJsZSBpbnN0YW5jZSByZW5kZXJzCitpdHNlbGYgaW4gdGhlIG5l
dyBidWZmZXIuIgorICAoc2V0ZiAodnRhYmxlLWJ1ZmZlciB0YWJsZSkgYnVmZmVyKSkKKwogKGRl
ZnVuIHZ0YWJsZS0taW5zZXJ0LWxpbmUgKHRhYmxlIGxpbmUgbGluZS1udW1iZXIgd2lkdGhzIHNw
YWNlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25hbCBlbGxpcHNp
cyBlbGxpcHNpcy13aWR0aCkKICAgKGxldCAoKHN0YXJ0IChwb2ludCkpCisgICAgICAgIChidWZm
ZXIgKHZ0YWJsZS1idWZmZXIgdGFibGUpKQogICAgICAgICAoY29sdW1ucyAodnRhYmxlLWNvbHVt
bnMgdGFibGUpKQogICAgICAgICAoY29sdW1uLWNvbG9ycwogICAgICAgICAgKGFuZCAodnRhYmxl
LWNvbHVtbi1jb2xvcnMgdGFibGUpCkBAIC02MDcsMTYgKzYzNSwxOCBAQCB2dGFibGUtLWluc2Vy
dC1saW5lCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdAogICAgICAgICAgICAgICAgICAg
ICAgICAodnRhYmxlLS1saW1pdC1zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1j
b21wdXRlZCAoLSAoZWx0IHdpZHRocyBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAob3IgZWxsaXBzaXMtd2lkdGggMCkpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChvciBlbGxpcHNpcy13aWR0aCAwKSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMpCiAg
ICAgICAgICAgICAgICAgICAgIHByZS1jb21wdXRlZCkpCiAgICAgICAgICAgICAgICAgIDs7IFJl
Y29tcHV0ZSB3aWR0aHMuCiAgICAgICAgICAgICAgICAgICh0Ci0gICAgICAgICAgICAgICAgICAo
aWYgKD4gKHN0cmluZy1waXhlbC13aWR0aCB2YWx1ZSkgKGVsdCB3aWR0aHMgaW5kZXgpKQorICAg
ICAgICAgICAgICAgICAgKGlmICg+IChzdHJpbmctcGl4ZWwtd2lkdGggdmFsdWUgYnVmZmVyKSAo
ZWx0IHdpZHRocyBpbmRleCkpCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdAogICAgICAg
ICAgICAgICAgICAgICAgICAodnRhYmxlLS1saW1pdC1zdHJpbmcKICAgICAgICAgICAgICAgICAg
ICAgICAgIHZhbHVlICgtIChlbHQgd2lkdGhzIGluZGV4KQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKG9yIGVsbGlwc2lzLXdpZHRoIDApKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChvciBlbGxpcHNpcy13aWR0aCAwKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMpCiAgICAgICAgICAg
ICAgICAgICAgIHZhbHVlKSkpKQogICAgICAgICAgICAgICAgKHN0YXJ0IChwb2ludCkpCkBAIC02
MzAsMTQgKzY2MCwxNSBAQCB2dGFibGUtLWluc2VydC1saW5lCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChsaXN0ICdzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6d2lk
dGggKGxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKyAoLSAo
ZWx0IHdpZHRocyBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoc3RyaW5nLXBpeGVsLXdpZHRoIGRpc3BsYXllZCkpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1waXhlbC13aWR0aAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWQgYnVmZmVy
KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgbGFzdCAw
IHNwYWNlcikpKSkpKSkKICAgICAgICAgICAgICA7OyBBbGlnbiB0byB0aGUgcmlnaHQuCiAgICAg
ICAgICAgICAgKGluc2VydCAocHJvcGVydGl6ZSAiICIgJ2Rpc3BsYXkKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChsaXN0ICdzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgOndpZHRoIChsaXN0ICgtIChlbHQgd2lkdGhzIGluZGV4KQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmct
cGl4ZWwtd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZGlzcGxheWVkKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkIGJ1ZmZlcikpKSkpCiAgICAgICAg
ICAgICAgICAgICAgICBkaXNwbGF5ZWQpCiAgICAgICAgICAgICAgKHVubGVzcyBsYXN0CiAgICAg
ICAgICAgICAgICAoaW5zZXJ0IChwcm9wZXJ0aXplICIgIiAnZGlzcGxheQpAQCAtNjY0LDE2ICs2
OTUsNiBAQCB2dGFibGUtLWluc2VydC1saW5lCiAoZGVmdW4gdnRhYmxlLS1jYWNoZS1rZXkgKCkK
ICAgKGNvbnMgKGZyYW1lLXRlcm1pbmFsKSAod2luZG93LXdpZHRoKSkpCiAKLShkZWZ1biB2dGFi
bGUtLWN1cnJlbnQtY2FjaGUgKCkKLSAgIlJldHVybiB0aGUgY3VycmVudCBjYWNoZSBmb3IgdGhl
IHRhYmxlIGF0IHBvaW50LgotCi1JbiBgdnRhYmxlLWluc2VydCcsIHRoZSBsaW5lcyBhbmQgd2lk
dGhzIG9mIHRoZSB2dGFibGUgdGV4dCBhcmUgY29tcHV0ZWQKLWJhc2VkIG9uIHRoZSBjdXJyZW50
IHNlbGVjdGVkIGZyYW1lIGFuZCB3aW5kb3cgYW5kIHN0b3JlZCBpbiBhIGNhY2hlLgotU3Vic2Vx
dWVudCBpbnRlcmFjdGlvbiB3aXRoIHRoZSB0ZXh0IG9mIHRoZSB2dGFibGUgc2hvdWxkIHVzZSB0
aGF0IGNhY2hlCi12aWEgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiBieSBjYWxsaW5nIGB2dGFi
bGUtLWNhY2hlLWtleScgdG8gbG9vayB1cAotdGhlIGNhY2hlLiIKLSAgKGdldC10ZXh0LXByb3Bl
cnR5IChwb2ludCkgJ3Z0YWJsZS1jYWNoZSkpCi0KIChkZWZ1biB2dGFibGUtLWNsZWFyLWNhY2hl
ICh0YWJsZSkKICAgKHNldGYgKGdldGhhc2ggKHZ0YWJsZS0tY2FjaGUta2V5KSAoc2xvdC12YWx1
ZSB0YWJsZSAnLWNhY2hlKSkgbmlsKSkKIApAQCAtNzE4LDYgKzczOSw3IEBAIHZ0YWJsZS0taW5k
aWNhdG9yCiAoZGVmdW4gdnRhYmxlLS1pbnNlcnQtaGVhZGVyLWxpbmUgKHRhYmxlIHdpZHRocyBz
cGFjZXIpCiAgIDs7IEluc2VydCB0aGUgaGVhZGVyIGRpcmVjdGx5IGludG8gdGhlIGJ1ZmZlci4K
ICAgKGxldCAoKHN0YXJ0IChwb2ludCkpCisgICAgICAgIChidWZmZXIgKHZ0YWJsZS1idWZmZXIg
dGFibGUpKQogICAgICAgICAoZGl2aWRlciAodnRhYmxlLWRpdmlkZXIgdGFibGUpKQogICAgICAg
ICAoY21hcCAoZGVmaW5lLWtleW1hcAogICAgICAgICAgICAgICAgICI8aGVhZGVyLWxpbmU+IDxk
cmFnLW1vdXNlLTE+IiAjJ3Z0YWJsZS0tZHJhZy1yZXNpemUtY29sdW1uCkBAIC03MzcsMTQgKzc1
OSwxNSBAQCB2dGFibGUtLWluc2VydC1oZWFkZXItbGluZQogICAgICAgICAgICAgICAgICAgICAg
J2tleW1hcCBjbWFwKSkKICAgICAgICAgICAgICAgKHN0YXJ0IChwb2ludCkpCiAgICAgICAgICAg
ICAgIChpbmRpY2F0b3IgKHZ0YWJsZS0taW5kaWNhdG9yIHRhYmxlIGluZGV4KSkKLSAgICAgICAg
ICAgICAgKGluZGljYXRvci13aWR0aCAoc3RyaW5nLXBpeGVsLXdpZHRoIGluZGljYXRvcikpCisg
ICAgICAgICAgICAgIChpbmRpY2F0b3Itd2lkdGggKHN0cmluZy1waXhlbC13aWR0aCBpbmRpY2F0
b3IgYnVmZmVyKSkKICAgICAgICAgICAgICAgKGxhc3QgKD0gaW5kZXggKDEtIChsZW5ndGggKHZ0
YWJsZS1jb2x1bW5zIHRhYmxlKSkpKSkKICAgICAgICAgICAgICAgZGlzcGxheWVkKQogICAgICAg
ICAgKHNldHEgZGlzcGxheWVkCi0gICAgICAgICAgICAgICAoaWYgKD4gKHN0cmluZy1waXhlbC13
aWR0aCBuYW1lKQorICAgICAgICAgICAgICAgKGlmICg+IChzdHJpbmctcGl4ZWwtd2lkdGggbmFt
ZSBidWZmZXIpCiAgICAgICAgICAgICAgICAgICAgICAgKC0gKGVsdCB3aWR0aHMgaW5kZXgpIGlu
ZGljYXRvci13aWR0aCkpCiAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tbGltaXQtc3RyaW5n
Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgKC0gKGVsdCB3aWR0aHMgaW5kZXgpIGluZGljYXRv
ci13aWR0aCkpCisgICAgICAgICAgICAgICAgICAgIG5hbWUgKC0gKGVsdCB3aWR0aHMgaW5kZXgp
IGluZGljYXRvci13aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyKQogICAgICAgICAg
ICAgICAgICBuYW1lKSkKICAgICAgICAgIChsZXQqICgoaW5kaWNhdG9yLWxlYWQtd2lkdGgKICAg
ICAgICAgICAgICAgICAgOzsgV2Ugd2FudCB0aGUgaW5kaWNhdG9yIHRvIG5vdCBiZSBxdWl0ZSBm
bHVzaCByaWdodC4KQEAgLTc1Myw3ICs3NzYsNyBAQCB2dGFibGUtLWluc2VydC1oZWFkZXItbGlu
ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvci1sZWFk
LXdpZHRoKSkKICAgICAgICAgICAgICAgICAoZmlsbC13aWR0aAogICAgICAgICAgICAgICAgICAo
KyAoLSAoZWx0IHdpZHRocyBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1w
aXhlbC13aWR0aCBkaXNwbGF5ZWQpCisgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctcGl4
ZWwtd2lkdGggZGlzcGxheWVkIGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNh
dG9yLXdpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvci1sZWFkLXdpZHRoKQog
ICAgICAgICAgICAgICAgICAgICAoaWYgbGFzdCAwIHNwYWNlcikpKSkKQEAgLTc3MSw3ICs3OTQs
OCBAQCB2dGFibGUtLWluc2VydC1oZWFkZXItbGluZQogICAgICAgICAgICAgIDs7IFRoaXMgaXMg
dGhlIGZpbmFsIGNvbHVtbiwgYW5kIHdlIGhhdmUgYSBzb3J0aW5nCiAgICAgICAgICAgICAgOzsg
aW5kaWNhdG9yLCBhbmQgdGhlIHRhYmxlIGlzIHRvbyB3aWRlIGZvciB0aGUgd2luZG93LgogICAg
ICAgICAgICAgIChsZXQqICgocHJlLWluZGljYXRvciAoc3RyaW5nLXBpeGVsLXdpZHRoCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQt
bWluKSAocG9pbnQpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVm
ZmVyLXN1YnN0cmluZyAocG9pbnQtbWluKSAocG9pbnQpKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgYnVmZmVyKSkKICAgICAgICAgICAgICAgICAgICAgKHByZS1maWxsCiAg
ICAgICAgICAgICAgICAgICAgICAoLSAod2luZG93LXdpZHRoIG5pbCB0KQogICAgICAgICAgICAg
ICAgICAgICAgICAgcHJlLWluZGljYXRvcgpAQCAtODUwLDE0ICs4NzQsMTYgQEAgdnRhYmxlLS1z
ZXQtaGVhZGVyLWxpbmUKICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50LW1pbikg
KDEtIChwb2ludC1tYXgpKSkpKSkKICAgKHZ0YWJsZS1oZWFkZXItbW9kZSAxKSkKIAotKGRlZnVu
IHZ0YWJsZS0tbGltaXQtc3RyaW5nIChzdHJpbmcgcGl4ZWxzKQorCisoZGVmdW4gdnRhYmxlLS1s
aW1pdC1zdHJpbmcgKHN0cmluZyBwaXhlbHMgYnVmZmVyKQogICAod2hpbGUgKGFuZCAobGVuZ3Ro
PiBzdHJpbmcgMCkKLSAgICAgICAgICAgICAgKD4gKHN0cmluZy1waXhlbC13aWR0aCBzdHJpbmcp
IHBpeGVscykpCisgICAgICAgICAgICAgICg+IChzdHJpbmctcGl4ZWwtd2lkdGggc3RyaW5nIGJ1
ZmZlcikgcGl4ZWxzKSkKICAgICAoc2V0cSBzdHJpbmcgKHN1YnN0cmluZyBzdHJpbmcgMCAoMS0g
KGxlbmd0aCBzdHJpbmcpKSkpKQogICBzdHJpbmcpCiAKIChkZWZ1biB2dGFibGUtLWNoYXItd2lk
dGggKHRhYmxlKQotICAoc3RyaW5nLXBpeGVsLXdpZHRoIChwcm9wZXJ0aXplICJ4IiAnZmFjZSAo
dnRhYmxlLWZhY2UgdGFibGUpKSkpCisgIChzdHJpbmctcGl4ZWwtd2lkdGggKHByb3BlcnRpemUg
IngiICdmYWNlICh2dGFibGUtZmFjZSB0YWJsZSkpCisgICAgICAgICAgICAgICAgICAgICAgKHZ0
YWJsZS1idWZmZXIgdGFibGUpKSkKIAogKGRlZnVuIHZ0YWJsZS0tY29tcHV0ZS13aWR0aCAodGFi
bGUgc3BlYykKICAgKGNvbmQKQEAgLTkzNiw3ICs5NjIsNyBAQCB2dGFibGUtLWNvbXB1dGUtY2Fj
aGVkLWxpbmUKICAgICAgICA7OyBXZSBzdGFzaCB0aGUgY29tcHV0ZWQgd2lkdGggYW5kIHN0cmlu
ZyBoZXJlIC0tIGlmIHRoZXJlIGFyZQogICAgICAgIDs7IG5vIGZvcm1hdHRlcnMvZGlzcGxheWVy
cywgd2UnbGwgYmUgdXNpbmcgdGhlIHN0cmluZywgYW5kCiAgICAgICAgOzsgdGhlbiB3b24ndCBo
YXZlIHRvIHJlY3JlYXRlIGl0LgotICAgICAgIChsaXN0IHZhbHVlIChzdHJpbmctcGl4ZWwtd2lk
dGggc3RyaW5nKSBzdHJpbmcpKSkKKyAgICAgICAobGlzdCB2YWx1ZSAoc3RyaW5nLXBpeGVsLXdp
ZHRoIHN0cmluZyAodnRhYmxlLWJ1ZmZlciB0YWJsZSkpIHN0cmluZykpKQogICAgKHZ0YWJsZS1j
b2x1bW5zIHRhYmxlKSkpCiAKIChkZWZ1biB2dGFibGUtLW1ha2Uta2V5bWFwICh0YWJsZSkKQEAg
LTk2NywyMCArOTkzLDIyIEBAIHZ0YWJsZS0tbWFrZS1rZXltYXAKICAgICAgICAgICAodnRhYmxl
LWtleW1hcCB0YWJsZSkpCiAgICAgICBtYXApKSkKIAotKGRlZnVuIHZ0YWJsZS1yZXZlcnQgKCkK
LSAgIlJlZ2VuZXJhdGUgdGhlIHRhYmxlIHVuZGVyIHBvaW50LiIKLSAgKGxldCAoKHRhYmxlICh2
dGFibGUtY3VycmVudC10YWJsZSkpCi0gICAgICAgIChvYmplY3QgKHZ0YWJsZS1jdXJyZW50LW9i
amVjdCkpCi0gICAgICAgIChjb2x1bW4gKHZ0YWJsZS1jdXJyZW50LWNvbHVtbikpCi0gICAgICAg
IChpbmhpYml0LXJlYWQtb25seSB0KSkKLSAgICAodW5sZXNzIHRhYmxlCi0gICAgICAodXNlci1l
cnJvciAiTm8gdGFibGUgdW5kZXIgcG9pbnQiKSkKLSAgICAoZGVsZXRlLXJlZ2lvbiAodnRhYmxl
LWJlZ2lubmluZy1vZi10YWJsZSkgKHZ0YWJsZS1lbmQtb2YtdGFibGUpKQotICAgICh2dGFibGUt
aW5zZXJ0IHRhYmxlKQotICAgICh3aGVuIG9iamVjdAotICAgICAgKHZ0YWJsZS1nb3RvLW9iamVj
dCBvYmplY3QpKQotICAgICh3aGVuIGNvbHVtbgotICAgICAgKHZ0YWJsZS1nb3RvLWNvbHVtbiBj
b2x1bW4pKSkpCisoZGVmdW4gdnRhYmxlLXJldmVydCAoJm9wdGlvbmFsIHRhYmxlKQorICAiUmVn
ZW5lcmF0ZSBUQUJMRSwgZGVmYXVsdGluZyB0byB0aGUgdGFibGUgdW5kZXIgcG9pbnQuIgorICAo
c2V0cSB0YWJsZSAob3IgdGFibGUgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpCisgICh1bmxlc3Mg
dGFibGUKKyAgICAodXNlci1lcnJvciAiTm8gdGFibGUgdW5kZXIgcG9pbnQiKSkKKyAgKHdpdGgt
Y3VycmVudC1idWZmZXIgKHZ0YWJsZS1idWZmZXIgdGFibGUpCisgICAgKGxldCAoKG9iamVjdCAo
dnRhYmxlLWN1cnJlbnQtb2JqZWN0KSkKKyAgICAgICAgICAoY29sdW1uICh2dGFibGUtY3VycmVu
dC1jb2x1bW4pKQorICAgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KQorICAgICAgICAgIChp
bmhpYml0LW1vZGlmaWNhdGlvbi1ob29rcyB0KSkKKyAgICAgIChkZWxldGUtcmVnaW9uICh2dGFi
bGUtYmVnaW5uaW5nLW9mLXRhYmxlKSAodnRhYmxlLWVuZC1vZi10YWJsZSkpCisgICAgICAodnRh
YmxlLS1pbnNlcnQgdGFibGUpCisgICAgICAod2hlbiBvYmplY3QKKyAgICAgICAgKHZ0YWJsZS1n
b3RvLW9iamVjdCBvYmplY3QpKQorICAgICAgKHdoZW4gY29sdW1uCisgICAgICAgICh2dGFibGUt
Z290by1jb2x1bW4gY29sdW1uKSkpKSkKIAogOzs7IENvbW1hbmRzLgogCkBAIC0xMDA2LDE0ICsx
MDM0LDE0IEBAIHZ0YWJsZS1uYXJyb3ctY3VycmVudC1jb2x1bW4KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKC0gKCogKHZ0YWJsZS0tY2hhci13aWR0aCB0YWJsZSkgKG9yIG4gMSkp
KSkpKQogCiAoZGVmdW4gdnRhYmxlLS1hbHRlci1jb2x1bW4td2lkdGggKHRhYmxlIGNvbHVtbiBk
ZWx0YSkKLSAgKGxldCAoKHdpZHRocyAodnRhYmxlLS1jYWNoZS13aWR0aHMgKHZ0YWJsZS0tY3Vy
cmVudC1jYWNoZSkpKSkKKyAgKGxldCAoKHdpZHRocyAodnRhYmxlLS1jYWNoZS13aWR0aHMgKHZ0
YWJsZS0tY3VycmVudC1jYWNoZSB0YWJsZSkpKSkKICAgICAoc2V0ZiAoYXJlZiB3aWR0aHMgY29s
dW1uKQogICAgICAgICAgIChtYXggKCogKHZ0YWJsZS0tY2hhci13aWR0aCB0YWJsZSkgMikKICAg
ICAgICAgICAgICAgICgrIChhcmVmIHdpZHRocyBjb2x1bW4pIGRlbHRhKSkpCiAgICAgOzsgU3Rv
cmUgdGhlIHdpZHRoIHNvIGl0J2xsIGJlIHJlc3BlY3RlZCBvbiBhIHJldmVydC4KICAgICAoc2V0
ZiAodnRhYmxlLWNvbHVtbi13aWR0aCAoZWx0ICh2dGFibGUtY29sdW1ucyB0YWJsZSkgY29sdW1u
KSkKICAgICAgICAgICAoZm9ybWF0ICIlZHB4IiAoYXJlZiB3aWR0aHMgY29sdW1uKSkpCi0gICAg
KHZ0YWJsZS1yZXZlcnQpKSkKKyAgICAodnRhYmxlLXJldmVydCB0YWJsZSkpKQogCiAoZGVmdW4g
dnRhYmxlLXdpZGVuLWN1cnJlbnQtY29sdW1uICgmb3B0aW9uYWwgbikKICAgIldpZGVuIHRoZSBj
dXJyZW50IGNvbHVtbiBieSBOIGNoYXJhY3RlcnMuCkBAIC0xMDI4LDI0ICsxMDU2LDI5IEBAIHZ0
YWJsZS1wcmV2aW91cy1jb2x1bW4KICAgKGludGVyYWN0aXZlKQogICAodnRhYmxlLWdvdG8tY29s
dW1uCiAgICAobWF4IDAgKDEtIChvciAodnRhYmxlLWN1cnJlbnQtY29sdW1uKQotICAgICAgICAg
ICAgICAgICAgKGxlbmd0aCAodnRhYmxlLS1jYWNoZS13aWR0aHMgKHZ0YWJsZS0tY3VycmVudC1j
YWNoZSkpKSkpKSkpCisgICAgICAgICAgICAgICAgICAobGVuZ3RoICh2dGFibGUtLWNhY2hlLXdp
ZHRocworICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY3VycmVudC1jYWNoZSAo
dnRhYmxlLWN1cnJlbnQtdGFibGUpKSkpKSkpKSkKIAogKGRlZnVuIHZ0YWJsZS1uZXh0LWNvbHVt
biAoKQogICAiR28gdG8gdGhlIG5leHQgY29sdW1uLiIKICAgKGludGVyYWN0aXZlKQogICAod2hl
biAodnRhYmxlLWN1cnJlbnQtY29sdW1uKQogICAgICh2dGFibGUtZ290by1jb2x1bW4KLSAgICAg
KG1pbiAoMS0gKGxlbmd0aCAodnRhYmxlLS1jYWNoZS13aWR0aHMgKHZ0YWJsZS0tY3VycmVudC1j
YWNoZSkpKSkKKyAgICAgKG1pbiAoMS0gKGxlbmd0aCAodnRhYmxlLS1jYWNoZS13aWR0aHMKKyAg
ICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY3VycmVudC1jYWNoZSAodnRhYmxlLWN1cnJl
bnQtdGFibGUpKSkpKQogICAgICAgICAgICgxKyAodnRhYmxlLWN1cnJlbnQtY29sdW1uKSkpKSkp
CiAKLShkZWZ1biB2dGFibGUtcmV2ZXJ0LWNvbW1hbmQgKCkKLSAgIlJlLXF1ZXJ5IGRhdGEgYW5k
IHJlZ2VuZXJhdGUgdGhlIHRhYmxlIHVuZGVyIHBvaW50LiIKKyhkZWZ1biB2dGFibGUtcmV2ZXJ0
LWNvbW1hbmQgKCZvcHRpb25hbCB0YWJsZSkKKyAgIlJlLXF1ZXJ5IGRhdGEgYW5kIHJlZ2VuZXJh
dGUgVEFCTEUuCitJZiBUQUJMRSBpcyBuaWwsIHVzZSB0aGUgdGFibGUgdW5kZXIgcG9pbnQuIgog
ICAoaW50ZXJhY3RpdmUpCi0gIChsZXQgKCh0YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKSkK
LSAgICAod2hlbiAodnRhYmxlLW9iamVjdHMtZnVuY3Rpb24gdGFibGUpCi0gICAgICAoc2V0ZiAo
dnRhYmxlLW9iamVjdHMgdGFibGUpIChmdW5jYWxsICh2dGFibGUtb2JqZWN0cy1mdW5jdGlvbiB0
YWJsZSkpKSkKLSAgICAodnRhYmxlLS1jbGVhci1jYWNoZSB0YWJsZSkpCi0gICh2dGFibGUtcmV2
ZXJ0KSkKKyAgKHNldHEgdGFibGUgKG9yIHRhYmxlICh2dGFibGUtY3VycmVudC10YWJsZSkpKQor
ICAodW5sZXNzIHRhYmxlCisgICAgKHVzZXItZXJyb3IgIk5vIHRhYmxlIGZvdW5kIikpCisgICh3
aGVuICh2dGFibGUtb2JqZWN0cy1mdW5jdGlvbiB0YWJsZSkKKyAgICAoc2V0ZiAodnRhYmxlLW9i
amVjdHMgdGFibGUpIChmdW5jYWxsICh2dGFibGUtb2JqZWN0cy1mdW5jdGlvbiB0YWJsZSkpKSkK
KyAgKHZ0YWJsZS0tY2xlYXItY2FjaGUgdGFibGUpCisgICh2dGFibGUtcmV2ZXJ0IHRhYmxlKSkK
IAogKGRlZnVuIHZ0YWJsZS1zb3J0LWJ5LWN1cnJlbnQtY29sdW1uICgpCiAgICJTb3J0IHRoZSB0
YWJsZSB1bmRlciBwb2ludCBieSB0aGUgY29sdW1uIHVuZGVyIHBvaW50LiIKQEAgLTEwNjcsOCAr
MTEwMCw4IEBAIHZ0YWJsZS1zb3J0LWJ5LWN1cnJlbnQtY29sdW1uCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGlmIChlcSAoY2RyIGxhc3QpICdhc2NlbmQpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXNjZW5kCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAnYXNjZW5kKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAnYXNjZW5kKSkpKSkpCi0gICh2dGFibGUtcmV2ZXJ0KSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgJ2FzY2VuZCkpKSkpCisgICAgKHZ0YWJsZS1yZXZlcnQgdGFibGUpKSkKIAog
KGRlZnVuIHZ0YWJsZS1oZWFkZXItbGluZS1zb3J0IChlKQogICAiU29ydCBhIHZ0YWJsZSBmcm9t
IHRoZSBoZWFkZXIgbGluZS4iCmRpZmYgLS1naXQgYS90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFi
bGUtdGVzdHMuZWwgYi90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMuZWwKaW5kZXgg
NzRmYjhjYzgxMzkuLmUwMzI4ZTMxYmM1IDEwMDY0NAotLS0gYS90ZXN0L2xpc3AvZW1hY3MtbGlz
cC92dGFibGUtdGVzdHMuZWwKKysrIGIvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3Rz
LmVsCkBAIC0yNywxNiArMjcsMTkgQEAKIChyZXF1aXJlICdlcnQpCiAocmVxdWlyZSAnZXJ0LXgp
CiAKLShlcnQtZGVmdGVzdCB0ZXN0LXZzdGFibGUtY29tcHV0ZS1jb2x1bW5zICgpCisoZGVmdW4g
dnRhYmxlLXRlc3RzLS1tYWtlLW5vLWhlYWRlci0yLW9iamVjdC10YWJsZSAoKQorICAobWFrZS12
dGFibGUgOmNvbHVtbnMgJygiYSIgImIiICJjIikKKyAgICAgICAgICAgICAgIDpvYmplY3RzICco
KCJmb28iIDEgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiYXIiIDMgOnpvdCkpCisg
ICAgICAgICAgICAgICA6aW5zZXJ0IG5pbCkpCisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1j
b21wdXRlLWNvbHVtbnMgKCkKICAgKHNob3VsZAogICAgKGVxdWFsIChtYXBjYXIKICAgICAgICAg
ICAgKGxhbWJkYSAoY29sdW1uKQogICAgICAgICAgICAgICh2dGFibGUtY29sdW1uLWFsaWduIGNv
bHVtbikpCiAgICAgICAgICAgICh2dGFibGUtLWNvbXB1dGUtY29sdW1ucwotICAgICAgICAgICAg
KG1ha2UtdnRhYmxlIDpjb2x1bW5zICcoImEiICJiIiAiYyIpCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgOm9iamVjdHMgJygoImZvbyIgMSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKCJiYXIiIDMgOnpvdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgOmluc2Vy
dCBuaWwpKSkKKyAgICAgICAgICAgICh2dGFibGUtdGVzdHMtLW1ha2Utbm8taGVhZGVyLTItb2Jq
ZWN0LXRhYmxlKSkpCiAgICAgICAgICAgJyhsZWZ0IHJpZ2h0IGxlZnQpKSkpCiAKIChlcnQtZGVm
dGVzdCB0ZXN0LXZ0YWJsZS1pbnNlcnQtb2JqZWN0ICgpCkBAIC02OSw0ICs3Miw3NSBAQCB0ZXN0
LXZ0YWJsZS1pbnNlcnQtb2JqZWN0CiAgICAgICAgICAgICAgIChtYXBjYXIgIydjYWRyICh2dGFi
bGUtb2JqZWN0cyB0YWJsZSkpKSkKICAgICAgICAgICAobnVtYmVyLXNlcXVlbmNlIDAgMTEpKSkp
CiAKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS11bmlxdWUtYnVmZmVyICgpCisgIChsZXQgKCh0
YWJsZSAodnRhYmxlLXRlc3RzLS1tYWtlLW5vLWhlYWRlci0yLW9iamVjdC10YWJsZSkpKQorICAg
ICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAodnRhYmxlLWluc2VydCB0YWJsZSkKKyAgICAgICh3
aXRoLXRlbXAtYnVmZmVyCisgICAgICAgIChzaG91bGQtZXJyb3IgKHZ0YWJsZS1pbnNlcnQgdGFi
bGUpKSkKKyAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAgICh2dGFibGUtc2V0LWJ1ZmZl
ciB0YWJsZSAoY3VycmVudC1idWZmZXIpKQorICAgICAgICAodnRhYmxlLWluc2VydCB0YWJsZSkp
KSkpCisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1yZWFkLW9ubHktYnVmZmVyICgpCisgIChs
ZXQgKCh0YWJsZSAodnRhYmxlLXRlc3RzLS1tYWtlLW5vLWhlYWRlci0yLW9iamVjdC10YWJsZSkp
KQorICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAoc2V0cSBidWZmZXItcmVhZC1vbmx5IHQp
CisgICAgICAodnRhYmxlLWluc2VydCB0YWJsZSkpKSkKKworKGVydC1kZWZ0ZXN0IHRlc3QtdnRh
YmxlLW5vbi1jdXJyZW50LWJ1ZmZlci1pbnNlcnQtb2JqZWN0ICgpCisgIChsZXQgKCh0YWJsZSAo
dnRhYmxlLXRlc3RzLS1tYWtlLW5vLWhlYWRlci0yLW9iamVjdC10YWJsZSkpCisgICAgICAgIChv
YmogJygiYmF6IiA0IDUpKSkKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgKHZ0YWJsZS1p
bnNlcnQgdGFibGUpCisgICAgICAoc2hvdWxkICg9IChjb3VudC1saW5lcyAocG9pbnQtbWluKSAo
cG9pbnQtbWF4KSkgMikpCisgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgICAodnRhYmxl
LWluc2VydC1vYmplY3QgdGFibGUgb2JqKSkKKyAgICAgIChzaG91bGQgKD0gKGNvdW50LWxpbmVz
IChwb2ludC1taW4pIChwb2ludC1tYXgpKSAzKSkpKSkKKworKGVydC1kZWZ0ZXN0IHRlc3QtdnRh
YmxlLW5vbi1jdXJyZW50LWJ1ZmZlci1yZW1vdmUtb2JqZWN0ICgpCisgIChsZXQgKCh0YWJsZSAo
dnRhYmxlLXRlc3RzLS1tYWtlLW5vLWhlYWRlci0yLW9iamVjdC10YWJsZSkpCisgICAgICAgIChv
YmogJygiYmF6IiA0IDUpKSkKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgKHZ0YWJsZS1p
bnNlcnQgdGFibGUpCisgICAgICAodnRhYmxlLWluc2VydC1vYmplY3QgdGFibGUgb2JqKQorICAg
ICAgKHNob3VsZCAoPSAoY291bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpIDMpKQor
ICAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAgKHZ0YWJsZS1yZW1vdmUtb2JqZWN0IHRh
YmxlIG9iaikpCisgICAgICAoc2hvdWxkICg9IChjb3VudC1saW5lcyAocG9pbnQtbWluKSAocG9p
bnQtbWF4KSkgMikpKSkpCisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1i
dWZmZXItdXBkYXRlLW9iamVjdCAoKQorICAobGV0ICgodGFibGUgKHZ0YWJsZS10ZXN0cy0tbWFr
ZS1uby1oZWFkZXItMi1vYmplY3QtdGFibGUpKQorICAgICAgICAob2JqICcoImJheiIgNCA1KSkK
KyAgICAgICAgKG9iai0yICcoInF1eCIgNiA3KSkpCisgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAg
ICAgICh2dGFibGUtaW5zZXJ0IHRhYmxlKQorICAgICAgKHZ0YWJsZS1pbnNlcnQtb2JqZWN0IHRh
YmxlIG9iaikKKyAgICAgIChzaG91bGQgKD0gKGNvdW50LWxpbmVzIChwb2ludC1taW4pIChwb2lu
dC1tYXgpKSAzKSkKKyAgICAgIChsZXQgKChsaW5lLTIgKHByb2duCisgICAgICAgICAgICAgICAg
ICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICAgICAgICAgICAgICAgICAoZm9y
d2FyZC1saW5lIDIpCisgICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBv
aW50KSAocG9pbnQtbWF4KSkpKSkKKyAgICAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAg
ICAodnRhYmxlLXVwZGF0ZS1vYmplY3QgdGFibGUgb2JqLTIgb2JqKSkKKyAgICAgICAgKGxldCAo
KGxpbmUtMi1uZXcgKHByb2duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hh
ciAocG9pbnQtbWluKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9yd2FyZC1saW5l
IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50
KSAocG9pbnQtbWF4KSkpKSkKKyAgICAgICAgICAoc2hvdWxkICg9IChjb3VudC1saW5lcyAocG9p
bnQtbWluKSAocG9pbnQtbWF4KSkgMykpCisgICAgICAgICAgKHNob3VsZCAobm90IChzdHJpbmc9
IGxpbmUtMiBsaW5lLTItbmV3KSkpKSkpKSkKKworKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLS1s
aW1pdC1zdHJpbmctd2l0aC1mYWNlLXJlbWFwcGVkLWJ1ZmZlciAoKQorICAod2l0aC10ZW1wLWJ1
ZmZlcgorICAgIChsZXQgKCh0ZXh0IChwcm9wZXJ0aXplICJYWFhYWCIKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAnZmFjZSAndmFyaWFibGUtcGl0Y2gpKSkKKyAgICAgIChmYWNlLXJlbWFw
LWFkZC1yZWxhdGl2ZSAnZGVmYXVsdCA6aGVpZ2h0IDEuNSkKKyAgICAgIChpZiAoPiBlbWFjcy1t
YWpvci12ZXJzaW9uIDMwKQorICAgICAgICAgIChzaG91bGQgKGVxCisgICAgICAgICAgICAgICAg
ICAgMgorICAgICAgICAgICAgICAgICAgIChsZW5ndGggKHZ0YWJsZS0tbGltaXQtc3RyaW5nIHRl
eHQgNTAgKGN1cnJlbnQtYnVmZmVyKSkpKSkKKyAgICAgICAgKHNob3VsZCAoZXEKKyAgICAgICAg
ICAgICAgICAgMgorICAgICAgICAgICAgICAgICAobGVuZ3RoICh2dGFibGUtLWxpbWl0LXN0cmlu
ZyB0ZXh0IDUwKSkpKSkpKSkKKwogOzs7IHZ0YWJsZS10ZXN0cy5lbCBlbmRzIGhlcmUKLS0gCjIu
NDcuMQoK
--000000000000bc39a50645b38899--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 11 Dec 2025 19:46:21 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 11 14:46:21 2025
Received: from localhost ([127.0.0.1]:47918 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vTmcF-0005dP-Ss
	for submit <at> debbugs.gnu.org; Thu, 11 Dec 2025 14:46:21 -0500
Received: from mxout5.mail.janestreet.com ([64.215.233.18]:34531)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <sbaugh@HIDDEN>)
 id 1vTmcC-0005d9-Ej
 for 79982 <at> debbugs.gnu.org; Thu, 11 Dec 2025 14:46:17 -0500
From: Spencer Baugh <sbaugh@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer
 slot, [PATCH] Add vtable buffer slot
In-Reply-To: <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
 (=?utf-8?Q?=22St=C3=A9phane?= Marks"'s message of "Thu, 11 Dec 2025
 14:31:26 -0500")
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
 <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
Date: Thu, 11 Dec 2025 14:46:10 -0500
Message-ID: <ier8qf8ssxp.fsf_-_@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com;
 s=waixah; t=1765482370;
 bh=W+zQQDdDqUsnN6BBzZEmmrBOhzI78ugZVOvMg02VvSo=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date;
 b=cdspD3LoVAlmTK2mftPHw0tu6oUCBJNkCPVJqOwZex+2+BnKSEMy8/GyqD4VbJAYN
 +as//F8xSmykfY+OyxaGEa3iOZhLKO4UZjqfE0LUaA2Qec2X7pAob7bPldFvtjwc1T
 bpXCwVGvqdYpYIFk2D3TVjIP7PYQZQdT9AUFntDUITvV/M76Ar7K2nlyOJxPF4B8jT
 0yvVUrujiqtXjGhr5VDoCh9QqQaDS1xwjeOTwlGj3HBZIzZH+jNPW0jQ35fAu+fVVl
 KMP+zVX+bqh3dDabFcM+Xr7CEDTDbWi+xUwfEh4iB/fq8M9E8KPd+zJHMlPvkxssz2
 ucxZqhHJyoVEA==
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

St=C3=A9phane Marks <shipmints@HIDDEN> writes:

> On Thu, Dec 11, 2025 at 1:23=E2=80=AFPM Spencer Baugh <sbaugh@janestreet.=
com> wrote:
>  > +    (let* ((cache (vtable--current-cache table))
>  > +           (inhibit-read-only t)
>  > +           (lines (vtable--cache-lines cache))
>  > +           (elem (if location  ; This binding mirrors the binding of =
`pos' above.
>  > +                     (if (integerp location)
>  > +                         (nth location lines)
>  > +                       (or (assq location lines)
>  > +                           (and before (car lines))))
>  > +                   (if before (car lines))))
>  > +           (pos (memq elem lines))
>  > +           (line (cons object (vtable--compute-cached-line table obje=
ct))))
>  > +      (with-current-buffer (vtable-buffer table)
>  > +        (save-excursion
>  > +          (vtable-goto-table table)
>  > +          (let* ((ellipsis (if (vtable-ellipsis table)
>  > +                               (propertize (truncate-string-ellipsis)
>  > +                                           'face (vtable-face table))
>  > +                             ""))
>  > +                 (ellipsis-width (string-pixel-width ellipsis (curren=
t-buffer)))
>
>  Can we move these let-bindings out to the outer let-binding now?
>
> I'd prefer if they stay close to where they're being used, at least here,=
 where the cache update is clearly separate from the buffer
> update.

Good point.  Actually, so these bindings actually probably should be in
the same let-binding as (let ((start (point))) ...), a few lines later.
Since they're only used in that part of the code.

>  > + (keymap (get-text-property (point) 'keymap)))
>
>  I guess we could get this from vtable-keymap now?  In which case it can
>  also move to the outer let-binding?
>
> It would have to be from the -cached-keymap slot.  Let's leave the keymap=
s as is for the time being.  We have patches to refine
> and expand their functionality coming.

That's fair, but I think if we move these let-bindings down to the (let
((start (point)))) binding, that avoids reindenting the rest of this
function.  Which makes this diff much smaller, which is nice.

> From 4505c63efaa9ce124a57c79317533fa3f0298f2c Mon Sep 17 00:00:00 2001
> From: =3D?UTF-8?q?St=3DC3=3DA9phane=3D20Marks?=3D <shipmints@HIDDEN>
> Date: Wed, 10 Dec 2025 09:20:02 -0500
> Subject: [PATCH] Add vtable buffer slot
>
> This solves for background vtable mutations, i.e., updates
> initiated from buffers other than the vtable buffer, and for
> buffer-adjusted string-pixel-width computations.
>
> * lisp/emacs-lisp/vtable.el (vtable): New '-buffer' slot.
> (vtable-buffer):
> (vtable-set-buffer): New function.
> (vtable-update-object):
> (vtable-remove-object):
> (vtable-insert-object): Wrap operation with the vtable buffer.
> (vtable--insert): Split from old 'vtable-insert'.
> (vtable-insert): Insert table and record the buffer.
> (vtable--insert-line):
> (vtable--insert-header-line): Use 'vtable-buffer' for pixel-width computa=
tion.
> (vtable--limit-string):
> (vtable--char-width): Pass buffer to 'string-pixel-width'.
> (vtable-revert): New optional table argument.
> (vtable--alter-column-width):
> (vtable-revert-command):
> (vtable-sort-by-current-column): Call 'vtable-revert' with the table.
>
> * test/lisp/emacs-lisp/vtable-tests.el
> (vtable-tests--make-no-header-2-object-table): New helper
> function.
> (test-vstable-compute-columns): Correct typo in test name.  Use
> new helper function.
> (test-vtable-unique-buffer)
> (test-vtable-non-current-buffer-insert-object)
> (test-vtable-non-current-buffer-remove-object)
> (test-vtable-non-current-buffer-update-object)
> (test-vtable--limit-string-with-face-remapped-buffer): New test.
> ---
>  lisp/emacs-lisp/vtable.el            | 274 +++++++++++++++------------
>  test/lisp/emacs-lisp/vtable-tests.el |  78 +++++++-
>  2 files changed, 221 insertions(+), 131 deletions(-)
>
> diff --git a/lisp/emacs-lisp/vtable.el b/lisp/emacs-lisp/vtable.el
> index bcdd280fb92..ccdde49830e 100644
> --- a/lisp/emacs-lisp/vtable.el
> +++ b/lisp/emacs-lisp/vtable.el
> @@ -67,8 +67,10 @@ vtable
>     (ellipsis :initarg :ellipsis :accessor vtable-ellipsis)
>     (column-colors :initarg :column-colors :accessor vtable-column-colors)
>     (row-colors :initarg :row-colors :accessor vtable-row-colors)
> +   (buffer :initform nil :accessor vtable-buffer)
>     (-cached-colors :initform nil)
>     (-cache :initform (make-hash-table :test #'equal))
> +   (-current-cache :initform nil :accessor vtable--current-cache)
>     (-cached-keymap :initform nil)
>     (-has-column-spec :initform nil))
>    "An object to hold the data for a table.")
> @@ -301,14 +303,14 @@ vtable-update-object
>        (unless (cdr objects)
>          (error "Can't find the old object"))
>        (setcar (cdr objects) object))
> -    ;; Then update the rendered vtable in the current buffer.
> -    (if-let* ((cache (vtable--current-cache))
> -             (line-number (seq-position (vtable--cache-lines cache)
> -                                        old-object
> -                                        (lambda (a b)
> -                                          (equal (car a) b))))
> -             (line (elt (vtable--cache-lines cache) line-number)))
> -        (progn
> +    ;; Then update the rendered vtable in its buffer.
> +    (if-let* ((cache (vtable--current-cache table))
> +              (line-number (seq-position (vtable--cache-lines cache)
> +                                         old-object
> +                                         (lambda (a b)
> +                                           (equal (car a) b))))
> +              (line (elt (vtable--cache-lines cache) line-number)))
> +        (with-current-buffer (vtable-buffer table)
>            (setcar line object)
>            (setcdr line (vtable--compute-cached-line table object))
>            ;; ... and redisplay the line in question.
> @@ -321,8 +323,7 @@ vtable-update-object
>                                     (vtable--cache-widths cache)
>                                     (vtable--spacer table))
>                (add-text-properties start (point) (list 'keymap keymap
> -                                                       'vtable table
> -                                                       'vtable-cache cac=
he))))
> +                                                       'vtable table))))
>            ;; We may have inserted a non-numerical value into a previously
>            ;; all-numerical table, so recompute.
>            (vtable--recompute-numerical table (cdr line)))
> @@ -334,14 +335,15 @@ vtable-remove-object
>    ;; First remove from the objects.
>    (setf (vtable-objects table) (delq object (vtable-objects table)))
>    ;; Then adjust the cache and display.
> -  (save-excursion
> -    (vtable-goto-table table)
> -    (let ((cache (vtable--current-cache))
> -          (inhibit-read-only t))
> -      (setcar cache (delq (assq object (vtable--cache-lines cache))
> -                          (vtable--cache-lines cache)))
> -      (when (vtable-goto-object object)
> -        (delete-line)))))
> +  (with-current-buffer (vtable-buffer table)
> +    (save-excursion
> +      (vtable-goto-table table)
> +      (let ((cache (vtable--current-cache table))
> +            (inhibit-read-only t))
> +        (setcar cache (delq (assq object (vtable--cache-lines cache))
> +                            (vtable--cache-lines cache)))
> +        (when (vtable-goto-object object)
> +          (delete-line))))))
>=20=20
>  ;; FIXME: The fact that the `location' argument of
>  ;; `vtable-insert-object' can be an integer and is then interpreted as
> @@ -369,8 +371,9 @@ vtable-insert-object
>        (progn
>          (setf (vtable-objects table) (list object))
>          (vtable--recompute-numerical table (vtable--compute-cached-line =
table object))
> -        (vtable-goto-table table)
> -        (vtable-revert-command))
> +        (with-current-buffer (vtable-buffer table)
> +          (vtable-goto-table table)
> +          (vtable-revert-command)))
>      ;; First insert into the objects.
>      (let ((pos (if location
>                     (if (integerp location)
> @@ -398,56 +401,57 @@ vtable-insert-object
>            ;; Otherwise, append the object.
>            (nconc (vtable-objects table) (list object)))))
>      ;; Then adjust the cache and display.
> -    (save-excursion
> -      (vtable-goto-table table)
> -      (let* ((cache (vtable--current-cache))
> -             (inhibit-read-only t)
> -             (keymap (get-text-property (point) 'keymap))
> -             (ellipsis (if (vtable-ellipsis table)
> -                           (propertize (truncate-string-ellipsis)
> -                                       'face (vtable-face table))
> -                         ""))
> -             (ellipsis-width (string-pixel-width ellipsis))
> -             (lines (vtable--cache-lines cache))
> -             (elem (if location  ; This binding mirrors the binding of `=
pos' above.
> -                       (if (integerp location)
> -                           (nth location lines)
> -                         (or (assq location lines)
> -                             (and before (car lines))))
> -                     (if before (car lines))))
> -             (pos (memq elem lines))
> -             (line (cons object (vtable--compute-cached-line table objec=
t))))
> -        (if (or before
> -                (and pos (integerp location)))
> -            ;; Add the new object before:.
> -            (let ((old-line (car pos)))
> -              (setcar pos line)
> -              (setcdr pos (cons old-line (cdr pos)))
> -              (unless (vtable-goto-object (car elem))
> -                (vtable-beginning-of-table)))
> -          ;; Otherwise, add the object after.
> -          (if pos
> -              ;; Splice the object into the list.
> -              (progn
> -                (setcdr pos (cons line (cdr pos)))
> -                (if (vtable-goto-object location)
> -                    (forward-line 1)  ; Insert *after*.
> -                  (vtable-end-of-table)))
> -            ;; Otherwise, append the object.
> -            (setcar cache (nconc lines (list line)))
> -            (vtable-end-of-table)))
> -        (let ((start (point)))
> -          ;; FIXME: We have to adjust colors in lines below this if we
> -          ;; have :row-colors.
> -          (vtable--insert-line table line 0
> -                               (vtable--cache-widths cache) (vtable--spa=
cer table)
> -                               ellipsis ellipsis-width)
> -          (add-text-properties start (point) (list 'keymap keymap
> -                                                   'vtable table
> -                                                   'vtable-cache cache)))
> -        ;; We may have inserted a non-numerical value into a previously
> -        ;; all-numerical table, so recompute.
> -        (vtable--recompute-numerical table (cdr line))))))
> +    (let* ((cache (vtable--current-cache table))
> +           (inhibit-read-only t)
> +           (lines (vtable--cache-lines cache))
> +           (elem (if location  ; This binding mirrors the binding of `po=
s' above.
> +                     (if (integerp location)
> +                         (nth location lines)
> +                       (or (assq location lines)
> +                           (and before (car lines))))
> +                   (if before (car lines))))
> +           (pos (memq elem lines))
> +           (line (cons object (vtable--compute-cached-line table object)=
)))
> +      (with-current-buffer (vtable-buffer table)
> +        (save-excursion
> +          (vtable-goto-table table)
> +          (let* ((ellipsis (if (vtable-ellipsis table)
> +                               (propertize (truncate-string-ellipsis)
> +                                           'face (vtable-face table))
> +                             ""))
> +                 (ellipsis-width (string-pixel-width ellipsis (current-b=
uffer)))
> +                 (keymap (get-text-property (point) 'keymap)))
> +            (if (or before
> +                    (and pos (integerp location)))
> +                ;; Add the new object before:.
> +                (let ((old-line (car pos)))
> +                  (setcar pos line)
> +                  (setcdr pos (cons old-line (cdr pos)))
> +                  (unless (vtable-goto-object (car elem))
> +                    (vtable-beginning-of-table)))
> +              ;; Otherwise, add the object after.
> +              (if pos
> +                  ;; Splice the object into the list.
> +                  (progn
> +                    (setcdr pos (cons line (cdr pos)))
> +                    (if (vtable-goto-object location)
> +                        (forward-line 1)  ; Insert *after*.
> +                      (vtable-end-of-table)))
> +                ;; Otherwise, append the object.
> +                (setcar cache (nconc lines (list line)))
> +                (vtable-end-of-table)))
> +            (let ((start (point)))
> +              ;; FIXME: We have to adjust colors in lines below this if =
we
> +              ;; have :row-colors.
> +              (vtable--insert-line table line 0
> +                                   (vtable--cache-widths cache)
> +                                   (vtable--spacer table)
> +                                   ellipsis ellipsis-width)
> +              (add-text-properties start (point) (list 'keymap keymap
> +                                                       'vtable table)))
> +            ;; We may have inserted a non-numerical value into a previou=
sly
> +            ;; all-numerical table, so recompute.
> +            (vtable--recompute-numerical table (cdr line))))))))
>=20=20
>  (defun vtable-column (table index)
>    "Return the name of the INDEXth column in TABLE."
> @@ -520,14 +524,14 @@ vtable--cache-widths
>  (defun vtable--cache-lines (cache)
>    (car cache))
>=20=20
> -(defun vtable-insert (table)
> +(defun vtable--insert (table)
>    (let* ((spacer (vtable--spacer table))
>           (start (point))
>           (ellipsis (if (vtable-ellipsis table)
>                         (propertize (truncate-string-ellipsis)
>                                     'face (vtable-face table))
>                       ""))
> -         (ellipsis-width (string-pixel-width ellipsis))
> +         (ellipsis-width (string-pixel-width ellipsis (vtable-buffer tab=
le)))
>           ;; We maintain a cache per screen/window width, so that we rend=
er
>           ;; correctly if Emacs is open on two different screens (or the
>           ;; user resizes the frame).
> @@ -549,8 +553,7 @@ vtable-insert
>          (add-text-properties start (point)
>                               (list 'keymap vtable-header-line-map
>                                     'rear-nonsticky t
> -                                   'vtable table
> -                                   'vtable-cache cache))
> +                                   'vtable table))
>          (setq start (point))))
>      (vtable--sort table cache)
>      ;; Insert the data.
> @@ -561,13 +564,29 @@ vtable-insert
>          (setq line-number (1+ line-number))))
>      (add-text-properties start (point)
>                           (list 'rear-nonsticky t
> -                               'vtable table
> -                               'vtable-cache cache))
> +                               'vtable table))
> +    (setf (vtable--current-cache table) cache)
>      (goto-char start)))
>=20=20
> +(defun vtable-insert (table)
> +  "Insert TABLE into the current buffer.
> +The current buffer will be recorded as TABLE's buffer.  If the table is
> +inserted into a buffer other than its originating buffer, signal an
> +error.  A table may be reinserted into its own buffer, but insert only
> +one instance per buffer.  This restriction needs to be enforced by the
> +caller."
> +  (and-let* ((table-buffer (vtable-buffer table))
> +             (not (eq table-buffer (current-buffer))))
> +    (error "A vtable cannot be inserted into more than one buffer"))
> +  (setf (vtable-buffer table) (current-buffer))
> +  (let ((inhibit-read-only t)
> +        (inhibit-modification-hooks t))

Hm, why do we need these inhibit-read-only and
inhibit-modification-hooks?  Those are new, right?  They make sense,
though.  Could we cover it with a test?

> +    (vtable--insert table)))
> +
>  (defun vtable--insert-line (table line line-number widths spacer
>                                    &optional ellipsis ellipsis-width)
>    (let ((start (point))
> +        (buffer (vtable-buffer table))
>          (columns (vtable-columns table))
>          (column-colors
>           (and (vtable-column-colors table)
> @@ -607,16 +626,18 @@ vtable--insert-line
>                        (concat
>                         (vtable--limit-string
>                          pre-computed (- (elt widths index)
> -                                        (or ellipsis-width 0)))
> +                                        (or ellipsis-width 0))
> +                        buffer)
>                         ellipsis)
>                      pre-computed))
>                   ;; Recompute widths.
>                   (t
> -                  (if (> (string-pixel-width value) (elt widths index))
> +                  (if (> (string-pixel-width value buffer) (elt widths i=
ndex))
>                        (concat
>                         (vtable--limit-string
>                          value (- (elt widths index)
> -                                 (or ellipsis-width 0)))
> +                                 (or ellipsis-width 0))
> +                        buffer)
>                         ellipsis)
>                      value))))
>                 (start (point))
> @@ -630,14 +651,15 @@ vtable--insert-line
>                            (list 'space
>                                  :width (list
>                                          (+ (- (elt widths index)
> -                                              (string-pixel-width displa=
yed))
> +                                              (string-pixel-width
> +                                               displayed buffer))
>                                             (if last 0 spacer)))))))
>               ;; Align to the right.
>               (insert (propertize " " 'display
>                                   (list 'space
>                                         :width (list (- (elt widths index)
>                                                         (string-pixel-wid=
th
> -                                                        displayed)))))
> +                                                        displayed buffer=
)))))
>                       displayed)
>               (unless last
>                 (insert (propertize " " 'display
> @@ -664,16 +686,6 @@ vtable--insert-line
>  (defun vtable--cache-key ()
>    (cons (frame-terminal) (window-width)))
>=20=20
> -(defun vtable--current-cache ()
> -  "Return the current cache for the table at point.
> -
> -In `vtable-insert', the lines and widths of the vtable text are computed
> -based on the current selected frame and window and stored in a cache.
> -Subsequent interaction with the text of the vtable should use that cache
> -via this function rather than by calling `vtable--cache-key' to look up
> -the cache."
> -  (get-text-property (point) 'vtable-cache))
> -
>  (defun vtable--clear-cache (table)
>    (setf (gethash (vtable--cache-key) (slot-value table '-cache)) nil))
>=20=20
> @@ -718,6 +730,7 @@ vtable--indicator
>  (defun vtable--insert-header-line (table widths spacer)
>    ;; Insert the header directly into the buffer.
>    (let ((start (point))
> +        (buffer (vtable-buffer table))
>          (divider (vtable-divider table))
>          (cmap (define-keymap
>                  "<header-line> <drag-mouse-1>" #'vtable--drag-resize-col=
umn
> @@ -737,14 +750,15 @@ vtable--insert-header-line
>                       'keymap cmap))
>                (start (point))
>                (indicator (vtable--indicator table index))
> -              (indicator-width (string-pixel-width indicator))
> +              (indicator-width (string-pixel-width indicator buffer))
>                (last (=3D index (1- (length (vtable-columns table)))))
>                displayed)
>           (setq displayed
> -               (if (> (string-pixel-width name)
> +               (if (> (string-pixel-width name buffer)
>                        (- (elt widths index) indicator-width))
>                     (vtable--limit-string
> -                    name (- (elt widths index) indicator-width))
> +                    name (- (elt widths index) indicator-width)
> +                    buffer)
>                   name))
>           (let* ((indicator-lead-width
>                   ;; We want the indicator to not be quite flush right.
> @@ -753,7 +767,7 @@ vtable--insert-header-line
>                                          indicator-lead-width))
>                  (fill-width
>                   (+ (- (elt widths index)
> -                       (string-pixel-width displayed)
> +                       (string-pixel-width displayed buffer)
>                         indicator-width
>                         indicator-lead-width)
>                      (if last 0 spacer))))
> @@ -771,7 +785,8 @@ vtable--insert-header-line
>               ;; This is the final column, and we have a sorting
>               ;; indicator, and the table is too wide for the window.
>               (let* ((pre-indicator (string-pixel-width
> -                                    (buffer-substring (point-min) (point=
))))
> +                                    (buffer-substring (point-min) (point=
))
> +                                    buffer))
>                      (pre-fill
>                       (- (window-width nil t)
>                          pre-indicator
> @@ -850,14 +865,16 @@ vtable--set-header-line
>             (buffer-substring (point-min) (1- (point-max))))))
>    (vtable-header-mode 1))
>=20=20
> -(defun vtable--limit-string (string pixels)
> +
> +(defun vtable--limit-string (string pixels buffer)
>    (while (and (length> string 0)
> -              (> (string-pixel-width string) pixels))
> +              (> (string-pixel-width string buffer) pixels))
>      (setq string (substring string 0 (1- (length string)))))
>    string)
>=20=20
>  (defun vtable--char-width (table)
> -  (string-pixel-width (propertize "x" 'face (vtable-face table))))
> +  (string-pixel-width (propertize "x" 'face (vtable-face table))
> +                      (vtable-buffer table)))
>=20=20
>  (defun vtable--compute-width (table spec)
>    (cond
> @@ -936,7 +953,7 @@ vtable--compute-cached-line
>         ;; We stash the computed width and string here -- if there are
>         ;; no formatters/displayers, we'll be using the string, and
>         ;; then won't have to recreate it.
> -       (list value (string-pixel-width string) string)))
> +       (list value (string-pixel-width string (vtable-buffer table)) str=
ing)))
>     (vtable-columns table)))
>=20=20
>  (defun vtable--make-keymap (table)
> @@ -967,20 +984,21 @@ vtable--make-keymap
>            (vtable-keymap table))
>        map)))
>=20=20
> -(defun vtable-revert ()
> -  "Regenerate the table under point."
> -  (let ((table (vtable-current-table))
> -        (object (vtable-current-object))
> -        (column (vtable-current-column))
> -        (inhibit-read-only t))
> -    (unless table
> -      (user-error "No table under point"))
> -    (delete-region (vtable-beginning-of-table) (vtable-end-of-table))
> -    (vtable-insert table)
> -    (when object
> -      (vtable-goto-object object))
> -    (when column
> -      (vtable-goto-column column))))
> +(defun vtable-revert (&optional table)
> +  "Regenerate TABLE, defaulting to the table under point."
> +  (setq table (or table (vtable-current-table)))
> +  (unless table
> +    (user-error "No table under point"))
> +  (with-current-buffer (vtable-buffer table)
> +    (let ((object (vtable-current-object))
> +          (column (vtable-current-column))
> +          (inhibit-read-only t))
> +      (delete-region (vtable-beginning-of-table) (vtable-end-of-table))
> +      (vtable--insert table)
> +      (when object
> +        (vtable-goto-object object))
> +      (when column
> +        (vtable-goto-column column)))))
>=20=20
>  ;;; Commands.
>=20=20
> @@ -1006,14 +1024,14 @@ vtable-narrow-current-column
>                                  (- (* (vtable--char-width table) (or n 1=
))))))
>=20=20
>  (defun vtable--alter-column-width (table column delta)
> -  (let ((widths (vtable--cache-widths (vtable--current-cache))))
> +  (let ((widths (vtable--cache-widths (vtable--current-cache table))))
>      (setf (aref widths column)
>            (max (* (vtable--char-width table) 2)
>                 (+ (aref widths column) delta)))
>      ;; Store the width so it'll be respected on a revert.
>      (setf (vtable-column-width (elt (vtable-columns table) column))
>            (format "%dpx" (aref widths column)))
> -    (vtable-revert)))
> +    (vtable-revert table)))
>=20=20
>  (defun vtable-widen-current-column (&optional n)
>    "Widen the current column by N characters.
> @@ -1028,24 +1046,28 @@ vtable-previous-column
>    (interactive)
>    (vtable-goto-column
>     (max 0 (1- (or (vtable-current-column)
> -                  (length (vtable--cache-widths (vtable--current-cache))=
))))))
> +                  (length (vtable--cache-widths
> +                           (vtable--current-cache (vtable-current-table)=
))))))))
>=20=20
>  (defun vtable-next-column ()
>    "Go to the next column."
>    (interactive)
>    (when (vtable-current-column)
>      (vtable-goto-column
> -     (min (1- (length (vtable--cache-widths (vtable--current-cache))))
> +     (min (1- (length (vtable--cache-widths
> +                       (vtable--current-cache (vtable-current-table)))))
>            (1+ (vtable-current-column))))))
>=20=20
> -(defun vtable-revert-command ()
> +(defun vtable-revert-command (&optional table)
>    "Re-query data and regenerate the table under point."

This docstring should mention TABLE.

>    (interactive)
> -  (let ((table (vtable-current-table)))
> -    (when (vtable-objects-function table)
> -      (setf (vtable-objects table) (funcall (vtable-objects-function tab=
le))))
> -    (vtable--clear-cache table))
> -  (vtable-revert))
> +  (setq table (or table (vtable-current-table)))
> +  (unless table
> +    (user-error "No table found"))
> +  (when (vtable-objects-function table)
> +    (setf (vtable-objects table) (funcall (vtable-objects-function table=
))))
> +  (vtable--clear-cache table)
> +  (vtable-revert table))
>=20=20
>  (defun vtable-sort-by-current-column ()
>    "Sort the table under point by the column under point."
> @@ -1067,8 +1089,8 @@ vtable-sort-by-current-column
>                                    (if (eq (cdr last) 'ascend)
>                                        'descend
>                                      'ascend)
> -                                'ascend))))))
> -  (vtable-revert))
> +                                'ascend)))))
> +    (vtable-revert table)))
>=20=20
>  (defun vtable-header-line-sort (e)
>    "Sort a vtable from the header line."
> diff --git a/test/lisp/emacs-lisp/vtable-tests.el b/test/lisp/emacs-lisp/=
vtable-tests.el
> index 74fb8cc8139..83f826ea353 100644
> --- a/test/lisp/emacs-lisp/vtable-tests.el
> +++ b/test/lisp/emacs-lisp/vtable-tests.el
> @@ -27,16 +27,19 @@
>  (require 'ert)
>  (require 'ert-x)
>=20=20
> -(ert-deftest test-vstable-compute-columns ()
> +(defun vtable-tests--make-no-header-2-object-table ()
> +  (make-vtable :columns '("a" "b" "c")
> +               :objects '(("foo" 1 2)
> +                          ("bar" 3 :zot))
> +               :insert nil))
> +
> +(ert-deftest test-vtable-compute-columns ()
>    (should
>     (equal (mapcar
>             (lambda (column)
>               (vtable-column-align column))
>             (vtable--compute-columns
> -            (make-vtable :columns '("a" "b" "c")
> -                         :objects '(("foo" 1 2)
> -                                    ("bar" 3 :zot))
> -                         :insert nil)))
> +            (vtable-tests--make-no-header-2-object-table)))
>            '(left right left))))
>=20=20
>  (ert-deftest test-vtable-insert-object ()
> @@ -69,4 +72,69 @@ test-vtable-insert-object
>                (mapcar #'cadr (vtable-objects table))))
>            (number-sequence 0 11))))
>=20=20
> +(ert-deftest test-vtable-unique-buffer ()
> +  (let ((table (vtable-tests--make-no-header-2-object-table)))
> +    (with-temp-buffer
> +      (vtable-insert table)
> +      ;; This will run but fail on Emacs pre 31 vtable.
> +      (should-error (vtable-insert table))
> +      ;; This will run only on Emacs 31+ vtable.
> +      (when (> emacs-major-version 30)
> +        (should-error (vtable-set-buffer table (current-buffer)))))))
> +
> +(ert-deftest test-vtable-non-current-buffer-insert-object ()
> +  (let ((table (vtable-tests--make-no-header-2-object-table))
> +        (obj '("baz" 4 5)))
> +    (with-temp-buffer
> +      (vtable-insert table)
> +      (should (=3D (count-lines (point-min) (point-max)) 2))
> +      (with-temp-buffer
> +        (vtable-insert-object table obj))
> +      (should (=3D (count-lines (point-min) (point-max)) 3)))))
> +
> +(ert-deftest test-vtable-non-current-buffer-remove-object ()
> +  (let ((table (vtable-tests--make-no-header-2-object-table))
> +        (obj '("baz" 4 5)))
> +    (with-temp-buffer
> +      (vtable-insert table)
> +      (vtable-insert-object table obj)
> +      (should (=3D (count-lines (point-min) (point-max)) 3))
> +      (with-temp-buffer
> +        (vtable-remove-object table obj))
> +      (should (=3D (count-lines (point-min) (point-max)) 2)))))
> +
> +(ert-deftest test-vtable-non-current-buffer-update-object ()
> +  (let ((table (vtable-tests--make-no-header-2-object-table))
> +        (obj '("baz" 4 5))
> +        (obj-2 '("qux" 6 7)))
> +    (with-temp-buffer
> +      (vtable-insert table)
> +      (vtable-insert-object table obj)
> +      (should (=3D (count-lines (point-min) (point-max)) 3))
> +      (let ((line-2 (progn
> +                      (goto-char (point-min))
> +                      (forward-line 2)
> +                      (buffer-substring (point) (point-max)))))
> +        (with-temp-buffer
> +          (vtable-update-object table obj-2 obj))
> +        (let ((line-2-new (progn
> +                            (goto-char (point-min))
> +                            (forward-line 2)
> +                            (buffer-substring (point) (point-max)))))
> +          (should (=3D (count-lines (point-min) (point-max)) 3))
> +          (should (not (string=3D line-2 line-2-new))))))))
> +
> +(ert-deftest test-vtable--limit-string-with-face-remapped-buffer ()
> +  (with-temp-buffer
> +    (let ((text (propertize "XXXXX"
> +                            'face 'variable-pitch)))
> +      (face-remap-add-relative 'default :height 1.5)
> +      (if (> emacs-major-version 30)
> +          (should (eq
> +                   2
> +                   (length (vtable--limit-string text 50 (current-buffer=
)))))
> +        (should (eq
> +                 2
> +                 (length (vtable--limit-string text 50))))))))
> +
>  ;;; vtable-tests.el ends here




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 11 Dec 2025 19:31:48 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 11 14:31:48 2025
Received: from localhost ([127.0.0.1]:47872 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vTmOB-0004pZ-JN
	for submit <at> debbugs.gnu.org; Thu, 11 Dec 2025 14:31:48 -0500
Received: from mail-ua1-x92c.google.com ([2607:f8b0:4864:20::92c]:49362)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vTmO8-0004p2-8q
 for 79982 <at> debbugs.gnu.org; Thu, 11 Dec 2025 14:31:45 -0500
Received: by mail-ua1-x92c.google.com with SMTP id
 a1e0cc1a2514c-93f5ca8387eso75758241.2
 for <79982 <at> debbugs.gnu.org>; Thu, 11 Dec 2025 11:31:44 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765481498; x=1766086298; darn=debbugs.gnu.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=LYrV0E5X0fzuMM74iMuyIHjQjZJdNTHNj8sGnWN2CSM=;
 b=Bw+5NDxbx4fQXjbO+T8HRLjrRBWeQY0T9EmgLUdwYrMDHDy33XGjiIXh9SQJBjStHZ
 T5mTvVtcewB65/u5Sd8SaiYKCyHSo5rR+qJOTnAmvER87qdYaqvIXiYcMT50LnWkuQDt
 flD1l3/T639tDGRPl9oDumkYACHpyc9oSC40bs08PuVOU1nNQR7s9z2Os884OSmOuxJb
 EQHDaO4XPB8i8HrgmjoM5r0HZtJ9dth0V6Ay4wz4az/ySi7Zbrq89iPLjhWCfm7saDmE
 vFWbXJk1mctCbhYp9YKHfQ9VsvaWpyq2RDwuLhy0IarL/hGJbyZgHZchjWpStDspUwsl
 Yv5w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765481498; x=1766086298;
 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=LYrV0E5X0fzuMM74iMuyIHjQjZJdNTHNj8sGnWN2CSM=;
 b=KhTDBr7kFeWqbAjbc3cmftRG2vcNEvUPNWiNejItwDRmA4gvf9NMnU6m0de4rIlyWr
 uLgAGJrB9bcEMhTbwr+Cocc9yPd9ojtcy5jbHx/wyFvMJ8eguCsoeAAEU2qaJKrl0KH/
 ZsK0kn55H77Krs2vXg+t9AugIrA7XWwbEEd1aIAXwc27VAVkHvXScvwORgtZZxQpCBBt
 MlxDuyLa9ucSvNgcW9NfWlfVAe2aKrhuP/TrEdu9qRRtpLXToO0t1ST9kOrgxV95fHQx
 vm4xobmdTScNJt8KjS1ZuAkMd+igWNUC3MAsLrKZGON8UA3/bykFuyqVmULbi3g2UDPB
 G80Q==
X-Forwarded-Encrypted: i=1;
 AJvYcCV9r6vYOLF8mWdWutG0Dpz+rAL+nHhB27oVFk4QaNVM/B8LeTyPeGicJI0tdZf6uH0DQIWekg==@debbugs.gnu.org
X-Gm-Message-State: AOJu0YxkdR9L8ZmnEBZ4wZYI+Xgg/vkW+9XzatCNBnhUOzcJhyD6hGOF
 GL69jgjVraXDOevP7/4keNS+dJkjMy96OfEg4ll8jurvV3Eia9fFh/lLG/nFB2bLtujm7cerpIc
 dOnYL7LYjquWiOaymFVcwwQOkxYFvvW0=
X-Gm-Gg: AY/fxX7Y1rQBWdYtZ+Re2yOtkfkO+1uIozSL1TDY+Gv6j9eZ9Zm12Ul5NavuRlYALPK
 znpid/geTf3I15peuo4izz8MH8brFH7KPIeGKJ0QJf1R0dp1CTClGXPjKIycxmjiZSnv5av6oR2
 GIem6RUoVSnqy09iUbx/FJ4gzqPh16iAMu8d+l2SfJLkuYjPJw4isvbJoKXFwsek+6hCRn496HB
 y27Ramdxp0cSC5Qpt74RuekuMYmoq3q0sI7z4QJdIj1z9KTRnm1TGOV+UmbxUbfM9QJgM8=
X-Google-Smtp-Source: AGHT+IHaXNcDwaDHowkU4YbJnJiLl+wh6+cQT5C1UM9JONIuzqbOzi48wvLl3J6s3nS6Qxszit38jVTzYhH1MOqVOeM=
X-Received: by 2002:a05:6102:3e0b:b0:5db:d1b2:c0d4 with SMTP id
 ada2fe7eead31-5e571eede21mr2789299137.31.1765481498438; Thu, 11 Dec 2025
 11:31:38 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 <iercy4kswsa.fsf_-_@HIDDEN>
In-Reply-To: <iercy4kswsa.fsf_-_@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Thu, 11 Dec 2025 14:31:26 -0500
X-Gm-Features: AQt7F2p0UX3E9McM1bJ0pf70tamQUx5JKaOosv6aonDvVkzK5OfyHjrxZxZjUx0
Message-ID: <CAN+1HbrxjQxt6iDSUXc_x-q9omstHj9Cxvri+9trn7mp9tXB+w@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer slot
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/mixed; boundary="0000000000009290f30645b23193"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--0000000000009290f30645b23193
Content-Type: multipart/alternative; boundary="0000000000009290f20645b23191"

--0000000000009290f20645b23191
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, Dec 11, 2025 at 1:23=E2=80=AFPM Spencer Baugh <sbaugh@HIDDEN=
m> wrote:

> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>
> One alternative is to save -current-cache-key instead and look it up in
> -cache, but saving -current-cache is fine.
>
> A thought for the future, not for this patch: We probably should have a
> -current-window-width slot of the vtable, which is set whenever we
> vtable-revert, and then use it in all the places that currently call
> window-width.  That would make us more correct in a bunch of cases, I
> think.  Then the cache key would be (cons (frame-terminal)
> -current-window-width), so if we just saved -current-frame-terminal as
> well, we would be able to compute (vtable--current-cache-key table), and
> remove -current-cache/-current-cache-key.
>

We can refine these later, for sure.  It's an internal detail.

>     (-cached-keymap :initform nil)
> >     (-has-column-spec :initform nil))
> >    "An object to hold the data for a table.")
> > @@ -221,6 +223,20 @@ vtable--face-color
> >
> >  ;;; Interface utility functions.
> >
> > +(defun vtable-buffer (&optional table)
>
> This should be a mandatory argument.
>
> And if it's a mandatory argument then this can just be defined with a
> :accessor keyword argument in the defclass.

> +(defun vtable-set-buffer (buffer &optional table)

> But also I think this then just becomes a trivial
>
> (setf (vtable-buffer table) buffer)
>  Also while we're at it, I think the slot name should be just 'buffer not
> '-buffer.
>

Right, good, done.

<snip>

> +    (let* ((cache (vtable--current-cache table))
> > +           (inhibit-read-only t)
> > +           (lines (vtable--cache-lines cache))
> > +           (elem (if location  ; This binding mirrors the binding of
> `pos' above.
> > +                     (if (integerp location)
> > +                         (nth location lines)
> > +                       (or (assq location lines)
> > +                           (and before (car lines))))
> > +                   (if before (car lines))))
> > +           (pos (memq elem lines))
> > +           (line (cons object (vtable--compute-cached-line table
> object))))
> > +      (with-current-buffer (vtable-buffer table)
> > +        (save-excursion
> > +          (vtable-goto-table table)
> > +          (let* ((ellipsis (if (vtable-ellipsis table)
> > +                               (propertize (truncate-string-ellipsis)
> > +                                           'face (vtable-face table))
> > +                             ""))
> > +                 (ellipsis-width (string-pixel-width ellipsis
> (current-buffer)))
>
> Can we move these let-bindings out to the outer let-binding now?
>

I'd prefer if they stay close to where they're being used, at least here,
where the cache update is clearly separate from the buffer update.

> +                 (keymap (get-text-property (point) 'keymap)))
>
> I guess we could get this from vtable-keymap now?  In which case it can
> also move to the outer let-binding?
>

It would have to be from the -cached-keymap slot.  Let's leave the keymaps
as is for the time being.  We have patches to refine and expand their
functionality coming.

> -(defun vtable-insert (table)
> > +(defun vtable--insert (table)
> >    (let* ((spacer (vtable--spacer table))
> >           (start (point))
> >           (ellipsis (if (vtable-ellipsis table)
> >                         (propertize (truncate-string-ellipsis)
> >                                     'face (vtable-face table))
> >                       ""))
> > -         (ellipsis-width (string-pixel-width ellipsis))
> > +         (ellipsis-width (string-pixel-width ellipsis (current-buffer)=
))
>
> Should we use vtable-buffer rather than current-buffer here, I guess?
>

Easy enough.

>
> > +  (if-let* ((table-buffer (vtable-buffer table)))
> > +      (if (eq table-buffer (current-buffer))
> > +          (error "A vtable cannot be inserted more than once into a
> buffer")
>
> I don't think this should be an error.  It's reasonable for Lisp code to
> clear a buffer and then want to reinsert a vtable into it.  If we're
> inserting into the same buffer, there's no problem.
>
> I guess your concern is inserting a vtable when it already is present.
> I don't think there's a good way to prevent that right now,
> unfortunately, without also breaking the legitimate use case of clearing
> a buffer then reinserting the vtable.
>
> > +        (error "A vtable cannot be inserted into more than one
> buffer")))
>
> I agree that this should be an error, of course.
>

Duly refined and the docstring now reads "A table may be reinserted into
its own buffer, but insert only one instance per buffer.  This restriction
needs to be enforced by the caller."  We can build a mechanic later that
enforces this.

> +(defun vtable--current-cache (&optional table)
> > +  "Return the current cache for TABLE or the table under point.
> >
> >  In `vtable-insert', the lines and widths of the vtable text are comput=
ed
> >  based on the current selected frame and window and stored in a cache.
> >  Subsequent interaction with the text of the vtable should use that cac=
he
> >  via this function rather than by calling `vtable--cache-key' to look u=
p
> >  the cache."
> > -  (get-text-property (point) 'vtable-cache))
> > +  (slot-value (or table (vtable-current-table)) '-current-cache))
>
> Can we make TABLE just be a mandatory argument?  It looks to me like
> this would just require vtable-next-column and vtable-previous-column to
> run (vtable--current-cache (vtable-current-table))
>
> Then this function just becomes another :accessor.
>

Good, done.

> +(defun vtable--set-current-cache (table cache)
> > +  "Set the current cache for the table."
> > +  (setf (slot-value table '-current-cache) cache))
>

I've removed that function, too.

Fresh patch attached.

-St=C3=A9phane

--0000000000009290f20645b23191
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Thu, Dec 11, 2025 at 1:23=E2=80=AFPM Spencer Baugh &lt;<a href=3D"mailto=
:sbaugh@HIDDEN">sbaugh@HIDDEN</a>&gt; wrote:</span></div></=
div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=3D"g=
mail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204=
,204,204);padding-left:1ex">St=C3=A9phane Marks &lt;<a href=3D"mailto:shipm=
ints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br><b=
r>
One alternative is to save -current-cache-key instead and look it up in<br>
-cache, but saving -current-cache is fine.<br>
<br>
A thought for the future, not for this patch: We probably should have a<br>
-current-window-width slot of the vtable, which is set whenever we<br>
vtable-revert, and then use it in all the places that currently call<br>
window-width.=C2=A0 That would make us more correct in a bunch of cases, I<=
br>
think.=C2=A0 Then the cache key would be (cons (frame-terminal)<br>
-current-window-width), so if we just saved -current-frame-terminal as<br>
well, we would be able to compute (vtable--current-cache-key table), and<br=
>
remove -current-cache/-current-cache-key.<br></blockquote><div><br></div><d=
iv><div class=3D"gmail_default" style=3D"font-family:monospace">We can refi=
ne these later, for sure.=C2=A0 It&#39;s an internal detail.</div></div><di=
v><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0=
.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
&gt;=C2=A0 =C2=A0 =C2=A0(-cached-keymap :initform nil)<br>
&gt;=C2=A0 =C2=A0 =C2=A0(-has-column-spec :initform nil))<br>
&gt;=C2=A0 =C2=A0 &quot;An object to hold the data for a table.&quot;)<br>
&gt; @@ -221,6 +223,20 @@ vtable--face-color<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 ;;; Interface utility functions.<br>
&gt;=C2=A0 <br>
&gt; +(defun vtable-buffer (&amp;optional table)<br>
<br>
This should be a mandatory argument.<br>
<br>
And if it&#39;s a mandatory argument then this can just be defined with a<b=
r>
:accessor keyword argument in the defclass.</blockquote>&gt; +(defun vtable=
-set-buffer (buffer &amp;optional table)<br><blockquote class=3D"gmail_quot=
e" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204)=
;padding-left:1ex">But also I think this then just becomes a trivial<br><br=
>(setf (vtable-buffer table) buffer)<br>=C2=A0Also while we&#39;re at it, I=
 think the slot name should be just &#39;buffer not<br>
&#39;-buffer.<br></blockquote><div><br></div><div><div class=3D"gmail_defau=
lt" style=3D"font-family:monospace">Right, good, done.</div></div><div clas=
s=3D"gmail_default" style=3D"font-family:monospace"><br></div><div class=3D=
"gmail_default" style=3D"font-family:monospace">&lt;snip&gt;</div><div clas=
s=3D"gmail_default" style=3D"font-family:monospace"><br></div><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px soli=
d rgb(204,204,204);padding-left:1ex">
&gt; +=C2=A0 =C2=A0 (let* ((cache (vtable--current-cache table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(inhibit-read-only t)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(lines (vtable--cache-lines =
cache))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(elem (if location=C2=A0 ; T=
his binding mirrors the binding of `pos&#39; above.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0(if (integerp location)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0(nth location lines)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0(or (assq location lines)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0(and before (car lines))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
(if before (car lines))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(pos (memq elem lines))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(line (cons object (vtable--=
compute-cached-line table object))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-excursion<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-goto-table table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let* ((ellipsis (if (vtable-ellip=
sis table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(propertize (truncate-string-elli=
psis)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0&#39;face (vtable-face table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quot;&quot;))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellips=
is-width (string-pixel-width ellipsis (current-buffer)))<br>
<br>
Can we move these let-bindings out to the outer let-binding now?<br></block=
quote><div><br></div><div class=3D"gmail_default" style=3D"font-family:mono=
space">I&#39;d prefer if they stay close to where they&#39;re being used, a=
t least here, where the cache update is clearly separate from the buffer up=
date.</div><div class=3D"gmail_default" style=3D"font-family:monospace"><br=
></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;=
border-left:1px solid rgb(204,204,204);padding-left:1ex">
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(keymap=
 (get-text-property (point) &#39;keymap)))<br>
<br>
I guess we could get this from vtable-keymap now?=C2=A0 In which case it ca=
n<br>
also move to the outer let-binding?<br></blockquote><div><br></div><div><di=
v class=3D"gmail_default" style=3D"font-family:monospace">It would have to =
be from the -cached-keymap slot.=C2=A0 Let&#39;s leave the keymaps as is fo=
r the time being.=C2=A0 We have patches to refine and expand their function=
ality coming.</div></div><div><br></div><blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);pad=
ding-left:1ex">&gt; -(defun vtable-insert (table)<br>
&gt; +(defun vtable--insert (table)<br>
&gt;=C2=A0 =C2=A0 (let* ((spacer (vtable--spacer table))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(start (point))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis (if (vtable-ellipsis=
 table)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0(propertize (truncate-string-ellipsis)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;face (vt=
able-face table))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0&quot;&quot;))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis-width (string-pixel-width=
 ellipsis))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis-width (string-pixel-width=
 ellipsis (current-buffer)))<br>
<br>
Should we use vtable-buffer rather than current-buffer here, I guess?<br></=
blockquote><div><br></div><div><div class=3D"gmail_default" style=3D"font-f=
amily:monospace">Easy enough.</div></div><blockquote class=3D"gmail_quote" =
style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);pa=
dding-left:1ex"><br>
&gt; +=C2=A0 (if-let* ((table-buffer (vtable-buffer table)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (if (eq table-buffer (current-buffer))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (error &quot;A vtable cannot be in=
serted more than once into a buffer&quot;)<br>
<br>
I don&#39;t think this should be an error.=C2=A0 It&#39;s reasonable for Li=
sp code to<br>
clear a buffer and then want to reinsert a vtable into it.=C2=A0 If we&#39;=
re<br>
inserting into the same buffer, there&#39;s no problem.<br>
<br>
I guess your concern is inserting a vtable when it already is present.<br>
I don&#39;t think there&#39;s a good way to prevent that right now,<br>
unfortunately, without also breaking the legitimate use case of clearing<br=
>
a buffer then reinserting the vtable.<br>
<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (error &quot;A vtable cannot be inserted =
into more than one buffer&quot;)))<br>
<br>
I agree that this should be an error, of course.<br></blockquote><div><br><=
/div><div class=3D"gmail_default" style=3D""><font face=3D"monospace">Duly =
refined and the docstring now reads &quot;A table may be reinserted into it=
s own buffer, but insert only=C2=A0one instance per buffer.=C2=A0 This rest=
riction needs to be enforced by the<span class=3D"gmail_default" style=3D""=
>=C2=A0</span>caller.<span class=3D"gmail_default" style=3D"">&quot;=C2=A0 =
We can build a mechanic later that enforces this.</span></font></div><div c=
lass=3D"gmail_default" style=3D"font-family:monospace"><br></div><blockquot=
e class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px s=
olid rgb(204,204,204);padding-left:1ex">&gt; +(defun vtable--current-cache =
(&amp;optional table)<br>
&gt; +=C2=A0 &quot;Return the current cache for TABLE or the table under po=
int.<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 In `vtable-insert&#39;, the lines and widths of the vtable text =
are computed<br>
&gt;=C2=A0 based on the current selected frame and window and stored in a c=
ache.<br>
&gt;=C2=A0 Subsequent interaction with the text of the vtable should use th=
at cache<br>
&gt;=C2=A0 via this function rather than by calling `vtable--cache-key&#39;=
 to look up<br>
&gt;=C2=A0 the cache.&quot;<br>
&gt; -=C2=A0 (get-text-property (point) &#39;vtable-cache))<br>
&gt; +=C2=A0 (slot-value (or table (vtable-current-table)) &#39;-current-ca=
che))<br>
<br>
Can we make TABLE just be a mandatory argument?=C2=A0 It looks to me like<b=
r>
this would just require vtable-next-column and vtable-previous-column to<br=
>
run (vtable--current-cache (vtable-current-table))<br>
<br>
Then this function just becomes another :accessor.<br></blockquote><div><br=
></div><div class=3D"gmail_default" style=3D"font-family:monospace">Good, d=
one.</div><div class=3D"gmail_default" style=3D"font-family:monospace"><br>=
</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;b=
order-left:1px solid rgb(204,204,204);padding-left:1ex">&gt; +(defun vtable=
--set-current-cache (table cache)<br>
&gt; +=C2=A0 &quot;Set the current cache for the table.&quot;<br>
&gt; +=C2=A0 (setf (slot-value table &#39;-current-cache) cache))<br></bloc=
kquote><div><br></div><div><div class=3D"gmail_default" style=3D"font-famil=
y:monospace">I&#39;ve removed that function, too.</div></div><div class=3D"=
gmail_default" style=3D"font-family:monospace"><br></div><div class=3D"gmai=
l_default" style=3D"font-family:monospace">Fresh patch attached.</div><div =
class=3D"gmail_default" style=3D"font-family:monospace"><br></div><div clas=
s=3D"gmail_default" style=3D"font-family:monospace">-St=C3=A9phane=C2=A0</d=
iv></div></div>

--0000000000009290f20645b23191--

--0000000000009290f30645b23193
Content-Type: application/octet-stream; 
	name="0001-Add-vtable-buffer-slot.patch"
Content-Disposition: attachment; 
	filename="0001-Add-vtable-buffer-slot.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_mj1u3bvy0>
X-Attachment-Id: f_mj1u3bvy0

RnJvbSA0NTA1YzYzZWZhYTljZTEyNGE1N2M3OTMxNzUzM2ZhM2YwMjk4ZjJjIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo
aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMTAgRGVjIDIwMjUgMDk6MjA6MDIgLTA1MDAK
U3ViamVjdDogW1BBVENIXSBBZGQgdnRhYmxlIGJ1ZmZlciBzbG90CgpUaGlzIHNvbHZlcyBmb3Ig
YmFja2dyb3VuZCB2dGFibGUgbXV0YXRpb25zLCBpLmUuLCB1cGRhdGVzCmluaXRpYXRlZCBmcm9t
IGJ1ZmZlcnMgb3RoZXIgdGhhbiB0aGUgdnRhYmxlIGJ1ZmZlciwgYW5kIGZvcgpidWZmZXItYWRq
dXN0ZWQgc3RyaW5nLXBpeGVsLXdpZHRoIGNvbXB1dGF0aW9ucy4KCiogbGlzcC9lbWFjcy1saXNw
L3Z0YWJsZS5lbCAodnRhYmxlKTogTmV3ICctYnVmZmVyJyBzbG90LgoodnRhYmxlLWJ1ZmZlcik6
Cih2dGFibGUtc2V0LWJ1ZmZlcik6IE5ldyBmdW5jdGlvbi4KKHZ0YWJsZS11cGRhdGUtb2JqZWN0
KToKKHZ0YWJsZS1yZW1vdmUtb2JqZWN0KToKKHZ0YWJsZS1pbnNlcnQtb2JqZWN0KTogV3JhcCBv
cGVyYXRpb24gd2l0aCB0aGUgdnRhYmxlIGJ1ZmZlci4KKHZ0YWJsZS0taW5zZXJ0KTogU3BsaXQg
ZnJvbSBvbGQgJ3Z0YWJsZS1pbnNlcnQnLgoodnRhYmxlLWluc2VydCk6IEluc2VydCB0YWJsZSBh
bmQgcmVjb3JkIHRoZSBidWZmZXIuCih2dGFibGUtLWluc2VydC1saW5lKToKKHZ0YWJsZS0taW5z
ZXJ0LWhlYWRlci1saW5lKTogVXNlICd2dGFibGUtYnVmZmVyJyBmb3IgcGl4ZWwtd2lkdGggY29t
cHV0YXRpb24uCih2dGFibGUtLWxpbWl0LXN0cmluZyk6Cih2dGFibGUtLWNoYXItd2lkdGgpOiBQ
YXNzIGJ1ZmZlciB0byAnc3RyaW5nLXBpeGVsLXdpZHRoJy4KKHZ0YWJsZS1yZXZlcnQpOiBOZXcg
b3B0aW9uYWwgdGFibGUgYXJndW1lbnQuCih2dGFibGUtLWFsdGVyLWNvbHVtbi13aWR0aCk6Cih2
dGFibGUtcmV2ZXJ0LWNvbW1hbmQpOgoodnRhYmxlLXNvcnQtYnktY3VycmVudC1jb2x1bW4pOiBD
YWxsICd2dGFibGUtcmV2ZXJ0JyB3aXRoIHRoZSB0YWJsZS4KCiogdGVzdC9saXNwL2VtYWNzLWxp
c3AvdnRhYmxlLXRlc3RzLmVsCih2dGFibGUtdGVzdHMtLW1ha2Utbm8taGVhZGVyLTItb2JqZWN0
LXRhYmxlKTogTmV3IGhlbHBlcgpmdW5jdGlvbi4KKHRlc3QtdnN0YWJsZS1jb21wdXRlLWNvbHVt
bnMpOiBDb3JyZWN0IHR5cG8gaW4gdGVzdCBuYW1lLiAgVXNlCm5ldyBoZWxwZXIgZnVuY3Rpb24u
Cih0ZXN0LXZ0YWJsZS11bmlxdWUtYnVmZmVyKQoodGVzdC12dGFibGUtbm9uLWN1cnJlbnQtYnVm
ZmVyLWluc2VydC1vYmplY3QpCih0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItcmVtb3Zl
LW9iamVjdCkKKHRlc3QtdnRhYmxlLW5vbi1jdXJyZW50LWJ1ZmZlci11cGRhdGUtb2JqZWN0KQoo
dGVzdC12dGFibGUtLWxpbWl0LXN0cmluZy13aXRoLWZhY2UtcmVtYXBwZWQtYnVmZmVyKTogTmV3
IHRlc3QuCi0tLQogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAgICAgICAgICAgIHwgMjc0ICsr
KysrKysrKysrKysrKy0tLS0tLS0tLS0tLQogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRl
c3RzLmVsIHwgIDc4ICsrKysrKystCiAyIGZpbGVzIGNoYW5nZWQsIDIyMSBpbnNlcnRpb25zKCsp
LCAxMzEgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5l
bCBiL2xpc3AvZW1hY3MtbGlzcC92dGFibGUuZWwKaW5kZXggYmNkZDI4MGZiOTIuLmNjZGRlNDk4
MzBlIDEwMDY0NAotLS0gYS9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVsCisrKyBiL2xpc3AvZW1h
Y3MtbGlzcC92dGFibGUuZWwKQEAgLTY3LDggKzY3LDEwIEBAIHZ0YWJsZQogICAgKGVsbGlwc2lz
IDppbml0YXJnIDplbGxpcHNpcyA6YWNjZXNzb3IgdnRhYmxlLWVsbGlwc2lzKQogICAgKGNvbHVt
bi1jb2xvcnMgOmluaXRhcmcgOmNvbHVtbi1jb2xvcnMgOmFjY2Vzc29yIHZ0YWJsZS1jb2x1bW4t
Y29sb3JzKQogICAgKHJvdy1jb2xvcnMgOmluaXRhcmcgOnJvdy1jb2xvcnMgOmFjY2Vzc29yIHZ0
YWJsZS1yb3ctY29sb3JzKQorICAgKGJ1ZmZlciA6aW5pdGZvcm0gbmlsIDphY2Nlc3NvciB2dGFi
bGUtYnVmZmVyKQogICAgKC1jYWNoZWQtY29sb3JzIDppbml0Zm9ybSBuaWwpCiAgICAoLWNhY2hl
IDppbml0Zm9ybSAobWFrZS1oYXNoLXRhYmxlIDp0ZXN0ICMnZXF1YWwpKQorICAgKC1jdXJyZW50
LWNhY2hlIDppbml0Zm9ybSBuaWwgOmFjY2Vzc29yIHZ0YWJsZS0tY3VycmVudC1jYWNoZSkKICAg
ICgtY2FjaGVkLWtleW1hcCA6aW5pdGZvcm0gbmlsKQogICAgKC1oYXMtY29sdW1uLXNwZWMgOmlu
aXRmb3JtIG5pbCkpCiAgICJBbiBvYmplY3QgdG8gaG9sZCB0aGUgZGF0YSBmb3IgYSB0YWJsZS4i
KQpAQCAtMzAxLDE0ICszMDMsMTQgQEAgdnRhYmxlLXVwZGF0ZS1vYmplY3QKICAgICAgICh1bmxl
c3MgKGNkciBvYmplY3RzKQogICAgICAgICAoZXJyb3IgIkNhbid0IGZpbmQgdGhlIG9sZCBvYmpl
Y3QiKSkKICAgICAgIChzZXRjYXIgKGNkciBvYmplY3RzKSBvYmplY3QpKQotICAgIDs7IFRoZW4g
dXBkYXRlIHRoZSByZW5kZXJlZCB2dGFibGUgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgotICAgIChp
Zi1sZXQqICgoY2FjaGUgKHZ0YWJsZS0tY3VycmVudC1jYWNoZSkpCi0gICAgICAgICAgICAgKGxp
bmUtbnVtYmVyIChzZXEtcG9zaXRpb24gKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLW9iamVjdAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGEgYikKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCAoY2FyIGEpIGIpKSkpCi0gICAg
ICAgICAgICAgKGxpbmUgKGVsdCAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkgbGluZS1udW1i
ZXIpKSkKLSAgICAgICAgKHByb2duCisgICAgOzsgVGhlbiB1cGRhdGUgdGhlIHJlbmRlcmVkIHZ0
YWJsZSBpbiBpdHMgYnVmZmVyLgorICAgIChpZi1sZXQqICgoY2FjaGUgKHZ0YWJsZS0tY3VycmVu
dC1jYWNoZSB0YWJsZSkpCisgICAgICAgICAgICAgIChsaW5lLW51bWJlciAoc2VxLXBvc2l0aW9u
ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBvbGQtb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChsYW1iZGEgKGEgYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoZXF1YWwgKGNhciBhKSBiKSkpKQorICAgICAgICAgICAgICAobGluZSAoZWx0
ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSBsaW5lLW51bWJlcikpKQorICAgICAgICAod2l0
aC1jdXJyZW50LWJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJsZSkKICAgICAgICAgICAoc2V0Y2Fy
IGxpbmUgb2JqZWN0KQogICAgICAgICAgIChzZXRjZHIgbGluZSAodnRhYmxlLS1jb21wdXRlLWNh
Y2hlZC1saW5lIHRhYmxlIG9iamVjdCkpCiAgICAgICAgICAgOzsgLi4uIGFuZCByZWRpc3BsYXkg
dGhlIGxpbmUgaW4gcXVlc3Rpb24uCkBAIC0zMjEsOCArMzIzLDcgQEAgdnRhYmxlLXVwZGF0ZS1v
YmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2FjaGUt
d2lkdGhzIGNhY2hlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxl
LS1zcGFjZXIgdGFibGUpKQogICAgICAgICAgICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFy
dCAocG9pbnQpIChsaXN0ICdrZXltYXAga2V5bWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2dGFibGUtY2FjaGUg
Y2FjaGUpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgJ3Z0YWJsZSB0YWJsZSkpKSkKICAgICAgICAgICA7OyBXZSBtYXkgaGF2ZSBpbnNl
cnRlZCBhIG5vbi1udW1lcmljYWwgdmFsdWUgaW50byBhIHByZXZpb3VzbHkKICAgICAgICAgICA7
OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUuCiAgICAgICAgICAgKHZ0YWJsZS0t
cmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAoY2RyIGxpbmUpKSkKQEAgLTMzNCwxNCArMzM1LDE1
IEBAIHZ0YWJsZS1yZW1vdmUtb2JqZWN0CiAgIDs7IEZpcnN0IHJlbW92ZSBmcm9tIHRoZSBvYmpl
Y3RzLgogICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpIChkZWxxIG9iamVjdCAodnRhYmxl
LW9iamVjdHMgdGFibGUpKSkKICAgOzsgVGhlbiBhZGp1c3QgdGhlIGNhY2hlIGFuZCBkaXNwbGF5
LgotICAoc2F2ZS1leGN1cnNpb24KLSAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCi0gICAg
KGxldCAoKGNhY2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKQotICAgICAgICAgIChpbmhpYml0
LXJlYWQtb25seSB0KSkKLSAgICAgIChzZXRjYXIgY2FjaGUgKGRlbHEgKGFzc3Egb2JqZWN0ICh2
dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0
YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpKSkKLSAgICAgICh3aGVuICh2dGFibGUtZ290by1vYmpl
Y3Qgb2JqZWN0KQotICAgICAgICAoZGVsZXRlLWxpbmUpKSkpKQorICAod2l0aC1jdXJyZW50LWJ1
ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJsZSkKKyAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgICh2
dGFibGUtZ290by10YWJsZSB0YWJsZSkKKyAgICAgIChsZXQgKChjYWNoZSAodnRhYmxlLS1jdXJy
ZW50LWNhY2hlIHRhYmxlKSkKKyAgICAgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KSkKKyAg
ICAgICAgKHNldGNhciBjYWNoZSAoZGVscSAoYXNzcSBvYmplY3QgKHZ0YWJsZS0tY2FjaGUtbGlu
ZXMgY2FjaGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWNhY2hlLWxp
bmVzIGNhY2hlKSkpCisgICAgICAgICh3aGVuICh2dGFibGUtZ290by1vYmplY3Qgb2JqZWN0KQor
ICAgICAgICAgIChkZWxldGUtbGluZSkpKSkpKQogCiA7OyBGSVhNRTogVGhlIGZhY3QgdGhhdCB0
aGUgYGxvY2F0aW9uJyBhcmd1bWVudCBvZgogOzsgYHZ0YWJsZS1pbnNlcnQtb2JqZWN0JyBjYW4g
YmUgYW4gaW50ZWdlciBhbmQgaXMgdGhlbiBpbnRlcnByZXRlZCBhcwpAQCAtMzY5LDggKzM3MSw5
IEBAIHZ0YWJsZS1pbnNlcnQtb2JqZWN0CiAgICAgICAocHJvZ24KICAgICAgICAgKHNldGYgKHZ0
YWJsZS1vYmplY3RzIHRhYmxlKSAobGlzdCBvYmplY3QpKQogICAgICAgICAodnRhYmxlLS1yZWNv
bXB1dGUtbnVtZXJpY2FsIHRhYmxlICh2dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUgdGFibGUg
b2JqZWN0KSkKLSAgICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlKQotICAgICAgICAodnRh
YmxlLXJldmVydC1jb21tYW5kKSkKKyAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgKHZ0YWJs
ZS1idWZmZXIgdGFibGUpCisgICAgICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlKQorICAg
ICAgICAgICh2dGFibGUtcmV2ZXJ0LWNvbW1hbmQpKSkKICAgICA7OyBGaXJzdCBpbnNlcnQgaW50
byB0aGUgb2JqZWN0cy4KICAgICAobGV0ICgocG9zIChpZiBsb2NhdGlvbgogICAgICAgICAgICAg
ICAgICAgIChpZiAoaW50ZWdlcnAgbG9jYXRpb24pCkBAIC0zOTgsNTYgKzQwMSw1NyBAQCB2dGFi
bGUtaW5zZXJ0LW9iamVjdAogICAgICAgICAgIDs7IE90aGVyd2lzZSwgYXBwZW5kIHRoZSBvYmpl
Y3QuCiAgICAgICAgICAgKG5jb25jICh2dGFibGUtb2JqZWN0cyB0YWJsZSkgKGxpc3Qgb2JqZWN0
KSkpKSkKICAgICA7OyBUaGVuIGFkanVzdCB0aGUgY2FjaGUgYW5kIGRpc3BsYXkuCi0gICAgKHNh
dmUtZXhjdXJzaW9uCi0gICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCi0gICAgICAobGV0
KiAoKGNhY2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKQotICAgICAgICAgICAgIChpbmhpYml0
LXJlYWQtb25seSB0KQotICAgICAgICAgICAgIChrZXltYXAgKGdldC10ZXh0LXByb3BlcnR5IChw
b2ludCkgJ2tleW1hcCkpCi0gICAgICAgICAgICAgKGVsbGlwc2lzIChpZiAodnRhYmxlLWVsbGlw
c2lzIHRhYmxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnRpemUgKHRydW5j
YXRlLXN0cmluZy1lbGxpcHNpcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICdmYWNlICh2dGFibGUtZmFjZSB0YWJsZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAg
IiIpKQotICAgICAgICAgICAgIChlbGxpcHNpcy13aWR0aCAoc3RyaW5nLXBpeGVsLXdpZHRoIGVs
bGlwc2lzKSkKLSAgICAgICAgICAgICAobGluZXMgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUp
KQotICAgICAgICAgICAgIChlbGVtIChpZiBsb2NhdGlvbiAgOyBUaGlzIGJpbmRpbmcgbWlycm9y
cyB0aGUgYmluZGluZyBvZiBgcG9zJyBhYm92ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgKGlm
IChpbnRlZ2VycCBsb2NhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChudGggbG9j
YXRpb24gbGluZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKG9yIChhc3NxIGxvY2F0aW9u
IGxpbmVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIGJlZm9yZSAoY2FyIGxp
bmVzKSkpKQotICAgICAgICAgICAgICAgICAgICAgKGlmIGJlZm9yZSAoY2FyIGxpbmVzKSkpKQot
ICAgICAgICAgICAgIChwb3MgKG1lbXEgZWxlbSBsaW5lcykpCi0gICAgICAgICAgICAgKGxpbmUg
KGNvbnMgb2JqZWN0ICh2dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUgdGFibGUgb2JqZWN0KSkp
KQotICAgICAgICAoaWYgKG9yIGJlZm9yZQotICAgICAgICAgICAgICAgIChhbmQgcG9zIChpbnRl
Z2VycCBsb2NhdGlvbikpKQotICAgICAgICAgICAgOzsgQWRkIHRoZSBuZXcgb2JqZWN0IGJlZm9y
ZTouCi0gICAgICAgICAgICAobGV0ICgob2xkLWxpbmUgKGNhciBwb3MpKSkKLSAgICAgICAgICAg
ICAgKHNldGNhciBwb3MgbGluZSkKLSAgICAgICAgICAgICAgKHNldGNkciBwb3MgKGNvbnMgb2xk
LWxpbmUgKGNkciBwb3MpKSkKLSAgICAgICAgICAgICAgKHVubGVzcyAodnRhYmxlLWdvdG8tb2Jq
ZWN0IChjYXIgZWxlbSkpCi0gICAgICAgICAgICAgICAgKHZ0YWJsZS1iZWdpbm5pbmctb2YtdGFi
bGUpKSkKLSAgICAgICAgICA7OyBPdGhlcndpc2UsIGFkZCB0aGUgb2JqZWN0IGFmdGVyLgotICAg
ICAgICAgIChpZiBwb3MKLSAgICAgICAgICAgICAgOzsgU3BsaWNlIHRoZSBvYmplY3QgaW50byB0
aGUgbGlzdC4KLSAgICAgICAgICAgICAgKHByb2duCi0gICAgICAgICAgICAgICAgKHNldGNkciBw
b3MgKGNvbnMgbGluZSAoY2RyIHBvcykpKQotICAgICAgICAgICAgICAgIChpZiAodnRhYmxlLWdv
dG8tb2JqZWN0IGxvY2F0aW9uKQotICAgICAgICAgICAgICAgICAgICAoZm9yd2FyZC1saW5lIDEp
ICA7IEluc2VydCAqYWZ0ZXIqLgotICAgICAgICAgICAgICAgICAgKHZ0YWJsZS1lbmQtb2YtdGFi
bGUpKSkKLSAgICAgICAgICAgIDs7IE90aGVyd2lzZSwgYXBwZW5kIHRoZSBvYmplY3QuCi0gICAg
ICAgICAgICAoc2V0Y2FyIGNhY2hlIChuY29uYyBsaW5lcyAobGlzdCBsaW5lKSkpCi0gICAgICAg
ICAgICAodnRhYmxlLWVuZC1vZi10YWJsZSkpKQotICAgICAgICAobGV0ICgoc3RhcnQgKHBvaW50
KSkpCi0gICAgICAgICAgOzsgRklYTUU6IFdlIGhhdmUgdG8gYWRqdXN0IGNvbG9ycyBpbiBsaW5l
cyBiZWxvdyB0aGlzIGlmIHdlCi0gICAgICAgICAgOzsgaGF2ZSA6cm93LWNvbG9ycy4KLSAgICAg
ICAgICAodnRhYmxlLS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIDAKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpICh2dGFibGUtLXNwYWNl
ciB0YWJsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpcyBlbGxpcHNp
cy13aWR0aCkKLSAgICAgICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9pbnQpIChs
aXN0ICdrZXltYXAga2V5bWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAndnRhYmxlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlLWNhY2hlIGNhY2hlKSkpCi0gICAgICAgIDs7
IFdlIG1heSBoYXZlIGluc2VydGVkIGEgbm9uLW51bWVyaWNhbCB2YWx1ZSBpbnRvIGEgcHJldmlv
dXNseQotICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUuCi0gICAg
ICAgICh2dGFibGUtLXJlY29tcHV0ZS1udW1lcmljYWwgdGFibGUgKGNkciBsaW5lKSkpKSkpCisg
ICAgKGxldCogKChjYWNoZSAodnRhYmxlLS1jdXJyZW50LWNhY2hlIHRhYmxlKSkKKyAgICAgICAg
ICAgKGluaGliaXQtcmVhZC1vbmx5IHQpCisgICAgICAgICAgIChsaW5lcyAodnRhYmxlLS1jYWNo
ZS1saW5lcyBjYWNoZSkpCisgICAgICAgICAgIChlbGVtIChpZiBsb2NhdGlvbiAgOyBUaGlzIGJp
bmRpbmcgbWlycm9ycyB0aGUgYmluZGluZyBvZiBgcG9zJyBhYm92ZS4KKyAgICAgICAgICAgICAg
ICAgICAgIChpZiAoaW50ZWdlcnAgbG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAg
KG50aCBsb2NhdGlvbiBsaW5lcykKKyAgICAgICAgICAgICAgICAgICAgICAgKG9yIChhc3NxIGxv
Y2F0aW9uIGxpbmVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBiZWZvcmUgKGNh
ciBsaW5lcykpKSkKKyAgICAgICAgICAgICAgICAgICAoaWYgYmVmb3JlIChjYXIgbGluZXMpKSkp
CisgICAgICAgICAgIChwb3MgKG1lbXEgZWxlbSBsaW5lcykpCisgICAgICAgICAgIChsaW5lIChj
b25zIG9iamVjdCAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpKSkK
KyAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKQorICAgICAg
ICAoc2F2ZS1leGN1cnNpb24KKyAgICAgICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCisg
ICAgICAgICAgKGxldCogKChlbGxpcHNpcyAoaWYgKHZ0YWJsZS1lbGxpcHNpcyB0YWJsZSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAodHJ1bmNhdGUtc3RyaW5n
LWVsbGlwc2lzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdm
YWNlICh2dGFibGUtZmFjZSB0YWJsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIi
KSkKKyAgICAgICAgICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGgg
ZWxsaXBzaXMgKGN1cnJlbnQtYnVmZmVyKSkpCisgICAgICAgICAgICAgICAgIChrZXltYXAgKGdl
dC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1hcCkpKQorICAgICAgICAgICAgKGlmIChvciBi
ZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgKGFuZCBwb3MgKGludGVnZXJwIGxvY2F0aW9uKSkp
CisgICAgICAgICAgICAgICAgOzsgQWRkIHRoZSBuZXcgb2JqZWN0IGJlZm9yZTouCisgICAgICAg
ICAgICAgICAgKGxldCAoKG9sZC1saW5lIChjYXIgcG9zKSkpCisgICAgICAgICAgICAgICAgICAo
c2V0Y2FyIHBvcyBsaW5lKQorICAgICAgICAgICAgICAgICAgKHNldGNkciBwb3MgKGNvbnMgb2xk
LWxpbmUgKGNkciBwb3MpKSkKKyAgICAgICAgICAgICAgICAgICh1bmxlc3MgKHZ0YWJsZS1nb3Rv
LW9iamVjdCAoY2FyIGVsZW0pKQorICAgICAgICAgICAgICAgICAgICAodnRhYmxlLWJlZ2lubmlu
Zy1vZi10YWJsZSkpKQorICAgICAgICAgICAgICA7OyBPdGhlcndpc2UsIGFkZCB0aGUgb2JqZWN0
IGFmdGVyLgorICAgICAgICAgICAgICAoaWYgcG9zCisgICAgICAgICAgICAgICAgICA7OyBTcGxp
Y2UgdGhlIG9iamVjdCBpbnRvIHRoZSBsaXN0LgorICAgICAgICAgICAgICAgICAgKHByb2duCisg
ICAgICAgICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIGxpbmUgKGNkciBwb3MpKSkKKyAg
ICAgICAgICAgICAgICAgICAgKGlmICh2dGFibGUtZ290by1vYmplY3QgbG9jYXRpb24pCisgICAg
ICAgICAgICAgICAgICAgICAgICAoZm9yd2FyZC1saW5lIDEpICA7IEluc2VydCAqYWZ0ZXIqLgor
ICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCisgICAgICAgICAg
ICAgICAgOzsgT3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVjdC4KKyAgICAgICAgICAgICAgICAo
c2V0Y2FyIGNhY2hlIChuY29uYyBsaW5lcyAobGlzdCBsaW5lKSkpCisgICAgICAgICAgICAgICAg
KHZ0YWJsZS1lbmQtb2YtdGFibGUpKSkKKyAgICAgICAgICAgIChsZXQgKChzdGFydCAocG9pbnQp
KSkKKyAgICAgICAgICAgICAgOzsgRklYTUU6IFdlIGhhdmUgdG8gYWRqdXN0IGNvbG9ycyBpbiBs
aW5lcyBiZWxvdyB0aGlzIGlmIHdlCisgICAgICAgICAgICAgIDs7IGhhdmUgOnJvdy1jb2xvcnMu
CisgICAgICAgICAgICAgICh2dGFibGUtLWluc2VydC1saW5lIHRhYmxlIGxpbmUgMAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLXNwYWNlciB0YWJs
ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMgZWxsaXBzaXMt
d2lkdGgpCisgICAgICAgICAgICAgIChhZGQtdGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkg
KGxpc3QgJ2tleW1hcCBrZXltYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAndnRhYmxlIHRhYmxlKSkpCisgICAgICAgICAgICA7OyBXZSBt
YXkgaGF2ZSBpbnNlcnRlZCBhIG5vbi1udW1lcmljYWwgdmFsdWUgaW50byBhIHByZXZpb3VzbHkK
KyAgICAgICAgICAgIDs7IGFsbC1udW1lcmljYWwgdGFibGUsIHNvIHJlY29tcHV0ZS4KKyAgICAg
ICAgICAgICh2dGFibGUtLXJlY29tcHV0ZS1udW1lcmljYWwgdGFibGUgKGNkciBsaW5lKSkpKSkp
KSkKIAogKGRlZnVuIHZ0YWJsZS1jb2x1bW4gKHRhYmxlIGluZGV4KQogICAiUmV0dXJuIHRoZSBu
YW1lIG9mIHRoZSBJTkRFWHRoIGNvbHVtbiBpbiBUQUJMRS4iCkBAIC01MjAsMTQgKzUyNCwxNCBA
QCB2dGFibGUtLWNhY2hlLXdpZHRocwogKGRlZnVuIHZ0YWJsZS0tY2FjaGUtbGluZXMgKGNhY2hl
KQogICAoY2FyIGNhY2hlKSkKIAotKGRlZnVuIHZ0YWJsZS1pbnNlcnQgKHRhYmxlKQorKGRlZnVu
IHZ0YWJsZS0taW5zZXJ0ICh0YWJsZSkKICAgKGxldCogKChzcGFjZXIgKHZ0YWJsZS0tc3BhY2Vy
IHRhYmxlKSkKICAgICAgICAgIChzdGFydCAocG9pbnQpKQogICAgICAgICAgKGVsbGlwc2lzIChp
ZiAodnRhYmxlLWVsbGlwc2lzIHRhYmxlKQogICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVy
dGl6ZSAodHJ1bmNhdGUtc3RyaW5nLWVsbGlwc2lzKQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAnZmFjZSAodnRhYmxlLWZhY2UgdGFibGUpKQogICAgICAgICAgICAgICAgICAg
ICAgIiIpKQotICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggZWxs
aXBzaXMpKQorICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggZWxs
aXBzaXMgKHZ0YWJsZS1idWZmZXIgdGFibGUpKSkKICAgICAgICAgIDs7IFdlIG1haW50YWluIGEg
Y2FjaGUgcGVyIHNjcmVlbi93aW5kb3cgd2lkdGgsIHNvIHRoYXQgd2UgcmVuZGVyCiAgICAgICAg
ICA7OyBjb3JyZWN0bHkgaWYgRW1hY3MgaXMgb3BlbiBvbiB0d28gZGlmZmVyZW50IHNjcmVlbnMg
KG9yIHRoZQogICAgICAgICAgOzsgdXNlciByZXNpemVzIHRoZSBmcmFtZSkuCkBAIC01NDksOCAr
NTUzLDcgQEAgdnRhYmxlLWluc2VydAogICAgICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFy
dCAocG9pbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0ICdrZXltYXAgdnRh
YmxlLWhlYWRlci1saW5lLW1hcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAn
cmVhci1ub25zdGlja3kgdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRh
YmxlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2dGFibGUtY2Fj
aGUgY2FjaGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlIHRh
YmxlKSkKICAgICAgICAgKHNldHEgc3RhcnQgKHBvaW50KSkpKQogICAgICh2dGFibGUtLXNvcnQg
dGFibGUgY2FjaGUpCiAgICAgOzsgSW5zZXJ0IHRoZSBkYXRhLgpAQCAtNTYxLDEzICs1NjQsMjkg
QEAgdnRhYmxlLWluc2VydAogICAgICAgICAoc2V0cSBsaW5lLW51bWJlciAoMSsgbGluZS1udW1i
ZXIpKSkpCiAgICAgKGFkZC10ZXh0LXByb3BlcnRpZXMgc3RhcnQgKHBvaW50KQogICAgICAgICAg
ICAgICAgICAgICAgICAgIChsaXN0ICdyZWFyLW5vbnN0aWNreSB0Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICd2dGFibGUtY2FjaGUgY2FjaGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICd2dGFibGUgdGFibGUpKQorICAgIChzZXRmICh2dGFibGUtLWN1cnJlbnQtY2FjaGUgdGFibGUp
IGNhY2hlKQogICAgIChnb3RvLWNoYXIgc3RhcnQpKSkKIAorKGRlZnVuIHZ0YWJsZS1pbnNlcnQg
KHRhYmxlKQorICAiSW5zZXJ0IFRBQkxFIGludG8gdGhlIGN1cnJlbnQgYnVmZmVyLgorVGhlIGN1
cnJlbnQgYnVmZmVyIHdpbGwgYmUgcmVjb3JkZWQgYXMgVEFCTEUncyBidWZmZXIuICBJZiB0aGUg
dGFibGUgaXMKK2luc2VydGVkIGludG8gYSBidWZmZXIgb3RoZXIgdGhhbiBpdHMgb3JpZ2luYXRp
bmcgYnVmZmVyLCBzaWduYWwgYW4KK2Vycm9yLiAgQSB0YWJsZSBtYXkgYmUgcmVpbnNlcnRlZCBp
bnRvIGl0cyBvd24gYnVmZmVyLCBidXQgaW5zZXJ0IG9ubHkKK29uZSBpbnN0YW5jZSBwZXIgYnVm
ZmVyLiAgVGhpcyByZXN0cmljdGlvbiBuZWVkcyB0byBiZSBlbmZvcmNlZCBieSB0aGUKK2NhbGxl
ci4iCisgIChhbmQtbGV0KiAoKHRhYmxlLWJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJsZSkpCisg
ICAgICAgICAgICAgKG5vdCAoZXEgdGFibGUtYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpKSkKKyAg
ICAoZXJyb3IgIkEgdnRhYmxlIGNhbm5vdCBiZSBpbnNlcnRlZCBpbnRvIG1vcmUgdGhhbiBvbmUg
YnVmZmVyIikpCisgIChzZXRmICh2dGFibGUtYnVmZmVyIHRhYmxlKSAoY3VycmVudC1idWZmZXIp
KQorICAobGV0ICgoaW5oaWJpdC1yZWFkLW9ubHkgdCkKKyAgICAgICAgKGluaGliaXQtbW9kaWZp
Y2F0aW9uLWhvb2tzIHQpKQorICAgICh2dGFibGUtLWluc2VydCB0YWJsZSkpKQorCiAoZGVmdW4g
dnRhYmxlLS1pbnNlcnQtbGluZSAodGFibGUgbGluZSBsaW5lLW51bWJlciB3aWR0aHMgc3BhY2Vy
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbmFsIGVsbGlwc2lzIGVs
bGlwc2lzLXdpZHRoKQogICAobGV0ICgoc3RhcnQgKHBvaW50KSkKKyAgICAgICAgKGJ1ZmZlciAo
dnRhYmxlLWJ1ZmZlciB0YWJsZSkpCiAgICAgICAgIChjb2x1bW5zICh2dGFibGUtY29sdW1ucyB0
YWJsZSkpCiAgICAgICAgIChjb2x1bW4tY29sb3JzCiAgICAgICAgICAoYW5kICh2dGFibGUtY29s
dW1uLWNvbG9ycyB0YWJsZSkKQEAgLTYwNywxNiArNjI2LDE4IEBAIHZ0YWJsZS0taW5zZXJ0LWxp
bmUKICAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0CiAgICAgICAgICAgICAgICAgICAgICAg
ICh2dGFibGUtLWxpbWl0LXN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgcHJlLWNvbXB1
dGVkICgtIChlbHQgd2lkdGhzIGluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChvciBlbGxpcHNpcy13aWR0aCAwKSkpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKG9yIGVsbGlwc2lzLXdpZHRoIDApKQorICAgICAgICAgICAgICAg
ICAgICAgICAgYnVmZmVyKQogICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpcykKICAgICAg
ICAgICAgICAgICAgICAgcHJlLWNvbXB1dGVkKSkKICAgICAgICAgICAgICAgICAgOzsgUmVjb21w
dXRlIHdpZHRocy4KICAgICAgICAgICAgICAgICAgKHQKLSAgICAgICAgICAgICAgICAgIChpZiAo
PiAoc3RyaW5nLXBpeGVsLXdpZHRoIHZhbHVlKSAoZWx0IHdpZHRocyBpbmRleCkpCisgICAgICAg
ICAgICAgICAgICAoaWYgKD4gKHN0cmluZy1waXhlbC13aWR0aCB2YWx1ZSBidWZmZXIpIChlbHQg
d2lkdGhzIGluZGV4KSkKICAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0CiAgICAgICAgICAg
ICAgICAgICAgICAgICh2dGFibGUtLWxpbWl0LXN0cmluZwogICAgICAgICAgICAgICAgICAgICAg
ICAgdmFsdWUgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAob3IgZWxsaXBzaXMtd2lkdGggMCkpKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKG9yIGVsbGlwc2lzLXdpZHRoIDApKQorICAgICAgICAgICAgICAgICAgICAgICAg
YnVmZmVyKQogICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpcykKICAgICAgICAgICAgICAg
ICAgICAgdmFsdWUpKSkpCiAgICAgICAgICAgICAgICAoc3RhcnQgKHBvaW50KSkKQEAgLTYzMCwx
NCArNjUxLDE1IEBAIHZ0YWJsZS0taW5zZXJ0LWxpbmUKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGxpc3QgJ3NwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3aWR0aCAo
bGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgrICgtIChlbHQg
d2lkdGhzIGluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChzdHJpbmctcGl4ZWwtd2lkdGggZGlzcGxheWVkKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLXBpeGVsLXdpZHRoCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZCBidWZmZXIpKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBsYXN0IDAgc3Bh
Y2VyKSkpKSkpKQogICAgICAgICAgICAgIDs7IEFsaWduIHRvIHRoZSByaWdodC4KICAgICAgICAg
ICAgICAoaW5zZXJ0IChwcm9wZXJ0aXplICIgIiAnZGlzcGxheQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGxpc3QgJ3NwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICA6d2lkdGggKGxpc3QgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1waXhl
bC13aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBkaXNwbGF5ZWQpKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWQgYnVmZmVyKSkpKSkKICAgICAgICAgICAg
ICAgICAgICAgIGRpc3BsYXllZCkKICAgICAgICAgICAgICAodW5sZXNzIGxhc3QKICAgICAgICAg
ICAgICAgIChpbnNlcnQgKHByb3BlcnRpemUgIiAiICdkaXNwbGF5CkBAIC02NjQsMTYgKzY4Niw2
IEBAIHZ0YWJsZS0taW5zZXJ0LWxpbmUKIChkZWZ1biB2dGFibGUtLWNhY2hlLWtleSAoKQogICAo
Y29ucyAoZnJhbWUtdGVybWluYWwpICh3aW5kb3ctd2lkdGgpKSkKIAotKGRlZnVuIHZ0YWJsZS0t
Y3VycmVudC1jYWNoZSAoKQotICAiUmV0dXJuIHRoZSBjdXJyZW50IGNhY2hlIGZvciB0aGUgdGFi
bGUgYXQgcG9pbnQuCi0KLUluIGB2dGFibGUtaW5zZXJ0JywgdGhlIGxpbmVzIGFuZCB3aWR0aHMg
b2YgdGhlIHZ0YWJsZSB0ZXh0IGFyZSBjb21wdXRlZAotYmFzZWQgb24gdGhlIGN1cnJlbnQgc2Vs
ZWN0ZWQgZnJhbWUgYW5kIHdpbmRvdyBhbmQgc3RvcmVkIGluIGEgY2FjaGUuCi1TdWJzZXF1ZW50
IGludGVyYWN0aW9uIHdpdGggdGhlIHRleHQgb2YgdGhlIHZ0YWJsZSBzaG91bGQgdXNlIHRoYXQg
Y2FjaGUKLXZpYSB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIGJ5IGNhbGxpbmcgYHZ0YWJsZS0t
Y2FjaGUta2V5JyB0byBsb29rIHVwCi10aGUgY2FjaGUuIgotICAoZ2V0LXRleHQtcHJvcGVydHkg
KHBvaW50KSAndnRhYmxlLWNhY2hlKSkKLQogKGRlZnVuIHZ0YWJsZS0tY2xlYXItY2FjaGUgKHRh
YmxlKQogICAoc2V0ZiAoZ2V0aGFzaCAodnRhYmxlLS1jYWNoZS1rZXkpIChzbG90LXZhbHVlIHRh
YmxlICctY2FjaGUpKSBuaWwpKQogCkBAIC03MTgsNiArNzMwLDcgQEAgdnRhYmxlLS1pbmRpY2F0
b3IKIChkZWZ1biB2dGFibGUtLWluc2VydC1oZWFkZXItbGluZSAodGFibGUgd2lkdGhzIHNwYWNl
cikKICAgOzsgSW5zZXJ0IHRoZSBoZWFkZXIgZGlyZWN0bHkgaW50byB0aGUgYnVmZmVyLgogICAo
bGV0ICgoc3RhcnQgKHBvaW50KSkKKyAgICAgICAgKGJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJs
ZSkpCiAgICAgICAgIChkaXZpZGVyICh2dGFibGUtZGl2aWRlciB0YWJsZSkpCiAgICAgICAgIChj
bWFwIChkZWZpbmUta2V5bWFwCiAgICAgICAgICAgICAgICAgIjxoZWFkZXItbGluZT4gPGRyYWct
bW91c2UtMT4iICMndnRhYmxlLS1kcmFnLXJlc2l6ZS1jb2x1bW4KQEAgLTczNywxNCArNzUwLDE1
IEBAIHZ0YWJsZS0taW5zZXJ0LWhlYWRlci1saW5lCiAgICAgICAgICAgICAgICAgICAgICAna2V5
bWFwIGNtYXApKQogICAgICAgICAgICAgICAoc3RhcnQgKHBvaW50KSkKICAgICAgICAgICAgICAg
KGluZGljYXRvciAodnRhYmxlLS1pbmRpY2F0b3IgdGFibGUgaW5kZXgpKQotICAgICAgICAgICAg
ICAoaW5kaWNhdG9yLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggaW5kaWNhdG9yKSkKKyAgICAg
ICAgICAgICAgKGluZGljYXRvci13aWR0aCAoc3RyaW5nLXBpeGVsLXdpZHRoIGluZGljYXRvciBi
dWZmZXIpKQogICAgICAgICAgICAgICAobGFzdCAoPSBpbmRleCAoMS0gKGxlbmd0aCAodnRhYmxl
LWNvbHVtbnMgdGFibGUpKSkpKQogICAgICAgICAgICAgICBkaXNwbGF5ZWQpCiAgICAgICAgICAo
c2V0cSBkaXNwbGF5ZWQKLSAgICAgICAgICAgICAgIChpZiAoPiAoc3RyaW5nLXBpeGVsLXdpZHRo
IG5hbWUpCisgICAgICAgICAgICAgICAoaWYgKD4gKHN0cmluZy1waXhlbC13aWR0aCBuYW1lIGJ1
ZmZlcikKICAgICAgICAgICAgICAgICAgICAgICAoLSAoZWx0IHdpZHRocyBpbmRleCkgaW5kaWNh
dG9yLXdpZHRoKSkKICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1saW1pdC1zdHJpbmcKLSAg
ICAgICAgICAgICAgICAgICAgbmFtZSAoLSAoZWx0IHdpZHRocyBpbmRleCkgaW5kaWNhdG9yLXdp
ZHRoKSkKKyAgICAgICAgICAgICAgICAgICAgbmFtZSAoLSAoZWx0IHdpZHRocyBpbmRleCkgaW5k
aWNhdG9yLXdpZHRoKQorICAgICAgICAgICAgICAgICAgICBidWZmZXIpCiAgICAgICAgICAgICAg
ICAgIG5hbWUpKQogICAgICAgICAgKGxldCogKChpbmRpY2F0b3ItbGVhZC13aWR0aAogICAgICAg
ICAgICAgICAgICA7OyBXZSB3YW50IHRoZSBpbmRpY2F0b3IgdG8gbm90IGJlIHF1aXRlIGZsdXNo
IHJpZ2h0LgpAQCAtNzUzLDcgKzc2Nyw3IEBAIHZ0YWJsZS0taW5zZXJ0LWhlYWRlci1saW5lCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yLWxlYWQtd2lk
dGgpKQogICAgICAgICAgICAgICAgIChmaWxsLXdpZHRoCiAgICAgICAgICAgICAgICAgICgrICgt
IChlbHQgd2lkdGhzIGluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLXBpeGVs
LXdpZHRoIGRpc3BsYXllZCkKKyAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1waXhlbC13
aWR0aCBkaXNwbGF5ZWQgYnVmZmVyKQogICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3It
d2lkdGgKICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yLWxlYWQtd2lkdGgpCiAgICAg
ICAgICAgICAgICAgICAgIChpZiBsYXN0IDAgc3BhY2VyKSkpKQpAQCAtNzcxLDcgKzc4NSw4IEBA
IHZ0YWJsZS0taW5zZXJ0LWhlYWRlci1saW5lCiAgICAgICAgICAgICAgOzsgVGhpcyBpcyB0aGUg
ZmluYWwgY29sdW1uLCBhbmQgd2UgaGF2ZSBhIHNvcnRpbmcKICAgICAgICAgICAgICA7OyBpbmRp
Y2F0b3IsIGFuZCB0aGUgdGFibGUgaXMgdG9vIHdpZGUgZm9yIHRoZSB3aW5kb3cuCiAgICAgICAg
ICAgICAgKGxldCogKChwcmUtaW5kaWNhdG9yIChzdHJpbmctcGl4ZWwtd2lkdGgKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludC1taW4p
IChwb2ludCkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXIt
c3Vic3RyaW5nIChwb2ludC1taW4pIChwb2ludCkpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBidWZmZXIpKQogICAgICAgICAgICAgICAgICAgICAocHJlLWZpbGwKICAgICAg
ICAgICAgICAgICAgICAgICgtICh3aW5kb3ctd2lkdGggbmlsIHQpCiAgICAgICAgICAgICAgICAg
ICAgICAgICBwcmUtaW5kaWNhdG9yCkBAIC04NTAsMTQgKzg2NSwxNiBAQCB2dGFibGUtLXNldC1o
ZWFkZXItbGluZQogICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQtbWluKSAoMS0g
KHBvaW50LW1heCkpKSkpKQogICAodnRhYmxlLWhlYWRlci1tb2RlIDEpKQogCi0oZGVmdW4gdnRh
YmxlLS1saW1pdC1zdHJpbmcgKHN0cmluZyBwaXhlbHMpCisKKyhkZWZ1biB2dGFibGUtLWxpbWl0
LXN0cmluZyAoc3RyaW5nIHBpeGVscyBidWZmZXIpCiAgICh3aGlsZSAoYW5kIChsZW5ndGg+IHN0
cmluZyAwKQotICAgICAgICAgICAgICAoPiAoc3RyaW5nLXBpeGVsLXdpZHRoIHN0cmluZykgcGl4
ZWxzKSkKKyAgICAgICAgICAgICAgKD4gKHN0cmluZy1waXhlbC13aWR0aCBzdHJpbmcgYnVmZmVy
KSBwaXhlbHMpKQogICAgIChzZXRxIHN0cmluZyAoc3Vic3RyaW5nIHN0cmluZyAwICgxLSAobGVu
Z3RoIHN0cmluZykpKSkpCiAgIHN0cmluZykKIAogKGRlZnVuIHZ0YWJsZS0tY2hhci13aWR0aCAo
dGFibGUpCi0gIChzdHJpbmctcGl4ZWwtd2lkdGggKHByb3BlcnRpemUgIngiICdmYWNlICh2dGFi
bGUtZmFjZSB0YWJsZSkpKSkKKyAgKHN0cmluZy1waXhlbC13aWR0aCAocHJvcGVydGl6ZSAieCIg
J2ZhY2UgKHZ0YWJsZS1mYWNlIHRhYmxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAodnRhYmxl
LWJ1ZmZlciB0YWJsZSkpKQogCiAoZGVmdW4gdnRhYmxlLS1jb21wdXRlLXdpZHRoICh0YWJsZSBz
cGVjKQogICAoY29uZApAQCAtOTM2LDcgKzk1Myw3IEBAIHZ0YWJsZS0tY29tcHV0ZS1jYWNoZWQt
bGluZQogICAgICAgIDs7IFdlIHN0YXNoIHRoZSBjb21wdXRlZCB3aWR0aCBhbmQgc3RyaW5nIGhl
cmUgLS0gaWYgdGhlcmUgYXJlCiAgICAgICAgOzsgbm8gZm9ybWF0dGVycy9kaXNwbGF5ZXJzLCB3
ZSdsbCBiZSB1c2luZyB0aGUgc3RyaW5nLCBhbmQKICAgICAgICA7OyB0aGVuIHdvbid0IGhhdmUg
dG8gcmVjcmVhdGUgaXQuCi0gICAgICAgKGxpc3QgdmFsdWUgKHN0cmluZy1waXhlbC13aWR0aCBz
dHJpbmcpIHN0cmluZykpKQorICAgICAgIChsaXN0IHZhbHVlIChzdHJpbmctcGl4ZWwtd2lkdGgg
c3RyaW5nICh2dGFibGUtYnVmZmVyIHRhYmxlKSkgc3RyaW5nKSkpCiAgICAodnRhYmxlLWNvbHVt
bnMgdGFibGUpKSkKIAogKGRlZnVuIHZ0YWJsZS0tbWFrZS1rZXltYXAgKHRhYmxlKQpAQCAtOTY3
LDIwICs5ODQsMjEgQEAgdnRhYmxlLS1tYWtlLWtleW1hcAogICAgICAgICAgICh2dGFibGUta2V5
bWFwIHRhYmxlKSkKICAgICAgIG1hcCkpKQogCi0oZGVmdW4gdnRhYmxlLXJldmVydCAoKQotICAi
UmVnZW5lcmF0ZSB0aGUgdGFibGUgdW5kZXIgcG9pbnQuIgotICAobGV0ICgodGFibGUgKHZ0YWJs
ZS1jdXJyZW50LXRhYmxlKSkKLSAgICAgICAgKG9iamVjdCAodnRhYmxlLWN1cnJlbnQtb2JqZWN0
KSkKLSAgICAgICAgKGNvbHVtbiAodnRhYmxlLWN1cnJlbnQtY29sdW1uKSkKLSAgICAgICAgKGlu
aGliaXQtcmVhZC1vbmx5IHQpKQotICAgICh1bmxlc3MgdGFibGUKLSAgICAgICh1c2VyLWVycm9y
ICJObyB0YWJsZSB1bmRlciBwb2ludCIpKQotICAgIChkZWxldGUtcmVnaW9uICh2dGFibGUtYmVn
aW5uaW5nLW9mLXRhYmxlKSAodnRhYmxlLWVuZC1vZi10YWJsZSkpCi0gICAgKHZ0YWJsZS1pbnNl
cnQgdGFibGUpCi0gICAgKHdoZW4gb2JqZWN0Ci0gICAgICAodnRhYmxlLWdvdG8tb2JqZWN0IG9i
amVjdCkpCi0gICAgKHdoZW4gY29sdW1uCi0gICAgICAodnRhYmxlLWdvdG8tY29sdW1uIGNvbHVt
bikpKSkKKyhkZWZ1biB2dGFibGUtcmV2ZXJ0ICgmb3B0aW9uYWwgdGFibGUpCisgICJSZWdlbmVy
YXRlIFRBQkxFLCBkZWZhdWx0aW5nIHRvIHRoZSB0YWJsZSB1bmRlciBwb2ludC4iCisgIChzZXRx
IHRhYmxlIChvciB0YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKSkKKyAgKHVubGVzcyB0YWJs
ZQorICAgICh1c2VyLWVycm9yICJObyB0YWJsZSB1bmRlciBwb2ludCIpKQorICAod2l0aC1jdXJy
ZW50LWJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJsZSkKKyAgICAobGV0ICgob2JqZWN0ICh2dGFi
bGUtY3VycmVudC1vYmplY3QpKQorICAgICAgICAgIChjb2x1bW4gKHZ0YWJsZS1jdXJyZW50LWNv
bHVtbikpCisgICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQpKQorICAgICAgKGRlbGV0ZS1y
ZWdpb24gKHZ0YWJsZS1iZWdpbm5pbmctb2YtdGFibGUpICh2dGFibGUtZW5kLW9mLXRhYmxlKSkK
KyAgICAgICh2dGFibGUtLWluc2VydCB0YWJsZSkKKyAgICAgICh3aGVuIG9iamVjdAorICAgICAg
ICAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVjdCkpCisgICAgICAod2hlbiBjb2x1bW4KKyAgICAg
ICAgKHZ0YWJsZS1nb3RvLWNvbHVtbiBjb2x1bW4pKSkpKQogCiA7OzsgQ29tbWFuZHMuCiAKQEAg
LTEwMDYsMTQgKzEwMjQsMTQgQEAgdnRhYmxlLW5hcnJvdy1jdXJyZW50LWNvbHVtbgogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoLSAoKiAodnRhYmxlLS1jaGFyLXdpZHRoIHRhYmxl
KSAob3IgbiAxKSkpKSkpCiAKIChkZWZ1biB2dGFibGUtLWFsdGVyLWNvbHVtbi13aWR0aCAodGFi
bGUgY29sdW1uIGRlbHRhKQotICAobGV0ICgod2lkdGhzICh2dGFibGUtLWNhY2hlLXdpZHRocyAo
dnRhYmxlLS1jdXJyZW50LWNhY2hlKSkpKQorICAobGV0ICgod2lkdGhzICh2dGFibGUtLWNhY2hl
LXdpZHRocyAodnRhYmxlLS1jdXJyZW50LWNhY2hlIHRhYmxlKSkpKQogICAgIChzZXRmIChhcmVm
IHdpZHRocyBjb2x1bW4pCiAgICAgICAgICAgKG1heCAoKiAodnRhYmxlLS1jaGFyLXdpZHRoIHRh
YmxlKSAyKQogICAgICAgICAgICAgICAgKCsgKGFyZWYgd2lkdGhzIGNvbHVtbikgZGVsdGEpKSkK
ICAgICA7OyBTdG9yZSB0aGUgd2lkdGggc28gaXQnbGwgYmUgcmVzcGVjdGVkIG9uIGEgcmV2ZXJ0
LgogICAgIChzZXRmICh2dGFibGUtY29sdW1uLXdpZHRoIChlbHQgKHZ0YWJsZS1jb2x1bW5zIHRh
YmxlKSBjb2x1bW4pKQogICAgICAgICAgIChmb3JtYXQgIiVkcHgiIChhcmVmIHdpZHRocyBjb2x1
bW4pKSkKLSAgICAodnRhYmxlLXJldmVydCkpKQorICAgICh2dGFibGUtcmV2ZXJ0IHRhYmxlKSkp
CiAKIChkZWZ1biB2dGFibGUtd2lkZW4tY3VycmVudC1jb2x1bW4gKCZvcHRpb25hbCBuKQogICAi
V2lkZW4gdGhlIGN1cnJlbnQgY29sdW1uIGJ5IE4gY2hhcmFjdGVycy4KQEAgLTEwMjgsMjQgKzEw
NDYsMjggQEAgdnRhYmxlLXByZXZpb3VzLWNvbHVtbgogICAoaW50ZXJhY3RpdmUpCiAgICh2dGFi
bGUtZ290by1jb2x1bW4KICAgIChtYXggMCAoMS0gKG9yICh2dGFibGUtY3VycmVudC1jb2x1bW4p
Ci0gICAgICAgICAgICAgICAgICAobGVuZ3RoICh2dGFibGUtLWNhY2hlLXdpZHRocyAodnRhYmxl
LS1jdXJyZW50LWNhY2hlKSkpKSkpKSkKKyAgICAgICAgICAgICAgICAgIChsZW5ndGggKHZ0YWJs
ZS0tY2FjaGUtd2lkdGhzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jdXJy
ZW50LWNhY2hlICh2dGFibGUtY3VycmVudC10YWJsZSkpKSkpKSkpKQogCiAoZGVmdW4gdnRhYmxl
LW5leHQtY29sdW1uICgpCiAgICJHbyB0byB0aGUgbmV4dCBjb2x1bW4uIgogICAoaW50ZXJhY3Rp
dmUpCiAgICh3aGVuICh2dGFibGUtY3VycmVudC1jb2x1bW4pCiAgICAgKHZ0YWJsZS1nb3RvLWNv
bHVtbgotICAgICAobWluICgxLSAobGVuZ3RoICh2dGFibGUtLWNhY2hlLXdpZHRocyAodnRhYmxl
LS1jdXJyZW50LWNhY2hlKSkpKQorICAgICAobWluICgxLSAobGVuZ3RoICh2dGFibGUtLWNhY2hl
LXdpZHRocworICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jdXJyZW50LWNhY2hlICh2
dGFibGUtY3VycmVudC10YWJsZSkpKSkpCiAgICAgICAgICAgKDErICh2dGFibGUtY3VycmVudC1j
b2x1bW4pKSkpKSkKIAotKGRlZnVuIHZ0YWJsZS1yZXZlcnQtY29tbWFuZCAoKQorKGRlZnVuIHZ0
YWJsZS1yZXZlcnQtY29tbWFuZCAoJm9wdGlvbmFsIHRhYmxlKQogICAiUmUtcXVlcnkgZGF0YSBh
bmQgcmVnZW5lcmF0ZSB0aGUgdGFibGUgdW5kZXIgcG9pbnQuIgogICAoaW50ZXJhY3RpdmUpCi0g
IChsZXQgKCh0YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKSkKLSAgICAod2hlbiAodnRhYmxl
LW9iamVjdHMtZnVuY3Rpb24gdGFibGUpCi0gICAgICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFi
bGUpIChmdW5jYWxsICh2dGFibGUtb2JqZWN0cy1mdW5jdGlvbiB0YWJsZSkpKSkKLSAgICAodnRh
YmxlLS1jbGVhci1jYWNoZSB0YWJsZSkpCi0gICh2dGFibGUtcmV2ZXJ0KSkKKyAgKHNldHEgdGFi
bGUgKG9yIHRhYmxlICh2dGFibGUtY3VycmVudC10YWJsZSkpKQorICAodW5sZXNzIHRhYmxlCisg
ICAgKHVzZXItZXJyb3IgIk5vIHRhYmxlIGZvdW5kIikpCisgICh3aGVuICh2dGFibGUtb2JqZWN0
cy1mdW5jdGlvbiB0YWJsZSkKKyAgICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpIChmdW5j
YWxsICh2dGFibGUtb2JqZWN0cy1mdW5jdGlvbiB0YWJsZSkpKSkKKyAgKHZ0YWJsZS0tY2xlYXIt
Y2FjaGUgdGFibGUpCisgICh2dGFibGUtcmV2ZXJ0IHRhYmxlKSkKIAogKGRlZnVuIHZ0YWJsZS1z
b3J0LWJ5LWN1cnJlbnQtY29sdW1uICgpCiAgICJTb3J0IHRoZSB0YWJsZSB1bmRlciBwb2ludCBi
eSB0aGUgY29sdW1uIHVuZGVyIHBvaW50LiIKQEAgLTEwNjcsOCArMTA4OSw4IEBAIHZ0YWJsZS1z
b3J0LWJ5LWN1cnJlbnQtY29sdW1uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KGlmIChlcSAoY2RyIGxhc3QpICdhc2NlbmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICdkZXNjZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAn
YXNjZW5kKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNjZW5kKSkpKSkpCi0g
ICh2dGFibGUtcmV2ZXJ0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzY2Vu
ZCkpKSkpCisgICAgKHZ0YWJsZS1yZXZlcnQgdGFibGUpKSkKIAogKGRlZnVuIHZ0YWJsZS1oZWFk
ZXItbGluZS1zb3J0IChlKQogICAiU29ydCBhIHZ0YWJsZSBmcm9tIHRoZSBoZWFkZXIgbGluZS4i
CmRpZmYgLS1naXQgYS90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMuZWwgYi90ZXN0
L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMuZWwKaW5kZXggNzRmYjhjYzgxMzkuLjgzZjgy
NmVhMzUzIDEwMDY0NAotLS0gYS90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMuZWwK
KysrIGIvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsCkBAIC0yNywxNiArMjcs
MTkgQEAKIChyZXF1aXJlICdlcnQpCiAocmVxdWlyZSAnZXJ0LXgpCiAKLShlcnQtZGVmdGVzdCB0
ZXN0LXZzdGFibGUtY29tcHV0ZS1jb2x1bW5zICgpCisoZGVmdW4gdnRhYmxlLXRlc3RzLS1tYWtl
LW5vLWhlYWRlci0yLW9iamVjdC10YWJsZSAoKQorICAobWFrZS12dGFibGUgOmNvbHVtbnMgJygi
YSIgImIiICJjIikKKyAgICAgICAgICAgICAgIDpvYmplY3RzICcoKCJmb28iIDEgMikKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgKCJiYXIiIDMgOnpvdCkpCisgICAgICAgICAgICAgICA6aW5z
ZXJ0IG5pbCkpCisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1jb21wdXRlLWNvbHVtbnMgKCkK
ICAgKHNob3VsZAogICAgKGVxdWFsIChtYXBjYXIKICAgICAgICAgICAgKGxhbWJkYSAoY29sdW1u
KQogICAgICAgICAgICAgICh2dGFibGUtY29sdW1uLWFsaWduIGNvbHVtbikpCiAgICAgICAgICAg
ICh2dGFibGUtLWNvbXB1dGUtY29sdW1ucwotICAgICAgICAgICAgKG1ha2UtdnRhYmxlIDpjb2x1
bW5zICcoImEiICJiIiAiYyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgOm9iamVjdHMgJygo
ImZvbyIgMSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiYXIiIDMg
OnpvdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgOmluc2VydCBuaWwpKSkKKyAgICAgICAg
ICAgICh2dGFibGUtdGVzdHMtLW1ha2Utbm8taGVhZGVyLTItb2JqZWN0LXRhYmxlKSkpCiAgICAg
ICAgICAgJyhsZWZ0IHJpZ2h0IGxlZnQpKSkpCiAKIChlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1p
bnNlcnQtb2JqZWN0ICgpCkBAIC02OSw0ICs3Miw2OSBAQCB0ZXN0LXZ0YWJsZS1pbnNlcnQtb2Jq
ZWN0CiAgICAgICAgICAgICAgIChtYXBjYXIgIydjYWRyICh2dGFibGUtb2JqZWN0cyB0YWJsZSkp
KSkKICAgICAgICAgICAobnVtYmVyLXNlcXVlbmNlIDAgMTEpKSkpCiAKKyhlcnQtZGVmdGVzdCB0
ZXN0LXZ0YWJsZS11bmlxdWUtYnVmZmVyICgpCisgIChsZXQgKCh0YWJsZSAodnRhYmxlLXRlc3Rz
LS1tYWtlLW5vLWhlYWRlci0yLW9iamVjdC10YWJsZSkpKQorICAgICh3aXRoLXRlbXAtYnVmZmVy
CisgICAgICAodnRhYmxlLWluc2VydCB0YWJsZSkKKyAgICAgIDs7IFRoaXMgd2lsbCBydW4gYnV0
IGZhaWwgb24gRW1hY3MgcHJlIDMxIHZ0YWJsZS4KKyAgICAgIChzaG91bGQtZXJyb3IgKHZ0YWJs
ZS1pbnNlcnQgdGFibGUpKQorICAgICAgOzsgVGhpcyB3aWxsIHJ1biBvbmx5IG9uIEVtYWNzIDMx
KyB2dGFibGUuCisgICAgICAod2hlbiAoPiBlbWFjcy1tYWpvci12ZXJzaW9uIDMwKQorICAgICAg
ICAoc2hvdWxkLWVycm9yICh2dGFibGUtc2V0LWJ1ZmZlciB0YWJsZSAoY3VycmVudC1idWZmZXIp
KSkpKSkpCisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItaW5z
ZXJ0LW9iamVjdCAoKQorICAobGV0ICgodGFibGUgKHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFk
ZXItMi1vYmplY3QtdGFibGUpKQorICAgICAgICAob2JqICcoImJheiIgNCA1KSkpCisgICAgKHdp
dGgtdGVtcC1idWZmZXIKKyAgICAgICh2dGFibGUtaW5zZXJ0IHRhYmxlKQorICAgICAgKHNob3Vs
ZCAoPSAoY291bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpIDIpKQorICAgICAgKHdp
dGgtdGVtcC1idWZmZXIKKyAgICAgICAgKHZ0YWJsZS1pbnNlcnQtb2JqZWN0IHRhYmxlIG9iaikp
CisgICAgICAoc2hvdWxkICg9IChjb3VudC1saW5lcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkg
MykpKSkpCisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItcmVt
b3ZlLW9iamVjdCAoKQorICAobGV0ICgodGFibGUgKHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFk
ZXItMi1vYmplY3QtdGFibGUpKQorICAgICAgICAob2JqICcoImJheiIgNCA1KSkpCisgICAgKHdp
dGgtdGVtcC1idWZmZXIKKyAgICAgICh2dGFibGUtaW5zZXJ0IHRhYmxlKQorICAgICAgKHZ0YWJs
ZS1pbnNlcnQtb2JqZWN0IHRhYmxlIG9iaikKKyAgICAgIChzaG91bGQgKD0gKGNvdW50LWxpbmVz
IChwb2ludC1taW4pIChwb2ludC1tYXgpKSAzKSkKKyAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisg
ICAgICAgICh2dGFibGUtcmVtb3ZlLW9iamVjdCB0YWJsZSBvYmopKQorICAgICAgKHNob3VsZCAo
PSAoY291bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpIDIpKSkpKQorCisoZXJ0LWRl
ZnRlc3QgdGVzdC12dGFibGUtbm9uLWN1cnJlbnQtYnVmZmVyLXVwZGF0ZS1vYmplY3QgKCkKKyAg
KGxldCAoKHRhYmxlICh2dGFibGUtdGVzdHMtLW1ha2Utbm8taGVhZGVyLTItb2JqZWN0LXRhYmxl
KSkKKyAgICAgICAgKG9iaiAnKCJiYXoiIDQgNSkpCisgICAgICAgIChvYmotMiAnKCJxdXgiIDYg
NykpKQorICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAodnRhYmxlLWluc2VydCB0YWJsZSkK
KyAgICAgICh2dGFibGUtaW5zZXJ0LW9iamVjdCB0YWJsZSBvYmopCisgICAgICAoc2hvdWxkICg9
IChjb3VudC1saW5lcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkgMykpCisgICAgICAobGV0ICgo
bGluZS0yIChwcm9nbgorICAgICAgICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1p
bikpCisgICAgICAgICAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAyKQorICAgICAgICAgICAg
ICAgICAgICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkgKHBvaW50LW1heCkpKSkpCisgICAg
ICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAgICAgKHZ0YWJsZS11cGRhdGUtb2JqZWN0IHRh
YmxlIG9iai0yIG9iaikpCisgICAgICAgIChsZXQgKChsaW5lLTItbmV3IChwcm9nbgorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAyKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkgKHBvaW50LW1heCkpKSkpCisgICAgICAg
ICAgKHNob3VsZCAoPSAoY291bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpIDMpKQor
ICAgICAgICAgIChzaG91bGQgKG5vdCAoc3RyaW5nPSBsaW5lLTIgbGluZS0yLW5ldykpKSkpKSkp
CisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS0tbGltaXQtc3RyaW5nLXdpdGgtZmFjZS1yZW1h
cHBlZC1idWZmZXIgKCkKKyAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAobGV0ICgodGV4dCAocHJv
cGVydGl6ZSAiWFhYWFgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhY2UgJ3Zhcmlh
YmxlLXBpdGNoKSkpCisgICAgICAoZmFjZS1yZW1hcC1hZGQtcmVsYXRpdmUgJ2RlZmF1bHQgOmhl
aWdodCAxLjUpCisgICAgICAoaWYgKD4gZW1hY3MtbWFqb3ItdmVyc2lvbiAzMCkKKyAgICAgICAg
ICAoc2hvdWxkIChlcQorICAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgICAgICAgICAgICAo
bGVuZ3RoICh2dGFibGUtLWxpbWl0LXN0cmluZyB0ZXh0IDUwIChjdXJyZW50LWJ1ZmZlcikpKSkp
CisgICAgICAgIChzaG91bGQgKGVxCisgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgICAgICAg
ICAgKGxlbmd0aCAodnRhYmxlLS1saW1pdC1zdHJpbmcgdGV4dCA1MCkpKSkpKSkpCisKIDs7OyB2
dGFibGUtdGVzdHMuZWwgZW5kcyBoZXJlCi0tIAoyLjQ3LjEKCg==
--0000000000009290f30645b23193--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 11 Dec 2025 18:23:15 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 11 13:23:15 2025
Received: from localhost ([127.0.0.1]:47250 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vTlJm-0008PY-Sc
	for submit <at> debbugs.gnu.org; Thu, 11 Dec 2025 13:23:15 -0500
Received: from mxout5.mail.janestreet.com ([64.215.233.18]:53515)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <sbaugh@HIDDEN>)
 id 1vTlJj-0008O1-At
 for 79982 <at> debbugs.gnu.org; Thu, 11 Dec 2025 13:23:09 -0500
From: Spencer Baugh <sbaugh@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot, [PATCH] Add vtable buffer
 slot
In-Reply-To: <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
 (=?utf-8?Q?=22St=C3=A9phane?= Marks"'s message of "Thu, 11 Dec 2025
 11:59:43 -0500")
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
 <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
Date: Thu, 11 Dec 2025 13:23:01 -0500
Message-ID: <iercy4kswsa.fsf_-_@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com;
 s=waixah; t=1765477381;
 bh=+aPaI6U1eJAomjuu+mpZ5pwbHktvq4ryMffb/exhMN4=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date;
 b=Bp1MCSp+gfhM/uhUI4VDXr8TBmyQyUnywUR/E+PEC4AyLgNEfZWcVx4z/L2qTjgdg
 5MH9H+CEeiw9VSlV004qkUML2OpWS3KrQg6pB8D7ubouwH3kviOj5drRJU9nguK6zk
 +fA8jqUJ/pUVNr7tPt8ET8e8GQ2gMlynd1DqG46Y1Q/cveo6oH/pJRhUKpMewi4u2O
 VpSoYiXKW1+vYGJU0vX7Un0FvhM7fuXwhB4IxMVQSZ8N0ixwFivPh5FjdTw4x1wuob
 00k7mLq5N2wTIFXYIxPUXOQ2TilGAYqO/g/vCU2e5WiVL2UeGa1SxHY/oOqZbuSWyI
 qXiE8LPawB3aw==
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>  >  (defun vtable-remove-object (table object)
>  >    "Remove OBJECT from TABLE.
>  > @@ -334,14 +350,15 @@ vtable-remove-object
>  >    ;; First remove from the objects.
>  >    (setf (vtable-objects table) (delq object (vtable-objects table)))
>  >    ;; Then adjust the cache and display.
>  > -  (save-excursion
>  > -    (vtable-goto-table table)
>  > -    (let ((cache (vtable--current-cache))
>  > -          (inhibit-read-only t))
>  > -      (setcar cache (delq (assq object (vtable--cache-lines cache))
>  > -                          (vtable--cache-lines cache)))
>  > -      (when (vtable-goto-object object)
>  > -        (delete-line)))))
>  > +  (with-current-buffer (vtable-buffer table)
>  > +    (save-excursion
>  > +      (vtable-goto-table table)
>  > +      (let ((cache (vtable--current-cache))
>
>  Maybe we won't need this vtable-goto-table if we make
>  vtable--current-cache take the table?
>
> The goto-object calls require point being in the table.
>=20=20
>  > +               (inhibit-read-only t)
>  > +               (keymap (get-text-property (point) 'keymap))
>  > +               (ellipsis (if (vtable-ellipsis table)
>  > +                             (propertize (truncate-string-ellipsis)
>  > +                                         'face (vtable-face table))
>  > +                           ""))
>  > +               (ellipsis-width (string-pixel-width ellipsis (current-=
buffer)))
>  > +               (lines (vtable--cache-lines cache))
>  > +               (elem (if location  ; This binding mirrors the binding=
 of `pos' above.
>  > +                         (if (integerp location)
>  > +                             (nth location lines)
>  > +                           (or (assq location lines)
>  > +                               (and before (car lines))))
>  > +                       (if before (car lines))))
>  > +               (pos (memq elem lines))
>  > +               (line (cons object (vtable--compute-cached-line table =
object))))
>
>  Hmm... I think this is the only thing in these let-bindings which
>  depends on the current buffer (besides vtable--current-cache which
>  should take the buffer as an argument).
>
> I reworked that code a bit to narrow the w-c-b scope.
>
>  If we made vtable--compute-cached-line take the buffer and explicitly
>  passed it to string-pixel-width in there, I think we'd be able to bind
>  with-current-buffer around much less code.
>
> Not needed. I changed the string-pixel-width call to include vtable-buffe=
r.

Oh, smart, much better.

> -St=C3=A9phane=20
>
> From 1c104f1b29aa9e396005ae73394a2f49104361c6 Mon Sep 17 00:00:00 2001
> From: =3D?UTF-8?q?St=3DC3=3DA9phane=3D20Marks?=3D <shipmints@HIDDEN>
> Date: Wed, 10 Dec 2025 09:20:02 -0500
> Subject: [PATCH] Add vtable buffer slot
>
> This solves for background vtable mutations, i.e., updates
> initiated from buffers other than the vtable buffer, and for
> buffer-adjusted string-pixel-width computations.
>
> * lisp/emacs-lisp/vtable.el (vtable): New '-buffer' slot.
> (vtable-buffer):
> (vtable-set-buffer): New function.
> (vtable-update-object):
> (vtable-remove-object):
> (vtable-insert-object): Wrap operation with the vtable buffer.
> (vtable--insert): Split from old 'vtable-insert'.
> (vtable-insert): Insert table and record the buffer.
> (vtable--insert-line):
> (vtable--insert-header-line): Use 'vtable-buffer' for pixel-width computa=
tion.
> (vtable--limit-string):
> (vtable--char-width): Pass buffer to 'string-pixel-width'.
> (vtable-revert): New optional table argument.
> (vtable--alter-column-width):
> (vtable-revert-command):
> (vtable-sort-by-current-column): Call 'vtable-revert' with the table.
>
> * test/lisp/emacs-lisp/vtable-tests.el
> (vtable-tests--make-no-header-2-object-table): New helper
> function.
> (test-vstable-compute-columns): Correct typo in test name.  Use
> new helper function.
> (test-vtable-unique-buffer)
> (test-vtable-non-current-buffer-insert-object)
> (test-vtable-non-current-buffer-remove-object)
> (test-vtable-non-current-buffer-update-object)
> (test-vtable--limit-string-with-face-remapped-buffer): New test.
> ---
>  lisp/emacs-lisp/vtable.el            | 284 ++++++++++++++++-----------
>  test/lisp/emacs-lisp/vtable-tests.el |  78 +++++++-
>  2 files changed, 239 insertions(+), 123 deletions(-)
>
> diff --git a/lisp/emacs-lisp/vtable.el b/lisp/emacs-lisp/vtable.el
> index bcdd280fb92..f4d87581dfa 100644
> --- a/lisp/emacs-lisp/vtable.el
> +++ b/lisp/emacs-lisp/vtable.el
> @@ -68,7 +68,9 @@ vtable
>     (column-colors :initarg :column-colors :accessor vtable-column-colors)
>     (row-colors :initarg :row-colors :accessor vtable-row-colors)
>     (-cached-colors :initform nil)
> +   (-buffer :initform nil)
>     (-cache :initform (make-hash-table :test #'equal))
> +   (-current-cache :initform nil)

Nice.

One alternative is to save -current-cache-key instead and look it up in
-cache, but saving -current-cache is fine.

A thought for the future, not for this patch: We probably should have a
-current-window-width slot of the vtable, which is set whenever we
vtable-revert, and then use it in all the places that currently call
window-width.  That would make us more correct in a bunch of cases, I
think.  Then the cache key would be (cons (frame-terminal)
-current-window-width), so if we just saved -current-frame-terminal as
well, we would be able to compute (vtable--current-cache-key table), and
remove -current-cache/-current-cache-key.

>     (-cached-keymap :initform nil)
>     (-has-column-spec :initform nil))
>    "An object to hold the data for a table.")
> @@ -221,6 +223,20 @@ vtable--face-color
>=20=20
>  ;;; Interface utility functions.
>=20=20
> +(defun vtable-buffer (&optional table)

This should be a mandatory argument.

And if it's a mandatory argument then this can just be defined with a
:accessor keyword argument in the defclass.

Also while we're at it, I think the slot name should be just 'buffer not
'-buffer.

> +  "Return the buffer associated with TABLE.
> +If TABLE is nil, use the table under point.  Return nil if the table has
> +not been inserted into a buffer."
> +  (slot-value (or table (vtable-current-table))
> +              '-buffer))
> +
> +(defun vtable-set-buffer (buffer &optional table)

Again this should be a mandatory argument.

But also I think this then just becomes a trivial

(setf (vtable-buffer table) buffer)

and probably that doesn't need a helper function.

> +  "Associate BUFFER with TABLE.
> +If TABLE is nil, use the table under point."
> +  (setf (slot-value (or table (vtable-current-table))
> +                    '-buffer)
> +        buffer))
> +
>  (defun vtable-current-table ()
>    "Return the table under point."
>    (get-text-property (point) 'vtable))
> @@ -301,14 +317,14 @@ vtable-update-object
>        (unless (cdr objects)
>          (error "Can't find the old object"))
>        (setcar (cdr objects) object))
> -    ;; Then update the rendered vtable in the current buffer.
> -    (if-let* ((cache (vtable--current-cache))
> -             (line-number (seq-position (vtable--cache-lines cache)
> -                                        old-object
> -                                        (lambda (a b)
> -                                          (equal (car a) b))))
> -             (line (elt (vtable--cache-lines cache) line-number)))
> -        (progn
> +    ;; Then update the rendered vtable in its buffer.
> +    (if-let* ((cache (vtable--current-cache table))
> +              (line-number (seq-position (vtable--cache-lines cache)
> +                                         old-object
> +                                         (lambda (a b)
> +                                           (equal (car a) b))))
> +              (line (elt (vtable--cache-lines cache) line-number)))
> +        (with-current-buffer (vtable-buffer table)
>            (setcar line object)
>            (setcdr line (vtable--compute-cached-line table object))
>            ;; ... and redisplay the line in question.
> @@ -321,8 +337,7 @@ vtable-update-object
>                                     (vtable--cache-widths cache)
>                                     (vtable--spacer table))
>                (add-text-properties start (point) (list 'keymap keymap
> -                                                       'vtable table
> -                                                       'vtable-cache cac=
he))))
> +                                                       'vtable table))))
>            ;; We may have inserted a non-numerical value into a previously
>            ;; all-numerical table, so recompute.
>            (vtable--recompute-numerical table (cdr line)))
> @@ -334,14 +349,15 @@ vtable-remove-object
>    ;; First remove from the objects.
>    (setf (vtable-objects table) (delq object (vtable-objects table)))
>    ;; Then adjust the cache and display.
> -  (save-excursion
> -    (vtable-goto-table table)
> -    (let ((cache (vtable--current-cache))
> -          (inhibit-read-only t))
> -      (setcar cache (delq (assq object (vtable--cache-lines cache))
> -                          (vtable--cache-lines cache)))
> -      (when (vtable-goto-object object)
> -        (delete-line)))))
> +  (with-current-buffer (vtable-buffer table)
> +    (save-excursion
> +      (vtable-goto-table table)
> +      (let ((cache (vtable--current-cache table))
> +            (inhibit-read-only t))
> +        (setcar cache (delq (assq object (vtable--cache-lines cache))
> +                            (vtable--cache-lines cache)))
> +        (when (vtable-goto-object object)
> +          (delete-line))))))
>=20=20
>  ;; FIXME: The fact that the `location' argument of
>  ;; `vtable-insert-object' can be an integer and is then interpreted as
> @@ -369,8 +385,9 @@ vtable-insert-object
>        (progn
>          (setf (vtable-objects table) (list object))
>          (vtable--recompute-numerical table (vtable--compute-cached-line =
table object))
> -        (vtable-goto-table table)
> -        (vtable-revert-command))
> +        (with-current-buffer (vtable-buffer table)
> +          (vtable-goto-table table)
> +          (vtable-revert-command)))
>      ;; First insert into the objects.
>      (let ((pos (if location
>                     (if (integerp location)
> @@ -398,56 +415,57 @@ vtable-insert-object
>            ;; Otherwise, append the object.
>            (nconc (vtable-objects table) (list object)))))
>      ;; Then adjust the cache and display.
> -    (save-excursion
> -      (vtable-goto-table table)
> -      (let* ((cache (vtable--current-cache))
> -             (inhibit-read-only t)
> -             (keymap (get-text-property (point) 'keymap))
> -             (ellipsis (if (vtable-ellipsis table)
> -                           (propertize (truncate-string-ellipsis)
> -                                       'face (vtable-face table))
> -                         ""))
> -             (ellipsis-width (string-pixel-width ellipsis))
> -             (lines (vtable--cache-lines cache))
> -             (elem (if location  ; This binding mirrors the binding of `=
pos' above.
> -                       (if (integerp location)
> -                           (nth location lines)
> -                         (or (assq location lines)
> -                             (and before (car lines))))
> -                     (if before (car lines))))
> -             (pos (memq elem lines))
> -             (line (cons object (vtable--compute-cached-line table objec=
t))))
> -        (if (or before
> -                (and pos (integerp location)))
> -            ;; Add the new object before:.
> -            (let ((old-line (car pos)))
> -              (setcar pos line)
> -              (setcdr pos (cons old-line (cdr pos)))
> -              (unless (vtable-goto-object (car elem))
> -                (vtable-beginning-of-table)))
> -          ;; Otherwise, add the object after.
> -          (if pos
> -              ;; Splice the object into the list.
> -              (progn
> -                (setcdr pos (cons line (cdr pos)))
> -                (if (vtable-goto-object location)
> -                    (forward-line 1)  ; Insert *after*.
> -                  (vtable-end-of-table)))
> -            ;; Otherwise, append the object.
> -            (setcar cache (nconc lines (list line)))
> -            (vtable-end-of-table)))
> -        (let ((start (point)))
> -          ;; FIXME: We have to adjust colors in lines below this if we
> -          ;; have :row-colors.
> -          (vtable--insert-line table line 0
> -                               (vtable--cache-widths cache) (vtable--spa=
cer table)
> -                               ellipsis ellipsis-width)
> -          (add-text-properties start (point) (list 'keymap keymap
> -                                                   'vtable table
> -                                                   'vtable-cache cache)))
> -        ;; We may have inserted a non-numerical value into a previously
> -        ;; all-numerical table, so recompute.
> -        (vtable--recompute-numerical table (cdr line))))))
> +    (let* ((cache (vtable--current-cache table))
> +           (inhibit-read-only t)
> +           (lines (vtable--cache-lines cache))
> +           (elem (if location  ; This binding mirrors the binding of `po=
s' above.
> +                     (if (integerp location)
> +                         (nth location lines)
> +                       (or (assq location lines)
> +                           (and before (car lines))))
> +                   (if before (car lines))))
> +           (pos (memq elem lines))
> +           (line (cons object (vtable--compute-cached-line table object)=
)))
> +      (with-current-buffer (vtable-buffer table)
> +        (save-excursion
> +          (vtable-goto-table table)
> +          (let* ((ellipsis (if (vtable-ellipsis table)
> +                               (propertize (truncate-string-ellipsis)
> +                                           'face (vtable-face table))
> +                             ""))
> +                 (ellipsis-width (string-pixel-width ellipsis (current-b=
uffer)))

Can we move these let-bindings out to the outer let-binding now?

> +                 (keymap (get-text-property (point) 'keymap)))

I guess we could get this from vtable-keymap now?  In which case it can
also move to the outer let-binding?

> +            (if (or before
> +                    (and pos (integerp location)))
> +                ;; Add the new object before:.
> +                (let ((old-line (car pos)))
> +                  (setcar pos line)
> +                  (setcdr pos (cons old-line (cdr pos)))
> +                  (unless (vtable-goto-object (car elem))
> +                    (vtable-beginning-of-table)))
> +              ;; Otherwise, add the object after.
> +              (if pos
> +                  ;; Splice the object into the list.
> +                  (progn
> +                    (setcdr pos (cons line (cdr pos)))
> +                    (if (vtable-goto-object location)
> +                        (forward-line 1)  ; Insert *after*.
> +                      (vtable-end-of-table)))
> +                ;; Otherwise, append the object.
> +                (setcar cache (nconc lines (list line)))
> +                (vtable-end-of-table)))
> +            (let ((start (point)))
> +              ;; FIXME: We have to adjust colors in lines below this if =
we
> +              ;; have :row-colors.
> +              (vtable--insert-line table line 0
> +                                   (vtable--cache-widths cache)
> +                                   (vtable--spacer table)
> +                                   ellipsis ellipsis-width)
> +              (add-text-properties start (point) (list 'keymap keymap
> +                                                       'vtable table)))
> +            ;; We may have inserted a non-numerical value into a previou=
sly
> +            ;; all-numerical table, so recompute.
> +            (vtable--recompute-numerical table (cdr line))))))))
>=20=20
>  (defun vtable-column (table index)
>    "Return the name of the INDEXth column in TABLE."
> @@ -520,14 +538,14 @@ vtable--cache-widths
>  (defun vtable--cache-lines (cache)
>    (car cache))
>=20=20
> -(defun vtable-insert (table)
> +(defun vtable--insert (table)
>    (let* ((spacer (vtable--spacer table))
>           (start (point))
>           (ellipsis (if (vtable-ellipsis table)
>                         (propertize (truncate-string-ellipsis)
>                                     'face (vtable-face table))
>                       ""))
> -         (ellipsis-width (string-pixel-width ellipsis))
> +         (ellipsis-width (string-pixel-width ellipsis (current-buffer)))

Should we use vtable-buffer rather than current-buffer here, I guess?

>           ;; We maintain a cache per screen/window width, so that we rend=
er
>           ;; correctly if Emacs is open on two different screens (or the
>           ;; user resizes the frame).
> @@ -549,8 +567,7 @@ vtable-insert
>          (add-text-properties start (point)
>                               (list 'keymap vtable-header-line-map
>                                     'rear-nonsticky t
> -                                   'vtable table
> -                                   'vtable-cache cache))
> +                                   'vtable table))
>          (setq start (point))))
>      (vtable--sort table cache)
>      ;; Insert the data.
> @@ -561,13 +578,28 @@ vtable-insert
>          (setq line-number (1+ line-number))))
>      (add-text-properties start (point)
>                           (list 'rear-nonsticky t
> -                               'vtable table
> -                               'vtable-cache cache))
> +                               'vtable table))
> +    (vtable--set-current-cache table cache)
>      (goto-char start)))
>=20=20
> +(defun vtable-insert (table)
> +  "Insert TABLE into the current buffer.
> +The current buffer will be recorded as TABLE's buffer.  If this is done
> +more than once, or if the table is attempted to be inserted more than
> +once into the same buffer, signal an error."
> +  (if-let* ((table-buffer (vtable-buffer table)))
> +      (if (eq table-buffer (current-buffer))
> +          (error "A vtable cannot be inserted more than once into a buff=
er")

I don't think this should be an error.  It's reasonable for Lisp code to
clear a buffer and then want to reinsert a vtable into it.  If we're
inserting into the same buffer, there's no problem.

I guess your concern is inserting a vtable when it already is present.
I don't think there's a good way to prevent that right now,
unfortunately, without also breaking the legitimate use case of clearing
a buffer then reinserting the vtable.

> +        (error "A vtable cannot be inserted into more than one buffer")))

I agree that this should be an error, of course.

> +  (vtable-set-buffer (current-buffer) table)
> +  (let ((inhibit-read-only t)
> +        (inhibit-modification-hooks t))
> +    (vtable--insert table)))
> +
>  (defun vtable--insert-line (table line line-number widths spacer
>                                    &optional ellipsis ellipsis-width)
>    (let ((start (point))
> +        (buffer (vtable-buffer table))
>          (columns (vtable-columns table))
>          (column-colors
>           (and (vtable-column-colors table)
> @@ -607,16 +639,18 @@ vtable--insert-line
>                        (concat
>                         (vtable--limit-string
>                          pre-computed (- (elt widths index)
> -                                        (or ellipsis-width 0)))
> +                                        (or ellipsis-width 0))
> +                        buffer)
>                         ellipsis)
>                      pre-computed))
>                   ;; Recompute widths.
>                   (t
> -                  (if (> (string-pixel-width value) (elt widths index))
> +                  (if (> (string-pixel-width value buffer) (elt widths i=
ndex))
>                        (concat
>                         (vtable--limit-string
>                          value (- (elt widths index)
> -                                 (or ellipsis-width 0)))
> +                                 (or ellipsis-width 0))
> +                        buffer)
>                         ellipsis)
>                      value))))
>                 (start (point))
> @@ -630,14 +664,15 @@ vtable--insert-line
>                            (list 'space
>                                  :width (list
>                                          (+ (- (elt widths index)
> -                                              (string-pixel-width displa=
yed))
> +                                              (string-pixel-width
> +                                               displayed buffer))
>                                             (if last 0 spacer)))))))
>               ;; Align to the right.
>               (insert (propertize " " 'display
>                                   (list 'space
>                                         :width (list (- (elt widths index)
>                                                         (string-pixel-wid=
th
> -                                                        displayed)))))
> +                                                        displayed buffer=
)))))
>                       displayed)
>               (unless last
>                 (insert (propertize " " 'display
> @@ -664,15 +699,19 @@ vtable--insert-line
>  (defun vtable--cache-key ()
>    (cons (frame-terminal) (window-width)))
>=20=20
> -(defun vtable--current-cache ()
> -  "Return the current cache for the table at point.
> +(defun vtable--current-cache (&optional table)
> +  "Return the current cache for TABLE or the table under point.
>=20=20
>  In `vtable-insert', the lines and widths of the vtable text are computed
>  based on the current selected frame and window and stored in a cache.
>  Subsequent interaction with the text of the vtable should use that cache
>  via this function rather than by calling `vtable--cache-key' to look up
>  the cache."
> -  (get-text-property (point) 'vtable-cache))
> +  (slot-value (or table (vtable-current-table)) '-current-cache))

Can we make TABLE just be a mandatory argument?  It looks to me like
this would just require vtable-next-column and vtable-previous-column to
run (vtable--current-cache (vtable-current-table))

Then this function just becomes another :accessor.

> +
> +(defun vtable--set-current-cache (table cache)
> +  "Set the current cache for the table."
> +  (setf (slot-value table '-current-cache) cache))
>=20=20
>  (defun vtable--clear-cache (table)
>    (setf (gethash (vtable--cache-key) (slot-value table '-cache)) nil))
> @@ -718,6 +757,7 @@ vtable--indicator
>  (defun vtable--insert-header-line (table widths spacer)
>    ;; Insert the header directly into the buffer.
>    (let ((start (point))
> +        (buffer (vtable-buffer table))
>          (divider (vtable-divider table))
>          (cmap (define-keymap
>                  "<header-line> <drag-mouse-1>" #'vtable--drag-resize-col=
umn
> @@ -737,14 +777,15 @@ vtable--insert-header-line
>                       'keymap cmap))
>                (start (point))
>                (indicator (vtable--indicator table index))
> -              (indicator-width (string-pixel-width indicator))
> +              (indicator-width (string-pixel-width indicator buffer))
>                (last (=3D index (1- (length (vtable-columns table)))))
>                displayed)
>           (setq displayed
> -               (if (> (string-pixel-width name)
> +               (if (> (string-pixel-width name buffer)
>                        (- (elt widths index) indicator-width))
>                     (vtable--limit-string
> -                    name (- (elt widths index) indicator-width))
> +                    name (- (elt widths index) indicator-width)
> +                    buffer)
>                   name))
>           (let* ((indicator-lead-width
>                   ;; We want the indicator to not be quite flush right.
> @@ -753,7 +794,7 @@ vtable--insert-header-line
>                                          indicator-lead-width))
>                  (fill-width
>                   (+ (- (elt widths index)
> -                       (string-pixel-width displayed)
> +                       (string-pixel-width displayed buffer)
>                         indicator-width
>                         indicator-lead-width)
>                      (if last 0 spacer))))
> @@ -771,7 +812,8 @@ vtable--insert-header-line
>               ;; This is the final column, and we have a sorting
>               ;; indicator, and the table is too wide for the window.
>               (let* ((pre-indicator (string-pixel-width
> -                                    (buffer-substring (point-min) (point=
))))
> +                                    (buffer-substring (point-min) (point=
))
> +                                    buffer))
>                      (pre-fill
>                       (- (window-width nil t)
>                          pre-indicator
> @@ -850,14 +892,16 @@ vtable--set-header-line
>             (buffer-substring (point-min) (1- (point-max))))))
>    (vtable-header-mode 1))
>=20=20
> -(defun vtable--limit-string (string pixels)
> +
> +(defun vtable--limit-string (string pixels buffer)
>    (while (and (length> string 0)
> -              (> (string-pixel-width string) pixels))
> +              (> (string-pixel-width string buffer) pixels))
>      (setq string (substring string 0 (1- (length string)))))
>    string)
>=20=20
>  (defun vtable--char-width (table)
> -  (string-pixel-width (propertize "x" 'face (vtable-face table))))
> +  (string-pixel-width (propertize "x" 'face (vtable-face table))
> +                      (vtable-buffer table)))
>=20=20
>  (defun vtable--compute-width (table spec)
>    (cond
> @@ -936,7 +980,7 @@ vtable--compute-cached-line
>         ;; We stash the computed width and string here -- if there are
>         ;; no formatters/displayers, we'll be using the string, and
>         ;; then won't have to recreate it.
> -       (list value (string-pixel-width string) string)))
> +       (list value (string-pixel-width string (vtable-buffer table)) str=
ing)))
>     (vtable-columns table)))
>=20=20
>  (defun vtable--make-keymap (table)
> @@ -967,20 +1011,21 @@ vtable--make-keymap
>            (vtable-keymap table))
>        map)))
>=20=20
> -(defun vtable-revert ()
> -  "Regenerate the table under point."
> -  (let ((table (vtable-current-table))
> -        (object (vtable-current-object))
> -        (column (vtable-current-column))
> -        (inhibit-read-only t))
> -    (unless table
> -      (user-error "No table under point"))
> -    (delete-region (vtable-beginning-of-table) (vtable-end-of-table))
> -    (vtable-insert table)
> -    (when object
> -      (vtable-goto-object object))
> -    (when column
> -      (vtable-goto-column column))))
> +(defun vtable-revert (&optional table)
> +  "Regenerate TABLE, defaulting to the table under point."
> +  (setq table (or table (vtable-current-table)))
> +  (unless table
> +    (user-error "No table under point"))
> +  (with-current-buffer (vtable-buffer table)
> +    (let ((object (vtable-current-object))
> +          (column (vtable-current-column))
> +          (inhibit-read-only t))
> +      (delete-region (vtable-beginning-of-table) (vtable-end-of-table))
> +      (vtable--insert table)
> +      (when object
> +        (vtable-goto-object object))
> +      (when column
> +        (vtable-goto-column column)))))
>=20=20
>  ;;; Commands.
>=20=20
> @@ -1006,14 +1051,14 @@ vtable-narrow-current-column
>                                  (- (* (vtable--char-width table) (or n 1=
))))))
>=20=20
>  (defun vtable--alter-column-width (table column delta)
> -  (let ((widths (vtable--cache-widths (vtable--current-cache))))
> +  (let ((widths (vtable--cache-widths (vtable--current-cache table))))
>      (setf (aref widths column)
>            (max (* (vtable--char-width table) 2)
>                 (+ (aref widths column) delta)))
>      ;; Store the width so it'll be respected on a revert.
>      (setf (vtable-column-width (elt (vtable-columns table) column))
>            (format "%dpx" (aref widths column)))
> -    (vtable-revert)))
> +    (vtable-revert table)))
>=20=20
>  (defun vtable-widen-current-column (&optional n)
>    "Widen the current column by N characters.
> @@ -1028,7 +1073,8 @@ vtable-previous-column
>    (interactive)
>    (vtable-goto-column
>     (max 0 (1- (or (vtable-current-column)
> -                  (length (vtable--cache-widths (vtable--current-cache))=
))))))
> +                  (length (vtable--cache-widths
> +                           (vtable--current-cache))))))))
>=20=20
>  (defun vtable-next-column ()
>    "Go to the next column."
> @@ -1038,14 +1084,16 @@ vtable-next-column
>       (min (1- (length (vtable--cache-widths (vtable--current-cache))))
>            (1+ (vtable-current-column))))))
>=20=20
> -(defun vtable-revert-command ()
> +(defun vtable-revert-command (&optional table)
>    "Re-query data and regenerate the table under point."
>    (interactive)
> -  (let ((table (vtable-current-table)))
> -    (when (vtable-objects-function table)
> -      (setf (vtable-objects table) (funcall (vtable-objects-function tab=
le))))
> -    (vtable--clear-cache table))
> -  (vtable-revert))
> +  (setq table (or table (vtable-current-table)))
> +  (unless table
> +    (user-error "No table found"))
> +  (when (vtable-objects-function table)
> +    (setf (vtable-objects table) (funcall (vtable-objects-function table=
))))
> +  (vtable--clear-cache table)
> +  (vtable-revert table))
>=20=20
>  (defun vtable-sort-by-current-column ()
>    "Sort the table under point by the column under point."
> @@ -1067,8 +1115,8 @@ vtable-sort-by-current-column
>                                    (if (eq (cdr last) 'ascend)
>                                        'descend
>                                      'ascend)
> -                                'ascend))))))
> -  (vtable-revert))
> +                                'ascend)))))
> +    (vtable-revert table)))
>=20=20
>  (defun vtable-header-line-sort (e)
>    "Sort a vtable from the header line."
> diff --git a/test/lisp/emacs-lisp/vtable-tests.el b/test/lisp/emacs-lisp/=
vtable-tests.el
> index 74fb8cc8139..83f826ea353 100644
> --- a/test/lisp/emacs-lisp/vtable-tests.el
> +++ b/test/lisp/emacs-lisp/vtable-tests.el
> @@ -27,16 +27,19 @@
>  (require 'ert)
>  (require 'ert-x)
>=20=20
> -(ert-deftest test-vstable-compute-columns ()
> +(defun vtable-tests--make-no-header-2-object-table ()
> +  (make-vtable :columns '("a" "b" "c")
> +               :objects '(("foo" 1 2)
> +                          ("bar" 3 :zot))
> +               :insert nil))
> +
> +(ert-deftest test-vtable-compute-columns ()
>    (should
>     (equal (mapcar
>             (lambda (column)
>               (vtable-column-align column))
>             (vtable--compute-columns
> -            (make-vtable :columns '("a" "b" "c")
> -                         :objects '(("foo" 1 2)
> -                                    ("bar" 3 :zot))
> -                         :insert nil)))
> +            (vtable-tests--make-no-header-2-object-table)))
>            '(left right left))))
>=20=20
>  (ert-deftest test-vtable-insert-object ()
> @@ -69,4 +72,69 @@ test-vtable-insert-object
>                (mapcar #'cadr (vtable-objects table))))
>            (number-sequence 0 11))))
>=20=20
> +(ert-deftest test-vtable-unique-buffer ()
> +  (let ((table (vtable-tests--make-no-header-2-object-table)))
> +    (with-temp-buffer
> +      (vtable-insert table)
> +      ;; This will run but fail on Emacs pre 31 vtable.
> +      (should-error (vtable-insert table))
> +      ;; This will run only on Emacs 31+ vtable.
> +      (when (> emacs-major-version 30)
> +        (should-error (vtable-set-buffer table (current-buffer)))))))
> +
> +(ert-deftest test-vtable-non-current-buffer-insert-object ()
> +  (let ((table (vtable-tests--make-no-header-2-object-table))
> +        (obj '("baz" 4 5)))
> +    (with-temp-buffer
> +      (vtable-insert table)
> +      (should (=3D (count-lines (point-min) (point-max)) 2))
> +      (with-temp-buffer
> +        (vtable-insert-object table obj))
> +      (should (=3D (count-lines (point-min) (point-max)) 3)))))
> +
> +(ert-deftest test-vtable-non-current-buffer-remove-object ()
> +  (let ((table (vtable-tests--make-no-header-2-object-table))
> +        (obj '("baz" 4 5)))
> +    (with-temp-buffer
> +      (vtable-insert table)
> +      (vtable-insert-object table obj)
> +      (should (=3D (count-lines (point-min) (point-max)) 3))
> +      (with-temp-buffer
> +        (vtable-remove-object table obj))
> +      (should (=3D (count-lines (point-min) (point-max)) 2)))))
> +
> +(ert-deftest test-vtable-non-current-buffer-update-object ()
> +  (let ((table (vtable-tests--make-no-header-2-object-table))
> +        (obj '("baz" 4 5))
> +        (obj-2 '("qux" 6 7)))
> +    (with-temp-buffer
> +      (vtable-insert table)
> +      (vtable-insert-object table obj)
> +      (should (=3D (count-lines (point-min) (point-max)) 3))
> +      (let ((line-2 (progn
> +                      (goto-char (point-min))
> +                      (forward-line 2)
> +                      (buffer-substring (point) (point-max)))))
> +        (with-temp-buffer
> +          (vtable-update-object table obj-2 obj))
> +        (let ((line-2-new (progn
> +                            (goto-char (point-min))
> +                            (forward-line 2)
> +                            (buffer-substring (point) (point-max)))))
> +          (should (=3D (count-lines (point-min) (point-max)) 3))
> +          (should (not (string=3D line-2 line-2-new))))))))
> +
> +(ert-deftest test-vtable--limit-string-with-face-remapped-buffer ()
> +  (with-temp-buffer
> +    (let ((text (propertize "XXXXX"
> +                            'face 'variable-pitch)))
> +      (face-remap-add-relative 'default :height 1.5)
> +      (if (> emacs-major-version 30)
> +          (should (eq
> +                   2
> +                   (length (vtable--limit-string text 50 (current-buffer=
)))))
> +        (should (eq
> +                 2
> +                 (length (vtable--limit-string text 50))))))))
> +
>  ;;; vtable-tests.el ends here




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 11 Dec 2025 17:00:07 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Thu Dec 11 12:00:07 2025
Received: from localhost ([127.0.0.1]:46561 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vTk1N-0001i1-N1
	for submit <at> debbugs.gnu.org; Thu, 11 Dec 2025 12:00:06 -0500
Received: from mail-vs1-xe2c.google.com ([2607:f8b0:4864:20::e2c]:49565)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vTk1K-0001gq-AZ
 for 79982 <at> debbugs.gnu.org; Thu, 11 Dec 2025 12:00:03 -0500
Received: by mail-vs1-xe2c.google.com with SMTP id
 ada2fe7eead31-5dbd9c7e468so154905137.3
 for <79982 <at> debbugs.gnu.org>; Thu, 11 Dec 2025 09:00:02 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765472396; x=1766077196; darn=debbugs.gnu.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=w6a9eB60ehnv18bbljbIlNA6O75BRkETFeWfgB8IuQE=;
 b=BnnadCvBmbIpHz+DKsM5p484LpBa88Mwh0TFmCDsl9hSrtV8DcCBR/tOuFYDQOpGYL
 qfiDnqKHrhligDchO6AM9iaW6Yc+txE1Mxf5JvEiyTXDoFKX5u+/0IMgNaWCGHjVceqo
 k2RAZFh+7DR3QWKz258YfZWRbMiA5r3Iuq5GS7AhUfj/0pAka7uuasWRg0d0HR6KsVRI
 Zkvf34+0sKDqpvaBgklYvdk/BcAtrdzNpr0rGxTpkKEvlk3Vv/TF4FCaIcLF43LWBagc
 4H5jcFhWPZ4FDRgewZSXAGCdVOx4OWoWB4w3cOZChSOpUKndhFquzRSfHv3fQLgWoFmR
 zbrw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765472396; x=1766077196;
 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=w6a9eB60ehnv18bbljbIlNA6O75BRkETFeWfgB8IuQE=;
 b=WzAnzbgedCogPHjYet5TPVibX1Wrux+6M1VefSlc/ADrtFt0JHHbeX08LZ7MOqdKyy
 Z7QM9gTaizELo6jN84fD1BsEoWZUrp6yPicOWA/MKAWtVfHaEXNA9pfSLKYJzvl7I2E+
 uF5izQTBhoWWVdkySZt4BaK0XhMHIjC7i9mRf9gCMB/8jAfMJCSruImjSl/svVdGgKYz
 GjszsflavdGCN3+0ketnjCsILMPVmSCykd7wjDtkkwi4FssgWwuQAD1v5Mt1X3SsXRtf
 nI9VrWRIS+RR8zjRueGj7gWCM5b9ndOasy7BqKcM6KPmno1IOMWxTGIWKffLNDNokaiE
 NvLA==
X-Forwarded-Encrypted: i=1;
 AJvYcCWSoWM/xYNN2nk4LUmRmbIZlmhS5mXWA5KVgnktuU7Gx2JaKRopZvLL9z7TDhplLx1wJeMeEw==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Yx7icKsWxMGCQR6O3vKXTVRVwBd722sU+gu/jnjWDMVJwO3Df2V
 cyc2XiaNh6gwxC/6SfRtUH7jMwLkWiP6HYA12Oxh8qS8Dt8nBhQnPq3IhDmz4Z9m3AiJiPtQqaz
 /hVbVLQsu4kNl2bXKZawr0kgF78dUihc=
X-Gm-Gg: AY/fxX5wFmu4nLvWkxKQ59dTcFcBUxn0Mkq6AFyuiiEAd9GR8L+h+mA49WmA2bHg7NN
 RagggS7LERaTkvwS5QtrtK1skW5wMcQ95Fx7wQ3/e14GWhdkoRU2rGCv9XrZgqqDOPTUR3dVFPY
 AJ6OCKaw0ARFu6K7dllhCLMPH90KCmGajYP65tJIniBQf7KrqG2COHjQ/dCgXBHMxOeTrNS1yk+
 OMDifjYpFlCXF/fO9SGDWeHCqhY7y5Y1zIp5E86w0VpYPVq7cJQbMX80vBTC6ZMhrd100wjW6zX
 yJWbXQ==
X-Google-Smtp-Source: AGHT+IHOMjg242IVfTmssFuSIj3wkdnAW+VTBqBWIt8YSIxqcEl6iZ6EZz8y9zuE16mtNq0bzl0WvYVzSHv2kMpEqJY=
X-Received: by 2002:a05:6102:1529:b0:5db:ca9e:b589 with SMTP id
 ada2fe7eead31-5e571eed8c4mr2517950137.33.1765472396398; Thu, 11 Dec 2025
 08:59:56 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 <ierfr9irmo2.fsf_-_@HIDDEN>
In-Reply-To: <ierfr9irmo2.fsf_-_@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Thu, 11 Dec 2025 11:59:43 -0500
X-Gm-Features: AQt7F2qb660x3bx2SrVZCaOsVhhcG6n7NCHOok97kiCqRsEIuPwhnRIbtwH3el4
Message-ID: <CAN+1HboLRzmAAyC=zK4ji-CJ-2OWcb=4ZbpfqfMRga3dkQGLFw@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/mixed; boundary="0000000000000c6d050645b01364"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--0000000000000c6d050645b01364
Content-Type: multipart/alternative; boundary="0000000000000c6d040645b01362"

--0000000000000c6d040645b01362
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Revised patch, attached.

On Wed, Dec 10, 2025 at 5:34=E2=80=AFPM Spencer Baugh <sbaugh@HIDDEN=
m> wrote:

> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>
> Since we're restricting a vtable to only be inserted in a single buffer
> now, we can make vtable--current-cache take the table as an explicit
> argument, and just pull the cache out of there rather than the current
> buffer.  Actually, we can stop setting the vtable-cache text property
> entirely: it should only be pulled from the table.
>

Good idea.

> +                (line-number (seq-position (vtable--cache-lines cache)
> > +                                           old-object
> > +                                           (lambda (a b)
> > +                                             (equal (car a) b))))
> > +                (line (elt (vtable--cache-lines cache) line-number)))
> > +          (progn
>
> With the above-mentioned change to vtable--current-cache, you could have
> the change just turn this progn into a with-current-buffer.
>

Good idea.

>  (defun vtable-remove-object (table object)
> >    "Remove OBJECT from TABLE.
> > @@ -334,14 +350,15 @@ vtable-remove-object
> >    ;; First remove from the objects.
> >    (setf (vtable-objects table) (delq object (vtable-objects table)))
> >    ;; Then adjust the cache and display.
> > -  (save-excursion
> > -    (vtable-goto-table table)
> > -    (let ((cache (vtable--current-cache))
> > -          (inhibit-read-only t))
> > -      (setcar cache (delq (assq object (vtable--cache-lines cache))
> > -                          (vtable--cache-lines cache)))
> > -      (when (vtable-goto-object object)
> > -        (delete-line)))))
> > +  (with-current-buffer (vtable-buffer table)
> > +    (save-excursion
> > +      (vtable-goto-table table)
> > +      (let ((cache (vtable--current-cache))
>
> Maybe we won't need this vtable-goto-table if we make
> vtable--current-cache take the table?
>

The goto-object calls require point being in the table.


> > +               (inhibit-read-only t)
> > +               (keymap (get-text-property (point) 'keymap))
> > +               (ellipsis (if (vtable-ellipsis table)
> > +                             (propertize (truncate-string-ellipsis)
> > +                                         'face (vtable-face table))
> > +                           ""))
> > +               (ellipsis-width (string-pixel-width ellipsis
> (current-buffer)))
> > +               (lines (vtable--cache-lines cache))
> > +               (elem (if location  ; This binding mirrors the binding
> of `pos' above.
> > +                         (if (integerp location)
> > +                             (nth location lines)
> > +                           (or (assq location lines)
> > +                               (and before (car lines))))
> > +                       (if before (car lines))))
> > +               (pos (memq elem lines))
> > +               (line (cons object (vtable--compute-cached-line table
> object))))
>
> Hmm... I think this is the only thing in these let-bindings which
> depends on the current buffer (besides vtable--current-cache which
> should take the buffer as an argument).
>

I reworked that code a bit to narrow the w-c-b scope.

If we made vtable--compute-cached-line take the buffer and explicitly
> passed it to string-pixel-width in there, I think we'd be able to bind
> with-current-buffer around much less code.
>

Not needed. I changed the string-pixel-width call to include vtable-buffer.

-St=C3=A9phane

--0000000000000c6d040645b01362
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div><div class=3D"gmail_default" style=
=3D"font-family:monospace">Revised patch, attached.</div></div><div><br></d=
iv><div class=3D"gmail_default" style=3D"font-family:monospace"><span style=
=3D"font-family:Arial,Helvetica,sans-serif">On Wed, Dec 10, 2025 at 5:34=E2=
=80=AFPM Spencer Baugh &lt;<a href=3D"mailto:sbaugh@HIDDEN">sbaugh@=
janestreet.com</a>&gt; wrote:</span></div></div><div class=3D"gmail_quote g=
mail_quote_container"><blockquote class=3D"gmail_quote" style=3D"margin:0px=
 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">St=
=C3=A9phane Marks &lt;<a href=3D"mailto:shipmints@HIDDEN" target=3D"_bla=
nk">shipmints@HIDDEN</a>&gt; writes:<br><br>
Since we&#39;re restricting a vtable to only be inserted in a single buffer=
<br>
now, we can make vtable--current-cache take the table as an explicit<br>
argument, and just pull the cache out of there rather than the current<br>
buffer.=C2=A0 Actually, we can stop setting the vtable-cache text property<=
br>
entirely: it should only be pulled from the table.<br></blockquote><div><br=
></div><div><div class=3D"gmail_default" style=3D"font-family:monospace">Go=
od idea.</div></div><div class=3D"gmail_default" style=3D"font-family:monos=
pace"><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0=
px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (line-number =
(seq-position (vtable--cache-lines cache)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0old-object<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0(lambda (a b)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0(equal (car a) b))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (line (elt (v=
table--cache-lines cache) line-number)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn<br>
<br>
With the above-mentioned change to vtable--current-cache, you could have<br=
>
the change just turn this progn into a with-current-buffer.<br></blockquote=
><div><br></div><div class=3D"gmail_default" style=3D"font-family:monospace=
">Good idea.</div><div class=3D"gmail_default" style=3D"font-family:monospa=
ce"><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px=
 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
&gt;=C2=A0 (defun vtable-remove-object (table object)<br>
&gt;=C2=A0 =C2=A0 &quot;Remove OBJECT from TABLE.<br>
&gt; @@ -334,14 +350,15 @@ vtable-remove-object<br>
&gt;=C2=A0 =C2=A0 ;; First remove from the objects.<br>
&gt;=C2=A0 =C2=A0 (setf (vtable-objects table) (delq object (vtable-objects=
 table)))<br>
&gt;=C2=A0 =C2=A0 ;; Then adjust the cache and display.<br>
&gt; -=C2=A0 (save-excursion<br>
&gt; -=C2=A0 =C2=A0 (vtable-goto-table table)<br>
&gt; -=C2=A0 =C2=A0 (let ((cache (vtable--current-cache))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (inhibit-read-only t))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (setcar cache (delq (assq object (vtable--cache-=
lines cache))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 (vtable--cache-lines cache)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (when (vtable-goto-object object)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-line)))))<br>
&gt; +=C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt; +=C2=A0 =C2=A0 (save-excursion<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (vtable-goto-table table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (let ((cache (vtable--current-cache))<br>
<br>
Maybe we won&#39;t need this vtable-goto-table if we make<br>
vtable--current-cache take the table?<br></blockquote><div><br></div><div><=
div class=3D"gmail_default" style=3D"font-family:monospace">The goto-object=
 calls require point being in the table.</div></div><div>=C2=A0</div><block=
quote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1=
px solid rgb(204,204,204);padding-left:1ex">&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(inhibit-read-only t)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(keymap (get-t=
ext-property (point) &#39;keymap))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis (if =
(vtable-ellipsis table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(propertize (truncate-string-ellipsis)<b=
r>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0&#39;face (vtable-face table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quot;&quot;))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis-widt=
h (string-pixel-width ellipsis (current-buffer)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(lines (vtable=
--cache-lines cache))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(elem (if loca=
tion=C2=A0 ; This binding mirrors the binding of `pos&#39; above.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0(if (integerp location)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(nth location lines)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0(or (assq location lines)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(and before (car lines))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0(if before (car lines))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(pos (memq ele=
m lines))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(line (cons ob=
ject (vtable--compute-cached-line table object))))<br>
<br>
Hmm... I think this is the only thing in these let-bindings which<br>
depends on the current buffer (besides vtable--current-cache which<br>
should take the buffer as an argument).<br></blockquote><div><br></div><div=
 class=3D"gmail_default" style=3D"font-family:monospace">I reworked that co=
de a bit to narrow the=C2=A0w-c-b scope.</div><div class=3D"gmail_default" =
style=3D"font-family:monospace"><br></div><blockquote class=3D"gmail_quote"=
 style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);p=
adding-left:1ex">
If we made vtable--compute-cached-line take the buffer and explicitly<br>
passed it to string-pixel-width in there, I think we&#39;d be able to bind<=
br>
with-current-buffer around much less code.<br></blockquote><div><br></div><=
div class=3D"gmail_default" style=3D"font-family:monospace">Not needed. I c=
hanged the string-pixel-width call to include vtable-buffer.</div><div clas=
s=3D"gmail_default" style=3D"font-family:monospace"><br></div><div class=3D=
"gmail_default" style=3D"font-family:monospace">-St=C3=A9phane=C2=A0</div><=
/div></div>

--0000000000000c6d040645b01362--

--0000000000000c6d050645b01364
Content-Type: application/octet-stream; 
	name="0001-Add-vtable-buffer-slot.patch"
Content-Disposition: attachment; 
	filename="0001-Add-vtable-buffer-slot.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_mj1oo7wo0>
X-Attachment-Id: f_mj1oo7wo0

RnJvbSAxYzEwNGYxYjI5YWE5ZTM5NjAwNWFlNzMzOTRhMmY0OTEwNDM2MWM2IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo
aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMTAgRGVjIDIwMjUgMDk6MjA6MDIgLTA1MDAK
U3ViamVjdDogW1BBVENIXSBBZGQgdnRhYmxlIGJ1ZmZlciBzbG90CgpUaGlzIHNvbHZlcyBmb3Ig
YmFja2dyb3VuZCB2dGFibGUgbXV0YXRpb25zLCBpLmUuLCB1cGRhdGVzCmluaXRpYXRlZCBmcm9t
IGJ1ZmZlcnMgb3RoZXIgdGhhbiB0aGUgdnRhYmxlIGJ1ZmZlciwgYW5kIGZvcgpidWZmZXItYWRq
dXN0ZWQgc3RyaW5nLXBpeGVsLXdpZHRoIGNvbXB1dGF0aW9ucy4KCiogbGlzcC9lbWFjcy1saXNw
L3Z0YWJsZS5lbCAodnRhYmxlKTogTmV3ICctYnVmZmVyJyBzbG90LgoodnRhYmxlLWJ1ZmZlcik6
Cih2dGFibGUtc2V0LWJ1ZmZlcik6IE5ldyBmdW5jdGlvbi4KKHZ0YWJsZS11cGRhdGUtb2JqZWN0
KToKKHZ0YWJsZS1yZW1vdmUtb2JqZWN0KToKKHZ0YWJsZS1pbnNlcnQtb2JqZWN0KTogV3JhcCBv
cGVyYXRpb24gd2l0aCB0aGUgdnRhYmxlIGJ1ZmZlci4KKHZ0YWJsZS0taW5zZXJ0KTogU3BsaXQg
ZnJvbSBvbGQgJ3Z0YWJsZS1pbnNlcnQnLgoodnRhYmxlLWluc2VydCk6IEluc2VydCB0YWJsZSBh
bmQgcmVjb3JkIHRoZSBidWZmZXIuCih2dGFibGUtLWluc2VydC1saW5lKToKKHZ0YWJsZS0taW5z
ZXJ0LWhlYWRlci1saW5lKTogVXNlICd2dGFibGUtYnVmZmVyJyBmb3IgcGl4ZWwtd2lkdGggY29t
cHV0YXRpb24uCih2dGFibGUtLWxpbWl0LXN0cmluZyk6Cih2dGFibGUtLWNoYXItd2lkdGgpOiBQ
YXNzIGJ1ZmZlciB0byAnc3RyaW5nLXBpeGVsLXdpZHRoJy4KKHZ0YWJsZS1yZXZlcnQpOiBOZXcg
b3B0aW9uYWwgdGFibGUgYXJndW1lbnQuCih2dGFibGUtLWFsdGVyLWNvbHVtbi13aWR0aCk6Cih2
dGFibGUtcmV2ZXJ0LWNvbW1hbmQpOgoodnRhYmxlLXNvcnQtYnktY3VycmVudC1jb2x1bW4pOiBD
YWxsICd2dGFibGUtcmV2ZXJ0JyB3aXRoIHRoZSB0YWJsZS4KCiogdGVzdC9saXNwL2VtYWNzLWxp
c3AvdnRhYmxlLXRlc3RzLmVsCih2dGFibGUtdGVzdHMtLW1ha2Utbm8taGVhZGVyLTItb2JqZWN0
LXRhYmxlKTogTmV3IGhlbHBlcgpmdW5jdGlvbi4KKHRlc3QtdnN0YWJsZS1jb21wdXRlLWNvbHVt
bnMpOiBDb3JyZWN0IHR5cG8gaW4gdGVzdCBuYW1lLiAgVXNlCm5ldyBoZWxwZXIgZnVuY3Rpb24u
Cih0ZXN0LXZ0YWJsZS11bmlxdWUtYnVmZmVyKQoodGVzdC12dGFibGUtbm9uLWN1cnJlbnQtYnVm
ZmVyLWluc2VydC1vYmplY3QpCih0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItcmVtb3Zl
LW9iamVjdCkKKHRlc3QtdnRhYmxlLW5vbi1jdXJyZW50LWJ1ZmZlci11cGRhdGUtb2JqZWN0KQoo
dGVzdC12dGFibGUtLWxpbWl0LXN0cmluZy13aXRoLWZhY2UtcmVtYXBwZWQtYnVmZmVyKTogTmV3
IHRlc3QuCi0tLQogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAgICAgICAgICAgIHwgMjg0ICsr
KysrKysrKysrKysrKystLS0tLS0tLS0tLQogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRl
c3RzLmVsIHwgIDc4ICsrKysrKystCiAyIGZpbGVzIGNoYW5nZWQsIDIzOSBpbnNlcnRpb25zKCsp
LCAxMjMgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5l
bCBiL2xpc3AvZW1hY3MtbGlzcC92dGFibGUuZWwKaW5kZXggYmNkZDI4MGZiOTIuLmY0ZDg3NTgx
ZGZhIDEwMDY0NAotLS0gYS9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVsCisrKyBiL2xpc3AvZW1h
Y3MtbGlzcC92dGFibGUuZWwKQEAgLTY4LDcgKzY4LDkgQEAgdnRhYmxlCiAgICAoY29sdW1uLWNv
bG9ycyA6aW5pdGFyZyA6Y29sdW1uLWNvbG9ycyA6YWNjZXNzb3IgdnRhYmxlLWNvbHVtbi1jb2xv
cnMpCiAgICAocm93LWNvbG9ycyA6aW5pdGFyZyA6cm93LWNvbG9ycyA6YWNjZXNzb3IgdnRhYmxl
LXJvdy1jb2xvcnMpCiAgICAoLWNhY2hlZC1jb2xvcnMgOmluaXRmb3JtIG5pbCkKKyAgICgtYnVm
ZmVyIDppbml0Zm9ybSBuaWwpCiAgICAoLWNhY2hlIDppbml0Zm9ybSAobWFrZS1oYXNoLXRhYmxl
IDp0ZXN0ICMnZXF1YWwpKQorICAgKC1jdXJyZW50LWNhY2hlIDppbml0Zm9ybSBuaWwpCiAgICAo
LWNhY2hlZC1rZXltYXAgOmluaXRmb3JtIG5pbCkKICAgICgtaGFzLWNvbHVtbi1zcGVjIDppbml0
Zm9ybSBuaWwpKQogICAiQW4gb2JqZWN0IHRvIGhvbGQgdGhlIGRhdGEgZm9yIGEgdGFibGUuIikK
QEAgLTIyMSw2ICsyMjMsMjAgQEAgdnRhYmxlLS1mYWNlLWNvbG9yCiAKIDs7OyBJbnRlcmZhY2Ug
dXRpbGl0eSBmdW5jdGlvbnMuCiAKKyhkZWZ1biB2dGFibGUtYnVmZmVyICgmb3B0aW9uYWwgdGFi
bGUpCisgICJSZXR1cm4gdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggVEFCTEUuCitJZiBUQUJM
RSBpcyBuaWwsIHVzZSB0aGUgdGFibGUgdW5kZXIgcG9pbnQuICBSZXR1cm4gbmlsIGlmIHRoZSB0
YWJsZSBoYXMKK25vdCBiZWVuIGluc2VydGVkIGludG8gYSBidWZmZXIuIgorICAoc2xvdC12YWx1
ZSAob3IgdGFibGUgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkKKyAgICAgICAgICAgICAgJy1idWZm
ZXIpKQorCisoZGVmdW4gdnRhYmxlLXNldC1idWZmZXIgKGJ1ZmZlciAmb3B0aW9uYWwgdGFibGUp
CisgICJBc3NvY2lhdGUgQlVGRkVSIHdpdGggVEFCTEUuCitJZiBUQUJMRSBpcyBuaWwsIHVzZSB0
aGUgdGFibGUgdW5kZXIgcG9pbnQuIgorICAoc2V0ZiAoc2xvdC12YWx1ZSAob3IgdGFibGUgKHZ0
YWJsZS1jdXJyZW50LXRhYmxlKSkKKyAgICAgICAgICAgICAgICAgICAgJy1idWZmZXIpCisgICAg
ICAgIGJ1ZmZlcikpCisKIChkZWZ1biB2dGFibGUtY3VycmVudC10YWJsZSAoKQogICAiUmV0dXJu
IHRoZSB0YWJsZSB1bmRlciBwb2ludC4iCiAgIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICd2
dGFibGUpKQpAQCAtMzAxLDE0ICszMTcsMTQgQEAgdnRhYmxlLXVwZGF0ZS1vYmplY3QKICAgICAg
ICh1bmxlc3MgKGNkciBvYmplY3RzKQogICAgICAgICAoZXJyb3IgIkNhbid0IGZpbmQgdGhlIG9s
ZCBvYmplY3QiKSkKICAgICAgIChzZXRjYXIgKGNkciBvYmplY3RzKSBvYmplY3QpKQotICAgIDs7
IFRoZW4gdXBkYXRlIHRoZSByZW5kZXJlZCB2dGFibGUgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgot
ICAgIChpZi1sZXQqICgoY2FjaGUgKHZ0YWJsZS0tY3VycmVudC1jYWNoZSkpCi0gICAgICAgICAg
ICAgKGxpbmUtbnVtYmVyIChzZXEtcG9zaXRpb24gKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUp
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLW9iamVjdAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGEgYikKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcXVhbCAoY2FyIGEpIGIpKSkp
Ci0gICAgICAgICAgICAgKGxpbmUgKGVsdCAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkgbGlu
ZS1udW1iZXIpKSkKLSAgICAgICAgKHByb2duCisgICAgOzsgVGhlbiB1cGRhdGUgdGhlIHJlbmRl
cmVkIHZ0YWJsZSBpbiBpdHMgYnVmZmVyLgorICAgIChpZi1sZXQqICgoY2FjaGUgKHZ0YWJsZS0t
Y3VycmVudC1jYWNoZSB0YWJsZSkpCisgICAgICAgICAgICAgIChsaW5lLW51bWJlciAoc2VxLXBv
c2l0aW9uICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBvbGQtb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChsYW1iZGEgKGEgYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoZXF1YWwgKGNhciBhKSBiKSkpKQorICAgICAgICAgICAgICAobGlu
ZSAoZWx0ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSBsaW5lLW51bWJlcikpKQorICAgICAg
ICAod2l0aC1jdXJyZW50LWJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJsZSkKICAgICAgICAgICAo
c2V0Y2FyIGxpbmUgb2JqZWN0KQogICAgICAgICAgIChzZXRjZHIgbGluZSAodnRhYmxlLS1jb21w
dXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpCiAgICAgICAgICAgOzsgLi4uIGFuZCByZWRp
c3BsYXkgdGhlIGxpbmUgaW4gcXVlc3Rpb24uCkBAIC0zMjEsOCArMzM3LDcgQEAgdnRhYmxlLXVw
ZGF0ZS1vYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0t
Y2FjaGUtd2lkdGhzIGNhY2hlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
dnRhYmxlLS1zcGFjZXIgdGFibGUpKQogICAgICAgICAgICAgICAoYWRkLXRleHQtcHJvcGVydGll
cyBzdGFydCAocG9pbnQpIChsaXN0ICdrZXltYXAga2V5bWFwCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2dGFibGUt
Y2FjaGUgY2FjaGUpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZSkpKSkKICAgICAgICAgICA7OyBXZSBtYXkgaGF2
ZSBpbnNlcnRlZCBhIG5vbi1udW1lcmljYWwgdmFsdWUgaW50byBhIHByZXZpb3VzbHkKICAgICAg
ICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUuCiAgICAgICAgICAgKHZ0
YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAoY2RyIGxpbmUpKSkKQEAgLTMzNCwxNCAr
MzQ5LDE1IEBAIHZ0YWJsZS1yZW1vdmUtb2JqZWN0CiAgIDs7IEZpcnN0IHJlbW92ZSBmcm9tIHRo
ZSBvYmplY3RzLgogICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpIChkZWxxIG9iamVjdCAo
dnRhYmxlLW9iamVjdHMgdGFibGUpKSkKICAgOzsgVGhlbiBhZGp1c3QgdGhlIGNhY2hlIGFuZCBk
aXNwbGF5LgotICAoc2F2ZS1leGN1cnNpb24KLSAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUp
Ci0gICAgKGxldCAoKGNhY2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKQotICAgICAgICAgIChp
bmhpYml0LXJlYWQtb25seSB0KSkKLSAgICAgIChzZXRjYXIgY2FjaGUgKGRlbHEgKGFzc3Egb2Jq
ZWN0ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpKSkKLSAgICAgICh3aGVuICh2dGFibGUtZ290
by1vYmplY3Qgb2JqZWN0KQotICAgICAgICAoZGVsZXRlLWxpbmUpKSkpKQorICAod2l0aC1jdXJy
ZW50LWJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJsZSkKKyAgICAoc2F2ZS1leGN1cnNpb24KKyAg
ICAgICh2dGFibGUtZ290by10YWJsZSB0YWJsZSkKKyAgICAgIChsZXQgKChjYWNoZSAodnRhYmxl
LS1jdXJyZW50LWNhY2hlIHRhYmxlKSkKKyAgICAgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0
KSkKKyAgICAgICAgKHNldGNhciBjYWNoZSAoZGVscSAoYXNzcSBvYmplY3QgKHZ0YWJsZS0tY2Fj
aGUtbGluZXMgY2FjaGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWNh
Y2hlLWxpbmVzIGNhY2hlKSkpCisgICAgICAgICh3aGVuICh2dGFibGUtZ290by1vYmplY3Qgb2Jq
ZWN0KQorICAgICAgICAgIChkZWxldGUtbGluZSkpKSkpKQogCiA7OyBGSVhNRTogVGhlIGZhY3Qg
dGhhdCB0aGUgYGxvY2F0aW9uJyBhcmd1bWVudCBvZgogOzsgYHZ0YWJsZS1pbnNlcnQtb2JqZWN0
JyBjYW4gYmUgYW4gaW50ZWdlciBhbmQgaXMgdGhlbiBpbnRlcnByZXRlZCBhcwpAQCAtMzY5LDgg
KzM4NSw5IEBAIHZ0YWJsZS1pbnNlcnQtb2JqZWN0CiAgICAgICAocHJvZ24KICAgICAgICAgKHNl
dGYgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSAobGlzdCBvYmplY3QpKQogICAgICAgICAodnRhYmxl
LS1yZWNvbXB1dGUtbnVtZXJpY2FsIHRhYmxlICh2dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUg
dGFibGUgb2JqZWN0KSkKLSAgICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlKQotICAgICAg
ICAodnRhYmxlLXJldmVydC1jb21tYW5kKSkKKyAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIg
KHZ0YWJsZS1idWZmZXIgdGFibGUpCisgICAgICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxl
KQorICAgICAgICAgICh2dGFibGUtcmV2ZXJ0LWNvbW1hbmQpKSkKICAgICA7OyBGaXJzdCBpbnNl
cnQgaW50byB0aGUgb2JqZWN0cy4KICAgICAobGV0ICgocG9zIChpZiBsb2NhdGlvbgogICAgICAg
ICAgICAgICAgICAgIChpZiAoaW50ZWdlcnAgbG9jYXRpb24pCkBAIC0zOTgsNTYgKzQxNSw1NyBA
QCB2dGFibGUtaW5zZXJ0LW9iamVjdAogICAgICAgICAgIDs7IE90aGVyd2lzZSwgYXBwZW5kIHRo
ZSBvYmplY3QuCiAgICAgICAgICAgKG5jb25jICh2dGFibGUtb2JqZWN0cyB0YWJsZSkgKGxpc3Qg
b2JqZWN0KSkpKSkKICAgICA7OyBUaGVuIGFkanVzdCB0aGUgY2FjaGUgYW5kIGRpc3BsYXkuCi0g
ICAgKHNhdmUtZXhjdXJzaW9uCi0gICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCi0gICAg
ICAobGV0KiAoKGNhY2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKQotICAgICAgICAgICAgIChp
bmhpYml0LXJlYWQtb25seSB0KQotICAgICAgICAgICAgIChrZXltYXAgKGdldC10ZXh0LXByb3Bl
cnR5IChwb2ludCkgJ2tleW1hcCkpCi0gICAgICAgICAgICAgKGVsbGlwc2lzIChpZiAodnRhYmxl
LWVsbGlwc2lzIHRhYmxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnRpemUg
KHRydW5jYXRlLXN0cmluZy1lbGxpcHNpcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICdmYWNlICh2dGFibGUtZmFjZSB0YWJsZSkpCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgIiIpKQotICAgICAgICAgICAgIChlbGxpcHNpcy13aWR0aCAoc3RyaW5nLXBpeGVsLXdp
ZHRoIGVsbGlwc2lzKSkKLSAgICAgICAgICAgICAobGluZXMgKHZ0YWJsZS0tY2FjaGUtbGluZXMg
Y2FjaGUpKQotICAgICAgICAgICAgIChlbGVtIChpZiBsb2NhdGlvbiAgOyBUaGlzIGJpbmRpbmcg
bWlycm9ycyB0aGUgYmluZGluZyBvZiBgcG9zJyBhYm92ZS4KLSAgICAgICAgICAgICAgICAgICAg
ICAgKGlmIChpbnRlZ2VycCBsb2NhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChu
dGggbG9jYXRpb24gbGluZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKG9yIChhc3NxIGxv
Y2F0aW9uIGxpbmVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIGJlZm9yZSAo
Y2FyIGxpbmVzKSkpKQotICAgICAgICAgICAgICAgICAgICAgKGlmIGJlZm9yZSAoY2FyIGxpbmVz
KSkpKQotICAgICAgICAgICAgIChwb3MgKG1lbXEgZWxlbSBsaW5lcykpCi0gICAgICAgICAgICAg
KGxpbmUgKGNvbnMgb2JqZWN0ICh2dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUgdGFibGUgb2Jq
ZWN0KSkpKQotICAgICAgICAoaWYgKG9yIGJlZm9yZQotICAgICAgICAgICAgICAgIChhbmQgcG9z
IChpbnRlZ2VycCBsb2NhdGlvbikpKQotICAgICAgICAgICAgOzsgQWRkIHRoZSBuZXcgb2JqZWN0
IGJlZm9yZTouCi0gICAgICAgICAgICAobGV0ICgob2xkLWxpbmUgKGNhciBwb3MpKSkKLSAgICAg
ICAgICAgICAgKHNldGNhciBwb3MgbGluZSkKLSAgICAgICAgICAgICAgKHNldGNkciBwb3MgKGNv
bnMgb2xkLWxpbmUgKGNkciBwb3MpKSkKLSAgICAgICAgICAgICAgKHVubGVzcyAodnRhYmxlLWdv
dG8tb2JqZWN0IChjYXIgZWxlbSkpCi0gICAgICAgICAgICAgICAgKHZ0YWJsZS1iZWdpbm5pbmct
b2YtdGFibGUpKSkKLSAgICAgICAgICA7OyBPdGhlcndpc2UsIGFkZCB0aGUgb2JqZWN0IGFmdGVy
LgotICAgICAgICAgIChpZiBwb3MKLSAgICAgICAgICAgICAgOzsgU3BsaWNlIHRoZSBvYmplY3Qg
aW50byB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgKHByb2duCi0gICAgICAgICAgICAgICAgKHNl
dGNkciBwb3MgKGNvbnMgbGluZSAoY2RyIHBvcykpKQotICAgICAgICAgICAgICAgIChpZiAodnRh
YmxlLWdvdG8tb2JqZWN0IGxvY2F0aW9uKQotICAgICAgICAgICAgICAgICAgICAoZm9yd2FyZC1s
aW5lIDEpICA7IEluc2VydCAqYWZ0ZXIqLgotICAgICAgICAgICAgICAgICAgKHZ0YWJsZS1lbmQt
b2YtdGFibGUpKSkKLSAgICAgICAgICAgIDs7IE90aGVyd2lzZSwgYXBwZW5kIHRoZSBvYmplY3Qu
Ci0gICAgICAgICAgICAoc2V0Y2FyIGNhY2hlIChuY29uYyBsaW5lcyAobGlzdCBsaW5lKSkpCi0g
ICAgICAgICAgICAodnRhYmxlLWVuZC1vZi10YWJsZSkpKQotICAgICAgICAobGV0ICgoc3RhcnQg
KHBvaW50KSkpCi0gICAgICAgICAgOzsgRklYTUU6IFdlIGhhdmUgdG8gYWRqdXN0IGNvbG9ycyBp
biBsaW5lcyBiZWxvdyB0aGlzIGlmIHdlCi0gICAgICAgICAgOzsgaGF2ZSA6cm93LWNvbG9ycy4K
LSAgICAgICAgICAodnRhYmxlLS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIDAKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpICh2dGFibGUt
LXNwYWNlciB0YWJsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpcyBl
bGxpcHNpcy13aWR0aCkKLSAgICAgICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9p
bnQpIChsaXN0ICdrZXltYXAga2V5bWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAndnRhYmxlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlLWNhY2hlIGNhY2hlKSkpCi0gICAg
ICAgIDs7IFdlIG1heSBoYXZlIGluc2VydGVkIGEgbm9uLW51bWVyaWNhbCB2YWx1ZSBpbnRvIGEg
cHJldmlvdXNseQotICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUu
Ci0gICAgICAgICh2dGFibGUtLXJlY29tcHV0ZS1udW1lcmljYWwgdGFibGUgKGNkciBsaW5lKSkp
KSkpCisgICAgKGxldCogKChjYWNoZSAodnRhYmxlLS1jdXJyZW50LWNhY2hlIHRhYmxlKSkKKyAg
ICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQpCisgICAgICAgICAgIChsaW5lcyAodnRhYmxl
LS1jYWNoZS1saW5lcyBjYWNoZSkpCisgICAgICAgICAgIChlbGVtIChpZiBsb2NhdGlvbiAgOyBU
aGlzIGJpbmRpbmcgbWlycm9ycyB0aGUgYmluZGluZyBvZiBgcG9zJyBhYm92ZS4KKyAgICAgICAg
ICAgICAgICAgICAgIChpZiAoaW50ZWdlcnAgbG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAg
ICAgICAgKG50aCBsb2NhdGlvbiBsaW5lcykKKyAgICAgICAgICAgICAgICAgICAgICAgKG9yIChh
c3NxIGxvY2F0aW9uIGxpbmVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBiZWZv
cmUgKGNhciBsaW5lcykpKSkKKyAgICAgICAgICAgICAgICAgICAoaWYgYmVmb3JlIChjYXIgbGlu
ZXMpKSkpCisgICAgICAgICAgIChwb3MgKG1lbXEgZWxlbSBsaW5lcykpCisgICAgICAgICAgIChs
aW5lIChjb25zIG9iamVjdCAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVj
dCkpKSkKKyAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKQor
ICAgICAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFi
bGUpCisgICAgICAgICAgKGxldCogKChlbGxpcHNpcyAoaWYgKHZ0YWJsZS1lbGxpcHNpcyB0YWJs
ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAodHJ1bmNhdGUt
c3RyaW5nLWVsbGlwc2lzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICdmYWNlICh2dGFibGUtZmFjZSB0YWJsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICIiKSkKKyAgICAgICAgICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwt
d2lkdGggZWxsaXBzaXMgKGN1cnJlbnQtYnVmZmVyKSkpCisgICAgICAgICAgICAgICAgIChrZXlt
YXAgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1hcCkpKQorICAgICAgICAgICAgKGlm
IChvciBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgKGFuZCBwb3MgKGludGVnZXJwIGxvY2F0
aW9uKSkpCisgICAgICAgICAgICAgICAgOzsgQWRkIHRoZSBuZXcgb2JqZWN0IGJlZm9yZTouCisg
ICAgICAgICAgICAgICAgKGxldCAoKG9sZC1saW5lIChjYXIgcG9zKSkpCisgICAgICAgICAgICAg
ICAgICAoc2V0Y2FyIHBvcyBsaW5lKQorICAgICAgICAgICAgICAgICAgKHNldGNkciBwb3MgKGNv
bnMgb2xkLWxpbmUgKGNkciBwb3MpKSkKKyAgICAgICAgICAgICAgICAgICh1bmxlc3MgKHZ0YWJs
ZS1nb3RvLW9iamVjdCAoY2FyIGVsZW0pKQorICAgICAgICAgICAgICAgICAgICAodnRhYmxlLWJl
Z2lubmluZy1vZi10YWJsZSkpKQorICAgICAgICAgICAgICA7OyBPdGhlcndpc2UsIGFkZCB0aGUg
b2JqZWN0IGFmdGVyLgorICAgICAgICAgICAgICAoaWYgcG9zCisgICAgICAgICAgICAgICAgICA7
OyBTcGxpY2UgdGhlIG9iamVjdCBpbnRvIHRoZSBsaXN0LgorICAgICAgICAgICAgICAgICAgKHBy
b2duCisgICAgICAgICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIGxpbmUgKGNkciBwb3Mp
KSkKKyAgICAgICAgICAgICAgICAgICAgKGlmICh2dGFibGUtZ290by1vYmplY3QgbG9jYXRpb24p
CisgICAgICAgICAgICAgICAgICAgICAgICAoZm9yd2FyZC1saW5lIDEpICA7IEluc2VydCAqYWZ0
ZXIqLgorICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCisgICAg
ICAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVjdC4KKyAgICAgICAgICAg
ICAgICAoc2V0Y2FyIGNhY2hlIChuY29uYyBsaW5lcyAobGlzdCBsaW5lKSkpCisgICAgICAgICAg
ICAgICAgKHZ0YWJsZS1lbmQtb2YtdGFibGUpKSkKKyAgICAgICAgICAgIChsZXQgKChzdGFydCAo
cG9pbnQpKSkKKyAgICAgICAgICAgICAgOzsgRklYTUU6IFdlIGhhdmUgdG8gYWRqdXN0IGNvbG9y
cyBpbiBsaW5lcyBiZWxvdyB0aGlzIGlmIHdlCisgICAgICAgICAgICAgIDs7IGhhdmUgOnJvdy1j
b2xvcnMuCisgICAgICAgICAgICAgICh2dGFibGUtLWluc2VydC1saW5lIHRhYmxlIGxpbmUgMAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMg
Y2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLXNwYWNl
ciB0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMgZWxs
aXBzaXMtd2lkdGgpCisgICAgICAgICAgICAgIChhZGQtdGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChw
b2ludCkgKGxpc3QgJ2tleW1hcCBrZXltYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlIHRhYmxlKSkpCisgICAgICAgICAgICA7
OyBXZSBtYXkgaGF2ZSBpbnNlcnRlZCBhIG5vbi1udW1lcmljYWwgdmFsdWUgaW50byBhIHByZXZp
b3VzbHkKKyAgICAgICAgICAgIDs7IGFsbC1udW1lcmljYWwgdGFibGUsIHNvIHJlY29tcHV0ZS4K
KyAgICAgICAgICAgICh2dGFibGUtLXJlY29tcHV0ZS1udW1lcmljYWwgdGFibGUgKGNkciBsaW5l
KSkpKSkpKSkKIAogKGRlZnVuIHZ0YWJsZS1jb2x1bW4gKHRhYmxlIGluZGV4KQogICAiUmV0dXJu
IHRoZSBuYW1lIG9mIHRoZSBJTkRFWHRoIGNvbHVtbiBpbiBUQUJMRS4iCkBAIC01MjAsMTQgKzUz
OCwxNCBAQCB2dGFibGUtLWNhY2hlLXdpZHRocwogKGRlZnVuIHZ0YWJsZS0tY2FjaGUtbGluZXMg
KGNhY2hlKQogICAoY2FyIGNhY2hlKSkKIAotKGRlZnVuIHZ0YWJsZS1pbnNlcnQgKHRhYmxlKQor
KGRlZnVuIHZ0YWJsZS0taW5zZXJ0ICh0YWJsZSkKICAgKGxldCogKChzcGFjZXIgKHZ0YWJsZS0t
c3BhY2VyIHRhYmxlKSkKICAgICAgICAgIChzdGFydCAocG9pbnQpKQogICAgICAgICAgKGVsbGlw
c2lzIChpZiAodnRhYmxlLWVsbGlwc2lzIHRhYmxlKQogICAgICAgICAgICAgICAgICAgICAgICAo
cHJvcGVydGl6ZSAodHJ1bmNhdGUtc3RyaW5nLWVsbGlwc2lzKQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAnZmFjZSAodnRhYmxlLWZhY2UgdGFibGUpKQogICAgICAgICAgICAg
ICAgICAgICAgIiIpKQotICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lk
dGggZWxsaXBzaXMpKQorICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lk
dGggZWxsaXBzaXMgKGN1cnJlbnQtYnVmZmVyKSkpCiAgICAgICAgICA7OyBXZSBtYWludGFpbiBh
IGNhY2hlIHBlciBzY3JlZW4vd2luZG93IHdpZHRoLCBzbyB0aGF0IHdlIHJlbmRlcgogICAgICAg
ICAgOzsgY29ycmVjdGx5IGlmIEVtYWNzIGlzIG9wZW4gb24gdHdvIGRpZmZlcmVudCBzY3JlZW5z
IChvciB0aGUKICAgICAgICAgIDs7IHVzZXIgcmVzaXplcyB0aGUgZnJhbWUpLgpAQCAtNTQ5LDgg
KzU2Nyw3IEBAIHZ0YWJsZS1pbnNlcnQKICAgICAgICAgKGFkZC10ZXh0LXByb3BlcnRpZXMgc3Rh
cnQgKHBvaW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAna2V5bWFwIHZ0
YWJsZS1oZWFkZXItbGluZS1tYXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
J3JlYXItbm9uc3RpY2t5IHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0
YWJsZSB0YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlLWNh
Y2hlIGNhY2hlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0
YWJsZSkpCiAgICAgICAgIChzZXRxIHN0YXJ0IChwb2ludCkpKSkKICAgICAodnRhYmxlLS1zb3J0
IHRhYmxlIGNhY2hlKQogICAgIDs7IEluc2VydCB0aGUgZGF0YS4KQEAgLTU2MSwxMyArNTc4LDI4
IEBAIHZ0YWJsZS1pbnNlcnQKICAgICAgICAgKHNldHEgbGluZS1udW1iZXIgKDErIGxpbmUtbnVt
YmVyKSkpKQogICAgIChhZGQtdGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkKICAgICAgICAg
ICAgICAgICAgICAgICAgICAobGlzdCAncmVhci1ub25zdGlja3kgdAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICd2dGFibGUgdGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAndnRhYmxlLWNhY2hlIGNhY2hlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAndnRhYmxlIHRhYmxlKSkKKyAgICAodnRhYmxlLS1zZXQtY3VycmVudC1jYWNoZSB0YWJsZSBj
YWNoZSkKICAgICAoZ290by1jaGFyIHN0YXJ0KSkpCiAKKyhkZWZ1biB2dGFibGUtaW5zZXJ0ICh0
YWJsZSkKKyAgIkluc2VydCBUQUJMRSBpbnRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KK1RoZSBjdXJy
ZW50IGJ1ZmZlciB3aWxsIGJlIHJlY29yZGVkIGFzIFRBQkxFJ3MgYnVmZmVyLiAgSWYgdGhpcyBp
cyBkb25lCittb3JlIHRoYW4gb25jZSwgb3IgaWYgdGhlIHRhYmxlIGlzIGF0dGVtcHRlZCB0byBi
ZSBpbnNlcnRlZCBtb3JlIHRoYW4KK29uY2UgaW50byB0aGUgc2FtZSBidWZmZXIsIHNpZ25hbCBh
biBlcnJvci4iCisgIChpZi1sZXQqICgodGFibGUtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxl
KSkpCisgICAgICAoaWYgKGVxIHRhYmxlLWJ1ZmZlciAoY3VycmVudC1idWZmZXIpKQorICAgICAg
ICAgIChlcnJvciAiQSB2dGFibGUgY2Fubm90IGJlIGluc2VydGVkIG1vcmUgdGhhbiBvbmNlIGlu
dG8gYSBidWZmZXIiKQorICAgICAgICAoZXJyb3IgIkEgdnRhYmxlIGNhbm5vdCBiZSBpbnNlcnRl
ZCBpbnRvIG1vcmUgdGhhbiBvbmUgYnVmZmVyIikpKQorICAodnRhYmxlLXNldC1idWZmZXIgKGN1
cnJlbnQtYnVmZmVyKSB0YWJsZSkKKyAgKGxldCAoKGluaGliaXQtcmVhZC1vbmx5IHQpCisgICAg
ICAgIChpbmhpYml0LW1vZGlmaWNhdGlvbi1ob29rcyB0KSkKKyAgICAodnRhYmxlLS1pbnNlcnQg
dGFibGUpKSkKKwogKGRlZnVuIHZ0YWJsZS0taW5zZXJ0LWxpbmUgKHRhYmxlIGxpbmUgbGluZS1u
dW1iZXIgd2lkdGhzIHNwYWNlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZv
cHRpb25hbCBlbGxpcHNpcyBlbGxpcHNpcy13aWR0aCkKICAgKGxldCAoKHN0YXJ0IChwb2ludCkp
CisgICAgICAgIChidWZmZXIgKHZ0YWJsZS1idWZmZXIgdGFibGUpKQogICAgICAgICAoY29sdW1u
cyAodnRhYmxlLWNvbHVtbnMgdGFibGUpKQogICAgICAgICAoY29sdW1uLWNvbG9ycwogICAgICAg
ICAgKGFuZCAodnRhYmxlLWNvbHVtbi1jb2xvcnMgdGFibGUpCkBAIC02MDcsMTYgKzYzOSwxOCBA
QCB2dGFibGUtLWluc2VydC1saW5lCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdAogICAg
ICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1saW1pdC1zdHJpbmcKICAgICAgICAgICAgICAg
ICAgICAgICAgIHByZS1jb21wdXRlZCAoLSAoZWx0IHdpZHRocyBpbmRleCkKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgZWxsaXBzaXMtd2lkdGggMCkpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciBlbGxpcHNpcy13aWR0aCAw
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICAg
ICAgZWxsaXBzaXMpCiAgICAgICAgICAgICAgICAgICAgIHByZS1jb21wdXRlZCkpCiAgICAgICAg
ICAgICAgICAgIDs7IFJlY29tcHV0ZSB3aWR0aHMuCiAgICAgICAgICAgICAgICAgICh0Ci0gICAg
ICAgICAgICAgICAgICAoaWYgKD4gKHN0cmluZy1waXhlbC13aWR0aCB2YWx1ZSkgKGVsdCB3aWR0
aHMgaW5kZXgpKQorICAgICAgICAgICAgICAgICAgKGlmICg+IChzdHJpbmctcGl4ZWwtd2lkdGgg
dmFsdWUgYnVmZmVyKSAoZWx0IHdpZHRocyBpbmRleCkpCiAgICAgICAgICAgICAgICAgICAgICAg
KGNvbmNhdAogICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1saW1pdC1zdHJpbmcKICAg
ICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICgtIChlbHQgd2lkdGhzIGluZGV4KQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yIGVsbGlwc2lzLXdpZHRoIDApKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciBlbGxpcHNpcy13aWR0aCAwKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBz
aXMpCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlKSkpKQogICAgICAgICAgICAgICAgKHN0YXJ0
IChwb2ludCkpCkBAIC02MzAsMTQgKzY2NCwxNSBAQCB2dGFibGUtLWluc2VydC1saW5lCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChsaXN0ICdzcGFjZQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICA6d2lkdGggKGxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoKyAoLSAoZWx0IHdpZHRocyBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLXBpeGVsLXdpZHRoIGRpc3BsYXllZCkpCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1waXhl
bC13aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk
aXNwbGF5ZWQgYnVmZmVyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAoaWYgbGFzdCAwIHNwYWNlcikpKSkpKSkKICAgICAgICAgICAgICA7OyBBbGlnbiB0byB0
aGUgcmlnaHQuCiAgICAgICAgICAgICAgKGluc2VydCAocHJvcGVydGl6ZSAiICIgJ2Rpc3BsYXkK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0ICdzcGFjZQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndpZHRoIChsaXN0ICgtIChlbHQgd2lkdGhz
IGluZGV4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChzdHJpbmctcGl4ZWwtd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkKSkpKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkIGJ1ZmZl
cikpKSkpCiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWQpCiAgICAgICAgICAgICAgKHVu
bGVzcyBsYXN0CiAgICAgICAgICAgICAgICAoaW5zZXJ0IChwcm9wZXJ0aXplICIgIiAnZGlzcGxh
eQpAQCAtNjY0LDE1ICs2OTksMTkgQEAgdnRhYmxlLS1pbnNlcnQtbGluZQogKGRlZnVuIHZ0YWJs
ZS0tY2FjaGUta2V5ICgpCiAgIChjb25zIChmcmFtZS10ZXJtaW5hbCkgKHdpbmRvdy13aWR0aCkp
KQogCi0oZGVmdW4gdnRhYmxlLS1jdXJyZW50LWNhY2hlICgpCi0gICJSZXR1cm4gdGhlIGN1cnJl
bnQgY2FjaGUgZm9yIHRoZSB0YWJsZSBhdCBwb2ludC4KKyhkZWZ1biB2dGFibGUtLWN1cnJlbnQt
Y2FjaGUgKCZvcHRpb25hbCB0YWJsZSkKKyAgIlJldHVybiB0aGUgY3VycmVudCBjYWNoZSBmb3Ig
VEFCTEUgb3IgdGhlIHRhYmxlIHVuZGVyIHBvaW50LgogCiBJbiBgdnRhYmxlLWluc2VydCcsIHRo
ZSBsaW5lcyBhbmQgd2lkdGhzIG9mIHRoZSB2dGFibGUgdGV4dCBhcmUgY29tcHV0ZWQKIGJhc2Vk
IG9uIHRoZSBjdXJyZW50IHNlbGVjdGVkIGZyYW1lIGFuZCB3aW5kb3cgYW5kIHN0b3JlZCBpbiBh
IGNhY2hlLgogU3Vic2VxdWVudCBpbnRlcmFjdGlvbiB3aXRoIHRoZSB0ZXh0IG9mIHRoZSB2dGFi
bGUgc2hvdWxkIHVzZSB0aGF0IGNhY2hlCiB2aWEgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiBi
eSBjYWxsaW5nIGB2dGFibGUtLWNhY2hlLWtleScgdG8gbG9vayB1cAogdGhlIGNhY2hlLiIKLSAg
KGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ3Z0YWJsZS1jYWNoZSkpCisgIChzbG90LXZhbHVl
IChvciB0YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKSAnLWN1cnJlbnQtY2FjaGUpKQorCiso
ZGVmdW4gdnRhYmxlLS1zZXQtY3VycmVudC1jYWNoZSAodGFibGUgY2FjaGUpCisgICJTZXQgdGhl
IGN1cnJlbnQgY2FjaGUgZm9yIHRoZSB0YWJsZS4iCisgIChzZXRmIChzbG90LXZhbHVlIHRhYmxl
ICctY3VycmVudC1jYWNoZSkgY2FjaGUpKQogCiAoZGVmdW4gdnRhYmxlLS1jbGVhci1jYWNoZSAo
dGFibGUpCiAgIChzZXRmIChnZXRoYXNoICh2dGFibGUtLWNhY2hlLWtleSkgKHNsb3QtdmFsdWUg
dGFibGUgJy1jYWNoZSkpIG5pbCkpCkBAIC03MTgsNiArNzU3LDcgQEAgdnRhYmxlLS1pbmRpY2F0
b3IKIChkZWZ1biB2dGFibGUtLWluc2VydC1oZWFkZXItbGluZSAodGFibGUgd2lkdGhzIHNwYWNl
cikKICAgOzsgSW5zZXJ0IHRoZSBoZWFkZXIgZGlyZWN0bHkgaW50byB0aGUgYnVmZmVyLgogICAo
bGV0ICgoc3RhcnQgKHBvaW50KSkKKyAgICAgICAgKGJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJs
ZSkpCiAgICAgICAgIChkaXZpZGVyICh2dGFibGUtZGl2aWRlciB0YWJsZSkpCiAgICAgICAgIChj
bWFwIChkZWZpbmUta2V5bWFwCiAgICAgICAgICAgICAgICAgIjxoZWFkZXItbGluZT4gPGRyYWct
bW91c2UtMT4iICMndnRhYmxlLS1kcmFnLXJlc2l6ZS1jb2x1bW4KQEAgLTczNywxNCArNzc3LDE1
IEBAIHZ0YWJsZS0taW5zZXJ0LWhlYWRlci1saW5lCiAgICAgICAgICAgICAgICAgICAgICAna2V5
bWFwIGNtYXApKQogICAgICAgICAgICAgICAoc3RhcnQgKHBvaW50KSkKICAgICAgICAgICAgICAg
KGluZGljYXRvciAodnRhYmxlLS1pbmRpY2F0b3IgdGFibGUgaW5kZXgpKQotICAgICAgICAgICAg
ICAoaW5kaWNhdG9yLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggaW5kaWNhdG9yKSkKKyAgICAg
ICAgICAgICAgKGluZGljYXRvci13aWR0aCAoc3RyaW5nLXBpeGVsLXdpZHRoIGluZGljYXRvciBi
dWZmZXIpKQogICAgICAgICAgICAgICAobGFzdCAoPSBpbmRleCAoMS0gKGxlbmd0aCAodnRhYmxl
LWNvbHVtbnMgdGFibGUpKSkpKQogICAgICAgICAgICAgICBkaXNwbGF5ZWQpCiAgICAgICAgICAo
c2V0cSBkaXNwbGF5ZWQKLSAgICAgICAgICAgICAgIChpZiAoPiAoc3RyaW5nLXBpeGVsLXdpZHRo
IG5hbWUpCisgICAgICAgICAgICAgICAoaWYgKD4gKHN0cmluZy1waXhlbC13aWR0aCBuYW1lIGJ1
ZmZlcikKICAgICAgICAgICAgICAgICAgICAgICAoLSAoZWx0IHdpZHRocyBpbmRleCkgaW5kaWNh
dG9yLXdpZHRoKSkKICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1saW1pdC1zdHJpbmcKLSAg
ICAgICAgICAgICAgICAgICAgbmFtZSAoLSAoZWx0IHdpZHRocyBpbmRleCkgaW5kaWNhdG9yLXdp
ZHRoKSkKKyAgICAgICAgICAgICAgICAgICAgbmFtZSAoLSAoZWx0IHdpZHRocyBpbmRleCkgaW5k
aWNhdG9yLXdpZHRoKQorICAgICAgICAgICAgICAgICAgICBidWZmZXIpCiAgICAgICAgICAgICAg
ICAgIG5hbWUpKQogICAgICAgICAgKGxldCogKChpbmRpY2F0b3ItbGVhZC13aWR0aAogICAgICAg
ICAgICAgICAgICA7OyBXZSB3YW50IHRoZSBpbmRpY2F0b3IgdG8gbm90IGJlIHF1aXRlIGZsdXNo
IHJpZ2h0LgpAQCAtNzUzLDcgKzc5NCw3IEBAIHZ0YWJsZS0taW5zZXJ0LWhlYWRlci1saW5lCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yLWxlYWQtd2lk
dGgpKQogICAgICAgICAgICAgICAgIChmaWxsLXdpZHRoCiAgICAgICAgICAgICAgICAgICgrICgt
IChlbHQgd2lkdGhzIGluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLXBpeGVs
LXdpZHRoIGRpc3BsYXllZCkKKyAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1waXhlbC13
aWR0aCBkaXNwbGF5ZWQgYnVmZmVyKQogICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3It
d2lkdGgKICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yLWxlYWQtd2lkdGgpCiAgICAg
ICAgICAgICAgICAgICAgIChpZiBsYXN0IDAgc3BhY2VyKSkpKQpAQCAtNzcxLDcgKzgxMiw4IEBA
IHZ0YWJsZS0taW5zZXJ0LWhlYWRlci1saW5lCiAgICAgICAgICAgICAgOzsgVGhpcyBpcyB0aGUg
ZmluYWwgY29sdW1uLCBhbmQgd2UgaGF2ZSBhIHNvcnRpbmcKICAgICAgICAgICAgICA7OyBpbmRp
Y2F0b3IsIGFuZCB0aGUgdGFibGUgaXMgdG9vIHdpZGUgZm9yIHRoZSB3aW5kb3cuCiAgICAgICAg
ICAgICAgKGxldCogKChwcmUtaW5kaWNhdG9yIChzdHJpbmctcGl4ZWwtd2lkdGgKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludC1taW4p
IChwb2ludCkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXIt
c3Vic3RyaW5nIChwb2ludC1taW4pIChwb2ludCkpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBidWZmZXIpKQogICAgICAgICAgICAgICAgICAgICAocHJlLWZpbGwKICAgICAg
ICAgICAgICAgICAgICAgICgtICh3aW5kb3ctd2lkdGggbmlsIHQpCiAgICAgICAgICAgICAgICAg
ICAgICAgICBwcmUtaW5kaWNhdG9yCkBAIC04NTAsMTQgKzg5MiwxNiBAQCB2dGFibGUtLXNldC1o
ZWFkZXItbGluZQogICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQtbWluKSAoMS0g
KHBvaW50LW1heCkpKSkpKQogICAodnRhYmxlLWhlYWRlci1tb2RlIDEpKQogCi0oZGVmdW4gdnRh
YmxlLS1saW1pdC1zdHJpbmcgKHN0cmluZyBwaXhlbHMpCisKKyhkZWZ1biB2dGFibGUtLWxpbWl0
LXN0cmluZyAoc3RyaW5nIHBpeGVscyBidWZmZXIpCiAgICh3aGlsZSAoYW5kIChsZW5ndGg+IHN0
cmluZyAwKQotICAgICAgICAgICAgICAoPiAoc3RyaW5nLXBpeGVsLXdpZHRoIHN0cmluZykgcGl4
ZWxzKSkKKyAgICAgICAgICAgICAgKD4gKHN0cmluZy1waXhlbC13aWR0aCBzdHJpbmcgYnVmZmVy
KSBwaXhlbHMpKQogICAgIChzZXRxIHN0cmluZyAoc3Vic3RyaW5nIHN0cmluZyAwICgxLSAobGVu
Z3RoIHN0cmluZykpKSkpCiAgIHN0cmluZykKIAogKGRlZnVuIHZ0YWJsZS0tY2hhci13aWR0aCAo
dGFibGUpCi0gIChzdHJpbmctcGl4ZWwtd2lkdGggKHByb3BlcnRpemUgIngiICdmYWNlICh2dGFi
bGUtZmFjZSB0YWJsZSkpKSkKKyAgKHN0cmluZy1waXhlbC13aWR0aCAocHJvcGVydGl6ZSAieCIg
J2ZhY2UgKHZ0YWJsZS1mYWNlIHRhYmxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAodnRhYmxl
LWJ1ZmZlciB0YWJsZSkpKQogCiAoZGVmdW4gdnRhYmxlLS1jb21wdXRlLXdpZHRoICh0YWJsZSBz
cGVjKQogICAoY29uZApAQCAtOTM2LDcgKzk4MCw3IEBAIHZ0YWJsZS0tY29tcHV0ZS1jYWNoZWQt
bGluZQogICAgICAgIDs7IFdlIHN0YXNoIHRoZSBjb21wdXRlZCB3aWR0aCBhbmQgc3RyaW5nIGhl
cmUgLS0gaWYgdGhlcmUgYXJlCiAgICAgICAgOzsgbm8gZm9ybWF0dGVycy9kaXNwbGF5ZXJzLCB3
ZSdsbCBiZSB1c2luZyB0aGUgc3RyaW5nLCBhbmQKICAgICAgICA7OyB0aGVuIHdvbid0IGhhdmUg
dG8gcmVjcmVhdGUgaXQuCi0gICAgICAgKGxpc3QgdmFsdWUgKHN0cmluZy1waXhlbC13aWR0aCBz
dHJpbmcpIHN0cmluZykpKQorICAgICAgIChsaXN0IHZhbHVlIChzdHJpbmctcGl4ZWwtd2lkdGgg
c3RyaW5nICh2dGFibGUtYnVmZmVyIHRhYmxlKSkgc3RyaW5nKSkpCiAgICAodnRhYmxlLWNvbHVt
bnMgdGFibGUpKSkKIAogKGRlZnVuIHZ0YWJsZS0tbWFrZS1rZXltYXAgKHRhYmxlKQpAQCAtOTY3
LDIwICsxMDExLDIxIEBAIHZ0YWJsZS0tbWFrZS1rZXltYXAKICAgICAgICAgICAodnRhYmxlLWtl
eW1hcCB0YWJsZSkpCiAgICAgICBtYXApKSkKIAotKGRlZnVuIHZ0YWJsZS1yZXZlcnQgKCkKLSAg
IlJlZ2VuZXJhdGUgdGhlIHRhYmxlIHVuZGVyIHBvaW50LiIKLSAgKGxldCAoKHRhYmxlICh2dGFi
bGUtY3VycmVudC10YWJsZSkpCi0gICAgICAgIChvYmplY3QgKHZ0YWJsZS1jdXJyZW50LW9iamVj
dCkpCi0gICAgICAgIChjb2x1bW4gKHZ0YWJsZS1jdXJyZW50LWNvbHVtbikpCi0gICAgICAgIChp
bmhpYml0LXJlYWQtb25seSB0KSkKLSAgICAodW5sZXNzIHRhYmxlCi0gICAgICAodXNlci1lcnJv
ciAiTm8gdGFibGUgdW5kZXIgcG9pbnQiKSkKLSAgICAoZGVsZXRlLXJlZ2lvbiAodnRhYmxlLWJl
Z2lubmluZy1vZi10YWJsZSkgKHZ0YWJsZS1lbmQtb2YtdGFibGUpKQotICAgICh2dGFibGUtaW5z
ZXJ0IHRhYmxlKQotICAgICh3aGVuIG9iamVjdAotICAgICAgKHZ0YWJsZS1nb3RvLW9iamVjdCBv
YmplY3QpKQotICAgICh3aGVuIGNvbHVtbgotICAgICAgKHZ0YWJsZS1nb3RvLWNvbHVtbiBjb2x1
bW4pKSkpCisoZGVmdW4gdnRhYmxlLXJldmVydCAoJm9wdGlvbmFsIHRhYmxlKQorICAiUmVnZW5l
cmF0ZSBUQUJMRSwgZGVmYXVsdGluZyB0byB0aGUgdGFibGUgdW5kZXIgcG9pbnQuIgorICAoc2V0
cSB0YWJsZSAob3IgdGFibGUgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpCisgICh1bmxlc3MgdGFi
bGUKKyAgICAodXNlci1lcnJvciAiTm8gdGFibGUgdW5kZXIgcG9pbnQiKSkKKyAgKHdpdGgtY3Vy
cmVudC1idWZmZXIgKHZ0YWJsZS1idWZmZXIgdGFibGUpCisgICAgKGxldCAoKG9iamVjdCAodnRh
YmxlLWN1cnJlbnQtb2JqZWN0KSkKKyAgICAgICAgICAoY29sdW1uICh2dGFibGUtY3VycmVudC1j
b2x1bW4pKQorICAgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KSkKKyAgICAgIChkZWxldGUt
cmVnaW9uICh2dGFibGUtYmVnaW5uaW5nLW9mLXRhYmxlKSAodnRhYmxlLWVuZC1vZi10YWJsZSkp
CisgICAgICAodnRhYmxlLS1pbnNlcnQgdGFibGUpCisgICAgICAod2hlbiBvYmplY3QKKyAgICAg
ICAgKHZ0YWJsZS1nb3RvLW9iamVjdCBvYmplY3QpKQorICAgICAgKHdoZW4gY29sdW1uCisgICAg
ICAgICh2dGFibGUtZ290by1jb2x1bW4gY29sdW1uKSkpKSkKIAogOzs7IENvbW1hbmRzLgogCkBA
IC0xMDA2LDE0ICsxMDUxLDE0IEBAIHZ0YWJsZS1uYXJyb3ctY3VycmVudC1jb2x1bW4KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0gKCogKHZ0YWJsZS0tY2hhci13aWR0aCB0YWJs
ZSkgKG9yIG4gMSkpKSkpKQogCiAoZGVmdW4gdnRhYmxlLS1hbHRlci1jb2x1bW4td2lkdGggKHRh
YmxlIGNvbHVtbiBkZWx0YSkKLSAgKGxldCAoKHdpZHRocyAodnRhYmxlLS1jYWNoZS13aWR0aHMg
KHZ0YWJsZS0tY3VycmVudC1jYWNoZSkpKSkKKyAgKGxldCAoKHdpZHRocyAodnRhYmxlLS1jYWNo
ZS13aWR0aHMgKHZ0YWJsZS0tY3VycmVudC1jYWNoZSB0YWJsZSkpKSkKICAgICAoc2V0ZiAoYXJl
ZiB3aWR0aHMgY29sdW1uKQogICAgICAgICAgIChtYXggKCogKHZ0YWJsZS0tY2hhci13aWR0aCB0
YWJsZSkgMikKICAgICAgICAgICAgICAgICgrIChhcmVmIHdpZHRocyBjb2x1bW4pIGRlbHRhKSkp
CiAgICAgOzsgU3RvcmUgdGhlIHdpZHRoIHNvIGl0J2xsIGJlIHJlc3BlY3RlZCBvbiBhIHJldmVy
dC4KICAgICAoc2V0ZiAodnRhYmxlLWNvbHVtbi13aWR0aCAoZWx0ICh2dGFibGUtY29sdW1ucyB0
YWJsZSkgY29sdW1uKSkKICAgICAgICAgICAoZm9ybWF0ICIlZHB4IiAoYXJlZiB3aWR0aHMgY29s
dW1uKSkpCi0gICAgKHZ0YWJsZS1yZXZlcnQpKSkKKyAgICAodnRhYmxlLXJldmVydCB0YWJsZSkp
KQogCiAoZGVmdW4gdnRhYmxlLXdpZGVuLWN1cnJlbnQtY29sdW1uICgmb3B0aW9uYWwgbikKICAg
IldpZGVuIHRoZSBjdXJyZW50IGNvbHVtbiBieSBOIGNoYXJhY3RlcnMuCkBAIC0xMDI4LDcgKzEw
NzMsOCBAQCB2dGFibGUtcHJldmlvdXMtY29sdW1uCiAgIChpbnRlcmFjdGl2ZSkKICAgKHZ0YWJs
ZS1nb3RvLWNvbHVtbgogICAgKG1heCAwICgxLSAob3IgKHZ0YWJsZS1jdXJyZW50LWNvbHVtbikK
LSAgICAgICAgICAgICAgICAgIChsZW5ndGggKHZ0YWJsZS0tY2FjaGUtd2lkdGhzICh2dGFibGUt
LWN1cnJlbnQtY2FjaGUpKSkpKSkpKQorICAgICAgICAgICAgICAgICAgKGxlbmd0aCAodnRhYmxl
LS1jYWNoZS13aWR0aHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWN1cnJl
bnQtY2FjaGUpKSkpKSkpKQogCiAoZGVmdW4gdnRhYmxlLW5leHQtY29sdW1uICgpCiAgICJHbyB0
byB0aGUgbmV4dCBjb2x1bW4uIgpAQCAtMTAzOCwxNCArMTA4NCwxNiBAQCB2dGFibGUtbmV4dC1j
b2x1bW4KICAgICAgKG1pbiAoMS0gKGxlbmd0aCAodnRhYmxlLS1jYWNoZS13aWR0aHMgKHZ0YWJs
ZS0tY3VycmVudC1jYWNoZSkpKSkKICAgICAgICAgICAoMSsgKHZ0YWJsZS1jdXJyZW50LWNvbHVt
bikpKSkpKQogCi0oZGVmdW4gdnRhYmxlLXJldmVydC1jb21tYW5kICgpCisoZGVmdW4gdnRhYmxl
LXJldmVydC1jb21tYW5kICgmb3B0aW9uYWwgdGFibGUpCiAgICJSZS1xdWVyeSBkYXRhIGFuZCBy
ZWdlbmVyYXRlIHRoZSB0YWJsZSB1bmRlciBwb2ludC4iCiAgIChpbnRlcmFjdGl2ZSkKLSAgKGxl
dCAoKHRhYmxlICh2dGFibGUtY3VycmVudC10YWJsZSkpKQotICAgICh3aGVuICh2dGFibGUtb2Jq
ZWN0cy1mdW5jdGlvbiB0YWJsZSkKLSAgICAgIChzZXRmICh2dGFibGUtb2JqZWN0cyB0YWJsZSkg
KGZ1bmNhbGwgKHZ0YWJsZS1vYmplY3RzLWZ1bmN0aW9uIHRhYmxlKSkpKQotICAgICh2dGFibGUt
LWNsZWFyLWNhY2hlIHRhYmxlKSkKLSAgKHZ0YWJsZS1yZXZlcnQpKQorICAoc2V0cSB0YWJsZSAo
b3IgdGFibGUgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpCisgICh1bmxlc3MgdGFibGUKKyAgICAo
dXNlci1lcnJvciAiTm8gdGFibGUgZm91bmQiKSkKKyAgKHdoZW4gKHZ0YWJsZS1vYmplY3RzLWZ1
bmN0aW9uIHRhYmxlKQorICAgIChzZXRmICh2dGFibGUtb2JqZWN0cyB0YWJsZSkgKGZ1bmNhbGwg
KHZ0YWJsZS1vYmplY3RzLWZ1bmN0aW9uIHRhYmxlKSkpKQorICAodnRhYmxlLS1jbGVhci1jYWNo
ZSB0YWJsZSkKKyAgKHZ0YWJsZS1yZXZlcnQgdGFibGUpKQogCiAoZGVmdW4gdnRhYmxlLXNvcnQt
YnktY3VycmVudC1jb2x1bW4gKCkKICAgIlNvcnQgdGhlIHRhYmxlIHVuZGVyIHBvaW50IGJ5IHRo
ZSBjb2x1bW4gdW5kZXIgcG9pbnQuIgpAQCAtMTA2Nyw4ICsxMTE1LDggQEAgdnRhYmxlLXNvcnQt
YnktY3VycmVudC1jb2x1bW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYg
KGVxIChjZHIgbGFzdCkgJ2FzY2VuZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgJ2Rlc2NlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc2Nl
bmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc2NlbmQpKSkpKSkKLSAgKHZ0
YWJsZS1yZXZlcnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNjZW5kKSkp
KSkKKyAgICAodnRhYmxlLXJldmVydCB0YWJsZSkpKQogCiAoZGVmdW4gdnRhYmxlLWhlYWRlci1s
aW5lLXNvcnQgKGUpCiAgICJTb3J0IGEgdnRhYmxlIGZyb20gdGhlIGhlYWRlciBsaW5lLiIKZGlm
ZiAtLWdpdCBhL3Rlc3QvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS10ZXN0cy5lbCBiL3Rlc3QvbGlz
cC9lbWFjcy1saXNwL3Z0YWJsZS10ZXN0cy5lbAppbmRleCA3NGZiOGNjODEzOS4uODNmODI2ZWEz
NTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS10ZXN0cy5lbAorKysg
Yi90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMuZWwKQEAgLTI3LDE2ICsyNywxOSBA
QAogKHJlcXVpcmUgJ2VydCkKIChyZXF1aXJlICdlcnQteCkKIAotKGVydC1kZWZ0ZXN0IHRlc3Qt
dnN0YWJsZS1jb21wdXRlLWNvbHVtbnMgKCkKKyhkZWZ1biB2dGFibGUtdGVzdHMtLW1ha2Utbm8t
aGVhZGVyLTItb2JqZWN0LXRhYmxlICgpCisgIChtYWtlLXZ0YWJsZSA6Y29sdW1ucyAnKCJhIiAi
YiIgImMiKQorICAgICAgICAgICAgICAgOm9iamVjdHMgJygoImZvbyIgMSAyKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAoImJhciIgMyA6em90KSkKKyAgICAgICAgICAgICAgIDppbnNlcnQg
bmlsKSkKKworKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLWNvbXB1dGUtY29sdW1ucyAoKQogICAo
c2hvdWxkCiAgICAoZXF1YWwgKG1hcGNhcgogICAgICAgICAgICAobGFtYmRhIChjb2x1bW4pCiAg
ICAgICAgICAgICAgKHZ0YWJsZS1jb2x1bW4tYWxpZ24gY29sdW1uKSkKICAgICAgICAgICAgKHZ0
YWJsZS0tY29tcHV0ZS1jb2x1bW5zCi0gICAgICAgICAgICAobWFrZS12dGFibGUgOmNvbHVtbnMg
JygiYSIgImIiICJjIikKLSAgICAgICAgICAgICAgICAgICAgICAgICA6b2JqZWN0cyAnKCgiZm9v
IiAxIDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImJhciIgMyA6em90
KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICA6aW5zZXJ0IG5pbCkpKQorICAgICAgICAgICAg
KHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFkZXItMi1vYmplY3QtdGFibGUpKSkKICAgICAgICAg
ICAnKGxlZnQgcmlnaHQgbGVmdCkpKSkKIAogKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLWluc2Vy
dC1vYmplY3QgKCkKQEAgLTY5LDQgKzcyLDY5IEBAIHRlc3QtdnRhYmxlLWluc2VydC1vYmplY3QK
ICAgICAgICAgICAgICAgKG1hcGNhciAjJ2NhZHIgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkpKQog
ICAgICAgICAgIChudW1iZXItc2VxdWVuY2UgMCAxMSkpKSkKIAorKGVydC1kZWZ0ZXN0IHRlc3Qt
dnRhYmxlLXVuaXF1ZS1idWZmZXIgKCkKKyAgKGxldCAoKHRhYmxlICh2dGFibGUtdGVzdHMtLW1h
a2Utbm8taGVhZGVyLTItb2JqZWN0LXRhYmxlKSkpCisgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAg
ICAgICh2dGFibGUtaW5zZXJ0IHRhYmxlKQorICAgICAgOzsgVGhpcyB3aWxsIHJ1biBidXQgZmFp
bCBvbiBFbWFjcyBwcmUgMzEgdnRhYmxlLgorICAgICAgKHNob3VsZC1lcnJvciAodnRhYmxlLWlu
c2VydCB0YWJsZSkpCisgICAgICA7OyBUaGlzIHdpbGwgcnVuIG9ubHkgb24gRW1hY3MgMzErIHZ0
YWJsZS4KKyAgICAgICh3aGVuICg+IGVtYWNzLW1ham9yLXZlcnNpb24gMzApCisgICAgICAgIChz
aG91bGQtZXJyb3IgKHZ0YWJsZS1zZXQtYnVmZmVyIHRhYmxlIChjdXJyZW50LWJ1ZmZlcikpKSkp
KSkKKworKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLW5vbi1jdXJyZW50LWJ1ZmZlci1pbnNlcnQt
b2JqZWN0ICgpCisgIChsZXQgKCh0YWJsZSAodnRhYmxlLXRlc3RzLS1tYWtlLW5vLWhlYWRlci0y
LW9iamVjdC10YWJsZSkpCisgICAgICAgIChvYmogJygiYmF6IiA0IDUpKSkKKyAgICAod2l0aC10
ZW1wLWJ1ZmZlcgorICAgICAgKHZ0YWJsZS1pbnNlcnQgdGFibGUpCisgICAgICAoc2hvdWxkICg9
IChjb3VudC1saW5lcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkgMikpCisgICAgICAod2l0aC10
ZW1wLWJ1ZmZlcgorICAgICAgICAodnRhYmxlLWluc2VydC1vYmplY3QgdGFibGUgb2JqKSkKKyAg
ICAgIChzaG91bGQgKD0gKGNvdW50LWxpbmVzIChwb2ludC1taW4pIChwb2ludC1tYXgpKSAzKSkp
KSkKKworKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLW5vbi1jdXJyZW50LWJ1ZmZlci1yZW1vdmUt
b2JqZWN0ICgpCisgIChsZXQgKCh0YWJsZSAodnRhYmxlLXRlc3RzLS1tYWtlLW5vLWhlYWRlci0y
LW9iamVjdC10YWJsZSkpCisgICAgICAgIChvYmogJygiYmF6IiA0IDUpKSkKKyAgICAod2l0aC10
ZW1wLWJ1ZmZlcgorICAgICAgKHZ0YWJsZS1pbnNlcnQgdGFibGUpCisgICAgICAodnRhYmxlLWlu
c2VydC1vYmplY3QgdGFibGUgb2JqKQorICAgICAgKHNob3VsZCAoPSAoY291bnQtbGluZXMgKHBv
aW50LW1pbikgKHBvaW50LW1heCkpIDMpKQorICAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAg
ICAgKHZ0YWJsZS1yZW1vdmUtb2JqZWN0IHRhYmxlIG9iaikpCisgICAgICAoc2hvdWxkICg9IChj
b3VudC1saW5lcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkgMikpKSkpCisKKyhlcnQtZGVmdGVz
dCB0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItdXBkYXRlLW9iamVjdCAoKQorICAobGV0
ICgodGFibGUgKHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFkZXItMi1vYmplY3QtdGFibGUpKQor
ICAgICAgICAob2JqICcoImJheiIgNCA1KSkKKyAgICAgICAgKG9iai0yICcoInF1eCIgNiA3KSkp
CisgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICh2dGFibGUtaW5zZXJ0IHRhYmxlKQorICAg
ICAgKHZ0YWJsZS1pbnNlcnQtb2JqZWN0IHRhYmxlIG9iaikKKyAgICAgIChzaG91bGQgKD0gKGNv
dW50LWxpbmVzIChwb2ludC1taW4pIChwb2ludC1tYXgpKSAzKSkKKyAgICAgIChsZXQgKChsaW5l
LTIgKHByb2duCisgICAgICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkK
KyAgICAgICAgICAgICAgICAgICAgICAoZm9yd2FyZC1saW5lIDIpCisgICAgICAgICAgICAgICAg
ICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50KSAocG9pbnQtbWF4KSkpKSkKKyAgICAgICAg
KHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAgICAodnRhYmxlLXVwZGF0ZS1vYmplY3QgdGFibGUg
b2JqLTIgb2JqKSkKKyAgICAgICAgKGxldCAoKGxpbmUtMi1uZXcgKHByb2duCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoZm9yd2FyZC1saW5lIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50KSAocG9pbnQtbWF4KSkpKSkKKyAgICAgICAgICAo
c2hvdWxkICg9IChjb3VudC1saW5lcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkgMykpCisgICAg
ICAgICAgKHNob3VsZCAobm90IChzdHJpbmc9IGxpbmUtMiBsaW5lLTItbmV3KSkpKSkpKSkKKwor
KGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLS1saW1pdC1zdHJpbmctd2l0aC1mYWNlLXJlbWFwcGVk
LWJ1ZmZlciAoKQorICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgIChsZXQgKCh0ZXh0IChwcm9wZXJ0
aXplICJYWFhYWCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFjZSAndmFyaWFibGUt
cGl0Y2gpKSkKKyAgICAgIChmYWNlLXJlbWFwLWFkZC1yZWxhdGl2ZSAnZGVmYXVsdCA6aGVpZ2h0
IDEuNSkKKyAgICAgIChpZiAoPiBlbWFjcy1tYWpvci12ZXJzaW9uIDMwKQorICAgICAgICAgIChz
aG91bGQgKGVxCisgICAgICAgICAgICAgICAgICAgMgorICAgICAgICAgICAgICAgICAgIChsZW5n
dGggKHZ0YWJsZS0tbGltaXQtc3RyaW5nIHRleHQgNTAgKGN1cnJlbnQtYnVmZmVyKSkpKSkKKyAg
ICAgICAgKHNob3VsZCAoZXEKKyAgICAgICAgICAgICAgICAgMgorICAgICAgICAgICAgICAgICAo
bGVuZ3RoICh2dGFibGUtLWxpbWl0LXN0cmluZyB0ZXh0IDUwKSkpKSkpKSkKKwogOzs7IHZ0YWJs
ZS10ZXN0cy5lbCBlbmRzIGhlcmUKLS0gCjIuNDcuMQoK
--0000000000000c6d050645b01364--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 10 Dec 2025 22:34:48 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 10 17:34:48 2025
Received: from localhost ([127.0.0.1]:37550 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vTSlj-0006pO-7T
	for submit <at> debbugs.gnu.org; Wed, 10 Dec 2025 17:34:48 -0500
Received: from mxout5.mail.janestreet.com ([64.215.233.18]:52979)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <sbaugh@HIDDEN>)
 id 1vTSlf-0006p1-UR
 for 79982 <at> debbugs.gnu.org; Wed, 10 Dec 2025 17:34:45 -0500
From: Spencer Baugh <sbaugh@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot, [PATCH] Add vtable buffer slot
In-Reply-To: <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
 (=?utf-8?Q?=22St=C3=A9phane?= Marks"'s message of "Wed, 10 Dec 2025
 17:18:31 -0500")
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
 <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
Date: Wed, 10 Dec 2025 17:34:37 -0500
Message-ID: <ierfr9irmo2.fsf_-_@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com;
 s=waixah; t=1765406078;
 bh=g9VpJL07XAAU2WHDpXO229eLeHPjYmLLhrekUXaa1vY=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date;
 b=WzcMW5+baYiHhpQun7SzbFlTK+/kwO3IOHSxdBToPghErC8DrB+tBCvhAYoGOB5pe
 AmanQEFouw0whYrcOtIq1La6fDffC9ja11qrfF7YbpIu4zIfRRdqcA5gkfkbkScdCW
 nN+iPzIVsoiCR9rdrEQ1U4O0AppTP1e/x15f/GsTWXiYi7k2NpgTKonrvRaJsN/8Ut
 p8SGEtSAMTU4SfhgqPJpdUo2asYjfdOWxrSTmnSXdUsU99NbCdqvMGzxGnl8H3XwqY
 z4Hx1JcAjMEsttQuKLPu9X2WrFi5K7zJ1HG5p4W4oyVxemoq86T9Q1I90fEDgPwz+3
 /Ou4XGyfRXkfw==
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

St=C3=A9phane Marks <shipmints@HIDDEN> writes:
> Thanks.  Revised patch, attached.

(BTW, you shouldn't include the entire previous patch as email context
if you're not replying to individual parts of it, it makes things a bit
harder to read)

> With regard to point vs. window-point, the code seems no worse off
> than before?  There is a suite of additional fixes coming that address
> keeping point stable during operations and we can see if there are any
> ill effects when we get to testing those changes.
>
> -St=C3=A9phane=20
>
> From cf2260c055bed43be6e7208422f9713b2c083d86 Mon Sep 17 00:00:00 2001
> From: =3D?UTF-8?q?St=3DC3=3DA9phane=3D20Marks?=3D <shipmints@HIDDEN>
> Date: Wed, 10 Dec 2025 09:20:02 -0500
> Subject: [PATCH] Add vtable buffer slot
>
> This solves for background vtable mutations, i.e., updates
> initiated from buffers other than the vtable buffer, and for
> buffer-adjusted string-pixel-width computations.
>
> * lisp/emacs-lisp/vtable.el (vtable): New '-buffer' slot.
> (vtable-buffer):
> (vtable-set-buffer): New function.
> (vtable-update-object):
> (vtable-remove-object):
> (vtable-insert-object): Wrap operation with the vtable buffer.
> (vtable--insert): Split from old 'vtable-insert'.
> (vtable-insert): Insert table and record the buffer.
> (vtable--insert-line):
> (vtable--insert-header-line): Use 'vtable-buffer' for pixel-width computa=
tion.
> (vtable--limit-string):
> (vtable--char-width): Pass buffer to 'string-pixel-width'.
> (vtable-revert): New optional table argument.
> (vtable--alter-column-width):
> (vtable-revert-command):
> (vtable-sort-by-current-column): Call 'vtable-revert' with the table.
>
> * test/lisp/emacs-lisp/vtable-tests.el
> (vtable-tests--make-no-header-2-object-table): New helper
> function.
> (test-vstable-compute-columns): Correct typo in test name.  Use
> new helper function.
> (test-vtable-unique-buffer)
> (test-vtable-non-current-buffer-insert-object)
> (test-vtable-non-current-buffer-remove-object)
> (test-vtable-non-current-buffer-update-object)
> (test-vtable--limit-string-with-face-remapped-buffer): New test.
> ---
>  lisp/emacs-lisp/vtable.el            | 293 +++++++++++++++------------
>  test/lisp/emacs-lisp/vtable-tests.el |  78 ++++++-
>  2 files changed, 242 insertions(+), 129 deletions(-)
>
> diff --git a/lisp/emacs-lisp/vtable.el b/lisp/emacs-lisp/vtable.el
> index bcdd280fb92..94f3199f12b 100644
> --- a/lisp/emacs-lisp/vtable.el
> +++ b/lisp/emacs-lisp/vtable.el
> @@ -68,6 +68,7 @@ vtable
>     (column-colors :initarg :column-colors :accessor vtable-column-colors)
>     (row-colors :initarg :row-colors :accessor vtable-row-colors)
>     (-cached-colors :initform nil)
> +   (-buffer :initform nil)
>     (-cache :initform (make-hash-table :test #'equal))
>     (-cached-keymap :initform nil)
>     (-has-column-spec :initform nil))
> @@ -221,6 +222,20 @@ vtable--face-color
>=20=20
>  ;;; Interface utility functions.
>=20=20
> +(defun vtable-buffer (&optional table)
> +  "Return the buffer associated with TABLE.
> +If TABLE is nil, use the table under point.  Return nil if the table has
> +not been inserted into a buffer."
> +  (slot-value (or table (vtable-current-table))
> +              '-buffer))
> +
> +(defun vtable-set-buffer (buffer &optional table)
> +  "Associate BUFFER with TABLE.
> +If TABLE is nil, use the table under point."
> +  (setf (slot-value (or table (vtable-current-table))
> +                    '-buffer)
> +        buffer))
> +
>  (defun vtable-current-table ()
>    "Return the table under point."
>    (get-text-property (point) 'vtable))
> @@ -301,32 +316,33 @@ vtable-update-object
>        (unless (cdr objects)
>          (error "Can't find the old object"))
>        (setcar (cdr objects) object))
> -    ;; Then update the rendered vtable in the current buffer.
> -    (if-let* ((cache (vtable--current-cache))
> -             (line-number (seq-position (vtable--cache-lines cache)
> -                                        old-object
> -                                        (lambda (a b)
> -                                          (equal (car a) b))))
> -             (line (elt (vtable--cache-lines cache) line-number)))
> -        (progn
> -          (setcar line object)
> -          (setcdr line (vtable--compute-cached-line table object))
> -          ;; ... and redisplay the line in question.
> -          (save-excursion
> -            (vtable-goto-object old-object)
> -            (let ((keymap (get-text-property (point) 'keymap))
> -                  (start (point)))
> -              (delete-line)
> -              (vtable--insert-line table line line-number
> -                                   (vtable--cache-widths cache)
> -                                   (vtable--spacer table))
> -              (add-text-properties start (point) (list 'keymap keymap
> -                                                       'vtable table
> -                                                       'vtable-cache cac=
he))))
> -          ;; We may have inserted a non-numerical value into a previously
> -          ;; all-numerical table, so recompute.
> -          (vtable--recompute-numerical table (cdr line)))
> -      (error "Can't find cached object in vtable"))))
> +    ;; Then update the rendered vtable in its buffer.
> +    (with-current-buffer (vtable-buffer table)
> +      (if-let* ((cache (vtable--current-cache))

Since we're restricting a vtable to only be inserted in a single buffer
now, we can make vtable--current-cache take the table as an explicit
argument, and just pull the cache out of there rather than the current
buffer.  Actually, we can stop setting the vtable-cache text property
entirely: it should only be pulled from the table.

> +                (line-number (seq-position (vtable--cache-lines cache)
> +                                           old-object
> +                                           (lambda (a b)
> +                                             (equal (car a) b))))
> +                (line (elt (vtable--cache-lines cache) line-number)))
> +          (progn

With the above-mentioned change to vtable--current-cache, you could have
the change just turn this progn into a with-current-buffer.

> +            (setcar line object)
> +            (setcdr line (vtable--compute-cached-line table object))
> +            ;; ... and redisplay the line in question.
> +            (save-excursion
> +              (vtable-goto-object old-object)
> +              (let ((keymap (get-text-property (point) 'keymap))
> +                    (start (point)))
> +                (delete-line)
> +                (vtable--insert-line table line line-number
> +                                     (vtable--cache-widths cache)
> +                                     (vtable--spacer table))
> +                (add-text-properties start (point) (list 'keymap keymap
> +                                                         'vtable table
> +                                                         'vtable-cache c=
ache))))
> +            ;; We may have inserted a non-numerical value into a previou=
sly
> +            ;; all-numerical table, so recompute.
> +            (vtable--recompute-numerical table (cdr line)))
> +        (error "Can't find cached object in vtable")))))
>=20=20
>  (defun vtable-remove-object (table object)
>    "Remove OBJECT from TABLE.
> @@ -334,14 +350,15 @@ vtable-remove-object
>    ;; First remove from the objects.
>    (setf (vtable-objects table) (delq object (vtable-objects table)))
>    ;; Then adjust the cache and display.
> -  (save-excursion
> -    (vtable-goto-table table)
> -    (let ((cache (vtable--current-cache))
> -          (inhibit-read-only t))
> -      (setcar cache (delq (assq object (vtable--cache-lines cache))
> -                          (vtable--cache-lines cache)))
> -      (when (vtable-goto-object object)
> -        (delete-line)))))
> +  (with-current-buffer (vtable-buffer table)
> +    (save-excursion
> +      (vtable-goto-table table)
> +      (let ((cache (vtable--current-cache))

Maybe we won't need this vtable-goto-table if we make
vtable--current-cache take the table?

> +            (inhibit-read-only t))
> +        (setcar cache (delq (assq object (vtable--cache-lines cache))
> +                            (vtable--cache-lines cache)))
> +        (when (vtable-goto-object object)
> +          (delete-line))))))
>=20=20
>  ;; FIXME: The fact that the `location' argument of
>  ;; `vtable-insert-object' can be an integer and is then interpreted as
> @@ -369,8 +386,9 @@ vtable-insert-object
>        (progn
>          (setf (vtable-objects table) (list object))
>          (vtable--recompute-numerical table (vtable--compute-cached-line =
table object))
> -        (vtable-goto-table table)
> -        (vtable-revert-command))
> +        (with-current-buffer (vtable-buffer table)
> +          (vtable-goto-table table)
> +          (vtable-revert-command)))
>      ;; First insert into the objects.
>      (let ((pos (if location
>                     (if (integerp location)
> @@ -398,56 +416,57 @@ vtable-insert-object
>            ;; Otherwise, append the object.
>            (nconc (vtable-objects table) (list object)))))
>      ;; Then adjust the cache and display.
> -    (save-excursion
> -      (vtable-goto-table table)
> -      (let* ((cache (vtable--current-cache))
> -             (inhibit-read-only t)
> -             (keymap (get-text-property (point) 'keymap))
> -             (ellipsis (if (vtable-ellipsis table)
> -                           (propertize (truncate-string-ellipsis)
> -                                       'face (vtable-face table))
> -                         ""))
> -             (ellipsis-width (string-pixel-width ellipsis))
> -             (lines (vtable--cache-lines cache))
> -             (elem (if location  ; This binding mirrors the binding of `=
pos' above.
> -                       (if (integerp location)
> -                           (nth location lines)
> -                         (or (assq location lines)
> -                             (and before (car lines))))
> -                     (if before (car lines))))
> -             (pos (memq elem lines))
> -             (line (cons object (vtable--compute-cached-line table objec=
t))))
> -        (if (or before
> -                (and pos (integerp location)))
> -            ;; Add the new object before:.
> -            (let ((old-line (car pos)))
> -              (setcar pos line)
> -              (setcdr pos (cons old-line (cdr pos)))
> -              (unless (vtable-goto-object (car elem))
> -                (vtable-beginning-of-table)))
> -          ;; Otherwise, add the object after.
> -          (if pos
> -              ;; Splice the object into the list.
> -              (progn
> -                (setcdr pos (cons line (cdr pos)))
> -                (if (vtable-goto-object location)
> -                    (forward-line 1)  ; Insert *after*.
> -                  (vtable-end-of-table)))
> -            ;; Otherwise, append the object.
> -            (setcar cache (nconc lines (list line)))
> -            (vtable-end-of-table)))
> -        (let ((start (point)))
> -          ;; FIXME: We have to adjust colors in lines below this if we
> -          ;; have :row-colors.
> -          (vtable--insert-line table line 0
> -                               (vtable--cache-widths cache) (vtable--spa=
cer table)
> -                               ellipsis ellipsis-width)
> -          (add-text-properties start (point) (list 'keymap keymap
> -                                                   'vtable table
> -                                                   'vtable-cache cache)))
> -        ;; We may have inserted a non-numerical value into a previously
> -        ;; all-numerical table, so recompute.
> -        (vtable--recompute-numerical table (cdr line))))))
> +    (with-current-buffer (vtable-buffer table)
> +      (save-excursion
> +        (vtable-goto-table table)
> +        (let* ((cache (vtable--current-cache))

> +               (inhibit-read-only t)
> +               (keymap (get-text-property (point) 'keymap))
> +               (ellipsis (if (vtable-ellipsis table)
> +                             (propertize (truncate-string-ellipsis)
> +                                         'face (vtable-face table))
> +                           ""))
> +               (ellipsis-width (string-pixel-width ellipsis (current-buf=
fer)))
> +               (lines (vtable--cache-lines cache))
> +               (elem (if location  ; This binding mirrors the binding of=
 `pos' above.
> +                         (if (integerp location)
> +                             (nth location lines)
> +                           (or (assq location lines)
> +                               (and before (car lines))))
> +                       (if before (car lines))))
> +               (pos (memq elem lines))
> +               (line (cons object (vtable--compute-cached-line table obj=
ect))))

Hmm... I think this is the only thing in these let-bindings which
depends on the current buffer (besides vtable--current-cache which
should take the buffer as an argument).

If we made vtable--compute-cached-line take the buffer and explicitly
passed it to string-pixel-width in there, I think we'd be able to bind
with-current-buffer around much less code.

> +          (if (or before
> +                  (and pos (integerp location)))
> +              ;; Add the new object before:.
> +              (let ((old-line (car pos)))
> +                (setcar pos line)
> +                (setcdr pos (cons old-line (cdr pos)))
> +                (unless (vtable-goto-object (car elem))
> +                  (vtable-beginning-of-table)))
> +            ;; Otherwise, add the object after.
> +            (if pos
> +                ;; Splice the object into the list.
> +                (progn
> +                  (setcdr pos (cons line (cdr pos)))
> +                  (if (vtable-goto-object location)
> +                      (forward-line 1)  ; Insert *after*.
> +                    (vtable-end-of-table)))
> +              ;; Otherwise, append the object.
> +              (setcar cache (nconc lines (list line)))
> +              (vtable-end-of-table)))
> +          (let ((start (point)))
> +            ;; FIXME: We have to adjust colors in lines below this if we
> +            ;; have :row-colors.
> +            (vtable--insert-line table line 0
> +                                 (vtable--cache-widths cache) (vtable--s=
pacer table)
> +                                 ellipsis ellipsis-width)
> +            (add-text-properties start (point) (list 'keymap keymap
> +                                                     'vtable table
> +                                                     'vtable-cache cache=
)))
> +          ;; We may have inserted a non-numerical value into a previously
> +          ;; all-numerical table, so recompute.
> +          (vtable--recompute-numerical table (cdr line)))))))




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 10 Dec 2025 22:18:51 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 10 17:18:50 2025
Received: from localhost ([127.0.0.1]:37406 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vTSWI-0005iy-Pm
	for submit <at> debbugs.gnu.org; Wed, 10 Dec 2025 17:18:50 -0500
Received: from mail-ua1-x932.google.com ([2607:f8b0:4864:20::932]:52641)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vTSWG-0005id-R9
 for 79982 <at> debbugs.gnu.org; Wed, 10 Dec 2025 17:18:49 -0500
Received: by mail-ua1-x932.google.com with SMTP id
 a1e0cc1a2514c-93f56a97064so121508241.1
 for <79982 <at> debbugs.gnu.org>; Wed, 10 Dec 2025 14:18:48 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765405123; x=1766009923; darn=debbugs.gnu.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=oCq0ZGkhAsD3mOIuDtcIfkDRzbBo7VqFr5uWBKlsUZs=;
 b=XsYul7PKNbduhAOozo+V8GT1kVUG/4xvgIDnRXvmwAZ1NCc5Oi7qLYpVAKUnBWrePi
 g3Wlfx2k9LC9I1pFa1vTHK4mJ09m2LyGmu0VHEzMRdjCmARAaBKad9AbMG+hATn273rb
 pNNdjobWdapOtrhA7j208NveW80VaHqZ/OlxpNTbWSz3P/8OpCF9jIIOhuixA92bnSY8
 T5RAunzeWss9o/HhJYx9/2kn2Xgq8dIbuCRvxja0CrQwLsCbKp9JHnKRJpUZ4QGe73/z
 7QZwaQJAz3sk/84Db1g0bqJaF49b86iN1jjXSKE7eJSku5O0doXvTxbpov/anaOc/mms
 sFgg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765405123; x=1766009923;
 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=oCq0ZGkhAsD3mOIuDtcIfkDRzbBo7VqFr5uWBKlsUZs=;
 b=mOEZzy6u8eni7XtWOyVEUAYV3tXJu5/s2drysZsWhy8RF0e9LFBPmMrkVKQaxLnshC
 iVE+0xQY9dZNYezU8loM7SkcU0cA4UuLA20zNDW7b0m9EH2hmgRbfnobtF2ra48cc6zB
 6BJbYagwyqR6Nb5FBGOJRWbvkepOEfvXNlg/ZgD+SnvaJX45AYh/ubIe1Pyg5y2bOrIv
 kUC7+Fx1C1dXsbypPM1Ab0HVhycFqRfhbsHb7uAqwK7SI0+XLI2/Ioce9dQmRO0PLa8Z
 L8xiLOTmKOOHFTc/GI1AMq9UIkxWukR68bziiT/06ARdTRmXXQAjavvNwWHsGEuKC2+/
 aaSA==
X-Forwarded-Encrypted: i=1;
 AJvYcCVAV19HK+jBZ0pGmjqtVC4AvcLCaHzR0cLu0cDIqzt+K9FllZOl9pBmWizp0ZfhmT00mo8dnw==@debbugs.gnu.org
X-Gm-Message-State: AOJu0Ywkiv4yI1rW0JLjhQ+CsnxXgn7adyMru0dURCMj5y8TjWnCKiut
 igTdk9aJTvylJp8aF5BVKPxis6Pyg+k8LA3aJV3yqaTqcEcpOPPTq/on0CKO9T3+niupks5u6r0
 b9fUByW2sS74UlyGvw/g2IL2L8Q6sRFQ=
X-Gm-Gg: AY/fxX6N2RRmW8XnnJFHeKE3RyLDUcAMARmZEpX6rk8MC29zk4EX+zwLiXo+dldjbsD
 ey50VaulIsJ+TIZSWC5akkF+2+NF6oNq6h+wAOLzgGnAK5Ms3Yks8DhSHUtrNznJ0tQ15/HsV8a
 r61DmYSRPGrIn7bYsiEAV/mkB8SFpM8FILaF5F3DRFuaXMncKhA8TlFFxOHGb8+i17K8KhI8iqW
 6QzsVic+5ycG99NTOSvr5ZsgnZw33DhQ8/lG93A6e37lU3D9q2hqIeNll6I4RvMjl9pOQI=
X-Google-Smtp-Source: AGHT+IECJwam9lz0iRitbqqpCWpjknR3xREooML7ttCtN1yfPC/5LZ8OW40qYQfnVGAzUFtT0EgXUKEb4kH3jviHn2A=
X-Received: by 2002:a05:6102:419f:b0:5df:b5d4:e45d with SMTP id
 ada2fe7eead31-5e571dd1a32mr1435892137.33.1765405122735; Wed, 10 Dec 2025
 14:18:42 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 <ierikeerwu7.fsf_-_@HIDDEN>
In-Reply-To: <ierikeerwu7.fsf_-_@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Wed, 10 Dec 2025 17:18:31 -0500
X-Gm-Features: AQt7F2o0OMWOWDjSd0WAOWggBGAOyq9BCDOgE9n7QUEpK5fRrq8BmuIYPPKJ35Q
Message-ID: <CAN+1HbrvHqgeaqXbHB21qLyQ+f0FhO9kfe_uL2fFn3kkTomHeA@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/mixed; boundary="00000000000039c8e10645a0693e"
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>

--00000000000039c8e10645a0693e
Content-Type: multipart/alternative; boundary="00000000000039c8df0645a0693c"

--00000000000039c8df0645a0693c
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Wed, Dec 10, 2025 at 1:54=E2=80=AFPM Spencer Baugh <sbaugh@HIDDEN=
m> wrote:

> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
>
> > On Wed, Dec 10, 2025 at 10:12=E2=80=AFAM Spencer Baugh <sbaugh@janestre=
et.com>
> wrote:
> >  Please add a test which passes with this patch and doesn't pass withou=
t
> >  this patch.
> >
> > Try the new tests in this updated patch.
>
> Thanks, these tests look good, this will help a lot.
>
> > From 6e33b8cbf2063e1e7689f231bb0c6c6450520bd3 Mon Sep 17 00:00:00 2001
> > From: =3D?UTF-8?q?St=3DC3=3DA9phane=3D20Marks?=3D <shipmints@HIDDEN>
> > Date: Wed, 10 Dec 2025 09:20:02 -0500
> > Subject: [PATCH] Add vtable buffer slot
> >
> > This solves for background vtable mutations, i.e., updates
> > initiated from buffers other than the vtable buffer, and for
> > buffer-adjusted string-pixel-width computations.
> >
> > * lisp/emacs-lisp/vtable.el (vtable): New '-buffer' slot.
> > (vtable-buffer):
> > (vtable-set-buffer): New function.
> > (vtable-update-object):
> > (vtable-remove-object):
> > (vtable-insert-object): Wrap operation with the vtable buffer.
> > (vtable--insert): Split from old 'vtable-insert'.
> > (vtable-insert): Insert table and record the buffer.
> > (vtable--insert-line):
> > (vtable--insert-header-line): Use 'vtable-buffer' for pixel-width
> computation.
> > (vtable--limit-string):
> > (vtable--char-width): Pass buffer to 'string-pixel-width'.
> > (vtable-revert): New optional table argument.
> > (vtable--alter-column-width):
> > (vtable-revert-command):
> > (vtable-sort-by-current-column): Call 'vtable-revert' with the table.
> >
> > * test/lisp/emacs-lisp/vtable-tests.el
> > (vtable-tests--make-no-header-2-object-table): New helper
> > function.
> > (test-vstable-compute-columns): Correct typo in test name.  Use
> > new helper function.
> > (test-vtable-unique-buffer)
> > (test-vtable-non-current-buffer-insert-object)
> > (test-vtable-non-current-buffer-remove-object)
> > (test-vtable-non-current-buffer-update-object)
> > (test-vtable--limit-string-with-face-remapped-buffer): New test.
> > ---
> >  lisp/emacs-lisp/vtable.el            | 389 +++++++++++++++------------
> >  test/lisp/emacs-lisp/vtable-tests.el |  78 +++++-
> >  2 files changed, 291 insertions(+), 176 deletions(-)
> >
> > diff --git a/lisp/emacs-lisp/vtable.el b/lisp/emacs-lisp/vtable.el
> > index bcdd280fb92..fe4bae01077 100644
> > --- a/lisp/emacs-lisp/vtable.el
> > +++ b/lisp/emacs-lisp/vtable.el
> > @@ -68,6 +68,7 @@ vtable
> >     (column-colors :initarg :column-colors :accessor
> vtable-column-colors)
> >     (row-colors :initarg :row-colors :accessor vtable-row-colors)
> >     (-cached-colors :initform nil)
> > +   (-buffer :initform nil)
> >     (-cache :initform (make-hash-table :test #'equal))
> >     (-cached-keymap :initform nil)
> >     (-has-column-spec :initform nil))
> > @@ -221,6 +222,20 @@ vtable--face-color
> >
> >  ;;; Interface utility functions.
> >
> > +(defun vtable-buffer (&optional table)
> > +  "Return the buffer associated with TABLE.
> > +If TABLE is nil, use the table under point.  Return nil if the table h=
as
> > +not been inserted into a buffer."
> > +  (slot-value (or table (vtable-current-table))
> > +              '-buffer))
> > +
> > +(defun vtable-set-buffer (buffer &optional table)
> > +  "Associate BUFFER with TABLE.
> > +If TABLE is nil, use the table under point."
> > +  (setf (slot-value (or table (vtable-current-table))
> > +                    '-buffer)
> > +        buffer))
> > +
> >  (defun vtable-current-table ()
> >    "Return the table under point."
> >    (get-text-property (point) 'vtable))
> > @@ -285,63 +300,65 @@ vtable-update-object
> >  compared with `equal'), signal an error.
> >
> >  TABLE must be at point in the current buffer."
> > -  (unless old-object
> > -    (setq old-object object))
> > -  (let* ((objects (vtable-objects table))
> > -         (inhibit-read-only t))
> > -    ;; First replace the object in the object storage.
> > -    (if (eq old-object (car objects))
> > -        ;; It's at the head, so replace it there.
> > -        (setf (vtable-objects table)
> > -              (cons object (cdr objects)))
> > -      ;; Otherwise splice into the list.
> > -      (while (and (cdr objects)
> > -                  (not (eq (cadr objects) old-object)))
> > -        (setq objects (cdr objects)))
> > -      (unless (cdr objects)
> > -        (error "Can't find the old object"))
> > -      (setcar (cdr objects) object))
> > -    ;; Then update the rendered vtable in the current buffer.
> > -    (if-let* ((cache (vtable--current-cache))
> > -             (line-number (seq-position (vtable--cache-lines cache)
> > -                                        old-object
> > -                                        (lambda (a b)
> > -                                          (equal (car a) b))))
> > -             (line (elt (vtable--cache-lines cache) line-number)))
> > -        (progn
> > -          (setcar line object)
> > -          (setcdr line (vtable--compute-cached-line table object))
> > -          ;; ... and redisplay the line in question.
> > -          (save-excursion
> > -            (vtable-goto-object old-object)
> > -            (let ((keymap (get-text-property (point) 'keymap))
> > -                  (start (point)))
> > -              (delete-line)
> > -              (vtable--insert-line table line line-number
> > -                                   (vtable--cache-widths cache)
> > -                                   (vtable--spacer table))
> > -              (add-text-properties start (point) (list 'keymap keymap
> > -                                                       'vtable table
> > -                                                       'vtable-cache
> cache))))
> > -          ;; We may have inserted a non-numerical value into a
> previously
> > -          ;; all-numerical table, so recompute.
> > -          (vtable--recompute-numerical table (cdr line)))
> > -      (error "Can't find cached object in vtable"))))
> > +  (with-current-buffer (vtable-buffer table)
> > +    (unless old-object
> > +      (setq old-object object))
> > +    (let* ((objects (vtable-objects table))
> > +           (inhibit-read-only t))
> > +      ;; First replace the object in the object storage.
> > +      (if (eq old-object (car objects))
> > +          ;; It's at the head, so replace it there.
> > +          (setf (vtable-objects table)
> > +                (cons object (cdr objects)))
> > +        ;; Otherwise splice into the list.
> > +        (while (and (cdr objects)
> > +                    (not (eq (cadr objects) old-object)))
> > +          (setq objects (cdr objects)))
> > +        (unless (cdr objects)
> > +          (error "Can't find the old object"))
> > +        (setcar (cdr objects) object))
> > +      ;; Then update the rendered vtable in the current buffer.
> > +      (if-let* ((cache (vtable--current-cache))
> > +                (line-number (seq-position (vtable--cache-lines cache)
> > +                                           old-object
> > +                                           (lambda (a b)
> > +                                             (equal (car a) b))))
> > +                (line (elt (vtable--cache-lines cache) line-number)))
> > +          (progn
> > +            (setcar line object)
> > +            (setcdr line (vtable--compute-cached-line table object))
> > +            ;; ... and redisplay the line in question.
> > +            (save-excursion
> > +              (vtable-goto-object old-object)
> > +              (let ((keymap (get-text-property (point) 'keymap))
> > +                    (start (point)))
> > +                (delete-line)
> > +                (vtable--insert-line table line line-number
> > +                                     (vtable--cache-widths cache)
> > +                                     (vtable--spacer table))
> > +                (add-text-properties start (point) (list 'keymap keyma=
p
> > +                                                         'vtable table
> > +                                                         'vtable-cache
> cache))))
> > +            ;; We may have inserted a non-numerical value into a
> previously
> > +            ;; all-numerical table, so recompute.
> > +            (vtable--recompute-numerical table (cdr line)))
> > +        (error "Can't find cached object in vtable")))))
> >
> >  (defun vtable-remove-object (table object)
> >    "Remove OBJECT from TABLE.
> >  This will also remove the displayed line."
> > -  ;; First remove from the objects.
> > -  (setf (vtable-objects table) (delq object (vtable-objects table)))
> > -  ;; Then adjust the cache and display.
> > -  (save-excursion
> > -    (vtable-goto-table table)
> > -    (let ((cache (vtable--current-cache))
> > -          (inhibit-read-only t))
> > -      (setcar cache (delq (assq object (vtable--cache-lines cache))
> > -                          (vtable--cache-lines cache)))
> > -      (when (vtable-goto-object object)
> > -        (delete-line)))))
> > +  (with-current-buffer (vtable-buffer table)
> > +    ;; First remove from the objects.
> > +    (setf (vtable-objects table) (delq object (vtable-objects table)))
> > +    ;; Then adjust the cache and display.
> > +    (save-excursion
> > +      (vtable-goto-table table)
> > +      (let ((cache (vtable--current-cache))
> > +            (inhibit-read-only t))
> > +        (setcar cache (delq (assq object (vtable--cache-lines cache))
> > +                            (vtable--cache-lines cache)))
> > +        (when (vtable-goto-object object)
> > +          (delete-line))))))
> >
> >  ;; FIXME: The fact that the `location' argument of
> >  ;; `vtable-insert-object' can be an integer and is then interpreted as
> > @@ -363,91 +380,92 @@ vtable-insert-object
> >  case.
> >
> >  This also updates the displayed table."
> > -  ;; If the vtable is empty, just add the object and regenerate the
> > -  ;; table.
> > -  (if (null (vtable-objects table))
> > -      (progn
> > -        (setf (vtable-objects table) (list object))
> > -        (vtable--recompute-numerical table (vtable--compute-cached-lin=
e
> table object))
> > -        (vtable-goto-table table)
> > -        (vtable-revert-command))
> > -    ;; First insert into the objects.
> > -    (let ((pos (if location
> > -                   (if (integerp location)
> > -                       (prog1
> > -                           (nthcdr location (vtable-objects table))
> > -                         ;; Do not prepend if index is too large:
> > -                         (setq before nil))
> > -                     (or (memq location (vtable-objects table))
> > -                         ;; Prepend if `location' is not found and
> > -                         ;; `before' is non-nil:
> > -                         (and before (vtable-objects table))))
> > -                 ;; If `location' is nil and `before' is non-nil, we
> > -                 ;; prepend the new object.
> > -                 (if before (vtable-objects table)))))
> > -      (if (or before  ; If `before' is non-nil, `pos' should be, as
> well.
> > -              (and pos (integerp location)))
> > -          ;; Add the new object before.
> > -          (let ((old-object (car pos)))
> > -            (setcar pos object)
> > -            (setcdr pos (cons old-object (cdr pos))))
> > -        ;; Otherwise, add the object after.
> > -        (if pos
> > -            ;; Splice the object into the list.
> > -            (setcdr pos (cons object (cdr pos)))
> > -          ;; Otherwise, append the object.
> > -          (nconc (vtable-objects table) (list object)))))
> > -    ;; Then adjust the cache and display.
> > -    (save-excursion
> > -      (vtable-goto-table table)
> > -      (let* ((cache (vtable--current-cache))
> > -             (inhibit-read-only t)
> > -             (keymap (get-text-property (point) 'keymap))
> > -             (ellipsis (if (vtable-ellipsis table)
> > -                           (propertize (truncate-string-ellipsis)
> > -                                       'face (vtable-face table))
> > -                         ""))
> > -             (ellipsis-width (string-pixel-width ellipsis))
> > -             (lines (vtable--cache-lines cache))
> > -             (elem (if location  ; This binding mirrors the binding of
> `pos' above.
> > -                       (if (integerp location)
> > -                           (nth location lines)
> > -                         (or (assq location lines)
> > -                             (and before (car lines))))
> > -                     (if before (car lines))))
> > -             (pos (memq elem lines))
> > -             (line (cons object (vtable--compute-cached-line table
> object))))
> > -        (if (or before
> > +  (with-current-buffer (vtable-buffer table)
> > +    ;; If the vtable is empty, just add the object and regenerate the
> > +    ;; table.
> > +    (if (null (vtable-objects table))
> > +        (progn
> > +          (setf (vtable-objects table) (list object))
> > +          (vtable--recompute-numerical table
> (vtable--compute-cached-line table object))
> > +          (vtable-goto-table table)
> > +          (vtable-revert-command))
> > +      ;; First insert into the objects.
> > +      (let ((pos (if location
> > +                     (if (integerp location)
> > +                         (prog1
> > +                             (nthcdr location (vtable-objects table))
> > +                           ;; Do not prepend if index is too large:
> > +                           (setq before nil))
> > +                       (or (memq location (vtable-objects table))
> > +                           ;; Prepend if `location' is not found and
> > +                           ;; `before' is non-nil:
> > +                           (and before (vtable-objects table))))
> > +                   ;; If `location' is nil and `before' is non-nil, we
> > +                   ;; prepend the new object.
> > +                   (if before (vtable-objects table)))))
> > +        (if (or before  ; If `before' is non-nil, `pos' should be, as
> well.
> >                  (and pos (integerp location)))
> > -            ;; Add the new object before:.
> > -            (let ((old-line (car pos)))
> > -              (setcar pos line)
> > -              (setcdr pos (cons old-line (cdr pos)))
> > -              (unless (vtable-goto-object (car elem))
> > -                (vtable-beginning-of-table)))
> > +            ;; Add the new object before.
> > +            (let ((old-object (car pos)))
> > +              (setcar pos object)
> > +              (setcdr pos (cons old-object (cdr pos))))
> >            ;; Otherwise, add the object after.
> >            (if pos
> >                ;; Splice the object into the list.
> > -              (progn
> > -                (setcdr pos (cons line (cdr pos)))
> > -                (if (vtable-goto-object location)
> > -                    (forward-line 1)  ; Insert *after*.
> > -                  (vtable-end-of-table)))
> > +              (setcdr pos (cons object (cdr pos)))
> >              ;; Otherwise, append the object.
> > -            (setcar cache (nconc lines (list line)))
> > -            (vtable-end-of-table)))
> > -        (let ((start (point)))
> > -          ;; FIXME: We have to adjust colors in lines below this if we
> > -          ;; have :row-colors.
> > -          (vtable--insert-line table line 0
> > -                               (vtable--cache-widths cache)
> (vtable--spacer table)
> > -                               ellipsis ellipsis-width)
> > -          (add-text-properties start (point) (list 'keymap keymap
> > -                                                   'vtable table
> > -                                                   'vtable-cache
> cache)))
> > -        ;; We may have inserted a non-numerical value into a previousl=
y
> > -        ;; all-numerical table, so recompute.
> > -        (vtable--recompute-numerical table (cdr line))))))
> > +            (nconc (vtable-objects table) (list object)))))
> > +      ;; Then adjust the cache and display.
> > +      (save-excursion
> > +        (vtable-goto-table table)
> > +        (let* ((cache (vtable--current-cache))
> > +               (inhibit-read-only t)
> > +               (keymap (get-text-property (point) 'keymap))
> > +               (ellipsis (if (vtable-ellipsis table)
> > +                             (propertize (truncate-string-ellipsis)
> > +                                         'face (vtable-face table))
> > +                           ""))
> > +               (ellipsis-width (string-pixel-width ellipsis
> (current-buffer)))
> > +               (lines (vtable--cache-lines cache))
> > +               (elem (if location  ; This binding mirrors the binding
> of `pos' above.
> > +                         (if (integerp location)
> > +                             (nth location lines)
> > +                           (or (assq location lines)
> > +                               (and before (car lines))))
> > +                       (if before (car lines))))
> > +               (pos (memq elem lines))
> > +               (line (cons object (vtable--compute-cached-line table
> object))))
> > +          (if (or before
> > +                  (and pos (integerp location)))
> > +              ;; Add the new object before:.
> > +              (let ((old-line (car pos)))
> > +                (setcar pos line)
> > +                (setcdr pos (cons old-line (cdr pos)))
> > +                (unless (vtable-goto-object (car elem))
> > +                  (vtable-beginning-of-table)))
> > +            ;; Otherwise, add the object after.
> > +            (if pos
> > +                ;; Splice the object into the list.
> > +                (progn
> > +                  (setcdr pos (cons line (cdr pos)))
> > +                  (if (vtable-goto-object location)
> > +                      (forward-line 1)  ; Insert *after*.
> > +                    (vtable-end-of-table)))
> > +              ;; Otherwise, append the object.
> > +              (setcar cache (nconc lines (list line)))
> > +              (vtable-end-of-table)))
> > +          (let ((start (point)))
> > +            ;; FIXME: We have to adjust colors in lines below this if =
we
> > +            ;; have :row-colors.
> > +            (vtable--insert-line table line 0
> > +                                 (vtable--cache-widths cache)
> (vtable--spacer table)
> > +                                 ellipsis ellipsis-width)
> > +            (add-text-properties start (point) (list 'keymap keymap
> > +                                                     'vtable table
> > +                                                     'vtable-cache
> cache)))
> > +          ;; We may have inserted a non-numerical value into a
> previously
> > +          ;; all-numerical table, so recompute.
> > +          (vtable--recompute-numerical table (cdr line)))))))
>
> Is it possible to avoid these massive diffs in vtable-update-object,
> vtable-remove-object, and vtable-insert-object?  These will make the
> history worse, and also makes it harder to review.  Maybe we only need
> to wrap with-current-buffer around a smaller part of these functions?
>
> FYI, in general, you should change try to make changes in a way which
> minimizes the size of the diff.
>
> >  (defun vtable-column (table index)
> >    "Return the name of the INDEXth column in TABLE."
> > @@ -520,14 +538,14 @@ vtable--cache-widths
> >  (defun vtable--cache-lines (cache)
> >    (car cache))
> >
> > -(defun vtable-insert (table)
> > +(defun vtable--insert (table)
> >    (let* ((spacer (vtable--spacer table))
> >           (start (point))
> >           (ellipsis (if (vtable-ellipsis table)
> >                         (propertize (truncate-string-ellipsis)
> >                                     'face (vtable-face table))
> >                       ""))
> > -         (ellipsis-width (string-pixel-width ellipsis))
> > +         (ellipsis-width (string-pixel-width ellipsis (current-buffer)=
))
> >           ;; We maintain a cache per screen/window width, so that we
> render
> >           ;; correctly if Emacs is open on two different screens (or th=
e
> >           ;; user resizes the frame).
> > @@ -565,9 +583,24 @@ vtable-insert
> >                                 'vtable-cache cache))
> >      (goto-char start)))
> >
> > +(defun vtable-insert (table)
> > +  "Insert TABLE into the current buffer.
> > +The current buffer will be recorded as TABLE's buffer.  If this is don=
e
> > +more than once, or if the table is attempted to be inserted more than
> > +once into the same buffer, signal an error."
> > +  (if-let* ((table-buffer (vtable-buffer table)))
> > +      (if (eq table-buffer (current-buffer))
> > +          (error "A vtable cannot be inserted more than once into a
> buffer")
> > +        (error "A vtable cannot be inserted into more than one
> buffer")))
> > +  (vtable-set-buffer (current-buffer) table)
> > +  (let ((inhibit-read-only t)
> > +        (inhibit-modification-hooks t))
> > +    (vtable--insert table)))
> > +
> >  (defun vtable--insert-line (table line line-number widths spacer
> >                                    &optional ellipsis ellipsis-width)
> >    (let ((start (point))
> > +        (buffer (vtable-buffer table))
> >          (columns (vtable-columns table))
> >          (column-colors
> >           (and (vtable-column-colors table)
> > @@ -607,16 +640,18 @@ vtable--insert-line
> >                        (concat
> >                         (vtable--limit-string
> >                          pre-computed (- (elt widths index)
> > -                                        (or ellipsis-width 0)))
> > +                                        (or ellipsis-width 0))
> > +                        buffer)
> >                         ellipsis)
> >                      pre-computed))
> >                   ;; Recompute widths.
> >                   (t
> > -                  (if (> (string-pixel-width value) (elt widths index)=
)
> > +                  (if (> (string-pixel-width value buffer) (elt widths
> index))
> >                        (concat
> >                         (vtable--limit-string
> >                          value (- (elt widths index)
> > -                                 (or ellipsis-width 0)))
> > +                                 (or ellipsis-width 0))
> > +                        buffer)
> >                         ellipsis)
> >                      value))))
> >                 (start (point))
> > @@ -630,14 +665,15 @@ vtable--insert-line
> >                            (list 'space
> >                                  :width (list
> >                                          (+ (- (elt widths index)
> > -                                              (string-pixel-width
> displayed))
> > +                                              (string-pixel-width
> > +                                               displayed buffer))
> >                                             (if last 0 spacer)))))))
> >               ;; Align to the right.
> >               (insert (propertize " " 'display
> >                                   (list 'space
> >                                         :width (list (- (elt widths
> index)
> >
>  (string-pixel-width
> > -                                                        displayed)))))
> > +                                                        displayed
> buffer)))))
> >                       displayed)
> >               (unless last
> >                 (insert (propertize " " 'display
> > @@ -718,6 +754,7 @@ vtable--indicator
> >  (defun vtable--insert-header-line (table widths spacer)
> >    ;; Insert the header directly into the buffer.
> >    (let ((start (point))
> > +        (buffer (vtable-buffer table))
> >          (divider (vtable-divider table))
> >          (cmap (define-keymap
> >                  "<header-line> <drag-mouse-1>"
> #'vtable--drag-resize-column
> > @@ -737,14 +774,15 @@ vtable--insert-header-line
> >                       'keymap cmap))
> >                (start (point))
> >                (indicator (vtable--indicator table index))
> > -              (indicator-width (string-pixel-width indicator))
> > +              (indicator-width (string-pixel-width indicator buffer))
> >                (last (=3D index (1- (length (vtable-columns table)))))
> >                displayed)
> >           (setq displayed
> > -               (if (> (string-pixel-width name)
> > +               (if (> (string-pixel-width name buffer)
> >                        (- (elt widths index) indicator-width))
> >                     (vtable--limit-string
> > -                    name (- (elt widths index) indicator-width))
> > +                    name (- (elt widths index) indicator-width)
> > +                    buffer)
> >                   name))
> >           (let* ((indicator-lead-width
> >                   ;; We want the indicator to not be quite flush right.
> > @@ -753,7 +791,7 @@ vtable--insert-header-line
> >                                          indicator-lead-width))
> >                  (fill-width
> >                   (+ (- (elt widths index)
> > -                       (string-pixel-width displayed)
> > +                       (string-pixel-width displayed buffer)
> >                         indicator-width
> >                         indicator-lead-width)
> >                      (if last 0 spacer))))
> > @@ -771,7 +809,8 @@ vtable--insert-header-line
> >               ;; This is the final column, and we have a sorting
> >               ;; indicator, and the table is too wide for the window.
> >               (let* ((pre-indicator (string-pixel-width
> > -                                    (buffer-substring (point-min)
> (point))))
> > +                                    (buffer-substring (point-min)
> (point))
> > +                                    buffer))
> >                      (pre-fill
> >                       (- (window-width nil t)
> >                          pre-indicator
> > @@ -850,14 +889,16 @@ vtable--set-header-line
> >             (buffer-substring (point-min) (1- (point-max))))))
> >    (vtable-header-mode 1))
> >
> > -(defun vtable--limit-string (string pixels)
> > +
> > +(defun vtable--limit-string (string pixels buffer)
> >    (while (and (length> string 0)
> > -              (> (string-pixel-width string) pixels))
> > +              (> (string-pixel-width string buffer) pixels))
> >      (setq string (substring string 0 (1- (length string)))))
> >    string)
> >
> >  (defun vtable--char-width (table)
> > -  (string-pixel-width (propertize "x" 'face (vtable-face table))))
> > +  (string-pixel-width (propertize "x" 'face (vtable-face table))
> > +                      (vtable-buffer table)))
> >
> >  (defun vtable--compute-width (table spec)
> >    (cond
> > @@ -967,20 +1008,24 @@ vtable--make-keymap
> >            (vtable-keymap table))
> >        map)))
> >
> > -(defun vtable-revert ()
> > -  "Regenerate the table under point."
> > -  (let ((table (vtable-current-table))
> > -        (object (vtable-current-object))
> > -        (column (vtable-current-column))
> > -        (inhibit-read-only t))
> > -    (unless table
> > -      (user-error "No table under point"))
> > -    (delete-region (vtable-beginning-of-table) (vtable-end-of-table))
> > -    (vtable-insert table)
> > -    (when object
> > -      (vtable-goto-object object))
> > -    (when column
> > -      (vtable-goto-column column))))
> > +(defun vtable-revert (&optional table)
> > +  "Regenerate the table under point.
> > +If TABLE is nil, use the table under point."
>
> This repeats itself.  It should say "Regenerate TABLE, defaulting to the
> table under point."
>
> > +  (setq table (or table (vtable-current-table)))
> > +  (unless table
> > +    (user-error "No table found"))
>
> I don't think this error message should change.
>
> > +  (with-current-buffer (vtable-buffer table)
> > +    (let ((object (vtable-current-object))
> > +          (column (vtable-current-column))
>
> So we still implicitly depend on the value of point in the buffer?  How
> does this interact with window-point?  This seems like a potential
> foot-gun.
>
> > +          (inhibit-read-only t))
> > +      (unless table
> > +        (user-error "No table under point"))
> > +      (delete-region (vtable-beginning-of-table) (vtable-end-of-table)=
)
> > +      (vtable--insert table)
> > +      (when object
> > +        (vtable-goto-object object))
> > +      (when column
> > +        (vtable-goto-column column)))))
> >
> >  ;;; Commands.
> >
> > @@ -1013,7 +1058,7 @@ vtable--alter-column-width
> >      ;; Store the width so it'll be respected on a revert.
> >      (setf (vtable-column-width (elt (vtable-columns table) column))
> >            (format "%dpx" (aref widths column)))
> > -    (vtable-revert)))
> > +    (vtable-revert table)))
> >
> >  (defun vtable-widen-current-column (&optional n)
> >    "Widen the current column by N characters.
> > @@ -1038,14 +1083,16 @@ vtable-next-column
> >       (min (1- (length (vtable--cache-widths (vtable--current-cache))))
> >            (1+ (vtable-current-column))))))
> >
> > -(defun vtable-revert-command ()
> > +(defun vtable-revert-command (&optional table)
> >    "Re-query data and regenerate the table under point."
> >    (interactive)
> > -  (let ((table (vtable-current-table)))
> > -    (when (vtable-objects-function table)
> > -      (setf (vtable-objects table) (funcall (vtable-objects-function
> table))))
> > -    (vtable--clear-cache table))
> > -  (vtable-revert))
> > +  (setq table (or table (vtable-current-table)))
> > +  (unless table
> > +    (user-error "No table found"))
> > +  (when (vtable-objects-function table)
> > +    (setf (vtable-objects table) (funcall (vtable-objects-function
> table))))
> > +  (vtable--clear-cache table)
> > +  (vtable-revert table))
> >
> >  (defun vtable-sort-by-current-column ()
> >    "Sort the table under point by the column under point."
> > @@ -1067,8 +1114,8 @@ vtable-sort-by-current-column
> >                                    (if (eq (cdr last) 'ascend)
> >                                        'descend
> >                                      'ascend)
> > -                                'ascend))))))
> > -  (vtable-revert))
> > +                                'ascend)))))
> > +    (vtable-revert table)))
> >
> >  (defun vtable-header-line-sort (e)
> >    "Sort a vtable from the header line."
> > diff --git a/test/lisp/emacs-lisp/vtable-tests.el
> b/test/lisp/emacs-lisp/vtable-tests.el
> > index 74fb8cc8139..83f826ea353 100644
> > --- a/test/lisp/emacs-lisp/vtable-tests.el
> > +++ b/test/lisp/emacs-lisp/vtable-tests.el
> > @@ -27,16 +27,19 @@
> >  (require 'ert)
> >  (require 'ert-x)
> >
> > -(ert-deftest test-vstable-compute-columns ()
> > +(defun vtable-tests--make-no-header-2-object-table ()
> > +  (make-vtable :columns '("a" "b" "c")
> > +               :objects '(("foo" 1 2)
> > +                          ("bar" 3 :zot))
> > +               :insert nil))
> > +
> > +(ert-deftest test-vtable-compute-columns ()
> >    (should
> >     (equal (mapcar
> >             (lambda (column)
> >               (vtable-column-align column))
> >             (vtable--compute-columns
> > -            (make-vtable :columns '("a" "b" "c")
> > -                         :objects '(("foo" 1 2)
> > -                                    ("bar" 3 :zot))
> > -                         :insert nil)))
> > +            (vtable-tests--make-no-header-2-object-table)))
> >            '(left right left))))
> >
> >  (ert-deftest test-vtable-insert-object ()
> > @@ -69,4 +72,69 @@ test-vtable-insert-object
> >                (mapcar #'cadr (vtable-objects table))))
> >            (number-sequence 0 11))))
> >
> > +(ert-deftest test-vtable-unique-buffer ()
> > +  (let ((table (vtable-tests--make-no-header-2-object-table)))
> > +    (with-temp-buffer
> > +      (vtable-insert table)
> > +      ;; This will run but fail on Emacs pre 31 vtable.
> > +      (should-error (vtable-insert table))
> > +      ;; This will run only on Emacs 31+ vtable.
> > +      (when (> emacs-major-version 30)
> > +        (should-error (vtable-set-buffer table (current-buffer)))))))
> > +
> > +(ert-deftest test-vtable-non-current-buffer-insert-object ()
> > +  (let ((table (vtable-tests--make-no-header-2-object-table))
> > +        (obj '("baz" 4 5)))
> > +    (with-temp-buffer
> > +      (vtable-insert table)
> > +      (should (=3D (count-lines (point-min) (point-max)) 2))
> > +      (with-temp-buffer
> > +        (vtable-insert-object table obj))
> > +      (should (=3D (count-lines (point-min) (point-max)) 3)))))
> > +
> > +(ert-deftest test-vtable-non-current-buffer-remove-object ()
> > +  (let ((table (vtable-tests--make-no-header-2-object-table))
> > +        (obj '("baz" 4 5)))
> > +    (with-temp-buffer
> > +      (vtable-insert table)
> > +      (vtable-insert-object table obj)
> > +      (should (=3D (count-lines (point-min) (point-max)) 3))
> > +      (with-temp-buffer
> > +        (vtable-remove-object table obj))
> > +      (should (=3D (count-lines (point-min) (point-max)) 2)))))
> > +
> > +(ert-deftest test-vtable-non-current-buffer-update-object ()
> > +  (let ((table (vtable-tests--make-no-header-2-object-table))
> > +        (obj '("baz" 4 5))
> > +        (obj-2 '("qux" 6 7)))
> > +    (with-temp-buffer
> > +      (vtable-insert table)
> > +      (vtable-insert-object table obj)
> > +      (should (=3D (count-lines (point-min) (point-max)) 3))
> > +      (let ((line-2 (progn
> > +                      (goto-char (point-min))
> > +                      (forward-line 2)
> > +                      (buffer-substring (point) (point-max)))))
> > +        (with-temp-buffer
> > +          (vtable-update-object table obj-2 obj))
> > +        (let ((line-2-new (progn
> > +                            (goto-char (point-min))
> > +                            (forward-line 2)
> > +                            (buffer-substring (point) (point-max)))))
> > +          (should (=3D (count-lines (point-min) (point-max)) 3))
> > +          (should (not (string=3D line-2 line-2-new))))))))
> > +
> > +(ert-deftest test-vtable--limit-string-with-face-remapped-buffer ()
> > +  (with-temp-buffer
> > +    (let ((text (propertize "XXXXX"
> > +                            'face 'variable-pitch)))
> > +      (face-remap-add-relative 'default :height 1.5)
> > +      (if (> emacs-major-version 30)
> > +          (should (eq
> > +                   2
> > +                   (length (vtable--limit-string text 50
> (current-buffer)))))
> > +        (should (eq
> > +                 2
> > +                 (length (vtable--limit-string text 50))))))))
> > +
> >  ;;; vtable-tests.el ends here
>

Thanks.  Revised patch, attached.  With regard to point vs. window-point,
the code seems no worse off than before?  There is a suite of additional
fixes coming that address keeping point stable during operations and we can
see if there are any ill effects when we get to testing those changes.

-St=C3=A9phane

--00000000000039c8df0645a0693c
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Wed, Dec 10, 2025 at 1:54=E2=80=AFPM Spencer Baugh &lt;<a href=3D"mailto=
:sbaugh@HIDDEN">sbaugh@HIDDEN</a>&gt; wrote:</span></div></=
div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=3D"g=
mail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204=
,204,204);padding-left:1ex">St=C3=A9phane Marks &lt;<a href=3D"mailto:shipm=
ints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
<br>
&gt; On Wed, Dec 10, 2025 at 10:12=E2=80=AFAM Spencer Baugh &lt;<a href=3D"=
mailto:sbaugh@HIDDEN" target=3D"_blank">sbaugh@HIDDEN</a>&g=
t; wrote:<br>
&gt;=C2=A0 Please add a test which passes with this patch and doesn&#39;t p=
ass without<br>
&gt;=C2=A0 this patch.<br>
&gt;<br>
&gt; Try the new tests in this updated patch.<br>
<br>
Thanks, these tests look good, this will help a lot.<br>
<br>
&gt; From 6e33b8cbf2063e1e7689f231bb0c6c6450520bd3 Mon Sep 17 00:00:00 2001=
<br>
&gt; From: =3D?UTF-8?q?St=3DC3=3DA9phane=3D20Marks?=3D &lt;<a href=3D"mailt=
o:shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&gt;<br>
&gt; Date: Wed, 10 Dec 2025 09:20:02 -0500<br>
&gt; Subject: [PATCH] Add vtable buffer slot<br>
&gt;<br>
&gt; This solves for background vtable mutations, i.e., updates<br>
&gt; initiated from buffers other than the vtable buffer, and for<br>
&gt; buffer-adjusted string-pixel-width computations.<br>
&gt;<br>
&gt; * lisp/emacs-lisp/vtable.el (vtable): New &#39;-buffer&#39; slot.<br>
&gt; (vtable-buffer):<br>
&gt; (vtable-set-buffer): New function.<br>
&gt; (vtable-update-object):<br>
&gt; (vtable-remove-object):<br>
&gt; (vtable-insert-object): Wrap operation with the vtable buffer.<br>
&gt; (vtable--insert): Split from old &#39;vtable-insert&#39;.<br>
&gt; (vtable-insert): Insert table and record the buffer.<br>
&gt; (vtable--insert-line):<br>
&gt; (vtable--insert-header-line): Use &#39;vtable-buffer&#39; for pixel-wi=
dth computation.<br>
&gt; (vtable--limit-string):<br>
&gt; (vtable--char-width): Pass buffer to &#39;string-pixel-width&#39;.<br>
&gt; (vtable-revert): New optional table argument.<br>
&gt; (vtable--alter-column-width):<br>
&gt; (vtable-revert-command):<br>
&gt; (vtable-sort-by-current-column): Call &#39;vtable-revert&#39; with the=
 table.<br>
&gt;<br>
&gt; * test/lisp/emacs-lisp/vtable-tests.el<br>
&gt; (vtable-tests--make-no-header-2-object-table): New helper<br>
&gt; function.<br>
&gt; (test-vstable-compute-columns): Correct typo in test name.=C2=A0 Use<b=
r>
&gt; new helper function.<br>
&gt; (test-vtable-unique-buffer)<br>
&gt; (test-vtable-non-current-buffer-insert-object)<br>
&gt; (test-vtable-non-current-buffer-remove-object)<br>
&gt; (test-vtable-non-current-buffer-update-object)<br>
&gt; (test-vtable--limit-string-with-face-remapped-buffer): New test.<br>
&gt; ---<br>
&gt;=C2=A0 lisp/emacs-lisp/vtable.el=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 | 389 +++++++++++++++------------<br>
&gt;=C2=A0 test/lisp/emacs-lisp/vtable-tests.el |=C2=A0 78 +++++-<br>
&gt;=C2=A0 2 files changed, 291 insertions(+), 176 deletions(-)<br>
&gt;<br>
&gt; diff --git a/lisp/emacs-lisp/vtable.el b/lisp/emacs-lisp/vtable.el<br>
&gt; index bcdd280fb92..fe4bae01077 100644<br>
&gt; --- a/lisp/emacs-lisp/vtable.el<br>
&gt; +++ b/lisp/emacs-lisp/vtable.el<br>
&gt; @@ -68,6 +68,7 @@ vtable<br>
&gt;=C2=A0 =C2=A0 =C2=A0(column-colors :initarg :column-colors :accessor vt=
able-column-colors)<br>
&gt;=C2=A0 =C2=A0 =C2=A0(row-colors :initarg :row-colors :accessor vtable-r=
ow-colors)<br>
&gt;=C2=A0 =C2=A0 =C2=A0(-cached-colors :initform nil)<br>
&gt; +=C2=A0 =C2=A0(-buffer :initform nil)<br>
&gt;=C2=A0 =C2=A0 =C2=A0(-cache :initform (make-hash-table :test #&#39;equa=
l))<br>
&gt;=C2=A0 =C2=A0 =C2=A0(-cached-keymap :initform nil)<br>
&gt;=C2=A0 =C2=A0 =C2=A0(-has-column-spec :initform nil))<br>
&gt; @@ -221,6 +222,20 @@ vtable--face-color<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 ;;; Interface utility functions.<br>
&gt;=C2=A0 <br>
&gt; +(defun vtable-buffer (&amp;optional table)<br>
&gt; +=C2=A0 &quot;Return the buffer associated with TABLE.<br>
&gt; +If TABLE is nil, use the table under point.=C2=A0 Return nil if the t=
able has<br>
&gt; +not been inserted into a buffer.&quot;<br>
&gt; +=C2=A0 (slot-value (or table (vtable-current-table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &#39;-buffer))<br>
&gt; +<br>
&gt; +(defun vtable-set-buffer (buffer &amp;optional table)<br>
&gt; +=C2=A0 &quot;Associate BUFFER with TABLE.<br>
&gt; +If TABLE is nil, use the table under point.&quot;<br>
&gt; +=C2=A0 (setf (slot-value (or table (vtable-current-table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 &#39;-buffer)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 buffer))<br>
&gt; +<br>
&gt;=C2=A0 (defun vtable-current-table ()<br>
&gt;=C2=A0 =C2=A0 &quot;Return the table under point.&quot;<br>
&gt;=C2=A0 =C2=A0 (get-text-property (point) &#39;vtable))<br>
&gt; @@ -285,63 +300,65 @@ vtable-update-object<br>
&gt;=C2=A0 compared with `equal&#39;), signal an error.<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 TABLE must be at point in the current buffer.&quot;<br>
&gt; -=C2=A0 (unless old-object<br>
&gt; -=C2=A0 =C2=A0 (setq old-object object))<br>
&gt; -=C2=A0 (let* ((objects (vtable-objects table))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(inhibit-read-only t))<br>
&gt; -=C2=A0 =C2=A0 ;; First replace the object in the object storage.<br>
&gt; -=C2=A0 =C2=A0 (if (eq old-object (car objects))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; It&#39;s at the head, so replace it th=
ere.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setf (vtable-objects table)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (cons object (cdr ob=
jects)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 ;; Otherwise splice into the list.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (while (and (cdr objects)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (not (=
eq (cadr objects) old-object)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq objects (cdr objects)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (unless (cdr objects)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (error &quot;Can&#39;t find the old objec=
t&quot;))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (setcar (cdr objects) object))<br>
&gt; -=C2=A0 =C2=A0 ;; Then update the rendered vtable in the current buffe=
r.<br>
&gt; -=C2=A0 =C2=A0 (if-let* ((cache (vtable--current-cache))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(line-number (seq-pos=
ition (vtable--cache-lines cache)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 old-=
object<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (lam=
bda (a b)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 (equal (car a) b))))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(line (elt (vtable--c=
ache-lines cache) line-number)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar line object)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcdr line (vtable--compute-cach=
ed-line table object))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; ... and redisplay the line in q=
uestion.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-excursion<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-goto-object old-obj=
ect)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((keymap (get-text-pro=
perty (point) &#39;keymap))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (start=
 (point)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-line)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--insert-line=
 table line line-number<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable--cache-widt=
hs cache)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable--spacer tab=
le))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (add-text-properties=
 start (point) (list &#39;keymap keymap<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;vtable table<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;vtable-cache cache=
))))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; We may have inserted a non-nume=
rical value into a previously<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; all-numerical table, so recompu=
te.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--recompute-numerical table=
 (cdr line)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (error &quot;Can&#39;t find cached object in vta=
ble&quot;))))<br>
&gt; +=C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt; +=C2=A0 =C2=A0 (unless old-object<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (setq old-object object))<br>
&gt; +=C2=A0 =C2=A0 (let* ((objects (vtable-objects table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(inhibit-read-only t))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 ;; First replace the object in the object storag=
e.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (if (eq old-object (car objects))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; It&#39;s at the head, so replac=
e it there.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setf (vtable-objects table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (cons object =
(cdr objects)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Otherwise splice into the list.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (while (and (cdr objects)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 (not (eq (cadr objects) old-object)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq objects (cdr objects)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (unless (cdr objects)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (error &quot;Can&#39;t find the ol=
d object&quot;))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar (cdr objects) object))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 ;; Then update the rendered vtable in the curren=
t buffer.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (if-let* ((cache (vtable--current-cache))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (line-number =
(seq-position (vtable--cache-lines cache)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0old-object<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0(lambda (a b)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0(equal (car a) b))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (line (elt (v=
table--cache-lines cache) line-number)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar line object)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcdr line (vtable--compu=
te-cached-line table object))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; ... and redisplay the li=
ne in question.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-excursion<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-goto-object =
old-object)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((keymap (get-t=
ext-property (point) &#39;keymap))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 (start (point)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-line)=
<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--inse=
rt-line table line line-number<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable--cac=
he-widths cache)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable--spa=
cer table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (add-text-pro=
perties start (point) (list &#39;keymap keymap<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;vtable tabl=
e<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;vtable-cach=
e cache))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; We may have inserted a n=
on-numerical value into a previously<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; all-numerical table, so =
recompute.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--recompute-numerica=
l table (cdr line)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (error &quot;Can&#39;t find cached object=
 in vtable&quot;)))))<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defun vtable-remove-object (table object)<br>
&gt;=C2=A0 =C2=A0 &quot;Remove OBJECT from TABLE.<br>
&gt;=C2=A0 This will also remove the displayed line.&quot;<br>
&gt; -=C2=A0 ;; First remove from the objects.<br>
&gt; -=C2=A0 (setf (vtable-objects table) (delq object (vtable-objects tabl=
e)))<br>
&gt; -=C2=A0 ;; Then adjust the cache and display.<br>
&gt; -=C2=A0 (save-excursion<br>
&gt; -=C2=A0 =C2=A0 (vtable-goto-table table)<br>
&gt; -=C2=A0 =C2=A0 (let ((cache (vtable--current-cache))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (inhibit-read-only t))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (setcar cache (delq (assq object (vtable--cache-=
lines cache))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 (vtable--cache-lines cache)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (when (vtable-goto-object object)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-line)))))<br>
&gt; +=C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt; +=C2=A0 =C2=A0 ;; First remove from the objects.<br>
&gt; +=C2=A0 =C2=A0 (setf (vtable-objects table) (delq object (vtable-objec=
ts table)))<br>
&gt; +=C2=A0 =C2=A0 ;; Then adjust the cache and display.<br>
&gt; +=C2=A0 =C2=A0 (save-excursion<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (vtable-goto-table table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (let ((cache (vtable--current-cache))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (inhibit-read-only t))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar cache (delq (assq object (vtable-=
-cache-lines cache))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--cache-lines cache)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (when (vtable-goto-object object)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (delete-line))))))<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 ;; FIXME: The fact that the `location&#39; argument of<br>
&gt;=C2=A0 ;; `vtable-insert-object&#39; can be an integer and is then inte=
rpreted as<br>
&gt; @@ -363,91 +380,92 @@ vtable-insert-object<br>
&gt;=C2=A0 case.<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 This also updates the displayed table.&quot;<br>
&gt; -=C2=A0 ;; If the vtable is empty, just add the object and regenerate =
the<br>
&gt; -=C2=A0 ;; table.<br>
&gt; -=C2=A0 (if (null (vtable-objects table))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (progn<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setf (vtable-objects table) (list object=
))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--recompute-numerical table (vtabl=
e--compute-cached-line table object))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-goto-table table)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-revert-command))<br>
&gt; -=C2=A0 =C2=A0 ;; First insert into the objects.<br>
&gt; -=C2=A0 =C2=A0 (let ((pos (if location<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
(if (integerp location)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0(prog1<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0(nthcdr location (vtable-objects table))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0;; Do not prepend if index is too large:<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0(setq before nil))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0(or (memq location (vtable-objects table))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0;; Prepend if `location&#39; is not found and<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0;; `before&#39; is non-nil:<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0(and before (vtable-objects table))))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; If `=
location&#39; is nil and `before&#39; is non-nil, we<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; prep=
end the new object.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(if bef=
ore (vtable-objects table)))))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (if (or before=C2=A0 ; If `before&#39; is non-ni=
l, `pos&#39; should be, as well.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (and pos (integerp l=
ocation)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Add the new object before.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((old-object (car pos)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar pos object)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcdr pos (cons old-objec=
t (cdr pos))))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Otherwise, add the object after.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (if pos<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Splice the object into t=
he list.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcdr pos (cons object (c=
dr pos)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Otherwise, append the object.<b=
r>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (nconc (vtable-objects table) (lis=
t object)))))<br>
&gt; -=C2=A0 =C2=A0 ;; Then adjust the cache and display.<br>
&gt; -=C2=A0 =C2=A0 (save-excursion<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (vtable-goto-table table)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (let* ((cache (vtable--current-cache))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(inhibit-read-only t)=
<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(keymap (get-text-pro=
perty (point) &#39;keymap))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis (if (vtable=
-ellipsis table)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0(propertize (truncate-string-ellipsis)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;=
face (vtable-face table))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0&quot;&quot;))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis-width (stri=
ng-pixel-width ellipsis))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(lines (vtable--cache=
-lines cache))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(elem (if location=C2=
=A0 ; This binding mirrors the binding of `pos&#39; above.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0(if (integerp location)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0(nth location lines)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0(or (assq location lines)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(and before (car lines))))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0(if before (car lines))))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(pos (memq elem lines=
))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(line (cons object (v=
table--compute-cached-line table object))))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (or before<br>
&gt; +=C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt; +=C2=A0 =C2=A0 ;; If the vtable is empty, just add the object and rege=
nerate the<br>
&gt; +=C2=A0 =C2=A0 ;; table.<br>
&gt; +=C2=A0 =C2=A0 (if (null (vtable-objects table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setf (vtable-objects table) (list=
 object))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--recompute-numerical table=
 (vtable--compute-cached-line table object))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-goto-table table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-revert-command))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 ;; First insert into the objects.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (let ((pos (if location<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0(if (integerp location)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0(prog1<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(nthcdr location (vtable-objects table))=
<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; Do not prepend if index is too large:<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0(setq before nil))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0(or (memq location (vtable-objects table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; Prepend if `location&#39; is not found and<b=
r>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; `before&#39; is non-nil:<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0(and before (vtable-objects table))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
;; If `location&#39; is nil and `before&#39; is non-nil, we<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
;; prepend the new object.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
(if before (vtable-objects table)))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (or before=C2=A0 ; If `before&#39; is=
 non-nil, `pos&#39; should be, as well.<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (and pos=
 (integerp location)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Add the new object befor=
e:.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((old-line (car pos)))=
<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar pos line)<br=
>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcdr pos (cons ol=
d-line (cdr pos)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (unless (vtable-goto=
-object (car elem))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-begin=
ning-of-table)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Add the new object befor=
e.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((old-object (car pos)=
))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar pos object)<=
br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcdr pos (cons ol=
d-object (cdr pos))))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Otherwise, add the object =
after.<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (if pos<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Splice the o=
bject into the list.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcdr pos (=
cons line (cdr pos)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (vtable-g=
oto-object location)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 (forward-line 1)=C2=A0 ; Insert *after*.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtabl=
e-end-of-table)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcdr pos (cons ob=
ject (cdr pos)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Otherwise, append t=
he object.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar cache (nconc lines =
(list line)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-end-of-table)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((start (point)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; FIXME: We have to adjust colors=
 in lines below this if we<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; have :row-colors.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--insert-line table line 0<=
br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable--cache-widths cache) (vta=
ble--spacer table)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ellipsis ellipsis-width)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (add-text-properties start (point)=
 (list &#39;keymap keymap<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;vtable table<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;vtable-cache cache)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; We may have inserted a non-numerical v=
alue into a previously<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; all-numerical table, so recompute.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--recompute-numerical table (cdr l=
ine))))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (nconc (vtable-objects tabl=
e) (list object)))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 ;; Then adjust the cache and display.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (save-excursion<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-goto-table table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (let* ((cache (vtable--current-cache))<br=
>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(inhibit-read-=
only t)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(keymap (get-t=
ext-property (point) &#39;keymap))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis (if =
(vtable-ellipsis table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(propertize (truncate-string-ellipsis)<b=
r>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0&#39;face (vtable-face table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0&quot;&quot;))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis-widt=
h (string-pixel-width ellipsis (current-buffer)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(lines (vtable=
--cache-lines cache))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(elem (if loca=
tion=C2=A0 ; This binding mirrors the binding of `pos&#39; above.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0(if (integerp location)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(nth location lines)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0(or (assq location lines)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(and before (car lines))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0(if before (car lines))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(pos (memq ele=
m lines))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(line (cons ob=
ject (vtable--compute-cached-line table object))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (or before<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (and p=
os (integerp location)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Add the new objec=
t before:.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((old-line (car=
 pos)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar pos l=
ine)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcdr pos (=
cons old-line (cdr pos)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (unless (vtab=
le-goto-object (car elem))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtabl=
e-beginning-of-table)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Otherwise, add the objec=
t after.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (if pos<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Splice the=
 object into the list.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcd=
r pos (cons line (cdr pos)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (v=
table-goto-object location)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 (forward-line 1)=C2=A0 ; Insert *after*.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 (vtable-end-of-table)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; Otherwise, append=
 the object.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar cache (nconc=
 lines (list line)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-end-of-table=
)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((start (point)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; FIXME: We have to adjust=
 colors in lines below this if we<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; have :row-colors.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--insert-line table =
line 0<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable--cache-widths cach=
e) (vtable--spacer table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ellipsis ellipsis-width)<b=
r>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (add-text-properties start =
(point) (list &#39;keymap keymap<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;vtable table<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;vtable-cache cache)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; We may have inserted a non-nume=
rical value into a previously<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; all-numerical table, so recompu=
te.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--recompute-numerical table=
 (cdr line)))))))<br>
<br>
Is it possible to avoid these massive diffs in vtable-update-object,<br>
vtable-remove-object, and vtable-insert-object?=C2=A0 These will make the<b=
r>
history worse, and also makes it harder to review.=C2=A0 Maybe we only need=
<br>
to wrap with-current-buffer around a smaller part of these functions?<br>
<br>
FYI, in general, you should change try to make changes in a way which<br>
minimizes the size of the diff.<br>
<br>
&gt;=C2=A0 (defun vtable-column (table index)<br>
&gt;=C2=A0 =C2=A0 &quot;Return the name of the INDEXth column in TABLE.&quo=
t;<br>
&gt; @@ -520,14 +538,14 @@ vtable--cache-widths<br>
&gt;=C2=A0 (defun vtable--cache-lines (cache)<br>
&gt;=C2=A0 =C2=A0 (car cache))<br>
&gt;=C2=A0 <br>
&gt; -(defun vtable-insert (table)<br>
&gt; +(defun vtable--insert (table)<br>
&gt;=C2=A0 =C2=A0 (let* ((spacer (vtable--spacer table))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(start (point))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis (if (vtable-ellipsis=
 table)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0(propertize (truncate-string-ellipsis)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;face (vt=
able-face table))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0&quot;&quot;))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis-width (string-pixel-width=
 ellipsis))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis-width (string-pixel-width=
 ellipsis (current-buffer)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; We maintain a cache per scr=
een/window width, so that we render<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; correctly if Emacs is open =
on two different screens (or the<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; user resizes the frame).<br=
>
&gt; @@ -565,9 +583,24 @@ vtable-insert<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&#39;vtable-cache cache))<b=
r>
&gt;=C2=A0 =C2=A0 =C2=A0 (goto-char start)))<br>
&gt;=C2=A0 <br>
&gt; +(defun vtable-insert (table)<br>
&gt; +=C2=A0 &quot;Insert TABLE into the current buffer.<br>
&gt; +The current buffer will be recorded as TABLE&#39;s buffer.=C2=A0 If t=
his is done<br>
&gt; +more than once, or if the table is attempted to be inserted more than=
<br>
&gt; +once into the same buffer, signal an error.&quot;<br>
&gt; +=C2=A0 (if-let* ((table-buffer (vtable-buffer table)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (if (eq table-buffer (current-buffer))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (error &quot;A vtable cannot be in=
serted more than once into a buffer&quot;)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (error &quot;A vtable cannot be inserted =
into more than one buffer&quot;)))<br>
&gt; +=C2=A0 (vtable-set-buffer (current-buffer) table)<br>
&gt; +=C2=A0 (let ((inhibit-read-only t)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (inhibit-modification-hooks t))<br>
&gt; +=C2=A0 =C2=A0 (vtable--insert table)))<br>
&gt; +<br>
&gt;=C2=A0 (defun vtable--insert-line (table line line-number widths spacer=
<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &amp;optional ellip=
sis ellipsis-width)<br>
&gt;=C2=A0 =C2=A0 (let ((start (point))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (buffer (vtable-buffer table))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (columns (vtable-columns table))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (column-colors<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(and (vtable-column-colors tab=
le)<br>
&gt; @@ -607,16 +640,18 @@ vtable--insert-line<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 (concat<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0(vtable--limit-string<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 pre-computed (- (elt widths index)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (or =
ellipsis-width 0)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (or =
ellipsis-width 0))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 buffer)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0ellipsis)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 pre-computed))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;;=
 Recompute widths.<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(t=
<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (&=
gt; (string-pixel-width value) (elt widths index))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (&=
gt; (string-pixel-width value buffer) (elt widths index))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 (concat<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0(vtable--limit-string<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 value (- (elt widths index)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(or ellipsis-width 0)))<br=
>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(or ellipsis-width 0))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 buffer)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0ellipsis)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 value))))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(start (p=
oint))<br>
&gt; @@ -630,14 +665,15 @@ vtable--insert-line<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 (list &#39;space<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :width (list<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 (+ (- (elt widths index)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 (string-pixel-width displayed))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 (string-pixel-width<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0displayed buffer))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0(if last 0 spacer)))))))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; Align to the =
right.<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(insert (propert=
ize &quot; &quot; &#39;display<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(list &#39;space<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0:width (list (- (elt widths index)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(string-pixel-wi=
dth<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 displayed)))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 displayed buffer)))))<=
br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0displayed)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(unless last<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(insert (=
propertize &quot; &quot; &#39;display<br>
&gt; @@ -718,6 +754,7 @@ vtable--indicator<br>
&gt;=C2=A0 (defun vtable--insert-header-line (table widths spacer)<br>
&gt;=C2=A0 =C2=A0 ;; Insert the header directly into the buffer.<br>
&gt;=C2=A0 =C2=A0 (let ((start (point))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (buffer (vtable-buffer table))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (divider (vtable-divider table))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (cmap (define-keymap<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &quot;&l=
t;header-line&gt; &lt;drag-mouse-1&gt;&quot; #&#39;vtable--drag-resize-colu=
mn<br>
&gt; @@ -737,14 +774,15 @@ vtable--insert-header-line<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0&#39;keymap cmap))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (start (point))=
<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (indicator (vta=
ble--indicator table index))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (indicator-width (st=
ring-pixel-width indicator))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (indicator-width (st=
ring-pixel-width indicator buffer))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (last (=3D inde=
x (1- (length (vtable-columns table)))))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 displayed)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(setq displayed<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(if (&gt; (str=
ing-pixel-width name)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(if (&gt; (str=
ing-pixel-width name buffer)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 (- (elt widths index) indicator-width))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0(vtable--limit-string<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 name (- (elt widths index) indicator-width))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 name (- (elt widths index) indicator-width)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 buffer)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0na=
me))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(let* ((indicator-lead-width<b=
r>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;;=
 We want the indicator to not be quite flush right.<br>
&gt; @@ -753,7 +791,7 @@ vtable--insert-header-line<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 indicator-lead-width))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (fill-wi=
dth<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(+=
 (- (elt widths index)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0(string-pixel-width displayed)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0(string-pixel-width displayed buffer)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0indicator-width<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0indicator-lead-width)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 (if last 0 spacer))))<br>
&gt; @@ -771,7 +809,8 @@ vtable--insert-header-line<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; This is the f=
inal column, and we have a sorting<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0;; indicator, an=
d the table is too wide for the window.<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(let* ((pre-indi=
cator (string-pixel-width<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (buffer-substring =
(point-min) (point))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (buffer-substring =
(point-min) (point))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 buffer))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 (pre-fill<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0(- (window-width nil t)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 pre-indicator<br>
&gt; @@ -850,14 +889,16 @@ vtable--set-header-line<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(buffer-substring (poin=
t-min) (1- (point-max))))))<br>
&gt;=C2=A0 =C2=A0 (vtable-header-mode 1))<br>
&gt;=C2=A0 <br>
&gt; -(defun vtable--limit-string (string pixels)<br>
&gt; +<br>
&gt; +(defun vtable--limit-string (string pixels buffer)<br>
&gt;=C2=A0 =C2=A0 (while (and (length&gt; string 0)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (&gt; (string-pixel-=
width string) pixels))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (&gt; (string-pixel-=
width string buffer) pixels))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 (setq string (substring string 0 (1- (length strin=
g)))))<br>
&gt;=C2=A0 =C2=A0 string)<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defun vtable--char-width (table)<br>
&gt; -=C2=A0 (string-pixel-width (propertize &quot;x&quot; &#39;face (vtabl=
e-face table))))<br>
&gt; +=C2=A0 (string-pixel-width (propertize &quot;x&quot; &#39;face (vtabl=
e-face table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 (vtable-buffer table)))<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defun vtable--compute-width (table spec)<br>
&gt;=C2=A0 =C2=A0 (cond<br>
&gt; @@ -967,20 +1008,24 @@ vtable--make-keymap<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-keymap table))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 map)))<br>
&gt;=C2=A0 <br>
&gt; -(defun vtable-revert ()<br>
&gt; -=C2=A0 &quot;Regenerate the table under point.&quot;<br>
&gt; -=C2=A0 (let ((table (vtable-current-table))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (object (vtable-current-object))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (column (vtable-current-column))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (inhibit-read-only t))<br>
&gt; -=C2=A0 =C2=A0 (unless table<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (user-error &quot;No table under point&quot;))<b=
r>
&gt; -=C2=A0 =C2=A0 (delete-region (vtable-beginning-of-table) (vtable-end-=
of-table))<br>
&gt; -=C2=A0 =C2=A0 (vtable-insert table)<br>
&gt; -=C2=A0 =C2=A0 (when object<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (vtable-goto-object object))<br>
&gt; -=C2=A0 =C2=A0 (when column<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (vtable-goto-column column))))<br>
&gt; +(defun vtable-revert (&amp;optional table)<br>
&gt; +=C2=A0 &quot;Regenerate the table under point.<br>
&gt; +If TABLE is nil, use the table under point.&quot;<br>
<br>
This repeats itself.=C2=A0 It should say &quot;Regenerate TABLE, defaulting=
 to the table under point.&quot;<br>
<br>
&gt; +=C2=A0 (setq table (or table (vtable-current-table)))<br>
&gt; +=C2=A0 (unless table<br>
&gt; +=C2=A0 =C2=A0 (user-error &quot;No table found&quot;))<br>
<br>
I don&#39;t think this error message should change.<br>
<br>
&gt; +=C2=A0 (with-current-buffer (vtable-buffer table)<br>
&gt; +=C2=A0 =C2=A0 (let ((object (vtable-current-object))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (column (vtable-current-column))<b=
r>
<br>
So we still implicitly depend on the value of point in the buffer?=C2=A0 Ho=
w<br>
does this interact with window-point?=C2=A0 This seems like a potential<br>
foot-gun.<br>
<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (inhibit-read-only t))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (unless table<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (user-error &quot;No table under point&qu=
ot;))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (delete-region (vtable-beginning-of-table) (vtab=
le-end-of-table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (vtable--insert table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (when object<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-goto-object object))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (when column<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-goto-column column)))))<br>
&gt;<br>
&gt;=C2=A0 ;;; Commands.<br>
&gt;=C2=A0 <br>
&gt; @@ -1013,7 +1058,7 @@ vtable--alter-column-width<br>
&gt;=C2=A0 =C2=A0 =C2=A0 ;; Store the width so it&#39;ll be respected on a =
revert.<br>
&gt;=C2=A0 =C2=A0 =C2=A0 (setf (vtable-column-width (elt (vtable-columns ta=
ble) column))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (format &quot;%dpx&quot; (are=
f widths column)))<br>
&gt; -=C2=A0 =C2=A0 (vtable-revert)))<br>
&gt; +=C2=A0 =C2=A0 (vtable-revert table)))<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defun vtable-widen-current-column (&amp;optional n)<br>
&gt;=C2=A0 =C2=A0 &quot;Widen the current column by N characters.<br>
&gt; @@ -1038,14 +1083,16 @@ vtable-next-column<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0(min (1- (length (vtable--cache-widths (vtab=
le--current-cache))))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (1+ (vtable-current-column)))=
)))<br>
&gt;=C2=A0 <br>
&gt; -(defun vtable-revert-command ()<br>
&gt; +(defun vtable-revert-command (&amp;optional table)<br>
&gt;=C2=A0 =C2=A0 &quot;Re-query data and regenerate the table under point.=
&quot;<br>
&gt;=C2=A0 =C2=A0 (interactive)<br>
&gt; -=C2=A0 (let ((table (vtable-current-table)))<br>
&gt; -=C2=A0 =C2=A0 (when (vtable-objects-function table)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (setf (vtable-objects table) (funcall (vtable-ob=
jects-function table))))<br>
&gt; -=C2=A0 =C2=A0 (vtable--clear-cache table))<br>
&gt; -=C2=A0 (vtable-revert))<br>
&gt; +=C2=A0 (setq table (or table (vtable-current-table)))<br>
&gt; +=C2=A0 (unless table<br>
&gt; +=C2=A0 =C2=A0 (user-error &quot;No table found&quot;))<br>
&gt; +=C2=A0 (when (vtable-objects-function table)<br>
&gt; +=C2=A0 =C2=A0 (setf (vtable-objects table) (funcall (vtable-objects-f=
unction table))))<br>
&gt; +=C2=A0 (vtable--clear-cache table)<br>
&gt; +=C2=A0 (vtable-revert table))<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defun vtable-sort-by-current-column ()<br>
&gt;=C2=A0 =C2=A0 &quot;Sort the table under point by the column under poin=
t.&quot;<br>
&gt; @@ -1067,8 +1114,8 @@ vtable-sort-by-current-column<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (eq (cdr last) =
&#39;ascend)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &#39;=
descend<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &#39;ascend)=
<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &#39;ascend))))))<br>
&gt; -=C2=A0 (vtable-revert))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &#39;ascend)))))<br>
&gt; +=C2=A0 =C2=A0 (vtable-revert table)))<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defun vtable-header-line-sort (e)<br>
&gt;=C2=A0 =C2=A0 &quot;Sort a vtable from the header line.&quot;<br>
&gt; diff --git a/test/lisp/emacs-lisp/vtable-tests.el b/test/lisp/emacs-li=
sp/vtable-tests.el<br>
&gt; index 74fb8cc8139..83f826ea353 100644<br>
&gt; --- a/test/lisp/emacs-lisp/vtable-tests.el<br>
&gt; +++ b/test/lisp/emacs-lisp/vtable-tests.el<br>
&gt; @@ -27,16 +27,19 @@<br>
&gt;=C2=A0 (require &#39;ert)<br>
&gt;=C2=A0 (require &#39;ert-x)<br>
&gt;=C2=A0 <br>
&gt; -(ert-deftest test-vstable-compute-columns ()<br>
&gt; +(defun vtable-tests--make-no-header-2-object-table ()<br>
&gt; +=C2=A0 (make-vtable :columns &#39;(&quot;a&quot; &quot;b&quot; &quot;=
c&quot;)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:objects &#39;=
((&quot;foo&quot; 1 2)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 (&quot;bar&quot; 3 :zot))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:insert nil))<=
br>
&gt; +<br>
&gt; +(ert-deftest test-vtable-compute-columns ()<br>
&gt;=C2=A0 =C2=A0 (should<br>
&gt;=C2=A0 =C2=A0 =C2=A0(equal (mapcar<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(lambda (column)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-column-a=
lign column))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable--compute-column=
s<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (make-vtable :columns &#39;=
(&quot;a&quot; &quot;b&quot; &quot;c&quot;)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0:objects &#39;((&quot;foo&quot; 1 2)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (&quot;bar&quot; 3=
 :zot))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0:insert nil)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-tests--make-no-head=
er-2-object-table)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &#39;(left right left))))<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (ert-deftest test-vtable-insert-object ()<br>
&gt; @@ -69,4 +72,69 @@ test-vtable-insert-object<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (mapcar #&#39;c=
adr (vtable-objects table))))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (number-sequence 0 11))))<br>
&gt;=C2=A0 <br>
&gt; +(ert-deftest test-vtable-unique-buffer ()<br>
&gt; +=C2=A0 (let ((table (vtable-tests--make-no-header-2-object-table)))<b=
r>
&gt; +=C2=A0 =C2=A0 (with-temp-buffer<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (vtable-insert table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 ;; This will run but fail on Emacs pre 31 vtable=
.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should-error (vtable-insert table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 ;; This will run only on Emacs 31+ vtable.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (when (&gt; emacs-major-version 30)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (should-error (vtable-set-buffer table (c=
urrent-buffer)))))))<br>
&gt; +<br>
&gt; +(ert-deftest test-vtable-non-current-buffer-insert-object ()<br>
&gt; +=C2=A0 (let ((table (vtable-tests--make-no-header-2-object-table))<br=
>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (obj &#39;(&quot;baz&quot; 4 5)))<br>
&gt; +=C2=A0 =C2=A0 (with-temp-buffer<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (vtable-insert table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should (=3D (count-lines (point-min) (point-max=
)) 2))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (with-temp-buffer<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-insert-object table obj))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should (=3D (count-lines (point-min) (point-max=
)) 3)))))<br>
&gt; +<br>
&gt; +(ert-deftest test-vtable-non-current-buffer-remove-object ()<br>
&gt; +=C2=A0 (let ((table (vtable-tests--make-no-header-2-object-table))<br=
>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (obj &#39;(&quot;baz&quot; 4 5)))<br>
&gt; +=C2=A0 =C2=A0 (with-temp-buffer<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (vtable-insert table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (vtable-insert-object table obj)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should (=3D (count-lines (point-min) (point-max=
)) 3))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (with-temp-buffer<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-remove-object table obj))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should (=3D (count-lines (point-min) (point-max=
)) 2)))))<br>
&gt; +<br>
&gt; +(ert-deftest test-vtable-non-current-buffer-update-object ()<br>
&gt; +=C2=A0 (let ((table (vtable-tests--make-no-header-2-object-table))<br=
>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (obj &#39;(&quot;baz&quot; 4 5))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (obj-2 &#39;(&quot;qux&quot; 6 7)))<br>
&gt; +=C2=A0 =C2=A0 (with-temp-buffer<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (vtable-insert table)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (vtable-insert-object table obj)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should (=3D (count-lines (point-min) (point-max=
)) 3))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (let ((line-2 (progn<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 (goto-char (point-min))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 (forward-line 2)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 (buffer-substring (point) (point-max)))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (with-temp-buffer<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-update-object table obj-2 =
obj))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((line-2-new (progn<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (goto-char (point-min))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (forward-line 2)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (buffer-substring (point) (point-max)))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (should (=3D (count-lines (point-m=
in) (point-max)) 3))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (should (not (string=3D line-2 lin=
e-2-new))))))))<br>
&gt; +<br>
&gt; +(ert-deftest test-vtable--limit-string-with-face-remapped-buffer ()<b=
r>
&gt; +=C2=A0 (with-temp-buffer<br>
&gt; +=C2=A0 =C2=A0 (let ((text (propertize &quot;XXXXX&quot;<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &#39;face &#39;variable-pitch)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (face-remap-add-relative &#39;default :height 1.=
5)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (if (&gt; emacs-major-version 30)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (should (eq<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
2<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
(length (vtable--limit-string text 50 (current-buffer)))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (should (eq<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A02<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(length=
 (vtable--limit-string text 50))))))))<br>
&gt; +<br>
&gt;=C2=A0 ;;; vtable-tests.el ends here<br></blockquote><div><br></div><di=
v class=3D"gmail_default" style=3D"font-family:monospace">Thanks.=C2=A0 Rev=
ised patch, attached.=C2=A0 With regard to point vs. window-point, the code=
 seems no worse off than before?=C2=A0 There is a suite of additional fixes=
 coming that address keeping point stable during operations and we can see =
if there are any ill effects when we get to testing those changes.</div><di=
v class=3D"gmail_default" style=3D"font-family:monospace"><br></div><div cl=
ass=3D"gmail_default" style=3D"font-family:monospace">-St=C3=A9phane=C2=A0<=
/div></div></div>

--00000000000039c8df0645a0693c--

--00000000000039c8e10645a0693e
Content-Type: application/octet-stream; 
	name="0001-Add-vtable-buffer-slot.patch"
Content-Disposition: attachment; 
	filename="0001-Add-vtable-buffer-slot.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_mj0km0v50>
X-Attachment-Id: f_mj0km0v50

RnJvbSBjZjIyNjBjMDU1YmVkNDNiZTZlNzIwODQyMmY5NzEzYjJjMDgzZDg2IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo
aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMTAgRGVjIDIwMjUgMDk6MjA6MDIgLTA1MDAK
U3ViamVjdDogW1BBVENIXSBBZGQgdnRhYmxlIGJ1ZmZlciBzbG90CgpUaGlzIHNvbHZlcyBmb3Ig
YmFja2dyb3VuZCB2dGFibGUgbXV0YXRpb25zLCBpLmUuLCB1cGRhdGVzCmluaXRpYXRlZCBmcm9t
IGJ1ZmZlcnMgb3RoZXIgdGhhbiB0aGUgdnRhYmxlIGJ1ZmZlciwgYW5kIGZvcgpidWZmZXItYWRq
dXN0ZWQgc3RyaW5nLXBpeGVsLXdpZHRoIGNvbXB1dGF0aW9ucy4KCiogbGlzcC9lbWFjcy1saXNw
L3Z0YWJsZS5lbCAodnRhYmxlKTogTmV3ICctYnVmZmVyJyBzbG90LgoodnRhYmxlLWJ1ZmZlcik6
Cih2dGFibGUtc2V0LWJ1ZmZlcik6IE5ldyBmdW5jdGlvbi4KKHZ0YWJsZS11cGRhdGUtb2JqZWN0
KToKKHZ0YWJsZS1yZW1vdmUtb2JqZWN0KToKKHZ0YWJsZS1pbnNlcnQtb2JqZWN0KTogV3JhcCBv
cGVyYXRpb24gd2l0aCB0aGUgdnRhYmxlIGJ1ZmZlci4KKHZ0YWJsZS0taW5zZXJ0KTogU3BsaXQg
ZnJvbSBvbGQgJ3Z0YWJsZS1pbnNlcnQnLgoodnRhYmxlLWluc2VydCk6IEluc2VydCB0YWJsZSBh
bmQgcmVjb3JkIHRoZSBidWZmZXIuCih2dGFibGUtLWluc2VydC1saW5lKToKKHZ0YWJsZS0taW5z
ZXJ0LWhlYWRlci1saW5lKTogVXNlICd2dGFibGUtYnVmZmVyJyBmb3IgcGl4ZWwtd2lkdGggY29t
cHV0YXRpb24uCih2dGFibGUtLWxpbWl0LXN0cmluZyk6Cih2dGFibGUtLWNoYXItd2lkdGgpOiBQ
YXNzIGJ1ZmZlciB0byAnc3RyaW5nLXBpeGVsLXdpZHRoJy4KKHZ0YWJsZS1yZXZlcnQpOiBOZXcg
b3B0aW9uYWwgdGFibGUgYXJndW1lbnQuCih2dGFibGUtLWFsdGVyLWNvbHVtbi13aWR0aCk6Cih2
dGFibGUtcmV2ZXJ0LWNvbW1hbmQpOgoodnRhYmxlLXNvcnQtYnktY3VycmVudC1jb2x1bW4pOiBD
YWxsICd2dGFibGUtcmV2ZXJ0JyB3aXRoIHRoZSB0YWJsZS4KCiogdGVzdC9saXNwL2VtYWNzLWxp
c3AvdnRhYmxlLXRlc3RzLmVsCih2dGFibGUtdGVzdHMtLW1ha2Utbm8taGVhZGVyLTItb2JqZWN0
LXRhYmxlKTogTmV3IGhlbHBlcgpmdW5jdGlvbi4KKHRlc3QtdnN0YWJsZS1jb21wdXRlLWNvbHVt
bnMpOiBDb3JyZWN0IHR5cG8gaW4gdGVzdCBuYW1lLiAgVXNlCm5ldyBoZWxwZXIgZnVuY3Rpb24u
Cih0ZXN0LXZ0YWJsZS11bmlxdWUtYnVmZmVyKQoodGVzdC12dGFibGUtbm9uLWN1cnJlbnQtYnVm
ZmVyLWluc2VydC1vYmplY3QpCih0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItcmVtb3Zl
LW9iamVjdCkKKHRlc3QtdnRhYmxlLW5vbi1jdXJyZW50LWJ1ZmZlci11cGRhdGUtb2JqZWN0KQoo
dGVzdC12dGFibGUtLWxpbWl0LXN0cmluZy13aXRoLWZhY2UtcmVtYXBwZWQtYnVmZmVyKTogTmV3
IHRlc3QuCi0tLQogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAgICAgICAgICAgIHwgMjkzICsr
KysrKysrKysrKysrKy0tLS0tLS0tLS0tLQogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRl
c3RzLmVsIHwgIDc4ICsrKysrKy0KIDIgZmlsZXMgY2hhbmdlZCwgMjQyIGluc2VydGlvbnMoKyks
IDEyOSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVs
IGIvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbAppbmRleCBiY2RkMjgwZmI5Mi4uOTRmMzE5OWYx
MmIgMTAwNjQ0Ci0tLSBhL2xpc3AvZW1hY3MtbGlzcC92dGFibGUuZWwKKysrIGIvbGlzcC9lbWFj
cy1saXNwL3Z0YWJsZS5lbApAQCAtNjgsNiArNjgsNyBAQCB2dGFibGUKICAgIChjb2x1bW4tY29s
b3JzIDppbml0YXJnIDpjb2x1bW4tY29sb3JzIDphY2Nlc3NvciB2dGFibGUtY29sdW1uLWNvbG9y
cykKICAgIChyb3ctY29sb3JzIDppbml0YXJnIDpyb3ctY29sb3JzIDphY2Nlc3NvciB2dGFibGUt
cm93LWNvbG9ycykKICAgICgtY2FjaGVkLWNvbG9ycyA6aW5pdGZvcm0gbmlsKQorICAgKC1idWZm
ZXIgOmluaXRmb3JtIG5pbCkKICAgICgtY2FjaGUgOmluaXRmb3JtIChtYWtlLWhhc2gtdGFibGUg
OnRlc3QgIydlcXVhbCkpCiAgICAoLWNhY2hlZC1rZXltYXAgOmluaXRmb3JtIG5pbCkKICAgICgt
aGFzLWNvbHVtbi1zcGVjIDppbml0Zm9ybSBuaWwpKQpAQCAtMjIxLDYgKzIyMiwyMCBAQCB2dGFi
bGUtLWZhY2UtY29sb3IKIAogOzs7IEludGVyZmFjZSB1dGlsaXR5IGZ1bmN0aW9ucy4KIAorKGRl
ZnVuIHZ0YWJsZS1idWZmZXIgKCZvcHRpb25hbCB0YWJsZSkKKyAgIlJldHVybiB0aGUgYnVmZmVy
IGFzc29jaWF0ZWQgd2l0aCBUQUJMRS4KK0lmIFRBQkxFIGlzIG5pbCwgdXNlIHRoZSB0YWJsZSB1
bmRlciBwb2ludC4gIFJldHVybiBuaWwgaWYgdGhlIHRhYmxlIGhhcworbm90IGJlZW4gaW5zZXJ0
ZWQgaW50byBhIGJ1ZmZlci4iCisgIChzbG90LXZhbHVlIChvciB0YWJsZSAodnRhYmxlLWN1cnJl
bnQtdGFibGUpKQorICAgICAgICAgICAgICAnLWJ1ZmZlcikpCisKKyhkZWZ1biB2dGFibGUtc2V0
LWJ1ZmZlciAoYnVmZmVyICZvcHRpb25hbCB0YWJsZSkKKyAgIkFzc29jaWF0ZSBCVUZGRVIgd2l0
aCBUQUJMRS4KK0lmIFRBQkxFIGlzIG5pbCwgdXNlIHRoZSB0YWJsZSB1bmRlciBwb2ludC4iCisg
IChzZXRmIChzbG90LXZhbHVlIChvciB0YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKQorICAg
ICAgICAgICAgICAgICAgICAnLWJ1ZmZlcikKKyAgICAgICAgYnVmZmVyKSkKKwogKGRlZnVuIHZ0
YWJsZS1jdXJyZW50LXRhYmxlICgpCiAgICJSZXR1cm4gdGhlIHRhYmxlIHVuZGVyIHBvaW50LiIK
ICAgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ3Z0YWJsZSkpCkBAIC0zMDEsMzIgKzMxNiwz
MyBAQCB2dGFibGUtdXBkYXRlLW9iamVjdAogICAgICAgKHVubGVzcyAoY2RyIG9iamVjdHMpCiAg
ICAgICAgIChlcnJvciAiQ2FuJ3QgZmluZCB0aGUgb2xkIG9iamVjdCIpKQogICAgICAgKHNldGNh
ciAoY2RyIG9iamVjdHMpIG9iamVjdCkpCi0gICAgOzsgVGhlbiB1cGRhdGUgdGhlIHJlbmRlcmVk
IHZ0YWJsZSBpbiB0aGUgY3VycmVudCBidWZmZXIuCi0gICAgKGlmLWxldCogKChjYWNoZSAodnRh
YmxlLS1jdXJyZW50LWNhY2hlKSkKLSAgICAgICAgICAgICAobGluZS1udW1iZXIgKHNlcS1wb3Np
dGlvbiAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBvbGQtb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGxhbWJkYSAoYSBiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGVxdWFsIChjYXIgYSkgYikpKSkKLSAgICAgICAgICAgICAobGluZSAoZWx0
ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSBsaW5lLW51bWJlcikpKQotICAgICAgICAocHJv
Z24KLSAgICAgICAgICAoc2V0Y2FyIGxpbmUgb2JqZWN0KQotICAgICAgICAgIChzZXRjZHIgbGlu
ZSAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpCi0gICAgICAgICAg
OzsgLi4uIGFuZCByZWRpc3BsYXkgdGhlIGxpbmUgaW4gcXVlc3Rpb24uCi0gICAgICAgICAgKHNh
dmUtZXhjdXJzaW9uCi0gICAgICAgICAgICAodnRhYmxlLWdvdG8tb2JqZWN0IG9sZC1vYmplY3Qp
Ci0gICAgICAgICAgICAobGV0ICgoa2V5bWFwIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICdr
ZXltYXApKQotICAgICAgICAgICAgICAgICAgKHN0YXJ0IChwb2ludCkpKQotICAgICAgICAgICAg
ICAoZGVsZXRlLWxpbmUpCi0gICAgICAgICAgICAgICh2dGFibGUtLWluc2VydC1saW5lIHRhYmxl
IGxpbmUgbGluZS1udW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0
YWJsZS0tY2FjaGUtd2lkdGhzIGNhY2hlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAodnRhYmxlLS1zcGFjZXIgdGFibGUpKQotICAgICAgICAgICAgICAoYWRkLXRleHQtcHJv
cGVydGllcyBzdGFydCAocG9pbnQpIChsaXN0ICdrZXltYXAga2V5bWFwCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2
dGFibGUtY2FjaGUgY2FjaGUpKSkpCi0gICAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5zZXJ0ZWQg
YSBub24tbnVtZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5Ci0gICAgICAgICAgOzsgYWxs
LW51bWVyaWNhbCB0YWJsZSwgc28gcmVjb21wdXRlLgotICAgICAgICAgICh2dGFibGUtLXJlY29t
cHV0ZS1udW1lcmljYWwgdGFibGUgKGNkciBsaW5lKSkpCi0gICAgICAoZXJyb3IgIkNhbid0IGZp
bmQgY2FjaGVkIG9iamVjdCBpbiB2dGFibGUiKSkpKQorICAgIDs7IFRoZW4gdXBkYXRlIHRoZSBy
ZW5kZXJlZCB2dGFibGUgaW4gaXRzIGJ1ZmZlci4KKyAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciAo
dnRhYmxlLWJ1ZmZlciB0YWJsZSkKKyAgICAgIChpZi1sZXQqICgoY2FjaGUgKHZ0YWJsZS0tY3Vy
cmVudC1jYWNoZSkpCisgICAgICAgICAgICAgICAgKGxpbmUtbnVtYmVyIChzZXEtcG9zaXRpb24g
KHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgb2xkLW9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChsYW1iZGEgKGEgYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChlcXVhbCAoY2FyIGEpIGIpKSkpCisgICAgICAgICAgICAgICAgKGxp
bmUgKGVsdCAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkgbGluZS1udW1iZXIpKSkKKyAgICAg
ICAgICAocHJvZ24KKyAgICAgICAgICAgIChzZXRjYXIgbGluZSBvYmplY3QpCisgICAgICAgICAg
ICAoc2V0Y2RyIGxpbmUgKHZ0YWJsZS0tY29tcHV0ZS1jYWNoZWQtbGluZSB0YWJsZSBvYmplY3Qp
KQorICAgICAgICAgICAgOzsgLi4uIGFuZCByZWRpc3BsYXkgdGhlIGxpbmUgaW4gcXVlc3Rpb24u
CisgICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgICAgICAgICAgKHZ0YWJsZS1nb3Rv
LW9iamVjdCBvbGQtb2JqZWN0KQorICAgICAgICAgICAgICAobGV0ICgoa2V5bWFwIChnZXQtdGV4
dC1wcm9wZXJ0eSAocG9pbnQpICdrZXltYXApKQorICAgICAgICAgICAgICAgICAgICAoc3RhcnQg
KHBvaW50KSkpCisgICAgICAgICAgICAgICAgKGRlbGV0ZS1saW5lKQorICAgICAgICAgICAgICAg
ICh2dGFibGUtLWluc2VydC1saW5lIHRhYmxlIGxpbmUgbGluZS1udW1iZXIKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tc3BhY2VyIHRhYmxl
KSkKKyAgICAgICAgICAgICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9pbnQpIChs
aXN0ICdrZXltYXAga2V5bWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAndnRhYmxlIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlLWNhY2hlIGNhY2hlKSkp
KQorICAgICAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5zZXJ0ZWQgYSBub24tbnVtZXJpY2FsIHZh
bHVlIGludG8gYSBwcmV2aW91c2x5CisgICAgICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxl
LCBzbyByZWNvbXB1dGUuCisgICAgICAgICAgICAodnRhYmxlLS1yZWNvbXB1dGUtbnVtZXJpY2Fs
IHRhYmxlIChjZHIgbGluZSkpKQorICAgICAgICAoZXJyb3IgIkNhbid0IGZpbmQgY2FjaGVkIG9i
amVjdCBpbiB2dGFibGUiKSkpKSkKIAogKGRlZnVuIHZ0YWJsZS1yZW1vdmUtb2JqZWN0ICh0YWJs
ZSBvYmplY3QpCiAgICJSZW1vdmUgT0JKRUNUIGZyb20gVEFCTEUuCkBAIC0zMzQsMTQgKzM1MCwx
NSBAQCB2dGFibGUtcmVtb3ZlLW9iamVjdAogICA7OyBGaXJzdCByZW1vdmUgZnJvbSB0aGUgb2Jq
ZWN0cy4KICAgKHNldGYgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSAoZGVscSBvYmplY3QgKHZ0YWJs
ZS1vYmplY3RzIHRhYmxlKSkpCiAgIDs7IFRoZW4gYWRqdXN0IHRoZSBjYWNoZSBhbmQgZGlzcGxh
eS4KLSAgKHNhdmUtZXhjdXJzaW9uCi0gICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlKQotICAg
IChsZXQgKChjYWNoZSAodnRhYmxlLS1jdXJyZW50LWNhY2hlKSkKLSAgICAgICAgICAoaW5oaWJp
dC1yZWFkLW9ubHkgdCkpCi0gICAgICAoc2V0Y2FyIGNhY2hlIChkZWxxIChhc3NxIG9iamVjdCAo
dnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh2
dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkpCi0gICAgICAod2hlbiAodnRhYmxlLWdvdG8tb2Jq
ZWN0IG9iamVjdCkKLSAgICAgICAgKGRlbGV0ZS1saW5lKSkpKSkKKyAgKHdpdGgtY3VycmVudC1i
dWZmZXIgKHZ0YWJsZS1idWZmZXIgdGFibGUpCisgICAgKHNhdmUtZXhjdXJzaW9uCisgICAgICAo
dnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCisgICAgICAobGV0ICgoY2FjaGUgKHZ0YWJsZS0tY3Vy
cmVudC1jYWNoZSkpCisgICAgICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkpCisgICAgICAg
IChzZXRjYXIgY2FjaGUgKGRlbHEgKGFzc3Egb2JqZWN0ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNh
Y2hlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS1saW5lcyBj
YWNoZSkpKQorICAgICAgICAod2hlbiAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVjdCkKKyAgICAg
ICAgICAoZGVsZXRlLWxpbmUpKSkpKSkKIAogOzsgRklYTUU6IFRoZSBmYWN0IHRoYXQgdGhlIGBs
b2NhdGlvbicgYXJndW1lbnQgb2YKIDs7IGB2dGFibGUtaW5zZXJ0LW9iamVjdCcgY2FuIGJlIGFu
IGludGVnZXIgYW5kIGlzIHRoZW4gaW50ZXJwcmV0ZWQgYXMKQEAgLTM2OSw4ICszODYsOSBAQCB2
dGFibGUtaW5zZXJ0LW9iamVjdAogICAgICAgKHByb2duCiAgICAgICAgIChzZXRmICh2dGFibGUt
b2JqZWN0cyB0YWJsZSkgKGxpc3Qgb2JqZWN0KSkKICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRl
LW51bWVyaWNhbCB0YWJsZSAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVj
dCkpCi0gICAgICAgICh2dGFibGUtZ290by10YWJsZSB0YWJsZSkKLSAgICAgICAgKHZ0YWJsZS1y
ZXZlcnQtY29tbWFuZCkpCisgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUtYnVm
ZmVyIHRhYmxlKQorICAgICAgICAgICh2dGFibGUtZ290by10YWJsZSB0YWJsZSkKKyAgICAgICAg
ICAodnRhYmxlLXJldmVydC1jb21tYW5kKSkpCiAgICAgOzsgRmlyc3QgaW5zZXJ0IGludG8gdGhl
IG9iamVjdHMuCiAgICAgKGxldCAoKHBvcyAoaWYgbG9jYXRpb24KICAgICAgICAgICAgICAgICAg
ICAoaWYgKGludGVnZXJwIGxvY2F0aW9uKQpAQCAtMzk4LDU2ICs0MTYsNTcgQEAgdnRhYmxlLWlu
c2VydC1vYmplY3QKICAgICAgICAgICA7OyBPdGhlcndpc2UsIGFwcGVuZCB0aGUgb2JqZWN0Lgog
ICAgICAgICAgIChuY29uYyAodnRhYmxlLW9iamVjdHMgdGFibGUpIChsaXN0IG9iamVjdCkpKSkp
CiAgICAgOzsgVGhlbiBhZGp1c3QgdGhlIGNhY2hlIGFuZCBkaXNwbGF5LgotICAgIChzYXZlLWV4
Y3Vyc2lvbgotICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlKQotICAgICAgKGxldCogKChj
YWNoZSAodnRhYmxlLS1jdXJyZW50LWNhY2hlKSkKLSAgICAgICAgICAgICAoaW5oaWJpdC1yZWFk
LW9ubHkgdCkKLSAgICAgICAgICAgICAoa2V5bWFwIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQp
ICdrZXltYXApKQotICAgICAgICAgICAgIChlbGxpcHNpcyAoaWYgKHZ0YWJsZS1lbGxpcHNpcyB0
YWJsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wZXJ0aXplICh0cnVuY2F0ZS1z
dHJpbmctZWxsaXBzaXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAn
ZmFjZSAodnRhYmxlLWZhY2UgdGFibGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICIiKSkK
LSAgICAgICAgICAgICAoZWxsaXBzaXMtd2lkdGggKHN0cmluZy1waXhlbC13aWR0aCBlbGxpcHNp
cykpCi0gICAgICAgICAgICAgKGxpbmVzICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkKLSAg
ICAgICAgICAgICAoZWxlbSAoaWYgbG9jYXRpb24gIDsgVGhpcyBiaW5kaW5nIG1pcnJvcnMgdGhl
IGJpbmRpbmcgb2YgYHBvcycgYWJvdmUuCi0gICAgICAgICAgICAgICAgICAgICAgIChpZiAoaW50
ZWdlcnAgbG9jYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAobnRoIGxvY2F0aW9u
IGxpbmVzKQotICAgICAgICAgICAgICAgICAgICAgICAgIChvciAoYXNzcSBsb2NhdGlvbiBsaW5l
cykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBiZWZvcmUgKGNhciBsaW5lcykp
KSkKLSAgICAgICAgICAgICAgICAgICAgIChpZiBiZWZvcmUgKGNhciBsaW5lcykpKSkKLSAgICAg
ICAgICAgICAocG9zIChtZW1xIGVsZW0gbGluZXMpKQotICAgICAgICAgICAgIChsaW5lIChjb25z
IG9iamVjdCAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpKSkKLSAg
ICAgICAgKGlmIChvciBiZWZvcmUKLSAgICAgICAgICAgICAgICAoYW5kIHBvcyAoaW50ZWdlcnAg
bG9jYXRpb24pKSkKLSAgICAgICAgICAgIDs7IEFkZCB0aGUgbmV3IG9iamVjdCBiZWZvcmU6Lgot
ICAgICAgICAgICAgKGxldCAoKG9sZC1saW5lIChjYXIgcG9zKSkpCi0gICAgICAgICAgICAgIChz
ZXRjYXIgcG9zIGxpbmUpCi0gICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIG9sZC1saW5l
IChjZHIgcG9zKSkpCi0gICAgICAgICAgICAgICh1bmxlc3MgKHZ0YWJsZS1nb3RvLW9iamVjdCAo
Y2FyIGVsZW0pKQotICAgICAgICAgICAgICAgICh2dGFibGUtYmVnaW5uaW5nLW9mLXRhYmxlKSkp
Ci0gICAgICAgICAgOzsgT3RoZXJ3aXNlLCBhZGQgdGhlIG9iamVjdCBhZnRlci4KLSAgICAgICAg
ICAoaWYgcG9zCi0gICAgICAgICAgICAgIDs7IFNwbGljZSB0aGUgb2JqZWN0IGludG8gdGhlIGxp
c3QuCi0gICAgICAgICAgICAgIChwcm9nbgotICAgICAgICAgICAgICAgIChzZXRjZHIgcG9zIChj
b25zIGxpbmUgKGNkciBwb3MpKSkKLSAgICAgICAgICAgICAgICAoaWYgKHZ0YWJsZS1nb3RvLW9i
amVjdCBsb2NhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAxKSAgOyBJ
bnNlcnQgKmFmdGVyKi4KLSAgICAgICAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkp
Ci0gICAgICAgICAgICA7OyBPdGhlcndpc2UsIGFwcGVuZCB0aGUgb2JqZWN0LgotICAgICAgICAg
ICAgKHNldGNhciBjYWNoZSAobmNvbmMgbGluZXMgKGxpc3QgbGluZSkpKQotICAgICAgICAgICAg
KHZ0YWJsZS1lbmQtb2YtdGFibGUpKSkKLSAgICAgICAgKGxldCAoKHN0YXJ0IChwb2ludCkpKQot
ICAgICAgICAgIDs7IEZJWE1FOiBXZSBoYXZlIHRvIGFkanVzdCBjb2xvcnMgaW4gbGluZXMgYmVs
b3cgdGhpcyBpZiB3ZQotICAgICAgICAgIDs7IGhhdmUgOnJvdy1jb2xvcnMuCi0gICAgICAgICAg
KHZ0YWJsZS0taW5zZXJ0LWxpbmUgdGFibGUgbGluZSAwCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKHZ0YWJsZS0tY2FjaGUtd2lkdGhzIGNhY2hlKSAodnRhYmxlLS1zcGFjZXIgdGFi
bGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMgZWxsaXBzaXMtd2lk
dGgpCi0gICAgICAgICAgKGFkZC10ZXh0LXByb3BlcnRpZXMgc3RhcnQgKHBvaW50KSAobGlzdCAn
a2V5bWFwIGtleW1hcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgJ3Z0YWJsZSB0YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgJ3Z0YWJsZS1jYWNoZSBjYWNoZSkpKQotICAgICAgICA7OyBXZSBt
YXkgaGF2ZSBpbnNlcnRlZCBhIG5vbi1udW1lcmljYWwgdmFsdWUgaW50byBhIHByZXZpb3VzbHkK
LSAgICAgICAgOzsgYWxsLW51bWVyaWNhbCB0YWJsZSwgc28gcmVjb21wdXRlLgotICAgICAgICAo
dnRhYmxlLS1yZWNvbXB1dGUtbnVtZXJpY2FsIHRhYmxlIChjZHIgbGluZSkpKSkpKQorICAgICh3
aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKQorICAgICAgKHNhdmUtZXhj
dXJzaW9uCisgICAgICAgICh2dGFibGUtZ290by10YWJsZSB0YWJsZSkKKyAgICAgICAgKGxldCog
KChjYWNoZSAodnRhYmxlLS1jdXJyZW50LWNhY2hlKSkKKyAgICAgICAgICAgICAgIChpbmhpYml0
LXJlYWQtb25seSB0KQorICAgICAgICAgICAgICAgKGtleW1hcCAoZ2V0LXRleHQtcHJvcGVydHkg
KHBvaW50KSAna2V5bWFwKSkKKyAgICAgICAgICAgICAgIChlbGxpcHNpcyAoaWYgKHZ0YWJsZS1l
bGxpcHNpcyB0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnRpemUg
KHRydW5jYXRlLXN0cmluZy1lbGxpcHNpcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgJ2ZhY2UgKHZ0YWJsZS1mYWNlIHRhYmxlKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICIiKSkKKyAgICAgICAgICAgICAgIChlbGxpcHNpcy13aWR0aCAoc3RyaW5nLXBp
eGVsLXdpZHRoIGVsbGlwc2lzIChjdXJyZW50LWJ1ZmZlcikpKQorICAgICAgICAgICAgICAgKGxp
bmVzICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkKKyAgICAgICAgICAgICAgIChlbGVtIChp
ZiBsb2NhdGlvbiAgOyBUaGlzIGJpbmRpbmcgbWlycm9ycyB0aGUgYmluZGluZyBvZiBgcG9zJyBh
Ym92ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGludGVnZXJwIGxvY2F0aW9uKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnRoIGxvY2F0aW9uIGxpbmVzKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKG9yIChhc3NxIGxvY2F0aW9uIGxpbmVzKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChhbmQgYmVmb3JlIChjYXIgbGluZXMpKSkpCisgICAgICAg
ICAgICAgICAgICAgICAgIChpZiBiZWZvcmUgKGNhciBsaW5lcykpKSkKKyAgICAgICAgICAgICAg
IChwb3MgKG1lbXEgZWxlbSBsaW5lcykpCisgICAgICAgICAgICAgICAobGluZSAoY29ucyBvYmpl
Y3QgKHZ0YWJsZS0tY29tcHV0ZS1jYWNoZWQtbGluZSB0YWJsZSBvYmplY3QpKSkpCisgICAgICAg
ICAgKGlmIChvciBiZWZvcmUKKyAgICAgICAgICAgICAgICAgIChhbmQgcG9zIChpbnRlZ2VycCBs
b2NhdGlvbikpKQorICAgICAgICAgICAgICA7OyBBZGQgdGhlIG5ldyBvYmplY3QgYmVmb3JlOi4K
KyAgICAgICAgICAgICAgKGxldCAoKG9sZC1saW5lIChjYXIgcG9zKSkpCisgICAgICAgICAgICAg
ICAgKHNldGNhciBwb3MgbGluZSkKKyAgICAgICAgICAgICAgICAoc2V0Y2RyIHBvcyAoY29ucyBv
bGQtbGluZSAoY2RyIHBvcykpKQorICAgICAgICAgICAgICAgICh1bmxlc3MgKHZ0YWJsZS1nb3Rv
LW9iamVjdCAoY2FyIGVsZW0pKQorICAgICAgICAgICAgICAgICAgKHZ0YWJsZS1iZWdpbm5pbmct
b2YtdGFibGUpKSkKKyAgICAgICAgICAgIDs7IE90aGVyd2lzZSwgYWRkIHRoZSBvYmplY3QgYWZ0
ZXIuCisgICAgICAgICAgICAoaWYgcG9zCisgICAgICAgICAgICAgICAgOzsgU3BsaWNlIHRoZSBv
YmplY3QgaW50byB0aGUgbGlzdC4KKyAgICAgICAgICAgICAgICAocHJvZ24KKyAgICAgICAgICAg
ICAgICAgIChzZXRjZHIgcG9zIChjb25zIGxpbmUgKGNkciBwb3MpKSkKKyAgICAgICAgICAgICAg
ICAgIChpZiAodnRhYmxlLWdvdG8tb2JqZWN0IGxvY2F0aW9uKQorICAgICAgICAgICAgICAgICAg
ICAgIChmb3J3YXJkLWxpbmUgMSkgIDsgSW5zZXJ0ICphZnRlciouCisgICAgICAgICAgICAgICAg
ICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCisgICAgICAgICAgICAgIDs7IE90aGVyd2lzZSwg
YXBwZW5kIHRoZSBvYmplY3QuCisgICAgICAgICAgICAgIChzZXRjYXIgY2FjaGUgKG5jb25jIGxp
bmVzIChsaXN0IGxpbmUpKSkKKyAgICAgICAgICAgICAgKHZ0YWJsZS1lbmQtb2YtdGFibGUpKSkK
KyAgICAgICAgICAobGV0ICgoc3RhcnQgKHBvaW50KSkpCisgICAgICAgICAgICA7OyBGSVhNRTog
V2UgaGF2ZSB0byBhZGp1c3QgY29sb3JzIGluIGxpbmVzIGJlbG93IHRoaXMgaWYgd2UKKyAgICAg
ICAgICAgIDs7IGhhdmUgOnJvdy1jb2xvcnMuCisgICAgICAgICAgICAodnRhYmxlLS1pbnNlcnQt
bGluZSB0YWJsZSBsaW5lIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFi
bGUtLWNhY2hlLXdpZHRocyBjYWNoZSkgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMgZWxsaXBzaXMtd2lkdGgpCisgICAgICAg
ICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9pbnQpIChsaXN0ICdrZXltYXAga2V5
bWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICd2dGFibGUgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgJ3Z0YWJsZS1jYWNoZSBjYWNoZSkpKQorICAgICAgICAgIDs7IFdlIG1heSBo
YXZlIGluc2VydGVkIGEgbm9uLW51bWVyaWNhbCB2YWx1ZSBpbnRvIGEgcHJldmlvdXNseQorICAg
ICAgICAgIDs7IGFsbC1udW1lcmljYWwgdGFibGUsIHNvIHJlY29tcHV0ZS4KKyAgICAgICAgICAo
dnRhYmxlLS1yZWNvbXB1dGUtbnVtZXJpY2FsIHRhYmxlIChjZHIgbGluZSkpKSkpKSkKIAogKGRl
ZnVuIHZ0YWJsZS1jb2x1bW4gKHRhYmxlIGluZGV4KQogICAiUmV0dXJuIHRoZSBuYW1lIG9mIHRo
ZSBJTkRFWHRoIGNvbHVtbiBpbiBUQUJMRS4iCkBAIC01MjAsMTQgKzUzOSwxNCBAQCB2dGFibGUt
LWNhY2hlLXdpZHRocwogKGRlZnVuIHZ0YWJsZS0tY2FjaGUtbGluZXMgKGNhY2hlKQogICAoY2Fy
IGNhY2hlKSkKIAotKGRlZnVuIHZ0YWJsZS1pbnNlcnQgKHRhYmxlKQorKGRlZnVuIHZ0YWJsZS0t
aW5zZXJ0ICh0YWJsZSkKICAgKGxldCogKChzcGFjZXIgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKSkK
ICAgICAgICAgIChzdGFydCAocG9pbnQpKQogICAgICAgICAgKGVsbGlwc2lzIChpZiAodnRhYmxl
LWVsbGlwc2lzIHRhYmxlKQogICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAodHJ1
bmNhdGUtc3RyaW5nLWVsbGlwc2lzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAnZmFjZSAodnRhYmxlLWZhY2UgdGFibGUpKQogICAgICAgICAgICAgICAgICAgICAgIiIpKQot
ICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggZWxsaXBzaXMpKQor
ICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggZWxsaXBzaXMgKGN1
cnJlbnQtYnVmZmVyKSkpCiAgICAgICAgICA7OyBXZSBtYWludGFpbiBhIGNhY2hlIHBlciBzY3Jl
ZW4vd2luZG93IHdpZHRoLCBzbyB0aGF0IHdlIHJlbmRlcgogICAgICAgICAgOzsgY29ycmVjdGx5
IGlmIEVtYWNzIGlzIG9wZW4gb24gdHdvIGRpZmZlcmVudCBzY3JlZW5zIChvciB0aGUKICAgICAg
ICAgIDs7IHVzZXIgcmVzaXplcyB0aGUgZnJhbWUpLgpAQCAtNTY1LDkgKzU4NCwyNCBAQCB2dGFi
bGUtaW5zZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZS1jYWNoZSBj
YWNoZSkpCiAgICAgKGdvdG8tY2hhciBzdGFydCkpKQogCisoZGVmdW4gdnRhYmxlLWluc2VydCAo
dGFibGUpCisgICJJbnNlcnQgVEFCTEUgaW50byB0aGUgY3VycmVudCBidWZmZXIuCitUaGUgY3Vy
cmVudCBidWZmZXIgd2lsbCBiZSByZWNvcmRlZCBhcyBUQUJMRSdzIGJ1ZmZlci4gIElmIHRoaXMg
aXMgZG9uZQorbW9yZSB0aGFuIG9uY2UsIG9yIGlmIHRoZSB0YWJsZSBpcyBhdHRlbXB0ZWQgdG8g
YmUgaW5zZXJ0ZWQgbW9yZSB0aGFuCitvbmNlIGludG8gdGhlIHNhbWUgYnVmZmVyLCBzaWduYWwg
YW4gZXJyb3IuIgorICAoaWYtbGV0KiAoKHRhYmxlLWJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJs
ZSkpKQorICAgICAgKGlmIChlcSB0YWJsZS1idWZmZXIgKGN1cnJlbnQtYnVmZmVyKSkKKyAgICAg
ICAgICAoZXJyb3IgIkEgdnRhYmxlIGNhbm5vdCBiZSBpbnNlcnRlZCBtb3JlIHRoYW4gb25jZSBp
bnRvIGEgYnVmZmVyIikKKyAgICAgICAgKGVycm9yICJBIHZ0YWJsZSBjYW5ub3QgYmUgaW5zZXJ0
ZWQgaW50byBtb3JlIHRoYW4gb25lIGJ1ZmZlciIpKSkKKyAgKHZ0YWJsZS1zZXQtYnVmZmVyIChj
dXJyZW50LWJ1ZmZlcikgdGFibGUpCisgIChsZXQgKChpbmhpYml0LXJlYWQtb25seSB0KQorICAg
ICAgICAoaW5oaWJpdC1tb2RpZmljYXRpb24taG9va3MgdCkpCisgICAgKHZ0YWJsZS0taW5zZXJ0
IHRhYmxlKSkpCisKIChkZWZ1biB2dGFibGUtLWluc2VydC1saW5lICh0YWJsZSBsaW5lIGxpbmUt
bnVtYmVyIHdpZHRocyBzcGFjZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAm
b3B0aW9uYWwgZWxsaXBzaXMgZWxsaXBzaXMtd2lkdGgpCiAgIChsZXQgKChzdGFydCAocG9pbnQp
KQorICAgICAgICAoYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKSkKICAgICAgICAgKGNvbHVt
bnMgKHZ0YWJsZS1jb2x1bW5zIHRhYmxlKSkKICAgICAgICAgKGNvbHVtbi1jb2xvcnMKICAgICAg
ICAgIChhbmQgKHZ0YWJsZS1jb2x1bW4tY29sb3JzIHRhYmxlKQpAQCAtNjA3LDE2ICs2NDEsMTgg
QEAgdnRhYmxlLS1pbnNlcnQtbGluZQogICAgICAgICAgICAgICAgICAgICAgIChjb25jYXQKICAg
ICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tbGltaXQtc3RyaW5nCiAgICAgICAgICAgICAg
ICAgICAgICAgICBwcmUtY29tcHV0ZWQgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yIGVsbGlwc2lzLXdpZHRoIDApKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgZWxsaXBzaXMtd2lkdGgg
MCkpCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpCiAgICAgICAgICAgICAgICAgICAg
ICAgIGVsbGlwc2lzKQogICAgICAgICAgICAgICAgICAgICBwcmUtY29tcHV0ZWQpKQogICAgICAg
ICAgICAgICAgICA7OyBSZWNvbXB1dGUgd2lkdGhzLgogICAgICAgICAgICAgICAgICAodAotICAg
ICAgICAgICAgICAgICAgKGlmICg+IChzdHJpbmctcGl4ZWwtd2lkdGggdmFsdWUpIChlbHQgd2lk
dGhzIGluZGV4KSkKKyAgICAgICAgICAgICAgICAgIChpZiAoPiAoc3RyaW5nLXBpeGVsLXdpZHRo
IHZhbHVlIGJ1ZmZlcikgKGVsdCB3aWR0aHMgaW5kZXgpKQogICAgICAgICAgICAgICAgICAgICAg
IChjb25jYXQKICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tbGltaXQtc3RyaW5nCiAg
ICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAoLSAoZWx0IHdpZHRocyBpbmRleCkKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciBlbGxpcHNpcy13aWR0aCAwKSkpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgZWxsaXBzaXMtd2lkdGggMCkpCisgICAg
ICAgICAgICAgICAgICAgICAgICBidWZmZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsbGlw
c2lzKQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpKSkKICAgICAgICAgICAgICAgIChzdGFy
dCAocG9pbnQpKQpAQCAtNjMwLDE0ICs2NjYsMTUgQEAgdnRhYmxlLS1pbnNlcnQtbGluZQogICAg
ICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAnc3BhY2UKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgOndpZHRoIChsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKCsgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1waXhlbC13aWR0aCBkaXNwbGF5ZWQpKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctcGl4
ZWwtd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZGlzcGxheWVkIGJ1ZmZlcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKGlmIGxhc3QgMCBzcGFjZXIpKSkpKSkpCiAgICAgICAgICAgICAgOzsgQWxpZ24gdG8g
dGhlIHJpZ2h0LgogICAgICAgICAgICAgIChpbnNlcnQgKHByb3BlcnRpemUgIiAiICdkaXNwbGF5
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAnc3BhY2UKICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3aWR0aCAobGlzdCAoLSAoZWx0IHdpZHRo
cyBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoc3RyaW5nLXBpeGVsLXdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZCkpKSkpCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZCBidWZm
ZXIpKSkpKQogICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkKQogICAgICAgICAgICAgICh1
bmxlc3MgbGFzdAogICAgICAgICAgICAgICAgKGluc2VydCAocHJvcGVydGl6ZSAiICIgJ2Rpc3Bs
YXkKQEAgLTcxOCw2ICs3NTUsNyBAQCB2dGFibGUtLWluZGljYXRvcgogKGRlZnVuIHZ0YWJsZS0t
aW5zZXJ0LWhlYWRlci1saW5lICh0YWJsZSB3aWR0aHMgc3BhY2VyKQogICA7OyBJbnNlcnQgdGhl
IGhlYWRlciBkaXJlY3RseSBpbnRvIHRoZSBidWZmZXIuCiAgIChsZXQgKChzdGFydCAocG9pbnQp
KQorICAgICAgICAoYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKSkKICAgICAgICAgKGRpdmlk
ZXIgKHZ0YWJsZS1kaXZpZGVyIHRhYmxlKSkKICAgICAgICAgKGNtYXAgKGRlZmluZS1rZXltYXAK
ICAgICAgICAgICAgICAgICAiPGhlYWRlci1saW5lPiA8ZHJhZy1tb3VzZS0xPiIgIyd2dGFibGUt
LWRyYWctcmVzaXplLWNvbHVtbgpAQCAtNzM3LDE0ICs3NzUsMTUgQEAgdnRhYmxlLS1pbnNlcnQt
aGVhZGVyLWxpbmUKICAgICAgICAgICAgICAgICAgICAgICdrZXltYXAgY21hcCkpCiAgICAgICAg
ICAgICAgIChzdGFydCAocG9pbnQpKQogICAgICAgICAgICAgICAoaW5kaWNhdG9yICh2dGFibGUt
LWluZGljYXRvciB0YWJsZSBpbmRleCkpCi0gICAgICAgICAgICAgIChpbmRpY2F0b3Itd2lkdGgg
KHN0cmluZy1waXhlbC13aWR0aCBpbmRpY2F0b3IpKQorICAgICAgICAgICAgICAoaW5kaWNhdG9y
LXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggaW5kaWNhdG9yIGJ1ZmZlcikpCiAgICAgICAgICAg
ICAgIChsYXN0ICg9IGluZGV4ICgxLSAobGVuZ3RoICh2dGFibGUtY29sdW1ucyB0YWJsZSkpKSkp
CiAgICAgICAgICAgICAgIGRpc3BsYXllZCkKICAgICAgICAgIChzZXRxIGRpc3BsYXllZAotICAg
ICAgICAgICAgICAgKGlmICg+IChzdHJpbmctcGl4ZWwtd2lkdGggbmFtZSkKKyAgICAgICAgICAg
ICAgIChpZiAoPiAoc3RyaW5nLXBpeGVsLXdpZHRoIG5hbWUgYnVmZmVyKQogICAgICAgICAgICAg
ICAgICAgICAgICgtIChlbHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgpKQogICAgICAg
ICAgICAgICAgICAgICh2dGFibGUtLWxpbWl0LXN0cmluZwotICAgICAgICAgICAgICAgICAgICBu
YW1lICgtIChlbHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgpKQorICAgICAgICAgICAg
ICAgICAgICBuYW1lICgtIChlbHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgpCisgICAg
ICAgICAgICAgICAgICAgIGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgbmFtZSkpCiAgICAgICAg
ICAobGV0KiAoKGluZGljYXRvci1sZWFkLXdpZHRoCiAgICAgICAgICAgICAgICAgIDs7IFdlIHdh
bnQgdGhlIGluZGljYXRvciB0byBub3QgYmUgcXVpdGUgZmx1c2ggcmlnaHQuCkBAIC03NTMsNyAr
NzkyLDcgQEAgdnRhYmxlLS1pbnNlcnQtaGVhZGVyLWxpbmUKICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3ItbGVhZC13aWR0aCkpCiAgICAgICAgICAgICAg
ICAgKGZpbGwtd2lkdGgKICAgICAgICAgICAgICAgICAgKCsgKC0gKGVsdCB3aWR0aHMgaW5kZXgp
Ci0gICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctcGl4ZWwtd2lkdGggZGlzcGxheWVkKQor
ICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLXBpeGVsLXdpZHRoIGRpc3BsYXllZCBidWZm
ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvci13aWR0aAogICAgICAgICAgICAg
ICAgICAgICAgICBpbmRpY2F0b3ItbGVhZC13aWR0aCkKICAgICAgICAgICAgICAgICAgICAgKGlm
IGxhc3QgMCBzcGFjZXIpKSkpCkBAIC03NzEsNyArODEwLDggQEAgdnRhYmxlLS1pbnNlcnQtaGVh
ZGVyLWxpbmUKICAgICAgICAgICAgICA7OyBUaGlzIGlzIHRoZSBmaW5hbCBjb2x1bW4sIGFuZCB3
ZSBoYXZlIGEgc29ydGluZwogICAgICAgICAgICAgIDs7IGluZGljYXRvciwgYW5kIHRoZSB0YWJs
ZSBpcyB0b28gd2lkZSBmb3IgdGhlIHdpbmRvdy4KICAgICAgICAgICAgICAobGV0KiAoKHByZS1p
bmRpY2F0b3IgKHN0cmluZy1waXhlbC13aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50LW1pbikgKHBvaW50KSkpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50LW1p
bikgKHBvaW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikp
CiAgICAgICAgICAgICAgICAgICAgIChwcmUtZmlsbAogICAgICAgICAgICAgICAgICAgICAgKC0g
KHdpbmRvdy13aWR0aCBuaWwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1pbmRpY2F0
b3IKQEAgLTg1MCwxNCArODkwLDE2IEBAIHZ0YWJsZS0tc2V0LWhlYWRlci1saW5lCiAgICAgICAg
ICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludC1taW4pICgxLSAocG9pbnQtbWF4KSkpKSkpCiAg
ICh2dGFibGUtaGVhZGVyLW1vZGUgMSkpCiAKLShkZWZ1biB2dGFibGUtLWxpbWl0LXN0cmluZyAo
c3RyaW5nIHBpeGVscykKKworKGRlZnVuIHZ0YWJsZS0tbGltaXQtc3RyaW5nIChzdHJpbmcgcGl4
ZWxzIGJ1ZmZlcikKICAgKHdoaWxlIChhbmQgKGxlbmd0aD4gc3RyaW5nIDApCi0gICAgICAgICAg
ICAgICg+IChzdHJpbmctcGl4ZWwtd2lkdGggc3RyaW5nKSBwaXhlbHMpKQorICAgICAgICAgICAg
ICAoPiAoc3RyaW5nLXBpeGVsLXdpZHRoIHN0cmluZyBidWZmZXIpIHBpeGVscykpCiAgICAgKHNl
dHEgc3RyaW5nIChzdWJzdHJpbmcgc3RyaW5nIDAgKDEtIChsZW5ndGggc3RyaW5nKSkpKSkKICAg
c3RyaW5nKQogCiAoZGVmdW4gdnRhYmxlLS1jaGFyLXdpZHRoICh0YWJsZSkKLSAgKHN0cmluZy1w
aXhlbC13aWR0aCAocHJvcGVydGl6ZSAieCIgJ2ZhY2UgKHZ0YWJsZS1mYWNlIHRhYmxlKSkpKQor
ICAoc3RyaW5nLXBpeGVsLXdpZHRoIChwcm9wZXJ0aXplICJ4IiAnZmFjZSAodnRhYmxlLWZhY2Ug
dGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtYnVmZmVyIHRhYmxlKSkpCiAK
IChkZWZ1biB2dGFibGUtLWNvbXB1dGUtd2lkdGggKHRhYmxlIHNwZWMpCiAgIChjb25kCkBAIC05
NjcsMjAgKzEwMDksMjEgQEAgdnRhYmxlLS1tYWtlLWtleW1hcAogICAgICAgICAgICh2dGFibGUt
a2V5bWFwIHRhYmxlKSkKICAgICAgIG1hcCkpKQogCi0oZGVmdW4gdnRhYmxlLXJldmVydCAoKQot
ICAiUmVnZW5lcmF0ZSB0aGUgdGFibGUgdW5kZXIgcG9pbnQuIgotICAobGV0ICgodGFibGUgKHZ0
YWJsZS1jdXJyZW50LXRhYmxlKSkKLSAgICAgICAgKG9iamVjdCAodnRhYmxlLWN1cnJlbnQtb2Jq
ZWN0KSkKLSAgICAgICAgKGNvbHVtbiAodnRhYmxlLWN1cnJlbnQtY29sdW1uKSkKLSAgICAgICAg
KGluaGliaXQtcmVhZC1vbmx5IHQpKQotICAgICh1bmxlc3MgdGFibGUKLSAgICAgICh1c2VyLWVy
cm9yICJObyB0YWJsZSB1bmRlciBwb2ludCIpKQotICAgIChkZWxldGUtcmVnaW9uICh2dGFibGUt
YmVnaW5uaW5nLW9mLXRhYmxlKSAodnRhYmxlLWVuZC1vZi10YWJsZSkpCi0gICAgKHZ0YWJsZS1p
bnNlcnQgdGFibGUpCi0gICAgKHdoZW4gb2JqZWN0Ci0gICAgICAodnRhYmxlLWdvdG8tb2JqZWN0
IG9iamVjdCkpCi0gICAgKHdoZW4gY29sdW1uCi0gICAgICAodnRhYmxlLWdvdG8tY29sdW1uIGNv
bHVtbikpKSkKKyhkZWZ1biB2dGFibGUtcmV2ZXJ0ICgmb3B0aW9uYWwgdGFibGUpCisgICJSZWdl
bmVyYXRlIFRBQkxFLCBkZWZhdWx0aW5nIHRvIHRoZSB0YWJsZSB1bmRlciBwb2ludC4iCisgIChz
ZXRxIHRhYmxlIChvciB0YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKSkKKyAgKHVubGVzcyB0
YWJsZQorICAgICh1c2VyLWVycm9yICJObyB0YWJsZSB1bmRlciBwb2ludCIpKQorICAod2l0aC1j
dXJyZW50LWJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0YWJsZSkKKyAgICAobGV0ICgob2JqZWN0ICh2
dGFibGUtY3VycmVudC1vYmplY3QpKQorICAgICAgICAgIChjb2x1bW4gKHZ0YWJsZS1jdXJyZW50
LWNvbHVtbikpCisgICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQpKQorICAgICAgKGRlbGV0
ZS1yZWdpb24gKHZ0YWJsZS1iZWdpbm5pbmctb2YtdGFibGUpICh2dGFibGUtZW5kLW9mLXRhYmxl
KSkKKyAgICAgICh2dGFibGUtLWluc2VydCB0YWJsZSkKKyAgICAgICh3aGVuIG9iamVjdAorICAg
ICAgICAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVjdCkpCisgICAgICAod2hlbiBjb2x1bW4KKyAg
ICAgICAgKHZ0YWJsZS1nb3RvLWNvbHVtbiBjb2x1bW4pKSkpKQogCiA7OzsgQ29tbWFuZHMuCiAK
QEAgLTEwMTMsNyArMTA1Niw3IEBAIHZ0YWJsZS0tYWx0ZXItY29sdW1uLXdpZHRoCiAgICAgOzsg
U3RvcmUgdGhlIHdpZHRoIHNvIGl0J2xsIGJlIHJlc3BlY3RlZCBvbiBhIHJldmVydC4KICAgICAo
c2V0ZiAodnRhYmxlLWNvbHVtbi13aWR0aCAoZWx0ICh2dGFibGUtY29sdW1ucyB0YWJsZSkgY29s
dW1uKSkKICAgICAgICAgICAoZm9ybWF0ICIlZHB4IiAoYXJlZiB3aWR0aHMgY29sdW1uKSkpCi0g
ICAgKHZ0YWJsZS1yZXZlcnQpKSkKKyAgICAodnRhYmxlLXJldmVydCB0YWJsZSkpKQogCiAoZGVm
dW4gdnRhYmxlLXdpZGVuLWN1cnJlbnQtY29sdW1uICgmb3B0aW9uYWwgbikKICAgIldpZGVuIHRo
ZSBjdXJyZW50IGNvbHVtbiBieSBOIGNoYXJhY3RlcnMuCkBAIC0xMDM4LDE0ICsxMDgxLDE2IEBA
IHZ0YWJsZS1uZXh0LWNvbHVtbgogICAgICAobWluICgxLSAobGVuZ3RoICh2dGFibGUtLWNhY2hl
LXdpZHRocyAodnRhYmxlLS1jdXJyZW50LWNhY2hlKSkpKQogICAgICAgICAgICgxKyAodnRhYmxl
LWN1cnJlbnQtY29sdW1uKSkpKSkpCiAKLShkZWZ1biB2dGFibGUtcmV2ZXJ0LWNvbW1hbmQgKCkK
KyhkZWZ1biB2dGFibGUtcmV2ZXJ0LWNvbW1hbmQgKCZvcHRpb25hbCB0YWJsZSkKICAgIlJlLXF1
ZXJ5IGRhdGEgYW5kIHJlZ2VuZXJhdGUgdGhlIHRhYmxlIHVuZGVyIHBvaW50LiIKICAgKGludGVy
YWN0aXZlKQotICAobGV0ICgodGFibGUgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpCi0gICAgKHdo
ZW4gKHZ0YWJsZS1vYmplY3RzLWZ1bmN0aW9uIHRhYmxlKQotICAgICAgKHNldGYgKHZ0YWJsZS1v
YmplY3RzIHRhYmxlKSAoZnVuY2FsbCAodnRhYmxlLW9iamVjdHMtZnVuY3Rpb24gdGFibGUpKSkp
Ci0gICAgKHZ0YWJsZS0tY2xlYXItY2FjaGUgdGFibGUpKQotICAodnRhYmxlLXJldmVydCkpCisg
IChzZXRxIHRhYmxlIChvciB0YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKSkKKyAgKHVubGVz
cyB0YWJsZQorICAgICh1c2VyLWVycm9yICJObyB0YWJsZSBmb3VuZCIpKQorICAod2hlbiAodnRh
YmxlLW9iamVjdHMtZnVuY3Rpb24gdGFibGUpCisgICAgKHNldGYgKHZ0YWJsZS1vYmplY3RzIHRh
YmxlKSAoZnVuY2FsbCAodnRhYmxlLW9iamVjdHMtZnVuY3Rpb24gdGFibGUpKSkpCisgICh2dGFi
bGUtLWNsZWFyLWNhY2hlIHRhYmxlKQorICAodnRhYmxlLXJldmVydCB0YWJsZSkpCiAKIChkZWZ1
biB2dGFibGUtc29ydC1ieS1jdXJyZW50LWNvbHVtbiAoKQogICAiU29ydCB0aGUgdGFibGUgdW5k
ZXIgcG9pbnQgYnkgdGhlIGNvbHVtbiB1bmRlciBwb2ludC4iCkBAIC0xMDY3LDggKzExMTIsOCBA
QCB2dGFibGUtc29ydC1ieS1jdXJyZW50LWNvbHVtbgogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChpZiAoZXEgKGNkciBsYXN0KSAnYXNjZW5kKQogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAnZGVzY2VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgJ2FzY2VuZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzY2Vu
ZCkpKSkpKQotICAodnRhYmxlLXJldmVydCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICdhc2NlbmQpKSkpKQorICAgICh2dGFibGUtcmV2ZXJ0IHRhYmxlKSkpCiAKIChkZWZ1biB2
dGFibGUtaGVhZGVyLWxpbmUtc29ydCAoZSkKICAgIlNvcnQgYSB2dGFibGUgZnJvbSB0aGUgaGVh
ZGVyIGxpbmUuIgpkaWZmIC0tZ2l0IGEvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3Rz
LmVsIGIvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsCmluZGV4IDc0ZmI4Y2M4
MTM5Li44M2Y4MjZlYTM1MyAxMDA2NDQKLS0tIGEvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxl
LXRlc3RzLmVsCisrKyBiL3Rlc3QvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS10ZXN0cy5lbApAQCAt
MjcsMTYgKzI3LDE5IEBACiAocmVxdWlyZSAnZXJ0KQogKHJlcXVpcmUgJ2VydC14KQogCi0oZXJ0
LWRlZnRlc3QgdGVzdC12c3RhYmxlLWNvbXB1dGUtY29sdW1ucyAoKQorKGRlZnVuIHZ0YWJsZS10
ZXN0cy0tbWFrZS1uby1oZWFkZXItMi1vYmplY3QtdGFibGUgKCkKKyAgKG1ha2UtdnRhYmxlIDpj
b2x1bW5zICcoImEiICJiIiAiYyIpCisgICAgICAgICAgICAgICA6b2JqZWN0cyAnKCgiZm9vIiAx
IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICgiYmFyIiAzIDp6b3QpKQorICAgICAgICAg
ICAgICAgOmluc2VydCBuaWwpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtY29tcHV0ZS1j
b2x1bW5zICgpCiAgIChzaG91bGQKICAgIChlcXVhbCAobWFwY2FyCiAgICAgICAgICAgIChsYW1i
ZGEgKGNvbHVtbikKICAgICAgICAgICAgICAodnRhYmxlLWNvbHVtbi1hbGlnbiBjb2x1bW4pKQog
ICAgICAgICAgICAodnRhYmxlLS1jb21wdXRlLWNvbHVtbnMKLSAgICAgICAgICAgIChtYWtlLXZ0
YWJsZSA6Y29sdW1ucyAnKCJhIiAiYiIgImMiKQotICAgICAgICAgICAgICAgICAgICAgICAgIDpv
YmplY3RzICcoKCJmb28iIDEgMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICgiYmFyIiAzIDp6b3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgIDppbnNlcnQgbmlsKSkp
CisgICAgICAgICAgICAodnRhYmxlLXRlc3RzLS1tYWtlLW5vLWhlYWRlci0yLW9iamVjdC10YWJs
ZSkpKQogICAgICAgICAgICcobGVmdCByaWdodCBsZWZ0KSkpKQogCiAoZXJ0LWRlZnRlc3QgdGVz
dC12dGFibGUtaW5zZXJ0LW9iamVjdCAoKQpAQCAtNjksNCArNzIsNjkgQEAgdGVzdC12dGFibGUt
aW5zZXJ0LW9iamVjdAogICAgICAgICAgICAgICAobWFwY2FyICMnY2FkciAodnRhYmxlLW9iamVj
dHMgdGFibGUpKSkpCiAgICAgICAgICAgKG51bWJlci1zZXF1ZW5jZSAwIDExKSkpKQogCisoZXJ0
LWRlZnRlc3QgdGVzdC12dGFibGUtdW5pcXVlLWJ1ZmZlciAoKQorICAobGV0ICgodGFibGUgKHZ0
YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFkZXItMi1vYmplY3QtdGFibGUpKSkKKyAgICAod2l0aC10
ZW1wLWJ1ZmZlcgorICAgICAgKHZ0YWJsZS1pbnNlcnQgdGFibGUpCisgICAgICA7OyBUaGlzIHdp
bGwgcnVuIGJ1dCBmYWlsIG9uIEVtYWNzIHByZSAzMSB2dGFibGUuCisgICAgICAoc2hvdWxkLWVy
cm9yICh2dGFibGUtaW5zZXJ0IHRhYmxlKSkKKyAgICAgIDs7IFRoaXMgd2lsbCBydW4gb25seSBv
biBFbWFjcyAzMSsgdnRhYmxlLgorICAgICAgKHdoZW4gKD4gZW1hY3MtbWFqb3ItdmVyc2lvbiAz
MCkKKyAgICAgICAgKHNob3VsZC1lcnJvciAodnRhYmxlLXNldC1idWZmZXIgdGFibGUgKGN1cnJl
bnQtYnVmZmVyKSkpKSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtbm9uLWN1cnJlbnQt
YnVmZmVyLWluc2VydC1vYmplY3QgKCkKKyAgKGxldCAoKHRhYmxlICh2dGFibGUtdGVzdHMtLW1h
a2Utbm8taGVhZGVyLTItb2JqZWN0LXRhYmxlKSkKKyAgICAgICAgKG9iaiAnKCJiYXoiIDQgNSkp
KQorICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAodnRhYmxlLWluc2VydCB0YWJsZSkKKyAg
ICAgIChzaG91bGQgKD0gKGNvdW50LWxpbmVzIChwb2ludC1taW4pIChwb2ludC1tYXgpKSAyKSkK
KyAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAgICh2dGFibGUtaW5zZXJ0LW9iamVjdCB0
YWJsZSBvYmopKQorICAgICAgKHNob3VsZCAoPSAoY291bnQtbGluZXMgKHBvaW50LW1pbikgKHBv
aW50LW1heCkpIDMpKSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtbm9uLWN1cnJlbnQt
YnVmZmVyLXJlbW92ZS1vYmplY3QgKCkKKyAgKGxldCAoKHRhYmxlICh2dGFibGUtdGVzdHMtLW1h
a2Utbm8taGVhZGVyLTItb2JqZWN0LXRhYmxlKSkKKyAgICAgICAgKG9iaiAnKCJiYXoiIDQgNSkp
KQorICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAodnRhYmxlLWluc2VydCB0YWJsZSkKKyAg
ICAgICh2dGFibGUtaW5zZXJ0LW9iamVjdCB0YWJsZSBvYmopCisgICAgICAoc2hvdWxkICg9IChj
b3VudC1saW5lcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkgMykpCisgICAgICAod2l0aC10ZW1w
LWJ1ZmZlcgorICAgICAgICAodnRhYmxlLXJlbW92ZS1vYmplY3QgdGFibGUgb2JqKSkKKyAgICAg
IChzaG91bGQgKD0gKGNvdW50LWxpbmVzIChwb2ludC1taW4pIChwb2ludC1tYXgpKSAyKSkpKSkK
KworKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLW5vbi1jdXJyZW50LWJ1ZmZlci11cGRhdGUtb2Jq
ZWN0ICgpCisgIChsZXQgKCh0YWJsZSAodnRhYmxlLXRlc3RzLS1tYWtlLW5vLWhlYWRlci0yLW9i
amVjdC10YWJsZSkpCisgICAgICAgIChvYmogJygiYmF6IiA0IDUpKQorICAgICAgICAob2JqLTIg
JygicXV4IiA2IDcpKSkKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgKHZ0YWJsZS1pbnNl
cnQgdGFibGUpCisgICAgICAodnRhYmxlLWluc2VydC1vYmplY3QgdGFibGUgb2JqKQorICAgICAg
KHNob3VsZCAoPSAoY291bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpIDMpKQorICAg
ICAgKGxldCAoKGxpbmUtMiAocHJvZ24KKyAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFy
IChwb2ludC1taW4pKQorICAgICAgICAgICAgICAgICAgICAgIChmb3J3YXJkLWxpbmUgMikKKyAg
ICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpIChwb2ludC1tYXgp
KSkpKQorICAgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgICAgICh2dGFibGUtdXBkYXRl
LW9iamVjdCB0YWJsZSBvYmotMiBvYmopKQorICAgICAgICAobGV0ICgobGluZS0yLW5ldyAocHJv
Z24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3J3YXJkLWxpbmUgMikKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpIChwb2ludC1tYXgpKSkp
KQorICAgICAgICAgIChzaG91bGQgKD0gKGNvdW50LWxpbmVzIChwb2ludC1taW4pIChwb2ludC1t
YXgpKSAzKSkKKyAgICAgICAgICAoc2hvdWxkIChub3QgKHN0cmluZz0gbGluZS0yIGxpbmUtMi1u
ZXcpKSkpKSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtLWxpbWl0LXN0cmluZy13aXRo
LWZhY2UtcmVtYXBwZWQtYnVmZmVyICgpCisgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgKGxldCAo
KHRleHQgKHByb3BlcnRpemUgIlhYWFhYIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdm
YWNlICd2YXJpYWJsZS1waXRjaCkpKQorICAgICAgKGZhY2UtcmVtYXAtYWRkLXJlbGF0aXZlICdk
ZWZhdWx0IDpoZWlnaHQgMS41KQorICAgICAgKGlmICg+IGVtYWNzLW1ham9yLXZlcnNpb24gMzAp
CisgICAgICAgICAgKHNob3VsZCAoZXEKKyAgICAgICAgICAgICAgICAgICAyCisgICAgICAgICAg
ICAgICAgICAgKGxlbmd0aCAodnRhYmxlLS1saW1pdC1zdHJpbmcgdGV4dCA1MCAoY3VycmVudC1i
dWZmZXIpKSkpKQorICAgICAgICAoc2hvdWxkIChlcQorICAgICAgICAgICAgICAgICAyCisgICAg
ICAgICAgICAgICAgIChsZW5ndGggKHZ0YWJsZS0tbGltaXQtc3RyaW5nIHRleHQgNTApKSkpKSkp
KQorCiA7OzsgdnRhYmxlLXRlc3RzLmVsIGVuZHMgaGVyZQotLSAKMi40Ny4xCgo=
--00000000000039c8e10645a0693e--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 10 Dec 2025 18:55:07 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 10 13:55:07 2025
Received: from localhost ([127.0.0.1]:36036 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vTPL7-0008RC-C9
	for submit <at> debbugs.gnu.org; Wed, 10 Dec 2025 13:55:07 -0500
Received: from mxout5.mail.janestreet.com ([64.215.233.18]:46563)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <sbaugh@HIDDEN>)
 id 1vTPL3-0008QT-PC
 for 79982 <at> debbugs.gnu.org; Wed, 10 Dec 2025 13:55:03 -0500
From: Spencer Baugh <sbaugh@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot, [PATCH] Add vtable
 buffer slot
In-Reply-To: <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
 (=?utf-8?Q?=22St=C3=A9phane?= Marks"'s message of "Wed, 10 Dec 2025
 12:50:38 -0500")
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
 <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
Date: Wed, 10 Dec 2025 13:54:56 -0500
Message-ID: <ierikeerwu7.fsf_-_@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com;
 s=waixah; t=1765392896;
 bh=gWA9wbOYuNGMklp9CHszzaEMgjwZPwy2loweAJcFivc=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date;
 b=VWwoD9N3EUz6txe+Dye/HE7Tk9TkOpU4AZ5Aj5mReInHAMpqUiW/NnFMsUIH//LvO
 js7f/fhsl2hEdjtQWxSwiCHVKFVGjnWyF0VbIrlpkkwVAQ5GirqRo4I8KuDLI7DScO
 HlaXrmFB845d7E1op6Yd1BENkMazq96j67zkg/8fRTLmjDGjIfabdimzPltruX5Yir
 ylFYoM2ZHM2xtABcvjDiNJh1eQREqEPU4Wj0t6GXQ3DFBg0pLk+rvp3pDeOgl+7sNS
 qdAQbz/aUXMthoZkUDUC2xNCrhgBQA7/hOd3hI0vf27nDqGk9OjmJbGRWH2tSha+8P
 PdUByd7TYO7MQ==
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

St=C3=A9phane Marks <shipmints@HIDDEN> writes:

> On Wed, Dec 10, 2025 at 10:12=E2=80=AFAM Spencer Baugh <sbaugh@janestreet=
.com> wrote:
>  Please add a test which passes with this patch and doesn't pass without
>  this patch.
>
> Try the new tests in this updated patch.

Thanks, these tests look good, this will help a lot.

> From 6e33b8cbf2063e1e7689f231bb0c6c6450520bd3 Mon Sep 17 00:00:00 2001
> From: =3D?UTF-8?q?St=3DC3=3DA9phane=3D20Marks?=3D <shipmints@HIDDEN>
> Date: Wed, 10 Dec 2025 09:20:02 -0500
> Subject: [PATCH] Add vtable buffer slot
>
> This solves for background vtable mutations, i.e., updates
> initiated from buffers other than the vtable buffer, and for
> buffer-adjusted string-pixel-width computations.
>
> * lisp/emacs-lisp/vtable.el (vtable): New '-buffer' slot.
> (vtable-buffer):
> (vtable-set-buffer): New function.
> (vtable-update-object):
> (vtable-remove-object):
> (vtable-insert-object): Wrap operation with the vtable buffer.
> (vtable--insert): Split from old 'vtable-insert'.
> (vtable-insert): Insert table and record the buffer.
> (vtable--insert-line):
> (vtable--insert-header-line): Use 'vtable-buffer' for pixel-width computa=
tion.
> (vtable--limit-string):
> (vtable--char-width): Pass buffer to 'string-pixel-width'.
> (vtable-revert): New optional table argument.
> (vtable--alter-column-width):
> (vtable-revert-command):
> (vtable-sort-by-current-column): Call 'vtable-revert' with the table.
>
> * test/lisp/emacs-lisp/vtable-tests.el
> (vtable-tests--make-no-header-2-object-table): New helper
> function.
> (test-vstable-compute-columns): Correct typo in test name.  Use
> new helper function.
> (test-vtable-unique-buffer)
> (test-vtable-non-current-buffer-insert-object)
> (test-vtable-non-current-buffer-remove-object)
> (test-vtable-non-current-buffer-update-object)
> (test-vtable--limit-string-with-face-remapped-buffer): New test.
> ---
>  lisp/emacs-lisp/vtable.el            | 389 +++++++++++++++------------
>  test/lisp/emacs-lisp/vtable-tests.el |  78 +++++-
>  2 files changed, 291 insertions(+), 176 deletions(-)
>
> diff --git a/lisp/emacs-lisp/vtable.el b/lisp/emacs-lisp/vtable.el
> index bcdd280fb92..fe4bae01077 100644
> --- a/lisp/emacs-lisp/vtable.el
> +++ b/lisp/emacs-lisp/vtable.el
> @@ -68,6 +68,7 @@ vtable
>     (column-colors :initarg :column-colors :accessor vtable-column-colors)
>     (row-colors :initarg :row-colors :accessor vtable-row-colors)
>     (-cached-colors :initform nil)
> +   (-buffer :initform nil)
>     (-cache :initform (make-hash-table :test #'equal))
>     (-cached-keymap :initform nil)
>     (-has-column-spec :initform nil))
> @@ -221,6 +222,20 @@ vtable--face-color
>=20=20
>  ;;; Interface utility functions.
>=20=20
> +(defun vtable-buffer (&optional table)
> +  "Return the buffer associated with TABLE.
> +If TABLE is nil, use the table under point.  Return nil if the table has
> +not been inserted into a buffer."
> +  (slot-value (or table (vtable-current-table))
> +              '-buffer))
> +
> +(defun vtable-set-buffer (buffer &optional table)
> +  "Associate BUFFER with TABLE.
> +If TABLE is nil, use the table under point."
> +  (setf (slot-value (or table (vtable-current-table))
> +                    '-buffer)
> +        buffer))
> +
>  (defun vtable-current-table ()
>    "Return the table under point."
>    (get-text-property (point) 'vtable))
> @@ -285,63 +300,65 @@ vtable-update-object
>  compared with `equal'), signal an error.
>=20=20
>  TABLE must be at point in the current buffer."
> -  (unless old-object
> -    (setq old-object object))
> -  (let* ((objects (vtable-objects table))
> -         (inhibit-read-only t))
> -    ;; First replace the object in the object storage.
> -    (if (eq old-object (car objects))
> -        ;; It's at the head, so replace it there.
> -        (setf (vtable-objects table)
> -              (cons object (cdr objects)))
> -      ;; Otherwise splice into the list.
> -      (while (and (cdr objects)
> -                  (not (eq (cadr objects) old-object)))
> -        (setq objects (cdr objects)))
> -      (unless (cdr objects)
> -        (error "Can't find the old object"))
> -      (setcar (cdr objects) object))
> -    ;; Then update the rendered vtable in the current buffer.
> -    (if-let* ((cache (vtable--current-cache))
> -             (line-number (seq-position (vtable--cache-lines cache)
> -                                        old-object
> -                                        (lambda (a b)
> -                                          (equal (car a) b))))
> -             (line (elt (vtable--cache-lines cache) line-number)))
> -        (progn
> -          (setcar line object)
> -          (setcdr line (vtable--compute-cached-line table object))
> -          ;; ... and redisplay the line in question.
> -          (save-excursion
> -            (vtable-goto-object old-object)
> -            (let ((keymap (get-text-property (point) 'keymap))
> -                  (start (point)))
> -              (delete-line)
> -              (vtable--insert-line table line line-number
> -                                   (vtable--cache-widths cache)
> -                                   (vtable--spacer table))
> -              (add-text-properties start (point) (list 'keymap keymap
> -                                                       'vtable table
> -                                                       'vtable-cache cac=
he))))
> -          ;; We may have inserted a non-numerical value into a previously
> -          ;; all-numerical table, so recompute.
> -          (vtable--recompute-numerical table (cdr line)))
> -      (error "Can't find cached object in vtable"))))
> +  (with-current-buffer (vtable-buffer table)
> +    (unless old-object
> +      (setq old-object object))
> +    (let* ((objects (vtable-objects table))
> +           (inhibit-read-only t))
> +      ;; First replace the object in the object storage.
> +      (if (eq old-object (car objects))
> +          ;; It's at the head, so replace it there.
> +          (setf (vtable-objects table)
> +                (cons object (cdr objects)))
> +        ;; Otherwise splice into the list.
> +        (while (and (cdr objects)
> +                    (not (eq (cadr objects) old-object)))
> +          (setq objects (cdr objects)))
> +        (unless (cdr objects)
> +          (error "Can't find the old object"))
> +        (setcar (cdr objects) object))
> +      ;; Then update the rendered vtable in the current buffer.
> +      (if-let* ((cache (vtable--current-cache))
> +                (line-number (seq-position (vtable--cache-lines cache)
> +                                           old-object
> +                                           (lambda (a b)
> +                                             (equal (car a) b))))
> +                (line (elt (vtable--cache-lines cache) line-number)))
> +          (progn
> +            (setcar line object)
> +            (setcdr line (vtable--compute-cached-line table object))
> +            ;; ... and redisplay the line in question.
> +            (save-excursion
> +              (vtable-goto-object old-object)
> +              (let ((keymap (get-text-property (point) 'keymap))
> +                    (start (point)))
> +                (delete-line)
> +                (vtable--insert-line table line line-number
> +                                     (vtable--cache-widths cache)
> +                                     (vtable--spacer table))
> +                (add-text-properties start (point) (list 'keymap keymap
> +                                                         'vtable table
> +                                                         'vtable-cache c=
ache))))
> +            ;; We may have inserted a non-numerical value into a previou=
sly
> +            ;; all-numerical table, so recompute.
> +            (vtable--recompute-numerical table (cdr line)))
> +        (error "Can't find cached object in vtable")))))
>=20=20
>  (defun vtable-remove-object (table object)
>    "Remove OBJECT from TABLE.
>  This will also remove the displayed line."
> -  ;; First remove from the objects.
> -  (setf (vtable-objects table) (delq object (vtable-objects table)))
> -  ;; Then adjust the cache and display.
> -  (save-excursion
> -    (vtable-goto-table table)
> -    (let ((cache (vtable--current-cache))
> -          (inhibit-read-only t))
> -      (setcar cache (delq (assq object (vtable--cache-lines cache))
> -                          (vtable--cache-lines cache)))
> -      (when (vtable-goto-object object)
> -        (delete-line)))))
> +  (with-current-buffer (vtable-buffer table)
> +    ;; First remove from the objects.
> +    (setf (vtable-objects table) (delq object (vtable-objects table)))
> +    ;; Then adjust the cache and display.
> +    (save-excursion
> +      (vtable-goto-table table)
> +      (let ((cache (vtable--current-cache))
> +            (inhibit-read-only t))
> +        (setcar cache (delq (assq object (vtable--cache-lines cache))
> +                            (vtable--cache-lines cache)))
> +        (when (vtable-goto-object object)
> +          (delete-line))))))
>=20=20
>  ;; FIXME: The fact that the `location' argument of
>  ;; `vtable-insert-object' can be an integer and is then interpreted as
> @@ -363,91 +380,92 @@ vtable-insert-object
>  case.
>=20=20
>  This also updates the displayed table."
> -  ;; If the vtable is empty, just add the object and regenerate the
> -  ;; table.
> -  (if (null (vtable-objects table))
> -      (progn
> -        (setf (vtable-objects table) (list object))
> -        (vtable--recompute-numerical table (vtable--compute-cached-line =
table object))
> -        (vtable-goto-table table)
> -        (vtable-revert-command))
> -    ;; First insert into the objects.
> -    (let ((pos (if location
> -                   (if (integerp location)
> -                       (prog1
> -                           (nthcdr location (vtable-objects table))
> -                         ;; Do not prepend if index is too large:
> -                         (setq before nil))
> -                     (or (memq location (vtable-objects table))
> -                         ;; Prepend if `location' is not found and
> -                         ;; `before' is non-nil:
> -                         (and before (vtable-objects table))))
> -                 ;; If `location' is nil and `before' is non-nil, we
> -                 ;; prepend the new object.
> -                 (if before (vtable-objects table)))))
> -      (if (or before  ; If `before' is non-nil, `pos' should be, as well.
> -              (and pos (integerp location)))
> -          ;; Add the new object before.
> -          (let ((old-object (car pos)))
> -            (setcar pos object)
> -            (setcdr pos (cons old-object (cdr pos))))
> -        ;; Otherwise, add the object after.
> -        (if pos
> -            ;; Splice the object into the list.
> -            (setcdr pos (cons object (cdr pos)))
> -          ;; Otherwise, append the object.
> -          (nconc (vtable-objects table) (list object)))))
> -    ;; Then adjust the cache and display.
> -    (save-excursion
> -      (vtable-goto-table table)
> -      (let* ((cache (vtable--current-cache))
> -             (inhibit-read-only t)
> -             (keymap (get-text-property (point) 'keymap))
> -             (ellipsis (if (vtable-ellipsis table)
> -                           (propertize (truncate-string-ellipsis)
> -                                       'face (vtable-face table))
> -                         ""))
> -             (ellipsis-width (string-pixel-width ellipsis))
> -             (lines (vtable--cache-lines cache))
> -             (elem (if location  ; This binding mirrors the binding of `=
pos' above.
> -                       (if (integerp location)
> -                           (nth location lines)
> -                         (or (assq location lines)
> -                             (and before (car lines))))
> -                     (if before (car lines))))
> -             (pos (memq elem lines))
> -             (line (cons object (vtable--compute-cached-line table objec=
t))))
> -        (if (or before
> +  (with-current-buffer (vtable-buffer table)
> +    ;; If the vtable is empty, just add the object and regenerate the
> +    ;; table.
> +    (if (null (vtable-objects table))
> +        (progn
> +          (setf (vtable-objects table) (list object))
> +          (vtable--recompute-numerical table (vtable--compute-cached-lin=
e table object))
> +          (vtable-goto-table table)
> +          (vtable-revert-command))
> +      ;; First insert into the objects.
> +      (let ((pos (if location
> +                     (if (integerp location)
> +                         (prog1
> +                             (nthcdr location (vtable-objects table))
> +                           ;; Do not prepend if index is too large:
> +                           (setq before nil))
> +                       (or (memq location (vtable-objects table))
> +                           ;; Prepend if `location' is not found and
> +                           ;; `before' is non-nil:
> +                           (and before (vtable-objects table))))
> +                   ;; If `location' is nil and `before' is non-nil, we
> +                   ;; prepend the new object.
> +                   (if before (vtable-objects table)))))
> +        (if (or before  ; If `before' is non-nil, `pos' should be, as we=
ll.
>                  (and pos (integerp location)))
> -            ;; Add the new object before:.
> -            (let ((old-line (car pos)))
> -              (setcar pos line)
> -              (setcdr pos (cons old-line (cdr pos)))
> -              (unless (vtable-goto-object (car elem))
> -                (vtable-beginning-of-table)))
> +            ;; Add the new object before.
> +            (let ((old-object (car pos)))
> +              (setcar pos object)
> +              (setcdr pos (cons old-object (cdr pos))))
>            ;; Otherwise, add the object after.
>            (if pos
>                ;; Splice the object into the list.
> -              (progn
> -                (setcdr pos (cons line (cdr pos)))
> -                (if (vtable-goto-object location)
> -                    (forward-line 1)  ; Insert *after*.
> -                  (vtable-end-of-table)))
> +              (setcdr pos (cons object (cdr pos)))
>              ;; Otherwise, append the object.
> -            (setcar cache (nconc lines (list line)))
> -            (vtable-end-of-table)))
> -        (let ((start (point)))
> -          ;; FIXME: We have to adjust colors in lines below this if we
> -          ;; have :row-colors.
> -          (vtable--insert-line table line 0
> -                               (vtable--cache-widths cache) (vtable--spa=
cer table)
> -                               ellipsis ellipsis-width)
> -          (add-text-properties start (point) (list 'keymap keymap
> -                                                   'vtable table
> -                                                   'vtable-cache cache)))
> -        ;; We may have inserted a non-numerical value into a previously
> -        ;; all-numerical table, so recompute.
> -        (vtable--recompute-numerical table (cdr line))))))
> +            (nconc (vtable-objects table) (list object)))))
> +      ;; Then adjust the cache and display.
> +      (save-excursion
> +        (vtable-goto-table table)
> +        (let* ((cache (vtable--current-cache))
> +               (inhibit-read-only t)
> +               (keymap (get-text-property (point) 'keymap))
> +               (ellipsis (if (vtable-ellipsis table)
> +                             (propertize (truncate-string-ellipsis)
> +                                         'face (vtable-face table))
> +                           ""))
> +               (ellipsis-width (string-pixel-width ellipsis (current-buf=
fer)))
> +               (lines (vtable--cache-lines cache))
> +               (elem (if location  ; This binding mirrors the binding of=
 `pos' above.
> +                         (if (integerp location)
> +                             (nth location lines)
> +                           (or (assq location lines)
> +                               (and before (car lines))))
> +                       (if before (car lines))))
> +               (pos (memq elem lines))
> +               (line (cons object (vtable--compute-cached-line table obj=
ect))))
> +          (if (or before
> +                  (and pos (integerp location)))
> +              ;; Add the new object before:.
> +              (let ((old-line (car pos)))
> +                (setcar pos line)
> +                (setcdr pos (cons old-line (cdr pos)))
> +                (unless (vtable-goto-object (car elem))
> +                  (vtable-beginning-of-table)))
> +            ;; Otherwise, add the object after.
> +            (if pos
> +                ;; Splice the object into the list.
> +                (progn
> +                  (setcdr pos (cons line (cdr pos)))
> +                  (if (vtable-goto-object location)
> +                      (forward-line 1)  ; Insert *after*.
> +                    (vtable-end-of-table)))
> +              ;; Otherwise, append the object.
> +              (setcar cache (nconc lines (list line)))
> +              (vtable-end-of-table)))
> +          (let ((start (point)))
> +            ;; FIXME: We have to adjust colors in lines below this if we
> +            ;; have :row-colors.
> +            (vtable--insert-line table line 0
> +                                 (vtable--cache-widths cache) (vtable--s=
pacer table)
> +                                 ellipsis ellipsis-width)
> +            (add-text-properties start (point) (list 'keymap keymap
> +                                                     'vtable table
> +                                                     'vtable-cache cache=
)))
> +          ;; We may have inserted a non-numerical value into a previously
> +          ;; all-numerical table, so recompute.
> +          (vtable--recompute-numerical table (cdr line)))))))

Is it possible to avoid these massive diffs in vtable-update-object,
vtable-remove-object, and vtable-insert-object?  These will make the
history worse, and also makes it harder to review.  Maybe we only need
to wrap with-current-buffer around a smaller part of these functions?

FYI, in general, you should change try to make changes in a way which
minimizes the size of the diff.

>  (defun vtable-column (table index)
>    "Return the name of the INDEXth column in TABLE."
> @@ -520,14 +538,14 @@ vtable--cache-widths
>  (defun vtable--cache-lines (cache)
>    (car cache))
>=20=20
> -(defun vtable-insert (table)
> +(defun vtable--insert (table)
>    (let* ((spacer (vtable--spacer table))
>           (start (point))
>           (ellipsis (if (vtable-ellipsis table)
>                         (propertize (truncate-string-ellipsis)
>                                     'face (vtable-face table))
>                       ""))
> -         (ellipsis-width (string-pixel-width ellipsis))
> +         (ellipsis-width (string-pixel-width ellipsis (current-buffer)))
>           ;; We maintain a cache per screen/window width, so that we rend=
er
>           ;; correctly if Emacs is open on two different screens (or the
>           ;; user resizes the frame).
> @@ -565,9 +583,24 @@ vtable-insert
>                                 'vtable-cache cache))
>      (goto-char start)))
>=20=20
> +(defun vtable-insert (table)
> +  "Insert TABLE into the current buffer.
> +The current buffer will be recorded as TABLE's buffer.  If this is done
> +more than once, or if the table is attempted to be inserted more than
> +once into the same buffer, signal an error."
> +  (if-let* ((table-buffer (vtable-buffer table)))
> +      (if (eq table-buffer (current-buffer))
> +          (error "A vtable cannot be inserted more than once into a buff=
er")
> +        (error "A vtable cannot be inserted into more than one buffer")))
> +  (vtable-set-buffer (current-buffer) table)
> +  (let ((inhibit-read-only t)
> +        (inhibit-modification-hooks t))
> +    (vtable--insert table)))
> +
>  (defun vtable--insert-line (table line line-number widths spacer
>                                    &optional ellipsis ellipsis-width)
>    (let ((start (point))
> +        (buffer (vtable-buffer table))
>          (columns (vtable-columns table))
>          (column-colors
>           (and (vtable-column-colors table)
> @@ -607,16 +640,18 @@ vtable--insert-line
>                        (concat
>                         (vtable--limit-string
>                          pre-computed (- (elt widths index)
> -                                        (or ellipsis-width 0)))
> +                                        (or ellipsis-width 0))
> +                        buffer)
>                         ellipsis)
>                      pre-computed))
>                   ;; Recompute widths.
>                   (t
> -                  (if (> (string-pixel-width value) (elt widths index))
> +                  (if (> (string-pixel-width value buffer) (elt widths i=
ndex))
>                        (concat
>                         (vtable--limit-string
>                          value (- (elt widths index)
> -                                 (or ellipsis-width 0)))
> +                                 (or ellipsis-width 0))
> +                        buffer)
>                         ellipsis)
>                      value))))
>                 (start (point))
> @@ -630,14 +665,15 @@ vtable--insert-line
>                            (list 'space
>                                  :width (list
>                                          (+ (- (elt widths index)
> -                                              (string-pixel-width displa=
yed))
> +                                              (string-pixel-width
> +                                               displayed buffer))
>                                             (if last 0 spacer)))))))
>               ;; Align to the right.
>               (insert (propertize " " 'display
>                                   (list 'space
>                                         :width (list (- (elt widths index)
>                                                         (string-pixel-wid=
th
> -                                                        displayed)))))
> +                                                        displayed buffer=
)))))
>                       displayed)
>               (unless last
>                 (insert (propertize " " 'display
> @@ -718,6 +754,7 @@ vtable--indicator
>  (defun vtable--insert-header-line (table widths spacer)
>    ;; Insert the header directly into the buffer.
>    (let ((start (point))
> +        (buffer (vtable-buffer table))
>          (divider (vtable-divider table))
>          (cmap (define-keymap
>                  "<header-line> <drag-mouse-1>" #'vtable--drag-resize-col=
umn
> @@ -737,14 +774,15 @@ vtable--insert-header-line
>                       'keymap cmap))
>                (start (point))
>                (indicator (vtable--indicator table index))
> -              (indicator-width (string-pixel-width indicator))
> +              (indicator-width (string-pixel-width indicator buffer))
>                (last (=3D index (1- (length (vtable-columns table)))))
>                displayed)
>           (setq displayed
> -               (if (> (string-pixel-width name)
> +               (if (> (string-pixel-width name buffer)
>                        (- (elt widths index) indicator-width))
>                     (vtable--limit-string
> -                    name (- (elt widths index) indicator-width))
> +                    name (- (elt widths index) indicator-width)
> +                    buffer)
>                   name))
>           (let* ((indicator-lead-width
>                   ;; We want the indicator to not be quite flush right.
> @@ -753,7 +791,7 @@ vtable--insert-header-line
>                                          indicator-lead-width))
>                  (fill-width
>                   (+ (- (elt widths index)
> -                       (string-pixel-width displayed)
> +                       (string-pixel-width displayed buffer)
>                         indicator-width
>                         indicator-lead-width)
>                      (if last 0 spacer))))
> @@ -771,7 +809,8 @@ vtable--insert-header-line
>               ;; This is the final column, and we have a sorting
>               ;; indicator, and the table is too wide for the window.
>               (let* ((pre-indicator (string-pixel-width
> -                                    (buffer-substring (point-min) (point=
))))
> +                                    (buffer-substring (point-min) (point=
))
> +                                    buffer))
>                      (pre-fill
>                       (- (window-width nil t)
>                          pre-indicator
> @@ -850,14 +889,16 @@ vtable--set-header-line
>             (buffer-substring (point-min) (1- (point-max))))))
>    (vtable-header-mode 1))
>=20=20
> -(defun vtable--limit-string (string pixels)
> +
> +(defun vtable--limit-string (string pixels buffer)
>    (while (and (length> string 0)
> -              (> (string-pixel-width string) pixels))
> +              (> (string-pixel-width string buffer) pixels))
>      (setq string (substring string 0 (1- (length string)))))
>    string)
>=20=20
>  (defun vtable--char-width (table)
> -  (string-pixel-width (propertize "x" 'face (vtable-face table))))
> +  (string-pixel-width (propertize "x" 'face (vtable-face table))
> +                      (vtable-buffer table)))
>=20=20
>  (defun vtable--compute-width (table spec)
>    (cond
> @@ -967,20 +1008,24 @@ vtable--make-keymap
>            (vtable-keymap table))
>        map)))
>=20=20
> -(defun vtable-revert ()
> -  "Regenerate the table under point."
> -  (let ((table (vtable-current-table))
> -        (object (vtable-current-object))
> -        (column (vtable-current-column))
> -        (inhibit-read-only t))
> -    (unless table
> -      (user-error "No table under point"))
> -    (delete-region (vtable-beginning-of-table) (vtable-end-of-table))
> -    (vtable-insert table)
> -    (when object
> -      (vtable-goto-object object))
> -    (when column
> -      (vtable-goto-column column))))
> +(defun vtable-revert (&optional table)
> +  "Regenerate the table under point.
> +If TABLE is nil, use the table under point."

This repeats itself.  It should say "Regenerate TABLE, defaulting to the ta=
ble under point."

> +  (setq table (or table (vtable-current-table)))
> +  (unless table
> +    (user-error "No table found"))

I don't think this error message should change.

> +  (with-current-buffer (vtable-buffer table)
> +    (let ((object (vtable-current-object))
> +          (column (vtable-current-column))

So we still implicitly depend on the value of point in the buffer?  How
does this interact with window-point?  This seems like a potential
foot-gun.

> +          (inhibit-read-only t))
> +      (unless table
> +        (user-error "No table under point"))
> +      (delete-region (vtable-beginning-of-table) (vtable-end-of-table))
> +      (vtable--insert table)
> +      (when object
> +        (vtable-goto-object object))
> +      (when column
> +        (vtable-goto-column column)))))
>
>  ;;; Commands.
>=20=20
> @@ -1013,7 +1058,7 @@ vtable--alter-column-width
>      ;; Store the width so it'll be respected on a revert.
>      (setf (vtable-column-width (elt (vtable-columns table) column))
>            (format "%dpx" (aref widths column)))
> -    (vtable-revert)))
> +    (vtable-revert table)))
>=20=20
>  (defun vtable-widen-current-column (&optional n)
>    "Widen the current column by N characters.
> @@ -1038,14 +1083,16 @@ vtable-next-column
>       (min (1- (length (vtable--cache-widths (vtable--current-cache))))
>            (1+ (vtable-current-column))))))
>=20=20
> -(defun vtable-revert-command ()
> +(defun vtable-revert-command (&optional table)
>    "Re-query data and regenerate the table under point."
>    (interactive)
> -  (let ((table (vtable-current-table)))
> -    (when (vtable-objects-function table)
> -      (setf (vtable-objects table) (funcall (vtable-objects-function tab=
le))))
> -    (vtable--clear-cache table))
> -  (vtable-revert))
> +  (setq table (or table (vtable-current-table)))
> +  (unless table
> +    (user-error "No table found"))
> +  (when (vtable-objects-function table)
> +    (setf (vtable-objects table) (funcall (vtable-objects-function table=
))))
> +  (vtable--clear-cache table)
> +  (vtable-revert table))
>=20=20
>  (defun vtable-sort-by-current-column ()
>    "Sort the table under point by the column under point."
> @@ -1067,8 +1114,8 @@ vtable-sort-by-current-column
>                                    (if (eq (cdr last) 'ascend)
>                                        'descend
>                                      'ascend)
> -                                'ascend))))))
> -  (vtable-revert))
> +                                'ascend)))))
> +    (vtable-revert table)))
>=20=20
>  (defun vtable-header-line-sort (e)
>    "Sort a vtable from the header line."
> diff --git a/test/lisp/emacs-lisp/vtable-tests.el b/test/lisp/emacs-lisp/=
vtable-tests.el
> index 74fb8cc8139..83f826ea353 100644
> --- a/test/lisp/emacs-lisp/vtable-tests.el
> +++ b/test/lisp/emacs-lisp/vtable-tests.el
> @@ -27,16 +27,19 @@
>  (require 'ert)
>  (require 'ert-x)
>=20=20
> -(ert-deftest test-vstable-compute-columns ()
> +(defun vtable-tests--make-no-header-2-object-table ()
> +  (make-vtable :columns '("a" "b" "c")
> +               :objects '(("foo" 1 2)
> +                          ("bar" 3 :zot))
> +               :insert nil))
> +
> +(ert-deftest test-vtable-compute-columns ()
>    (should
>     (equal (mapcar
>             (lambda (column)
>               (vtable-column-align column))
>             (vtable--compute-columns
> -            (make-vtable :columns '("a" "b" "c")
> -                         :objects '(("foo" 1 2)
> -                                    ("bar" 3 :zot))
> -                         :insert nil)))
> +            (vtable-tests--make-no-header-2-object-table)))
>            '(left right left))))
>=20=20
>  (ert-deftest test-vtable-insert-object ()
> @@ -69,4 +72,69 @@ test-vtable-insert-object
>                (mapcar #'cadr (vtable-objects table))))
>            (number-sequence 0 11))))
>=20=20
> +(ert-deftest test-vtable-unique-buffer ()
> +  (let ((table (vtable-tests--make-no-header-2-object-table)))
> +    (with-temp-buffer
> +      (vtable-insert table)
> +      ;; This will run but fail on Emacs pre 31 vtable.
> +      (should-error (vtable-insert table))
> +      ;; This will run only on Emacs 31+ vtable.
> +      (when (> emacs-major-version 30)
> +        (should-error (vtable-set-buffer table (current-buffer)))))))
> +
> +(ert-deftest test-vtable-non-current-buffer-insert-object ()
> +  (let ((table (vtable-tests--make-no-header-2-object-table))
> +        (obj '("baz" 4 5)))
> +    (with-temp-buffer
> +      (vtable-insert table)
> +      (should (=3D (count-lines (point-min) (point-max)) 2))
> +      (with-temp-buffer
> +        (vtable-insert-object table obj))
> +      (should (=3D (count-lines (point-min) (point-max)) 3)))))
> +
> +(ert-deftest test-vtable-non-current-buffer-remove-object ()
> +  (let ((table (vtable-tests--make-no-header-2-object-table))
> +        (obj '("baz" 4 5)))
> +    (with-temp-buffer
> +      (vtable-insert table)
> +      (vtable-insert-object table obj)
> +      (should (=3D (count-lines (point-min) (point-max)) 3))
> +      (with-temp-buffer
> +        (vtable-remove-object table obj))
> +      (should (=3D (count-lines (point-min) (point-max)) 2)))))
> +
> +(ert-deftest test-vtable-non-current-buffer-update-object ()
> +  (let ((table (vtable-tests--make-no-header-2-object-table))
> +        (obj '("baz" 4 5))
> +        (obj-2 '("qux" 6 7)))
> +    (with-temp-buffer
> +      (vtable-insert table)
> +      (vtable-insert-object table obj)
> +      (should (=3D (count-lines (point-min) (point-max)) 3))
> +      (let ((line-2 (progn
> +                      (goto-char (point-min))
> +                      (forward-line 2)
> +                      (buffer-substring (point) (point-max)))))
> +        (with-temp-buffer
> +          (vtable-update-object table obj-2 obj))
> +        (let ((line-2-new (progn
> +                            (goto-char (point-min))
> +                            (forward-line 2)
> +                            (buffer-substring (point) (point-max)))))
> +          (should (=3D (count-lines (point-min) (point-max)) 3))
> +          (should (not (string=3D line-2 line-2-new))))))))
> +
> +(ert-deftest test-vtable--limit-string-with-face-remapped-buffer ()
> +  (with-temp-buffer
> +    (let ((text (propertize "XXXXX"
> +                            'face 'variable-pitch)))
> +      (face-remap-add-relative 'default :height 1.5)
> +      (if (> emacs-major-version 30)
> +          (should (eq
> +                   2
> +                   (length (vtable--limit-string text 50 (current-buffer=
)))))
> +        (should (eq
> +                 2
> +                 (length (vtable--limit-string text 50))))))))
> +
>  ;;; vtable-tests.el ends here




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 10 Dec 2025 17:51:00 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 10 12:51:00 2025
Received: from localhost ([127.0.0.1]:35695 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vTOL5-0004TJ-H1
	for submit <at> debbugs.gnu.org; Wed, 10 Dec 2025 12:50:59 -0500
Received: from mail-vs1-xe30.google.com ([2607:f8b0:4864:20::e30]:52277)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vTOL2-0004T4-1f
 for 79982 <at> debbugs.gnu.org; Wed, 10 Dec 2025 12:50:57 -0500
Received: by mail-vs1-xe30.google.com with SMTP id
 ada2fe7eead31-5e186858102so22295137.0
 for <79982 <at> debbugs.gnu.org>; Wed, 10 Dec 2025 09:50:56 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765389050; x=1765993850; darn=debbugs.gnu.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=dxL95OXkWXUM1fZUXad/q8hI6o7kWZl9B9Tv0pqT6Ho=;
 b=d1QlKGAOttBHF3KJONpuZ6/6q1J6ZiOjgl0EteGir+szL+RpTtL4NPeZUxNxiT+m1Z
 rfwkpVC0+/lKfXY9INewFtU6t2h7DDb4CGMOei7nXfDPhQ8Dj56pzivD9gOmdxXH9TVh
 J1uNHGYngOSqM6a54478z4355MMsL5znhGNCH5lZAcNPqlJTM2EuIlNuVbpULER1jVrv
 /1dxpY/3F/8hK9FFWp1HN3kN6pcEPDuocXnDn3akFDDPYBVhoGqNYLKE7REREormPcvL
 NFh/ykAkDJDTZudFYm3ZesDxPOnzbkxiOP4Tc9NNLgtvQkh0LNv9gjeOLjtdPIOLUGIW
 wVEw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765389050; x=1765993850;
 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=dxL95OXkWXUM1fZUXad/q8hI6o7kWZl9B9Tv0pqT6Ho=;
 b=AP8e+nbRhcrT98h2BUb69lBtXTrTdHhk2QSIho1gOSdCFmi87Om5L9qhbSqV1eN1FV
 xFgsHonYtg61VTfez+Yy2P/M8SgwIwrxShfTv/jSo2QoTceyXpzfVnJqI2sVVLa5gevA
 /nJKWzj3QocL7L5XZahIgZVGgtY/lEGHQFZVzz/YZYwKpTA5nvLzHSm6NflnXy96Txp+
 cL0ybHk5+dCnQO+yHOKxMmh1pq1NGN42KM4XTM5BRuthccB969DMgxatU5enjZQVbEh0
 cLlTLO+nVHRuWqeaAhogG+WKp87O/tRxrX65GeKenWag02AOUYbnhCf6K9B+emHMWCO5
 VKUQ==
X-Gm-Message-State: AOJu0YwGSTnEhQ3vnt0oj1DgwQFe1tXBthCbaVIx54GvM44wYRcpk86h
 kWqmjO53anZB6AR6UpFoGy4cLZj/hHoe37CQONg/nnknHY1LWuEYoPW0gKrv1jMTgPTcE+jN7/3
 m1kmjvk6Rvp68D+ktAGUugKkuk52Hkeo=
X-Gm-Gg: AY/fxX7943zdWuA8ZkcguKDMalkCffBeT401iUtMF70xiOqNDEt3dzjRWCU5wZEaHif
 gkPv5bYvPq7gzfZNn5S5QH2cMg67vl5MNPrdeOYTxPmITZwdcaCILCVVKOqAzIhDO9/IhfMA5cH
 LPU5gA+qg52+t3LZVhnAAI6K23L3kLR+puSbKGuYZsT9YtrNZii2+Cmyj6RhQeOaLrMb4qg5xC0
 3GxZky7e0B49+5+h7vCAwWjGFpeA5YI2dtcvJaH9QaQU27zLyPvatoGMCYkfSPRbW4cuV8=
X-Google-Smtp-Source: AGHT+IEh+Wm+gjPbUGKRi6QrwayhAY1QHp6VT1u6lZjvdC+iswvtMVGhqL1VwcbeCymwBAmjAUoZBZQSMjDcFx+qM/o=
X-Received: by 2002:a05:6102:54ac:b0:5df:c094:628d with SMTP id
 ada2fe7eead31-5e5716f039emr1148235137.3.1765389050338; Wed, 10 Dec 2025
 09:50:50 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 <iero6o6s75r.fsf@HIDDEN>
In-Reply-To: <iero6o6s75r.fsf@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Wed, 10 Dec 2025 12:50:38 -0500
X-Gm-Features: AQt7F2rdV8r3KEU-8jPl7W_bXcGaAP2K3m9fmLT7Kv331C3TP3lXI_Vk1ZUeN4s
Message-ID: <CAN+1HboB1WkN8NQkYSx_=PBk67s1Y5duizM1AvVe_sVH2QWivw@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/mixed; boundary="0000000000003c79da06459cab30"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--0000000000003c79da06459cab30
Content-Type: multipart/alternative; boundary="0000000000003c79d806459cab2e"

--0000000000003c79d806459cab2e
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Wed, Dec 10, 2025 at 10:12=E2=80=AFAM Spencer Baugh <sbaugh@HIDDEN=
om>
wrote:

> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
> > This solves for background vtable mutations, i.e., updates initiated
> from buffers other than the vtable buffer, and for
> > buffer-adjusted string-pixel-width computations.
> >
> > Many more patches for fixes and enhancements coming on the back of this
> one, once agreed.  I'd love to see all of these in Emacs
> > 31 and I'm now generally available to pick up the pace.
> >
> > P.S. I've cc'd the same group as the last vtable discussions/patches.
> If you do not want to be cc'd on these, let me know.
> >
> > -St=C3=A9phane
>
> Please add a test which passes with this patch and doesn't pass without
> this patch.
>

Try the new tests in this updated patch.

--0000000000003c79d806459cab2e
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div class=3D"gmail_default" style=3D"fon=
t-family:monospace"><span style=3D"font-family:Arial,Helvetica,sans-serif">=
On Wed, Dec 10, 2025 at 10:12=E2=80=AFAM Spencer Baugh &lt;<a href=3D"mailt=
o:sbaugh@HIDDEN">sbaugh@HIDDEN</a>&gt; wrote:</span></div><=
/div><div class=3D"gmail_quote gmail_quote_container"><blockquote class=3D"=
gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(20=
4,204,204);padding-left:1ex">St=C3=A9phane Marks &lt;<a href=3D"mailto:ship=
mints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&gt; writes:<br>
&gt; This solves for background vtable mutations, i.e., updates initiated f=
rom buffers other than the vtable buffer, and for<br>
&gt; buffer-adjusted string-pixel-width computations.<br>
&gt;<br>
&gt; Many more patches for fixes and enhancements coming on the back of thi=
s one, once agreed.=C2=A0 I&#39;d love to see all of these in Emacs<br>
&gt; 31 and I&#39;m now generally available to pick up the pace.<br>
&gt;<br>
&gt; P.S. I&#39;ve cc&#39;d the same group as the last vtable discussions/p=
atches.=C2=A0 If you do not want to be cc&#39;d on these, let me know.<br>
&gt;<br>
&gt; -St=C3=A9phane <br>
<br>
Please add a test which passes with this patch and doesn&#39;t pass without=
<br>
this patch.<br></blockquote><div><br></div><div class=3D"gmail_default" sty=
le=3D"font-family:monospace">Try the new tests in this updated patch.</div>=
</div></div>

--0000000000003c79d806459cab2e--

--0000000000003c79da06459cab30
Content-Type: application/octet-stream; 
	name="0001-Add-vtable-buffer-slot.patch"
Content-Disposition: attachment; 
	filename="0001-Add-vtable-buffer-slot.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_mj0b1jqw0>
X-Attachment-Id: f_mj0b1jqw0

RnJvbSA2ZTMzYjhjYmYyMDYzZTFlNzY4OWYyMzFiYjBjNmM2NDUwNTIwYmQzIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo
aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMTAgRGVjIDIwMjUgMDk6MjA6MDIgLTA1MDAK
U3ViamVjdDogW1BBVENIXSBBZGQgdnRhYmxlIGJ1ZmZlciBzbG90CgpUaGlzIHNvbHZlcyBmb3Ig
YmFja2dyb3VuZCB2dGFibGUgbXV0YXRpb25zLCBpLmUuLCB1cGRhdGVzCmluaXRpYXRlZCBmcm9t
IGJ1ZmZlcnMgb3RoZXIgdGhhbiB0aGUgdnRhYmxlIGJ1ZmZlciwgYW5kIGZvcgpidWZmZXItYWRq
dXN0ZWQgc3RyaW5nLXBpeGVsLXdpZHRoIGNvbXB1dGF0aW9ucy4KCiogbGlzcC9lbWFjcy1saXNw
L3Z0YWJsZS5lbCAodnRhYmxlKTogTmV3ICctYnVmZmVyJyBzbG90LgoodnRhYmxlLWJ1ZmZlcik6
Cih2dGFibGUtc2V0LWJ1ZmZlcik6IE5ldyBmdW5jdGlvbi4KKHZ0YWJsZS11cGRhdGUtb2JqZWN0
KToKKHZ0YWJsZS1yZW1vdmUtb2JqZWN0KToKKHZ0YWJsZS1pbnNlcnQtb2JqZWN0KTogV3JhcCBv
cGVyYXRpb24gd2l0aCB0aGUgdnRhYmxlIGJ1ZmZlci4KKHZ0YWJsZS0taW5zZXJ0KTogU3BsaXQg
ZnJvbSBvbGQgJ3Z0YWJsZS1pbnNlcnQnLgoodnRhYmxlLWluc2VydCk6IEluc2VydCB0YWJsZSBh
bmQgcmVjb3JkIHRoZSBidWZmZXIuCih2dGFibGUtLWluc2VydC1saW5lKToKKHZ0YWJsZS0taW5z
ZXJ0LWhlYWRlci1saW5lKTogVXNlICd2dGFibGUtYnVmZmVyJyBmb3IgcGl4ZWwtd2lkdGggY29t
cHV0YXRpb24uCih2dGFibGUtLWxpbWl0LXN0cmluZyk6Cih2dGFibGUtLWNoYXItd2lkdGgpOiBQ
YXNzIGJ1ZmZlciB0byAnc3RyaW5nLXBpeGVsLXdpZHRoJy4KKHZ0YWJsZS1yZXZlcnQpOiBOZXcg
b3B0aW9uYWwgdGFibGUgYXJndW1lbnQuCih2dGFibGUtLWFsdGVyLWNvbHVtbi13aWR0aCk6Cih2
dGFibGUtcmV2ZXJ0LWNvbW1hbmQpOgoodnRhYmxlLXNvcnQtYnktY3VycmVudC1jb2x1bW4pOiBD
YWxsICd2dGFibGUtcmV2ZXJ0JyB3aXRoIHRoZSB0YWJsZS4KCiogdGVzdC9saXNwL2VtYWNzLWxp
c3AvdnRhYmxlLXRlc3RzLmVsCih2dGFibGUtdGVzdHMtLW1ha2Utbm8taGVhZGVyLTItb2JqZWN0
LXRhYmxlKTogTmV3IGhlbHBlcgpmdW5jdGlvbi4KKHRlc3QtdnN0YWJsZS1jb21wdXRlLWNvbHVt
bnMpOiBDb3JyZWN0IHR5cG8gaW4gdGVzdCBuYW1lLiAgVXNlCm5ldyBoZWxwZXIgZnVuY3Rpb24u
Cih0ZXN0LXZ0YWJsZS11bmlxdWUtYnVmZmVyKQoodGVzdC12dGFibGUtbm9uLWN1cnJlbnQtYnVm
ZmVyLWluc2VydC1vYmplY3QpCih0ZXN0LXZ0YWJsZS1ub24tY3VycmVudC1idWZmZXItcmVtb3Zl
LW9iamVjdCkKKHRlc3QtdnRhYmxlLW5vbi1jdXJyZW50LWJ1ZmZlci11cGRhdGUtb2JqZWN0KQoo
dGVzdC12dGFibGUtLWxpbWl0LXN0cmluZy13aXRoLWZhY2UtcmVtYXBwZWQtYnVmZmVyKTogTmV3
IHRlc3QuCi0tLQogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAgICAgICAgICAgIHwgMzg5ICsr
KysrKysrKysrKysrKy0tLS0tLS0tLS0tLQogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRl
c3RzLmVsIHwgIDc4ICsrKysrLQogMiBmaWxlcyBjaGFuZ2VkLCAyOTEgaW5zZXJ0aW9ucygrKSwg
MTc2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2xpc3AvZW1hY3MtbGlzcC92dGFibGUuZWwg
Yi9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVsCmluZGV4IGJjZGQyODBmYjkyLi5mZTRiYWUwMTA3
NyAxMDA2NDQKLS0tIGEvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbAorKysgYi9saXNwL2VtYWNz
LWxpc3AvdnRhYmxlLmVsCkBAIC02OCw2ICs2OCw3IEBAIHZ0YWJsZQogICAgKGNvbHVtbi1jb2xv
cnMgOmluaXRhcmcgOmNvbHVtbi1jb2xvcnMgOmFjY2Vzc29yIHZ0YWJsZS1jb2x1bW4tY29sb3Jz
KQogICAgKHJvdy1jb2xvcnMgOmluaXRhcmcgOnJvdy1jb2xvcnMgOmFjY2Vzc29yIHZ0YWJsZS1y
b3ctY29sb3JzKQogICAgKC1jYWNoZWQtY29sb3JzIDppbml0Zm9ybSBuaWwpCisgICAoLWJ1ZmZl
ciA6aW5pdGZvcm0gbmlsKQogICAgKC1jYWNoZSA6aW5pdGZvcm0gKG1ha2UtaGFzaC10YWJsZSA6
dGVzdCAjJ2VxdWFsKSkKICAgICgtY2FjaGVkLWtleW1hcCA6aW5pdGZvcm0gbmlsKQogICAgKC1o
YXMtY29sdW1uLXNwZWMgOmluaXRmb3JtIG5pbCkpCkBAIC0yMjEsNiArMjIyLDIwIEBAIHZ0YWJs
ZS0tZmFjZS1jb2xvcgogCiA7OzsgSW50ZXJmYWNlIHV0aWxpdHkgZnVuY3Rpb25zLgogCisoZGVm
dW4gdnRhYmxlLWJ1ZmZlciAoJm9wdGlvbmFsIHRhYmxlKQorICAiUmV0dXJuIHRoZSBidWZmZXIg
YXNzb2NpYXRlZCB3aXRoIFRBQkxFLgorSWYgVEFCTEUgaXMgbmlsLCB1c2UgdGhlIHRhYmxlIHVu
ZGVyIHBvaW50LiAgUmV0dXJuIG5pbCBpZiB0aGUgdGFibGUgaGFzCitub3QgYmVlbiBpbnNlcnRl
ZCBpbnRvIGEgYnVmZmVyLiIKKyAgKHNsb3QtdmFsdWUgKG9yIHRhYmxlICh2dGFibGUtY3VycmVu
dC10YWJsZSkpCisgICAgICAgICAgICAgICctYnVmZmVyKSkKKworKGRlZnVuIHZ0YWJsZS1zZXQt
YnVmZmVyIChidWZmZXIgJm9wdGlvbmFsIHRhYmxlKQorICAiQXNzb2NpYXRlIEJVRkZFUiB3aXRo
IFRBQkxFLgorSWYgVEFCTEUgaXMgbmlsLCB1c2UgdGhlIHRhYmxlIHVuZGVyIHBvaW50LiIKKyAg
KHNldGYgKHNsb3QtdmFsdWUgKG9yIHRhYmxlICh2dGFibGUtY3VycmVudC10YWJsZSkpCisgICAg
ICAgICAgICAgICAgICAgICctYnVmZmVyKQorICAgICAgICBidWZmZXIpKQorCiAoZGVmdW4gdnRh
YmxlLWN1cnJlbnQtdGFibGUgKCkKICAgIlJldHVybiB0aGUgdGFibGUgdW5kZXIgcG9pbnQuIgog
ICAoZ2V0LXRleHQtcHJvcGVydHkgKHBvaW50KSAndnRhYmxlKSkKQEAgLTI4NSw2MyArMzAwLDY1
IEBAIHZ0YWJsZS11cGRhdGUtb2JqZWN0CiBjb21wYXJlZCB3aXRoIGBlcXVhbCcpLCBzaWduYWwg
YW4gZXJyb3IuCiAKIFRBQkxFIG11c3QgYmUgYXQgcG9pbnQgaW4gdGhlIGN1cnJlbnQgYnVmZmVy
LiIKLSAgKHVubGVzcyBvbGQtb2JqZWN0Ci0gICAgKHNldHEgb2xkLW9iamVjdCBvYmplY3QpKQot
ICAobGV0KiAoKG9iamVjdHMgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkKLSAgICAgICAgIChpbmhp
Yml0LXJlYWQtb25seSB0KSkKLSAgICA7OyBGaXJzdCByZXBsYWNlIHRoZSBvYmplY3QgaW4gdGhl
IG9iamVjdCBzdG9yYWdlLgotICAgIChpZiAoZXEgb2xkLW9iamVjdCAoY2FyIG9iamVjdHMpKQot
ICAgICAgICA7OyBJdCdzIGF0IHRoZSBoZWFkLCBzbyByZXBsYWNlIGl0IHRoZXJlLgotICAgICAg
ICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpCi0gICAgICAgICAgICAgIChjb25zIG9iamVj
dCAoY2RyIG9iamVjdHMpKSkKLSAgICAgIDs7IE90aGVyd2lzZSBzcGxpY2UgaW50byB0aGUgbGlz
dC4KLSAgICAgICh3aGlsZSAoYW5kIChjZHIgb2JqZWN0cykKLSAgICAgICAgICAgICAgICAgIChu
b3QgKGVxIChjYWRyIG9iamVjdHMpIG9sZC1vYmplY3QpKSkKLSAgICAgICAgKHNldHEgb2JqZWN0
cyAoY2RyIG9iamVjdHMpKSkKLSAgICAgICh1bmxlc3MgKGNkciBvYmplY3RzKQotICAgICAgICAo
ZXJyb3IgIkNhbid0IGZpbmQgdGhlIG9sZCBvYmplY3QiKSkKLSAgICAgIChzZXRjYXIgKGNkciBv
YmplY3RzKSBvYmplY3QpKQotICAgIDs7IFRoZW4gdXBkYXRlIHRoZSByZW5kZXJlZCB2dGFibGUg
aW4gdGhlIGN1cnJlbnQgYnVmZmVyLgotICAgIChpZi1sZXQqICgoY2FjaGUgKHZ0YWJsZS0tY3Vy
cmVudC1jYWNoZSkpCi0gICAgICAgICAgICAgKGxpbmUtbnVtYmVyIChzZXEtcG9zaXRpb24gKHZ0
YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgb2xkLW9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChsYW1iZGEgKGEgYikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChlcXVhbCAoY2FyIGEpIGIpKSkpCi0gICAgICAgICAgICAgKGxpbmUgKGVsdCAodnRhYmxl
LS1jYWNoZS1saW5lcyBjYWNoZSkgbGluZS1udW1iZXIpKSkKLSAgICAgICAgKHByb2duCi0gICAg
ICAgICAgKHNldGNhciBsaW5lIG9iamVjdCkKLSAgICAgICAgICAoc2V0Y2RyIGxpbmUgKHZ0YWJs
ZS0tY29tcHV0ZS1jYWNoZWQtbGluZSB0YWJsZSBvYmplY3QpKQotICAgICAgICAgIDs7IC4uLiBh
bmQgcmVkaXNwbGF5IHRoZSBsaW5lIGluIHF1ZXN0aW9uLgotICAgICAgICAgIChzYXZlLWV4Y3Vy
c2lvbgotICAgICAgICAgICAgKHZ0YWJsZS1nb3RvLW9iamVjdCBvbGQtb2JqZWN0KQotICAgICAg
ICAgICAgKGxldCAoKGtleW1hcCAoZ2V0LXRleHQtcHJvcGVydHkgKHBvaW50KSAna2V5bWFwKSkK
LSAgICAgICAgICAgICAgICAgIChzdGFydCAocG9pbnQpKSkKLSAgICAgICAgICAgICAgKGRlbGV0
ZS1saW5lKQotICAgICAgICAgICAgICAodnRhYmxlLS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIGxp
bmUtbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWNh
Y2hlLXdpZHRocyBjYWNoZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0
YWJsZS0tc3BhY2VyIHRhYmxlKSkKLSAgICAgICAgICAgICAgKGFkZC10ZXh0LXByb3BlcnRpZXMg
c3RhcnQgKHBvaW50KSAobGlzdCAna2V5bWFwIGtleW1hcAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2dGFibGUgdGFibGUKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlLWNh
Y2hlIGNhY2hlKSkpKQotICAgICAgICAgIDs7IFdlIG1heSBoYXZlIGluc2VydGVkIGEgbm9uLW51
bWVyaWNhbCB2YWx1ZSBpbnRvIGEgcHJldmlvdXNseQotICAgICAgICAgIDs7IGFsbC1udW1lcmlj
YWwgdGFibGUsIHNvIHJlY29tcHV0ZS4KLSAgICAgICAgICAodnRhYmxlLS1yZWNvbXB1dGUtbnVt
ZXJpY2FsIHRhYmxlIChjZHIgbGluZSkpKQotICAgICAgKGVycm9yICJDYW4ndCBmaW5kIGNhY2hl
ZCBvYmplY3QgaW4gdnRhYmxlIikpKSkKKyAgKHdpdGgtY3VycmVudC1idWZmZXIgKHZ0YWJsZS1i
dWZmZXIgdGFibGUpCisgICAgKHVubGVzcyBvbGQtb2JqZWN0CisgICAgICAoc2V0cSBvbGQtb2Jq
ZWN0IG9iamVjdCkpCisgICAgKGxldCogKChvYmplY3RzICh2dGFibGUtb2JqZWN0cyB0YWJsZSkp
CisgICAgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KSkKKyAgICAgIDs7IEZpcnN0IHJlcGxh
Y2UgdGhlIG9iamVjdCBpbiB0aGUgb2JqZWN0IHN0b3JhZ2UuCisgICAgICAoaWYgKGVxIG9sZC1v
YmplY3QgKGNhciBvYmplY3RzKSkKKyAgICAgICAgICA7OyBJdCdzIGF0IHRoZSBoZWFkLCBzbyBy
ZXBsYWNlIGl0IHRoZXJlLgorICAgICAgICAgIChzZXRmICh2dGFibGUtb2JqZWN0cyB0YWJsZSkK
KyAgICAgICAgICAgICAgICAoY29ucyBvYmplY3QgKGNkciBvYmplY3RzKSkpCisgICAgICAgIDs7
IE90aGVyd2lzZSBzcGxpY2UgaW50byB0aGUgbGlzdC4KKyAgICAgICAgKHdoaWxlIChhbmQgKGNk
ciBvYmplY3RzKQorICAgICAgICAgICAgICAgICAgICAobm90IChlcSAoY2FkciBvYmplY3RzKSBv
bGQtb2JqZWN0KSkpCisgICAgICAgICAgKHNldHEgb2JqZWN0cyAoY2RyIG9iamVjdHMpKSkKKyAg
ICAgICAgKHVubGVzcyAoY2RyIG9iamVjdHMpCisgICAgICAgICAgKGVycm9yICJDYW4ndCBmaW5k
IHRoZSBvbGQgb2JqZWN0IikpCisgICAgICAgIChzZXRjYXIgKGNkciBvYmplY3RzKSBvYmplY3Qp
KQorICAgICAgOzsgVGhlbiB1cGRhdGUgdGhlIHJlbmRlcmVkIHZ0YWJsZSBpbiB0aGUgY3VycmVu
dCBidWZmZXIuCisgICAgICAoaWYtbGV0KiAoKGNhY2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUp
KQorICAgICAgICAgICAgICAgIChsaW5lLW51bWJlciAoc2VxLXBvc2l0aW9uICh2dGFibGUtLWNh
Y2hlLWxpbmVzIGNhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG9sZC1vYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAobGFtYmRhIChhIGIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAoZXF1YWwgKGNhciBhKSBiKSkpKQorICAgICAgICAgICAgICAgIChsaW5lIChlbHQgKHZ0
YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpIGxpbmUtbnVtYmVyKSkpCisgICAgICAgICAgKHByb2du
CisgICAgICAgICAgICAoc2V0Y2FyIGxpbmUgb2JqZWN0KQorICAgICAgICAgICAgKHNldGNkciBs
aW5lICh2dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUgdGFibGUgb2JqZWN0KSkKKyAgICAgICAg
ICAgIDs7IC4uLiBhbmQgcmVkaXNwbGF5IHRoZSBsaW5lIGluIHF1ZXN0aW9uLgorICAgICAgICAg
ICAgKHNhdmUtZXhjdXJzaW9uCisgICAgICAgICAgICAgICh2dGFibGUtZ290by1vYmplY3Qgb2xk
LW9iamVjdCkKKyAgICAgICAgICAgICAgKGxldCAoKGtleW1hcCAoZ2V0LXRleHQtcHJvcGVydHkg
KHBvaW50KSAna2V5bWFwKSkKKyAgICAgICAgICAgICAgICAgICAgKHN0YXJ0IChwb2ludCkpKQor
ICAgICAgICAgICAgICAgIChkZWxldGUtbGluZSkKKyAgICAgICAgICAgICAgICAodnRhYmxlLS1p
bnNlcnQtbGluZSB0YWJsZSBsaW5lIGxpbmUtbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2FjaGUtd2lkdGhzIGNhY2hlKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLXNwYWNlciB0YWJsZSkpCisgICAgICAg
ICAgICAgICAgKGFkZC10ZXh0LXByb3BlcnRpZXMgc3RhcnQgKHBvaW50KSAobGlzdCAna2V5bWFw
IGtleW1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgJ3Z0YWJsZSB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZS1jYWNoZSBjYWNoZSkpKSkKKyAgICAgICAg
ICAgIDs7IFdlIG1heSBoYXZlIGluc2VydGVkIGEgbm9uLW51bWVyaWNhbCB2YWx1ZSBpbnRvIGEg
cHJldmlvdXNseQorICAgICAgICAgICAgOzsgYWxsLW51bWVyaWNhbCB0YWJsZSwgc28gcmVjb21w
dXRlLgorICAgICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAoY2Ry
IGxpbmUpKSkKKyAgICAgICAgKGVycm9yICJDYW4ndCBmaW5kIGNhY2hlZCBvYmplY3QgaW4gdnRh
YmxlIikpKSkpCiAKIChkZWZ1biB2dGFibGUtcmVtb3ZlLW9iamVjdCAodGFibGUgb2JqZWN0KQog
ICAiUmVtb3ZlIE9CSkVDVCBmcm9tIFRBQkxFLgogVGhpcyB3aWxsIGFsc28gcmVtb3ZlIHRoZSBk
aXNwbGF5ZWQgbGluZS4iCi0gIDs7IEZpcnN0IHJlbW92ZSBmcm9tIHRoZSBvYmplY3RzLgotICAo
c2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpIChkZWxxIG9iamVjdCAodnRhYmxlLW9iamVjdHMg
dGFibGUpKSkKLSAgOzsgVGhlbiBhZGp1c3QgdGhlIGNhY2hlIGFuZCBkaXNwbGF5LgotICAoc2F2
ZS1leGN1cnNpb24KLSAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCi0gICAgKGxldCAoKGNh
Y2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKQotICAgICAgICAgIChpbmhpYml0LXJlYWQtb25s
eSB0KSkKLSAgICAgIChzZXRjYXIgY2FjaGUgKGRlbHEgKGFzc3Egb2JqZWN0ICh2dGFibGUtLWNh
Y2hlLWxpbmVzIGNhY2hlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2Fj
aGUtbGluZXMgY2FjaGUpKSkKLSAgICAgICh3aGVuICh2dGFibGUtZ290by1vYmplY3Qgb2JqZWN0
KQotICAgICAgICAoZGVsZXRlLWxpbmUpKSkpKQorICAod2l0aC1jdXJyZW50LWJ1ZmZlciAodnRh
YmxlLWJ1ZmZlciB0YWJsZSkKKyAgICA7OyBGaXJzdCByZW1vdmUgZnJvbSB0aGUgb2JqZWN0cy4K
KyAgICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpIChkZWxxIG9iamVjdCAodnRhYmxlLW9i
amVjdHMgdGFibGUpKSkKKyAgICA7OyBUaGVuIGFkanVzdCB0aGUgY2FjaGUgYW5kIGRpc3BsYXku
CisgICAgKHNhdmUtZXhjdXJzaW9uCisgICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCisg
ICAgICAobGV0ICgoY2FjaGUgKHZ0YWJsZS0tY3VycmVudC1jYWNoZSkpCisgICAgICAgICAgICAo
aW5oaWJpdC1yZWFkLW9ubHkgdCkpCisgICAgICAgIChzZXRjYXIgY2FjaGUgKGRlbHEgKGFzc3Eg
b2JqZWN0ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkpKQorICAgICAgICAod2hlbiAodnRh
YmxlLWdvdG8tb2JqZWN0IG9iamVjdCkKKyAgICAgICAgICAoZGVsZXRlLWxpbmUpKSkpKSkKIAog
OzsgRklYTUU6IFRoZSBmYWN0IHRoYXQgdGhlIGBsb2NhdGlvbicgYXJndW1lbnQgb2YKIDs7IGB2
dGFibGUtaW5zZXJ0LW9iamVjdCcgY2FuIGJlIGFuIGludGVnZXIgYW5kIGlzIHRoZW4gaW50ZXJw
cmV0ZWQgYXMKQEAgLTM2Myw5MSArMzgwLDkyIEBAIHZ0YWJsZS1pbnNlcnQtb2JqZWN0CiBjYXNl
LgogCiBUaGlzIGFsc28gdXBkYXRlcyB0aGUgZGlzcGxheWVkIHRhYmxlLiIKLSAgOzsgSWYgdGhl
IHZ0YWJsZSBpcyBlbXB0eSwganVzdCBhZGQgdGhlIG9iamVjdCBhbmQgcmVnZW5lcmF0ZSB0aGUK
LSAgOzsgdGFibGUuCi0gIChpZiAobnVsbCAodnRhYmxlLW9iamVjdHMgdGFibGUpKQotICAgICAg
KHByb2duCi0gICAgICAgIChzZXRmICh2dGFibGUtb2JqZWN0cyB0YWJsZSkgKGxpc3Qgb2JqZWN0
KSkKLSAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAodnRhYmxlLS1j
b21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpCi0gICAgICAgICh2dGFibGUtZ290by10
YWJsZSB0YWJsZSkKLSAgICAgICAgKHZ0YWJsZS1yZXZlcnQtY29tbWFuZCkpCi0gICAgOzsgRmly
c3QgaW5zZXJ0IGludG8gdGhlIG9iamVjdHMuCi0gICAgKGxldCAoKHBvcyAoaWYgbG9jYXRpb24K
LSAgICAgICAgICAgICAgICAgICAoaWYgKGludGVnZXJwIGxvY2F0aW9uKQotICAgICAgICAgICAg
ICAgICAgICAgICAocHJvZzEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChudGhjZHIgbG9j
YXRpb24gKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICA7
OyBEbyBub3QgcHJlcGVuZCBpZiBpbmRleCBpcyB0b28gbGFyZ2U6Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgKHNldHEgYmVmb3JlIG5pbCkpCi0gICAgICAgICAgICAgICAgICAgICAob3IgKG1l
bXEgbG9jYXRpb24gKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgICA7OyBQcmVwZW5kIGlmIGBsb2NhdGlvbicgaXMgbm90IGZvdW5kIGFuZAotICAgICAgICAg
ICAgICAgICAgICAgICAgIDs7IGBiZWZvcmUnIGlzIG5vbi1uaWw6Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgKGFuZCBiZWZvcmUgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkpKQotICAgICAgICAg
ICAgICAgICA7OyBJZiBgbG9jYXRpb24nIGlzIG5pbCBhbmQgYGJlZm9yZScgaXMgbm9uLW5pbCwg
d2UKLSAgICAgICAgICAgICAgICAgOzsgcHJlcGVuZCB0aGUgbmV3IG9iamVjdC4KLSAgICAgICAg
ICAgICAgICAgKGlmIGJlZm9yZSAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkpKQotICAgICAgKGlm
IChvciBiZWZvcmUgIDsgSWYgYGJlZm9yZScgaXMgbm9uLW5pbCwgYHBvcycgc2hvdWxkIGJlLCBh
cyB3ZWxsLgotICAgICAgICAgICAgICAoYW5kIHBvcyAoaW50ZWdlcnAgbG9jYXRpb24pKSkKLSAg
ICAgICAgICA7OyBBZGQgdGhlIG5ldyBvYmplY3QgYmVmb3JlLgotICAgICAgICAgIChsZXQgKChv
bGQtb2JqZWN0IChjYXIgcG9zKSkpCi0gICAgICAgICAgICAoc2V0Y2FyIHBvcyBvYmplY3QpCi0g
ICAgICAgICAgICAoc2V0Y2RyIHBvcyAoY29ucyBvbGQtb2JqZWN0IChjZHIgcG9zKSkpKQotICAg
ICAgICA7OyBPdGhlcndpc2UsIGFkZCB0aGUgb2JqZWN0IGFmdGVyLgotICAgICAgICAoaWYgcG9z
Ci0gICAgICAgICAgICA7OyBTcGxpY2UgdGhlIG9iamVjdCBpbnRvIHRoZSBsaXN0LgotICAgICAg
ICAgICAgKHNldGNkciBwb3MgKGNvbnMgb2JqZWN0IChjZHIgcG9zKSkpCi0gICAgICAgICAgOzsg
T3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVjdC4KLSAgICAgICAgICAobmNvbmMgKHZ0YWJsZS1v
YmplY3RzIHRhYmxlKSAobGlzdCBvYmplY3QpKSkpKQotICAgIDs7IFRoZW4gYWRqdXN0IHRoZSBj
YWNoZSBhbmQgZGlzcGxheS4KLSAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgICh2dGFibGUtZ290
by10YWJsZSB0YWJsZSkKLSAgICAgIChsZXQqICgoY2FjaGUgKHZ0YWJsZS0tY3VycmVudC1jYWNo
ZSkpCi0gICAgICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQpCi0gICAgICAgICAgICAgKGtl
eW1hcCAoZ2V0LXRleHQtcHJvcGVydHkgKHBvaW50KSAna2V5bWFwKSkKLSAgICAgICAgICAgICAo
ZWxsaXBzaXMgKGlmICh2dGFibGUtZWxsaXBzaXMgdGFibGUpCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAocHJvcGVydGl6ZSAodHJ1bmNhdGUtc3RyaW5nLWVsbGlwc2lzKQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhY2UgKHZ0YWJsZS1mYWNlIHRhYmxlKSkK
LSAgICAgICAgICAgICAgICAgICAgICAgICAiIikpCi0gICAgICAgICAgICAgKGVsbGlwc2lzLXdp
ZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggZWxsaXBzaXMpKQotICAgICAgICAgICAgIChsaW5lcyAo
dnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkpCi0gICAgICAgICAgICAgKGVsZW0gKGlmIGxvY2F0
aW9uICA7IFRoaXMgYmluZGluZyBtaXJyb3JzIHRoZSBiaW5kaW5nIG9mIGBwb3MnIGFib3ZlLgot
ICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGludGVnZXJwIGxvY2F0aW9uKQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKG50aCBsb2NhdGlvbiBsaW5lcykKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAob3IgKGFzc3EgbG9jYXRpb24gbGluZXMpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChhbmQgYmVmb3JlIChjYXIgbGluZXMpKSkpCi0gICAgICAgICAgICAgICAgICAgICAo
aWYgYmVmb3JlIChjYXIgbGluZXMpKSkpCi0gICAgICAgICAgICAgKHBvcyAobWVtcSBlbGVtIGxp
bmVzKSkKLSAgICAgICAgICAgICAobGluZSAoY29ucyBvYmplY3QgKHZ0YWJsZS0tY29tcHV0ZS1j
YWNoZWQtbGluZSB0YWJsZSBvYmplY3QpKSkpCi0gICAgICAgIChpZiAob3IgYmVmb3JlCisgICh3
aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKQorICAgIDs7IElmIHRoZSB2
dGFibGUgaXMgZW1wdHksIGp1c3QgYWRkIHRoZSBvYmplY3QgYW5kIHJlZ2VuZXJhdGUgdGhlCisg
ICAgOzsgdGFibGUuCisgICAgKGlmIChudWxsICh2dGFibGUtb2JqZWN0cyB0YWJsZSkpCisgICAg
ICAgIChwcm9nbgorICAgICAgICAgIChzZXRmICh2dGFibGUtb2JqZWN0cyB0YWJsZSkgKGxpc3Qg
b2JqZWN0KSkKKyAgICAgICAgICAodnRhYmxlLS1yZWNvbXB1dGUtbnVtZXJpY2FsIHRhYmxlICh2
dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUgdGFibGUgb2JqZWN0KSkKKyAgICAgICAgICAodnRh
YmxlLWdvdG8tdGFibGUgdGFibGUpCisgICAgICAgICAgKHZ0YWJsZS1yZXZlcnQtY29tbWFuZCkp
CisgICAgICA7OyBGaXJzdCBpbnNlcnQgaW50byB0aGUgb2JqZWN0cy4KKyAgICAgIChsZXQgKChw
b3MgKGlmIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAoaWYgKGludGVnZXJwIGxvY2F0
aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9nMQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAobnRoY2RyIGxvY2F0aW9uICh2dGFibGUtb2JqZWN0cyB0YWJsZSkpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICA7OyBEbyBub3QgcHJlcGVuZCBpZiBpbmRleCBpcyB0b28g
bGFyZ2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0cSBiZWZvcmUgbmlsKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgKG9yIChtZW1xIGxvY2F0aW9uICh2dGFibGUtb2JqZWN0cyB0
YWJsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBQcmVwZW5kIGlmIGBsb2NhdGlv
bicgaXMgbm90IGZvdW5kIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgYGJlZm9y
ZScgaXMgbm9uLW5pbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgYmVmb3JlICh2
dGFibGUtb2JqZWN0cyB0YWJsZSkpKSkKKyAgICAgICAgICAgICAgICAgICA7OyBJZiBgbG9jYXRp
b24nIGlzIG5pbCBhbmQgYGJlZm9yZScgaXMgbm9uLW5pbCwgd2UKKyAgICAgICAgICAgICAgICAg
ICA7OyBwcmVwZW5kIHRoZSBuZXcgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgIChpZiBiZWZv
cmUgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkpKSkKKyAgICAgICAgKGlmIChvciBiZWZvcmUgIDsg
SWYgYGJlZm9yZScgaXMgbm9uLW5pbCwgYHBvcycgc2hvdWxkIGJlLCBhcyB3ZWxsLgogICAgICAg
ICAgICAgICAgIChhbmQgcG9zIChpbnRlZ2VycCBsb2NhdGlvbikpKQotICAgICAgICAgICAgOzsg
QWRkIHRoZSBuZXcgb2JqZWN0IGJlZm9yZTouCi0gICAgICAgICAgICAobGV0ICgob2xkLWxpbmUg
KGNhciBwb3MpKSkKLSAgICAgICAgICAgICAgKHNldGNhciBwb3MgbGluZSkKLSAgICAgICAgICAg
ICAgKHNldGNkciBwb3MgKGNvbnMgb2xkLWxpbmUgKGNkciBwb3MpKSkKLSAgICAgICAgICAgICAg
KHVubGVzcyAodnRhYmxlLWdvdG8tb2JqZWN0IChjYXIgZWxlbSkpCi0gICAgICAgICAgICAgICAg
KHZ0YWJsZS1iZWdpbm5pbmctb2YtdGFibGUpKSkKKyAgICAgICAgICAgIDs7IEFkZCB0aGUgbmV3
IG9iamVjdCBiZWZvcmUuCisgICAgICAgICAgICAobGV0ICgob2xkLW9iamVjdCAoY2FyIHBvcykp
KQorICAgICAgICAgICAgICAoc2V0Y2FyIHBvcyBvYmplY3QpCisgICAgICAgICAgICAgIChzZXRj
ZHIgcG9zIChjb25zIG9sZC1vYmplY3QgKGNkciBwb3MpKSkpCiAgICAgICAgICAgOzsgT3RoZXJ3
aXNlLCBhZGQgdGhlIG9iamVjdCBhZnRlci4KICAgICAgICAgICAoaWYgcG9zCiAgICAgICAgICAg
ICAgIDs7IFNwbGljZSB0aGUgb2JqZWN0IGludG8gdGhlIGxpc3QuCi0gICAgICAgICAgICAgIChw
cm9nbgotICAgICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIGxpbmUgKGNkciBwb3MpKSkK
LSAgICAgICAgICAgICAgICAoaWYgKHZ0YWJsZS1nb3RvLW9iamVjdCBsb2NhdGlvbikKLSAgICAg
ICAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAxKSAgOyBJbnNlcnQgKmFmdGVyKi4KLSAgICAg
ICAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCisgICAgICAgICAgICAgIChzZXRj
ZHIgcG9zIChjb25zIG9iamVjdCAoY2RyIHBvcykpKQogICAgICAgICAgICAgOzsgT3RoZXJ3aXNl
LCBhcHBlbmQgdGhlIG9iamVjdC4KLSAgICAgICAgICAgIChzZXRjYXIgY2FjaGUgKG5jb25jIGxp
bmVzIChsaXN0IGxpbmUpKSkKLSAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCi0g
ICAgICAgIChsZXQgKChzdGFydCAocG9pbnQpKSkKLSAgICAgICAgICA7OyBGSVhNRTogV2UgaGF2
ZSB0byBhZGp1c3QgY29sb3JzIGluIGxpbmVzIGJlbG93IHRoaXMgaWYgd2UKLSAgICAgICAgICA7
OyBoYXZlIDpyb3ctY29sb3JzLgotICAgICAgICAgICh2dGFibGUtLWluc2VydC1saW5lIHRhYmxl
IGxpbmUgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWNhY2hlLXdp
ZHRocyBjYWNoZSkgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGVsbGlwc2lzIGVsbGlwc2lzLXdpZHRoKQotICAgICAgICAgIChhZGQtdGV4dC1w
cm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkgKGxpc3QgJ2tleW1hcCBrZXltYXAKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2dGFibGUgdGFibGUKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2dGFibGUt
Y2FjaGUgY2FjaGUpKSkKLSAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5zZXJ0ZWQgYSBub24tbnVt
ZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5Ci0gICAgICAgIDs7IGFsbC1udW1lcmljYWwg
dGFibGUsIHNvIHJlY29tcHV0ZS4KLSAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNh
bCB0YWJsZSAoY2RyIGxpbmUpKSkpKSkKKyAgICAgICAgICAgIChuY29uYyAodnRhYmxlLW9iamVj
dHMgdGFibGUpIChsaXN0IG9iamVjdCkpKSkpCisgICAgICA7OyBUaGVuIGFkanVzdCB0aGUgY2Fj
aGUgYW5kIGRpc3BsYXkuCisgICAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgICAgKHZ0YWJsZS1n
b3RvLXRhYmxlIHRhYmxlKQorICAgICAgICAobGV0KiAoKGNhY2hlICh2dGFibGUtLWN1cnJlbnQt
Y2FjaGUpKQorICAgICAgICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQpCisgICAgICAgICAg
ICAgICAoa2V5bWFwIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICdrZXltYXApKQorICAgICAg
ICAgICAgICAgKGVsbGlwc2lzIChpZiAodnRhYmxlLWVsbGlwc2lzIHRhYmxlKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAodHJ1bmNhdGUtc3RyaW5nLWVsbGlwc2lz
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFjZSAodnRhYmxl
LWZhY2UgdGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpKQorICAgICAgICAg
ICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggZWxsaXBzaXMgKGN1cnJl
bnQtYnVmZmVyKSkpCisgICAgICAgICAgICAgICAobGluZXMgKHZ0YWJsZS0tY2FjaGUtbGluZXMg
Y2FjaGUpKQorICAgICAgICAgICAgICAgKGVsZW0gKGlmIGxvY2F0aW9uICA7IFRoaXMgYmluZGlu
ZyBtaXJyb3JzIHRoZSBiaW5kaW5nIG9mIGBwb3MnIGFib3ZlLgorICAgICAgICAgICAgICAgICAg
ICAgICAgIChpZiAoaW50ZWdlcnAgbG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChudGggbG9jYXRpb24gbGluZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAob3Ig
KGFzc3EgbG9jYXRpb24gbGluZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFu
ZCBiZWZvcmUgKGNhciBsaW5lcykpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgKGlmIGJlZm9y
ZSAoY2FyIGxpbmVzKSkpKQorICAgICAgICAgICAgICAgKHBvcyAobWVtcSBlbGVtIGxpbmVzKSkK
KyAgICAgICAgICAgICAgIChsaW5lIChjb25zIG9iamVjdCAodnRhYmxlLS1jb21wdXRlLWNhY2hl
ZC1saW5lIHRhYmxlIG9iamVjdCkpKSkKKyAgICAgICAgICAoaWYgKG9yIGJlZm9yZQorICAgICAg
ICAgICAgICAgICAgKGFuZCBwb3MgKGludGVnZXJwIGxvY2F0aW9uKSkpCisgICAgICAgICAgICAg
IDs7IEFkZCB0aGUgbmV3IG9iamVjdCBiZWZvcmU6LgorICAgICAgICAgICAgICAobGV0ICgob2xk
LWxpbmUgKGNhciBwb3MpKSkKKyAgICAgICAgICAgICAgICAoc2V0Y2FyIHBvcyBsaW5lKQorICAg
ICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIG9sZC1saW5lIChjZHIgcG9zKSkpCisgICAg
ICAgICAgICAgICAgKHVubGVzcyAodnRhYmxlLWdvdG8tb2JqZWN0IChjYXIgZWxlbSkpCisgICAg
ICAgICAgICAgICAgICAodnRhYmxlLWJlZ2lubmluZy1vZi10YWJsZSkpKQorICAgICAgICAgICAg
OzsgT3RoZXJ3aXNlLCBhZGQgdGhlIG9iamVjdCBhZnRlci4KKyAgICAgICAgICAgIChpZiBwb3MK
KyAgICAgICAgICAgICAgICA7OyBTcGxpY2UgdGhlIG9iamVjdCBpbnRvIHRoZSBsaXN0LgorICAg
ICAgICAgICAgICAgIChwcm9nbgorICAgICAgICAgICAgICAgICAgKHNldGNkciBwb3MgKGNvbnMg
bGluZSAoY2RyIHBvcykpKQorICAgICAgICAgICAgICAgICAgKGlmICh2dGFibGUtZ290by1vYmpl
Y3QgbG9jYXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAxKSAgOyBJ
bnNlcnQgKmFmdGVyKi4KKyAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS1lbmQtb2YtdGFibGUp
KSkKKyAgICAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVjdC4KKyAgICAg
ICAgICAgICAgKHNldGNhciBjYWNoZSAobmNvbmMgbGluZXMgKGxpc3QgbGluZSkpKQorICAgICAg
ICAgICAgICAodnRhYmxlLWVuZC1vZi10YWJsZSkpKQorICAgICAgICAgIChsZXQgKChzdGFydCAo
cG9pbnQpKSkKKyAgICAgICAgICAgIDs7IEZJWE1FOiBXZSBoYXZlIHRvIGFkanVzdCBjb2xvcnMg
aW4gbGluZXMgYmVsb3cgdGhpcyBpZiB3ZQorICAgICAgICAgICAgOzsgaGF2ZSA6cm93LWNvbG9y
cy4KKyAgICAgICAgICAgICh2dGFibGUtLWluc2VydC1saW5lIHRhYmxlIGxpbmUgMAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2FjaGUtd2lkdGhzIGNhY2hlKSAo
dnRhYmxlLS1zcGFjZXIgdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl
bGxpcHNpcyBlbGxpcHNpcy13aWR0aCkKKyAgICAgICAgICAgIChhZGQtdGV4dC1wcm9wZXJ0aWVz
IHN0YXJ0IChwb2ludCkgKGxpc3QgJ2tleW1hcCBrZXltYXAKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlLWNhY2hl
IGNhY2hlKSkpCisgICAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5zZXJ0ZWQgYSBub24tbnVtZXJp
Y2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5CisgICAgICAgICAgOzsgYWxsLW51bWVyaWNhbCB0
YWJsZSwgc28gcmVjb21wdXRlLgorICAgICAgICAgICh2dGFibGUtLXJlY29tcHV0ZS1udW1lcmlj
YWwgdGFibGUgKGNkciBsaW5lKSkpKSkpKQogCiAoZGVmdW4gdnRhYmxlLWNvbHVtbiAodGFibGUg
aW5kZXgpCiAgICJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIElOREVYdGggY29sdW1uIGluIFRBQkxF
LiIKQEAgLTUyMCwxNCArNTM4LDE0IEBAIHZ0YWJsZS0tY2FjaGUtd2lkdGhzCiAoZGVmdW4gdnRh
YmxlLS1jYWNoZS1saW5lcyAoY2FjaGUpCiAgIChjYXIgY2FjaGUpKQogCi0oZGVmdW4gdnRhYmxl
LWluc2VydCAodGFibGUpCisoZGVmdW4gdnRhYmxlLS1pbnNlcnQgKHRhYmxlKQogICAobGV0KiAo
KHNwYWNlciAodnRhYmxlLS1zcGFjZXIgdGFibGUpKQogICAgICAgICAgKHN0YXJ0IChwb2ludCkp
CiAgICAgICAgICAoZWxsaXBzaXMgKGlmICh2dGFibGUtZWxsaXBzaXMgdGFibGUpCiAgICAgICAg
ICAgICAgICAgICAgICAgIChwcm9wZXJ0aXplICh0cnVuY2F0ZS1zdHJpbmctZWxsaXBzaXMpCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWNlICh2dGFibGUtZmFjZSB0YWJs
ZSkpCiAgICAgICAgICAgICAgICAgICAgICAiIikpCi0gICAgICAgICAoZWxsaXBzaXMtd2lkdGgg
KHN0cmluZy1waXhlbC13aWR0aCBlbGxpcHNpcykpCisgICAgICAgICAoZWxsaXBzaXMtd2lkdGgg
KHN0cmluZy1waXhlbC13aWR0aCBlbGxpcHNpcyAoY3VycmVudC1idWZmZXIpKSkKICAgICAgICAg
IDs7IFdlIG1haW50YWluIGEgY2FjaGUgcGVyIHNjcmVlbi93aW5kb3cgd2lkdGgsIHNvIHRoYXQg
d2UgcmVuZGVyCiAgICAgICAgICA7OyBjb3JyZWN0bHkgaWYgRW1hY3MgaXMgb3BlbiBvbiB0d28g
ZGlmZmVyZW50IHNjcmVlbnMgKG9yIHRoZQogICAgICAgICAgOzsgdXNlciByZXNpemVzIHRoZSBm
cmFtZSkuCkBAIC01NjUsOSArNTgzLDI0IEBAIHZ0YWJsZS1pbnNlcnQKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAndnRhYmxlLWNhY2hlIGNhY2hlKSkKICAgICAoZ290by1jaGFyIHN0
YXJ0KSkpCiAKKyhkZWZ1biB2dGFibGUtaW5zZXJ0ICh0YWJsZSkKKyAgIkluc2VydCBUQUJMRSBp
bnRvIHRoZSBjdXJyZW50IGJ1ZmZlci4KK1RoZSBjdXJyZW50IGJ1ZmZlciB3aWxsIGJlIHJlY29y
ZGVkIGFzIFRBQkxFJ3MgYnVmZmVyLiAgSWYgdGhpcyBpcyBkb25lCittb3JlIHRoYW4gb25jZSwg
b3IgaWYgdGhlIHRhYmxlIGlzIGF0dGVtcHRlZCB0byBiZSBpbnNlcnRlZCBtb3JlIHRoYW4KK29u
Y2UgaW50byB0aGUgc2FtZSBidWZmZXIsIHNpZ25hbCBhbiBlcnJvci4iCisgIChpZi1sZXQqICgo
dGFibGUtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKSkpCisgICAgICAoaWYgKGVxIHRhYmxl
LWJ1ZmZlciAoY3VycmVudC1idWZmZXIpKQorICAgICAgICAgIChlcnJvciAiQSB2dGFibGUgY2Fu
bm90IGJlIGluc2VydGVkIG1vcmUgdGhhbiBvbmNlIGludG8gYSBidWZmZXIiKQorICAgICAgICAo
ZXJyb3IgIkEgdnRhYmxlIGNhbm5vdCBiZSBpbnNlcnRlZCBpbnRvIG1vcmUgdGhhbiBvbmUgYnVm
ZmVyIikpKQorICAodnRhYmxlLXNldC1idWZmZXIgKGN1cnJlbnQtYnVmZmVyKSB0YWJsZSkKKyAg
KGxldCAoKGluaGliaXQtcmVhZC1vbmx5IHQpCisgICAgICAgIChpbmhpYml0LW1vZGlmaWNhdGlv
bi1ob29rcyB0KSkKKyAgICAodnRhYmxlLS1pbnNlcnQgdGFibGUpKSkKKwogKGRlZnVuIHZ0YWJs
ZS0taW5zZXJ0LWxpbmUgKHRhYmxlIGxpbmUgbGluZS1udW1iZXIgd2lkdGhzIHNwYWNlcgogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25hbCBlbGxpcHNpcyBlbGxpcHNp
cy13aWR0aCkKICAgKGxldCAoKHN0YXJ0IChwb2ludCkpCisgICAgICAgIChidWZmZXIgKHZ0YWJs
ZS1idWZmZXIgdGFibGUpKQogICAgICAgICAoY29sdW1ucyAodnRhYmxlLWNvbHVtbnMgdGFibGUp
KQogICAgICAgICAoY29sdW1uLWNvbG9ycwogICAgICAgICAgKGFuZCAodnRhYmxlLWNvbHVtbi1j
b2xvcnMgdGFibGUpCkBAIC02MDcsMTYgKzY0MCwxOCBAQCB2dGFibGUtLWluc2VydC1saW5lCiAg
ICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdAogICAgICAgICAgICAgICAgICAgICAgICAodnRh
YmxlLS1saW1pdC1zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1jb21wdXRlZCAo
LSAoZWx0IHdpZHRocyBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAob3IgZWxsaXBzaXMtd2lkdGggMCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChvciBlbGxpcHNpcy13aWR0aCAwKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMpCiAgICAgICAgICAg
ICAgICAgICAgIHByZS1jb21wdXRlZCkpCiAgICAgICAgICAgICAgICAgIDs7IFJlY29tcHV0ZSB3
aWR0aHMuCiAgICAgICAgICAgICAgICAgICh0Ci0gICAgICAgICAgICAgICAgICAoaWYgKD4gKHN0
cmluZy1waXhlbC13aWR0aCB2YWx1ZSkgKGVsdCB3aWR0aHMgaW5kZXgpKQorICAgICAgICAgICAg
ICAgICAgKGlmICg+IChzdHJpbmctcGl4ZWwtd2lkdGggdmFsdWUgYnVmZmVyKSAoZWx0IHdpZHRo
cyBpbmRleCkpCiAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdAogICAgICAgICAgICAgICAg
ICAgICAgICAodnRhYmxlLS1saW1pdC1zdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIHZh
bHVlICgtIChlbHQgd2lkdGhzIGluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKG9yIGVsbGlwc2lzLXdpZHRoIDApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChvciBlbGxpcHNpcy13aWR0aCAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZl
cikKICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMpCiAgICAgICAgICAgICAgICAgICAg
IHZhbHVlKSkpKQogICAgICAgICAgICAgICAgKHN0YXJ0IChwb2ludCkpCkBAIC02MzAsMTQgKzY2
NSwxNSBAQCB2dGFibGUtLWluc2VydC1saW5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChs
aXN0ICdzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6d2lkdGggKGxpc3QK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKyAoLSAoZWx0IHdpZHRo
cyBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
c3RyaW5nLXBpeGVsLXdpZHRoIGRpc3BsYXllZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1waXhlbC13aWR0aAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWQgYnVmZmVyKSkKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgbGFzdCAwIHNwYWNlcikp
KSkpKSkKICAgICAgICAgICAgICA7OyBBbGlnbiB0byB0aGUgcmlnaHQuCiAgICAgICAgICAgICAg
KGluc2VydCAocHJvcGVydGl6ZSAiICIgJ2Rpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChsaXN0ICdzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgOndpZHRoIChsaXN0ICgtIChlbHQgd2lkdGhzIGluZGV4KQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctcGl4ZWwtd2lk
dGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZGlzcGxheWVkKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZGlzcGxheWVkIGJ1ZmZlcikpKSkpCiAgICAgICAgICAgICAgICAg
ICAgICBkaXNwbGF5ZWQpCiAgICAgICAgICAgICAgKHVubGVzcyBsYXN0CiAgICAgICAgICAgICAg
ICAoaW5zZXJ0IChwcm9wZXJ0aXplICIgIiAnZGlzcGxheQpAQCAtNzE4LDYgKzc1NCw3IEBAIHZ0
YWJsZS0taW5kaWNhdG9yCiAoZGVmdW4gdnRhYmxlLS1pbnNlcnQtaGVhZGVyLWxpbmUgKHRhYmxl
IHdpZHRocyBzcGFjZXIpCiAgIDs7IEluc2VydCB0aGUgaGVhZGVyIGRpcmVjdGx5IGludG8gdGhl
IGJ1ZmZlci4KICAgKGxldCAoKHN0YXJ0IChwb2ludCkpCisgICAgICAgIChidWZmZXIgKHZ0YWJs
ZS1idWZmZXIgdGFibGUpKQogICAgICAgICAoZGl2aWRlciAodnRhYmxlLWRpdmlkZXIgdGFibGUp
KQogICAgICAgICAoY21hcCAoZGVmaW5lLWtleW1hcAogICAgICAgICAgICAgICAgICI8aGVhZGVy
LWxpbmU+IDxkcmFnLW1vdXNlLTE+IiAjJ3Z0YWJsZS0tZHJhZy1yZXNpemUtY29sdW1uCkBAIC03
MzcsMTQgKzc3NCwxNSBAQCB2dGFibGUtLWluc2VydC1oZWFkZXItbGluZQogICAgICAgICAgICAg
ICAgICAgICAgJ2tleW1hcCBjbWFwKSkKICAgICAgICAgICAgICAgKHN0YXJ0IChwb2ludCkpCiAg
ICAgICAgICAgICAgIChpbmRpY2F0b3IgKHZ0YWJsZS0taW5kaWNhdG9yIHRhYmxlIGluZGV4KSkK
LSAgICAgICAgICAgICAgKGluZGljYXRvci13aWR0aCAoc3RyaW5nLXBpeGVsLXdpZHRoIGluZGlj
YXRvcikpCisgICAgICAgICAgICAgIChpbmRpY2F0b3Itd2lkdGggKHN0cmluZy1waXhlbC13aWR0
aCBpbmRpY2F0b3IgYnVmZmVyKSkKICAgICAgICAgICAgICAgKGxhc3QgKD0gaW5kZXggKDEtIChs
ZW5ndGggKHZ0YWJsZS1jb2x1bW5zIHRhYmxlKSkpKSkKICAgICAgICAgICAgICAgZGlzcGxheWVk
KQogICAgICAgICAgKHNldHEgZGlzcGxheWVkCi0gICAgICAgICAgICAgICAoaWYgKD4gKHN0cmlu
Zy1waXhlbC13aWR0aCBuYW1lKQorICAgICAgICAgICAgICAgKGlmICg+IChzdHJpbmctcGl4ZWwt
d2lkdGggbmFtZSBidWZmZXIpCiAgICAgICAgICAgICAgICAgICAgICAgKC0gKGVsdCB3aWR0aHMg
aW5kZXgpIGluZGljYXRvci13aWR0aCkpCiAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tbGlt
aXQtc3RyaW5nCi0gICAgICAgICAgICAgICAgICAgIG5hbWUgKC0gKGVsdCB3aWR0aHMgaW5kZXgp
IGluZGljYXRvci13aWR0aCkpCisgICAgICAgICAgICAgICAgICAgIG5hbWUgKC0gKGVsdCB3aWR0
aHMgaW5kZXgpIGluZGljYXRvci13aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyKQog
ICAgICAgICAgICAgICAgICBuYW1lKSkKICAgICAgICAgIChsZXQqICgoaW5kaWNhdG9yLWxlYWQt
d2lkdGgKICAgICAgICAgICAgICAgICAgOzsgV2Ugd2FudCB0aGUgaW5kaWNhdG9yIHRvIG5vdCBi
ZSBxdWl0ZSBmbHVzaCByaWdodC4KQEAgLTc1Myw3ICs3OTEsNyBAQCB2dGFibGUtLWluc2VydC1o
ZWFkZXItbGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGlj
YXRvci1sZWFkLXdpZHRoKSkKICAgICAgICAgICAgICAgICAoZmlsbC13aWR0aAogICAgICAgICAg
ICAgICAgICAoKyAoLSAoZWx0IHdpZHRocyBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAg
KHN0cmluZy1waXhlbC13aWR0aCBkaXNwbGF5ZWQpCisgICAgICAgICAgICAgICAgICAgICAgIChz
dHJpbmctcGl4ZWwtd2lkdGggZGlzcGxheWVkIGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICAg
ICAgaW5kaWNhdG9yLXdpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvci1sZWFk
LXdpZHRoKQogICAgICAgICAgICAgICAgICAgICAoaWYgbGFzdCAwIHNwYWNlcikpKSkKQEAgLTc3
MSw3ICs4MDksOCBAQCB2dGFibGUtLWluc2VydC1oZWFkZXItbGluZQogICAgICAgICAgICAgIDs7
IFRoaXMgaXMgdGhlIGZpbmFsIGNvbHVtbiwgYW5kIHdlIGhhdmUgYSBzb3J0aW5nCiAgICAgICAg
ICAgICAgOzsgaW5kaWNhdG9yLCBhbmQgdGhlIHRhYmxlIGlzIHRvbyB3aWRlIGZvciB0aGUgd2lu
ZG93LgogICAgICAgICAgICAgIChsZXQqICgocHJlLWluZGljYXRvciAoc3RyaW5nLXBpeGVsLXdp
ZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmlu
ZyAocG9pbnQtbWluKSAocG9pbnQpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQtbWluKSAocG9pbnQpKQorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKSkKICAgICAgICAgICAgICAgICAgICAgKHBy
ZS1maWxsCiAgICAgICAgICAgICAgICAgICAgICAoLSAod2luZG93LXdpZHRoIG5pbCB0KQogICAg
ICAgICAgICAgICAgICAgICAgICAgcHJlLWluZGljYXRvcgpAQCAtODUwLDE0ICs4ODksMTYgQEAg
dnRhYmxlLS1zZXQtaGVhZGVyLWxpbmUKICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBv
aW50LW1pbikgKDEtIChwb2ludC1tYXgpKSkpKSkKICAgKHZ0YWJsZS1oZWFkZXItbW9kZSAxKSkK
IAotKGRlZnVuIHZ0YWJsZS0tbGltaXQtc3RyaW5nIChzdHJpbmcgcGl4ZWxzKQorCisoZGVmdW4g
dnRhYmxlLS1saW1pdC1zdHJpbmcgKHN0cmluZyBwaXhlbHMgYnVmZmVyKQogICAod2hpbGUgKGFu
ZCAobGVuZ3RoPiBzdHJpbmcgMCkKLSAgICAgICAgICAgICAgKD4gKHN0cmluZy1waXhlbC13aWR0
aCBzdHJpbmcpIHBpeGVscykpCisgICAgICAgICAgICAgICg+IChzdHJpbmctcGl4ZWwtd2lkdGgg
c3RyaW5nIGJ1ZmZlcikgcGl4ZWxzKSkKICAgICAoc2V0cSBzdHJpbmcgKHN1YnN0cmluZyBzdHJp
bmcgMCAoMS0gKGxlbmd0aCBzdHJpbmcpKSkpKQogICBzdHJpbmcpCiAKIChkZWZ1biB2dGFibGUt
LWNoYXItd2lkdGggKHRhYmxlKQotICAoc3RyaW5nLXBpeGVsLXdpZHRoIChwcm9wZXJ0aXplICJ4
IiAnZmFjZSAodnRhYmxlLWZhY2UgdGFibGUpKSkpCisgIChzdHJpbmctcGl4ZWwtd2lkdGggKHBy
b3BlcnRpemUgIngiICdmYWNlICh2dGFibGUtZmFjZSB0YWJsZSkpCisgICAgICAgICAgICAgICAg
ICAgICAgKHZ0YWJsZS1idWZmZXIgdGFibGUpKSkKIAogKGRlZnVuIHZ0YWJsZS0tY29tcHV0ZS13
aWR0aCAodGFibGUgc3BlYykKICAgKGNvbmQKQEAgLTk2NywyMCArMTAwOCwyNCBAQCB2dGFibGUt
LW1ha2Uta2V5bWFwCiAgICAgICAgICAgKHZ0YWJsZS1rZXltYXAgdGFibGUpKQogICAgICAgbWFw
KSkpCiAKLShkZWZ1biB2dGFibGUtcmV2ZXJ0ICgpCi0gICJSZWdlbmVyYXRlIHRoZSB0YWJsZSB1
bmRlciBwb2ludC4iCi0gIChsZXQgKCh0YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKQotICAg
ICAgICAob2JqZWN0ICh2dGFibGUtY3VycmVudC1vYmplY3QpKQotICAgICAgICAoY29sdW1uICh2
dGFibGUtY3VycmVudC1jb2x1bW4pKQotICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkpCi0g
ICAgKHVubGVzcyB0YWJsZQotICAgICAgKHVzZXItZXJyb3IgIk5vIHRhYmxlIHVuZGVyIHBvaW50
IikpCi0gICAgKGRlbGV0ZS1yZWdpb24gKHZ0YWJsZS1iZWdpbm5pbmctb2YtdGFibGUpICh2dGFi
bGUtZW5kLW9mLXRhYmxlKSkKLSAgICAodnRhYmxlLWluc2VydCB0YWJsZSkKLSAgICAod2hlbiBv
YmplY3QKLSAgICAgICh2dGFibGUtZ290by1vYmplY3Qgb2JqZWN0KSkKLSAgICAod2hlbiBjb2x1
bW4KLSAgICAgICh2dGFibGUtZ290by1jb2x1bW4gY29sdW1uKSkpKQorKGRlZnVuIHZ0YWJsZS1y
ZXZlcnQgKCZvcHRpb25hbCB0YWJsZSkKKyAgIlJlZ2VuZXJhdGUgdGhlIHRhYmxlIHVuZGVyIHBv
aW50LgorSWYgVEFCTEUgaXMgbmlsLCB1c2UgdGhlIHRhYmxlIHVuZGVyIHBvaW50LiIKKyAgKHNl
dHEgdGFibGUgKG9yIHRhYmxlICh2dGFibGUtY3VycmVudC10YWJsZSkpKQorICAodW5sZXNzIHRh
YmxlCisgICAgKHVzZXItZXJyb3IgIk5vIHRhYmxlIGZvdW5kIikpCisgICh3aXRoLWN1cnJlbnQt
YnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKQorICAgIChsZXQgKChvYmplY3QgKHZ0YWJsZS1j
dXJyZW50LW9iamVjdCkpCisgICAgICAgICAgKGNvbHVtbiAodnRhYmxlLWN1cnJlbnQtY29sdW1u
KSkKKyAgICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkpCisgICAgICAodW5sZXNzIHRhYmxl
CisgICAgICAgICh1c2VyLWVycm9yICJObyB0YWJsZSB1bmRlciBwb2ludCIpKQorICAgICAgKGRl
bGV0ZS1yZWdpb24gKHZ0YWJsZS1iZWdpbm5pbmctb2YtdGFibGUpICh2dGFibGUtZW5kLW9mLXRh
YmxlKSkKKyAgICAgICh2dGFibGUtLWluc2VydCB0YWJsZSkKKyAgICAgICh3aGVuIG9iamVjdAor
ICAgICAgICAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVjdCkpCisgICAgICAod2hlbiBjb2x1bW4K
KyAgICAgICAgKHZ0YWJsZS1nb3RvLWNvbHVtbiBjb2x1bW4pKSkpKQogCiA7OzsgQ29tbWFuZHMu
CiAKQEAgLTEwMTMsNyArMTA1OCw3IEBAIHZ0YWJsZS0tYWx0ZXItY29sdW1uLXdpZHRoCiAgICAg
OzsgU3RvcmUgdGhlIHdpZHRoIHNvIGl0J2xsIGJlIHJlc3BlY3RlZCBvbiBhIHJldmVydC4KICAg
ICAoc2V0ZiAodnRhYmxlLWNvbHVtbi13aWR0aCAoZWx0ICh2dGFibGUtY29sdW1ucyB0YWJsZSkg
Y29sdW1uKSkKICAgICAgICAgICAoZm9ybWF0ICIlZHB4IiAoYXJlZiB3aWR0aHMgY29sdW1uKSkp
Ci0gICAgKHZ0YWJsZS1yZXZlcnQpKSkKKyAgICAodnRhYmxlLXJldmVydCB0YWJsZSkpKQogCiAo
ZGVmdW4gdnRhYmxlLXdpZGVuLWN1cnJlbnQtY29sdW1uICgmb3B0aW9uYWwgbikKICAgIldpZGVu
IHRoZSBjdXJyZW50IGNvbHVtbiBieSBOIGNoYXJhY3RlcnMuCkBAIC0xMDM4LDE0ICsxMDgzLDE2
IEBAIHZ0YWJsZS1uZXh0LWNvbHVtbgogICAgICAobWluICgxLSAobGVuZ3RoICh2dGFibGUtLWNh
Y2hlLXdpZHRocyAodnRhYmxlLS1jdXJyZW50LWNhY2hlKSkpKQogICAgICAgICAgICgxKyAodnRh
YmxlLWN1cnJlbnQtY29sdW1uKSkpKSkpCiAKLShkZWZ1biB2dGFibGUtcmV2ZXJ0LWNvbW1hbmQg
KCkKKyhkZWZ1biB2dGFibGUtcmV2ZXJ0LWNvbW1hbmQgKCZvcHRpb25hbCB0YWJsZSkKICAgIlJl
LXF1ZXJ5IGRhdGEgYW5kIHJlZ2VuZXJhdGUgdGhlIHRhYmxlIHVuZGVyIHBvaW50LiIKICAgKGlu
dGVyYWN0aXZlKQotICAobGV0ICgodGFibGUgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpCi0gICAg
KHdoZW4gKHZ0YWJsZS1vYmplY3RzLWZ1bmN0aW9uIHRhYmxlKQotICAgICAgKHNldGYgKHZ0YWJs
ZS1vYmplY3RzIHRhYmxlKSAoZnVuY2FsbCAodnRhYmxlLW9iamVjdHMtZnVuY3Rpb24gdGFibGUp
KSkpCi0gICAgKHZ0YWJsZS0tY2xlYXItY2FjaGUgdGFibGUpKQotICAodnRhYmxlLXJldmVydCkp
CisgIChzZXRxIHRhYmxlIChvciB0YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKSkKKyAgKHVu
bGVzcyB0YWJsZQorICAgICh1c2VyLWVycm9yICJObyB0YWJsZSBmb3VuZCIpKQorICAod2hlbiAo
dnRhYmxlLW9iamVjdHMtZnVuY3Rpb24gdGFibGUpCisgICAgKHNldGYgKHZ0YWJsZS1vYmplY3Rz
IHRhYmxlKSAoZnVuY2FsbCAodnRhYmxlLW9iamVjdHMtZnVuY3Rpb24gdGFibGUpKSkpCisgICh2
dGFibGUtLWNsZWFyLWNhY2hlIHRhYmxlKQorICAodnRhYmxlLXJldmVydCB0YWJsZSkpCiAKIChk
ZWZ1biB2dGFibGUtc29ydC1ieS1jdXJyZW50LWNvbHVtbiAoKQogICAiU29ydCB0aGUgdGFibGUg
dW5kZXIgcG9pbnQgYnkgdGhlIGNvbHVtbiB1bmRlciBwb2ludC4iCkBAIC0xMDY3LDggKzExMTQs
OCBAQCB2dGFibGUtc29ydC1ieS1jdXJyZW50LWNvbHVtbgogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChpZiAoZXEgKGNkciBsYXN0KSAnYXNjZW5kKQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAnZGVzY2VuZAogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgJ2FzY2VuZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Fz
Y2VuZCkpKSkpKQotICAodnRhYmxlLXJldmVydCkpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICdhc2NlbmQpKSkpKQorICAgICh2dGFibGUtcmV2ZXJ0IHRhYmxlKSkpCiAKIChkZWZ1
biB2dGFibGUtaGVhZGVyLWxpbmUtc29ydCAoZSkKICAgIlNvcnQgYSB2dGFibGUgZnJvbSB0aGUg
aGVhZGVyIGxpbmUuIgpkaWZmIC0tZ2l0IGEvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRl
c3RzLmVsIGIvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsCmluZGV4IDc0ZmI4
Y2M4MTM5Li44M2Y4MjZlYTM1MyAxMDA2NDQKLS0tIGEvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRh
YmxlLXRlc3RzLmVsCisrKyBiL3Rlc3QvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS10ZXN0cy5lbApA
QCAtMjcsMTYgKzI3LDE5IEBACiAocmVxdWlyZSAnZXJ0KQogKHJlcXVpcmUgJ2VydC14KQogCi0o
ZXJ0LWRlZnRlc3QgdGVzdC12c3RhYmxlLWNvbXB1dGUtY29sdW1ucyAoKQorKGRlZnVuIHZ0YWJs
ZS10ZXN0cy0tbWFrZS1uby1oZWFkZXItMi1vYmplY3QtdGFibGUgKCkKKyAgKG1ha2UtdnRhYmxl
IDpjb2x1bW5zICcoImEiICJiIiAiYyIpCisgICAgICAgICAgICAgICA6b2JqZWN0cyAnKCgiZm9v
IiAxIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICgiYmFyIiAzIDp6b3QpKQorICAgICAg
ICAgICAgICAgOmluc2VydCBuaWwpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtY29tcHV0
ZS1jb2x1bW5zICgpCiAgIChzaG91bGQKICAgIChlcXVhbCAobWFwY2FyCiAgICAgICAgICAgIChs
YW1iZGEgKGNvbHVtbikKICAgICAgICAgICAgICAodnRhYmxlLWNvbHVtbi1hbGlnbiBjb2x1bW4p
KQogICAgICAgICAgICAodnRhYmxlLS1jb21wdXRlLWNvbHVtbnMKLSAgICAgICAgICAgIChtYWtl
LXZ0YWJsZSA6Y29sdW1ucyAnKCJhIiAiYiIgImMiKQotICAgICAgICAgICAgICAgICAgICAgICAg
IDpvYmplY3RzICcoKCJmb28iIDEgMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICgiYmFyIiAzIDp6b3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgIDppbnNlcnQgbmls
KSkpCisgICAgICAgICAgICAodnRhYmxlLXRlc3RzLS1tYWtlLW5vLWhlYWRlci0yLW9iamVjdC10
YWJsZSkpKQogICAgICAgICAgICcobGVmdCByaWdodCBsZWZ0KSkpKQogCiAoZXJ0LWRlZnRlc3Qg
dGVzdC12dGFibGUtaW5zZXJ0LW9iamVjdCAoKQpAQCAtNjksNCArNzIsNjkgQEAgdGVzdC12dGFi
bGUtaW5zZXJ0LW9iamVjdAogICAgICAgICAgICAgICAobWFwY2FyICMnY2FkciAodnRhYmxlLW9i
amVjdHMgdGFibGUpKSkpCiAgICAgICAgICAgKG51bWJlci1zZXF1ZW5jZSAwIDExKSkpKQogCiso
ZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtdW5pcXVlLWJ1ZmZlciAoKQorICAobGV0ICgodGFibGUg
KHZ0YWJsZS10ZXN0cy0tbWFrZS1uby1oZWFkZXItMi1vYmplY3QtdGFibGUpKSkKKyAgICAod2l0
aC10ZW1wLWJ1ZmZlcgorICAgICAgKHZ0YWJsZS1pbnNlcnQgdGFibGUpCisgICAgICA7OyBUaGlz
IHdpbGwgcnVuIGJ1dCBmYWlsIG9uIEVtYWNzIHByZSAzMSB2dGFibGUuCisgICAgICAoc2hvdWxk
LWVycm9yICh2dGFibGUtaW5zZXJ0IHRhYmxlKSkKKyAgICAgIDs7IFRoaXMgd2lsbCBydW4gb25s
eSBvbiBFbWFjcyAzMSsgdnRhYmxlLgorICAgICAgKHdoZW4gKD4gZW1hY3MtbWFqb3ItdmVyc2lv
biAzMCkKKyAgICAgICAgKHNob3VsZC1lcnJvciAodnRhYmxlLXNldC1idWZmZXIgdGFibGUgKGN1
cnJlbnQtYnVmZmVyKSkpKSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtbm9uLWN1cnJl
bnQtYnVmZmVyLWluc2VydC1vYmplY3QgKCkKKyAgKGxldCAoKHRhYmxlICh2dGFibGUtdGVzdHMt
LW1ha2Utbm8taGVhZGVyLTItb2JqZWN0LXRhYmxlKSkKKyAgICAgICAgKG9iaiAnKCJiYXoiIDQg
NSkpKQorICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAodnRhYmxlLWluc2VydCB0YWJsZSkK
KyAgICAgIChzaG91bGQgKD0gKGNvdW50LWxpbmVzIChwb2ludC1taW4pIChwb2ludC1tYXgpKSAy
KSkKKyAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAgICh2dGFibGUtaW5zZXJ0LW9iamVj
dCB0YWJsZSBvYmopKQorICAgICAgKHNob3VsZCAoPSAoY291bnQtbGluZXMgKHBvaW50LW1pbikg
KHBvaW50LW1heCkpIDMpKSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtbm9uLWN1cnJl
bnQtYnVmZmVyLXJlbW92ZS1vYmplY3QgKCkKKyAgKGxldCAoKHRhYmxlICh2dGFibGUtdGVzdHMt
LW1ha2Utbm8taGVhZGVyLTItb2JqZWN0LXRhYmxlKSkKKyAgICAgICAgKG9iaiAnKCJiYXoiIDQg
NSkpKQorICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAodnRhYmxlLWluc2VydCB0YWJsZSkK
KyAgICAgICh2dGFibGUtaW5zZXJ0LW9iamVjdCB0YWJsZSBvYmopCisgICAgICAoc2hvdWxkICg9
IChjb3VudC1saW5lcyAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkgMykpCisgICAgICAod2l0aC10
ZW1wLWJ1ZmZlcgorICAgICAgICAodnRhYmxlLXJlbW92ZS1vYmplY3QgdGFibGUgb2JqKSkKKyAg
ICAgIChzaG91bGQgKD0gKGNvdW50LWxpbmVzIChwb2ludC1taW4pIChwb2ludC1tYXgpKSAyKSkp
KSkKKworKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLW5vbi1jdXJyZW50LWJ1ZmZlci11cGRhdGUt
b2JqZWN0ICgpCisgIChsZXQgKCh0YWJsZSAodnRhYmxlLXRlc3RzLS1tYWtlLW5vLWhlYWRlci0y
LW9iamVjdC10YWJsZSkpCisgICAgICAgIChvYmogJygiYmF6IiA0IDUpKQorICAgICAgICAob2Jq
LTIgJygicXV4IiA2IDcpKSkKKyAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgKHZ0YWJsZS1p
bnNlcnQgdGFibGUpCisgICAgICAodnRhYmxlLWluc2VydC1vYmplY3QgdGFibGUgb2JqKQorICAg
ICAgKHNob3VsZCAoPSAoY291bnQtbGluZXMgKHBvaW50LW1pbikgKHBvaW50LW1heCkpIDMpKQor
ICAgICAgKGxldCAoKGxpbmUtMiAocHJvZ24KKyAgICAgICAgICAgICAgICAgICAgICAoZ290by1j
aGFyIChwb2ludC1taW4pKQorICAgICAgICAgICAgICAgICAgICAgIChmb3J3YXJkLWxpbmUgMikK
KyAgICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpIChwb2ludC1t
YXgpKSkpKQorICAgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgICAgICh2dGFibGUtdXBk
YXRlLW9iamVjdCB0YWJsZSBvYmotMiBvYmopKQorICAgICAgICAobGV0ICgobGluZS0yLW5ldyAo
cHJvZ24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4p
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3J3YXJkLWxpbmUgMikKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpIChwb2ludC1tYXgp
KSkpKQorICAgICAgICAgIChzaG91bGQgKD0gKGNvdW50LWxpbmVzIChwb2ludC1taW4pIChwb2lu
dC1tYXgpKSAzKSkKKyAgICAgICAgICAoc2hvdWxkIChub3QgKHN0cmluZz0gbGluZS0yIGxpbmUt
Mi1uZXcpKSkpKSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtLWxpbWl0LXN0cmluZy13
aXRoLWZhY2UtcmVtYXBwZWQtYnVmZmVyICgpCisgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgKGxl
dCAoKHRleHQgKHByb3BlcnRpemUgIlhYWFhYIgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICdmYWNlICd2YXJpYWJsZS1waXRjaCkpKQorICAgICAgKGZhY2UtcmVtYXAtYWRkLXJlbGF0aXZl
ICdkZWZhdWx0IDpoZWlnaHQgMS41KQorICAgICAgKGlmICg+IGVtYWNzLW1ham9yLXZlcnNpb24g
MzApCisgICAgICAgICAgKHNob3VsZCAoZXEKKyAgICAgICAgICAgICAgICAgICAyCisgICAgICAg
ICAgICAgICAgICAgKGxlbmd0aCAodnRhYmxlLS1saW1pdC1zdHJpbmcgdGV4dCA1MCAoY3VycmVu
dC1idWZmZXIpKSkpKQorICAgICAgICAoc2hvdWxkIChlcQorICAgICAgICAgICAgICAgICAyCisg
ICAgICAgICAgICAgICAgIChsZW5ndGggKHZ0YWJsZS0tbGltaXQtc3RyaW5nIHRleHQgNTApKSkp
KSkpKQorCiA7OzsgdnRhYmxlLXRlc3RzLmVsIGVuZHMgaGVyZQotLSAKMi40Ny4xCgo=
--0000000000003c79da06459cab30--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 10 Dec 2025 15:12:10 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 10 10:12:09 2025
Received: from localhost ([127.0.0.1]:34735 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vTLrN-0006uu-Iv
	for submit <at> debbugs.gnu.org; Wed, 10 Dec 2025 10:12:09 -0500
Received: from mxout5.mail.janestreet.com ([64.215.233.18]:33299)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <sbaugh@HIDDEN>)
 id 1vTLrK-0006u3-JZ
 for 79982 <at> debbugs.gnu.org; Wed, 10 Dec 2025 10:12:07 -0500
From: Spencer Baugh <sbaugh@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot
In-Reply-To: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
 (=?utf-8?Q?=22St=C3=A9phane?= Marks"'s message of "Wed, 10 Dec 2025
 09:54:36 -0500")
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
Date: Wed, 10 Dec 2025 10:12:00 -0500
Message-ID: <iero6o6s75r.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=janestreet.com;
 s=waixah; t=1765379520;
 bh=xc7IzzgbRGqBegkqxy0CANomzqM9Kbg+b7X679AUff0=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date;
 b=zpk5wyrTalgbjlocimiFm2xD6VMDcCaJKitWImqbbMgtk/T3+O5ugCwlz3GqgSdqo
 morx48hIbXPKI6PEqjY/vERxpTynciwGmDEAG/V1JBQH4DMSjjJ/k3OZ59yUVmt/e+
 GW3Asu+5OV2eD/dlQq/B/Yt6oFXHnj09jRJIzkQd5mmTBPHjcISNDZ4+HV5jWK4Rd7
 2WjGQzsnDS+r4nnIrrOfkLTmDjPI7fFM1ZGoxcyxdzkxK5NX1en/phLDv+/NrB28nL
 CxxdQ/JACHTT5npSixxW8/dzwqoVjQaWqVP8VYQRAYN0h3YBiayNL2mnEAyomQIGHQ
 C6cAwJLfKnDMQ==
X-Spam-Score: -0.7 (/)
X-Debbugs-Envelope-To: 79982
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 79982 <at> debbugs.gnu.org, Visuwesh <visuweshm@HIDDEN>,
 Adam Porter <adam@HIDDEN>, Lars Ingebrigtsen <larsi@HIDDEN>,
 Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.7 (-)

St=C3=A9phane Marks <shipmints@HIDDEN> writes:
> This solves for background vtable mutations, i.e., updates initiated from=
 buffers other than the vtable buffer, and for
> buffer-adjusted string-pixel-width computations.
>
> Many more patches for fixes and enhancements coming on the back of this o=
ne, once agreed.  I'd love to see all of these in Emacs
> 31 and I'm now generally available to pick up the pace.
>
> P.S. I've cc'd the same group as the last vtable discussions/patches.  If=
 you do not want to be cc'd on these, let me know.
>
> -St=C3=A9phane=20

Please add a test which passes with this patch and doesn't pass without
this patch.




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at 79982 <at> debbugs.gnu.org:


Received: (at 79982) by debbugs.gnu.org; 10 Dec 2025 14:59:59 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 10 09:59:59 2025
Received: from localhost ([127.0.0.1]:34676 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vTLfa-00065t-TL
	for submit <at> debbugs.gnu.org; Wed, 10 Dec 2025 09:59:59 -0500
Received: from mail-ua1-x929.google.com ([2607:f8b0:4864:20::929]:45480)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vTLfX-00065Z-UZ
 for 79982 <at> debbugs.gnu.org; Wed, 10 Dec 2025 09:59:56 -0500
Received: by mail-ua1-x929.google.com with SMTP id
 a1e0cc1a2514c-9372310418bso1954794241.3
 for <79982 <at> debbugs.gnu.org>; Wed, 10 Dec 2025 06:59:55 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765378790; x=1765983590; darn=debbugs.gnu.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=1v3Yp2vx+D66oBRANm+V9mHW3XIpD548mGP51HQ3w/Q=;
 b=Cu/iPPZnX3I7UpasQHX9RVnVq8VztZA8w8AyJjO+5JuUJUmD6zP8PKo3K0np4Lulm/
 79BNgBfbLmix45awcJZArrTCSb/pH9T8NQMSwKHEqozokqk5plfQmfGsOugi/Cev1ebf
 /gl9decUIA2GBMEpPowSOEI8qvJjeVPYAEhmH8cZOD9sn97IHkTzh3o6dBy0unIWIWcS
 0CD4XXtSNvBTwipmHDdE2/ubH4aSit/RUpK5ULNNcpmvn16UaCsZc3HmY20r4Ks2sZkQ
 +F/RHIXvD5yJUpCsQT1y+0I/YukUxU2aqjHRqdSABFY6+rCEGCBH1z4iVKL6IOeAn3+z
 +ZrQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765378790; x=1765983590;
 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=1v3Yp2vx+D66oBRANm+V9mHW3XIpD548mGP51HQ3w/Q=;
 b=Bjp1+eu8YCOCl2CQLIrcpC0LvYH4M4T/lZALEWmMNA2k1SSJlAFyJyicR0nqhgPL6y
 2vhZan5gttYJ3YdmNyof+FcAZXFTPaq3GcWcXppQFzii6tCgP/QTjvJGX6SRJC4vdYFl
 Sd4Fmctc23Rjh8S0cQTB1lPS9sHmW3Y2cHGtEv4y921aOm3XxBl8uaAAkr7Mr1L9hS8z
 SHkE/GZ6gcQQUwzUjMm9/ztvK1jgNyybW4XP36RL5ndVif70tcdSH7IPf3FKy2uwTMZn
 A9ONpBDiSyVuWLEhtEDK8nfnNciaUyzJS+TZpt9+BXGl3C0d/nPbwcr144ax3KjouSGE
 N7lA==
X-Gm-Message-State: AOJu0Yz/1HjGUa2Wpkv2+vt2vOeRsaq7DdT/Nh60r4AmKBHD9lCdELTk
 1vBKYALiKrS9FLqN6JNNayMXW3iS2P51JFJW4dY6VtV1GSsXepK+1StGf9qdy9zyPE/kEwqfco7
 8fw/9bl3PRH7OMy6etnkq+iS9gm69bAQ9Hw==
X-Gm-Gg: AY/fxX7yilAWloGExnaW1qt6uRzmPdT28Z+ZArPXQAdkneGqWJJo10M1z3Pt0Gc2thq
 c+K3yIoIOquCcOGXqvR9OuxicYgPEn6Cjd0rmapp5YJTOApZ4GaavzQ0gDEIi69YY3meSGXeyBJ
 9k/vl5fCgEce5UzqIscmrBhKUZU12pTswt95QVHNQYcp1aJQb0HIYvb2U2Kd8hisPF8HzymWzFl
 gtcSOANl0AKN4zpDqBr7roZnoqobLfMqvrql4FXycOsenFgkGo3L3JUqSB/ebxy5qI0tY8=
X-Google-Smtp-Source: AGHT+IErIrGj5527PHuv7OSD35J4DkX4mDyZ2A53OJ2PidERWF7Gie3F9lvDx7KyWo8eVNhcFrwojQ4uu49GQDK1mBk=
X-Received: by 2002:a05:6102:161e:b0:5d5:dbbb:5b86 with SMTP id
 ada2fe7eead31-5e571bcd008mr764931137.25.1765378789904; Wed, 10 Dec 2025
 06:59:49 -0800 (PST)
MIME-Version: 1.0
References: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
In-Reply-To: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Wed, 10 Dec 2025 09:59:37 -0500
X-Gm-Features: AQt7F2rbW9bCHpRfCkeGK14Q107-Bu7tH1Q1T_anRnIa_C3JXaycXiFaUCVdQp8
Message-ID: <CAN+1HbotdsYfYydMe5HKzr1-16=OY0Qgg6wqhxFy7TWGo8Hsug@HIDDEN>
Subject: Re: bug#79982: [PATCH] Add vtable buffer slot
To: 79982 <at> debbugs.gnu.org
Content-Type: multipart/alternative; boundary="000000000000aa937106459a4714"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79982
Cc: Spencer Baugh <sbaugh@HIDDEN>,
 Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 Visuwesh <visuweshm@HIDDEN>, Adam Porter <adam@HIDDEN>,
 Lars Ingebrigtsen <larsi@HIDDEN>, Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -1.0 (-)

--000000000000aa937106459a4714
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

+ Spencer (now in my copy/paste list)

On Wed, Dec 10, 2025 at 9:55=E2=80=AFAM St=C3=A9phane Marks <shipmints@gmai=
l.com> wrote:

> This solves for background vtable mutations, i.e., updates initiated from
> buffers other than the vtable buffer, and for buffer-adjusted
> string-pixel-width computations.
>
> Many more patches for fixes and enhancements coming on the back of this
> one, once agreed.  I'd love to see all of these in Emacs 31 and I'm now
> generally available to pick up the pace.
>
> P.S. I've cc'd the same group as the last vtable discussions/patches.  If
> you do not want to be cc'd on these, let me know.
>
> -St=C3=A9phane
>

--000000000000aa937106459a4714
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div class=3D"gmail_default" style=3D"font-family:monospac=
e">+ Spencer (now in my copy/paste list)<br></div></div><br><div class=3D"g=
mail_quote gmail_quote_container"><div dir=3D"ltr" class=3D"gmail_attr">On =
Wed, Dec 10, 2025 at 9:55=E2=80=AFAM St=C3=A9phane Marks &lt;<a href=3D"mai=
lto:shipmints@HIDDEN">shipmints@HIDDEN</a>&gt; wrote:<br></div><block=
quote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1=
px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div class=3D"=
gmail_default" style=3D"font-family:monospace">This solves for background v=
table mutations, i.e., updates initiated from buffers other than the vtable=
 buffer, and for buffer-adjusted string-pixel-width computations.<br></div>=
<div class=3D"gmail_default" style=3D"font-family:monospace"><br></div><div=
 class=3D"gmail_default" style=3D"font-family:monospace">Many more patches =
for fixes and enhancements coming on the back of this one, once agreed.=C2=
=A0 I&#39;d love to see all of these in Emacs 31 and I&#39;m now generally =
available to pick up the pace.</div><div class=3D"gmail_default" style=3D"f=
ont-family:monospace"><br></div><div class=3D"gmail_default" style=3D"font-=
family:monospace">P.S. I&#39;ve cc&#39;d the same group as the last vtable =
discussions/patches.=C2=A0 If you do not want to be cc&#39;d on these, let =
me know.</div><div class=3D"gmail_default" style=3D"font-family:monospace">=
<br></div><div class=3D"gmail_default" style=3D"font-family:monospace">-St=
=C3=A9phane=C2=A0</div></div>
</blockquote></div>

--000000000000aa937106459a4714--




Information forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.

Message received at submit <at> debbugs.gnu.org:


Received: (at submit) by debbugs.gnu.org; 10 Dec 2025 14:55:00 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 10 09:55:00 2025
Received: from localhost ([127.0.0.1]:34053 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1vTLal-0005fg-Nk
	for submit <at> debbugs.gnu.org; Wed, 10 Dec 2025 09:55:00 -0500
Received: from lists.gnu.org ([2001:470:142::17]:51672)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1vTLaj-0005fO-JB
 for submit <at> debbugs.gnu.org; Wed, 10 Dec 2025 09:54:58 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <shipmints@HIDDEN>)
 id 1vTLad-0001mH-Iv
 for bug-gnu-emacs@HIDDEN; Wed, 10 Dec 2025 09:54:51 -0500
Received: from mail-vs1-xe2b.google.com ([2607:f8b0:4864:20::e2b])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <shipmints@HIDDEN>)
 id 1vTLab-0003jM-Hd
 for bug-gnu-emacs@HIDDEN; Wed, 10 Dec 2025 09:54:51 -0500
Received: by mail-vs1-xe2b.google.com with SMTP id
 ada2fe7eead31-5dfc6be7df3so2518200137.0
 for <bug-gnu-emacs@HIDDEN>; Wed, 10 Dec 2025 06:54:49 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1765378488; x=1765983288; darn=gnu.org;
 h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject
 :date:message-id:reply-to;
 bh=4GsPrFmtJrISWz6b2EzgQfcQ7bCLgrI1dAnixMgwg5Y=;
 b=aud7pnhPlLRHTP7pyUDapR023mK/YH+UGuHXaQVu1aF1ub/xFbgQm3LOoo76ILsxL0
 AbLYpoQBjY/HxvjM4SIiWjbKFVNnVoAVC8WPuNeF79X7cZGK7Jl/T6gRgS/GpH5oNjUk
 UHbfq3+iI1lvAFNFSGXcfypZYk90CMmsRJGjcojX4elP1p/1jFEs1iHv3ru7fEHfGwrc
 e5qDvtjA7ovmqjscSUhdNKAiYzGqAojteXcQN19F8hJOGNZnZ3+8RGBrQkaZWdcDg/B8
 fOMB3UIdFv/chJEpkgUrNP75H3LBoUipQPCxb8RYnYht/5g1WN1xueM7Q6GxsCGE6Eyx
 tBdw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1765378488; x=1765983288;
 h=cc:to:subject:message-id:date:from:mime-version:x-gm-gg
 :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;
 bh=4GsPrFmtJrISWz6b2EzgQfcQ7bCLgrI1dAnixMgwg5Y=;
 b=XSa/aspoiHyy4oDzovt6BPUKdEc1/dPGoUi3e2DCjUYnE69TnJho+LGbeSAix/jWVq
 skcFa9VasVjl5RQ8RgYjutf9i5mtsuTRhlLke3flautPGdfz3zZ1yXqRQW0Vqpo3IqtO
 YN5/H0jZLkKVC6A/ZLibrQAQvTO9kmHTPmgGcWvUTIPSZRQbkpDZ184Lruh7JQGqsyXi
 idoOVZJJl+xVx0NGRAbIY6Dzt4rX2cnvlW0Yumi/i4Gsku1sp3VKmn/5Pk2F53y0Sci2
 oY4T5ndAqbn/+1GVtp6yxMUGVYYkJaB+Aj4cQFWxjIQK3zAgO/J09Vku39m2k1XXtRM+
 ck1Q==
X-Gm-Message-State: AOJu0Yz6eESAOKaN3TorrOIvl9HmHCwPBLHcuGKqmqGzVuRKcacldEFi
 cjIODXzKkBKFbOUwzJ+IpAXkjlxK6JtnQM2Y+uhEN2aEyPSnCgxE8r/FcHhLlAxwRwPjEfe2s3E
 5f6DJlmOG3MQgFR402t2hgPemsvLpKubBJhvT
X-Gm-Gg: AY/fxX4PDZPkuvFOj5s3V5M+HkC4zGdro5DuWj7C8w1oy4UqY1/FPk2Qmn3nP94MhUU
 9QdtIrznvdOt3e01Bu/FlVfR4U7cLyRh0851Uu1BC6G1qdXTIqLmzAihoXDsvCbYeoJfK08TDVO
 HYn4/64ia7YrxgGXD+rUje+Bu9yBgGiZmURxOA7xSVUUn/baJAh5wqmrAc1cKu7Pq2hWXj/PijB
 9YWXNIZUYwOs/aVn/AZ1gn6VGQet5mXczUlIH/Crj1R/DoU2dNoQS8a2xiVymK/NJcvi50hfb97
 GkQxUA==
X-Google-Smtp-Source: AGHT+IFLEmxGOvFXbyNs1mlQrQ6ry7AuvY9vmST2ALK2tHeMqlBHaQT7GaNzjdzfiDOhAdZlyLqDK4KL2YkCsph/lRI=
X-Received: by 2002:a05:6102:3e23:b0:5db:f710:497e with SMTP id
 ada2fe7eead31-5e571bcd132mr756756137.21.1765378488213; Wed, 10 Dec 2025
 06:54:48 -0800 (PST)
MIME-Version: 1.0
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Wed, 10 Dec 2025 09:54:36 -0500
X-Gm-Features: AQt7F2pFE9uqtv7sR9v34MaDZ5Y_T1wrjs4W-iHk-n8yYAMiQoGV6j7mYl_S3HE
Message-ID: <CAN+1HbpDdP3qHJHK7+-RfXk=NUe9q5G+p89DM_R3AYp5jyy9Hg@HIDDEN>
Subject: [PATCH] Add vtable buffer slot
To: bug-gnu-emacs@HIDDEN
Content-Type: multipart/mixed; boundary="000000000000af443706459a3568"
Received-SPF: pass client-ip=2607:f8b0:4864:20::e2b;
 envelope-from=shipmints@HIDDEN; helo=mail-vs1-xe2b.google.com
X-Spam_score_int: -20
X-Spam_score: -2.1
X-Spam_bar: --
X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,
 DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001,
 HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001,
 SPF_PASS=-0.001 autolearn=ham autolearn_force=no
X-Spam_action: no action
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: submit
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, ijqq@HIDDEN,
 Visuwesh <visuweshm@HIDDEN>, Adam Porter <adam@HIDDEN>,
 Lars Ingebrigtsen <larsi@HIDDEN>, Augusto Stoffel <arstoffel@HIDDEN>
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.0 (/)

--000000000000af443706459a3568
Content-Type: multipart/alternative; boundary="000000000000af443606459a3566"

--000000000000af443606459a3566
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

This solves for background vtable mutations, i.e., updates initiated from
buffers other than the vtable buffer, and for buffer-adjusted
string-pixel-width computations.

Many more patches for fixes and enhancements coming on the back of this
one, once agreed.  I'd love to see all of these in Emacs 31 and I'm now
generally available to pick up the pace.

P.S. I've cc'd the same group as the last vtable discussions/patches.  If
you do not want to be cc'd on these, let me know.

-St=C3=A9phane

--000000000000af443606459a3566
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div class=3D"gmail_default" style=3D"font-family:monospac=
e">This solves for background vtable mutations, i.e., updates initiated fro=
m buffers other than the vtable buffer, and for buffer-adjusted string-pixe=
l-width computations.<br></div><div class=3D"gmail_default" style=3D"font-f=
amily:monospace"><br></div><div class=3D"gmail_default" style=3D"font-famil=
y:monospace">Many more patches for fixes and enhancements coming on the bac=
k of this one, once agreed.=C2=A0 I&#39;d love to see all of these in Emacs=
 31 and I&#39;m now generally available to pick up the pace.</div><div clas=
s=3D"gmail_default" style=3D"font-family:monospace"><br></div><div class=3D=
"gmail_default" style=3D"font-family:monospace">P.S. I&#39;ve cc&#39;d the =
same group as the last vtable discussions/patches.=C2=A0 If you do not want=
 to be cc&#39;d on these, let me know.</div><div class=3D"gmail_default" st=
yle=3D"font-family:monospace"><br></div><div class=3D"gmail_default" style=
=3D"font-family:monospace">-St=C3=A9phane=C2=A0</div></div>

--000000000000af443606459a3566--

--000000000000af443706459a3568
Content-Type: application/octet-stream; 
	name="0001-Add-vtable-buffer-slot.patch"
Content-Disposition: attachment; 
	filename="0001-Add-vtable-buffer-slot.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_mj04o5rk0>
X-Attachment-Id: f_mj04o5rk0

RnJvbSBlMTk2MTRjMzNiMDI5NmMzZjc4NjhiYzAwMjFhMzg1OWRiYzg2ZTYyIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo
aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFdlZCwgMTAgRGVjIDIwMjUgMDk6MjA6MDIgLTA1MDAK
U3ViamVjdDogW1BBVENIXSBBZGQgdnRhYmxlIGJ1ZmZlciBzbG90CgpUaGlzIHNvbHZlcyBmb3Ig
YmFja2dyb3VuZCB2dGFibGUgbXV0YXRpb25zLCBpLmUuLCB1cGRhdGVzCmluaXRpYXRlZCBmcm9t
IGJ1ZmZlcnMgb3RoZXIgdGhhbiB0aGUgdnRhYmxlIGJ1ZmZlciwgYW5kIGZvcgpidWZmZXItYWRq
dXN0ZWQgc3RyaW5nLXBpeGVsLXdpZHRoIGNvbXB1dGF0aW9ucy4KCiogbGlzcC9lbWFjcy1saXNw
L3Z0YWJsZS5lbCAodnRhYmxlKTogTmV3ICctYnVmZmVyJyBzbG90LgoodnRhYmxlLWJ1ZmZlcik6
Cih2dGFibGUtc2V0LWJ1ZmZlcik6IE5ldyBmdW5jdGlvbi4KKHZ0YWJsZS11cGRhdGUtb2JqZWN0
KToKKHZ0YWJsZS1yZW1vdmUtb2JqZWN0KToKKHZ0YWJsZS1pbnNlcnQtb2JqZWN0KTogV3JhcCBv
cGVyYXRpb24gd2l0aCB0aGUgdnRhYmxlIGJ1ZmZlci4KKHZ0YWJsZS0taW5zZXJ0KTogU3BsaXQg
ZnJvbSBvbGQgJ3Z0YWJsZS1pbnNlcnQnLgoodnRhYmxlLWluc2VydCk6IEluc2VydCB0YWJsZSBh
bmQgcmVjb3JkIHRoZSBidWZmZXIuCih2dGFibGUtLWluc2VydC1saW5lKToKKHZ0YWJsZS0taW5z
ZXJ0LWhlYWRlci1saW5lKTogVXNlICd2dGFibGUtYnVmZmVyJyBmb3IgcGl4ZWwtd2lkdGggY29t
cHV0YXRpb24uCih2dGFibGUtLWxpbWl0LXN0cmluZyk6Cih2dGFibGUtLWNoYXItd2lkdGgpOiBQ
YXNzIGJ1ZmZlciB0byAnc3RyaW5nLXBpeGVsLXdpZHRoJy4KKHZ0YWJsZS1yZXZlcnQpOiBOZXcg
b3B0aW9uYWwgdGFibGUgYXJndW1lbnQuCih2dGFibGUtLWFsdGVyLWNvbHVtbi13aWR0aCk6Cih2
dGFibGUtcmV2ZXJ0LWNvbW1hbmQpOgoodnRhYmxlLXNvcnQtYnktY3VycmVudC1jb2x1bW4pOiBD
YWxsICd2dGFibGUtcmV2ZXJ0JyB3aXRoIHRoZSB0YWJsZS4KLS0tCiBsaXNwL2VtYWNzLWxpc3Av
dnRhYmxlLmVsIHwgMzg5ICsrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tCiAx
IGZpbGUgY2hhbmdlZCwgMjE4IGluc2VydGlvbnMoKyksIDE3MSBkZWxldGlvbnMoLSkKCmRpZmYg
LS1naXQgYS9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVsIGIvbGlzcC9lbWFjcy1saXNwL3Z0YWJs
ZS5lbAppbmRleCBiY2RkMjgwZmI5Mi4uZmU0YmFlMDEwNzcgMTAwNjQ0Ci0tLSBhL2xpc3AvZW1h
Y3MtbGlzcC92dGFibGUuZWwKKysrIGIvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbApAQCAtNjgs
NiArNjgsNyBAQCB2dGFibGUKICAgIChjb2x1bW4tY29sb3JzIDppbml0YXJnIDpjb2x1bW4tY29s
b3JzIDphY2Nlc3NvciB2dGFibGUtY29sdW1uLWNvbG9ycykKICAgIChyb3ctY29sb3JzIDppbml0
YXJnIDpyb3ctY29sb3JzIDphY2Nlc3NvciB2dGFibGUtcm93LWNvbG9ycykKICAgICgtY2FjaGVk
LWNvbG9ycyA6aW5pdGZvcm0gbmlsKQorICAgKC1idWZmZXIgOmluaXRmb3JtIG5pbCkKICAgICgt
Y2FjaGUgOmluaXRmb3JtIChtYWtlLWhhc2gtdGFibGUgOnRlc3QgIydlcXVhbCkpCiAgICAoLWNh
Y2hlZC1rZXltYXAgOmluaXRmb3JtIG5pbCkKICAgICgtaGFzLWNvbHVtbi1zcGVjIDppbml0Zm9y
bSBuaWwpKQpAQCAtMjIxLDYgKzIyMiwyMCBAQCB2dGFibGUtLWZhY2UtY29sb3IKIAogOzs7IElu
dGVyZmFjZSB1dGlsaXR5IGZ1bmN0aW9ucy4KIAorKGRlZnVuIHZ0YWJsZS1idWZmZXIgKCZvcHRp
b25hbCB0YWJsZSkKKyAgIlJldHVybiB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCBUQUJMRS4K
K0lmIFRBQkxFIGlzIG5pbCwgdXNlIHRoZSB0YWJsZSB1bmRlciBwb2ludC4gIFJldHVybiBuaWwg
aWYgdGhlIHRhYmxlIGhhcworbm90IGJlZW4gaW5zZXJ0ZWQgaW50byBhIGJ1ZmZlci4iCisgIChz
bG90LXZhbHVlIChvciB0YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKQorICAgICAgICAgICAg
ICAnLWJ1ZmZlcikpCisKKyhkZWZ1biB2dGFibGUtc2V0LWJ1ZmZlciAoYnVmZmVyICZvcHRpb25h
bCB0YWJsZSkKKyAgIkFzc29jaWF0ZSBCVUZGRVIgd2l0aCBUQUJMRS4KK0lmIFRBQkxFIGlzIG5p
bCwgdXNlIHRoZSB0YWJsZSB1bmRlciBwb2ludC4iCisgIChzZXRmIChzbG90LXZhbHVlIChvciB0
YWJsZSAodnRhYmxlLWN1cnJlbnQtdGFibGUpKQorICAgICAgICAgICAgICAgICAgICAnLWJ1ZmZl
cikKKyAgICAgICAgYnVmZmVyKSkKKwogKGRlZnVuIHZ0YWJsZS1jdXJyZW50LXRhYmxlICgpCiAg
ICJSZXR1cm4gdGhlIHRhYmxlIHVuZGVyIHBvaW50LiIKICAgKGdldC10ZXh0LXByb3BlcnR5IChw
b2ludCkgJ3Z0YWJsZSkpCkBAIC0yODUsNjMgKzMwMCw2NSBAQCB2dGFibGUtdXBkYXRlLW9iamVj
dAogY29tcGFyZWQgd2l0aCBgZXF1YWwnKSwgc2lnbmFsIGFuIGVycm9yLgogCiBUQUJMRSBtdXN0
IGJlIGF0IHBvaW50IGluIHRoZSBjdXJyZW50IGJ1ZmZlci4iCi0gICh1bmxlc3Mgb2xkLW9iamVj
dAotICAgIChzZXRxIG9sZC1vYmplY3Qgb2JqZWN0KSkKLSAgKGxldCogKChvYmplY3RzICh2dGFi
bGUtb2JqZWN0cyB0YWJsZSkpCi0gICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkpCi0gICAg
OzsgRmlyc3QgcmVwbGFjZSB0aGUgb2JqZWN0IGluIHRoZSBvYmplY3Qgc3RvcmFnZS4KLSAgICAo
aWYgKGVxIG9sZC1vYmplY3QgKGNhciBvYmplY3RzKSkKLSAgICAgICAgOzsgSXQncyBhdCB0aGUg
aGVhZCwgc28gcmVwbGFjZSBpdCB0aGVyZS4KLSAgICAgICAgKHNldGYgKHZ0YWJsZS1vYmplY3Rz
IHRhYmxlKQotICAgICAgICAgICAgICAoY29ucyBvYmplY3QgKGNkciBvYmplY3RzKSkpCi0gICAg
ICA7OyBPdGhlcndpc2Ugc3BsaWNlIGludG8gdGhlIGxpc3QuCi0gICAgICAod2hpbGUgKGFuZCAo
Y2RyIG9iamVjdHMpCi0gICAgICAgICAgICAgICAgICAobm90IChlcSAoY2FkciBvYmplY3RzKSBv
bGQtb2JqZWN0KSkpCi0gICAgICAgIChzZXRxIG9iamVjdHMgKGNkciBvYmplY3RzKSkpCi0gICAg
ICAodW5sZXNzIChjZHIgb2JqZWN0cykKLSAgICAgICAgKGVycm9yICJDYW4ndCBmaW5kIHRoZSBv
bGQgb2JqZWN0IikpCi0gICAgICAoc2V0Y2FyIChjZHIgb2JqZWN0cykgb2JqZWN0KSkKLSAgICA7
OyBUaGVuIHVwZGF0ZSB0aGUgcmVuZGVyZWQgdnRhYmxlIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4K
LSAgICAoaWYtbGV0KiAoKGNhY2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKQotICAgICAgICAg
ICAgIChsaW5lLW51bWJlciAoc2VxLXBvc2l0aW9uICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hl
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC1vYmplY3QKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChhIGIpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXF1YWwgKGNhciBhKSBiKSkp
KQotICAgICAgICAgICAgIChsaW5lIChlbHQgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpIGxp
bmUtbnVtYmVyKSkpCi0gICAgICAgIChwcm9nbgotICAgICAgICAgIChzZXRjYXIgbGluZSBvYmpl
Y3QpCi0gICAgICAgICAgKHNldGNkciBsaW5lICh2dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUg
dGFibGUgb2JqZWN0KSkKLSAgICAgICAgICA7OyAuLi4gYW5kIHJlZGlzcGxheSB0aGUgbGluZSBp
biBxdWVzdGlvbi4KLSAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgICAgICAgICh2dGFi
bGUtZ290by1vYmplY3Qgb2xkLW9iamVjdCkKLSAgICAgICAgICAgIChsZXQgKChrZXltYXAgKGdl
dC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1hcCkpCi0gICAgICAgICAgICAgICAgICAoc3Rh
cnQgKHBvaW50KSkpCi0gICAgICAgICAgICAgIChkZWxldGUtbGluZSkKLSAgICAgICAgICAgICAg
KHZ0YWJsZS0taW5zZXJ0LWxpbmUgdGFibGUgbGluZSBsaW5lLW51bWJlcgotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLXNwYWNlciB0YWJsZSkpCi0g
ICAgICAgICAgICAgIChhZGQtdGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkgKGxpc3QgJ2tl
eW1hcCBrZXltYXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAndnRhYmxlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZS1jYWNoZSBjYWNoZSkpKSkKLSAgICAgICAg
ICA7OyBXZSBtYXkgaGF2ZSBpbnNlcnRlZCBhIG5vbi1udW1lcmljYWwgdmFsdWUgaW50byBhIHBy
ZXZpb3VzbHkKLSAgICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUu
Ci0gICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAoY2RyIGxpbmUp
KSkKLSAgICAgIChlcnJvciAiQ2FuJ3QgZmluZCBjYWNoZWQgb2JqZWN0IGluIHZ0YWJsZSIpKSkp
CisgICh3aXRoLWN1cnJlbnQtYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKQorICAgICh1bmxl
c3Mgb2xkLW9iamVjdAorICAgICAgKHNldHEgb2xkLW9iamVjdCBvYmplY3QpKQorICAgIChsZXQq
ICgob2JqZWN0cyAodnRhYmxlLW9iamVjdHMgdGFibGUpKQorICAgICAgICAgICAoaW5oaWJpdC1y
ZWFkLW9ubHkgdCkpCisgICAgICA7OyBGaXJzdCByZXBsYWNlIHRoZSBvYmplY3QgaW4gdGhlIG9i
amVjdCBzdG9yYWdlLgorICAgICAgKGlmIChlcSBvbGQtb2JqZWN0IChjYXIgb2JqZWN0cykpCisg
ICAgICAgICAgOzsgSXQncyBhdCB0aGUgaGVhZCwgc28gcmVwbGFjZSBpdCB0aGVyZS4KKyAgICAg
ICAgICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpCisgICAgICAgICAgICAgICAgKGNvbnMg
b2JqZWN0IChjZHIgb2JqZWN0cykpKQorICAgICAgICA7OyBPdGhlcndpc2Ugc3BsaWNlIGludG8g
dGhlIGxpc3QuCisgICAgICAgICh3aGlsZSAoYW5kIChjZHIgb2JqZWN0cykKKyAgICAgICAgICAg
ICAgICAgICAgKG5vdCAoZXEgKGNhZHIgb2JqZWN0cykgb2xkLW9iamVjdCkpKQorICAgICAgICAg
IChzZXRxIG9iamVjdHMgKGNkciBvYmplY3RzKSkpCisgICAgICAgICh1bmxlc3MgKGNkciBvYmpl
Y3RzKQorICAgICAgICAgIChlcnJvciAiQ2FuJ3QgZmluZCB0aGUgb2xkIG9iamVjdCIpKQorICAg
ICAgICAoc2V0Y2FyIChjZHIgb2JqZWN0cykgb2JqZWN0KSkKKyAgICAgIDs7IFRoZW4gdXBkYXRl
IHRoZSByZW5kZXJlZCB2dGFibGUgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgorICAgICAgKGlmLWxl
dCogKChjYWNoZSAodnRhYmxlLS1jdXJyZW50LWNhY2hlKSkKKyAgICAgICAgICAgICAgICAobGlu
ZS1udW1iZXIgKHNlcS1wb3NpdGlvbiAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQtb2JqZWN0CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoYSBiKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVxdWFsIChjYXIgYSkgYikp
KSkKKyAgICAgICAgICAgICAgICAobGluZSAoZWx0ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hl
KSBsaW5lLW51bWJlcikpKQorICAgICAgICAgIChwcm9nbgorICAgICAgICAgICAgKHNldGNhciBs
aW5lIG9iamVjdCkKKyAgICAgICAgICAgIChzZXRjZHIgbGluZSAodnRhYmxlLS1jb21wdXRlLWNh
Y2hlZC1saW5lIHRhYmxlIG9iamVjdCkpCisgICAgICAgICAgICA7OyAuLi4gYW5kIHJlZGlzcGxh
eSB0aGUgbGluZSBpbiBxdWVzdGlvbi4KKyAgICAgICAgICAgIChzYXZlLWV4Y3Vyc2lvbgorICAg
ICAgICAgICAgICAodnRhYmxlLWdvdG8tb2JqZWN0IG9sZC1vYmplY3QpCisgICAgICAgICAgICAg
IChsZXQgKChrZXltYXAgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1hcCkpCisgICAg
ICAgICAgICAgICAgICAgIChzdGFydCAocG9pbnQpKSkKKyAgICAgICAgICAgICAgICAoZGVsZXRl
LWxpbmUpCisgICAgICAgICAgICAgICAgKHZ0YWJsZS0taW5zZXJ0LWxpbmUgdGFibGUgbGluZSBs
aW5lLW51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUt
LWNhY2hlLXdpZHRocyBjYWNoZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAodnRhYmxlLS1zcGFjZXIgdGFibGUpKQorICAgICAgICAgICAgICAgIChhZGQtdGV4dC1wcm9w
ZXJ0aWVzIHN0YXJ0IChwb2ludCkgKGxpc3QgJ2tleW1hcCBrZXltYXAKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2dGFibGUgdGFibGUK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICd2dGFibGUtY2FjaGUgY2FjaGUpKSkpCisgICAgICAgICAgICA7OyBXZSBtYXkgaGF2ZSBpbnNl
cnRlZCBhIG5vbi1udW1lcmljYWwgdmFsdWUgaW50byBhIHByZXZpb3VzbHkKKyAgICAgICAgICAg
IDs7IGFsbC1udW1lcmljYWwgdGFibGUsIHNvIHJlY29tcHV0ZS4KKyAgICAgICAgICAgICh2dGFi
bGUtLXJlY29tcHV0ZS1udW1lcmljYWwgdGFibGUgKGNkciBsaW5lKSkpCisgICAgICAgIChlcnJv
ciAiQ2FuJ3QgZmluZCBjYWNoZWQgb2JqZWN0IGluIHZ0YWJsZSIpKSkpKQogCiAoZGVmdW4gdnRh
YmxlLXJlbW92ZS1vYmplY3QgKHRhYmxlIG9iamVjdCkKICAgIlJlbW92ZSBPQkpFQ1QgZnJvbSBU
QUJMRS4KIFRoaXMgd2lsbCBhbHNvIHJlbW92ZSB0aGUgZGlzcGxheWVkIGxpbmUuIgotICA7OyBG
aXJzdCByZW1vdmUgZnJvbSB0aGUgb2JqZWN0cy4KLSAgKHNldGYgKHZ0YWJsZS1vYmplY3RzIHRh
YmxlKSAoZGVscSBvYmplY3QgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkpCi0gIDs7IFRoZW4gYWRq
dXN0IHRoZSBjYWNoZSBhbmQgZGlzcGxheS4KLSAgKHNhdmUtZXhjdXJzaW9uCi0gICAgKHZ0YWJs
ZS1nb3RvLXRhYmxlIHRhYmxlKQotICAgIChsZXQgKChjYWNoZSAodnRhYmxlLS1jdXJyZW50LWNh
Y2hlKSkKLSAgICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkpCi0gICAgICAoc2V0Y2FyIGNh
Y2hlIChkZWxxIChhc3NxIG9iamVjdCAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkpCi0gICAg
ICAod2hlbiAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVjdCkKLSAgICAgICAgKGRlbGV0ZS1saW5l
KSkpKSkKKyAgKHdpdGgtY3VycmVudC1idWZmZXIgKHZ0YWJsZS1idWZmZXIgdGFibGUpCisgICAg
OzsgRmlyc3QgcmVtb3ZlIGZyb20gdGhlIG9iamVjdHMuCisgICAgKHNldGYgKHZ0YWJsZS1vYmpl
Y3RzIHRhYmxlKSAoZGVscSBvYmplY3QgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkpCisgICAgOzsg
VGhlbiBhZGp1c3QgdGhlIGNhY2hlIGFuZCBkaXNwbGF5LgorICAgIChzYXZlLWV4Y3Vyc2lvbgor
ICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlKQorICAgICAgKGxldCAoKGNhY2hlICh2dGFi
bGUtLWN1cnJlbnQtY2FjaGUpKQorICAgICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQpKQor
ICAgICAgICAoc2V0Y2FyIGNhY2hlIChkZWxxIChhc3NxIG9iamVjdCAodnRhYmxlLS1jYWNoZS1s
aW5lcyBjYWNoZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2FjaGUt
bGluZXMgY2FjaGUpKSkKKyAgICAgICAgKHdoZW4gKHZ0YWJsZS1nb3RvLW9iamVjdCBvYmplY3Qp
CisgICAgICAgICAgKGRlbGV0ZS1saW5lKSkpKSkpCiAKIDs7IEZJWE1FOiBUaGUgZmFjdCB0aGF0
IHRoZSBgbG9jYXRpb24nIGFyZ3VtZW50IG9mCiA7OyBgdnRhYmxlLWluc2VydC1vYmplY3QnIGNh
biBiZSBhbiBpbnRlZ2VyIGFuZCBpcyB0aGVuIGludGVycHJldGVkIGFzCkBAIC0zNjMsOTEgKzM4
MCw5MiBAQCB2dGFibGUtaW5zZXJ0LW9iamVjdAogY2FzZS4KIAogVGhpcyBhbHNvIHVwZGF0ZXMg
dGhlIGRpc3BsYXllZCB0YWJsZS4iCi0gIDs7IElmIHRoZSB2dGFibGUgaXMgZW1wdHksIGp1c3Qg
YWRkIHRoZSBvYmplY3QgYW5kIHJlZ2VuZXJhdGUgdGhlCi0gIDs7IHRhYmxlLgotICAoaWYgKG51
bGwgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkKLSAgICAgIChwcm9nbgotICAgICAgICAoc2V0ZiAo
dnRhYmxlLW9iamVjdHMgdGFibGUpIChsaXN0IG9iamVjdCkpCi0gICAgICAgICh2dGFibGUtLXJl
Y29tcHV0ZS1udW1lcmljYWwgdGFibGUgKHZ0YWJsZS0tY29tcHV0ZS1jYWNoZWQtbGluZSB0YWJs
ZSBvYmplY3QpKQotICAgICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCi0gICAgICAgICh2
dGFibGUtcmV2ZXJ0LWNvbW1hbmQpKQotICAgIDs7IEZpcnN0IGluc2VydCBpbnRvIHRoZSBvYmpl
Y3RzLgotICAgIChsZXQgKChwb3MgKGlmIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgKGlm
IChpbnRlZ2VycCBsb2NhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgKHByb2cxCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAobnRoY2RyIGxvY2F0aW9uICh2dGFibGUtb2JqZWN0cyB0
YWJsZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgOzsgRG8gbm90IHByZXBlbmQgaWYgaW5k
ZXggaXMgdG9vIGxhcmdlOgotICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIGJlZm9yZSBu
aWwpKQotICAgICAgICAgICAgICAgICAgICAgKG9yIChtZW1xIGxvY2F0aW9uICh2dGFibGUtb2Jq
ZWN0cyB0YWJsZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgOzsgUHJlcGVuZCBpZiBgbG9j
YXRpb24nIGlzIG5vdCBmb3VuZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICA7OyBgYmVm
b3JlJyBpcyBub24tbmlsOgotICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgYmVmb3JlICh2
dGFibGUtb2JqZWN0cyB0YWJsZSkpKSkKLSAgICAgICAgICAgICAgICAgOzsgSWYgYGxvY2F0aW9u
JyBpcyBuaWwgYW5kIGBiZWZvcmUnIGlzIG5vbi1uaWwsIHdlCi0gICAgICAgICAgICAgICAgIDs7
IHByZXBlbmQgdGhlIG5ldyBvYmplY3QuCi0gICAgICAgICAgICAgICAgIChpZiBiZWZvcmUgKHZ0
YWJsZS1vYmplY3RzIHRhYmxlKSkpKSkKLSAgICAgIChpZiAob3IgYmVmb3JlICA7IElmIGBiZWZv
cmUnIGlzIG5vbi1uaWwsIGBwb3MnIHNob3VsZCBiZSwgYXMgd2VsbC4KLSAgICAgICAgICAgICAg
KGFuZCBwb3MgKGludGVnZXJwIGxvY2F0aW9uKSkpCi0gICAgICAgICAgOzsgQWRkIHRoZSBuZXcg
b2JqZWN0IGJlZm9yZS4KLSAgICAgICAgICAobGV0ICgob2xkLW9iamVjdCAoY2FyIHBvcykpKQot
ICAgICAgICAgICAgKHNldGNhciBwb3Mgb2JqZWN0KQotICAgICAgICAgICAgKHNldGNkciBwb3Mg
KGNvbnMgb2xkLW9iamVjdCAoY2RyIHBvcykpKSkKLSAgICAgICAgOzsgT3RoZXJ3aXNlLCBhZGQg
dGhlIG9iamVjdCBhZnRlci4KLSAgICAgICAgKGlmIHBvcwotICAgICAgICAgICAgOzsgU3BsaWNl
IHRoZSBvYmplY3QgaW50byB0aGUgbGlzdC4KLSAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25z
IG9iamVjdCAoY2RyIHBvcykpKQotICAgICAgICAgIDs7IE90aGVyd2lzZSwgYXBwZW5kIHRoZSBv
YmplY3QuCi0gICAgICAgICAgKG5jb25jICh2dGFibGUtb2JqZWN0cyB0YWJsZSkgKGxpc3Qgb2Jq
ZWN0KSkpKSkKLSAgICA7OyBUaGVuIGFkanVzdCB0aGUgY2FjaGUgYW5kIGRpc3BsYXkuCi0gICAg
KHNhdmUtZXhjdXJzaW9uCi0gICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCi0gICAgICAo
bGV0KiAoKGNhY2hlICh2dGFibGUtLWN1cnJlbnQtY2FjaGUpKQotICAgICAgICAgICAgIChpbmhp
Yml0LXJlYWQtb25seSB0KQotICAgICAgICAgICAgIChrZXltYXAgKGdldC10ZXh0LXByb3BlcnR5
IChwb2ludCkgJ2tleW1hcCkpCi0gICAgICAgICAgICAgKGVsbGlwc2lzIChpZiAodnRhYmxlLWVs
bGlwc2lzIHRhYmxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnRpemUgKHRy
dW5jYXRlLXN0cmluZy1lbGxpcHNpcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICdmYWNlICh2dGFibGUtZmFjZSB0YWJsZSkpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgIiIpKQotICAgICAgICAgICAgIChlbGxpcHNpcy13aWR0aCAoc3RyaW5nLXBpeGVsLXdpZHRo
IGVsbGlwc2lzKSkKLSAgICAgICAgICAgICAobGluZXMgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2Fj
aGUpKQotICAgICAgICAgICAgIChlbGVtIChpZiBsb2NhdGlvbiAgOyBUaGlzIGJpbmRpbmcgbWly
cm9ycyB0aGUgYmluZGluZyBvZiBgcG9zJyBhYm92ZS4KLSAgICAgICAgICAgICAgICAgICAgICAg
KGlmIChpbnRlZ2VycCBsb2NhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChudGgg
bG9jYXRpb24gbGluZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKG9yIChhc3NxIGxvY2F0
aW9uIGxpbmVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIGJlZm9yZSAoY2Fy
IGxpbmVzKSkpKQotICAgICAgICAgICAgICAgICAgICAgKGlmIGJlZm9yZSAoY2FyIGxpbmVzKSkp
KQotICAgICAgICAgICAgIChwb3MgKG1lbXEgZWxlbSBsaW5lcykpCi0gICAgICAgICAgICAgKGxp
bmUgKGNvbnMgb2JqZWN0ICh2dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUgdGFibGUgb2JqZWN0
KSkpKQotICAgICAgICAoaWYgKG9yIGJlZm9yZQorICAod2l0aC1jdXJyZW50LWJ1ZmZlciAodnRh
YmxlLWJ1ZmZlciB0YWJsZSkKKyAgICA7OyBJZiB0aGUgdnRhYmxlIGlzIGVtcHR5LCBqdXN0IGFk
ZCB0aGUgb2JqZWN0IGFuZCByZWdlbmVyYXRlIHRoZQorICAgIDs7IHRhYmxlLgorICAgIChpZiAo
bnVsbCAodnRhYmxlLW9iamVjdHMgdGFibGUpKQorICAgICAgICAocHJvZ24KKyAgICAgICAgICAo
c2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpIChsaXN0IG9iamVjdCkpCisgICAgICAgICAgKHZ0
YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1s
aW5lIHRhYmxlIG9iamVjdCkpCisgICAgICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlKQor
ICAgICAgICAgICh2dGFibGUtcmV2ZXJ0LWNvbW1hbmQpKQorICAgICAgOzsgRmlyc3QgaW5zZXJ0
IGludG8gdGhlIG9iamVjdHMuCisgICAgICAobGV0ICgocG9zIChpZiBsb2NhdGlvbgorICAgICAg
ICAgICAgICAgICAgICAgKGlmIChpbnRlZ2VycCBsb2NhdGlvbikKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAocHJvZzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG50aGNkciBsb2Nh
dGlvbiAodnRhYmxlLW9iamVjdHMgdGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
OzsgRG8gbm90IHByZXBlbmQgaWYgaW5kZXggaXMgdG9vIGxhcmdlOgorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKHNldHEgYmVmb3JlIG5pbCkpCisgICAgICAgICAgICAgICAgICAgICAgIChv
ciAobWVtcSBsb2NhdGlvbiAodnRhYmxlLW9iamVjdHMgdGFibGUpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgOzsgUHJlcGVuZCBpZiBgbG9jYXRpb24nIGlzIG5vdCBmb3VuZCBhbmQKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGBiZWZvcmUnIGlzIG5vbi1uaWw6CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoYW5kIGJlZm9yZSAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkp
CisgICAgICAgICAgICAgICAgICAgOzsgSWYgYGxvY2F0aW9uJyBpcyBuaWwgYW5kIGBiZWZvcmUn
IGlzIG5vbi1uaWwsIHdlCisgICAgICAgICAgICAgICAgICAgOzsgcHJlcGVuZCB0aGUgbmV3IG9i
amVjdC4KKyAgICAgICAgICAgICAgICAgICAoaWYgYmVmb3JlICh2dGFibGUtb2JqZWN0cyB0YWJs
ZSkpKSkpCisgICAgICAgIChpZiAob3IgYmVmb3JlICA7IElmIGBiZWZvcmUnIGlzIG5vbi1uaWws
IGBwb3MnIHNob3VsZCBiZSwgYXMgd2VsbC4KICAgICAgICAgICAgICAgICAoYW5kIHBvcyAoaW50
ZWdlcnAgbG9jYXRpb24pKSkKLSAgICAgICAgICAgIDs7IEFkZCB0aGUgbmV3IG9iamVjdCBiZWZv
cmU6LgotICAgICAgICAgICAgKGxldCAoKG9sZC1saW5lIChjYXIgcG9zKSkpCi0gICAgICAgICAg
ICAgIChzZXRjYXIgcG9zIGxpbmUpCi0gICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIG9s
ZC1saW5lIChjZHIgcG9zKSkpCi0gICAgICAgICAgICAgICh1bmxlc3MgKHZ0YWJsZS1nb3RvLW9i
amVjdCAoY2FyIGVsZW0pKQotICAgICAgICAgICAgICAgICh2dGFibGUtYmVnaW5uaW5nLW9mLXRh
YmxlKSkpCisgICAgICAgICAgICA7OyBBZGQgdGhlIG5ldyBvYmplY3QgYmVmb3JlLgorICAgICAg
ICAgICAgKGxldCAoKG9sZC1vYmplY3QgKGNhciBwb3MpKSkKKyAgICAgICAgICAgICAgKHNldGNh
ciBwb3Mgb2JqZWN0KQorICAgICAgICAgICAgICAoc2V0Y2RyIHBvcyAoY29ucyBvbGQtb2JqZWN0
IChjZHIgcG9zKSkpKQogICAgICAgICAgIDs7IE90aGVyd2lzZSwgYWRkIHRoZSBvYmplY3QgYWZ0
ZXIuCiAgICAgICAgICAgKGlmIHBvcwogICAgICAgICAgICAgICA7OyBTcGxpY2UgdGhlIG9iamVj
dCBpbnRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAocHJvZ24KLSAgICAgICAgICAgICAgICAo
c2V0Y2RyIHBvcyAoY29ucyBsaW5lIChjZHIgcG9zKSkpCi0gICAgICAgICAgICAgICAgKGlmICh2
dGFibGUtZ290by1vYmplY3QgbG9jYXRpb24pCi0gICAgICAgICAgICAgICAgICAgIChmb3J3YXJk
LWxpbmUgMSkgIDsgSW5zZXJ0ICphZnRlciouCi0gICAgICAgICAgICAgICAgICAodnRhYmxlLWVu
ZC1vZi10YWJsZSkpKQorICAgICAgICAgICAgICAoc2V0Y2RyIHBvcyAoY29ucyBvYmplY3QgKGNk
ciBwb3MpKSkKICAgICAgICAgICAgIDs7IE90aGVyd2lzZSwgYXBwZW5kIHRoZSBvYmplY3QuCi0g
ICAgICAgICAgICAoc2V0Y2FyIGNhY2hlIChuY29uYyBsaW5lcyAobGlzdCBsaW5lKSkpCi0gICAg
ICAgICAgICAodnRhYmxlLWVuZC1vZi10YWJsZSkpKQotICAgICAgICAobGV0ICgoc3RhcnQgKHBv
aW50KSkpCi0gICAgICAgICAgOzsgRklYTUU6IFdlIGhhdmUgdG8gYWRqdXN0IGNvbG9ycyBpbiBs
aW5lcyBiZWxvdyB0aGlzIGlmIHdlCi0gICAgICAgICAgOzsgaGF2ZSA6cm93LWNvbG9ycy4KLSAg
ICAgICAgICAodnRhYmxlLS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIDAKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpICh2dGFibGUtLXNw
YWNlciB0YWJsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxpcHNpcyBlbGxp
cHNpcy13aWR0aCkKLSAgICAgICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9pbnQp
IChsaXN0ICdrZXltYXAga2V5bWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAndnRhYmxlIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAndnRhYmxlLWNhY2hlIGNhY2hlKSkpCi0gICAgICAg
IDs7IFdlIG1heSBoYXZlIGluc2VydGVkIGEgbm9uLW51bWVyaWNhbCB2YWx1ZSBpbnRvIGEgcHJl
dmlvdXNseQotICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUuCi0g
ICAgICAgICh2dGFibGUtLXJlY29tcHV0ZS1udW1lcmljYWwgdGFibGUgKGNkciBsaW5lKSkpKSkp
CisgICAgICAgICAgICAobmNvbmMgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSAobGlzdCBvYmplY3Qp
KSkpKQorICAgICAgOzsgVGhlbiBhZGp1c3QgdGhlIGNhY2hlIGFuZCBkaXNwbGF5LgorICAgICAg
KHNhdmUtZXhjdXJzaW9uCisgICAgICAgICh2dGFibGUtZ290by10YWJsZSB0YWJsZSkKKyAgICAg
ICAgKGxldCogKChjYWNoZSAodnRhYmxlLS1jdXJyZW50LWNhY2hlKSkKKyAgICAgICAgICAgICAg
IChpbmhpYml0LXJlYWQtb25seSB0KQorICAgICAgICAgICAgICAgKGtleW1hcCAoZ2V0LXRleHQt
cHJvcGVydHkgKHBvaW50KSAna2V5bWFwKSkKKyAgICAgICAgICAgICAgIChlbGxpcHNpcyAoaWYg
KHZ0YWJsZS1lbGxpcHNpcyB0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBy
b3BlcnRpemUgKHRydW5jYXRlLXN0cmluZy1lbGxpcHNpcykKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJ2ZhY2UgKHZ0YWJsZS1mYWNlIHRhYmxlKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICIiKSkKKyAgICAgICAgICAgICAgIChlbGxpcHNpcy13aWR0aCAo
c3RyaW5nLXBpeGVsLXdpZHRoIGVsbGlwc2lzIChjdXJyZW50LWJ1ZmZlcikpKQorICAgICAgICAg
ICAgICAgKGxpbmVzICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkKKyAgICAgICAgICAgICAg
IChlbGVtIChpZiBsb2NhdGlvbiAgOyBUaGlzIGJpbmRpbmcgbWlycm9ycyB0aGUgYmluZGluZyBv
ZiBgcG9zJyBhYm92ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGludGVnZXJwIGxv
Y2F0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnRoIGxvY2F0aW9uIGxpbmVz
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yIChhc3NxIGxvY2F0aW9uIGxpbmVzKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgYmVmb3JlIChjYXIgbGluZXMpKSkp
CisgICAgICAgICAgICAgICAgICAgICAgIChpZiBiZWZvcmUgKGNhciBsaW5lcykpKSkKKyAgICAg
ICAgICAgICAgIChwb3MgKG1lbXEgZWxlbSBsaW5lcykpCisgICAgICAgICAgICAgICAobGluZSAo
Y29ucyBvYmplY3QgKHZ0YWJsZS0tY29tcHV0ZS1jYWNoZWQtbGluZSB0YWJsZSBvYmplY3QpKSkp
CisgICAgICAgICAgKGlmIChvciBiZWZvcmUKKyAgICAgICAgICAgICAgICAgIChhbmQgcG9zIChp
bnRlZ2VycCBsb2NhdGlvbikpKQorICAgICAgICAgICAgICA7OyBBZGQgdGhlIG5ldyBvYmplY3Qg
YmVmb3JlOi4KKyAgICAgICAgICAgICAgKGxldCAoKG9sZC1saW5lIChjYXIgcG9zKSkpCisgICAg
ICAgICAgICAgICAgKHNldGNhciBwb3MgbGluZSkKKyAgICAgICAgICAgICAgICAoc2V0Y2RyIHBv
cyAoY29ucyBvbGQtbGluZSAoY2RyIHBvcykpKQorICAgICAgICAgICAgICAgICh1bmxlc3MgKHZ0
YWJsZS1nb3RvLW9iamVjdCAoY2FyIGVsZW0pKQorICAgICAgICAgICAgICAgICAgKHZ0YWJsZS1i
ZWdpbm5pbmctb2YtdGFibGUpKSkKKyAgICAgICAgICAgIDs7IE90aGVyd2lzZSwgYWRkIHRoZSBv
YmplY3QgYWZ0ZXIuCisgICAgICAgICAgICAoaWYgcG9zCisgICAgICAgICAgICAgICAgOzsgU3Bs
aWNlIHRoZSBvYmplY3QgaW50byB0aGUgbGlzdC4KKyAgICAgICAgICAgICAgICAocHJvZ24KKyAg
ICAgICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIGxpbmUgKGNkciBwb3MpKSkKKyAgICAg
ICAgICAgICAgICAgIChpZiAodnRhYmxlLWdvdG8tb2JqZWN0IGxvY2F0aW9uKQorICAgICAgICAg
ICAgICAgICAgICAgIChmb3J3YXJkLWxpbmUgMSkgIDsgSW5zZXJ0ICphZnRlciouCisgICAgICAg
ICAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCisgICAgICAgICAgICAgIDs7IE90
aGVyd2lzZSwgYXBwZW5kIHRoZSBvYmplY3QuCisgICAgICAgICAgICAgIChzZXRjYXIgY2FjaGUg
KG5jb25jIGxpbmVzIChsaXN0IGxpbmUpKSkKKyAgICAgICAgICAgICAgKHZ0YWJsZS1lbmQtb2Yt
dGFibGUpKSkKKyAgICAgICAgICAobGV0ICgoc3RhcnQgKHBvaW50KSkpCisgICAgICAgICAgICA7
OyBGSVhNRTogV2UgaGF2ZSB0byBhZGp1c3QgY29sb3JzIGluIGxpbmVzIGJlbG93IHRoaXMgaWYg
d2UKKyAgICAgICAgICAgIDs7IGhhdmUgOnJvdy1jb2xvcnMuCisgICAgICAgICAgICAodnRhYmxl
LS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICh2dGFibGUtLWNhY2hlLXdpZHRocyBjYWNoZSkgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMgZWxsaXBzaXMtd2lkdGgp
CisgICAgICAgICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9pbnQpIChsaXN0ICdr
ZXltYXAga2V5bWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICd2dGFibGUgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZS1jYWNoZSBjYWNoZSkpKQorICAgICAgICAgIDs7
IFdlIG1heSBoYXZlIGluc2VydGVkIGEgbm9uLW51bWVyaWNhbCB2YWx1ZSBpbnRvIGEgcHJldmlv
dXNseQorICAgICAgICAgIDs7IGFsbC1udW1lcmljYWwgdGFibGUsIHNvIHJlY29tcHV0ZS4KKyAg
ICAgICAgICAodnRhYmxlLS1yZWNvbXB1dGUtbnVtZXJpY2FsIHRhYmxlIChjZHIgbGluZSkpKSkp
KSkKIAogKGRlZnVuIHZ0YWJsZS1jb2x1bW4gKHRhYmxlIGluZGV4KQogICAiUmV0dXJuIHRoZSBu
YW1lIG9mIHRoZSBJTkRFWHRoIGNvbHVtbiBpbiBUQUJMRS4iCkBAIC01MjAsMTQgKzUzOCwxNCBA
QCB2dGFibGUtLWNhY2hlLXdpZHRocwogKGRlZnVuIHZ0YWJsZS0tY2FjaGUtbGluZXMgKGNhY2hl
KQogICAoY2FyIGNhY2hlKSkKIAotKGRlZnVuIHZ0YWJsZS1pbnNlcnQgKHRhYmxlKQorKGRlZnVu
IHZ0YWJsZS0taW5zZXJ0ICh0YWJsZSkKICAgKGxldCogKChzcGFjZXIgKHZ0YWJsZS0tc3BhY2Vy
IHRhYmxlKSkKICAgICAgICAgIChzdGFydCAocG9pbnQpKQogICAgICAgICAgKGVsbGlwc2lzIChp
ZiAodnRhYmxlLWVsbGlwc2lzIHRhYmxlKQogICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVy
dGl6ZSAodHJ1bmNhdGUtc3RyaW5nLWVsbGlwc2lzKQogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAnZmFjZSAodnRhYmxlLWZhY2UgdGFibGUpKQogICAgICAgICAgICAgICAgICAg
ICAgIiIpKQotICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggZWxs
aXBzaXMpKQorICAgICAgICAgKGVsbGlwc2lzLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggZWxs
aXBzaXMgKGN1cnJlbnQtYnVmZmVyKSkpCiAgICAgICAgICA7OyBXZSBtYWludGFpbiBhIGNhY2hl
IHBlciBzY3JlZW4vd2luZG93IHdpZHRoLCBzbyB0aGF0IHdlIHJlbmRlcgogICAgICAgICAgOzsg
Y29ycmVjdGx5IGlmIEVtYWNzIGlzIG9wZW4gb24gdHdvIGRpZmZlcmVudCBzY3JlZW5zIChvciB0
aGUKICAgICAgICAgIDs7IHVzZXIgcmVzaXplcyB0aGUgZnJhbWUpLgpAQCAtNTY1LDkgKzU4Mywy
NCBAQCB2dGFibGUtaW5zZXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJs
ZS1jYWNoZSBjYWNoZSkpCiAgICAgKGdvdG8tY2hhciBzdGFydCkpKQogCisoZGVmdW4gdnRhYmxl
LWluc2VydCAodGFibGUpCisgICJJbnNlcnQgVEFCTEUgaW50byB0aGUgY3VycmVudCBidWZmZXIu
CitUaGUgY3VycmVudCBidWZmZXIgd2lsbCBiZSByZWNvcmRlZCBhcyBUQUJMRSdzIGJ1ZmZlci4g
IElmIHRoaXMgaXMgZG9uZQorbW9yZSB0aGFuIG9uY2UsIG9yIGlmIHRoZSB0YWJsZSBpcyBhdHRl
bXB0ZWQgdG8gYmUgaW5zZXJ0ZWQgbW9yZSB0aGFuCitvbmNlIGludG8gdGhlIHNhbWUgYnVmZmVy
LCBzaWduYWwgYW4gZXJyb3IuIgorICAoaWYtbGV0KiAoKHRhYmxlLWJ1ZmZlciAodnRhYmxlLWJ1
ZmZlciB0YWJsZSkpKQorICAgICAgKGlmIChlcSB0YWJsZS1idWZmZXIgKGN1cnJlbnQtYnVmZmVy
KSkKKyAgICAgICAgICAoZXJyb3IgIkEgdnRhYmxlIGNhbm5vdCBiZSBpbnNlcnRlZCBtb3JlIHRo
YW4gb25jZSBpbnRvIGEgYnVmZmVyIikKKyAgICAgICAgKGVycm9yICJBIHZ0YWJsZSBjYW5ub3Qg
YmUgaW5zZXJ0ZWQgaW50byBtb3JlIHRoYW4gb25lIGJ1ZmZlciIpKSkKKyAgKHZ0YWJsZS1zZXQt
YnVmZmVyIChjdXJyZW50LWJ1ZmZlcikgdGFibGUpCisgIChsZXQgKChpbmhpYml0LXJlYWQtb25s
eSB0KQorICAgICAgICAoaW5oaWJpdC1tb2RpZmljYXRpb24taG9va3MgdCkpCisgICAgKHZ0YWJs
ZS0taW5zZXJ0IHRhYmxlKSkpCisKIChkZWZ1biB2dGFibGUtLWluc2VydC1saW5lICh0YWJsZSBs
aW5lIGxpbmUtbnVtYmVyIHdpZHRocyBzcGFjZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAmb3B0aW9uYWwgZWxsaXBzaXMgZWxsaXBzaXMtd2lkdGgpCiAgIChsZXQgKChzdGFy
dCAocG9pbnQpKQorICAgICAgICAoYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKSkKICAgICAg
ICAgKGNvbHVtbnMgKHZ0YWJsZS1jb2x1bW5zIHRhYmxlKSkKICAgICAgICAgKGNvbHVtbi1jb2xv
cnMKICAgICAgICAgIChhbmQgKHZ0YWJsZS1jb2x1bW4tY29sb3JzIHRhYmxlKQpAQCAtNjA3LDE2
ICs2NDAsMTggQEAgdnRhYmxlLS1pbnNlcnQtbGluZQogICAgICAgICAgICAgICAgICAgICAgIChj
b25jYXQKICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tbGltaXQtc3RyaW5nCiAgICAg
ICAgICAgICAgICAgICAgICAgICBwcmUtY29tcHV0ZWQgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yIGVsbGlwc2lzLXdpZHRo
IDApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgZWxsaXBz
aXMtd2lkdGggMCkpCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpCiAgICAgICAgICAg
ICAgICAgICAgICAgIGVsbGlwc2lzKQogICAgICAgICAgICAgICAgICAgICBwcmUtY29tcHV0ZWQp
KQogICAgICAgICAgICAgICAgICA7OyBSZWNvbXB1dGUgd2lkdGhzLgogICAgICAgICAgICAgICAg
ICAodAotICAgICAgICAgICAgICAgICAgKGlmICg+IChzdHJpbmctcGl4ZWwtd2lkdGggdmFsdWUp
IChlbHQgd2lkdGhzIGluZGV4KSkKKyAgICAgICAgICAgICAgICAgIChpZiAoPiAoc3RyaW5nLXBp
eGVsLXdpZHRoIHZhbHVlIGJ1ZmZlcikgKGVsdCB3aWR0aHMgaW5kZXgpKQogICAgICAgICAgICAg
ICAgICAgICAgIChjb25jYXQKICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tbGltaXQt
c3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAoLSAoZWx0IHdpZHRocyBpbmRl
eCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciBlbGxpcHNpcy13aWR0aCAw
KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgZWxsaXBzaXMtd2lkdGgg
MCkpCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpCiAgICAgICAgICAgICAgICAgICAg
ICAgIGVsbGlwc2lzKQogICAgICAgICAgICAgICAgICAgICB2YWx1ZSkpKSkKICAgICAgICAgICAg
ICAgIChzdGFydCAocG9pbnQpKQpAQCAtNjMwLDE0ICs2NjUsMTUgQEAgdnRhYmxlLS1pbnNlcnQt
bGluZQogICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAnc3BhY2UKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgOndpZHRoIChsaXN0CiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKCsgKC0gKGVsdCB3aWR0aHMgaW5kZXgpCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1waXhlbC13aWR0aCBkaXNw
bGF5ZWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChz
dHJpbmctcGl4ZWwtd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZGlzcGxheWVkIGJ1ZmZlcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGlmIGxhc3QgMCBzcGFjZXIpKSkpKSkpCiAgICAgICAgICAgICAgOzsg
QWxpZ24gdG8gdGhlIHJpZ2h0LgogICAgICAgICAgICAgIChpbnNlcnQgKHByb3BlcnRpemUgIiAi
ICdkaXNwbGF5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAnc3BhY2UK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3aWR0aCAobGlzdCAoLSAo
ZWx0IHdpZHRocyBpbmRleCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoc3RyaW5nLXBpeGVsLXdpZHRoCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZCkpKSkpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bs
YXllZCBidWZmZXIpKSkpKQogICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVkKQogICAgICAg
ICAgICAgICh1bmxlc3MgbGFzdAogICAgICAgICAgICAgICAgKGluc2VydCAocHJvcGVydGl6ZSAi
ICIgJ2Rpc3BsYXkKQEAgLTcxOCw2ICs3NTQsNyBAQCB2dGFibGUtLWluZGljYXRvcgogKGRlZnVu
IHZ0YWJsZS0taW5zZXJ0LWhlYWRlci1saW5lICh0YWJsZSB3aWR0aHMgc3BhY2VyKQogICA7OyBJ
bnNlcnQgdGhlIGhlYWRlciBkaXJlY3RseSBpbnRvIHRoZSBidWZmZXIuCiAgIChsZXQgKChzdGFy
dCAocG9pbnQpKQorICAgICAgICAoYnVmZmVyICh2dGFibGUtYnVmZmVyIHRhYmxlKSkKICAgICAg
ICAgKGRpdmlkZXIgKHZ0YWJsZS1kaXZpZGVyIHRhYmxlKSkKICAgICAgICAgKGNtYXAgKGRlZmlu
ZS1rZXltYXAKICAgICAgICAgICAgICAgICAiPGhlYWRlci1saW5lPiA8ZHJhZy1tb3VzZS0xPiIg
Iyd2dGFibGUtLWRyYWctcmVzaXplLWNvbHVtbgpAQCAtNzM3LDE0ICs3NzQsMTUgQEAgdnRhYmxl
LS1pbnNlcnQtaGVhZGVyLWxpbmUKICAgICAgICAgICAgICAgICAgICAgICdrZXltYXAgY21hcCkp
CiAgICAgICAgICAgICAgIChzdGFydCAocG9pbnQpKQogICAgICAgICAgICAgICAoaW5kaWNhdG9y
ICh2dGFibGUtLWluZGljYXRvciB0YWJsZSBpbmRleCkpCi0gICAgICAgICAgICAgIChpbmRpY2F0
b3Itd2lkdGggKHN0cmluZy1waXhlbC13aWR0aCBpbmRpY2F0b3IpKQorICAgICAgICAgICAgICAo
aW5kaWNhdG9yLXdpZHRoIChzdHJpbmctcGl4ZWwtd2lkdGggaW5kaWNhdG9yIGJ1ZmZlcikpCiAg
ICAgICAgICAgICAgIChsYXN0ICg9IGluZGV4ICgxLSAobGVuZ3RoICh2dGFibGUtY29sdW1ucyB0
YWJsZSkpKSkpCiAgICAgICAgICAgICAgIGRpc3BsYXllZCkKICAgICAgICAgIChzZXRxIGRpc3Bs
YXllZAotICAgICAgICAgICAgICAgKGlmICg+IChzdHJpbmctcGl4ZWwtd2lkdGggbmFtZSkKKyAg
ICAgICAgICAgICAgIChpZiAoPiAoc3RyaW5nLXBpeGVsLXdpZHRoIG5hbWUgYnVmZmVyKQogICAg
ICAgICAgICAgICAgICAgICAgICgtIChlbHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgp
KQogICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWxpbWl0LXN0cmluZwotICAgICAgICAgICAg
ICAgICAgICBuYW1lICgtIChlbHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lkdGgpKQorICAg
ICAgICAgICAgICAgICAgICBuYW1lICgtIChlbHQgd2lkdGhzIGluZGV4KSBpbmRpY2F0b3Itd2lk
dGgpCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcikKICAgICAgICAgICAgICAgICAgbmFtZSkp
CiAgICAgICAgICAobGV0KiAoKGluZGljYXRvci1sZWFkLXdpZHRoCiAgICAgICAgICAgICAgICAg
IDs7IFdlIHdhbnQgdGhlIGluZGljYXRvciB0byBub3QgYmUgcXVpdGUgZmx1c2ggcmlnaHQuCkBA
IC03NTMsNyArNzkxLDcgQEAgdnRhYmxlLS1pbnNlcnQtaGVhZGVyLWxpbmUKICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3ItbGVhZC13aWR0aCkpCiAgICAg
ICAgICAgICAgICAgKGZpbGwtd2lkdGgKICAgICAgICAgICAgICAgICAgKCsgKC0gKGVsdCB3aWR0
aHMgaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctcGl4ZWwtd2lkdGggZGlz
cGxheWVkKQorICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLXBpeGVsLXdpZHRoIGRpc3Bs
YXllZCBidWZmZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvci13aWR0aAogICAg
ICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3ItbGVhZC13aWR0aCkKICAgICAgICAgICAgICAg
ICAgICAgKGlmIGxhc3QgMCBzcGFjZXIpKSkpCkBAIC03NzEsNyArODA5LDggQEAgdnRhYmxlLS1p
bnNlcnQtaGVhZGVyLWxpbmUKICAgICAgICAgICAgICA7OyBUaGlzIGlzIHRoZSBmaW5hbCBjb2x1
bW4sIGFuZCB3ZSBoYXZlIGEgc29ydGluZwogICAgICAgICAgICAgIDs7IGluZGljYXRvciwgYW5k
IHRoZSB0YWJsZSBpcyB0b28gd2lkZSBmb3IgdGhlIHdpbmRvdy4KICAgICAgICAgICAgICAobGV0
KiAoKHByZS1pbmRpY2F0b3IgKHN0cmluZy1waXhlbC13aWR0aAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50LW1pbikgKHBvaW50KSkp
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcg
KHBvaW50LW1pbikgKHBvaW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJ1ZmZlcikpCiAgICAgICAgICAgICAgICAgICAgIChwcmUtZmlsbAogICAgICAgICAgICAgICAg
ICAgICAgKC0gKHdpbmRvdy13aWR0aCBuaWwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgIHBy
ZS1pbmRpY2F0b3IKQEAgLTg1MCwxNCArODg5LDE2IEBAIHZ0YWJsZS0tc2V0LWhlYWRlci1saW5l
CiAgICAgICAgICAgIChidWZmZXItc3Vic3RyaW5nIChwb2ludC1taW4pICgxLSAocG9pbnQtbWF4
KSkpKSkpCiAgICh2dGFibGUtaGVhZGVyLW1vZGUgMSkpCiAKLShkZWZ1biB2dGFibGUtLWxpbWl0
LXN0cmluZyAoc3RyaW5nIHBpeGVscykKKworKGRlZnVuIHZ0YWJsZS0tbGltaXQtc3RyaW5nIChz
dHJpbmcgcGl4ZWxzIGJ1ZmZlcikKICAgKHdoaWxlIChhbmQgKGxlbmd0aD4gc3RyaW5nIDApCi0g
ICAgICAgICAgICAgICg+IChzdHJpbmctcGl4ZWwtd2lkdGggc3RyaW5nKSBwaXhlbHMpKQorICAg
ICAgICAgICAgICAoPiAoc3RyaW5nLXBpeGVsLXdpZHRoIHN0cmluZyBidWZmZXIpIHBpeGVscykp
CiAgICAgKHNldHEgc3RyaW5nIChzdWJzdHJpbmcgc3RyaW5nIDAgKDEtIChsZW5ndGggc3RyaW5n
KSkpKSkKICAgc3RyaW5nKQogCiAoZGVmdW4gdnRhYmxlLS1jaGFyLXdpZHRoICh0YWJsZSkKLSAg
KHN0cmluZy1waXhlbC13aWR0aCAocHJvcGVydGl6ZSAieCIgJ2ZhY2UgKHZ0YWJsZS1mYWNlIHRh
YmxlKSkpKQorICAoc3RyaW5nLXBpeGVsLXdpZHRoIChwcm9wZXJ0aXplICJ4IiAnZmFjZSAodnRh
YmxlLWZhY2UgdGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtYnVmZmVyIHRh
YmxlKSkpCiAKIChkZWZ1biB2dGFibGUtLWNvbXB1dGUtd2lkdGggKHRhYmxlIHNwZWMpCiAgIChj
b25kCkBAIC05NjcsMjAgKzEwMDgsMjQgQEAgdnRhYmxlLS1tYWtlLWtleW1hcAogICAgICAgICAg
ICh2dGFibGUta2V5bWFwIHRhYmxlKSkKICAgICAgIG1hcCkpKQogCi0oZGVmdW4gdnRhYmxlLXJl
dmVydCAoKQotICAiUmVnZW5lcmF0ZSB0aGUgdGFibGUgdW5kZXIgcG9pbnQuIgotICAobGV0ICgo
dGFibGUgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkKLSAgICAgICAgKG9iamVjdCAodnRhYmxlLWN1
cnJlbnQtb2JqZWN0KSkKLSAgICAgICAgKGNvbHVtbiAodnRhYmxlLWN1cnJlbnQtY29sdW1uKSkK
LSAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQpKQotICAgICh1bmxlc3MgdGFibGUKLSAgICAg
ICh1c2VyLWVycm9yICJObyB0YWJsZSB1bmRlciBwb2ludCIpKQotICAgIChkZWxldGUtcmVnaW9u
ICh2dGFibGUtYmVnaW5uaW5nLW9mLXRhYmxlKSAodnRhYmxlLWVuZC1vZi10YWJsZSkpCi0gICAg
KHZ0YWJsZS1pbnNlcnQgdGFibGUpCi0gICAgKHdoZW4gb2JqZWN0Ci0gICAgICAodnRhYmxlLWdv
dG8tb2JqZWN0IG9iamVjdCkpCi0gICAgKHdoZW4gY29sdW1uCi0gICAgICAodnRhYmxlLWdvdG8t
Y29sdW1uIGNvbHVtbikpKSkKKyhkZWZ1biB2dGFibGUtcmV2ZXJ0ICgmb3B0aW9uYWwgdGFibGUp
CisgICJSZWdlbmVyYXRlIHRoZSB0YWJsZSB1bmRlciBwb2ludC4KK0lmIFRBQkxFIGlzIG5pbCwg
dXNlIHRoZSB0YWJsZSB1bmRlciBwb2ludC4iCisgIChzZXRxIHRhYmxlIChvciB0YWJsZSAodnRh
YmxlLWN1cnJlbnQtdGFibGUpKSkKKyAgKHVubGVzcyB0YWJsZQorICAgICh1c2VyLWVycm9yICJO
byB0YWJsZSBmb3VuZCIpKQorICAod2l0aC1jdXJyZW50LWJ1ZmZlciAodnRhYmxlLWJ1ZmZlciB0
YWJsZSkKKyAgICAobGV0ICgob2JqZWN0ICh2dGFibGUtY3VycmVudC1vYmplY3QpKQorICAgICAg
ICAgIChjb2x1bW4gKHZ0YWJsZS1jdXJyZW50LWNvbHVtbikpCisgICAgICAgICAgKGluaGliaXQt
cmVhZC1vbmx5IHQpKQorICAgICAgKHVubGVzcyB0YWJsZQorICAgICAgICAodXNlci1lcnJvciAi
Tm8gdGFibGUgdW5kZXIgcG9pbnQiKSkKKyAgICAgIChkZWxldGUtcmVnaW9uICh2dGFibGUtYmVn
aW5uaW5nLW9mLXRhYmxlKSAodnRhYmxlLWVuZC1vZi10YWJsZSkpCisgICAgICAodnRhYmxlLS1p
bnNlcnQgdGFibGUpCisgICAgICAod2hlbiBvYmplY3QKKyAgICAgICAgKHZ0YWJsZS1nb3RvLW9i
amVjdCBvYmplY3QpKQorICAgICAgKHdoZW4gY29sdW1uCisgICAgICAgICh2dGFibGUtZ290by1j
b2x1bW4gY29sdW1uKSkpKSkKIAogOzs7IENvbW1hbmRzLgogCkBAIC0xMDEzLDcgKzEwNTgsNyBA
QCB2dGFibGUtLWFsdGVyLWNvbHVtbi13aWR0aAogICAgIDs7IFN0b3JlIHRoZSB3aWR0aCBzbyBp
dCdsbCBiZSByZXNwZWN0ZWQgb24gYSByZXZlcnQuCiAgICAgKHNldGYgKHZ0YWJsZS1jb2x1bW4t
d2lkdGggKGVsdCAodnRhYmxlLWNvbHVtbnMgdGFibGUpIGNvbHVtbikpCiAgICAgICAgICAgKGZv
cm1hdCAiJWRweCIgKGFyZWYgd2lkdGhzIGNvbHVtbikpKQotICAgICh2dGFibGUtcmV2ZXJ0KSkp
CisgICAgKHZ0YWJsZS1yZXZlcnQgdGFibGUpKSkKIAogKGRlZnVuIHZ0YWJsZS13aWRlbi1jdXJy
ZW50LWNvbHVtbiAoJm9wdGlvbmFsIG4pCiAgICJXaWRlbiB0aGUgY3VycmVudCBjb2x1bW4gYnkg
TiBjaGFyYWN0ZXJzLgpAQCAtMTAzOCwxNCArMTA4MywxNiBAQCB2dGFibGUtbmV4dC1jb2x1bW4K
ICAgICAgKG1pbiAoMS0gKGxlbmd0aCAodnRhYmxlLS1jYWNoZS13aWR0aHMgKHZ0YWJsZS0tY3Vy
cmVudC1jYWNoZSkpKSkKICAgICAgICAgICAoMSsgKHZ0YWJsZS1jdXJyZW50LWNvbHVtbikpKSkp
KQogCi0oZGVmdW4gdnRhYmxlLXJldmVydC1jb21tYW5kICgpCisoZGVmdW4gdnRhYmxlLXJldmVy
dC1jb21tYW5kICgmb3B0aW9uYWwgdGFibGUpCiAgICJSZS1xdWVyeSBkYXRhIGFuZCByZWdlbmVy
YXRlIHRoZSB0YWJsZSB1bmRlciBwb2ludC4iCiAgIChpbnRlcmFjdGl2ZSkKLSAgKGxldCAoKHRh
YmxlICh2dGFibGUtY3VycmVudC10YWJsZSkpKQotICAgICh3aGVuICh2dGFibGUtb2JqZWN0cy1m
dW5jdGlvbiB0YWJsZSkKLSAgICAgIChzZXRmICh2dGFibGUtb2JqZWN0cyB0YWJsZSkgKGZ1bmNh
bGwgKHZ0YWJsZS1vYmplY3RzLWZ1bmN0aW9uIHRhYmxlKSkpKQotICAgICh2dGFibGUtLWNsZWFy
LWNhY2hlIHRhYmxlKSkKLSAgKHZ0YWJsZS1yZXZlcnQpKQorICAoc2V0cSB0YWJsZSAob3IgdGFi
bGUgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpCisgICh1bmxlc3MgdGFibGUKKyAgICAodXNlci1l
cnJvciAiTm8gdGFibGUgZm91bmQiKSkKKyAgKHdoZW4gKHZ0YWJsZS1vYmplY3RzLWZ1bmN0aW9u
IHRhYmxlKQorICAgIChzZXRmICh2dGFibGUtb2JqZWN0cyB0YWJsZSkgKGZ1bmNhbGwgKHZ0YWJs
ZS1vYmplY3RzLWZ1bmN0aW9uIHRhYmxlKSkpKQorICAodnRhYmxlLS1jbGVhci1jYWNoZSB0YWJs
ZSkKKyAgKHZ0YWJsZS1yZXZlcnQgdGFibGUpKQogCiAoZGVmdW4gdnRhYmxlLXNvcnQtYnktY3Vy
cmVudC1jb2x1bW4gKCkKICAgIlNvcnQgdGhlIHRhYmxlIHVuZGVyIHBvaW50IGJ5IHRoZSBjb2x1
bW4gdW5kZXIgcG9pbnQuIgpAQCAtMTA2Nyw4ICsxMTE0LDggQEAgdnRhYmxlLXNvcnQtYnktY3Vy
cmVudC1jb2x1bW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGVxIChj
ZHIgbGFzdCkgJ2FzY2VuZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
J2Rlc2NlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc2NlbmQpCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc2NlbmQpKSkpKSkKLSAgKHZ0YWJsZS1y
ZXZlcnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNjZW5kKSkpKSkKKyAg
ICAodnRhYmxlLXJldmVydCB0YWJsZSkpKQogCiAoZGVmdW4gdnRhYmxlLWhlYWRlci1saW5lLXNv
cnQgKGUpCiAgICJTb3J0IGEgdnRhYmxlIGZyb20gdGhlIGhlYWRlciBsaW5lLiIKLS0gCjIuNDcu
MQoK
--000000000000af443706459a3568--




Acknowledgement sent to Stéphane Marks <shipmints@HIDDEN>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs@HIDDEN. Full text available.
Report forwarded to bug-gnu-emacs@HIDDEN:
bug#79982; Package emacs. Full text available.
Please note: This is a static page, with minimal formatting, updated once a day.
Click here to see this page with the latest information and nicer formatting.
Last modified: Sat, 20 Dec 2025 12:30:01 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.