GNU logs - #74900, boring messages


Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#74900] [PATCH] Replace (guix build json) with (json) in node build system
Resent-From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 15 Dec 2024 20:31:01 +0000
Resent-Message-ID: <handler.74900.B.17342946445964 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: report 74900
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 74900 <at> debbugs.gnu.org
X-Debbugs-Original-To: guix-patches@HIDDEN
Received: via spool by submit <at> debbugs.gnu.org id=B.17342946445964
          (code B ref -1); Sun, 15 Dec 2024 20:31:01 +0000
Received: (at submit) by debbugs.gnu.org; 15 Dec 2024 20:30:44 +0000
Received: from localhost ([127.0.0.1]:52310 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tMvGD-0001Y5-Sl
	for submit <at> debbugs.gnu.org; Sun, 15 Dec 2024 15:30:44 -0500
Received: from lists.gnu.org ([209.51.188.17]:37042)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <d.khodabakhsh@HIDDEN>) id 1tMvG8-0001Xp-02
 for submit <at> debbugs.gnu.org; Sun, 15 Dec 2024 15:30:39 -0500
Received: from eggs.gnu.org ([2001:470:142:3::10])
 by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)
 (Exim 4.90_1) (envelope-from <d.khodabakhsh@HIDDEN>)
 id 1tMvG5-0002IP-Vn
 for guix-patches@HIDDEN; Sun, 15 Dec 2024 15:30:34 -0500
Received: from mail-vs1-xe34.google.com ([2607:f8b0:4864:20::e34])
 by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128)
 (Exim 4.90_1) (envelope-from <d.khodabakhsh@HIDDEN>)
 id 1tMvG1-0002Ah-S8
 for guix-patches@HIDDEN; Sun, 15 Dec 2024 15:30:33 -0500
Received: by mail-vs1-xe34.google.com with SMTP id
 ada2fe7eead31-4afe4f1ce18so912096137.3
 for <guix-patches@HIDDEN>; Sun, 15 Dec 2024 12:30:28 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1734294628; x=1734899428; darn=gnu.org;
 h=to:subject:message-id:date:from:mime-version:from:to:cc:subject
 :date:message-id:reply-to;
 bh=1aU7kTCHHblHVZOr7RcCbL4C1R3ZTukOCrn72YxUyJo=;
 b=T1xo5TqdjsJthpOCNRpCmsom4c44qZHElsZ4UKExZ+dvRjRpzX8P+gsZAR7o0WlxL/
 BvckoF3sYGVVdy9wbaw1+bntSdu+/4qUMhffQHvvewoI+RT3cJPRwCkc+nXIhHM/oWj6
 KiPSkVU8AhB23R3P2atjuDs/7glePx0lxYqrFuQV2geRXVxylOnBAWhfnpYONUc8kKKx
 PVgd6auayGB+NtOhwBAqDaOdrHnLr4NnkpZqQXojmzn4jbjdmOqWXgAeYqJgpsTEopE3
 26rNbVzXhBU7NqFxh/B9KHXWdUMf6TmnYvsIon5/g9Qm7K4gnZOJFoetUCNHxBZDeFtS
 37Zg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1734294628; x=1734899428;
 h=to:subject:message-id:date:from:mime-version:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=1aU7kTCHHblHVZOr7RcCbL4C1R3ZTukOCrn72YxUyJo=;
 b=HbLdWKGR8mED1qJX/543VHxcmkatFDARGE57Svm2KQd/0Zg9RqbMh7ppKyK1oL9Dfl
 pm9RxAJ/sUpHOsfspCVu6kWJPDUJd71vfVTnf30KakDKp8zVO1S4pYX4mBoPqFlFp6CA
 xAUF1KtgQSO6wUC+qrjYOdNIcP7OrV5NKqmOioaY35eCUh0i3pKOsty0SzMbh836NwS1
 o6QDea9xyRQC7mcC6zauGD7FRznlrwQopgzJnn070FBc3flxz9aBvDDkdVx4W6o3LaST
 K5hUtovuSKetsnA9aosHZoZdJ2yzpa8lGdsRmE5Tk5tCNrMD5UXNZw6OyMzHHZ1IPs5o
 D7+w==
X-Gm-Message-State: AOJu0Yx0WbiGXsguAQcIPtW14t0i/OMe1ofWH4TQrrTITqTA4U44ZiA+
 7O07LW8qslSkhMgOOwZbwAZVj4UhiZbs5K2r117hct7/A94m8rQjksn8YR/x8m/xQdL3SpSNGuZ
 /OCsFkV+etRxSbLZHonbdk3IFGNNg4mbM
X-Gm-Gg: ASbGncunZ8wExPlFDWERY7EFwb8Ce3X8Wdb7V6bJUFox1XaTi3R1wGL4dVim4S/3MVf
 kmAWLNGQEDKDtrvkkauM7un1m6RIrq38XrLzReQ==
X-Google-Smtp-Source: AGHT+IEQTYixPjgGZ/8YSpwGTZFFPp7bctWyrd7qmb97Jal/3Jnabmt5ZYebCkRh5AF2W3Lbb4pnRWbZjXH4QPBgL0A=
X-Received: by 2002:a05:6102:cd3:b0:4b2:5d10:58f1 with SMTP id
 ada2fe7eead31-4b25d9bc2f2mr12180732137.11.1734294627535; Sun, 15 Dec 2024
 12:30:27 -0800 (PST)
MIME-Version: 1.0
From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Date: Sun, 15 Dec 2024 20:30:16 +0000
Message-ID: <CAADuFnKAGHb2=rTFiwD9yXN3=OKbZdragGaCJJ0BkOhofDb2KQ@HIDDEN>
Content-Type: multipart/mixed; boundary="00000000000035ee88062954efaa"
Received-SPF: pass client-ip=2607:f8b0:4864:20::e34;
 envelope-from=d.khodabakhsh@HIDDEN; helo=mail-vs1-xe34.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,
 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.3 (-)
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: -2.3 (--)

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

This change replaces the use of (guix build json) with (json) for the
node ecosystem.
Since guile-json is a dependency of Guix, and it's used elsewhere in
the project, it makes sense to use this instead of rolling our own
JSON implementation with (guix build json).
This is one step to move away from (guix build json), there will be
other changes to remove the other uses of it.

I tested it out by building the 4 affected node-xyz packages and
verified that the modified package.json was correct for node-acorn and
node-addon-api.

Signed-off-by: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Change-Id: I0c86b3039eb2f50a19f9d9650f5a73b3a473ad37
---
 gnu/packages/node-xyz.scm        | 148 ++++++++++++--------------
 guix/build-system/node.scm       |   6 +-
 guix/build/node-build-system.scm | 176 +++++++++++--------------------
 3 files changed, 135 insertions(+), 195 deletions(-)

diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm
index cf6f50e3ce..decfb50a66 100644
--- a/gnu/packages/node-xyz.scm
+++ b/gnu/packages/node-xyz.scm
@@ -7,6 +7,7 @@
 ;;; Copyright =C2=A9 2021 Dhruvin Gandhi <contact@HIDDEN>
 ;;; Copyright =C2=A9 2022 Nicolas Graves <ngraves@HIDDEN>
 ;;; Copyright =C2=A9 2023 Jelle Licht <jlicht@HIDDEN>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -24,14 +25,14 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

 (define-module (gnu packages node-xyz)
-  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu packages sqlite)
   #:use-module (gnu packages python)
   #:use-module (gnu packages web)
+  #:use-module (guix build-system node)
   #:use-module (guix gexp)
-  #:use-module (guix packages)
   #:use-module (guix git-download)
-  #:use-module (guix build-system node))
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages))

 ;;;
 ;;; Please: Try to add new module packages in alphabetic order.
@@ -69,19 +70,17 @@ (define-public node-acorn
              ;; it would try to use the build environment and would block =
the
              ;; automatic building by other packages making use of node-ac=
orn.
              ;; TODO: Add utility function
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (cons '@ (map (match-lambda
-                                  (("scripts" @ . scripts-alist)
-                                   `("scripts" @ ,@(filter (match-lambda
-                                                             (("prepare" .=
 _)
-                                                              #f)
-                                                             (_
-                                                              #t))
-                                                           scripts-alist))=
)
-                                  (other other))
-                                pkg-meta-alist)))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (filter
+                       (match-lambda
+                         (("prepare" . _) #f)
+                         (_ #t))
+                       scripts-alist)))
+                   (other other))
+                 pkg-meta-alist)))))
          (replace 'build
            (lambda* (#:key inputs native-inputs #:allow-other-keys)
              (let ((esbuild (search-input-file (or native-inputs inputs)
@@ -156,23 +155,17 @@ (define-public node-addon-api
            (lambda args
              (define new-test-script
                "echo stopping after pretest on Guix")
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (cons
-                   '@
-                   (map (match-lambda
-                          (("scripts" '@ . scripts-alist)
-                           `("scripts" @ ,@(map (match-lambda
-                                                  (("test" . _)
-                                                   (cons "test"
-                                                         new-test-script))
-                                                  (other
-                                                   other))
-                                                scripts-alist)))
-                          (other
-                           other))
-                        pkg-meta-alist))))))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (map
+                       (match-lambda
+                         (("test" . _) (cons "test" new-test-script))
+                         (other other))
+                       scripts-alist)))
+                   (other other))
+                 pkg-meta-alist))))))))
     (home-page "https://github.com/nodejs/node-addon-api")
     (synopsis "Node.js API (Node-API) header-only C++ wrappers")
     (description "This module contains header-only C++ wrapper classes whi=
ch
@@ -1221,22 +1214,19 @@ (define-public node-serialport-bindings
                                     "node-abi"))))
          (add-after 'chdir 'avoid-prebuild-install
            (lambda args
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (cons '@ (map (match-lambda
-                                  (("scripts" @ . scripts-alist)
-                                   `("scripts" @ ,@(filter (match-lambda
-                                                             (("install" .=
 _)
-                                                              #f)
-                                                             (_
-                                                              #t))
-                                                           scripts-alist))=
)
-                                  (("gypfile" . _)
-                                   '("gypfile" . #f))
-                                  (other
-                                   other))
-                                pkg-meta-alist))))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (filter
+                       (match-lambda
+                         (("install" . _) #f)
+                         (_ #t))
+                       scripts-alist)))
+                   (("gypfile" . _)
+                     (cons "gypfile" #f))
+                   (other other))
+                 pkg-meta-alist))))))
        #:tests? #f))
     (synopsis "Abstract base class for Node SerialPort bindings")
     (description "Node SerialPort is a modular suite of Node.js packages f=
or
@@ -1522,39 +1512,33 @@ (define-public node-sqlite3
              (substitute* ".npmignore"
                (("lib/binding")
                 "#lib/binding # <- patched for Guix"))
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (match (assoc-ref pkg-meta-alist "binary")
-                    (('@ . binary-alist)
-                     ;; When it builds from source, node-pre-gyp supplies
-                     ;; module_name and module_path based on the entries u=
nder
-                     ;; "binary" from "package.json", so this package's
-                     ;; "binding.gyp" doesn't define them. Thus, we also n=
eed
-                     ;; to supply them. The GYP_DEFINES environment variab=
le
-                     ;; turns out to be the easiest way to make sure they =
are
-                     ;; propagated from npm to node-gyp to gyp.
-                     (setenv "GYP_DEFINES"
-                             (string-append
-                              "module_name=3D"
-                              (assoc-ref binary-alist "module_name")
-                              " "
-                              "module_path=3D"
-                              (assoc-ref binary-alist "module_path")))))
-                  ;; We need to remove the install script from "package.js=
on",
-                  ;; as it would try to use node-pre-gyp and would block t=
he
-                  ;; automatic building performed by `npm install`.
-                  (cons '@ (map (match-lambda
-                                  (("scripts" @ . scripts-alist)
-                                   `("scripts" @ ,@(filter (match-lambda
-                                                             (("install" .=
 _)
-                                                              #f)
-                                                             (_
-                                                              #t))
-                                                           scripts-alist))=
)
-                                  (other
-                                   other))
-                                pkg-meta-alist))))))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (let ((binary-alist (assoc-ref pkg-meta-alist "binary")))
+                 ;; When it builds from source, node-pre-gyp supplies
+                 ;; module_name and module_path based on the entries under
+                 ;; "binary" from "package.json", so this package's
+                 ;; "binding.gyp" doesn't define them. Thus, we also need
+                 ;; to supply them. The GYP_DEFINES environment variable
+                 ;; turns out to be the easiest way to make sure they are
+                 ;; propagated from npm to node-gyp to gyp.
+                 (setenv "GYP_DEFINES" (string-append
+                   "module_name=3D"
+                   (assoc-ref binary-alist "module_name")
+                   " module_path=3D"
+                   (assoc-ref binary-alist "module_path"))))
+               ;; We need to remove the install script from "package.json"=
,
+               ;; as it would try to use node-pre-gyp and would block the
+               ;; automatic building performed by `npm install`.
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (filter
+                       (match-lambda
+                         (("install" . _) #f)
+                         (_ #t))
+                       scripts-alist)))
+                   (other other))
+                 pkg-meta-alist))))))))
     (home-page "https://github.com/mapbox/node-sqlite3")
     (synopsis "Node.js bindings for SQLite3")
     (description
diff --git a/guix/build-system/node.scm b/guix/build-system/node.scm
index 57fe5f6030..425b8cd9b3 100644
--- a/guix/build-system/node.scm
+++ b/guix/build-system/node.scm
@@ -4,6 +4,7 @@
 ;;; Copyright =C2=A9 2021 Ludovic Court=C3=A8s <ludo@HIDDEN>
 ;;; Copyright =C2=A9 2021 Pierre Langlois <pierre.langlois@HIDDEN>
 ;;; Copyright =C2=A9 2021 Philip McGrath <philip@HIDDEN>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -36,7 +37,10 @@ (define-module (guix build-system node)
 (define %node-build-system-modules
   ;; Build-side modules imported by default.
   `((guix build node-build-system)
-    (guix build json)
+    (json)
+    (json builder)
+    (json parser)
+    (json record)
     ,@%default-gnu-imported-modules))

 (define (default-node)
diff --git a/guix/build/node-build-system.scm b/guix/build/node-build-syste=
m.scm
index fb23894bc1..ef0f88a5a7 100644
--- a/guix/build/node-build-system.scm
+++ b/guix/build/node-build-system.scm
@@ -4,6 +4,7 @@
 ;;; Copyright =C2=A9 2019, 2021 Timothy Sample <samplet@HIDDEN>
 ;;; Copyright =C2=A9 2021, 2022 Philip McGrath <philip@HIDDEN>
 ;;; Copyright =C2=A9 2022 Liliana Marie Prikler <liliana.prikler@HIDDEN=
>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -23,10 +24,10 @@
 (define-module (guix build node-build-system)
   #:use-module ((guix build gnu-build-system) #:prefix gnu:)
   #:use-module (guix build utils)
-  #:use-module (guix build json)
   #:use-module (ice-9 ftw)
   #:use-module (ice-9 regex)
   #:use-module (ice-9 match)
+  #:use-module (json)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-71)
   #:export (%standard-phases
@@ -34,13 +35,13 @@ (define-module (guix build node-build-system)
             delete-dependencies
             node-build))

-(define (with-atomic-json-file-replacement file proc)
+(define* (with-atomic-json-file-replacement proc #:optional (file
"package.json"))
   "Like 'with-atomic-file-replacement', but PROC is called with a single
 argument---the result of parsing FILE's contents as json---and should a va=
lue
 to be written as json to the replacement FILE."
   (with-atomic-file-replacement file
     (lambda (in out)
-      (write-json (proc (read-json in)) out))))
+      (scm->json (proc (json->scm in)) out))))

 (define* (assoc-ref* alist key #:optional default)
   "Like assoc-ref, but return DEFAULT instead of #f if no value exists."
@@ -48,10 +49,6 @@ (define* (assoc-ref* alist key #:optional default)
     (#f default)
     ((_ . value) value)))

-(define* (jsobject-ref obj key #:optional default)
-  (match obj
-    (('@ . alist) (assoc-ref* alist key default))))
-
 (define* (alist-pop alist key #:optional (=3D equal?))
   "Return two values, the first pair in ALIST with key KEY, and the other
 elements.  Equality calls are made as (=3D KEY ALISTCAR)."
@@ -63,67 +60,17 @@ (define* (alist-pop alist key #:optional (=3D equal?))
         (values (car after) (append before (cdr after)))
         (values #f before))))

-(define* (alist-update alist key proc #:optional default (=3D equal?))
+(define* (alist-update alist key proc #:optional (=3D equal?))
   "Return an association list like ALIST, but with KEY mapped to the resul=
t of
 PROC applied to the first value found under the comparison (=3D KEY ALISTC=
AR).
-If no such value exists, use DEFAULT instead.
+If no such value exists, return the list unchanged.
 Unlike acons, this removes the previous association of KEY (assuming it is
 unique), but the result may still share storage with ALIST."
   (let ((pair rest (alist-pop alist key =3D)))
-    (acons key
-           (proc (if (pair? pair)
-                     (cdr pair)
-                     default))
-           rest)))
-
-(define (jsobject-update* js . updates)
-  "Return a json object like JS, but with all UPDATES applied.  Each updat=
e is
-a list (KEY PROC [DEFAULT]), so that KEY is mapped to the result of PROC
-applied to the value to which KEY is mapped in JS.  If no such mapping exi=
sts,
-PROC is instead applied to DEFAULT, or to '#f' is no DEFAULT is specified.
-The update takes place from left to right, so later UPDATERs will receive =
the
-values returned by earlier UPDATERs for the same KEY."
-  (match js
-    (('@ . alist)
-     (let loop ((alist alist)
-                (updates updates))
-       (match updates
-         (() (cons '@ alist))
-         (((key proc) . updates)
-          (loop (alist-update alist key proc #f equal?) updates))
-         (((key proc default) . updates)
-          (loop (alist-update alist key proc default equal?) updates))))))=
)
-
-(define (jsobject-union combine seed . objects)
-  "Merge OBJECTS into SEED by applying (COMBINE KEY VAL0 VAL), where VAL0
-is the value found in the (possibly updated) SEED and VAL is the new value
-found in one of the OBJECTS."
-  (match seed
-    (('@ . aseed)
-     (match objects
-       (() seed)
-       ((('@ . alists) ...)
-        (cons
-         '@
-         (fold (lambda (alist aseed)
-                 (if (null? aseed) alist
-                     (fold
-                      (match-lambda*
-                        (((k . v) aseed)
-                         (let ((pair tail (alist-pop alist k)))
-                           (match pair
-                             (#f (acons k v aseed))
-                             ((_ . v0) (acons k (combine k v0 v) aseed))))=
))
-                      aseed
-                      alist)))
-               aseed
-               alists)))))))
+    (if (pair? pair)
+      (acons key (proc (cdr pair)) rest)
+      alist)))

-;; Possibly useful helper functions:
-;; (define (newest key val0 val) val)
-;; (define (unkeyed->keyed proc) (lambda (_key val0 val) (proc val0 val)))
-
-
 ;;;
 ;;; Phases.
 ;;;
@@ -142,8 +89,8 @@ (define (set-home . _)

 (define (module-name module)
   (let* ((package.json (string-append module "/package.json"))
-         (package-meta (call-with-input-file package.json read-json)))
-    (jsobject-ref package-meta "name")))
+         (package-meta (call-with-input-file package.json json->scm)))
+    (assoc-ref package-meta "name")))

 (define (index-modules input-paths)
   (define (list-modules directory)
@@ -167,49 +114,56 @@ (define* (patch-dependencies #:key inputs
#:allow-other-keys)

   (define index (index-modules (map cdr inputs)))

-  (define resolve-dependencies
-    (match-lambda
-      (('@ . alist)
-       (cons '@ (map (match-lambda
-                       ((key . value)
-                        (cons key (hash-ref index key value))))
-                     alist)))))
+  (define (resolve-dependencies dependencies)
+    (map
+      (match-lambda
+        ((dependency . version)
+          (cons dependency (hash-ref index dependency version))))
+      dependencies))

-  (with-atomic-json-file-replacement "package.json"
+  (with-atomic-json-file-replacement
     (lambda (pkg-meta)
-      (jsobject-update*
-       pkg-meta
-       `("devDependencies" ,resolve-dependencies (@))
-       `("dependencies" ,(lambda (deps)
-                           (resolve-dependencies
-                            (jsobject-union
-                             (lambda (k a b) b)
-                             (jsobject-ref pkg-meta "peerDependencies" '(@=
))
-                             deps)))
-         (@)))))
+      (fold
+        (lambda (proc pkg-meta) (proc pkg-meta))
+        pkg-meta
+        (list
+          (lambda (pkg-meta)
+            (alist-update pkg-meta "devDependencies" resolve-dependencies)=
)
+          (lambda (pkg-meta)
+            (assoc-set!
+              pkg-meta
+              "dependencies"
+              (resolve-dependencies
+                ; Combined "peerDependencies" and "dependencies" dependenc=
ies
+                ; with "dependencies" taking precedent.
+                (fold
+                  (lambda (dependency dependencies)
+                    (assoc-set! dependencies (car dependency) (cdr
dependency)))
+                  (assoc-ref* pkg-meta "peerDependencies" '())
+                  (assoc-ref* pkg-meta "dependencies" '())
+                ))))))))
   #t)

-(define (delete-dependencies absent)
+(define (delete-dependencies dependencies-to-remove)
   "Rewrite 'package.json' to allow the build to proceed without packages
-listed in ABSENT, a list of strings naming npm packages.
+listed in 'dependencies-to-remove', a list of strings naming npm packages.

 To prevent the deleted dependencies from being reintroduced, use this func=
tion
 only after the 'patch-dependencies' phase."
-  (define delete-from-jsobject
-    (match-lambda
-      (('@ . alist)
-       (cons '@ (filter (match-lambda
-                          ((k . _)
-                           (not (member k absent))))
-                        alist)))))
-
-  (with-atomic-json-file-replacement "package.json"
+  (with-atomic-json-file-replacement
     (lambda (pkg-meta)
-      (jsobject-update*
-       pkg-meta
-       `("devDependencies" ,delete-from-jsobject (@))
-       `("dependencies" ,delete-from-jsobject (@))
-       `("peerDependencies" ,delete-from-jsobject (@))))))
+      (fold
+        (lambda (dependency-key pkg-meta)
+          (alist-update
+            pkg-meta
+            dependency-key
+            (lambda (dependencies)
+              (remove
+                (lambda (dependency)
+                  (member (car dependency) dependencies-to-remove))
+                dependencies))))
+        pkg-meta
+        (list "devDependencies" "dependencies" "peerDependencies"
"optionalDependencies")))))

 (define* (delete-lockfiles #:key inputs #:allow-other-keys)
   "Delete 'package-lock.json', 'yarn.lock', and 'npm-shrinkwrap.json', if =
they
@@ -228,8 +182,8 @@ (define* (configure #:key outputs inputs #:allow-other-=
keys)
     #t))

 (define* (build #:key inputs #:allow-other-keys)
-  (let ((package-meta (call-with-input-file "package.json" read-json)))
-    (if (jsobject-ref (jsobject-ref package-meta "scripts" '(@)) "build" #=
f)
+  (let ((package-meta (call-with-input-file "package.json" json->scm)))
+    (if (assoc-ref* (assoc-ref* package-meta "scripts" '()) "build" #f)
         (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm")))
           (invoke npm "run" "build"))
         (format #t "there is no build script to run~%"))
@@ -301,22 +255,20 @@ (define* (avoid-node-gyp-rebuild #:key outputs
#:allow-other-keys)
   ;; even need to overwrite this file.  Therefore, let's use some helpers
   ;; that we'd otherwise not need.
   (define pkg-meta
-    (call-with-input-file installed-package.json read-json))
+    (call-with-input-file installed-package.json json->scm))
   (define scripts
-    (jsobject-ref pkg-meta "scripts" '(@)))
-  (define (jsobject-set js key val)
-    (jsobject-update* js (list key (const val))))
+    (assoc-ref* pkg-meta "scripts" '()))

-  (when (equal? "node-gyp rebuild" (jsobject-ref scripts "install" #f))
+  (when (equal? "node-gyp rebuild" (assoc-ref* scripts "install" #f))
     (call-with-output-file installed-package.json
       (lambda (out)
-        (write-json
-         (jsobject-set pkg-meta
-                       "scripts"
-                       (jsobject-set scripts
-                                     "install"
-                                     "echo Guix: avoiding node-gyp rebuild=
"))
-         out)))))
+        (scm->json
+          (assoc-set! pkg-meta
+                      "scripts"
+                      (assoc-set! scripts
+                                  "install"
+                                  "echo Guix: avoiding node-gyp rebuild"))
+          out)))))

 (define %standard-phases
   (modify-phases gnu:%standard-phases

base-commit: cfd4f56f75a20b6732d463180d211f796c9032e5
--=20
2.46.0

--00000000000035ee88062954efaa
Content-Type: text/x-patch; charset="UTF-8"; 
	name="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch"
Content-Disposition: attachment; 
	filename="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_m4q28ebt0>
X-Attachment-Id: f_m4q28ebt0

RnJvbSAwMDk1YzJjZjdlOTc2NmJjNDc0MDQ0MWM4NDkyMTlhMzA2MDIzNTIyIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBEYW5pZWwgS2hvZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21h
aWwuY29tPgpEYXRlOiBTdW4sIDE1IERlYyAyMDI0IDExOjMwOjMzIC0wODAwClN1YmplY3Q6IFtQ
QVRDSF0gUmVwbGFjZSAoZ3VpeCBidWlsZCBqc29uKSB3aXRoIChqc29uKSBpbiBub2RlIGJ1aWxk
IHN5c3RlbQoKVGhpcyBjaGFuZ2UgcmVwbGFjZXMgdGhlIHVzZSBvZiAoZ3VpeCBidWlsZCBqc29u
KSB3aXRoIChqc29uKSBmb3IgdGhlIG5vZGUgZWNvc3lzdGVtLgpTaW5jZSBndWlsZS1qc29uIGlz
IGEgZGVwZW5kZW5jeSBvZiBHdWl4LCBhbmQgaXQncyB1c2VkIGVsc2V3aGVyZSBpbiB0aGUgcHJv
amVjdCwgaXQgbWFrZXMgc2Vuc2UgdG8gdXNlIHRoaXMgaW5zdGVhZCBvZiByb2xsaW5nIG91ciBv
d24gSlNPTiBpbXBsZW1lbnRhdGlvbiB3aXRoIChndWl4IGJ1aWxkIGpzb24pLgpUaGlzIGlzIG9u
ZSBzdGVwIHRvIG1vdmUgYXdheSBmcm9tIChndWl4IGJ1aWxkIGpzb24pLCB0aGVyZSB3aWxsIGJl
IG90aGVyIGNoYW5nZXMgdG8gcmVtb3ZlIHRoZSBvdGhlciB1c2VzIG9mIGl0LgoKU2lnbmVkLW9m
Zi1ieTogRGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KQ2hhbmdl
LUlkOiBJMGM4NmIzMDM5ZWIyZjUwYTE5ZjlkOTY1MGY1YTczYjNhNDczYWQzNwotLS0KIGdudS9w
YWNrYWdlcy9ub2RlLXh5ei5zY20gICAgICAgIHwgMTQ4ICsrKysrKysrKysrKy0tLS0tLS0tLS0t
LS0tCiBndWl4L2J1aWxkLXN5c3RlbS9ub2RlLnNjbSAgICAgICB8ICAgNiArLQogZ3VpeC9idWls
ZC9ub2RlLWJ1aWxkLXN5c3RlbS5zY20gfCAxNzYgKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0t
LS0tLQogMyBmaWxlcyBjaGFuZ2VkLCAxMzUgaW5zZXJ0aW9ucygrKSwgMTk1IGRlbGV0aW9ucygt
KQoKZGlmZiAtLWdpdCBhL2dudS9wYWNrYWdlcy9ub2RlLXh5ei5zY20gYi9nbnUvcGFja2FnZXMv
bm9kZS14eXouc2NtCmluZGV4IGNmNmY1MGUzY2UuLmRlY2ZiNTBhNjYgMTAwNjQ0Ci0tLSBhL2du
dS9wYWNrYWdlcy9ub2RlLXh5ei5zY20KKysrIGIvZ251L3BhY2thZ2VzL25vZGUteHl6LnNjbQpA
QCAtNyw2ICs3LDcgQEAKIDs7OyBDb3B5cmlnaHQgwqkgMjAyMSBEaHJ1dmluIEdhbmRoaSA8Y29u
dGFjdEBkaHJ1dmluLmRldj4KIDs7OyBDb3B5cmlnaHQgwqkgMjAyMiBOaWNvbGFzIEdyYXZlcyA8
bmdyYXZlc0BuZ3JhdmVzLmZyPgogOzs7IENvcHlyaWdodCDCqSAyMDIzIEplbGxlIExpY2h0IDxq
bGljaHRAZnNmZS5vcmc+Cis7OzsgQ29weXJpZ2h0IMKpIDIwMjQgRGFuaWVsIEtob2RhYmFraHNo
IDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KIDs7OwogOzs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9m
IEdOVSBHdWl4LgogOzs7CkBAIC0yNCwxNCArMjUsMTQgQEAKIDs7OyBhbG9uZyB3aXRoIEdOVSBH
dWl4LiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogCiAoZGVm
aW5lLW1vZHVsZSAoZ251IHBhY2thZ2VzIG5vZGUteHl6KQotICAjOnVzZS1tb2R1bGUgKChndWl4
IGxpY2Vuc2VzKSAjOnByZWZpeCBsaWNlbnNlOikKICAgIzp1c2UtbW9kdWxlIChnbnUgcGFja2Fn
ZXMgc3FsaXRlKQogICAjOnVzZS1tb2R1bGUgKGdudSBwYWNrYWdlcyBweXRob24pCiAgICM6dXNl
LW1vZHVsZSAoZ251IHBhY2thZ2VzIHdlYikKKyAgIzp1c2UtbW9kdWxlIChndWl4IGJ1aWxkLXN5
c3RlbSBub2RlKQogICAjOnVzZS1tb2R1bGUgKGd1aXggZ2V4cCkKLSAgIzp1c2UtbW9kdWxlIChn
dWl4IHBhY2thZ2VzKQogICAjOnVzZS1tb2R1bGUgKGd1aXggZ2l0LWRvd25sb2FkKQotICAjOnVz
ZS1tb2R1bGUgKGd1aXggYnVpbGQtc3lzdGVtIG5vZGUpKQorICAjOnVzZS1tb2R1bGUgKChndWl4
IGxpY2Vuc2VzKSAjOnByZWZpeCBsaWNlbnNlOikKKyAgIzp1c2UtbW9kdWxlIChndWl4IHBhY2th
Z2VzKSkKIAogOzs7CiA7OzsgUGxlYXNlOiBUcnkgdG8gYWRkIG5ldyBtb2R1bGUgcGFja2FnZXMg
aW4gYWxwaGFiZXRpYyBvcmRlci4KQEAgLTY5LDE5ICs3MCwxNyBAQCAoZGVmaW5lLXB1YmxpYyBu
b2RlLWFjb3JuCiAgICAgICAgICAgICAgOzsgaXQgd291bGQgdHJ5IHRvIHVzZSB0aGUgYnVpbGQg
ZW52aXJvbm1lbnQgYW5kIHdvdWxkIGJsb2NrIHRoZQogICAgICAgICAgICAgIDs7IGF1dG9tYXRp
YyBidWlsZGluZyBieSBvdGhlciBwYWNrYWdlcyBtYWtpbmcgdXNlIG9mIG5vZGUtYWNvcm4uCiAg
ICAgICAgICAgICAgOzsgVE9ETzogQWRkIHV0aWxpdHkgZnVuY3Rpb24KLSAgICAgICAgICAgICAo
d2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdlLmpzb24iCi0gICAgICAg
ICAgICAgICAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICgoJ0AgLiBwa2ctbWV0YS1h
bGlzdCkKLSAgICAgICAgICAgICAgICAgIChjb25zICdAIChtYXAgKG1hdGNoLWxhbWJkYQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiIEAgLiBzY3JpcHRzLWFs
aXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKCJzY3JpcHRzIiBAICxA
KGZpbHRlciAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgicHJlcGFyZSIgLiBfKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZikKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoXwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAjdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAob3RoZXIgb3RoZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpKSkKKyAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNv
bi1maWxlLXJlcGxhY2VtZW50IChsYW1iZGEgKHBrZy1tZXRhLWFsaXN0KQorICAgICAgICAgICAg
ICAgKG1hcAorICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAgICAgICAg
ICAgKCgic2NyaXB0cyIgLiBzY3JpcHRzLWFsaXN0KQorICAgICAgICAgICAgICAgICAgICAgKGNv
bnMgInNjcmlwdHMiIChmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJk
YQorICAgICAgICAgICAgICAgICAgICAgICAgICgoInByZXBhcmUiIC4gXykgI2YpCisgICAgICAg
ICAgICAgICAgICAgICAgICAgKF8gI3QpKQorICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRz
LWFsaXN0KSkpCisgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAgICAgICAgICAg
ICAgICAgcGtnLW1ldGEtYWxpc3QpKSkpKQogICAgICAgICAgKHJlcGxhY2UgJ2J1aWxkCiAgICAg
ICAgICAgIChsYW1iZGEqICgjOmtleSBpbnB1dHMgbmF0aXZlLWlucHV0cyAjOmFsbG93LW90aGVy
LWtleXMpCiAgICAgICAgICAgICAgKGxldCAoKGVzYnVpbGQgKHNlYXJjaC1pbnB1dC1maWxlIChv
ciBuYXRpdmUtaW5wdXRzIGlucHV0cykKQEAgLTE1NiwyMyArMTU1LDE3IEBAIChkZWZpbmUtcHVi
bGljIG5vZGUtYWRkb24tYXBpCiAgICAgICAgICAgIChsYW1iZGEgYXJncwogICAgICAgICAgICAg
IChkZWZpbmUgbmV3LXRlc3Qtc2NyaXB0CiAgICAgICAgICAgICAgICAiZWNobyBzdG9wcGluZyBh
ZnRlciBwcmV0ZXN0IG9uIEd1aXgiKQotICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29uLWZp
bGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIKLSAgICAgICAgICAgICAgIChtYXRjaC1sYW1i
ZGEKLSAgICAgICAgICAgICAgICAgKCgnQCAuIHBrZy1tZXRhLWFsaXN0KQotICAgICAgICAgICAg
ICAgICAgKGNvbnMKLSAgICAgICAgICAgICAgICAgICAnQAotICAgICAgICAgICAgICAgICAgICht
YXAgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiAn
QCAuIHNjcmlwdHMtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBgKCJzY3JpcHRz
IiBAICxAKG1hcCAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICgoInRlc3QiIC4gXykKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zICJ0ZXN0IgotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3LXRlc3Qtc2NyaXB0
KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG90
aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBv
dGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
Y3JpcHRzLWFsaXN0KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcgotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgb3RoZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgcGtn
LW1ldGEtYWxpc3QpKSkpKSkpKSkpCisgICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmls
ZS1yZXBsYWNlbWVudCAobGFtYmRhIChwa2ctbWV0YS1hbGlzdCkKKyAgICAgICAgICAgICAgICht
YXAKKyAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAgICgo
InNjcmlwdHMiIC4gc2NyaXB0cy1hbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgIChjb25zICJz
Y3JpcHRzIiAobWFwCisgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAoKCJ0ZXN0IiAuIF8pIChjb25zICJ0ZXN0IiBuZXctdGVzdC1z
Y3JpcHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlciBvdGhlcikpCisgICAgICAg
ICAgICAgICAgICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAob3Ro
ZXIgb3RoZXIpKQorICAgICAgICAgICAgICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpKSkpCiAgICAg
KGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlLWFkZG9uLWFwaSIpCiAg
ICAgKHN5bm9wc2lzICJOb2RlLmpzIEFQSSAoTm9kZS1BUEkpIGhlYWRlci1vbmx5IEMrKyB3cmFw
cGVycyIpCiAgICAgKGRlc2NyaXB0aW9uICJUaGlzIG1vZHVsZSBjb250YWlucyBoZWFkZXItb25s
eSBDKysgd3JhcHBlciBjbGFzc2VzIHdoaWNoCkBAIC0xMjIxLDIyICsxMjE0LDE5IEBAIChkZWZp
bmUtcHVibGljIG5vZGUtc2VyaWFscG9ydC1iaW5kaW5ncwogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIm5vZGUtYWJpIikpKSkKICAgICAgICAgIChhZGQtYWZ0ZXIgJ2NoZGly
ICdhdm9pZC1wcmVidWlsZC1pbnN0YWxsCiAgICAgICAgICAgIChsYW1iZGEgYXJncwotICAgICAg
ICAgICAgICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIK
LSAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgKCgnQCAuIHBr
Zy1tZXRhLWFsaXN0KQotICAgICAgICAgICAgICAgICAgKGNvbnMgJ0AgKG1hcCAobWF0Y2gtbGFt
YmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0cyIgQCAuIHNj
cmlwdHMtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlw
dHMiIEAgLEAoZmlsdGVyIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJpbnN0YWxsIiAuIF8pCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICNmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICgoImd5cGZpbGUiIC4gXykKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgJygiZ3lwZmlsZSIgLiAjZikpCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKG90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG90aGVyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnLW1ldGEtYWxpc3Qp
KSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQg
KGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAgICAobWFwCisgICAgICAgICAg
ICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiAuIHNj
cmlwdHMtYWxpc3QpCisgICAgICAgICAgICAgICAgICAgICAoY29ucyAic2NyaXB0cyIgKGZpbHRl
cgorICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAgICAgICAg
ICAgICAgICAgKCgiaW5zdGFsbCIgLiBfKSAjZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAo
XyAjdCkpCisgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKKyAgICAgICAg
ICAgICAgICAgICAoKCJneXBmaWxlIiAuIF8pCisgICAgICAgICAgICAgICAgICAgICAoY29ucyAi
Z3lwZmlsZSIgI2YpKQorICAgICAgICAgICAgICAgICAgIChvdGhlciBvdGhlcikpCisgICAgICAg
ICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpCiAgICAgICAgIzp0ZXN0cz8gI2YpKQogICAg
IChzeW5vcHNpcyAiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgTm9kZSBTZXJpYWxQb3J0IGJpbmRp
bmdzIikKICAgICAoZGVzY3JpcHRpb24gIk5vZGUgU2VyaWFsUG9ydCBpcyBhIG1vZHVsYXIgc3Vp
dGUgb2YgTm9kZS5qcyBwYWNrYWdlcyBmb3IKQEAgLTE1MjIsMzkgKzE1MTIsMzMgQEAgKGRlZmlu
ZS1wdWJsaWMgbm9kZS1zcWxpdGUzCiAgICAgICAgICAgICAgKHN1YnN0aXR1dGUqICIubnBtaWdu
b3JlIgogICAgICAgICAgICAgICAgKCgibGliL2JpbmRpbmciKQogICAgICAgICAgICAgICAgICIj
bGliL2JpbmRpbmcgIyA8LSBwYXRjaGVkIGZvciBHdWl4IikpCi0gICAgICAgICAgICAgKHdpdGgt
YXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgotICAgICAgICAgICAg
ICAgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAoKCdAIC4gcGtnLW1ldGEtYWxpc3Qp
Ci0gICAgICAgICAgICAgICAgICAobWF0Y2ggKGFzc29jLXJlZiBwa2ctbWV0YS1hbGlzdCAiYmlu
YXJ5IikKLSAgICAgICAgICAgICAgICAgICAgKCgnQCAuIGJpbmFyeS1hbGlzdCkKLSAgICAgICAg
ICAgICAgICAgICAgIDs7IFdoZW4gaXQgYnVpbGRzIGZyb20gc291cmNlLCBub2RlLXByZS1neXAg
c3VwcGxpZXMKLSAgICAgICAgICAgICAgICAgICAgIDs7IG1vZHVsZV9uYW1lIGFuZCBtb2R1bGVf
cGF0aCBiYXNlZCBvbiB0aGUgZW50cmllcyB1bmRlcgotICAgICAgICAgICAgICAgICAgICAgOzsg
ImJpbmFyeSIgZnJvbSAicGFja2FnZS5qc29uIiwgc28gdGhpcyBwYWNrYWdlJ3MKLSAgICAgICAg
ICAgICAgICAgICAgIDs7ICJiaW5kaW5nLmd5cCIgZG9lc24ndCBkZWZpbmUgdGhlbS4gVGh1cywg
d2UgYWxzbyBuZWVkCi0gICAgICAgICAgICAgICAgICAgICA7OyB0byBzdXBwbHkgdGhlbS4gVGhl
IEdZUF9ERUZJTkVTIGVudmlyb25tZW50IHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgICA7
OyB0dXJucyBvdXQgdG8gYmUgdGhlIGVhc2llc3Qgd2F5IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZQot
ICAgICAgICAgICAgICAgICAgICAgOzsgcHJvcGFnYXRlZCBmcm9tIG5wbSB0byBub2RlLWd5cCB0
byBneXAuCi0gICAgICAgICAgICAgICAgICAgICAoc2V0ZW52ICJHWVBfREVGSU5FUyIKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1hcHBlbmQKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJtb2R1bGVfbmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoYXNzb2MtcmVmIGJpbmFyeS1hbGlzdCAibW9kdWxlX25hbWUiKQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxl
X3BhdGg9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFzc29jLXJlZiBiaW5hcnkt
YWxpc3QgIm1vZHVsZV9wYXRoIikpKSkpCi0gICAgICAgICAgICAgICAgICA7OyBXZSBuZWVkIHRv
IHJlbW92ZSB0aGUgaW5zdGFsbCBzY3JpcHQgZnJvbSAicGFja2FnZS5qc29uIiwKLSAgICAgICAg
ICAgICAgICAgIDs7IGFzIGl0IHdvdWxkIHRyeSB0byB1c2Ugbm9kZS1wcmUtZ3lwIGFuZCB3b3Vs
ZCBibG9jayB0aGUKLSAgICAgICAgICAgICAgICAgIDs7IGF1dG9tYXRpYyBidWlsZGluZyBwZXJm
b3JtZWQgYnkgYG5wbSBpbnN0YWxsYC4KLSAgICAgICAgICAgICAgICAgIChjb25zICdAIChtYXAg
KG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoInNjcmlw
dHMiIEAgLiBzY3JpcHRzLWFsaXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBgKCJzY3JpcHRzIiBAICxAKGZpbHRlciAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgiaW5zdGFsbCIg
LiBfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAjZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAoXwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdCkpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgb3RoZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwa2ctbWV0YS1hbGlzdCkpKSkpKSkpKSkKKyAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNv
bi1maWxlLXJlcGxhY2VtZW50IChsYW1iZGEgKHBrZy1tZXRhLWFsaXN0KQorICAgICAgICAgICAg
ICAgKGxldCAoKGJpbmFyeS1hbGlzdCAoYXNzb2MtcmVmIHBrZy1tZXRhLWFsaXN0ICJiaW5hcnki
KSkpCisgICAgICAgICAgICAgICAgIDs7IFdoZW4gaXQgYnVpbGRzIGZyb20gc291cmNlLCBub2Rl
LXByZS1neXAgc3VwcGxpZXMKKyAgICAgICAgICAgICAgICAgOzsgbW9kdWxlX25hbWUgYW5kIG1v
ZHVsZV9wYXRoIGJhc2VkIG9uIHRoZSBlbnRyaWVzIHVuZGVyCisgICAgICAgICAgICAgICAgIDs7
ICJiaW5hcnkiIGZyb20gInBhY2thZ2UuanNvbiIsIHNvIHRoaXMgcGFja2FnZSdzCisgICAgICAg
ICAgICAgICAgIDs7ICJiaW5kaW5nLmd5cCIgZG9lc24ndCBkZWZpbmUgdGhlbS4gVGh1cywgd2Ug
YWxzbyBuZWVkCisgICAgICAgICAgICAgICAgIDs7IHRvIHN1cHBseSB0aGVtLiBUaGUgR1lQX0RF
RklORVMgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgOzsgdHVybnMgb3V0
IHRvIGJlIHRoZSBlYXNpZXN0IHdheSB0byBtYWtlIHN1cmUgdGhleSBhcmUKKyAgICAgICAgICAg
ICAgICAgOzsgcHJvcGFnYXRlZCBmcm9tIG5wbSB0byBub2RlLWd5cCB0byBneXAuCisgICAgICAg
ICAgICAgICAgIChzZXRlbnYgIkdZUF9ERUZJTkVTIiAoc3RyaW5nLWFwcGVuZAorICAgICAgICAg
ICAgICAgICAgICJtb2R1bGVfbmFtZT0iCisgICAgICAgICAgICAgICAgICAgKGFzc29jLXJlZiBi
aW5hcnktYWxpc3QgIm1vZHVsZV9uYW1lIikKKyAgICAgICAgICAgICAgICAgICAiIG1vZHVsZV9w
YXRoPSIKKyAgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVmIGJpbmFyeS1hbGlzdCAibW9kdWxl
X3BhdGgiKSkpKQorICAgICAgICAgICAgICAgOzsgV2UgbmVlZCB0byByZW1vdmUgdGhlIGluc3Rh
bGwgc2NyaXB0IGZyb20gInBhY2thZ2UuanNvbiIsCisgICAgICAgICAgICAgICA7OyBhcyBpdCB3
b3VsZCB0cnkgdG8gdXNlIG5vZGUtcHJlLWd5cCBhbmQgd291bGQgYmxvY2sgdGhlCisgICAgICAg
ICAgICAgICA7OyBhdXRvbWF0aWMgYnVpbGRpbmcgcGVyZm9ybWVkIGJ5IGBucG0gaW5zdGFsbGAu
CisgICAgICAgICAgICAgICAobWFwCisgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAg
ICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiAuIHNjcmlwdHMtYWxpc3QpCisgICAgICAgICAg
ICAgICAgICAgICAoY29ucyAic2NyaXB0cyIgKGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAg
ICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgiaW5zdGFsbCIgLiBf
KSAjZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAoXyAjdCkpCisgICAgICAgICAgICAgICAg
ICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAob3RoZXIgb3RoZXIp
KQorICAgICAgICAgICAgICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpKSkpCiAgICAgKGhvbWUtcGFn
ZSAiaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9ub2RlLXNxbGl0ZTMiKQogICAgIChzeW5vcHNp
cyAiTm9kZS5qcyBiaW5kaW5ncyBmb3IgU1FMaXRlMyIpCiAgICAgKGRlc2NyaXB0aW9uCmRpZmYg
LS1naXQgYS9ndWl4L2J1aWxkLXN5c3RlbS9ub2RlLnNjbSBiL2d1aXgvYnVpbGQtc3lzdGVtL25v
ZGUuc2NtCmluZGV4IDU3ZmU1ZjYwMzAuLjQyNWI4Y2Q5YjMgMTAwNjQ0Ci0tLSBhL2d1aXgvYnVp
bGQtc3lzdGVtL25vZGUuc2NtCisrKyBiL2d1aXgvYnVpbGQtc3lzdGVtL25vZGUuc2NtCkBAIC00
LDYgKzQsNyBAQAogOzs7IENvcHlyaWdodCDCqSAyMDIxIEx1ZG92aWMgQ291cnTDqHMgPGx1ZG9A
Z251Lm9yZz4KIDs7OyBDb3B5cmlnaHQgwqkgMjAyMSBQaWVycmUgTGFuZ2xvaXMgPHBpZXJyZS5s
YW5nbG9pc0BnbXguY29tPgogOzs7IENvcHlyaWdodCDCqSAyMDIxIFBoaWxpcCBNY0dyYXRoIDxw
aGlsaXBAcGhpbGlwbWNncmF0aC5jb20+Cis7OzsgQ29weXJpZ2h0IMKpIDIwMjQgRGFuaWVsIEto
b2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KIDs7OwogOzs7IFRoaXMgZmlsZSBp
cyBwYXJ0IG9mIEdOVSBHdWl4LgogOzs7CkBAIC0zNiw3ICszNywxMCBAQCAoZGVmaW5lLW1vZHVs
ZSAoZ3VpeCBidWlsZC1zeXN0ZW0gbm9kZSkKIChkZWZpbmUgJW5vZGUtYnVpbGQtc3lzdGVtLW1v
ZHVsZXMKICAgOzsgQnVpbGQtc2lkZSBtb2R1bGVzIGltcG9ydGVkIGJ5IGRlZmF1bHQuCiAgIGAo
KGd1aXggYnVpbGQgbm9kZS1idWlsZC1zeXN0ZW0pCi0gICAgKGd1aXggYnVpbGQganNvbikKKyAg
ICAoanNvbikKKyAgICAoanNvbiBidWlsZGVyKQorICAgIChqc29uIHBhcnNlcikKKyAgICAoanNv
biByZWNvcmQpCiAgICAgLEAlZGVmYXVsdC1nbnUtaW1wb3J0ZWQtbW9kdWxlcykpCiAKIChkZWZp
bmUgKGRlZmF1bHQtbm9kZSkKZGlmZiAtLWdpdCBhL2d1aXgvYnVpbGQvbm9kZS1idWlsZC1zeXN0
ZW0uc2NtIGIvZ3VpeC9idWlsZC9ub2RlLWJ1aWxkLXN5c3RlbS5zY20KaW5kZXggZmIyMzg5NGJj
MS4uZWYwZjg4YTVhNyAxMDA2NDQKLS0tIGEvZ3VpeC9idWlsZC9ub2RlLWJ1aWxkLXN5c3RlbS5z
Y20KKysrIGIvZ3VpeC9idWlsZC9ub2RlLWJ1aWxkLXN5c3RlbS5zY20KQEAgLTQsNiArNCw3IEBA
CiA7OzsgQ29weXJpZ2h0IMKpIDIwMTksIDIwMjEgVGltb3RoeSBTYW1wbGUgPHNhbXBsZXRAbmd5
cm8uY29tPgogOzs7IENvcHlyaWdodCDCqSAyMDIxLCAyMDIyIFBoaWxpcCBNY0dyYXRoIDxwaGls
aXBAcGhpbGlwbWNncmF0aC5jb20+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjIgTGlsaWFuYSBNYXJp
ZSBQcmlrbGVyIDxsaWxpYW5hLnByaWtsZXJAZ21haWwuY29tPgorOzs7IENvcHlyaWdodCDCqSAy
MDI0IERhbmllbCBLaG9kYWJha2hzaCA8ZC5raG9kYWJha2hzaEBnbWFpbC5jb20+CiA7OzsKIDs7
OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgR3VpeC4KIDs7OwpAQCAtMjMsMTAgKzI0LDEwIEBA
CiAoZGVmaW5lLW1vZHVsZSAoZ3VpeCBidWlsZCBub2RlLWJ1aWxkLXN5c3RlbSkKICAgIzp1c2Ut
bW9kdWxlICgoZ3VpeCBidWlsZCBnbnUtYnVpbGQtc3lzdGVtKSAjOnByZWZpeCBnbnU6KQogICAj
OnVzZS1tb2R1bGUgKGd1aXggYnVpbGQgdXRpbHMpCi0gICM6dXNlLW1vZHVsZSAoZ3VpeCBidWls
ZCBqc29uKQogICAjOnVzZS1tb2R1bGUgKGljZS05IGZ0dykKICAgIzp1c2UtbW9kdWxlIChpY2Ut
OSByZWdleCkKICAgIzp1c2UtbW9kdWxlIChpY2UtOSBtYXRjaCkKKyAgIzp1c2UtbW9kdWxlIChq
c29uKQogICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0xKQogICAjOnVzZS1tb2R1bGUgKHNyZmkg
c3JmaS03MSkKICAgIzpleHBvcnQgKCVzdGFuZGFyZC1waGFzZXMKQEAgLTM0LDEzICszNSwxMyBA
QCAoZGVmaW5lLW1vZHVsZSAoZ3VpeCBidWlsZCBub2RlLWJ1aWxkLXN5c3RlbSkKICAgICAgICAg
ICAgIGRlbGV0ZS1kZXBlbmRlbmNpZXMKICAgICAgICAgICAgIG5vZGUtYnVpbGQpKQogCi0oZGVm
aW5lICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgZmlsZSBwcm9jKQorKGRlZmlu
ZSogKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCBwcm9jICM6b3B0aW9uYWwgKGZp
bGUgInBhY2thZ2UuanNvbiIpKQogICAiTGlrZSAnd2l0aC1hdG9taWMtZmlsZS1yZXBsYWNlbWVu
dCcsIGJ1dCBQUk9DIGlzIGNhbGxlZCB3aXRoIGEgc2luZ2xlCiBhcmd1bWVudC0tLXRoZSByZXN1
bHQgb2YgcGFyc2luZyBGSUxFJ3MgY29udGVudHMgYXMganNvbi0tLWFuZCBzaG91bGQgYSB2YWx1
ZQogdG8gYmUgd3JpdHRlbiBhcyBqc29uIHRvIHRoZSByZXBsYWNlbWVudCBGSUxFLiIKICAgKHdp
dGgtYXRvbWljLWZpbGUtcmVwbGFjZW1lbnQgZmlsZQogICAgIChsYW1iZGEgKGluIG91dCkKLSAg
ICAgICh3cml0ZS1qc29uIChwcm9jIChyZWFkLWpzb24gaW4pKSBvdXQpKSkpCisgICAgICAoc2Nt
LT5qc29uIChwcm9jIChqc29uLT5zY20gaW4pKSBvdXQpKSkpCiAKIChkZWZpbmUqIChhc3NvYy1y
ZWYqIGFsaXN0IGtleSAjOm9wdGlvbmFsIGRlZmF1bHQpCiAgICJMaWtlIGFzc29jLXJlZiwgYnV0
IHJldHVybiBERUZBVUxUIGluc3RlYWQgb2YgI2YgaWYgbm8gdmFsdWUgZXhpc3RzLiIKQEAgLTQ4
LDEwICs0OSw2IEBAIChkZWZpbmUqIChhc3NvYy1yZWYqIGFsaXN0IGtleSAjOm9wdGlvbmFsIGRl
ZmF1bHQpCiAgICAgKCNmIGRlZmF1bHQpCiAgICAgKChfIC4gdmFsdWUpIHZhbHVlKSkpCiAKLShk
ZWZpbmUqIChqc29iamVjdC1yZWYgb2JqIGtleSAjOm9wdGlvbmFsIGRlZmF1bHQpCi0gIChtYXRj
aCBvYmoKLSAgICAoKCdAIC4gYWxpc3QpIChhc3NvYy1yZWYqIGFsaXN0IGtleSBkZWZhdWx0KSkp
KQotCiAoZGVmaW5lKiAoYWxpc3QtcG9wIGFsaXN0IGtleSAjOm9wdGlvbmFsICg9IGVxdWFsPykp
CiAgICJSZXR1cm4gdHdvIHZhbHVlcywgdGhlIGZpcnN0IHBhaXIgaW4gQUxJU1Qgd2l0aCBrZXkg
S0VZLCBhbmQgdGhlIG90aGVyCiBlbGVtZW50cy4gIEVxdWFsaXR5IGNhbGxzIGFyZSBtYWRlIGFz
ICg9IEtFWSBBTElTVENBUikuIgpAQCAtNjMsNjcgKzYwLDE3IEBAIChkZWZpbmUqIChhbGlzdC1w
b3AgYWxpc3Qga2V5ICM6b3B0aW9uYWwgKD0gZXF1YWw/KSkKICAgICAgICAgKHZhbHVlcyAoY2Fy
IGFmdGVyKSAoYXBwZW5kIGJlZm9yZSAoY2RyIGFmdGVyKSkpCiAgICAgICAgICh2YWx1ZXMgI2Yg
YmVmb3JlKSkpKQogCi0oZGVmaW5lKiAoYWxpc3QtdXBkYXRlIGFsaXN0IGtleSBwcm9jICM6b3B0
aW9uYWwgZGVmYXVsdCAoPSBlcXVhbD8pKQorKGRlZmluZSogKGFsaXN0LXVwZGF0ZSBhbGlzdCBr
ZXkgcHJvYyAjOm9wdGlvbmFsICg9IGVxdWFsPykpCiAgICJSZXR1cm4gYW4gYXNzb2NpYXRpb24g
bGlzdCBsaWtlIEFMSVNULCBidXQgd2l0aCBLRVkgbWFwcGVkIHRvIHRoZSByZXN1bHQgb2YKIFBS
T0MgYXBwbGllZCB0byB0aGUgZmlyc3QgdmFsdWUgZm91bmQgdW5kZXIgdGhlIGNvbXBhcmlzb24g
KD0gS0VZIEFMSVNUQ0FSKS4KLUlmIG5vIHN1Y2ggdmFsdWUgZXhpc3RzLCB1c2UgREVGQVVMVCBp
bnN0ZWFkLgorSWYgbm8gc3VjaCB2YWx1ZSBleGlzdHMsIHJldHVybiB0aGUgbGlzdCB1bmNoYW5n
ZWQuCiBVbmxpa2UgYWNvbnMsIHRoaXMgcmVtb3ZlcyB0aGUgcHJldmlvdXMgYXNzb2NpYXRpb24g
b2YgS0VZIChhc3N1bWluZyBpdCBpcwogdW5pcXVlKSwgYnV0IHRoZSByZXN1bHQgbWF5IHN0aWxs
IHNoYXJlIHN0b3JhZ2Ugd2l0aCBBTElTVC4iCiAgIChsZXQgKChwYWlyIHJlc3QgKGFsaXN0LXBv
cCBhbGlzdCBrZXkgPSkpKQotICAgIChhY29ucyBrZXkKLSAgICAgICAgICAgKHByb2MgKGlmIChw
YWlyPyBwYWlyKQotICAgICAgICAgICAgICAgICAgICAgKGNkciBwYWlyKQotICAgICAgICAgICAg
ICAgICAgICAgZGVmYXVsdCkpCi0gICAgICAgICAgIHJlc3QpKSkKLQotKGRlZmluZSAoanNvYmpl
Y3QtdXBkYXRlKiBqcyAuIHVwZGF0ZXMpCi0gICJSZXR1cm4gYSBqc29uIG9iamVjdCBsaWtlIEpT
LCBidXQgd2l0aCBhbGwgVVBEQVRFUyBhcHBsaWVkLiAgRWFjaCB1cGRhdGUgaXMKLWEgbGlzdCAo
S0VZIFBST0MgW0RFRkFVTFRdKSwgc28gdGhhdCBLRVkgaXMgbWFwcGVkIHRvIHRoZSByZXN1bHQg
b2YgUFJPQwotYXBwbGllZCB0byB0aGUgdmFsdWUgdG8gd2hpY2ggS0VZIGlzIG1hcHBlZCBpbiBK
Uy4gIElmIG5vIHN1Y2ggbWFwcGluZyBleGlzdHMsCi1QUk9DIGlzIGluc3RlYWQgYXBwbGllZCB0
byBERUZBVUxULCBvciB0byAnI2YnIGlzIG5vIERFRkFVTFQgaXMgc3BlY2lmaWVkLgotVGhlIHVw
ZGF0ZSB0YWtlcyBwbGFjZSBmcm9tIGxlZnQgdG8gcmlnaHQsIHNvIGxhdGVyIFVQREFURVJzIHdp
bGwgcmVjZWl2ZSB0aGUKLXZhbHVlcyByZXR1cm5lZCBieSBlYXJsaWVyIFVQREFURVJzIGZvciB0
aGUgc2FtZSBLRVkuIgotICAobWF0Y2gganMKLSAgICAoKCdAIC4gYWxpc3QpCi0gICAgIChsZXQg
bG9vcCAoKGFsaXN0IGFsaXN0KQotICAgICAgICAgICAgICAgICh1cGRhdGVzIHVwZGF0ZXMpKQot
ICAgICAgIChtYXRjaCB1cGRhdGVzCi0gICAgICAgICAoKCkgKGNvbnMgJ0AgYWxpc3QpKQotICAg
ICAgICAgKCgoa2V5IHByb2MpIC4gdXBkYXRlcykKLSAgICAgICAgICAobG9vcCAoYWxpc3QtdXBk
YXRlIGFsaXN0IGtleSBwcm9jICNmIGVxdWFsPykgdXBkYXRlcykpCi0gICAgICAgICAoKChrZXkg
cHJvYyBkZWZhdWx0KSAuIHVwZGF0ZXMpCi0gICAgICAgICAgKGxvb3AgKGFsaXN0LXVwZGF0ZSBh
bGlzdCBrZXkgcHJvYyBkZWZhdWx0IGVxdWFsPykgdXBkYXRlcykpKSkpKSkKLQotKGRlZmluZSAo
anNvYmplY3QtdW5pb24gY29tYmluZSBzZWVkIC4gb2JqZWN0cykKLSAgIk1lcmdlIE9CSkVDVFMg
aW50byBTRUVEIGJ5IGFwcGx5aW5nIChDT01CSU5FIEtFWSBWQUwwIFZBTCksIHdoZXJlIFZBTDAK
LWlzIHRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUgKHBvc3NpYmx5IHVwZGF0ZWQpIFNFRUQgYW5kIFZB
TCBpcyB0aGUgbmV3IHZhbHVlCi1mb3VuZCBpbiBvbmUgb2YgdGhlIE9CSkVDVFMuIgotICAobWF0
Y2ggc2VlZAotICAgICgoJ0AgLiBhc2VlZCkKLSAgICAgKG1hdGNoIG9iamVjdHMKLSAgICAgICAo
KCkgc2VlZCkKLSAgICAgICAoKCgnQCAuIGFsaXN0cykgLi4uKQotICAgICAgICAoY29ucwotICAg
ICAgICAgJ0AKLSAgICAgICAgIChmb2xkIChsYW1iZGEgKGFsaXN0IGFzZWVkKQotICAgICAgICAg
ICAgICAgICAoaWYgKG51bGw/IGFzZWVkKSBhbGlzdAotICAgICAgICAgICAgICAgICAgICAgKGZv
bGQKLSAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhKgotICAgICAgICAgICAgICAg
ICAgICAgICAgKCgoayAuIHYpIGFzZWVkKQotICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQg
KChwYWlyIHRhaWwgKGFsaXN0LXBvcCBhbGlzdCBrKSkpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAobWF0Y2ggcGFpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoI2YgKGFjb25z
IGsgdiBhc2VlZCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoXyAuIHYwKSAoYWNv
bnMgayAoY29tYmluZSBrIHYwIHYpIGFzZWVkKSkpKSkpCi0gICAgICAgICAgICAgICAgICAgICAg
YXNlZWQKLSAgICAgICAgICAgICAgICAgICAgICBhbGlzdCkpKQotICAgICAgICAgICAgICAgYXNl
ZWQKLSAgICAgICAgICAgICAgIGFsaXN0cykpKSkpKSkKKyAgICAoaWYgKHBhaXI/IHBhaXIpCisg
ICAgICAoYWNvbnMga2V5IChwcm9jIChjZHIgcGFpcikpIHJlc3QpCisgICAgICBhbGlzdCkpKQog
Ci07OyBQb3NzaWJseSB1c2VmdWwgaGVscGVyIGZ1bmN0aW9uczoKLTs7IChkZWZpbmUgKG5ld2Vz
dCBrZXkgdmFsMCB2YWwpIHZhbCkKLTs7IChkZWZpbmUgKHVua2V5ZWQtPmtleWVkIHByb2MpIChs
YW1iZGEgKF9rZXkgdmFsMCB2YWwpIChwcm9jIHZhbDAgdmFsKSkpCi0KLQwKIDs7OwogOzs7IFBo
YXNlcy4KIDs7OwpAQCAtMTQyLDggKzg5LDggQEAgKGRlZmluZSAoc2V0LWhvbWUgLiBfKQogCiAo
ZGVmaW5lIChtb2R1bGUtbmFtZSBtb2R1bGUpCiAgIChsZXQqICgocGFja2FnZS5qc29uIChzdHJp
bmctYXBwZW5kIG1vZHVsZSAiL3BhY2thZ2UuanNvbiIpKQotICAgICAgICAgKHBhY2thZ2UtbWV0
YSAoY2FsbC13aXRoLWlucHV0LWZpbGUgcGFja2FnZS5qc29uIHJlYWQtanNvbikpKQotICAgIChq
c29iamVjdC1yZWYgcGFja2FnZS1tZXRhICJuYW1lIikpKQorICAgICAgICAgKHBhY2thZ2UtbWV0
YSAoY2FsbC13aXRoLWlucHV0LWZpbGUgcGFja2FnZS5qc29uIGpzb24tPnNjbSkpKQorICAgIChh
c3NvYy1yZWYgcGFja2FnZS1tZXRhICJuYW1lIikpKQogCiAoZGVmaW5lIChpbmRleC1tb2R1bGVz
IGlucHV0LXBhdGhzKQogICAoZGVmaW5lIChsaXN0LW1vZHVsZXMgZGlyZWN0b3J5KQpAQCAtMTY3
LDQ5ICsxMTQsNTYgQEAgKGRlZmluZSogKHBhdGNoLWRlcGVuZGVuY2llcyAjOmtleSBpbnB1dHMg
IzphbGxvdy1vdGhlci1rZXlzKQogCiAgIChkZWZpbmUgaW5kZXggKGluZGV4LW1vZHVsZXMgKG1h
cCBjZHIgaW5wdXRzKSkpCiAKLSAgKGRlZmluZSByZXNvbHZlLWRlcGVuZGVuY2llcwotICAgICht
YXRjaC1sYW1iZGEKLSAgICAgICgoJ0AgLiBhbGlzdCkKLSAgICAgICAoY29ucyAnQCAobWFwICht
YXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgKChrZXkgLiB2YWx1ZSkKLSAgICAg
ICAgICAgICAgICAgICAgICAgIChjb25zIGtleSAoaGFzaC1yZWYgaW5kZXgga2V5IHZhbHVlKSkp
KQotICAgICAgICAgICAgICAgICAgICAgYWxpc3QpKSkpKQorICAoZGVmaW5lIChyZXNvbHZlLWRl
cGVuZGVuY2llcyBkZXBlbmRlbmNpZXMpCisgICAgKG1hcAorICAgICAgKG1hdGNoLWxhbWJkYQor
ICAgICAgICAoKGRlcGVuZGVuY3kgLiB2ZXJzaW9uKQorICAgICAgICAgIChjb25zIGRlcGVuZGVu
Y3kgKGhhc2gtcmVmIGluZGV4IGRlcGVuZGVuY3kgdmVyc2lvbikpKSkKKyAgICAgIGRlcGVuZGVu
Y2llcykpCiAKLSAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAicGFja2FnZS5q
c29uIgorICAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50CiAgICAgKGxhbWJkYSAo
cGtnLW1ldGEpCi0gICAgICAoanNvYmplY3QtdXBkYXRlKgotICAgICAgIHBrZy1tZXRhCi0gICAg
ICAgYCgiZGV2RGVwZW5kZW5jaWVzIiAscmVzb2x2ZS1kZXBlbmRlbmNpZXMgKEApKQotICAgICAg
IGAoImRlcGVuZGVuY2llcyIgLChsYW1iZGEgKGRlcHMpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAocmVzb2x2ZS1kZXBlbmRlbmNpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAo
anNvYmplY3QtdW5pb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoayBh
IGIpIGIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqc29iamVjdC1yZWYgcGtnLW1l
dGEgInBlZXJEZXBlbmRlbmNpZXMiICcoQCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRlcHMpKSkKLSAgICAgICAgIChAKSkpKSkKKyAgICAgIChmb2xkCisgICAgICAgIChsYW1iZGEg
KHByb2MgcGtnLW1ldGEpIChwcm9jIHBrZy1tZXRhKSkKKyAgICAgICAgcGtnLW1ldGEKKyAgICAg
ICAgKGxpc3QKKyAgICAgICAgICAobGFtYmRhIChwa2ctbWV0YSkKKyAgICAgICAgICAgIChhbGlz
dC11cGRhdGUgcGtnLW1ldGEgImRldkRlcGVuZGVuY2llcyIgcmVzb2x2ZS1kZXBlbmRlbmNpZXMp
KQorICAgICAgICAgIChsYW1iZGEgKHBrZy1tZXRhKQorICAgICAgICAgICAgKGFzc29jLXNldCEK
KyAgICAgICAgICAgICAgcGtnLW1ldGEKKyAgICAgICAgICAgICAgImRlcGVuZGVuY2llcyIKKyAg
ICAgICAgICAgICAgKHJlc29sdmUtZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgOyBDb21i
aW5lZCAicGVlckRlcGVuZGVuY2llcyIgYW5kICJkZXBlbmRlbmNpZXMiIGRlcGVuZGVuY2llcwor
ICAgICAgICAgICAgICAgIDsgd2l0aCAiZGVwZW5kZW5jaWVzIiB0YWtpbmcgcHJlY2VkZW50Lgor
ICAgICAgICAgICAgICAgIChmb2xkCisgICAgICAgICAgICAgICAgICAobGFtYmRhIChkZXBlbmRl
bmN5IGRlcGVuZGVuY2llcykKKyAgICAgICAgICAgICAgICAgICAgKGFzc29jLXNldCEgZGVwZW5k
ZW5jaWVzIChjYXIgZGVwZW5kZW5jeSkgKGNkciBkZXBlbmRlbmN5KSkpCisgICAgICAgICAgICAg
ICAgICAoYXNzb2MtcmVmKiBwa2ctbWV0YSAicGVlckRlcGVuZGVuY2llcyIgJygpKQorICAgICAg
ICAgICAgICAgICAgKGFzc29jLXJlZiogcGtnLW1ldGEgImRlcGVuZGVuY2llcyIgJygpKQorICAg
ICAgICAgICAgICAgICkpKSkpKSkpCiAgICN0KQogCi0oZGVmaW5lIChkZWxldGUtZGVwZW5kZW5j
aWVzIGFic2VudCkKKyhkZWZpbmUgKGRlbGV0ZS1kZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzLXRv
LXJlbW92ZSkKICAgIlJld3JpdGUgJ3BhY2thZ2UuanNvbicgdG8gYWxsb3cgdGhlIGJ1aWxkIHRv
IHByb2NlZWQgd2l0aG91dCBwYWNrYWdlcwotbGlzdGVkIGluIEFCU0VOVCwgYSBsaXN0IG9mIHN0
cmluZ3MgbmFtaW5nIG5wbSBwYWNrYWdlcy4KK2xpc3RlZCBpbiAnZGVwZW5kZW5jaWVzLXRvLXJl
bW92ZScsIGEgbGlzdCBvZiBzdHJpbmdzIG5hbWluZyBucG0gcGFja2FnZXMuCiAKIFRvIHByZXZl
bnQgdGhlIGRlbGV0ZWQgZGVwZW5kZW5jaWVzIGZyb20gYmVpbmcgcmVpbnRyb2R1Y2VkLCB1c2Ug
dGhpcyBmdW5jdGlvbgogb25seSBhZnRlciB0aGUgJ3BhdGNoLWRlcGVuZGVuY2llcycgcGhhc2Uu
IgotICAoZGVmaW5lIGRlbGV0ZS1mcm9tLWpzb2JqZWN0Ci0gICAgKG1hdGNoLWxhbWJkYQotICAg
ICAgKCgnQCAuIGFsaXN0KQotICAgICAgIChjb25zICdAIChmaWx0ZXIgKG1hdGNoLWxhbWJkYQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAoKGsgLiBfKQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKG5vdCAobWVtYmVyIGsgYWJzZW50KSkpKQotICAgICAgICAgICAgICAgICAgICAgICAg
YWxpc3QpKSkpKQotCi0gICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2th
Z2UuanNvbiIKKyAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudAogICAgIChsYW1i
ZGEgKHBrZy1tZXRhKQotICAgICAgKGpzb2JqZWN0LXVwZGF0ZSoKLSAgICAgICBwa2ctbWV0YQot
ICAgICAgIGAoImRldkRlcGVuZGVuY2llcyIgLGRlbGV0ZS1mcm9tLWpzb2JqZWN0IChAKSkKLSAg
ICAgICBgKCJkZXBlbmRlbmNpZXMiICxkZWxldGUtZnJvbS1qc29iamVjdCAoQCkpCi0gICAgICAg
YCgicGVlckRlcGVuZGVuY2llcyIgLGRlbGV0ZS1mcm9tLWpzb2JqZWN0IChAKSkpKSkpCisgICAg
ICAoZm9sZAorICAgICAgICAobGFtYmRhIChkZXBlbmRlbmN5LWtleSBwa2ctbWV0YSkKKyAgICAg
ICAgICAoYWxpc3QtdXBkYXRlCisgICAgICAgICAgICBwa2ctbWV0YQorICAgICAgICAgICAgZGVw
ZW5kZW5jeS1rZXkKKyAgICAgICAgICAgIChsYW1iZGEgKGRlcGVuZGVuY2llcykKKyAgICAgICAg
ICAgICAgKHJlbW92ZQorICAgICAgICAgICAgICAgIChsYW1iZGEgKGRlcGVuZGVuY3kpCisgICAg
ICAgICAgICAgICAgICAobWVtYmVyIChjYXIgZGVwZW5kZW5jeSkgZGVwZW5kZW5jaWVzLXRvLXJl
bW92ZSkpCisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzKSkpKQorICAgICAgICBwa2ctbWV0
YQorICAgICAgICAobGlzdCAiZGV2RGVwZW5kZW5jaWVzIiAiZGVwZW5kZW5jaWVzIiAicGVlckRl
cGVuZGVuY2llcyIgIm9wdGlvbmFsRGVwZW5kZW5jaWVzIikpKSkpCiAKIChkZWZpbmUqIChkZWxl
dGUtbG9ja2ZpbGVzICM6a2V5IGlucHV0cyAjOmFsbG93LW90aGVyLWtleXMpCiAgICJEZWxldGUg
J3BhY2thZ2UtbG9jay5qc29uJywgJ3lhcm4ubG9jaycsIGFuZCAnbnBtLXNocmlua3dyYXAuanNv
bicsIGlmIHRoZXkKQEAgLTIyOCw4ICsxODIsOCBAQCAoZGVmaW5lKiAoY29uZmlndXJlICM6a2V5
IG91dHB1dHMgaW5wdXRzICM6YWxsb3ctb3RoZXIta2V5cykKICAgICAjdCkpCiAKIChkZWZpbmUq
IChidWlsZCAjOmtleSBpbnB1dHMgIzphbGxvdy1vdGhlci1rZXlzKQotICAobGV0ICgocGFja2Fn
ZS1tZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSAicGFja2FnZS5qc29uIiByZWFkLWpzb24pKSkK
LSAgICAoaWYgKGpzb2JqZWN0LXJlZiAoanNvYmplY3QtcmVmIHBhY2thZ2UtbWV0YSAic2NyaXB0
cyIgJyhAKSkgImJ1aWxkIiAjZikKKyAgKGxldCAoKHBhY2thZ2UtbWV0YSAoY2FsbC13aXRoLWlu
cHV0LWZpbGUgInBhY2thZ2UuanNvbiIganNvbi0+c2NtKSkpCisgICAgKGlmIChhc3NvYy1yZWYq
IChhc3NvYy1yZWYqIHBhY2thZ2UtbWV0YSAic2NyaXB0cyIgJygpKSAiYnVpbGQiICNmKQogICAg
ICAgICAobGV0ICgobnBtIChzdHJpbmctYXBwZW5kIChhc3NvYy1yZWYgaW5wdXRzICJub2RlIikg
Ii9iaW4vbnBtIikpKQogICAgICAgICAgIChpbnZva2UgbnBtICJydW4iICJidWlsZCIpKQogICAg
ICAgICAoZm9ybWF0ICN0ICJ0aGVyZSBpcyBubyBidWlsZCBzY3JpcHQgdG8gcnVufiUiKSkKQEAg
LTMwMSwyMiArMjU1LDIwIEBAIChkZWZpbmUqIChhdm9pZC1ub2RlLWd5cC1yZWJ1aWxkICM6a2V5
IG91dHB1dHMgIzphbGxvdy1vdGhlci1rZXlzKQogICA7OyBldmVuIG5lZWQgdG8gb3ZlcndyaXRl
IHRoaXMgZmlsZS4gIFRoZXJlZm9yZSwgbGV0J3MgdXNlIHNvbWUgaGVscGVycwogICA7OyB0aGF0
IHdlJ2Qgb3RoZXJ3aXNlIG5vdCBuZWVkLgogICAoZGVmaW5lIHBrZy1tZXRhCi0gICAgKGNhbGwt
d2l0aC1pbnB1dC1maWxlIGluc3RhbGxlZC1wYWNrYWdlLmpzb24gcmVhZC1qc29uKSkKKyAgICAo
Y2FsbC13aXRoLWlucHV0LWZpbGUgaW5zdGFsbGVkLXBhY2thZ2UuanNvbiBqc29uLT5zY20pKQog
ICAoZGVmaW5lIHNjcmlwdHMKLSAgICAoanNvYmplY3QtcmVmIHBrZy1tZXRhICJzY3JpcHRzIiAn
KEApKSkKLSAgKGRlZmluZSAoanNvYmplY3Qtc2V0IGpzIGtleSB2YWwpCi0gICAgKGpzb2JqZWN0
LXVwZGF0ZSoganMgKGxpc3Qga2V5IChjb25zdCB2YWwpKSkpCisgICAgKGFzc29jLXJlZiogcGtn
LW1ldGEgInNjcmlwdHMiICcoKSkpCiAKLSAgKHdoZW4gKGVxdWFsPyAibm9kZS1neXAgcmVidWls
ZCIgKGpzb2JqZWN0LXJlZiBzY3JpcHRzICJpbnN0YWxsIiAjZikpCisgICh3aGVuIChlcXVhbD8g
Im5vZGUtZ3lwIHJlYnVpbGQiIChhc3NvYy1yZWYqIHNjcmlwdHMgImluc3RhbGwiICNmKSkKICAg
ICAoY2FsbC13aXRoLW91dHB1dC1maWxlIGluc3RhbGxlZC1wYWNrYWdlLmpzb24KICAgICAgIChs
YW1iZGEgKG91dCkKLSAgICAgICAgKHdyaXRlLWpzb24KLSAgICAgICAgIChqc29iamVjdC1zZXQg
cGtnLW1ldGEKLSAgICAgICAgICAgICAgICAgICAgICAgInNjcmlwdHMiCi0gICAgICAgICAgICAg
ICAgICAgICAgIChqc29iamVjdC1zZXQgc2NyaXB0cwotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJpbnN0YWxsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICJlY2hvIEd1aXg6IGF2b2lkaW5nIG5vZGUtZ3lwIHJlYnVpbGQiKSkKLSAgICAgICAgIG91
dCkpKSkpCisgICAgICAgIChzY20tPmpzb24KKyAgICAgICAgICAoYXNzb2Mtc2V0ISBwa2ctbWV0
YQorICAgICAgICAgICAgICAgICAgICAgICJzY3JpcHRzIgorICAgICAgICAgICAgICAgICAgICAg
IChhc3NvYy1zZXQhIHNjcmlwdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi
aW5zdGFsbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWNobyBHdWl4OiBh
dm9pZGluZyBub2RlLWd5cCByZWJ1aWxkIikpCisgICAgICAgICAgb3V0KSkpKSkKIAogKGRlZmlu
ZSAlc3RhbmRhcmQtcGhhc2VzCiAgIChtb2RpZnktcGhhc2VzIGdudTolc3RhbmRhcmQtcGhhc2Vz
CgpiYXNlLWNvbW1pdDogY2ZkNGY1NmY3NWEyMGI2NzMyZDQ2MzE4MGQyMTFmNzk2YzkwMzJlNQot
LSAKMi40Ni4wCgo=
--00000000000035ee88062954efaa--




Message sent:


Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-Mailer: MIME-tools 5.505 (Entity 5.505)
Content-Type: text/plain; charset=utf-8
X-Loop: help-debbugs@HIDDEN
From: help-debbugs@HIDDEN (GNU bug Tracking System)
To: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Subject: bug#74900: Acknowledgement ([PATCH] Replace (guix build json)
 with (json) in node build system)
Message-ID: <handler.74900.B.17342946445964.ack <at> debbugs.gnu.org>
References: <CAADuFnKAGHb2=rTFiwD9yXN3=OKbZdragGaCJJ0BkOhofDb2KQ@HIDDEN>
X-Gnu-PR-Message: ack 74900
X-Gnu-PR-Package: guix-patches
X-Gnu-PR-Keywords: patch
Reply-To: 74900 <at> debbugs.gnu.org
Date: Sun, 15 Dec 2024 20:31:02 +0000

Thank you for filing a new bug report with debbugs.gnu.org.

This is an automatically generated reply to let you know your message
has been received.

Your message is being forwarded to the package maintainers and other
interested parties for their attention; they will reply in due course.

Your message has been sent to the package maintainer(s):
 guix-patches@HIDDEN

If you wish to submit further information on this problem, please
send it to 74900 <at> debbugs.gnu.org.

Please do not send mail to help-debbugs@HIDDEN unless you wish
to report a problem with the Bug-tracking system.

--=20
74900: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D74900
GNU Bug Tracking System
Contact help-debbugs@HIDDEN with problems


Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#74900] 
References: <CAADuFnKAGHb2=rTFiwD9yXN3=OKbZdragGaCJJ0BkOhofDb2KQ@HIDDEN>
In-Reply-To: <CAADuFnKAGHb2=rTFiwD9yXN3=OKbZdragGaCJJ0BkOhofDb2KQ@HIDDEN>
Resent-From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 15 Dec 2024 21:44:02 +0000
Resent-Message-ID: <handler.74900.B74900.173429898919309 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 74900
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 74900 <at> debbugs.gnu.org
Received: via spool by 74900-submit <at> debbugs.gnu.org id=B74900.173429898919309
          (code B ref 74900); Sun, 15 Dec 2024 21:44:02 +0000
Received: (at 74900) by debbugs.gnu.org; 15 Dec 2024 21:43:09 +0000
Received: from localhost ([127.0.0.1]:52423 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tMwOI-00051J-DT
	for submit <at> debbugs.gnu.org; Sun, 15 Dec 2024 16:43:08 -0500
Received: from mail-vs1-f49.google.com ([209.85.217.49]:60646)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <d.khodabakhsh@HIDDEN>) id 1tMwOE-00050h-0m
 for 74900 <at> debbugs.gnu.org; Sun, 15 Dec 2024 16:43:05 -0500
Received: by mail-vs1-f49.google.com with SMTP id
 ada2fe7eead31-4b24d969db1so465936137.0
 for <74900 <at> debbugs.gnu.org>; Sun, 15 Dec 2024 13:43:02 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1734298916; x=1734903716; darn=debbugs.gnu.org;
 h=to:subject:message-id:date:from:mime-version:from:to:cc:subject
 :date:message-id:reply-to;
 bh=aPPXPBUkKv2XVk1Lu0C88aJaHe0U/icyBSnpqEzPbnE=;
 b=faRoFJdH6HRd7pirTwtYSjDoQbNi6VRIzfA/yB9/DFvxX6nLFd+YvB2dXqUKc6lWy3
 JHsTWnnyxrUXayLfyVmeWsSiLxpkfkdKQyoOzC1U3ZudIcyVRmMA+l4diHsxRP6fXHsk
 uWlMXzLtq+CV3/Szl2ZsXsOYIJGHM9wGgRMRiA8KFEeVCgoDhMTOk5wW5tRki5m+2fJt
 Jn/vJrGTc967crtJgFA3OPpSXHmipbwM3nava2M5KohSTLLHY8RvN2l+ky/eKQ64V4S3
 D+e+6eUgGEqNSRObDxmNvNnvNrK2adlYwfqoJ3Flnom3jYzjx/1fDwiZ2rkGFfpF6E3T
 +2/Q==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1734298916; x=1734903716;
 h=to:subject:message-id:date:from:mime-version:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=aPPXPBUkKv2XVk1Lu0C88aJaHe0U/icyBSnpqEzPbnE=;
 b=WAPKtexuYLRb6h2VnJxElPpy4fvLIqellcr+jU3cdj7YqCcCHpO5fp+WYD8abQqnhj
 CKfE958R3VBOcNj0ZYDyf3jEgFprhOeBl7i2h8t0sQOGoNtHX+nFcdFPwjp+sEtLvpMQ
 fSkGMEL0ftpeOfOKix2DXCHaJgLcqUWrpwDeGPOMUNoRNA3t3+jyd1Y2GDHdHkaeu7if
 iIn3Ni+O14TpdWl6v/vTOat5c7MKhfz0HHta8ri091hGHqDto+mZ6LoDdQz5z3KRdWsS
 qaqzqubXe911+D3wBzlUcPzloMD0t6/H7ELVoiDWzZ3Mz5qrgucUkfIbwqEC8eaFex0m
 Wc2Q==
X-Gm-Message-State: AOJu0YwY8mjhhAE/cIcVGt0k1ofICYJ4tkSpGCm11O/JDnCQKkQHxaez
 +TlKrDTw7QQmK7ysw27elWeOzoH3sUMtVGvh8YmjAixCpWSyOxA9aOq9N0MNkrQK28N7j4pHTtU
 ulrmD+lIyeu+T9u3yOep8/niPmsQMUhR8
X-Gm-Gg: ASbGnculIa/7ykueP+uTQvoou1mgQuLRKsRevm3uUHVsuRGFr15lkT70fOzrd9UfRwR
 ZmFYiSe4ryygyCuSt+1A0IH5OezjeUtJ3QRwo4g==
X-Google-Smtp-Source: AGHT+IFr19K5TkiMUXBK21SRW5+o1012tpWSGyHSMTSSJBQJA/03y3ctd3uWpRzx19SBTD0oedg48CyQgBi4A/WOnDY=
X-Received: by 2002:a05:6102:4b13:b0:4b2:48cc:5c5a with SMTP id
 ada2fe7eead31-4b25dccbf77mr10224797137.15.1734298915594; Sun, 15 Dec 2024
 13:41:55 -0800 (PST)
MIME-Version: 1.0
From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Date: Sun, 15 Dec 2024 21:41:44 +0000
Message-ID: <CAADuFn++tHWy7CAzNv4TP3FCF4AGwMPeq1MDBGeH11Q9zcDxAw@HIDDEN>
Content-Type: multipart/mixed; boundary="000000000000ccd36f062955ee49"
X-Spam-Score: 2.0 (++)
X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org",
 has NOT identified this incoming email as spam.  The original
 message has been attached to this so you can view it or label
 similar future email.  If you have any questions, see
 the administrator of that system for details.
 Content preview:  Sorry went over the line width limit in my diff below, here
 it is again: This change replaces the use of (guix build json) with (json)
 for the node ecosystem. Since guile-json is a dependency of Guix, and it's
 used elsewhere in the project, it makes sense to use this inste [...] 
 Content analysis details:   (2.0 points, 10.0 required)
 pts rule name              description
 ---- ---------------------- --------------------------------------------------
 0.0 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED RBL: ADMINISTRATOR NOTICE:
 The query to Validity was blocked.  See
 https://knowledge.validity.com/hc/en-us/articles/20961730681243
 for more information.
 [209.85.217.49 listed in sa-trusted.bondedsender.org]
 0.0 RCVD_IN_VALIDITY_RPBL_BLOCKED RBL: ADMINISTRATOR NOTICE: The
 query to Validity was blocked.  See
 https://knowledge.validity.com/hc/en-us/articles/20961730681243
 for more information.
 [209.85.217.49 listed in bl.score.senderscore.com]
 0.0 FREEMAIL_FROM          Sender email is commonly abused enduser mail
 provider (d.khodabakhsh[at]gmail.com)
 -0.0 RCVD_IN_MSPIKE_H2      RBL: Average reputation (+2)
 [209.85.217.49 listed in wl.mailspike.net]
 0.0 SPF_HELO_NONE          SPF: HELO does not publish an SPF Record
 -0.0 SPF_PASS               SPF: sender matches SPF record
 -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at https://www.dnswl.org/,
 no trust [209.85.217.49 listed in list.dnswl.org]
 2.0 BLANK_SUBJECT          Subject is present but empty
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 (+)

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

Sorry went over the line width limit in my diff below, here it is again:

This change replaces the use of (guix build json) with (json) for the
node ecosystem.
Since guile-json is a dependency of Guix, and it's used elsewhere in
the project, it makes sense to use this instead of rolling our own
JSON implementation with (guix build json).
This is one step to move away from (guix build json), there will be
other changes to remove the other uses of it.

Signed-off-by: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Change-Id: I0c86b3039eb2f50a19f9d9650f5a73b3a473ad37
---
 gnu/packages/node-xyz.scm        | 148 +++++++++++--------------
 guix/build-system/node.scm       |   6 +-
 guix/build/node-build-system.scm | 181 ++++++++++++-------------------
 3 files changed, 140 insertions(+), 195 deletions(-)

diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm
index cf6f50e3ce..decfb50a66 100644
--- a/gnu/packages/node-xyz.scm
+++ b/gnu/packages/node-xyz.scm
@@ -7,6 +7,7 @@
 ;;; Copyright =C2=A9 2021 Dhruvin Gandhi <contact@HIDDEN>
 ;;; Copyright =C2=A9 2022 Nicolas Graves <ngraves@HIDDEN>
 ;;; Copyright =C2=A9 2023 Jelle Licht <jlicht@HIDDEN>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -24,14 +25,14 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

 (define-module (gnu packages node-xyz)
-  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu packages sqlite)
   #:use-module (gnu packages python)
   #:use-module (gnu packages web)
+  #:use-module (guix build-system node)
   #:use-module (guix gexp)
-  #:use-module (guix packages)
   #:use-module (guix git-download)
-  #:use-module (guix build-system node))
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages))

 ;;;
 ;;; Please: Try to add new module packages in alphabetic order.
@@ -69,19 +70,17 @@ (define-public node-acorn
              ;; it would try to use the build environment and would block =
the
              ;; automatic building by other packages making use of node-ac=
orn.
              ;; TODO: Add utility function
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (cons '@ (map (match-lambda
-                                  (("scripts" @ . scripts-alist)
-                                   `("scripts" @ ,@(filter (match-lambda
-                                                             (("prepare" .=
 _)
-                                                              #f)
-                                                             (_
-                                                              #t))
-                                                           scripts-alist))=
)
-                                  (other other))
-                                pkg-meta-alist)))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (filter
+                       (match-lambda
+                         (("prepare" . _) #f)
+                         (_ #t))
+                       scripts-alist)))
+                   (other other))
+                 pkg-meta-alist)))))
          (replace 'build
            (lambda* (#:key inputs native-inputs #:allow-other-keys)
              (let ((esbuild (search-input-file (or native-inputs inputs)
@@ -156,23 +155,17 @@ (define-public node-addon-api
            (lambda args
              (define new-test-script
                "echo stopping after pretest on Guix")
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (cons
-                   '@
-                   (map (match-lambda
-                          (("scripts" '@ . scripts-alist)
-                           `("scripts" @ ,@(map (match-lambda
-                                                  (("test" . _)
-                                                   (cons "test"
-                                                         new-test-script))
-                                                  (other
-                                                   other))
-                                                scripts-alist)))
-                          (other
-                           other))
-                        pkg-meta-alist))))))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (map
+                       (match-lambda
+                         (("test" . _) (cons "test" new-test-script))
+                         (other other))
+                       scripts-alist)))
+                   (other other))
+                 pkg-meta-alist))))))))
     (home-page "https://github.com/nodejs/node-addon-api")
     (synopsis "Node.js API (Node-API) header-only C++ wrappers")
     (description "This module contains header-only C++ wrapper classes whi=
ch
@@ -1221,22 +1214,19 @@ (define-public node-serialport-bindings
                                     "node-abi"))))
          (add-after 'chdir 'avoid-prebuild-install
            (lambda args
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (cons '@ (map (match-lambda
-                                  (("scripts" @ . scripts-alist)
-                                   `("scripts" @ ,@(filter (match-lambda
-                                                             (("install" .=
 _)
-                                                              #f)
-                                                             (_
-                                                              #t))
-                                                           scripts-alist))=
)
-                                  (("gypfile" . _)
-                                   '("gypfile" . #f))
-                                  (other
-                                   other))
-                                pkg-meta-alist))))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (filter
+                       (match-lambda
+                         (("install" . _) #f)
+                         (_ #t))
+                       scripts-alist)))
+                   (("gypfile" . _)
+                     (cons "gypfile" #f))
+                   (other other))
+                 pkg-meta-alist))))))
        #:tests? #f))
     (synopsis "Abstract base class for Node SerialPort bindings")
     (description "Node SerialPort is a modular suite of Node.js packages f=
or
@@ -1522,39 +1512,33 @@ (define-public node-sqlite3
              (substitute* ".npmignore"
                (("lib/binding")
                 "#lib/binding # <- patched for Guix"))
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (match (assoc-ref pkg-meta-alist "binary")
-                    (('@ . binary-alist)
-                     ;; When it builds from source, node-pre-gyp supplies
-                     ;; module_name and module_path based on the entries u=
nder
-                     ;; "binary" from "package.json", so this package's
-                     ;; "binding.gyp" doesn't define them. Thus, we also n=
eed
-                     ;; to supply them. The GYP_DEFINES environment variab=
le
-                     ;; turns out to be the easiest way to make sure they =
are
-                     ;; propagated from npm to node-gyp to gyp.
-                     (setenv "GYP_DEFINES"
-                             (string-append
-                              "module_name=3D"
-                              (assoc-ref binary-alist "module_name")
-                              " "
-                              "module_path=3D"
-                              (assoc-ref binary-alist "module_path")))))
-                  ;; We need to remove the install script from "package.js=
on",
-                  ;; as it would try to use node-pre-gyp and would block t=
he
-                  ;; automatic building performed by `npm install`.
-                  (cons '@ (map (match-lambda
-                                  (("scripts" @ . scripts-alist)
-                                   `("scripts" @ ,@(filter (match-lambda
-                                                             (("install" .=
 _)
-                                                              #f)
-                                                             (_
-                                                              #t))
-                                                           scripts-alist))=
)
-                                  (other
-                                   other))
-                                pkg-meta-alist))))))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (let ((binary-alist (assoc-ref pkg-meta-alist "binary")))
+                 ;; When it builds from source, node-pre-gyp supplies
+                 ;; module_name and module_path based on the entries under
+                 ;; "binary" from "package.json", so this package's
+                 ;; "binding.gyp" doesn't define them. Thus, we also need
+                 ;; to supply them. The GYP_DEFINES environment variable
+                 ;; turns out to be the easiest way to make sure they are
+                 ;; propagated from npm to node-gyp to gyp.
+                 (setenv "GYP_DEFINES" (string-append
+                   "module_name=3D"
+                   (assoc-ref binary-alist "module_name")
+                   " module_path=3D"
+                   (assoc-ref binary-alist "module_path"))))
+               ;; We need to remove the install script from "package.json"=
,
+               ;; as it would try to use node-pre-gyp and would block the
+               ;; automatic building performed by `npm install`.
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (filter
+                       (match-lambda
+                         (("install" . _) #f)
+                         (_ #t))
+                       scripts-alist)))
+                   (other other))
+                 pkg-meta-alist))))))))
     (home-page "https://github.com/mapbox/node-sqlite3")
     (synopsis "Node.js bindings for SQLite3")
     (description
diff --git a/guix/build-system/node.scm b/guix/build-system/node.scm
index 57fe5f6030..425b8cd9b3 100644
--- a/guix/build-system/node.scm
+++ b/guix/build-system/node.scm
@@ -4,6 +4,7 @@
 ;;; Copyright =C2=A9 2021 Ludovic Court=C3=A8s <ludo@HIDDEN>
 ;;; Copyright =C2=A9 2021 Pierre Langlois <pierre.langlois@HIDDEN>
 ;;; Copyright =C2=A9 2021 Philip McGrath <philip@HIDDEN>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -36,7 +37,10 @@ (define-module (guix build-system node)
 (define %node-build-system-modules
   ;; Build-side modules imported by default.
   `((guix build node-build-system)
-    (guix build json)
+    (json)
+    (json builder)
+    (json parser)
+    (json record)
     ,@%default-gnu-imported-modules))

 (define (default-node)
diff --git a/guix/build/node-build-system.scm b/guix/build/node-build-syste=
m.scm
index fb23894bc1..46e0ddd71d 100644
--- a/guix/build/node-build-system.scm
+++ b/guix/build/node-build-system.scm
@@ -4,6 +4,7 @@
 ;;; Copyright =C2=A9 2019, 2021 Timothy Sample <samplet@HIDDEN>
 ;;; Copyright =C2=A9 2021, 2022 Philip McGrath <philip@HIDDEN>
 ;;; Copyright =C2=A9 2022 Liliana Marie Prikler <liliana.prikler@HIDDEN=
>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -23,10 +24,10 @@
 (define-module (guix build node-build-system)
   #:use-module ((guix build gnu-build-system) #:prefix gnu:)
   #:use-module (guix build utils)
-  #:use-module (guix build json)
   #:use-module (ice-9 ftw)
   #:use-module (ice-9 regex)
   #:use-module (ice-9 match)
+  #:use-module (json)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-71)
   #:export (%standard-phases
@@ -34,13 +35,14 @@ (define-module (guix build node-build-system)
             delete-dependencies
             node-build))

-(define (with-atomic-json-file-replacement file proc)
+(define* (with-atomic-json-file-replacement proc
+  #:optional (file "package.json"))
   "Like 'with-atomic-file-replacement', but PROC is called with a single
 argument---the result of parsing FILE's contents as json---and should a va=
lue
 to be written as json to the replacement FILE."
   (with-atomic-file-replacement file
     (lambda (in out)
-      (write-json (proc (read-json in)) out))))
+      (scm->json (proc (json->scm in)) out))))

 (define* (assoc-ref* alist key #:optional default)
   "Like assoc-ref, but return DEFAULT instead of #f if no value exists."
@@ -48,10 +50,6 @@ (define* (assoc-ref* alist key #:optional default)
     (#f default)
     ((_ . value) value)))

-(define* (jsobject-ref obj key #:optional default)
-  (match obj
-    (('@ . alist) (assoc-ref* alist key default))))
-
 (define* (alist-pop alist key #:optional (=3D equal?))
   "Return two values, the first pair in ALIST with key KEY, and the other
 elements.  Equality calls are made as (=3D KEY ALISTCAR)."
@@ -63,67 +61,17 @@ (define* (alist-pop alist key #:optional (=3D equal?))
         (values (car after) (append before (cdr after)))
         (values #f before))))

-(define* (alist-update alist key proc #:optional default (=3D equal?))
+(define* (alist-update alist key proc #:optional (=3D equal?))
   "Return an association list like ALIST, but with KEY mapped to the resul=
t of
 PROC applied to the first value found under the comparison (=3D KEY ALISTC=
AR).
-If no such value exists, use DEFAULT instead.
+If no such value exists, return the list unchanged.
 Unlike acons, this removes the previous association of KEY (assuming it is
 unique), but the result may still share storage with ALIST."
   (let ((pair rest (alist-pop alist key =3D)))
-    (acons key
-           (proc (if (pair? pair)
-                     (cdr pair)
-                     default))
-           rest)))
-
-(define (jsobject-update* js . updates)
-  "Return a json object like JS, but with all UPDATES applied.  Each updat=
e is
-a list (KEY PROC [DEFAULT]), so that KEY is mapped to the result of PROC
-applied to the value to which KEY is mapped in JS.  If no such mapping exi=
sts,
-PROC is instead applied to DEFAULT, or to '#f' is no DEFAULT is specified.
-The update takes place from left to right, so later UPDATERs will receive =
the
-values returned by earlier UPDATERs for the same KEY."
-  (match js
-    (('@ . alist)
-     (let loop ((alist alist)
-                (updates updates))
-       (match updates
-         (() (cons '@ alist))
-         (((key proc) . updates)
-          (loop (alist-update alist key proc #f equal?) updates))
-         (((key proc default) . updates)
-          (loop (alist-update alist key proc default equal?) updates))))))=
)
-
-(define (jsobject-union combine seed . objects)
-  "Merge OBJECTS into SEED by applying (COMBINE KEY VAL0 VAL), where VAL0
-is the value found in the (possibly updated) SEED and VAL is the new value
-found in one of the OBJECTS."
-  (match seed
-    (('@ . aseed)
-     (match objects
-       (() seed)
-       ((('@ . alists) ...)
-        (cons
-         '@
-         (fold (lambda (alist aseed)
-                 (if (null? aseed) alist
-                     (fold
-                      (match-lambda*
-                        (((k . v) aseed)
-                         (let ((pair tail (alist-pop alist k)))
-                           (match pair
-                             (#f (acons k v aseed))
-                             ((_ . v0) (acons k (combine k v0 v) aseed))))=
))
-                      aseed
-                      alist)))
-               aseed
-               alists)))))))
+    (if (pair? pair)
+      (acons key (proc (cdr pair)) rest)
+      alist)))

-;; Possibly useful helper functions:
-;; (define (newest key val0 val) val)
-;; (define (unkeyed->keyed proc) (lambda (_key val0 val) (proc val0 val)))
-
-
 ;;;
 ;;; Phases.
 ;;;
@@ -142,8 +90,8 @@ (define (set-home . _)

 (define (module-name module)
   (let* ((package.json (string-append module "/package.json"))
-         (package-meta (call-with-input-file package.json read-json)))
-    (jsobject-ref package-meta "name")))
+         (package-meta (call-with-input-file package.json json->scm)))
+    (assoc-ref package-meta "name")))

 (define (index-modules input-paths)
   (define (list-modules directory)
@@ -167,49 +115,60 @@ (define* (patch-dependencies #:key inputs
#:allow-other-keys)

   (define index (index-modules (map cdr inputs)))

-  (define resolve-dependencies
-    (match-lambda
-      (('@ . alist)
-       (cons '@ (map (match-lambda
-                       ((key . value)
-                        (cons key (hash-ref index key value))))
-                     alist)))))
+  (define (resolve-dependencies dependencies)
+    (map
+      (match-lambda
+        ((dependency . version)
+          (cons dependency (hash-ref index dependency version))))
+      dependencies))

-  (with-atomic-json-file-replacement "package.json"
+  (with-atomic-json-file-replacement
     (lambda (pkg-meta)
-      (jsobject-update*
-       pkg-meta
-       `("devDependencies" ,resolve-dependencies (@))
-       `("dependencies" ,(lambda (deps)
-                           (resolve-dependencies
-                            (jsobject-union
-                             (lambda (k a b) b)
-                             (jsobject-ref pkg-meta "peerDependencies" '(@=
))
-                             deps)))
-         (@)))))
+      (fold
+        (lambda (proc pkg-meta) (proc pkg-meta))
+        pkg-meta
+        (list
+          (lambda (pkg-meta)
+            (alist-update pkg-meta "devDependencies" resolve-dependencies)=
)
+          (lambda (pkg-meta)
+            (assoc-set!
+              pkg-meta
+              "dependencies"
+              (resolve-dependencies
+                ; Combined "peerDependencies" and "dependencies" dependenc=
ies
+                ; with "dependencies" taking precedent.
+                (fold
+                  (lambda (dependency dependencies)
+                    (apply assoc-set! dependencies dependency))
+                  (assoc-ref* pkg-meta "peerDependencies" '())
+                  (assoc-ref* pkg-meta "dependencies" '())
+                ))))))))
   #t)

-(define (delete-dependencies absent)
+(define (delete-dependencies dependencies-to-remove)
   "Rewrite 'package.json' to allow the build to proceed without packages
-listed in ABSENT, a list of strings naming npm packages.
+listed in 'dependencies-to-remove', a list of strings naming npm packages.

 To prevent the deleted dependencies from being reintroduced, use this func=
tion
 only after the 'patch-dependencies' phase."
-  (define delete-from-jsobject
-    (match-lambda
-      (('@ . alist)
-       (cons '@ (filter (match-lambda
-                          ((k . _)
-                           (not (member k absent))))
-                        alist)))))
-
-  (with-atomic-json-file-replacement "package.json"
+  (with-atomic-json-file-replacement
     (lambda (pkg-meta)
-      (jsobject-update*
-       pkg-meta
-       `("devDependencies" ,delete-from-jsobject (@))
-       `("dependencies" ,delete-from-jsobject (@))
-       `("peerDependencies" ,delete-from-jsobject (@))))))
+      (fold
+        (lambda (dependency-key pkg-meta)
+          (alist-update
+            pkg-meta
+            dependency-key
+            (lambda (dependencies)
+              (remove
+                (lambda (dependency)
+                  (member (car dependency) dependencies-to-remove))
+                dependencies))))
+        pkg-meta
+        (list
+          "devDependencies"
+          "dependencies"
+          "peerDependencies"
+          "optionalDependencies")))))

 (define* (delete-lockfiles #:key inputs #:allow-other-keys)
   "Delete 'package-lock.json', 'yarn.lock', and 'npm-shrinkwrap.json', if =
they
@@ -228,8 +187,8 @@ (define* (configure #:key outputs inputs #:allow-other-=
keys)
     #t))

 (define* (build #:key inputs #:allow-other-keys)
-  (let ((package-meta (call-with-input-file "package.json" read-json)))
-    (if (jsobject-ref (jsobject-ref package-meta "scripts" '(@)) "build" #=
f)
+  (let ((package-meta (call-with-input-file "package.json" json->scm)))
+    (if (assoc-ref* (assoc-ref* package-meta "scripts" '()) "build" #f)
         (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm")))
           (invoke npm "run" "build"))
         (format #t "there is no build script to run~%"))
@@ -301,22 +260,20 @@ (define* (avoid-node-gyp-rebuild #:key outputs
#:allow-other-keys)
   ;; even need to overwrite this file.  Therefore, let's use some helpers
   ;; that we'd otherwise not need.
   (define pkg-meta
-    (call-with-input-file installed-package.json read-json))
+    (call-with-input-file installed-package.json json->scm))
   (define scripts
-    (jsobject-ref pkg-meta "scripts" '(@)))
-  (define (jsobject-set js key val)
-    (jsobject-update* js (list key (const val))))
+    (assoc-ref* pkg-meta "scripts" '()))

-  (when (equal? "node-gyp rebuild" (jsobject-ref scripts "install" #f))
+  (when (equal? "node-gyp rebuild" (assoc-ref* scripts "install" #f))
     (call-with-output-file installed-package.json
       (lambda (out)
-        (write-json
-         (jsobject-set pkg-meta
-                       "scripts"
-                       (jsobject-set scripts
-                                     "install"
-                                     "echo Guix: avoiding node-gyp rebuild=
"))
-         out)))))
+        (scm->json
+          (assoc-set! pkg-meta
+                      "scripts"
+                      (assoc-set! scripts
+                                  "install"
+                                  "echo Guix: avoiding node-gyp rebuild"))
+          out)))))

 (define %standard-phases
   (modify-phases gnu:%standard-phases

base-commit: cfd4f56f75a20b6732d463180d211f796c9032e5
--=20
2.46.0

--000000000000ccd36f062955ee49
Content-Type: text/x-patch; charset="UTF-8"; 
	name="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch"
Content-Disposition: attachment; 
	filename="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_m4q4sbju0>
X-Attachment-Id: f_m4q4sbju0

RnJvbSA2OTQ4OWFjNjNmMzk3ODQ5ZDUxYmMyMDY1NDAyZWRiMWEwMWQwODQ2IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBEYW5pZWwgS2hvZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21h
aWwuY29tPgpEYXRlOiBTdW4sIDE1IERlYyAyMDI0IDExOjMwOjMzIC0wODAwClN1YmplY3Q6IFtQ
QVRDSF0gUmVwbGFjZSAoZ3VpeCBidWlsZCBqc29uKSB3aXRoIChqc29uKSBpbiBub2RlIGJ1aWxk
IHN5c3RlbQoKVGhpcyBjaGFuZ2UgcmVwbGFjZXMgdGhlIHVzZSBvZiAoZ3VpeCBidWlsZCBqc29u
KSB3aXRoIChqc29uKSBmb3IgdGhlIG5vZGUgZWNvc3lzdGVtLgpTaW5jZSBndWlsZS1qc29uIGlz
IGEgZGVwZW5kZW5jeSBvZiBHdWl4LCBhbmQgaXQncyB1c2VkIGVsc2V3aGVyZSBpbiB0aGUgcHJv
amVjdCwgaXQgbWFrZXMgc2Vuc2UgdG8gdXNlIHRoaXMgaW5zdGVhZCBvZiByb2xsaW5nIG91ciBv
d24gSlNPTiBpbXBsZW1lbnRhdGlvbiB3aXRoIChndWl4IGJ1aWxkIGpzb24pLgpUaGlzIGlzIG9u
ZSBzdGVwIHRvIG1vdmUgYXdheSBmcm9tIChndWl4IGJ1aWxkIGpzb24pLCB0aGVyZSB3aWxsIGJl
IG90aGVyIGNoYW5nZXMgdG8gcmVtb3ZlIHRoZSBvdGhlciB1c2VzIG9mIGl0LgoKU2lnbmVkLW9m
Zi1ieTogRGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KQ2hhbmdl
LUlkOiBJMGM4NmIzMDM5ZWIyZjUwYTE5ZjlkOTY1MGY1YTczYjNhNDczYWQzNwotLS0KIGdudS9w
YWNrYWdlcy9ub2RlLXh5ei5zY20gICAgICAgIHwgMTQ4ICsrKysrKysrKysrLS0tLS0tLS0tLS0t
LS0KIGd1aXgvYnVpbGQtc3lzdGVtL25vZGUuc2NtICAgICAgIHwgICA2ICstCiBndWl4L2J1aWxk
L25vZGUtYnVpbGQtc3lzdGVtLnNjbSB8IDE4MSArKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0t
LS0tCiAzIGZpbGVzIGNoYW5nZWQsIDE0MCBpbnNlcnRpb25zKCspLCAxOTUgZGVsZXRpb25zKC0p
CgpkaWZmIC0tZ2l0IGEvZ251L3BhY2thZ2VzL25vZGUteHl6LnNjbSBiL2dudS9wYWNrYWdlcy9u
b2RlLXh5ei5zY20KaW5kZXggY2Y2ZjUwZTNjZS4uZGVjZmI1MGE2NiAxMDA2NDQKLS0tIGEvZ251
L3BhY2thZ2VzL25vZGUteHl6LnNjbQorKysgYi9nbnUvcGFja2FnZXMvbm9kZS14eXouc2NtCkBA
IC03LDYgKzcsNyBAQAogOzs7IENvcHlyaWdodCDCqSAyMDIxIERocnV2aW4gR2FuZGhpIDxjb250
YWN0QGRocnV2aW4uZGV2PgogOzs7IENvcHlyaWdodCDCqSAyMDIyIE5pY29sYXMgR3JhdmVzIDxu
Z3JhdmVzQG5ncmF2ZXMuZnI+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjMgSmVsbGUgTGljaHQgPGps
aWNodEBmc2ZlLm9yZz4KKzs7OyBDb3B5cmlnaHQgwqkgMjAyNCBEYW5pZWwgS2hvZGFiYWtoc2gg
PGQua2hvZGFiYWtoc2hAZ21haWwuY29tPgogOzs7CiA7OzsgVGhpcyBmaWxlIGlzIHBhcnQgb2Yg
R05VIEd1aXguCiA7OzsKQEAgLTI0LDE0ICsyNSwxNCBAQAogOzs7IGFsb25nIHdpdGggR05VIEd1
aXguICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAKIChkZWZp
bmUtbW9kdWxlIChnbnUgcGFja2FnZXMgbm9kZS14eXopCi0gICM6dXNlLW1vZHVsZSAoKGd1aXgg
bGljZW5zZXMpICM6cHJlZml4IGxpY2Vuc2U6KQogICAjOnVzZS1tb2R1bGUgKGdudSBwYWNrYWdl
cyBzcWxpdGUpCiAgICM6dXNlLW1vZHVsZSAoZ251IHBhY2thZ2VzIHB5dGhvbikKICAgIzp1c2Ut
bW9kdWxlIChnbnUgcGFja2FnZXMgd2ViKQorICAjOnVzZS1tb2R1bGUgKGd1aXggYnVpbGQtc3lz
dGVtIG5vZGUpCiAgICM6dXNlLW1vZHVsZSAoZ3VpeCBnZXhwKQotICAjOnVzZS1tb2R1bGUgKGd1
aXggcGFja2FnZXMpCiAgICM6dXNlLW1vZHVsZSAoZ3VpeCBnaXQtZG93bmxvYWQpCi0gICM6dXNl
LW1vZHVsZSAoZ3VpeCBidWlsZC1zeXN0ZW0gbm9kZSkpCisgICM6dXNlLW1vZHVsZSAoKGd1aXgg
bGljZW5zZXMpICM6cHJlZml4IGxpY2Vuc2U6KQorICAjOnVzZS1tb2R1bGUgKGd1aXggcGFja2Fn
ZXMpKQogCiA7OzsKIDs7OyBQbGVhc2U6IFRyeSB0byBhZGQgbmV3IG1vZHVsZSBwYWNrYWdlcyBp
biBhbHBoYWJldGljIG9yZGVyLgpAQCAtNjksMTkgKzcwLDE3IEBAIChkZWZpbmUtcHVibGljIG5v
ZGUtYWNvcm4KICAgICAgICAgICAgICA7OyBpdCB3b3VsZCB0cnkgdG8gdXNlIHRoZSBidWlsZCBl
bnZpcm9ubWVudCBhbmQgd291bGQgYmxvY2sgdGhlCiAgICAgICAgICAgICAgOzsgYXV0b21hdGlj
IGJ1aWxkaW5nIGJ5IG90aGVyIHBhY2thZ2VzIG1ha2luZyB1c2Ugb2Ygbm9kZS1hY29ybi4KICAg
ICAgICAgICAgICA7OyBUT0RPOiBBZGQgdXRpbGl0eSBmdW5jdGlvbgotICAgICAgICAgICAgICh3
aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIKLSAgICAgICAg
ICAgICAgIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgKCgnQCAuIHBrZy1tZXRhLWFs
aXN0KQotICAgICAgICAgICAgICAgICAgKGNvbnMgJ0AgKG1hcCAobWF0Y2gtbGFtYmRhCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0cyIgQCAuIHNjcmlwdHMtYWxp
c3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlwdHMiIEAgLEAo
ZmlsdGVyIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJwcmVwYXJlIiAuIF8pCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmKQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChvdGhlciBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29u
LWZpbGUtcmVwbGFjZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAg
ICAobWFwCisgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAg
ICAoKCJzY3JpcHRzIiAuIHNjcmlwdHMtYWxpc3QpCisgICAgICAgICAgICAgICAgICAgICAoY29u
cyAic2NyaXB0cyIgKGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRh
CisgICAgICAgICAgICAgICAgICAgICAgICAgKCgicHJlcGFyZSIgLiBfKSAjZikKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAoXyAjdCkpCisgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMt
YWxpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAob3RoZXIgb3RoZXIpKQorICAgICAgICAgICAg
ICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpCiAgICAgICAgICAocmVwbGFjZSAnYnVpbGQKICAgICAg
ICAgICAgKGxhbWJkYSogKCM6a2V5IGlucHV0cyBuYXRpdmUtaW5wdXRzICM6YWxsb3ctb3RoZXIt
a2V5cykKICAgICAgICAgICAgICAobGV0ICgoZXNidWlsZCAoc2VhcmNoLWlucHV0LWZpbGUgKG9y
IG5hdGl2ZS1pbnB1dHMgaW5wdXRzKQpAQCAtMTU2LDIzICsxNTUsMTcgQEAgKGRlZmluZS1wdWJs
aWMgbm9kZS1hZGRvbi1hcGkKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCiAgICAgICAgICAgICAg
KGRlZmluZSBuZXctdGVzdC1zY3JpcHQKICAgICAgICAgICAgICAgICJlY2hvIHN0b3BwaW5nIGFm
dGVyIHByZXRlc3Qgb24gR3VpeCIpCi0gICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmls
ZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgotICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJk
YQotICAgICAgICAgICAgICAgICAoKCdAIC4gcGtnLW1ldGEtYWxpc3QpCi0gICAgICAgICAgICAg
ICAgICAoY29ucwotICAgICAgICAgICAgICAgICAgICdACi0gICAgICAgICAgICAgICAgICAgKG1h
cCAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiICdA
IC4gc2NyaXB0cy1hbGlzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlwdHMi
IEAgLEAobWFwIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKCgidGVzdCIgLiBfKQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnMgInRlc3QiCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXctdGVzdC1zY3JpcHQp
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3Ro
ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90
aGVyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNj
cmlwdHMtYWxpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICBwa2ct
bWV0YS1hbGlzdCkpKSkpKSkpKSkKKyAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNvbi1maWxl
LXJlcGxhY2VtZW50IChsYW1iZGEgKHBrZy1tZXRhLWFsaXN0KQorICAgICAgICAgICAgICAgKG1h
cAorICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAgICAgICAgICAgKCgi
c2NyaXB0cyIgLiBzY3JpcHRzLWFsaXN0KQorICAgICAgICAgICAgICAgICAgICAgKGNvbnMgInNj
cmlwdHMiIChtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAg
ICAgICAgICAgICAgICAgICAgICgoInRlc3QiIC4gXykgKGNvbnMgInRlc3QiIG5ldy10ZXN0LXNj
cmlwdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAgICAgICAgICAgIChvdGhl
ciBvdGhlcikpCisgICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkKICAgICAo
aG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUtYWRkb24tYXBpIikKICAg
ICAoc3lub3BzaXMgIk5vZGUuanMgQVBJIChOb2RlLUFQSSkgaGVhZGVyLW9ubHkgQysrIHdyYXBw
ZXJzIikKICAgICAoZGVzY3JpcHRpb24gIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGhlYWRlci1vbmx5
IEMrKyB3cmFwcGVyIGNsYXNzZXMgd2hpY2gKQEAgLTEyMjEsMjIgKzEyMTQsMTkgQEAgKGRlZmlu
ZS1wdWJsaWMgbm9kZS1zZXJpYWxwb3J0LWJpbmRpbmdzCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAibm9kZS1hYmkiKSkpKQogICAgICAgICAgKGFkZC1hZnRlciAnY2hkaXIg
J2F2b2lkLXByZWJ1aWxkLWluc3RhbGwKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAgICAg
ICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgot
ICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAoKCdAIC4gcGtn
LW1ldGEtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAoY29ucyAnQCAobWFwIChtYXRjaC1sYW1i
ZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiBAIC4gc2Ny
aXB0cy1hbGlzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCgic2NyaXB0
cyIgQCAsQChmaWx0ZXIgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoImluc3RhbGwiIC4gXykKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
I2YpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKF8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgI3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzLWFsaXN0KSkpCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKCgiZ3lwZmlsZSIgLiBfKQotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAnKCJneXBmaWxlIiAuICNmKSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAob3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
b3RoZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa2ctbWV0YS1hbGlzdCkp
KSkpKSkpCisgICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAo
bGFtYmRhIChwa2ctbWV0YS1hbGlzdCkKKyAgICAgICAgICAgICAgIChtYXAKKyAgICAgICAgICAg
ICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiIC4gc2Ny
aXB0cy1hbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgIChjb25zICJzY3JpcHRzIiAoZmlsdGVy
CisgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAoKCJpbnN0YWxsIiAuIF8pICNmKQorICAgICAgICAgICAgICAgICAgICAgICAgIChf
ICN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAg
ICAgICAgICAgICgoImd5cGZpbGUiIC4gXykKKyAgICAgICAgICAgICAgICAgICAgIChjb25zICJn
eXBmaWxlIiAjZikpCisgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAgICAgICAg
ICAgICAgICAgcGtnLW1ldGEtYWxpc3QpKSkpKSkKICAgICAgICAjOnRlc3RzPyAjZikpCiAgICAg
KHN5bm9wc2lzICJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBOb2RlIFNlcmlhbFBvcnQgYmluZGlu
Z3MiKQogICAgIChkZXNjcmlwdGlvbiAiTm9kZSBTZXJpYWxQb3J0IGlzIGEgbW9kdWxhciBzdWl0
ZSBvZiBOb2RlLmpzIHBhY2thZ2VzIGZvcgpAQCAtMTUyMiwzOSArMTUxMiwzMyBAQCAoZGVmaW5l
LXB1YmxpYyBub2RlLXNxbGl0ZTMKICAgICAgICAgICAgICAoc3Vic3RpdHV0ZSogIi5ucG1pZ25v
cmUiCiAgICAgICAgICAgICAgICAoKCJsaWIvYmluZGluZyIpCiAgICAgICAgICAgICAgICAgIiNs
aWIvYmluZGluZyAjIDwtIHBhdGNoZWQgZm9yIEd1aXgiKSkKLSAgICAgICAgICAgICAod2l0aC1h
dG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdlLmpzb24iCi0gICAgICAgICAgICAg
ICAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICgoJ0AgLiBwa2ctbWV0YS1hbGlzdCkK
LSAgICAgICAgICAgICAgICAgIChtYXRjaCAoYXNzb2MtcmVmIHBrZy1tZXRhLWFsaXN0ICJiaW5h
cnkiKQotICAgICAgICAgICAgICAgICAgICAoKCdAIC4gYmluYXJ5LWFsaXN0KQotICAgICAgICAg
ICAgICAgICAgICAgOzsgV2hlbiBpdCBidWlsZHMgZnJvbSBzb3VyY2UsIG5vZGUtcHJlLWd5cCBz
dXBwbGllcwotICAgICAgICAgICAgICAgICAgICAgOzsgbW9kdWxlX25hbWUgYW5kIG1vZHVsZV9w
YXRoIGJhc2VkIG9uIHRoZSBlbnRyaWVzIHVuZGVyCi0gICAgICAgICAgICAgICAgICAgICA7OyAi
YmluYXJ5IiBmcm9tICJwYWNrYWdlLmpzb24iLCBzbyB0aGlzIHBhY2thZ2UncwotICAgICAgICAg
ICAgICAgICAgICAgOzsgImJpbmRpbmcuZ3lwIiBkb2Vzbid0IGRlZmluZSB0aGVtLiBUaHVzLCB3
ZSBhbHNvIG5lZWQKLSAgICAgICAgICAgICAgICAgICAgIDs7IHRvIHN1cHBseSB0aGVtLiBUaGUg
R1lQX0RFRklORVMgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgIDs7
IHR1cm5zIG91dCB0byBiZSB0aGUgZWFzaWVzdCB3YXkgdG8gbWFrZSBzdXJlIHRoZXkgYXJlCi0g
ICAgICAgICAgICAgICAgICAgICA7OyBwcm9wYWdhdGVkIGZyb20gbnBtIHRvIG5vZGUtZ3lwIHRv
IGd5cC4KLSAgICAgICAgICAgICAgICAgICAgIChzZXRlbnYgIkdZUF9ERUZJTkVTIgotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLWFwcGVuZAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIm1vZHVsZV9uYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChhc3NvYy1yZWYgYmluYXJ5LWFsaXN0ICJtb2R1bGVfbmFtZSIpCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGVf
cGF0aD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVmIGJpbmFyeS1h
bGlzdCAibW9kdWxlX3BhdGgiKSkpKSkKLSAgICAgICAgICAgICAgICAgIDs7IFdlIG5lZWQgdG8g
cmVtb3ZlIHRoZSBpbnN0YWxsIHNjcmlwdCBmcm9tICJwYWNrYWdlLmpzb24iLAotICAgICAgICAg
ICAgICAgICAgOzsgYXMgaXQgd291bGQgdHJ5IHRvIHVzZSBub2RlLXByZS1neXAgYW5kIHdvdWxk
IGJsb2NrIHRoZQotICAgICAgICAgICAgICAgICAgOzsgYXV0b21hdGljIGJ1aWxkaW5nIHBlcmZv
cm1lZCBieSBgbnBtIGluc3RhbGxgLgotICAgICAgICAgICAgICAgICAgKGNvbnMgJ0AgKG1hcCAo
bWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0
cyIgQCAuIHNjcmlwdHMtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGAoInNjcmlwdHMiIEAgLEAoZmlsdGVyIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJpbnN0YWxsIiAu
IF8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICNmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcgotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29u
LWZpbGUtcmVwbGFjZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAg
ICAobGV0ICgoYmluYXJ5LWFsaXN0IChhc3NvYy1yZWYgcGtnLW1ldGEtYWxpc3QgImJpbmFyeSIp
KSkKKyAgICAgICAgICAgICAgICAgOzsgV2hlbiBpdCBidWlsZHMgZnJvbSBzb3VyY2UsIG5vZGUt
cHJlLWd5cCBzdXBwbGllcworICAgICAgICAgICAgICAgICA7OyBtb2R1bGVfbmFtZSBhbmQgbW9k
dWxlX3BhdGggYmFzZWQgb24gdGhlIGVudHJpZXMgdW5kZXIKKyAgICAgICAgICAgICAgICAgOzsg
ImJpbmFyeSIgZnJvbSAicGFja2FnZS5qc29uIiwgc28gdGhpcyBwYWNrYWdlJ3MKKyAgICAgICAg
ICAgICAgICAgOzsgImJpbmRpbmcuZ3lwIiBkb2Vzbid0IGRlZmluZSB0aGVtLiBUaHVzLCB3ZSBh
bHNvIG5lZWQKKyAgICAgICAgICAgICAgICAgOzsgdG8gc3VwcGx5IHRoZW0uIFRoZSBHWVBfREVG
SU5FUyBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgICAgICAgICAgICA7OyB0dXJucyBvdXQg
dG8gYmUgdGhlIGVhc2llc3Qgd2F5IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZQorICAgICAgICAgICAg
ICAgICA7OyBwcm9wYWdhdGVkIGZyb20gbnBtIHRvIG5vZGUtZ3lwIHRvIGd5cC4KKyAgICAgICAg
ICAgICAgICAgKHNldGVudiAiR1lQX0RFRklORVMiIChzdHJpbmctYXBwZW5kCisgICAgICAgICAg
ICAgICAgICAgIm1vZHVsZV9uYW1lPSIKKyAgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVmIGJp
bmFyeS1hbGlzdCAibW9kdWxlX25hbWUiKQorICAgICAgICAgICAgICAgICAgICIgbW9kdWxlX3Bh
dGg9IgorICAgICAgICAgICAgICAgICAgIChhc3NvYy1yZWYgYmluYXJ5LWFsaXN0ICJtb2R1bGVf
cGF0aCIpKSkpCisgICAgICAgICAgICAgICA7OyBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgaW5zdGFs
bCBzY3JpcHQgZnJvbSAicGFja2FnZS5qc29uIiwKKyAgICAgICAgICAgICAgIDs7IGFzIGl0IHdv
dWxkIHRyeSB0byB1c2Ugbm9kZS1wcmUtZ3lwIGFuZCB3b3VsZCBibG9jayB0aGUKKyAgICAgICAg
ICAgICAgIDs7IGF1dG9tYXRpYyBidWlsZGluZyBwZXJmb3JtZWQgYnkgYG5wbSBpbnN0YWxsYC4K
KyAgICAgICAgICAgICAgIChtYXAKKyAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAg
ICAgICAgICAgICAgICAgICgoInNjcmlwdHMiIC4gc2NyaXB0cy1hbGlzdCkKKyAgICAgICAgICAg
ICAgICAgICAgIChjb25zICJzY3JpcHRzIiAoZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAg
IChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCJpbnN0YWxsIiAuIF8p
ICNmKQorICAgICAgICAgICAgICAgICAgICAgICAgIChfICN0KSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAgICAgICAgICAgIChvdGhlciBvdGhlcikp
CisgICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkKICAgICAoaG9tZS1wYWdl
ICJodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L25vZGUtc3FsaXRlMyIpCiAgICAgKHN5bm9wc2lz
ICJOb2RlLmpzIGJpbmRpbmdzIGZvciBTUUxpdGUzIikKICAgICAoZGVzY3JpcHRpb24KZGlmZiAt
LWdpdCBhL2d1aXgvYnVpbGQtc3lzdGVtL25vZGUuc2NtIGIvZ3VpeC9idWlsZC1zeXN0ZW0vbm9k
ZS5zY20KaW5kZXggNTdmZTVmNjAzMC4uNDI1YjhjZDliMyAxMDA2NDQKLS0tIGEvZ3VpeC9idWls
ZC1zeXN0ZW0vbm9kZS5zY20KKysrIGIvZ3VpeC9idWlsZC1zeXN0ZW0vbm9kZS5zY20KQEAgLTQs
NiArNCw3IEBACiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEgTHVkb3ZpYyBDb3VydMOocyA8bHVkb0Bn
bnUub3JnPgogOzs7IENvcHlyaWdodCDCqSAyMDIxIFBpZXJyZSBMYW5nbG9pcyA8cGllcnJlLmxh
bmdsb2lzQGdteC5jb20+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEgUGhpbGlwIE1jR3JhdGggPHBo
aWxpcEBwaGlsaXBtY2dyYXRoLmNvbT4KKzs7OyBDb3B5cmlnaHQgwqkgMjAyNCBEYW5pZWwgS2hv
ZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21haWwuY29tPgogOzs7CiA7OzsgVGhpcyBmaWxlIGlz
IHBhcnQgb2YgR05VIEd1aXguCiA7OzsKQEAgLTM2LDcgKzM3LDEwIEBAIChkZWZpbmUtbW9kdWxl
IChndWl4IGJ1aWxkLXN5c3RlbSBub2RlKQogKGRlZmluZSAlbm9kZS1idWlsZC1zeXN0ZW0tbW9k
dWxlcwogICA7OyBCdWlsZC1zaWRlIG1vZHVsZXMgaW1wb3J0ZWQgYnkgZGVmYXVsdC4KICAgYCgo
Z3VpeCBidWlsZCBub2RlLWJ1aWxkLXN5c3RlbSkKLSAgICAoZ3VpeCBidWlsZCBqc29uKQorICAg
IChqc29uKQorICAgIChqc29uIGJ1aWxkZXIpCisgICAgKGpzb24gcGFyc2VyKQorICAgIChqc29u
IHJlY29yZCkKICAgICAsQCVkZWZhdWx0LWdudS1pbXBvcnRlZC1tb2R1bGVzKSkKIAogKGRlZmlu
ZSAoZGVmYXVsdC1ub2RlKQpkaWZmIC0tZ2l0IGEvZ3VpeC9idWlsZC9ub2RlLWJ1aWxkLXN5c3Rl
bS5zY20gYi9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNjbQppbmRleCBmYjIzODk0YmMx
Li40NmUwZGRkNzFkIDEwMDY0NAotLS0gYS9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNj
bQorKysgYi9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNjbQpAQCAtNCw2ICs0LDcgQEAK
IDs7OyBDb3B5cmlnaHQgwqkgMjAxOSwgMjAyMSBUaW1vdGh5IFNhbXBsZSA8c2FtcGxldEBuZ3ly
by5jb20+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEsIDIwMjIgUGhpbGlwIE1jR3JhdGggPHBoaWxp
cEBwaGlsaXBtY2dyYXRoLmNvbT4KIDs7OyBDb3B5cmlnaHQgwqkgMjAyMiBMaWxpYW5hIE1hcmll
IFByaWtsZXIgPGxpbGlhbmEucHJpa2xlckBnbWFpbC5jb20+Cis7OzsgQ29weXJpZ2h0IMKpIDIw
MjQgRGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KIDs7OwogOzs7
IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBHdWl4LgogOzs7CkBAIC0yMywxMCArMjQsMTAgQEAK
IChkZWZpbmUtbW9kdWxlIChndWl4IGJ1aWxkIG5vZGUtYnVpbGQtc3lzdGVtKQogICAjOnVzZS1t
b2R1bGUgKChndWl4IGJ1aWxkIGdudS1idWlsZC1zeXN0ZW0pICM6cHJlZml4IGdudTopCiAgICM6
dXNlLW1vZHVsZSAoZ3VpeCBidWlsZCB1dGlscykKLSAgIzp1c2UtbW9kdWxlIChndWl4IGJ1aWxk
IGpzb24pCiAgICM6dXNlLW1vZHVsZSAoaWNlLTkgZnR3KQogICAjOnVzZS1tb2R1bGUgKGljZS05
IHJlZ2V4KQogICAjOnVzZS1tb2R1bGUgKGljZS05IG1hdGNoKQorICAjOnVzZS1tb2R1bGUgKGpz
b24pCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTEpCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBz
cmZpLTcxKQogICAjOmV4cG9ydCAoJXN0YW5kYXJkLXBoYXNlcwpAQCAtMzQsMTMgKzM1LDE0IEBA
IChkZWZpbmUtbW9kdWxlIChndWl4IGJ1aWxkIG5vZGUtYnVpbGQtc3lzdGVtKQogICAgICAgICAg
ICAgZGVsZXRlLWRlcGVuZGVuY2llcwogICAgICAgICAgICAgbm9kZS1idWlsZCkpCiAKLShkZWZp
bmUgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCBmaWxlIHByb2MpCisoZGVmaW5l
KiAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50IHByb2MKKyAgIzpvcHRpb25hbCAo
ZmlsZSAicGFja2FnZS5qc29uIikpCiAgICJMaWtlICd3aXRoLWF0b21pYy1maWxlLXJlcGxhY2Vt
ZW50JywgYnV0IFBST0MgaXMgY2FsbGVkIHdpdGggYSBzaW5nbGUKIGFyZ3VtZW50LS0tdGhlIHJl
c3VsdCBvZiBwYXJzaW5nIEZJTEUncyBjb250ZW50cyBhcyBqc29uLS0tYW5kIHNob3VsZCBhIHZh
bHVlCiB0byBiZSB3cml0dGVuIGFzIGpzb24gdG8gdGhlIHJlcGxhY2VtZW50IEZJTEUuIgogICAo
d2l0aC1hdG9taWMtZmlsZS1yZXBsYWNlbWVudCBmaWxlCiAgICAgKGxhbWJkYSAoaW4gb3V0KQot
ICAgICAgKHdyaXRlLWpzb24gKHByb2MgKHJlYWQtanNvbiBpbikpIG91dCkpKSkKKyAgICAgIChz
Y20tPmpzb24gKHByb2MgKGpzb24tPnNjbSBpbikpIG91dCkpKSkKIAogKGRlZmluZSogKGFzc29j
LXJlZiogYWxpc3Qga2V5ICM6b3B0aW9uYWwgZGVmYXVsdCkKICAgIkxpa2UgYXNzb2MtcmVmLCBi
dXQgcmV0dXJuIERFRkFVTFQgaW5zdGVhZCBvZiAjZiBpZiBubyB2YWx1ZSBleGlzdHMuIgpAQCAt
NDgsMTAgKzUwLDYgQEAgKGRlZmluZSogKGFzc29jLXJlZiogYWxpc3Qga2V5ICM6b3B0aW9uYWwg
ZGVmYXVsdCkKICAgICAoI2YgZGVmYXVsdCkKICAgICAoKF8gLiB2YWx1ZSkgdmFsdWUpKSkKIAot
KGRlZmluZSogKGpzb2JqZWN0LXJlZiBvYmoga2V5ICM6b3B0aW9uYWwgZGVmYXVsdCkKLSAgKG1h
dGNoIG9iagotICAgICgoJ0AgLiBhbGlzdCkgKGFzc29jLXJlZiogYWxpc3Qga2V5IGRlZmF1bHQp
KSkpCi0KIChkZWZpbmUqIChhbGlzdC1wb3AgYWxpc3Qga2V5ICM6b3B0aW9uYWwgKD0gZXF1YWw/
KSkKICAgIlJldHVybiB0d28gdmFsdWVzLCB0aGUgZmlyc3QgcGFpciBpbiBBTElTVCB3aXRoIGtl
eSBLRVksIGFuZCB0aGUgb3RoZXIKIGVsZW1lbnRzLiAgRXF1YWxpdHkgY2FsbHMgYXJlIG1hZGUg
YXMgKD0gS0VZIEFMSVNUQ0FSKS4iCkBAIC02Myw2NyArNjEsMTcgQEAgKGRlZmluZSogKGFsaXN0
LXBvcCBhbGlzdCBrZXkgIzpvcHRpb25hbCAoPSBlcXVhbD8pKQogICAgICAgICAodmFsdWVzIChj
YXIgYWZ0ZXIpIChhcHBlbmQgYmVmb3JlIChjZHIgYWZ0ZXIpKSkKICAgICAgICAgKHZhbHVlcyAj
ZiBiZWZvcmUpKSkpCiAKLShkZWZpbmUqIChhbGlzdC11cGRhdGUgYWxpc3Qga2V5IHByb2MgIzpv
cHRpb25hbCBkZWZhdWx0ICg9IGVxdWFsPykpCisoZGVmaW5lKiAoYWxpc3QtdXBkYXRlIGFsaXN0
IGtleSBwcm9jICM6b3B0aW9uYWwgKD0gZXF1YWw/KSkKICAgIlJldHVybiBhbiBhc3NvY2lhdGlv
biBsaXN0IGxpa2UgQUxJU1QsIGJ1dCB3aXRoIEtFWSBtYXBwZWQgdG8gdGhlIHJlc3VsdCBvZgog
UFJPQyBhcHBsaWVkIHRvIHRoZSBmaXJzdCB2YWx1ZSBmb3VuZCB1bmRlciB0aGUgY29tcGFyaXNv
biAoPSBLRVkgQUxJU1RDQVIpLgotSWYgbm8gc3VjaCB2YWx1ZSBleGlzdHMsIHVzZSBERUZBVUxU
IGluc3RlYWQuCitJZiBubyBzdWNoIHZhbHVlIGV4aXN0cywgcmV0dXJuIHRoZSBsaXN0IHVuY2hh
bmdlZC4KIFVubGlrZSBhY29ucywgdGhpcyByZW1vdmVzIHRoZSBwcmV2aW91cyBhc3NvY2lhdGlv
biBvZiBLRVkgKGFzc3VtaW5nIGl0IGlzCiB1bmlxdWUpLCBidXQgdGhlIHJlc3VsdCBtYXkgc3Rp
bGwgc2hhcmUgc3RvcmFnZSB3aXRoIEFMSVNULiIKICAgKGxldCAoKHBhaXIgcmVzdCAoYWxpc3Qt
cG9wIGFsaXN0IGtleSA9KSkpCi0gICAgKGFjb25zIGtleQotICAgICAgICAgICAocHJvYyAoaWYg
KHBhaXI/IHBhaXIpCi0gICAgICAgICAgICAgICAgICAgICAoY2RyIHBhaXIpCi0gICAgICAgICAg
ICAgICAgICAgICBkZWZhdWx0KSkKLSAgICAgICAgICAgcmVzdCkpKQotCi0oZGVmaW5lIChqc29i
amVjdC11cGRhdGUqIGpzIC4gdXBkYXRlcykKLSAgIlJldHVybiBhIGpzb24gb2JqZWN0IGxpa2Ug
SlMsIGJ1dCB3aXRoIGFsbCBVUERBVEVTIGFwcGxpZWQuICBFYWNoIHVwZGF0ZSBpcwotYSBsaXN0
IChLRVkgUFJPQyBbREVGQVVMVF0pLCBzbyB0aGF0IEtFWSBpcyBtYXBwZWQgdG8gdGhlIHJlc3Vs
dCBvZiBQUk9DCi1hcHBsaWVkIHRvIHRoZSB2YWx1ZSB0byB3aGljaCBLRVkgaXMgbWFwcGVkIGlu
IEpTLiAgSWYgbm8gc3VjaCBtYXBwaW5nIGV4aXN0cywKLVBST0MgaXMgaW5zdGVhZCBhcHBsaWVk
IHRvIERFRkFVTFQsIG9yIHRvICcjZicgaXMgbm8gREVGQVVMVCBpcyBzcGVjaWZpZWQuCi1UaGUg
dXBkYXRlIHRha2VzIHBsYWNlIGZyb20gbGVmdCB0byByaWdodCwgc28gbGF0ZXIgVVBEQVRFUnMg
d2lsbCByZWNlaXZlIHRoZQotdmFsdWVzIHJldHVybmVkIGJ5IGVhcmxpZXIgVVBEQVRFUnMgZm9y
IHRoZSBzYW1lIEtFWS4iCi0gIChtYXRjaCBqcwotICAgICgoJ0AgLiBhbGlzdCkKLSAgICAgKGxl
dCBsb29wICgoYWxpc3QgYWxpc3QpCi0gICAgICAgICAgICAgICAgKHVwZGF0ZXMgdXBkYXRlcykp
Ci0gICAgICAgKG1hdGNoIHVwZGF0ZXMKLSAgICAgICAgICgoKSAoY29ucyAnQCBhbGlzdCkpCi0g
ICAgICAgICAoKChrZXkgcHJvYykgLiB1cGRhdGVzKQotICAgICAgICAgIChsb29wIChhbGlzdC11
cGRhdGUgYWxpc3Qga2V5IHByb2MgI2YgZXF1YWw/KSB1cGRhdGVzKSkKLSAgICAgICAgICgoKGtl
eSBwcm9jIGRlZmF1bHQpIC4gdXBkYXRlcykKLSAgICAgICAgICAobG9vcCAoYWxpc3QtdXBkYXRl
IGFsaXN0IGtleSBwcm9jIGRlZmF1bHQgZXF1YWw/KSB1cGRhdGVzKSkpKSkpKQotCi0oZGVmaW5l
IChqc29iamVjdC11bmlvbiBjb21iaW5lIHNlZWQgLiBvYmplY3RzKQotICAiTWVyZ2UgT0JKRUNU
UyBpbnRvIFNFRUQgYnkgYXBwbHlpbmcgKENPTUJJTkUgS0VZIFZBTDAgVkFMKSwgd2hlcmUgVkFM
MAotaXMgdGhlIHZhbHVlIGZvdW5kIGluIHRoZSAocG9zc2libHkgdXBkYXRlZCkgU0VFRCBhbmQg
VkFMIGlzIHRoZSBuZXcgdmFsdWUKLWZvdW5kIGluIG9uZSBvZiB0aGUgT0JKRUNUUy4iCi0gICht
YXRjaCBzZWVkCi0gICAgKCgnQCAuIGFzZWVkKQotICAgICAobWF0Y2ggb2JqZWN0cwotICAgICAg
ICgoKSBzZWVkKQotICAgICAgICgoKCdAIC4gYWxpc3RzKSAuLi4pCi0gICAgICAgIChjb25zCi0g
ICAgICAgICAnQAotICAgICAgICAgKGZvbGQgKGxhbWJkYSAoYWxpc3QgYXNlZWQpCi0gICAgICAg
ICAgICAgICAgIChpZiAobnVsbD8gYXNlZWQpIGFsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAo
Zm9sZAotICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEqCi0gICAgICAgICAgICAg
ICAgICAgICAgICAoKChrIC4gdikgYXNlZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGxl
dCAoKHBhaXIgdGFpbCAoYWxpc3QtcG9wIGFsaXN0IGspKSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChtYXRjaCBwYWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgjZiAoYWNv
bnMgayB2IGFzZWVkKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfIC4gdjApIChh
Y29ucyBrIChjb21iaW5lIGsgdjAgdikgYXNlZWQpKSkpKSkKLSAgICAgICAgICAgICAgICAgICAg
ICBhc2VlZAotICAgICAgICAgICAgICAgICAgICAgIGFsaXN0KSkpCi0gICAgICAgICAgICAgICBh
c2VlZAotICAgICAgICAgICAgICAgYWxpc3RzKSkpKSkpKQorICAgIChpZiAocGFpcj8gcGFpcikK
KyAgICAgIChhY29ucyBrZXkgKHByb2MgKGNkciBwYWlyKSkgcmVzdCkKKyAgICAgIGFsaXN0KSkp
CiAKLTs7IFBvc3NpYmx5IHVzZWZ1bCBoZWxwZXIgZnVuY3Rpb25zOgotOzsgKGRlZmluZSAobmV3
ZXN0IGtleSB2YWwwIHZhbCkgdmFsKQotOzsgKGRlZmluZSAodW5rZXllZC0+a2V5ZWQgcHJvYykg
KGxhbWJkYSAoX2tleSB2YWwwIHZhbCkgKHByb2MgdmFsMCB2YWwpKSkKLQotDAogOzs7CiA7Ozsg
UGhhc2VzLgogOzs7CkBAIC0xNDIsOCArOTAsOCBAQCAoZGVmaW5lIChzZXQtaG9tZSAuIF8pCiAK
IChkZWZpbmUgKG1vZHVsZS1uYW1lIG1vZHVsZSkKICAgKGxldCogKChwYWNrYWdlLmpzb24gKHN0
cmluZy1hcHBlbmQgbW9kdWxlICIvcGFja2FnZS5qc29uIikpCi0gICAgICAgICAocGFja2FnZS1t
ZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBwYWNrYWdlLmpzb24gcmVhZC1qc29uKSkpCi0gICAg
KGpzb2JqZWN0LXJlZiBwYWNrYWdlLW1ldGEgIm5hbWUiKSkpCisgICAgICAgICAocGFja2FnZS1t
ZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBwYWNrYWdlLmpzb24ganNvbi0+c2NtKSkpCisgICAg
KGFzc29jLXJlZiBwYWNrYWdlLW1ldGEgIm5hbWUiKSkpCiAKIChkZWZpbmUgKGluZGV4LW1vZHVs
ZXMgaW5wdXQtcGF0aHMpCiAgIChkZWZpbmUgKGxpc3QtbW9kdWxlcyBkaXJlY3RvcnkpCkBAIC0x
NjcsNDkgKzExNSw2MCBAQCAoZGVmaW5lKiAocGF0Y2gtZGVwZW5kZW5jaWVzICM6a2V5IGlucHV0
cyAjOmFsbG93LW90aGVyLWtleXMpCiAKICAgKGRlZmluZSBpbmRleCAoaW5kZXgtbW9kdWxlcyAo
bWFwIGNkciBpbnB1dHMpKSkKIAotICAoZGVmaW5lIHJlc29sdmUtZGVwZW5kZW5jaWVzCi0gICAg
KG1hdGNoLWxhbWJkYQotICAgICAgKCgnQCAuIGFsaXN0KQotICAgICAgIChjb25zICdAIChtYXAg
KG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAoKGtleSAuIHZhbHVlKQotICAg
ICAgICAgICAgICAgICAgICAgICAgKGNvbnMga2V5IChoYXNoLXJlZiBpbmRleCBrZXkgdmFsdWUp
KSkpCi0gICAgICAgICAgICAgICAgICAgICBhbGlzdCkpKSkpCisgIChkZWZpbmUgKHJlc29sdmUt
ZGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcykKKyAgICAobWFwCisgICAgICAobWF0Y2gtbGFtYmRh
CisgICAgICAgICgoZGVwZW5kZW5jeSAuIHZlcnNpb24pCisgICAgICAgICAgKGNvbnMgZGVwZW5k
ZW5jeSAoaGFzaC1yZWYgaW5kZXggZGVwZW5kZW5jeSB2ZXJzaW9uKSkpKQorICAgICAgZGVwZW5k
ZW5jaWVzKSkKIAotICAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdl
Lmpzb24iCisgICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQKICAgICAobGFtYmRh
IChwa2ctbWV0YSkKLSAgICAgIChqc29iamVjdC11cGRhdGUqCi0gICAgICAgcGtnLW1ldGEKLSAg
ICAgICBgKCJkZXZEZXBlbmRlbmNpZXMiICxyZXNvbHZlLWRlcGVuZGVuY2llcyAoQCkpCi0gICAg
ICAgYCgiZGVwZW5kZW5jaWVzIiAsKGxhbWJkYSAoZGVwcykKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChyZXNvbHZlLWRlcGVuZGVuY2llcwotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChqc29iamVjdC11bmlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChr
IGEgYikgYikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpzb2JqZWN0LXJlZiBwa2ct
bWV0YSAicGVlckRlcGVuZGVuY2llcyIgJyhAKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZGVwcykpKQotICAgICAgICAgKEApKSkpKQorICAgICAgKGZvbGQKKyAgICAgICAgKGxhbWJk
YSAocHJvYyBwa2ctbWV0YSkgKHByb2MgcGtnLW1ldGEpKQorICAgICAgICBwa2ctbWV0YQorICAg
ICAgICAobGlzdAorICAgICAgICAgIChsYW1iZGEgKHBrZy1tZXRhKQorICAgICAgICAgICAgKGFs
aXN0LXVwZGF0ZSBwa2ctbWV0YSAiZGV2RGVwZW5kZW5jaWVzIiByZXNvbHZlLWRlcGVuZGVuY2ll
cykpCisgICAgICAgICAgKGxhbWJkYSAocGtnLW1ldGEpCisgICAgICAgICAgICAoYXNzb2Mtc2V0
IQorICAgICAgICAgICAgICBwa2ctbWV0YQorICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIgor
ICAgICAgICAgICAgICAocmVzb2x2ZS1kZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICA7IENv
bWJpbmVkICJwZWVyRGVwZW5kZW5jaWVzIiBhbmQgImRlcGVuZGVuY2llcyIgZGVwZW5kZW5jaWVz
CisgICAgICAgICAgICAgICAgOyB3aXRoICJkZXBlbmRlbmNpZXMiIHRha2luZyBwcmVjZWRlbnQu
CisgICAgICAgICAgICAgICAgKGZvbGQKKyAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGRlcGVu
ZGVuY3kgZGVwZW5kZW5jaWVzKQorICAgICAgICAgICAgICAgICAgICAoYXBwbHkgYXNzb2Mtc2V0
ISBkZXBlbmRlbmNpZXMgZGVwZW5kZW5jeSkpCisgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVm
KiBwa2ctbWV0YSAicGVlckRlcGVuZGVuY2llcyIgJygpKQorICAgICAgICAgICAgICAgICAgKGFz
c29jLXJlZiogcGtnLW1ldGEgImRlcGVuZGVuY2llcyIgJygpKQorICAgICAgICAgICAgICAgICkp
KSkpKSkpCiAgICN0KQogCi0oZGVmaW5lIChkZWxldGUtZGVwZW5kZW5jaWVzIGFic2VudCkKKyhk
ZWZpbmUgKGRlbGV0ZS1kZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzLXRvLXJlbW92ZSkKICAgIlJl
d3JpdGUgJ3BhY2thZ2UuanNvbicgdG8gYWxsb3cgdGhlIGJ1aWxkIHRvIHByb2NlZWQgd2l0aG91
dCBwYWNrYWdlcwotbGlzdGVkIGluIEFCU0VOVCwgYSBsaXN0IG9mIHN0cmluZ3MgbmFtaW5nIG5w
bSBwYWNrYWdlcy4KK2xpc3RlZCBpbiAnZGVwZW5kZW5jaWVzLXRvLXJlbW92ZScsIGEgbGlzdCBv
ZiBzdHJpbmdzIG5hbWluZyBucG0gcGFja2FnZXMuCiAKIFRvIHByZXZlbnQgdGhlIGRlbGV0ZWQg
ZGVwZW5kZW5jaWVzIGZyb20gYmVpbmcgcmVpbnRyb2R1Y2VkLCB1c2UgdGhpcyBmdW5jdGlvbgog
b25seSBhZnRlciB0aGUgJ3BhdGNoLWRlcGVuZGVuY2llcycgcGhhc2UuIgotICAoZGVmaW5lIGRl
bGV0ZS1mcm9tLWpzb2JqZWN0Ci0gICAgKG1hdGNoLWxhbWJkYQotICAgICAgKCgnQCAuIGFsaXN0
KQotICAgICAgIChjb25zICdAIChmaWx0ZXIgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAoKGsgLiBfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAobWVt
YmVyIGsgYWJzZW50KSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgYWxpc3QpKSkpKQotCi0g
ICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIKKyAgKHdp
dGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudAogICAgIChsYW1iZGEgKHBrZy1tZXRhKQot
ICAgICAgKGpzb2JqZWN0LXVwZGF0ZSoKLSAgICAgICBwa2ctbWV0YQotICAgICAgIGAoImRldkRl
cGVuZGVuY2llcyIgLGRlbGV0ZS1mcm9tLWpzb2JqZWN0IChAKSkKLSAgICAgICBgKCJkZXBlbmRl
bmNpZXMiICxkZWxldGUtZnJvbS1qc29iamVjdCAoQCkpCi0gICAgICAgYCgicGVlckRlcGVuZGVu
Y2llcyIgLGRlbGV0ZS1mcm9tLWpzb2JqZWN0IChAKSkpKSkpCisgICAgICAoZm9sZAorICAgICAg
ICAobGFtYmRhIChkZXBlbmRlbmN5LWtleSBwa2ctbWV0YSkKKyAgICAgICAgICAoYWxpc3QtdXBk
YXRlCisgICAgICAgICAgICBwa2ctbWV0YQorICAgICAgICAgICAgZGVwZW5kZW5jeS1rZXkKKyAg
ICAgICAgICAgIChsYW1iZGEgKGRlcGVuZGVuY2llcykKKyAgICAgICAgICAgICAgKHJlbW92ZQor
ICAgICAgICAgICAgICAgIChsYW1iZGEgKGRlcGVuZGVuY3kpCisgICAgICAgICAgICAgICAgICAo
bWVtYmVyIChjYXIgZGVwZW5kZW5jeSkgZGVwZW5kZW5jaWVzLXRvLXJlbW92ZSkpCisgICAgICAg
ICAgICAgICAgZGVwZW5kZW5jaWVzKSkpKQorICAgICAgICBwa2ctbWV0YQorICAgICAgICAobGlz
dAorICAgICAgICAgICJkZXZEZXBlbmRlbmNpZXMiCisgICAgICAgICAgImRlcGVuZGVuY2llcyIK
KyAgICAgICAgICAicGVlckRlcGVuZGVuY2llcyIKKyAgICAgICAgICAib3B0aW9uYWxEZXBlbmRl
bmNpZXMiKSkpKSkKIAogKGRlZmluZSogKGRlbGV0ZS1sb2NrZmlsZXMgIzprZXkgaW5wdXRzICM6
YWxsb3ctb3RoZXIta2V5cykKICAgIkRlbGV0ZSAncGFja2FnZS1sb2NrLmpzb24nLCAneWFybi5s
b2NrJywgYW5kICducG0tc2hyaW5rd3JhcC5qc29uJywgaWYgdGhleQpAQCAtMjI4LDggKzE4Nyw4
IEBAIChkZWZpbmUqIChjb25maWd1cmUgIzprZXkgb3V0cHV0cyBpbnB1dHMgIzphbGxvdy1vdGhl
ci1rZXlzKQogICAgICN0KSkKIAogKGRlZmluZSogKGJ1aWxkICM6a2V5IGlucHV0cyAjOmFsbG93
LW90aGVyLWtleXMpCi0gIChsZXQgKChwYWNrYWdlLW1ldGEgKGNhbGwtd2l0aC1pbnB1dC1maWxl
ICJwYWNrYWdlLmpzb24iIHJlYWQtanNvbikpKQotICAgIChpZiAoanNvYmplY3QtcmVmIChqc29i
amVjdC1yZWYgcGFja2FnZS1tZXRhICJzY3JpcHRzIiAnKEApKSAiYnVpbGQiICNmKQorICAobGV0
ICgocGFja2FnZS1tZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSAicGFja2FnZS5qc29uIiBqc29u
LT5zY20pKSkKKyAgICAoaWYgKGFzc29jLXJlZiogKGFzc29jLXJlZiogcGFja2FnZS1tZXRhICJz
Y3JpcHRzIiAnKCkpICJidWlsZCIgI2YpCiAgICAgICAgIChsZXQgKChucG0gKHN0cmluZy1hcHBl
bmQgKGFzc29jLXJlZiBpbnB1dHMgIm5vZGUiKSAiL2Jpbi9ucG0iKSkpCiAgICAgICAgICAgKGlu
dm9rZSBucG0gInJ1biIgImJ1aWxkIikpCiAgICAgICAgIChmb3JtYXQgI3QgInRoZXJlIGlzIG5v
IGJ1aWxkIHNjcmlwdCB0byBydW5+JSIpKQpAQCAtMzAxLDIyICsyNjAsMjAgQEAgKGRlZmluZSog
KGF2b2lkLW5vZGUtZ3lwLXJlYnVpbGQgIzprZXkgb3V0cHV0cyAjOmFsbG93LW90aGVyLWtleXMp
CiAgIDs7IGV2ZW4gbmVlZCB0byBvdmVyd3JpdGUgdGhpcyBmaWxlLiAgVGhlcmVmb3JlLCBsZXQn
cyB1c2Ugc29tZSBoZWxwZXJzCiAgIDs7IHRoYXQgd2UnZCBvdGhlcndpc2Ugbm90IG5lZWQuCiAg
IChkZWZpbmUgcGtnLW1ldGEKLSAgICAoY2FsbC13aXRoLWlucHV0LWZpbGUgaW5zdGFsbGVkLXBh
Y2thZ2UuanNvbiByZWFkLWpzb24pKQorICAgIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBpbnN0YWxs
ZWQtcGFja2FnZS5qc29uIGpzb24tPnNjbSkpCiAgIChkZWZpbmUgc2NyaXB0cwotICAgIChqc29i
amVjdC1yZWYgcGtnLW1ldGEgInNjcmlwdHMiICcoQCkpKQotICAoZGVmaW5lIChqc29iamVjdC1z
ZXQganMga2V5IHZhbCkKLSAgICAoanNvYmplY3QtdXBkYXRlKiBqcyAobGlzdCBrZXkgKGNvbnN0
IHZhbCkpKSkKKyAgICAoYXNzb2MtcmVmKiBwa2ctbWV0YSAic2NyaXB0cyIgJygpKSkKIAotICAo
d2hlbiAoZXF1YWw/ICJub2RlLWd5cCByZWJ1aWxkIiAoanNvYmplY3QtcmVmIHNjcmlwdHMgImlu
c3RhbGwiICNmKSkKKyAgKHdoZW4gKGVxdWFsPyAibm9kZS1neXAgcmVidWlsZCIgKGFzc29jLXJl
Ziogc2NyaXB0cyAiaW5zdGFsbCIgI2YpKQogICAgIChjYWxsLXdpdGgtb3V0cHV0LWZpbGUgaW5z
dGFsbGVkLXBhY2thZ2UuanNvbgogICAgICAgKGxhbWJkYSAob3V0KQotICAgICAgICAod3JpdGUt
anNvbgotICAgICAgICAgKGpzb2JqZWN0LXNldCBwa2ctbWV0YQotICAgICAgICAgICAgICAgICAg
ICAgICAic2NyaXB0cyIKLSAgICAgICAgICAgICAgICAgICAgICAgKGpzb2JqZWN0LXNldCBzY3Jp
cHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbGwiCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVjaG8gR3VpeDogYXZvaWRpbmcgbm9k
ZS1neXAgcmVidWlsZCIpKQotICAgICAgICAgb3V0KSkpKSkKKyAgICAgICAgKHNjbS0+anNvbgor
ICAgICAgICAgIChhc3NvYy1zZXQhIHBrZy1tZXRhCisgICAgICAgICAgICAgICAgICAgICAgInNj
cmlwdHMiCisgICAgICAgICAgICAgICAgICAgICAgKGFzc29jLXNldCEgc2NyaXB0cworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YWxsIgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICJlY2hvIEd1aXg6IGF2b2lkaW5nIG5vZGUtZ3lwIHJlYnVpbGQiKSkK
KyAgICAgICAgICBvdXQpKSkpKQogCiAoZGVmaW5lICVzdGFuZGFyZC1waGFzZXMKICAgKG1vZGlm
eS1waGFzZXMgZ251OiVzdGFuZGFyZC1waGFzZXMKCmJhc2UtY29tbWl0OiBjZmQ0ZjU2Zjc1YTIw
YjY3MzJkNDYzMTgwZDIxMWY3OTZjOTAzMmU1Ci0tIAoyLjQ2LjAKCg==
--000000000000ccd36f062955ee49--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#74900] 
Resent-From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Thu, 26 Dec 2024 13:32:01 +0000
Resent-Message-ID: <handler.74900.B74900.173521991124040 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 74900
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 74900 <at> debbugs.gnu.org
Received: via spool by 74900-submit <at> debbugs.gnu.org id=B74900.173521991124040
          (code B ref 74900); Thu, 26 Dec 2024 13:32:01 +0000
Received: (at 74900) by debbugs.gnu.org; 26 Dec 2024 13:31:51 +0000
Received: from localhost ([127.0.0.1]:40468 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tQnxt-0006Fe-EQ
	for submit <at> debbugs.gnu.org; Thu, 26 Dec 2024 08:31:51 -0500
Received: from mail-ua1-f42.google.com ([209.85.222.42]:49540)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <d.khodabakhsh@HIDDEN>) id 1tQnxp-0006FO-Aj
 for 74900 <at> debbugs.gnu.org; Thu, 26 Dec 2024 08:31:48 -0500
Received: by mail-ua1-f42.google.com with SMTP id
 a1e0cc1a2514c-85c4c9349b3so1363185241.3
 for <74900 <at> debbugs.gnu.org>; Thu, 26 Dec 2024 05:31:45 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1735219839; x=1735824639; darn=debbugs.gnu.org;
 h=to:subject:message-id:date:from:in-reply-to:references:mime-version
 :from:to:cc:subject:date:message-id:reply-to;
 bh=eEgsw1P3Eos7UECBw899z0yKR+fx0WEmIZgd8qG6glU=;
 b=N49lwEOlDNwLCiL3liix7as6hKYsi24ph/cwzgLOELQMIIhDG3KzmZ+FU39DmovkFs
 2qwvbwlbgfio1myJMdwbvlO5sZUO1ZNytcrF+aENh/mjsg8h6wApcWq1+vMb7X+Un9kL
 9pJ67EJX4+3Fzj7YhZ0+d+/2rf/psvZ/G77ClJihSkEW/LiL9k6/fT/6nst0CENC23kc
 Kro66s3FQ6ghjdRnAoan2tjLxjVjUKLhqj8jdwosLmg5cJgZoixAlcwO7oW/F99kYjJh
 g+2ITqJOv/bbjMFAFE/kIkOFFJAby1gvKa0y7cJIq8cqiC3wweu8y81/W7Cbnmmj7BSt
 7ASw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1735219839; x=1735824639;
 h=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=eEgsw1P3Eos7UECBw899z0yKR+fx0WEmIZgd8qG6glU=;
 b=v10sFY1C0grDp7zjQAfDPWXzP+OyhtR2xGDMvm/GfGg9pbQFnwmd4h7Y5/i36k/1ZQ
 mc9gQCrhw8QmoSPiRU/LOCytIgbg3sP5veYUK3RqnI3wHrK4ZkkWIDXKZg04mIjds4il
 AW5Der3cA4BgGM8YfFS71l3FQMeyImw301ugz8980L4Nh/qiplnMCwCkfnZo5I9bubjq
 5u6z7ISdqXNAy6iC1G2hqSPb8lv4xs9GcdKOAhzqPp5qFzaNMeMWgoe/BnjDaFIJDiUl
 XMhVWRJndXX3vFes9jr8FXixoh1gL8MADykxJhZvtJLSJAiHu/VQWF61D+BozLzTNPP5
 YAug==
X-Gm-Message-State: AOJu0YzuK6RJTStx9AJfCNpKWpdYcPycVAKqiNgGGnZTbRLT0aQTnN+q
 R4mmqgScbDjUsgBOhAURugtZavjbG4t5OdQ8Hu+Vj4UZXBmzMAjlhV+PT67+q6OQ93+E7usfvx9
 EKSW86ddc7F0VfiPUYVKq5LhDfQyFUp44
X-Gm-Gg: ASbGncvZfMKblxVYR0w7Zpl7nYaaQNoCzBLyfhXv2aQZras/zKeCCqahWy9tvoBPqJC
 9/byT6Q6Md7LhtGjRg+Fvto2iq0HbQla5kL2yNvnS
X-Google-Smtp-Source: AGHT+IGljGo+b20tSfv5PrNP7PVa0mUw71MEZ/iPOTpBhe350N3ofdv1LfzmqBONIMAcrHQDG+RjZ71mGG/xgpjuSa4=
X-Received: by 2002:a05:6102:548a:b0:4b1:1a9d:ecbc with SMTP id
 ada2fe7eead31-4b2cc45723emr19872806137.20.1735219839143; Thu, 26 Dec 2024
 05:30:39 -0800 (PST)
MIME-Version: 1.0
References: <CAADuFn++tHWy7CAzNv4TP3FCF4AGwMPeq1MDBGeH11Q9zcDxAw@HIDDEN>
In-Reply-To: <CAADuFn++tHWy7CAzNv4TP3FCF4AGwMPeq1MDBGeH11Q9zcDxAw@HIDDEN>
From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Date: Thu, 26 Dec 2024 13:30:26 +0000
Message-ID: <CAADuFnKcD0wxAZfg7cBPV1eWG9NW3Tm=nOHtd6Rcd9wfSqpsuA@HIDDEN>
Content-Type: multipart/mixed; boundary="0000000000001eb841062a2c5a1f"
X-Spam-Score: 0.0 (/)
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 (-)

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

Here's the patch again but with a formatting issue fixed and a fresh
merge from master:

From 19449feab9e31590bbd7c933b21163f8b398439b Mon Sep 17 00:00:00 2001
From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Date: Thu, 26 Dec 2024 04:35:39 -0800
Subject: [PATCH] Replace (guix build json) with (json) in node build system

This change replaces the use of (guix build json) with (json) for the
node ecosystem.
Since guile-json is a dependency of Guix, and it's used elsewhere in
the project, it makes sense to use this instead of rolling our own
JSON implementation with (guix build json).
This is one step to move away from (guix build json), there will be
other changes to remove the other uses of it.

Signed-off-by: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Change-Id: I9fd5152a98b6a241d414e9a94ab179c9cabcfb85
---
 gnu/packages/node-xyz.scm        | 148 ++++++++++++-------------
 guix/build-system/node.scm       |   6 +-
 guix/build/node-build-system.scm | 180 ++++++++++++-------------------
 3 files changed, 139 insertions(+), 195 deletions(-)

diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm
index e98eda2a01..ec3f9fbfb1 100644
--- a/gnu/packages/node-xyz.scm
+++ b/gnu/packages/node-xyz.scm
@@ -7,6 +7,7 @@
 ;;; Copyright =C2=A9 2021 Dhruvin Gandhi <contact@HIDDEN>
 ;;; Copyright =C2=A9 2022 Nicolas Graves <ngraves@HIDDEN>
 ;;; Copyright =C2=A9 2023 Jelle Licht <jlicht@HIDDEN>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -24,14 +25,14 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

 (define-module (gnu packages node-xyz)
-  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu packages sqlite)
   #:use-module (gnu packages python)
   #:use-module (gnu packages web)
+  #:use-module (guix build-system node)
   #:use-module (guix gexp)
-  #:use-module (guix packages)
   #:use-module (guix git-download)
-  #:use-module (guix build-system node))
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages))

 ;;;
 ;;; Please: Try to add new module packages in alphabetic order.
@@ -69,19 +70,17 @@ (define-public node-acorn
              ;; it would try to use the build environment and would block =
the
              ;; automatic building by other packages making use of node-ac=
orn.
              ;; TODO: Add utility function
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (cons '@ (map (match-lambda
-                                  (("scripts" @ . scripts-alist)
-                                   `("scripts" @ ,@(filter (match-lambda
-                                                             (("prepare" .=
 _)
-                                                              #f)
-                                                             (_
-                                                              #t))
-                                                           scripts-alist))=
)
-                                  (other other))
-                                pkg-meta-alist)))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (filter
+                       (match-lambda
+                         (("prepare" . _) #f)
+                         (_ #t))
+                       scripts-alist)))
+                   (other other))
+                 pkg-meta-alist)))))
          (replace 'build
            (lambda* (#:key inputs native-inputs #:allow-other-keys)
              (let ((esbuild (search-input-file (or native-inputs inputs)
@@ -158,23 +157,17 @@ (define-public node-addon-api
            (lambda args
              (define new-test-script
                "echo stopping after pretest on Guix")
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (cons
-                   '@
-                   (map (match-lambda
-                          (("scripts" '@ . scripts-alist)
-                           `("scripts" @ ,@(map (match-lambda
-                                                  (("test" . _)
-                                                   (cons "test"
-                                                         new-test-script))
-                                                  (other
-                                                   other))
-                                                scripts-alist)))
-                          (other
-                           other))
-                        pkg-meta-alist))))))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (map
+                       (match-lambda
+                         (("test" . _) (cons "test" new-test-script))
+                         (other other))
+                       scripts-alist)))
+                   (other other))
+                 pkg-meta-alist))))))))
     (home-page "https://github.com/nodejs/node-addon-api")
     (synopsis "Node.js API (Node-API) header-only C++ wrappers")
     (description "This module contains header-only C++ wrapper classes whi=
ch
@@ -1223,22 +1216,19 @@ (define-public node-serialport-bindings
                                     "node-abi"))))
          (add-after 'chdir 'avoid-prebuild-install
            (lambda args
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (cons '@ (map (match-lambda
-                                  (("scripts" @ . scripts-alist)
-                                   `("scripts" @ ,@(filter (match-lambda
-                                                             (("install" .=
 _)
-                                                              #f)
-                                                             (_
-                                                              #t))
-                                                           scripts-alist))=
)
-                                  (("gypfile" . _)
-                                   '("gypfile" . #f))
-                                  (other
-                                   other))
-                                pkg-meta-alist))))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (filter
+                       (match-lambda
+                         (("install" . _) #f)
+                         (_ #t))
+                       scripts-alist)))
+                   (("gypfile" . _)
+                     (cons "gypfile" #f))
+                   (other other))
+                 pkg-meta-alist))))))
        #:tests? #f))
     (synopsis "Abstract base class for Node SerialPort bindings")
     (description "Node SerialPort is a modular suite of Node.js packages f=
or
@@ -1524,39 +1514,33 @@ (define-public node-sqlite3
              (substitute* ".npmignore"
                (("lib/binding")
                 "#lib/binding # <- patched for Guix"))
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (match (assoc-ref pkg-meta-alist "binary")
-                    (('@ . binary-alist)
-                     ;; When it builds from source, node-pre-gyp supplies
-                     ;; module_name and module_path based on the entries u=
nder
-                     ;; "binary" from "package.json", so this package's
-                     ;; "binding.gyp" doesn't define them. Thus, we also n=
eed
-                     ;; to supply them. The GYP_DEFINES environment variab=
le
-                     ;; turns out to be the easiest way to make sure they =
are
-                     ;; propagated from npm to node-gyp to gyp.
-                     (setenv "GYP_DEFINES"
-                             (string-append
-                              "module_name=3D"
-                              (assoc-ref binary-alist "module_name")
-                              " "
-                              "module_path=3D"
-                              (assoc-ref binary-alist "module_path")))))
-                  ;; We need to remove the install script from "package.js=
on",
-                  ;; as it would try to use node-pre-gyp and would block t=
he
-                  ;; automatic building performed by `npm install`.
-                  (cons '@ (map (match-lambda
-                                  (("scripts" @ . scripts-alist)
-                                   `("scripts" @ ,@(filter (match-lambda
-                                                             (("install" .=
 _)
-                                                              #f)
-                                                             (_
-                                                              #t))
-                                                           scripts-alist))=
)
-                                  (other
-                                   other))
-                                pkg-meta-alist))))))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (let ((binary-alist (assoc-ref pkg-meta-alist "binary")))
+                 ;; When it builds from source, node-pre-gyp supplies
+                 ;; module_name and module_path based on the entries under
+                 ;; "binary" from "package.json", so this package's
+                 ;; "binding.gyp" doesn't define them. Thus, we also need
+                 ;; to supply them. The GYP_DEFINES environment variable
+                 ;; turns out to be the easiest way to make sure they are
+                 ;; propagated from npm to node-gyp to gyp.
+                 (setenv "GYP_DEFINES" (string-append
+                   "module_name=3D"
+                   (assoc-ref binary-alist "module_name")
+                   " module_path=3D"
+                   (assoc-ref binary-alist "module_path"))))
+               ;; We need to remove the install script from "package.json"=
,
+               ;; as it would try to use node-pre-gyp and would block the
+               ;; automatic building performed by `npm install`.
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (filter
+                       (match-lambda
+                         (("install" . _) #f)
+                         (_ #t))
+                       scripts-alist)))
+                   (other other))
+                 pkg-meta-alist))))))))
     (home-page "https://github.com/mapbox/node-sqlite3")
     (synopsis "Node.js bindings for SQLite3")
     (description
diff --git a/guix/build-system/node.scm b/guix/build-system/node.scm
index 57fe5f6030..425b8cd9b3 100644
--- a/guix/build-system/node.scm
+++ b/guix/build-system/node.scm
@@ -4,6 +4,7 @@
 ;;; Copyright =C2=A9 2021 Ludovic Court=C3=A8s <ludo@HIDDEN>
 ;;; Copyright =C2=A9 2021 Pierre Langlois <pierre.langlois@HIDDEN>
 ;;; Copyright =C2=A9 2021 Philip McGrath <philip@HIDDEN>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -36,7 +37,10 @@ (define-module (guix build-system node)
 (define %node-build-system-modules
   ;; Build-side modules imported by default.
   `((guix build node-build-system)
-    (guix build json)
+    (json)
+    (json builder)
+    (json parser)
+    (json record)
     ,@%default-gnu-imported-modules))

 (define (default-node)
diff --git a/guix/build/node-build-system.scm b/guix/build/node-build-syste=
m.scm
index fb23894bc1..f95c3bd793 100644
--- a/guix/build/node-build-system.scm
+++ b/guix/build/node-build-system.scm
@@ -4,6 +4,7 @@
 ;;; Copyright =C2=A9 2019, 2021 Timothy Sample <samplet@HIDDEN>
 ;;; Copyright =C2=A9 2021, 2022 Philip McGrath <philip@HIDDEN>
 ;;; Copyright =C2=A9 2022 Liliana Marie Prikler <liliana.prikler@HIDDEN=
>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -23,10 +24,10 @@
 (define-module (guix build node-build-system)
   #:use-module ((guix build gnu-build-system) #:prefix gnu:)
   #:use-module (guix build utils)
-  #:use-module (guix build json)
   #:use-module (ice-9 ftw)
   #:use-module (ice-9 regex)
   #:use-module (ice-9 match)
+  #:use-module (json)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-71)
   #:export (%standard-phases
@@ -34,13 +35,14 @@ (define-module (guix build node-build-system)
             delete-dependencies
             node-build))

-(define (with-atomic-json-file-replacement file proc)
+(define* (with-atomic-json-file-replacement proc
+  #:optional (file "package.json"))
   "Like 'with-atomic-file-replacement', but PROC is called with a single
 argument---the result of parsing FILE's contents as json---and should a va=
lue
 to be written as json to the replacement FILE."
   (with-atomic-file-replacement file
     (lambda (in out)
-      (write-json (proc (read-json in)) out))))
+      (scm->json (proc (json->scm in)) out))))

 (define* (assoc-ref* alist key #:optional default)
   "Like assoc-ref, but return DEFAULT instead of #f if no value exists."
@@ -48,10 +50,6 @@ (define* (assoc-ref* alist key #:optional default)
     (#f default)
     ((_ . value) value)))

-(define* (jsobject-ref obj key #:optional default)
-  (match obj
-    (('@ . alist) (assoc-ref* alist key default))))
-
 (define* (alist-pop alist key #:optional (=3D equal?))
   "Return two values, the first pair in ALIST with key KEY, and the other
 elements.  Equality calls are made as (=3D KEY ALISTCAR)."
@@ -63,67 +61,17 @@ (define* (alist-pop alist key #:optional (=3D equal?))
         (values (car after) (append before (cdr after)))
         (values #f before))))

-(define* (alist-update alist key proc #:optional default (=3D equal?))
+(define* (alist-update alist key proc #:optional (=3D equal?))
   "Return an association list like ALIST, but with KEY mapped to the resul=
t of
 PROC applied to the first value found under the comparison (=3D KEY ALISTC=
AR).
-If no such value exists, use DEFAULT instead.
+If no such value exists, return the list unchanged.
 Unlike acons, this removes the previous association of KEY (assuming it is
 unique), but the result may still share storage with ALIST."
   (let ((pair rest (alist-pop alist key =3D)))
-    (acons key
-           (proc (if (pair? pair)
-                     (cdr pair)
-                     default))
-           rest)))
-
-(define (jsobject-update* js . updates)
-  "Return a json object like JS, but with all UPDATES applied.  Each updat=
e is
-a list (KEY PROC [DEFAULT]), so that KEY is mapped to the result of PROC
-applied to the value to which KEY is mapped in JS.  If no such mapping exi=
sts,
-PROC is instead applied to DEFAULT, or to '#f' is no DEFAULT is specified.
-The update takes place from left to right, so later UPDATERs will receive =
the
-values returned by earlier UPDATERs for the same KEY."
-  (match js
-    (('@ . alist)
-     (let loop ((alist alist)
-                (updates updates))
-       (match updates
-         (() (cons '@ alist))
-         (((key proc) . updates)
-          (loop (alist-update alist key proc #f equal?) updates))
-         (((key proc default) . updates)
-          (loop (alist-update alist key proc default equal?) updates))))))=
)
-
-(define (jsobject-union combine seed . objects)
-  "Merge OBJECTS into SEED by applying (COMBINE KEY VAL0 VAL), where VAL0
-is the value found in the (possibly updated) SEED and VAL is the new value
-found in one of the OBJECTS."
-  (match seed
-    (('@ . aseed)
-     (match objects
-       (() seed)
-       ((('@ . alists) ...)
-        (cons
-         '@
-         (fold (lambda (alist aseed)
-                 (if (null? aseed) alist
-                     (fold
-                      (match-lambda*
-                        (((k . v) aseed)
-                         (let ((pair tail (alist-pop alist k)))
-                           (match pair
-                             (#f (acons k v aseed))
-                             ((_ . v0) (acons k (combine k v0 v) aseed))))=
))
-                      aseed
-                      alist)))
-               aseed
-               alists)))))))
+    (if (pair? pair)
+      (acons key (proc (cdr pair)) rest)
+      alist)))

-;; Possibly useful helper functions:
-;; (define (newest key val0 val) val)
-;; (define (unkeyed->keyed proc) (lambda (_key val0 val) (proc val0 val)))
-
-
 ;;;
 ;;; Phases.
 ;;;
@@ -142,8 +90,8 @@ (define (set-home . _)

 (define (module-name module)
   (let* ((package.json (string-append module "/package.json"))
-         (package-meta (call-with-input-file package.json read-json)))
-    (jsobject-ref package-meta "name")))
+         (package-meta (call-with-input-file package.json json->scm)))
+    (assoc-ref package-meta "name")))

 (define (index-modules input-paths)
   (define (list-modules directory)
@@ -167,49 +115,59 @@ (define* (patch-dependencies #:key inputs
#:allow-other-keys)

   (define index (index-modules (map cdr inputs)))

-  (define resolve-dependencies
-    (match-lambda
-      (('@ . alist)
-       (cons '@ (map (match-lambda
-                       ((key . value)
-                        (cons key (hash-ref index key value))))
-                     alist)))))
+  (define (resolve-dependencies dependencies)
+    (map
+      (match-lambda
+        ((dependency . version)
+          (cons dependency (hash-ref index dependency version))))
+      dependencies))

-  (with-atomic-json-file-replacement "package.json"
+  (with-atomic-json-file-replacement
     (lambda (pkg-meta)
-      (jsobject-update*
-       pkg-meta
-       `("devDependencies" ,resolve-dependencies (@))
-       `("dependencies" ,(lambda (deps)
-                           (resolve-dependencies
-                            (jsobject-union
-                             (lambda (k a b) b)
-                             (jsobject-ref pkg-meta "peerDependencies" '(@=
))
-                             deps)))
-         (@)))))
+      (fold
+        (lambda (proc pkg-meta) (proc pkg-meta))
+        pkg-meta
+        (list
+          (lambda (pkg-meta)
+            (alist-update pkg-meta "devDependencies" resolve-dependencies)=
)
+          (lambda (pkg-meta)
+            (assoc-set!
+              pkg-meta
+              "dependencies"
+              (resolve-dependencies
+                ; Combined "peerDependencies" and "dependencies" dependenc=
ies
+                ; with "dependencies" taking precedent.
+                (fold
+                  (lambda (dependency dependencies)
+                    (apply assoc-set! dependencies dependency))
+                  (assoc-ref* pkg-meta "peerDependencies" '())
+                  (assoc-ref* pkg-meta "dependencies" '())))))))))
   #t)

-(define (delete-dependencies absent)
+(define (delete-dependencies dependencies-to-remove)
   "Rewrite 'package.json' to allow the build to proceed without packages
-listed in ABSENT, a list of strings naming npm packages.
+listed in 'dependencies-to-remove', a list of strings naming npm packages.

 To prevent the deleted dependencies from being reintroduced, use this func=
tion
 only after the 'patch-dependencies' phase."
-  (define delete-from-jsobject
-    (match-lambda
-      (('@ . alist)
-       (cons '@ (filter (match-lambda
-                          ((k . _)
-                           (not (member k absent))))
-                        alist)))))
-
-  (with-atomic-json-file-replacement "package.json"
+  (with-atomic-json-file-replacement
     (lambda (pkg-meta)
-      (jsobject-update*
-       pkg-meta
-       `("devDependencies" ,delete-from-jsobject (@))
-       `("dependencies" ,delete-from-jsobject (@))
-       `("peerDependencies" ,delete-from-jsobject (@))))))
+      (fold
+        (lambda (dependency-key pkg-meta)
+          (alist-update
+            pkg-meta
+            dependency-key
+            (lambda (dependencies)
+              (remove
+                (lambda (dependency)
+                  (member (car dependency) dependencies-to-remove))
+                dependencies))))
+        pkg-meta
+        (list
+          "devDependencies"
+          "dependencies"
+          "peerDependencies"
+          "optionalDependencies")))))

 (define* (delete-lockfiles #:key inputs #:allow-other-keys)
   "Delete 'package-lock.json', 'yarn.lock', and 'npm-shrinkwrap.json', if =
they
@@ -228,8 +186,8 @@ (define* (configure #:key outputs inputs #:allow-other-=
keys)
     #t))

 (define* (build #:key inputs #:allow-other-keys)
-  (let ((package-meta (call-with-input-file "package.json" read-json)))
-    (if (jsobject-ref (jsobject-ref package-meta "scripts" '(@)) "build" #=
f)
+  (let ((package-meta (call-with-input-file "package.json" json->scm)))
+    (if (assoc-ref* (assoc-ref* package-meta "scripts" '()) "build" #f)
         (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm")))
           (invoke npm "run" "build"))
         (format #t "there is no build script to run~%"))
@@ -301,22 +259,20 @@ (define* (avoid-node-gyp-rebuild #:key outputs
#:allow-other-keys)
   ;; even need to overwrite this file.  Therefore, let's use some helpers
   ;; that we'd otherwise not need.
   (define pkg-meta
-    (call-with-input-file installed-package.json read-json))
+    (call-with-input-file installed-package.json json->scm))
   (define scripts
-    (jsobject-ref pkg-meta "scripts" '(@)))
-  (define (jsobject-set js key val)
-    (jsobject-update* js (list key (const val))))
+    (assoc-ref* pkg-meta "scripts" '()))

-  (when (equal? "node-gyp rebuild" (jsobject-ref scripts "install" #f))
+  (when (equal? "node-gyp rebuild" (assoc-ref* scripts "install" #f))
     (call-with-output-file installed-package.json
       (lambda (out)
-        (write-json
-         (jsobject-set pkg-meta
-                       "scripts"
-                       (jsobject-set scripts
-                                     "install"
-                                     "echo Guix: avoiding node-gyp rebuild=
"))
-         out)))))
+        (scm->json
+          (assoc-set! pkg-meta
+                      "scripts"
+                      (assoc-set! scripts
+                                  "install"
+                                  "echo Guix: avoiding node-gyp rebuild"))
+          out)))))

 (define %standard-phases
   (modify-phases gnu:%standard-phases

base-commit: e16cdcf37d8223b3634ec5e658356c3b7f154859
--=20
2.46.0

--0000000000001eb841062a2c5a1f
Content-Type: text/x-patch; charset="UTF-8"; 
	name="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch"
Content-Disposition: attachment; 
	filename="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_m55d06mi0>
X-Attachment-Id: f_m55d06mi0

RnJvbSAxOTQ0OWZlYWI5ZTMxNTkwYmJkN2M5MzNiMjExNjNmOGIzOTg0MzliIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBEYW5pZWwgS2hvZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21h
aWwuY29tPgpEYXRlOiBUaHUsIDI2IERlYyAyMDI0IDA0OjM1OjM5IC0wODAwClN1YmplY3Q6IFtQ
QVRDSF0gUmVwbGFjZSAoZ3VpeCBidWlsZCBqc29uKSB3aXRoIChqc29uKSBpbiBub2RlIGJ1aWxk
IHN5c3RlbQoKVGhpcyBjaGFuZ2UgcmVwbGFjZXMgdGhlIHVzZSBvZiAoZ3VpeCBidWlsZCBqc29u
KSB3aXRoIChqc29uKSBmb3IgdGhlIG5vZGUgZWNvc3lzdGVtLgpTaW5jZSBndWlsZS1qc29uIGlz
IGEgZGVwZW5kZW5jeSBvZiBHdWl4LCBhbmQgaXQncyB1c2VkIGVsc2V3aGVyZSBpbiB0aGUgcHJv
amVjdCwgaXQgbWFrZXMgc2Vuc2UgdG8gdXNlIHRoaXMgaW5zdGVhZCBvZiByb2xsaW5nIG91ciBv
d24gSlNPTiBpbXBsZW1lbnRhdGlvbiB3aXRoIChndWl4IGJ1aWxkIGpzb24pLgpUaGlzIGlzIG9u
ZSBzdGVwIHRvIG1vdmUgYXdheSBmcm9tIChndWl4IGJ1aWxkIGpzb24pLCB0aGVyZSB3aWxsIGJl
IG90aGVyIGNoYW5nZXMgdG8gcmVtb3ZlIHRoZSBvdGhlciB1c2VzIG9mIGl0LgoKU2lnbmVkLW9m
Zi1ieTogRGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KQ2hhbmdl
LUlkOiBJOWZkNTE1MmE5OGI2YTI0MWQ0MTRlOWE5NGFiMTc5YzljYWJjZmI4NQotLS0KIGdudS9w
YWNrYWdlcy9ub2RlLXh5ei5zY20gICAgICAgIHwgMTQ4ICsrKysrKysrKysrKy0tLS0tLS0tLS0t
LS0KIGd1aXgvYnVpbGQtc3lzdGVtL25vZGUuc2NtICAgICAgIHwgICA2ICstCiBndWl4L2J1aWxk
L25vZGUtYnVpbGQtc3lzdGVtLnNjbSB8IDE4MCArKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0t
LS0tCiAzIGZpbGVzIGNoYW5nZWQsIDEzOSBpbnNlcnRpb25zKCspLCAxOTUgZGVsZXRpb25zKC0p
CgpkaWZmIC0tZ2l0IGEvZ251L3BhY2thZ2VzL25vZGUteHl6LnNjbSBiL2dudS9wYWNrYWdlcy9u
b2RlLXh5ei5zY20KaW5kZXggZTk4ZWRhMmEwMS4uZWMzZjlmYmZiMSAxMDA2NDQKLS0tIGEvZ251
L3BhY2thZ2VzL25vZGUteHl6LnNjbQorKysgYi9nbnUvcGFja2FnZXMvbm9kZS14eXouc2NtCkBA
IC03LDYgKzcsNyBAQAogOzs7IENvcHlyaWdodCDCqSAyMDIxIERocnV2aW4gR2FuZGhpIDxjb250
YWN0QGRocnV2aW4uZGV2PgogOzs7IENvcHlyaWdodCDCqSAyMDIyIE5pY29sYXMgR3JhdmVzIDxu
Z3JhdmVzQG5ncmF2ZXMuZnI+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjMgSmVsbGUgTGljaHQgPGps
aWNodEBmc2ZlLm9yZz4KKzs7OyBDb3B5cmlnaHQgwqkgMjAyNCBEYW5pZWwgS2hvZGFiYWtoc2gg
PGQua2hvZGFiYWtoc2hAZ21haWwuY29tPgogOzs7CiA7OzsgVGhpcyBmaWxlIGlzIHBhcnQgb2Yg
R05VIEd1aXguCiA7OzsKQEAgLTI0LDE0ICsyNSwxNCBAQAogOzs7IGFsb25nIHdpdGggR05VIEd1
aXguICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAKIChkZWZp
bmUtbW9kdWxlIChnbnUgcGFja2FnZXMgbm9kZS14eXopCi0gICM6dXNlLW1vZHVsZSAoKGd1aXgg
bGljZW5zZXMpICM6cHJlZml4IGxpY2Vuc2U6KQogICAjOnVzZS1tb2R1bGUgKGdudSBwYWNrYWdl
cyBzcWxpdGUpCiAgICM6dXNlLW1vZHVsZSAoZ251IHBhY2thZ2VzIHB5dGhvbikKICAgIzp1c2Ut
bW9kdWxlIChnbnUgcGFja2FnZXMgd2ViKQorICAjOnVzZS1tb2R1bGUgKGd1aXggYnVpbGQtc3lz
dGVtIG5vZGUpCiAgICM6dXNlLW1vZHVsZSAoZ3VpeCBnZXhwKQotICAjOnVzZS1tb2R1bGUgKGd1
aXggcGFja2FnZXMpCiAgICM6dXNlLW1vZHVsZSAoZ3VpeCBnaXQtZG93bmxvYWQpCi0gICM6dXNl
LW1vZHVsZSAoZ3VpeCBidWlsZC1zeXN0ZW0gbm9kZSkpCisgICM6dXNlLW1vZHVsZSAoKGd1aXgg
bGljZW5zZXMpICM6cHJlZml4IGxpY2Vuc2U6KQorICAjOnVzZS1tb2R1bGUgKGd1aXggcGFja2Fn
ZXMpKQogCiA7OzsKIDs7OyBQbGVhc2U6IFRyeSB0byBhZGQgbmV3IG1vZHVsZSBwYWNrYWdlcyBp
biBhbHBoYWJldGljIG9yZGVyLgpAQCAtNjksMTkgKzcwLDE3IEBAIChkZWZpbmUtcHVibGljIG5v
ZGUtYWNvcm4KICAgICAgICAgICAgICA7OyBpdCB3b3VsZCB0cnkgdG8gdXNlIHRoZSBidWlsZCBl
bnZpcm9ubWVudCBhbmQgd291bGQgYmxvY2sgdGhlCiAgICAgICAgICAgICAgOzsgYXV0b21hdGlj
IGJ1aWxkaW5nIGJ5IG90aGVyIHBhY2thZ2VzIG1ha2luZyB1c2Ugb2Ygbm9kZS1hY29ybi4KICAg
ICAgICAgICAgICA7OyBUT0RPOiBBZGQgdXRpbGl0eSBmdW5jdGlvbgotICAgICAgICAgICAgICh3
aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIKLSAgICAgICAg
ICAgICAgIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgKCgnQCAuIHBrZy1tZXRhLWFs
aXN0KQotICAgICAgICAgICAgICAgICAgKGNvbnMgJ0AgKG1hcCAobWF0Y2gtbGFtYmRhCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0cyIgQCAuIHNjcmlwdHMtYWxp
c3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlwdHMiIEAgLEAo
ZmlsdGVyIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJwcmVwYXJlIiAuIF8pCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmKQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChvdGhlciBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29u
LWZpbGUtcmVwbGFjZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAg
ICAobWFwCisgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAg
ICAoKCJzY3JpcHRzIiAuIHNjcmlwdHMtYWxpc3QpCisgICAgICAgICAgICAgICAgICAgICAoY29u
cyAic2NyaXB0cyIgKGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRh
CisgICAgICAgICAgICAgICAgICAgICAgICAgKCgicHJlcGFyZSIgLiBfKSAjZikKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAoXyAjdCkpCisgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMt
YWxpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAob3RoZXIgb3RoZXIpKQorICAgICAgICAgICAg
ICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpCiAgICAgICAgICAocmVwbGFjZSAnYnVpbGQKICAgICAg
ICAgICAgKGxhbWJkYSogKCM6a2V5IGlucHV0cyBuYXRpdmUtaW5wdXRzICM6YWxsb3ctb3RoZXIt
a2V5cykKICAgICAgICAgICAgICAobGV0ICgoZXNidWlsZCAoc2VhcmNoLWlucHV0LWZpbGUgKG9y
IG5hdGl2ZS1pbnB1dHMgaW5wdXRzKQpAQCAtMTU4LDIzICsxNTcsMTcgQEAgKGRlZmluZS1wdWJs
aWMgbm9kZS1hZGRvbi1hcGkKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCiAgICAgICAgICAgICAg
KGRlZmluZSBuZXctdGVzdC1zY3JpcHQKICAgICAgICAgICAgICAgICJlY2hvIHN0b3BwaW5nIGFm
dGVyIHByZXRlc3Qgb24gR3VpeCIpCi0gICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmls
ZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgotICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJk
YQotICAgICAgICAgICAgICAgICAoKCdAIC4gcGtnLW1ldGEtYWxpc3QpCi0gICAgICAgICAgICAg
ICAgICAoY29ucwotICAgICAgICAgICAgICAgICAgICdACi0gICAgICAgICAgICAgICAgICAgKG1h
cCAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiICdA
IC4gc2NyaXB0cy1hbGlzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlwdHMi
IEAgLEAobWFwIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKCgidGVzdCIgLiBfKQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnMgInRlc3QiCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXctdGVzdC1zY3JpcHQp
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3Ro
ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90
aGVyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNj
cmlwdHMtYWxpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICBwa2ct
bWV0YS1hbGlzdCkpKSkpKSkpKSkKKyAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNvbi1maWxl
LXJlcGxhY2VtZW50IChsYW1iZGEgKHBrZy1tZXRhLWFsaXN0KQorICAgICAgICAgICAgICAgKG1h
cAorICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAgICAgICAgICAgKCgi
c2NyaXB0cyIgLiBzY3JpcHRzLWFsaXN0KQorICAgICAgICAgICAgICAgICAgICAgKGNvbnMgInNj
cmlwdHMiIChtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAg
ICAgICAgICAgICAgICAgICAgICgoInRlc3QiIC4gXykgKGNvbnMgInRlc3QiIG5ldy10ZXN0LXNj
cmlwdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAgICAgICAgICAgIChvdGhl
ciBvdGhlcikpCisgICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkKICAgICAo
aG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUtYWRkb24tYXBpIikKICAg
ICAoc3lub3BzaXMgIk5vZGUuanMgQVBJIChOb2RlLUFQSSkgaGVhZGVyLW9ubHkgQysrIHdyYXBw
ZXJzIikKICAgICAoZGVzY3JpcHRpb24gIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGhlYWRlci1vbmx5
IEMrKyB3cmFwcGVyIGNsYXNzZXMgd2hpY2gKQEAgLTEyMjMsMjIgKzEyMTYsMTkgQEAgKGRlZmlu
ZS1wdWJsaWMgbm9kZS1zZXJpYWxwb3J0LWJpbmRpbmdzCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAibm9kZS1hYmkiKSkpKQogICAgICAgICAgKGFkZC1hZnRlciAnY2hkaXIg
J2F2b2lkLXByZWJ1aWxkLWluc3RhbGwKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAgICAg
ICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgot
ICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAoKCdAIC4gcGtn
LW1ldGEtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAoY29ucyAnQCAobWFwIChtYXRjaC1sYW1i
ZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiBAIC4gc2Ny
aXB0cy1hbGlzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCgic2NyaXB0
cyIgQCAsQChmaWx0ZXIgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoImluc3RhbGwiIC4gXykKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
I2YpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKF8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgI3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzLWFsaXN0KSkpCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgKCgiZ3lwZmlsZSIgLiBfKQotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAnKCJneXBmaWxlIiAuICNmKSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAob3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
b3RoZXIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa2ctbWV0YS1hbGlzdCkp
KSkpKSkpCisgICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAo
bGFtYmRhIChwa2ctbWV0YS1hbGlzdCkKKyAgICAgICAgICAgICAgIChtYXAKKyAgICAgICAgICAg
ICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiIC4gc2Ny
aXB0cy1hbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgIChjb25zICJzY3JpcHRzIiAoZmlsdGVy
CisgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAoKCJpbnN0YWxsIiAuIF8pICNmKQorICAgICAgICAgICAgICAgICAgICAgICAgIChf
ICN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAg
ICAgICAgICAgICgoImd5cGZpbGUiIC4gXykKKyAgICAgICAgICAgICAgICAgICAgIChjb25zICJn
eXBmaWxlIiAjZikpCisgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAgICAgICAg
ICAgICAgICAgcGtnLW1ldGEtYWxpc3QpKSkpKSkKICAgICAgICAjOnRlc3RzPyAjZikpCiAgICAg
KHN5bm9wc2lzICJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBOb2RlIFNlcmlhbFBvcnQgYmluZGlu
Z3MiKQogICAgIChkZXNjcmlwdGlvbiAiTm9kZSBTZXJpYWxQb3J0IGlzIGEgbW9kdWxhciBzdWl0
ZSBvZiBOb2RlLmpzIHBhY2thZ2VzIGZvcgpAQCAtMTUyNCwzOSArMTUxNCwzMyBAQCAoZGVmaW5l
LXB1YmxpYyBub2RlLXNxbGl0ZTMKICAgICAgICAgICAgICAoc3Vic3RpdHV0ZSogIi5ucG1pZ25v
cmUiCiAgICAgICAgICAgICAgICAoKCJsaWIvYmluZGluZyIpCiAgICAgICAgICAgICAgICAgIiNs
aWIvYmluZGluZyAjIDwtIHBhdGNoZWQgZm9yIEd1aXgiKSkKLSAgICAgICAgICAgICAod2l0aC1h
dG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdlLmpzb24iCi0gICAgICAgICAgICAg
ICAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICgoJ0AgLiBwa2ctbWV0YS1hbGlzdCkK
LSAgICAgICAgICAgICAgICAgIChtYXRjaCAoYXNzb2MtcmVmIHBrZy1tZXRhLWFsaXN0ICJiaW5h
cnkiKQotICAgICAgICAgICAgICAgICAgICAoKCdAIC4gYmluYXJ5LWFsaXN0KQotICAgICAgICAg
ICAgICAgICAgICAgOzsgV2hlbiBpdCBidWlsZHMgZnJvbSBzb3VyY2UsIG5vZGUtcHJlLWd5cCBz
dXBwbGllcwotICAgICAgICAgICAgICAgICAgICAgOzsgbW9kdWxlX25hbWUgYW5kIG1vZHVsZV9w
YXRoIGJhc2VkIG9uIHRoZSBlbnRyaWVzIHVuZGVyCi0gICAgICAgICAgICAgICAgICAgICA7OyAi
YmluYXJ5IiBmcm9tICJwYWNrYWdlLmpzb24iLCBzbyB0aGlzIHBhY2thZ2UncwotICAgICAgICAg
ICAgICAgICAgICAgOzsgImJpbmRpbmcuZ3lwIiBkb2Vzbid0IGRlZmluZSB0aGVtLiBUaHVzLCB3
ZSBhbHNvIG5lZWQKLSAgICAgICAgICAgICAgICAgICAgIDs7IHRvIHN1cHBseSB0aGVtLiBUaGUg
R1lQX0RFRklORVMgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgIDs7
IHR1cm5zIG91dCB0byBiZSB0aGUgZWFzaWVzdCB3YXkgdG8gbWFrZSBzdXJlIHRoZXkgYXJlCi0g
ICAgICAgICAgICAgICAgICAgICA7OyBwcm9wYWdhdGVkIGZyb20gbnBtIHRvIG5vZGUtZ3lwIHRv
IGd5cC4KLSAgICAgICAgICAgICAgICAgICAgIChzZXRlbnYgIkdZUF9ERUZJTkVTIgotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLWFwcGVuZAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIm1vZHVsZV9uYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChhc3NvYy1yZWYgYmluYXJ5LWFsaXN0ICJtb2R1bGVfbmFtZSIpCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGVf
cGF0aD0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVmIGJpbmFyeS1h
bGlzdCAibW9kdWxlX3BhdGgiKSkpKSkKLSAgICAgICAgICAgICAgICAgIDs7IFdlIG5lZWQgdG8g
cmVtb3ZlIHRoZSBpbnN0YWxsIHNjcmlwdCBmcm9tICJwYWNrYWdlLmpzb24iLAotICAgICAgICAg
ICAgICAgICAgOzsgYXMgaXQgd291bGQgdHJ5IHRvIHVzZSBub2RlLXByZS1neXAgYW5kIHdvdWxk
IGJsb2NrIHRoZQotICAgICAgICAgICAgICAgICAgOzsgYXV0b21hdGljIGJ1aWxkaW5nIHBlcmZv
cm1lZCBieSBgbnBtIGluc3RhbGxgLgotICAgICAgICAgICAgICAgICAgKGNvbnMgJ0AgKG1hcCAo
bWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0
cyIgQCAuIHNjcmlwdHMtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGAoInNjcmlwdHMiIEAgLEAoZmlsdGVyIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJpbnN0YWxsIiAu
IF8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICNmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcgotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29u
LWZpbGUtcmVwbGFjZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAg
ICAobGV0ICgoYmluYXJ5LWFsaXN0IChhc3NvYy1yZWYgcGtnLW1ldGEtYWxpc3QgImJpbmFyeSIp
KSkKKyAgICAgICAgICAgICAgICAgOzsgV2hlbiBpdCBidWlsZHMgZnJvbSBzb3VyY2UsIG5vZGUt
cHJlLWd5cCBzdXBwbGllcworICAgICAgICAgICAgICAgICA7OyBtb2R1bGVfbmFtZSBhbmQgbW9k
dWxlX3BhdGggYmFzZWQgb24gdGhlIGVudHJpZXMgdW5kZXIKKyAgICAgICAgICAgICAgICAgOzsg
ImJpbmFyeSIgZnJvbSAicGFja2FnZS5qc29uIiwgc28gdGhpcyBwYWNrYWdlJ3MKKyAgICAgICAg
ICAgICAgICAgOzsgImJpbmRpbmcuZ3lwIiBkb2Vzbid0IGRlZmluZSB0aGVtLiBUaHVzLCB3ZSBh
bHNvIG5lZWQKKyAgICAgICAgICAgICAgICAgOzsgdG8gc3VwcGx5IHRoZW0uIFRoZSBHWVBfREVG
SU5FUyBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgICAgICAgICAgICA7OyB0dXJucyBvdXQg
dG8gYmUgdGhlIGVhc2llc3Qgd2F5IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZQorICAgICAgICAgICAg
ICAgICA7OyBwcm9wYWdhdGVkIGZyb20gbnBtIHRvIG5vZGUtZ3lwIHRvIGd5cC4KKyAgICAgICAg
ICAgICAgICAgKHNldGVudiAiR1lQX0RFRklORVMiIChzdHJpbmctYXBwZW5kCisgICAgICAgICAg
ICAgICAgICAgIm1vZHVsZV9uYW1lPSIKKyAgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVmIGJp
bmFyeS1hbGlzdCAibW9kdWxlX25hbWUiKQorICAgICAgICAgICAgICAgICAgICIgbW9kdWxlX3Bh
dGg9IgorICAgICAgICAgICAgICAgICAgIChhc3NvYy1yZWYgYmluYXJ5LWFsaXN0ICJtb2R1bGVf
cGF0aCIpKSkpCisgICAgICAgICAgICAgICA7OyBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgaW5zdGFs
bCBzY3JpcHQgZnJvbSAicGFja2FnZS5qc29uIiwKKyAgICAgICAgICAgICAgIDs7IGFzIGl0IHdv
dWxkIHRyeSB0byB1c2Ugbm9kZS1wcmUtZ3lwIGFuZCB3b3VsZCBibG9jayB0aGUKKyAgICAgICAg
ICAgICAgIDs7IGF1dG9tYXRpYyBidWlsZGluZyBwZXJmb3JtZWQgYnkgYG5wbSBpbnN0YWxsYC4K
KyAgICAgICAgICAgICAgIChtYXAKKyAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAg
ICAgICAgICAgICAgICAgICgoInNjcmlwdHMiIC4gc2NyaXB0cy1hbGlzdCkKKyAgICAgICAgICAg
ICAgICAgICAgIChjb25zICJzY3JpcHRzIiAoZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAg
IChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCJpbnN0YWxsIiAuIF8p
ICNmKQorICAgICAgICAgICAgICAgICAgICAgICAgIChfICN0KSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAgICAgICAgICAgIChvdGhlciBvdGhlcikp
CisgICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkKICAgICAoaG9tZS1wYWdl
ICJodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L25vZGUtc3FsaXRlMyIpCiAgICAgKHN5bm9wc2lz
ICJOb2RlLmpzIGJpbmRpbmdzIGZvciBTUUxpdGUzIikKICAgICAoZGVzY3JpcHRpb24KZGlmZiAt
LWdpdCBhL2d1aXgvYnVpbGQtc3lzdGVtL25vZGUuc2NtIGIvZ3VpeC9idWlsZC1zeXN0ZW0vbm9k
ZS5zY20KaW5kZXggNTdmZTVmNjAzMC4uNDI1YjhjZDliMyAxMDA2NDQKLS0tIGEvZ3VpeC9idWls
ZC1zeXN0ZW0vbm9kZS5zY20KKysrIGIvZ3VpeC9idWlsZC1zeXN0ZW0vbm9kZS5zY20KQEAgLTQs
NiArNCw3IEBACiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEgTHVkb3ZpYyBDb3VydMOocyA8bHVkb0Bn
bnUub3JnPgogOzs7IENvcHlyaWdodCDCqSAyMDIxIFBpZXJyZSBMYW5nbG9pcyA8cGllcnJlLmxh
bmdsb2lzQGdteC5jb20+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEgUGhpbGlwIE1jR3JhdGggPHBo
aWxpcEBwaGlsaXBtY2dyYXRoLmNvbT4KKzs7OyBDb3B5cmlnaHQgwqkgMjAyNCBEYW5pZWwgS2hv
ZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21haWwuY29tPgogOzs7CiA7OzsgVGhpcyBmaWxlIGlz
IHBhcnQgb2YgR05VIEd1aXguCiA7OzsKQEAgLTM2LDcgKzM3LDEwIEBAIChkZWZpbmUtbW9kdWxl
IChndWl4IGJ1aWxkLXN5c3RlbSBub2RlKQogKGRlZmluZSAlbm9kZS1idWlsZC1zeXN0ZW0tbW9k
dWxlcwogICA7OyBCdWlsZC1zaWRlIG1vZHVsZXMgaW1wb3J0ZWQgYnkgZGVmYXVsdC4KICAgYCgo
Z3VpeCBidWlsZCBub2RlLWJ1aWxkLXN5c3RlbSkKLSAgICAoZ3VpeCBidWlsZCBqc29uKQorICAg
IChqc29uKQorICAgIChqc29uIGJ1aWxkZXIpCisgICAgKGpzb24gcGFyc2VyKQorICAgIChqc29u
IHJlY29yZCkKICAgICAsQCVkZWZhdWx0LWdudS1pbXBvcnRlZC1tb2R1bGVzKSkKIAogKGRlZmlu
ZSAoZGVmYXVsdC1ub2RlKQpkaWZmIC0tZ2l0IGEvZ3VpeC9idWlsZC9ub2RlLWJ1aWxkLXN5c3Rl
bS5zY20gYi9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNjbQppbmRleCBmYjIzODk0YmMx
Li5mOTVjM2JkNzkzIDEwMDY0NAotLS0gYS9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNj
bQorKysgYi9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNjbQpAQCAtNCw2ICs0LDcgQEAK
IDs7OyBDb3B5cmlnaHQgwqkgMjAxOSwgMjAyMSBUaW1vdGh5IFNhbXBsZSA8c2FtcGxldEBuZ3ly
by5jb20+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEsIDIwMjIgUGhpbGlwIE1jR3JhdGggPHBoaWxp
cEBwaGlsaXBtY2dyYXRoLmNvbT4KIDs7OyBDb3B5cmlnaHQgwqkgMjAyMiBMaWxpYW5hIE1hcmll
IFByaWtsZXIgPGxpbGlhbmEucHJpa2xlckBnbWFpbC5jb20+Cis7OzsgQ29weXJpZ2h0IMKpIDIw
MjQgRGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KIDs7OwogOzs7
IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBHdWl4LgogOzs7CkBAIC0yMywxMCArMjQsMTAgQEAK
IChkZWZpbmUtbW9kdWxlIChndWl4IGJ1aWxkIG5vZGUtYnVpbGQtc3lzdGVtKQogICAjOnVzZS1t
b2R1bGUgKChndWl4IGJ1aWxkIGdudS1idWlsZC1zeXN0ZW0pICM6cHJlZml4IGdudTopCiAgICM6
dXNlLW1vZHVsZSAoZ3VpeCBidWlsZCB1dGlscykKLSAgIzp1c2UtbW9kdWxlIChndWl4IGJ1aWxk
IGpzb24pCiAgICM6dXNlLW1vZHVsZSAoaWNlLTkgZnR3KQogICAjOnVzZS1tb2R1bGUgKGljZS05
IHJlZ2V4KQogICAjOnVzZS1tb2R1bGUgKGljZS05IG1hdGNoKQorICAjOnVzZS1tb2R1bGUgKGpz
b24pCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTEpCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBz
cmZpLTcxKQogICAjOmV4cG9ydCAoJXN0YW5kYXJkLXBoYXNlcwpAQCAtMzQsMTMgKzM1LDE0IEBA
IChkZWZpbmUtbW9kdWxlIChndWl4IGJ1aWxkIG5vZGUtYnVpbGQtc3lzdGVtKQogICAgICAgICAg
ICAgZGVsZXRlLWRlcGVuZGVuY2llcwogICAgICAgICAgICAgbm9kZS1idWlsZCkpCiAKLShkZWZp
bmUgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCBmaWxlIHByb2MpCisoZGVmaW5l
KiAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50IHByb2MKKyAgIzpvcHRpb25hbCAo
ZmlsZSAicGFja2FnZS5qc29uIikpCiAgICJMaWtlICd3aXRoLWF0b21pYy1maWxlLXJlcGxhY2Vt
ZW50JywgYnV0IFBST0MgaXMgY2FsbGVkIHdpdGggYSBzaW5nbGUKIGFyZ3VtZW50LS0tdGhlIHJl
c3VsdCBvZiBwYXJzaW5nIEZJTEUncyBjb250ZW50cyBhcyBqc29uLS0tYW5kIHNob3VsZCBhIHZh
bHVlCiB0byBiZSB3cml0dGVuIGFzIGpzb24gdG8gdGhlIHJlcGxhY2VtZW50IEZJTEUuIgogICAo
d2l0aC1hdG9taWMtZmlsZS1yZXBsYWNlbWVudCBmaWxlCiAgICAgKGxhbWJkYSAoaW4gb3V0KQot
ICAgICAgKHdyaXRlLWpzb24gKHByb2MgKHJlYWQtanNvbiBpbikpIG91dCkpKSkKKyAgICAgIChz
Y20tPmpzb24gKHByb2MgKGpzb24tPnNjbSBpbikpIG91dCkpKSkKIAogKGRlZmluZSogKGFzc29j
LXJlZiogYWxpc3Qga2V5ICM6b3B0aW9uYWwgZGVmYXVsdCkKICAgIkxpa2UgYXNzb2MtcmVmLCBi
dXQgcmV0dXJuIERFRkFVTFQgaW5zdGVhZCBvZiAjZiBpZiBubyB2YWx1ZSBleGlzdHMuIgpAQCAt
NDgsMTAgKzUwLDYgQEAgKGRlZmluZSogKGFzc29jLXJlZiogYWxpc3Qga2V5ICM6b3B0aW9uYWwg
ZGVmYXVsdCkKICAgICAoI2YgZGVmYXVsdCkKICAgICAoKF8gLiB2YWx1ZSkgdmFsdWUpKSkKIAot
KGRlZmluZSogKGpzb2JqZWN0LXJlZiBvYmoga2V5ICM6b3B0aW9uYWwgZGVmYXVsdCkKLSAgKG1h
dGNoIG9iagotICAgICgoJ0AgLiBhbGlzdCkgKGFzc29jLXJlZiogYWxpc3Qga2V5IGRlZmF1bHQp
KSkpCi0KIChkZWZpbmUqIChhbGlzdC1wb3AgYWxpc3Qga2V5ICM6b3B0aW9uYWwgKD0gZXF1YWw/
KSkKICAgIlJldHVybiB0d28gdmFsdWVzLCB0aGUgZmlyc3QgcGFpciBpbiBBTElTVCB3aXRoIGtl
eSBLRVksIGFuZCB0aGUgb3RoZXIKIGVsZW1lbnRzLiAgRXF1YWxpdHkgY2FsbHMgYXJlIG1hZGUg
YXMgKD0gS0VZIEFMSVNUQ0FSKS4iCkBAIC02Myw2NyArNjEsMTcgQEAgKGRlZmluZSogKGFsaXN0
LXBvcCBhbGlzdCBrZXkgIzpvcHRpb25hbCAoPSBlcXVhbD8pKQogICAgICAgICAodmFsdWVzIChj
YXIgYWZ0ZXIpIChhcHBlbmQgYmVmb3JlIChjZHIgYWZ0ZXIpKSkKICAgICAgICAgKHZhbHVlcyAj
ZiBiZWZvcmUpKSkpCiAKLShkZWZpbmUqIChhbGlzdC11cGRhdGUgYWxpc3Qga2V5IHByb2MgIzpv
cHRpb25hbCBkZWZhdWx0ICg9IGVxdWFsPykpCisoZGVmaW5lKiAoYWxpc3QtdXBkYXRlIGFsaXN0
IGtleSBwcm9jICM6b3B0aW9uYWwgKD0gZXF1YWw/KSkKICAgIlJldHVybiBhbiBhc3NvY2lhdGlv
biBsaXN0IGxpa2UgQUxJU1QsIGJ1dCB3aXRoIEtFWSBtYXBwZWQgdG8gdGhlIHJlc3VsdCBvZgog
UFJPQyBhcHBsaWVkIHRvIHRoZSBmaXJzdCB2YWx1ZSBmb3VuZCB1bmRlciB0aGUgY29tcGFyaXNv
biAoPSBLRVkgQUxJU1RDQVIpLgotSWYgbm8gc3VjaCB2YWx1ZSBleGlzdHMsIHVzZSBERUZBVUxU
IGluc3RlYWQuCitJZiBubyBzdWNoIHZhbHVlIGV4aXN0cywgcmV0dXJuIHRoZSBsaXN0IHVuY2hh
bmdlZC4KIFVubGlrZSBhY29ucywgdGhpcyByZW1vdmVzIHRoZSBwcmV2aW91cyBhc3NvY2lhdGlv
biBvZiBLRVkgKGFzc3VtaW5nIGl0IGlzCiB1bmlxdWUpLCBidXQgdGhlIHJlc3VsdCBtYXkgc3Rp
bGwgc2hhcmUgc3RvcmFnZSB3aXRoIEFMSVNULiIKICAgKGxldCAoKHBhaXIgcmVzdCAoYWxpc3Qt
cG9wIGFsaXN0IGtleSA9KSkpCi0gICAgKGFjb25zIGtleQotICAgICAgICAgICAocHJvYyAoaWYg
KHBhaXI/IHBhaXIpCi0gICAgICAgICAgICAgICAgICAgICAoY2RyIHBhaXIpCi0gICAgICAgICAg
ICAgICAgICAgICBkZWZhdWx0KSkKLSAgICAgICAgICAgcmVzdCkpKQotCi0oZGVmaW5lIChqc29i
amVjdC11cGRhdGUqIGpzIC4gdXBkYXRlcykKLSAgIlJldHVybiBhIGpzb24gb2JqZWN0IGxpa2Ug
SlMsIGJ1dCB3aXRoIGFsbCBVUERBVEVTIGFwcGxpZWQuICBFYWNoIHVwZGF0ZSBpcwotYSBsaXN0
IChLRVkgUFJPQyBbREVGQVVMVF0pLCBzbyB0aGF0IEtFWSBpcyBtYXBwZWQgdG8gdGhlIHJlc3Vs
dCBvZiBQUk9DCi1hcHBsaWVkIHRvIHRoZSB2YWx1ZSB0byB3aGljaCBLRVkgaXMgbWFwcGVkIGlu
IEpTLiAgSWYgbm8gc3VjaCBtYXBwaW5nIGV4aXN0cywKLVBST0MgaXMgaW5zdGVhZCBhcHBsaWVk
IHRvIERFRkFVTFQsIG9yIHRvICcjZicgaXMgbm8gREVGQVVMVCBpcyBzcGVjaWZpZWQuCi1UaGUg
dXBkYXRlIHRha2VzIHBsYWNlIGZyb20gbGVmdCB0byByaWdodCwgc28gbGF0ZXIgVVBEQVRFUnMg
d2lsbCByZWNlaXZlIHRoZQotdmFsdWVzIHJldHVybmVkIGJ5IGVhcmxpZXIgVVBEQVRFUnMgZm9y
IHRoZSBzYW1lIEtFWS4iCi0gIChtYXRjaCBqcwotICAgICgoJ0AgLiBhbGlzdCkKLSAgICAgKGxl
dCBsb29wICgoYWxpc3QgYWxpc3QpCi0gICAgICAgICAgICAgICAgKHVwZGF0ZXMgdXBkYXRlcykp
Ci0gICAgICAgKG1hdGNoIHVwZGF0ZXMKLSAgICAgICAgICgoKSAoY29ucyAnQCBhbGlzdCkpCi0g
ICAgICAgICAoKChrZXkgcHJvYykgLiB1cGRhdGVzKQotICAgICAgICAgIChsb29wIChhbGlzdC11
cGRhdGUgYWxpc3Qga2V5IHByb2MgI2YgZXF1YWw/KSB1cGRhdGVzKSkKLSAgICAgICAgICgoKGtl
eSBwcm9jIGRlZmF1bHQpIC4gdXBkYXRlcykKLSAgICAgICAgICAobG9vcCAoYWxpc3QtdXBkYXRl
IGFsaXN0IGtleSBwcm9jIGRlZmF1bHQgZXF1YWw/KSB1cGRhdGVzKSkpKSkpKQotCi0oZGVmaW5l
IChqc29iamVjdC11bmlvbiBjb21iaW5lIHNlZWQgLiBvYmplY3RzKQotICAiTWVyZ2UgT0JKRUNU
UyBpbnRvIFNFRUQgYnkgYXBwbHlpbmcgKENPTUJJTkUgS0VZIFZBTDAgVkFMKSwgd2hlcmUgVkFM
MAotaXMgdGhlIHZhbHVlIGZvdW5kIGluIHRoZSAocG9zc2libHkgdXBkYXRlZCkgU0VFRCBhbmQg
VkFMIGlzIHRoZSBuZXcgdmFsdWUKLWZvdW5kIGluIG9uZSBvZiB0aGUgT0JKRUNUUy4iCi0gICht
YXRjaCBzZWVkCi0gICAgKCgnQCAuIGFzZWVkKQotICAgICAobWF0Y2ggb2JqZWN0cwotICAgICAg
ICgoKSBzZWVkKQotICAgICAgICgoKCdAIC4gYWxpc3RzKSAuLi4pCi0gICAgICAgIChjb25zCi0g
ICAgICAgICAnQAotICAgICAgICAgKGZvbGQgKGxhbWJkYSAoYWxpc3QgYXNlZWQpCi0gICAgICAg
ICAgICAgICAgIChpZiAobnVsbD8gYXNlZWQpIGFsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAo
Zm9sZAotICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEqCi0gICAgICAgICAgICAg
ICAgICAgICAgICAoKChrIC4gdikgYXNlZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGxl
dCAoKHBhaXIgdGFpbCAoYWxpc3QtcG9wIGFsaXN0IGspKSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChtYXRjaCBwYWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgjZiAoYWNv
bnMgayB2IGFzZWVkKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfIC4gdjApIChh
Y29ucyBrIChjb21iaW5lIGsgdjAgdikgYXNlZWQpKSkpKSkKLSAgICAgICAgICAgICAgICAgICAg
ICBhc2VlZAotICAgICAgICAgICAgICAgICAgICAgIGFsaXN0KSkpCi0gICAgICAgICAgICAgICBh
c2VlZAotICAgICAgICAgICAgICAgYWxpc3RzKSkpKSkpKQorICAgIChpZiAocGFpcj8gcGFpcikK
KyAgICAgIChhY29ucyBrZXkgKHByb2MgKGNkciBwYWlyKSkgcmVzdCkKKyAgICAgIGFsaXN0KSkp
CiAKLTs7IFBvc3NpYmx5IHVzZWZ1bCBoZWxwZXIgZnVuY3Rpb25zOgotOzsgKGRlZmluZSAobmV3
ZXN0IGtleSB2YWwwIHZhbCkgdmFsKQotOzsgKGRlZmluZSAodW5rZXllZC0+a2V5ZWQgcHJvYykg
KGxhbWJkYSAoX2tleSB2YWwwIHZhbCkgKHByb2MgdmFsMCB2YWwpKSkKLQotDAogOzs7CiA7Ozsg
UGhhc2VzLgogOzs7CkBAIC0xNDIsOCArOTAsOCBAQCAoZGVmaW5lIChzZXQtaG9tZSAuIF8pCiAK
IChkZWZpbmUgKG1vZHVsZS1uYW1lIG1vZHVsZSkKICAgKGxldCogKChwYWNrYWdlLmpzb24gKHN0
cmluZy1hcHBlbmQgbW9kdWxlICIvcGFja2FnZS5qc29uIikpCi0gICAgICAgICAocGFja2FnZS1t
ZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBwYWNrYWdlLmpzb24gcmVhZC1qc29uKSkpCi0gICAg
KGpzb2JqZWN0LXJlZiBwYWNrYWdlLW1ldGEgIm5hbWUiKSkpCisgICAgICAgICAocGFja2FnZS1t
ZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBwYWNrYWdlLmpzb24ganNvbi0+c2NtKSkpCisgICAg
KGFzc29jLXJlZiBwYWNrYWdlLW1ldGEgIm5hbWUiKSkpCiAKIChkZWZpbmUgKGluZGV4LW1vZHVs
ZXMgaW5wdXQtcGF0aHMpCiAgIChkZWZpbmUgKGxpc3QtbW9kdWxlcyBkaXJlY3RvcnkpCkBAIC0x
NjcsNDkgKzExNSw1OSBAQCAoZGVmaW5lKiAocGF0Y2gtZGVwZW5kZW5jaWVzICM6a2V5IGlucHV0
cyAjOmFsbG93LW90aGVyLWtleXMpCiAKICAgKGRlZmluZSBpbmRleCAoaW5kZXgtbW9kdWxlcyAo
bWFwIGNkciBpbnB1dHMpKSkKIAotICAoZGVmaW5lIHJlc29sdmUtZGVwZW5kZW5jaWVzCi0gICAg
KG1hdGNoLWxhbWJkYQotICAgICAgKCgnQCAuIGFsaXN0KQotICAgICAgIChjb25zICdAIChtYXAg
KG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAoKGtleSAuIHZhbHVlKQotICAg
ICAgICAgICAgICAgICAgICAgICAgKGNvbnMga2V5IChoYXNoLXJlZiBpbmRleCBrZXkgdmFsdWUp
KSkpCi0gICAgICAgICAgICAgICAgICAgICBhbGlzdCkpKSkpCisgIChkZWZpbmUgKHJlc29sdmUt
ZGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcykKKyAgICAobWFwCisgICAgICAobWF0Y2gtbGFtYmRh
CisgICAgICAgICgoZGVwZW5kZW5jeSAuIHZlcnNpb24pCisgICAgICAgICAgKGNvbnMgZGVwZW5k
ZW5jeSAoaGFzaC1yZWYgaW5kZXggZGVwZW5kZW5jeSB2ZXJzaW9uKSkpKQorICAgICAgZGVwZW5k
ZW5jaWVzKSkKIAotICAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdl
Lmpzb24iCisgICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQKICAgICAobGFtYmRh
IChwa2ctbWV0YSkKLSAgICAgIChqc29iamVjdC11cGRhdGUqCi0gICAgICAgcGtnLW1ldGEKLSAg
ICAgICBgKCJkZXZEZXBlbmRlbmNpZXMiICxyZXNvbHZlLWRlcGVuZGVuY2llcyAoQCkpCi0gICAg
ICAgYCgiZGVwZW5kZW5jaWVzIiAsKGxhbWJkYSAoZGVwcykKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChyZXNvbHZlLWRlcGVuZGVuY2llcwotICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChqc29iamVjdC11bmlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChr
IGEgYikgYikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpzb2JqZWN0LXJlZiBwa2ct
bWV0YSAicGVlckRlcGVuZGVuY2llcyIgJyhAKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZGVwcykpKQotICAgICAgICAgKEApKSkpKQorICAgICAgKGZvbGQKKyAgICAgICAgKGxhbWJk
YSAocHJvYyBwa2ctbWV0YSkgKHByb2MgcGtnLW1ldGEpKQorICAgICAgICBwa2ctbWV0YQorICAg
ICAgICAobGlzdAorICAgICAgICAgIChsYW1iZGEgKHBrZy1tZXRhKQorICAgICAgICAgICAgKGFs
aXN0LXVwZGF0ZSBwa2ctbWV0YSAiZGV2RGVwZW5kZW5jaWVzIiByZXNvbHZlLWRlcGVuZGVuY2ll
cykpCisgICAgICAgICAgKGxhbWJkYSAocGtnLW1ldGEpCisgICAgICAgICAgICAoYXNzb2Mtc2V0
IQorICAgICAgICAgICAgICBwa2ctbWV0YQorICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIgor
ICAgICAgICAgICAgICAocmVzb2x2ZS1kZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICA7IENv
bWJpbmVkICJwZWVyRGVwZW5kZW5jaWVzIiBhbmQgImRlcGVuZGVuY2llcyIgZGVwZW5kZW5jaWVz
CisgICAgICAgICAgICAgICAgOyB3aXRoICJkZXBlbmRlbmNpZXMiIHRha2luZyBwcmVjZWRlbnQu
CisgICAgICAgICAgICAgICAgKGZvbGQKKyAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGRlcGVu
ZGVuY3kgZGVwZW5kZW5jaWVzKQorICAgICAgICAgICAgICAgICAgICAoYXBwbHkgYXNzb2Mtc2V0
ISBkZXBlbmRlbmNpZXMgZGVwZW5kZW5jeSkpCisgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVm
KiBwa2ctbWV0YSAicGVlckRlcGVuZGVuY2llcyIgJygpKQorICAgICAgICAgICAgICAgICAgKGFz
c29jLXJlZiogcGtnLW1ldGEgImRlcGVuZGVuY2llcyIgJygpKSkpKSkpKSkpCiAgICN0KQogCi0o
ZGVmaW5lIChkZWxldGUtZGVwZW5kZW5jaWVzIGFic2VudCkKKyhkZWZpbmUgKGRlbGV0ZS1kZXBl
bmRlbmNpZXMgZGVwZW5kZW5jaWVzLXRvLXJlbW92ZSkKICAgIlJld3JpdGUgJ3BhY2thZ2UuanNv
bicgdG8gYWxsb3cgdGhlIGJ1aWxkIHRvIHByb2NlZWQgd2l0aG91dCBwYWNrYWdlcwotbGlzdGVk
IGluIEFCU0VOVCwgYSBsaXN0IG9mIHN0cmluZ3MgbmFtaW5nIG5wbSBwYWNrYWdlcy4KK2xpc3Rl
ZCBpbiAnZGVwZW5kZW5jaWVzLXRvLXJlbW92ZScsIGEgbGlzdCBvZiBzdHJpbmdzIG5hbWluZyBu
cG0gcGFja2FnZXMuCiAKIFRvIHByZXZlbnQgdGhlIGRlbGV0ZWQgZGVwZW5kZW5jaWVzIGZyb20g
YmVpbmcgcmVpbnRyb2R1Y2VkLCB1c2UgdGhpcyBmdW5jdGlvbgogb25seSBhZnRlciB0aGUgJ3Bh
dGNoLWRlcGVuZGVuY2llcycgcGhhc2UuIgotICAoZGVmaW5lIGRlbGV0ZS1mcm9tLWpzb2JqZWN0
Ci0gICAgKG1hdGNoLWxhbWJkYQotICAgICAgKCgnQCAuIGFsaXN0KQotICAgICAgIChjb25zICdA
IChmaWx0ZXIgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAoKGsgLiBf
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAobWVtYmVyIGsgYWJzZW50KSkpKQot
ICAgICAgICAgICAgICAgICAgICAgICAgYWxpc3QpKSkpKQotCi0gICh3aXRoLWF0b21pYy1qc29u
LWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIKKyAgKHdpdGgtYXRvbWljLWpzb24tZmls
ZS1yZXBsYWNlbWVudAogICAgIChsYW1iZGEgKHBrZy1tZXRhKQotICAgICAgKGpzb2JqZWN0LXVw
ZGF0ZSoKLSAgICAgICBwa2ctbWV0YQotICAgICAgIGAoImRldkRlcGVuZGVuY2llcyIgLGRlbGV0
ZS1mcm9tLWpzb2JqZWN0IChAKSkKLSAgICAgICBgKCJkZXBlbmRlbmNpZXMiICxkZWxldGUtZnJv
bS1qc29iamVjdCAoQCkpCi0gICAgICAgYCgicGVlckRlcGVuZGVuY2llcyIgLGRlbGV0ZS1mcm9t
LWpzb2JqZWN0IChAKSkpKSkpCisgICAgICAoZm9sZAorICAgICAgICAobGFtYmRhIChkZXBlbmRl
bmN5LWtleSBwa2ctbWV0YSkKKyAgICAgICAgICAoYWxpc3QtdXBkYXRlCisgICAgICAgICAgICBw
a2ctbWV0YQorICAgICAgICAgICAgZGVwZW5kZW5jeS1rZXkKKyAgICAgICAgICAgIChsYW1iZGEg
KGRlcGVuZGVuY2llcykKKyAgICAgICAgICAgICAgKHJlbW92ZQorICAgICAgICAgICAgICAgIChs
YW1iZGEgKGRlcGVuZGVuY3kpCisgICAgICAgICAgICAgICAgICAobWVtYmVyIChjYXIgZGVwZW5k
ZW5jeSkgZGVwZW5kZW5jaWVzLXRvLXJlbW92ZSkpCisgICAgICAgICAgICAgICAgZGVwZW5kZW5j
aWVzKSkpKQorICAgICAgICBwa2ctbWV0YQorICAgICAgICAobGlzdAorICAgICAgICAgICJkZXZE
ZXBlbmRlbmNpZXMiCisgICAgICAgICAgImRlcGVuZGVuY2llcyIKKyAgICAgICAgICAicGVlckRl
cGVuZGVuY2llcyIKKyAgICAgICAgICAib3B0aW9uYWxEZXBlbmRlbmNpZXMiKSkpKSkKIAogKGRl
ZmluZSogKGRlbGV0ZS1sb2NrZmlsZXMgIzprZXkgaW5wdXRzICM6YWxsb3ctb3RoZXIta2V5cykK
ICAgIkRlbGV0ZSAncGFja2FnZS1sb2NrLmpzb24nLCAneWFybi5sb2NrJywgYW5kICducG0tc2hy
aW5rd3JhcC5qc29uJywgaWYgdGhleQpAQCAtMjI4LDggKzE4Niw4IEBAIChkZWZpbmUqIChjb25m
aWd1cmUgIzprZXkgb3V0cHV0cyBpbnB1dHMgIzphbGxvdy1vdGhlci1rZXlzKQogICAgICN0KSkK
IAogKGRlZmluZSogKGJ1aWxkICM6a2V5IGlucHV0cyAjOmFsbG93LW90aGVyLWtleXMpCi0gIChs
ZXQgKChwYWNrYWdlLW1ldGEgKGNhbGwtd2l0aC1pbnB1dC1maWxlICJwYWNrYWdlLmpzb24iIHJl
YWQtanNvbikpKQotICAgIChpZiAoanNvYmplY3QtcmVmIChqc29iamVjdC1yZWYgcGFja2FnZS1t
ZXRhICJzY3JpcHRzIiAnKEApKSAiYnVpbGQiICNmKQorICAobGV0ICgocGFja2FnZS1tZXRhIChj
YWxsLXdpdGgtaW5wdXQtZmlsZSAicGFja2FnZS5qc29uIiBqc29uLT5zY20pKSkKKyAgICAoaWYg
KGFzc29jLXJlZiogKGFzc29jLXJlZiogcGFja2FnZS1tZXRhICJzY3JpcHRzIiAnKCkpICJidWls
ZCIgI2YpCiAgICAgICAgIChsZXQgKChucG0gKHN0cmluZy1hcHBlbmQgKGFzc29jLXJlZiBpbnB1
dHMgIm5vZGUiKSAiL2Jpbi9ucG0iKSkpCiAgICAgICAgICAgKGludm9rZSBucG0gInJ1biIgImJ1
aWxkIikpCiAgICAgICAgIChmb3JtYXQgI3QgInRoZXJlIGlzIG5vIGJ1aWxkIHNjcmlwdCB0byBy
dW5+JSIpKQpAQCAtMzAxLDIyICsyNTksMjAgQEAgKGRlZmluZSogKGF2b2lkLW5vZGUtZ3lwLXJl
YnVpbGQgIzprZXkgb3V0cHV0cyAjOmFsbG93LW90aGVyLWtleXMpCiAgIDs7IGV2ZW4gbmVlZCB0
byBvdmVyd3JpdGUgdGhpcyBmaWxlLiAgVGhlcmVmb3JlLCBsZXQncyB1c2Ugc29tZSBoZWxwZXJz
CiAgIDs7IHRoYXQgd2UnZCBvdGhlcndpc2Ugbm90IG5lZWQuCiAgIChkZWZpbmUgcGtnLW1ldGEK
LSAgICAoY2FsbC13aXRoLWlucHV0LWZpbGUgaW5zdGFsbGVkLXBhY2thZ2UuanNvbiByZWFkLWpz
b24pKQorICAgIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBpbnN0YWxsZWQtcGFja2FnZS5qc29uIGpz
b24tPnNjbSkpCiAgIChkZWZpbmUgc2NyaXB0cwotICAgIChqc29iamVjdC1yZWYgcGtnLW1ldGEg
InNjcmlwdHMiICcoQCkpKQotICAoZGVmaW5lIChqc29iamVjdC1zZXQganMga2V5IHZhbCkKLSAg
ICAoanNvYmplY3QtdXBkYXRlKiBqcyAobGlzdCBrZXkgKGNvbnN0IHZhbCkpKSkKKyAgICAoYXNz
b2MtcmVmKiBwa2ctbWV0YSAic2NyaXB0cyIgJygpKSkKIAotICAod2hlbiAoZXF1YWw/ICJub2Rl
LWd5cCByZWJ1aWxkIiAoanNvYmplY3QtcmVmIHNjcmlwdHMgImluc3RhbGwiICNmKSkKKyAgKHdo
ZW4gKGVxdWFsPyAibm9kZS1neXAgcmVidWlsZCIgKGFzc29jLXJlZiogc2NyaXB0cyAiaW5zdGFs
bCIgI2YpKQogICAgIChjYWxsLXdpdGgtb3V0cHV0LWZpbGUgaW5zdGFsbGVkLXBhY2thZ2UuanNv
bgogICAgICAgKGxhbWJkYSAob3V0KQotICAgICAgICAod3JpdGUtanNvbgotICAgICAgICAgKGpz
b2JqZWN0LXNldCBwa2ctbWV0YQotICAgICAgICAgICAgICAgICAgICAgICAic2NyaXB0cyIKLSAg
ICAgICAgICAgICAgICAgICAgICAgKGpzb2JqZWN0LXNldCBzY3JpcHRzCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbGwiCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgImVjaG8gR3VpeDogYXZvaWRpbmcgbm9kZS1neXAgcmVidWlsZCIpKQot
ICAgICAgICAgb3V0KSkpKSkKKyAgICAgICAgKHNjbS0+anNvbgorICAgICAgICAgIChhc3NvYy1z
ZXQhIHBrZy1tZXRhCisgICAgICAgICAgICAgICAgICAgICAgInNjcmlwdHMiCisgICAgICAgICAg
ICAgICAgICAgICAgKGFzc29jLXNldCEgc2NyaXB0cworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJpbnN0YWxsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJl
Y2hvIEd1aXg6IGF2b2lkaW5nIG5vZGUtZ3lwIHJlYnVpbGQiKSkKKyAgICAgICAgICBvdXQpKSkp
KQogCiAoZGVmaW5lICVzdGFuZGFyZC1waGFzZXMKICAgKG1vZGlmeS1waGFzZXMgZ251OiVzdGFu
ZGFyZC1waGFzZXMKCmJhc2UtY29tbWl0OiBlMTZjZGNmMzdkODIyM2IzNjM0ZWM1ZTY1ODM1NmMz
YjdmMTU0ODU5Ci0tIAoyLjQ2LjAKCg==
--0000000000001eb841062a2c5a1f--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#74900] 
Resent-From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 28 Dec 2024 00:01:01 +0000
Resent-Message-ID: <handler.74900.B74900.173534400630983 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 74900
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 74900 <at> debbugs.gnu.org
Received: via spool by 74900-submit <at> debbugs.gnu.org id=B74900.173534400630983
          (code B ref 74900); Sat, 28 Dec 2024 00:01:01 +0000
Received: (at 74900) by debbugs.gnu.org; 28 Dec 2024 00:00:06 +0000
Received: from localhost ([127.0.0.1]:48023 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tRKFR-00083T-L2
	for submit <at> debbugs.gnu.org; Fri, 27 Dec 2024 19:00:06 -0500
Received: from mail-vs1-f46.google.com ([209.85.217.46]:49169)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <d.khodabakhsh@HIDDEN>) id 1tRKFP-000823-CY
 for 74900 <at> debbugs.gnu.org; Fri, 27 Dec 2024 19:00:04 -0500
Received: by mail-vs1-f46.google.com with SMTP id
 ada2fe7eead31-4afdfd3124dso2040680137.2
 for <74900 <at> debbugs.gnu.org>; Fri, 27 Dec 2024 16:00:03 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1735343942; x=1735948742; darn=debbugs.gnu.org;
 h=to:subject:message-id:date:from:in-reply-to:references:mime-version
 :from:to:cc:subject:date:message-id:reply-to;
 bh=Ezl48l5j5k+UTOeG9S0zqCEIS031B5W7eqMeRqFEAVg=;
 b=lwAlkH0Y3AM4LoNZnbg5wRs6C0iCJklCCg0D10DlRgQ3OaVNCBeN0RPpieIh/IKW9U
 qQs8ovnJYcnLlLBukj8MYDb0OGVBll0Vz5pn5/U03b8FGxuTKChzHFiBnn5cro8O/1bj
 3RpUrXMeSXAC5GVKwbMTOb46jwnw/5aEd4mMiLJRZmRyEIotYjsy2fMBYlbVLRx+Z59j
 LmpQgFOZqYcX+hp2eU1tuCKYI+DHeq1iBLG3TTSxCUXEcklo2IL6HTRg0V+8mFy13Mog
 OctKb9l+xzJE6TU1+7dobtVYhhctbt2SBTrR13wtfhc+4rrFy5aVx28SHr2S86WTYsqs
 zW4w==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1735343942; x=1735948742;
 h=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=Ezl48l5j5k+UTOeG9S0zqCEIS031B5W7eqMeRqFEAVg=;
 b=YefJA6N5JTZi3AaL21ORVFLhESiOx8zHEGV2GQfwhIR34k2WjV8GZbNBcYsAl8/Nrh
 8za3wGLcxhwtMpsoKal9WJjkokS3yafQ1Zmq7ntNtKoyF1n1qauq8vPq446mZ//V23xh
 OJ3v8vXp39dAj5n+m6lpnJEy1Oadp55ZwGqsOxS5KMZCJa+IiUwC7n2CDm71sti0etEB
 he9JUsQoJODmiTumC22ZHxhLwgGOhgDoCOsT73JeEV1YY/J9DFHQKZwlEOou7SzeEcxA
 Jty8Qe2AS/aeGfQLVvnVcZD2nBKW9rJ0I4rGF70RY5YtSI96Dkc7Cat2CBdCQcUDZvq4
 0VFg==
X-Gm-Message-State: AOJu0Yxg5d6x+F9bSNyKE+MN4XbAzxCaLlHD7kIYvOz5IO8ARI+Ryfa0
 +CqFzcWYYpAbWi5aWt9fABiIE01ECPhP9SDkvCKzc06LyKfqn4Y6BmzjgwZr/LiyRUwdqoFaT7Z
 OpQFYLHy+9ELo0AQBbUi/BsNTAltTGFg8
X-Gm-Gg: ASbGncvIeHnxRdmFwujVhwoqo+LLUyIe0J3LfIeQyvKlTZatHxSJUBtYeQ7qryIDrkT
 rCnVKLHqIBk/8jDbxrjlaKVnyQu3ZcpndiIIbGZGy
X-Google-Smtp-Source: AGHT+IFV0bs+Zs3YSZktTm5aYF/64NJll5iWsiKTp/JX4dcFyKXrosz9DlifU5Q49WBjnmo00sMCldIauGi1HfyAL7M=
X-Received: by 2002:a05:6102:3751:b0:4b2:c391:7d10 with SMTP id
 ada2fe7eead31-4b2cc31e2damr25848548137.3.1735343942369; Fri, 27 Dec 2024
 15:59:02 -0800 (PST)
MIME-Version: 1.0
References: <CAADuFn++tHWy7CAzNv4TP3FCF4AGwMPeq1MDBGeH11Q9zcDxAw@HIDDEN>
 <CAADuFnKcD0wxAZfg7cBPV1eWG9NW3Tm=nOHtd6Rcd9wfSqpsuA@HIDDEN>
In-Reply-To: <CAADuFnKcD0wxAZfg7cBPV1eWG9NW3Tm=nOHtd6Rcd9wfSqpsuA@HIDDEN>
From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Date: Fri, 27 Dec 2024 23:58:50 +0000
Message-ID: <CAADuFnK=BCCtqfrcjx1-tDo=HziX+LtXdLz6zy6Ejy0yv30Qog@HIDDEN>
Content-Type: text/plain; charset="UTF-8"
X-Spam-Score: 0.0 (/)
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 (-)

The rationale of this patch are the following reasons:

1. Since (json) is a dependency of guix, there's no need to roll out
own (guix build json) which does the same thing.
2. (guix build json)'s write-json escapes forward slashes in strings
for some reason ("/" become "\/")
3. (guix build json)'s read-json produces an awkward to use structure
similar to an association list but with '@' to indicate an object, and
arrays are just lists. (json)'s json->scm produces a regular guile
association list for objects and uses #(...) for lists. Overall this
difference leads to easier to read and maintain code as can be seen in
the patch. No longer need to match '@' for example, we can use the
regular association list procedures directly.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#74900] 
Resent-From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 28 Dec 2024 19:02:01 +0000
Resent-Message-ID: <handler.74900.B74900.173541251515962 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 74900
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 74900 <at> debbugs.gnu.org
Received: via spool by 74900-submit <at> debbugs.gnu.org id=B74900.173541251515962
          (code B ref 74900); Sat, 28 Dec 2024 19:02:01 +0000
Received: (at 74900) by debbugs.gnu.org; 28 Dec 2024 19:01:55 +0000
Received: from localhost ([127.0.0.1]:52616 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tRc4P-00049N-V4
	for submit <at> debbugs.gnu.org; Sat, 28 Dec 2024 14:01:55 -0500
Received: from mail-ua1-f48.google.com ([209.85.222.48]:48200)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <d.khodabakhsh@HIDDEN>) id 1tRc4M-00049E-MQ
 for 74900 <at> debbugs.gnu.org; Sat, 28 Dec 2024 14:01:52 -0500
Received: by mail-ua1-f48.google.com with SMTP id
 a1e0cc1a2514c-85c529e72bcso1428083241.0
 for <74900 <at> debbugs.gnu.org>; Sat, 28 Dec 2024 11:01:50 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1735412450; x=1736017250; darn=debbugs.gnu.org;
 h=to:subject:message-id:date:from:in-reply-to:references:mime-version
 :from:to:cc:subject:date:message-id:reply-to;
 bh=JijxkorW4tGvUCWGskSVdt1thD5ggcavhej+UeOMNOA=;
 b=MaATga8kQEXHWgWlrYpCyGecUkVB4DtO8a65HB1cU3+1xbFOA9ZgLVUCg5tZU3Fd+I
 3h3Bl23HwNbbN9Ac3oIozGNcd0sA9Vd3zEfeUEJ68pTJ9mtZ9O5xK+GG2HAwt8xolRdJ
 kTwnPyKPkfkGRZDCI5eO2qMGbevROSz5rAfhndC21PL9MW3oT/KDP2YkVOL1GRb2vkeL
 YtSHPNabHsLbvzNrhhLJJNpckRs/xnvdzdub1GLUVCxRSyDUiV2c1mDPx2iQ+RPLxgZf
 v6WUsfKglLSaQI//Sb4kT9CeAmoZ4G1I0iDuXH5y9uS4zWMlJqezL2YAe3x/ovFOPUAC
 d5lw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1735412450; x=1736017250;
 h=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=JijxkorW4tGvUCWGskSVdt1thD5ggcavhej+UeOMNOA=;
 b=dMxVhaRmZdn3lvtDwpLjOgcmRdcMVCOMWDed0XcZIf3IT4D895SzVz4+iz2vK2w44n
 MlXYBh+YCw+96JWMuimuc+LWbDHGOUjrdlq35C+lSDqxG69ez7NJIr1jW7WNWhYKt1Xk
 HoPi5VOyzIYc29z4xnsrdW2kN7ljry353dGHUgZAUvT62Cb4Faroy4E3hRJedvcgSYLd
 3CCKVtr1TF2LBoFeUnTjV3kN9phdiqtVKS4CX1yRwLH7jSp5R/kh7dRWIo7e2p0Ua2yI
 WXnIKbIfTHdjdHYXd2Xnmd9li+z0C1ubliPHiR/QSRnVy8Yhc7/62xaX0+TvohEOoZq4
 W3pg==
X-Gm-Message-State: AOJu0YyvSfaPDm0GW6HYvQzkPdEmXsBCUhqX8QxpcnEhPqnbmnqg/j5L
 ulzDEgGxe3gUSTo4nxhGMUVgR6ONfeXaoRL1S6LyZuYXoP6C8owSNek/Y3362C64/vgtAiOucSd
 RB/3mfX8wvU8PzAe/yV5vQrvct1RCPA==
X-Gm-Gg: ASbGncvTMYP/OPLX07iKfXDF66ZOuVPHrCHZqm2/LTUKWY0AcGCfaKojdUzECZrvwmE
 74QFWZNxK/0UXSRqoZk1uTO1uB6eOvDFE5YasboQc
X-Google-Smtp-Source: AGHT+IFPycIeU2lCWIkp08Ofv2XOCAZRbXcbGNQH4pNeN5ezrsNhCxlCaKx84y+9KFz12GTWNH44vjGqb3NqzjIgLSc=
X-Received: by 2002:a05:6102:c4e:b0:4b2:af77:b53a with SMTP id
 ada2fe7eead31-4b2cc36a2dcmr25651579137.11.1735412449861; Sat, 28 Dec 2024
 11:00:49 -0800 (PST)
MIME-Version: 1.0
References: <CAADuFn++tHWy7CAzNv4TP3FCF4AGwMPeq1MDBGeH11Q9zcDxAw@HIDDEN>
 <CAADuFnKcD0wxAZfg7cBPV1eWG9NW3Tm=nOHtd6Rcd9wfSqpsuA@HIDDEN>
 <CAADuFnK=BCCtqfrcjx1-tDo=HziX+LtXdLz6zy6Ejy0yv30Qog@HIDDEN>
In-Reply-To: <CAADuFnK=BCCtqfrcjx1-tDo=HziX+LtXdLz6zy6Ejy0yv30Qog@HIDDEN>
From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Date: Sat, 28 Dec 2024 19:00:38 +0000
Message-ID: <CAADuFn+rj-hS4rRt9a442wpBvapfO86Xpoo+mdj_4O4RRq0kew@HIDDEN>
Content-Type: multipart/mixed; boundary="0000000000009d1a6f062a593214"
X-Spam-Score: 0.0 (/)
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 (-)

--0000000000009d1a6f062a593214
Content-Type: text/plain; charset="UTF-8"

Tested the patch and ran into an issue that was introduced when I
shortened some lines to within 80 characters, fixed this now and also
included the additional rationale in the patch descriptions.

--0000000000009d1a6f062a593214
Content-Type: text/x-patch; charset="UTF-8"; 
	name="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch"
Content-Disposition: attachment; 
	filename="0001-Replace-guix-build-json-with-json-in-node-build-syst.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_m58jqupe0>
X-Attachment-Id: f_m58jqupe0

RnJvbSBlNGVhN2I4OGNlMzliMWY1YjI0ODE4MTc0ZjJlNWMxNzQyNGYzYWRjIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpNZXNzYWdlLUlEOiA8ZTRlYTdiODhjZTM5YjFmNWIyNDgxODE3NGYyZTVj
MTc0MjRmM2FkYy4xNzM1NDExOTY0LmdpdC5kLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KRnJvbTog
RGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KRGF0ZTogVGh1LCAy
NiBEZWMgMjAyNCAwNDozNTozOSAtMDgwMApTdWJqZWN0OiBbUEFUQ0hdIFJlcGxhY2UgKGd1aXgg
YnVpbGQganNvbikgd2l0aCAoanNvbikgaW4gbm9kZSBidWlsZCBzeXN0ZW0KClRoaXMgY2hhbmdl
IHJlcGxhY2VzIHRoZSB1c2Ugb2YgKGd1aXggYnVpbGQganNvbikgd2l0aCAoanNvbikgZm9yIHRo
ZSBub2RlIGVjb3N5c3RlbS4KU2luY2UgZ3VpbGUtanNvbiBpcyBhIGRlcGVuZGVuY3kgb2YgR3Vp
eCwgYW5kIGl0J3MgdXNlZCBlbHNld2hlcmUgaW4gdGhlIHByb2plY3QsIGl0IG1ha2VzIHNlbnNl
IHRvIHVzZSB0aGlzIGluc3RlYWQgb2Ygcm9sbGluZyBvdXIgb3duIEpTT04gaW1wbGVtZW50YXRp
b24gd2l0aCAoZ3VpeCBidWlsZCBqc29uKS4KKGd1aXggYnVpbGQganNvbikgYWxzbyBoYXMgYSBm
ZXcgaXNzdWVzOgogLSB3cml0ZS1qc29uIGVzY2FwZXMgZm9yd2FyZCBzbGFzaGVzIGluIHN0cmlu
Z3MgZm9yIHNvbWUgcmVhc29uICgiLyIgYmVjb21lICJcLyIpCiAtIHJlYWQtanNvbiBwcm9kdWNl
cyBhIHN0cnVjdHVyZSBzaW1pbGFyIHRvIGFuIGFzc29jaWF0aW9uIGxpc3QgYnV0IHdpdGggJ0An
IHRvIGluZGljYXRlIGFuIG9iamVjdCwgbWFraW5nIGl0IG5vdCBwb3NzaWJsZSB0byB1c2UgYXNz
b2NpYXRpb24gbGlzdCBwcm9jZWR1cmVzIGRpcmVjdGx5LgpUaGlzIGlzIG9uZSBzdGVwIHRvIG1v
dmUgYXdheSBmcm9tIChndWl4IGJ1aWxkIGpzb24pLCB0aGVyZSB3aWxsIGJlIG90aGVyIGNoYW5n
ZXMgdG8gcmVtb3ZlIHRoZSBvdGhlciB1c2VzIG9mIGl0LgoKU2lnbmVkLW9mZi1ieTogRGFuaWVs
IEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KQ2hhbmdlLUlkOiBJOWZkNTE1
MmE5OGI2YTI0MWQ0MTRlOWE5NGFiMTc5YzljYWJjZmI4NQotLS0KIGdudS9wYWNrYWdlcy9ub2Rl
LXh5ei5zY20gICAgICAgIHwgMTQ4ICsrKysrKysrKysrKy0tLS0tLS0tLS0tLS0KIGd1aXgvYnVp
bGQtc3lzdGVtL25vZGUuc2NtICAgICAgIHwgICA2ICstCiBndWl4L2J1aWxkL25vZGUtYnVpbGQt
c3lzdGVtLnNjbSB8IDE4MCArKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tCiAzIGZpbGVz
IGNoYW5nZWQsIDEzOSBpbnNlcnRpb25zKCspLCAxOTUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0
IGEvZ251L3BhY2thZ2VzL25vZGUteHl6LnNjbSBiL2dudS9wYWNrYWdlcy9ub2RlLXh5ei5zY20K
aW5kZXggZTk4ZWRhMmEwMS4uZWMzZjlmYmZiMSAxMDA2NDQKLS0tIGEvZ251L3BhY2thZ2VzL25v
ZGUteHl6LnNjbQorKysgYi9nbnUvcGFja2FnZXMvbm9kZS14eXouc2NtCkBAIC03LDYgKzcsNyBA
QAogOzs7IENvcHlyaWdodCDCqSAyMDIxIERocnV2aW4gR2FuZGhpIDxjb250YWN0QGRocnV2aW4u
ZGV2PgogOzs7IENvcHlyaWdodCDCqSAyMDIyIE5pY29sYXMgR3JhdmVzIDxuZ3JhdmVzQG5ncmF2
ZXMuZnI+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjMgSmVsbGUgTGljaHQgPGpsaWNodEBmc2ZlLm9y
Zz4KKzs7OyBDb3B5cmlnaHQgwqkgMjAyNCBEYW5pZWwgS2hvZGFiYWtoc2ggPGQua2hvZGFiYWto
c2hAZ21haWwuY29tPgogOzs7CiA7OzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEd1aXguCiA7
OzsKQEAgLTI0LDE0ICsyNSwxNCBAQAogOzs7IGFsb25nIHdpdGggR05VIEd1aXguICBJZiBub3Qs
IHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAKIChkZWZpbmUtbW9kdWxlIChn
bnUgcGFja2FnZXMgbm9kZS14eXopCi0gICM6dXNlLW1vZHVsZSAoKGd1aXggbGljZW5zZXMpICM6
cHJlZml4IGxpY2Vuc2U6KQogICAjOnVzZS1tb2R1bGUgKGdudSBwYWNrYWdlcyBzcWxpdGUpCiAg
ICM6dXNlLW1vZHVsZSAoZ251IHBhY2thZ2VzIHB5dGhvbikKICAgIzp1c2UtbW9kdWxlIChnbnUg
cGFja2FnZXMgd2ViKQorICAjOnVzZS1tb2R1bGUgKGd1aXggYnVpbGQtc3lzdGVtIG5vZGUpCiAg
ICM6dXNlLW1vZHVsZSAoZ3VpeCBnZXhwKQotICAjOnVzZS1tb2R1bGUgKGd1aXggcGFja2FnZXMp
CiAgICM6dXNlLW1vZHVsZSAoZ3VpeCBnaXQtZG93bmxvYWQpCi0gICM6dXNlLW1vZHVsZSAoZ3Vp
eCBidWlsZC1zeXN0ZW0gbm9kZSkpCisgICM6dXNlLW1vZHVsZSAoKGd1aXggbGljZW5zZXMpICM6
cHJlZml4IGxpY2Vuc2U6KQorICAjOnVzZS1tb2R1bGUgKGd1aXggcGFja2FnZXMpKQogCiA7OzsK
IDs7OyBQbGVhc2U6IFRyeSB0byBhZGQgbmV3IG1vZHVsZSBwYWNrYWdlcyBpbiBhbHBoYWJldGlj
IG9yZGVyLgpAQCAtNjksMTkgKzcwLDE3IEBAIChkZWZpbmUtcHVibGljIG5vZGUtYWNvcm4KICAg
ICAgICAgICAgICA7OyBpdCB3b3VsZCB0cnkgdG8gdXNlIHRoZSBidWlsZCBlbnZpcm9ubWVudCBh
bmQgd291bGQgYmxvY2sgdGhlCiAgICAgICAgICAgICAgOzsgYXV0b21hdGljIGJ1aWxkaW5nIGJ5
IG90aGVyIHBhY2thZ2VzIG1ha2luZyB1c2Ugb2Ygbm9kZS1hY29ybi4KICAgICAgICAgICAgICA7
OyBUT0RPOiBBZGQgdXRpbGl0eSBmdW5jdGlvbgotICAgICAgICAgICAgICh3aXRoLWF0b21pYy1q
c29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIKLSAgICAgICAgICAgICAgIChtYXRj
aC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgKCgnQCAuIHBrZy1tZXRhLWFsaXN0KQotICAgICAg
ICAgICAgICAgICAgKGNvbnMgJ0AgKG1hcCAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgKCgic2NyaXB0cyIgQCAuIHNjcmlwdHMtYWxpc3QpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlwdHMiIEAgLEAoZmlsdGVyIChtYXRj
aC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoKCJwcmVwYXJlIiAuIF8pCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmKQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0
KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2NyaXB0cy1hbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IChvdGhlciBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrZy1tZXRh
LWFsaXN0KSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFj
ZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAgICAobWFwCisgICAg
ICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAgICAoKCJzY3JpcHRz
IiAuIHNjcmlwdHMtYWxpc3QpCisgICAgICAgICAgICAgICAgICAgICAoY29ucyAic2NyaXB0cyIg
KGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAg
ICAgICAgICAgICAgICAgKCgicHJlcGFyZSIgLiBfKSAjZikKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAoXyAjdCkpCisgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKKyAg
ICAgICAgICAgICAgICAgICAob3RoZXIgb3RoZXIpKQorICAgICAgICAgICAgICAgICBwa2ctbWV0
YS1hbGlzdCkpKSkpCiAgICAgICAgICAocmVwbGFjZSAnYnVpbGQKICAgICAgICAgICAgKGxhbWJk
YSogKCM6a2V5IGlucHV0cyBuYXRpdmUtaW5wdXRzICM6YWxsb3ctb3RoZXIta2V5cykKICAgICAg
ICAgICAgICAobGV0ICgoZXNidWlsZCAoc2VhcmNoLWlucHV0LWZpbGUgKG9yIG5hdGl2ZS1pbnB1
dHMgaW5wdXRzKQpAQCAtMTU4LDIzICsxNTcsMTcgQEAgKGRlZmluZS1wdWJsaWMgbm9kZS1hZGRv
bi1hcGkKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCiAgICAgICAgICAgICAgKGRlZmluZSBuZXct
dGVzdC1zY3JpcHQKICAgICAgICAgICAgICAgICJlY2hvIHN0b3BwaW5nIGFmdGVyIHByZXRlc3Qg
b24gR3VpeCIpCi0gICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVu
dCAicGFja2FnZS5qc29uIgotICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQotICAgICAgICAg
ICAgICAgICAoKCdAIC4gcGtnLW1ldGEtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAoY29ucwot
ICAgICAgICAgICAgICAgICAgICdACi0gICAgICAgICAgICAgICAgICAgKG1hcCAobWF0Y2gtbGFt
YmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiICdAIC4gc2NyaXB0cy1h
bGlzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlwdHMiIEAgLEAobWFwICht
YXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgKCgidGVzdCIgLiBfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKGNvbnMgInRlc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXctdGVzdC1zY3JpcHQpKQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyKSkKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMtYWxpc3Qp
KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICBwa2ctbWV0YS1hbGlzdCkp
KSkpKSkpKSkKKyAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50
IChsYW1iZGEgKHBrZy1tZXRhLWFsaXN0KQorICAgICAgICAgICAgICAgKG1hcAorICAgICAgICAg
ICAgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0cyIgLiBz
Y3JpcHRzLWFsaXN0KQorICAgICAgICAgICAgICAgICAgICAgKGNvbnMgInNjcmlwdHMiIChtYXAK
KyAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAg
ICAgICAgICgoInRlc3QiIC4gXykgKGNvbnMgInRlc3QiIG5ldy10ZXN0LXNjcmlwdCkpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAgICAgICAgICAgIChvdGhlciBvdGhlcikpCisg
ICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkKICAgICAoaG9tZS1wYWdlICJo
dHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUtYWRkb24tYXBpIikKICAgICAoc3lub3BzaXMg
Ik5vZGUuanMgQVBJIChOb2RlLUFQSSkgaGVhZGVyLW9ubHkgQysrIHdyYXBwZXJzIikKICAgICAo
ZGVzY3JpcHRpb24gIlRoaXMgbW9kdWxlIGNvbnRhaW5zIGhlYWRlci1vbmx5IEMrKyB3cmFwcGVy
IGNsYXNzZXMgd2hpY2gKQEAgLTEyMjMsMjIgKzEyMTYsMTkgQEAgKGRlZmluZS1wdWJsaWMgbm9k
ZS1zZXJpYWxwb3J0LWJpbmRpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAibm9kZS1hYmkiKSkpKQogICAgICAgICAgKGFkZC1hZnRlciAnY2hkaXIgJ2F2b2lkLXByZWJ1
aWxkLWluc3RhbGwKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAgICAgICAgICAgKHdpdGgt
YXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgotICAgICAgICAgICAg
ICAgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAoKCdAIC4gcGtnLW1ldGEtYWxpc3Qp
Ci0gICAgICAgICAgICAgICAgICAoY29ucyAnQCAobWFwIChtYXRjaC1sYW1iZGEKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiBAIC4gc2NyaXB0cy1hbGlzdCkK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCgic2NyaXB0cyIgQCAsQChmaWx0
ZXIgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICgoImluc3RhbGwiIC4gXykKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2YpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF8K
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgI3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzY3JpcHRzLWFsaXN0KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKCgiZ3lwZmlsZSIgLiBfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAnKCJneXBmaWxlIiAuICNmKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAob3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIpKQotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpKSkpCisgICAg
ICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAobGFtYmRhIChwa2ct
bWV0YS1hbGlzdCkKKyAgICAgICAgICAgICAgIChtYXAKKyAgICAgICAgICAgICAgICAgKG1hdGNo
LWxhbWJkYQorICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiIC4gc2NyaXB0cy1hbGlzdCkK
KyAgICAgICAgICAgICAgICAgICAgIChjb25zICJzY3JpcHRzIiAoZmlsdGVyCisgICAgICAgICAg
ICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCJp
bnN0YWxsIiAuIF8pICNmKQorICAgICAgICAgICAgICAgICAgICAgICAgIChfICN0KSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICgo
Imd5cGZpbGUiIC4gXykKKyAgICAgICAgICAgICAgICAgICAgIChjb25zICJneXBmaWxlIiAjZikp
CisgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAgICAgICAgICAgICAgICAgcGtn
LW1ldGEtYWxpc3QpKSkpKSkKICAgICAgICAjOnRlc3RzPyAjZikpCiAgICAgKHN5bm9wc2lzICJB
YnN0cmFjdCBiYXNlIGNsYXNzIGZvciBOb2RlIFNlcmlhbFBvcnQgYmluZGluZ3MiKQogICAgIChk
ZXNjcmlwdGlvbiAiTm9kZSBTZXJpYWxQb3J0IGlzIGEgbW9kdWxhciBzdWl0ZSBvZiBOb2RlLmpz
IHBhY2thZ2VzIGZvcgpAQCAtMTUyNCwzOSArMTUxNCwzMyBAQCAoZGVmaW5lLXB1YmxpYyBub2Rl
LXNxbGl0ZTMKICAgICAgICAgICAgICAoc3Vic3RpdHV0ZSogIi5ucG1pZ25vcmUiCiAgICAgICAg
ICAgICAgICAoKCJsaWIvYmluZGluZyIpCiAgICAgICAgICAgICAgICAgIiNsaWIvYmluZGluZyAj
IDwtIHBhdGNoZWQgZm9yIEd1aXgiKSkKLSAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNvbi1m
aWxlLXJlcGxhY2VtZW50ICJwYWNrYWdlLmpzb24iCi0gICAgICAgICAgICAgICAobWF0Y2gtbGFt
YmRhCi0gICAgICAgICAgICAgICAgICgoJ0AgLiBwa2ctbWV0YS1hbGlzdCkKLSAgICAgICAgICAg
ICAgICAgIChtYXRjaCAoYXNzb2MtcmVmIHBrZy1tZXRhLWFsaXN0ICJiaW5hcnkiKQotICAgICAg
ICAgICAgICAgICAgICAoKCdAIC4gYmluYXJ5LWFsaXN0KQotICAgICAgICAgICAgICAgICAgICAg
OzsgV2hlbiBpdCBidWlsZHMgZnJvbSBzb3VyY2UsIG5vZGUtcHJlLWd5cCBzdXBwbGllcwotICAg
ICAgICAgICAgICAgICAgICAgOzsgbW9kdWxlX25hbWUgYW5kIG1vZHVsZV9wYXRoIGJhc2VkIG9u
IHRoZSBlbnRyaWVzIHVuZGVyCi0gICAgICAgICAgICAgICAgICAgICA7OyAiYmluYXJ5IiBmcm9t
ICJwYWNrYWdlLmpzb24iLCBzbyB0aGlzIHBhY2thZ2UncwotICAgICAgICAgICAgICAgICAgICAg
OzsgImJpbmRpbmcuZ3lwIiBkb2Vzbid0IGRlZmluZSB0aGVtLiBUaHVzLCB3ZSBhbHNvIG5lZWQK
LSAgICAgICAgICAgICAgICAgICAgIDs7IHRvIHN1cHBseSB0aGVtLiBUaGUgR1lQX0RFRklORVMg
ZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgIDs7IHR1cm5zIG91dCB0
byBiZSB0aGUgZWFzaWVzdCB3YXkgdG8gbWFrZSBzdXJlIHRoZXkgYXJlCi0gICAgICAgICAgICAg
ICAgICAgICA7OyBwcm9wYWdhdGVkIGZyb20gbnBtIHRvIG5vZGUtZ3lwIHRvIGd5cC4KLSAgICAg
ICAgICAgICAgICAgICAgIChzZXRlbnYgIkdZUF9ERUZJTkVTIgotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAoc3RyaW5nLWFwcGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Im1vZHVsZV9uYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3NvYy1yZWYg
YmluYXJ5LWFsaXN0ICJtb2R1bGVfbmFtZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGVfcGF0aD0iCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVmIGJpbmFyeS1hbGlzdCAibW9kdWxl
X3BhdGgiKSkpKSkKLSAgICAgICAgICAgICAgICAgIDs7IFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBp
bnN0YWxsIHNjcmlwdCBmcm9tICJwYWNrYWdlLmpzb24iLAotICAgICAgICAgICAgICAgICAgOzsg
YXMgaXQgd291bGQgdHJ5IHRvIHVzZSBub2RlLXByZS1neXAgYW5kIHdvdWxkIGJsb2NrIHRoZQot
ICAgICAgICAgICAgICAgICAgOzsgYXV0b21hdGljIGJ1aWxkaW5nIHBlcmZvcm1lZCBieSBgbnBt
IGluc3RhbGxgLgotICAgICAgICAgICAgICAgICAgKGNvbnMgJ0AgKG1hcCAobWF0Y2gtbGFtYmRh
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0cyIgQCAuIHNjcmlw
dHMtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAoInNjcmlwdHMi
IEAgLEAoZmlsdGVyIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJpbnN0YWxsIiAuIF8pCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNm
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIChfCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICN0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlzdCkpKQotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChvdGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBvdGhlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFs
aXN0KSkpKSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFj
ZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAgICAobGV0ICgoYmlu
YXJ5LWFsaXN0IChhc3NvYy1yZWYgcGtnLW1ldGEtYWxpc3QgImJpbmFyeSIpKSkKKyAgICAgICAg
ICAgICAgICAgOzsgV2hlbiBpdCBidWlsZHMgZnJvbSBzb3VyY2UsIG5vZGUtcHJlLWd5cCBzdXBw
bGllcworICAgICAgICAgICAgICAgICA7OyBtb2R1bGVfbmFtZSBhbmQgbW9kdWxlX3BhdGggYmFz
ZWQgb24gdGhlIGVudHJpZXMgdW5kZXIKKyAgICAgICAgICAgICAgICAgOzsgImJpbmFyeSIgZnJv
bSAicGFja2FnZS5qc29uIiwgc28gdGhpcyBwYWNrYWdlJ3MKKyAgICAgICAgICAgICAgICAgOzsg
ImJpbmRpbmcuZ3lwIiBkb2Vzbid0IGRlZmluZSB0aGVtLiBUaHVzLCB3ZSBhbHNvIG5lZWQKKyAg
ICAgICAgICAgICAgICAgOzsgdG8gc3VwcGx5IHRoZW0uIFRoZSBHWVBfREVGSU5FUyBlbnZpcm9u
bWVudCB2YXJpYWJsZQorICAgICAgICAgICAgICAgICA7OyB0dXJucyBvdXQgdG8gYmUgdGhlIGVh
c2llc3Qgd2F5IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZQorICAgICAgICAgICAgICAgICA7OyBwcm9w
YWdhdGVkIGZyb20gbnBtIHRvIG5vZGUtZ3lwIHRvIGd5cC4KKyAgICAgICAgICAgICAgICAgKHNl
dGVudiAiR1lQX0RFRklORVMiIChzdHJpbmctYXBwZW5kCisgICAgICAgICAgICAgICAgICAgIm1v
ZHVsZV9uYW1lPSIKKyAgICAgICAgICAgICAgICAgICAoYXNzb2MtcmVmIGJpbmFyeS1hbGlzdCAi
bW9kdWxlX25hbWUiKQorICAgICAgICAgICAgICAgICAgICIgbW9kdWxlX3BhdGg9IgorICAgICAg
ICAgICAgICAgICAgIChhc3NvYy1yZWYgYmluYXJ5LWFsaXN0ICJtb2R1bGVfcGF0aCIpKSkpCisg
ICAgICAgICAgICAgICA7OyBXZSBuZWVkIHRvIHJlbW92ZSB0aGUgaW5zdGFsbCBzY3JpcHQgZnJv
bSAicGFja2FnZS5qc29uIiwKKyAgICAgICAgICAgICAgIDs7IGFzIGl0IHdvdWxkIHRyeSB0byB1
c2Ugbm9kZS1wcmUtZ3lwIGFuZCB3b3VsZCBibG9jayB0aGUKKyAgICAgICAgICAgICAgIDs7IGF1
dG9tYXRpYyBidWlsZGluZyBwZXJmb3JtZWQgYnkgYG5wbSBpbnN0YWxsYC4KKyAgICAgICAgICAg
ICAgIChtYXAKKyAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAg
ICAgICgoInNjcmlwdHMiIC4gc2NyaXB0cy1hbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgIChj
b25zICJzY3JpcHRzIiAoZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1i
ZGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCJpbnN0YWxsIiAuIF8pICNmKQorICAgICAg
ICAgICAgICAgICAgICAgICAgIChfICN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0
cy1hbGlzdCkpKQorICAgICAgICAgICAgICAgICAgIChvdGhlciBvdGhlcikpCisgICAgICAgICAg
ICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkKICAgICAoaG9tZS1wYWdlICJodHRwczovL2dp
dGh1Yi5jb20vbWFwYm94L25vZGUtc3FsaXRlMyIpCiAgICAgKHN5bm9wc2lzICJOb2RlLmpzIGJp
bmRpbmdzIGZvciBTUUxpdGUzIikKICAgICAoZGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhL2d1aXgv
YnVpbGQtc3lzdGVtL25vZGUuc2NtIGIvZ3VpeC9idWlsZC1zeXN0ZW0vbm9kZS5zY20KaW5kZXgg
NTdmZTVmNjAzMC4uNDI1YjhjZDliMyAxMDA2NDQKLS0tIGEvZ3VpeC9idWlsZC1zeXN0ZW0vbm9k
ZS5zY20KKysrIGIvZ3VpeC9idWlsZC1zeXN0ZW0vbm9kZS5zY20KQEAgLTQsNiArNCw3IEBACiA7
OzsgQ29weXJpZ2h0IMKpIDIwMjEgTHVkb3ZpYyBDb3VydMOocyA8bHVkb0BnbnUub3JnPgogOzs7
IENvcHlyaWdodCDCqSAyMDIxIFBpZXJyZSBMYW5nbG9pcyA8cGllcnJlLmxhbmdsb2lzQGdteC5j
b20+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEgUGhpbGlwIE1jR3JhdGggPHBoaWxpcEBwaGlsaXBt
Y2dyYXRoLmNvbT4KKzs7OyBDb3B5cmlnaHQgwqkgMjAyNCBEYW5pZWwgS2hvZGFiYWtoc2ggPGQu
a2hvZGFiYWtoc2hAZ21haWwuY29tPgogOzs7CiA7OzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05V
IEd1aXguCiA7OzsKQEAgLTM2LDcgKzM3LDEwIEBAIChkZWZpbmUtbW9kdWxlIChndWl4IGJ1aWxk
LXN5c3RlbSBub2RlKQogKGRlZmluZSAlbm9kZS1idWlsZC1zeXN0ZW0tbW9kdWxlcwogICA7OyBC
dWlsZC1zaWRlIG1vZHVsZXMgaW1wb3J0ZWQgYnkgZGVmYXVsdC4KICAgYCgoZ3VpeCBidWlsZCBu
b2RlLWJ1aWxkLXN5c3RlbSkKLSAgICAoZ3VpeCBidWlsZCBqc29uKQorICAgIChqc29uKQorICAg
IChqc29uIGJ1aWxkZXIpCisgICAgKGpzb24gcGFyc2VyKQorICAgIChqc29uIHJlY29yZCkKICAg
ICAsQCVkZWZhdWx0LWdudS1pbXBvcnRlZC1tb2R1bGVzKSkKIAogKGRlZmluZSAoZGVmYXVsdC1u
b2RlKQpkaWZmIC0tZ2l0IGEvZ3VpeC9idWlsZC9ub2RlLWJ1aWxkLXN5c3RlbS5zY20gYi9ndWl4
L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNjbQppbmRleCBmYjIzODk0YmMxLi5kZjdlYTc3NzRj
IDEwMDY0NAotLS0gYS9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNjbQorKysgYi9ndWl4
L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNjbQpAQCAtNCw2ICs0LDcgQEAKIDs7OyBDb3B5cmln
aHQgwqkgMjAxOSwgMjAyMSBUaW1vdGh5IFNhbXBsZSA8c2FtcGxldEBuZ3lyby5jb20+CiA7Ozsg
Q29weXJpZ2h0IMKpIDIwMjEsIDIwMjIgUGhpbGlwIE1jR3JhdGggPHBoaWxpcEBwaGlsaXBtY2dy
YXRoLmNvbT4KIDs7OyBDb3B5cmlnaHQgwqkgMjAyMiBMaWxpYW5hIE1hcmllIFByaWtsZXIgPGxp
bGlhbmEucHJpa2xlckBnbWFpbC5jb20+Cis7OzsgQ29weXJpZ2h0IMKpIDIwMjQgRGFuaWVsIEto
b2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KIDs7OwogOzs7IFRoaXMgZmlsZSBp
cyBwYXJ0IG9mIEdOVSBHdWl4LgogOzs7CkBAIC0yMywxMCArMjQsMTAgQEAKIChkZWZpbmUtbW9k
dWxlIChndWl4IGJ1aWxkIG5vZGUtYnVpbGQtc3lzdGVtKQogICAjOnVzZS1tb2R1bGUgKChndWl4
IGJ1aWxkIGdudS1idWlsZC1zeXN0ZW0pICM6cHJlZml4IGdudTopCiAgICM6dXNlLW1vZHVsZSAo
Z3VpeCBidWlsZCB1dGlscykKLSAgIzp1c2UtbW9kdWxlIChndWl4IGJ1aWxkIGpzb24pCiAgICM6
dXNlLW1vZHVsZSAoaWNlLTkgZnR3KQogICAjOnVzZS1tb2R1bGUgKGljZS05IHJlZ2V4KQogICAj
OnVzZS1tb2R1bGUgKGljZS05IG1hdGNoKQorICAjOnVzZS1tb2R1bGUgKGpzb24pCiAgICM6dXNl
LW1vZHVsZSAoc3JmaSBzcmZpLTEpCiAgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTcxKQogICAj
OmV4cG9ydCAoJXN0YW5kYXJkLXBoYXNlcwpAQCAtMzQsMTMgKzM1LDE0IEBAIChkZWZpbmUtbW9k
dWxlIChndWl4IGJ1aWxkIG5vZGUtYnVpbGQtc3lzdGVtKQogICAgICAgICAgICAgZGVsZXRlLWRl
cGVuZGVuY2llcwogICAgICAgICAgICAgbm9kZS1idWlsZCkpCiAKLShkZWZpbmUgKHdpdGgtYXRv
bWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCBmaWxlIHByb2MpCisoZGVmaW5lKiAod2l0aC1hdG9t
aWMtanNvbi1maWxlLXJlcGxhY2VtZW50IHByb2MKKyAgIzpvcHRpb25hbCAoZmlsZSAicGFja2Fn
ZS5qc29uIikpCiAgICJMaWtlICd3aXRoLWF0b21pYy1maWxlLXJlcGxhY2VtZW50JywgYnV0IFBS
T0MgaXMgY2FsbGVkIHdpdGggYSBzaW5nbGUKIGFyZ3VtZW50LS0tdGhlIHJlc3VsdCBvZiBwYXJz
aW5nIEZJTEUncyBjb250ZW50cyBhcyBqc29uLS0tYW5kIHNob3VsZCBhIHZhbHVlCiB0byBiZSB3
cml0dGVuIGFzIGpzb24gdG8gdGhlIHJlcGxhY2VtZW50IEZJTEUuIgogICAod2l0aC1hdG9taWMt
ZmlsZS1yZXBsYWNlbWVudCBmaWxlCiAgICAgKGxhbWJkYSAoaW4gb3V0KQotICAgICAgKHdyaXRl
LWpzb24gKHByb2MgKHJlYWQtanNvbiBpbikpIG91dCkpKSkKKyAgICAgIChzY20tPmpzb24gKHBy
b2MgKGpzb24tPnNjbSBpbikpIG91dCkpKSkKIAogKGRlZmluZSogKGFzc29jLXJlZiogYWxpc3Qg
a2V5ICM6b3B0aW9uYWwgZGVmYXVsdCkKICAgIkxpa2UgYXNzb2MtcmVmLCBidXQgcmV0dXJuIERF
RkFVTFQgaW5zdGVhZCBvZiAjZiBpZiBubyB2YWx1ZSBleGlzdHMuIgpAQCAtNDgsMTAgKzUwLDYg
QEAgKGRlZmluZSogKGFzc29jLXJlZiogYWxpc3Qga2V5ICM6b3B0aW9uYWwgZGVmYXVsdCkKICAg
ICAoI2YgZGVmYXVsdCkKICAgICAoKF8gLiB2YWx1ZSkgdmFsdWUpKSkKIAotKGRlZmluZSogKGpz
b2JqZWN0LXJlZiBvYmoga2V5ICM6b3B0aW9uYWwgZGVmYXVsdCkKLSAgKG1hdGNoIG9iagotICAg
ICgoJ0AgLiBhbGlzdCkgKGFzc29jLXJlZiogYWxpc3Qga2V5IGRlZmF1bHQpKSkpCi0KIChkZWZp
bmUqIChhbGlzdC1wb3AgYWxpc3Qga2V5ICM6b3B0aW9uYWwgKD0gZXF1YWw/KSkKICAgIlJldHVy
biB0d28gdmFsdWVzLCB0aGUgZmlyc3QgcGFpciBpbiBBTElTVCB3aXRoIGtleSBLRVksIGFuZCB0
aGUgb3RoZXIKIGVsZW1lbnRzLiAgRXF1YWxpdHkgY2FsbHMgYXJlIG1hZGUgYXMgKD0gS0VZIEFM
SVNUQ0FSKS4iCkBAIC02Myw2NyArNjEsMTcgQEAgKGRlZmluZSogKGFsaXN0LXBvcCBhbGlzdCBr
ZXkgIzpvcHRpb25hbCAoPSBlcXVhbD8pKQogICAgICAgICAodmFsdWVzIChjYXIgYWZ0ZXIpIChh
cHBlbmQgYmVmb3JlIChjZHIgYWZ0ZXIpKSkKICAgICAgICAgKHZhbHVlcyAjZiBiZWZvcmUpKSkp
CiAKLShkZWZpbmUqIChhbGlzdC11cGRhdGUgYWxpc3Qga2V5IHByb2MgIzpvcHRpb25hbCBkZWZh
dWx0ICg9IGVxdWFsPykpCisoZGVmaW5lKiAoYWxpc3QtdXBkYXRlIGFsaXN0IGtleSBwcm9jICM6
b3B0aW9uYWwgKD0gZXF1YWw/KSkKICAgIlJldHVybiBhbiBhc3NvY2lhdGlvbiBsaXN0IGxpa2Ug
QUxJU1QsIGJ1dCB3aXRoIEtFWSBtYXBwZWQgdG8gdGhlIHJlc3VsdCBvZgogUFJPQyBhcHBsaWVk
IHRvIHRoZSBmaXJzdCB2YWx1ZSBmb3VuZCB1bmRlciB0aGUgY29tcGFyaXNvbiAoPSBLRVkgQUxJ
U1RDQVIpLgotSWYgbm8gc3VjaCB2YWx1ZSBleGlzdHMsIHVzZSBERUZBVUxUIGluc3RlYWQuCitJ
ZiBubyBzdWNoIHZhbHVlIGV4aXN0cywgcmV0dXJuIHRoZSBsaXN0IHVuY2hhbmdlZC4KIFVubGlr
ZSBhY29ucywgdGhpcyByZW1vdmVzIHRoZSBwcmV2aW91cyBhc3NvY2lhdGlvbiBvZiBLRVkgKGFz
c3VtaW5nIGl0IGlzCiB1bmlxdWUpLCBidXQgdGhlIHJlc3VsdCBtYXkgc3RpbGwgc2hhcmUgc3Rv
cmFnZSB3aXRoIEFMSVNULiIKICAgKGxldCAoKHBhaXIgcmVzdCAoYWxpc3QtcG9wIGFsaXN0IGtl
eSA9KSkpCi0gICAgKGFjb25zIGtleQotICAgICAgICAgICAocHJvYyAoaWYgKHBhaXI/IHBhaXIp
Ci0gICAgICAgICAgICAgICAgICAgICAoY2RyIHBhaXIpCi0gICAgICAgICAgICAgICAgICAgICBk
ZWZhdWx0KSkKLSAgICAgICAgICAgcmVzdCkpKQotCi0oZGVmaW5lIChqc29iamVjdC11cGRhdGUq
IGpzIC4gdXBkYXRlcykKLSAgIlJldHVybiBhIGpzb24gb2JqZWN0IGxpa2UgSlMsIGJ1dCB3aXRo
IGFsbCBVUERBVEVTIGFwcGxpZWQuICBFYWNoIHVwZGF0ZSBpcwotYSBsaXN0IChLRVkgUFJPQyBb
REVGQVVMVF0pLCBzbyB0aGF0IEtFWSBpcyBtYXBwZWQgdG8gdGhlIHJlc3VsdCBvZiBQUk9DCi1h
cHBsaWVkIHRvIHRoZSB2YWx1ZSB0byB3aGljaCBLRVkgaXMgbWFwcGVkIGluIEpTLiAgSWYgbm8g
c3VjaCBtYXBwaW5nIGV4aXN0cywKLVBST0MgaXMgaW5zdGVhZCBhcHBsaWVkIHRvIERFRkFVTFQs
IG9yIHRvICcjZicgaXMgbm8gREVGQVVMVCBpcyBzcGVjaWZpZWQuCi1UaGUgdXBkYXRlIHRha2Vz
IHBsYWNlIGZyb20gbGVmdCB0byByaWdodCwgc28gbGF0ZXIgVVBEQVRFUnMgd2lsbCByZWNlaXZl
IHRoZQotdmFsdWVzIHJldHVybmVkIGJ5IGVhcmxpZXIgVVBEQVRFUnMgZm9yIHRoZSBzYW1lIEtF
WS4iCi0gIChtYXRjaCBqcwotICAgICgoJ0AgLiBhbGlzdCkKLSAgICAgKGxldCBsb29wICgoYWxp
c3QgYWxpc3QpCi0gICAgICAgICAgICAgICAgKHVwZGF0ZXMgdXBkYXRlcykpCi0gICAgICAgKG1h
dGNoIHVwZGF0ZXMKLSAgICAgICAgICgoKSAoY29ucyAnQCBhbGlzdCkpCi0gICAgICAgICAoKChr
ZXkgcHJvYykgLiB1cGRhdGVzKQotICAgICAgICAgIChsb29wIChhbGlzdC11cGRhdGUgYWxpc3Qg
a2V5IHByb2MgI2YgZXF1YWw/KSB1cGRhdGVzKSkKLSAgICAgICAgICgoKGtleSBwcm9jIGRlZmF1
bHQpIC4gdXBkYXRlcykKLSAgICAgICAgICAobG9vcCAoYWxpc3QtdXBkYXRlIGFsaXN0IGtleSBw
cm9jIGRlZmF1bHQgZXF1YWw/KSB1cGRhdGVzKSkpKSkpKQotCi0oZGVmaW5lIChqc29iamVjdC11
bmlvbiBjb21iaW5lIHNlZWQgLiBvYmplY3RzKQotICAiTWVyZ2UgT0JKRUNUUyBpbnRvIFNFRUQg
YnkgYXBwbHlpbmcgKENPTUJJTkUgS0VZIFZBTDAgVkFMKSwgd2hlcmUgVkFMMAotaXMgdGhlIHZh
bHVlIGZvdW5kIGluIHRoZSAocG9zc2libHkgdXBkYXRlZCkgU0VFRCBhbmQgVkFMIGlzIHRoZSBu
ZXcgdmFsdWUKLWZvdW5kIGluIG9uZSBvZiB0aGUgT0JKRUNUUy4iCi0gIChtYXRjaCBzZWVkCi0g
ICAgKCgnQCAuIGFzZWVkKQotICAgICAobWF0Y2ggb2JqZWN0cwotICAgICAgICgoKSBzZWVkKQot
ICAgICAgICgoKCdAIC4gYWxpc3RzKSAuLi4pCi0gICAgICAgIChjb25zCi0gICAgICAgICAnQAot
ICAgICAgICAgKGZvbGQgKGxhbWJkYSAoYWxpc3QgYXNlZWQpCi0gICAgICAgICAgICAgICAgIChp
ZiAobnVsbD8gYXNlZWQpIGFsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAoZm9sZAotICAgICAg
ICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEqCi0gICAgICAgICAgICAgICAgICAgICAgICAo
KChrIC4gdikgYXNlZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGxldCAoKHBhaXIgdGFp
bCAoYWxpc3QtcG9wIGFsaXN0IGspKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRj
aCBwYWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgjZiAoYWNvbnMgayB2IGFzZWVk
KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfIC4gdjApIChhY29ucyBrIChjb21i
aW5lIGsgdjAgdikgYXNlZWQpKSkpKSkKLSAgICAgICAgICAgICAgICAgICAgICBhc2VlZAotICAg
ICAgICAgICAgICAgICAgICAgIGFsaXN0KSkpCi0gICAgICAgICAgICAgICBhc2VlZAotICAgICAg
ICAgICAgICAgYWxpc3RzKSkpKSkpKQorICAgIChpZiAocGFpcj8gcGFpcikKKyAgICAgIChhY29u
cyBrZXkgKHByb2MgKGNkciBwYWlyKSkgcmVzdCkKKyAgICAgIGFsaXN0KSkpCiAKLTs7IFBvc3Np
Ymx5IHVzZWZ1bCBoZWxwZXIgZnVuY3Rpb25zOgotOzsgKGRlZmluZSAobmV3ZXN0IGtleSB2YWww
IHZhbCkgdmFsKQotOzsgKGRlZmluZSAodW5rZXllZC0+a2V5ZWQgcHJvYykgKGxhbWJkYSAoX2tl
eSB2YWwwIHZhbCkgKHByb2MgdmFsMCB2YWwpKSkKLQotDAogOzs7CiA7OzsgUGhhc2VzLgogOzs7
CkBAIC0xNDIsOCArOTAsOCBAQCAoZGVmaW5lIChzZXQtaG9tZSAuIF8pCiAKIChkZWZpbmUgKG1v
ZHVsZS1uYW1lIG1vZHVsZSkKICAgKGxldCogKChwYWNrYWdlLmpzb24gKHN0cmluZy1hcHBlbmQg
bW9kdWxlICIvcGFja2FnZS5qc29uIikpCi0gICAgICAgICAocGFja2FnZS1tZXRhIChjYWxsLXdp
dGgtaW5wdXQtZmlsZSBwYWNrYWdlLmpzb24gcmVhZC1qc29uKSkpCi0gICAgKGpzb2JqZWN0LXJl
ZiBwYWNrYWdlLW1ldGEgIm5hbWUiKSkpCisgICAgICAgICAocGFja2FnZS1tZXRhIChjYWxsLXdp
dGgtaW5wdXQtZmlsZSBwYWNrYWdlLmpzb24ganNvbi0+c2NtKSkpCisgICAgKGFzc29jLXJlZiBw
YWNrYWdlLW1ldGEgIm5hbWUiKSkpCiAKIChkZWZpbmUgKGluZGV4LW1vZHVsZXMgaW5wdXQtcGF0
aHMpCiAgIChkZWZpbmUgKGxpc3QtbW9kdWxlcyBkaXJlY3RvcnkpCkBAIC0xNjcsNDkgKzExNSw1
OSBAQCAoZGVmaW5lKiAocGF0Y2gtZGVwZW5kZW5jaWVzICM6a2V5IGlucHV0cyAjOmFsbG93LW90
aGVyLWtleXMpCiAKICAgKGRlZmluZSBpbmRleCAoaW5kZXgtbW9kdWxlcyAobWFwIGNkciBpbnB1
dHMpKSkKIAotICAoZGVmaW5lIHJlc29sdmUtZGVwZW5kZW5jaWVzCi0gICAgKG1hdGNoLWxhbWJk
YQotICAgICAgKCgnQCAuIGFsaXN0KQotICAgICAgIChjb25zICdAIChtYXAgKG1hdGNoLWxhbWJk
YQotICAgICAgICAgICAgICAgICAgICAgICAoKGtleSAuIHZhbHVlKQotICAgICAgICAgICAgICAg
ICAgICAgICAgKGNvbnMga2V5IChoYXNoLXJlZiBpbmRleCBrZXkgdmFsdWUpKSkpCi0gICAgICAg
ICAgICAgICAgICAgICBhbGlzdCkpKSkpCisgIChkZWZpbmUgKHJlc29sdmUtZGVwZW5kZW5jaWVz
IGRlcGVuZGVuY2llcykKKyAgICAobWFwCisgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAgICgo
ZGVwZW5kZW5jeSAuIHZlcnNpb24pCisgICAgICAgICAgKGNvbnMgZGVwZW5kZW5jeSAoaGFzaC1y
ZWYgaW5kZXggZGVwZW5kZW5jeSB2ZXJzaW9uKSkpKQorICAgICAgZGVwZW5kZW5jaWVzKSkKIAot
ICAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdlLmpzb24iCisgICh3
aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQKICAgICAobGFtYmRhIChwa2ctbWV0YSkK
LSAgICAgIChqc29iamVjdC11cGRhdGUqCi0gICAgICAgcGtnLW1ldGEKLSAgICAgICBgKCJkZXZE
ZXBlbmRlbmNpZXMiICxyZXNvbHZlLWRlcGVuZGVuY2llcyAoQCkpCi0gICAgICAgYCgiZGVwZW5k
ZW5jaWVzIiAsKGxhbWJkYSAoZGVwcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNv
bHZlLWRlcGVuZGVuY2llcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqc29iamVjdC11
bmlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhIChrIGEgYikgYikKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpzb2JqZWN0LXJlZiBwa2ctbWV0YSAicGVlckRl
cGVuZGVuY2llcyIgJyhAKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcykpKQot
ICAgICAgICAgKEApKSkpKQorICAgICAgKGZvbGQKKyAgICAgICAgKGxhbWJkYSAocHJvYyBwa2ct
bWV0YSkgKHByb2MgcGtnLW1ldGEpKQorICAgICAgICBwa2ctbWV0YQorICAgICAgICAobGlzdAor
ICAgICAgICAgIChsYW1iZGEgKHBrZy1tZXRhKQorICAgICAgICAgICAgKGFsaXN0LXVwZGF0ZSBw
a2ctbWV0YSAiZGV2RGVwZW5kZW5jaWVzIiByZXNvbHZlLWRlcGVuZGVuY2llcykpCisgICAgICAg
ICAgKGxhbWJkYSAocGtnLW1ldGEpCisgICAgICAgICAgICAoYXNzb2Mtc2V0IQorICAgICAgICAg
ICAgICBwa2ctbWV0YQorICAgICAgICAgICAgICAiZGVwZW5kZW5jaWVzIgorICAgICAgICAgICAg
ICAocmVzb2x2ZS1kZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICA7IENvbWJpbmVkICJwZWVy
RGVwZW5kZW5jaWVzIiBhbmQgImRlcGVuZGVuY2llcyIgZGVwZW5kZW5jaWVzCisgICAgICAgICAg
ICAgICAgOyB3aXRoICJkZXBlbmRlbmNpZXMiIHRha2luZyBwcmVjZWRlbnQuCisgICAgICAgICAg
ICAgICAgKGZvbGQKKyAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGRlcGVuZGVuY3kgZGVwZW5k
ZW5jaWVzKQorICAgICAgICAgICAgICAgICAgICAoYXNzb2Mtc2V0ISBkZXBlbmRlbmNpZXMgKGNh
ciBkZXBlbmRlbmN5KSAoY2RyIGRlcGVuZGVuY3kpKSkKKyAgICAgICAgICAgICAgICAgIChhc3Nv
Yy1yZWYqIHBrZy1tZXRhICJwZWVyRGVwZW5kZW5jaWVzIiAnKCkpCisgICAgICAgICAgICAgICAg
ICAoYXNzb2MtcmVmKiBwa2ctbWV0YSAiZGVwZW5kZW5jaWVzIiAnKCkpKSkpKSkpKSkKICAgI3Qp
CiAKLShkZWZpbmUgKGRlbGV0ZS1kZXBlbmRlbmNpZXMgYWJzZW50KQorKGRlZmluZSAoZGVsZXRl
LWRlcGVuZGVuY2llcyBkZXBlbmRlbmNpZXMtdG8tcmVtb3ZlKQogICAiUmV3cml0ZSAncGFja2Fn
ZS5qc29uJyB0byBhbGxvdyB0aGUgYnVpbGQgdG8gcHJvY2VlZCB3aXRob3V0IHBhY2thZ2VzCi1s
aXN0ZWQgaW4gQUJTRU5ULCBhIGxpc3Qgb2Ygc3RyaW5ncyBuYW1pbmcgbnBtIHBhY2thZ2VzLgor
bGlzdGVkIGluICdkZXBlbmRlbmNpZXMtdG8tcmVtb3ZlJywgYSBsaXN0IG9mIHN0cmluZ3MgbmFt
aW5nIG5wbSBwYWNrYWdlcy4KIAogVG8gcHJldmVudCB0aGUgZGVsZXRlZCBkZXBlbmRlbmNpZXMg
ZnJvbSBiZWluZyByZWludHJvZHVjZWQsIHVzZSB0aGlzIGZ1bmN0aW9uCiBvbmx5IGFmdGVyIHRo
ZSAncGF0Y2gtZGVwZW5kZW5jaWVzJyBwaGFzZS4iCi0gIChkZWZpbmUgZGVsZXRlLWZyb20tanNv
YmplY3QKLSAgICAobWF0Y2gtbGFtYmRhCi0gICAgICAoKCdAIC4gYWxpc3QpCi0gICAgICAgKGNv
bnMgJ0AgKGZpbHRlciAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgo
ayAuIF8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IChtZW1iZXIgayBhYnNlbnQp
KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBhbGlzdCkpKSkpCi0KLSAgKHdpdGgtYXRvbWlj
LWpzb24tZmlsZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgorICAod2l0aC1hdG9taWMtanNv
bi1maWxlLXJlcGxhY2VtZW50CiAgICAgKGxhbWJkYSAocGtnLW1ldGEpCi0gICAgICAoanNvYmpl
Y3QtdXBkYXRlKgotICAgICAgIHBrZy1tZXRhCi0gICAgICAgYCgiZGV2RGVwZW5kZW5jaWVzIiAs
ZGVsZXRlLWZyb20tanNvYmplY3QgKEApKQotICAgICAgIGAoImRlcGVuZGVuY2llcyIgLGRlbGV0
ZS1mcm9tLWpzb2JqZWN0IChAKSkKLSAgICAgICBgKCJwZWVyRGVwZW5kZW5jaWVzIiAsZGVsZXRl
LWZyb20tanNvYmplY3QgKEApKSkpKSkKKyAgICAgIChmb2xkCisgICAgICAgIChsYW1iZGEgKGRl
cGVuZGVuY3kta2V5IHBrZy1tZXRhKQorICAgICAgICAgIChhbGlzdC11cGRhdGUKKyAgICAgICAg
ICAgIHBrZy1tZXRhCisgICAgICAgICAgICBkZXBlbmRlbmN5LWtleQorICAgICAgICAgICAgKGxh
bWJkYSAoZGVwZW5kZW5jaWVzKQorICAgICAgICAgICAgICAocmVtb3ZlCisgICAgICAgICAgICAg
ICAgKGxhbWJkYSAoZGVwZW5kZW5jeSkKKyAgICAgICAgICAgICAgICAgIChtZW1iZXIgKGNhciBk
ZXBlbmRlbmN5KSBkZXBlbmRlbmNpZXMtdG8tcmVtb3ZlKSkKKyAgICAgICAgICAgICAgICBkZXBl
bmRlbmNpZXMpKSkpCisgICAgICAgIHBrZy1tZXRhCisgICAgICAgIChsaXN0CisgICAgICAgICAg
ImRldkRlcGVuZGVuY2llcyIKKyAgICAgICAgICAiZGVwZW5kZW5jaWVzIgorICAgICAgICAgICJw
ZWVyRGVwZW5kZW5jaWVzIgorICAgICAgICAgICJvcHRpb25hbERlcGVuZGVuY2llcyIpKSkpKQog
CiAoZGVmaW5lKiAoZGVsZXRlLWxvY2tmaWxlcyAjOmtleSBpbnB1dHMgIzphbGxvdy1vdGhlci1r
ZXlzKQogICAiRGVsZXRlICdwYWNrYWdlLWxvY2suanNvbicsICd5YXJuLmxvY2snLCBhbmQgJ25w
bS1zaHJpbmt3cmFwLmpzb24nLCBpZiB0aGV5CkBAIC0yMjgsOCArMTg2LDggQEAgKGRlZmluZSog
KGNvbmZpZ3VyZSAjOmtleSBvdXRwdXRzIGlucHV0cyAjOmFsbG93LW90aGVyLWtleXMpCiAgICAg
I3QpKQogCiAoZGVmaW5lKiAoYnVpbGQgIzprZXkgaW5wdXRzICM6YWxsb3ctb3RoZXIta2V5cykK
LSAgKGxldCAoKHBhY2thZ2UtbWV0YSAoY2FsbC13aXRoLWlucHV0LWZpbGUgInBhY2thZ2UuanNv
biIgcmVhZC1qc29uKSkpCi0gICAgKGlmIChqc29iamVjdC1yZWYgKGpzb2JqZWN0LXJlZiBwYWNr
YWdlLW1ldGEgInNjcmlwdHMiICcoQCkpICJidWlsZCIgI2YpCisgIChsZXQgKChwYWNrYWdlLW1l
dGEgKGNhbGwtd2l0aC1pbnB1dC1maWxlICJwYWNrYWdlLmpzb24iIGpzb24tPnNjbSkpKQorICAg
IChpZiAoYXNzb2MtcmVmKiAoYXNzb2MtcmVmKiBwYWNrYWdlLW1ldGEgInNjcmlwdHMiICcoKSkg
ImJ1aWxkIiAjZikKICAgICAgICAgKGxldCAoKG5wbSAoc3RyaW5nLWFwcGVuZCAoYXNzb2MtcmVm
IGlucHV0cyAibm9kZSIpICIvYmluL25wbSIpKSkKICAgICAgICAgICAoaW52b2tlIG5wbSAicnVu
IiAiYnVpbGQiKSkKICAgICAgICAgKGZvcm1hdCAjdCAidGhlcmUgaXMgbm8gYnVpbGQgc2NyaXB0
IHRvIHJ1bn4lIikpCkBAIC0zMDEsMjIgKzI1OSwyMCBAQCAoZGVmaW5lKiAoYXZvaWQtbm9kZS1n
eXAtcmVidWlsZCAjOmtleSBvdXRwdXRzICM6YWxsb3ctb3RoZXIta2V5cykKICAgOzsgZXZlbiBu
ZWVkIHRvIG92ZXJ3cml0ZSB0aGlzIGZpbGUuICBUaGVyZWZvcmUsIGxldCdzIHVzZSBzb21lIGhl
bHBlcnMKICAgOzsgdGhhdCB3ZSdkIG90aGVyd2lzZSBub3QgbmVlZC4KICAgKGRlZmluZSBwa2ct
bWV0YQotICAgIChjYWxsLXdpdGgtaW5wdXQtZmlsZSBpbnN0YWxsZWQtcGFja2FnZS5qc29uIHJl
YWQtanNvbikpCisgICAgKGNhbGwtd2l0aC1pbnB1dC1maWxlIGluc3RhbGxlZC1wYWNrYWdlLmpz
b24ganNvbi0+c2NtKSkKICAgKGRlZmluZSBzY3JpcHRzCi0gICAgKGpzb2JqZWN0LXJlZiBwa2ct
bWV0YSAic2NyaXB0cyIgJyhAKSkpCi0gIChkZWZpbmUgKGpzb2JqZWN0LXNldCBqcyBrZXkgdmFs
KQotICAgIChqc29iamVjdC11cGRhdGUqIGpzIChsaXN0IGtleSAoY29uc3QgdmFsKSkpKQorICAg
IChhc3NvYy1yZWYqIHBrZy1tZXRhICJzY3JpcHRzIiAnKCkpKQogCi0gICh3aGVuIChlcXVhbD8g
Im5vZGUtZ3lwIHJlYnVpbGQiIChqc29iamVjdC1yZWYgc2NyaXB0cyAiaW5zdGFsbCIgI2YpKQor
ICAod2hlbiAoZXF1YWw/ICJub2RlLWd5cCByZWJ1aWxkIiAoYXNzb2MtcmVmKiBzY3JpcHRzICJp
bnN0YWxsIiAjZikpCiAgICAgKGNhbGwtd2l0aC1vdXRwdXQtZmlsZSBpbnN0YWxsZWQtcGFja2Fn
ZS5qc29uCiAgICAgICAobGFtYmRhIChvdXQpCi0gICAgICAgICh3cml0ZS1qc29uCi0gICAgICAg
ICAoanNvYmplY3Qtc2V0IHBrZy1tZXRhCi0gICAgICAgICAgICAgICAgICAgICAgICJzY3JpcHRz
IgotICAgICAgICAgICAgICAgICAgICAgICAoanNvYmplY3Qtc2V0IHNjcmlwdHMKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbCIKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAiZWNobyBHdWl4OiBhdm9pZGluZyBub2RlLWd5cCByZWJ1aWxk
IikpCi0gICAgICAgICBvdXQpKSkpKQorICAgICAgICAoc2NtLT5qc29uCisgICAgICAgICAgKGFz
c29jLXNldCEgcGtnLW1ldGEKKyAgICAgICAgICAgICAgICAgICAgICAic2NyaXB0cyIKKyAgICAg
ICAgICAgICAgICAgICAgICAoYXNzb2Mtc2V0ISBzY3JpcHRzCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgImluc3RhbGwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgImVjaG8gR3VpeDogYXZvaWRpbmcgbm9kZS1neXAgcmVidWlsZCIpKQorICAgICAgICAgIG91
dCkpKSkpCiAKIChkZWZpbmUgJXN0YW5kYXJkLXBoYXNlcwogICAobW9kaWZ5LXBoYXNlcyBnbnU6
JXN0YW5kYXJkLXBoYXNlcwoKYmFzZS1jb21taXQ6IGUxNmNkY2YzN2Q4MjIzYjM2MzRlYzVlNjU4
MzU2YzNiN2YxNTQ4NTkKLS0gCjIuNDYuMAoK
--0000000000009d1a6f062a593214--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#74900] [PATCH 0/2] Improve node-build-system helper procedures
References: <CAADuFnKAGHb2=rTFiwD9yXN3=OKbZdragGaCJJ0BkOhofDb2KQ@HIDDEN>
In-Reply-To: <CAADuFnKAGHb2=rTFiwD9yXN3=OKbZdragGaCJJ0BkOhofDb2KQ@HIDDEN>
Resent-From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 29 Dec 2024 21:57:01 +0000
Resent-Message-ID: <handler.74900.B74900.173550937330064 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 74900
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 74900 <at> debbugs.gnu.org
Received: via spool by 74900-submit <at> debbugs.gnu.org id=B74900.173550937330064
          (code B ref 74900); Sun, 29 Dec 2024 21:57:01 +0000
Received: (at 74900) by debbugs.gnu.org; 29 Dec 2024 21:56:13 +0000
Received: from localhost ([127.0.0.1]:56438 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tS1Gf-0007oq-1N
	for submit <at> debbugs.gnu.org; Sun, 29 Dec 2024 16:56:13 -0500
Received: from mail-vs1-f42.google.com ([209.85.217.42]:57704)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <d.khodabakhsh@HIDDEN>) id 1tS1Gd-0007od-NF
 for 74900 <at> debbugs.gnu.org; Sun, 29 Dec 2024 16:56:12 -0500
Received: by mail-vs1-f42.google.com with SMTP id
 ada2fe7eead31-4afe2a1849bso5034791137.3
 for <74900 <at> debbugs.gnu.org>; Sun, 29 Dec 2024 13:56:11 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1735509306; x=1736114106; darn=debbugs.gnu.org;
 h=to:subject:message-id:date:from:mime-version:from:to:cc:subject
 :date:message-id:reply-to;
 bh=SezE+k8D2KqA/TRu4JurNjDs/CC+05H0eC3S8E/fXfc=;
 b=E+6WqttlWDPG+Fb3dGZY26gY9bPJO5Hc3zTz7+YmnOA/UhpCXkkX/8c/FxVsSMirod
 z1t+R888nTJHctqotG2PDEe1Q3IVkHM8WcOXHuhBGob6PF4usvLwIOj2qe4oQZjKfS8M
 ymwzP1tesLsaJUZVIe9xSUPq8xYuygZsoyTj6UiOzo7lxODOu5O1zJzkRa5fWmB4dvc/
 0LmRwkXQNQBZ4WiOIbT+qaLNESmft4uxOJsfph2C1INOu6iDTXL9gIUlR+SvWCWQ0CQK
 cwcD4Vr1ksbbBcV+6kg4Up/KpUjdt3BQbs2/cOHEeeR6w6QAorwPeu9dcc1Jv5P5abW3
 80oQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1735509306; x=1736114106;
 h=to:subject:message-id:date:from:mime-version:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=SezE+k8D2KqA/TRu4JurNjDs/CC+05H0eC3S8E/fXfc=;
 b=kefmXG+qM/uj5P1EKCMX4F2NnmsXJleTdjXxlHp5gSeWW6j6+X3SlLgtgsK6tVLeD3
 Lvo65qZfisA99MRRpjLHYn9UEPYRLTAN8tOZViN6iSNn0++w6GVYS3J15TXzmoSiCG1P
 b0srLibp/AZ9QSS9Wk/eMWhBIuORY/zuPEYheE/k8SKj+zTE+bNJgNIsg6D2KolCT6Nv
 mn1DbqMz76XT+acOo2e3NWkTRQhl2V/ORflSfsZEh1DT1pY4uS6yvfWMLX1aIEJ2e+6T
 FJ77WSS6+WHpZUGSY4c5Y8Ca/YmZCtFZtYnn/Nbws1afwR3QwjpzWi+Kpn93tmCc01fO
 Q+5A==
X-Gm-Message-State: AOJu0Yx3sZFkMrjMyBw2bpzWvBe/K306kMHvfzVgssh7t5dZW8VkQ4+l
 a7zwMOHea1tRAoq35FAtxp/k22CfPyBFPCudOUWtgN0rC9wSx5++dEHtMWkqCEvq9QdxZHd2lq7
 tG4Nj9n1zcE67hRL2GwLXTSOng3dfyw==
X-Gm-Gg: ASbGncs/kTBAWekJEzlvN5Oekl0NeuhZ9x2jOQw5W5rYVWQ2odEZdSLQxyKC6KOcMdV
 Bzg+BWlNk3twd2Ar+8LmkC27Nsgp1w63xA4jgugTl
X-Google-Smtp-Source: AGHT+IHXqF5wL9aCICkvAYwD947I0vGJxRBofHHV0cu0IVFTXYkpxXEidCJM1iSWTlOKMa0XGEawTg9yAZ33w5yiRA0=
X-Received: by 2002:a05:6102:2c83:b0:4af:56a8:737c with SMTP id
 ada2fe7eead31-4b2cc37dc54mr29706773137.12.1735509305912; Sun, 29 Dec 2024
 13:55:05 -0800 (PST)
MIME-Version: 1.0
From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Date: Sun, 29 Dec 2024 21:54:54 +0000
Message-ID: <CAADuFnJDptr3fw_JxaYN8G_ZxjGFkn-2XtYFWeK6dDLMnZHO2g@HIDDEN>
Content-Type: text/plain; charset="UTF-8"
X-Spam-Score: 0.0 (/)
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 (-)

Added a new patch to add a few helper functions to clean up operations
which modify the package.json file such as removing and replacing
fields.

The first patch is the same as above, use (json) instead of (guix
build json), and the second patch expands on the first by introducing
new exported procedures.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#74900] [PATCH 1/2] Replace (guix build json) with (json) in node-build-system
References: <CAADuFnKAGHb2=rTFiwD9yXN3=OKbZdragGaCJJ0BkOhofDb2KQ@HIDDEN>
In-Reply-To: <CAADuFnKAGHb2=rTFiwD9yXN3=OKbZdragGaCJJ0BkOhofDb2KQ@HIDDEN>
Resent-From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 29 Dec 2024 21:58:02 +0000
Resent-Message-ID: <handler.74900.B74900.173550947930217 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 74900
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 74900 <at> debbugs.gnu.org
Received: via spool by 74900-submit <at> debbugs.gnu.org id=B74900.173550947930217
          (code B ref 74900); Sun, 29 Dec 2024 21:58:02 +0000
Received: (at 74900) by debbugs.gnu.org; 29 Dec 2024 21:57:59 +0000
Received: from localhost ([127.0.0.1]:56442 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tS1IL-0007rH-FF
	for submit <at> debbugs.gnu.org; Sun, 29 Dec 2024 16:57:59 -0500
Received: from mail-vs1-f46.google.com ([209.85.217.46]:53363)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <d.khodabakhsh@HIDDEN>) id 1tS1IH-0007r7-Bz
 for 74900 <at> debbugs.gnu.org; Sun, 29 Dec 2024 16:57:56 -0500
Received: by mail-vs1-f46.google.com with SMTP id
 ada2fe7eead31-4afdf096fc5so1683651137.2
 for <74900 <at> debbugs.gnu.org>; Sun, 29 Dec 2024 13:57:53 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1735509413; x=1736114213; darn=debbugs.gnu.org;
 h=to:subject:message-id:date:from:mime-version:from:to:cc:subject
 :date:message-id:reply-to;
 bh=y29xI7/HjQNcavu2BLXnDB4H2II5x3SK1yC0ImOdzC0=;
 b=jpU3YMHFhyPq6xC4D7T6L6VbuTlh2rQ2OhX4NjMOltOpyrgX9ir618Ue2u1NQX89rE
 FvW1x5um5odX2ZFGyxQg9vj1FJJUNrqU4nNVs+c34zj9yuw4hieK7eJn+XOZ5vzmGm0c
 krmhdiKIaoZElEfnN2i7ygd46byPjj5m/bF/S13hDE7sGaKSFEs+RDO5UBt07GixzW4P
 Rynyqk7m7DyvJ8EadZPee7xJ1cXx3yVUYcOE9ipSz5vZdHE0aF+jYnUpgRDRIMOAf1Fg
 LV27Lwhf/HVnXSWFelFu6qlvWXBz6+MjmsVptESe7EV9aWNS/TQ72iBn28j+WYhiQk6B
 qoqA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1735509413; x=1736114213;
 h=to:subject:message-id:date:from:mime-version:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=y29xI7/HjQNcavu2BLXnDB4H2II5x3SK1yC0ImOdzC0=;
 b=NjI/uMYmTEVkifQA1rUY3vpbaKPDnbZ0vhVceQ8mNcLN1iPxid+W9kBRZUVB5meZfQ
 zACjBlvcQE3KKpzrHKnEOqas/pT5U1pGegN/IOEXEW1I8vlSRJUnUt0Azl/NwqmL21/3
 CSFCh0Op3xyweul0y+/W9pGU2yutwRORgoiALGYYN8D37OWkyAtYP05vhMB/LUkgn01R
 XbmIjDVXyyjiuQzSq3kcHq/6+Xo9wjV6lI8gTMc+FJNbIsEqlaVJkTkCd7JBOb3Ykplj
 ILgjBICIXkS4JqZdDBJZq/mmh+lQkIzQRAFgW3tYxpVrYJkYn7AMdfE0zcppE7e/tA/e
 W14g==
X-Gm-Message-State: AOJu0YziomzaQcr+KZjfCNB+kiXuDoezFF5wNOE4b05wuRyaqqfQYtS6
 2dKtAiIhc57e6vvrKNduhHU/HtrtMN69W9J7PLwSGi/ELYLJwmu9cJ9aJqo8lf+hgukNWcH4Ter
 D9acEDLyCjwckpTw4bOt0rWXd5hwywETC
X-Gm-Gg: ASbGnctIbHyJElQV2c8u8QWtin0LoHMgqKXtO2meStpnm8P04D2mGsP2Z9SRZv7VtTt
 djHqGcXY4f0GQ00ywbqNxKhLuQ8rtoJFGZEH2A/u8
X-Google-Smtp-Source: AGHT+IGbXipe6KoakFjQoQkgHO4oonWKQxOnlWRJQQZnEFLDSCYmrZgr/CuOvVSLJE91kE8aW7wrD2bDhJTJOV8kxQ8=
X-Received: by 2002:a05:6102:5487:b0:4af:ba51:a25f with SMTP id
 ada2fe7eead31-4b2cc463e8amr27866700137.20.1735509412517; Sun, 29 Dec 2024
 13:56:52 -0800 (PST)
MIME-Version: 1.0
From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Date: Sun, 29 Dec 2024 21:56:41 +0000
Message-ID: <CAADuFnLPZOF-7dT36ZwOR=L6v7YWbnNsZYnRHt2Q9XUpCTzDfQ@HIDDEN>
Content-Type: multipart/mixed; boundary="00000000000009b154062a6fc654"
X-Spam-Score: 0.0 (/)
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 (-)

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

This change replaces the use of (guix build json) with (json) for the
node ecosystem.
Since guile-json is a dependency of Guix, and it's used elsewhere in
the project, it makes sense to use this instead of rolling our own
JSON implementation with (guix build json).

(guix build json) also has a few issues:
 - write-json escapes forward slashes in strings for some reason ("/"
become "\/")
 - read-json produces a structure similar to an association list but
with '@' to indicate an object, making it not possible to use
association list procedures directly.

This is one step to move away from (guix build json), there will be
other changes to remove the other uses of it.

Signed-off-by: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Change-Id: I9fd5152a98b6a241d414e9a94ab179c9cabcfb85
---
 gnu/packages/node-xyz.scm        | 148 ++++++++++++-------------
 guix/build-system/node.scm       |   6 +-
 guix/build/node-build-system.scm | 180 ++++++++++++-------------------
 3 files changed, 139 insertions(+), 195 deletions(-)

diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm
index e98eda2a01..ec3f9fbfb1 100644
--- a/gnu/packages/node-xyz.scm
+++ b/gnu/packages/node-xyz.scm
@@ -7,6 +7,7 @@
 ;;; Copyright =C2=A9 2021 Dhruvin Gandhi <contact@HIDDEN>
 ;;; Copyright =C2=A9 2022 Nicolas Graves <ngraves@HIDDEN>
 ;;; Copyright =C2=A9 2023 Jelle Licht <jlicht@HIDDEN>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -24,14 +25,14 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

 (define-module (gnu packages node-xyz)
-  #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu packages sqlite)
   #:use-module (gnu packages python)
   #:use-module (gnu packages web)
+  #:use-module (guix build-system node)
   #:use-module (guix gexp)
-  #:use-module (guix packages)
   #:use-module (guix git-download)
-  #:use-module (guix build-system node))
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages))

 ;;;
 ;;; Please: Try to add new module packages in alphabetic order.
@@ -69,19 +70,17 @@ (define-public node-acorn
              ;; it would try to use the build environment and would block =
the
              ;; automatic building by other packages making use of node-ac=
orn.
              ;; TODO: Add utility function
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (cons '@ (map (match-lambda
-                                  (("scripts" @ . scripts-alist)
-                                   `("scripts" @ ,@(filter (match-lambda
-                                                             (("prepare" .=
 _)
-                                                              #f)
-                                                             (_
-                                                              #t))
-                                                           scripts-alist))=
)
-                                  (other other))
-                                pkg-meta-alist)))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (filter
+                       (match-lambda
+                         (("prepare" . _) #f)
+                         (_ #t))
+                       scripts-alist)))
+                   (other other))
+                 pkg-meta-alist)))))
          (replace 'build
            (lambda* (#:key inputs native-inputs #:allow-other-keys)
              (let ((esbuild (search-input-file (or native-inputs inputs)
@@ -158,23 +157,17 @@ (define-public node-addon-api
            (lambda args
              (define new-test-script
                "echo stopping after pretest on Guix")
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (cons
-                   '@
-                   (map (match-lambda
-                          (("scripts" '@ . scripts-alist)
-                           `("scripts" @ ,@(map (match-lambda
-                                                  (("test" . _)
-                                                   (cons "test"
-                                                         new-test-script))
-                                                  (other
-                                                   other))
-                                                scripts-alist)))
-                          (other
-                           other))
-                        pkg-meta-alist))))))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (map
+                       (match-lambda
+                         (("test" . _) (cons "test" new-test-script))
+                         (other other))
+                       scripts-alist)))
+                   (other other))
+                 pkg-meta-alist))))))))
     (home-page "https://github.com/nodejs/node-addon-api")
     (synopsis "Node.js API (Node-API) header-only C++ wrappers")
     (description "This module contains header-only C++ wrapper classes whi=
ch
@@ -1223,22 +1216,19 @@ (define-public node-serialport-bindings
                                     "node-abi"))))
          (add-after 'chdir 'avoid-prebuild-install
            (lambda args
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (cons '@ (map (match-lambda
-                                  (("scripts" @ . scripts-alist)
-                                   `("scripts" @ ,@(filter (match-lambda
-                                                             (("install" .=
 _)
-                                                              #f)
-                                                             (_
-                                                              #t))
-                                                           scripts-alist))=
)
-                                  (("gypfile" . _)
-                                   '("gypfile" . #f))
-                                  (other
-                                   other))
-                                pkg-meta-alist))))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (filter
+                       (match-lambda
+                         (("install" . _) #f)
+                         (_ #t))
+                       scripts-alist)))
+                   (("gypfile" . _)
+                     (cons "gypfile" #f))
+                   (other other))
+                 pkg-meta-alist))))))
        #:tests? #f))
     (synopsis "Abstract base class for Node SerialPort bindings")
     (description "Node SerialPort is a modular suite of Node.js packages f=
or
@@ -1524,39 +1514,33 @@ (define-public node-sqlite3
              (substitute* ".npmignore"
                (("lib/binding")
                 "#lib/binding # <- patched for Guix"))
-             (with-atomic-json-file-replacement "package.json"
-               (match-lambda
-                 (('@ . pkg-meta-alist)
-                  (match (assoc-ref pkg-meta-alist "binary")
-                    (('@ . binary-alist)
-                     ;; When it builds from source, node-pre-gyp supplies
-                     ;; module_name and module_path based on the entries u=
nder
-                     ;; "binary" from "package.json", so this package's
-                     ;; "binding.gyp" doesn't define them. Thus, we also n=
eed
-                     ;; to supply them. The GYP_DEFINES environment variab=
le
-                     ;; turns out to be the easiest way to make sure they =
are
-                     ;; propagated from npm to node-gyp to gyp.
-                     (setenv "GYP_DEFINES"
-                             (string-append
-                              "module_name=3D"
-                              (assoc-ref binary-alist "module_name")
-                              " "
-                              "module_path=3D"
-                              (assoc-ref binary-alist "module_path")))))
-                  ;; We need to remove the install script from "package.js=
on",
-                  ;; as it would try to use node-pre-gyp and would block t=
he
-                  ;; automatic building performed by `npm install`.
-                  (cons '@ (map (match-lambda
-                                  (("scripts" @ . scripts-alist)
-                                   `("scripts" @ ,@(filter (match-lambda
-                                                             (("install" .=
 _)
-                                                              #f)
-                                                             (_
-                                                              #t))
-                                                           scripts-alist))=
)
-                                  (other
-                                   other))
-                                pkg-meta-alist))))))))))
+             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
+               (let ((binary-alist (assoc-ref pkg-meta-alist "binary")))
+                 ;; When it builds from source, node-pre-gyp supplies
+                 ;; module_name and module_path based on the entries under
+                 ;; "binary" from "package.json", so this package's
+                 ;; "binding.gyp" doesn't define them. Thus, we also need
+                 ;; to supply them. The GYP_DEFINES environment variable
+                 ;; turns out to be the easiest way to make sure they are
+                 ;; propagated from npm to node-gyp to gyp.
+                 (setenv "GYP_DEFINES" (string-append
+                   "module_name=3D"
+                   (assoc-ref binary-alist "module_name")
+                   " module_path=3D"
+                   (assoc-ref binary-alist "module_path"))))
+               ;; We need to remove the install script from "package.json"=
,
+               ;; as it would try to use node-pre-gyp and would block the
+               ;; automatic building performed by `npm install`.
+               (map
+                 (match-lambda
+                   (("scripts" . scripts-alist)
+                     (cons "scripts" (filter
+                       (match-lambda
+                         (("install" . _) #f)
+                         (_ #t))
+                       scripts-alist)))
+                   (other other))
+                 pkg-meta-alist))))))))
     (home-page "https://github.com/mapbox/node-sqlite3")
     (synopsis "Node.js bindings for SQLite3")
     (description
diff --git a/guix/build-system/node.scm b/guix/build-system/node.scm
index 57fe5f6030..425b8cd9b3 100644
--- a/guix/build-system/node.scm
+++ b/guix/build-system/node.scm
@@ -4,6 +4,7 @@
 ;;; Copyright =C2=A9 2021 Ludovic Court=C3=A8s <ludo@HIDDEN>
 ;;; Copyright =C2=A9 2021 Pierre Langlois <pierre.langlois@HIDDEN>
 ;;; Copyright =C2=A9 2021 Philip McGrath <philip@HIDDEN>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -36,7 +37,10 @@ (define-module (guix build-system node)
 (define %node-build-system-modules
   ;; Build-side modules imported by default.
   `((guix build node-build-system)
-    (guix build json)
+    (json)
+    (json builder)
+    (json parser)
+    (json record)
     ,@%default-gnu-imported-modules))

 (define (default-node)
diff --git a/guix/build/node-build-system.scm b/guix/build/node-build-syste=
m.scm
index fb23894bc1..df7ea7774c 100644
--- a/guix/build/node-build-system.scm
+++ b/guix/build/node-build-system.scm
@@ -4,6 +4,7 @@
 ;;; Copyright =C2=A9 2019, 2021 Timothy Sample <samplet@HIDDEN>
 ;;; Copyright =C2=A9 2021, 2022 Philip McGrath <philip@HIDDEN>
 ;;; Copyright =C2=A9 2022 Liliana Marie Prikler <liliana.prikler@HIDDEN=
>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -23,10 +24,10 @@
 (define-module (guix build node-build-system)
   #:use-module ((guix build gnu-build-system) #:prefix gnu:)
   #:use-module (guix build utils)
-  #:use-module (guix build json)
   #:use-module (ice-9 ftw)
   #:use-module (ice-9 regex)
   #:use-module (ice-9 match)
+  #:use-module (json)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-71)
   #:export (%standard-phases
@@ -34,13 +35,14 @@ (define-module (guix build node-build-system)
             delete-dependencies
             node-build))

-(define (with-atomic-json-file-replacement file proc)
+(define* (with-atomic-json-file-replacement proc
+  #:optional (file "package.json"))
   "Like 'with-atomic-file-replacement', but PROC is called with a single
 argument---the result of parsing FILE's contents as json---and should a va=
lue
 to be written as json to the replacement FILE."
   (with-atomic-file-replacement file
     (lambda (in out)
-      (write-json (proc (read-json in)) out))))
+      (scm->json (proc (json->scm in)) out))))

 (define* (assoc-ref* alist key #:optional default)
   "Like assoc-ref, but return DEFAULT instead of #f if no value exists."
@@ -48,10 +50,6 @@ (define* (assoc-ref* alist key #:optional default)
     (#f default)
     ((_ . value) value)))

-(define* (jsobject-ref obj key #:optional default)
-  (match obj
-    (('@ . alist) (assoc-ref* alist key default))))
-
 (define* (alist-pop alist key #:optional (=3D equal?))
   "Return two values, the first pair in ALIST with key KEY, and the other
 elements.  Equality calls are made as (=3D KEY ALISTCAR)."
@@ -63,67 +61,17 @@ (define* (alist-pop alist key #:optional (=3D equal?))
         (values (car after) (append before (cdr after)))
         (values #f before))))

-(define* (alist-update alist key proc #:optional default (=3D equal?))
+(define* (alist-update alist key proc #:optional (=3D equal?))
   "Return an association list like ALIST, but with KEY mapped to the resul=
t of
 PROC applied to the first value found under the comparison (=3D KEY ALISTC=
AR).
-If no such value exists, use DEFAULT instead.
+If no such value exists, return the list unchanged.
 Unlike acons, this removes the previous association of KEY (assuming it is
 unique), but the result may still share storage with ALIST."
   (let ((pair rest (alist-pop alist key =3D)))
-    (acons key
-           (proc (if (pair? pair)
-                     (cdr pair)
-                     default))
-           rest)))
-
-(define (jsobject-update* js . updates)
-  "Return a json object like JS, but with all UPDATES applied.  Each updat=
e is
-a list (KEY PROC [DEFAULT]), so that KEY is mapped to the result of PROC
-applied to the value to which KEY is mapped in JS.  If no such mapping exi=
sts,
-PROC is instead applied to DEFAULT, or to '#f' is no DEFAULT is specified.
-The update takes place from left to right, so later UPDATERs will receive =
the
-values returned by earlier UPDATERs for the same KEY."
-  (match js
-    (('@ . alist)
-     (let loop ((alist alist)
-                (updates updates))
-       (match updates
-         (() (cons '@ alist))
-         (((key proc) . updates)
-          (loop (alist-update alist key proc #f equal?) updates))
-         (((key proc default) . updates)
-          (loop (alist-update alist key proc default equal?) updates))))))=
)
-
-(define (jsobject-union combine seed . objects)
-  "Merge OBJECTS into SEED by applying (COMBINE KEY VAL0 VAL), where VAL0
-is the value found in the (possibly updated) SEED and VAL is the new value
-found in one of the OBJECTS."
-  (match seed
-    (('@ . aseed)
-     (match objects
-       (() seed)
-       ((('@ . alists) ...)
-        (cons
-         '@
-         (fold (lambda (alist aseed)
-                 (if (null? aseed) alist
-                     (fold
-                      (match-lambda*
-                        (((k . v) aseed)
-                         (let ((pair tail (alist-pop alist k)))
-                           (match pair
-                             (#f (acons k v aseed))
-                             ((_ . v0) (acons k (combine k v0 v) aseed))))=
))
-                      aseed
-                      alist)))
-               aseed
-               alists)))))))
+    (if (pair? pair)
+      (acons key (proc (cdr pair)) rest)
+      alist)))

-;; Possibly useful helper functions:
-;; (define (newest key val0 val) val)
-;; (define (unkeyed->keyed proc) (lambda (_key val0 val) (proc val0 val)))
-
-
 ;;;
 ;;; Phases.
 ;;;
@@ -142,8 +90,8 @@ (define (set-home . _)

 (define (module-name module)
   (let* ((package.json (string-append module "/package.json"))
-         (package-meta (call-with-input-file package.json read-json)))
-    (jsobject-ref package-meta "name")))
+         (package-meta (call-with-input-file package.json json->scm)))
+    (assoc-ref package-meta "name")))

 (define (index-modules input-paths)
   (define (list-modules directory)
@@ -167,49 +115,59 @@ (define* (patch-dependencies #:key inputs
#:allow-other-keys)

   (define index (index-modules (map cdr inputs)))

-  (define resolve-dependencies
-    (match-lambda
-      (('@ . alist)
-       (cons '@ (map (match-lambda
-                       ((key . value)
-                        (cons key (hash-ref index key value))))
-                     alist)))))
+  (define (resolve-dependencies dependencies)
+    (map
+      (match-lambda
+        ((dependency . version)
+          (cons dependency (hash-ref index dependency version))))
+      dependencies))

-  (with-atomic-json-file-replacement "package.json"
+  (with-atomic-json-file-replacement
     (lambda (pkg-meta)
-      (jsobject-update*
-       pkg-meta
-       `("devDependencies" ,resolve-dependencies (@))
-       `("dependencies" ,(lambda (deps)
-                           (resolve-dependencies
-                            (jsobject-union
-                             (lambda (k a b) b)
-                             (jsobject-ref pkg-meta "peerDependencies" '(@=
))
-                             deps)))
-         (@)))))
+      (fold
+        (lambda (proc pkg-meta) (proc pkg-meta))
+        pkg-meta
+        (list
+          (lambda (pkg-meta)
+            (alist-update pkg-meta "devDependencies" resolve-dependencies)=
)
+          (lambda (pkg-meta)
+            (assoc-set!
+              pkg-meta
+              "dependencies"
+              (resolve-dependencies
+                ; Combined "peerDependencies" and "dependencies" dependenc=
ies
+                ; with "dependencies" taking precedent.
+                (fold
+                  (lambda (dependency dependencies)
+                    (assoc-set! dependencies (car dependency) (cdr
dependency)))
+                  (assoc-ref* pkg-meta "peerDependencies" '())
+                  (assoc-ref* pkg-meta "dependencies" '())))))))))
   #t)

-(define (delete-dependencies absent)
+(define (delete-dependencies dependencies-to-remove)
   "Rewrite 'package.json' to allow the build to proceed without packages
-listed in ABSENT, a list of strings naming npm packages.
+listed in 'dependencies-to-remove', a list of strings naming npm packages.

 To prevent the deleted dependencies from being reintroduced, use this func=
tion
 only after the 'patch-dependencies' phase."
-  (define delete-from-jsobject
-    (match-lambda
-      (('@ . alist)
-       (cons '@ (filter (match-lambda
-                          ((k . _)
-                           (not (member k absent))))
-                        alist)))))
-
-  (with-atomic-json-file-replacement "package.json"
+  (with-atomic-json-file-replacement
     (lambda (pkg-meta)
-      (jsobject-update*
-       pkg-meta
-       `("devDependencies" ,delete-from-jsobject (@))
-       `("dependencies" ,delete-from-jsobject (@))
-       `("peerDependencies" ,delete-from-jsobject (@))))))
+      (fold
+        (lambda (dependency-key pkg-meta)
+          (alist-update
+            pkg-meta
+            dependency-key
+            (lambda (dependencies)
+              (remove
+                (lambda (dependency)
+                  (member (car dependency) dependencies-to-remove))
+                dependencies))))
+        pkg-meta
+        (list
+          "devDependencies"
+          "dependencies"
+          "peerDependencies"
+          "optionalDependencies")))))

 (define* (delete-lockfiles #:key inputs #:allow-other-keys)
   "Delete 'package-lock.json', 'yarn.lock', and 'npm-shrinkwrap.json', if =
they
@@ -228,8 +186,8 @@ (define* (configure #:key outputs inputs #:allow-other-=
keys)
     #t))

 (define* (build #:key inputs #:allow-other-keys)
-  (let ((package-meta (call-with-input-file "package.json" read-json)))
-    (if (jsobject-ref (jsobject-ref package-meta "scripts" '(@)) "build" #=
f)
+  (let ((package-meta (call-with-input-file "package.json" json->scm)))
+    (if (assoc-ref* (assoc-ref* package-meta "scripts" '()) "build" #f)
         (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm")))
           (invoke npm "run" "build"))
         (format #t "there is no build script to run~%"))
@@ -301,22 +259,20 @@ (define* (avoid-node-gyp-rebuild #:key outputs
#:allow-other-keys)
   ;; even need to overwrite this file.  Therefore, let's use some helpers
   ;; that we'd otherwise not need.
   (define pkg-meta
-    (call-with-input-file installed-package.json read-json))
+    (call-with-input-file installed-package.json json->scm))
   (define scripts
-    (jsobject-ref pkg-meta "scripts" '(@)))
-  (define (jsobject-set js key val)
-    (jsobject-update* js (list key (const val))))
+    (assoc-ref* pkg-meta "scripts" '()))

-  (when (equal? "node-gyp rebuild" (jsobject-ref scripts "install" #f))
+  (when (equal? "node-gyp rebuild" (assoc-ref* scripts "install" #f))
     (call-with-output-file installed-package.json
       (lambda (out)
-        (write-json
-         (jsobject-set pkg-meta
-                       "scripts"
-                       (jsobject-set scripts
-                                     "install"
-                                     "echo Guix: avoiding node-gyp rebuild=
"))
-         out)))))
+        (scm->json
+          (assoc-set! pkg-meta
+                      "scripts"
+                      (assoc-set! scripts
+                                  "install"
+                                  "echo Guix: avoiding node-gyp rebuild"))
+          out)))))

 (define %standard-phases
   (modify-phases gnu:%standard-phases

base-commit: e16cdcf37d8223b3634ec5e658356c3b7f154859
--=20
2.46.0

--00000000000009b154062a6fc654
Content-Type: text/x-patch; charset="UTF-8"; 
	name="0001-Replace-guix-build-json-with-json-in-node-build-system.patch"
Content-Disposition: attachment; 
	filename="0001-Replace-guix-build-json-with-json-in-node-build-system.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_m5a5h8fy0>
X-Attachment-Id: f_m5a5h8fy0

RnJvbSBlNGVhN2I4OGNlMzliMWY1YjI0ODE4MTc0ZjJlNWMxNzQyNGYzYWRjIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpNZXNzYWdlLUlEOiA8ZTRlYTdiODhjZTM5YjFmNWIyNDgxODE3NGYyZTVj
MTc0MjRmM2FkYy4xNzM1NDk4MTgzLmdpdC5kLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KRnJvbTog
RGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KRGF0ZTogVGh1LCAy
NiBEZWMgMjAyNCAwNDozNTozOSAtMDgwMApTdWJqZWN0OiBbUEFUQ0ggMS8yXSBSZXBsYWNlIChn
dWl4IGJ1aWxkIGpzb24pIHdpdGggKGpzb24pIGluIAogbm9kZS1idWlsZC1zeXN0ZW0KClRoaXMg
Y2hhbmdlIHJlcGxhY2VzIHRoZSB1c2Ugb2YgKGd1aXggYnVpbGQganNvbikgd2l0aCAoanNvbikg
Zm9yIHRoZSBub2RlIGVjb3N5c3RlbS4KU2luY2UgZ3VpbGUtanNvbiBpcyBhIGRlcGVuZGVuY3kg
b2YgR3VpeCwgYW5kIGl0J3MgdXNlZCBlbHNld2hlcmUgaW4gdGhlIHByb2plY3QsIGl0IG1ha2Vz
IHNlbnNlIHRvIHVzZSB0aGlzIGluc3RlYWQgb2Ygcm9sbGluZyBvdXIgb3duIEpTT04gaW1wbGVt
ZW50YXRpb24gd2l0aCAoZ3VpeCBidWlsZCBqc29uKS4KCihndWl4IGJ1aWxkIGpzb24pIGFsc28g
aGFzIGEgZmV3IGlzc3VlczoKIC0gd3JpdGUtanNvbiBlc2NhcGVzIGZvcndhcmQgc2xhc2hlcyBp
biBzdHJpbmdzIGZvciBzb21lIHJlYXNvbiAoIi8iIGJlY29tZSAiXC8iKQogLSByZWFkLWpzb24g
cHJvZHVjZXMgYSBzdHJ1Y3R1cmUgc2ltaWxhciB0byBhbiBhc3NvY2lhdGlvbiBsaXN0IGJ1dCB3
aXRoICdAJyB0byBpbmRpY2F0ZSBhbiBvYmplY3QsIG1ha2luZyBpdCBub3QgcG9zc2libGUgdG8g
dXNlIGFzc29jaWF0aW9uIGxpc3QgcHJvY2VkdXJlcyBkaXJlY3RseS4KClRoaXMgaXMgb25lIHN0
ZXAgdG8gbW92ZSBhd2F5IGZyb20gKGd1aXggYnVpbGQganNvbiksIHRoZXJlIHdpbGwgYmUgb3Ro
ZXIgY2hhbmdlcyB0byByZW1vdmUgdGhlIG90aGVyIHVzZXMgb2YgaXQuCgpTaWduZWQtb2ZmLWJ5
OiBEYW5pZWwgS2hvZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21haWwuY29tPgpDaGFuZ2UtSWQ6
IEk5ZmQ1MTUyYTk4YjZhMjQxZDQxNGU5YTk0YWIxNzljOWNhYmNmYjg1Ci0tLQogZ251L3BhY2th
Z2VzL25vZGUteHl6LnNjbSAgICAgICAgfCAxNDggKysrKysrKysrKysrLS0tLS0tLS0tLS0tLQog
Z3VpeC9idWlsZC1zeXN0ZW0vbm9kZS5zY20gICAgICAgfCAgIDYgKy0KIGd1aXgvYnVpbGQvbm9k
ZS1idWlsZC1zeXN0ZW0uc2NtIHwgMTgwICsrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0K
IDMgZmlsZXMgY2hhbmdlZCwgMTM5IGluc2VydGlvbnMoKyksIDE5NSBkZWxldGlvbnMoLSkKCmRp
ZmYgLS1naXQgYS9nbnUvcGFja2FnZXMvbm9kZS14eXouc2NtIGIvZ251L3BhY2thZ2VzL25vZGUt
eHl6LnNjbQppbmRleCBlOThlZGEyYTAxLi5lYzNmOWZiZmIxIDEwMDY0NAotLS0gYS9nbnUvcGFj
a2FnZXMvbm9kZS14eXouc2NtCisrKyBiL2dudS9wYWNrYWdlcy9ub2RlLXh5ei5zY20KQEAgLTcs
NiArNyw3IEBACiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEgRGhydXZpbiBHYW5kaGkgPGNvbnRhY3RA
ZGhydXZpbi5kZXY+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjIgTmljb2xhcyBHcmF2ZXMgPG5ncmF2
ZXNAbmdyYXZlcy5mcj4KIDs7OyBDb3B5cmlnaHQgwqkgMjAyMyBKZWxsZSBMaWNodCA8amxpY2h0
QGZzZmUub3JnPgorOzs7IENvcHlyaWdodCDCqSAyMDI0IERhbmllbCBLaG9kYWJha2hzaCA8ZC5r
aG9kYWJha2hzaEBnbWFpbC5jb20+CiA7OzsKIDs7OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUg
R3VpeC4KIDs7OwpAQCAtMjQsMTQgKzI1LDE0IEBACiA7OzsgYWxvbmcgd2l0aCBHTlUgR3VpeC4g
IElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIAogKGRlZmluZS1t
b2R1bGUgKGdudSBwYWNrYWdlcyBub2RlLXh5eikKLSAgIzp1c2UtbW9kdWxlICgoZ3VpeCBsaWNl
bnNlcykgIzpwcmVmaXggbGljZW5zZTopCiAgICM6dXNlLW1vZHVsZSAoZ251IHBhY2thZ2VzIHNx
bGl0ZSkKICAgIzp1c2UtbW9kdWxlIChnbnUgcGFja2FnZXMgcHl0aG9uKQogICAjOnVzZS1tb2R1
bGUgKGdudSBwYWNrYWdlcyB3ZWIpCisgICM6dXNlLW1vZHVsZSAoZ3VpeCBidWlsZC1zeXN0ZW0g
bm9kZSkKICAgIzp1c2UtbW9kdWxlIChndWl4IGdleHApCi0gICM6dXNlLW1vZHVsZSAoZ3VpeCBw
YWNrYWdlcykKICAgIzp1c2UtbW9kdWxlIChndWl4IGdpdC1kb3dubG9hZCkKLSAgIzp1c2UtbW9k
dWxlIChndWl4IGJ1aWxkLXN5c3RlbSBub2RlKSkKKyAgIzp1c2UtbW9kdWxlICgoZ3VpeCBsaWNl
bnNlcykgIzpwcmVmaXggbGljZW5zZTopCisgICM6dXNlLW1vZHVsZSAoZ3VpeCBwYWNrYWdlcykp
CiAKIDs7OwogOzs7IFBsZWFzZTogVHJ5IHRvIGFkZCBuZXcgbW9kdWxlIHBhY2thZ2VzIGluIGFs
cGhhYmV0aWMgb3JkZXIuCkBAIC02OSwxOSArNzAsMTcgQEAgKGRlZmluZS1wdWJsaWMgbm9kZS1h
Y29ybgogICAgICAgICAgICAgIDs7IGl0IHdvdWxkIHRyeSB0byB1c2UgdGhlIGJ1aWxkIGVudmly
b25tZW50IGFuZCB3b3VsZCBibG9jayB0aGUKICAgICAgICAgICAgICA7OyBhdXRvbWF0aWMgYnVp
bGRpbmcgYnkgb3RoZXIgcGFja2FnZXMgbWFraW5nIHVzZSBvZiBub2RlLWFjb3JuLgogICAgICAg
ICAgICAgIDs7IFRPRE86IEFkZCB1dGlsaXR5IGZ1bmN0aW9uCi0gICAgICAgICAgICAgKHdpdGgt
YXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAicGFja2FnZS5qc29uIgotICAgICAgICAgICAg
ICAgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAoKCdAIC4gcGtnLW1ldGEtYWxpc3Qp
Ci0gICAgICAgICAgICAgICAgICAoY29ucyAnQCAobWFwIChtYXRjaC1sYW1iZGEKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiBAIC4gc2NyaXB0cy1hbGlzdCkK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCgic2NyaXB0cyIgQCAsQChmaWx0
ZXIgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICgoInByZXBhcmUiIC4gXykKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2YpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF8K
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgI3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBzY3JpcHRzLWFsaXN0KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgKG90aGVyIG90aGVyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cGtnLW1ldGEtYWxpc3QpKSkpKSkpCisgICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmls
ZS1yZXBsYWNlbWVudCAobGFtYmRhIChwa2ctbWV0YS1hbGlzdCkKKyAgICAgICAgICAgICAgICht
YXAKKyAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAgICgo
InNjcmlwdHMiIC4gc2NyaXB0cy1hbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgIChjb25zICJz
Y3JpcHRzIiAoZmlsdGVyCisgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAoKCJwcmVwYXJlIiAuIF8pICNmKQorICAgICAgICAgICAg
ICAgICAgICAgICAgIChfICN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cy1hbGlz
dCkpKQorICAgICAgICAgICAgICAgICAgIChvdGhlciBvdGhlcikpCisgICAgICAgICAgICAgICAg
IHBrZy1tZXRhLWFsaXN0KSkpKSkKICAgICAgICAgIChyZXBsYWNlICdidWlsZAogICAgICAgICAg
ICAobGFtYmRhKiAoIzprZXkgaW5wdXRzIG5hdGl2ZS1pbnB1dHMgIzphbGxvdy1vdGhlci1rZXlz
KQogICAgICAgICAgICAgIChsZXQgKChlc2J1aWxkIChzZWFyY2gtaW5wdXQtZmlsZSAob3IgbmF0
aXZlLWlucHV0cyBpbnB1dHMpCkBAIC0xNTgsMjMgKzE1NywxNyBAQCAoZGVmaW5lLXB1YmxpYyBu
b2RlLWFkZG9uLWFwaQogICAgICAgICAgICAobGFtYmRhIGFyZ3MKICAgICAgICAgICAgICAoZGVm
aW5lIG5ldy10ZXN0LXNjcmlwdAogICAgICAgICAgICAgICAgImVjaG8gc3RvcHBpbmcgYWZ0ZXIg
cHJldGVzdCBvbiBHdWl4IikKLSAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNvbi1maWxlLXJl
cGxhY2VtZW50ICJwYWNrYWdlLmpzb24iCi0gICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhCi0g
ICAgICAgICAgICAgICAgICgoJ0AgLiBwa2ctbWV0YS1hbGlzdCkKLSAgICAgICAgICAgICAgICAg
IChjb25zCi0gICAgICAgICAgICAgICAgICAgJ0AKLSAgICAgICAgICAgICAgICAgICAobWFwICht
YXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0cyIgJ0AgLiBz
Y3JpcHRzLWFsaXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYCgic2NyaXB0cyIgQCAs
QChtYXAgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoKCJ0ZXN0IiAuIF8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAoY29ucyAidGVzdCIKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldy10ZXN0LXNjcmlwdCkpCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcgot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIp
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0
cy1hbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG90aGVyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBrZy1tZXRh
LWFsaXN0KSkpKSkpKSkpKQorICAgICAgICAgICAgICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVw
bGFjZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAgICAgICAobWFwCisg
ICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKKyAgICAgICAgICAgICAgICAgICAoKCJzY3Jp
cHRzIiAuIHNjcmlwdHMtYWxpc3QpCisgICAgICAgICAgICAgICAgICAgICAoY29ucyAic2NyaXB0
cyIgKG1hcAorICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAg
ICAgICAgICAgICAgICAgKCgidGVzdCIgLiBfKSAoY29ucyAidGVzdCIgbmV3LXRlc3Qtc2NyaXB0
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAob3RoZXIgb3RoZXIpKQorICAgICAgICAgICAg
ICAgICAgICAgICBzY3JpcHRzLWFsaXN0KSkpCisgICAgICAgICAgICAgICAgICAgKG90aGVyIG90
aGVyKSkKKyAgICAgICAgICAgICAgICAgcGtnLW1ldGEtYWxpc3QpKSkpKSkpKQogICAgIChob21l
LXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS1hZGRvbi1hcGkiKQogICAgIChz
eW5vcHNpcyAiTm9kZS5qcyBBUEkgKE5vZGUtQVBJKSBoZWFkZXItb25seSBDKysgd3JhcHBlcnMi
KQogICAgIChkZXNjcmlwdGlvbiAiVGhpcyBtb2R1bGUgY29udGFpbnMgaGVhZGVyLW9ubHkgQysr
IHdyYXBwZXIgY2xhc3NlcyB3aGljaApAQCAtMTIyMywyMiArMTIxNiwxOSBAQCAoZGVmaW5lLXB1
YmxpYyBub2RlLXNlcmlhbHBvcnQtYmluZGluZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJub2RlLWFiaSIpKSkpCiAgICAgICAgICAoYWRkLWFmdGVyICdjaGRpciAnYXZv
aWQtcHJlYnVpbGQtaW5zdGFsbAogICAgICAgICAgICAobGFtYmRhIGFyZ3MKLSAgICAgICAgICAg
ICAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdlLmpzb24iCi0gICAg
ICAgICAgICAgICAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICgoJ0AgLiBwa2ctbWV0
YS1hbGlzdCkKLSAgICAgICAgICAgICAgICAgIChjb25zICdAIChtYXAgKG1hdGNoLWxhbWJkYQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoInNjcmlwdHMiIEAgLiBzY3JpcHRz
LWFsaXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKCJzY3JpcHRzIiBA
ICxAKGZpbHRlciAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgiaW5zdGFsbCIgLiBfKQotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZikK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAoXwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAjdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAoKCJneXBmaWxlIiAuIF8pCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICcoImd5cGZpbGUiIC4gI2YpKQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIChvdGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhl
cikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkp
KSkKKyAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50IChsYW1i
ZGEgKHBrZy1tZXRhLWFsaXN0KQorICAgICAgICAgICAgICAgKG1hcAorICAgICAgICAgICAgICAg
ICAobWF0Y2gtbGFtYmRhCisgICAgICAgICAgICAgICAgICAgKCgic2NyaXB0cyIgLiBzY3JpcHRz
LWFsaXN0KQorICAgICAgICAgICAgICAgICAgICAgKGNvbnMgInNjcmlwdHMiIChmaWx0ZXIKKyAg
ICAgICAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAgICAg
ICAgICgoImluc3RhbGwiIC4gXykgI2YpCisgICAgICAgICAgICAgICAgICAgICAgICAgKF8gI3Qp
KQorICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzLWFsaXN0KSkpCisgICAgICAgICAgICAg
ICAgICAgKCgiZ3lwZmlsZSIgLiBfKQorICAgICAgICAgICAgICAgICAgICAgKGNvbnMgImd5cGZp
bGUiICNmKSkKKyAgICAgICAgICAgICAgICAgICAob3RoZXIgb3RoZXIpKQorICAgICAgICAgICAg
ICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpKQogICAgICAgICM6dGVzdHM/ICNmKSkKICAgICAoc3lu
b3BzaXMgIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIE5vZGUgU2VyaWFsUG9ydCBiaW5kaW5ncyIp
CiAgICAgKGRlc2NyaXB0aW9uICJOb2RlIFNlcmlhbFBvcnQgaXMgYSBtb2R1bGFyIHN1aXRlIG9m
IE5vZGUuanMgcGFja2FnZXMgZm9yCkBAIC0xNTI0LDM5ICsxNTE0LDMzIEBAIChkZWZpbmUtcHVi
bGljIG5vZGUtc3FsaXRlMwogICAgICAgICAgICAgIChzdWJzdGl0dXRlKiAiLm5wbWlnbm9yZSIK
ICAgICAgICAgICAgICAgICgoImxpYi9iaW5kaW5nIikKICAgICAgICAgICAgICAgICAiI2xpYi9i
aW5kaW5nICMgPC0gcGF0Y2hlZCBmb3IgR3VpeCIpKQotICAgICAgICAgICAgICh3aXRoLWF0b21p
Yy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNvbiIKLSAgICAgICAgICAgICAgICht
YXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgKCgnQCAuIHBrZy1tZXRhLWFsaXN0KQotICAg
ICAgICAgICAgICAgICAgKG1hdGNoIChhc3NvYy1yZWYgcGtnLW1ldGEtYWxpc3QgImJpbmFyeSIp
Ci0gICAgICAgICAgICAgICAgICAgICgoJ0AgLiBiaW5hcnktYWxpc3QpCi0gICAgICAgICAgICAg
ICAgICAgICA7OyBXaGVuIGl0IGJ1aWxkcyBmcm9tIHNvdXJjZSwgbm9kZS1wcmUtZ3lwIHN1cHBs
aWVzCi0gICAgICAgICAgICAgICAgICAgICA7OyBtb2R1bGVfbmFtZSBhbmQgbW9kdWxlX3BhdGgg
YmFzZWQgb24gdGhlIGVudHJpZXMgdW5kZXIKLSAgICAgICAgICAgICAgICAgICAgIDs7ICJiaW5h
cnkiIGZyb20gInBhY2thZ2UuanNvbiIsIHNvIHRoaXMgcGFja2FnZSdzCi0gICAgICAgICAgICAg
ICAgICAgICA7OyAiYmluZGluZy5neXAiIGRvZXNuJ3QgZGVmaW5lIHRoZW0uIFRodXMsIHdlIGFs
c28gbmVlZAotICAgICAgICAgICAgICAgICAgICAgOzsgdG8gc3VwcGx5IHRoZW0uIFRoZSBHWVBf
REVGSU5FUyBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICAgOzsgdHVy
bnMgb3V0IHRvIGJlIHRoZSBlYXNpZXN0IHdheSB0byBtYWtlIHN1cmUgdGhleSBhcmUKLSAgICAg
ICAgICAgICAgICAgICAgIDs7IHByb3BhZ2F0ZWQgZnJvbSBucG0gdG8gbm9kZS1neXAgdG8gZ3lw
LgotICAgICAgICAgICAgICAgICAgICAgKHNldGVudiAiR1lQX0RFRklORVMiCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIChzdHJpbmctYXBwZW5kCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAibW9kdWxlX25hbWU9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFz
c29jLXJlZiBiaW5hcnktYWxpc3QgIm1vZHVsZV9uYW1lIikKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZV9wYXRo
PSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3NvYy1yZWYgYmluYXJ5LWFsaXN0
ICJtb2R1bGVfcGF0aCIpKSkpKQotICAgICAgICAgICAgICAgICAgOzsgV2UgbmVlZCB0byByZW1v
dmUgdGhlIGluc3RhbGwgc2NyaXB0IGZyb20gInBhY2thZ2UuanNvbiIsCi0gICAgICAgICAgICAg
ICAgICA7OyBhcyBpdCB3b3VsZCB0cnkgdG8gdXNlIG5vZGUtcHJlLWd5cCBhbmQgd291bGQgYmxv
Y2sgdGhlCi0gICAgICAgICAgICAgICAgICA7OyBhdXRvbWF0aWMgYnVpbGRpbmcgcGVyZm9ybWVk
IGJ5IGBucG0gaW5zdGFsbGAuCi0gICAgICAgICAgICAgICAgICAoY29ucyAnQCAobWFwIChtYXRj
aC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiBA
IC4gc2NyaXB0cy1hbGlzdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCgi
c2NyaXB0cyIgQCAsQChmaWx0ZXIgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoImluc3RhbGwiIC4gXykK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgI2YpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgKF8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgI3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzLWFsaXN0KSkpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIG90aGVyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtn
LW1ldGEtYWxpc3QpKSkpKSkpKSkpCisgICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmls
ZS1yZXBsYWNlbWVudCAobGFtYmRhIChwa2ctbWV0YS1hbGlzdCkKKyAgICAgICAgICAgICAgIChs
ZXQgKChiaW5hcnktYWxpc3QgKGFzc29jLXJlZiBwa2ctbWV0YS1hbGlzdCAiYmluYXJ5IikpKQor
ICAgICAgICAgICAgICAgICA7OyBXaGVuIGl0IGJ1aWxkcyBmcm9tIHNvdXJjZSwgbm9kZS1wcmUt
Z3lwIHN1cHBsaWVzCisgICAgICAgICAgICAgICAgIDs7IG1vZHVsZV9uYW1lIGFuZCBtb2R1bGVf
cGF0aCBiYXNlZCBvbiB0aGUgZW50cmllcyB1bmRlcgorICAgICAgICAgICAgICAgICA7OyAiYmlu
YXJ5IiBmcm9tICJwYWNrYWdlLmpzb24iLCBzbyB0aGlzIHBhY2thZ2UncworICAgICAgICAgICAg
ICAgICA7OyAiYmluZGluZy5neXAiIGRvZXNuJ3QgZGVmaW5lIHRoZW0uIFRodXMsIHdlIGFsc28g
bmVlZAorICAgICAgICAgICAgICAgICA7OyB0byBzdXBwbHkgdGhlbS4gVGhlIEdZUF9ERUZJTkVT
IGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgIDs7IHR1cm5zIG91dCB0byBi
ZSB0aGUgZWFzaWVzdCB3YXkgdG8gbWFrZSBzdXJlIHRoZXkgYXJlCisgICAgICAgICAgICAgICAg
IDs7IHByb3BhZ2F0ZWQgZnJvbSBucG0gdG8gbm9kZS1neXAgdG8gZ3lwLgorICAgICAgICAgICAg
ICAgICAoc2V0ZW52ICJHWVBfREVGSU5FUyIgKHN0cmluZy1hcHBlbmQKKyAgICAgICAgICAgICAg
ICAgICAibW9kdWxlX25hbWU9IgorICAgICAgICAgICAgICAgICAgIChhc3NvYy1yZWYgYmluYXJ5
LWFsaXN0ICJtb2R1bGVfbmFtZSIpCisgICAgICAgICAgICAgICAgICAgIiBtb2R1bGVfcGF0aD0i
CisgICAgICAgICAgICAgICAgICAgKGFzc29jLXJlZiBiaW5hcnktYWxpc3QgIm1vZHVsZV9wYXRo
IikpKSkKKyAgICAgICAgICAgICAgIDs7IFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBpbnN0YWxsIHNj
cmlwdCBmcm9tICJwYWNrYWdlLmpzb24iLAorICAgICAgICAgICAgICAgOzsgYXMgaXQgd291bGQg
dHJ5IHRvIHVzZSBub2RlLXByZS1neXAgYW5kIHdvdWxkIGJsb2NrIHRoZQorICAgICAgICAgICAg
ICAgOzsgYXV0b21hdGljIGJ1aWxkaW5nIHBlcmZvcm1lZCBieSBgbnBtIGluc3RhbGxgLgorICAg
ICAgICAgICAgICAgKG1hcAorICAgICAgICAgICAgICAgICAobWF0Y2gtbGFtYmRhCisgICAgICAg
ICAgICAgICAgICAgKCgic2NyaXB0cyIgLiBzY3JpcHRzLWFsaXN0KQorICAgICAgICAgICAgICAg
ICAgICAgKGNvbnMgInNjcmlwdHMiIChmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgKG1h
dGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAgICAgICAgICgoImluc3RhbGwiIC4gXykgI2Yp
CisgICAgICAgICAgICAgICAgICAgICAgICAgKF8gI3QpKQorICAgICAgICAgICAgICAgICAgICAg
ICBzY3JpcHRzLWFsaXN0KSkpCisgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKKyAg
ICAgICAgICAgICAgICAgcGtnLW1ldGEtYWxpc3QpKSkpKSkpKQogICAgIChob21lLXBhZ2UgImh0
dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbm9kZS1zcWxpdGUzIikKICAgICAoc3lub3BzaXMgIk5v
ZGUuanMgYmluZGluZ3MgZm9yIFNRTGl0ZTMiKQogICAgIChkZXNjcmlwdGlvbgpkaWZmIC0tZ2l0
IGEvZ3VpeC9idWlsZC1zeXN0ZW0vbm9kZS5zY20gYi9ndWl4L2J1aWxkLXN5c3RlbS9ub2RlLnNj
bQppbmRleCA1N2ZlNWY2MDMwLi40MjViOGNkOWIzIDEwMDY0NAotLS0gYS9ndWl4L2J1aWxkLXN5
c3RlbS9ub2RlLnNjbQorKysgYi9ndWl4L2J1aWxkLXN5c3RlbS9ub2RlLnNjbQpAQCAtNCw2ICs0
LDcgQEAKIDs7OyBDb3B5cmlnaHQgwqkgMjAyMSBMdWRvdmljIENvdXJ0w6hzIDxsdWRvQGdudS5v
cmc+CiA7OzsgQ29weXJpZ2h0IMKpIDIwMjEgUGllcnJlIExhbmdsb2lzIDxwaWVycmUubGFuZ2xv
aXNAZ214LmNvbT4KIDs7OyBDb3B5cmlnaHQgwqkgMjAyMSBQaGlsaXAgTWNHcmF0aCA8cGhpbGlw
QHBoaWxpcG1jZ3JhdGguY29tPgorOzs7IENvcHlyaWdodCDCqSAyMDI0IERhbmllbCBLaG9kYWJh
a2hzaCA8ZC5raG9kYWJha2hzaEBnbWFpbC5jb20+CiA7OzsKIDs7OyBUaGlzIGZpbGUgaXMgcGFy
dCBvZiBHTlUgR3VpeC4KIDs7OwpAQCAtMzYsNyArMzcsMTAgQEAgKGRlZmluZS1tb2R1bGUgKGd1
aXggYnVpbGQtc3lzdGVtIG5vZGUpCiAoZGVmaW5lICVub2RlLWJ1aWxkLXN5c3RlbS1tb2R1bGVz
CiAgIDs7IEJ1aWxkLXNpZGUgbW9kdWxlcyBpbXBvcnRlZCBieSBkZWZhdWx0LgogICBgKChndWl4
IGJ1aWxkIG5vZGUtYnVpbGQtc3lzdGVtKQotICAgIChndWl4IGJ1aWxkIGpzb24pCisgICAgKGpz
b24pCisgICAgKGpzb24gYnVpbGRlcikKKyAgICAoanNvbiBwYXJzZXIpCisgICAgKGpzb24gcmVj
b3JkKQogICAgICxAJWRlZmF1bHQtZ251LWltcG9ydGVkLW1vZHVsZXMpKQogCiAoZGVmaW5lIChk
ZWZhdWx0LW5vZGUpCmRpZmYgLS1naXQgYS9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNj
bSBiL2d1aXgvYnVpbGQvbm9kZS1idWlsZC1zeXN0ZW0uc2NtCmluZGV4IGZiMjM4OTRiYzEuLmRm
N2VhNzc3NGMgMTAwNjQ0Ci0tLSBhL2d1aXgvYnVpbGQvbm9kZS1idWlsZC1zeXN0ZW0uc2NtCisr
KyBiL2d1aXgvYnVpbGQvbm9kZS1idWlsZC1zeXN0ZW0uc2NtCkBAIC00LDYgKzQsNyBAQAogOzs7
IENvcHlyaWdodCDCqSAyMDE5LCAyMDIxIFRpbW90aHkgU2FtcGxlIDxzYW1wbGV0QG5neXJvLmNv
bT4KIDs7OyBDb3B5cmlnaHQgwqkgMjAyMSwgMjAyMiBQaGlsaXAgTWNHcmF0aCA8cGhpbGlwQHBo
aWxpcG1jZ3JhdGguY29tPgogOzs7IENvcHlyaWdodCDCqSAyMDIyIExpbGlhbmEgTWFyaWUgUHJp
a2xlciA8bGlsaWFuYS5wcmlrbGVyQGdtYWlsLmNvbT4KKzs7OyBDb3B5cmlnaHQgwqkgMjAyNCBE
YW5pZWwgS2hvZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21haWwuY29tPgogOzs7CiA7OzsgVGhp
cyBmaWxlIGlzIHBhcnQgb2YgR05VIEd1aXguCiA7OzsKQEAgLTIzLDEwICsyNCwxMCBAQAogKGRl
ZmluZS1tb2R1bGUgKGd1aXggYnVpbGQgbm9kZS1idWlsZC1zeXN0ZW0pCiAgICM6dXNlLW1vZHVs
ZSAoKGd1aXggYnVpbGQgZ251LWJ1aWxkLXN5c3RlbSkgIzpwcmVmaXggZ251OikKICAgIzp1c2Ut
bW9kdWxlIChndWl4IGJ1aWxkIHV0aWxzKQotICAjOnVzZS1tb2R1bGUgKGd1aXggYnVpbGQganNv
bikKICAgIzp1c2UtbW9kdWxlIChpY2UtOSBmdHcpCiAgICM6dXNlLW1vZHVsZSAoaWNlLTkgcmVn
ZXgpCiAgICM6dXNlLW1vZHVsZSAoaWNlLTkgbWF0Y2gpCisgICM6dXNlLW1vZHVsZSAoanNvbikK
ICAgIzp1c2UtbW9kdWxlIChzcmZpIHNyZmktMSkKICAgIzp1c2UtbW9kdWxlIChzcmZpIHNyZmkt
NzEpCiAgICM6ZXhwb3J0ICglc3RhbmRhcmQtcGhhc2VzCkBAIC0zNCwxMyArMzUsMTQgQEAgKGRl
ZmluZS1tb2R1bGUgKGd1aXggYnVpbGQgbm9kZS1idWlsZC1zeXN0ZW0pCiAgICAgICAgICAgICBk
ZWxldGUtZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICBub2RlLWJ1aWxkKSkKIAotKGRlZmluZSAo
d2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50IGZpbGUgcHJvYykKKyhkZWZpbmUqICh3
aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgcHJvYworICAjOm9wdGlvbmFsIChmaWxl
ICJwYWNrYWdlLmpzb24iKSkKICAgIkxpa2UgJ3dpdGgtYXRvbWljLWZpbGUtcmVwbGFjZW1lbnQn
LCBidXQgUFJPQyBpcyBjYWxsZWQgd2l0aCBhIHNpbmdsZQogYXJndW1lbnQtLS10aGUgcmVzdWx0
IG9mIHBhcnNpbmcgRklMRSdzIGNvbnRlbnRzIGFzIGpzb24tLS1hbmQgc2hvdWxkIGEgdmFsdWUK
IHRvIGJlIHdyaXR0ZW4gYXMganNvbiB0byB0aGUgcmVwbGFjZW1lbnQgRklMRS4iCiAgICh3aXRo
LWF0b21pYy1maWxlLXJlcGxhY2VtZW50IGZpbGUKICAgICAobGFtYmRhIChpbiBvdXQpCi0gICAg
ICAod3JpdGUtanNvbiAocHJvYyAocmVhZC1qc29uIGluKSkgb3V0KSkpKQorICAgICAgKHNjbS0+
anNvbiAocHJvYyAoanNvbi0+c2NtIGluKSkgb3V0KSkpKQogCiAoZGVmaW5lKiAoYXNzb2MtcmVm
KiBhbGlzdCBrZXkgIzpvcHRpb25hbCBkZWZhdWx0KQogICAiTGlrZSBhc3NvYy1yZWYsIGJ1dCBy
ZXR1cm4gREVGQVVMVCBpbnN0ZWFkIG9mICNmIGlmIG5vIHZhbHVlIGV4aXN0cy4iCkBAIC00OCwx
MCArNTAsNiBAQCAoZGVmaW5lKiAoYXNzb2MtcmVmKiBhbGlzdCBrZXkgIzpvcHRpb25hbCBkZWZh
dWx0KQogICAgICgjZiBkZWZhdWx0KQogICAgICgoXyAuIHZhbHVlKSB2YWx1ZSkpKQogCi0oZGVm
aW5lKiAoanNvYmplY3QtcmVmIG9iaiBrZXkgIzpvcHRpb25hbCBkZWZhdWx0KQotICAobWF0Y2gg
b2JqCi0gICAgKCgnQCAuIGFsaXN0KSAoYXNzb2MtcmVmKiBhbGlzdCBrZXkgZGVmYXVsdCkpKSkK
LQogKGRlZmluZSogKGFsaXN0LXBvcCBhbGlzdCBrZXkgIzpvcHRpb25hbCAoPSBlcXVhbD8pKQog
ICAiUmV0dXJuIHR3byB2YWx1ZXMsIHRoZSBmaXJzdCBwYWlyIGluIEFMSVNUIHdpdGgga2V5IEtF
WSwgYW5kIHRoZSBvdGhlcgogZWxlbWVudHMuICBFcXVhbGl0eSBjYWxscyBhcmUgbWFkZSBhcyAo
PSBLRVkgQUxJU1RDQVIpLiIKQEAgLTYzLDY3ICs2MSwxNyBAQCAoZGVmaW5lKiAoYWxpc3QtcG9w
IGFsaXN0IGtleSAjOm9wdGlvbmFsICg9IGVxdWFsPykpCiAgICAgICAgICh2YWx1ZXMgKGNhciBh
ZnRlcikgKGFwcGVuZCBiZWZvcmUgKGNkciBhZnRlcikpKQogICAgICAgICAodmFsdWVzICNmIGJl
Zm9yZSkpKSkKIAotKGRlZmluZSogKGFsaXN0LXVwZGF0ZSBhbGlzdCBrZXkgcHJvYyAjOm9wdGlv
bmFsIGRlZmF1bHQgKD0gZXF1YWw/KSkKKyhkZWZpbmUqIChhbGlzdC11cGRhdGUgYWxpc3Qga2V5
IHByb2MgIzpvcHRpb25hbCAoPSBlcXVhbD8pKQogICAiUmV0dXJuIGFuIGFzc29jaWF0aW9uIGxp
c3QgbGlrZSBBTElTVCwgYnV0IHdpdGggS0VZIG1hcHBlZCB0byB0aGUgcmVzdWx0IG9mCiBQUk9D
IGFwcGxpZWQgdG8gdGhlIGZpcnN0IHZhbHVlIGZvdW5kIHVuZGVyIHRoZSBjb21wYXJpc29uICg9
IEtFWSBBTElTVENBUikuCi1JZiBubyBzdWNoIHZhbHVlIGV4aXN0cywgdXNlIERFRkFVTFQgaW5z
dGVhZC4KK0lmIG5vIHN1Y2ggdmFsdWUgZXhpc3RzLCByZXR1cm4gdGhlIGxpc3QgdW5jaGFuZ2Vk
LgogVW5saWtlIGFjb25zLCB0aGlzIHJlbW92ZXMgdGhlIHByZXZpb3VzIGFzc29jaWF0aW9uIG9m
IEtFWSAoYXNzdW1pbmcgaXQgaXMKIHVuaXF1ZSksIGJ1dCB0aGUgcmVzdWx0IG1heSBzdGlsbCBz
aGFyZSBzdG9yYWdlIHdpdGggQUxJU1QuIgogICAobGV0ICgocGFpciByZXN0IChhbGlzdC1wb3Ag
YWxpc3Qga2V5ID0pKSkKLSAgICAoYWNvbnMga2V5Ci0gICAgICAgICAgIChwcm9jIChpZiAocGFp
cj8gcGFpcikKLSAgICAgICAgICAgICAgICAgICAgIChjZHIgcGFpcikKLSAgICAgICAgICAgICAg
ICAgICAgIGRlZmF1bHQpKQotICAgICAgICAgICByZXN0KSkpCi0KLShkZWZpbmUgKGpzb2JqZWN0
LXVwZGF0ZSoganMgLiB1cGRhdGVzKQotICAiUmV0dXJuIGEganNvbiBvYmplY3QgbGlrZSBKUywg
YnV0IHdpdGggYWxsIFVQREFURVMgYXBwbGllZC4gIEVhY2ggdXBkYXRlIGlzCi1hIGxpc3QgKEtF
WSBQUk9DIFtERUZBVUxUXSksIHNvIHRoYXQgS0VZIGlzIG1hcHBlZCB0byB0aGUgcmVzdWx0IG9m
IFBST0MKLWFwcGxpZWQgdG8gdGhlIHZhbHVlIHRvIHdoaWNoIEtFWSBpcyBtYXBwZWQgaW4gSlMu
ICBJZiBubyBzdWNoIG1hcHBpbmcgZXhpc3RzLAotUFJPQyBpcyBpbnN0ZWFkIGFwcGxpZWQgdG8g
REVGQVVMVCwgb3IgdG8gJyNmJyBpcyBubyBERUZBVUxUIGlzIHNwZWNpZmllZC4KLVRoZSB1cGRh
dGUgdGFrZXMgcGxhY2UgZnJvbSBsZWZ0IHRvIHJpZ2h0LCBzbyBsYXRlciBVUERBVEVScyB3aWxs
IHJlY2VpdmUgdGhlCi12YWx1ZXMgcmV0dXJuZWQgYnkgZWFybGllciBVUERBVEVScyBmb3IgdGhl
IHNhbWUgS0VZLiIKLSAgKG1hdGNoIGpzCi0gICAgKCgnQCAuIGFsaXN0KQotICAgICAobGV0IGxv
b3AgKChhbGlzdCBhbGlzdCkKLSAgICAgICAgICAgICAgICAodXBkYXRlcyB1cGRhdGVzKSkKLSAg
ICAgICAobWF0Y2ggdXBkYXRlcwotICAgICAgICAgKCgpIChjb25zICdAIGFsaXN0KSkKLSAgICAg
ICAgICgoKGtleSBwcm9jKSAuIHVwZGF0ZXMpCi0gICAgICAgICAgKGxvb3AgKGFsaXN0LXVwZGF0
ZSBhbGlzdCBrZXkgcHJvYyAjZiBlcXVhbD8pIHVwZGF0ZXMpKQotICAgICAgICAgKCgoa2V5IHBy
b2MgZGVmYXVsdCkgLiB1cGRhdGVzKQotICAgICAgICAgIChsb29wIChhbGlzdC11cGRhdGUgYWxp
c3Qga2V5IHByb2MgZGVmYXVsdCBlcXVhbD8pIHVwZGF0ZXMpKSkpKSkpCi0KLShkZWZpbmUgKGpz
b2JqZWN0LXVuaW9uIGNvbWJpbmUgc2VlZCAuIG9iamVjdHMpCi0gICJNZXJnZSBPQkpFQ1RTIGlu
dG8gU0VFRCBieSBhcHBseWluZyAoQ09NQklORSBLRVkgVkFMMCBWQUwpLCB3aGVyZSBWQUwwCi1p
cyB0aGUgdmFsdWUgZm91bmQgaW4gdGhlIChwb3NzaWJseSB1cGRhdGVkKSBTRUVEIGFuZCBWQUwg
aXMgdGhlIG5ldyB2YWx1ZQotZm91bmQgaW4gb25lIG9mIHRoZSBPQkpFQ1RTLiIKLSAgKG1hdGNo
IHNlZWQKLSAgICAoKCdAIC4gYXNlZWQpCi0gICAgIChtYXRjaCBvYmplY3RzCi0gICAgICAgKCgp
IHNlZWQpCi0gICAgICAgKCgoJ0AgLiBhbGlzdHMpIC4uLikKLSAgICAgICAgKGNvbnMKLSAgICAg
ICAgICdACi0gICAgICAgICAoZm9sZCAobGFtYmRhIChhbGlzdCBhc2VlZCkKLSAgICAgICAgICAg
ICAgICAgKGlmIChudWxsPyBhc2VlZCkgYWxpc3QKLSAgICAgICAgICAgICAgICAgICAgIChmb2xk
Ci0gICAgICAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYSoKLSAgICAgICAgICAgICAgICAg
ICAgICAgICgoKGsgLiB2KSBhc2VlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAobGV0ICgo
cGFpciB0YWlsIChhbGlzdC1wb3AgYWxpc3QgaykpKQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKG1hdGNoIHBhaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCNmIChhY29ucyBr
IHYgYXNlZWQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF8gLiB2MCkgKGFjb25z
IGsgKGNvbWJpbmUgayB2MCB2KSBhc2VlZCkpKSkpKQotICAgICAgICAgICAgICAgICAgICAgIGFz
ZWVkCi0gICAgICAgICAgICAgICAgICAgICAgYWxpc3QpKSkKLSAgICAgICAgICAgICAgIGFzZWVk
Ci0gICAgICAgICAgICAgICBhbGlzdHMpKSkpKSkpCisgICAgKGlmIChwYWlyPyBwYWlyKQorICAg
ICAgKGFjb25zIGtleSAocHJvYyAoY2RyIHBhaXIpKSByZXN0KQorICAgICAgYWxpc3QpKSkKIAot
OzsgUG9zc2libHkgdXNlZnVsIGhlbHBlciBmdW5jdGlvbnM6Ci07OyAoZGVmaW5lIChuZXdlc3Qg
a2V5IHZhbDAgdmFsKSB2YWwpCi07OyAoZGVmaW5lICh1bmtleWVkLT5rZXllZCBwcm9jKSAobGFt
YmRhIChfa2V5IHZhbDAgdmFsKSAocHJvYyB2YWwwIHZhbCkpKQotCi0MCiA7OzsKIDs7OyBQaGFz
ZXMuCiA7OzsKQEAgLTE0Miw4ICs5MCw4IEBAIChkZWZpbmUgKHNldC1ob21lIC4gXykKIAogKGRl
ZmluZSAobW9kdWxlLW5hbWUgbW9kdWxlKQogICAobGV0KiAoKHBhY2thZ2UuanNvbiAoc3RyaW5n
LWFwcGVuZCBtb2R1bGUgIi9wYWNrYWdlLmpzb24iKSkKLSAgICAgICAgIChwYWNrYWdlLW1ldGEg
KGNhbGwtd2l0aC1pbnB1dC1maWxlIHBhY2thZ2UuanNvbiByZWFkLWpzb24pKSkKLSAgICAoanNv
YmplY3QtcmVmIHBhY2thZ2UtbWV0YSAibmFtZSIpKSkKKyAgICAgICAgIChwYWNrYWdlLW1ldGEg
KGNhbGwtd2l0aC1pbnB1dC1maWxlIHBhY2thZ2UuanNvbiBqc29uLT5zY20pKSkKKyAgICAoYXNz
b2MtcmVmIHBhY2thZ2UtbWV0YSAibmFtZSIpKSkKIAogKGRlZmluZSAoaW5kZXgtbW9kdWxlcyBp
bnB1dC1wYXRocykKICAgKGRlZmluZSAobGlzdC1tb2R1bGVzIGRpcmVjdG9yeSkKQEAgLTE2Nyw0
OSArMTE1LDU5IEBAIChkZWZpbmUqIChwYXRjaC1kZXBlbmRlbmNpZXMgIzprZXkgaW5wdXRzICM6
YWxsb3ctb3RoZXIta2V5cykKIAogICAoZGVmaW5lIGluZGV4IChpbmRleC1tb2R1bGVzIChtYXAg
Y2RyIGlucHV0cykpKQogCi0gIChkZWZpbmUgcmVzb2x2ZS1kZXBlbmRlbmNpZXMKLSAgICAobWF0
Y2gtbGFtYmRhCi0gICAgICAoKCdAIC4gYWxpc3QpCi0gICAgICAgKGNvbnMgJ0AgKG1hcCAobWF0
Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICgoa2V5IC4gdmFsdWUpCi0gICAgICAg
ICAgICAgICAgICAgICAgICAoY29ucyBrZXkgKGhhc2gtcmVmIGluZGV4IGtleSB2YWx1ZSkpKSkK
LSAgICAgICAgICAgICAgICAgICAgIGFsaXN0KSkpKSkKKyAgKGRlZmluZSAocmVzb2x2ZS1kZXBl
bmRlbmNpZXMgZGVwZW5kZW5jaWVzKQorICAgIChtYXAKKyAgICAgIChtYXRjaC1sYW1iZGEKKyAg
ICAgICAgKChkZXBlbmRlbmN5IC4gdmVyc2lvbikKKyAgICAgICAgICAoY29ucyBkZXBlbmRlbmN5
IChoYXNoLXJlZiBpbmRleCBkZXBlbmRlbmN5IHZlcnNpb24pKSkpCisgICAgICBkZXBlbmRlbmNp
ZXMpKQogCi0gICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgInBhY2thZ2UuanNv
biIKKyAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudAogICAgIChsYW1iZGEgKHBr
Zy1tZXRhKQotICAgICAgKGpzb2JqZWN0LXVwZGF0ZSoKLSAgICAgICBwa2ctbWV0YQotICAgICAg
IGAoImRldkRlcGVuZGVuY2llcyIgLHJlc29sdmUtZGVwZW5kZW5jaWVzIChAKSkKLSAgICAgICBg
KCJkZXBlbmRlbmNpZXMiICwobGFtYmRhIChkZXBzKQotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgKHJlc29sdmUtZGVwZW5kZW5jaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpz
b2JqZWN0LXVuaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGsgYSBi
KSBiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoanNvYmplY3QtcmVmIHBrZy1tZXRh
ICJwZWVyRGVwZW5kZW5jaWVzIiAnKEApKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBk
ZXBzKSkpCi0gICAgICAgICAoQCkpKSkpCisgICAgICAoZm9sZAorICAgICAgICAobGFtYmRhIChw
cm9jIHBrZy1tZXRhKSAocHJvYyBwa2ctbWV0YSkpCisgICAgICAgIHBrZy1tZXRhCisgICAgICAg
IChsaXN0CisgICAgICAgICAgKGxhbWJkYSAocGtnLW1ldGEpCisgICAgICAgICAgICAoYWxpc3Qt
dXBkYXRlIHBrZy1tZXRhICJkZXZEZXBlbmRlbmNpZXMiIHJlc29sdmUtZGVwZW5kZW5jaWVzKSkK
KyAgICAgICAgICAobGFtYmRhIChwa2ctbWV0YSkKKyAgICAgICAgICAgIChhc3NvYy1zZXQhCisg
ICAgICAgICAgICAgIHBrZy1tZXRhCisgICAgICAgICAgICAgICJkZXBlbmRlbmNpZXMiCisgICAg
ICAgICAgICAgIChyZXNvbHZlLWRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgIDsgQ29tYmlu
ZWQgInBlZXJEZXBlbmRlbmNpZXMiIGFuZCAiZGVwZW5kZW5jaWVzIiBkZXBlbmRlbmNpZXMKKyAg
ICAgICAgICAgICAgICA7IHdpdGggImRlcGVuZGVuY2llcyIgdGFraW5nIHByZWNlZGVudC4KKyAg
ICAgICAgICAgICAgICAoZm9sZAorICAgICAgICAgICAgICAgICAgKGxhbWJkYSAoZGVwZW5kZW5j
eSBkZXBlbmRlbmNpZXMpCisgICAgICAgICAgICAgICAgICAgIChhc3NvYy1zZXQhIGRlcGVuZGVu
Y2llcyAoY2FyIGRlcGVuZGVuY3kpIChjZHIgZGVwZW5kZW5jeSkpKQorICAgICAgICAgICAgICAg
ICAgKGFzc29jLXJlZiogcGtnLW1ldGEgInBlZXJEZXBlbmRlbmNpZXMiICcoKSkKKyAgICAgICAg
ICAgICAgICAgIChhc3NvYy1yZWYqIHBrZy1tZXRhICJkZXBlbmRlbmNpZXMiICcoKSkpKSkpKSkp
KQogICAjdCkKIAotKGRlZmluZSAoZGVsZXRlLWRlcGVuZGVuY2llcyBhYnNlbnQpCisoZGVmaW5l
IChkZWxldGUtZGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcy10by1yZW1vdmUpCiAgICJSZXdyaXRl
ICdwYWNrYWdlLmpzb24nIHRvIGFsbG93IHRoZSBidWlsZCB0byBwcm9jZWVkIHdpdGhvdXQgcGFj
a2FnZXMKLWxpc3RlZCBpbiBBQlNFTlQsIGEgbGlzdCBvZiBzdHJpbmdzIG5hbWluZyBucG0gcGFj
a2FnZXMuCitsaXN0ZWQgaW4gJ2RlcGVuZGVuY2llcy10by1yZW1vdmUnLCBhIGxpc3Qgb2Ygc3Ry
aW5ncyBuYW1pbmcgbnBtIHBhY2thZ2VzLgogCiBUbyBwcmV2ZW50IHRoZSBkZWxldGVkIGRlcGVu
ZGVuY2llcyBmcm9tIGJlaW5nIHJlaW50cm9kdWNlZCwgdXNlIHRoaXMgZnVuY3Rpb24KIG9ubHkg
YWZ0ZXIgdGhlICdwYXRjaC1kZXBlbmRlbmNpZXMnIHBoYXNlLiIKLSAgKGRlZmluZSBkZWxldGUt
ZnJvbS1qc29iamVjdAotICAgIChtYXRjaC1sYW1iZGEKLSAgICAgICgoJ0AgLiBhbGlzdCkKLSAg
ICAgICAoY29ucyAnQCAoZmlsdGVyIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgKChrIC4gXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgKG1lbWJlciBr
IGFic2VudCkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFsaXN0KSkpKSkKLQotICAod2l0
aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50ICJwYWNrYWdlLmpzb24iCisgICh3aXRoLWF0
b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQKICAgICAobGFtYmRhIChwa2ctbWV0YSkKLSAgICAg
IChqc29iamVjdC11cGRhdGUqCi0gICAgICAgcGtnLW1ldGEKLSAgICAgICBgKCJkZXZEZXBlbmRl
bmNpZXMiICxkZWxldGUtZnJvbS1qc29iamVjdCAoQCkpCi0gICAgICAgYCgiZGVwZW5kZW5jaWVz
IiAsZGVsZXRlLWZyb20tanNvYmplY3QgKEApKQotICAgICAgIGAoInBlZXJEZXBlbmRlbmNpZXMi
ICxkZWxldGUtZnJvbS1qc29iamVjdCAoQCkpKSkpKQorICAgICAgKGZvbGQKKyAgICAgICAgKGxh
bWJkYSAoZGVwZW5kZW5jeS1rZXkgcGtnLW1ldGEpCisgICAgICAgICAgKGFsaXN0LXVwZGF0ZQor
ICAgICAgICAgICAgcGtnLW1ldGEKKyAgICAgICAgICAgIGRlcGVuZGVuY3kta2V5CisgICAgICAg
ICAgICAobGFtYmRhIChkZXBlbmRlbmNpZXMpCisgICAgICAgICAgICAgIChyZW1vdmUKKyAgICAg
ICAgICAgICAgICAobGFtYmRhIChkZXBlbmRlbmN5KQorICAgICAgICAgICAgICAgICAgKG1lbWJl
ciAoY2FyIGRlcGVuZGVuY3kpIGRlcGVuZGVuY2llcy10by1yZW1vdmUpKQorICAgICAgICAgICAg
ICAgIGRlcGVuZGVuY2llcykpKSkKKyAgICAgICAgcGtnLW1ldGEKKyAgICAgICAgKGxpc3QKKyAg
ICAgICAgICAiZGV2RGVwZW5kZW5jaWVzIgorICAgICAgICAgICJkZXBlbmRlbmNpZXMiCisgICAg
ICAgICAgInBlZXJEZXBlbmRlbmNpZXMiCisgICAgICAgICAgIm9wdGlvbmFsRGVwZW5kZW5jaWVz
IikpKSkpCiAKIChkZWZpbmUqIChkZWxldGUtbG9ja2ZpbGVzICM6a2V5IGlucHV0cyAjOmFsbG93
LW90aGVyLWtleXMpCiAgICJEZWxldGUgJ3BhY2thZ2UtbG9jay5qc29uJywgJ3lhcm4ubG9jaycs
IGFuZCAnbnBtLXNocmlua3dyYXAuanNvbicsIGlmIHRoZXkKQEAgLTIyOCw4ICsxODYsOCBAQCAo
ZGVmaW5lKiAoY29uZmlndXJlICM6a2V5IG91dHB1dHMgaW5wdXRzICM6YWxsb3ctb3RoZXIta2V5
cykKICAgICAjdCkpCiAKIChkZWZpbmUqIChidWlsZCAjOmtleSBpbnB1dHMgIzphbGxvdy1vdGhl
ci1rZXlzKQotICAobGV0ICgocGFja2FnZS1tZXRhIChjYWxsLXdpdGgtaW5wdXQtZmlsZSAicGFj
a2FnZS5qc29uIiByZWFkLWpzb24pKSkKLSAgICAoaWYgKGpzb2JqZWN0LXJlZiAoanNvYmplY3Qt
cmVmIHBhY2thZ2UtbWV0YSAic2NyaXB0cyIgJyhAKSkgImJ1aWxkIiAjZikKKyAgKGxldCAoKHBh
Y2thZ2UtbWV0YSAoY2FsbC13aXRoLWlucHV0LWZpbGUgInBhY2thZ2UuanNvbiIganNvbi0+c2Nt
KSkpCisgICAgKGlmIChhc3NvYy1yZWYqIChhc3NvYy1yZWYqIHBhY2thZ2UtbWV0YSAic2NyaXB0
cyIgJygpKSAiYnVpbGQiICNmKQogICAgICAgICAobGV0ICgobnBtIChzdHJpbmctYXBwZW5kIChh
c3NvYy1yZWYgaW5wdXRzICJub2RlIikgIi9iaW4vbnBtIikpKQogICAgICAgICAgIChpbnZva2Ug
bnBtICJydW4iICJidWlsZCIpKQogICAgICAgICAoZm9ybWF0ICN0ICJ0aGVyZSBpcyBubyBidWls
ZCBzY3JpcHQgdG8gcnVufiUiKSkKQEAgLTMwMSwyMiArMjU5LDIwIEBAIChkZWZpbmUqIChhdm9p
ZC1ub2RlLWd5cC1yZWJ1aWxkICM6a2V5IG91dHB1dHMgIzphbGxvdy1vdGhlci1rZXlzKQogICA7
OyBldmVuIG5lZWQgdG8gb3ZlcndyaXRlIHRoaXMgZmlsZS4gIFRoZXJlZm9yZSwgbGV0J3MgdXNl
IHNvbWUgaGVscGVycwogICA7OyB0aGF0IHdlJ2Qgb3RoZXJ3aXNlIG5vdCBuZWVkLgogICAoZGVm
aW5lIHBrZy1tZXRhCi0gICAgKGNhbGwtd2l0aC1pbnB1dC1maWxlIGluc3RhbGxlZC1wYWNrYWdl
Lmpzb24gcmVhZC1qc29uKSkKKyAgICAoY2FsbC13aXRoLWlucHV0LWZpbGUgaW5zdGFsbGVkLXBh
Y2thZ2UuanNvbiBqc29uLT5zY20pKQogICAoZGVmaW5lIHNjcmlwdHMKLSAgICAoanNvYmplY3Qt
cmVmIHBrZy1tZXRhICJzY3JpcHRzIiAnKEApKSkKLSAgKGRlZmluZSAoanNvYmplY3Qtc2V0IGpz
IGtleSB2YWwpCi0gICAgKGpzb2JqZWN0LXVwZGF0ZSoganMgKGxpc3Qga2V5IChjb25zdCB2YWwp
KSkpCisgICAgKGFzc29jLXJlZiogcGtnLW1ldGEgInNjcmlwdHMiICcoKSkpCiAKLSAgKHdoZW4g
KGVxdWFsPyAibm9kZS1neXAgcmVidWlsZCIgKGpzb2JqZWN0LXJlZiBzY3JpcHRzICJpbnN0YWxs
IiAjZikpCisgICh3aGVuIChlcXVhbD8gIm5vZGUtZ3lwIHJlYnVpbGQiIChhc3NvYy1yZWYqIHNj
cmlwdHMgImluc3RhbGwiICNmKSkKICAgICAoY2FsbC13aXRoLW91dHB1dC1maWxlIGluc3RhbGxl
ZC1wYWNrYWdlLmpzb24KICAgICAgIChsYW1iZGEgKG91dCkKLSAgICAgICAgKHdyaXRlLWpzb24K
LSAgICAgICAgIChqc29iamVjdC1zZXQgcGtnLW1ldGEKLSAgICAgICAgICAgICAgICAgICAgICAg
InNjcmlwdHMiCi0gICAgICAgICAgICAgICAgICAgICAgIChqc29iamVjdC1zZXQgc2NyaXB0cwot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YWxsIgotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlY2hvIEd1aXg6IGF2b2lkaW5nIG5vZGUtZ3lw
IHJlYnVpbGQiKSkKLSAgICAgICAgIG91dCkpKSkpCisgICAgICAgIChzY20tPmpzb24KKyAgICAg
ICAgICAoYXNzb2Mtc2V0ISBwa2ctbWV0YQorICAgICAgICAgICAgICAgICAgICAgICJzY3JpcHRz
IgorICAgICAgICAgICAgICAgICAgICAgIChhc3NvYy1zZXQhIHNjcmlwdHMKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbCIKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiZWNobyBHdWl4OiBhdm9pZGluZyBub2RlLWd5cCByZWJ1aWxkIikpCisgICAg
ICAgICAgb3V0KSkpKSkKIAogKGRlZmluZSAlc3RhbmRhcmQtcGhhc2VzCiAgIChtb2RpZnktcGhh
c2VzIGdudTolc3RhbmRhcmQtcGhhc2VzCgpiYXNlLWNvbW1pdDogZTE2Y2RjZjM3ZDgyMjNiMzYz
NGVjNWU2NTgzNTZjM2I3ZjE1NDg1OQotLSAKMi40Ni4wCgo=
--00000000000009b154062a6fc654--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#74900] [PATCH 2/2] Introduce (modify-json), (delete-fields), and (replace-fields) to node-build-system
References: <CAADuFnKAGHb2=rTFiwD9yXN3=OKbZdragGaCJJ0BkOhofDb2KQ@HIDDEN>
In-Reply-To: <CAADuFnKAGHb2=rTFiwD9yXN3=OKbZdragGaCJJ0BkOhofDb2KQ@HIDDEN>
Resent-From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 29 Dec 2024 22:00:01 +0000
Resent-Message-ID: <handler.74900.B74900.173550959530415 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 74900
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 74900 <at> debbugs.gnu.org
Received: via spool by 74900-submit <at> debbugs.gnu.org id=B74900.173550959530415
          (code B ref 74900); Sun, 29 Dec 2024 22:00:01 +0000
Received: (at 74900) by debbugs.gnu.org; 29 Dec 2024 21:59:55 +0000
Received: from localhost ([127.0.0.1]:56449 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1tS1KF-0007uV-GP
	for submit <at> debbugs.gnu.org; Sun, 29 Dec 2024 16:59:55 -0500
Received: from mail-vs1-f48.google.com ([209.85.217.48]:60643)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <d.khodabakhsh@HIDDEN>) id 1tS1KD-0007uG-Cz
 for 74900 <at> debbugs.gnu.org; Sun, 29 Dec 2024 16:59:53 -0500
Received: by mail-vs1-f48.google.com with SMTP id
 ada2fe7eead31-4b24d969db1so2071944137.0
 for <74900 <at> debbugs.gnu.org>; Sun, 29 Dec 2024 13:59:53 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=gmail.com; s=20230601; t=1735509528; x=1736114328; darn=debbugs.gnu.org;
 h=to:subject:message-id:date:from:mime-version:from:to:cc:subject
 :date:message-id:reply-to;
 bh=1O/4P0g06DFTMGOWlUtrj87JRq+B7/i3BoQ5LSubkBQ=;
 b=MoDAzTF4csxfeGO+76v1MihF3OSf4/AifxTlaJyRovvh37wiSmOEg8zl2u3K46PWrO
 rd5dN3XKvVFjP/72LD9t2dabin83IPCj5sBYEfMxEC2e30Q/gvqC5ACfBCeUEAEwtgdJ
 WdfFUEiA9dA2BFlLLww+P71/+mPXHOYGYoD8S1OJFkfik4lYmruz1Gf+9K0KXsCPa9ia
 VJ/ECJQ4ig7jWTD3NoDeKTtIufbQsBcJIjV1LrZpT+xWG2J4zdeAT14kqxVtio4pZkUz
 Rv3MzXKXYblsuAkUWEZ8FfUdFqZG/kZW6d6Qv6NwTiIUWviKWYq8TAzqUl+EeH8iFBpC
 1wug==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20230601; t=1735509528; x=1736114328;
 h=to:subject:message-id:date:from:mime-version:x-gm-message-state
 :from:to:cc:subject:date:message-id:reply-to;
 bh=1O/4P0g06DFTMGOWlUtrj87JRq+B7/i3BoQ5LSubkBQ=;
 b=W4ziomaU56OxfMu9W8m5iBBRX+EhueAyBwJBe2q22IMe00slR4vax9OSZCStxYpAIN
 9fqbkYtstKnMBOxA1kq0xgZZkZLEEWo4YhgeDBE9KR8FspUFiPREYBI9HHeWh2/RjQ8U
 6SEzkktyvHPLGpUNwCjsg8JPk8R7kYg/ytgAofqoB5OkQEz5WLFPJRZMs8Rq3U4wzAhH
 Zy6mA2nkbiiV955bIKL2P60Ufz9Aal4c8bryuFViXKuJ5T/UjbTrN1V+WQUD80+A5fLx
 R9YfSgM25rSrnhOnZ7T/W2cQ+s+nmU74BMJGtfMO4nlOdEIyFx3WdhVjlrjneTw1xFR0
 xxkQ==
X-Gm-Message-State: AOJu0Yyt6Aoh5A5P/sw7x7n2yBPtma4WF2x1IPS6w6090EfxvtGYxIfd
 PpKPGa8kJxI2UrCvFvpPP3pp7Dx2giE8hGWJmNGxUVhIT8/PblC7ymIccHzkYyfa4Z59rjY5ISD
 LoEkvUY4rLD4ODk2r9YvIghRkoR7pKVsX
X-Gm-Gg: ASbGncsj1w+FtkdH9sVLkyqNm2WGXSXThu1Jis58KFmijHmePM0Ym1iMWkXOSbz7jM1
 dyVWwSYuxd5Ezaplci2WOofGDZmy20yhwaaZCTZ/e
X-Google-Smtp-Source: AGHT+IGVwYnGldx1yjnjNxN4ffk6MLaWjomGZWW1Qfed+j3avGkTyMAwRqLQfXn/JbjZO6TeGDket2k9zKQ0eYOtiaE=
X-Received: by 2002:a05:6102:3e83:b0:4b2:af6e:5fef with SMTP id
 ada2fe7eead31-4b2cc35c2d5mr26478081137.9.1735509527302; Sun, 29 Dec 2024
 13:58:47 -0800 (PST)
MIME-Version: 1.0
From: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Date: Sun, 29 Dec 2024 21:58:35 +0000
Message-ID: <CAADuFnLa3g3NFk4+uRvs2P1nz+PFp_qFscGFQpAGv79-WL_9+w@HIDDEN>
Content-Type: multipart/mixed; boundary="000000000000e12ff3062a6fccd4"
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>

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

This change introduces helper procedures (modify-json) which takes in lambd=
as
 which modify the target json #:file which defaults to package.json
This change also includes (delete-fields) and (replace-fields) to help dele=
ting
 and replacing the value of fields in a package.json file.

Signed-off-by: Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
Change-Id: I957f7ca814078d2136d5261985174820235f1369
---
 gnu/packages/node-xyz.scm        | 324 ++++++++++++++-----------------
 gnu/packages/node.scm            |  86 ++++----
 guix/build/node-build-system.scm | 198 +++++++++++++++----
 3 files changed, 355 insertions(+), 253 deletions(-)

diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm
index ec3f9fbfb1..cdc69de0c1 100644
--- a/gnu/packages/node-xyz.scm
+++ b/gnu/packages/node-xyz.scm
@@ -69,18 +69,7 @@ (define-public node-acorn
              ;; We need to remove the prepare script from "package.json", =
as
              ;; it would try to use the build environment and would block =
the
              ;; automatic building by other packages making use of node-ac=
orn.
-             ;; TODO: Add utility function
-             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
-               (map
-                 (match-lambda
-                   (("scripts" . scripts-alist)
-                     (cons "scripts" (filter
-                       (match-lambda
-                         (("prepare" . _) #f)
-                         (_ #t))
-                       scripts-alist)))
-                   (other other))
-                 pkg-meta-alist)))))
+             (modify-json (delete-fields '(("scripts" "prepare"))))))
          (replace 'build
            (lambda* (#:key inputs native-inputs #:allow-other-keys)
              (let ((esbuild (search-input-file (or native-inputs inputs)
@@ -136,38 +125,26 @@ (define-public node-addon-api
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies
-              `("benchmark"
-                "bindings"
-                "clang-format"
-                "eslint"
-                "eslint-config-semistandard"
-                "eslint-config-standard"
-                "eslint-plugin-import"
-                "eslint-plugin-node"
-                "eslint-plugin-promise"
-                "fs-extra"
-                "neostandard"
-                "path"
-                "pre-commit"
-                "semver"))))
-         (add-after 'unpack 'skip-js-tests
-           ;; We can't run the js-based tests,
-           ;; but we can still do the C++ parts
-           (lambda args
-             (define new-test-script
-               "echo stopping after pretest on Guix")
-             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
-               (map
-                 (match-lambda
-                   (("scripts" . scripts-alist)
-                     (cons "scripts" (map
-                       (match-lambda
-                         (("test" . _) (cons "test" new-test-script))
-                         (other other))
-                       scripts-alist)))
-                   (other other))
-                 pkg-meta-alist))))))))
+             (modify-json
+               (delete-dependencies `(
+                 "benchmark"
+                 "bindings"
+                 "clang-format"
+                 "eslint"
+                 "eslint-config-semistandard"
+                 "eslint-config-standard"
+                 "eslint-plugin-import"
+                 "eslint-plugin-node"
+                 "eslint-plugin-promise"
+                 "fs-extra"
+                 "neostandard"
+                 "path"
+                 "pre-commit"
+                 "semver"))
+               ;; We can't run the js-based tests,
+               ;; but we can still do the C++ parts
+               (replace-fields (list (cons
+                 "scripts.test" "echo stopping after pretest on Guix")))))=
))))
     (home-page "https://github.com/nodejs/node-addon-api")
     (synopsis "Node.js API (Node-API) header-only C++ wrappers")
     (description "This module contains header-only C++ wrapper classes whi=
ch
@@ -232,7 +209,7 @@ (define-public node-buffer-crc32
        #:phases (modify-phases %standard-phases
                   (add-after 'patch-dependencies 'delete-dependencies
                     (lambda _
-                      (delete-dependencies '("tap")))))))
+                      (modify-json (delete-dependencies '("tap"))))))))
     (home-page "https://github.com/brianloveswords/buffer-crc32")
     (synopsis "CRC32 implementation in Javascript")
     (description
@@ -288,14 +265,15 @@ (define-public node-crx3
                          "minimist"))))
                   (add-after 'patch-dependencies 'delete-dependencies
                     (lambda _
-                      (delete-dependencies '("c8"
-                                             "docdash"
-                                             "eslint"
-                                             "eslint-plugin-jsdoc"
-                                             "jsdoc"
-                                             "tap-diff"
-                                             "tape"
-                                             "tape-catch")))))))
+                      (modify-json (delete-dependencies
+                        '("c8"
+                          "docdash"
+                          "eslint"
+                          "eslint-plugin-jsdoc"
+                          "jsdoc"
+                          "tap-diff"
+                          "tape"
+                          "tape-catch"))))))))
     (inputs (list node-minimist node-pbf node-yazl))
     (home-page "https://github.com/ahwayakchih/crx3")
     (synopsis "Create CRXv3 browser extensions with Javascript")
@@ -325,18 +303,19 @@ (define-public node-debug
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies `("brfs"
-                                    "browserify"
-                                    "coveralls"
-                                    "istanbul"
-                                    "karma"
-                                    "karma-browserify"
-                                    "karma-chrome-launcher"
-                                    "karma-mocha"
-                                    "mocha"
-                                    "mocha-lcov-reporter"
-                                    "xo"
-                                    "supports-color")))))
+             (modify-json (delete-dependencies
+               `("brfs"
+                 "browserify"
+                 "coveralls"
+                 "istanbul"
+                 "karma"
+                 "karma-browserify"
+                 "karma-chrome-launcher"
+                 "karma-mocha"
+                 "mocha"
+                 "mocha-lcov-reporter"
+                 "xo"
+                 "supports-color"))))))
        #:tests? #f))
     (home-page "https://github.com/debug-js/debug")
     (synopsis "Debugging utility for Node.js")
@@ -421,21 +400,22 @@ (define-public node-file-uri-to-path
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies `("@types/mocha"
-                                    "@types/node"
-                                    "@typescript-eslint/eslint-plugin"
-                                    "@typescript-eslint/parser"
-                                    "cpy-cli"
-                                    "eslint"
-                                    "eslint-config-airbnb"
-                                    "eslint-config-prettier"
-                                    "eslint-import-resolver-typescript"
-                                    "eslint-plugin-import"
-                                    "eslint-plugin-jsx-a11y"
-                                    "eslint-plugin-react"
-                                    "mocha"
-                                    "rimraf"
-                                    "typescript"))))
+             (modify-json (delete-dependencies
+               `("@types/mocha"
+                 "@types/node"
+                 "@typescript-eslint/eslint-plugin"
+                 "@typescript-eslint/parser"
+                 "cpy-cli"
+                 "eslint"
+                 "eslint-config-airbnb"
+                 "eslint-config-prettier"
+                 "eslint-import-resolver-typescript"
+                 "eslint-plugin-import"
+                 "eslint-plugin-jsx-a11y"
+                 "eslint-plugin-react"
+                 "mocha"
+                 "rimraf"
+                 "typescript")))))
          (replace 'build
            (lambda* (#:key inputs native-inputs #:allow-other-keys)
              (copy-recursively "src" "dist")
@@ -497,7 +477,8 @@ (define-public node-ieee754
        #:phases (modify-phases %standard-phases
                   (add-after 'patch-dependencies 'delete-dependencies
                     (lambda _
-                      (delete-dependencies '("airtap" "standard" "tape")))=
))))
+                      (modify-json (delete-dependencies
+                        '("airtap" "standard" "tape"))))))))
     (home-page "https://github.com/feross/ieee754")
     (synopsis "Read/write IEEE754 floating point numbers in Javascript")
     (description "This package can read and write IEEE754 floating point
@@ -524,7 +505,7 @@ (define-public node-inherits
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies '("tap")))))
+             (modify-json (delete-dependencies '("tap"))))))
        ;; FIXME: Tests depend on node-tap
        #:tests? #f))
     (home-page "https://github.com/isaacs/inherits")
@@ -553,8 +534,8 @@ (define-public node-irc
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies
-              `("ansi-color" "faucet" "jscs" "tape")))))
+             (modify-json (delete-dependencies
+              `("ansi-color" "faucet" "jscs" "tape"))))))
        #:tests? #f))
     (inputs
      (list node-irc-colors))
@@ -583,7 +564,7 @@ (define-public node-irc-colors
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies `("istanbul" "vows")))))
+             (modify-json (delete-dependencies `("istanbul" "vows"))))))
        #:tests? #f))
     (home-page "https://github.com/fent/irc-colors.js")
     (synopsis "Node.js module providing color and formatting for IRC")
@@ -657,7 +638,8 @@ (define-public node-minimist
        #:phases (modify-phases %standard-phases
                   (add-after 'patch-dependencies 'delete-dependencies
                     (lambda _
-                      (delete-dependencies '("covert" "tap" "tape")))))))
+                      (modify-json (delete-dependencies
+                        '("covert" "tap" "tape"))))))))
     (home-page "https://github.com/substack/minimist")
     (synopsis "Parse CLI arguments in Javascript")
     (description "This package can scan for CLI flags and arguments in
@@ -683,12 +665,13 @@ (define-public node-ms
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies `("eslint"
-                                    "expect.js"
-                                    "husky"
-                                    "lint-staged"
-                                    "mocha"
-                                    "prettier")))))
+             (modify-json (delete-dependencies
+               `("eslint"
+                 "expect.js"
+                 "husky"
+                 "lint-staged"
+                 "mocha"
+                 "prettier"))))))
        #:tests? #f))
     (home-page "https://github.com/vercel/ms")
     (synopsis "Convert time to milliseconds")
@@ -716,14 +699,14 @@ (define-public node-nan
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies
+             (modify-json (delete-dependencies
               '("bindings"
                 "commander"
                 "glob"
                 "request"
                 "node-gyp" ;; would be needed for tests
                 "tap"
-                "xtend")))))
+                "xtend"))))))
        ;; tests need tap and other dependencies
        #:tests? #f))
     (inputs
@@ -755,7 +738,8 @@ (define-public node-normalize-path
        #:phases (modify-phases %standard-phases
                   (add-after 'patch-dependencies 'delete-dependencies
                     (lambda _
-                      (delete-dependencies '("gulp-format-md" "mocha")))))=
))
+                      (modify-json (delete-dependencies
+                        '("gulp-format-md" "mocha"))))))))
     (native-inputs (list node-minimist))
     (home-page "https://github.com/jonschlinkert/normalize-path")
     (synopsis "Normalize slashes in a file path")
@@ -784,7 +768,7 @@ (define-public node-once
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies '("tap")))))
+             (modify-json (delete-dependencies '("tap"))))))
        ;; FIXME: Tests depend on node-tap
        #:tests? #f))
     (inputs
@@ -841,7 +825,8 @@ (define-public node-path-key
        #:phases (modify-phases %standard-phases
                   (add-after 'patch-dependencies 'delete-dependencies
                     (lambda _
-                      (delete-dependencies '("@types/node" "ava"
"tsd" "xo")))))))
+                      (modify-json (delete-dependencies
+                        '("@types/node" "ava" "tsd" "xo"))))))))
     (home-page "https://github.com/sindresorhus/path-key")
     (synopsis "Cross-platform utility to compute the PATH environment
variable key")
     (description "@code{path-key} provides an implementation to compute th=
e
@@ -867,7 +852,7 @@ (define-public node-pbf
        #:phases (modify-phases %standard-phases
                   (add-after 'patch-dependencies 'delete-dependencies
                     (lambda _
-                      (delete-dependencies
+                      (modify-json (delete-dependencies
                        '("benchmark"
                          "browserify"
                          "eslint"
@@ -877,7 +862,7 @@ (define-public node-pbf
                          "protocol-buffers"
                          "tap"
                          "tile-stats-runner"
-                         "uglify-js")))))))
+                         "uglify-js"))))))))
     (inputs (list node-ieee754 node-resolve-protobuf-schema))
     (home-page "https://github.com/mapbox/pbf")
     (synopsis "Decode and encode protocol buffers in Javascript")
@@ -908,7 +893,8 @@ (define-public node-protocol-buffers-schema
        #:phases (modify-phases %standard-phases
                   (add-after 'patch-dependencies 'delete-dependencies
                     (lambda _
-                      (delete-dependencies '("standard" "tape")))))))
+                      (modify-json (delete-dependencies
+                        '("standard" "tape"))))))))
     (home-page "https://github.com/mafintosh/protocol-buffers-schema")
     (synopsis "Protocol buffers schema parser written in Javascript")
     (description "This package provides a protocol buffers schema parser
@@ -935,26 +921,27 @@ (define-public node-readable-stream
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies `("@babel/cli"
-                                    "@babel/core"
-                                    "@babel/polyfill"
-                                    "@babel/preset-env"
-                                    "airtap"
-                                    "assert"
-                                    "bl"
-                                    "deep-strict-equal"
-                                    "events.once"
-                                    "glob"
-                                    "gunzip-maybe"
-                                    "hyperquest"
-                                    "lolex"
-                                    "nyc"
-                                    "pump"
-                                    "rimraf"
-                                    "tap"
-                                    "tape"
-                                    "tar-fs"
-                                    "util-promisify")))))
+             (modify-json (delete-dependencies
+               `("@babel/cli"
+                 "@babel/core"
+                 "@babel/polyfill"
+                 "@babel/preset-env"
+                 "airtap"
+                 "assert"
+                 "bl"
+                 "deep-strict-equal"
+                 "events.once"
+                 "glob"
+                 "gunzip-maybe"
+                 "hyperquest"
+                 "lolex"
+                 "nyc"
+                 "pump"
+                 "rimraf"
+                 "tap"
+                 "tape"
+                 "tar-fs"
+                 "util-promisify"))))))
        #:tests? #f))
     (inputs (list node-util-deprecate node-string-decoder node-inherits))
     (home-page "https://github.com/nodejs/readable-stream")
@@ -983,7 +970,8 @@ (define-public node-resolve-protobuf-schema
        #:phases (modify-phases %standard-phases
                   (add-after 'patch-dependencies 'delete-dependencies
                     (lambda _
-                      (delete-dependencies '("standard" "tape")))))))
+                      (modify-json (delete-dependencies
+                        '("standard" "tape"))))))))
     (inputs (list node-protocol-buffers-schema))
     (home-page "https://github.com/mafintosh/resolve-protobuf-schema")
     (synopsis "Resolve protobuf imports")
@@ -1012,7 +1000,7 @@ (define-public node-safe-buffer
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies '("tape" "standard")))))
+             (modify-json (delete-dependencies '("tape" "standard"))))))
        #:tests? #f))
     (home-page "https://github.com/feross/safe-buffer")
     (synopsis "Buffer creation with explicit semantics")
@@ -1040,20 +1028,21 @@ (define-public node-safe-stable-stringify
        #:phases (modify-phases %standard-phases
                   (add-after 'patch-dependencies 'delete-dependencies
                     (lambda _
-                      (delete-dependencies '("benchmark" "clone"
-                                             "fast-json-stable-stringify"
-                                             "fast-safe-stringify"
-                                             "fast-stable-stringify"
-                                             "faster-stable-stringify"
-                                             "fastest-stable-stringify"
-                                             "json-stable-stringify"
-                                             "json-stringify-deterministic=
"
-                                             "json-stringify-safe"
-                                             "standard"
-                                             "tap"
-                                             "typescript"
-                                             "@types/node"
-
"@types/json-stable-stringify")))))))
+                      (modify-json (delete-dependencies
+                        '("benchmark" "clone"
+                          "fast-json-stable-stringify"
+                          "fast-safe-stringify"
+                          "fast-stable-stringify"
+                          "faster-stable-stringify"
+                          "fastest-stable-stringify"
+                          "json-stable-stringify"
+                          "json-stringify-deterministic"
+                          "json-stringify-safe"
+                          "standard"
+                          "tap"
+                          "typescript"
+                          "@types/node"
+                          "@types/json-stable-stringify"))))))))
     (home-page "https://github.com/BridgeAR/safe-stable-stringify")
     (synopsis "Serialization of javascript objects")
     (description
@@ -1111,7 +1100,7 @@ (define-public node-semver
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies '("tap")))))
+             (modify-json (delete-dependencies '("tap"))))))
        ;; FIXME: Tests depend on node-tap
        #:tests? #f))
     (home-page "https://github.com/npm/node-semver")
@@ -1151,7 +1140,8 @@ (define-public node-serialport
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies `("@serialport/binding-mock"))))
+             (modify-json (delete-dependencies
+               `("@serialport/binding-mock")))))
          (add-after 'unpack 'chdir
            (lambda args
              (chdir "packages/serialport"))))
@@ -1210,25 +1200,10 @@ (define-public node-serialport-bindings
              (chdir "packages/bindings")))
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies `("prebuild-install"
-                                    ;; devDependencies
-                                    "@serialport/binding-mock"
-                                    "node-abi"))))
-         (add-after 'chdir 'avoid-prebuild-install
-           (lambda args
-             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
-               (map
-                 (match-lambda
-                   (("scripts" . scripts-alist)
-                     (cons "scripts" (filter
-                       (match-lambda
-                         (("install" . _) #f)
-                         (_ #t))
-                       scripts-alist)))
-                   (("gypfile" . _)
-                     (cons "gypfile" #f))
-                   (other other))
-                 pkg-meta-alist))))))
+             (modify-json
+               (delete-dependencies `(
+                 ;; devDependencies
+                 "node-abi"))))))
        #:tests? #f))
     (synopsis "Abstract base class for Node SerialPort bindings")
     (description "Node SerialPort is a modular suite of Node.js packages f=
or
@@ -1409,8 +1384,9 @@ (define-public node-serialport-stream
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies `(;; devDependencies
-                                    "@serialport/binding-mock"))))
+             (modify-json
+               (delete-dependencies ;; devDependencies
+                 `("@serialport/binding-mock")))))
          (add-after 'unpack 'chdir
            (lambda args
              (chdir "packages/stream"))))
@@ -1461,7 +1437,7 @@ (define-public node-sqlite3
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies
+             (modify-json (delete-dependencies
               `(;; Normally, this is "built" using @mapbox/node-pre-gyp,
                 ;; which publishes or downloads pre-built binaries or
                 ;; falls back to building from source.  Here, we patch out
@@ -1480,7 +1456,7 @@ (define-public node-sqlite3
                 "node-gyp"
                 ;; These we'd like, we just don't have them yet:
                 "eslint"
-                "mocha"))))
+                "mocha")))))
          (add-before 'configure 'npm-config-sqlite
            ;; We need this step even if we do replace @mapbox/node-pre-gyp
            ;; because the package expects to build its bundled sqlite
@@ -1514,8 +1490,9 @@ (define-public node-sqlite3
              (substitute* ".npmignore"
                (("lib/binding")
                 "#lib/binding # <- patched for Guix"))
-             (with-atomic-json-file-replacement (lambda (pkg-meta-alist)
-               (let ((binary-alist (assoc-ref pkg-meta-alist "binary")))
+             (modify-json
+               (lambda (pkg-meta-alist)
+                 (let ((binary-alist (assoc-ref pkg-meta-alist "binary")))
                  ;; When it builds from source, node-pre-gyp supplies
                  ;; module_name and module_path based on the entries under
                  ;; "binary" from "package.json", so this package's
@@ -1528,19 +1505,11 @@ (define-public node-sqlite3
                    (assoc-ref binary-alist "module_name")
                    " module_path=3D"
                    (assoc-ref binary-alist "module_path"))))
+                 pkg-meta-alist)
                ;; We need to remove the install script from "package.json"=
,
                ;; as it would try to use node-pre-gyp and would block the
                ;; automatic building performed by `npm install`.
-               (map
-                 (match-lambda
-                   (("scripts" . scripts-alist)
-                     (cons "scripts" (filter
-                       (match-lambda
-                         (("install" . _) #f)
-                         (_ #t))
-                       scripts-alist)))
-                   (other other))
-                 pkg-meta-alist))))))))
+               (delete-fields `(("scripts" "install")))))))))
     (home-page "https://github.com/mapbox/node-sqlite3")
     (synopsis "Node.js bindings for SQLite3")
     (description
@@ -1623,8 +1592,8 @@ (define-public node-string-decoder
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies
-              '("tap" "core-util-is" "babel-polyfill")))))
+             (modify-json (delete-dependencies
+              '("tap" "core-util-is" "babel-polyfill"))))))
        ;; FIXME: Tests depend on node-tap
        #:tests? #f))
     (inputs (list node-safe-buffer node-inherits))
@@ -1678,7 +1647,7 @@ (define-public node-wrappy
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies '("tap")))))))
+             (modify-json (delete-dependencies '("tap"))))))))
     (home-page "https://github.com/npm/wrappy")
     (synopsis "Callback wrapping utility")
     (description "@code{wrappy} is a utility for Node.js to wrap callbacks=
.")
@@ -1703,7 +1672,8 @@ (define-public node-yazl
        #:phases (modify-phases %standard-phases
                   (add-after 'patch-dependencies 'delete-dependencies
                     (lambda _
-                      (delete-dependencies '("airtap" "bl" "istanbul"
"yauzl")))))))
+                      (modify-json (delete-dependencies
+                        '("airtap" "bl" "istanbul" "yauzl"))))))))
     (inputs (list node-buffer-crc32))
     (home-page "https://github.com/thejoshwolfe/yazl")
     (synopsis "Yet another zip library for node")
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 20acffb3df..a13ec5d077 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -13,6 +13,7 @@
 ;;; Copyright =C2=A9 2021, 2022 Philip McGrath <philip@HIDDEN>
 ;;; Copyright =C2=A9 2022 Hilton Chain <hako@HIDDEN>
 ;;; Copyright =C2=A9 2024 Efraim Flashner <efraim@HIDDEN>
+;;; Copyright =C2=A9 2024 Daniel Khodabakhsh <d.khodabakhsh@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -366,7 +367,7 @@ (define-public node-semver-bootstrap
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies '("tap")))))))
+             (modify-json (delete-dependencies '("tap"))))))))
     (home-page "https://github.com/npm/node-semver")
     (properties '((hidden? . #t)))
     (synopsis "Parses semantic versions strings")
@@ -397,11 +398,12 @@ (define-public node-ms-bootstrap
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies '("eslint"
-                                    "expect.js"
-                                    "husky"
-                                    "lint-staged"
-                                    "mocha")))))))
+             (modify-json (delete-dependencies
+               '("eslint"
+                 "expect.js"
+                 "husky"
+                 "lint-staged"
+                 "mocha"))))))))
     (home-page "https://github.com/zeit/ms#readme")
     (properties '((hidden? . #t)))
     (synopsis "Tiny millisecond conversion utility")
@@ -431,7 +433,7 @@ (define-public node-binary-search-bootstrap
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies `("chai" "mocha")))))))
+             (modify-json (delete-dependencies `("chai" "mocha"))))))))
     (home-page "https://github.com/darkskyapp/binary-search#readme")
     (properties '((hidden? . #t)))
     (synopsis "Tiny binary search function with comparators")
@@ -460,17 +462,18 @@ (define-public node-debug-bootstrap
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies `("brfs"
-                                    "browserify"
-                                    "coveralls"
-                                    "istanbul"
-                                    "karma"
-                                    "karma-browserify"
-                                    "karma-chrome-launcher"
-                                    "karma-mocha"
-                                    "mocha"
-                                    "mocha-lcov-reporter"
-                                    "xo")))))))
+             (modify-json (delete-dependencies
+               `("brfs"
+                 "browserify"
+                 "coveralls"
+                 "istanbul"
+                 "karma"
+                 "karma-browserify"
+                 "karma-chrome-launcher"
+                 "karma-mocha"
+                 "mocha"
+                 "mocha-lcov-reporter"
+                 "xo"))))))))
     (inputs (list node-ms-bootstrap))
     (home-page "https://github.com/visionmedia/debug#readme")
     (properties '((hidden? . #t)))
@@ -526,12 +529,13 @@ (define-public node-llparse-builder-bootstrap
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda _
-             (delete-dependencies `("@types/mocha"
-                                    "@types/node"
-                                    "mocha"
-                                    "ts-node"
-                                    "tslint"
-                                    "typescript"))))
+             (modify-json (delete-dependencies
+               `("@types/mocha"
+                 "@types/node"
+                 "mocha"
+                 "ts-node"
+                 "tslint"
+                 "typescript")))))
          (replace 'build
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((esbuild (search-input-file inputs "/bin/esbuild")))
@@ -587,13 +591,14 @@ (define-public node-llparse-frontend-bootstrap
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies `("@types/debug"
-                                    "@types/mocha"
-                                    "@types/node"
-                                    "mocha"
-                                    "ts-node"
-                                    "tslint"
-                                    "typescript"))))
+             (modify-json (delete-dependencies
+               `("@types/debug"
+                 "@types/mocha"
+                 "@types/node"
+                 "mocha"
+                 "ts-node"
+                 "tslint"
+                 "typescript")))))
          (replace 'build
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((esbuild (search-input-file inputs "/bin/esbuild")))
@@ -648,15 +653,16 @@ (define-public node-llparse-bootstrap
        (modify-phases %standard-phases
          (add-after 'patch-dependencies 'delete-dependencies
            (lambda args
-             (delete-dependencies `("@types/debug"
-                                    "@types/mocha"
-                                    "@types/node"
-                                    "esm"
-                                    "llparse-test-fixture"
-                                    "mocha"
-                                    "ts-node"
-                                    "tslint"
-                                    "typescript"))))
+             (modify-json (delete-dependencies
+               `("@types/debug"
+                 "@types/mocha"
+                 "@types/node"
+                 "esm"
+                 "llparse-test-fixture"
+                 "mocha"
+                 "ts-node"
+                 "tslint"
+                 "typescript")))))
          (replace 'build
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((esbuild (search-input-file inputs "/bin/esbuild")))
diff --git a/guix/build/node-build-system.scm b/guix/build/node-build-syste=
m.scm
index df7ea7774c..ea23d92a05 100644
--- a/guix/build/node-build-system.scm
+++ b/guix/build/node-build-system.scm
@@ -31,18 +31,14 @@ (define-module (guix build node-build-system)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-71)
   #:export (%standard-phases
-            with-atomic-json-file-replacement
             delete-dependencies
-            node-build))
-
-(define* (with-atomic-json-file-replacement proc
-  #:optional (file "package.json"))
-  "Like 'with-atomic-file-replacement', but PROC is called with a single
-argument---the result of parsing FILE's contents as json---and should a va=
lue
-to be written as json to the replacement FILE."
-  (with-atomic-file-replacement file
-    (lambda (in out)
-      (scm->json (proc (json->scm in)) out))))
+            delete-dev-dependencies
+            delete-fields
+            modify-json
+            modify-json-fields
+            node-build
+            replace-fields
+            with-atomic-json-file-replacement))

 (define* (assoc-ref* alist key #:optional default)
   "Like assoc-ref, but return DEFAULT instead of #f if no value exists."
@@ -72,6 +68,161 @@ (define* (alist-update alist key proc #:optional (=3D e=
qual?))
       (acons key (proc (cdr pair)) rest)
       alist)))

+;;;
+;;; package.json modification procedures
+;;;
+
+(define* (with-atomic-json-file-replacement proc
+  #:optional (file "package.json"))
+  "Like 'with-atomic-file-replacement', but PROC is called with a single
+argument---the result of parsing FILE's contents as json---and should a va=
lue
+to be written as json to the replacement FILE."
+  (with-atomic-file-replacement file
+    (lambda (in out)
+      (scm->json (proc (json->scm in)) out))))
+
+(define* (modify-json #:key (file "package.json") #:rest all-arguments)
+  "Provide package.json modifying callbacks such as (delete-dependencies .=
..)"
+  (let
+    (
+      (modifications
+        (let loop ((arguments all-arguments))
+          (cond
+            ((null? arguments) '())
+            ((keyword? (car arguments)) (loop (cddr arguments)))
+            (else (cons (car arguments) (loop (cdr arguments))))))))
+    (with-atomic-json-file-replacement
+      (lambda (package)
+        (fold
+          (lambda (modification package)
+            (modification package))
+          package
+          modifications))
+      file)))
+
+(define (delete-dependencies dependencies-to-remove)
+  "Rewrite 'package.json' to allow the build to proceed without packages
+listed in 'dependencies-to-remove', a list of strings naming npm packages.
+
+To prevent the deleted dependencies from being reintroduced, use this func=
tion
+only after the 'patch-dependencies' phase."
+  (lambda (pkg-meta)
+    (fold
+      (lambda (dependency-key pkg-meta)
+        (alist-update
+          pkg-meta
+          dependency-key
+          (lambda (dependencies)
+            (remove
+              (lambda (dependency)
+                (member (car dependency) dependencies-to-remove))
+              dependencies))))
+      pkg-meta
+      (list
+        "devDependencies"
+        "dependencies"
+        "peerDependencies"
+        "optionalDependencies"))))
+
+(define* (modify-json-fields
+    fields
+    field-modifier
+    #:key
+      (field-path-mapper (lambda (field) field))
+      (insert? #f)
+      (strict? #t))
+  "Provides a lambda to supply to modify-json which modifies the specified
+ json file.
+- `fields` is a list procedure-specific data structures which should inclu=
de
+ the definition of a `field-path` in one of two syntaxes: dot-syntax strin=
g
+ such as `\"devDependencies.esbuild\"`, or a list of strings such as
+ `(list \"devDependencies\" \"esbuild\")`.
+- `field-modifier` is a lambda which is invoked at the position of the fie=
ld.
+ It is supplied with the current field definition, the association list (a=
list)
+ at the field location in the json file, and the field name, also called `=
key`.
+- `field-path-mapper` is a lambda which instructs where the field-path is
+ located within the field structure.
+- `insert?` allows the creation of the field and any missing intermediate
+ fields.
+- `strict?` causes an error to be thrown if the exact field-path is not fo=
und
+ in the data"
+  (lambda (package)
+    (fold
+      (lambda (field package)
+        (let*
+          (
+            (field-path (field-path-mapper field))
+            (
+              field-path
+              (cond
+                ((string? field-path)
+                  (string-split field-path #\.))
+                ((and (list? field-path) (every string? field-path))
+                  field-path)
+                (else
+                  (error
+                    (string-append
+                      "Invalid field value provided, expecting a string or=
 a "
+                      "list of string but instead got: "
+                      (with-output-to-string (lambda _ (display
field-path))))))
+              )))
+          (let loop
+            (
+              (data package)
+              (field-path field-path))
+            (let*
+              (
+                (key (car field-path))
+                (data
+                  (if (and (not (assoc key data)) insert?)
+                    (acons key '() data)
+                    data)))
+              (if (not (assoc key data))
+                (if strict?
+                  (error (string-append
+                    "Key '" key "' was not found in data: "
+                    (with-output-to-string (lambda _ (display data)))))
+                  data)
+                (if (=3D (length field-path) 1)
+                  (field-modifier field data key)
+                  (assoc-set!
+                    data
+                    key
+                    (loop (assoc-ref data key) (cdr field-path)))))))))
+      package
+      fields)))
+
+(define* (delete-fields fields #:key (strict? #t))
+  "Provides a lambda to supply to modify-json which deletes the specified
+ `fields` which is a list of field-paths as mentioned in `modify-json-fiel=
ds`.
+ Examples:
+  (delete-fields '(
+    (\"path\" \"to\" \"field\")
+    \"path.to.other.field\"))"
+  (modify-json-fields
+    fields
+    (lambda (_ data key)
+      (assoc-remove! data key))
+    #:strict? strict?))
+
+(define* (replace-fields fields #:key (strict? #t))
+  "Provides a lambda to supply to modify-json which replaces the value of =
the
+ supplied field. `fields` is a list of pairs, where the first element is t=
he
+ field-path and the second element is the value to replace the target with=
.
+ Examples:
+  (replace-fields '(
+    ((\"path\" \"to\" \"field\") \"new field value\")
+    (\"path.to.other.field\" \"new field value\")))"
+  (modify-json-fields
+    fields
+    (lambda (field data key)
+      (assoc-set! data key (cdr field)))
+    #:field-path-mapper (lambda (field) (car field))
+    #:strict? strict?))
+
+(define (delete-dev-dependencies)
+  (delete-fields (list "devDependencies") #:strict #f))
+
 ;;;
 ;;; Phases.
 ;;;
@@ -144,31 +295,6 @@ (define* (patch-dependencies #:key inputs
#:allow-other-keys)
                   (assoc-ref* pkg-meta "dependencies" '())))))))))
   #t)

-(define (delete-dependencies dependencies-to-remove)
-  "Rewrite 'package.json' to allow the build to proceed without packages
-listed in 'dependencies-to-remove', a list of strings naming npm packages.
-
-To prevent the deleted dependencies from being reintroduced, use this func=
tion
-only after the 'patch-dependencies' phase."
-  (with-atomic-json-file-replacement
-    (lambda (pkg-meta)
-      (fold
-        (lambda (dependency-key pkg-meta)
-          (alist-update
-            pkg-meta
-            dependency-key
-            (lambda (dependencies)
-              (remove
-                (lambda (dependency)
-                  (member (car dependency) dependencies-to-remove))
-                dependencies))))
-        pkg-meta
-        (list
-          "devDependencies"
-          "dependencies"
-          "peerDependencies"
-          "optionalDependencies")))))
-
 (define* (delete-lockfiles #:key inputs #:allow-other-keys)
   "Delete 'package-lock.json', 'yarn.lock', and 'npm-shrinkwrap.json', if =
they
 exist."
--=20
2.46.0

--000000000000e12ff3062a6fccd4
Content-Type: text/x-patch; charset="UTF-8"; 
	name="0002-Introduce-modify-json-delete-fields-and-replace-fields.patch"
Content-Disposition: attachment; 
	filename="0002-Introduce-modify-json-delete-fields-and-replace-fields.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_m5a5il660>
X-Attachment-Id: f_m5a5il660

RnJvbSBhYzU0NDMzYThhYWU0Y2Q2ZTZjNjYwMjYzNTAzYjk2NjYwYTM1ZmE4IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpNZXNzYWdlLUlEOiA8YWM1NDQzM2E4YWFlNGNkNmU2YzY2MDI2MzUwM2I5
NjY2MGEzNWZhOC4xNzM1NDk4MTgzLmdpdC5kLmtob2RhYmFraHNoQGdtYWlsLmNvbT4KSW4tUmVw
bHktVG86IDxlNGVhN2I4OGNlMzliMWY1YjI0ODE4MTc0ZjJlNWMxNzQyNGYzYWRjLjE3MzU0OTgx
ODMuZ2l0LmQua2hvZGFiYWtoc2hAZ21haWwuY29tPgpSZWZlcmVuY2VzOiA8ZTRlYTdiODhjZTM5
YjFmNWIyNDgxODE3NGYyZTVjMTc0MjRmM2FkYy4xNzM1NDk4MTgzLmdpdC5kLmtob2RhYmFraHNo
QGdtYWlsLmNvbT4KRnJvbTogRGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFraHNoQGdtYWls
LmNvbT4KRGF0ZTogU3VuLCAyOSBEZWMgMjAyNCAxMDoyNDoyMyAtMDgwMApTdWJqZWN0OiBbUEFU
Q0ggMi8yXSBJbnRyb2R1Y2UgKG1vZGlmeS1qc29uKSwgKGRlbGV0ZS1maWVsZHMpLCBhbmQKIChy
ZXBsYWNlLWZpZWxkcykgdG8gbm9kZS1idWlsZC1zeXN0ZW0KClRoaXMgY2hhbmdlIGludHJvZHVj
ZXMgaGVscGVyIHByb2NlZHVyZXMgKG1vZGlmeS1qc29uKSB3aGljaCB0YWtlcyBpbiBsYW1iZGFz
CiB3aGljaCBtb2RpZnkgdGhlIHRhcmdldCBqc29uICM6ZmlsZSB3aGljaCBkZWZhdWx0cyB0byBw
YWNrYWdlLmpzb24KVGhpcyBjaGFuZ2UgYWxzbyBpbmNsdWRlcyAoZGVsZXRlLWZpZWxkcykgYW5k
IChyZXBsYWNlLWZpZWxkcykgdG8gaGVscCBkZWxldGluZwogYW5kIHJlcGxhY2luZyB0aGUgdmFs
dWUgb2YgZmllbGRzIGluIGEgcGFja2FnZS5qc29uIGZpbGUuCgpTaWduZWQtb2ZmLWJ5OiBEYW5p
ZWwgS2hvZGFiYWtoc2ggPGQua2hvZGFiYWtoc2hAZ21haWwuY29tPgpDaGFuZ2UtSWQ6IEk5NTdm
N2NhODE0MDc4ZDIxMzZkNTI2MTk4NTE3NDgyMDIzNWYxMzY5Ci0tLQogZ251L3BhY2thZ2VzL25v
ZGUteHl6LnNjbSAgICAgICAgfCAzMjQgKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLQog
Z251L3BhY2thZ2VzL25vZGUuc2NtICAgICAgICAgICAgfCAgODYgKysrKy0tLS0KIGd1aXgvYnVp
bGQvbm9kZS1idWlsZC1zeXN0ZW0uc2NtIHwgMTk4ICsrKysrKysrKysrKysrKy0tLS0KIDMgZmls
ZXMgY2hhbmdlZCwgMzU1IGluc2VydGlvbnMoKyksIDI1MyBkZWxldGlvbnMoLSkKCmRpZmYgLS1n
aXQgYS9nbnUvcGFja2FnZXMvbm9kZS14eXouc2NtIGIvZ251L3BhY2thZ2VzL25vZGUteHl6LnNj
bQppbmRleCBlYzNmOWZiZmIxLi5jZGM2OWRlMGMxIDEwMDY0NAotLS0gYS9nbnUvcGFja2FnZXMv
bm9kZS14eXouc2NtCisrKyBiL2dudS9wYWNrYWdlcy9ub2RlLXh5ei5zY20KQEAgLTY5LDE4ICs2
OSw3IEBAIChkZWZpbmUtcHVibGljIG5vZGUtYWNvcm4KICAgICAgICAgICAgICA7OyBXZSBuZWVk
IHRvIHJlbW92ZSB0aGUgcHJlcGFyZSBzY3JpcHQgZnJvbSAicGFja2FnZS5qc29uIiwgYXMKICAg
ICAgICAgICAgICA7OyBpdCB3b3VsZCB0cnkgdG8gdXNlIHRoZSBidWlsZCBlbnZpcm9ubWVudCBh
bmQgd291bGQgYmxvY2sgdGhlCiAgICAgICAgICAgICAgOzsgYXV0b21hdGljIGJ1aWxkaW5nIGJ5
IG90aGVyIHBhY2thZ2VzIG1ha2luZyB1c2Ugb2Ygbm9kZS1hY29ybi4KLSAgICAgICAgICAgICA7
OyBUT0RPOiBBZGQgdXRpbGl0eSBmdW5jdGlvbgotICAgICAgICAgICAgICh3aXRoLWF0b21pYy1q
c29uLWZpbGUtcmVwbGFjZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCi0gICAgICAgICAg
ICAgICAobWFwCi0gICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAg
ICAgICAoKCJzY3JpcHRzIiAuIHNjcmlwdHMtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAgICAo
Y29ucyAic2NyaXB0cyIgKGZpbHRlcgotICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFt
YmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgKCgicHJlcGFyZSIgLiBfKSAjZikKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAoXyAjdCkpCi0gICAgICAgICAgICAgICAgICAgICAgIHNjcmlw
dHMtYWxpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAob3RoZXIgb3RoZXIpKQotICAgICAgICAg
ICAgICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpCisgICAgICAgICAgICAgKG1vZGlmeS1qc29uIChk
ZWxldGUtZmllbGRzICcoKCJzY3JpcHRzIiAicHJlcGFyZSIpKSkpKSkKICAgICAgICAgIChyZXBs
YWNlICdidWlsZAogICAgICAgICAgICAobGFtYmRhKiAoIzprZXkgaW5wdXRzIG5hdGl2ZS1pbnB1
dHMgIzphbGxvdy1vdGhlci1rZXlzKQogICAgICAgICAgICAgIChsZXQgKChlc2J1aWxkIChzZWFy
Y2gtaW5wdXQtZmlsZSAob3IgbmF0aXZlLWlucHV0cyBpbnB1dHMpCkBAIC0xMzYsMzggKzEyNSwy
NiBAQCAoZGVmaW5lLXB1YmxpYyBub2RlLWFkZG9uLWFwaQogICAgICAgIChtb2RpZnktcGhhc2Vz
ICVzdGFuZGFyZC1waGFzZXMKICAgICAgICAgIChhZGQtYWZ0ZXIgJ3BhdGNoLWRlcGVuZGVuY2ll
cyAnZGVsZXRlLWRlcGVuZGVuY2llcwogICAgICAgICAgICAobGFtYmRhIGFyZ3MKLSAgICAgICAg
ICAgICAoZGVsZXRlLWRlcGVuZGVuY2llcwotICAgICAgICAgICAgICBgKCJiZW5jaG1hcmsiCi0g
ICAgICAgICAgICAgICAgImJpbmRpbmdzIgotICAgICAgICAgICAgICAgICJjbGFuZy1mb3JtYXQi
Ci0gICAgICAgICAgICAgICAgImVzbGludCIKLSAgICAgICAgICAgICAgICAiZXNsaW50LWNvbmZp
Zy1zZW1pc3RhbmRhcmQiCi0gICAgICAgICAgICAgICAgImVzbGludC1jb25maWctc3RhbmRhcmQi
Ci0gICAgICAgICAgICAgICAgImVzbGludC1wbHVnaW4taW1wb3J0IgotICAgICAgICAgICAgICAg
ICJlc2xpbnQtcGx1Z2luLW5vZGUiCi0gICAgICAgICAgICAgICAgImVzbGludC1wbHVnaW4tcHJv
bWlzZSIKLSAgICAgICAgICAgICAgICAiZnMtZXh0cmEiCi0gICAgICAgICAgICAgICAgIm5lb3N0
YW5kYXJkIgotICAgICAgICAgICAgICAgICJwYXRoIgotICAgICAgICAgICAgICAgICJwcmUtY29t
bWl0IgotICAgICAgICAgICAgICAgICJzZW12ZXIiKSkpKQotICAgICAgICAgKGFkZC1hZnRlciAn
dW5wYWNrICdza2lwLWpzLXRlc3RzCi0gICAgICAgICAgIDs7IFdlIGNhbid0IHJ1biB0aGUganMt
YmFzZWQgdGVzdHMsCi0gICAgICAgICAgIDs7IGJ1dCB3ZSBjYW4gc3RpbGwgZG8gdGhlIEMrKyBw
YXJ0cwotICAgICAgICAgICAobGFtYmRhIGFyZ3MKLSAgICAgICAgICAgICAoZGVmaW5lIG5ldy10
ZXN0LXNjcmlwdAotICAgICAgICAgICAgICAgImVjaG8gc3RvcHBpbmcgYWZ0ZXIgcHJldGVzdCBv
biBHdWl4IikKLSAgICAgICAgICAgICAod2l0aC1hdG9taWMtanNvbi1maWxlLXJlcGxhY2VtZW50
IChsYW1iZGEgKHBrZy1tZXRhLWFsaXN0KQotICAgICAgICAgICAgICAgKG1hcAotICAgICAgICAg
ICAgICAgICAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgKCgic2NyaXB0cyIgLiBz
Y3JpcHRzLWFsaXN0KQotICAgICAgICAgICAgICAgICAgICAgKGNvbnMgInNjcmlwdHMiIChtYXAK
LSAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoLWxhbWJkYQotICAgICAgICAgICAgICAgICAg
ICAgICAgICgoInRlc3QiIC4gXykgKGNvbnMgInRlc3QiIG5ldy10ZXN0LXNjcmlwdCkpCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgKG90aGVyIG90aGVyKSkKLSAgICAgICAgICAgICAgICAgICAg
ICAgc2NyaXB0cy1hbGlzdCkpKQotICAgICAgICAgICAgICAgICAgIChvdGhlciBvdGhlcikpCi0g
ICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpKSkKKyAgICAgICAgICAgICAobW9k
aWZ5LWpzb24KKyAgICAgICAgICAgICAgIChkZWxldGUtZGVwZW5kZW5jaWVzIGAoCisgICAgICAg
ICAgICAgICAgICJiZW5jaG1hcmsiCisgICAgICAgICAgICAgICAgICJiaW5kaW5ncyIKKyAgICAg
ICAgICAgICAgICAgImNsYW5nLWZvcm1hdCIKKyAgICAgICAgICAgICAgICAgImVzbGludCIKKyAg
ICAgICAgICAgICAgICAgImVzbGludC1jb25maWctc2VtaXN0YW5kYXJkIgorICAgICAgICAgICAg
ICAgICAiZXNsaW50LWNvbmZpZy1zdGFuZGFyZCIKKyAgICAgICAgICAgICAgICAgImVzbGludC1w
bHVnaW4taW1wb3J0IgorICAgICAgICAgICAgICAgICAiZXNsaW50LXBsdWdpbi1ub2RlIgorICAg
ICAgICAgICAgICAgICAiZXNsaW50LXBsdWdpbi1wcm9taXNlIgorICAgICAgICAgICAgICAgICAi
ZnMtZXh0cmEiCisgICAgICAgICAgICAgICAgICJuZW9zdGFuZGFyZCIKKyAgICAgICAgICAgICAg
ICAgInBhdGgiCisgICAgICAgICAgICAgICAgICJwcmUtY29tbWl0IgorICAgICAgICAgICAgICAg
ICAic2VtdmVyIikpCisgICAgICAgICAgICAgICA7OyBXZSBjYW4ndCBydW4gdGhlIGpzLWJhc2Vk
IHRlc3RzLAorICAgICAgICAgICAgICAgOzsgYnV0IHdlIGNhbiBzdGlsbCBkbyB0aGUgQysrIHBh
cnRzCisgICAgICAgICAgICAgICAocmVwbGFjZS1maWVsZHMgKGxpc3QgKGNvbnMKKyAgICAgICAg
ICAgICAgICAgInNjcmlwdHMudGVzdCIgImVjaG8gc3RvcHBpbmcgYWZ0ZXIgcHJldGVzdCBvbiBH
dWl4IikpKSkpKSkpKQogICAgIChob21lLXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMv
bm9kZS1hZGRvbi1hcGkiKQogICAgIChzeW5vcHNpcyAiTm9kZS5qcyBBUEkgKE5vZGUtQVBJKSBo
ZWFkZXItb25seSBDKysgd3JhcHBlcnMiKQogICAgIChkZXNjcmlwdGlvbiAiVGhpcyBtb2R1bGUg
Y29udGFpbnMgaGVhZGVyLW9ubHkgQysrIHdyYXBwZXIgY2xhc3NlcyB3aGljaApAQCAtMjMyLDcg
KzIwOSw3IEBAIChkZWZpbmUtcHVibGljIG5vZGUtYnVmZmVyLWNyYzMyCiAgICAgICAgIzpwaGFz
ZXMgKG1vZGlmeS1waGFzZXMgJXN0YW5kYXJkLXBoYXNlcwogICAgICAgICAgICAgICAgICAgKGFk
ZC1hZnRlciAncGF0Y2gtZGVwZW5kZW5jaWVzICdkZWxldGUtZGVwZW5kZW5jaWVzCiAgICAgICAg
ICAgICAgICAgICAgIChsYW1iZGEgXwotICAgICAgICAgICAgICAgICAgICAgIChkZWxldGUtZGVw
ZW5kZW5jaWVzICcoInRhcCIpKSkpKSkpCisgICAgICAgICAgICAgICAgICAgICAgKG1vZGlmeS1q
c29uIChkZWxldGUtZGVwZW5kZW5jaWVzICcoInRhcCIpKSkpKSkpKQogICAgIChob21lLXBhZ2Ug
Imh0dHBzOi8vZ2l0aHViLmNvbS9icmlhbmxvdmVzd29yZHMvYnVmZmVyLWNyYzMyIikKICAgICAo
c3lub3BzaXMgIkNSQzMyIGltcGxlbWVudGF0aW9uIGluIEphdmFzY3JpcHQiKQogICAgIChkZXNj
cmlwdGlvbgpAQCAtMjg4LDE0ICsyNjUsMTUgQEAgKGRlZmluZS1wdWJsaWMgbm9kZS1jcngzCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmltaXN0IikpKSkKICAgICAgICAgICAgICAgICAg
IChhZGQtYWZ0ZXIgJ3BhdGNoLWRlcGVuZGVuY2llcyAnZGVsZXRlLWRlcGVuZGVuY2llcwogICAg
ICAgICAgICAgICAgICAgICAobGFtYmRhIF8KLSAgICAgICAgICAgICAgICAgICAgICAoZGVsZXRl
LWRlcGVuZGVuY2llcyAnKCJjOCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJkb2NkYXNoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgImVzbGludCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICJlc2xpbnQtcGx1Z2luLWpzZG9jIgotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgImpzZG9jIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgInRhcC1kaWZmIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgInRhcGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAidGFwZS1jYXRjaCIpKSkpKSkpCisgICAgICAgICAgICAgICAgICAgICAgKG1v
ZGlmeS1qc29uIChkZWxldGUtZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAn
KCJjOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImRvY2Rhc2giCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICJlc2xpbnQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlc2xpbnQt
cGx1Z2luLWpzZG9jIgorICAgICAgICAgICAgICAgICAgICAgICAgICAianNkb2MiCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICJ0YXAtZGlmZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
InRhcGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXBlLWNhdGNoIikpKSkpKSkpCiAg
ICAgKGlucHV0cyAobGlzdCBub2RlLW1pbmltaXN0IG5vZGUtcGJmIG5vZGUteWF6bCkpCiAgICAg
KGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2Fod2F5YWtjaGloL2NyeDMiKQogICAgIChz
eW5vcHNpcyAiQ3JlYXRlIENSWHYzIGJyb3dzZXIgZXh0ZW5zaW9ucyB3aXRoIEphdmFzY3JpcHQi
KQpAQCAtMzI1LDE4ICszMDMsMTkgQEAgKGRlZmluZS1wdWJsaWMgbm9kZS1kZWJ1ZwogICAgICAg
IChtb2RpZnktcGhhc2VzICVzdGFuZGFyZC1waGFzZXMKICAgICAgICAgIChhZGQtYWZ0ZXIgJ3Bh
dGNoLWRlcGVuZGVuY2llcyAnZGVsZXRlLWRlcGVuZGVuY2llcwogICAgICAgICAgICAobGFtYmRh
IGFyZ3MKLSAgICAgICAgICAgICAoZGVsZXRlLWRlcGVuZGVuY2llcyBgKCJicmZzIgotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJyb3dzZXJpZnkiCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAiY292ZXJhbGxzIgotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgImlzdGFuYnVsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgImthcm1hIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImthcm1h
LWJyb3dzZXJpZnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2FybWEt
Y2hyb21lLWxhdW5jaGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImth
cm1hLW1vY2hhIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vY2hhIgot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vY2hhLWxjb3YtcmVwb3J0ZXIi
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieG8iCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiKSkpKSkKKyAgICAgICAgICAg
ICAobW9kaWZ5LWpzb24gKGRlbGV0ZS1kZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgIGAoImJy
ZnMiCisgICAgICAgICAgICAgICAgICJicm93c2VyaWZ5IgorICAgICAgICAgICAgICAgICAiY292
ZXJhbGxzIgorICAgICAgICAgICAgICAgICAiaXN0YW5idWwiCisgICAgICAgICAgICAgICAgICJr
YXJtYSIKKyAgICAgICAgICAgICAgICAgImthcm1hLWJyb3dzZXJpZnkiCisgICAgICAgICAgICAg
ICAgICJrYXJtYS1jaHJvbWUtbGF1bmNoZXIiCisgICAgICAgICAgICAgICAgICJrYXJtYS1tb2No
YSIKKyAgICAgICAgICAgICAgICAgIm1vY2hhIgorICAgICAgICAgICAgICAgICAibW9jaGEtbGNv
di1yZXBvcnRlciIKKyAgICAgICAgICAgICAgICAgInhvIgorICAgICAgICAgICAgICAgICAic3Vw
cG9ydHMtY29sb3IiKSkpKSkpCiAgICAgICAgIzp0ZXN0cz8gI2YpKQogICAgIChob21lLXBhZ2Ug
Imh0dHBzOi8vZ2l0aHViLmNvbS9kZWJ1Zy1qcy9kZWJ1ZyIpCiAgICAgKHN5bm9wc2lzICJEZWJ1
Z2dpbmcgdXRpbGl0eSBmb3IgTm9kZS5qcyIpCkBAIC00MjEsMjEgKzQwMCwyMiBAQCAoZGVmaW5l
LXB1YmxpYyBub2RlLWZpbGUtdXJpLXRvLXBhdGgKICAgICAgICAobW9kaWZ5LXBoYXNlcyAlc3Rh
bmRhcmQtcGhhc2VzCiAgICAgICAgICAoYWRkLWFmdGVyICdwYXRjaC1kZXBlbmRlbmNpZXMgJ2Rl
bGV0ZS1kZXBlbmRlbmNpZXMKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAgICAgICAgICAg
KGRlbGV0ZS1kZXBlbmRlbmNpZXMgYCgiQHR5cGVzL21vY2hhIgotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIkB0eXBlcy9ub2RlIgotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIkB0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luIgotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIkB0eXBlc2NyaXB0LWVzbGludC9wYXJzZXIiCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3B5LWNsaSIKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJlc2xpbnQiCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAiZXNsaW50LWNvbmZpZy1haXJibmIiCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAiZXNsaW50LWNvbmZpZy1wcmV0dGllciIKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICJlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQi
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXNsaW50LXBsdWdpbi1pbXBv
cnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXNsaW50LXBsdWdpbi1q
c3gtYTExeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlc2xpbnQtcGx1
Z2luLXJlYWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vY2hhIgot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJpbXJhZiIKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlc2NyaXB0IikpKSkKKyAgICAgICAgICAgICAo
bW9kaWZ5LWpzb24gKGRlbGV0ZS1kZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgIGAoIkB0eXBl
cy9tb2NoYSIKKyAgICAgICAgICAgICAgICAgIkB0eXBlcy9ub2RlIgorICAgICAgICAgICAgICAg
ICAiQHR5cGVzY3JpcHQtZXNsaW50L2VzbGludC1wbHVnaW4iCisgICAgICAgICAgICAgICAgICJA
dHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyIgorICAgICAgICAgICAgICAgICAiY3B5LWNsaSIKKyAg
ICAgICAgICAgICAgICAgImVzbGludCIKKyAgICAgICAgICAgICAgICAgImVzbGludC1jb25maWct
YWlyYm5iIgorICAgICAgICAgICAgICAgICAiZXNsaW50LWNvbmZpZy1wcmV0dGllciIKKyAgICAg
ICAgICAgICAgICAgImVzbGludC1pbXBvcnQtcmVzb2x2ZXItdHlwZXNjcmlwdCIKKyAgICAgICAg
ICAgICAgICAgImVzbGludC1wbHVnaW4taW1wb3J0IgorICAgICAgICAgICAgICAgICAiZXNsaW50
LXBsdWdpbi1qc3gtYTExeSIKKyAgICAgICAgICAgICAgICAgImVzbGludC1wbHVnaW4tcmVhY3Qi
CisgICAgICAgICAgICAgICAgICJtb2NoYSIKKyAgICAgICAgICAgICAgICAgInJpbXJhZiIKKyAg
ICAgICAgICAgICAgICAgInR5cGVzY3JpcHQiKSkpKSkKICAgICAgICAgIChyZXBsYWNlICdidWls
ZAogICAgICAgICAgICAobGFtYmRhKiAoIzprZXkgaW5wdXRzIG5hdGl2ZS1pbnB1dHMgIzphbGxv
dy1vdGhlci1rZXlzKQogICAgICAgICAgICAgIChjb3B5LXJlY3Vyc2l2ZWx5ICJzcmMiICJkaXN0
IikKQEAgLTQ5Nyw3ICs0NzcsOCBAQCAoZGVmaW5lLXB1YmxpYyBub2RlLWllZWU3NTQKICAgICAg
ICAjOnBoYXNlcyAobW9kaWZ5LXBoYXNlcyAlc3RhbmRhcmQtcGhhc2VzCiAgICAgICAgICAgICAg
ICAgICAoYWRkLWFmdGVyICdwYXRjaC1kZXBlbmRlbmNpZXMgJ2RlbGV0ZS1kZXBlbmRlbmNpZXMK
ICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYSBfCi0gICAgICAgICAgICAgICAgICAgICAgKGRl
bGV0ZS1kZXBlbmRlbmNpZXMgJygiYWlydGFwIiAic3RhbmRhcmQiICJ0YXBlIikpKSkpKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAobW9kaWZ5LWpzb24gKGRlbGV0ZS1kZXBlbmRlbmNpZXMKKyAg
ICAgICAgICAgICAgICAgICAgICAgICcoImFpcnRhcCIgInN0YW5kYXJkIiAidGFwZSIpKSkpKSkp
KQogICAgIChob21lLXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvaWVlZTc1NCIpCiAg
ICAgKHN5bm9wc2lzICJSZWFkL3dyaXRlIElFRUU3NTQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBp
biBKYXZhc2NyaXB0IikKICAgICAoZGVzY3JpcHRpb24gIlRoaXMgcGFja2FnZSBjYW4gcmVhZCBh
bmQgd3JpdGUgSUVFRTc1NCBmbG9hdGluZyBwb2ludApAQCAtNTI0LDcgKzUwNSw3IEBAIChkZWZp
bmUtcHVibGljIG5vZGUtaW5oZXJpdHMKICAgICAgICAobW9kaWZ5LXBoYXNlcyAlc3RhbmRhcmQt
cGhhc2VzCiAgICAgICAgICAoYWRkLWFmdGVyICdwYXRjaC1kZXBlbmRlbmNpZXMgJ2RlbGV0ZS1k
ZXBlbmRlbmNpZXMKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAgICAgICAgICAgKGRlbGV0
ZS1kZXBlbmRlbmNpZXMgJygidGFwIikpKSkpCisgICAgICAgICAgICAgKG1vZGlmeS1qc29uIChk
ZWxldGUtZGVwZW5kZW5jaWVzICcoInRhcCIpKSkpKSkKICAgICAgICA7OyBGSVhNRTogVGVzdHMg
ZGVwZW5kIG9uIG5vZGUtdGFwCiAgICAgICAgIzp0ZXN0cz8gI2YpKQogICAgIChob21lLXBhZ2Ug
Imh0dHBzOi8vZ2l0aHViLmNvbS9pc2FhY3MvaW5oZXJpdHMiKQpAQCAtNTUzLDggKzUzNCw4IEBA
IChkZWZpbmUtcHVibGljIG5vZGUtaXJjCiAgICAgICAgKG1vZGlmeS1waGFzZXMgJXN0YW5kYXJk
LXBoYXNlcwogICAgICAgICAgKGFkZC1hZnRlciAncGF0Y2gtZGVwZW5kZW5jaWVzICdkZWxldGUt
ZGVwZW5kZW5jaWVzCiAgICAgICAgICAgIChsYW1iZGEgYXJncwotICAgICAgICAgICAgIChkZWxl
dGUtZGVwZW5kZW5jaWVzCi0gICAgICAgICAgICAgIGAoImFuc2ktY29sb3IiICJmYXVjZXQiICJq
c2NzIiAidGFwZSIpKSkpKQorICAgICAgICAgICAgIChtb2RpZnktanNvbiAoZGVsZXRlLWRlcGVu
ZGVuY2llcworICAgICAgICAgICAgICBgKCJhbnNpLWNvbG9yIiAiZmF1Y2V0IiAianNjcyIgInRh
cGUiKSkpKSkpCiAgICAgICAgIzp0ZXN0cz8gI2YpKQogICAgIChpbnB1dHMKICAgICAgKGxpc3Qg
bm9kZS1pcmMtY29sb3JzKSkKQEAgLTU4Myw3ICs1NjQsNyBAQCAoZGVmaW5lLXB1YmxpYyBub2Rl
LWlyYy1jb2xvcnMKICAgICAgICAobW9kaWZ5LXBoYXNlcyAlc3RhbmRhcmQtcGhhc2VzCiAgICAg
ICAgICAoYWRkLWFmdGVyICdwYXRjaC1kZXBlbmRlbmNpZXMgJ2RlbGV0ZS1kZXBlbmRlbmNpZXMK
ICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAgICAgICAgICAgKGRlbGV0ZS1kZXBlbmRlbmNp
ZXMgYCgiaXN0YW5idWwiICJ2b3dzIikpKSkpCisgICAgICAgICAgICAgKG1vZGlmeS1qc29uIChk
ZWxldGUtZGVwZW5kZW5jaWVzIGAoImlzdGFuYnVsIiAidm93cyIpKSkpKSkKICAgICAgICAjOnRl
c3RzPyAjZikpCiAgICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2ZlbnQvaXJjLWNv
bG9ycy5qcyIpCiAgICAgKHN5bm9wc2lzICJOb2RlLmpzIG1vZHVsZSBwcm92aWRpbmcgY29sb3Ig
YW5kIGZvcm1hdHRpbmcgZm9yIElSQyIpCkBAIC02NTcsNyArNjM4LDggQEAgKGRlZmluZS1wdWJs
aWMgbm9kZS1taW5pbWlzdAogICAgICAgICM6cGhhc2VzIChtb2RpZnktcGhhc2VzICVzdGFuZGFy
ZC1waGFzZXMKICAgICAgICAgICAgICAgICAgIChhZGQtYWZ0ZXIgJ3BhdGNoLWRlcGVuZGVuY2ll
cyAnZGVsZXRlLWRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgICAgICAobGFtYmRhIF8KLSAg
ICAgICAgICAgICAgICAgICAgICAoZGVsZXRlLWRlcGVuZGVuY2llcyAnKCJjb3ZlcnQiICJ0YXAi
ICJ0YXBlIikpKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAobW9kaWZ5LWpzb24gKGRlbGV0
ZS1kZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICcoImNvdmVydCIgInRhcCIg
InRhcGUiKSkpKSkpKSkKICAgICAoaG9tZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vc3Vic3Rh
Y2svbWluaW1pc3QiKQogICAgIChzeW5vcHNpcyAiUGFyc2UgQ0xJIGFyZ3VtZW50cyBpbiBKYXZh
c2NyaXB0IikKICAgICAoZGVzY3JpcHRpb24gIlRoaXMgcGFja2FnZSBjYW4gc2NhbiBmb3IgQ0xJ
IGZsYWdzIGFuZCBhcmd1bWVudHMgaW4KQEAgLTY4MywxMiArNjY1LDEzIEBAIChkZWZpbmUtcHVi
bGljIG5vZGUtbXMKICAgICAgICAobW9kaWZ5LXBoYXNlcyAlc3RhbmRhcmQtcGhhc2VzCiAgICAg
ICAgICAoYWRkLWFmdGVyICdwYXRjaC1kZXBlbmRlbmNpZXMgJ2RlbGV0ZS1kZXBlbmRlbmNpZXMK
ICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAgICAgICAgICAgKGRlbGV0ZS1kZXBlbmRlbmNp
ZXMgYCgiZXNsaW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVj
dC5qcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodXNreSIKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW50LXN0YWdlZCIKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJtb2NoYSIKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJwcmV0dGllciIpKSkpKQorICAgICAgICAgICAgIChtb2RpZnktanNvbiAo
ZGVsZXRlLWRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgYCgiZXNsaW50IgorICAgICAgICAg
ICAgICAgICAiZXhwZWN0LmpzIgorICAgICAgICAgICAgICAgICAiaHVza3kiCisgICAgICAgICAg
ICAgICAgICJsaW50LXN0YWdlZCIKKyAgICAgICAgICAgICAgICAgIm1vY2hhIgorICAgICAgICAg
ICAgICAgICAicHJldHRpZXIiKSkpKSkpCiAgICAgICAgIzp0ZXN0cz8gI2YpKQogICAgIChob21l
LXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS92ZXJjZWwvbXMiKQogICAgIChzeW5vcHNpcyAiQ29u
dmVydCB0aW1lIHRvIG1pbGxpc2Vjb25kcyIpCkBAIC03MTYsMTQgKzY5OSwxNCBAQCAoZGVmaW5l
LXB1YmxpYyBub2RlLW5hbgogICAgICAgIChtb2RpZnktcGhhc2VzICVzdGFuZGFyZC1waGFzZXMK
ICAgICAgICAgIChhZGQtYWZ0ZXIgJ3BhdGNoLWRlcGVuZGVuY2llcyAnZGVsZXRlLWRlcGVuZGVu
Y2llcwogICAgICAgICAgICAobGFtYmRhIGFyZ3MKLSAgICAgICAgICAgICAoZGVsZXRlLWRlcGVu
ZGVuY2llcworICAgICAgICAgICAgIChtb2RpZnktanNvbiAoZGVsZXRlLWRlcGVuZGVuY2llcwog
ICAgICAgICAgICAgICAnKCJiaW5kaW5ncyIKICAgICAgICAgICAgICAgICAiY29tbWFuZGVyIgog
ICAgICAgICAgICAgICAgICJnbG9iIgogICAgICAgICAgICAgICAgICJyZXF1ZXN0IgogICAgICAg
ICAgICAgICAgICJub2RlLWd5cCIgOzsgd291bGQgYmUgbmVlZGVkIGZvciB0ZXN0cwogICAgICAg
ICAgICAgICAgICJ0YXAiCi0gICAgICAgICAgICAgICAgInh0ZW5kIikpKSkpCisgICAgICAgICAg
ICAgICAgInh0ZW5kIikpKSkpKQogICAgICAgIDs7IHRlc3RzIG5lZWQgdGFwIGFuZCBvdGhlciBk
ZXBlbmRlbmNpZXMKICAgICAgICAjOnRlc3RzPyAjZikpCiAgICAgKGlucHV0cwpAQCAtNzU1LDcg
KzczOCw4IEBAIChkZWZpbmUtcHVibGljIG5vZGUtbm9ybWFsaXplLXBhdGgKICAgICAgICAjOnBo
YXNlcyAobW9kaWZ5LXBoYXNlcyAlc3RhbmRhcmQtcGhhc2VzCiAgICAgICAgICAgICAgICAgICAo
YWRkLWFmdGVyICdwYXRjaC1kZXBlbmRlbmNpZXMgJ2RlbGV0ZS1kZXBlbmRlbmNpZXMKICAgICAg
ICAgICAgICAgICAgICAgKGxhbWJkYSBfCi0gICAgICAgICAgICAgICAgICAgICAgKGRlbGV0ZS1k
ZXBlbmRlbmNpZXMgJygiZ3VscC1mb3JtYXQtbWQiICJtb2NoYSIpKSkpKSkpCisgICAgICAgICAg
ICAgICAgICAgICAgKG1vZGlmeS1qc29uIChkZWxldGUtZGVwZW5kZW5jaWVzCisgICAgICAgICAg
ICAgICAgICAgICAgICAnKCJndWxwLWZvcm1hdC1tZCIgIm1vY2hhIikpKSkpKSkpCiAgICAgKG5h
dGl2ZS1pbnB1dHMgKGxpc3Qgbm9kZS1taW5pbWlzdCkpCiAgICAgKGhvbWUtcGFnZSAiaHR0cHM6
Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvbm9ybWFsaXplLXBhdGgiKQogICAgIChzeW5vcHNp
cyAiTm9ybWFsaXplIHNsYXNoZXMgaW4gYSBmaWxlIHBhdGgiKQpAQCAtNzg0LDcgKzc2OCw3IEBA
IChkZWZpbmUtcHVibGljIG5vZGUtb25jZQogICAgICAgIChtb2RpZnktcGhhc2VzICVzdGFuZGFy
ZC1waGFzZXMKICAgICAgICAgIChhZGQtYWZ0ZXIgJ3BhdGNoLWRlcGVuZGVuY2llcyAnZGVsZXRl
LWRlcGVuZGVuY2llcwogICAgICAgICAgICAobGFtYmRhIGFyZ3MKLSAgICAgICAgICAgICAoZGVs
ZXRlLWRlcGVuZGVuY2llcyAnKCJ0YXAiKSkpKSkKKyAgICAgICAgICAgICAobW9kaWZ5LWpzb24g
KGRlbGV0ZS1kZXBlbmRlbmNpZXMgJygidGFwIikpKSkpKQogICAgICAgIDs7IEZJWE1FOiBUZXN0
cyBkZXBlbmQgb24gbm9kZS10YXAKICAgICAgICAjOnRlc3RzPyAjZikpCiAgICAgKGlucHV0cwpA
QCAtODQxLDcgKzgyNSw4IEBAIChkZWZpbmUtcHVibGljIG5vZGUtcGF0aC1rZXkKICAgICAgICAj
OnBoYXNlcyAobW9kaWZ5LXBoYXNlcyAlc3RhbmRhcmQtcGhhc2VzCiAgICAgICAgICAgICAgICAg
ICAoYWRkLWFmdGVyICdwYXRjaC1kZXBlbmRlbmNpZXMgJ2RlbGV0ZS1kZXBlbmRlbmNpZXMKICAg
ICAgICAgICAgICAgICAgICAgKGxhbWJkYSBfCi0gICAgICAgICAgICAgICAgICAgICAgKGRlbGV0
ZS1kZXBlbmRlbmNpZXMgJygiQHR5cGVzL25vZGUiICJhdmEiICJ0c2QiICJ4byIpKSkpKSkpCisg
ICAgICAgICAgICAgICAgICAgICAgKG1vZGlmeS1qc29uIChkZWxldGUtZGVwZW5kZW5jaWVzCisg
ICAgICAgICAgICAgICAgICAgICAgICAnKCJAdHlwZXMvbm9kZSIgImF2YSIgInRzZCIgInhvIikp
KSkpKSkpCiAgICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9w
YXRoLWtleSIpCiAgICAgKHN5bm9wc2lzICJDcm9zcy1wbGF0Zm9ybSB1dGlsaXR5IHRvIGNvbXB1
dGUgdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUga2V5IikKICAgICAoZGVzY3JpcHRpb24g
IkBjb2Rle3BhdGgta2V5fSBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiB0byBjb21wdXRlIHRo
ZQpAQCAtODY3LDcgKzg1Miw3IEBAIChkZWZpbmUtcHVibGljIG5vZGUtcGJmCiAgICAgICAgIzpw
aGFzZXMgKG1vZGlmeS1waGFzZXMgJXN0YW5kYXJkLXBoYXNlcwogICAgICAgICAgICAgICAgICAg
KGFkZC1hZnRlciAncGF0Y2gtZGVwZW5kZW5jaWVzICdkZWxldGUtZGVwZW5kZW5jaWVzCiAgICAg
ICAgICAgICAgICAgICAgIChsYW1iZGEgXwotICAgICAgICAgICAgICAgICAgICAgIChkZWxldGUt
ZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgICAgKG1vZGlmeS1qc29uIChkZWxldGUt
ZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICAgICAgICAgICcoImJlbmNobWFyayIKICAgICAg
ICAgICAgICAgICAgICAgICAgICAiYnJvd3NlcmlmeSIKICAgICAgICAgICAgICAgICAgICAgICAg
ICAiZXNsaW50IgpAQCAtODc3LDcgKzg2Miw3IEBAIChkZWZpbmUtcHVibGljIG5vZGUtcGJmCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgInByb3RvY29sLWJ1ZmZlcnMiCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgInRhcCIKICAgICAgICAgICAgICAgICAgICAgICAgICAidGlsZS1zdGF0cy1y
dW5uZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgInVnbGlmeS1qcyIpKSkpKSkpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgInVnbGlmeS1qcyIpKSkpKSkpKQogICAgIChpbnB1dHMgKGxp
c3Qgbm9kZS1pZWVlNzU0IG5vZGUtcmVzb2x2ZS1wcm90b2J1Zi1zY2hlbWEpKQogICAgIChob21l
LXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvcGJmIikKICAgICAoc3lub3BzaXMgIkRl
Y29kZSBhbmQgZW5jb2RlIHByb3RvY29sIGJ1ZmZlcnMgaW4gSmF2YXNjcmlwdCIpCkBAIC05MDgs
NyArODkzLDggQEAgKGRlZmluZS1wdWJsaWMgbm9kZS1wcm90b2NvbC1idWZmZXJzLXNjaGVtYQog
ICAgICAgICM6cGhhc2VzIChtb2RpZnktcGhhc2VzICVzdGFuZGFyZC1waGFzZXMKICAgICAgICAg
ICAgICAgICAgIChhZGQtYWZ0ZXIgJ3BhdGNoLWRlcGVuZGVuY2llcyAnZGVsZXRlLWRlcGVuZGVu
Y2llcwogICAgICAgICAgICAgICAgICAgICAobGFtYmRhIF8KLSAgICAgICAgICAgICAgICAgICAg
ICAoZGVsZXRlLWRlcGVuZGVuY2llcyAnKCJzdGFuZGFyZCIgInRhcGUiKSkpKSkpKQorICAgICAg
ICAgICAgICAgICAgICAgIChtb2RpZnktanNvbiAoZGVsZXRlLWRlcGVuZGVuY2llcworICAgICAg
ICAgICAgICAgICAgICAgICAgJygic3RhbmRhcmQiICJ0YXBlIikpKSkpKSkpCiAgICAgKGhvbWUt
cGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL21hZmludG9zaC9wcm90b2NvbC1idWZmZXJzLXNjaGVt
YSIpCiAgICAgKHN5bm9wc2lzICJQcm90b2NvbCBidWZmZXJzIHNjaGVtYSBwYXJzZXIgd3JpdHRl
biBpbiBKYXZhc2NyaXB0IikKICAgICAoZGVzY3JpcHRpb24gIlRoaXMgcGFja2FnZSBwcm92aWRl
cyBhIHByb3RvY29sIGJ1ZmZlcnMgc2NoZW1hIHBhcnNlcgpAQCAtOTM1LDI2ICs5MjEsMjcgQEAg
KGRlZmluZS1wdWJsaWMgbm9kZS1yZWFkYWJsZS1zdHJlYW0KICAgICAgICAobW9kaWZ5LXBoYXNl
cyAlc3RhbmRhcmQtcGhhc2VzCiAgICAgICAgICAoYWRkLWFmdGVyICdwYXRjaC1kZXBlbmRlbmNp
ZXMgJ2RlbGV0ZS1kZXBlbmRlbmNpZXMKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAgICAg
ICAgICAgKGRlbGV0ZS1kZXBlbmRlbmNpZXMgYCgiQGJhYmVsL2NsaSIKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICJAYmFiZWwvY29yZSIKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICJAYmFiZWwvcG9seWZpbGwiCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAiQGJhYmVsL3ByZXNldC1lbnYiCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAiYWlydGFwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgImFzc2VydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibCIKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWVwLXN0cmljdC1lcXVhbCIKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHMub25jZSIKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbG9iIgotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgImd1bnppcC1tYXliZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJoeXBlcnF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgImxvbGV4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm55YyIKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwdW1wIgotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgInJpbXJhZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJ0YXAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFw
ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXItZnMiCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXRpbC1wcm9taXNpZnkiKSkpKSkKKyAgICAg
ICAgICAgICAobW9kaWZ5LWpzb24gKGRlbGV0ZS1kZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAg
IGAoIkBiYWJlbC9jbGkiCisgICAgICAgICAgICAgICAgICJAYmFiZWwvY29yZSIKKyAgICAgICAg
ICAgICAgICAgIkBiYWJlbC9wb2x5ZmlsbCIKKyAgICAgICAgICAgICAgICAgIkBiYWJlbC9wcmVz
ZXQtZW52IgorICAgICAgICAgICAgICAgICAiYWlydGFwIgorICAgICAgICAgICAgICAgICAiYXNz
ZXJ0IgorICAgICAgICAgICAgICAgICAiYmwiCisgICAgICAgICAgICAgICAgICJkZWVwLXN0cmlj
dC1lcXVhbCIKKyAgICAgICAgICAgICAgICAgImV2ZW50cy5vbmNlIgorICAgICAgICAgICAgICAg
ICAiZ2xvYiIKKyAgICAgICAgICAgICAgICAgImd1bnppcC1tYXliZSIKKyAgICAgICAgICAgICAg
ICAgImh5cGVycXVlc3QiCisgICAgICAgICAgICAgICAgICJsb2xleCIKKyAgICAgICAgICAgICAg
ICAgIm55YyIKKyAgICAgICAgICAgICAgICAgInB1bXAiCisgICAgICAgICAgICAgICAgICJyaW1y
YWYiCisgICAgICAgICAgICAgICAgICJ0YXAiCisgICAgICAgICAgICAgICAgICJ0YXBlIgorICAg
ICAgICAgICAgICAgICAidGFyLWZzIgorICAgICAgICAgICAgICAgICAidXRpbC1wcm9taXNpZnki
KSkpKSkpCiAgICAgICAgIzp0ZXN0cz8gI2YpKQogICAgIChpbnB1dHMgKGxpc3Qgbm9kZS11dGls
LWRlcHJlY2F0ZSBub2RlLXN0cmluZy1kZWNvZGVyIG5vZGUtaW5oZXJpdHMpKQogICAgIChob21l
LXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvcmVhZGFibGUtc3RyZWFtIikKQEAgLTk4
Myw3ICs5NzAsOCBAQCAoZGVmaW5lLXB1YmxpYyBub2RlLXJlc29sdmUtcHJvdG9idWYtc2NoZW1h
CiAgICAgICAgIzpwaGFzZXMgKG1vZGlmeS1waGFzZXMgJXN0YW5kYXJkLXBoYXNlcwogICAgICAg
ICAgICAgICAgICAgKGFkZC1hZnRlciAncGF0Y2gtZGVwZW5kZW5jaWVzICdkZWxldGUtZGVwZW5k
ZW5jaWVzCiAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgXwotICAgICAgICAgICAgICAgICAg
ICAgIChkZWxldGUtZGVwZW5kZW5jaWVzICcoInN0YW5kYXJkIiAidGFwZSIpKSkpKSkpCisgICAg
ICAgICAgICAgICAgICAgICAgKG1vZGlmeS1qc29uIChkZWxldGUtZGVwZW5kZW5jaWVzCisgICAg
ICAgICAgICAgICAgICAgICAgICAnKCJzdGFuZGFyZCIgInRhcGUiKSkpKSkpKSkKICAgICAoaW5w
dXRzIChsaXN0IG5vZGUtcHJvdG9jb2wtYnVmZmVycy1zY2hlbWEpKQogICAgIChob21lLXBhZ2Ug
Imh0dHBzOi8vZ2l0aHViLmNvbS9tYWZpbnRvc2gvcmVzb2x2ZS1wcm90b2J1Zi1zY2hlbWEiKQog
ICAgIChzeW5vcHNpcyAiUmVzb2x2ZSBwcm90b2J1ZiBpbXBvcnRzIikKQEAgLTEwMTIsNyArMTAw
MCw3IEBAIChkZWZpbmUtcHVibGljIG5vZGUtc2FmZS1idWZmZXIKICAgICAgICAobW9kaWZ5LXBo
YXNlcyAlc3RhbmRhcmQtcGhhc2VzCiAgICAgICAgICAoYWRkLWFmdGVyICdwYXRjaC1kZXBlbmRl
bmNpZXMgJ2RlbGV0ZS1kZXBlbmRlbmNpZXMKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAg
ICAgICAgICAgKGRlbGV0ZS1kZXBlbmRlbmNpZXMgJygidGFwZSIgInN0YW5kYXJkIikpKSkpCisg
ICAgICAgICAgICAgKG1vZGlmeS1qc29uIChkZWxldGUtZGVwZW5kZW5jaWVzICcoInRhcGUiICJz
dGFuZGFyZCIpKSkpKSkKICAgICAgICAjOnRlc3RzPyAjZikpCiAgICAgKGhvbWUtcGFnZSAiaHR0
cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9zYWZlLWJ1ZmZlciIpCiAgICAgKHN5bm9wc2lzICJCdWZm
ZXIgY3JlYXRpb24gd2l0aCBleHBsaWNpdCBzZW1hbnRpY3MiKQpAQCAtMTA0MCwyMCArMTAyOCwy
MSBAQCAoZGVmaW5lLXB1YmxpYyBub2RlLXNhZmUtc3RhYmxlLXN0cmluZ2lmeQogICAgICAgICM6
cGhhc2VzIChtb2RpZnktcGhhc2VzICVzdGFuZGFyZC1waGFzZXMKICAgICAgICAgICAgICAgICAg
IChhZGQtYWZ0ZXIgJ3BhdGNoLWRlcGVuZGVuY2llcyAnZGVsZXRlLWRlcGVuZGVuY2llcwogICAg
ICAgICAgICAgICAgICAgICAobGFtYmRhIF8KLSAgICAgICAgICAgICAgICAgICAgICAoZGVsZXRl
LWRlcGVuZGVuY2llcyAnKCJiZW5jaG1hcmsiICJjbG9uZSIKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSIKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYXN0LXNhZmUtc3Ry
aW5naWZ5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZh
c3Qtc3RhYmxlLXN0cmluZ2lmeSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJmYXN0ZXItc3RhYmxlLXN0cmluZ2lmeSIKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJmYXN0ZXN0LXN0YWJsZS1zdHJpbmdpZnkiCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAianNvbi1zdGFibGUtc3Ry
aW5naWZ5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImpz
b24tc3RyaW5naWZ5LWRldGVybWluaXN0aWMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAianNvbi1zdHJpbmdpZnktc2FmZSIKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFuZGFyZCIKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXAiCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAidHlwZXNjcmlwdCIKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJAdHlwZXMvbm9kZSIKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJAdHlwZXMvanNvbi1zdGFibGUtc3RyaW5naWZ5
IikpKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAobW9kaWZ5LWpzb24gKGRlbGV0ZS1kZXBl
bmRlbmNpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICcoImJlbmNobWFyayIgImNsb25lIgor
ICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICJmYXN0LXNhZmUtc3RyaW5naWZ5IgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAiZmFzdC1zdGFibGUtc3RyaW5naWZ5IgorICAgICAgICAgICAgICAg
ICAgICAgICAgICAiZmFzdGVyLXN0YWJsZS1zdHJpbmdpZnkiCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICJmYXN0ZXN0LXN0YWJsZS1zdHJpbmdpZnkiCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICJqc29uLXN0YWJsZS1zdHJpbmdpZnkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJq
c29uLXN0cmluZ2lmeS1kZXRlcm1pbmlzdGljIgorICAgICAgICAgICAgICAgICAgICAgICAgICAi
anNvbi1zdHJpbmdpZnktc2FmZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YW5kYXJk
IgorICAgICAgICAgICAgICAgICAgICAgICAgICAidGFwIgorICAgICAgICAgICAgICAgICAgICAg
ICAgICAidHlwZXNjcmlwdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkB0eXBlcy9ub2Rl
IgorICAgICAgICAgICAgICAgICAgICAgICAgICAiQHR5cGVzL2pzb24tc3RhYmxlLXN0cmluZ2lm
eSIpKSkpKSkpKQogICAgIChob21lLXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9CcmlkZ2VBUi9z
YWZlLXN0YWJsZS1zdHJpbmdpZnkiKQogICAgIChzeW5vcHNpcyAiU2VyaWFsaXphdGlvbiBvZiBq
YXZhc2NyaXB0IG9iamVjdHMiKQogICAgIChkZXNjcmlwdGlvbgpAQCAtMTExMSw3ICsxMTAwLDcg
QEAgKGRlZmluZS1wdWJsaWMgbm9kZS1zZW12ZXIKICAgICAgICAobW9kaWZ5LXBoYXNlcyAlc3Rh
bmRhcmQtcGhhc2VzCiAgICAgICAgICAoYWRkLWFmdGVyICdwYXRjaC1kZXBlbmRlbmNpZXMgJ2Rl
bGV0ZS1kZXBlbmRlbmNpZXMKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAgICAgICAgICAg
KGRlbGV0ZS1kZXBlbmRlbmNpZXMgJygidGFwIikpKSkpCisgICAgICAgICAgICAgKG1vZGlmeS1q
c29uIChkZWxldGUtZGVwZW5kZW5jaWVzICcoInRhcCIpKSkpKSkKICAgICAgICA7OyBGSVhNRTog
VGVzdHMgZGVwZW5kIG9uIG5vZGUtdGFwCiAgICAgICAgIzp0ZXN0cz8gI2YpKQogICAgIChob21l
LXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vbm9kZS1zZW12ZXIiKQpAQCAtMTE1MSw3ICsx
MTQwLDggQEAgKGRlZmluZS1wdWJsaWMgbm9kZS1zZXJpYWxwb3J0CiAgICAgICAgKG1vZGlmeS1w
aGFzZXMgJXN0YW5kYXJkLXBoYXNlcwogICAgICAgICAgKGFkZC1hZnRlciAncGF0Y2gtZGVwZW5k
ZW5jaWVzICdkZWxldGUtZGVwZW5kZW5jaWVzCiAgICAgICAgICAgIChsYW1iZGEgYXJncwotICAg
ICAgICAgICAgIChkZWxldGUtZGVwZW5kZW5jaWVzIGAoIkBzZXJpYWxwb3J0L2JpbmRpbmctbW9j
ayIpKSkpCisgICAgICAgICAgICAgKG1vZGlmeS1qc29uIChkZWxldGUtZGVwZW5kZW5jaWVzCisg
ICAgICAgICAgICAgICBgKCJAc2VyaWFscG9ydC9iaW5kaW5nLW1vY2siKSkpKSkKICAgICAgICAg
IChhZGQtYWZ0ZXIgJ3VucGFjayAnY2hkaXIKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCiAgICAg
ICAgICAgICAgKGNoZGlyICJwYWNrYWdlcy9zZXJpYWxwb3J0IikpKSkKQEAgLTEyMTAsMjUgKzEy
MDAsMTAgQEAgKGRlZmluZS1wdWJsaWMgbm9kZS1zZXJpYWxwb3J0LWJpbmRpbmdzCiAgICAgICAg
ICAgICAgKGNoZGlyICJwYWNrYWdlcy9iaW5kaW5ncyIpKSkKICAgICAgICAgIChhZGQtYWZ0ZXIg
J3BhdGNoLWRlcGVuZGVuY2llcyAnZGVsZXRlLWRlcGVuZGVuY2llcwogICAgICAgICAgICAobGFt
YmRhIGFyZ3MKLSAgICAgICAgICAgICAoZGVsZXRlLWRlcGVuZGVuY2llcyBgKCJwcmVidWlsZC1p
bnN0YWxsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgZGV2RGVwZW5k
ZW5jaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQHNlcmlhbHBvcnQv
YmluZGluZy1tb2NrIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGUt
YWJpIikpKSkKLSAgICAgICAgIChhZGQtYWZ0ZXIgJ2NoZGlyICdhdm9pZC1wcmVidWlsZC1pbnN0
YWxsCi0gICAgICAgICAgIChsYW1iZGEgYXJncwotICAgICAgICAgICAgICh3aXRoLWF0b21pYy1q
c29uLWZpbGUtcmVwbGFjZW1lbnQgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCi0gICAgICAgICAg
ICAgICAobWFwCi0gICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKLSAgICAgICAgICAgICAg
ICAgICAoKCJzY3JpcHRzIiAuIHNjcmlwdHMtYWxpc3QpCi0gICAgICAgICAgICAgICAgICAgICAo
Y29ucyAic2NyaXB0cyIgKGZpbHRlcgotICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gtbGFt
YmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgKCgiaW5zdGFsbCIgLiBfKSAjZikKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAoXyAjdCkpCi0gICAgICAgICAgICAgICAgICAgICAgIHNjcmlw
dHMtYWxpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAoKCJneXBmaWxlIiAuIF8pCi0gICAgICAg
ICAgICAgICAgICAgICAoY29ucyAiZ3lwZmlsZSIgI2YpKQotICAgICAgICAgICAgICAgICAgIChv
dGhlciBvdGhlcikpCi0gICAgICAgICAgICAgICAgIHBrZy1tZXRhLWFsaXN0KSkpKSkpCisgICAg
ICAgICAgICAgKG1vZGlmeS1qc29uCisgICAgICAgICAgICAgICAoZGVsZXRlLWRlcGVuZGVuY2ll
cyBgKAorICAgICAgICAgICAgICAgICA7OyBkZXZEZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAg
ICAgIm5vZGUtYWJpIikpKSkpKQogICAgICAgICM6dGVzdHM/ICNmKSkKICAgICAoc3lub3BzaXMg
IkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIE5vZGUgU2VyaWFsUG9ydCBiaW5kaW5ncyIpCiAgICAg
KGRlc2NyaXB0aW9uICJOb2RlIFNlcmlhbFBvcnQgaXMgYSBtb2R1bGFyIHN1aXRlIG9mIE5vZGUu
anMgcGFja2FnZXMgZm9yCkBAIC0xNDA5LDggKzEzODQsOSBAQCAoZGVmaW5lLXB1YmxpYyBub2Rl
LXNlcmlhbHBvcnQtc3RyZWFtCiAgICAgICAgKG1vZGlmeS1waGFzZXMgJXN0YW5kYXJkLXBoYXNl
cwogICAgICAgICAgKGFkZC1hZnRlciAncGF0Y2gtZGVwZW5kZW5jaWVzICdkZWxldGUtZGVwZW5k
ZW5jaWVzCiAgICAgICAgICAgIChsYW1iZGEgYXJncwotICAgICAgICAgICAgIChkZWxldGUtZGVw
ZW5kZW5jaWVzIGAoOzsgZGV2RGVwZW5kZW5jaWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiQHNlcmlhbHBvcnQvYmluZGluZy1tb2NrIikpKSkKKyAgICAgICAgICAgICAo
bW9kaWZ5LWpzb24KKyAgICAgICAgICAgICAgIChkZWxldGUtZGVwZW5kZW5jaWVzIDs7IGRldkRl
cGVuZGVuY2llcworICAgICAgICAgICAgICAgICBgKCJAc2VyaWFscG9ydC9iaW5kaW5nLW1vY2si
KSkpKSkKICAgICAgICAgIChhZGQtYWZ0ZXIgJ3VucGFjayAnY2hkaXIKICAgICAgICAgICAgKGxh
bWJkYSBhcmdzCiAgICAgICAgICAgICAgKGNoZGlyICJwYWNrYWdlcy9zdHJlYW0iKSkpKQpAQCAt
MTQ2MSw3ICsxNDM3LDcgQEAgKGRlZmluZS1wdWJsaWMgbm9kZS1zcWxpdGUzCiAgICAgICAgKG1v
ZGlmeS1waGFzZXMgJXN0YW5kYXJkLXBoYXNlcwogICAgICAgICAgKGFkZC1hZnRlciAncGF0Y2gt
ZGVwZW5kZW5jaWVzICdkZWxldGUtZGVwZW5kZW5jaWVzCiAgICAgICAgICAgIChsYW1iZGEgYXJn
cwotICAgICAgICAgICAgIChkZWxldGUtZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgKG1vZGlm
eS1qc29uIChkZWxldGUtZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgIGAoOzsgTm9ybWFsbHks
IHRoaXMgaXMgImJ1aWx0IiB1c2luZyBAbWFwYm94L25vZGUtcHJlLWd5cCwKICAgICAgICAgICAg
ICAgICA7OyB3aGljaCBwdWJsaXNoZXMgb3IgZG93bmxvYWRzIHByZS1idWlsdCBiaW5hcmllcyBv
cgogICAgICAgICAgICAgICAgIDs7IGZhbGxzIGJhY2sgdG8gYnVpbGRpbmcgZnJvbSBzb3VyY2Uu
ICBIZXJlLCB3ZSBwYXRjaCBvdXQKQEAgLTE0ODAsNyArMTQ1Niw3IEBAIChkZWZpbmUtcHVibGlj
IG5vZGUtc3FsaXRlMwogICAgICAgICAgICAgICAgICJub2RlLWd5cCIKICAgICAgICAgICAgICAg
ICA7OyBUaGVzZSB3ZSdkIGxpa2UsIHdlIGp1c3QgZG9uJ3QgaGF2ZSB0aGVtIHlldDoKICAgICAg
ICAgICAgICAgICAiZXNsaW50IgotICAgICAgICAgICAgICAgICJtb2NoYSIpKSkpCisgICAgICAg
ICAgICAgICAgIm1vY2hhIikpKSkpCiAgICAgICAgICAoYWRkLWJlZm9yZSAnY29uZmlndXJlICdu
cG0tY29uZmlnLXNxbGl0ZQogICAgICAgICAgICA7OyBXZSBuZWVkIHRoaXMgc3RlcCBldmVuIGlm
IHdlIGRvIHJlcGxhY2UgQG1hcGJveC9ub2RlLXByZS1neXAKICAgICAgICAgICAgOzsgYmVjYXVz
ZSB0aGUgcGFja2FnZSBleHBlY3RzIHRvIGJ1aWxkIGl0cyBidW5kbGVkIHNxbGl0ZQpAQCAtMTUx
NCw4ICsxNDkwLDkgQEAgKGRlZmluZS1wdWJsaWMgbm9kZS1zcWxpdGUzCiAgICAgICAgICAgICAg
KHN1YnN0aXR1dGUqICIubnBtaWdub3JlIgogICAgICAgICAgICAgICAgKCgibGliL2JpbmRpbmci
KQogICAgICAgICAgICAgICAgICIjbGliL2JpbmRpbmcgIyA8LSBwYXRjaGVkIGZvciBHdWl4Iikp
Ci0gICAgICAgICAgICAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCAobGFtYmRh
IChwa2ctbWV0YS1hbGlzdCkKLSAgICAgICAgICAgICAgIChsZXQgKChiaW5hcnktYWxpc3QgKGFz
c29jLXJlZiBwa2ctbWV0YS1hbGlzdCAiYmluYXJ5IikpKQorICAgICAgICAgICAgIChtb2RpZnkt
anNvbgorICAgICAgICAgICAgICAgKGxhbWJkYSAocGtnLW1ldGEtYWxpc3QpCisgICAgICAgICAg
ICAgICAgIChsZXQgKChiaW5hcnktYWxpc3QgKGFzc29jLXJlZiBwa2ctbWV0YS1hbGlzdCAiYmlu
YXJ5IikpKQogICAgICAgICAgICAgICAgICA7OyBXaGVuIGl0IGJ1aWxkcyBmcm9tIHNvdXJjZSwg
bm9kZS1wcmUtZ3lwIHN1cHBsaWVzCiAgICAgICAgICAgICAgICAgIDs7IG1vZHVsZV9uYW1lIGFu
ZCBtb2R1bGVfcGF0aCBiYXNlZCBvbiB0aGUgZW50cmllcyB1bmRlcgogICAgICAgICAgICAgICAg
ICA7OyAiYmluYXJ5IiBmcm9tICJwYWNrYWdlLmpzb24iLCBzbyB0aGlzIHBhY2thZ2UncwpAQCAt
MTUyOCwxOSArMTUwNSwxMSBAQCAoZGVmaW5lLXB1YmxpYyBub2RlLXNxbGl0ZTMKICAgICAgICAg
ICAgICAgICAgICAoYXNzb2MtcmVmIGJpbmFyeS1hbGlzdCAibW9kdWxlX25hbWUiKQogICAgICAg
ICAgICAgICAgICAgICIgbW9kdWxlX3BhdGg9IgogICAgICAgICAgICAgICAgICAgIChhc3NvYy1y
ZWYgYmluYXJ5LWFsaXN0ICJtb2R1bGVfcGF0aCIpKSkpCisgICAgICAgICAgICAgICAgIHBrZy1t
ZXRhLWFsaXN0KQogICAgICAgICAgICAgICAgOzsgV2UgbmVlZCB0byByZW1vdmUgdGhlIGluc3Rh
bGwgc2NyaXB0IGZyb20gInBhY2thZ2UuanNvbiIsCiAgICAgICAgICAgICAgICA7OyBhcyBpdCB3
b3VsZCB0cnkgdG8gdXNlIG5vZGUtcHJlLWd5cCBhbmQgd291bGQgYmxvY2sgdGhlCiAgICAgICAg
ICAgICAgICA7OyBhdXRvbWF0aWMgYnVpbGRpbmcgcGVyZm9ybWVkIGJ5IGBucG0gaW5zdGFsbGAu
Ci0gICAgICAgICAgICAgICAobWFwCi0gICAgICAgICAgICAgICAgIChtYXRjaC1sYW1iZGEKLSAg
ICAgICAgICAgICAgICAgICAoKCJzY3JpcHRzIiAuIHNjcmlwdHMtYWxpc3QpCi0gICAgICAgICAg
ICAgICAgICAgICAoY29ucyAic2NyaXB0cyIgKGZpbHRlcgotICAgICAgICAgICAgICAgICAgICAg
ICAobWF0Y2gtbGFtYmRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgKCgiaW5zdGFsbCIgLiBf
KSAjZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAoXyAjdCkpCi0gICAgICAgICAgICAgICAg
ICAgICAgIHNjcmlwdHMtYWxpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAob3RoZXIgb3RoZXIp
KQotICAgICAgICAgICAgICAgICBwa2ctbWV0YS1hbGlzdCkpKSkpKSkpCisgICAgICAgICAgICAg
ICAoZGVsZXRlLWZpZWxkcyBgKCgic2NyaXB0cyIgImluc3RhbGwiKSkpKSkpKSkpCiAgICAgKGhv
bWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9ub2RlLXNxbGl0ZTMiKQogICAgIChz
eW5vcHNpcyAiTm9kZS5qcyBiaW5kaW5ncyBmb3IgU1FMaXRlMyIpCiAgICAgKGRlc2NyaXB0aW9u
CkBAIC0xNjIzLDggKzE1OTIsOCBAQCAoZGVmaW5lLXB1YmxpYyBub2RlLXN0cmluZy1kZWNvZGVy
CiAgICAgICAgKG1vZGlmeS1waGFzZXMgJXN0YW5kYXJkLXBoYXNlcwogICAgICAgICAgKGFkZC1h
ZnRlciAncGF0Y2gtZGVwZW5kZW5jaWVzICdkZWxldGUtZGVwZW5kZW5jaWVzCiAgICAgICAgICAg
IChsYW1iZGEgYXJncwotICAgICAgICAgICAgIChkZWxldGUtZGVwZW5kZW5jaWVzCi0gICAgICAg
ICAgICAgICcoInRhcCIgImNvcmUtdXRpbC1pcyIgImJhYmVsLXBvbHlmaWxsIikpKSkpCisgICAg
ICAgICAgICAgKG1vZGlmeS1qc29uIChkZWxldGUtZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAg
ICcoInRhcCIgImNvcmUtdXRpbC1pcyIgImJhYmVsLXBvbHlmaWxsIikpKSkpKQogICAgICAgIDs7
IEZJWE1FOiBUZXN0cyBkZXBlbmQgb24gbm9kZS10YXAKICAgICAgICAjOnRlc3RzPyAjZikpCiAg
ICAgKGlucHV0cyAobGlzdCBub2RlLXNhZmUtYnVmZmVyIG5vZGUtaW5oZXJpdHMpKQpAQCAtMTY3
OCw3ICsxNjQ3LDcgQEAgKGRlZmluZS1wdWJsaWMgbm9kZS13cmFwcHkKICAgICAgICAobW9kaWZ5
LXBoYXNlcyAlc3RhbmRhcmQtcGhhc2VzCiAgICAgICAgICAoYWRkLWFmdGVyICdwYXRjaC1kZXBl
bmRlbmNpZXMgJ2RlbGV0ZS1kZXBlbmRlbmNpZXMKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0g
ICAgICAgICAgICAgKGRlbGV0ZS1kZXBlbmRlbmNpZXMgJygidGFwIikpKSkpKSkKKyAgICAgICAg
ICAgICAobW9kaWZ5LWpzb24gKGRlbGV0ZS1kZXBlbmRlbmNpZXMgJygidGFwIikpKSkpKSkpCiAg
ICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL25wbS93cmFwcHkiKQogICAgIChzeW5v
cHNpcyAiQ2FsbGJhY2sgd3JhcHBpbmcgdXRpbGl0eSIpCiAgICAgKGRlc2NyaXB0aW9uICJAY29k
ZXt3cmFwcHl9IGlzIGEgdXRpbGl0eSBmb3IgTm9kZS5qcyB0byB3cmFwIGNhbGxiYWNrcy4iKQpA
QCAtMTcwMyw3ICsxNjcyLDggQEAgKGRlZmluZS1wdWJsaWMgbm9kZS15YXpsCiAgICAgICAgIzpw
aGFzZXMgKG1vZGlmeS1waGFzZXMgJXN0YW5kYXJkLXBoYXNlcwogICAgICAgICAgICAgICAgICAg
KGFkZC1hZnRlciAncGF0Y2gtZGVwZW5kZW5jaWVzICdkZWxldGUtZGVwZW5kZW5jaWVzCiAgICAg
ICAgICAgICAgICAgICAgIChsYW1iZGEgXwotICAgICAgICAgICAgICAgICAgICAgIChkZWxldGUt
ZGVwZW5kZW5jaWVzICcoImFpcnRhcCIgImJsIiAiaXN0YW5idWwiICJ5YXV6bCIpKSkpKSkpCisg
ICAgICAgICAgICAgICAgICAgICAgKG1vZGlmeS1qc29uIChkZWxldGUtZGVwZW5kZW5jaWVzCisg
ICAgICAgICAgICAgICAgICAgICAgICAnKCJhaXJ0YXAiICJibCIgImlzdGFuYnVsIiAieWF1emwi
KSkpKSkpKSkKICAgICAoaW5wdXRzIChsaXN0IG5vZGUtYnVmZmVyLWNyYzMyKSkKICAgICAoaG9t
ZS1wYWdlICJodHRwczovL2dpdGh1Yi5jb20vdGhlam9zaHdvbGZlL3lhemwiKQogICAgIChzeW5v
cHNpcyAiWWV0IGFub3RoZXIgemlwIGxpYnJhcnkgZm9yIG5vZGUiKQpkaWZmIC0tZ2l0IGEvZ251
L3BhY2thZ2VzL25vZGUuc2NtIGIvZ251L3BhY2thZ2VzL25vZGUuc2NtCmluZGV4IDIwYWNmZmIz
ZGYuLmExM2VjNWQwNzcgMTAwNjQ0Ci0tLSBhL2dudS9wYWNrYWdlcy9ub2RlLnNjbQorKysgYi9n
bnUvcGFja2FnZXMvbm9kZS5zY20KQEAgLTEzLDYgKzEzLDcgQEAKIDs7OyBDb3B5cmlnaHQgwqkg
MjAyMSwgMjAyMiBQaGlsaXAgTWNHcmF0aCA8cGhpbGlwQHBoaWxpcG1jZ3JhdGguY29tPgogOzs7
IENvcHlyaWdodCDCqSAyMDIyIEhpbHRvbiBDaGFpbiA8aGFrb0B1bHRyYXJhcmUuc3BhY2U+CiA7
OzsgQ29weXJpZ2h0IMKpIDIwMjQgRWZyYWltIEZsYXNobmVyIDxlZnJhaW1AZmxhc2huZXIuY28u
aWw+Cis7OzsgQ29weXJpZ2h0IMKpIDIwMjQgRGFuaWVsIEtob2RhYmFraHNoIDxkLmtob2RhYmFr
aHNoQGdtYWlsLmNvbT4KIDs7OwogOzs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBHdWl4Lgog
Ozs7CkBAIC0zNjYsNyArMzY3LDcgQEAgKGRlZmluZS1wdWJsaWMgbm9kZS1zZW12ZXItYm9vdHN0
cmFwCiAgICAgICAgKG1vZGlmeS1waGFzZXMgJXN0YW5kYXJkLXBoYXNlcwogICAgICAgICAgKGFk
ZC1hZnRlciAncGF0Y2gtZGVwZW5kZW5jaWVzICdkZWxldGUtZGVwZW5kZW5jaWVzCiAgICAgICAg
ICAgIChsYW1iZGEgYXJncwotICAgICAgICAgICAgIChkZWxldGUtZGVwZW5kZW5jaWVzICcoInRh
cCIpKSkpKSkpCisgICAgICAgICAgICAgKG1vZGlmeS1qc29uIChkZWxldGUtZGVwZW5kZW5jaWVz
ICcoInRhcCIpKSkpKSkpKQogICAgIChob21lLXBhZ2UgImh0dHBzOi8vZ2l0aHViLmNvbS9ucG0v
bm9kZS1zZW12ZXIiKQogICAgIChwcm9wZXJ0aWVzICcoKGhpZGRlbj8gLiAjdCkpKQogICAgIChz
eW5vcHNpcyAiUGFyc2VzIHNlbWFudGljIHZlcnNpb25zIHN0cmluZ3MiKQpAQCAtMzk3LDExICsz
OTgsMTIgQEAgKGRlZmluZS1wdWJsaWMgbm9kZS1tcy1ib290c3RyYXAKICAgICAgICAobW9kaWZ5
LXBoYXNlcyAlc3RhbmRhcmQtcGhhc2VzCiAgICAgICAgICAoYWRkLWFmdGVyICdwYXRjaC1kZXBl
bmRlbmNpZXMgJ2RlbGV0ZS1kZXBlbmRlbmNpZXMKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0g
ICAgICAgICAgICAgKGRlbGV0ZS1kZXBlbmRlbmNpZXMgJygiZXNsaW50IgotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdC5qcyIKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICJodXNreSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICJsaW50LXN0YWdlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJt
b2NoYSIpKSkpKSkpCisgICAgICAgICAgICAgKG1vZGlmeS1qc29uIChkZWxldGUtZGVwZW5kZW5j
aWVzCisgICAgICAgICAgICAgICAnKCJlc2xpbnQiCisgICAgICAgICAgICAgICAgICJleHBlY3Qu
anMiCisgICAgICAgICAgICAgICAgICJodXNreSIKKyAgICAgICAgICAgICAgICAgImxpbnQtc3Rh
Z2VkIgorICAgICAgICAgICAgICAgICAibW9jaGEiKSkpKSkpKSkKICAgICAoaG9tZS1wYWdlICJo
dHRwczovL2dpdGh1Yi5jb20vemVpdC9tcyNyZWFkbWUiKQogICAgIChwcm9wZXJ0aWVzICcoKGhp
ZGRlbj8gLiAjdCkpKQogICAgIChzeW5vcHNpcyAiVGlueSBtaWxsaXNlY29uZCBjb252ZXJzaW9u
IHV0aWxpdHkiKQpAQCAtNDMxLDcgKzQzMyw3IEBAIChkZWZpbmUtcHVibGljIG5vZGUtYmluYXJ5
LXNlYXJjaC1ib290c3RyYXAKICAgICAgICAobW9kaWZ5LXBoYXNlcyAlc3RhbmRhcmQtcGhhc2Vz
CiAgICAgICAgICAoYWRkLWFmdGVyICdwYXRjaC1kZXBlbmRlbmNpZXMgJ2RlbGV0ZS1kZXBlbmRl
bmNpZXMKICAgICAgICAgICAgKGxhbWJkYSBhcmdzCi0gICAgICAgICAgICAgKGRlbGV0ZS1kZXBl
bmRlbmNpZXMgYCgiY2hhaSIgIm1vY2hhIikpKSkpKSkKKyAgICAgICAgICAgICAobW9kaWZ5LWpz
b24gKGRlbGV0ZS1kZXBlbmRlbmNpZXMgYCgiY2hhaSIgIm1vY2hhIikpKSkpKSkpCiAgICAgKGhv
bWUtcGFnZSAiaHR0cHM6Ly9naXRodWIuY29tL2Rhcmtza3lhcHAvYmluYXJ5LXNlYXJjaCNyZWFk
bWUiKQogICAgIChwcm9wZXJ0aWVzICcoKGhpZGRlbj8gLiAjdCkpKQogICAgIChzeW5vcHNpcyAi
VGlueSBiaW5hcnkgc2VhcmNoIGZ1bmN0aW9uIHdpdGggY29tcGFyYXRvcnMiKQpAQCAtNDYwLDE3
ICs0NjIsMTggQEAgKGRlZmluZS1wdWJsaWMgbm9kZS1kZWJ1Zy1ib290c3RyYXAKICAgICAgICAo
bW9kaWZ5LXBoYXNlcyAlc3RhbmRhcmQtcGhhc2VzCiAgICAgICAgICAoYWRkLWFmdGVyICdwYXRj
aC1kZXBlbmRlbmNpZXMgJ2RlbGV0ZS1kZXBlbmRlbmNpZXMKICAgICAgICAgICAgKGxhbWJkYSBh
cmdzCi0gICAgICAgICAgICAgKGRlbGV0ZS1kZXBlbmRlbmNpZXMgYCgiYnJmcyIKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJicm93c2VyaWZ5IgotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgImNvdmVyYWxscyIKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJpc3RhbmJ1bCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICJrYXJtYSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrYXJtYS1i
cm93c2VyaWZ5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImthcm1hLWNo
cm9tZS1sYXVuY2hlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrYXJt
YS1tb2NoYSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2NoYSIKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2NoYS1sY292LXJlcG9ydGVyIgot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhvIikpKSkpKSkKKyAgICAgICAg
ICAgICAobW9kaWZ5LWpzb24gKGRlbGV0ZS1kZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgIGAo
ImJyZnMiCisgICAgICAgICAgICAgICAgICJicm93c2VyaWZ5IgorICAgICAgICAgICAgICAgICAi
Y292ZXJhbGxzIgorICAgICAgICAgICAgICAgICAiaXN0YW5idWwiCisgICAgICAgICAgICAgICAg
ICJrYXJtYSIKKyAgICAgICAgICAgICAgICAgImthcm1hLWJyb3dzZXJpZnkiCisgICAgICAgICAg
ICAgICAgICJrYXJtYS1jaHJvbWUtbGF1bmNoZXIiCisgICAgICAgICAgICAgICAgICJrYXJtYS1t
b2NoYSIKKyAgICAgICAgICAgICAgICAgIm1vY2hhIgorICAgICAgICAgICAgICAgICAibW9jaGEt
bGNvdi1yZXBvcnRlciIKKyAgICAgICAgICAgICAgICAgInhvIikpKSkpKSkpCiAgICAgKGlucHV0
cyAobGlzdCBub2RlLW1zLWJvb3RzdHJhcCkpCiAgICAgKGhvbWUtcGFnZSAiaHR0cHM6Ly9naXRo
dWIuY29tL3Zpc2lvbm1lZGlhL2RlYnVnI3JlYWRtZSIpCiAgICAgKHByb3BlcnRpZXMgJygoaGlk
ZGVuPyAuICN0KSkpCkBAIC01MjYsMTIgKzUyOSwxMyBAQCAoZGVmaW5lLXB1YmxpYyBub2RlLWxs
cGFyc2UtYnVpbGRlci1ib290c3RyYXAKICAgICAgICAobW9kaWZ5LXBoYXNlcyAlc3RhbmRhcmQt
cGhhc2VzCiAgICAgICAgICAoYWRkLWFmdGVyICdwYXRjaC1kZXBlbmRlbmNpZXMgJ2RlbGV0ZS1k
ZXBlbmRlbmNpZXMKICAgICAgICAgICAgKGxhbWJkYSBfCi0gICAgICAgICAgICAgKGRlbGV0ZS1k
ZXBlbmRlbmNpZXMgYCgiQHR5cGVzL21vY2hhIgotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIkB0eXBlcy9ub2RlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIm1vY2hhIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRzLW5vZGUi
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHNsaW50IgotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVzY3JpcHQiKSkpKQorICAgICAgICAgICAg
IChtb2RpZnktanNvbiAoZGVsZXRlLWRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgYCgiQHR5
cGVzL21vY2hhIgorICAgICAgICAgICAgICAgICAiQHR5cGVzL25vZGUiCisgICAgICAgICAgICAg
ICAgICJtb2NoYSIKKyAgICAgICAgICAgICAgICAgInRzLW5vZGUiCisgICAgICAgICAgICAgICAg
ICJ0c2xpbnQiCisgICAgICAgICAgICAgICAgICJ0eXBlc2NyaXB0IikpKSkpCiAgICAgICAgICAo
cmVwbGFjZSAnYnVpbGQKICAgICAgICAgICAgKGxhbWJkYSogKCM6a2V5IGlucHV0cyAjOmFsbG93
LW90aGVyLWtleXMpCiAgICAgICAgICAgICAgKGxldCAoKGVzYnVpbGQgKHNlYXJjaC1pbnB1dC1m
aWxlIGlucHV0cyAiL2Jpbi9lc2J1aWxkIikpKQpAQCAtNTg3LDEzICs1OTEsMTQgQEAgKGRlZmlu
ZS1wdWJsaWMgbm9kZS1sbHBhcnNlLWZyb250ZW5kLWJvb3RzdHJhcAogICAgICAgIChtb2RpZnkt
cGhhc2VzICVzdGFuZGFyZC1waGFzZXMKICAgICAgICAgIChhZGQtYWZ0ZXIgJ3BhdGNoLWRlcGVu
ZGVuY2llcyAnZGVsZXRlLWRlcGVuZGVuY2llcwogICAgICAgICAgICAobGFtYmRhIGFyZ3MKLSAg
ICAgICAgICAgICAoZGVsZXRlLWRlcGVuZGVuY2llcyBgKCJAdHlwZXMvZGVidWciCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQHR5cGVzL21vY2hhIgotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIkB0eXBlcy9ub2RlIgotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIm1vY2hhIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgInRzLW5vZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHNs
aW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVzY3JpcHQiKSkp
KQorICAgICAgICAgICAgIChtb2RpZnktanNvbiAoZGVsZXRlLWRlcGVuZGVuY2llcworICAgICAg
ICAgICAgICAgYCgiQHR5cGVzL2RlYnVnIgorICAgICAgICAgICAgICAgICAiQHR5cGVzL21vY2hh
IgorICAgICAgICAgICAgICAgICAiQHR5cGVzL25vZGUiCisgICAgICAgICAgICAgICAgICJtb2No
YSIKKyAgICAgICAgICAgICAgICAgInRzLW5vZGUiCisgICAgICAgICAgICAgICAgICJ0c2xpbnQi
CisgICAgICAgICAgICAgICAgICJ0eXBlc2NyaXB0IikpKSkpCiAgICAgICAgICAocmVwbGFjZSAn
YnVpbGQKICAgICAgICAgICAgKGxhbWJkYSogKCM6a2V5IGlucHV0cyAjOmFsbG93LW90aGVyLWtl
eXMpCiAgICAgICAgICAgICAgKGxldCAoKGVzYnVpbGQgKHNlYXJjaC1pbnB1dC1maWxlIGlucHV0
cyAiL2Jpbi9lc2J1aWxkIikpKQpAQCAtNjQ4LDE1ICs2NTMsMTYgQEAgKGRlZmluZS1wdWJsaWMg
bm9kZS1sbHBhcnNlLWJvb3RzdHJhcAogICAgICAgIChtb2RpZnktcGhhc2VzICVzdGFuZGFyZC1w
aGFzZXMKICAgICAgICAgIChhZGQtYWZ0ZXIgJ3BhdGNoLWRlcGVuZGVuY2llcyAnZGVsZXRlLWRl
cGVuZGVuY2llcwogICAgICAgICAgICAobGFtYmRhIGFyZ3MKLSAgICAgICAgICAgICAoZGVsZXRl
LWRlcGVuZGVuY2llcyBgKCJAdHlwZXMvZGVidWciCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiQHR5cGVzL21vY2hhIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIkB0eXBlcy9ub2RlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ImVzbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsbHBhcnNlLXRlc3Qt
Zml4dHVyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2NoYSIKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cy1ub2RlIgotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgInRzbGludCIKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJ0eXBlc2NyaXB0IikpKSkKKyAgICAgICAgICAgICAobW9kaWZ5LWpzb24g
KGRlbGV0ZS1kZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgIGAoIkB0eXBlcy9kZWJ1ZyIKKyAg
ICAgICAgICAgICAgICAgIkB0eXBlcy9tb2NoYSIKKyAgICAgICAgICAgICAgICAgIkB0eXBlcy9u
b2RlIgorICAgICAgICAgICAgICAgICAiZXNtIgorICAgICAgICAgICAgICAgICAibGxwYXJzZS10
ZXN0LWZpeHR1cmUiCisgICAgICAgICAgICAgICAgICJtb2NoYSIKKyAgICAgICAgICAgICAgICAg
InRzLW5vZGUiCisgICAgICAgICAgICAgICAgICJ0c2xpbnQiCisgICAgICAgICAgICAgICAgICJ0
eXBlc2NyaXB0IikpKSkpCiAgICAgICAgICAocmVwbGFjZSAnYnVpbGQKICAgICAgICAgICAgKGxh
bWJkYSogKCM6a2V5IGlucHV0cyAjOmFsbG93LW90aGVyLWtleXMpCiAgICAgICAgICAgICAgKGxl
dCAoKGVzYnVpbGQgKHNlYXJjaC1pbnB1dC1maWxlIGlucHV0cyAiL2Jpbi9lc2J1aWxkIikpKQpk
aWZmIC0tZ2l0IGEvZ3VpeC9idWlsZC9ub2RlLWJ1aWxkLXN5c3RlbS5zY20gYi9ndWl4L2J1aWxk
L25vZGUtYnVpbGQtc3lzdGVtLnNjbQppbmRleCBkZjdlYTc3NzRjLi5lYTIzZDkyYTA1IDEwMDY0
NAotLS0gYS9ndWl4L2J1aWxkL25vZGUtYnVpbGQtc3lzdGVtLnNjbQorKysgYi9ndWl4L2J1aWxk
L25vZGUtYnVpbGQtc3lzdGVtLnNjbQpAQCAtMzEsMTggKzMxLDE0IEBAIChkZWZpbmUtbW9kdWxl
IChndWl4IGJ1aWxkIG5vZGUtYnVpbGQtc3lzdGVtKQogICAjOnVzZS1tb2R1bGUgKHNyZmkgc3Jm
aS0xKQogICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS03MSkKICAgIzpleHBvcnQgKCVzdGFuZGFy
ZC1waGFzZXMKLSAgICAgICAgICAgIHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudAog
ICAgICAgICAgICAgZGVsZXRlLWRlcGVuZGVuY2llcwotICAgICAgICAgICAgbm9kZS1idWlsZCkp
Ci0KLShkZWZpbmUqICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQgcHJvYwotICAj
Om9wdGlvbmFsIChmaWxlICJwYWNrYWdlLmpzb24iKSkKLSAgIkxpa2UgJ3dpdGgtYXRvbWljLWZp
bGUtcmVwbGFjZW1lbnQnLCBidXQgUFJPQyBpcyBjYWxsZWQgd2l0aCBhIHNpbmdsZQotYXJndW1l
bnQtLS10aGUgcmVzdWx0IG9mIHBhcnNpbmcgRklMRSdzIGNvbnRlbnRzIGFzIGpzb24tLS1hbmQg
c2hvdWxkIGEgdmFsdWUKLXRvIGJlIHdyaXR0ZW4gYXMganNvbiB0byB0aGUgcmVwbGFjZW1lbnQg
RklMRS4iCi0gICh3aXRoLWF0b21pYy1maWxlLXJlcGxhY2VtZW50IGZpbGUKLSAgICAobGFtYmRh
IChpbiBvdXQpCi0gICAgICAoc2NtLT5qc29uIChwcm9jIChqc29uLT5zY20gaW4pKSBvdXQpKSkp
CisgICAgICAgICAgICBkZWxldGUtZGV2LWRlcGVuZGVuY2llcworICAgICAgICAgICAgZGVsZXRl
LWZpZWxkcworICAgICAgICAgICAgbW9kaWZ5LWpzb24KKyAgICAgICAgICAgIG1vZGlmeS1qc29u
LWZpZWxkcworICAgICAgICAgICAgbm9kZS1idWlsZAorICAgICAgICAgICAgcmVwbGFjZS1maWVs
ZHMKKyAgICAgICAgICAgIHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudCkpCiAKIChk
ZWZpbmUqIChhc3NvYy1yZWYqIGFsaXN0IGtleSAjOm9wdGlvbmFsIGRlZmF1bHQpCiAgICJMaWtl
IGFzc29jLXJlZiwgYnV0IHJldHVybiBERUZBVUxUIGluc3RlYWQgb2YgI2YgaWYgbm8gdmFsdWUg
ZXhpc3RzLiIKQEAgLTcyLDYgKzY4LDE2MSBAQCAoZGVmaW5lKiAoYWxpc3QtdXBkYXRlIGFsaXN0
IGtleSBwcm9jICM6b3B0aW9uYWwgKD0gZXF1YWw/KSkKICAgICAgIChhY29ucyBrZXkgKHByb2Mg
KGNkciBwYWlyKSkgcmVzdCkKICAgICAgIGFsaXN0KSkpCiAKKzs7OworOzs7IHBhY2thZ2UuanNv
biBtb2RpZmljYXRpb24gcHJvY2VkdXJlcworOzs7CisKKyhkZWZpbmUqICh3aXRoLWF0b21pYy1q
c29uLWZpbGUtcmVwbGFjZW1lbnQgcHJvYworICAjOm9wdGlvbmFsIChmaWxlICJwYWNrYWdlLmpz
b24iKSkKKyAgIkxpa2UgJ3dpdGgtYXRvbWljLWZpbGUtcmVwbGFjZW1lbnQnLCBidXQgUFJPQyBp
cyBjYWxsZWQgd2l0aCBhIHNpbmdsZQorYXJndW1lbnQtLS10aGUgcmVzdWx0IG9mIHBhcnNpbmcg
RklMRSdzIGNvbnRlbnRzIGFzIGpzb24tLS1hbmQgc2hvdWxkIGEgdmFsdWUKK3RvIGJlIHdyaXR0
ZW4gYXMganNvbiB0byB0aGUgcmVwbGFjZW1lbnQgRklMRS4iCisgICh3aXRoLWF0b21pYy1maWxl
LXJlcGxhY2VtZW50IGZpbGUKKyAgICAobGFtYmRhIChpbiBvdXQpCisgICAgICAoc2NtLT5qc29u
IChwcm9jIChqc29uLT5zY20gaW4pKSBvdXQpKSkpCisKKyhkZWZpbmUqIChtb2RpZnktanNvbiAj
OmtleSAoZmlsZSAicGFja2FnZS5qc29uIikgIzpyZXN0IGFsbC1hcmd1bWVudHMpCisgICJQcm92
aWRlIHBhY2thZ2UuanNvbiBtb2RpZnlpbmcgY2FsbGJhY2tzIHN1Y2ggYXMgKGRlbGV0ZS1kZXBl
bmRlbmNpZXMgLi4uKSIKKyAgKGxldAorICAgICgKKyAgICAgIChtb2RpZmljYXRpb25zCisgICAg
ICAgIChsZXQgbG9vcCAoKGFyZ3VtZW50cyBhbGwtYXJndW1lbnRzKSkKKyAgICAgICAgICAoY29u
ZAorICAgICAgICAgICAgKChudWxsPyBhcmd1bWVudHMpICcoKSkKKyAgICAgICAgICAgICgoa2V5
d29yZD8gKGNhciBhcmd1bWVudHMpKSAobG9vcCAoY2RkciBhcmd1bWVudHMpKSkKKyAgICAgICAg
ICAgIChlbHNlIChjb25zIChjYXIgYXJndW1lbnRzKSAobG9vcCAoY2RyIGFyZ3VtZW50cykpKSkp
KSkpCisgICAgKHdpdGgtYXRvbWljLWpzb24tZmlsZS1yZXBsYWNlbWVudAorICAgICAgKGxhbWJk
YSAocGFja2FnZSkKKyAgICAgICAgKGZvbGQKKyAgICAgICAgICAobGFtYmRhIChtb2RpZmljYXRp
b24gcGFja2FnZSkKKyAgICAgICAgICAgIChtb2RpZmljYXRpb24gcGFja2FnZSkpCisgICAgICAg
ICAgcGFja2FnZQorICAgICAgICAgIG1vZGlmaWNhdGlvbnMpKQorICAgICAgZmlsZSkpKQorCiso
ZGVmaW5lIChkZWxldGUtZGVwZW5kZW5jaWVzIGRlcGVuZGVuY2llcy10by1yZW1vdmUpCisgICJS
ZXdyaXRlICdwYWNrYWdlLmpzb24nIHRvIGFsbG93IHRoZSBidWlsZCB0byBwcm9jZWVkIHdpdGhv
dXQgcGFja2FnZXMKK2xpc3RlZCBpbiAnZGVwZW5kZW5jaWVzLXRvLXJlbW92ZScsIGEgbGlzdCBv
ZiBzdHJpbmdzIG5hbWluZyBucG0gcGFja2FnZXMuCisKK1RvIHByZXZlbnQgdGhlIGRlbGV0ZWQg
ZGVwZW5kZW5jaWVzIGZyb20gYmVpbmcgcmVpbnRyb2R1Y2VkLCB1c2UgdGhpcyBmdW5jdGlvbgor
b25seSBhZnRlciB0aGUgJ3BhdGNoLWRlcGVuZGVuY2llcycgcGhhc2UuIgorICAobGFtYmRhIChw
a2ctbWV0YSkKKyAgICAoZm9sZAorICAgICAgKGxhbWJkYSAoZGVwZW5kZW5jeS1rZXkgcGtnLW1l
dGEpCisgICAgICAgIChhbGlzdC11cGRhdGUKKyAgICAgICAgICBwa2ctbWV0YQorICAgICAgICAg
IGRlcGVuZGVuY3kta2V5CisgICAgICAgICAgKGxhbWJkYSAoZGVwZW5kZW5jaWVzKQorICAgICAg
ICAgICAgKHJlbW92ZQorICAgICAgICAgICAgICAobGFtYmRhIChkZXBlbmRlbmN5KQorICAgICAg
ICAgICAgICAgIChtZW1iZXIgKGNhciBkZXBlbmRlbmN5KSBkZXBlbmRlbmNpZXMtdG8tcmVtb3Zl
KSkKKyAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzKSkpKQorICAgICAgcGtnLW1ldGEKKyAgICAg
IChsaXN0CisgICAgICAgICJkZXZEZXBlbmRlbmNpZXMiCisgICAgICAgICJkZXBlbmRlbmNpZXMi
CisgICAgICAgICJwZWVyRGVwZW5kZW5jaWVzIgorICAgICAgICAib3B0aW9uYWxEZXBlbmRlbmNp
ZXMiKSkpKQorCisoZGVmaW5lKiAobW9kaWZ5LWpzb24tZmllbGRzCisgICAgZmllbGRzCisgICAg
ZmllbGQtbW9kaWZpZXIKKyAgICAjOmtleQorICAgICAgKGZpZWxkLXBhdGgtbWFwcGVyIChsYW1i
ZGEgKGZpZWxkKSBmaWVsZCkpCisgICAgICAoaW5zZXJ0PyAjZikKKyAgICAgIChzdHJpY3Q/ICN0
KSkKKyAgIlByb3ZpZGVzIGEgbGFtYmRhIHRvIHN1cHBseSB0byBtb2RpZnktanNvbiB3aGljaCBt
b2RpZmllcyB0aGUgc3BlY2lmaWVkCisganNvbiBmaWxlLgorLSBgZmllbGRzYCBpcyBhIGxpc3Qg
cHJvY2VkdXJlLXNwZWNpZmljIGRhdGEgc3RydWN0dXJlcyB3aGljaCBzaG91bGQgaW5jbHVkZQor
IHRoZSBkZWZpbml0aW9uIG9mIGEgYGZpZWxkLXBhdGhgIGluIG9uZSBvZiB0d28gc3ludGF4ZXM6
IGRvdC1zeW50YXggc3RyaW5nCisgc3VjaCBhcyBgXCJkZXZEZXBlbmRlbmNpZXMuZXNidWlsZFwi
YCwgb3IgYSBsaXN0IG9mIHN0cmluZ3Mgc3VjaCBhcworIGAobGlzdCBcImRldkRlcGVuZGVuY2ll
c1wiIFwiZXNidWlsZFwiKWAuCistIGBmaWVsZC1tb2RpZmllcmAgaXMgYSBsYW1iZGEgd2hpY2gg
aXMgaW52b2tlZCBhdCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpZWxkLgorIEl0IGlzIHN1cHBsaWVk
IHdpdGggdGhlIGN1cnJlbnQgZmllbGQgZGVmaW5pdGlvbiwgdGhlIGFzc29jaWF0aW9uIGxpc3Qg
KGFsaXN0KQorIGF0IHRoZSBmaWVsZCBsb2NhdGlvbiBpbiB0aGUganNvbiBmaWxlLCBhbmQgdGhl
IGZpZWxkIG5hbWUsIGFsc28gY2FsbGVkIGBrZXlgLgorLSBgZmllbGQtcGF0aC1tYXBwZXJgIGlz
IGEgbGFtYmRhIHdoaWNoIGluc3RydWN0cyB3aGVyZSB0aGUgZmllbGQtcGF0aCBpcworIGxvY2F0
ZWQgd2l0aGluIHRoZSBmaWVsZCBzdHJ1Y3R1cmUuCistIGBpbnNlcnQ/YCBhbGxvd3MgdGhlIGNy
ZWF0aW9uIG9mIHRoZSBmaWVsZCBhbmQgYW55IG1pc3NpbmcgaW50ZXJtZWRpYXRlCisgZmllbGRz
LgorLSBgc3RyaWN0P2AgY2F1c2VzIGFuIGVycm9yIHRvIGJlIHRocm93biBpZiB0aGUgZXhhY3Qg
ZmllbGQtcGF0aCBpcyBub3QgZm91bmQKKyBpbiB0aGUgZGF0YSIKKyAgKGxhbWJkYSAocGFja2Fn
ZSkKKyAgICAoZm9sZAorICAgICAgKGxhbWJkYSAoZmllbGQgcGFja2FnZSkKKyAgICAgICAgKGxl
dCoKKyAgICAgICAgICAoCisgICAgICAgICAgICAoZmllbGQtcGF0aCAoZmllbGQtcGF0aC1tYXBw
ZXIgZmllbGQpKQorICAgICAgICAgICAgKAorICAgICAgICAgICAgICBmaWVsZC1wYXRoCisgICAg
ICAgICAgICAgIChjb25kCisgICAgICAgICAgICAgICAgKChzdHJpbmc/IGZpZWxkLXBhdGgpCisg
ICAgICAgICAgICAgICAgICAoc3RyaW5nLXNwbGl0IGZpZWxkLXBhdGggI1wuKSkKKyAgICAgICAg
ICAgICAgICAoKGFuZCAobGlzdD8gZmllbGQtcGF0aCkgKGV2ZXJ5IHN0cmluZz8gZmllbGQtcGF0
aCkpCisgICAgICAgICAgICAgICAgICBmaWVsZC1wYXRoKQorICAgICAgICAgICAgICAgIChlbHNl
CisgICAgICAgICAgICAgICAgICAoZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1h
cHBlbmQKKyAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmaWVsZCB2YWx1ZSBwcm92aWRl
ZCwgZXhwZWN0aW5nIGEgc3RyaW5nIG9yIGEgIgorICAgICAgICAgICAgICAgICAgICAgICJsaXN0
IG9mIHN0cmluZyBidXQgaW5zdGVhZCBnb3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgICAod2l0
aC1vdXRwdXQtdG8tc3RyaW5nIChsYW1iZGEgXyAoZGlzcGxheSBmaWVsZC1wYXRoKSkpKSkpCisg
ICAgICAgICAgICAgICkpKQorICAgICAgICAgIChsZXQgbG9vcAorICAgICAgICAgICAgKAorICAg
ICAgICAgICAgICAoZGF0YSBwYWNrYWdlKQorICAgICAgICAgICAgICAoZmllbGQtcGF0aCBmaWVs
ZC1wYXRoKSkKKyAgICAgICAgICAgIChsZXQqCisgICAgICAgICAgICAgICgKKyAgICAgICAgICAg
ICAgICAoa2V5IChjYXIgZmllbGQtcGF0aCkpCisgICAgICAgICAgICAgICAgKGRhdGEKKyAgICAg
ICAgICAgICAgICAgIChpZiAoYW5kIChub3QgKGFzc29jIGtleSBkYXRhKSkgaW5zZXJ0PykKKyAg
ICAgICAgICAgICAgICAgICAgKGFjb25zIGtleSAnKCkgZGF0YSkKKyAgICAgICAgICAgICAgICAg
ICAgZGF0YSkpKQorICAgICAgICAgICAgICAoaWYgKG5vdCAoYXNzb2Mga2V5IGRhdGEpKQorICAg
ICAgICAgICAgICAgIChpZiBzdHJpY3Q/CisgICAgICAgICAgICAgICAgICAoZXJyb3IgKHN0cmlu
Zy1hcHBlbmQKKyAgICAgICAgICAgICAgICAgICAgIktleSAnIiBrZXkgIicgd2FzIG5vdCBmb3Vu
ZCBpbiBkYXRhOiAiCisgICAgICAgICAgICAgICAgICAgICh3aXRoLW91dHB1dC10by1zdHJpbmcg
KGxhbWJkYSBfIChkaXNwbGF5IGRhdGEpKSkpKQorICAgICAgICAgICAgICAgICAgZGF0YSkKKyAg
ICAgICAgICAgICAgICAoaWYgKD0gKGxlbmd0aCBmaWVsZC1wYXRoKSAxKQorICAgICAgICAgICAg
ICAgICAgKGZpZWxkLW1vZGlmaWVyIGZpZWxkIGRhdGEga2V5KQorICAgICAgICAgICAgICAgICAg
KGFzc29jLXNldCEKKyAgICAgICAgICAgICAgICAgICAgZGF0YQorICAgICAgICAgICAgICAgICAg
ICBrZXkKKyAgICAgICAgICAgICAgICAgICAgKGxvb3AgKGFzc29jLXJlZiBkYXRhIGtleSkgKGNk
ciBmaWVsZC1wYXRoKSkpKSkpKSkpCisgICAgICBwYWNrYWdlCisgICAgICBmaWVsZHMpKSkKKwor
KGRlZmluZSogKGRlbGV0ZS1maWVsZHMgZmllbGRzICM6a2V5IChzdHJpY3Q/ICN0KSkKKyAgIlBy
b3ZpZGVzIGEgbGFtYmRhIHRvIHN1cHBseSB0byBtb2RpZnktanNvbiB3aGljaCBkZWxldGVzIHRo
ZSBzcGVjaWZpZWQKKyBgZmllbGRzYCB3aGljaCBpcyBhIGxpc3Qgb2YgZmllbGQtcGF0aHMgYXMg
bWVudGlvbmVkIGluIGBtb2RpZnktanNvbi1maWVsZHNgLgorIEV4YW1wbGVzOgorICAoZGVsZXRl
LWZpZWxkcyAnKAorICAgIChcInBhdGhcIiBcInRvXCIgXCJmaWVsZFwiKQorICAgIFwicGF0aC50
by5vdGhlci5maWVsZFwiKSkiCisgIChtb2RpZnktanNvbi1maWVsZHMKKyAgICBmaWVsZHMKKyAg
ICAobGFtYmRhIChfIGRhdGEga2V5KQorICAgICAgKGFzc29jLXJlbW92ZSEgZGF0YSBrZXkpKQor
ICAgICM6c3RyaWN0PyBzdHJpY3Q/KSkKKworKGRlZmluZSogKHJlcGxhY2UtZmllbGRzIGZpZWxk
cyAjOmtleSAoc3RyaWN0PyAjdCkpCisgICJQcm92aWRlcyBhIGxhbWJkYSB0byBzdXBwbHkgdG8g
bW9kaWZ5LWpzb24gd2hpY2ggcmVwbGFjZXMgdGhlIHZhbHVlIG9mIHRoZQorIHN1cHBsaWVkIGZp
ZWxkLiBgZmllbGRzYCBpcyBhIGxpc3Qgb2YgcGFpcnMsIHdoZXJlIHRoZSBmaXJzdCBlbGVtZW50
IGlzIHRoZQorIGZpZWxkLXBhdGggYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUgdmFsdWUg
dG8gcmVwbGFjZSB0aGUgdGFyZ2V0IHdpdGguCisgRXhhbXBsZXM6CisgIChyZXBsYWNlLWZpZWxk
cyAnKAorICAgICgoXCJwYXRoXCIgXCJ0b1wiIFwiZmllbGRcIikgXCJuZXcgZmllbGQgdmFsdWVc
IikKKyAgICAoXCJwYXRoLnRvLm90aGVyLmZpZWxkXCIgXCJuZXcgZmllbGQgdmFsdWVcIikpKSIK
KyAgKG1vZGlmeS1qc29uLWZpZWxkcworICAgIGZpZWxkcworICAgIChsYW1iZGEgKGZpZWxkIGRh
dGEga2V5KQorICAgICAgKGFzc29jLXNldCEgZGF0YSBrZXkgKGNkciBmaWVsZCkpKQorICAgICM6
ZmllbGQtcGF0aC1tYXBwZXIgKGxhbWJkYSAoZmllbGQpIChjYXIgZmllbGQpKQorICAgICM6c3Ry
aWN0PyBzdHJpY3Q/KSkKKworKGRlZmluZSAoZGVsZXRlLWRldi1kZXBlbmRlbmNpZXMpCisgIChk
ZWxldGUtZmllbGRzIChsaXN0ICJkZXZEZXBlbmRlbmNpZXMiKSAjOnN0cmljdCAjZikpCisKIDs7
OwogOzs7IFBoYXNlcy4KIDs7OwpAQCAtMTQ0LDMxICsyOTUsNiBAQCAoZGVmaW5lKiAocGF0Y2gt
ZGVwZW5kZW5jaWVzICM6a2V5IGlucHV0cyAjOmFsbG93LW90aGVyLWtleXMpCiAgICAgICAgICAg
ICAgICAgICAoYXNzb2MtcmVmKiBwa2ctbWV0YSAiZGVwZW5kZW5jaWVzIiAnKCkpKSkpKSkpKSkK
ICAgI3QpCiAKLShkZWZpbmUgKGRlbGV0ZS1kZXBlbmRlbmNpZXMgZGVwZW5kZW5jaWVzLXRvLXJl
bW92ZSkKLSAgIlJld3JpdGUgJ3BhY2thZ2UuanNvbicgdG8gYWxsb3cgdGhlIGJ1aWxkIHRvIHBy
b2NlZWQgd2l0aG91dCBwYWNrYWdlcwotbGlzdGVkIGluICdkZXBlbmRlbmNpZXMtdG8tcmVtb3Zl
JywgYSBsaXN0IG9mIHN0cmluZ3MgbmFtaW5nIG5wbSBwYWNrYWdlcy4KLQotVG8gcHJldmVudCB0
aGUgZGVsZXRlZCBkZXBlbmRlbmNpZXMgZnJvbSBiZWluZyByZWludHJvZHVjZWQsIHVzZSB0aGlz
IGZ1bmN0aW9uCi1vbmx5IGFmdGVyIHRoZSAncGF0Y2gtZGVwZW5kZW5jaWVzJyBwaGFzZS4iCi0g
ICh3aXRoLWF0b21pYy1qc29uLWZpbGUtcmVwbGFjZW1lbnQKLSAgICAobGFtYmRhIChwa2ctbWV0
YSkKLSAgICAgIChmb2xkCi0gICAgICAgIChsYW1iZGEgKGRlcGVuZGVuY3kta2V5IHBrZy1tZXRh
KQotICAgICAgICAgIChhbGlzdC11cGRhdGUKLSAgICAgICAgICAgIHBrZy1tZXRhCi0gICAgICAg
ICAgICBkZXBlbmRlbmN5LWtleQotICAgICAgICAgICAgKGxhbWJkYSAoZGVwZW5kZW5jaWVzKQot
ICAgICAgICAgICAgICAocmVtb3ZlCi0gICAgICAgICAgICAgICAgKGxhbWJkYSAoZGVwZW5kZW5j
eSkKLSAgICAgICAgICAgICAgICAgIChtZW1iZXIgKGNhciBkZXBlbmRlbmN5KSBkZXBlbmRlbmNp
ZXMtdG8tcmVtb3ZlKSkKLSAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMpKSkpCi0gICAgICAg
IHBrZy1tZXRhCi0gICAgICAgIChsaXN0Ci0gICAgICAgICAgImRldkRlcGVuZGVuY2llcyIKLSAg
ICAgICAgICAiZGVwZW5kZW5jaWVzIgotICAgICAgICAgICJwZWVyRGVwZW5kZW5jaWVzIgotICAg
ICAgICAgICJvcHRpb25hbERlcGVuZGVuY2llcyIpKSkpKQotCiAoZGVmaW5lKiAoZGVsZXRlLWxv
Y2tmaWxlcyAjOmtleSBpbnB1dHMgIzphbGxvdy1vdGhlci1rZXlzKQogICAiRGVsZXRlICdwYWNr
YWdlLWxvY2suanNvbicsICd5YXJuLmxvY2snLCBhbmQgJ25wbS1zaHJpbmt3cmFwLmpzb24nLCBp
ZiB0aGV5CiBleGlzdC4iCi0tIAoyLjQ2LjAKCg==
--000000000000e12ff3062a6fccd4--





Last modified: Sun, 12 Jan 2025 05:45:02 UTC

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