From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Elijah G Newsgroups: gmane.emacs.devel Subject: Re: [PATCH] Flymake Support Indicator Errors in Margin Date: Tue, 12 Mar 2024 11:22:04 -0600 Message-ID: References: <87r0gfajlh.fsf@posteo.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="00000000000012b451061379e67b" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="16422"; mail-complaints-to="usenet@ciao.gmane.io" Cc: emacs-devel@gnu.org To: Philip Kaludercic Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Tue Mar 12 18:23:17 2024 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rk5qO-00041d-Pq for ged-emacs-devel@m.gmane-mx.org; Tue, 12 Mar 2024 18:23:16 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rk5pb-0000Nr-KU; Tue, 12 Mar 2024 13:22:29 -0400 Original-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 1rk5pR-0000NO-Pb for emacs-devel@gnu.org; Tue, 12 Mar 2024 13:22:17 -0400 Original-Received: from mail-qt1-x842.google.com ([2607:f8b0:4864:20::842]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1rk5pN-0004a1-Js for emacs-devel@gnu.org; Tue, 12 Mar 2024 13:22:16 -0400 Original-Received: by mail-qt1-x842.google.com with SMTP id d75a77b69052e-42f1d354005so25093921cf.0 for ; Tue, 12 Mar 2024 10:22:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710264132; x=1710868932; darn=gnu.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=cjugVQJwiMKNCfT1Xpzn9qHE0h1roVzIfu9XVLALTRA=; b=LJvDKuVh7SzH5xNhTKJQLnGFoX7lL1brAI1JFjd7DcZVpzB8fpNdeDOlexOv4DIMTE A2zM/JQrmShQMY/B9Rl5kubCPpp346mgG8CUbGLHW5sfu/Ud1cqV4/OFk3iDXgtnZmIq d7FRrhVID3PKXzd05AXJnYDg8HNjCoeCn8eR+shhJbJokihUPWm2cS3jXvEAxnniqH6j FKjcTUdm2AAqyHpUVE+csNMWh3CmigDMRbnmfFNNXeyLsRQev3GHcrbv7xxZolM8EIZO J9WK0mBbFmBrmqC3ka7zEQp1pG/QUIXn8qnKiTgUt1IOOxDXiHlFJgDCM4IsichpnxGu ukcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710264132; x=1710868932; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=cjugVQJwiMKNCfT1Xpzn9qHE0h1roVzIfu9XVLALTRA=; b=TBT/2GuencAy2edmjR8H3WdZqreJJB7RHCsjRQu7bRR9Zo+RH6jhabvTzpsm/eLGrv VgA6C4F10fx8ukum9uPXaz6AzXUM8pjvEVj1mdeQ8h43dMb7KTrdlJIcg8gVk7DQ+8mq S0pmc+wYUoTcg0tqWtBH7YQPJJ1LL0xXuoQBUpQNZnlN6Skfng0IP9bAvVe0BveQhT/H 4i5WCX7bTAWy7V8lzLmDRLjX45+q8L/N4nXeLfwLXlDaNXuZNol7NVuVw+CFb9b+ayIz i5IfQVIp5q67nEqJJ0aG14gDjctkvMtgmXRX4Dbf6Lqu7xkemTUNEzWhOGVLQGSFzHwO mO/w== X-Gm-Message-State: AOJu0YyPQgCRzAMrTzlFpn9GfKK1SWv+bSmO5OPpxrc6/lP8GvV6HleX B1XW32CqxRy0dl4s8EymBTThuXtHgd+kwwCLMfpsDw3bteFEdi4lp4qwpSW/HKI0meBdqTw80ro 6V/QRttem3jA9ZKcPDDU9TcNU8rn3HdrNWykW6jWs X-Google-Smtp-Source: AGHT+IFYwFJTP/vRDGtFI9HsVM37UNBvDyK13lUtV1qFE3Gmv8fC+k4ci/MnDLndVLyWyqeVJ7Z6q+ii4Ff6eSawShc= X-Received: by 2002:a05:622a:5cb:b0:42f:13ef:e8a3 with SMTP id d11-20020a05622a05cb00b0042f13efe8a3mr11891557qtb.60.1710264132202; Tue, 12 Mar 2024 10:22:12 -0700 (PDT) In-Reply-To: <87r0gfajlh.fsf@posteo.net> Received-SPF: pass client-ip=2607:f8b0:4864:20::842; envelope-from=eg642616@gmail.com; helo=mail-qt1-x842.google.com X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 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_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:317020 Archived-At: --00000000000012b451061379e67b Content-Type: multipart/alternative; boundary="00000000000012b44f061379e679" --00000000000012b44f061379e679 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thank you, I've fixed my patch. Also I merged every flymake *-bitmap variable into a single user option. Also sorry for duplicating my reponses, I'm new in the mailing list. On Tue, Mar 12, 2024 at 3:24=E2=80=AFAM Philip Kaludercic wrote: > Elijah G writes: > > > Hello developers, > > this is my first time contributing to emacs, > > i made support for displaying errors in margin for flymake like flychec= k > > does, > > This allows indicating errors in both text and graphical mode. > > > > I've sent my copyright assignment request. > > > > Since this is my first time contributing i would like to hear your > > suggestions and thoughts > > > > Thanks. > > From 0d4539c6b8483eb13cfcdde3d73c71e430fdb30b Mon Sep 17 00:00:00 2001 > > From: Elias G > > Date: Mon, 11 Mar 2024 13:35:06 -0600 > > Subject: [PATCH] Flymake Support Indicator Errors in Margin > > > > --- > > etc/NEWS | 11 ++++ > > lisp/progmodes/flymake.el | 117 +++++++++++++++++++++++++++++++++----- > > 2 files changed, 114 insertions(+), 14 deletions(-) > > > > diff --git a/etc/NEWS b/etc/NEWS > > index 19cd170e5c7..83cf1ba9962 100644 > > --- a/etc/NEWS > > +++ b/etc/NEWS > > @@ -1121,6 +1121,17 @@ in a clean environment. > > > > ** Flymake > > > > ++++ > > +*** New user option 'flymake-indicator-type' > > +Indicate which indicator type to use for display errors. > > + > > +The value can be nil (dont indicate errors but just highlight them), > ^ > don't > > > +fringes (use fringes) or margins (use margins). > > But I am not sure if you really need to document this in NEWS. In fact, > it might be possible to merge this and the next point: > > > + > > ++++ > > +*** Support Display Errors Indicator in margin > > +This allow indicate errors in both graphical and text display. > > + > > +++ > > *** New user option 'flymake-show-diagnostics-at-end-of-line'. > > When non-nil, Flymake shows summarized descriptions of diagnostics at > > diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el > > index db00cc59c0e..835f2057109 100644 > > --- a/lisp/progmodes/flymake.el > > +++ b/lisp/progmodes/flymake.el > > @@ -180,6 +180,73 @@ See `flymake-error-bitmap' and > `flymake-warning-bitmap'." > > (const right-fringe) > > (const :tag "No fringe indicators" nil))) > > > > +(defcustom flymake-indicator-type 'fringes > > + "Indicate which indicator type to use for display errors. > > + > > +The value can be nil (dont indicate errors but just highlight them), > > +fringes (use fringes) or margins (use margins) > > + > > +Difference between fringes and margin is that fringes support diplayin= g > > +bitmaps on graphical displays and margins display text in a blank area > > +of buffer that works in both graphical and text displays. > > + > > +See Info node `Fringes' and Info node `(elisp)Display Margins'." > > + :version "30.1" > > + :type '(choice (const :tag "Use Fringes" fringes) > > + (const :tag "Use Margins "margins) > > + (const :tag "No indicators" nil))) > > There are tabs here. > > > + > > +(defcustom flymake-error-margin-string '("=E2=80=BC" compilation-error= ) > > + "String used in the margn for indicating errors. > > +The value may also be a list of two elements where the second > > +element specifies the face for the string. > > +See also `flymake-warning-margin-string'. > > + > > +The option `flymake-margin-indicator-position' controls how and where > > +this is used." > > + :version "30.1" > > + :type '(choice (string :tag "String") > > + (list :tag "String and face" > > + (string :tag "String") > > + (face :tag "Face")))) > > + > > +(defcustom flymake-warning-margin-string '("!" compilation-warning) > > + "String used in the margin for indicating warnings. > > +The value may also be a list of two elements where the second > > +element specifies the face for the string. > > +See also `flymake-error-margin-string'. > > + > > +The option `flymake-margin-indicator-position' controls how and where > > +this is used." > > + :version "30.1" > > + :type '(choice (string :tag "String") > > + (list :tag "String and face" > > + (string :tag "String") > > + (face :tag "Face")))) > > + > > +(defcustom flymake-note-margin-string '("!" compilation-info) > > + "String used in the margin for indicating info notes. > > +The value may also be a list of two elements where the second > > +element specifies the face for the string. > > +See also `flymake-error-margin-string'. > > + > > +The option `flymake-margin-indicator-position' controls how and where > > +this is used." > > + :version "30.1" > > + :type '(choice (string :tag "String") > > + (list :tag "String and face" > > + (string :tag "String") > > + (face :tag "Face")))) > > Should or could these be merged into a single user option, that would > then have the form > > '((error "=E2=80=BC" compilation-error) > (note "!" compilation-warning) > (info "!" compilation-info)) > > > + > > +(defcustom flymake-margin-indicator-position 'left-margin > > + "The position to put Flymake margin indicator. > > +The value can be nil (do not use indicators), `left-margin' or > `right-margin'. > > +See `flymake-error-margin-string' and `flymake-warning-margin-string'.= " > > + :version "30.1" > > + :type '(choice (const left-margin) > > + (const right-margin) > > + (const :tag "No margin indicators" nil))) > > + > > (make-obsolete-variable 'flymake-start-syntax-check-on-newline > > "can check on newline in post-self-insert-hook" > > "27.1") > > @@ -630,6 +697,7 @@ Node `(Flymake)Flymake error types'" > > > > (put 'flymake-error 'face 'flymake-error) > > (put 'flymake-error 'flymake-bitmap 'flymake-error-bitmap) > > +(put 'flymake-error 'flymake-margin-string 'flymake-error-margin-strin= g) > > (put 'flymake-error 'severity (warning-numeric-level :error)) > > (put 'flymake-error 'mode-line-face 'flymake-error-echo) > > (put 'flymake-error 'echo-face 'flymake-error-echo) > > @@ -638,6 +706,7 @@ Node `(Flymake)Flymake error types'" > > > > (put 'flymake-warning 'face 'flymake-warning) > > (put 'flymake-warning 'flymake-bitmap 'flymake-warning-bitmap) > > +(put 'flymake-warning 'flymake-margin-string > 'flymake-warning-margin-string) > > (put 'flymake-warning 'severity (warning-numeric-level :warning)) > > (put 'flymake-warning 'mode-line-face 'flymake-warning-echo) > > (put 'flymake-warning 'echo-face 'flymake-warning-echo) > > @@ -646,6 +715,7 @@ Node `(Flymake)Flymake error types'" > > > > (put 'flymake-note 'face 'flymake-note) > > (put 'flymake-note 'flymake-bitmap 'flymake-note-bitmap) > > +(put 'flymake-note 'flymake-margin-string 'flymake-note-margin-string) > > (put 'flymake-note 'severity (warning-numeric-level :debug)) > > (put 'flymake-note 'mode-line-face 'flymake-note-echo) > > (put 'flymake-note 'echo-face 'flymake-note-echo) > > @@ -682,19 +752,34 @@ associated `flymake-category' return DEFAULT." > > (flymake--lookup-type-property type 'severity > > (warning-numeric-level :error))) > > > > -(defun flymake--fringe-overlay-spec (bitmap &optional recursed) > > - (if (and (symbolp bitmap) > > - (boundp bitmap) > > - (not recursed)) > > - (flymake--fringe-overlay-spec > > - (symbol-value bitmap) t) > > - (and flymake-fringe-indicator-position > > - bitmap > > - (propertize "!" 'display > > - (cons flymake-fringe-indicator-position > > - (if (listp bitmap) > > - bitmap > > - (list bitmap))))))) > > +(defun flymake--fringe-overlay-spec (indicator) > > + "Return INDICATOR-TYPE as propertized string to use in error > indicators" > > + (let* ((value (if (symbolp indicator) > > + (symbol-value indicator) > > + indicator)) > > + (indicator-car (if (listp value) > > + (car value) > > + value)) > > + (indicator-cdr (if (listp value) > > + (cdr value)))) > > + (cond > > + ((symbolp indicator-car) > > + (propertize "!" 'display > > + (cons flymake-fringe-indicator-position > > + (if (listp value) > > + value > > + (list value))))) > > + ((stringp indicator-car) > > + (propertize "!" > > + 'display > > + `((margin ,flymake-margin-indicator-position) > > + ,(propertize > > + indicator-car > > + 'face > > + `(:inherit (,indicator-cdr > > + default) > > + ))))) > > You should fold these parentheses back onto the previous line. > > > + (t nil)))) > > This is not needed, as cond will default to nil if no case matched. > > > > > (defun flymake--equal-diagnostic-p (a b) > > "Tell if A and B are equivalent `flymake--diag' objects." > > @@ -843,7 +928,11 @@ Return nil or the overlay created." > > (flymake--fringe-overlay-spec > > (flymake--lookup-type-property > > type > > - 'flymake-bitmap > > + (cond ((eq flymake-indicator-type 'fringes) > > + 'flymake-bitmap) > > + ((eq flymake-indicator-type 'margins) > > + 'flymake-margin-string) > > + (t nil)) > > (alist-get 'bitmap (alist-get type ; backward compat > > > flymake-diagnostic-types-alist))))) > > ;; (default-maybe 'after-string > > -- > Philip Kaludercic on peregrine > --00000000000012b44f061379e679 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Thank you, I've fixed my patch.
Also I merged every flym= ake *-bitmap variable=C2=A0
into a single user option.=C2=A0

Also sorry for duplicating my reponses, I'm new in= the mailing list.

= On Tue, Mar 12, 2024 at 3:24=E2=80=AFAM Philip Kaludercic <philipk@posteo.net> wrote:
Elijah G <eg642616@gmail.com> writes:

> Hello developers,
> this is my first time contributing to emacs,
> i made support for displaying errors in margin for flymake like flyche= ck
> does,
> This allows indicating errors in both text and graphical mode.
>
> I've sent my copyright assignment request.
>
> Since this is my first time contributing i would like to hear your
> suggestions and thoughts
>
> Thanks.
> From 0d4539c6b8483eb13cfcdde3d73c71e430fdb30b Mon Sep 17 00:00:00 2001=
> From: Elias G <eg642616@gmail.com>
> Date: Mon, 11 Mar 2024 13:35:06 -0600
> Subject: [PATCH] Flymake Support Indicator Errors in Margin
>
> ---
>=C2=A0 etc/NEWS=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 |=C2=A0 11 ++++
>=C2=A0 lisp/progmodes/flymake.el | 117 ++++++++++++++++++++++++++++++++= +-----
>=C2=A0 2 files changed, 114 insertions(+), 14 deletions(-)
>
> diff --git a/etc/NEWS b/etc/NEWS
> index 19cd170e5c7..83cf1ba9962 100644
> --- a/etc/NEWS
> +++ b/etc/NEWS
> @@ -1121,6 +1121,17 @@ in a clean environment.
>=C2=A0
>=C2=A0 ** Flymake
>=C2=A0
> ++++
> +*** New user option 'flymake-indicator-type'
> +Indicate which indicator type to use for display errors.
> +
> +The value can be nil (dont indicate errors but just highlight them),<= br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 ^
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 don't

> +fringes (use fringes) or margins (use margins).

But I am not sure if you really need to document this in NEWS.=C2=A0 In fac= t,
it might be possible to merge this and the next point:

> +
> ++++
> +*** Support Display Errors Indicator in margin
> +This allow indicate errors in both graphical and text display.
> +
>=C2=A0 +++
>=C2=A0 *** New user option 'flymake-show-diagnostics-at-end-of-line= '.
>=C2=A0 When non-nil, Flymake shows summarized descriptions of diagnosti= cs at
> diff --git a/lisp/progmodes/flymake.el b/lisp/progmodes/flymake.el
> index db00cc59c0e..835f2057109 100644
> --- a/lisp/progmodes/flymake.el
> +++ b/lisp/progmodes/flymake.el
> @@ -180,6 +180,73 @@ See `flymake-error-bitmap' and `flymake-warni= ng-bitmap'."
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (const right-fr= inge)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (const :tag &qu= ot;No fringe indicators" nil)))
>=C2=A0
> +(defcustom flymake-indicator-type 'fringes
> +=C2=A0 "Indicate which indicator type to use for display errors.=
> +
> +The value can be nil (dont indicate errors but just highlight them),<= br> > +fringes (use fringes) or margins (use margins)
> +
> +Difference between fringes and margin is that fringes support diplayi= ng
> +bitmaps on graphical displays and margins display text in a blank are= a
> +of buffer that works in both graphical and text displays.
> +
> +See Info node `Fringes' and Info node `(elisp)Display Margins'= ;."
> +=C2=A0 :version "30.1"
> +=C2=A0 :type '(choice (const :tag "Use Fringes" fringes= )
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (const :tag "Us= e Margins "margins)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (const :tag "No= indicators" nil)))

There are tabs here.

> +
> +(defcustom flymake-error-margin-string '("=E2=80=BC" co= mpilation-error)
> +=C2=A0 "String used in the margn for indicating errors.
> +The value may also be a list of two elements where the second
> +element specifies the face for the string.
> +See also `flymake-warning-margin-string'.
> +
> +The option `flymake-margin-indicator-position' controls how and w= here
> +this is used."
> +=C2=A0 :version "30.1"
> +=C2=A0 :type '(choice (string :tag "String")
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(list := tag "String and face"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0(string :tag "String")
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0(face :tag "Face"))))
> +
> +(defcustom flymake-warning-margin-string '("!" compilat= ion-warning)
> +=C2=A0 "String used in the margin for indicating warnings.
> +The value may also be a list of two elements where the second
> +element specifies the face for the string.
> +See also `flymake-error-margin-string'.
> +
> +The option `flymake-margin-indicator-position' controls how and w= here
> +this is used."
> +=C2=A0 :version "30.1"
> +=C2=A0 :type '(choice (string :tag "String")
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(list := tag "String and face"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0(string :tag "String")
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0(face :tag "Face"))))
> +
> +(defcustom flymake-note-margin-string '("!" compilation= -info)
> +=C2=A0 "String used in the margin for indicating info notes.
> +The value may also be a list of two elements where the second
> +element specifies the face for the string.
> +See also `flymake-error-margin-string'.
> +
> +The option `flymake-margin-indicator-position' controls how and w= here
> +this is used."
> +=C2=A0 :version "30.1"
> +=C2=A0 :type '(choice (string :tag "String")
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(list := tag "String and face"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0(string :tag "String")
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0(face :tag "Face"))))

Should or could these be merged into a single user option, that would
then have the form

=C2=A0 '((error "=E2=80=BC" compilation-error)
=C2=A0 =C2=A0 (note "!" compilation-warning)
=C2=A0 =C2=A0 (info "!" compilation-info))

