GNU bug report logs - #79009
[PATCH] Improve 'vtable' object handling, cache handling, messages

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 Sun, 13 Jul 2025 18:08:01 UTC; Maintainer for emacs is bug-gnu-emacs@HIDDEN.

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


Received: (at 79009) by debbugs.gnu.org; 15 Jul 2025 11:15:57 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue Jul 15 07:15:57 2025
Received: from localhost ([127.0.0.1]:40597 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ubddZ-0004MW-SJ
	for submit <at> debbugs.gnu.org; Tue, 15 Jul 2025 07:15:57 -0400
Received: from mail-vk1-xa2b.google.com ([2607:f8b0:4864:20::a2b]:55786)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1ubddV-0004M6-Bt
 for 79009 <at> debbugs.gnu.org; Tue, 15 Jul 2025 07:15:52 -0400
Received: by mail-vk1-xa2b.google.com with SMTP id
 71dfb90a1353d-52b2290e292so2370151e0c.3
 for <79009 <at> debbugs.gnu.org>; Tue, 15 Jul 2025 04:15:49 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1752578143; x=1753182943; 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=9hFcK3wA12GD6C3avIdhGZ4b/vwe+5P/o0/1dCL14wk=;
 b=AkWV6oWk/A+7jizPezbPXN2ekbzTvgN3Y/xlwA8NbL2nbmvInvIqpFMAjAghfI+2H0
 d/Z2YTbQTFCY7XC6DlUrfooFpYQPSQA/BBOEdzKnwMqzsVc5hp91g1illSR9Hq475cpQ
 SHFh25nTDzTJc3DoXJeMbWQ5Ynhi6oqdC5adfp7m3FTiIl+hvbQRSFOqTVdAPfM2Wlrj
 h+ASNUMpL8uogq334GePVF7tzAHeSX9MTvlqgmTFOks8oumQ/cHYqvLSX+tGYITufQ7L
 X5pkn74XTzvVgRg8UDiU119fFhCHBXKiGapWgsHCpHTWyrjvptXpgutp7mm2mV5cyPnN
 aaGQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1752578143; x=1753182943;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id
 :reply-to;
 bh=9hFcK3wA12GD6C3avIdhGZ4b/vwe+5P/o0/1dCL14wk=;
 b=e2m6th2Gf5bgaSY3M/d46voc4NZoSXlfka54g85lreJCGwmdnYoQL7L1vyYkCXxQ07
 Q/xsOOqiSzyvD5MFYaaqaRltRo+M+xnRH+k1eoa/+TBQPp74qQSwr2UUrVuXNdf2OqzM
 t2kJSTQSbm1hiFKj0I9vUrikrOJms+AfoA87p6yBa378sZTIlotCJgXpL9cq7GZPBJuE
 HlkZDrBP5wv5wOguVyICgkpmzmgUltucm5/58/w8pGlQLyf5om4q6ZLCx2wNIS+AV8hP
 QmVDH9BDcxgjOSeIBBfhRv9STPTxEULfxPBdhO37ND828nIkhKBWfNsQBiSgZN17YDYK
 J5/g==
X-Gm-Message-State: AOJu0YwMlPdUmphr580TpL0i9g7p/AM/KANbItJIm3tbzPk6fEpIGOib
 DfFzdx4XCoSp6JDAV+AmtKjLX93q36b4Tc5LxTa5P8F49YBbpGkZI8VO2DY/FUcKvEgDGUdj+NA
 6gMEyh1H2apa3fUBXi3PAe8nvAr3PKqY=
X-Gm-Gg: ASbGnctlqZD0U/YFzh6pQx84q78CrGzhfm5JRfirUFWvYWtBrh856lyNl5MELcXgggd
 gxL3GCE31EWy9oXN9Z+pOs+IdPfEvQeDw7rpp44ZqnhlHMWBLdJdqQnh5U91QYdZV2HxOBDy2z+
 tF1zuUpm/51BYYS+8ltR+KCquKbaUdg+1Zn8ywvXz1kCceXyp2Ct2VWO2xgywr5VZEYMrONSbI5
 mexTXdyxw==
X-Google-Smtp-Source: AGHT+IFls0VOfsGm9g3BZ0qfUZsrOOLYkUmxfXDl+HmpNMRS6/46ZbIX3P5lWDKqiPwgpAACGB8EV3YGc2LNgmluEgM=
X-Received: by 2002:a05:6122:90b:b0:534:69b3:a200 with SMTP id
 71dfb90a1353d-535f45580bcmr7983330e0c.0.1752578143317; Tue, 15 Jul 2025
 04:15:43 -0700 (PDT)
MIME-Version: 1.0
References: <CAN+1HbrLkmV6QYfJPcEv-EeX6T1tiNogG41GkCw8aMxdt4GmkA@HIDDEN>
 <CAN+1HbpNcK=FdiarDBcB4NyOouAeNV2wTrA7x4asHUAEopBqHQ@HIDDEN>
 <ierqzyi35vh.fsf_-_@HIDDEN>
In-Reply-To: <ierqzyi35vh.fsf_-_@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Tue, 15 Jul 2025 07:15:32 -0400
X-Gm-Features: Ac12FXxt-_4BFjO41WXGcvxq48Zn5Dw8kwcO7cx6xRMdxZYWZSI896C_a45pXBs
Message-ID: <CAN+1Hbp+qC=9cvMwuPK_OiuY_wwR6JH2GdYaBdnLP+RCncemog@HIDDEN>
Subject: Re: bug#79009: [PATCH] Improve 'vtable' object handling, cache
 handling, messages, [PATCH] Improve 'vtable' object handling, cache handling,
 messages
To: Spencer Baugh <sbaugh@HIDDEN>
Content-Type: multipart/alternative; boundary="000000000000ac73390639f5e534"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79009
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, 79009 <at> debbugs.gnu.org,
 Visuwesh <visuweshm@HIDDEN>, Adam Porter <adam@HIDDEN>,
 Lars Ingebrigtsen <larsi@HIDDEN>, Augusto Stoffel <arstoffel@HIDDEN>,
 ijqq@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 (-)

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

On Mon, Jul 14, 2025 at 3:54=E2=80=AFPM Spencer Baugh <sbaugh@HIDDEN=
m> wrote:

> St=C3=A9phane Marks <shipmints@HIDDEN> writes:
> > On Sun, Jul 13, 2025 at 2:16=E2=80=AFPM St=C3=A9phane Marks <shipmints@=
gmail.com>
> wrote:
> > I've updated the broader vtable update in the referenced 78843 bug to
> check out if interested.
> >
> > I've removed support for the duplicate-object feature.  After careful
> consideration, it was half baked and I think better for vtable
> > programmers to handle their own objects.  I will be sure the
> documentation stresses to avoid duplicate objects as vtable's design is
> > predicated on unique objects (or race conditions ensue among duplicate
> object references).
>
> Thank you, this was going to be my first bit of feedback.
>
> Folowup question: What is the motivation for adding customizable object
> equality?  Could the need for that be avoided by some changes specific
> to vtable-update-object?
>

It's really a policy question and future proofing.  I believe Lars
originated this idea and probably has use cases for this in his vtable code=
.


> > Attaching the updated patch which is also formatted to avoid mere
> whitespace changes.
>
> Thanks for this too.
>
> > From e7bb61becb15e07ebd3e54cf2c1ea2becada09b0 Mon Sep 17 00:00:00 2001
> > From: =3D?UTF-8?q?St=3DC3=3DA9phane=3D20Marks?=3D <shipmints@HIDDEN>
> > Date: Sun, 13 Jul 2025 13:32:28 -0400
> > Subject: [PATCH] Improve 'vtable' object handling, cache handling,
> messages
> >
> > Add object equality function override (defaults to existing 'eq'
> > behavior).  Add column comparator to address object
> > sorting (defaults to existing behavior).  Correct cache
> > references to prime the cache as needed.  Add cache accessor
> > functions.  Add table name slot to improve errors and
> > messages (defaults to "*vtable*").
> >
> > Added tests.
> >
> > * lisp/emacs-lisp/vtable.el (vtable-column): Add comparator
> > slot.
> > (vtable): Add name, object-equal slots.
> > (make-vtable): Initialize new slots.
> > (vtable-goto-object): Use object-equal.
> > (vtable-update-object): Use object-equal, use cache accessor,
> > improve messages.
> > (vtable-remove-object): Use object-equal, prime cache, use cache
> > functions, improve messages.
> > (vtable-insert-object): Use object-equal, use cache accessor,
> > improve messages.
> > (vtable-insert): Prime cache, use cache accessor.
> > (vtable--sort): Use column comparator, prime cache, use cache
> > accessor.
> > (vtable--compute-width): Improve message.
> > (vtable--widths): Use cache accessor.
> >
> > * test/lisp/emacs-lisp/vtable-tests.el
> > (test-vstable-compute-columns): Renamed to
> > test-vtable-compute-columns.
> > (test-vtable-insert-object): Changed buffer name to non-hidden.
> > (test-vtable-update-object, test-vtable-remove-object)
> > (test-vtable-object-equal, test-vtable-column-comparator): New
> > test.
> > ---
> >  lisp/emacs-lisp/vtable.el            | 143 ++++++++++++++++++++-------
> >  test/lisp/emacs-lisp/vtable-tests.el | 106 +++++++++++++++++++-
> >  2 files changed, 210 insertions(+), 39 deletions(-)
> >
> > diff --git a/lisp/emacs-lisp/vtable.el b/lisp/emacs-lisp/vtable.el
> > index 00785113edb..31ef73d5eb4 100644
> > --- a/lisp/emacs-lisp/vtable.el
> > +++ b/lisp/emacs-lisp/vtable.el
> > @@ -45,14 +45,18 @@ vtable-column
> >    getter
> >    formatter
> >    displayer
> > +  comparator
> >    -numerical
> >    -aligned)
> >
> >  (defclass vtable ()
> > -  ((columns :initarg :columns :accessor vtable-columns)
> > +  ((name :initarg :name :accessor vtable-name)
> > +   (columns :initarg :columns :accessor vtable-columns)
> >     (objects :initarg :objects :accessor vtable-objects)
> >     (objects-function :initarg :objects-function
> >                       :accessor vtable-objects-function)
> > +   (object-equal :initarg :object-equal
> > +                 :accessor vtable-object-equal)
>
> (I feel like there's probably a better name for this but I don't know
> what it would be)
>
> >     (getter :initarg :getter :accessor vtable-getter)
> >     (formatter :initarg :formatter :accessor vtable-formatter)
> >     (displayer :initarg :displayer :accessor vtable-displayer)
> > @@ -86,7 +90,12 @@ vtable-header-line-map
> >    "<follow-link>" 'mouse-face
> >    "<mouse-2>" #'vtable-header-line-sort)
> >
> > -(cl-defun make-vtable (&key columns objects objects-function
> > +(cl-defun make-vtable (&key
> > +                       (name "*vtable*")
> > +                       columns
> > +                       objects
> > +                       objects-function
> > +                       (object-equal #'eq)
> >                         getter
> >                         formatter
> >                         displayer
>
> No need to reformat this.
>

Getting ready for more slots (and I kind of like the format as it's easier
for me to read).

> @@ -113,8 +122,10 @@ make-vtable
> >    (let ((table
> >           (make-instance
> >            'vtable
> > +          :name name
> >            :objects objects
> >            :objects-function objects-function
> > +          :object-equal object-equal
> >            :getter getter
> >            :formatter formatter
> >            :displayer displayer
> > @@ -132,7 +143,8 @@ make-vtable
> >      ;; Auto-generate the columns.
> >      (unless columns
> >        (unless objects
> > -        (error "Can't auto-generate columns; no objects"))
> > +        (error "Can't auto-generate columns; no objects (vtable `%s')"
> > +               (vtable-name table)))
> >        (setq columns (make-list (length (car objects)) "")))
> >      (setf (vtable-columns table)
> >            (mapcar (lambda (column)
> > @@ -251,14 +263,15 @@ vtable-goto-object
> >  Return the position of the object if found, and nil if not."
> >    (let ((start (point)))
> >      (vtable-beginning-of-table)
> > +    (let ((predicate (vtable-object-equal (vtable-current-table))))
> >        (save-restriction
> >          (narrow-to-region (point) (save-excursion
> (vtable-end-of-table)))
> > -      (if (text-property-search-forward 'vtable-object object #'eq)
> > +        (if (text-property-search-forward 'vtable-object object
> predicate)
> >              (progn
> >                (forward-line -1)
> >                (point))
> >            (goto-char start)
> > -        nil))))
> > +          nil)))))
> >
> >  (defun vtable-goto-table (table)
> >    "Go to TABLE in the current buffer.
> > @@ -291,25 +304,32 @@ vtable-update-object
> >    (let* ((objects (vtable-objects table))
> >           (inhibit-read-only t))
> >      ;; First replace the object in the object storage.
> > -    (if (eq old-object (car objects))
> > +    (if (funcall (vtable-object-equal table) 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)))
> > +                  (not (funcall (vtable-object-equal table)
> > +                                (cadr objects) old-object)))
> >          (setq objects (cdr objects)))
> > -      (unless objects
> > -        (error "Can't find the old object"))
> > +      (unless (and objects
> > +                   (funcall (vtable-object-equal table)
> > +                            (cadr objects) old-object))
> > +        (error "Can't find the old object (vtable `%s')"
> > +               (vtable-name table)))
> >        (setcar (cdr objects) object))
> >      ;; Then update the cache...
> >      ;; FIXME: If the table's buffer has no visible window, or if its
> >      ;; width has changed since the table was updated, the cache key wi=
ll
> >      ;; not match and the object can't be updated.  (Bug #69837).
> > -    (if-let* ((line-number (seq-position (car (vtable--cache table))
> old-object
> > -                                         (lambda (a b)
> > -                                           (equal (car a) b))))
> > -              (line (elt (car (vtable--cache table)) line-number)))
> > +    (if-let* ((cache (vtable--ensure-cache table))
> > +              (line-number (seq-position
> > +                            (vtable--cache-lines cache)
> > +                            (assoc old-object
> > +                                   (vtable--cache-lines cache)
> > +                                   (vtable-object-equal table))))
> > +              (line (elt (vtable--cache-lines cache) line-number)))
>
> I think you should either remove the vtable--cache function entirely or
> make vtable--cache do what vtable--ensure-cache does.
>

That's sensible.

Better yet: adopt what I did in bug#69837, which mostly removes the code
> which looks up the cache based on the current window and frame
> attributes.  Such code is not correct anyway, since when modifying part
> of a vtable that already exists, one should use the widths which are
> already in place for that vtable, as I mentioned in my patch there.
>

Backward compatibility is a potential issue with that strategy.  If we do
that, we might as well support a single cache just for the most recently
displayed vtable window.  Lars clearly had a reason to implement the
multi-width cache and I decided to leave it in place (and improve it as
you've seen in the much larger patch) rather than break people's code.  A
cache patch coming after this one.

>          (progn
> >            (setcar line object)
> >            (setcdr line (vtable--compute-cached-line table object))
> > @@ -320,28 +340,46 @@ vtable-update-object
> >                    (start (point)))
> >                (delete-line)
> >                (vtable--insert-line table line line-number
> > -                                   (nth 1 (vtable--cache table))
> > +                                   (vtable--cache-widths cache)
> >                                     (vtable--spacer table))
> >                (add-text-properties start (point) (list 'keymap keymap
> >                                                         'vtable table))=
))
> >            ;; 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"))))
> > +      (error "Can't find cached object (vtable `%s')"
> > +             (vtable-name table)))))
> >
> >  (defun vtable-remove-object (table object)
> >    "Remove OBJECT from TABLE.
> >  This will also remove the displayed line."
> > +  (let ((cache (vtable--ensure-cache table))
> > +        (inhibit-read-only t))
> > +    (unless (seq-contains-p (vtable-objects table)
> > +                            object
> > +                            (vtable-object-equal table))
> > +      (error "Can't find the object to remove (vtable `%s')"
> > +             (vtable-name table)))
> >      ;; First remove from the objects.
> > -  (setf (vtable-objects table) (delq object (vtable-objects table)))
> > +    (setf (vtable-objects table) (seq-remove
> > +                                  (lambda (elt)
> > +                                    (funcall (vtable-object-equal tabl=
e)
> > +                                             elt object))
> > +                                  (vtable-objects table)))
> >      ;; Then adjust the cache and display.
> > -  (let ((cache (vtable--cache table))
> > -        (inhibit-read-only t))
> > -    (setcar cache (delq (assq object (car cache)) (car cache)))
> > +    (if-let* ((old-line (assoc object
> > +                               (vtable--cache-lines cache)
> > +                               (vtable-object-equal table))))
> > +        (progn
> > +          (setcar cache (delq old-line (vtable--cache-lines cache)))
> >            (save-excursion
> >              (vtable-goto-table table)
> >              (when (vtable-goto-object object)
> > -        (delete-line)))))
> > +              (delete-line))))
> > +      ;; At this point, the object was removed from objects, but not
> > +      ;; the cache, which will stale.
> > +      (error "Can't find cached object (vtable `%s')"
> > +             (vtable-name table)))))
>
> So then why not look the object up in both the cache and objects first,
> before modifying either?
>

Also sensible.  Originally, I wanted to keep the structure of the code in
place with minimal changes.  In fact, checking both in advance avoids a
cache bug that was also addressed in the larger patch but it's almost 6 of
1, 1/2 doz of another.


> Also, it seems like maybe vtable-remove-object should not actually be
> using the customizable object equality anyway?
>

If object equality is delegated to whatever the user wants, why would
remove not honor that to locate the object by user equality?

>
> >  ;; FIXME: The fact that the `location' argument of
> >  ;; `vtable-insert-object' can be an integer and is then interpreted as
> > @@ -378,7 +416,16 @@ vtable-insert-object
> >                             (nthcdr location (vtable-objects table))
> >                           ;; Do not prepend if index is too large:
> >                           (setq before nil))
> > -                     (or (memq location (vtable-objects table))
> > +                     (or
> > +                      (let ((loc (vtable-objects table)))
> > +                        (while (and (cdr loc)
> > +                                    (not (funcall (vtable-object-equal
> table)
> > +                                                  (car loc) location))=
)
> > +                          (setq loc (cdr loc)))
> > +                        (if (funcall (vtable-object-equal table)
> > +                                     (car loc) location)
> > +                            loc
> > +                          nil))
>
> I think you probably should introduce a function which searches
> (vtable-objects table) for an existing object using the equality
> function, and use that everywhere; it would make the changes like this
> much simpler.
>

Maybe.  There are other idioms more repetitive than this one that also
could use a bit more love.

>                        ;; Prepend if `location' is not found and
> >                        ;; `before' is non-nil:
> >                        (and before (vtable-objects table))))
> > @@ -400,7 +447,7 @@ vtable-insert-object
> >      ;; Then adjust the cache and display.
> >      (save-excursion
> >        (vtable-goto-table table)
> > -      (let* ((cache (vtable--cache table))
> > +      (let* ((cache (vtable--ensure-cache table))
> >               (inhibit-read-only t)
> >               (keymap (get-text-property (point) 'keymap))
> >               (ellipsis (if (vtable-ellipsis table)
> > @@ -410,11 +457,14 @@ vtable-insert-object
> >               (ellipsis-width (string-pixel-width ellipsis))
> >               (elem (if location  ; This binding mirrors the binding of
> `pos' above.
> >                         (if (integerp location)
> > -                           (nth location (car cache))
> > -                         (or (assq location (car cache))
> > +                           (nth location (vtable--cache-lines cache))
> > +                         (or (assoc
> > +                              location
> > +                              (vtable--cache-lines cache)
> > +                              (vtable-object-equal table))
> >                               (and before (caar cache))))
> >                       (if before (caar cache))))
> > -             (pos (memq elem (car cache)))
> > +             (pos (memq elem (vtable--cache-lines cache)))
> >               (line (cons object (vtable--compute-cached-line table
> object))))
> >          (if (or before
> >                  (and pos (integerp location)))
> > @@ -433,13 +483,14 @@ vtable-insert-object
> >                      (forward-line 1)  ; Insert *after*.
> >                    (vtable-end-of-table)))
> >              ;; Otherwise, append the object.
> > -            (setcar cache (nconc (car cache) (list line)))
> > +            (setcar cache (nconc (vtable--cache-lines cache) (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
> > -                               (nth 1 cache) (vtable--spacer table)
> > +                               (vtable--cache-widths cache)
> > +                               (vtable--spacer table)
> >                                 ellipsis ellipsis-width)
> >            (add-text-properties start (point) (list 'keymap keymap
> >                                                     'vtable table)))
> > @@ -523,7 +574,8 @@ vtable--ensure-cache
> >        (vtable--recompute-cache table)))
> >
> >  (defun vtable-insert (table)
> > -  (let* ((spacer (vtable--spacer table))
> > +  (let* ((cache (vtable--ensure-cache table))
> > +         (spacer (vtable--spacer table))
> >           (start (point))
> >           (ellipsis (if (vtable-ellipsis table)
> >                         (propertize (truncate-string-ellipsis)
> > @@ -533,7 +585,7 @@ vtable-insert
> >           ;; 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).
> > -         (widths (nth 1 (vtable--ensure-cache table))))
> > +         (widths (vtable--cache-widths cache)))
> >      ;; Don't insert any header or header line if the user hasn't
> >      ;; specified the columns.
> >      (when (slot-value table '-has-column-spec)
> > @@ -551,7 +603,7 @@ vtable-insert
> >      (vtable--sort table)
> >      ;; Insert the data.
> >      (let ((line-number 0))
> > -      (dolist (line (car (vtable--cache table)))
> > +      (dolist (line (vtable--cache-lines cache))
> >          (vtable--insert-line table line line-number widths spacer
> >                               ellipsis ellipsis-width)
> >          (setq line-number (1+ line-number))))
> > @@ -667,18 +719,26 @@ vtable--clear-cache
> >
> >  (defun vtable--sort (table)
> >    (pcase-dolist (`(,index . ,direction) (vtable-sort-by table))
> > -    (let ((cache (vtable--cache table))
> > -          (numerical (vtable-column--numerical
> > -                      (elt (vtable-columns table) index)))
> > +    (let* ((cache (vtable--ensure-cache table))
> > +           (column (elt (vtable-columns table) index))
> > +           (numerical (vtable-column--numerical column))
> >             (numcomp (if (eq direction 'descend)
> >                          #'> #'<))
> >             (stringcomp (if (eq direction 'descend)
> > -                          #'string> #'string<)))
> > +                           #'string> #'string<))
> > +           (comparator (vtable-column-comparator column))
> > +           (comparator-func (when comparator
> > +                              (if (eq direction 'descend)
> > +                                  (lambda (v1 v2)
> > +                                    (funcall comparator v2 v1))
> > +                                comparator))))
> >        (setcar cache
> > -              (sort (car cache)
> > +              (sort (vtable--cache-lines cache)
> >                      (lambda (e1 e2)
> >                        (let ((c1 (elt e1 (1+ index)))
> >                              (c2 (elt e2 (1+ index))))
> > +                        (if comparator-func
> > +                            (funcall comparator-func (car c1) (car c2)=
)
> >                            (if numerical
> >                                (funcall numcomp (car c1) (car c2))
> >                              (funcall
> > @@ -688,7 +748,7 @@ vtable--sort
> >                                 (format "%s" (car c1)))
> >                               (if (stringp (car c2))
> >                                   (car c2)
> > -                             (format "%s" (car c2))))))))))))
> > +                               (format "%s" (car c2)))))))))))))
> >
> >  (defun vtable--indicator (table index)
> >    (let ((order (car (last (vtable-sort-by table)))))
> > @@ -860,7 +920,8 @@ vtable--compute-width
> >      (/ (* (string-to-number (match-string 1 spec)) (window-width nil t=
))
> >         100))
> >     (t
> > -    (error "Invalid spec: %s" spec))))
> > +    (error "Invalid spec: %s (vtable `%s')"
> > +           spec (vtable-name table)))))
> >
> >  (defun vtable--compute-widths (table cache)
> >    "Compute the display widths for TABLE.
> > @@ -972,7 +1033,13 @@ vtable-revert
> >        (vtable-goto-column column))))
> >
> >  (defun vtable--widths (table)
> > -  (nth 1 (vtable--ensure-cache table)))
> > +  (vtable--cache-widths (vtable--ensure-cache table)))
> > +
> > +(defun vtable--cache-widths (cache)
> > +  (nth 1 cache))
> > +
> > +(defun vtable--cache-lines (cache)
> > +  (car cache))
> >  ;;; Commands.
> >
> > diff --git a/test/lisp/emacs-lisp/vtable-tests.el
> b/test/lisp/emacs-lisp/vtable-tests.el
> > index 74fb8cc8139..6e3c09e14de 100644
> > --- a/test/lisp/emacs-lisp/vtable-tests.el
> > +++ b/test/lisp/emacs-lisp/vtable-tests.el
> > @@ -27,7 +27,7 @@
> >  (require 'ert)
> >  (require 'ert-x)
> >
> > -(ert-deftest test-vstable-compute-columns ()
> > +(ert-deftest test-vtable-compute-columns ()
> >    (should
> >     (equal (mapcar
> >             (lambda (column)
> > @@ -69,4 +69,108 @@ test-vtable-insert-object
> >                (mapcar #'cadr (vtable-objects table))))
> >            (number-sequence 0 11))))
> >
> > +(ert-deftest test-vtable-update-object ()
> > +  (let ((buffer (get-buffer-create "*vtable-test*")))
> > +    (pop-to-buffer buffer)
> > +    (erase-buffer)
> > +    (let* ((object1 (cons "XXX" 1))
> > +           (object2 (cons "YYY" 2))
> > +           (table
> > +            (make-vtable
> > +             :use-header-line nil
> > +             :object-equal #'eq ; Identity.
> > +             :columns '((:name "XXX"))
> > +             :objects (list object1 object2))))
> > +      (should-error (vtable-update-object table "ZZZ"))
> > +      (setcdr object1 3)
> > +      (vtable-update-object table object1)
> > +      (should (eq 3 (cdr (assoc "XXX" (vtable-objects table))))))))
> > +
> > +(ert-deftest test-vtable-remove-object ()
> > +  (let ((buffer (get-buffer-create "*vtable-test*")))
> > +    (pop-to-buffer buffer)
> > +    (erase-buffer)
> > +    (let* ((object1 (cons "XXX" 1))
> > +           (object2 (cons "YYY" 2))
> > +           (table
> > +            (make-vtable
> > +             :use-header-line nil
> > +             :object-equal #'eq ; Identity.
> > +             :columns '((:name "XXX"))
> > +             :objects (list object1 object2))))
> > +      (should-error (vtable-remove-object table "ZZZ"))
> > +      (vtable-remove-object table object1)
> > +      (should (eq 1 (length (vtable-objects table)))))))
> > +
> > +(ert-deftest test-vtable-object-equal ()
> > +  (let ((buffer (get-buffer-create "*vtable-test*")))
> > +    (pop-to-buffer buffer)
> > +    (erase-buffer)
> > +    (let* ((object1 "XXX")
> > +           (object2 "XXX")
> > +           (table-eq
> > +            (progn
> > +              (goto-char (point-max))
> > +              (make-vtable
> > +               :use-header-line nil
> > +               :columns '((:name "table-eq" :width 20))
> > +               :object-equal #'eq ; Identity.
> > +               :objects (list object1 object2))))
> > +           (table-equal
> > +            (progn
> > +              (goto-char (point-max))
> > +              (make-vtable
> > +               :use-header-line nil
> > +               :columns '((:name "table-equal" :width 20))
> > +               :object-equal #'equal ; Value.
> > +               :objects (list object1 object2)))))
> > +      (should
> > +       (progn
> > +         (vtable-goto-table table-eq)
> > +         (vtable-goto-object object2)
> > +         (equal object2 (get-text-property (point) 'vtable-object))))
> > +      (should-not
> > +       (progn
> > +         (vtable-goto-table table-eq)
> > +         (vtable-goto-object "ZZZ")
> > +         (equal object1 (get-text-property (point) 'vtable-object))))
> > +      (should
> > +       (progn
> > +         (vtable-goto-table table-equal)
> > +         (vtable-goto-object object2)
> > +         (equal object1 (get-text-property (point) 'vtable-object))))
> > +      (should-not
> > +       (progn
> > +         (vtable-goto-table table-equal)
> > +         (vtable-goto-object "ZZZ")
> > +         (equal object1 (get-text-property (point) 'vtable-object)))))=
))
> > +
> > +(ert-deftest test-vtable-column-comparator ()
> > +  (let ((buffer (get-buffer-create "*vtable-test*")))
> > +    (pop-to-buffer buffer)
> > +    (erase-buffer)
> > +    (let ((table
> > +           (make-vtable
> > +            :use-header-line t
> > +            :getter (lambda (object _index _table) object)
> > +            :columns '(( :name "Date"
> > +                         :primary ascend
> > +                         :width 40
> > +                         :formatter (lambda (object)
> > +                                      (let ((time (date-to-time
> object)))
> > +                                        (format "%s (%d)"
> > +                                                (format-time-string
> "%A, %B %d %Y" time)
> > +                                                (car time))))
> > +                         :comparator (lambda (object1 object2)
> > +                                       (let ((time1 (date-to-time
> object1))
> > +                                             (time2 (date-to-time
> object2)))
> > +                                         (< (car time1)
> > +                                            (car time2))))))
> > +            :objects '("Fri, 11 Jul 2025"
> > +                       "Thu, 10 Jul 2025"))))
> > +      (should
> > +       (string=3D
> > +        "Thursday"
> > +        (thing-at-point 'word))))))
> > +
> >  ;;; vtable-tests.el ends here
>
> Thank you very much for adding tests.
>
> Overall this patch looks good, I am in favor of this landing soon (after
> feedback is addressed of course).
>

Thank you for your support.

(One other thing: Could you try to tell your mail client to attach the
> patch in "inline" mode?  This makes the patch somewhat easier to review
> in debbugs.  (This may be easiest if you use Gnus to send the patch,
> perhaps using debbugs-gnu-post-patch))
>

I'm a gmail user, for good or for bad.  I could probably just copy/paste
the patch content into the body of the message, unless there are recipes to
follow that make gmail do what you suggest.  I fear gmail considers body
text fair game to screw with formatting, etc., so attachments seem safest.
I could spend some time making gnus work (I haven't been a gnus user for 25
years) with my gmail account (but I really really don't want to import my
entire gmail account content into gnus just to send a few email messages
with inline patches).  Perhaps you can make your gnus recognize patch
attachments and treat them specially?  As I say, it's been 3 dog
generations since I touched gnus.  Feel free to contact me off line from
this bug report if you have some configuration/guidelines you'd like me to
look at.

--000000000000ac73390639f5e534
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, Jul 14, 2025 at 3: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>
&gt; On Sun, Jul 13, 2025 at 2:16=E2=80=AFPM St=C3=A9phane Marks &lt;<a hre=
f=3D"mailto:shipmints@HIDDEN" target=3D"_blank">shipmints@HIDDEN</a>&=
gt; wrote:<br>
&gt; I&#39;ve updated the broader vtable update in the referenced 78843 bug=
 to check out if interested.<br>
&gt;<br>
&gt; I&#39;ve removed support for the duplicate-object feature.=C2=A0 After=
 careful consideration, it was half baked and I think better for vtable<br>
&gt; programmers to handle their own objects.=C2=A0 I will be sure the docu=
mentation stresses to avoid duplicate objects as vtable&#39;s design is<br>
&gt; predicated on unique objects (or race conditions ensue among duplicate=
 object references).<br>
<br>
Thank you, this was going to be my first bit of feedback.<br>
<br>
Folowup question: What is the motivation for adding customizable object<br>
equality?=C2=A0 Could the need for that be avoided by some changes specific=
<br>
to vtable-update-object?<br></blockquote><div><br></div><div><div class=3D"=
gmail_default" style=3D"font-family:monospace">It&#39;s really a policy que=
stion and future proofing.=C2=A0 I believe Lars originated this idea and pr=
obably has use cases for this in his vtable code.</div><div class=3D"gmail_=
default" style=3D"font-family:monospace"><span style=3D"font-family:Arial,H=
elvetica,sans-serif">=C2=A0</span></div></div><blockquote class=3D"gmail_qu=
ote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,20=
4);padding-left:1ex">
&gt; Attaching the updated patch which is also formatted to avoid mere whit=
espace changes.<br>
<br>
Thanks for this too.<br>
<br>
&gt; From e7bb61becb15e07ebd3e54cf2c1ea2becada09b0 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: Sun, 13 Jul 2025 13:32:28 -0400<br>
&gt; Subject: [PATCH] Improve &#39;vtable&#39; object handling, cache handl=
ing, messages<br>
&gt;<br>
&gt; Add object equality function override (defaults to existing &#39;eq&#3=
9;<br>
&gt; behavior).=C2=A0 Add column comparator to address object<br>
&gt; sorting (defaults to existing behavior).=C2=A0 Correct cache<br>
&gt; references to prime the cache as needed.=C2=A0 Add cache accessor<br>
&gt; functions.=C2=A0 Add table name slot to improve errors and<br>
&gt; messages (defaults to &quot;*vtable*&quot;).<br>
&gt;<br>
&gt; Added tests.<br>
&gt;<br>
&gt; * lisp/emacs-lisp/vtable.el (vtable-column): Add comparator<br>
&gt; slot.<br>
&gt; (vtable): Add name, object-equal slots.<br>
&gt; (make-vtable): Initialize new slots.<br>
&gt; (vtable-goto-object): Use object-equal.<br>
&gt; (vtable-update-object): Use object-equal, use cache accessor,<br>
&gt; improve messages.<br>
&gt; (vtable-remove-object): Use object-equal, prime cache, use cache<br>
&gt; functions, improve messages.<br>
&gt; (vtable-insert-object): Use object-equal, use cache accessor,<br>
&gt; improve messages.<br>
&gt; (vtable-insert): Prime cache, use cache accessor.<br>
&gt; (vtable--sort): Use column comparator, prime cache, use cache<br>
&gt; accessor.<br>
&gt; (vtable--compute-width): Improve message.<br>
&gt; (vtable--widths): Use cache accessor.<br>
&gt;<br>
&gt; * test/lisp/emacs-lisp/vtable-tests.el<br>
&gt; (test-vstable-compute-columns): Renamed to<br>
&gt; test-vtable-compute-columns.<br>
&gt; (test-vtable-insert-object): Changed buffer name to non-hidden.<br>
&gt; (test-vtable-update-object, test-vtable-remove-object)<br>
&gt; (test-vtable-object-equal, test-vtable-column-comparator): New<br>
&gt; test.<br>
&gt; ---<br>
&gt;=C2=A0 lisp/emacs-lisp/vtable.el=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 | 143 ++++++++++++++++++++-------<br>
&gt;=C2=A0 test/lisp/emacs-lisp/vtable-tests.el | 106 +++++++++++++++++++-<=
br>
&gt;=C2=A0 2 files changed, 210 insertions(+), 39 deletions(-)<br>
&gt;<br>
&gt; diff --git a/lisp/emacs-lisp/vtable.el b/lisp/emacs-lisp/vtable.el<br>
&gt; index 00785113edb..31ef73d5eb4 100644<br>
&gt; --- a/lisp/emacs-lisp/vtable.el<br>
&gt; +++ b/lisp/emacs-lisp/vtable.el<br>
&gt; @@ -45,14 +45,18 @@ vtable-column<br>
&gt;=C2=A0 =C2=A0 getter<br>
&gt;=C2=A0 =C2=A0 formatter<br>
&gt;=C2=A0 =C2=A0 displayer<br>
&gt; +=C2=A0 comparator<br>
&gt;=C2=A0 =C2=A0 -numerical<br>
&gt;=C2=A0 =C2=A0 -aligned)<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defclass vtable ()<br>
&gt; -=C2=A0 ((columns :initarg :columns :accessor vtable-columns)<br>
&gt; +=C2=A0 ((name :initarg :name :accessor vtable-name)<br>
&gt; +=C2=A0 =C2=A0(columns :initarg :columns :accessor vtable-columns)<br>
&gt;=C2=A0 =C2=A0 =C2=A0(objects :initarg :objects :accessor vtable-objects=
)<br>
&gt;=C2=A0 =C2=A0 =C2=A0(objects-function :initarg :objects-function<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:accessor vtable-objects-function)<br>
&gt; +=C2=A0 =C2=A0(object-equal :initarg :object-equal<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:access=
or vtable-object-equal)<br>
<br>
(I feel like there&#39;s probably a better name for this but I don&#39;t kn=
ow<br>
what it would be)<br>
<br>
&gt;=C2=A0 =C2=A0 =C2=A0(getter :initarg :getter :accessor vtable-getter)<b=
r>
&gt;=C2=A0 =C2=A0 =C2=A0(formatter :initarg :formatter :accessor vtable-for=
matter)<br>
&gt;=C2=A0 =C2=A0 =C2=A0(displayer :initarg :displayer :accessor vtable-dis=
player)<br>
&gt; @@ -86,7 +90,12 @@ vtable-header-line-map<br>
&gt;=C2=A0 =C2=A0 &quot;&lt;follow-link&gt;&quot; &#39;mouse-face<br>
&gt;=C2=A0 =C2=A0 &quot;&lt;mouse-2&gt;&quot; #&#39;vtable-header-line-sort=
)<br>
&gt;=C2=A0 <br>
&gt; -(cl-defun make-vtable (&amp;key columns objects objects-function<br>
&gt; +(cl-defun make-vtable (&amp;key<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(name &quot;*vtable*&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=A0columns<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=A0objects<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=A0objects-function<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(object-equal #&#39;eq)<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=A0getter<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=A0formatter<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=A0displayer<br>
<br>
No need to reformat this.<br></blockquote><div><br></div><div class=3D"gmai=
l_default" style=3D"font-family:monospace">Getting ready for more slots (an=
d I kind of like the format as it&#39;s easier for me to read).</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; @@ -113,8 +122,10 @@ make-vtable<br>
&gt;=C2=A0 =C2=A0 (let ((table<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(make-instance<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &#39;vtable<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :name name<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :objects objects<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :objects-function objects-fun=
ction<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :object-equal object-equal<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :getter getter<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :formatter formatter<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :displayer displayer<br>
&gt; @@ -132,7 +143,8 @@ make-vtable<br>
&gt;=C2=A0 =C2=A0 =C2=A0 ;; Auto-generate the columns.<br>
&gt;=C2=A0 =C2=A0 =C2=A0 (unless columns<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (unless objects<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (error &quot;Can&#39;t auto-generate colu=
mns; no objects&quot;))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (error &quot;Can&#39;t auto-generate colu=
mns; no objects (vtable `%s&#39;)&quot;<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-name t=
able)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq columns (make-list (length (car objec=
ts)) &quot;&quot;)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 (setf (vtable-columns table)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (mapcar (lambda (column)<br>
&gt; @@ -251,14 +263,15 @@ vtable-goto-object<br>
&gt;=C2=A0 Return the position of the object if found, and nil if not.&quot=
;<br>
&gt;=C2=A0 =C2=A0 (let ((start (point)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 (vtable-beginning-of-table)<br>
&gt; +=C2=A0 =C2=A0 (let ((predicate (vtable-object-equal (vtable-current-t=
able))))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (save-restriction<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (narrow-to-region (point) (save-excu=
rsion (vtable-end-of-table)))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (if (text-property-search-forward &#39;vtable-ob=
ject object #&#39;eq)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (if (text-property-search-forward &#39;vt=
able-object object predicate)<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 (forward-line -=
1)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (point))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (goto-char start)<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 nil))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 nil)))))<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defun vtable-goto-table (table)<br>
&gt;=C2=A0 =C2=A0 &quot;Go to TABLE in the current buffer.<br>
&gt; @@ -291,25 +304,32 @@ vtable-update-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 storage.=
<br>
&gt; -=C2=A0 =C2=A0 (if (eq old-object (car objects))<br>
&gt; +=C2=A0 =C2=A0 (if (funcall (vtable-object-equal table) old-object (ca=
r objects))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; It&#39;s at the head, so replace =
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 (c=
dr 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 (not (=
eq (cadr objects) old-object)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (not (=
funcall (vtable-object-equal 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 (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 (unless 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 (unless (and objects<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
(funcall (vtable-object-equal 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 (cadr objects) old-object))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (error &quot;Can&#39;t find the old objec=
t (vtable `%s&#39;)&quot;<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-name t=
able)))<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 cache...<br>
&gt;=C2=A0 =C2=A0 =C2=A0 ;; FIXME: If the table&#39;s buffer has no visible=
 window, or if its<br>
&gt;=C2=A0 =C2=A0 =C2=A0 ;; width has changed since the table was updated, =
the cache key will<br>
&gt;=C2=A0 =C2=A0 =C2=A0 ;; not match and the object can&#39;t be updated.=
=C2=A0 (Bug #69837).<br>
&gt; -=C2=A0 =C2=A0 (if-let* ((line-number (seq-position (car (vtable--cach=
e table)) 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 =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(equal (car a) b))))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (line (elt (car (vta=
ble--cache table)) line-number)))<br>
&gt; +=C2=A0 =C2=A0 (if-let* ((cache (vtable--ensure-cache table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (line-number (seq-po=
sition<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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (assoc 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(vtable--cache-line=
s 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-object-equa=
l table))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (line (elt (vtable--=
cache-lines cache) line-number)))<br>
<br>
I think you should either remove the vtable--cache function entirely or<br>
make vtable--cache do what vtable--ensure-cache does.<br></blockquote><div>=
<br></div><div><div class=3D"gmail_default" style=3D"font-family:monospace"=
>That&#39;s sensible.</div></div><div><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">
Better yet: adopt what I did in bug#69837, which mostly removes the code<br=
>
which looks up the cache based on the current window and frame<br>
attributes.=C2=A0 Such code is not correct anyway, since when modifying par=
t<br>
of a vtable that already exists, one should use the widths which are<br>
already in place for that vtable, as I mentioned in my patch there.<br></bl=
ockquote><div><br></div><div><div class=3D"gmail_default" style=3D"font-fam=
ily:monospace">Backward compatibility is a potential issue with that strate=
gy.=C2=A0 If we do that, we might as well support a single cache just for t=
he most recently displayed vtable window.=C2=A0 Lars clearly had a reason t=
o implement the multi-width cache and I decided to leave it in place (and i=
mprove it as you&#39;ve seen in the much larger patch) rather than break pe=
ople&#39;s code.=C2=A0 A cache patch coming after this one.</div></div><div=
 class=3D"gmail_default" style=3D"font-family:monospace"><br></div><blockqu=
ote 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 (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--compute=
-cached-line table object))<br>
&gt; @@ -320,28 +340,46 @@ vtable-update-object<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)<b=
r>
&gt;=C2=A0 =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(nth 1 (vtable--cac=
he 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(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 =C2=A0(vtable--spac=
er table))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (add-text-prope=
rties 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 ;; We may have inserted a non=
-numerical value into a previously<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; all-numerical table, so re=
compute.<br>
&gt;=C2=A0 =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 =C2=A0 =C2=A0 (error &quot;Can&#39;t find cached object (vtabl=
e `%s&#39;)&quot;<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-name table)))=
))<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 (let ((cache (vtable--ensure-cache table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (inhibit-read-only t))<br>
&gt; +=C2=A0 =C2=A0 (unless (seq-contains-p (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 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 (vtable-object-equal table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (error &quot;Can&#39;t find the object to remove=
 (vtable `%s&#39;)&quot;<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-name table)))=
<br>
&gt;=C2=A0 =C2=A0 =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 =C2=A0 (setf (vtable-objects table) (seq-remove<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 (lambda (elt)<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 (funcall (vtable-o=
bject-equal 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=A0elt 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 (vtable-objects table)))<=
br>
&gt;=C2=A0 =C2=A0 =C2=A0 ;; Then adjust the cache and display.<br>
&gt; -=C2=A0 (let ((cache (vtable--cache table))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 (inhibit-read-only t))<br>
&gt; -=C2=A0 =C2=A0 (setcar cache (delq (assq object (car cache)) (car cach=
e)))<br>
&gt; +=C2=A0 =C2=A0 (if-let* ((old-line (assoc 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(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(vtable-object-equal table))))<br=
>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (progn<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar cache (delq old-line (vtab=
le--cache-lines cache)))<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-table tab=
le)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (when (vtable-goto-obj=
ect object)<br>
&gt; -=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 (delete-line))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 ;; At this point, the object was removed from ob=
jects, but not<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 ;; the cache, which will stale.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (error &quot;Can&#39;t find cached object (vtabl=
e `%s&#39;)&quot;<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-name table)))=
))<br>
<br>
So then why not look the object up in both the cache and objects first,<br>
before modifying either?<br></blockquote><div><br></div><div><div class=3D"=
gmail_default" style=3D"font-family:monospace">Also sensible.=C2=A0 Origina=
lly, I wanted to keep the structure of the code in place with minimal chang=
es.=C2=A0 In fact, checking both in advance avoids a cache bug that was als=
o addressed in the larger patch but it&#39;s almost 6 of 1, 1/2 doz of anot=
her.</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-le=
ft:1ex">
Also, it seems like maybe vtable-remove-object should not actually be<br>
using the customizable object equality anyway?<br></blockquote><div><br></d=
iv><div class=3D"gmail_default" style=3D"font-family:monospace">If object e=
quality is delegated to whatever the=C2=A0user wants, why would remove=C2=
=A0not honor that to=C2=A0locate the object by user equality?</div><div cla=
ss=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 sol=
id rgb(204,204,204);padding-left:1ex">
&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; @@ -378,7 +416,16 @@ vtable-insert-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(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(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(or<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 (let ((loc (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 (while (and (cdr loc)<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 (not (funcall (vta=
ble-object-equal 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 (car loc) 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 (setq loc (cdr loc)))<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 (funcall (vtable-object-equal 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(car loc) lo=
cation)<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 loc<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 nil))<br>
<br>
I think you probably should introduce a function which searches<br>
(vtable-objects table) for an existing object using the equality<br>
function, and use that everywhere; it would make the changes like this<br>
much simpler.<br></blockquote><div><br></div><div class=3D"gmail_default" s=
tyle=3D"font-family:monospace">Maybe.=C2=A0 There are other idioms more rep=
etitive than this one that also could use a bit more love.</div><div class=
=3D"gmail_default" style=3D"font-family:monospace"><br></div><blockquote cl=
ass=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 =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 ;; `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 (and before (vtable-objects table))))<br>
&gt; @@ -400,7 +447,7 @@ vtable-insert-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 (let* ((cache (vtable--cache table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (let* ((cache (vtable--ensure-cache table))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(inhibit-read-on=
ly t)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(keymap (get-tex=
t-property (point) &#39;keymap))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(ellipsis (if (v=
table-ellipsis table)<br>
&gt; @@ -410,11 +457,14 @@ vtable-insert-object<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =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 =C2=A0 =C2=A0 =C2=A0(elem (if locati=
on=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(nth location (car 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(or (assq location (car 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(nth location (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(or (assoc<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 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 (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 (vtable-object-equal 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(and before (caar 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(if before (caar cache))))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(pos (memq elem (car =
cache)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(pos (memq elem (vtab=
le--cache-lines cache)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(line (cons obje=
ct (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 pos=
 (integerp location)))<br>
&gt; @@ -433,13 +483,14 @@ vtable-insert-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 (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 t=
he object.<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar cache (nconc (car c=
ache) (list line)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar cache (nconc (vtabl=
e--cache-lines cache) (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 c=
olors 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 li=
ne 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(nth 1 cache) (vtable--spacer tab=
le)<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)<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--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)<br=
>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (add-text-properties start (p=
oint) (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; @@ -523,7 +574,8 @@ vtable--ensure-cache<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable--recompute-cache table)))<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defun vtable-insert (table)<br>
&gt; -=C2=A0 (let* ((spacer (vtable--spacer table))<br>
&gt; +=C2=A0 (let* ((cache (vtable--ensure-cache table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(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; @@ -533,7 +585,7 @@ vtable-insert<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; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(widths (nth 1 (vtable--ensure-cach=
e table))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(widths (vtable--cache-widths cache=
)))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 ;; Don&#39;t insert any header or header line if t=
he user hasn&#39;t<br>
&gt;=C2=A0 =C2=A0 =C2=A0 ;; specified the columns.<br>
&gt;=C2=A0 =C2=A0 =C2=A0 (when (slot-value table &#39;-has-column-spec)<br>
&gt; @@ -551,7 +603,7 @@ vtable-insert<br>
&gt;=C2=A0 =C2=A0 =C2=A0 (vtable--sort table)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 ;; Insert the data.<br>
&gt;=C2=A0 =C2=A0 =C2=A0 (let ((line-number 0))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 (dolist (line (car (vtable--cache table)))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (dolist (line (vtable--cache-lines cache))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (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=A0ellipsis ellipsis-width)<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq line-number (1+ line-number)))=
)<br>
&gt; @@ -667,18 +719,26 @@ vtable--clear-cache<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defun vtable--sort (table)<br>
&gt;=C2=A0 =C2=A0 (pcase-dolist (`(,index . ,direction) (vtable-sort-by tab=
le))<br>
&gt; -=C2=A0 =C2=A0 (let ((cache (vtable--cache table))<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (numerical (vtable-column--numeric=
al<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 (elt (vtable-columns table) index)))<br>
&gt; +=C2=A0 =C2=A0 (let* ((cache (vtable--ensure-cache table))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(column (elt (vtable-columns=
 table) index))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(numerical (vtable-column--n=
umerical column))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(numcomp (if (eq direct=
ion &#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 #&#39;&gt; #&#39;&lt;))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(stringcomp (if (eq dir=
ection &#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 #&#39;string&gt; #&#39;string&lt;)))<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;string&gt; #&#39;string&lt;))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(comparator (vtable-column-c=
omparator column))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(comparator-func (when compa=
rator<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 (if (eq direction &#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 (lambda (v1 v2)<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 (funcall comparato=
r v2 v1))<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 comparator))))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setcar cache<br>
&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (sort (car cache)<br=
>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (sort (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 (lambda (e1 e2)<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 (let ((c1 (elt e1 (1+ 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 (elt e2 (1+ 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 (if comparator-func<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 (funcall comparator-func (car c1) (car c2))<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 (if numerical<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 (funcall numcomp (car c1) (car c2=
))<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 (funcall<br>
&gt; @@ -688,7 +748,7 @@ vtable--sort<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(format &quot;%s&quot; (car=
 c1)))<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(if (stringp (car c2))<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(car c2)<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(format &quot;%s&quot; (car c2))))))))))=
))<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(format &quot;%s&quot; (car c2)))=
))))))))))<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defun vtable--indicator (table index)<br>
&gt;=C2=A0 =C2=A0 (let ((order (car (last (vtable-sort-by table)))))<br>
&gt; @@ -860,7 +920,8 @@ vtable--compute-width<br>
&gt;=C2=A0 =C2=A0 =C2=A0 (/ (* (string-to-number (match-string 1 spec)) (wi=
ndow-width nil t))<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0100))<br>
&gt;=C2=A0 =C2=A0 =C2=A0(t<br>
&gt; -=C2=A0 =C2=A0 (error &quot;Invalid spec: %s&quot; spec))))<br>
&gt; +=C2=A0 =C2=A0 (error &quot;Invalid spec: %s (vtable `%s&#39;)&quot;<b=
r>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0spec (vtable-name table)))))=
<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defun vtable--compute-widths (table cache)<br>
&gt;=C2=A0 =C2=A0 &quot;Compute the display widths for TABLE.<br>
&gt; @@ -972,7 +1033,13 @@ vtable-revert<br>
&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 (vtable-goto-column column))))<br>
&gt;=C2=A0 <br>
&gt;=C2=A0 (defun vtable--widths (table)<br>
&gt; -=C2=A0 (nth 1 (vtable--ensure-cache table)))<br>
&gt; +=C2=A0 (vtable--cache-widths (vtable--ensure-cache table)))<br>
&gt; +<br>
&gt; +(defun vtable--cache-widths (cache)<br>
&gt; +=C2=A0 (nth 1 cache))<br>
&gt; +<br>
&gt; +(defun vtable--cache-lines (cache)<br>
&gt; +=C2=A0 (car cache))<br>
&gt;=C2=A0 ;;; Commands.<br>
&gt;=C2=A0 <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..6e3c09e14de 100644<br>
&gt; --- a/test/lisp/emacs-lisp/vtable-tests.el<br>
&gt; +++ b/test/lisp/emacs-lisp/vtable-tests.el<br>
&gt; @@ -27,7 +27,7 @@<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; +(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; @@ -69,4 +69,108 @@ 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-update-object ()<br>
&gt; +=C2=A0 (let ((buffer (get-buffer-create &quot;*vtable-test*&quot;)))<=
br>
&gt; +=C2=A0 =C2=A0 (pop-to-buffer buffer)<br>
&gt; +=C2=A0 =C2=A0 (erase-buffer)<br>
&gt; +=C2=A0 =C2=A0 (let* ((object1 (cons &quot;XXX&quot; 1))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(object2 (cons &quot;YYY&quo=
t; 2))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(table<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (make-vtable<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:use-header-line nil<=
br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:object-equal #&#39;e=
q ; Identity.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:columns &#39;((:name=
 &quot;XXX&quot;))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:objects (list object=
1 object2))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should-error (vtable-update-object table &quot;=
ZZZ&quot;))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (setcdr object1 3)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (vtable-update-object table object1)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should (eq 3 (cdr (assoc &quot;XXX&quot; (vtabl=
e-objects table))))))))<br>
&gt; +<br>
&gt; +(ert-deftest test-vtable-remove-object ()<br>
&gt; +=C2=A0 (let ((buffer (get-buffer-create &quot;*vtable-test*&quot;)))<=
br>
&gt; +=C2=A0 =C2=A0 (pop-to-buffer buffer)<br>
&gt; +=C2=A0 =C2=A0 (erase-buffer)<br>
&gt; +=C2=A0 =C2=A0 (let* ((object1 (cons &quot;XXX&quot; 1))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(object2 (cons &quot;YYY&quo=
t; 2))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(table<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (make-vtable<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:use-header-line nil<=
br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:object-equal #&#39;e=
q ; Identity.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:columns &#39;((:name=
 &quot;XXX&quot;))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:objects (list object=
1 object2))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should-error (vtable-remove-object table &quot;=
ZZZ&quot;))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (vtable-remove-object table object1)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should (eq 1 (length (vtable-objects table)))))=
))<br>
&gt; +<br>
&gt; +(ert-deftest test-vtable-object-equal ()<br>
&gt; +=C2=A0 (let ((buffer (get-buffer-create &quot;*vtable-test*&quot;)))<=
br>
&gt; +=C2=A0 =C2=A0 (pop-to-buffer buffer)<br>
&gt; +=C2=A0 =C2=A0 (erase-buffer)<br>
&gt; +=C2=A0 =C2=A0 (let* ((object1 &quot;XXX&quot;)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(object2 &quot;XXX&quot;)<br=
>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(table-eq<br>
&gt; +=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 (goto-char (point-ma=
x))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (make-vtable<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:use-header-li=
ne nil<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:columns &#39;=
((:name &quot;table-eq&quot; :width 20))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:object-equal =
#&#39;eq ; Identity.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:objects (list=
 object1 object2))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(table-equal<br>
&gt; +=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 (goto-char (point-ma=
x))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (make-vtable<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:use-header-li=
ne nil<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:columns &#39;=
((:name &quot;table-equal&quot; :width 20))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:object-equal =
#&#39;equal ; Value.<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0:objects (list=
 object1 object2)))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0(progn<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-table table-eq)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-object object2)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(equal object2 (get-text-property (=
point) &#39;vtable-object))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should-not<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0(progn<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-table table-eq)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-object &quot;ZZZ&quot;=
)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(equal object1 (get-text-property (=
point) &#39;vtable-object))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0(progn<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-table table-equal)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-object object2)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(equal object1 (get-text-property (=
point) &#39;vtable-object))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should-not<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0(progn<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-table table-equal)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(vtable-goto-object &quot;ZZZ&quot;=
)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(equal object1 (get-text-property (=
point) &#39;vtable-object)))))))<br>
&gt; +<br>
&gt; +(ert-deftest test-vtable-column-comparator ()<br>
&gt; +=C2=A0 (let ((buffer (get-buffer-create &quot;*vtable-test*&quot;)))<=
br>
&gt; +=C2=A0 =C2=A0 (pop-to-buffer buffer)<br>
&gt; +=C2=A0 =C2=A0 (erase-buffer)<br>
&gt; +=C2=A0 =C2=A0 (let ((table<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(make-vtable<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :use-header-line t<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :getter (lambda (object _in=
dex _table) object)<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :columns &#39;(( :name &quo=
t;Date&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:primary 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:width 40<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:formatter (lambda (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 (let ((time=
 (date-to-time 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 (for=
mat &quot;%s (%d)&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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 (format-time-string &quot;%A, %B %d %Y&quot; time)=
<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 (car time))))<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:comparator (lambda (object1 object2)<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(let =
((time1 (date-to-time object1))<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(time2 (date-to-time object2)))<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(&lt; (car time1)<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 (car time2))))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 :objects &#39;(&quot;Fri, 1=
1 Jul 2025&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&quot;Thu, 10 Jul 2025&quot;))))<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 (should<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0(string=3D<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 &quot;Thursday&quot;<br>
&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (thing-at-point &#39;word))))))<br>
&gt; +<br>
&gt;=C2=A0 ;;; vtable-tests.el ends here<br>
<br>
Thank you very much for adding tests.<br>
<br>
Overall this patch looks good, I am in favor of this landing soon (after<br=
>
feedback is addressed of course).<br></blockquote><div><br></div><div class=
=3D"gmail_default" style=3D"font-family:monospace">Thank you for your suppo=
rt.</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;bo=
rder-left:1px solid rgb(204,204,204);padding-left:1ex">
(One other thing: Could you try to tell your mail client to attach the<br>
patch in &quot;inline&quot; mode?=C2=A0 This makes the patch somewhat easie=
r to review<br>
in debbugs.=C2=A0 (This may be easiest if you use Gnus to send the patch,<b=
r>
perhaps using debbugs-gnu-post-patch))<br></blockquote><div><br></div><div =
class=3D"gmail_default" style=3D"font-family:monospace">I&#39;m a gmail use=
r, for good or for bad.=C2=A0 I could probably just copy/paste the patch co=
ntent into the body of the message, unless there are recipes to follow that=
 make gmail do what you suggest.=C2=A0 I fear gmail considers body text fai=
r game to screw with formatting, etc., so attachments seem safest.=C2=A0 I =
could spend some time making gnus work (I haven&#39;t been a gnus user for =
25 years) with my gmail account (but I really really don&#39;t want to impo=
rt my entire gmail account content into gnus just to send a few email messa=
ges with inline patches).=C2=A0 Perhaps you can make your gnus recognize pa=
tch attachments and treat them specially?=C2=A0 As I say, it&#39;s been 3 d=
og generations since I touched gnus.=C2=A0 Feel free to contact me off line=
 from this bug report if you have some configuration/guidelines you&#39;d l=
ike me to look at.</div></div></div>

--000000000000ac73390639f5e534--




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

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


Received: (at 79009) by debbugs.gnu.org; 14 Jul 2025 19:54:54 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Jul 14 15:54:53 2025
Received: from localhost ([127.0.0.1]:36677 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ubPGG-0004YF-4l
	for submit <at> debbugs.gnu.org; Mon, 14 Jul 2025 15:54:53 -0400
Received: from mxout5.mail.janestreet.com ([64.215.233.18]:56409)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <sbaugh@HIDDEN>)
 id 1ubPGC-0004XU-HU
 for 79009 <at> debbugs.gnu.org; Mon, 14 Jul 2025 15:54:49 -0400
From: Spencer Baugh <sbaugh@HIDDEN>
To: =?utf-8?Q?St=C3=A9phane?= Marks <shipmints@HIDDEN>
Subject: Re: bug#79009: [PATCH] Improve 'vtable' object handling, cache
 handling, messages, [PATCH] Improve 'vtable' object handling, cache
 handling, messages
In-Reply-To: <CAN+1HbpNcK=FdiarDBcB4NyOouAeNV2wTrA7x4asHUAEopBqHQ@HIDDEN>
 (=?utf-8?Q?=22St=C3=A9phane?= Marks"'s message of "Mon, 14 Jul 2025
 15:14:37 -0400")
References: <CAN+1HbrLkmV6QYfJPcEv-EeX6T1tiNogG41GkCw8aMxdt4GmkA@HIDDEN>
 <CAN+1HbpNcK=FdiarDBcB4NyOouAeNV2wTrA7x4asHUAEopBqHQ@HIDDEN>
Date: Mon, 14 Jul 2025 15:54:42 -0400
Message-ID: <ierqzyi35vh.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=1752522882;
 bh=8FdRzguCVljxFV3OHyHbyNoNMun8aMQ8p4fh2FiGi80=;
 h=From:To:Cc:Subject:In-Reply-To:References:Date;
 b=oTPcIWecs4IXqWSS/8X9uFjQkcNk8MbA6gy2ECSMi2iL2kJE7rsRu7u4ngEq50zTP
 oPbqon7lC+la+9sBSopqubQQUwS01AeRdV6HoEGXF6jcrym1TldElbsNvnjaJiPFPt
 eKaazAjK6fd56thc6bzuEK2CDTdSFL5LQZhCrPF+ytLhBXqSBds/FruONzAJFw0P3e
 vFpqjaEiUhOxrNB+i+lKVq5pG/qfJ+rU0axrV7N6DNWoJaY25nH6ElnpCL54cbt2GH
 v8ZIpelX2gpUdngQ6d0jjnYeOIyVboUvET17a2so/w80IrhosMYb+w8xIfDcP9c+gI
 wHQsL9QdWWUfg==
X-Spam-Score: -2.3 (--)
X-Debbugs-Envelope-To: 79009
Cc: Kristoffer Balintona <krisbalintona@HIDDEN>,
 Joost Kremers <joostkremers@HIDDEN>, 79009 <at> debbugs.gnu.org,
 Visuwesh <visuweshm@HIDDEN>, Adam Porter <adam@HIDDEN>,
 Lars Ingebrigtsen <larsi@HIDDEN>, Augusto Stoffel <arstoffel@HIDDEN>,
 ijqq@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 (---)

St=C3=A9phane Marks <shipmints@HIDDEN> writes:
> On Sun, Jul 13, 2025 at 2:16=E2=80=AFPM St=C3=A9phane Marks <shipmints@gm=
ail.com> wrote:
> I've updated the broader vtable update in the referenced 78843 bug to che=
ck out if interested.
>
> I've removed support for the duplicate-object feature.  After careful con=
sideration, it was half baked and I think better for vtable
> programmers to handle their own objects.  I will be sure the documentatio=
n stresses to avoid duplicate objects as vtable's design is
> predicated on unique objects (or race conditions ensue among duplicate ob=
ject references).

Thank you, this was going to be my first bit of feedback.

Folowup question: What is the motivation for adding customizable object
equality?  Could the need for that be avoided by some changes specific
to vtable-update-object?

> Attaching the updated patch which is also formatted to avoid mere whitesp=
ace changes.

Thanks for this too.

> From e7bb61becb15e07ebd3e54cf2c1ea2becada09b0 Mon Sep 17 00:00:00 2001
> From: =3D?UTF-8?q?St=3DC3=3DA9phane=3D20Marks?=3D <shipmints@HIDDEN>
> Date: Sun, 13 Jul 2025 13:32:28 -0400
> Subject: [PATCH] Improve 'vtable' object handling, cache handling, messag=
es
>
> Add object equality function override (defaults to existing 'eq'
> behavior).  Add column comparator to address object
> sorting (defaults to existing behavior).  Correct cache
> references to prime the cache as needed.  Add cache accessor
> functions.  Add table name slot to improve errors and
> messages (defaults to "*vtable*").
>
> Added tests.
>
> * lisp/emacs-lisp/vtable.el (vtable-column): Add comparator
> slot.
> (vtable): Add name, object-equal slots.
> (make-vtable): Initialize new slots.
> (vtable-goto-object): Use object-equal.
> (vtable-update-object): Use object-equal, use cache accessor,
> improve messages.
> (vtable-remove-object): Use object-equal, prime cache, use cache
> functions, improve messages.
> (vtable-insert-object): Use object-equal, use cache accessor,
> improve messages.
> (vtable-insert): Prime cache, use cache accessor.
> (vtable--sort): Use column comparator, prime cache, use cache
> accessor.
> (vtable--compute-width): Improve message.
> (vtable--widths): Use cache accessor.
>
> * test/lisp/emacs-lisp/vtable-tests.el
> (test-vstable-compute-columns): Renamed to
> test-vtable-compute-columns.
> (test-vtable-insert-object): Changed buffer name to non-hidden.
> (test-vtable-update-object, test-vtable-remove-object)
> (test-vtable-object-equal, test-vtable-column-comparator): New
> test.
> ---
>  lisp/emacs-lisp/vtable.el            | 143 ++++++++++++++++++++-------
>  test/lisp/emacs-lisp/vtable-tests.el | 106 +++++++++++++++++++-
>  2 files changed, 210 insertions(+), 39 deletions(-)
>
> diff --git a/lisp/emacs-lisp/vtable.el b/lisp/emacs-lisp/vtable.el
> index 00785113edb..31ef73d5eb4 100644
> --- a/lisp/emacs-lisp/vtable.el
> +++ b/lisp/emacs-lisp/vtable.el
> @@ -45,14 +45,18 @@ vtable-column
>    getter
>    formatter
>    displayer
> +  comparator
>    -numerical
>    -aligned)
>=20=20
>  (defclass vtable ()
> -  ((columns :initarg :columns :accessor vtable-columns)
> +  ((name :initarg :name :accessor vtable-name)
> +   (columns :initarg :columns :accessor vtable-columns)
>     (objects :initarg :objects :accessor vtable-objects)
>     (objects-function :initarg :objects-function
>                       :accessor vtable-objects-function)
> +   (object-equal :initarg :object-equal
> +                 :accessor vtable-object-equal)

(I feel like there's probably a better name for this but I don't know
what it would be)

>     (getter :initarg :getter :accessor vtable-getter)
>     (formatter :initarg :formatter :accessor vtable-formatter)
>     (displayer :initarg :displayer :accessor vtable-displayer)
> @@ -86,7 +90,12 @@ vtable-header-line-map
>    "<follow-link>" 'mouse-face
>    "<mouse-2>" #'vtable-header-line-sort)
>=20=20
> -(cl-defun make-vtable (&key columns objects objects-function
> +(cl-defun make-vtable (&key
> +                       (name "*vtable*")
> +                       columns
> +                       objects
> +                       objects-function
> +                       (object-equal #'eq)
>                         getter
>                         formatter
>                         displayer

No need to reformat this.

> @@ -113,8 +122,10 @@ make-vtable
>    (let ((table
>           (make-instance
>            'vtable
> +          :name name
>            :objects objects
>            :objects-function objects-function
> +          :object-equal object-equal
>            :getter getter
>            :formatter formatter
>            :displayer displayer
> @@ -132,7 +143,8 @@ make-vtable
>      ;; Auto-generate the columns.
>      (unless columns
>        (unless objects
> -        (error "Can't auto-generate columns; no objects"))
> +        (error "Can't auto-generate columns; no objects (vtable `%s')"
> +               (vtable-name table)))
>        (setq columns (make-list (length (car objects)) "")))
>      (setf (vtable-columns table)
>            (mapcar (lambda (column)
> @@ -251,14 +263,15 @@ vtable-goto-object
>  Return the position of the object if found, and nil if not."
>    (let ((start (point)))
>      (vtable-beginning-of-table)
> +    (let ((predicate (vtable-object-equal (vtable-current-table))))
>        (save-restriction
>          (narrow-to-region (point) (save-excursion (vtable-end-of-table)))
> -      (if (text-property-search-forward 'vtable-object object #'eq)
> +        (if (text-property-search-forward 'vtable-object object predicat=
e)
>              (progn
>                (forward-line -1)
>                (point))
>            (goto-char start)
> -        nil))))
> +          nil)))))
>=20=20
>  (defun vtable-goto-table (table)
>    "Go to TABLE in the current buffer.
> @@ -291,25 +304,32 @@ vtable-update-object
>    (let* ((objects (vtable-objects table))
>           (inhibit-read-only t))
>      ;; First replace the object in the object storage.
> -    (if (eq old-object (car objects))
> +    (if (funcall (vtable-object-equal table) 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)))
> +                  (not (funcall (vtable-object-equal table)
> +                                (cadr objects) old-object)))
>          (setq objects (cdr objects)))
> -      (unless objects
> -        (error "Can't find the old object"))
> +      (unless (and objects
> +                   (funcall (vtable-object-equal table)
> +                            (cadr objects) old-object))
> +        (error "Can't find the old object (vtable `%s')"
> +               (vtable-name table)))
>        (setcar (cdr objects) object))
>      ;; Then update the cache...
>      ;; FIXME: If the table's buffer has no visible window, or if its
>      ;; width has changed since the table was updated, the cache key will
>      ;; not match and the object can't be updated.  (Bug #69837).
> -    (if-let* ((line-number (seq-position (car (vtable--cache table)) old=
-object
> -                                         (lambda (a b)
> -                                           (equal (car a) b))))
> -              (line (elt (car (vtable--cache table)) line-number)))
> +    (if-let* ((cache (vtable--ensure-cache table))
> +              (line-number (seq-position
> +                            (vtable--cache-lines cache)
> +                            (assoc old-object
> +                                   (vtable--cache-lines cache)
> +                                   (vtable-object-equal table))))
> +              (line (elt (vtable--cache-lines cache) line-number)))

I think you should either remove the vtable--cache function entirely or
make vtable--cache do what vtable--ensure-cache does.

Better yet: adopt what I did in bug#69837, which mostly removes the code
which looks up the cache based on the current window and frame
attributes.  Such code is not correct anyway, since when modifying part
of a vtable that already exists, one should use the widths which are
already in place for that vtable, as I mentioned in my patch there.

>          (progn
>            (setcar line object)
>            (setcdr line (vtable--compute-cached-line table object))
> @@ -320,28 +340,46 @@ vtable-update-object
>                    (start (point)))
>                (delete-line)
>                (vtable--insert-line table line line-number
> -                                   (nth 1 (vtable--cache table))
> +                                   (vtable--cache-widths cache)
>                                     (vtable--spacer table))
>                (add-text-properties start (point) (list 'keymap keymap
>                                                         'vtable table))))
>            ;; 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"))))
> +      (error "Can't find cached object (vtable `%s')"
> +             (vtable-name table)))))
>=20=20
>  (defun vtable-remove-object (table object)
>    "Remove OBJECT from TABLE.
>  This will also remove the displayed line."
> +  (let ((cache (vtable--ensure-cache table))
> +        (inhibit-read-only t))
> +    (unless (seq-contains-p (vtable-objects table)
> +                            object
> +                            (vtable-object-equal table))
> +      (error "Can't find the object to remove (vtable `%s')"
> +             (vtable-name table)))
>      ;; First remove from the objects.
> -  (setf (vtable-objects table) (delq object (vtable-objects table)))
> +    (setf (vtable-objects table) (seq-remove
> +                                  (lambda (elt)
> +                                    (funcall (vtable-object-equal table)
> +                                             elt object))
> +                                  (vtable-objects table)))
>      ;; Then adjust the cache and display.
> -  (let ((cache (vtable--cache table))
> -        (inhibit-read-only t))
> -    (setcar cache (delq (assq object (car cache)) (car cache)))
> +    (if-let* ((old-line (assoc object
> +                               (vtable--cache-lines cache)
> +                               (vtable-object-equal table))))
> +        (progn
> +          (setcar cache (delq old-line (vtable--cache-lines cache)))
>            (save-excursion
>              (vtable-goto-table table)
>              (when (vtable-goto-object object)
> -        (delete-line)))))
> +              (delete-line))))
> +      ;; At this point, the object was removed from objects, but not
> +      ;; the cache, which will stale.
> +      (error "Can't find cached object (vtable `%s')"
> +             (vtable-name table)))))

So then why not look the object up in both the cache and objects first,
before modifying either?

Also, it seems like maybe vtable-remove-object should not actually be
using the customizable object equality anyway?

>=20=20
>  ;; FIXME: The fact that the `location' argument of
>  ;; `vtable-insert-object' can be an integer and is then interpreted as
> @@ -378,7 +416,16 @@ vtable-insert-object
>                             (nthcdr location (vtable-objects table))
>                           ;; Do not prepend if index is too large:
>                           (setq before nil))
> -                     (or (memq location (vtable-objects table))
> +                     (or
> +                      (let ((loc (vtable-objects table)))
> +                        (while (and (cdr loc)
> +                                    (not (funcall (vtable-object-equal t=
able)
> +                                                  (car loc) location)))
> +                          (setq loc (cdr loc)))
> +                        (if (funcall (vtable-object-equal table)
> +                                     (car loc) location)
> +                            loc
> +                          nil))

I think you probably should introduce a function which searches
(vtable-objects table) for an existing object using the equality
function, and use that everywhere; it would make the changes like this
much simpler.

>                        ;; Prepend if `location' is not found and
>                        ;; `before' is non-nil:
>                        (and before (vtable-objects table))))
> @@ -400,7 +447,7 @@ vtable-insert-object
>      ;; Then adjust the cache and display.
>      (save-excursion
>        (vtable-goto-table table)
> -      (let* ((cache (vtable--cache table))
> +      (let* ((cache (vtable--ensure-cache table))
>               (inhibit-read-only t)
>               (keymap (get-text-property (point) 'keymap))
>               (ellipsis (if (vtable-ellipsis table)
> @@ -410,11 +457,14 @@ vtable-insert-object
>               (ellipsis-width (string-pixel-width ellipsis))
>               (elem (if location  ; This binding mirrors the binding of `=
pos' above.
>                         (if (integerp location)
> -                           (nth location (car cache))
> -                         (or (assq location (car cache))
> +                           (nth location (vtable--cache-lines cache))
> +                         (or (assoc
> +                              location
> +                              (vtable--cache-lines cache)
> +                              (vtable-object-equal table))
>                               (and before (caar cache))))
>                       (if before (caar cache))))
> -             (pos (memq elem (car cache)))
> +             (pos (memq elem (vtable--cache-lines cache)))
>               (line (cons object (vtable--compute-cached-line table objec=
t))))
>          (if (or before
>                  (and pos (integerp location)))
> @@ -433,13 +483,14 @@ vtable-insert-object
>                      (forward-line 1)  ; Insert *after*.
>                    (vtable-end-of-table)))
>              ;; Otherwise, append the object.
> -            (setcar cache (nconc (car cache) (list line)))
> +            (setcar cache (nconc (vtable--cache-lines cache) (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
> -                               (nth 1 cache) (vtable--spacer table)
> +                               (vtable--cache-widths cache)
> +                               (vtable--spacer table)
>                                 ellipsis ellipsis-width)
>            (add-text-properties start (point) (list 'keymap keymap
>                                                     'vtable table)))
> @@ -523,7 +574,8 @@ vtable--ensure-cache
>        (vtable--recompute-cache table)))
>=20=20
>  (defun vtable-insert (table)
> -  (let* ((spacer (vtable--spacer table))
> +  (let* ((cache (vtable--ensure-cache table))
> +         (spacer (vtable--spacer table))
>           (start (point))
>           (ellipsis (if (vtable-ellipsis table)
>                         (propertize (truncate-string-ellipsis)
> @@ -533,7 +585,7 @@ vtable-insert
>           ;; 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).
> -         (widths (nth 1 (vtable--ensure-cache table))))
> +         (widths (vtable--cache-widths cache)))
>      ;; Don't insert any header or header line if the user hasn't
>      ;; specified the columns.
>      (when (slot-value table '-has-column-spec)
> @@ -551,7 +603,7 @@ vtable-insert
>      (vtable--sort table)
>      ;; Insert the data.
>      (let ((line-number 0))
> -      (dolist (line (car (vtable--cache table)))
> +      (dolist (line (vtable--cache-lines cache))
>          (vtable--insert-line table line line-number widths spacer
>                               ellipsis ellipsis-width)
>          (setq line-number (1+ line-number))))
> @@ -667,18 +719,26 @@ vtable--clear-cache
>=20=20
>  (defun vtable--sort (table)
>    (pcase-dolist (`(,index . ,direction) (vtable-sort-by table))
> -    (let ((cache (vtable--cache table))
> -          (numerical (vtable-column--numerical
> -                      (elt (vtable-columns table) index)))
> +    (let* ((cache (vtable--ensure-cache table))
> +           (column (elt (vtable-columns table) index))
> +           (numerical (vtable-column--numerical column))
>             (numcomp (if (eq direction 'descend)
>                          #'> #'<))
>             (stringcomp (if (eq direction 'descend)
> -                          #'string> #'string<)))
> +                           #'string> #'string<))
> +           (comparator (vtable-column-comparator column))
> +           (comparator-func (when comparator
> +                              (if (eq direction 'descend)
> +                                  (lambda (v1 v2)
> +                                    (funcall comparator v2 v1))
> +                                comparator))))
>        (setcar cache
> -              (sort (car cache)
> +              (sort (vtable--cache-lines cache)
>                      (lambda (e1 e2)
>                        (let ((c1 (elt e1 (1+ index)))
>                              (c2 (elt e2 (1+ index))))
> +                        (if comparator-func
> +                            (funcall comparator-func (car c1) (car c2))
>                            (if numerical
>                                (funcall numcomp (car c1) (car c2))
>                              (funcall
> @@ -688,7 +748,7 @@ vtable--sort
>                                 (format "%s" (car c1)))
>                               (if (stringp (car c2))
>                                   (car c2)
> -                             (format "%s" (car c2))))))))))))
> +                               (format "%s" (car c2)))))))))))))
>=20=20
>  (defun vtable--indicator (table index)
>    (let ((order (car (last (vtable-sort-by table)))))
> @@ -860,7 +920,8 @@ vtable--compute-width
>      (/ (* (string-to-number (match-string 1 spec)) (window-width nil t))
>         100))
>     (t
> -    (error "Invalid spec: %s" spec))))
> +    (error "Invalid spec: %s (vtable `%s')"
> +           spec (vtable-name table)))))
>=20=20
>  (defun vtable--compute-widths (table cache)
>    "Compute the display widths for TABLE.
> @@ -972,7 +1033,13 @@ vtable-revert
>        (vtable-goto-column column))))
>=20=20
>  (defun vtable--widths (table)
> -  (nth 1 (vtable--ensure-cache table)))
> +  (vtable--cache-widths (vtable--ensure-cache table)))
> +
> +(defun vtable--cache-widths (cache)
> +  (nth 1 cache))
> +
> +(defun vtable--cache-lines (cache)
> +  (car cache))
>  ;;; Commands.
>=20=20
> diff --git a/test/lisp/emacs-lisp/vtable-tests.el b/test/lisp/emacs-lisp/=
vtable-tests.el
> index 74fb8cc8139..6e3c09e14de 100644
> --- a/test/lisp/emacs-lisp/vtable-tests.el
> +++ b/test/lisp/emacs-lisp/vtable-tests.el
> @@ -27,7 +27,7 @@
>  (require 'ert)
>  (require 'ert-x)
>=20=20
> -(ert-deftest test-vstable-compute-columns ()
> +(ert-deftest test-vtable-compute-columns ()
>    (should
>     (equal (mapcar
>             (lambda (column)
> @@ -69,4 +69,108 @@ test-vtable-insert-object
>                (mapcar #'cadr (vtable-objects table))))
>            (number-sequence 0 11))))
>=20=20
> +(ert-deftest test-vtable-update-object ()
> +  (let ((buffer (get-buffer-create "*vtable-test*")))
> +    (pop-to-buffer buffer)
> +    (erase-buffer)
> +    (let* ((object1 (cons "XXX" 1))
> +           (object2 (cons "YYY" 2))
> +           (table
> +            (make-vtable
> +             :use-header-line nil
> +             :object-equal #'eq ; Identity.
> +             :columns '((:name "XXX"))
> +             :objects (list object1 object2))))
> +      (should-error (vtable-update-object table "ZZZ"))
> +      (setcdr object1 3)
> +      (vtable-update-object table object1)
> +      (should (eq 3 (cdr (assoc "XXX" (vtable-objects table))))))))
> +
> +(ert-deftest test-vtable-remove-object ()
> +  (let ((buffer (get-buffer-create "*vtable-test*")))
> +    (pop-to-buffer buffer)
> +    (erase-buffer)
> +    (let* ((object1 (cons "XXX" 1))
> +           (object2 (cons "YYY" 2))
> +           (table
> +            (make-vtable
> +             :use-header-line nil
> +             :object-equal #'eq ; Identity.
> +             :columns '((:name "XXX"))
> +             :objects (list object1 object2))))
> +      (should-error (vtable-remove-object table "ZZZ"))
> +      (vtable-remove-object table object1)
> +      (should (eq 1 (length (vtable-objects table)))))))
> +
> +(ert-deftest test-vtable-object-equal ()
> +  (let ((buffer (get-buffer-create "*vtable-test*")))
> +    (pop-to-buffer buffer)
> +    (erase-buffer)
> +    (let* ((object1 "XXX")
> +           (object2 "XXX")
> +           (table-eq
> +            (progn
> +              (goto-char (point-max))
> +              (make-vtable
> +               :use-header-line nil
> +               :columns '((:name "table-eq" :width 20))
> +               :object-equal #'eq ; Identity.
> +               :objects (list object1 object2))))
> +           (table-equal
> +            (progn
> +              (goto-char (point-max))
> +              (make-vtable
> +               :use-header-line nil
> +               :columns '((:name "table-equal" :width 20))
> +               :object-equal #'equal ; Value.
> +               :objects (list object1 object2)))))
> +      (should
> +       (progn
> +         (vtable-goto-table table-eq)
> +         (vtable-goto-object object2)
> +         (equal object2 (get-text-property (point) 'vtable-object))))
> +      (should-not
> +       (progn
> +         (vtable-goto-table table-eq)
> +         (vtable-goto-object "ZZZ")
> +         (equal object1 (get-text-property (point) 'vtable-object))))
> +      (should
> +       (progn
> +         (vtable-goto-table table-equal)
> +         (vtable-goto-object object2)
> +         (equal object1 (get-text-property (point) 'vtable-object))))
> +      (should-not
> +       (progn
> +         (vtable-goto-table table-equal)
> +         (vtable-goto-object "ZZZ")
> +         (equal object1 (get-text-property (point) 'vtable-object)))))))
> +
> +(ert-deftest test-vtable-column-comparator ()
> +  (let ((buffer (get-buffer-create "*vtable-test*")))
> +    (pop-to-buffer buffer)
> +    (erase-buffer)
> +    (let ((table
> +           (make-vtable
> +            :use-header-line t
> +            :getter (lambda (object _index _table) object)
> +            :columns '(( :name "Date"
> +                         :primary ascend
> +                         :width 40
> +                         :formatter (lambda (object)
> +                                      (let ((time (date-to-time object)))
> +                                        (format "%s (%d)"
> +                                                (format-time-string "%A,=
 %B %d %Y" time)
> +                                                (car time))))
> +                         :comparator (lambda (object1 object2)
> +                                       (let ((time1 (date-to-time object=
1))
> +                                             (time2 (date-to-time object=
2)))
> +                                         (< (car time1)
> +                                            (car time2))))))
> +            :objects '("Fri, 11 Jul 2025"
> +                       "Thu, 10 Jul 2025"))))
> +      (should
> +       (string=3D
> +        "Thursday"
> +        (thing-at-point 'word))))))
> +
>  ;;; vtable-tests.el ends here

Thank you very much for adding tests.

Overall this patch looks good, I am in favor of this landing soon (after
feedback is addressed of course).

(One other thing: Could you try to tell your mail client to attach the
patch in "inline" mode?  This makes the patch somewhat easier to review
in debbugs.  (This may be easiest if you use Gnus to send the patch,
perhaps using debbugs-gnu-post-patch))




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

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


Received: (at 79009) by debbugs.gnu.org; 14 Jul 2025 19:14:59 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Mon Jul 14 15:14:59 2025
Received: from localhost ([127.0.0.1]:36580 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ubOdf-00028a-Bo
	for submit <at> debbugs.gnu.org; Mon, 14 Jul 2025 15:14:59 -0400
Received: from mail-vk1-xa2d.google.com ([2607:f8b0:4864:20::a2d]:47462)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1ubOdc-00028D-09
 for 79009 <at> debbugs.gnu.org; Mon, 14 Jul 2025 15:14:56 -0400
Received: by mail-vk1-xa2d.google.com with SMTP id
 71dfb90a1353d-535ae7eeebeso4166552e0c.3
 for <79009 <at> debbugs.gnu.org>; Mon, 14 Jul 2025 12:14:55 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1752520490; x=1753125290; 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=B/UPY+4xQxjrxelgAE05hpPkUiD4JBBAp3Q5KWOxwC8=;
 b=Jn2EMli34KoHG75Tr9bDZS1jYLIngmt8SMOQGu4BOPiSDnX5EwSGMXTtpMl/0suc7d
 KxJWnHhwxIMR4gzIso5P5JY3PhSAlEeo7wlZAoOZZsoTnQP4Zb5U13smWqSFUxTRAS5s
 RjezMppRlJcOIRENylf5lLh6c0LAs3znV0gdHAWde6lpnHESF7l5OvE4SI9qBoHf9/HA
 S5qKElEQb/UlqN882OyT3mbGgQda8NkaSCBsXGOuQPT6DvvCg3pDPCFenSqLF17ZxuRX
 WchYZOg1jWtKsirTcvck9rrtx3LeicxmeL/cPEcIabAJ5RnQtDSmYzfl4o96D+hjcby/
 osbQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1752520490; x=1753125290;
 h=cc:to:subject:message-id:date:from:in-reply-to:references
 :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id
 :reply-to;
 bh=B/UPY+4xQxjrxelgAE05hpPkUiD4JBBAp3Q5KWOxwC8=;
 b=njNnlKGvAOWdjH53tw2Wm9HvZL0/nBZB6FAJunbwYtXApaXQjKfVLQz6OXFG/uX1HX
 SlGznY4bDP6iAE1MxYSN1PpDsqPC390EsXstrvChQVZRL6+r3/2HSZdcrJ2w8nATbsX9
 BS6Fe0lOSBr3jU4z0vF6SFkyg8+SnAJMzXKJpD6T2K/v1MRFR75d9yGmuRH9XPxXXuwK
 0kmPAPfu3CL7m1NCgj//W05s1YaCKPnJRFITtFuxRvhRZ2Xd7IifHY7f9FgFWB59T8Cd
 USIdXswmWtXmAQCaot5TP5mnObTstjfmYxd8W2ylqoPyw+zsI1ng5c68OL8aMSrTQPYv
 YXBg==
X-Gm-Message-State: AOJu0YyRKMgiqrKOeZm/mrTpVzH6kqE+CX1bfE1acQ2nQzuucM2ZWl0x
 HzjpNd6VSJVXbdG3hP/k9MT0ugg+dNR3iLtbdvcd5YlkYvwkEbyR9UnbJ0J9uFvOcelzGEp1hqk
 A2dR06z7QW7U5F7ssl5izho5m42LytDQp6w==
X-Gm-Gg: ASbGnctA20vhC5DRoVvaQt0fy9RlCcrWojQZo9OIdPi8VYx3D/SVmxzFqGHwNE0uQS5
 nPaS86Y7u3tZ3Pb1iClnF3JLnXUBOEHuJ4cpDvntqBADHxoBdEaPqo/gYLtMseK6HJEQAXVR4cv
 HnF+ir/nxn5M4pykh/P6sk94tKr2TDy9915/+T3upSShUoqRxh4SN/YJVLgWZYl+nRayzYCfF9L
 oBOzACzh2ES7puzivbN
X-Google-Smtp-Source: AGHT+IHNxDY5OcUtNjJ97KnF2NQztLHWYXMRn7ax3elTVO7dZAzBqOo6C6pI4+5ZgNd0xwQVlf5dm8KO7MaKiWrxUi4=
X-Received: by 2002:a05:6122:2a14:b0:535:aea0:795a with SMTP id
 71dfb90a1353d-535f46dfabdmr7320528e0c.1.1752520489772; Mon, 14 Jul 2025
 12:14:49 -0700 (PDT)
MIME-Version: 1.0
References: <CAN+1HbrLkmV6QYfJPcEv-EeX6T1tiNogG41GkCw8aMxdt4GmkA@HIDDEN>
In-Reply-To: <CAN+1HbrLkmV6QYfJPcEv-EeX6T1tiNogG41GkCw8aMxdt4GmkA@HIDDEN>
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Mon, 14 Jul 2025 15:14:37 -0400
X-Gm-Features: Ac12FXw9ocUXNLBhIHUZGnwpkjeaIAp3tcyIvnZkg7eCMHiWX_9MU1kIg122A9M
Message-ID: <CAN+1HbpNcK=FdiarDBcB4NyOouAeNV2wTrA7x4asHUAEopBqHQ@HIDDEN>
Subject: Re: bug#79009: [PATCH] Improve 'vtable' object handling, cache
 handling, messages
To: 79009 <at> debbugs.gnu.org
Content-Type: multipart/mixed; boundary="000000000000414fa80639e87937"
X-Spam-Score: 0.0 (/)
X-Debbugs-Envelope-To: 79009
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 (-)

--000000000000414fa80639e87937
Content-Type: multipart/alternative; boundary="000000000000414fa70639e87935"

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

On Sun, Jul 13, 2025 at 2:16=E2=80=AFPM St=C3=A9phane Marks <shipmints@gmai=
l.com> wrote:

> Attached is the first "smaller" patch to converge on the fixed and
> upgraded vtable presented elsewhere under bug 78843.  I'd like for us to
> consider this patch size for vtable acceptable, and to review it in short
> order to accommodate getting the next patch sets to follow quickly after
> this one.  I'd prefer this not take until the autumn (in the northern
> hemisphere).
>
> If any of you cc'd here do not want to be cc'd on other patches, let me
> know.  You're the ones who I've seen use vtable in the wild, or have
> submitted bug reports.  All of your issues have been addressed, though no=
t
> necessarily in this first patch.  Refer to bug 78843 to see the fixed and
> upgraded vtable intended to converge here.
>

I've updated the broader vtable update in the referenced 78843 bug to check
out if interested.

I've removed support for the duplicate-object feature.  After careful
consideration, it was half baked and I think better for vtable programmers
to handle their own objects.  I will be sure the documentation stresses to
avoid duplicate objects as vtable's design is predicated on unique objects
(or race conditions ensue among duplicate object references).

Attaching the updated patch which is also formatted to avoid mere
whitespace changes.

-St=C3=A9phane

--000000000000414fa70639e87935
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 Sun, Jul 13, 2025 at 2:16=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 style=3D"font-family:mo=
nospace">Attached is the first &quot;smaller&quot; patch to converge on the=
 fixed and upgraded vtable presented elsewhere under bug 78843.=C2=A0 I&#39=
;d like for us to consider this patch size for vtable acceptable, and to re=
view it in short order to accommodate getting the next patch sets to follow=
 quickly after this one.=C2=A0 I&#39;d prefer this not take until the autum=
n (in the northern hemisphere).</div><div style=3D"font-family:monospace"><=
br></div><div style=3D"font-family:monospace">If any of you cc&#39;d here d=
o not want to be cc&#39;d on other patches, let me know.=C2=A0 You&#39;re t=
he ones who I&#39;ve seen use vtable in the wild,=C2=A0or have submitted bu=
g reports.=C2=A0 All of your issues have been addressed, though not necessa=
rily in this first=C2=A0patch.=C2=A0 Refer to bug 78843 to see the fixed an=
d upgraded vtable intended to converge here.<span class=3D"gmail_default" s=
tyle=3D"font-family:monospace"></span></div></div></blockquote><div><br></d=
iv><div class=3D"gmail_default" style=3D"font-family:monospace">I&#39;ve up=
dated the broader vtable update in the referenced 78843 bug to check out if=
 interested.</div><div class=3D"gmail_default" style=3D"font-family:monospa=
ce"><br></div><div class=3D"gmail_default" style=3D"font-family:monospace">=
I&#39;ve removed support=C2=A0for the duplicate-object feature.=C2=A0 After=
 careful consideration, it was half baked and I think better for vtable pro=
grammers to handle their own objects.=C2=A0 I will be sure the documentatio=
n stresses to avoid duplicate objects as vtable&#39;s design is predicated =
on unique objects (or race conditions ensue among duplicate object referenc=
es).</div><div class=3D"gmail_default" style=3D"font-family:monospace"><br>=
</div><div class=3D"gmail_default" style=3D"font-family:monospace">Attachin=
g the updated patch which is also formatted to avoid mere whitespace change=
s.</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=A9p=
hane</div></div></div>

--000000000000414fa70639e87935--

--000000000000414fa80639e87937
Content-Type: application/octet-stream; 
	name="0001-Improve-vtable-object-handling-cache-handling-messag.patch"
Content-Disposition: attachment; 
	filename="0001-Improve-vtable-object-handling-cache-handling-messag.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_md3hfw4f0>
X-Attachment-Id: f_md3hfw4f0

RnJvbSBlN2JiNjFiZWNiMTVlMDdlYmQzZTU0Y2YyYzFlYTJiZWNhZGEwOWIwIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo
aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFN1biwgMTMgSnVsIDIwMjUgMTM6MzI6MjggLTA0MDAK
U3ViamVjdDogW1BBVENIXSBJbXByb3ZlICd2dGFibGUnIG9iamVjdCBoYW5kbGluZywgY2FjaGUg
aGFuZGxpbmcsIG1lc3NhZ2VzCgpBZGQgb2JqZWN0IGVxdWFsaXR5IGZ1bmN0aW9uIG92ZXJyaWRl
IChkZWZhdWx0cyB0byBleGlzdGluZyAnZXEnCmJlaGF2aW9yKS4gIEFkZCBjb2x1bW4gY29tcGFy
YXRvciB0byBhZGRyZXNzIG9iamVjdApzb3J0aW5nIChkZWZhdWx0cyB0byBleGlzdGluZyBiZWhh
dmlvcikuICBDb3JyZWN0IGNhY2hlCnJlZmVyZW5jZXMgdG8gcHJpbWUgdGhlIGNhY2hlIGFzIG5l
ZWRlZC4gIEFkZCBjYWNoZSBhY2Nlc3NvcgpmdW5jdGlvbnMuICBBZGQgdGFibGUgbmFtZSBzbG90
IHRvIGltcHJvdmUgZXJyb3JzIGFuZAptZXNzYWdlcyAoZGVmYXVsdHMgdG8gIip2dGFibGUqIiku
CgpBZGRlZCB0ZXN0cy4KCiogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAodnRhYmxlLWNvbHVt
bik6IEFkZCBjb21wYXJhdG9yCnNsb3QuCih2dGFibGUpOiBBZGQgbmFtZSwgb2JqZWN0LWVxdWFs
IHNsb3RzLgoobWFrZS12dGFibGUpOiBJbml0aWFsaXplIG5ldyBzbG90cy4KKHZ0YWJsZS1nb3Rv
LW9iamVjdCk6IFVzZSBvYmplY3QtZXF1YWwuCih2dGFibGUtdXBkYXRlLW9iamVjdCk6IFVzZSBv
YmplY3QtZXF1YWwsIHVzZSBjYWNoZSBhY2Nlc3NvciwKaW1wcm92ZSBtZXNzYWdlcy4KKHZ0YWJs
ZS1yZW1vdmUtb2JqZWN0KTogVXNlIG9iamVjdC1lcXVhbCwgcHJpbWUgY2FjaGUsIHVzZSBjYWNo
ZQpmdW5jdGlvbnMsIGltcHJvdmUgbWVzc2FnZXMuCih2dGFibGUtaW5zZXJ0LW9iamVjdCk6IFVz
ZSBvYmplY3QtZXF1YWwsIHVzZSBjYWNoZSBhY2Nlc3NvciwKaW1wcm92ZSBtZXNzYWdlcy4KKHZ0
YWJsZS1pbnNlcnQpOiBQcmltZSBjYWNoZSwgdXNlIGNhY2hlIGFjY2Vzc29yLgoodnRhYmxlLS1z
b3J0KTogVXNlIGNvbHVtbiBjb21wYXJhdG9yLCBwcmltZSBjYWNoZSwgdXNlIGNhY2hlCmFjY2Vz
c29yLgoodnRhYmxlLS1jb21wdXRlLXdpZHRoKTogSW1wcm92ZSBtZXNzYWdlLgoodnRhYmxlLS13
aWR0aHMpOiBVc2UgY2FjaGUgYWNjZXNzb3IuCgoqIHRlc3QvbGlzcC9lbWFjcy1saXNwL3Z0YWJs
ZS10ZXN0cy5lbAoodGVzdC12c3RhYmxlLWNvbXB1dGUtY29sdW1ucyk6IFJlbmFtZWQgdG8KdGVz
dC12dGFibGUtY29tcHV0ZS1jb2x1bW5zLgoodGVzdC12dGFibGUtaW5zZXJ0LW9iamVjdCk6IENo
YW5nZWQgYnVmZmVyIG5hbWUgdG8gbm9uLWhpZGRlbi4KKHRlc3QtdnRhYmxlLXVwZGF0ZS1vYmpl
Y3QsIHRlc3QtdnRhYmxlLXJlbW92ZS1vYmplY3QpCih0ZXN0LXZ0YWJsZS1vYmplY3QtZXF1YWws
IHRlc3QtdnRhYmxlLWNvbHVtbi1jb21wYXJhdG9yKTogTmV3CnRlc3QuCi0tLQogbGlzcC9lbWFj
cy1saXNwL3Z0YWJsZS5lbCAgICAgICAgICAgIHwgMTQzICsrKysrKysrKysrKysrKysrKysrLS0t
LS0tLQogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsIHwgMTA2ICsrKysrKysr
KysrKysrKysrKystCiAyIGZpbGVzIGNoYW5nZWQsIDIxMCBpbnNlcnRpb25zKCspLCAzOSBkZWxl
dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVsIGIvbGlzcC9l
bWFjcy1saXNwL3Z0YWJsZS5lbAppbmRleCAwMDc4NTExM2VkYi4uMzFlZjczZDVlYjQgMTAwNjQ0
Ci0tLSBhL2xpc3AvZW1hY3MtbGlzcC92dGFibGUuZWwKKysrIGIvbGlzcC9lbWFjcy1saXNwL3Z0
YWJsZS5lbApAQCAtNDUsMTQgKzQ1LDE4IEBAIHZ0YWJsZS1jb2x1bW4KICAgZ2V0dGVyCiAgIGZv
cm1hdHRlcgogICBkaXNwbGF5ZXIKKyAgY29tcGFyYXRvcgogICAtbnVtZXJpY2FsCiAgIC1hbGln
bmVkKQogCiAoZGVmY2xhc3MgdnRhYmxlICgpCi0gICgoY29sdW1ucyA6aW5pdGFyZyA6Y29sdW1u
cyA6YWNjZXNzb3IgdnRhYmxlLWNvbHVtbnMpCisgICgobmFtZSA6aW5pdGFyZyA6bmFtZSA6YWNj
ZXNzb3IgdnRhYmxlLW5hbWUpCisgICAoY29sdW1ucyA6aW5pdGFyZyA6Y29sdW1ucyA6YWNjZXNz
b3IgdnRhYmxlLWNvbHVtbnMpCiAgICAob2JqZWN0cyA6aW5pdGFyZyA6b2JqZWN0cyA6YWNjZXNz
b3IgdnRhYmxlLW9iamVjdHMpCiAgICAob2JqZWN0cy1mdW5jdGlvbiA6aW5pdGFyZyA6b2JqZWN0
cy1mdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgOmFjY2Vzc29yIHZ0YWJsZS1vYmplY3Rz
LWZ1bmN0aW9uKQorICAgKG9iamVjdC1lcXVhbCA6aW5pdGFyZyA6b2JqZWN0LWVxdWFsCisgICAg
ICAgICAgICAgICAgIDphY2Nlc3NvciB2dGFibGUtb2JqZWN0LWVxdWFsKQogICAgKGdldHRlciA6
aW5pdGFyZyA6Z2V0dGVyIDphY2Nlc3NvciB2dGFibGUtZ2V0dGVyKQogICAgKGZvcm1hdHRlciA6
aW5pdGFyZyA6Zm9ybWF0dGVyIDphY2Nlc3NvciB2dGFibGUtZm9ybWF0dGVyKQogICAgKGRpc3Bs
YXllciA6aW5pdGFyZyA6ZGlzcGxheWVyIDphY2Nlc3NvciB2dGFibGUtZGlzcGxheWVyKQpAQCAt
ODYsNyArOTAsMTIgQEAgdnRhYmxlLWhlYWRlci1saW5lLW1hcAogICAiPGZvbGxvdy1saW5rPiIg
J21vdXNlLWZhY2UKICAgIjxtb3VzZS0yPiIgIyd2dGFibGUtaGVhZGVyLWxpbmUtc29ydCkKIAot
KGNsLWRlZnVuIG1ha2UtdnRhYmxlICgma2V5IGNvbHVtbnMgb2JqZWN0cyBvYmplY3RzLWZ1bmN0
aW9uCisoY2wtZGVmdW4gbWFrZS12dGFibGUgKCZrZXkKKyAgICAgICAgICAgICAgICAgICAgICAg
KG5hbWUgIip2dGFibGUqIikKKyAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucworICAgICAg
ICAgICAgICAgICAgICAgICBvYmplY3RzCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMt
ZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgKG9iamVjdC1lcXVhbCAjJ2VxKQogICAg
ICAgICAgICAgICAgICAgICAgICBnZXR0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0
dGVyCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXllcgpAQCAtMTEzLDggKzEyMiwxMCBA
QCBtYWtlLXZ0YWJsZQogICAobGV0ICgodGFibGUKICAgICAgICAgIChtYWtlLWluc3RhbmNlCiAg
ICAgICAgICAgJ3Z0YWJsZQorICAgICAgICAgIDpuYW1lIG5hbWUKICAgICAgICAgICA6b2JqZWN0
cyBvYmplY3RzCiAgICAgICAgICAgOm9iamVjdHMtZnVuY3Rpb24gb2JqZWN0cy1mdW5jdGlvbgor
ICAgICAgICAgIDpvYmplY3QtZXF1YWwgb2JqZWN0LWVxdWFsCiAgICAgICAgICAgOmdldHRlciBn
ZXR0ZXIKICAgICAgICAgICA6Zm9ybWF0dGVyIGZvcm1hdHRlcgogICAgICAgICAgIDpkaXNwbGF5
ZXIgZGlzcGxheWVyCkBAIC0xMzIsNyArMTQzLDggQEAgbWFrZS12dGFibGUKICAgICA7OyBBdXRv
LWdlbmVyYXRlIHRoZSBjb2x1bW5zLgogICAgICh1bmxlc3MgY29sdW1ucwogICAgICAgKHVubGVz
cyBvYmplY3RzCi0gICAgICAgIChlcnJvciAiQ2FuJ3QgYXV0by1nZW5lcmF0ZSBjb2x1bW5zOyBu
byBvYmplY3RzIikpCisgICAgICAgIChlcnJvciAiQ2FuJ3QgYXV0by1nZW5lcmF0ZSBjb2x1bW5z
OyBubyBvYmplY3RzICh2dGFibGUgYCVzJykiCisgICAgICAgICAgICAgICAodnRhYmxlLW5hbWUg
dGFibGUpKSkKICAgICAgIChzZXRxIGNvbHVtbnMgKG1ha2UtbGlzdCAobGVuZ3RoIChjYXIgb2Jq
ZWN0cykpICIiKSkpCiAgICAgKHNldGYgKHZ0YWJsZS1jb2x1bW5zIHRhYmxlKQogICAgICAgICAg
IChtYXBjYXIgKGxhbWJkYSAoY29sdW1uKQpAQCAtMjUxLDE0ICsyNjMsMTUgQEAgdnRhYmxlLWdv
dG8tb2JqZWN0CiBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBvYmplY3QgaWYgZm91bmQsIGFu
ZCBuaWwgaWYgbm90LiIKICAgKGxldCAoKHN0YXJ0IChwb2ludCkpKQogICAgICh2dGFibGUtYmVn
aW5uaW5nLW9mLXRhYmxlKQorICAgIChsZXQgKChwcmVkaWNhdGUgKHZ0YWJsZS1vYmplY3QtZXF1
YWwgKHZ0YWJsZS1jdXJyZW50LXRhYmxlKSkpKQogICAgICAgKHNhdmUtcmVzdHJpY3Rpb24KICAg
ICAgICAgKG5hcnJvdy10by1yZWdpb24gKHBvaW50KSAoc2F2ZS1leGN1cnNpb24gKHZ0YWJsZS1l
bmQtb2YtdGFibGUpKSkKLSAgICAgIChpZiAodGV4dC1wcm9wZXJ0eS1zZWFyY2gtZm9yd2FyZCAn
dnRhYmxlLW9iamVjdCBvYmplY3QgIydlcSkKKyAgICAgICAgKGlmICh0ZXh0LXByb3BlcnR5LXNl
YXJjaC1mb3J3YXJkICd2dGFibGUtb2JqZWN0IG9iamVjdCBwcmVkaWNhdGUpCiAgICAgICAgICAg
ICAocHJvZ24KICAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSAtMSkKICAgICAgICAgICAgICAg
KHBvaW50KSkKICAgICAgICAgICAoZ290by1jaGFyIHN0YXJ0KQotICAgICAgICBuaWwpKSkpCisg
ICAgICAgICAgbmlsKSkpKSkKIAogKGRlZnVuIHZ0YWJsZS1nb3RvLXRhYmxlICh0YWJsZSkKICAg
IkdvIHRvIFRBQkxFIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KQEAgLTI5MSwyNSArMzA0LDMyIEBA
IHZ0YWJsZS11cGRhdGUtb2JqZWN0CiAgIChsZXQqICgob2JqZWN0cyAodnRhYmxlLW9iamVjdHMg
dGFibGUpKQogICAgICAgICAgKGluaGliaXQtcmVhZC1vbmx5IHQpKQogICAgIDs7IEZpcnN0IHJl
cGxhY2UgdGhlIG9iamVjdCBpbiB0aGUgb2JqZWN0IHN0b3JhZ2UuCi0gICAgKGlmIChlcSBvbGQt
b2JqZWN0IChjYXIgb2JqZWN0cykpCisgICAgKGlmIChmdW5jYWxsICh2dGFibGUtb2JqZWN0LWVx
dWFsIHRhYmxlKSBvbGQtb2JqZWN0IChjYXIgb2JqZWN0cykpCiAgICAgICAgIDs7IEl0J3MgYXQg
dGhlIGhlYWQsIHNvIHJlcGxhY2UgaXQgdGhlcmUuCiAgICAgICAgIChzZXRmICh2dGFibGUtb2Jq
ZWN0cyB0YWJsZSkKICAgICAgICAgICAgICAgKGNvbnMgb2JqZWN0IChjZHIgb2JqZWN0cykpKQog
ICAgICAgOzsgT3RoZXJ3aXNlIHNwbGljZSBpbnRvIHRoZSBsaXN0LgogICAgICAgKHdoaWxlIChh
bmQgKGNkciBvYmplY3RzKQotICAgICAgICAgICAgICAgICAgKG5vdCAoZXEgKGNhZHIgb2JqZWN0
cykgb2xkLW9iamVjdCkpKQorICAgICAgICAgICAgICAgICAgKG5vdCAoZnVuY2FsbCAodnRhYmxl
LW9iamVjdC1lcXVhbCB0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNh
ZHIgb2JqZWN0cykgb2xkLW9iamVjdCkpKQogICAgICAgICAoc2V0cSBvYmplY3RzIChjZHIgb2Jq
ZWN0cykpKQotICAgICAgKHVubGVzcyBvYmplY3RzCi0gICAgICAgIChlcnJvciAiQ2FuJ3QgZmlu
ZCB0aGUgb2xkIG9iamVjdCIpKQorICAgICAgKHVubGVzcyAoYW5kIG9iamVjdHMKKyAgICAgICAg
ICAgICAgICAgICAoZnVuY2FsbCAodnRhYmxlLW9iamVjdC1lcXVhbCB0YWJsZSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoY2FkciBvYmplY3RzKSBvbGQtb2JqZWN0KSkKKyAgICAgICAg
KGVycm9yICJDYW4ndCBmaW5kIHRoZSBvbGQgb2JqZWN0ICh2dGFibGUgYCVzJykiCisgICAgICAg
ICAgICAgICAodnRhYmxlLW5hbWUgdGFibGUpKSkKICAgICAgIChzZXRjYXIgKGNkciBvYmplY3Rz
KSBvYmplY3QpKQogICAgIDs7IFRoZW4gdXBkYXRlIHRoZSBjYWNoZS4uLgogICAgIDs7IEZJWE1F
OiBJZiB0aGUgdGFibGUncyBidWZmZXIgaGFzIG5vIHZpc2libGUgd2luZG93LCBvciBpZiBpdHMK
ICAgICA7OyB3aWR0aCBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgdGFibGUgd2FzIHVwZGF0ZWQsIHRo
ZSBjYWNoZSBrZXkgd2lsbAogICAgIDs7IG5vdCBtYXRjaCBhbmQgdGhlIG9iamVjdCBjYW4ndCBi
ZSB1cGRhdGVkLiAgKEJ1ZyAjNjk4MzcpLgotICAgIChpZi1sZXQqICgobGluZS1udW1iZXIgKHNl
cS1wb3NpdGlvbiAoY2FyICh2dGFibGUtLWNhY2hlIHRhYmxlKSkgb2xkLW9iamVjdAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChhIGIpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVxdWFsIChjYXIgYSkgYikpKSkK
LSAgICAgICAgICAgICAgKGxpbmUgKGVsdCAoY2FyICh2dGFibGUtLWNhY2hlIHRhYmxlKSkgbGlu
ZS1udW1iZXIpKSkKKyAgICAoaWYtbGV0KiAoKGNhY2hlICh2dGFibGUtLWVuc3VyZS1jYWNoZSB0
YWJsZSkpCisgICAgICAgICAgICAgIChsaW5lLW51bWJlciAoc2VxLXBvc2l0aW9uCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGFzc29jIG9sZC1vYmplY3QKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKSkpKQor
ICAgICAgICAgICAgICAobGluZSAoZWx0ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSBsaW5l
LW51bWJlcikpKQogICAgICAgICAocHJvZ24KICAgICAgICAgICAoc2V0Y2FyIGxpbmUgb2JqZWN0
KQogICAgICAgICAgIChzZXRjZHIgbGluZSAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRh
YmxlIG9iamVjdCkpCkBAIC0zMjAsMjggKzM0MCw0NiBAQCB2dGFibGUtdXBkYXRlLW9iamVjdAog
ICAgICAgICAgICAgICAgICAgKHN0YXJ0IChwb2ludCkpKQogICAgICAgICAgICAgICAoZGVsZXRl
LWxpbmUpCiAgICAgICAgICAgICAgICh2dGFibGUtLWluc2VydC1saW5lIHRhYmxlIGxpbmUgbGlu
ZS1udW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG50aCAxICh2dGFi
bGUtLWNhY2hlIHRhYmxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0
YWJsZS0tY2FjaGUtd2lkdGhzIGNhY2hlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAodnRhYmxlLS1zcGFjZXIgdGFibGUpKQogICAgICAgICAgICAgICAoYWRkLXRleHQtcHJv
cGVydGllcyBzdGFydCAocG9pbnQpIChsaXN0ICdrZXltYXAga2V5bWFwCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZSkp
KSkKICAgICAgICAgICA7OyBXZSBtYXkgaGF2ZSBpbnNlcnRlZCBhIG5vbi1udW1lcmljYWwgdmFs
dWUgaW50byBhIHByZXZpb3VzbHkKICAgICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBz
byByZWNvbXB1dGUuCiAgICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJs
ZSAoY2RyIGxpbmUpKSkKLSAgICAgIChlcnJvciAiQ2FuJ3QgZmluZCBjYWNoZWQgb2JqZWN0IGlu
IHZ0YWJsZSIpKSkpCisgICAgICAoZXJyb3IgIkNhbid0IGZpbmQgY2FjaGVkIG9iamVjdCAodnRh
YmxlIGAlcycpIgorICAgICAgICAgICAgICh2dGFibGUtbmFtZSB0YWJsZSkpKSkpCiAKIChkZWZ1
biB2dGFibGUtcmVtb3ZlLW9iamVjdCAodGFibGUgb2JqZWN0KQogICAiUmVtb3ZlIE9CSkVDVCBm
cm9tIFRBQkxFLgogVGhpcyB3aWxsIGFsc28gcmVtb3ZlIHRoZSBkaXNwbGF5ZWQgbGluZS4iCisg
IChsZXQgKChjYWNoZSAodnRhYmxlLS1lbnN1cmUtY2FjaGUgdGFibGUpKQorICAgICAgICAoaW5o
aWJpdC1yZWFkLW9ubHkgdCkpCisgICAgKHVubGVzcyAoc2VxLWNvbnRhaW5zLXAgKHZ0YWJsZS1v
YmplY3RzIHRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKSkKKyAgICAg
IChlcnJvciAiQ2FuJ3QgZmluZCB0aGUgb2JqZWN0IHRvIHJlbW92ZSAodnRhYmxlIGAlcycpIgor
ICAgICAgICAgICAgICh2dGFibGUtbmFtZSB0YWJsZSkpKQogICAgIDs7IEZpcnN0IHJlbW92ZSBm
cm9tIHRoZSBvYmplY3RzLgotICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpIChkZWxxIG9i
amVjdCAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkKKyAgICAoc2V0ZiAodnRhYmxlLW9iamVjdHMg
dGFibGUpIChzZXEtcmVtb3ZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxh
bWJkYSAoZWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwg
KHZ0YWJsZS1vYmplY3QtZXF1YWwgdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBlbHQgb2JqZWN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkKICAgICA7OyBUaGVuIGFkanVzdCB0aGUg
Y2FjaGUgYW5kIGRpc3BsYXkuCi0gIChsZXQgKChjYWNoZSAodnRhYmxlLS1jYWNoZSB0YWJsZSkp
Ci0gICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KSkKLSAgICAoc2V0Y2FyIGNhY2hlIChkZWxx
IChhc3NxIG9iamVjdCAoY2FyIGNhY2hlKSkgKGNhciBjYWNoZSkpKQorICAgIChpZi1sZXQqICgo
b2xkLWxpbmUgKGFzc29jIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2
dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKSkpKQorICAgICAgICAocHJvZ24KKyAgICAgICAg
ICAoc2V0Y2FyIGNhY2hlIChkZWxxIG9sZC1saW5lICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hl
KSkpCiAgICAgICAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAgICAgICAodnRhYmxlLWdvdG8t
dGFibGUgdGFibGUpCiAgICAgICAgICAgICAod2hlbiAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVj
dCkKLSAgICAgICAgKGRlbGV0ZS1saW5lKSkpKSkKKyAgICAgICAgICAgICAgKGRlbGV0ZS1saW5l
KSkpKQorICAgICAgOzsgQXQgdGhpcyBwb2ludCwgdGhlIG9iamVjdCB3YXMgcmVtb3ZlZCBmcm9t
IG9iamVjdHMsIGJ1dCBub3QKKyAgICAgIDs7IHRoZSBjYWNoZSwgd2hpY2ggd2lsbCBzdGFsZS4K
KyAgICAgIChlcnJvciAiQ2FuJ3QgZmluZCBjYWNoZWQgb2JqZWN0ICh2dGFibGUgYCVzJykiCisg
ICAgICAgICAgICAgKHZ0YWJsZS1uYW1lIHRhYmxlKSkpKSkKIAogOzsgRklYTUU6IFRoZSBmYWN0
IHRoYXQgdGhlIGBsb2NhdGlvbicgYXJndW1lbnQgb2YKIDs7IGB2dGFibGUtaW5zZXJ0LW9iamVj
dCcgY2FuIGJlIGFuIGludGVnZXIgYW5kIGlzIHRoZW4gaW50ZXJwcmV0ZWQgYXMKQEAgLTM3OCw3
ICs0MTYsMTYgQEAgdnRhYmxlLWluc2VydC1vYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChudGhjZHIgbG9jYXRpb24gKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkKICAgICAgICAgICAg
ICAgICAgICAgICAgICA7OyBEbyBub3QgcHJlcGVuZCBpZiBpbmRleCBpcyB0b28gbGFyZ2U6CiAg
ICAgICAgICAgICAgICAgICAgICAgICAgKHNldHEgYmVmb3JlIG5pbCkpCi0gICAgICAgICAgICAg
ICAgICAgICAob3IgKG1lbXEgbG9jYXRpb24gKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkKKyAgICAg
ICAgICAgICAgICAgICAgIChvcgorICAgICAgICAgICAgICAgICAgICAgIChsZXQgKChsb2MgKHZ0
YWJsZS1vYmplY3RzIHRhYmxlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAod2hpbGUgKGFu
ZCAoY2RyIGxvYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgKGZ1
bmNhbGwgKHZ0YWJsZS1vYmplY3QtZXF1YWwgdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIgbG9jKSBsb2NhdGlvbikpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAoc2V0cSBsb2MgKGNkciBsb2MpKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgIChpZiAoZnVuY2FsbCAodnRhYmxlLW9iamVjdC1lcXVhbCB0YWJsZSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIGxvYykgbG9jYXRpb24pCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbG9jCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5p
bCkpCiAgICAgICAgICAgICAgICAgICAgICAgOzsgUHJlcGVuZCBpZiBgbG9jYXRpb24nIGlzIG5v
dCBmb3VuZCBhbmQKICAgICAgICAgICAgICAgICAgICAgICA7OyBgYmVmb3JlJyBpcyBub24tbmls
OgogICAgICAgICAgICAgICAgICAgICAgIChhbmQgYmVmb3JlICh2dGFibGUtb2JqZWN0cyB0YWJs
ZSkpKSkKQEAgLTQwMCw3ICs0NDcsNyBAQCB2dGFibGUtaW5zZXJ0LW9iamVjdAogICAgIDs7IFRo
ZW4gYWRqdXN0IHRoZSBjYWNoZSBhbmQgZGlzcGxheS4KICAgICAoc2F2ZS1leGN1cnNpb24KICAg
ICAgICh2dGFibGUtZ290by10YWJsZSB0YWJsZSkKLSAgICAgIChsZXQqICgoY2FjaGUgKHZ0YWJs
ZS0tY2FjaGUgdGFibGUpKQorICAgICAgKGxldCogKChjYWNoZSAodnRhYmxlLS1lbnN1cmUtY2Fj
aGUgdGFibGUpKQogICAgICAgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KQogICAgICAgICAg
ICAgIChrZXltYXAgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1hcCkpCiAgICAgICAg
ICAgICAgKGVsbGlwc2lzIChpZiAodnRhYmxlLWVsbGlwc2lzIHRhYmxlKQpAQCAtNDEwLDExICs0
NTcsMTQgQEAgdnRhYmxlLWluc2VydC1vYmplY3QKICAgICAgICAgICAgICAoZWxsaXBzaXMtd2lk
dGggKHN0cmluZy1waXhlbC13aWR0aCBlbGxpcHNpcykpCiAgICAgICAgICAgICAgKGVsZW0gKGlm
IGxvY2F0aW9uICA7IFRoaXMgYmluZGluZyBtaXJyb3JzIHRoZSBiaW5kaW5nIG9mIGBwb3MnIGFi
b3ZlLgogICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGludGVnZXJwIGxvY2F0aW9uKQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKG50aCBsb2NhdGlvbiAoY2FyIGNhY2hlKSkKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAob3IgKGFzc3EgbG9jYXRpb24gKGNhciBjYWNoZSkpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAobnRoIGxvY2F0aW9uICh2dGFibGUtLWNhY2hlLWxpbmVz
IGNhY2hlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAob3IgKGFzc29jCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAodnRhYmxlLW9iamVjdC1lcXVhbCB0YWJsZSkpCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChhbmQgYmVmb3JlIChjYWFyIGNhY2hlKSkpKQogICAgICAgICAgICAgICAgICAgICAg
KGlmIGJlZm9yZSAoY2FhciBjYWNoZSkpKSkKLSAgICAgICAgICAgICAocG9zIChtZW1xIGVsZW0g
KGNhciBjYWNoZSkpKQorICAgICAgICAgICAgIChwb3MgKG1lbXEgZWxlbSAodnRhYmxlLS1jYWNo
ZS1saW5lcyBjYWNoZSkpKQogICAgICAgICAgICAgIChsaW5lIChjb25zIG9iamVjdCAodnRhYmxl
LS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpKSkKICAgICAgICAgKGlmIChvciBi
ZWZvcmUKICAgICAgICAgICAgICAgICAoYW5kIHBvcyAoaW50ZWdlcnAgbG9jYXRpb24pKSkKQEAg
LTQzMywxMyArNDgzLDE0IEBAIHZ0YWJsZS1pbnNlcnQtb2JqZWN0CiAgICAgICAgICAgICAgICAg
ICAgIChmb3J3YXJkLWxpbmUgMSkgIDsgSW5zZXJ0ICphZnRlciouCiAgICAgICAgICAgICAgICAg
ICAodnRhYmxlLWVuZC1vZi10YWJsZSkpKQogICAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBhcHBl
bmQgdGhlIG9iamVjdC4KLSAgICAgICAgICAgIChzZXRjYXIgY2FjaGUgKG5jb25jIChjYXIgY2Fj
aGUpIChsaXN0IGxpbmUpKSkKKyAgICAgICAgICAgIChzZXRjYXIgY2FjaGUgKG5jb25jICh2dGFi
bGUtLWNhY2hlLWxpbmVzIGNhY2hlKSAobGlzdCBsaW5lKSkpCiAgICAgICAgICAgICAodnRhYmxl
LWVuZC1vZi10YWJsZSkpKQogICAgICAgICAobGV0ICgoc3RhcnQgKHBvaW50KSkpCiAgICAgICAg
ICAgOzsgRklYTUU6IFdlIGhhdmUgdG8gYWRqdXN0IGNvbG9ycyBpbiBsaW5lcyBiZWxvdyB0aGlz
IGlmIHdlCiAgICAgICAgICAgOzsgaGF2ZSA6cm93LWNvbG9ycy4KICAgICAgICAgICAodnRhYmxl
LS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAobnRoIDEgY2FjaGUpICh2dGFibGUtLXNwYWNlciB0YWJsZSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGVsbGlwc2lzIGVsbGlwc2lzLXdpZHRoKQogICAgICAgICAgIChhZGQt
dGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkgKGxpc3QgJ2tleW1hcCBrZXltYXAKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2dGFibGUgdGFi
bGUpKSkKQEAgLTUyMyw3ICs1NzQsOCBAQCB2dGFibGUtLWVuc3VyZS1jYWNoZQogICAgICAgKHZ0
YWJsZS0tcmVjb21wdXRlLWNhY2hlIHRhYmxlKSkpCiAKIChkZWZ1biB2dGFibGUtaW5zZXJ0ICh0
YWJsZSkKLSAgKGxldCogKChzcGFjZXIgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKSkKKyAgKGxldCog
KChjYWNoZSAodnRhYmxlLS1lbnN1cmUtY2FjaGUgdGFibGUpKQorICAgICAgICAgKHNwYWNlciAo
dnRhYmxlLS1zcGFjZXIgdGFibGUpKQogICAgICAgICAgKHN0YXJ0IChwb2ludCkpCiAgICAgICAg
ICAoZWxsaXBzaXMgKGlmICh2dGFibGUtZWxsaXBzaXMgdGFibGUpCiAgICAgICAgICAgICAgICAg
ICAgICAgIChwcm9wZXJ0aXplICh0cnVuY2F0ZS1zdHJpbmctZWxsaXBzaXMpCkBAIC01MzMsNyAr
NTg1LDcgQEAgdnRhYmxlLWluc2VydAogICAgICAgICAgOzsgV2UgbWFpbnRhaW4gYSBjYWNoZSBw
ZXIgc2NyZWVuL3dpbmRvdyB3aWR0aCwgc28gdGhhdCB3ZSByZW5kZXIKICAgICAgICAgIDs7IGNv
cnJlY3RseSBpZiBFbWFjcyBpcyBvcGVuIG9uIHR3byBkaWZmZXJlbnQgc2NyZWVucyAob3IgdGhl
CiAgICAgICAgICA7OyB1c2VyIHJlc2l6ZXMgdGhlIGZyYW1lKS4KLSAgICAgICAgICh3aWR0aHMg
KG50aCAxICh2dGFibGUtLWVuc3VyZS1jYWNoZSB0YWJsZSkpKSkKKyAgICAgICAgICh3aWR0aHMg
KHZ0YWJsZS0tY2FjaGUtd2lkdGhzIGNhY2hlKSkpCiAgICAgOzsgRG9uJ3QgaW5zZXJ0IGFueSBo
ZWFkZXIgb3IgaGVhZGVyIGxpbmUgaWYgdGhlIHVzZXIgaGFzbid0CiAgICAgOzsgc3BlY2lmaWVk
IHRoZSBjb2x1bW5zLgogICAgICh3aGVuIChzbG90LXZhbHVlIHRhYmxlICctaGFzLWNvbHVtbi1z
cGVjKQpAQCAtNTUxLDcgKzYwMyw3IEBAIHZ0YWJsZS1pbnNlcnQKICAgICAodnRhYmxlLS1zb3J0
IHRhYmxlKQogICAgIDs7IEluc2VydCB0aGUgZGF0YS4KICAgICAobGV0ICgobGluZS1udW1iZXIg
MCkpCi0gICAgICAoZG9saXN0IChsaW5lIChjYXIgKHZ0YWJsZS0tY2FjaGUgdGFibGUpKSkKKyAg
ICAgIChkb2xpc3QgKGxpbmUgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpKQogICAgICAgICAo
dnRhYmxlLS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIGxpbmUtbnVtYmVyIHdpZHRocyBzcGFjZXIK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMgZWxsaXBzaXMtd2lkdGgpCiAg
ICAgICAgIChzZXRxIGxpbmUtbnVtYmVyICgxKyBsaW5lLW51bWJlcikpKSkKQEAgLTY2NywxOCAr
NzE5LDI2IEBAIHZ0YWJsZS0tY2xlYXItY2FjaGUKIAogKGRlZnVuIHZ0YWJsZS0tc29ydCAodGFi
bGUpCiAgIChwY2FzZS1kb2xpc3QgKGAoLGluZGV4IC4gLGRpcmVjdGlvbikgKHZ0YWJsZS1zb3J0
LWJ5IHRhYmxlKSkKLSAgICAobGV0ICgoY2FjaGUgKHZ0YWJsZS0tY2FjaGUgdGFibGUpKQotICAg
ICAgICAgIChudW1lcmljYWwgKHZ0YWJsZS1jb2x1bW4tLW51bWVyaWNhbAotICAgICAgICAgICAg
ICAgICAgICAgIChlbHQgKHZ0YWJsZS1jb2x1bW5zIHRhYmxlKSBpbmRleCkpKQorICAgIChsZXQq
ICgoY2FjaGUgKHZ0YWJsZS0tZW5zdXJlLWNhY2hlIHRhYmxlKSkKKyAgICAgICAgICAgKGNvbHVt
biAoZWx0ICh2dGFibGUtY29sdW1ucyB0YWJsZSkgaW5kZXgpKQorICAgICAgICAgICAobnVtZXJp
Y2FsICh2dGFibGUtY29sdW1uLS1udW1lcmljYWwgY29sdW1uKSkKICAgICAgICAgICAgKG51bWNv
bXAgKGlmIChlcSBkaXJlY3Rpb24gJ2Rlc2NlbmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAj
Jz4gIyc8KSkKICAgICAgICAgICAgKHN0cmluZ2NvbXAgKGlmIChlcSBkaXJlY3Rpb24gJ2Rlc2Nl
bmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICMnc3RyaW5nPiAjJ3N0cmluZzwpKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICMnc3RyaW5nPiAjJ3N0cmluZzwpKQorICAgICAgICAg
ICAoY29tcGFyYXRvciAodnRhYmxlLWNvbHVtbi1jb21wYXJhdG9yIGNvbHVtbikpCisgICAgICAg
ICAgIChjb21wYXJhdG9yLWZ1bmMgKHdoZW4gY29tcGFyYXRvcgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGlmIChlcSBkaXJlY3Rpb24gJ2Rlc2NlbmQpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKGxhbWJkYSAodjEgdjIpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoZnVuY2FsbCBjb21wYXJhdG9yIHYyIHYxKSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgY29tcGFyYXRvcikpKSkKICAgICAgIChzZXRjYXIgY2FjaGUKLSAg
ICAgICAgICAgICAgKHNvcnQgKGNhciBjYWNoZSkKKyAgICAgICAgICAgICAgKHNvcnQgKHZ0YWJs
ZS0tY2FjaGUtbGluZXMgY2FjaGUpCiAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGUxIGUy
KQogICAgICAgICAgICAgICAgICAgICAgIChsZXQgKChjMSAoZWx0IGUxICgxKyBpbmRleCkpKQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMiAoZWx0IGUyICgxKyBpbmRleCkpKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIChpZiBjb21wYXJhdG9yLWZ1bmMKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoZnVuY2FsbCBjb21wYXJhdG9yLWZ1bmMgKGNhciBjMSkgKGNhciBjMikp
CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBudW1lcmljYWwKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIChmdW5jYWxsIG51bWNvbXAgKGNhciBjMSkgKGNhciBjMikpCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwKQEAgLTY4OCw3ICs3NDgsNyBAQCB2dGFi
bGUtLXNvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ICIlcyIgKGNh
ciBjMSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKHN0cmluZ3AgKGNhciBj
MikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIGMyKQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ICIlcyIgKGNhciBjMikpKSkpKSkpKSkpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQgIiVzIiAoY2FyIGMyKSkpKSkpKSkp
KSkpKQogCiAoZGVmdW4gdnRhYmxlLS1pbmRpY2F0b3IgKHRhYmxlIGluZGV4KQogICAobGV0ICgo
b3JkZXIgKGNhciAobGFzdCAodnRhYmxlLXNvcnQtYnkgdGFibGUpKSkpKQpAQCAtODYwLDcgKzky
MCw4IEBAIHZ0YWJsZS0tY29tcHV0ZS13aWR0aAogICAgICgvICgqIChzdHJpbmctdG8tbnVtYmVy
IChtYXRjaC1zdHJpbmcgMSBzcGVjKSkgKHdpbmRvdy13aWR0aCBuaWwgdCkpCiAgICAgICAgMTAw
KSkKICAgICh0Ci0gICAgKGVycm9yICJJbnZhbGlkIHNwZWM6ICVzIiBzcGVjKSkpKQorICAgIChl
cnJvciAiSW52YWxpZCBzcGVjOiAlcyAodnRhYmxlIGAlcycpIgorICAgICAgICAgICBzcGVjICh2
dGFibGUtbmFtZSB0YWJsZSkpKSkpCiAKIChkZWZ1biB2dGFibGUtLWNvbXB1dGUtd2lkdGhzICh0
YWJsZSBjYWNoZSkKICAgIkNvbXB1dGUgdGhlIGRpc3BsYXkgd2lkdGhzIGZvciBUQUJMRS4KQEAg
LTk3Miw3ICsxMDMzLDEzIEBAIHZ0YWJsZS1yZXZlcnQKICAgICAgICh2dGFibGUtZ290by1jb2x1
bW4gY29sdW1uKSkpKQogCiAoZGVmdW4gdnRhYmxlLS13aWR0aHMgKHRhYmxlKQotICAobnRoIDEg
KHZ0YWJsZS0tZW5zdXJlLWNhY2hlIHRhYmxlKSkpCisgICh2dGFibGUtLWNhY2hlLXdpZHRocyAo
dnRhYmxlLS1lbnN1cmUtY2FjaGUgdGFibGUpKSkKKworKGRlZnVuIHZ0YWJsZS0tY2FjaGUtd2lk
dGhzIChjYWNoZSkKKyAgKG50aCAxIGNhY2hlKSkKKworKGRlZnVuIHZ0YWJsZS0tY2FjaGUtbGlu
ZXMgKGNhY2hlKQorICAoY2FyIGNhY2hlKSkKIAogOzs7IENvbW1hbmRzLgogCmRpZmYgLS1naXQg
YS90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMuZWwgYi90ZXN0L2xpc3AvZW1hY3Mt
bGlzcC92dGFibGUtdGVzdHMuZWwKaW5kZXggNzRmYjhjYzgxMzkuLjZlM2MwOWUxNGRlIDEwMDY0
NAotLS0gYS90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMuZWwKKysrIGIvdGVzdC9s
aXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsCkBAIC0yNyw3ICsyNyw3IEBACiAocmVxdWly
ZSAnZXJ0KQogKHJlcXVpcmUgJ2VydC14KQogCi0oZXJ0LWRlZnRlc3QgdGVzdC12c3RhYmxlLWNv
bXB1dGUtY29sdW1ucyAoKQorKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLWNvbXB1dGUtY29sdW1u
cyAoKQogICAoc2hvdWxkCiAgICAoZXF1YWwgKG1hcGNhcgogICAgICAgICAgICAobGFtYmRhIChj
b2x1bW4pCkBAIC02OSw0ICs2OSwxMDggQEAgdGVzdC12dGFibGUtaW5zZXJ0LW9iamVjdAogICAg
ICAgICAgICAgICAobWFwY2FyICMnY2FkciAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkpCiAgICAg
ICAgICAgKG51bWJlci1zZXF1ZW5jZSAwIDExKSkpKQogCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFi
bGUtdXBkYXRlLW9iamVjdCAoKQorICAobGV0ICgoYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAi
KnZ0YWJsZS10ZXN0KiIpKSkKKyAgICAocG9wLXRvLWJ1ZmZlciBidWZmZXIpCisgICAgKGVyYXNl
LWJ1ZmZlcikKKyAgICAobGV0KiAoKG9iamVjdDEgKGNvbnMgIlhYWCIgMSkpCisgICAgICAgICAg
IChvYmplY3QyIChjb25zICJZWVkiIDIpKQorICAgICAgICAgICAodGFibGUKKyAgICAgICAgICAg
IChtYWtlLXZ0YWJsZQorICAgICAgICAgICAgIDp1c2UtaGVhZGVyLWxpbmUgbmlsCisgICAgICAg
ICAgICAgOm9iamVjdC1lcXVhbCAjJ2VxIDsgSWRlbnRpdHkuCisgICAgICAgICAgICAgOmNvbHVt
bnMgJygoOm5hbWUgIlhYWCIpKQorICAgICAgICAgICAgIDpvYmplY3RzIChsaXN0IG9iamVjdDEg
b2JqZWN0MikpKSkKKyAgICAgIChzaG91bGQtZXJyb3IgKHZ0YWJsZS11cGRhdGUtb2JqZWN0IHRh
YmxlICJaWloiKSkKKyAgICAgIChzZXRjZHIgb2JqZWN0MSAzKQorICAgICAgKHZ0YWJsZS11cGRh
dGUtb2JqZWN0IHRhYmxlIG9iamVjdDEpCisgICAgICAoc2hvdWxkIChlcSAzIChjZHIgKGFzc29j
ICJYWFgiICh2dGFibGUtb2JqZWN0cyB0YWJsZSkpKSkpKSkpCisKKyhlcnQtZGVmdGVzdCB0ZXN0
LXZ0YWJsZS1yZW1vdmUtb2JqZWN0ICgpCisgIChsZXQgKChidWZmZXIgKGdldC1idWZmZXItY3Jl
YXRlICIqdnRhYmxlLXRlc3QqIikpKQorICAgIChwb3AtdG8tYnVmZmVyIGJ1ZmZlcikKKyAgICAo
ZXJhc2UtYnVmZmVyKQorICAgIChsZXQqICgob2JqZWN0MSAoY29ucyAiWFhYIiAxKSkKKyAgICAg
ICAgICAgKG9iamVjdDIgKGNvbnMgIllZWSIgMikpCisgICAgICAgICAgICh0YWJsZQorICAgICAg
ICAgICAgKG1ha2UtdnRhYmxlCisgICAgICAgICAgICAgOnVzZS1oZWFkZXItbGluZSBuaWwKKyAg
ICAgICAgICAgICA6b2JqZWN0LWVxdWFsICMnZXEgOyBJZGVudGl0eS4KKyAgICAgICAgICAgICA6
Y29sdW1ucyAnKCg6bmFtZSAiWFhYIikpCisgICAgICAgICAgICAgOm9iamVjdHMgKGxpc3Qgb2Jq
ZWN0MSBvYmplY3QyKSkpKQorICAgICAgKHNob3VsZC1lcnJvciAodnRhYmxlLXJlbW92ZS1vYmpl
Y3QgdGFibGUgIlpaWiIpKQorICAgICAgKHZ0YWJsZS1yZW1vdmUtb2JqZWN0IHRhYmxlIG9iamVj
dDEpCisgICAgICAoc2hvdWxkIChlcSAxIChsZW5ndGggKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkp
KSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtb2JqZWN0LWVxdWFsICgpCisgIChsZXQg
KChidWZmZXIgKGdldC1idWZmZXItY3JlYXRlICIqdnRhYmxlLXRlc3QqIikpKQorICAgIChwb3At
dG8tYnVmZmVyIGJ1ZmZlcikKKyAgICAoZXJhc2UtYnVmZmVyKQorICAgIChsZXQqICgob2JqZWN0
MSAiWFhYIikKKyAgICAgICAgICAgKG9iamVjdDIgIlhYWCIpCisgICAgICAgICAgICh0YWJsZS1l
cQorICAgICAgICAgICAgKHByb2duCisgICAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1h
eCkpCisgICAgICAgICAgICAgIChtYWtlLXZ0YWJsZQorICAgICAgICAgICAgICAgOnVzZS1oZWFk
ZXItbGluZSBuaWwKKyAgICAgICAgICAgICAgIDpjb2x1bW5zICcoKDpuYW1lICJ0YWJsZS1lcSIg
OndpZHRoIDIwKSkKKyAgICAgICAgICAgICAgIDpvYmplY3QtZXF1YWwgIydlcSA7IElkZW50aXR5
LgorICAgICAgICAgICAgICAgOm9iamVjdHMgKGxpc3Qgb2JqZWN0MSBvYmplY3QyKSkpKQorICAg
ICAgICAgICAodGFibGUtZXF1YWwKKyAgICAgICAgICAgIChwcm9nbgorICAgICAgICAgICAgICAo
Z290by1jaGFyIChwb2ludC1tYXgpKQorICAgICAgICAgICAgICAobWFrZS12dGFibGUKKyAgICAg
ICAgICAgICAgIDp1c2UtaGVhZGVyLWxpbmUgbmlsCisgICAgICAgICAgICAgICA6Y29sdW1ucyAn
KCg6bmFtZSAidGFibGUtZXF1YWwiIDp3aWR0aCAyMCkpCisgICAgICAgICAgICAgICA6b2JqZWN0
LWVxdWFsICMnZXF1YWwgOyBWYWx1ZS4KKyAgICAgICAgICAgICAgIDpvYmplY3RzIChsaXN0IG9i
amVjdDEgb2JqZWN0MikpKSkpCisgICAgICAoc2hvdWxkCisgICAgICAgKHByb2duCisgICAgICAg
ICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUtZXEpCisgICAgICAgICAodnRhYmxlLWdvdG8tb2Jq
ZWN0IG9iamVjdDIpCisgICAgICAgICAoZXF1YWwgb2JqZWN0MiAoZ2V0LXRleHQtcHJvcGVydHkg
KHBvaW50KSAndnRhYmxlLW9iamVjdCkpKSkKKyAgICAgIChzaG91bGQtbm90CisgICAgICAgKHBy
b2duCisgICAgICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUtZXEpCisgICAgICAgICAodnRh
YmxlLWdvdG8tb2JqZWN0ICJaWloiKQorICAgICAgICAgKGVxdWFsIG9iamVjdDEgKGdldC10ZXh0
LXByb3BlcnR5IChwb2ludCkgJ3Z0YWJsZS1vYmplY3QpKSkpCisgICAgICAoc2hvdWxkCisgICAg
ICAgKHByb2duCisgICAgICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUtZXF1YWwpCisgICAg
ICAgICAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVjdDIpCisgICAgICAgICAoZXF1YWwgb2JqZWN0
MSAoZ2V0LXRleHQtcHJvcGVydHkgKHBvaW50KSAndnRhYmxlLW9iamVjdCkpKSkKKyAgICAgIChz
aG91bGQtbm90CisgICAgICAgKHByb2duCisgICAgICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFi
bGUtZXF1YWwpCisgICAgICAgICAodnRhYmxlLWdvdG8tb2JqZWN0ICJaWloiKQorICAgICAgICAg
KGVxdWFsIG9iamVjdDEgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ3Z0YWJsZS1vYmplY3Qp
KSkpKSkpCisKKyhlcnQtZGVmdGVzdCB0ZXN0LXZ0YWJsZS1jb2x1bW4tY29tcGFyYXRvciAoKQor
ICAobGV0ICgoYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAiKnZ0YWJsZS10ZXN0KiIpKSkKKyAg
ICAocG9wLXRvLWJ1ZmZlciBidWZmZXIpCisgICAgKGVyYXNlLWJ1ZmZlcikKKyAgICAobGV0ICgo
dGFibGUKKyAgICAgICAgICAgKG1ha2UtdnRhYmxlCisgICAgICAgICAgICA6dXNlLWhlYWRlci1s
aW5lIHQKKyAgICAgICAgICAgIDpnZXR0ZXIgKGxhbWJkYSAob2JqZWN0IF9pbmRleCBfdGFibGUp
IG9iamVjdCkKKyAgICAgICAgICAgIDpjb2x1bW5zICcoKCA6bmFtZSAiRGF0ZSIKKyAgICAgICAg
ICAgICAgICAgICAgICAgICA6cHJpbWFyeSBhc2NlbmQKKyAgICAgICAgICAgICAgICAgICAgICAg
ICA6d2lkdGggNDAKKyAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9ybWF0dGVyIChsYW1iZGEg
KG9iamVjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCAoKHRp
bWUgKGRhdGUtdG8tdGltZSBvYmplY3QpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoZm9ybWF0ICIlcyAoJWQpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdC10aW1lLXN0cmluZyAiJUEsICVCICVkICVZIiB0
aW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNh
ciB0aW1lKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgIDpjb21wYXJhdG9yIChsYW1iZGEg
KG9iamVjdDEgb2JqZWN0MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChsZXQgKCh0aW1lMSAoZGF0ZS10by10aW1lIG9iamVjdDEpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWUyIChkYXRlLXRvLXRpbWUgb2JqZWN0Mikp
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPCAoY2FyIHRpbWUx
KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIHRpbWUy
KSkpKSkpCisgICAgICAgICAgICA6b2JqZWN0cyAnKCJGcmksIDExIEp1bCAyMDI1IgorICAgICAg
ICAgICAgICAgICAgICAgICAiVGh1LCAxMCBKdWwgMjAyNSIpKSkpCisgICAgICAoc2hvdWxkCisg
ICAgICAgKHN0cmluZz0KKyAgICAgICAgIlRodXJzZGF5IgorICAgICAgICAodGhpbmctYXQtcG9p
bnQgJ3dvcmQpKSkpKSkKKwogOzs7IHZ0YWJsZS10ZXN0cy5lbCBlbmRzIGhlcmUKLS0gCjIuNDcu
MQoK
--000000000000414fa80639e87937--




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

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


Received: (at submit) by debbugs.gnu.org; 13 Jul 2025 18:07:08 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Sun Jul 13 14:07:08 2025
Received: from localhost ([127.0.0.1]:55318 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ub16S-0001Ky-2P
	for submit <at> debbugs.gnu.org; Sun, 13 Jul 2025 14:07:08 -0400
Received: from lists.gnu.org ([2001:470:142::17]:34090)
 by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.84_2) (envelope-from <shipmints@HIDDEN>)
 id 1ub16P-0001K6-IG
 for submit <at> debbugs.gnu.org; Sun, 13 Jul 2025 14:07:05 -0400
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 1ub169-0001Nd-5n
 for bug-gnu-emacs@HIDDEN; Sun, 13 Jul 2025 14:06:49 -0400
Received: from mail-vk1-xa2f.google.com ([2607:f8b0:4864:20::a2f])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <shipmints@HIDDEN>)
 id 1ub166-0005Io-1w
 for bug-gnu-emacs@HIDDEN; Sun, 13 Jul 2025 14:06:48 -0400
Received: by mail-vk1-xa2f.google.com with SMTP id
 71dfb90a1353d-528ce9731dbso1483492e0c.0
 for <bug-gnu-emacs@HIDDEN>; Sun, 13 Jul 2025 11:06:44 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1752430003; x=1753034803; darn=gnu.org;
 h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject
 :date:message-id:reply-to;
 bh=5DT44fq8qcyRvgyaewlN1qySm4mi5JSCp1aEVwZ86wk=;
 b=dIAOKoZ/bJRjT6vqcL4Hg1iyMwBkWrlq7PPMGoT9NwAJeOjjdtChXfpfe/pk463cuv
 Da3bHldRdyorFhLOwxZoFGf075zgJdXaQDQ9T9fsJ6IE4FH/w9taN8RT7zrtXkr9QNAX
 5AStK7SF5Com0iS/I0j94rTlWwMUIf4iCSs2GmtUA3EdGI8KjLxNP7JTF6L2AY8dk9v7
 7suCFxVrOhncdLFidWdPyvjtheeXjL3w4MvdFPhUT7COvLlozWxE3az3rW/Qg+TefqHc
 mnFeCMto15sy5jT1nuVWEhHzpJ5NfaYsjkCn+ihJzCYuvZNi8AdPM6kIk4/lcNxgpxG/
 kPKw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1752430003; x=1753034803;
 h=cc:to:subject:message-id:date:from:mime-version:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=5DT44fq8qcyRvgyaewlN1qySm4mi5JSCp1aEVwZ86wk=;
 b=h0/EITZX6LliQBwbDwjvpObH5xlHPnFw6ND7Xf8KAgJ9A2OOMEP2XmCkzqLtV/yTsz
 lUYtVG6/wK5izmp9WhXGjSjAw0ae7NEGV6BCQNbDmShwinEi6nEBtgdRROV5FS4+Y/n7
 Wus4xmo+9y1pR0j+TKB0+9pYBa3z0CcnW7smVZIQsvmiiGI7tMTyS+wRY+UMSlLFF5MN
 5nY8gqXN515Po4YCNyjrja2N5Y9d7Sq7rGGLWTKg3HpjrMybmEG/ZC4/vLfZYmexpAvm
 raL5SLAJG0qUmCmAL/PVoE7KSMgBgi1SKpbxIoMHb0xNo8eqSycEBVJIgyQi2PkHK0sb
 sHKQ==
X-Gm-Message-State: AOJu0YwkxjSnW7NTDn6X+gp1u3kIWHDtQr8b0BbvoiCONHEYh0VatSKF
 UTIPbi2hnKgcZfMCh9n5e4sVqdfnWKRhsAA/p3OwqvvFem+jx/JSyWDhmBm3wagSuRsQDRZ8M+4
 trxs2C+Xwyp6zRjnxrRiqAxZkCOWlFhls60Qj
X-Gm-Gg: ASbGncs4otAJtuffvFAujI8Xo90OF9aBmOy6FRA5o6q+80YOBoeJn8yuxzXtmj0+ecl
 NDsHtR+t3prbtNP6xAorEtCFPBV9yugJUjyw9Akp6HEm6gaITmIDoy4ofUv7jZ00cnQYf158Dnh
 aJHH827eHm2YGE4MZZj2411Nbe3senWc/9askrVaqCp4aIOoV6hHu4WMeFplzsTl32itVuH/xM5
 ryx4GVzRg==
X-Google-Smtp-Source: AGHT+IFi/Ty4dl0SsIT9izrtdnAvyReSjrv3qcKySKh4ZP0+8+hZbxDCb/E5S1p4UBC4Tcv60aJ0Dhp35saa+YlgOAg=
X-Received: by 2002:a05:6122:82a6:b0:531:2afc:4637 with SMTP id
 71dfb90a1353d-535f48f2339mr6539322e0c.9.1752430003187; Sun, 13 Jul 2025
 11:06:43 -0700 (PDT)
MIME-Version: 1.0
From: =?UTF-8?Q?St=C3=A9phane_Marks?= <shipmints@HIDDEN>
Date: Sun, 13 Jul 2025 14:06:31 -0400
X-Gm-Features: Ac12FXw8V6GMcbWDaYuw9gEPG3mcevYtDh1SGKeGI4RXHuN5i-IMObilNuxpzOM
Message-ID: <CAN+1HbrLkmV6QYfJPcEv-EeX6T1tiNogG41GkCw8aMxdt4GmkA@HIDDEN>
Subject: [PATCH] Improve 'vtable' object handling, cache handling, messages
To: bug-gnu-emacs@HIDDEN
Content-Type: multipart/mixed; boundary="000000000000d5919c0639d367f0"
Received-SPF: pass client-ip=2607:f8b0:4864:20::a2f;
 envelope-from=shipmints@HIDDEN; helo=mail-vk1-xa2f.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: 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: -0.0 (/)

--000000000000d5919c0639d367f0
Content-Type: multipart/alternative; boundary="000000000000d5919b0639d367ee"

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

Attached is the first "smaller" patch to converge on the fixed and upgraded
vtable presented elsewhere under bug 78843.  I'd like for us to consider
this patch size for vtable acceptable, and to review it in short order to
accommodate getting the next patch sets to follow quickly after this one.
I'd prefer this not take until the autumn (in the northern hemisphere).

If any of you cc'd here do not want to be cc'd on other patches, let me
know.  You're the ones who I've seen use vtable in the wild, or have
submitted bug reports.  All of your issues have been addressed, though not
necessarily in this first patch.  Refer to bug 78843 to see the fixed and
upgraded vtable intended to converge here.

Thanks in advance and good summer regards,

-St=C3=A9phane

--000000000000d5919b0639d367ee
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">Attached is the first &quot;smaller&quot; patch to converge on the fixed=
 and upgraded vtable presented elsewhere under bug 78843.=C2=A0 I&#39;d lik=
e for us to consider this patch size for vtable acceptable, and to review i=
t in short order to accommodate getting the next patch sets to follow quick=
ly after this one.=C2=A0 I&#39;d prefer this not take until the autumn (in =
the northern hemisphere).</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">If any of you cc&#39;d here do not want to be cc&#39;d on othe=
r patches, let me know.=C2=A0 You&#39;re the ones who I&#39;ve seen use vta=
ble in the wild,=C2=A0or have submitted bug reports.=C2=A0 All of your issu=
es have been addressed, though not necessarily in this first=C2=A0patch.=C2=
=A0 Refer to bug 78843 to see the fixed and upgraded vtable intended to con=
verge here.</div><div class=3D"gmail_default" style=3D"font-family:monospac=
e"><br></div><div class=3D"gmail_default" style=3D"font-family:monospace">T=
hanks in advance and good summer regards,</div><div class=3D"gmail_default"=
 style=3D"font-family:monospace"><br></div><div class=3D"gmail_default" sty=
le=3D"font-family:monospace">-St=C3=A9phane</div></div>

--000000000000d5919b0639d367ee--

--000000000000d5919c0639d367f0
Content-Type: application/octet-stream; 
	name="0001-Improve-vtable-object-handling-cache-handling-messag.patch"
Content-Disposition: attachment; 
	filename="0001-Improve-vtable-object-handling-cache-handling-messag.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_md1z7cij0>
X-Attachment-Id: f_md1z7cij0

RnJvbSBlMDBlM2RkODIwNGVhZGEwYTI4M2ZlOWRlYjY2Y2I2NjMwZDExNjg5IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/U3Q9QzM9QTlwaGFuZT0yME1hcmtzPz0gPHNo
aXBtaW50c0BnbWFpbC5jb20+CkRhdGU6IFN1biwgMTMgSnVsIDIwMjUgMTM6MzI6MjggLTA0MDAK
U3ViamVjdDogW1BBVENIXSBJbXByb3ZlICd2dGFibGUnIG9iamVjdCBoYW5kbGluZywgY2FjaGUg
aGFuZGxpbmcsIG1lc3NhZ2VzCgpBZGQgb2JqZWN0IGVxdWFsaXR5IGZ1bmN0aW9uIG92ZXJyaWRl
IChkZWZhdWx0cyB0byBleGlzdGluZyAnZXEnCmJlaGF2aW9yKS4gIEFkZCBjb2x1bW4gY29tcGFy
YXRvciB0byBhZGRyZXNzIG9iamVjdApzb3J0aW5nIChkZWZhdWx0cyB0byBleGlzdGluZyBiZWhh
dmlvcikuICBBZGQgZHVwbGljYXRlIG9iamVjdApoYW5kbGluZyAoZGVmYXVsdHMgdG8gYWxsb3dp
bmcgZHVwbGljYXRlcykuICBDb3JyZWN0IGNhY2hlCnJlZmVyZW5jZXMgdG8gcHJpbWUgdGhlIGNh
Y2hlIGFzIG5lZWRlZC4gIEFkZCBjYWNoZSBhY2Nlc3NvcgpmdW5jdGlvbnMuICBBZGQgdGFibGUg
bmFtZSBzbG90IHRvIGltcHJvdmUgZXJyb3JzIGFuZAptZXNzYWdlcyAoZGVmYXVsdHMgdG8gIip2
dGFibGUqIikuCgpBZGRlZCB0ZXN0cy4KCiogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAodnRh
YmxlLWNvbHVtbik6IEFkZCBjb21wYXJhdG9yCnNsb3QuCih2dGFibGUpOiBBZGQgbmFtZSwgb2Jq
ZWN0LWVxdWFsLCBkdXBsaWNhdGUtb2JqZWN0cyBzbG90cy4KKG1ha2UtdnRhYmxlKTogSW5pdGlh
bGl6ZSBuZXcgc2xvdHMuCih2dGFibGUtZ290by1vYmplY3QpOiBVc2Ugb2JqZWN0LWVxdWFsLgoo
dnRhYmxlLXVwZGF0ZS1vYmplY3QpOiBVc2Ugb2JqZWN0LWVxdWFsLCBoYW5kbGUgZHVwbGljYXRl
Cm9iamVjdHMsIHVzZSBjYWNoZSBhY2Nlc3NvciwgaW1wcm92ZSBtZXNzYWdlcy4KKHZ0YWJsZS1y
ZW1vdmUtb2JqZWN0KTogVXNlIG9iamVjdC1lcXVhbCwgcHJpbWUgY2FjaGUsIHVzZSBjYWNoZQpm
dW5jdGlvbnMsIGltcHJvdmUgbWVzc2FnZXMuCih2dGFibGUtaW5zZXJ0LW9iamVjdCk6IFVzZSBv
YmplY3QtZXF1YWwsIGhhbmRsZSBkdXBsaWNhdGUKb2JqZWN0cywgdXNlIGNhY2hlIGFjY2Vzc29y
LCBpbXByb3ZlIG1lc3NhZ2VzLgoodnRhYmxlLS1zb21lLW9iamVjdHMpOiBOZXcgZGVmdW4uCih2
dGFibGUtLWhhbmRsZS1kdXBsaWNhdGUtb2JqZWN0KTogTmV3IGRlZnVuLgoodnRhYmxlLWluc2Vy
dCk6IFByaW1lIGNhY2hlLCB1c2UgY2FjaGUgYWNjZXNzb3IuCih2dGFibGUtLXNvcnQpOiBVc2Ug
Y29sdW1uIGNvbXBhcmF0b3IsIHByaW1lIGNhY2hlLCB1c2UgY2FjaGUKYWNjZXNzb3IuCih2dGFi
bGUtLWNvbXB1dGUtd2lkdGgpOiBJbXByb3ZlIG1lc3NhZ2UuCih2dGFibGUtLXdpZHRocyk6IFVz
ZSBjYWNoZSBhY2Nlc3Nvci4KCiogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVs
Cih0ZXN0LXZzdGFibGUtY29tcHV0ZS1jb2x1bW5zKTogUmVuYW1lZCB0bwp0ZXN0LXZ0YWJsZS1j
b21wdXRlLWNvbHVtbnMuCih0ZXN0LXZ0YWJsZS1pbnNlcnQtb2JqZWN0KTogQ2hhbmdlZCBidWZm
ZXIgbmFtZSB0byBub24taGlkZGVuLgoodGVzdC12dGFibGUtZHVwbGljYXRlLW9iamVjdCwgdGVz
dC12dGFibGUtdXBkYXRlLW9iamVjdCkKKHRlc3QtdnRhYmxlLXJlbW92ZS1vYmplY3QsIHRlc3Qt
dnRhYmxlLW9iamVjdC1lcXVhbCkKKHRlc3QtdnRhYmxlLWNvbHVtbi1jb21wYXJhdG9yKTogTmV3
IHRlc3QuCi0tLQogbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5lbCAgICAgICAgICAgIHwgNDQxICsr
KysrKysrKysrKysrKysrLS0tLS0tLS0tLQogdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRl
c3RzLmVsIHwgMTMwICsrKysrKystCiAyIGZpbGVzIGNoYW5nZWQsIDQwMSBpbnNlcnRpb25zKCsp
LCAxNzAgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGlzcC9lbWFjcy1saXNwL3Z0YWJsZS5l
bCBiL2xpc3AvZW1hY3MtbGlzcC92dGFibGUuZWwKaW5kZXggMDA3ODUxMTNlZGIuLmY0YmU5MDYy
MGNlIDEwMDY0NAotLS0gYS9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLmVsCisrKyBiL2xpc3AvZW1h
Y3MtbGlzcC92dGFibGUuZWwKQEAgLTQ1LDE0ICs0NSwyMCBAQCB2dGFibGUtY29sdW1uCiAgIGdl
dHRlcgogICBmb3JtYXR0ZXIKICAgZGlzcGxheWVyCisgIGNvbXBhcmF0b3IKICAgLW51bWVyaWNh
bAogICAtYWxpZ25lZCkKIAogKGRlZmNsYXNzIHZ0YWJsZSAoKQotICAoKGNvbHVtbnMgOmluaXRh
cmcgOmNvbHVtbnMgOmFjY2Vzc29yIHZ0YWJsZS1jb2x1bW5zKQorICAoKG5hbWUgOmluaXRhcmcg
Om5hbWUgOmFjY2Vzc29yIHZ0YWJsZS1uYW1lKQorICAgKGNvbHVtbnMgOmluaXRhcmcgOmNvbHVt
bnMgOmFjY2Vzc29yIHZ0YWJsZS1jb2x1bW5zKQogICAgKG9iamVjdHMgOmluaXRhcmcgOm9iamVj
dHMgOmFjY2Vzc29yIHZ0YWJsZS1vYmplY3RzKQogICAgKG9iamVjdHMtZnVuY3Rpb24gOmluaXRh
cmcgOm9iamVjdHMtZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAgIDphY2Nlc3NvciB2dGFi
bGUtb2JqZWN0cy1mdW5jdGlvbikKKyAgIChvYmplY3QtZXF1YWwgOmluaXRhcmcgOm9iamVjdC1l
cXVhbAorICAgICAgICAgICAgICAgICA6YWNjZXNzb3IgdnRhYmxlLW9iamVjdC1lcXVhbCkKKyAg
IChkdXBsaWNhdGUtb2JqZWN0cyA6aW5pdGFyZyA6ZHVwbGljYXRlLW9iamVjdHMKKyAgICAgICAg
ICAgICAgICAgICAgICA6YWNjZXNzb3IgdnRhYmxlLWR1cGxpY2F0ZS1vYmplY3RzKQogICAgKGdl
dHRlciA6aW5pdGFyZyA6Z2V0dGVyIDphY2Nlc3NvciB2dGFibGUtZ2V0dGVyKQogICAgKGZvcm1h
dHRlciA6aW5pdGFyZyA6Zm9ybWF0dGVyIDphY2Nlc3NvciB2dGFibGUtZm9ybWF0dGVyKQogICAg
KGRpc3BsYXllciA6aW5pdGFyZyA6ZGlzcGxheWVyIDphY2Nlc3NvciB2dGFibGUtZGlzcGxheWVy
KQpAQCAtODYsMjEgKzkyLDI3IEBAIHZ0YWJsZS1oZWFkZXItbGluZS1tYXAKICAgIjxmb2xsb3ct
bGluaz4iICdtb3VzZS1mYWNlCiAgICI8bW91c2UtMj4iICMndnRhYmxlLWhlYWRlci1saW5lLXNv
cnQpCiAKLShjbC1kZWZ1biBtYWtlLXZ0YWJsZSAoJmtleSBjb2x1bW5zIG9iamVjdHMgb2JqZWN0
cy1mdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRlcgotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRpc3BsYXllcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2UtaGVhZGVyLWxpbmUg
dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmFjZSAndnRhYmxlKQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGFjdGlvbnMga2V5bWFwCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKHNlcGFyYXRvci13aWR0aCAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRp
dmlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpZGVyLXdpZHRoCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc29ydC1ieQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChlbGxpcHNpcyB0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnNlcnQgdCkKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICByb3ctY29sb3JzCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29sdW1uLWNvbG9ycykKKyhjbC1kZWZ1biBtYWtlLXZ0YWJsZSAoJmtleQorICAg
ICAgICAgICAgICAgICAgICAgICAobmFtZSAiKnZ0YWJsZSoiKQorICAgICAgICAgICAgICAgICAg
ICAgICBjb2x1bW5zCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMKKyAgICAgICAgICAg
ICAgICAgICAgICAgb2JqZWN0cy1mdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAob2Jq
ZWN0LWVxdWFsICMnZXEpCisgICAgICAgICAgICAgICAgICAgICAgIChkdXBsaWNhdGUtb2JqZWN0
cyAnYWxsb3cpCisgICAgICAgICAgICAgICAgICAgICAgIGdldHRlcgorICAgICAgICAgICAgICAg
ICAgICAgICBmb3JtYXR0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVyCisgICAg
ICAgICAgICAgICAgICAgICAgICh1c2UtaGVhZGVyLWxpbmUgdCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgKGZhY2UgJ3Z0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucyBrZXlt
YXAKKyAgICAgICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci13aWR0aCAxKQorICAgICAgICAg
ICAgICAgICAgICAgICBkaXZpZGVyCisgICAgICAgICAgICAgICAgICAgICAgIGRpdmlkZXItd2lk
dGgKKyAgICAgICAgICAgICAgICAgICAgICAgc29ydC1ieQorICAgICAgICAgICAgICAgICAgICAg
ICAoZWxsaXBzaXMgdCkKKyAgICAgICAgICAgICAgICAgICAgICAgKGluc2VydCB0KQorICAgICAg
ICAgICAgICAgICAgICAgICByb3ctY29sb3JzCisgICAgICAgICAgICAgICAgICAgICAgIGNvbHVt
bi1jb2xvcnMpCiAgICJDcmVhdGUgYW5kIGluc2VydCBhIHZ0YWJsZSBhdCBwb2ludC4KIFRoZSB2
dGFibGUgb2JqZWN0IGlzIHJldHVybmVkLiAgSWYgSU5TRVJUIGlzIG5pbCwgdGhlIHRhYmxlIHdv
bid0CiBiZSBpbnNlcnRlZC4KQEAgLTExMyw4ICsxMjUsMTEgQEAgbWFrZS12dGFibGUKICAgKGxl
dCAoKHRhYmxlCiAgICAgICAgICAobWFrZS1pbnN0YW5jZQogICAgICAgICAgICd2dGFibGUKKyAg
ICAgICAgICA6bmFtZSBuYW1lCiAgICAgICAgICAgOm9iamVjdHMgb2JqZWN0cwogICAgICAgICAg
IDpvYmplY3RzLWZ1bmN0aW9uIG9iamVjdHMtZnVuY3Rpb24KKyAgICAgICAgICA6b2JqZWN0LWVx
dWFsIG9iamVjdC1lcXVhbAorICAgICAgICAgIDpkdXBsaWNhdGUtb2JqZWN0cyBkdXBsaWNhdGUt
b2JqZWN0cwogICAgICAgICAgIDpnZXR0ZXIgZ2V0dGVyCiAgICAgICAgICAgOmZvcm1hdHRlciBm
b3JtYXR0ZXIKICAgICAgICAgICA6ZGlzcGxheWVyIGRpc3BsYXllcgpAQCAtMTMyLDcgKzE0Nyw4
IEBAIG1ha2UtdnRhYmxlCiAgICAgOzsgQXV0by1nZW5lcmF0ZSB0aGUgY29sdW1ucy4KICAgICAo
dW5sZXNzIGNvbHVtbnMKICAgICAgICh1bmxlc3Mgb2JqZWN0cwotICAgICAgICAoZXJyb3IgIkNh
bid0IGF1dG8tZ2VuZXJhdGUgY29sdW1uczsgbm8gb2JqZWN0cyIpKQorICAgICAgICAoZXJyb3Ig
IkNhbid0IGF1dG8tZ2VuZXJhdGUgY29sdW1uczsgbm8gb2JqZWN0cyAodnRhYmxlIGAlcycpIgor
ICAgICAgICAgICAgICAgKHZ0YWJsZS1uYW1lIHRhYmxlKSkpCiAgICAgICAoc2V0cSBjb2x1bW5z
IChtYWtlLWxpc3QgKGxlbmd0aCAoY2FyIG9iamVjdHMpKSAiIikpKQogICAgIChzZXRmICh2dGFi
bGUtY29sdW1ucyB0YWJsZSkKICAgICAgICAgICAobWFwY2FyIChsYW1iZGEgKGNvbHVtbikKQEAg
LTI1MSwxNCArMjY3LDE1IEBAIHZ0YWJsZS1nb3RvLW9iamVjdAogUmV0dXJuIHRoZSBwb3NpdGlv
biBvZiB0aGUgb2JqZWN0IGlmIGZvdW5kLCBhbmQgbmlsIGlmIG5vdC4iCiAgIChsZXQgKChzdGFy
dCAocG9pbnQpKSkKICAgICAodnRhYmxlLWJlZ2lubmluZy1vZi10YWJsZSkKLSAgICAoc2F2ZS1y
ZXN0cmljdGlvbgotICAgICAgKG5hcnJvdy10by1yZWdpb24gKHBvaW50KSAoc2F2ZS1leGN1cnNp
b24gKHZ0YWJsZS1lbmQtb2YtdGFibGUpKSkKLSAgICAgIChpZiAodGV4dC1wcm9wZXJ0eS1zZWFy
Y2gtZm9yd2FyZCAndnRhYmxlLW9iamVjdCBvYmplY3QgIydlcSkKLSAgICAgICAgICAocHJvZ24K
LSAgICAgICAgICAgIChmb3J3YXJkLWxpbmUgLTEpCi0gICAgICAgICAgICAocG9pbnQpKQotICAg
ICAgICAoZ290by1jaGFyIHN0YXJ0KQotICAgICAgICBuaWwpKSkpCisgICAgKGxldCAoKHByZWRp
Y2F0ZSAodnRhYmxlLW9iamVjdC1lcXVhbCAodnRhYmxlLWN1cnJlbnQtdGFibGUpKSkpCisgICAg
ICAoc2F2ZS1yZXN0cmljdGlvbgorICAgICAgICAobmFycm93LXRvLXJlZ2lvbiAocG9pbnQpIChz
YXZlLWV4Y3Vyc2lvbiAodnRhYmxlLWVuZC1vZi10YWJsZSkpKQorICAgICAgICAoaWYgKHRleHQt
cHJvcGVydHktc2VhcmNoLWZvcndhcmQgJ3Z0YWJsZS1vYmplY3Qgb2JqZWN0IHByZWRpY2F0ZSkK
KyAgICAgICAgICAgIChwcm9nbgorICAgICAgICAgICAgICAoZm9yd2FyZC1saW5lIC0xKQorICAg
ICAgICAgICAgICAocG9pbnQpKQorICAgICAgICAgIChnb3RvLWNoYXIgc3RhcnQpCisgICAgICAg
ICAgbmlsKSkpKSkKIAogKGRlZnVuIHZ0YWJsZS1nb3RvLXRhYmxlICh0YWJsZSkKICAgIkdvIHRv
IFRBQkxFIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KQEAgLTI4NSw2MyArMzAyLDkyIEBAIHZ0YWJs
ZS11cGRhdGUtb2JqZWN0CiBjb21wYXJlZCB3aXRoIGBlcXVhbCcpLCBzaWduYWwgYW4gZXJyb3Iu
ICBOb3RlIGEgbGltaXRhdGlvbjogaWYgVEFCTEUncwogYnVmZmVyIGlzIG5vdCBpbiBhIHZpc2li
bGUgd2luZG93LCBvciBpZiBpdHMgd2luZG93IGhhcyBjaGFuZ2VkIHdpZHRoCiBzaW5jZSBpdCB3
YXMgdXBkYXRlZCwgdXBkYXRpbmcgdGhlIFRBQkxFIGlzIG5vdCBwb3NzaWJsZSwgYW5kIGFuIGVy
cm9yCi1pcyBzaWduYWxlZC4iCitpcyBzaWduYWxlZC4KKworQ29uc3VsdCB0aGUgdGFibGUncyBg
OmR1cGxpY2F0ZS1vYmplY3RzJyBwcm9wZXJ0eS4iCiAgICh1bmxlc3Mgb2xkLW9iamVjdAogICAg
IChzZXRxIG9sZC1vYmplY3Qgb2JqZWN0KSkKLSAgKGxldCogKChvYmplY3RzICh2dGFibGUtb2Jq
ZWN0cyB0YWJsZSkpCi0gICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkpCi0gICAgOzsgRmly
c3QgcmVwbGFjZSB0aGUgb2JqZWN0IGluIHRoZSBvYmplY3Qgc3RvcmFnZS4KLSAgICAoaWYgKGVx
IG9sZC1vYmplY3QgKGNhciBvYmplY3RzKSkKLSAgICAgICAgOzsgSXQncyBhdCB0aGUgaGVhZCwg
c28gcmVwbGFjZSBpdCB0aGVyZS4KLSAgICAgICAgKHNldGYgKHZ0YWJsZS1vYmplY3RzIHRhYmxl
KQotICAgICAgICAgICAgICAoY29ucyBvYmplY3QgKGNkciBvYmplY3RzKSkpCi0gICAgICA7OyBP
dGhlcndpc2Ugc3BsaWNlIGludG8gdGhlIGxpc3QuCi0gICAgICAod2hpbGUgKGFuZCAoY2RyIG9i
amVjdHMpCi0gICAgICAgICAgICAgICAgICAobm90IChlcSAoY2FkciBvYmplY3RzKSBvbGQtb2Jq
ZWN0KSkpCi0gICAgICAgIChzZXRxIG9iamVjdHMgKGNkciBvYmplY3RzKSkpCi0gICAgICAodW5s
ZXNzIG9iamVjdHMKLSAgICAgICAgKGVycm9yICJDYW4ndCBmaW5kIHRoZSBvbGQgb2JqZWN0Iikp
Ci0gICAgICAoc2V0Y2FyIChjZHIgb2JqZWN0cykgb2JqZWN0KSkKLSAgICA7OyBUaGVuIHVwZGF0
ZSB0aGUgY2FjaGUuLi4KLSAgICA7OyBGSVhNRTogSWYgdGhlIHRhYmxlJ3MgYnVmZmVyIGhhcyBu
byB2aXNpYmxlIHdpbmRvdywgb3IgaWYgaXRzCi0gICAgOzsgd2lkdGggaGFzIGNoYW5nZWQgc2lu
Y2UgdGhlIHRhYmxlIHdhcyB1cGRhdGVkLCB0aGUgY2FjaGUga2V5IHdpbGwKLSAgICA7OyBub3Qg
bWF0Y2ggYW5kIHRoZSBvYmplY3QgY2FuJ3QgYmUgdXBkYXRlZC4gIChCdWcgIzY5ODM3KS4KLSAg
ICAoaWYtbGV0KiAoKGxpbmUtbnVtYmVyIChzZXEtcG9zaXRpb24gKGNhciAodnRhYmxlLS1jYWNo
ZSB0YWJsZSkpIG9sZC1vYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKGxhbWJkYSAoYSBiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChlcXVhbCAoY2FyIGEpIGIpKSkpCi0gICAgICAgICAgICAgIChsaW5lIChlbHQgKGNh
ciAodnRhYmxlLS1jYWNoZSB0YWJsZSkpIGxpbmUtbnVtYmVyKSkpCi0gICAgICAgIChwcm9nbgot
ICAgICAgICAgIChzZXRjYXIgbGluZSBvYmplY3QpCi0gICAgICAgICAgKHNldGNkciBsaW5lICh2
dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUgdGFibGUgb2JqZWN0KSkKLSAgICAgICAgICA7OyAu
Li4gYW5kIHJlZGlzcGxheSB0aGUgbGluZSBpbiBxdWVzdGlvbi4KLSAgICAgICAgICAoc2F2ZS1l
eGN1cnNpb24KLSAgICAgICAgICAgICh2dGFibGUtZ290by1vYmplY3Qgb2xkLW9iamVjdCkKLSAg
ICAgICAgICAgIChsZXQgKChrZXltYXAgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1h
cCkpCi0gICAgICAgICAgICAgICAgICAoc3RhcnQgKHBvaW50KSkpCi0gICAgICAgICAgICAgIChk
ZWxldGUtbGluZSkKLSAgICAgICAgICAgICAgKHZ0YWJsZS0taW5zZXJ0LWxpbmUgdGFibGUgbGlu
ZSBsaW5lLW51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnRoIDEg
KHZ0YWJsZS0tY2FjaGUgdGFibGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAodnRhYmxlLS1zcGFjZXIgdGFibGUpKQotICAgICAgICAgICAgICAoYWRkLXRleHQtcHJvcGVy
dGllcyBzdGFydCAocG9pbnQpIChsaXN0ICdrZXltYXAga2V5bWFwCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z0YWJsZSB0YWJsZSkpKSkK
LSAgICAgICAgICA7OyBXZSBtYXkgaGF2ZSBpbnNlcnRlZCBhIG5vbi1udW1lcmljYWwgdmFsdWUg
aW50byBhIHByZXZpb3VzbHkKLSAgICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBzbyBy
ZWNvbXB1dGUuCi0gICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAo
Y2RyIGxpbmUpKSkKLSAgICAgIChlcnJvciAiQ2FuJ3QgZmluZCBjYWNoZWQgb2JqZWN0IGluIHZ0
YWJsZSIpKSkpCisgICh1bmxlc3MgKGFuZCAobm90IChmdW5jYWxsICh2dGFibGUtb2JqZWN0LWVx
dWFsIHRhYmxlKSBvbGQtb2JqZWN0IG9iamVjdCkpCisgICAgICAgICAgICAgICAodnRhYmxlLS1o
YW5kbGUtZHVwbGljYXRlLW9iamVjdCB0YWJsZSBvYmplY3QpKQorICAgIChsZXQqICgob2JqZWN0
cyAodnRhYmxlLW9iamVjdHMgdGFibGUpKQorICAgICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkg
dCkpCisgICAgICA7OyBGaXJzdCByZXBsYWNlIHRoZSBvYmplY3QgaW4gdGhlIG9iamVjdCBzdG9y
YWdlLgorICAgICAgKGlmIChmdW5jYWxsICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKSBvbGQt
b2JqZWN0IChjYXIgb2JqZWN0cykpCisgICAgICAgICAgOzsgSXQncyBhdCB0aGUgaGVhZCwgc28g
cmVwbGFjZSBpdCB0aGVyZS4KKyAgICAgICAgICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUp
CisgICAgICAgICAgICAgICAgKGNvbnMgb2JqZWN0IChjZHIgb2JqZWN0cykpKQorICAgICAgICA7
OyBPdGhlcndpc2Ugc3BsaWNlIGludG8gdGhlIGxpc3QuCisgICAgICAgICh3aGlsZSAoYW5kIChj
ZHIgb2JqZWN0cykKKyAgICAgICAgICAgICAgICAgICAgKG5vdCAoZnVuY2FsbCAodnRhYmxlLW9i
amVjdC1lcXVhbCB0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2Fk
ciBvYmplY3RzKSBvbGQtb2JqZWN0KSkpCisgICAgICAgICAgKHNldHEgb2JqZWN0cyAoY2RyIG9i
amVjdHMpKSkKKyAgICAgICAgKHVubGVzcyAoYW5kIG9iamVjdHMKKyAgICAgICAgICAgICAgICAg
ICAgIChmdW5jYWxsICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGNhZHIgb2JqZWN0cykgb2xkLW9iamVjdCkpCisgICAgICAgICAgKGVy
cm9yICJDYW4ndCBmaW5kIHRoZSBvbGQgb2JqZWN0ICh2dGFibGUgYCVzJykiCisgICAgICAgICAg
ICAgICAgICh2dGFibGUtbmFtZSB0YWJsZSkpKQorICAgICAgICAoc2V0Y2FyIChjZHIgb2JqZWN0
cykgb2JqZWN0KSkKKyAgICAgIDs7IFRoZW4gdXBkYXRlIHRoZSBjYWNoZS4uLgorICAgICAgOzsg
RklYTUU6IElmIHRoZSB0YWJsZSdzIGJ1ZmZlciBoYXMgbm8gdmlzaWJsZSB3aW5kb3csIG9yIGlm
IGl0cworICAgICAgOzsgd2lkdGggaGFzIGNoYW5nZWQgc2luY2UgdGhlIHRhYmxlIHdhcyB1cGRh
dGVkLCB0aGUgY2FjaGUga2V5IHdpbGwKKyAgICAgIDs7IG5vdCBtYXRjaCBhbmQgdGhlIG9iamVj
dCBjYW4ndCBiZSB1cGRhdGVkLiAgKEJ1ZyAjNjk4MzcpLgorICAgICAgKGlmLWxldCogKChjYWNo
ZSAodnRhYmxlLS1lbnN1cmUtY2FjaGUgdGFibGUpKQorICAgICAgICAgICAgICAgIChsaW5lLW51
bWJlciAoc2VxLXBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxl
LS1jYWNoZS1saW5lcyBjYWNoZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3Nv
YyBvbGQtb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJs
ZS0tY2FjaGUtbGluZXMgY2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKHZ0YWJsZS1vYmplY3QtZXF1YWwgdGFibGUpKSkpCisgICAgICAgICAgICAgICAgKGxpbmUg
KGVsdCAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkgbGluZS1udW1iZXIpKSkKKyAgICAgICAg
ICAocHJvZ24KKyAgICAgICAgICAgIChzZXRjYXIgbGluZSBvYmplY3QpCisgICAgICAgICAgICAo
c2V0Y2RyIGxpbmUgKHZ0YWJsZS0tY29tcHV0ZS1jYWNoZWQtbGluZSB0YWJsZSBvYmplY3QpKQor
ICAgICAgICAgICAgOzsgLi4uIGFuZCByZWRpc3BsYXkgdGhlIGxpbmUgaW4gcXVlc3Rpb24uCisg
ICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KKyAgICAgICAgICAgICAgKHZ0YWJsZS1nb3RvLW9i
amVjdCBvbGQtb2JqZWN0KQorICAgICAgICAgICAgICAobGV0ICgoa2V5bWFwIChnZXQtdGV4dC1w
cm9wZXJ0eSAocG9pbnQpICdrZXltYXApKQorICAgICAgICAgICAgICAgICAgICAoc3RhcnQgKHBv
aW50KSkpCisgICAgICAgICAgICAgICAgKGRlbGV0ZS1saW5lKQorICAgICAgICAgICAgICAgICh2
dGFibGUtLWluc2VydC1saW5lIHRhYmxlIGxpbmUgbGluZS1udW1iZXIKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAodnRhYmxlLS1jYWNoZS13aWR0aHMgY2FjaGUpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKSkK
KyAgICAgICAgICAgICAgICAoYWRkLXRleHQtcHJvcGVydGllcyBzdGFydCAocG9pbnQpIChsaXN0
ICdrZXltYXAga2V5bWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAndnRhYmxlIHRhYmxlKSkpKQorICAgICAgICAgICAgOzsgV2UgbWF5
IGhhdmUgaW5zZXJ0ZWQgYSBub24tbnVtZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5Cisg
ICAgICAgICAgICA7OyBhbGwtbnVtZXJpY2FsIHRhYmxlLCBzbyByZWNvbXB1dGUuCisgICAgICAg
ICAgICAodnRhYmxlLS1yZWNvbXB1dGUtbnVtZXJpY2FsIHRhYmxlIChjZHIgbGluZSkpKQorICAg
ICAgICAoZXJyb3IgIkNhbid0IGZpbmQgY2FjaGVkIG9iamVjdCAodnRhYmxlIGAlcycpIgorICAg
ICAgICAgICAgICAgKHZ0YWJsZS1uYW1lIHRhYmxlKSkpKSkpCiAKIChkZWZ1biB2dGFibGUtcmVt
b3ZlLW9iamVjdCAodGFibGUgb2JqZWN0KQogICAiUmVtb3ZlIE9CSkVDVCBmcm9tIFRBQkxFLgog
VGhpcyB3aWxsIGFsc28gcmVtb3ZlIHRoZSBkaXNwbGF5ZWQgbGluZS4iCi0gIDs7IEZpcnN0IHJl
bW92ZSBmcm9tIHRoZSBvYmplY3RzLgotICAoc2V0ZiAodnRhYmxlLW9iamVjdHMgdGFibGUpIChk
ZWxxIG9iamVjdCAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkKLSAgOzsgVGhlbiBhZGp1c3QgdGhl
IGNhY2hlIGFuZCBkaXNwbGF5LgotICAobGV0ICgoY2FjaGUgKHZ0YWJsZS0tY2FjaGUgdGFibGUp
KQorICAobGV0ICgoY2FjaGUgKHZ0YWJsZS0tZW5zdXJlLWNhY2hlIHRhYmxlKSkKICAgICAgICAg
KGluaGliaXQtcmVhZC1vbmx5IHQpKQotICAgIChzZXRjYXIgY2FjaGUgKGRlbHEgKGFzc3Egb2Jq
ZWN0IChjYXIgY2FjaGUpKSAoY2FyIGNhY2hlKSkpCi0gICAgKHNhdmUtZXhjdXJzaW9uCi0gICAg
ICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCi0gICAgICAod2hlbiAodnRhYmxlLWdvdG8tb2Jq
ZWN0IG9iamVjdCkKLSAgICAgICAgKGRlbGV0ZS1saW5lKSkpKSkKKyAgICAodW5sZXNzIChzZXEt
Y29udGFpbnMtcCAodnRhYmxlLW9iamVjdHMgdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZ0YWJsZS1vYmplY3Qt
ZXF1YWwgdGFibGUpKQorICAgICAgKGVycm9yICJDYW4ndCBmaW5kIHRoZSBvYmplY3QgdG8gcmVt
b3ZlICh2dGFibGUgYCVzJykiCisgICAgICAgICAgICAgKHZ0YWJsZS1uYW1lIHRhYmxlKSkpCisg
ICAgOzsgRmlyc3QgcmVtb3ZlIGZyb20gdGhlIG9iamVjdHMuCisgICAgKHNldGYgKHZ0YWJsZS1v
YmplY3RzIHRhYmxlKSAoc2VxLXJlbW92ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChsYW1iZGEgKGVsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChm
dW5jYWxsICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZWx0IG9iamVjdCkpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkpCisgICAgOzsgVGhlbiBhZGp1
c3QgdGhlIGNhY2hlIGFuZCBkaXNwbGF5LgorICAgIChpZi1sZXQqICgob2xkLWxpbmUgKGFzc29j
IG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWNhY2hlLWxp
bmVzIGNhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtb2JqZWN0
LWVxdWFsIHRhYmxlKSkpKQorICAgICAgICAocHJvZ24KKyAgICAgICAgICAoc2V0Y2FyIGNhY2hl
IChkZWxxIG9sZC1saW5lICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKSkpCisgICAgICAgICAg
KHNhdmUtZXhjdXJzaW9uCisgICAgICAgICAgICAodnRhYmxlLWdvdG8tdGFibGUgdGFibGUpCisg
ICAgICAgICAgICAod2hlbiAodnRhYmxlLWdvdG8tb2JqZWN0IG9iamVjdCkKKyAgICAgICAgICAg
ICAgKGRlbGV0ZS1saW5lKSkpKQorICAgICAgOzsgQXQgdGhpcyBwb2ludCwgdGhlIG9iamVjdCB3
YXMgcmVtb3ZlZCBmcm9tIG9iamVjdHMsIGJ1dCBub3QKKyAgICAgIDs7IHRoZSBjYWNoZSwgd2hp
Y2ggd2lsbCBzdGFsZS4KKyAgICAgIChlcnJvciAiQ2FuJ3QgZmluZCBjYWNoZWQgb2JqZWN0ICh2
dGFibGUgYCVzJykiCisgICAgICAgICAgICAgKHZ0YWJsZS1uYW1lIHRhYmxlKSkpKSkKIAogOzsg
RklYTUU6IFRoZSBmYWN0IHRoYXQgdGhlIGBsb2NhdGlvbicgYXJndW1lbnQgb2YKIDs7IGB2dGFi
bGUtaW5zZXJ0LW9iamVjdCcgY2FuIGJlIGFuIGludGVnZXIgYW5kIGlzIHRoZW4gaW50ZXJwcmV0
ZWQgYXMKQEAgLTM2Miw2ICs0MDgsOCBAQCB2dGFibGUtaW5zZXJ0LW9iamVjdAogZW5kIChpZiB0
aGUgaW5kZXggaXMgdG9vIGxhcmdlKSBvZiB0aGUgdGFibGUuICBCRUZPUkUgaXMgaWdub3JlZCBp
biB0aGlzCiBjYXNlLgogCitDb25zdWx0IHRoZSB0YWJsZSdzIGA6ZHVwbGljYXRlLW9iamVjdHMn
IHByb3BlcnR5LgorCiBUaGlzIGFsc28gdXBkYXRlcyB0aGUgZGlzcGxheWVkIHRhYmxlLiIKICAg
OzsgSWYgdGhlIHZ0YWJsZSBpcyBlbXB0eSwganVzdCBhZGQgdGhlIG9iamVjdCBhbmQgcmVnZW5l
cmF0ZSB0aGUKICAgOzsgdGFibGUuCkBAIC0zNzEsODYgKzQxOSwxMjcgQEAgdnRhYmxlLWluc2Vy
dC1vYmplY3QKICAgICAgICAgKHZ0YWJsZS0tcmVjb21wdXRlLW51bWVyaWNhbCB0YWJsZSAodnRh
YmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpCiAgICAgICAgICh2dGFibGUt
Z290by10YWJsZSB0YWJsZSkKICAgICAgICAgKHZ0YWJsZS1yZXZlcnQtY29tbWFuZCkpCi0gICAg
OzsgRmlyc3QgaW5zZXJ0IGludG8gdGhlIG9iamVjdHMuCi0gICAgKGxldCAoKHBvcyAoaWYgbG9j
YXRpb24KLSAgICAgICAgICAgICAgICAgICAoaWYgKGludGVnZXJwIGxvY2F0aW9uKQotICAgICAg
ICAgICAgICAgICAgICAgICAocHJvZzEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChudGhj
ZHIgbG9jYXRpb24gKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgICA7OyBEbyBub3QgcHJlcGVuZCBpZiBpbmRleCBpcyB0b28gbGFyZ2U6Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgKHNldHEgYmVmb3JlIG5pbCkpCi0gICAgICAgICAgICAgICAgICAgICAo
b3IgKG1lbXEgbG9jYXRpb24gKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkKLSAgICAgICAgICAgICAg
ICAgICAgICAgICA7OyBQcmVwZW5kIGlmIGBsb2NhdGlvbicgaXMgbm90IGZvdW5kIGFuZAotICAg
ICAgICAgICAgICAgICAgICAgICAgIDs7IGBiZWZvcmUnIGlzIG5vbi1uaWw6Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAgKGFuZCBiZWZvcmUgKHZ0YWJsZS1vYmplY3RzIHRhYmxlKSkpKQotICAg
ICAgICAgICAgICAgICA7OyBJZiBgbG9jYXRpb24nIGlzIG5pbCBhbmQgYGJlZm9yZScgaXMgbm9u
LW5pbCwgd2UKLSAgICAgICAgICAgICAgICAgOzsgcHJlcGVuZCB0aGUgbmV3IG9iamVjdC4KLSAg
ICAgICAgICAgICAgICAgKGlmIGJlZm9yZSAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkpKQotICAg
ICAgKGlmIChvciBiZWZvcmUgIDsgSWYgYGJlZm9yZScgaXMgbm9uLW5pbCwgYHBvcycgc2hvdWxk
IGJlLCBhcyB3ZWxsLgotICAgICAgICAgICAgICAoYW5kIHBvcyAoaW50ZWdlcnAgbG9jYXRpb24p
KSkKLSAgICAgICAgICA7OyBBZGQgdGhlIG5ldyBvYmplY3QgYmVmb3JlLgotICAgICAgICAgIChs
ZXQgKChvbGQtb2JqZWN0IChjYXIgcG9zKSkpCi0gICAgICAgICAgICAoc2V0Y2FyIHBvcyBvYmpl
Y3QpCi0gICAgICAgICAgICAoc2V0Y2RyIHBvcyAoY29ucyBvbGQtb2JqZWN0IChjZHIgcG9zKSkp
KQotICAgICAgICA7OyBPdGhlcndpc2UsIGFkZCB0aGUgb2JqZWN0IGFmdGVyLgotICAgICAgICAo
aWYgcG9zCi0gICAgICAgICAgICA7OyBTcGxpY2UgdGhlIG9iamVjdCBpbnRvIHRoZSBsaXN0Lgot
ICAgICAgICAgICAgKHNldGNkciBwb3MgKGNvbnMgb2JqZWN0IChjZHIgcG9zKSkpCi0gICAgICAg
ICAgOzsgT3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVjdC4KLSAgICAgICAgICAobmNvbmMgKHZ0
YWJsZS1vYmplY3RzIHRhYmxlKSAobGlzdCBvYmplY3QpKSkpKQotICAgIDs7IFRoZW4gYWRqdXN0
IHRoZSBjYWNoZSBhbmQgZGlzcGxheS4KLSAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgICh2dGFi
bGUtZ290by10YWJsZSB0YWJsZSkKLSAgICAgIChsZXQqICgoY2FjaGUgKHZ0YWJsZS0tY2FjaGUg
dGFibGUpKQotICAgICAgICAgICAgIChpbmhpYml0LXJlYWQtb25seSB0KQotICAgICAgICAgICAg
IChrZXltYXAgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2tleW1hcCkpCi0gICAgICAgICAg
ICAgKGVsbGlwc2lzIChpZiAodnRhYmxlLWVsbGlwc2lzIHRhYmxlKQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKHByb3BlcnRpemUgKHRydW5jYXRlLXN0cmluZy1lbGxpcHNpcykKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWNlICh2dGFibGUtZmFjZSB0YWJs
ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiIpKQotICAgICAgICAgICAgIChlbGxpcHNp
cy13aWR0aCAoc3RyaW5nLXBpeGVsLXdpZHRoIGVsbGlwc2lzKSkKLSAgICAgICAgICAgICAoZWxl
bSAoaWYgbG9jYXRpb24gIDsgVGhpcyBiaW5kaW5nIG1pcnJvcnMgdGhlIGJpbmRpbmcgb2YgYHBv
cycgYWJvdmUuCi0gICAgICAgICAgICAgICAgICAgICAgIChpZiAoaW50ZWdlcnAgbG9jYXRpb24p
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAobnRoIGxvY2F0aW9uIChjYXIgY2FjaGUpKQot
ICAgICAgICAgICAgICAgICAgICAgICAgIChvciAoYXNzcSBsb2NhdGlvbiAoY2FyIGNhY2hlKSkK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBiZWZvcmUgKGNhYXIgY2FjaGUpKSkp
Ci0gICAgICAgICAgICAgICAgICAgICAoaWYgYmVmb3JlIChjYWFyIGNhY2hlKSkpKQotICAgICAg
ICAgICAgIChwb3MgKG1lbXEgZWxlbSAoY2FyIGNhY2hlKSkpCi0gICAgICAgICAgICAgKGxpbmUg
KGNvbnMgb2JqZWN0ICh2dGFibGUtLWNvbXB1dGUtY2FjaGVkLWxpbmUgdGFibGUgb2JqZWN0KSkp
KQotICAgICAgICAoaWYgKG9yIGJlZm9yZQorICAgICh1bmxlc3MgKHZ0YWJsZS0taGFuZGxlLWR1
cGxpY2F0ZS1vYmplY3QgdGFibGUgb2JqZWN0KQorICAgICAgOzsgRmlyc3QgaW5zZXJ0IGludG8g
dGhlIG9iamVjdHMuCisgICAgICAobGV0ICgocG9zIChpZiBsb2NhdGlvbgorICAgICAgICAgICAg
ICAgICAgICAgKGlmIChpbnRlZ2VycCBsb2NhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAocHJvZzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG50aGNkciBsb2NhdGlvbiAo
dnRhYmxlLW9iamVjdHMgdGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgRG8g
bm90IHByZXBlbmQgaWYgaW5kZXggaXMgdG9vIGxhcmdlOgorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKHNldHEgYmVmb3JlIG5pbCkpCisgICAgICAgICAgICAgICAgICAgICAgIChvcgorICAg
ICAgICAgICAgICAgICAgICAgICAgKGxldCAoKGxvYyAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoaWxlIChhbmQgKGNkciBsb2MpCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgKGZ1bmNhbGwgKHZ0YWJsZS1vYmpl
Y3QtZXF1YWwgdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKGNhciBsb2MpIGxvY2F0aW9uKSkpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKHNldHEgbG9jIChjZHIgbG9jKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIChp
ZiAoZnVuY2FsbCAodnRhYmxlLW9iamVjdC1lcXVhbCB0YWJsZSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIChjYXIgbG9jKSBsb2NhdGlvbikKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGxvYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbCkpCisg
ICAgICAgICAgICAgICAgICAgICAgICA7OyBQcmVwZW5kIGlmIGBsb2NhdGlvbicgaXMgbm90IGZv
dW5kIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgOzsgYGJlZm9yZScgaXMgbm9uLW5pbDoK
KyAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgYmVmb3JlICh2dGFibGUtb2JqZWN0cyB0YWJs
ZSkpKSkKKyAgICAgICAgICAgICAgICAgICA7OyBJZiBgbG9jYXRpb24nIGlzIG5pbCBhbmQgYGJl
Zm9yZScgaXMgbm9uLW5pbCwgd2UKKyAgICAgICAgICAgICAgICAgICA7OyBwcmVwZW5kIHRoZSBu
ZXcgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgIChpZiBiZWZvcmUgKHZ0YWJsZS1vYmplY3Rz
IHRhYmxlKSkpKSkKKyAgICAgICAgKGlmIChvciBiZWZvcmUgIDsgSWYgYGJlZm9yZScgaXMgbm9u
LW5pbCwgYHBvcycgc2hvdWxkIGJlLCBhcyB3ZWxsLgogICAgICAgICAgICAgICAgIChhbmQgcG9z
IChpbnRlZ2VycCBsb2NhdGlvbikpKQotICAgICAgICAgICAgOzsgQWRkIHRoZSBuZXcgb2JqZWN0
IGJlZm9yZTouCi0gICAgICAgICAgICAobGV0ICgob2xkLWxpbmUgKGNhciBwb3MpKSkKLSAgICAg
ICAgICAgICAgKHNldGNhciBwb3MgbGluZSkKLSAgICAgICAgICAgICAgKHNldGNkciBwb3MgKGNv
bnMgb2xkLWxpbmUgKGNkciBwb3MpKSkKLSAgICAgICAgICAgICAgKHVubGVzcyAodnRhYmxlLWdv
dG8tb2JqZWN0IChjYXIgZWxlbSkpCi0gICAgICAgICAgICAgICAgKHZ0YWJsZS1iZWdpbm5pbmct
b2YtdGFibGUpKSkKKyAgICAgICAgICAgIDs7IEFkZCB0aGUgbmV3IG9iamVjdCBiZWZvcmUuCisg
ICAgICAgICAgICAobGV0ICgob2xkLW9iamVjdCAoY2FyIHBvcykpKQorICAgICAgICAgICAgICAo
c2V0Y2FyIHBvcyBvYmplY3QpCisgICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIG9sZC1v
YmplY3QgKGNkciBwb3MpKSkpCiAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBhZGQgdGhlIG9iamVj
dCBhZnRlci4KICAgICAgICAgICAoaWYgcG9zCiAgICAgICAgICAgICAgIDs7IFNwbGljZSB0aGUg
b2JqZWN0IGludG8gdGhlIGxpc3QuCi0gICAgICAgICAgICAgIChwcm9nbgotICAgICAgICAgICAg
ICAgIChzZXRjZHIgcG9zIChjb25zIGxpbmUgKGNkciBwb3MpKSkKLSAgICAgICAgICAgICAgICAo
aWYgKHZ0YWJsZS1nb3RvLW9iamVjdCBsb2NhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgKGZv
cndhcmQtbGluZSAxKSAgOyBJbnNlcnQgKmFmdGVyKi4KLSAgICAgICAgICAgICAgICAgICh2dGFi
bGUtZW5kLW9mLXRhYmxlKSkpCisgICAgICAgICAgICAgIChzZXRjZHIgcG9zIChjb25zIG9iamVj
dCAoY2RyIHBvcykpKQogICAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVj
dC4KLSAgICAgICAgICAgIChzZXRjYXIgY2FjaGUgKG5jb25jIChjYXIgY2FjaGUpIChsaXN0IGxp
bmUpKSkKLSAgICAgICAgICAgICh2dGFibGUtZW5kLW9mLXRhYmxlKSkpCi0gICAgICAgIChsZXQg
KChzdGFydCAocG9pbnQpKSkKLSAgICAgICAgICA7OyBGSVhNRTogV2UgaGF2ZSB0byBhZGp1c3Qg
Y29sb3JzIGluIGxpbmVzIGJlbG93IHRoaXMgaWYgd2UKLSAgICAgICAgICA7OyBoYXZlIDpyb3ct
Y29sb3JzLgotICAgICAgICAgICh2dGFibGUtLWluc2VydC1saW5lIHRhYmxlIGxpbmUgMAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudGggMSBjYWNoZSkgKHZ0YWJsZS0tc3BhY2Vy
IHRhYmxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbGlwc2lzIGVsbGlwc2lz
LXdpZHRoKQotICAgICAgICAgIChhZGQtdGV4dC1wcm9wZXJ0aWVzIHN0YXJ0IChwb2ludCkgKGxp
c3QgJ2tleW1hcCBrZXltYXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICd2dGFibGUgdGFibGUpKSkKLSAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5z
ZXJ0ZWQgYSBub24tbnVtZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5Ci0gICAgICAgIDs7
IGFsbC1udW1lcmljYWwgdGFibGUsIHNvIHJlY29tcHV0ZS4KLSAgICAgICAgKHZ0YWJsZS0tcmVj
b21wdXRlLW51bWVyaWNhbCB0YWJsZSAoY2RyIGxpbmUpKSkpKSkKKyAgICAgICAgICAgIChuY29u
YyAodnRhYmxlLW9iamVjdHMgdGFibGUpIChsaXN0IG9iamVjdCkpKSkpCisgICAgICA7OyBUaGVu
IGFkanVzdCB0aGUgY2FjaGUgYW5kIGRpc3BsYXkuCisgICAgICAoc2F2ZS1leGN1cnNpb24KKyAg
ICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlKQorICAgICAgICAobGV0KiAoKGNhY2hlICh2
dGFibGUtLWVuc3VyZS1jYWNoZSB0YWJsZSkpCisgICAgICAgICAgICAgICAoaW5oaWJpdC1yZWFk
LW9ubHkgdCkKKyAgICAgICAgICAgICAgIChrZXltYXAgKGdldC10ZXh0LXByb3BlcnR5IChwb2lu
dCkgJ2tleW1hcCkpCisgICAgICAgICAgICAgICAoZWxsaXBzaXMgKGlmICh2dGFibGUtZWxsaXBz
aXMgdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wZXJ0aXplICh0cnVu
Y2F0ZS1zdHJpbmctZWxsaXBzaXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICdmYWNlICh2dGFibGUtZmFjZSB0YWJsZSkpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAiIikpCisgICAgICAgICAgICAgICAoZWxsaXBzaXMtd2lkdGggKHN0cmluZy1waXhlbC13
aWR0aCBlbGxpcHNpcykpCisgICAgICAgICAgICAgICAoZWxlbSAoaWYgbG9jYXRpb24gIDsgVGhp
cyBiaW5kaW5nIG1pcnJvcnMgdGhlIGJpbmRpbmcgb2YgYHBvcycgYWJvdmUuCisgICAgICAgICAg
ICAgICAgICAgICAgICAgKGlmIChpbnRlZ2VycCBsb2NhdGlvbikKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKG50aCBsb2NhdGlvbiAodnRhYmxlLS1jYWNoZS1saW5lcyBjYWNoZSkpCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgKGFzc29jCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2
dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAodnRhYmxlLW9iamVjdC1lcXVhbCB0YWJsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKGFuZCBiZWZvcmUgKGNhYXIgY2FjaGUpKSkpCisgICAgICAgICAgICAgICAgICAgICAg
IChpZiBiZWZvcmUgKGNhYXIgY2FjaGUpKSkpCisgICAgICAgICAgICAgICAocG9zIChtZW1xIGVs
ZW0gKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpKSkKKyAgICAgICAgICAgICAgIChsaW5lIChj
b25zIG9iamVjdCAodnRhYmxlLS1jb21wdXRlLWNhY2hlZC1saW5lIHRhYmxlIG9iamVjdCkpKSkK
KyAgICAgICAgICAoaWYgKG9yIGJlZm9yZQorICAgICAgICAgICAgICAgICAgKGFuZCBwb3MgKGlu
dGVnZXJwIGxvY2F0aW9uKSkpCisgICAgICAgICAgICAgIDs7IEFkZCB0aGUgbmV3IG9iamVjdCBi
ZWZvcmU6LgorICAgICAgICAgICAgICAobGV0ICgob2xkLWxpbmUgKGNhciBwb3MpKSkKKyAgICAg
ICAgICAgICAgICAoc2V0Y2FyIHBvcyBsaW5lKQorICAgICAgICAgICAgICAgIChzZXRjZHIgcG9z
IChjb25zIG9sZC1saW5lIChjZHIgcG9zKSkpCisgICAgICAgICAgICAgICAgKHVubGVzcyAodnRh
YmxlLWdvdG8tb2JqZWN0IChjYXIgZWxlbSkpCisgICAgICAgICAgICAgICAgICAodnRhYmxlLWJl
Z2lubmluZy1vZi10YWJsZSkpKQorICAgICAgICAgICAgOzsgT3RoZXJ3aXNlLCBhZGQgdGhlIG9i
amVjdCBhZnRlci4KKyAgICAgICAgICAgIChpZiBwb3MKKyAgICAgICAgICAgICAgICA7OyBTcGxp
Y2UgdGhlIG9iamVjdCBpbnRvIHRoZSBsaXN0LgorICAgICAgICAgICAgICAgIChwcm9nbgorICAg
ICAgICAgICAgICAgICAgKHNldGNkciBwb3MgKGNvbnMgbGluZSAoY2RyIHBvcykpKQorICAgICAg
ICAgICAgICAgICAgKGlmICh2dGFibGUtZ290by1vYmplY3QgbG9jYXRpb24pCisgICAgICAgICAg
ICAgICAgICAgICAgKGZvcndhcmQtbGluZSAxKSAgOyBJbnNlcnQgKmFmdGVyKi4KKyAgICAgICAg
ICAgICAgICAgICAgKHZ0YWJsZS1lbmQtb2YtdGFibGUpKSkKKyAgICAgICAgICAgICAgOzsgT3Ro
ZXJ3aXNlLCBhcHBlbmQgdGhlIG9iamVjdC4KKyAgICAgICAgICAgICAgKHNldGNhciBjYWNoZSAo
bmNvbmMgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpIChsaXN0IGxpbmUpKSkKKyAgICAgICAg
ICAgICAgKHZ0YWJsZS1lbmQtb2YtdGFibGUpKSkKKyAgICAgICAgICAobGV0ICgoc3RhcnQgKHBv
aW50KSkpCisgICAgICAgICAgICA7OyBGSVhNRTogV2UgaGF2ZSB0byBhZGp1c3QgY29sb3JzIGlu
IGxpbmVzIGJlbG93IHRoaXMgaWYgd2UKKyAgICAgICAgICAgIDs7IGhhdmUgOnJvdy1jb2xvcnMu
CisgICAgICAgICAgICAodnRhYmxlLS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIDAKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLWNhY2hlLXdpZHRocyBjYWNoZSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2dGFibGUtLXNwYWNlciB0YWJsZSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbGlwc2lzIGVsbGlwc2lzLXdpZHRoKQor
ICAgICAgICAgICAgKGFkZC10ZXh0LXByb3BlcnRpZXMgc3RhcnQgKHBvaW50KSAobGlzdCAna2V5
bWFwIGtleW1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAndnRhYmxlIHRhYmxlKSkpCisgICAgICAgICAgOzsgV2UgbWF5IGhhdmUgaW5zZXJ0
ZWQgYSBub24tbnVtZXJpY2FsIHZhbHVlIGludG8gYSBwcmV2aW91c2x5CisgICAgICAgICAgOzsg
YWxsLW51bWVyaWNhbCB0YWJsZSwgc28gcmVjb21wdXRlLgorICAgICAgICAgICh2dGFibGUtLXJl
Y29tcHV0ZS1udW1lcmljYWwgdGFibGUgKGNkciBsaW5lKSkpKSkpKQogCiAoZGVmdW4gdnRhYmxl
LWNvbHVtbiAodGFibGUgaW5kZXgpCiAgICJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIElOREVYdGgg
Y29sdW1uIGluIFRBQkxFLiIKICAgKHZ0YWJsZS1jb2x1bW4tbmFtZSAoZWx0ICh2dGFibGUtY29s
dW1ucyB0YWJsZSkgaW5kZXgpKSkKIAorKGRlZnVuIHZ0YWJsZS0tc29tZS1vYmplY3RzICh0YWJs
ZSBvYmplY3QpCisgIChzZXEtc29tZSAobGFtYmRhIChlbHQpCisgICAgICAgICAgICAgIChmdW5j
YWxsICh2dGFibGUtb2JqZWN0LWVxdWFsIHRhYmxlKSBlbHQgb2JqZWN0KSkKKyAgICAgICAgICAg
ICh2dGFibGUtb2JqZWN0cyB0YWJsZSkpKQorCisoZGVmdW4gdnRhYmxlLS1oYW5kbGUtZHVwbGlj
YXRlLW9iamVjdCAodGFibGUgbmV3LW9iamVjdCkKKyAgIlJldHVybiBuaWwgaWYgTkVXLU9CSkVD
VCBpcyBhY2NlcHRhYmxlIGluIFRBQkxFLCB0IGlmIG5vdC4KK1JldHVybiBuaWwgaWYgZHVwbGlj
YXRlcyBhcmUgYWxsb3dlZC4KK1JldHVybiB0IGlmIGR1cGxpY2F0ZSBmb3VuZCBhbmQgc2hvdWxk
IGJlIGlnbm9yZWQuCitTaWduYWwgYW4gZXJyb3IgaWYgZHVwbGljYXRlIGZvdW5kIGFuZCBkaXNh
bGxvd2VkLiIKKyAgKHBjYXNlLWV4aGF1c3RpdmUgKHZ0YWJsZS1kdXBsaWNhdGUtb2JqZWN0cyB0
YWJsZSkKKyAgICAoJ2FsbG93CisgICAgIG5pbCkKKyAgICAoJ2lnbm9yZQorICAgICAodnRhYmxl
LS1zb21lLW9iamVjdHMgdGFibGUgbmV3LW9iamVjdCkpCisgICAgKCdpZ25vcmUtd2FybgorICAg
ICAoaWYgKHZ0YWJsZS0tc29tZS1vYmplY3RzIHRhYmxlIG5ldy1vYmplY3QpCisgICAgICAgICAo
cHJvZ24KKyAgICAgICAgICAgKG1lc3NhZ2UgIldhcm5pbmc6IGR1cGxpY2F0ZSBvYmplY3QgaWdu
b3JlZCAodnRhYmxlIGAlcycpIgorICAgICAgICAgICAgICAgICAgICAodnRhYmxlLW5hbWUgdGFi
bGUpKQorICAgICAgICAgICB0KQorICAgICAgIG5pbCkpCisgICAgKCdlcnJvcgorICAgICAod2hl
biAodnRhYmxlLS1zb21lLW9iamVjdHMgdGFibGUgbmV3LW9iamVjdCkKKyAgICAgICAoZXJyb3Ig
IkR1cGxpY2F0ZSBvYmplY3RzIG5vdCBhbGxvd2VkICh2dGFibGUgYCVzJykiCisgICAgICAgICAg
ICAgICh2dGFibGUtbmFtZSB0YWJsZSkpKSkpKQorCiA7OzsgR2VuZXJhdGluZyB0aGUgdGFibGUu
CiAKIChkZWZ1biB2dGFibGUtLWdldC12YWx1ZSAob2JqZWN0IGluZGV4IGNvbHVtbiB0YWJsZSkK
QEAgLTUyMyw3ICs2MTIsOCBAQCB2dGFibGUtLWVuc3VyZS1jYWNoZQogICAgICAgKHZ0YWJsZS0t
cmVjb21wdXRlLWNhY2hlIHRhYmxlKSkpCiAKIChkZWZ1biB2dGFibGUtaW5zZXJ0ICh0YWJsZSkK
LSAgKGxldCogKChzcGFjZXIgKHZ0YWJsZS0tc3BhY2VyIHRhYmxlKSkKKyAgKGxldCogKChjYWNo
ZSAodnRhYmxlLS1lbnN1cmUtY2FjaGUgdGFibGUpKQorICAgICAgICAgKHNwYWNlciAodnRhYmxl
LS1zcGFjZXIgdGFibGUpKQogICAgICAgICAgKHN0YXJ0IChwb2ludCkpCiAgICAgICAgICAoZWxs
aXBzaXMgKGlmICh2dGFibGUtZWxsaXBzaXMgdGFibGUpCiAgICAgICAgICAgICAgICAgICAgICAg
IChwcm9wZXJ0aXplICh0cnVuY2F0ZS1zdHJpbmctZWxsaXBzaXMpCkBAIC01MzMsNyArNjIzLDcg
QEAgdnRhYmxlLWluc2VydAogICAgICAgICAgOzsgV2UgbWFpbnRhaW4gYSBjYWNoZSBwZXIgc2Ny
ZWVuL3dpbmRvdyB3aWR0aCwgc28gdGhhdCB3ZSByZW5kZXIKICAgICAgICAgIDs7IGNvcnJlY3Rs
eSBpZiBFbWFjcyBpcyBvcGVuIG9uIHR3byBkaWZmZXJlbnQgc2NyZWVucyAob3IgdGhlCiAgICAg
ICAgICA7OyB1c2VyIHJlc2l6ZXMgdGhlIGZyYW1lKS4KLSAgICAgICAgICh3aWR0aHMgKG50aCAx
ICh2dGFibGUtLWVuc3VyZS1jYWNoZSB0YWJsZSkpKSkKKyAgICAgICAgICh3aWR0aHMgKHZ0YWJs
ZS0tY2FjaGUtd2lkdGhzIGNhY2hlKSkpCiAgICAgOzsgRG9uJ3QgaW5zZXJ0IGFueSBoZWFkZXIg
b3IgaGVhZGVyIGxpbmUgaWYgdGhlIHVzZXIgaGFzbid0CiAgICAgOzsgc3BlY2lmaWVkIHRoZSBj
b2x1bW5zLgogICAgICh3aGVuIChzbG90LXZhbHVlIHRhYmxlICctaGFzLWNvbHVtbi1zcGVjKQpA
QCAtNTUxLDcgKzY0MSw3IEBAIHZ0YWJsZS1pbnNlcnQKICAgICAodnRhYmxlLS1zb3J0IHRhYmxl
KQogICAgIDs7IEluc2VydCB0aGUgZGF0YS4KICAgICAobGV0ICgobGluZS1udW1iZXIgMCkpCi0g
ICAgICAoZG9saXN0IChsaW5lIChjYXIgKHZ0YWJsZS0tY2FjaGUgdGFibGUpKSkKKyAgICAgIChk
b2xpc3QgKGxpbmUgKHZ0YWJsZS0tY2FjaGUtbGluZXMgY2FjaGUpKQogICAgICAgICAodnRhYmxl
LS1pbnNlcnQtbGluZSB0YWJsZSBsaW5lIGxpbmUtbnVtYmVyIHdpZHRocyBzcGFjZXIKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZWxsaXBzaXMgZWxsaXBzaXMtd2lkdGgpCiAgICAgICAg
IChzZXRxIGxpbmUtbnVtYmVyICgxKyBsaW5lLW51bWJlcikpKSkKQEAgLTY2NywyOCArNzU3LDM2
IEBAIHZ0YWJsZS0tY2xlYXItY2FjaGUKIAogKGRlZnVuIHZ0YWJsZS0tc29ydCAodGFibGUpCiAg
IChwY2FzZS1kb2xpc3QgKGAoLGluZGV4IC4gLGRpcmVjdGlvbikgKHZ0YWJsZS1zb3J0LWJ5IHRh
YmxlKSkKLSAgICAobGV0ICgoY2FjaGUgKHZ0YWJsZS0tY2FjaGUgdGFibGUpKQotICAgICAgICAg
IChudW1lcmljYWwgKHZ0YWJsZS1jb2x1bW4tLW51bWVyaWNhbAotICAgICAgICAgICAgICAgICAg
ICAgIChlbHQgKHZ0YWJsZS1jb2x1bW5zIHRhYmxlKSBpbmRleCkpKQotICAgICAgICAgIChudW1j
b21wIChpZiAoZXEgZGlyZWN0aW9uICdkZXNjZW5kKQotICAgICAgICAgICAgICAgICAgICAgICAj
Jz4gIyc8KSkKLSAgICAgICAgICAoc3RyaW5nY29tcCAoaWYgKGVxIGRpcmVjdGlvbiAnZGVzY2Vu
ZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIydzdHJpbmc+ICMnc3RyaW5nPCkpKQorICAg
IChsZXQqICgoY2FjaGUgKHZ0YWJsZS0tZW5zdXJlLWNhY2hlIHRhYmxlKSkKKyAgICAgICAgICAg
KGNvbHVtbiAoZWx0ICh2dGFibGUtY29sdW1ucyB0YWJsZSkgaW5kZXgpKQorICAgICAgICAgICAo
bnVtZXJpY2FsICh2dGFibGUtY29sdW1uLS1udW1lcmljYWwgY29sdW1uKSkKKyAgICAgICAgICAg
KG51bWNvbXAgKGlmIChlcSBkaXJlY3Rpb24gJ2Rlc2NlbmQpCisgICAgICAgICAgICAgICAgICAg
ICAgICAjJz4gIyc8KSkKKyAgICAgICAgICAgKHN0cmluZ2NvbXAgKGlmIChlcSBkaXJlY3Rpb24g
J2Rlc2NlbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ3N0cmluZz4gIydzdHJpbmc8
KSkKKyAgICAgICAgICAgKGNvbXBhcmF0b3IgKHZ0YWJsZS1jb2x1bW4tY29tcGFyYXRvciBjb2x1
bW4pKQorICAgICAgICAgICAoY29tcGFyYXRvci1mdW5jICh3aGVuIGNvbXBhcmF0b3IKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoZXEgZGlyZWN0aW9uICdkZXNjZW5kKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKHYxIHYyKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwgY29tcGFyYXRvciB2MiB2MSkpCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IpKSkpCiAgICAgICAoc2V0
Y2FyIGNhY2hlCi0gICAgICAgICAgICAgIChzb3J0IChjYXIgY2FjaGUpCisgICAgICAgICAgICAg
IChzb3J0ICh2dGFibGUtLWNhY2hlLWxpbmVzIGNhY2hlKQogICAgICAgICAgICAgICAgICAgICAo
bGFtYmRhIChlMSBlMikKICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgoYzEgKGVsdCBlMSAo
MSsgaW5kZXgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzIgKGVsdCBlMiAoMSsg
aW5kZXgpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAoaWYgbnVtZXJpY2FsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwgbnVtY29tcCAoY2FyIGMxKSAoY2FyIGMyKSkK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHN0cmluZ2NvbXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoc3RyaW5n
cCAoY2FyIGMxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIGMxKQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ICIlcyIgKGNhciBjMSkpKQotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKGlmIChzdHJpbmdwIChjYXIgYzIpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChjYXIgYzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChmb3JtYXQgIiVzIiAoY2FyIGMyKSkpKSkpKSkpKSkpCisgICAgICAgICAgICAgICAgICAgICAg
ICAoaWYgY29tcGFyYXRvci1mdW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNh
bGwgY29tcGFyYXRvci1mdW5jIChjYXIgYzEpIChjYXIgYzIpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAoaWYgbnVtZXJpY2FsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVu
Y2FsbCBudW1jb21wIChjYXIgYzEpIChjYXIgYzIpKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChmdW5jYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ2NvbXAKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChzdHJpbmdwIChjYXIgYzEpKQorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciBjMSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoZm9ybWF0ICIlcyIgKGNhciBjMSkpKQorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoaWYgKHN0cmluZ3AgKGNhciBjMikpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAoY2FyIGMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQg
IiVzIiAoY2FyIGMyKSkpKSkpKSkpKSkpKQogCiAoZGVmdW4gdnRhYmxlLS1pbmRpY2F0b3IgKHRh
YmxlIGluZGV4KQogICAobGV0ICgob3JkZXIgKGNhciAobGFzdCAodnRhYmxlLXNvcnQtYnkgdGFi
bGUpKSkpKQpAQCAtODYwLDcgKzk1OCw4IEBAIHZ0YWJsZS0tY29tcHV0ZS13aWR0aAogICAgICgv
ICgqIChzdHJpbmctdG8tbnVtYmVyIChtYXRjaC1zdHJpbmcgMSBzcGVjKSkgKHdpbmRvdy13aWR0
aCBuaWwgdCkpCiAgICAgICAgMTAwKSkKICAgICh0Ci0gICAgKGVycm9yICJJbnZhbGlkIHNwZWM6
ICVzIiBzcGVjKSkpKQorICAgIChlcnJvciAiSW52YWxpZCBzcGVjOiAlcyAodnRhYmxlIGAlcycp
IgorICAgICAgICAgICBzcGVjICh2dGFibGUtbmFtZSB0YWJsZSkpKSkpCiAKIChkZWZ1biB2dGFi
bGUtLWNvbXB1dGUtd2lkdGhzICh0YWJsZSBjYWNoZSkKICAgIkNvbXB1dGUgdGhlIGRpc3BsYXkg
d2lkdGhzIGZvciBUQUJMRS4KQEAgLTk3Miw3ICsxMDcxLDEzIEBAIHZ0YWJsZS1yZXZlcnQKICAg
ICAgICh2dGFibGUtZ290by1jb2x1bW4gY29sdW1uKSkpKQogCiAoZGVmdW4gdnRhYmxlLS13aWR0
aHMgKHRhYmxlKQotICAobnRoIDEgKHZ0YWJsZS0tZW5zdXJlLWNhY2hlIHRhYmxlKSkpCisgICh2
dGFibGUtLWNhY2hlLXdpZHRocyAodnRhYmxlLS1lbnN1cmUtY2FjaGUgdGFibGUpKSkKKworKGRl
ZnVuIHZ0YWJsZS0tY2FjaGUtd2lkdGhzIChjYWNoZSkKKyAgKG50aCAxIGNhY2hlKSkKKworKGRl
ZnVuIHZ0YWJsZS0tY2FjaGUtbGluZXMgKGNhY2hlKQorICAoY2FyIGNhY2hlKSkKIAogOzs7IENv
bW1hbmRzLgogCmRpZmYgLS1naXQgYS90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMu
ZWwgYi90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUtdGVzdHMuZWwKaW5kZXggNzRmYjhjYzgx
MzkuLmIzMjAxYzdhOWQ4IDEwMDY0NAotLS0gYS90ZXN0L2xpc3AvZW1hY3MtbGlzcC92dGFibGUt
dGVzdHMuZWwKKysrIGIvdGVzdC9saXNwL2VtYWNzLWxpc3AvdnRhYmxlLXRlc3RzLmVsCkBAIC0y
Nyw3ICsyNyw3IEBACiAocmVxdWlyZSAnZXJ0KQogKHJlcXVpcmUgJ2VydC14KQogCi0oZXJ0LWRl
ZnRlc3QgdGVzdC12c3RhYmxlLWNvbXB1dGUtY29sdW1ucyAoKQorKGVydC1kZWZ0ZXN0IHRlc3Qt
dnRhYmxlLWNvbXB1dGUtY29sdW1ucyAoKQogICAoc2hvdWxkCiAgICAoZXF1YWwgKG1hcGNhcgog
ICAgICAgICAgICAobGFtYmRhIChjb2x1bW4pCkBAIC00MSw3ICs0MSw3IEBAIHRlc3QtdnN0YWJs
ZS1jb21wdXRlLWNvbHVtbnMKIAogKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLWluc2VydC1vYmpl
Y3QgKCkKICAgKHNob3VsZAotICAgKGVxdWFsIChsZXQgKChidWZmZXIgKGdldC1idWZmZXItY3Jl
YXRlICIgKnZ0YWJsZS10ZXN0KiIpKSkKKyAgIChlcXVhbCAobGV0ICgoYnVmZmVyIChnZXQtYnVm
ZmVyLWNyZWF0ZSAiKnZ0YWJsZS10ZXN0KiIpKSkKICAgICAgICAgICAgIChwb3AtdG8tYnVmZmVy
IGJ1ZmZlcikKICAgICAgICAgICAgIChlcmFzZS1idWZmZXIpCiAgICAgICAgICAgICAobGV0KiAo
KG9iamVjdDEgJygiRm9vIiAzKSkKQEAgLTY5LDQgKzY5LDEzMCBAQCB0ZXN0LXZ0YWJsZS1pbnNl
cnQtb2JqZWN0CiAgICAgICAgICAgICAgIChtYXBjYXIgIydjYWRyICh2dGFibGUtb2JqZWN0cyB0
YWJsZSkpKSkKICAgICAgICAgICAobnVtYmVyLXNlcXVlbmNlIDAgMTEpKSkpCiAKKyhlcnQtZGVm
dGVzdCB0ZXN0LXZ0YWJsZS1kdXBsaWNhdGUtb2JqZWN0ICgpCisgIChsZXQgKChidWZmZXIgKGdl
dC1idWZmZXItY3JlYXRlICIqdnRhYmxlLXRlc3QqIikpKQorICAgIChwb3AtdG8tYnVmZmVyIGJ1
ZmZlcikKKyAgICAoZXJhc2UtYnVmZmVyKQorICAgIChsZXQqICgob2JqZWN0MSAiWFhYIikKKyAg
ICAgICAgICAgKG9iamVjdDIgIllZWSIpCisgICAgICAgICAgICh0YWJsZQorICAgICAgICAgICAg
KG1ha2UtdnRhYmxlCisgICAgICAgICAgICAgOnVzZS1oZWFkZXItbGluZSBuaWwKKyAgICAgICAg
ICAgICA6b2JqZWN0LWVxdWFsICMnZXEgOyBJZGVudGl0eS4KKyAgICAgICAgICAgICA6ZHVwbGlj
YXRlLW9iamVjdHMgJ2Vycm9yCisgICAgICAgICAgICAgOm9iamVjdHMgKGxpc3Qgb2JqZWN0MSBv
YmplY3QyKSkpKQorICAgICAgKHNob3VsZC1lcnJvcgorICAgICAgICh2dGFibGUtaW5zZXJ0LW9i
amVjdCB0YWJsZSBvYmplY3QxKQorICAgICAgIDp0eXBlICdlcnJvcikKKyAgICAgIChzaG91bGQt
ZXJyb3IKKyAgICAgICAodnRhYmxlLXVwZGF0ZS1vYmplY3QgdGFibGUgb2JqZWN0MiBvYmplY3Qx
KQorICAgICAgIDp0eXBlICdlcnJvcikKKyAgICAgIDs7IE5vIGVycm9yLgorICAgICAgKHZ0YWJs
ZS1pbnNlcnQtb2JqZWN0IHRhYmxlICJaWloiKQorICAgICAgKHNob3VsZCAoZXEgMyAobGVuZ3Ro
ICh2dGFibGUtb2JqZWN0cyB0YWJsZSkpKSkpKSkKKworKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxl
LXVwZGF0ZS1vYmplY3QgKCkKKyAgKGxldCAoKGJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIip2
dGFibGUtdGVzdCoiKSkpCisgICAgKHBvcC10by1idWZmZXIgYnVmZmVyKQorICAgIChlcmFzZS1i
dWZmZXIpCisgICAgKGxldCogKChvYmplY3QxIChjb25zICJYWFgiIDEpKQorICAgICAgICAgICAo
b2JqZWN0MiAoY29ucyAiWVlZIiAyKSkKKyAgICAgICAgICAgKHRhYmxlCisgICAgICAgICAgICAo
bWFrZS12dGFibGUKKyAgICAgICAgICAgICA6dXNlLWhlYWRlci1saW5lIG5pbAorICAgICAgICAg
ICAgIDpvYmplY3QtZXF1YWwgIydlcSA7IElkZW50aXR5LgorICAgICAgICAgICAgIDpjb2x1bW5z
ICcoKDpuYW1lICJYWFgiKSkKKyAgICAgICAgICAgICA6b2JqZWN0cyAobGlzdCBvYmplY3QxIG9i
amVjdDIpKSkpCisgICAgICAoc2hvdWxkLWVycm9yICh2dGFibGUtdXBkYXRlLW9iamVjdCB0YWJs
ZSAiWlpaIikpCisgICAgICAoc2V0Y2RyIG9iamVjdDEgMykKKyAgICAgICh2dGFibGUtdXBkYXRl
LW9iamVjdCB0YWJsZSBvYmplY3QxKQorICAgICAgKHNob3VsZCAoZXEgMyAoY2RyIChhc3NvYyAi
WFhYIiAodnRhYmxlLW9iamVjdHMgdGFibGUpKSkpKSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12
dGFibGUtcmVtb3ZlLW9iamVjdCAoKQorICAobGV0ICgoYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0
ZSAiKnZ0YWJsZS10ZXN0KiIpKSkKKyAgICAocG9wLXRvLWJ1ZmZlciBidWZmZXIpCisgICAgKGVy
YXNlLWJ1ZmZlcikKKyAgICAobGV0KiAoKG9iamVjdDEgKGNvbnMgIlhYWCIgMSkpCisgICAgICAg
ICAgIChvYmplY3QyIChjb25zICJZWVkiIDIpKQorICAgICAgICAgICAodGFibGUKKyAgICAgICAg
ICAgIChtYWtlLXZ0YWJsZQorICAgICAgICAgICAgIDp1c2UtaGVhZGVyLWxpbmUgbmlsCisgICAg
ICAgICAgICAgOm9iamVjdC1lcXVhbCAjJ2VxIDsgSWRlbnRpdHkuCisgICAgICAgICAgICAgOmNv
bHVtbnMgJygoOm5hbWUgIlhYWCIpKQorICAgICAgICAgICAgIDpvYmplY3RzIChsaXN0IG9iamVj
dDEgb2JqZWN0MikpKSkKKyAgICAgIChzaG91bGQtZXJyb3IgKHZ0YWJsZS1yZW1vdmUtb2JqZWN0
IHRhYmxlICJaWloiKSkKKyAgICAgICh2dGFibGUtcmVtb3ZlLW9iamVjdCB0YWJsZSBvYmplY3Qx
KQorICAgICAgKHNob3VsZCAoZXEgMSAobGVuZ3RoICh2dGFibGUtb2JqZWN0cyB0YWJsZSkpKSkp
KSkKKworKGVydC1kZWZ0ZXN0IHRlc3QtdnRhYmxlLW9iamVjdC1lcXVhbCAoKQorICAobGV0ICgo
YnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAiKnZ0YWJsZS10ZXN0KiIpKSkKKyAgICAocG9wLXRv
LWJ1ZmZlciBidWZmZXIpCisgICAgKGVyYXNlLWJ1ZmZlcikKKyAgICAobGV0KiAoKG9iamVjdDEg
IlhYWCIpCisgICAgICAgICAgIChvYmplY3QyICJYWFgiKQorICAgICAgICAgICAodGFibGUtZXEK
KyAgICAgICAgICAgIChwcm9nbgorICAgICAgICAgICAgICAoZ290by1jaGFyIChwb2ludC1tYXgp
KQorICAgICAgICAgICAgICAobWFrZS12dGFibGUKKyAgICAgICAgICAgICAgIDp1c2UtaGVhZGVy
LWxpbmUgbmlsCisgICAgICAgICAgICAgICA6Y29sdW1ucyAnKCg6bmFtZSAidGFibGUtZXEiIDp3
aWR0aCAyMCkpCisgICAgICAgICAgICAgICA6b2JqZWN0LWVxdWFsICMnZXEgOyBJZGVudGl0eS4K
KyAgICAgICAgICAgICAgIDpvYmplY3RzIChsaXN0IG9iamVjdDEgb2JqZWN0MikpKSkKKyAgICAg
ICAgICAgKHRhYmxlLWVxdWFsCisgICAgICAgICAgICAocHJvZ24KKyAgICAgICAgICAgICAgKGdv
dG8tY2hhciAocG9pbnQtbWF4KSkKKyAgICAgICAgICAgICAgKG1ha2UtdnRhYmxlCisgICAgICAg
ICAgICAgICA6dXNlLWhlYWRlci1saW5lIG5pbAorICAgICAgICAgICAgICAgOmNvbHVtbnMgJygo
Om5hbWUgInRhYmxlLWVxdWFsIiA6d2lkdGggMjApKQorICAgICAgICAgICAgICAgOm9iamVjdC1l
cXVhbCAjJ2VxdWFsIDsgVmFsdWUuCisgICAgICAgICAgICAgICA6b2JqZWN0cyAobGlzdCBvYmpl
Y3QxIG9iamVjdDIpKSkpKQorICAgICAgKHNob3VsZAorICAgICAgIChwcm9nbgorICAgICAgICAg
KHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlLWVxKQorICAgICAgICAgKHZ0YWJsZS1nb3RvLW9iamVj
dCBvYmplY3QyKQorICAgICAgICAgKGVxdWFsIG9iamVjdDIgKGdldC10ZXh0LXByb3BlcnR5IChw
b2ludCkgJ3Z0YWJsZS1vYmplY3QpKSkpCisgICAgICAoc2hvdWxkLW5vdAorICAgICAgIChwcm9n
bgorICAgICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlLWVxKQorICAgICAgICAgKHZ0YWJs
ZS1nb3RvLW9iamVjdCAiWlpaIikKKyAgICAgICAgIChlcXVhbCBvYmplY3QxIChnZXQtdGV4dC1w
cm9wZXJ0eSAocG9pbnQpICd2dGFibGUtb2JqZWN0KSkpKQorICAgICAgKHNob3VsZAorICAgICAg
IChwcm9nbgorICAgICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxlLWVxdWFsKQorICAgICAg
ICAgKHZ0YWJsZS1nb3RvLW9iamVjdCBvYmplY3QyKQorICAgICAgICAgKGVxdWFsIG9iamVjdDEg
KGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ3Z0YWJsZS1vYmplY3QpKSkpCisgICAgICAoc2hv
dWxkLW5vdAorICAgICAgIChwcm9nbgorICAgICAgICAgKHZ0YWJsZS1nb3RvLXRhYmxlIHRhYmxl
LWVxdWFsKQorICAgICAgICAgKHZ0YWJsZS1nb3RvLW9iamVjdCAiWlpaIikKKyAgICAgICAgIChl
cXVhbCBvYmplY3QxIChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICd2dGFibGUtb2JqZWN0KSkp
KSkpKQorCisoZXJ0LWRlZnRlc3QgdGVzdC12dGFibGUtY29sdW1uLWNvbXBhcmF0b3IgKCkKKyAg
KGxldCAoKGJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIip2dGFibGUtdGVzdCoiKSkpCisgICAg
KHBvcC10by1idWZmZXIgYnVmZmVyKQorICAgIChlcmFzZS1idWZmZXIpCisgICAgKGxldCAoKHRh
YmxlCisgICAgICAgICAgIChtYWtlLXZ0YWJsZQorICAgICAgICAgICAgOnVzZS1oZWFkZXItbGlu
ZSB0CisgICAgICAgICAgICA6Z2V0dGVyIChsYW1iZGEgKG9iamVjdCBfaW5kZXggX3RhYmxlKSBv
YmplY3QpCisgICAgICAgICAgICA6Y29sdW1ucyAnKCggOm5hbWUgIkRhdGUiCisgICAgICAgICAg
ICAgICAgICAgICAgICAgOnByaW1hcnkgYXNjZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAg
OndpZHRoIDQwCisgICAgICAgICAgICAgICAgICAgICAgICAgOmZvcm1hdHRlciAobGFtYmRhIChv
YmplY3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgKCh0aW1l
IChkYXRlLXRvLXRpbWUgb2JqZWN0KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKGZvcm1hdCAiJXMgKCVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChmb3JtYXQtdGltZS1zdHJpbmcgIiVBLCAlQiAlZCAlWSIgdGlt
ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIg
dGltZSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6Y29tcGFyYXRvciAobGFtYmRhIChv
YmplY3QxIG9iamVjdDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
bGV0ICgodGltZTEgKGRhdGUtdG8tdGltZSBvYmplY3QxKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lMiAoZGF0ZS10by10aW1lIG9iamVjdDIpKSkK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDwgKGNhciB0aW1lMSkK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciB0aW1lMikp
KSkpKQorICAgICAgICAgICAgOm9iamVjdHMgJygiRnJpLCAxMSBKdWwgMjAyNSIKKyAgICAgICAg
ICAgICAgICAgICAgICAgIlRodSwgMTAgSnVsIDIwMjUiKSkpKQorICAgICAgKHNob3VsZAorICAg
ICAgIChzdHJpbmc9CisgICAgICAgICJUaHVyc2RheSIKKyAgICAgICAgKHRoaW5nLWF0LXBvaW50
ICd3b3JkKSkpKSkpCisKIDs7OyB2dGFibGUtdGVzdHMuZWwgZW5kcyBoZXJlCi0tIAoyLjQ3LjEK
Cg==
--000000000000d5919c0639d367f0--




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#79009; 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: Tue, 15 Jul 2025 11:30:02 UTC

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