From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2.migadu.com ([2001:41d0:303:e16b::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms13.migadu.com with LMTPS id 6HFdJQTGcWccNwEAe85BDQ:P1 (envelope-from ) for ; Sun, 29 Dec 2024 21:58:28 +0000 Received: from aspmx1.migadu.com ([2001:41d0:303:e16b::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2.migadu.com with LMTPS id 6HFdJQTGcWccNwEAe85BDQ (envelope-from ) for ; Sun, 29 Dec 2024 22:58:28 +0100 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=debbugs.gnu.org header.s=debbugs-gnu-org header.b=NLKM70nn; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20230601 header.b=jpU3YMHF; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org"; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=gmail.com (policy=none) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1735509508; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:resent-cc:resent-from:resent-sender: resent-message-id:in-reply-to:in-reply-to:references:references: list-id:list-help:list-unsubscribe:list-subscribe:list-post: dkim-signature; bh=y29xI7/HjQNcavu2BLXnDB4H2II5x3SK1yC0ImOdzC0=; b=pJFDZhpEvcryen3a1rzoqOGUT5tFdtg1YxpsMggUaK5IYM5z0nfHCjC9VC4DryMuIATTkz CvZ25EZgueL6RsNilyBc93q23edI4aFP61Gv613n4oQUSVR71ER6HAQtrS82acMj71ydiy v0qrNgwHU9Im5AY2wNb+n4F4GgWpKUFta3+XjKIfZjUb3R7ejIU0lUQnjE9RZE5u+7bXg1 FnJtCt3tEHIHAy5Xrm6T87HiqxqcaMUD1aVeTwtyPj6zk0M7nno0K6iImxIpHTmABG6x0g 9GlBLPbjNyQevBLquJofn39gVZnDpoYe2Ho4waKWWWQNYnZcL0L1n340SZ3Siw== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=debbugs.gnu.org header.s=debbugs-gnu-org header.b=NLKM70nn; dkim=fail ("headers rsa verify failed") header.d=gmail.com header.s=20230601 header.b=jpU3YMHF; spf=pass (aspmx1.migadu.com: domain of "guix-patches-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="guix-patches-bounces+larch=yhetil.org@gnu.org"; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=gmail.com (policy=none) ARC-Seal: i=1; s=key1; d=yhetil.org; t=1735509508; a=rsa-sha256; cv=none; b=mPyGGW9tceeHoCFYA5iQkGMg1zTUhOeU2SaTDmY+Sz9lGNWxJSsnZ4hYrvGbBMSxlvXgcP H0NOxMcLh23SPkNatWhzWHjtdChdT7aJC3DoTHg/VI7b/Dg/wy8li5T65tt8vUYD09QaS5 sTNxaGlm2Zp5jvhoRdFXwYmVOdwekretpjukYOU98q6/dEXxVBs5ZtttyBdqGNgJ5+f4FC hrF6PT1t1zzPB+ucBdcSSeFI7HIXrrPn0r7LAEtragycZGd5Qcv1K4/0fHZnX9Vyc+mSQI tvEokBldh8Eal+xoQoor/Aw3pwHgqsnSSkODWBHDlGvLzDPjrGrrTszY7yqA8Q== Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id F1D1481EF7 for ; Sun, 29 Dec 2024 22:58:27 +0100 (CET) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tS1IS-0008Nj-Ll; Sun, 29 Dec 2024 16:58:04 -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 ) id 1tS1IR-0008NG-1F for guix-patches@gnu.org; Sun, 29 Dec 2024 16:58:03 -0500 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tS1IQ-00087w-Nq for guix-patches@gnu.org; Sun, 29 Dec 2024 16:58:02 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debbugs.gnu.org; s=debbugs-gnu-org; h=Date:From:MIME-Version:To:In-Reply-To:References:Subject; bh=y29xI7/HjQNcavu2BLXnDB4H2II5x3SK1yC0ImOdzC0=; b=NLKM70nnsbf5mPr0ICMjPSgcABQCKlEc55je3DxvutxPjFr11bhK5/ReUxhoV3GtOQGdgfWS1Q+DOjiZ7/SYEPnsG8QwA/jWsUo5nvzhPs+h+taP3FrV6foanLc+/Wqg57Kbg8uv52ZboyBy8wD2I9N4kEeyXtrTzibWqZMRENUFn/zAjJ4A9NbY8t8gguNzpCxUA/Zq92YdCnlThjodt+6/H2Mv1ciPIW7Da+DyhT/JUfl804+UdmKaAHOm3cl21kkHaP5+dtEEAmDg2l+PYkSt1a0Acma/524mrmwRV/MantDcx4wo/mr2eOaMZxx4KlSyjtR/Xyzib7JwrDVuBQ==; Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1tS1IQ-0007ra-Gp for guix-patches@gnu.org; Sun, 29 Dec 2024 16:58:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#74900] [PATCH 1/2] Replace (guix build json) with (json) in node-build-system References: In-Reply-To: Resent-From: Daniel Khodabakhsh Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sun, 29 Dec 2024 21:58:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 74900 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 74900@debbugs.gnu.org Received: via spool by 74900-submit@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 ) id 1tS1IL-0007rH-FF for submit@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 ) id 1tS1IH-0007r7-Bz for 74900@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@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 Date: Sun, 29 Dec 2024 21:56:41 +0000 Message-ID: Content-Type: multipart/mixed; boundary="00000000000009b154062a6fc654" X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: guix-patches-bounces+larch=yhetil.org@gnu.org X-Migadu-Country: US X-Migadu-Flow: FLOW_IN X-Migadu-Queue-Id: F1D1481EF7 X-Migadu-Scanner: mx13.migadu.com X-Migadu-Spam-Score: -3.19 X-Spam-Score: -3.19 X-TUID: 4LJx1lagTO0P --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 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 ;;; Copyright =C2=A9 2022 Nicolas Graves ;;; Copyright =C2=A9 2023 Jelle Licht +;;; Copyright =C2=A9 2024 Daniel Khodabakhsh ;;; ;;; This file is part of GNU Guix. ;;; @@ -24,14 +25,14 @@ ;;; along with GNU Guix. If not, see . (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 ;;; Copyright =C2=A9 2021 Pierre Langlois ;;; Copyright =C2=A9 2021 Philip McGrath +;;; Copyright =C2=A9 2024 Daniel Khodabakhsh ;;; ;;; 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 ;;; Copyright =C2=A9 2021, 2022 Philip McGrath ;;; Copyright =C2=A9 2022 Liliana Marie Prikler +;;; Copyright =C2=A9 2024 Daniel Khodabakhsh ;;; ;;; 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: 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--