> +
> +(defcustom flymake-margin-indicator-position 'left-margin
> +=C2=A0 "The position to put Flymake margin indicator.
> +The value can be nil (do not use indicators), `left-margin' or `r= ight-margin'.
> +See `flymake-error-margin-string' and `flymake-warning-margin-str= ing'."
> +=C2=A0 :version "30.1"
> +=C2=A0 :type '(choice (const left-margin)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (const right-margin)=
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (const :tag "No= margin indicators" nil)))
> +
>=C2=A0 (make-obsolete-variable 'flymake-start-syntax-check-on-newli= ne
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0"can check on newline in post-self-insert-hook"
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 "27.1")
> @@ -630,6 +697,7 @@ Node `(Flymake)Flymake error types'"
>=C2=A0
>=C2=A0 (put 'flymake-error 'face 'flymake-error)
>=C2=A0 (put 'flymake-error 'flymake-bitmap 'flymake-error-b= itmap)
> +(put 'flymake-error 'flymake-margin-string 'flymake-error= -margin-string)
>=C2=A0 (put 'flymake-error 'severity (warning-numeric-level :er= ror))
>=C2=A0 (put 'flymake-error 'mode-line-face 'flymake-error-e= cho)
>=C2=A0 (put 'flymake-error 'echo-face 'flymake-error-echo)<= br> > @@ -638,6 +706,7 @@ Node `(Flymake)Flymake error types'"
>=C2=A0
>=C2=A0 (put 'flymake-warning 'face 'flymake-warning)
>=C2=A0 (put 'flymake-warning 'flymake-bitmap 'flymake-warni= ng-bitmap)
> +(put 'flymake-warning 'flymake-margin-string 'flymake-war= ning-margin-string)
>=C2=A0 (put 'flymake-warning 'severity (warning-numeric-level := warning))
>=C2=A0 (put 'flymake-warning 'mode-line-face 'flymake-warni= ng-echo)
>=C2=A0 (put 'flymake-warning 'echo-face 'flymake-warning-ec= ho)
> @@ -646,6 +715,7 @@ Node `(Flymake)Flymake error types'"
>=C2=A0
>=C2=A0 (put 'flymake-note 'face 'flymake-note)
>=C2=A0 (put 'flymake-note 'flymake-bitmap 'flymake-note-bit= map)
> +(put 'flymake-note 'flymake-margin-string 'flymake-note-m= argin-string)
>=C2=A0 (put 'flymake-note 'severity (warning-numeric-level :deb= ug))
>=C2=A0 (put 'flymake-note 'mode-line-face 'flymake-note-ech= o)
>=C2=A0 (put 'flymake-note 'echo-face 'flymake-note-echo) > @@ -682,19 +752,34 @@ associated `flymake-category' return DEFAULT= ."
>=C2=A0 =C2=A0 (flymake--lookup-type-property type 'severity
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(warning-numeric-lev= el :error)))
>=C2=A0
> -(defun flymake--fringe-overlay-spec (bitmap &optional recursed) > -=C2=A0 (if (and (symbolp bitmap)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(boundp bitmap)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(not recursed))
> -=C2=A0 =C2=A0 =C2=A0 (flymake--fringe-overlay-spec
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0(symbol-value bitmap) t)
> -=C2=A0 =C2=A0 (and flymake-fringe-indicator-position
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bitmap
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(propertize "!" 'disp= lay
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0(cons flymake-fringe-indicator-position
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0(if (listp bitmap)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bitmap
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(list bitmap)))))))
> +(defun flymake--fringe-overlay-spec (indicator)
> +=C2=A0 "Return INDICATOR-TYPE as propertized string to use in er= ror indicators"
> +=C2=A0 (let* ((value (if (symbolp indicator)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= (symbol-value indicator)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 indica= tor))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(indicator-car (if (listp value) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 (car value)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 value))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(indicator-cdr (if (listp value) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 (cdr value))))
> +=C2=A0 =C2=A0 (cond
> +=C2=A0 =C2=A0 =C2=A0((symbolp indicator-car)
> +=C2=A0 =C2=A0 =C2=A0 (propertize "!" 'display
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (cons = flymake-fringe-indicator-position
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 (if (listp value)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 value
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 (list value)))))
> +=C2=A0 =C2=A0 =C2=A0((stringp indicator-car)
> +=C2=A0 =C2=A0 =C2=A0 (propertize "!"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'd= isplay
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 `((mar= gin ,flymake-margin-indicator-position)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= ,(propertize
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 indicator-car
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 'face
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 `(:inherit (,indicator-cdr
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 default)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0)))))

You should fold these parentheses back onto the previous line.

> +=C2=A0 =C2=A0 =C2=A0(t nil))))

This is not needed, as cond will default to nil if no case matched.

>=C2=A0
>=C2=A0 (defun flymake--equal-diagnostic-p (a b)
>=C2=A0 =C2=A0 "Tell if A and B are equivalent `flymake--diag' = objects."
> @@ -843,7 +928,11 @@ Return nil or the overlay created."
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (flymake--fringe-overlay-spec
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(flymake--lookup-type-property=
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 type
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'flymake-bitmap
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (cond ((eq flymake-indicator-type = 'fringes)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'fl= ymake-bitmap)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ((eq flymake-= indicator-type 'margins)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'fl= ymake-margin-string)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (t nil))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (alist-get 'bitmap (alist= -get type ; backward compat
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 flymake-diagnostic-types-alist)))))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ;; (default-maybe 'after-string

--
=C2=A0 =C2=A0 =C2=A0 =C2=A0 Philip Kaludercic on peregrine
--00000000000012b44f061379e679-- --00000000000012b451061379e67b Content-Type: application/octet-stream; name="0001-Flymake-Support-Indicator-Errors-in-Margin.patch" Content-Disposition: attachment; filename="0001-Flymake-Support-Indicator-Errors-in-Margin.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lton2lg00 RnJvbSA0NjA0NTY2MzE3ZWM0MjUxMjMxZWViMDZiMzMxYWFkYTg2ZTc4ZWU3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBFbGlhcyBHIDxlZzY0MjYxNkBnbWFpbC5jb20+CkRhdGU6IE1v biwgMTEgTWFyIDIwMjQgMTM6MzU6MDYgLTA2MDAKU3ViamVjdDogW1BBVENIXSBGbHltYWtlIFN1 cHBvcnQgSW5kaWNhdG9yIEVycm9ycyBpbiBNYXJnaW4KCi0tLQogbGlzcC9wcm9nbW9kZXMvZmx5 bWFrZS5lbCB8IDE0NCArKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLQogMSBm aWxlIGNoYW5nZWQsIDkwIGluc2VydGlvbnMoKyksIDU0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdp dCBhL2xpc3AvcHJvZ21vZGVzL2ZseW1ha2UuZWwgYi9saXNwL3Byb2dtb2Rlcy9mbHltYWtlLmVs CmluZGV4IGRiMDBjYzU5YzBlLi5hODEyYTJlZGM3YiAxMDA2NDQKLS0tIGEvbGlzcC9wcm9nbW9k ZXMvZmx5bWFrZS5lbAorKysgYi9saXNwL3Byb2dtb2Rlcy9mbHltYWtlLmVsCkBAIC0xMjgsNDYg KzEyOCwyMSBAQAogICA6bGluayAnKGN1c3RvbS1tYW51YWwgIihmbHltYWtlKSBUb3AiKQogICA6 Z3JvdXAgJ3Rvb2xzKQogCi0oZGVmY3VzdG9tIGZseW1ha2UtZXJyb3ItYml0bWFwICcoZmx5bWFr ZS1kb3VibGUtZXhjbGFtYXRpb24tbWFyawotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGNvbXBpbGF0aW9uLWVycm9yKQotICAiQml0bWFwIChhIHN5bWJvbCkgdXNlZCBpbiB0aGUg ZnJpbmdlIGZvciBpbmRpY2F0aW5nIGVycm9ycy4KLVRoZSB2YWx1ZSBtYXkgYWxzbyBiZSBhIGxp c3Qgb2YgdHdvIGVsZW1lbnRzIHdoZXJlIHRoZSBzZWNvbmQKLWVsZW1lbnQgc3BlY2lmaWVzIHRo ZSBmYWNlIGZvciB0aGUgYml0bWFwLiAgRm9yIHBvc3NpYmxlIGJpdG1hcAotc3ltYm9scywgc2Vl IGBmcmluZ2UtYml0bWFwcycuICBTZWUgYWxzbyBgZmx5bWFrZS13YXJuaW5nLWJpdG1hcCcuCiso ZGVmY3VzdG9tIGZseW1ha2UtZnJpbmdlLWluZGljYXRvcnMtYml0bWFwCisgICcoKGVycm9yIGZs eW1ha2UtZG91YmxlLWV4Y2xhbWF0aW9uLW1hcmsgY29tcGlsYXRpb24tZXJyb3IpCisgICAgKHdh cm5pbmcgZXhjbGFtYXRpb24tbWFyayBjb21waWxhdGlvbi13YXJuaW5nKQorICAgIChub3RlIGV4 Y2xhbWF0aW9uLW1hcmsgY29tcGlsYXRpb24taW5mbykpCisgICJCaXRtYXAgKGEgc3ltYm9sKSB1 c2VkIGZvciBmcmluZ2VzIGluZGljYXRvcnMuCitUaGUgdmFsdWUgb2YgZWFjaCBsaXN0IG1heSBi ZSBhIGxpc3Qgb2YgMyBlbGVtZW50cyB3aGVyZSBzcGVjaWZpZXMgdGhlCitlcnJvciB0eXBlLCBp dHMgYml0bWFwIHRvIHVzZSBhbmQgaXRzIGZhY2UsCitvciBhIGxpc3Qgb2YgMiBlbGVtZW50cyBz cGVjaWZ5aW5nIG9ubHkgdGhlIGVycm9yIHR5cGUgYW5kIGl0cyBiaXRtYXAuCiAKIFRoZSBvcHRp b24gYGZseW1ha2UtZnJpbmdlLWluZGljYXRvci1wb3NpdGlvbicgY29udHJvbHMgaG93IGFuZCB3 aGVyZQogdGhpcyBpcyB1c2VkLiIKLSAgOnZlcnNpb24gIjI0LjMiCi0gIDp0eXBlICcoY2hvaWNl IChzeW1ib2wgOnRhZyAiQml0bWFwIikKLSAgICAgICAgICAgICAgICAgKGxpc3QgOnRhZyAiQml0 bWFwIGFuZCBmYWNlIgotICAgICAgICAgICAgICAgICAgICAgICAoc3ltYm9sIDp0YWcgIkJpdG1h cCIpCi0gICAgICAgICAgICAgICAgICAgICAgIChmYWNlIDp0YWcgIkZhY2UiKSkpKQotCi0oZGVm Y3VzdG9tIGZseW1ha2Utd2FybmluZy1iaXRtYXAgJyhleGNsYW1hdGlvbi1tYXJrIGNvbXBpbGF0 aW9uLXdhcm5pbmcpCi0gICJCaXRtYXAgKGEgc3ltYm9sKSB1c2VkIGluIHRoZSBmcmluZ2UgZm9y IGluZGljYXRpbmcgd2FybmluZ3MuCi1UaGUgdmFsdWUgbWF5IGFsc28gYmUgYSBsaXN0IG9mIHR3 byBlbGVtZW50cyB3aGVyZSB0aGUgc2Vjb25kCi1lbGVtZW50IHNwZWNpZmllcyB0aGUgZmFjZSBm b3IgdGhlIGJpdG1hcC4gIEZvciBwb3NzaWJsZSBiaXRtYXAKLXN5bWJvbHMsIHNlZSBgZnJpbmdl LWJpdG1hcHMnLiAgU2VlIGFsc28gYGZseW1ha2UtZXJyb3ItYml0bWFwJy4KLQotVGhlIG9wdGlv biBgZmx5bWFrZS1mcmluZ2UtaW5kaWNhdG9yLXBvc2l0aW9uJyBjb250cm9scyBob3cgYW5kIHdo ZXJlCi10aGlzIGlzIHVzZWQuIgotICA6dmVyc2lvbiAiMjQuMyIKLSAgOnR5cGUgJyhjaG9pY2Ug KHN5bWJvbCA6dGFnICJCaXRtYXAiKQotICAgICAgICAgICAgICAgICAobGlzdCA6dGFnICJCaXRt YXAgYW5kIGZhY2UiCi0gICAgICAgICAgICAgICAgICAgICAgIChzeW1ib2wgOnRhZyAiQml0bWFw IikKLSAgICAgICAgICAgICAgICAgICAgICAgKGZhY2UgOnRhZyAiRmFjZSIpKSkpCi0KLShkZWZj dXN0b20gZmx5bWFrZS1ub3RlLWJpdG1hcCAnKGV4Y2xhbWF0aW9uLW1hcmsgY29tcGlsYXRpb24t aW5mbykKLSAgIkJpdG1hcCAoYSBzeW1ib2wpIHVzZWQgaW4gdGhlIGZyaW5nZSBmb3IgaW5kaWNh dGluZyBpbmZvIG5vdGVzLgotVGhlIHZhbHVlIG1heSBhbHNvIGJlIGEgbGlzdCBvZiB0d28gZWxl bWVudHMgd2hlcmUgdGhlIHNlY29uZAotZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZhY2UgZm9yIHRo ZSBiaXRtYXAuICBGb3IgcG9zc2libGUgYml0bWFwCi1zeW1ib2xzLCBzZWUgYGZyaW5nZS1iaXRt YXBzJy4gIFNlZSBhbHNvIGBmbHltYWtlLWVycm9yLWJpdG1hcCcuCi0KLVRoZSBvcHRpb24gYGZs eW1ha2UtZnJpbmdlLWluZGljYXRvci1wb3NpdGlvbicgY29udHJvbHMgaG93IGFuZCB3aGVyZQot dGhpcyBpcyB1c2VkLiIKLSAgOnZlcnNpb24gIjI2LjEiCi0gIDp0eXBlICcoY2hvaWNlIChzeW1i b2wgOnRhZyAiQml0bWFwIikKLSAgICAgICAgICAgICAgICAgKGxpc3QgOnRhZyAiQml0bWFwIGFu ZCBmYWNlIgorICA6dmVyc2lvbiAiMzAuMSIKKyAgOnR5cGUgJyhyZXBlYXQgOnRhZyAiRXJyb3Ig dHlwZXMgbGlzdHMiCisgICAgICAgICAgICAgICAgIChsaXN0IDp0YWcgIlN0cmluZyBhbmQgZmFj ZSBmb3IgZXJyb3IgdHlwZXMiCisgICAgICAgICAgICAgICAgICAgICAgIChzeW1ib2wgOnRhZyAi RXJyb3IgdHlwZSIpCiAgICAgICAgICAgICAgICAgICAgICAgIChzeW1ib2wgOnRhZyAiQml0bWFw IikKICAgICAgICAgICAgICAgICAgICAgICAgKGZhY2UgOnRhZyAiRmFjZSIpKSkpCiAKQEAgLTE4 MCw2ICsxNTUsNDggQEAgU2VlIGBmbHltYWtlLWVycm9yLWJpdG1hcCcgYW5kIGBmbHltYWtlLXdh cm5pbmctYml0bWFwJy4iCiAJCSAoY29uc3QgcmlnaHQtZnJpbmdlKQogCQkgKGNvbnN0IDp0YWcg Ik5vIGZyaW5nZSBpbmRpY2F0b3JzIiBuaWwpKSkKIAorKGRlZmN1c3RvbSBmbHltYWtlLWluZGlj YXRvci10eXBlICdmcmluZ2VzCisgICJJbmRpY2F0ZSB3aGljaCBpbmRpY2F0b3IgdHlwZSB0byB1 c2UgZm9yIGRpc3BsYXkgZXJyb3JzLgorCitUaGUgdmFsdWUgY2FuIGJlIG5pbCAoZG9udCBpbmRp Y2F0ZSBlcnJvcnMgYnV0IGp1c3QgaGlnaGxpZ2h0IHRoZW0pLAorZnJpbmdlcyAodXNlIGZyaW5n ZXMpIG9yIG1hcmdpbnMgKHVzZSBtYXJnaW5zKQorCitEaWZmZXJlbmNlIGJldHdlZW4gZnJpbmdl cyBhbmQgbWFyZ2luIGlzIHRoYXQgZnJpbmdlcyBzdXBwb3J0IGRpcGxheWluZworYml0bWFwcyBv biBncmFwaGljYWwgZGlzcGxheXMgYW5kIG1hcmdpbnMgZGlzcGxheSB0ZXh0IGluIGEgYmxhbmsg YXJlYQorb2YgYnVmZmVyIHRoYXQgd29ya3MgaW4gYm90aCBncmFwaGljYWwgYW5kIHRleHQgZGlz cGxheXMuCisKK1NlZSBJbmZvIG5vZGUgYEZyaW5nZXMnIGFuZCBJbmZvIG5vZGUgYChlbGlzcClE aXNwbGF5IE1hcmdpbnMnLiIKKyAgOnZlcnNpb24gIjMwLjEiCisgIDp0eXBlICcoY2hvaWNlIChj b25zdCA6dGFnICJVc2UgRnJpbmdlcyIgZnJpbmdlcykKKyAgICAgICAgICAgICAgICAgKGNvbnN0 IDp0YWcgIlVzZSBNYXJnaW5zICJtYXJnaW5zKQorICAgICAgICAgICAgICAgICAoY29uc3QgOnRh ZyAiTm8gaW5kaWNhdG9ycyIgbmlsKSkpCisKKyhkZWZjdXN0b20gZmx5bWFrZS1tYXJnaW4taW5k aWNhdG9ycy1zdHJpbmcgJygoZXJyb3IgIuKAvCIgY29tcGlsYXRpb24tZXJyb3IpCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhcm5pbmcgIiEiIGNvbXBp bGF0aW9uLXdhcm5pbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKG5vdGUgIiEiIGNvbXBpbGF0aW9uLWluZm8pKQorICAiU3RyaW5ncyB1c2VkIGZvciBt YXJnaW5zIGluZGljYXRvcnMuCitUaGUgdmFsdWUgb2YgZWFjaCBsaXN0IG1heSBiZSBhIGxpc3Qg b2YgMyBlbGVtZW50cyB3aGVyZSBzcGVjaWZpZXMgdGhlCitlcnJvciB0eXBlLCBpdHMgc3RyaW5n IHRvIHVzZSBhbmQgaXRzIGZhY2UsCitvciBhIGxpc3Qgb2YgMiBlbGVtZW50cyBzcGVjaWZ5aW5n IG9ubHkgdGhlIGVycm9yIHR5cGUgYW5kIGl0cyBzdHJpbmcuCisKK1RoZSBvcHRpb24gYGZseW1h a2UtbWFyZ2luLWluZGljYXRvci1wb3NpdGlvbicgY29udHJvbHMgaG93IGFuZCB3aGVyZQordGhp cyBpcyB1c2VkLiIKKyAgOnZlcnNpb24gIjMwLjEiCisgIDp0eXBlICcocmVwZWF0IDp0YWcgIkVy cm9yIHR5cGVzIGxpc3RzIgorICAgICAgICAgICAgICAgICAobGlzdCA6dGFnICJTdHJpbmcgYW5k IGZhY2UgZm9yIGVycm9yIHR5cGVzIgorICAgICAgICAgICAgICAgICAgICAgICAoc3ltYm9sIDp0 YWcgIkVycm9yIHR5cGUiKQorICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nIDp0YWcgIlN0 cmluZyIpCisgICAgICAgICAgICAgICAgICAgICAgIChmYWNlIDp0YWcgIkZhY2UiKSkpKQorCiso ZGVmY3VzdG9tIGZseW1ha2UtbWFyZ2luLWluZGljYXRvci1wb3NpdGlvbiAnbGVmdC1tYXJnaW4K KyAgIlRoZSBwb3NpdGlvbiB0byBwdXQgRmx5bWFrZSBtYXJnaW4gaW5kaWNhdG9yLgorVGhlIHZh bHVlIGNhbiBiZSBuaWwgKGRvIG5vdCB1c2UgaW5kaWNhdG9ycyksIGBsZWZ0LW1hcmdpbicgb3Ig YHJpZ2h0LW1hcmdpbicuCitTZWUgYGZseW1ha2UtZXJyb3ItbWFyZ2luLXN0cmluZycgYW5kIGBm bHltYWtlLXdhcm5pbmctbWFyZ2luLXN0cmluZycuIgorICA6dmVyc2lvbiAiMzAuMSIKKyAgOnR5 cGUgJyhjaG9pY2UgKGNvbnN0IGxlZnQtbWFyZ2luKQorICAgICAgICAgICAgICAgICAoY29uc3Qg cmlnaHQtbWFyZ2luKQorICAgICAgICAgICAgICAgICAoY29uc3QgOnRhZyAiTm8gbWFyZ2luIGlu ZGljYXRvcnMiIG5pbCkpKQorCiAobWFrZS1vYnNvbGV0ZS12YXJpYWJsZSAnZmx5bWFrZS1zdGFy dC1zeW50YXgtY2hlY2stb24tbmV3bGluZQogCQkgICAgICAgICJjYW4gY2hlY2sgb24gbmV3bGlu ZSBpbiBwb3N0LXNlbGYtaW5zZXJ0LWhvb2siCiAgICAgICAgICAgICAgICAgICAgICAgICAiMjcu MSIpCkBAIC02MjksNyArNjQ2LDggQEAgTm9kZSBgKEZseW1ha2UpRmx5bWFrZSBlcnJvciB0eXBl cyciCiAgIjI3LjEiKQogCiAocHV0ICdmbHltYWtlLWVycm9yICdmYWNlICdmbHltYWtlLWVycm9y KQotKHB1dCAnZmx5bWFrZS1lcnJvciAnZmx5bWFrZS1iaXRtYXAgJ2ZseW1ha2UtZXJyb3ItYml0 bWFwKQorKHB1dCAnZmx5bWFrZS1lcnJvciAnZmx5bWFrZS1iaXRtYXAgKGFsaXN0LWdldCAnZXJy b3IgZmx5bWFrZS1mcmluZ2UtaW5kaWNhdG9ycy1iaXRtYXApKQorKHB1dCAnZmx5bWFrZS1lcnJv ciAnZmx5bWFrZS1tYXJnaW4tc3RyaW5nIChhbGlzdC1nZXQgJ2Vycm9yIGZseW1ha2UtbWFyZ2lu LWluZGljYXRvcnMtc3RyaW5nKSkKIChwdXQgJ2ZseW1ha2UtZXJyb3IgJ3NldmVyaXR5ICh3YXJu aW5nLW51bWVyaWMtbGV2ZWwgOmVycm9yKSkKIChwdXQgJ2ZseW1ha2UtZXJyb3IgJ21vZGUtbGlu ZS1mYWNlICdmbHltYWtlLWVycm9yLWVjaG8pCiAocHV0ICdmbHltYWtlLWVycm9yICdlY2hvLWZh Y2UgJ2ZseW1ha2UtZXJyb3ItZWNobykKQEAgLTYzNyw3ICs2NTUsOCBAQCBOb2RlIGAoRmx5bWFr ZSlGbHltYWtlIGVycm9yIHR5cGVzJyIKIChwdXQgJ2ZseW1ha2UtZXJyb3IgJ2ZseW1ha2UtdHlw ZS1uYW1lICJlcnJvciIpCiAKIChwdXQgJ2ZseW1ha2Utd2FybmluZyAnZmFjZSAnZmx5bWFrZS13 YXJuaW5nKQotKHB1dCAnZmx5bWFrZS13YXJuaW5nICdmbHltYWtlLWJpdG1hcCAnZmx5bWFrZS13 YXJuaW5nLWJpdG1hcCkKKyhwdXQgJ2ZseW1ha2Utd2FybmluZyAnZmx5bWFrZS1iaXRtYXAgKGFs aXN0LWdldCAnd2FybmluZyBmbHltYWtlLWZyaW5nZS1pbmRpY2F0b3JzLWJpdG1hcCkpCisocHV0 ICdmbHltYWtlLXdhcm5pbmcgJ2ZseW1ha2UtbWFyZ2luLXN0cmluZyAoYWxpc3QtZ2V0ICdlcnJv ciBmbHltYWtlLW1hcmdpbi1pbmRpY2F0b3JzLXN0cmluZykpCiAocHV0ICdmbHltYWtlLXdhcm5p bmcgJ3NldmVyaXR5ICh3YXJuaW5nLW51bWVyaWMtbGV2ZWwgOndhcm5pbmcpKQogKHB1dCAnZmx5 bWFrZS13YXJuaW5nICdtb2RlLWxpbmUtZmFjZSAnZmx5bWFrZS13YXJuaW5nLWVjaG8pCiAocHV0 ICdmbHltYWtlLXdhcm5pbmcgJ2VjaG8tZmFjZSAnZmx5bWFrZS13YXJuaW5nLWVjaG8pCkBAIC02 NDUsNyArNjY0LDggQEAgTm9kZSBgKEZseW1ha2UpRmx5bWFrZSBlcnJvciB0eXBlcyciCiAocHV0 ICdmbHltYWtlLXdhcm5pbmcgJ2ZseW1ha2UtdHlwZS1uYW1lICJ3YXJuaW5nIikKIAogKHB1dCAn Zmx5bWFrZS1ub3RlICdmYWNlICdmbHltYWtlLW5vdGUpCi0ocHV0ICdmbHltYWtlLW5vdGUgJ2Zs eW1ha2UtYml0bWFwICdmbHltYWtlLW5vdGUtYml0bWFwKQorKHB1dCAnZmx5bWFrZS1ub3RlICdm bHltYWtlLWJpdG1hcCAoYWxpc3QtZ2V0ICdub3RlIGZseW1ha2UtZnJpbmdlLWluZGljYXRvcnMt Yml0bWFwKSkKKyhwdXQgJ2ZseW1ha2Utbm90ZSAnZmx5bWFrZS1tYXJnaW4tc3RyaW5nIChhbGlz dC1nZXQgJ2Vycm9yIGZseW1ha2UtbWFyZ2luLWluZGljYXRvcnMtc3RyaW5nKSkKIChwdXQgJ2Zs eW1ha2Utbm90ZSAnc2V2ZXJpdHkgKHdhcm5pbmctbnVtZXJpYy1sZXZlbCA6ZGVidWcpKQogKHB1 dCAnZmx5bWFrZS1ub3RlICdtb2RlLWxpbmUtZmFjZSAnZmx5bWFrZS1ub3RlLWVjaG8pCiAocHV0 ICdmbHltYWtlLW5vdGUgJ2VjaG8tZmFjZSAnZmx5bWFrZS1ub3RlLWVjaG8pCkBAIC02ODIsMTkg KzcwMiwzMiBAQCBhc3NvY2lhdGVkIGBmbHltYWtlLWNhdGVnb3J5JyByZXR1cm4gREVGQVVMVC4i CiAgIChmbHltYWtlLS1sb29rdXAtdHlwZS1wcm9wZXJ0eSB0eXBlICdzZXZlcml0eQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdhcm5pbmctbnVtZXJpYy1sZXZlbCA6ZXJyb3Ip KSkKIAotKGRlZnVuIGZseW1ha2UtLWZyaW5nZS1vdmVybGF5LXNwZWMgKGJpdG1hcCAmb3B0aW9u YWwgcmVjdXJzZWQpCi0gIChpZiAoYW5kIChzeW1ib2xwIGJpdG1hcCkKLSAgICAgICAgICAgKGJv dW5kcCBiaXRtYXApCi0gICAgICAgICAgIChub3QgcmVjdXJzZWQpKQotICAgICAgKGZseW1ha2Ut LWZyaW5nZS1vdmVybGF5LXNwZWMKLSAgICAgICAoc3ltYm9sLXZhbHVlIGJpdG1hcCkgdCkKLSAg ICAoYW5kIGZseW1ha2UtZnJpbmdlLWluZGljYXRvci1wb3NpdGlvbgotICAgICAgICAgYml0bWFw Ci0gICAgICAgICAocHJvcGVydGl6ZSAiISIgJ2Rpc3BsYXkKLSAgICAgICAgICAgICAgICAgICAg IChjb25zIGZseW1ha2UtZnJpbmdlLWluZGljYXRvci1wb3NpdGlvbgotICAgICAgICAgICAgICAg ICAgICAgICAgICAgKGlmIChsaXN0cCBiaXRtYXApCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgYml0bWFwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0IGJpdG1hcCkp KSkpKSkKKyhkZWZ1biBmbHltYWtlLS1mcmluZ2Utb3ZlcmxheS1zcGVjIChpbmRpY2F0b3IpCisg ICJSZXR1cm4gSU5ESUNBVE9SIGFzIHByb3BlcnRpemVkIHN0cmluZyB0byB1c2UgaW4gZXJyb3Ig aW5kaWNhdG9ycy4iCisgIChsZXQqICgodmFsdWUgKGlmIChzeW1ib2xwIGluZGljYXRvcikKKyAg ICAgICAgICAgICAgICAgICAgKHN5bWJvbC12YWx1ZSBpbmRpY2F0b3IpCisgICAgICAgICAgICAg ICAgICBpbmRpY2F0b3IpKQorICAgICAgICAgKGluZGljYXRvci1jYXIgKGlmIChsaXN0cCB2YWx1 ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIHZhbHVlKQorICAgICAgICAgICAg ICAgICAgICAgICAgICB2YWx1ZSkpCisgICAgICAgICAoaW5kaWNhdG9yLWNkciAoaWYgKGxpc3Rw IHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZHIgdmFsdWUpKSkpCisgICAg KGNvbmQKKyAgICAgKChzeW1ib2xwIGluZGljYXRvci1jYXIpCisgICAgICAocHJvcGVydGl6ZSAi ISIgJ2Rpc3BsYXkKKyAgICAgICAgICAgICAgICAgIChjb25zIGZseW1ha2UtZnJpbmdlLWluZGlj YXRvci1wb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChsaXN0cCB2YWx1ZSkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAg ICAgICAobGlzdCB2YWx1ZSkpKSkpCisgICAgICgoc3RyaW5ncCBpbmRpY2F0b3ItY2FyKQorICAg ICAgKHByb3BlcnRpemUgIiEiCisgICAgICAgICAgICAgICAgICAnZGlzcGxheQorICAgICAgICAg ICAgICAgICAgYCgobWFyZ2luICxmbHltYWtlLW1hcmdpbi1pbmRpY2F0b3ItcG9zaXRpb24pCisg ICAgICAgICAgICAgICAgICAgICwocHJvcGVydGl6ZQorICAgICAgICAgICAgICAgICAgICAgIGlu ZGljYXRvci1jYXIKKyAgICAgICAgICAgICAgICAgICAgICAnZmFjZQorICAgICAgICAgICAgICAg ICAgICAgIGAoOmluaGVyaXQgKCxpbmRpY2F0b3ItY2RyCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZGVmYXVsdCkpKSkpKSkpKQogCiAoZGVmdW4gZmx5bWFrZS0tZXF1YWwtZGlh Z25vc3RpYy1wIChhIGIpCiAgICJUZWxsIGlmIEEgYW5kIEIgYXJlIGVxdWl2YWxlbnQgYGZseW1h a2UtLWRpYWcnIG9iamVjdHMuIgpAQCAtODQzLDcgKzg3NiwxMCBAQCBSZXR1cm4gbmlsIG9yIHRo ZSBvdmVybGF5IGNyZWF0ZWQuIgogICAgICAgICAoZmx5bWFrZS0tZnJpbmdlLW92ZXJsYXktc3Bl YwogICAgICAgICAgKGZseW1ha2UtLWxvb2t1cC10eXBlLXByb3BlcnR5CiAgICAgICAgICAgdHlw ZQotICAgICAgICAgICdmbHltYWtlLWJpdG1hcAorICAgICAgICAgIChjb25kICgoZXEgZmx5bWFr ZS1pbmRpY2F0b3ItdHlwZSAnZnJpbmdlcykKKyAgICAgICAgICAgICAgICAgJ2ZseW1ha2UtYml0 bWFwKQorICAgICAgICAgICAgICAgICgoZXEgZmx5bWFrZS1pbmRpY2F0b3ItdHlwZSAnbWFyZ2lu cykKKyAgICAgICAgICAgICAgICAgJ2ZseW1ha2UtbWFyZ2luLXN0cmluZykpCiAgICAgICAgICAg KGFsaXN0LWdldCAnYml0bWFwIChhbGlzdC1nZXQgdHlwZSA7IGJhY2t3YXJkIGNvbXBhdAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZseW1ha2UtZGlhZ25vc3RpYy10 eXBlcy1hbGlzdCkpKSkpCiAgICAgICA7OyAoZGVmYXVsdC1tYXliZSAnYWZ0ZXItc3RyaW5nCi0t IAoyLjQ0LjAud2luZG93cy4xCgo= --00000000000012b451061379e67b--