From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2.migadu.com ([2001:41d0:700:3204::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms8.migadu.com with LMTPS id CMa3AWlanGWWowAAkFu2QA (envelope-from ) for ; Mon, 08 Jan 2024 21:26:17 +0100 Received: from aspmx1.migadu.com ([2001:41d0:403:4876::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2.migadu.com with LMTPS id 0AzQNGhanGVg2QAAe85BDQ (envelope-from ) for ; Mon, 08 Jan 2024 21:26:17 +0100 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=posteo.net header.s=2017 header.b=GTlm2YFz; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org"; dmarc=pass (policy=none) header.from=posteo.net ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1704745576; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post:dkim-signature; bh=nYaJ6oVOo+Xgn2J276mUk2yaAyRkLt7gZp29rIDg49s=; b=e5+JVfqNiy2j0p5EKFbkZxwwIzQXxFIRE/r/rmFeRQhO5aCHIIUofzZrskF6xxrEJlNM0l Dhm52ILBQNRpAsNAq7R0YrsfGJjseAdKxnYAA+64y0a2gJj6oAEWAtYpeobUbsqsV7JYLD b/aZGP247D4799J107U2mxVAQUOqVk5FTbQgMXFZ7s1trEZE4bqgp1VWCDFX3sVQjS1YBj orNiVro+iPhbbfCvGFRLLaqzhal7lYAbIMnlWkQRkzjJShEuXyPD5Kl0Ww24yRkpBoD77g IjJfkbcnUH/txwg7OTwykL+AENOQmclcghGpyHHOSi9UqJ4j7vUWlPO98L3roQ== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1704745576; a=rsa-sha256; cv=none; b=G/7JG+XRBOTVtfc3/ybbfc/REIveQew3cJ+vkr7hZFsOq486HXUFntqyGS8UlM7d/AMpDK LY2CGXa8r0hy+tFwai8F6f3yxFh7r/y0TfnpyUojc6yiVcrsr3fxAXxNqHsmvT0+opsjSc h6t/9GXI6sZSm1ynKL6fW4jehzG5B5SnTbjuFcGkh42X6ladKEv0CDYa7kkQx8J0C4oFVl 0DexfbqKU+wLiPYoaiS7KTVGCLSoqa3F3t5+IgFjNTGfdnZGINgkOopCPJ0qNdKNZ5UAU/ 92HV8u6hG58+hLZXmzj/lCFE/jfvk0UfiboOn8DBRDHzqCHX/It5D6fBlbRp9A== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=posteo.net header.s=2017 header.b=GTlm2YFz; spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org"; dmarc=pass (policy=none) header.from=posteo.net 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 882F575D1E for ; Mon, 8 Jan 2024 21:26:16 +0100 (CET) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rMwBf-0002Fe-T2; Mon, 08 Jan 2024 15:25:31 -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 1rMwBb-0002FH-DS for emacs-orgmode@gnu.org; Mon, 08 Jan 2024 15:25:28 -0500 Received: from mout02.posteo.de ([185.67.36.66]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rMwBL-0001Yj-GI for emacs-orgmode@gnu.org; Mon, 08 Jan 2024 15:25:26 -0500 Received: from submission (posteo.de [185.67.36.169]) by mout02.posteo.de (Postfix) with ESMTPS id 0409E240103 for ; Mon, 8 Jan 2024 21:25:07 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017; t=1704745508; bh=v5BSmf583yA19hkRg3p688oqJPFmt2X9x/LauWEzM0Y=; h=MIME-Version:Date:From:To:Cc:Subject:Message-ID:From; b=GTlm2YFzsT5m+fMdEMSAYLtzpI6P00moGblOhGXoFHJJ6ZB69Uhe0GUmKaHKL2jbk VYSgRdf+VAE/7MjZ0IhvWL0yRBvbWGJ30gag4Y08zmTcDTpwoCTYB1wAMc2CgKQV7n MlmOoXkWX168wX1dXutgtOkwBM5aaOpXDc0pccfxxIP7PuQPEXKQO/ONYoqoRpf//k grT2VZWsJUKbOaBjD4+XIecsLG2jVgVRIsNY+nj0INdqvPGNcFLIX9Xl52bSWWF8sR 2JhA1OYtqb1pkDA/BILxgkBqOl4QKMG215lFDl0MvvclSOK/coxWGTY/q/JuYKoSLo m4uPDfJ6w3Tjw== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4T85CR2Wcrz6tsB; Mon, 8 Jan 2024 21:25:07 +0100 (CET) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_d068ed98b055816f8480f6af197c48c0" Date: Mon, 08 Jan 2024 20:25:07 +0000 From: gerard.vermeulen@posteo.net To: Ihor Radchenko Cc: Emacs orgmode Subject: Re: [PATCH] org-babel-demarcate-block: split using element API In-Reply-To: <878r50yqmo.fsf@localhost> References: <7e41f9b6e9026a404e256f33371e974c@posteo.net> <87zfxq78ff.fsf@localhost> <87zfxo3taa.fsf@localhost> <87v88a78qd.fsf@localhost> <7f23ea966f0f0aad3fad29b0b96864f3@posteo.net> <87y1d55fc6.fsf@localhost> <37fdcc4bfcf734c2e5ec439d40b4f7d8@posteo.net> <878r50yqmo.fsf@localhost> Message-ID: <442006329cfba666710c989aece5191a@posteo.net> Received-SPF: pass client-ip=185.67.36.66; envelope-from=gerard.vermeulen@posteo.net; helo=mout02.posteo.de X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 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, RCVD_IN_DNSWL_MED=-2.3, 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-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: emacs-orgmode-bounces+larch=yhetil.org@gnu.org X-Migadu-Flow: FLOW_IN X-Migadu-Country: US X-Migadu-Queue-Id: 882F575D1E X-Migadu-Scanner: mx10.migadu.com X-Migadu-Spam-Score: -10.01 X-Spam-Score: -10.01 X-TUID: VxVy4Zoohsf/ --=_d068ed98b055816f8480f6af197c48c0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed On 08.01.2024 13:08, Ihor Radchenko wrote: > gerard.vermeulen@posteo.net writes: > Attached you'll find a new version of my patch addressing all your issues. This mail ends with two other ideas in the context of this patch. [...] > I've tested your patch and found two problems: > > 1. #+name: lines are duplicated, while they should not Of course. Sometimes I delete lines by a slip of the fingers. Thanks. > 2. Your patch does not create space between the src blocks, unlike what > we have on main. > I think that you need to (1) create a single blank lines between > blocks (set :post-blank property to 1); (2) keep the number blank > lines after the last block the same as in the initial block (copy > the > :post-blank property and assign it to the last inserted src block). > > For C-u argument, do not do anything special - just keep the > original > :post-blank as is. It is the closest to what we have on main. > The previous version of the patch had + (insert (if arg (concat stars "\n") "")) and now it has + (insert (if arg (concat stars "\n") "\n")) I prefer this over setting the :post-blank property because it is simpler. (main concats something like .... (if (arg stars "") "\n" ...). [...] > >> Agreed, this is wrong. A partial explanation is that I attached too >> much value to the doc-string of `org-babel-get-src-block-info' >> telling "Return nil if point is not on a source block. Otherwise," >> which >> is for me in contradiction with documentation (string and start >> comment) in `org-babel-demarcate-block'. > > `org-babel-get-src-block-info' docstring were not wrong. You just > missed > the Org mode's convention that blank lines after src blocks or other > syntax elements belong to these elements. > > That said, we may clarify the `org-babel-get-src-block-info' docstring > to highlight this fact and avoid future confusion. > I changed the docstring as you suggested below. > >> Now demarcating with point below a source block works again and >> checking this is part of the ERT test. > > The ERT test does not check removing #+caption from the original block. > Also, as I said above, we should remove #+name. > The ERT test now checks that #+caption and #+name are removed from the original code. > [...] > > Note that indentation of src blocks has been refactored recently on > main. It should be more reliable now. If not, please report any issues. > I will pay attention. > >> -;; Copyright (C) 2009-2024 Free Software Foundation, Inc. >> +;; Copyright (C) 2009-2023 Free Software Foundation, Inc. > > This is a spurious change :) > Reverted: it shows that I started editing in 2023 and that I am no good at git :) > >> -Return nil if point is not on a source block. Otherwise, return >> -a list with the following pattern: >> +Return nil if point is not on a source block or not within blank >> +lines after a source block. Otherwise, return a list with the >> +following pattern: > > I'd rather say: Return nil if point is not on a source block (blank > lines after a source block are considered a part of that source block). > > It would be more accurate. > Done. > >> + (let* ((copy (org-element-copy (org-element-at-point))) >> + (before (org-element-begin copy)) >> + (beyond (org-element-end copy)) >> + (parts (sort (if (org-region-active-p) >> + (list body-beg (mark) (point) >> body-end) >> + (list body-beg (point) body-end)) >> + #'<))) >> + ;; Prevent #+caption:, #+header:, and #+begin_src lines in >> block. > > This comment is out of place. Also, we do preserve #+header and > #+begin_src lines, don't we? > Maybe I should have written: + ;; Prevent #+caption:, #+header:, and #+begin_src lines in *body*. It prevents that when splitting with point at the # of #+caption a block like #+caption: caption #+name: name #+begin_src emacs-lisp ;; elisp code ... #+end_src the first block ends up with #+caption: caption #+name: name #+begin_src emacs-lisp ,#+caption: caption ,#+name: name ,#+begin_src emacs-lisp ;; elisp code ... #+end_src This is not easy to capture in a 1-2 line comment. Anyhow, I have removed the comment and I have replaced check below it with + (set-mark (point)) ;; To simplify the next (unless ...): + (unless (and (>= (point) body-beg) (<= (mark) body-end)) + (user-error "Select within the source block body to split it")) which also protects against having point in body and mark on or below #+end_src I think it covers everything that can be checked in the "splitting" branch. I think also that the "wrapping" branch can be better protected against similar region selection "user errors". I will come back on improving the "wrapping" branch shortly. > > And we need to remove #+name lines. > Done. > >> + (unless (and (>= (point) body-beg)) >> + (user-error "move point within the source block body to >> split it")) > > Please start error message from capital letter. It is Elisp convention > (see `user-error' docstring). > Thanks, done, see above. > >> + (setq parts (mapcar (lambda (p) (buffer-substring (car p) >> (cdr p))) >> + (seq-mapn #'cons parts (cdr parts)))) >> + (delete-region before beyond) >> + (deactivate-mark) > > AFAIK, `deactivate-mark' should be unnecessary here. To indicate that > region should be deactivated after finishing a command, we simply set > `deactivate-mark' _variable_ to t. See the docstring. Done I have two other ideas in the context of this patch: * Improving the "wrapping" branch 1. It must be easy (possible for me) to get the org-element-copy of the preceding code block and use it to insert a new block with the same headers and switches as the preceding block. 2. In that case it is easy to raise a user-error when mark is before body_end of the preceding block. I think that with this improvement the user interface of the "wrapping" branch is closer to that of the "splitting" branch. That leaves only the "wrapping" branch open for "user errors" in case info is nil (no preceding code block). What do you think? * Adding a user option for properties to set to nil in org-element-copy. This may be overkill, but something like: #+begin_src emacs-lisp :results nil :tangle no (defcustom org-babel-demarcate-block-delete '(:caption :name) "List of things to delete from blocks below the upper block when splitting blocks by demarcation. Possible things are `:caption' to delete \"#+CAPTION:\" keywords, `:header' to delete \"#+HEADER:\" keywords, `:name' to delete \"#+NAME:\" keywords, and `switches' to delete e.g. \"-i +n 10\" from the \"#+BEGIN_SRC\" line." :group 'org-babel :package-version '(Org . "9.7") :type '(set :tag "Things to delete when splitting blocks by demarcation" (const :caption) (const :header) (const :name) (const :switches)) :initialize #'custom-initialize-default :set (lambda (sym val) (set-default sym val))) #+end_src and changing 3 lines in my version of `org-babel-demarcate-block' allows a user to get close to the behavior of main if he does: (setopt org-babel-demarcate-block-delete '(:caption :header :name :switches) I think that it is more important to improve the "wrapping" branch than to add the user option. Regards -- Gerard --=_d068ed98b055816f8480f6af197c48c0 Content-Transfer-Encoding: base64 Content-Type: application/octet-stream; name=0001-org-babel-demarcate-block-split-using-element-API.patch Content-Disposition: attachment; filename=0001-org-babel-demarcate-block-split-using-element-API.patch; size=14326 RnJvbSBmY2Y1ODMzNzc0YTE5MjQ3MzEwNmQxOTgyNWEyNzMzOTU0Yzc4MzJkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBHZXJhcmQgVmVybWV1bGVuIDxnZXJhcmQudmVybWV1bGVuQHBv c3Rlby5uZXQ+CkRhdGU6IFN1biwgNyBKYW4gMjAyNCAwOToxODozNiArMDEwMApTdWJqZWN0OiBb UEFUQ0hdIG9yZy1iYWJlbC1kZW1hcmNhdGUtYmxvY2s6IHNwbGl0IHVzaW5nIGVsZW1lbnQgQVBJ CgoqIGxpc3Avb2ItYmFiZWwuZWwgKG9yZy1iYWJlbC1kZW1hcmNhdGUtYmxvY2spOiBNb2RpZnkg YSBjb3B5Cm9mIChvcmctZWxlbWVudC1hdC1wb2ludCkgdG8gcmVwbGFjZSB0aGUgb2xkIHNvdXJj ZSBibG9jayB3aXRoIDIgb3IgMwpuZXcgbW9kaWZpZWQgY29waWVzIGJ5IG1lYW5zIG9mIGBvcmct ZWxlbWVudC1pbnRlcnByZXQtZGF0YScuICBUaGUgMXN0CnNvdXJjZSBibG9jayBjb250YWlucyB0 aGUgdGV4dCBmcm9tIHRoZSBib2R5IG9mIHRoZSBvbGQgYmxvY2sgYmVmb3JlCnBvaW50IG9yIHJl Z2lvbiwgdGhlIDJuZCBibG9jayBjb250YWlucyB0aGUgYm9keSB0ZXh0IGFmdGVyIHBvaW50IG9y CmJvZHkgdGV4dCB3aXRoaW4gcmVnaW9uLCBhbmQgaW4gY2FzZSBvZiByZWdpb24sIHRoZSAzcmQg YmxvY2sgY29udGFpbnMKdGhlIHRleHQgYWZ0ZXIgcmVnaW9uLiAgVGhlIGNhcHRpb24gYW5kIHRo ZSBuYW1lIGFyZSBkZWxldGVkIGZyb20gdGhlCjEgb3IgMiBibG9ja3MgYmVsb3cgdGhlIHVwcGVy IHNvdXJjZSBibG9jay4gIEluZGVudCBhbGwgYmxvY2tzCmltbWVkaWF0ZWx5IGFmdGVyIGluc2Vy dGlvbi4gIFRyeWluZyB0byBzcGxpdCB3aGVuIHBvaW50IGlzIGFib3ZlIHRoZQpib2R5IG9mIHRo ZSBvbGQgc291cmNlIGJsb2NrIHJhaXNlcyBhbiB1c2VyLWVycm9yLgoqIGxpc3Avb2ItYmFiZWwg KG9yZy1nZXQtc3JjLWJsb2NrLWluZm8pOiBhZGQgdGhlICJ3aXRoaW4gYmxhbmsgbGluZXMKYWZ0 ZXIgYSBzb3VyY2UgYmxvY2siIGNvbmRpdGlvbiB0byB0aGUgZG9jLXN0cmluZyB0byBtYXRjaCBp dCB3aXRoIHRoZQpkb2Mtc3RyaW5nIG9mIGFuZCBhIGNvbW1lbnQgaW4gYG9yZy1iYWJlbC1kZW1h cmNhdGUtYmxvY2snLgoqIHRlc3RpbmcvbGlzcC90ZXN0LW9iLmVsICh0ZXN0LW9iL2RlbWFyY2F0 ZS1ibG9jayk6IE5ldyB0ZXN0LiAgSXQKY2hlY2tzIHRlc3QgY2FzZXMgdGhhdCBicm9rZSBlYXJs aWVyIHZlcnNpb25zIG9mIHRoaXMgcGF0Y2guCi0tLQogbGlzcC9vYi1jb3JlLmVsICAgICAgICAg fCAgNjEgKysrKysrKystLS0tLS0tCiB0ZXN0aW5nL2xpc3AvdGVzdC1vYi5lbCB8IDE2OCArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAyIGZpbGVzIGNoYW5nZWQsIDIw MSBpbnNlcnRpb25zKCspLCAyOCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9saXNwL29iLWNv cmUuZWwgYi9saXNwL29iLWNvcmUuZWwKaW5kZXggMWRlM2FmNmFkLi5kMDE2MjAyNDMgMTAwNjQ0 Ci0tLSBhL2xpc3Avb2ItY29yZS5lbAorKysgYi9saXNwL29iLWNvcmUuZWwKQEAgLTczLDYgKzcz LDcgQEAKIChkZWNsYXJlLWZ1bmN0aW9uIG9yZy1lbGVtZW50LXBhcmVudCAib3JnLWVsZW1lbnQt YXN0IiAobm9kZSkpCiAoZGVjbGFyZS1mdW5jdGlvbiBvcmctZWxlbWVudC10eXBlICJvcmctZWxl bWVudC1hc3QiIChub2RlICZvcHRpb25hbCBhbm9ueW1vdXMpKQogKGRlY2xhcmUtZnVuY3Rpb24g b3JnLWVsZW1lbnQtdHlwZS1wICJvcmctZWxlbWVudC1hc3QiIChub2RlICZvcHRpb25hbCB0eXBl cykpCisoZGVjbGFyZS1mdW5jdGlvbiBvcmctZWxlbWVudC1pbnRlcnByZXQtZGF0YSAib3JnLWVs ZW1lbnQiIChkYXRhKSkKIChkZWNsYXJlLWZ1bmN0aW9uIG9yZy1lbnRyeS1nZXQgIm9yZyIgKHBv bSBwcm9wZXJ0eSAmb3B0aW9uYWwgaW5oZXJpdCBsaXRlcmFsLW5pbCkpCiAoZGVjbGFyZS1mdW5j dGlvbiBvcmctZXNjYXBlLWNvZGUtaW4tcmVnaW9uICJvcmctc3JjIiAoYmVnIGVuZCkpCiAoZGVj bGFyZS1mdW5jdGlvbiBvcmctZm9yd2FyZC1oZWFkaW5nLXNhbWUtbGV2ZWwgIm9yZyIgKGFyZyAm b3B0aW9uYWwgaW52aXNpYmxlLW9rKSkKQEAgLTcwMCw4ICs3MDEsOSBAQCBCeSBkZWZhdWx0LCBj b25zaWRlciB0aGUgYmxvY2sgYXQgcG9pbnQuICBIb3dldmVyLCB3aGVuIG9wdGlvbmFsCiBhcmd1 bWVudCBEQVRVTSBpcyBwcm92aWRlZCwgZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIHRoYXQgcGFy c2VkCiBvYmplY3QgaW5zdGVhZC4KIAotUmV0dXJuIG5pbCBpZiBwb2ludCBpcyBub3Qgb24gYSBz b3VyY2UgYmxvY2suICBPdGhlcndpc2UsIHJldHVybgotYSBsaXN0IHdpdGggdGhlIGZvbGxvd2lu ZyBwYXR0ZXJuOgorUmV0dXJuIG5pbCBpZiBwb2ludCBpcyBub3Qgb24gYSBzb3VyY2UgYmxvY2sg KGJsYW5rIGxpbmVzIGFmdGVyIGEKK3NvdXJjZSBibG9jayBhcmUgY29uc2lkZXJlZCBhIHBhcnQg b2YgdGhhdCBzb3VyY2UgYmxvY2spLgorT3RoZXJ3aXNlLCByZXR1cm4gYSBsaXN0IHdpdGggdGhl IGZvbGxvd2luZyBwYXR0ZXJuOgogCiAgIChsYW5ndWFnZSBib2R5IGFyZ3VtZW50cyBzd2l0Y2hl cyBuYW1lIHN0YXJ0IGNvZGVyZWYpIgogICAobGV0KiAoKGRhdHVtIChvciBkYXR1bSAob3JnLWVs ZW1lbnQtY29udGV4dCkpKQpAQCAtMjA1MSw3ICsyMDUzLDcgQEAgV2l0aCBvcHRpb25hbCBwcmVm aXggYXJndW1lbnQgQVJHLCBqdW1wIGJhY2t3YXJkIEFSRyBtYW55IHNvdXJjZSBibG9ja3MuIgog ICAgICAgKGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5nIDUpKSkpKQogCiAoZGVmdW4gb3JnLWJh YmVsLWRlbWFyY2F0ZS1ibG9jayAoJm9wdGlvbmFsIGFyZykKLSAgIldyYXAgb3Igc3BsaXQgdGhl IGNvZGUgaW4gdGhlIHJlZ2lvbiBvciBvbiB0aGUgcG9pbnQuCisgICJXcmFwIG9yIHNwbGl0IHRo ZSBjb2RlIGluIGFuIGFjdGl2ZSByZWdpb24gb3IgYXQgcG9pbnQuCiAKIFdpdGggcHJlZml4IGFy Z3VtZW50IEFSRywgYWxzbyBjcmVhdGUgYSBuZXcgaGVhZGluZyBhdCBwb2ludC4KIApAQCAtMjA2 MSw0MSArMjA2Myw0NCBAQCBpcyBjcmVhdGVkLiAgSW4gYm90aCBjYXNlcyBpZiB0aGUgcmVnaW9u IGlzIGRlbWFyY2F0ZWQgYW5kIGlmIHRoZQogcmVnaW9uIGlzIG5vdCBhY3RpdmUgdGhlbiB0aGUg cG9pbnQgaXMgZGVtYXJjYXRlZC4KIAogV2hlbiBjYWxsZWQgd2l0aGluIGJsYW5rIGxpbmVzIGFm dGVyIGEgY29kZSBibG9jaywgY3JlYXRlIGEgbmV3IGNvZGUKLWJsb2NrIG9mIHRoZSBzYW1lIGxh bmd1YWdlIHdpdGggdGhlIHByZXZpb3VzLiIKK2Jsb2NrIG9mIHRoZSBzYW1lIGxhbmd1YWdlIGFz IHRoZSBwcmV2aW91cy4iCiAgIChpbnRlcmFjdGl2ZSAiUCIpCiAgIChsZXQqICgoaW5mbyAob3Jn LWJhYmVsLWdldC1zcmMtYmxvY2staW5mbyAnbm8tZXZhbCkpCiAJIChzdGFydCAob3JnLWJhYmVs LXdoZXJlLWlzLXNyYy1ibG9jay1oZWFkKSkKICAgICAgICAgIDs7IGBzdGFydCcgd2lsbCBiZSBu aWwgd2hlbiB3aXRoaW4gc3BhY2UgbGluZXMgYWZ0ZXIgc3JjIGJsb2NrLgogCSAoYmxvY2sgKGFu ZCBzdGFydCAobWF0Y2gtc3RyaW5nIDApKSkKLQkgKGhlYWRlcnMgKGFuZCBzdGFydCAobWF0Y2gt c3RyaW5nIDQpKSkKKyAgICAgICAgIChib2R5LWJlZyAoYW5kIHN0YXJ0IChtYXRjaC1iZWdpbm5p bmcgNSkpKQorICAgICAgICAgKGJvZHktZW5kIChhbmQgc3RhcnQgKG1hdGNoLWVuZCA1KSkpCiAJ IChzdGFycyAoY29uY2F0IChtYWtlLXN0cmluZyAob3IgKG9yZy1jdXJyZW50LWxldmVsKSAxKSA/ KikgIiAiKSkKIAkgKHVwcGVyLWNhc2UtcCAoYW5kIGJsb2NrCiAJCQkgICAgKGxldCAoY2FzZS1m b2xkLXNlYXJjaCkKIAkJCSAgICAgIChzdHJpbmctbWF0Y2gtcCAiI1xcK0JFR0lOX1NSQyIgYmxv Y2spKSkpKQogICAgIChpZiAoYW5kIGluZm8gc3RhcnQpIDs7IEF0IHNyYyBibG9jaywgYnV0IG5v dCB3aXRoaW4gYmxhbmsgbGluZXMgYWZ0ZXIgaXQuCi0gICAgICAgIChtYXBjCi0gICAgICAgICAo bGFtYmRhIChwbGFjZSkKLSAgICAgICAgICAgKHNhdmUtZXhjdXJzaW9uCi0gICAgICAgICAgICAg KGdvdG8tY2hhciBwbGFjZSkKLSAgICAgICAgICAgICAobGV0ICgobGFuZyAobnRoIDAgaW5mbykp Ci0gICAgICAgICAgICAgICAgICAgKGluZGVudCAobWFrZS1zdHJpbmcgKG9yZy1jdXJyZW50LXRl eHQtaW5kZW50YXRpb24pID9ccykpKQotCSAgICAgICAod2hlbiAoc3RyaW5nLW1hdGNoICJeW1s6 c3BhY2U6XV0qJCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1z dWJzdHJpbmcgKGxpbmUtYmVnaW5uaW5nLXBvc2l0aW9uKQotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGluZS1lbmQtcG9zaXRpb24pKSkKLSAg ICAgICAgICAgICAgICAgKGRlbGV0ZS1yZWdpb24gKGxpbmUtYmVnaW5uaW5nLXBvc2l0aW9uKSAo bGluZS1lbmQtcG9zaXRpb24pKSkKLSAgICAgICAgICAgICAgIChpbnNlcnQgKGNvbmNhdAotCQkg ICAgICAgIChpZiAobG9va2luZy1hdCAiXiIpICIiICJcbiIpCi0JCSAgICAgICAgaW5kZW50IChp ZiB1cHBlci1jYXNlLXAgIiMrRU5EX1NSQ1xuIiAiIytlbmRfc3JjXG4iKQotCQkgICAgICAgIChp ZiBhcmcgc3RhcnMgaW5kZW50KSAiXG4iCi0JCSAgICAgICAgaW5kZW50IChpZiB1cHBlci1jYXNl LXAgIiMrQkVHSU5fU1JDICIgIiMrYmVnaW5fc3JjICIpCi0JCSAgICAgICAgbGFuZwotCQkgICAg ICAgIChpZiAoPiAobGVuZ3RoIGhlYWRlcnMpIDEpCi0JCQkgICAgKGNvbmNhdCAiICIgaGVhZGVy cykgaGVhZGVycykKLQkJICAgICAgICAoaWYgKGxvb2tpbmctYXQgIltcblxyXSIpCi0JCQkgICAg IiIKLQkJCSAgKGNvbmNhdCAiXG4iIChtYWtlLXN0cmluZyAoY3VycmVudC1jb2x1bW4pID8gKSkp KSkpKQotCSAgIChtb3ZlLWVuZC1vZi1saW5lIDIpKQotICAgICAgICAgKHNvcnQgKGlmIChvcmct cmVnaW9uLWFjdGl2ZS1wKSAobGlzdCAobWFyaykgKHBvaW50KSkgKGxpc3QgKHBvaW50KSkpICMn PikpCisgICAgICAgIChsZXQqICgoY29weSAob3JnLWVsZW1lbnQtY29weSAob3JnLWVsZW1lbnQt YXQtcG9pbnQpKSkKKyAgICAgICAgICAgICAgIChiZWZvcmUgKG9yZy1lbGVtZW50LWJlZ2luIGNv cHkpKQorICAgICAgICAgICAgICAgKGJleW9uZCAob3JnLWVsZW1lbnQtZW5kIGNvcHkpKQorICAg ICAgICAgICAgICAgKHBhcnRzIChzb3J0IChpZiAob3JnLXJlZ2lvbi1hY3RpdmUtcCkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgYm9keS1iZWcgKG1hcmspIChwb2ludCkg Ym9keS1lbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCBib2R5LWJlZyAo cG9pbnQpIGJvZHktZW5kKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJzwpKSkKKyAg ICAgICAgICAoc2V0LW1hcmsgKHBvaW50KSkgOzsgVG8gc2ltcGxpZnkgdGhlIG5leHQgKHVubGVz cyAuLi4pOgorICAgICAgICAgICh1bmxlc3MgKGFuZCAoPj0gKHBvaW50KSBib2R5LWJlZykgKDw9 IChtYXJrKSBib2R5LWVuZCkpCisgICAgICAgICAgICAodXNlci1lcnJvciAiU2VsZWN0IHdpdGhp biB0aGUgc291cmNlIGJsb2NrIGJvZHkgdG8gc3BsaXQgaXQiKSkKKyAgICAgICAgICAoc2V0cSBw YXJ0cyAobWFwY2FyIChsYW1iZGEgKHApIChidWZmZXItc3Vic3RyaW5nIChjYXIgcCkgKGNkciBw KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VxLW1hcG4gIydjb25zIHBhcnRz IChjZHIgcGFydHMpKSkpCisgICAgICAgICAgKGRlbGV0ZS1yZWdpb24gYmVmb3JlIGJleW9uZCkK KyAgICAgICAgICA7OyBJbnNlcnQgdGhlIDFzdCBibG9jay4KKyAgICAgICAgICAob3JnLWVsZW1l bnQtcHV0LXByb3BlcnR5IGNvcHkgOnZhbHVlIChjYXIgcGFydHMpKQorICAgICAgICAgIChpbnNl cnQgKG9yZy1lbGVtZW50LWludGVycHJldC1kYXRhIGNvcHkpKQorICAgICAgICAgIChvcmctaW5k ZW50LWJsb2NrKQorICAgICAgICAgIChvcmctZWxlbWVudC1wdXQtcHJvcGVydHkgY29weSA6Y2Fw dGlvbiBuaWwpCisgICAgICAgICAgKG9yZy1lbGVtZW50LXB1dC1wcm9wZXJ0eSBjb3B5IDpuYW1l IG5pbCkKKyAgICAgICAgICA7OyBJbnNlcnQgdGhlIDJuZCBibG9jaywgYW5kIHRoZSAzcmQgYmxv Y2sgaWYgdGhlcmUgd2FzIGFuIGFjdGl2ZSByZWdpb24uCisgICAgICAgICAgKGRvbGlzdCAocGFy dCAoY2RyIHBhcnRzKSkKKyAgICAgICAgICAgIChvcmctZWxlbWVudC1wdXQtcHJvcGVydHkgY29w eSA6dmFsdWUgcGFydCkKKyAgICAgICAgICAgIChpbnNlcnQgKGlmIGFyZyAoY29uY2F0IHN0YXJz ICJcbiIpICJcbiIpKQorICAgICAgICAgICAgKGluc2VydCAob3JnLWVsZW1lbnQtaW50ZXJwcmV0 LWRhdGEgY29weSkpCisgICAgICAgICAgICAob3JnLWluZGVudC1ibG9jaykpKQogICAgICAgKGxl dCAoKHN0YXJ0IChwb2ludCkpCiAJICAgIChsYW5nIChvciAoY2FyIGluZm8pIDsgUmV1c2UgbGFu Z3VhZ2UgZnJvbSBwcmV2aW91cyBibG9jay4KICAgICAgICAgICAgICAgICAgICAgICAoY29tcGxl dGluZy1yZWFkCmRpZmYgLS1naXQgYS90ZXN0aW5nL2xpc3AvdGVzdC1vYi5lbCBiL3Rlc3Rpbmcv bGlzcC90ZXN0LW9iLmVsCmluZGV4IDQyYzc3Y2E1Ni4uY2NkYjliZjdhIDEwMDY0NAotLS0gYS90 ZXN0aW5nL2xpc3AvdGVzdC1vYi5lbAorKysgYi90ZXN0aW5nL2xpc3AvdGVzdC1vYi5lbApAQCAt MjYsNiArMjYsMTc0IEBACiAocmVxdWlyZSAnb3JnLXRhYmxlKQogKGV2YWwtYW5kLWNvbXBpbGUg KHJlcXVpcmUgJ2NsLWxpYikpCiAKKyhlcnQtZGVmdGVzdCB0ZXN0LW9iL2RlbWFyY2F0ZS1ibG9j ayAoKQorICAiVGVzdCBzcGxpdHRpbmcgYW5kIHdyYXBwaW5nIGJ5IGRlbWFyY2F0aW9uLiIKKyAg OzsgVGVzdCBzcGxpdHRpbmcgd2l0aCBkdXBsaWNhdGlvbiBvZiBsYW5ndWFnZSwgYm9keSwgc3dp dGNoZXMsIGFuZCBoZWFkZXJzLgorICAobGV0ICgoY2FwdGlvbiAiIytjYXB0aW9uOiBjYXB0aW9u LiIpCisgICAgICAgIChyZWdleHAgKHJ4ICIjK2NhcHRpb246IGNhcHRpb24uIikpKQorICAgIChv cmctdGVzdC13aXRoLXRlbXAtdGV4dCAoZm9ybWF0ICIKKyVzCisjK2hlYWRlcjogOnZhciBlZGdl PVwiYWxzbyBkdXBsaWNhdGVkXCIKKyMraGVhZGVyOiA6d3JhcCBcInNyYyBhbnktc3BhbmlzaCAt blwiCisjK25hbWU6IE5vYm9keQorIytiZWdpbl9zcmMgYW55LWVuZ2xpc2ggLWkgLW4gOnZhciBo ZXJlPVwiZHVwbGljYXRlZFwiIDp3cmFwIFwic3JjIGFueS1lbmdsaXNoIC1uXCIKKworYWJvdmUg c3BsaXQKKzxwb2ludD4KK2JlbG93IHNwbGl0CisKKyMrZW5kX3NyYworIiBjYXB0aW9uKQorICAg ICAgKGxldCAoKHdyYXAtdmFsICJzcmMgYW55LXNwYW5pc2ggLW4iKSBhYm92ZSBiZWxvdyBhdmFy cyBidmFycykKKyAgICAgICAgKG9yZy1iYWJlbC1kZW1hcmNhdGUtYmxvY2spCisgICAgICAgIChn b3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgIChvcmctYmFiZWwtbmV4dC1zcmMtYmxvY2sp IDs7IHVwcGVyIHNvdXJjZSBibG9jaworICAgICAgICAoc2V0cSBhYm92ZSAob3JnLWJhYmVsLWdl dC1zcmMtYmxvY2staW5mbykpCisgICAgICAgIChzZXRxIGF2YXJzIChvcmctYmFiZWwtLWdldC12 YXJzIChudGggMiBhYm92ZSkpKQorICAgICAgICAob3JnLWJhYmVsLW5leHQtc3JjLWJsb2NrKSA7 OyBsb3dlciBzb3VyY2UgYmxvY2sKKyAgICAgICAgKHNldHEgYmVsb3cgKG9yZy1iYWJlbC1nZXQt c3JjLWJsb2NrLWluZm8pKQorICAgICAgICAoc2V0cSBidmFycyAob3JnLWJhYmVsLS1nZXQtdmFy cyAobnRoIDIgYmVsb3cpKSkKKyAgICAgICAgOzsgZHVwbGljYXRlZCBtdWx0aS1saW5lIGhlYWRl ciBhcmd1bWVudHM6CisgICAgICAgIChzaG91bGQgKHN0cmluZz0gImFsc28gZHVwbGljYXRlZCIg KGNkciAoYXNzcSAnZWRnZSBhdmFycykpKSkKKyAgICAgICAgKHNob3VsZCAoc3RyaW5nPSAiYWxz byBkdXBsaWNhdGVkIiAoY2RyIChhc3NxICdlZGdlIGJ2YXJzKSkpKQorICAgICAgICAoc2hvdWxk IChzdHJpbmc9IHdyYXAtdmFsIChjZHIgKGFzc3EgOndyYXAgKG50aCAyIGFib3ZlKSkpKSkKKyAg ICAgICAgKHNob3VsZCAoc3RyaW5nPSB3cmFwLXZhbCAoY2RyIChhc3NxIDp3cmFwIChudGggMiBi ZWxvdykpKSkpCisgICAgICAgIDs7IGR1cGxpY2F0ZWQgbGFuZ3VhZ2UsIG90aGVyIGhlYWRlciBh cmd1bWVudHMsIGFuZCBzd2l0Y2hlczoKKyAgICAgICAgKHNob3VsZCAoc3RyaW5nPSAiYW55LWVu Z2xpc2giIChudGggMCBhYm92ZSkpKQorICAgICAgICAoc2hvdWxkIChzdHJpbmc9ICJhbnktZW5n bGlzaCIgKG50aCAwIGJlbG93KSkpCisgICAgICAgIChzaG91bGQgKHN0cmluZz0gImFib3ZlIHNw bGl0IiAob3JnLXRyaW0gKG50aCAxIGFib3ZlKSkpKQorICAgICAgICAoc2hvdWxkIChzdHJpbmc9 ICJiZWxvdyBzcGxpdCIgKG9yZy10cmltIChudGggMSBiZWxvdykpKSkKKyAgICAgICAgKHNob3Vs ZCAoc3RyaW5nPSAiZHVwbGljYXRlZCIgKGNkciAoYXNzcSAnaGVyZSBhdmFycykpKSkKKyAgICAg ICAgKHNob3VsZCAoc3RyaW5nPSAiZHVwbGljYXRlZCIgKGNkciAoYXNzcSAnaGVyZSBidmFycykp KSkKKyAgICAgICAgKHNob3VsZCAoc3RyaW5nPSAiLWkgLW4iIChudGggMyBhYm92ZSkpKQorICAg ICAgICAoc2hvdWxkIChzdHJpbmc9ICItaSAtbiIgKG50aCAzIGJlbG93KSkpCisgICAgICAgIDs7 IG5vbi1kdXBsaWNhdGlvbiBvZiBuYW1lIGFuZCBjYXB0aW9uLCB3aGljaCBpcyBub3QgaW4gYWJv dmUvYmVsb3cuCisgICAgICAgIChzaG91bGQgKHN0cmluZz0gIk5vYm9keSIgKG50aCA0IGFib3Zl KSkpCisgICAgICAgIChzaG91bGQtbm90IChzdHJpbmc9ICIiIChudGggNCBiZWxvdykpKQorICAg ICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgICAoc2hvdWxkIChyZS1zZWFyY2gt Zm9yd2FyZCByZWdleHApKQorICAgICAgICAoc2hvdWxkLW5vdCAocmUtc2VhcmNoLWZvcndhcmQg cmVnZXhwIG5pbCAnbm9lcnJvcikpKSkpCisgIDs7IFRlc3Qgd3JhcHBpbmcgcG9pbnQgaW4gYmxh bmsgbGluZXMgYmVsb3cgc291cmNlIGJsb2NrCisgIChvcmctdGVzdC13aXRoLXRlbXAtdGV4dCAi CisjK2JlZ2luX3NyYyBhbnktbGFuZ3VhZ2UgLWkgLW4gOnZhciBoZXJlPVwibm90IGR1cGxpY2F0 ZWRcIgordG8gdXBwZXIgYmxvY2sKKyMrZW5kX3NyYworPHBvaW50PgorIgorICAgIChsZXQgKGlu Zm8pCisgICAgICAob3JnLWJhYmVsLWRlbWFyY2F0ZS1ibG9jaykKKyAgICAgIChnb3RvLWNoYXIg KHBvaW50LW1pbikpCisgICAgICAob3JnLWJhYmVsLW5leHQtc3JjLWJsb2NrKQorICAgICAgKHNl dHEgaW5mbyAob3JnLWJhYmVsLWdldC1zcmMtYmxvY2staW5mbykpICA7OyB1cHBlciBzb3VyY2Ug YmxvY2sgaW5mbworICAgICAgKHNob3VsZCAoc3RyaW5nPSAiYW55LWxhbmd1YWdlIiAobnRoIDAg aW5mbykpKQorICAgICAgKHNob3VsZCAoc3RyaW5nPSAidG8gdXBwZXIgYmxvY2siIChvcmctdHJp bSAobnRoIDEgaW5mbykpKSkKKyAgICAgIChzaG91bGQgKHN0cmluZz0gIm5vdCBkdXBsaWNhdGVk IgorICAgICAgICAgICAgICAgICAgICAgICAoY2RyIChhc3NxICdoZXJlIChvcmctYmFiZWwtLWdl dC12YXJzIChudGggMiBpbmZvKSkpKSkpCisgICAgICAoc2hvdWxkIChzdHJpbmc9ICItaSAtbiIg KG50aCAzIGluZm8pKSkKKyAgICAgIChvcmctYmFiZWwtbmV4dC1zcmMtYmxvY2spCisgICAgICAo c2V0cSBpbmZvIChvcmctYmFiZWwtZ2V0LXNyYy1ibG9jay1pbmZvKSkgOzsgbG93ZXIgc291cmNl IGJsb2NrIGluZm8KKyAgICAgIChzaG91bGQgKHN0cmluZz0gImFueS1sYW5ndWFnZSIgKG50aCAw IGluZm8pKSkKKyAgICAgIChzaG91bGQgKHN0cmluZz0gIiIgKG9yZy10cmltIChudGggMSBpbmZv KSkpKQorICAgICAgKHNob3VsZC1ub3QgKG9yZy1iYWJlbC0tZ2V0LXZhcnMgKG50aCAyIGluZm8p KSkKKyAgICAgIChzaG91bGQgKHN0cmluZz0gIiIgKG50aCAzIGluZm8pKSkpKQorICA7OyBUZXN0 IHdyYXBwaW5nIHJlZ2lvbiBpbiBibGFuayBsaW5lcyBiZWxvdyBzb3VyY2UgYmxvY2sKKyAgKGxl dCAoKHJlZ2lvbi10ZXh0ICJtYXJrIHRoaXMgbGluZSBhcyByZWdpb24iKSkKKyAgICAob3JnLXRl c3Qtd2l0aC10ZW1wLXRleHQgKGZvcm1hdCAiCisjK2JlZ2luX3NyYyBhbnktbGFuZ3VhZ2UgLWkg LW4gOnZhciBoZXJlPVwibm90IGR1cGxpY2F0ZWRcIgordG8gdXBwZXIgYmxvY2sKKyMrZW5kX3Ny YworCislcworIiByZWdpb24tdGV4dCkKKyAgICAgIChsZXQgKGluZm8pCisgICAgICAgIChnb3Rv LWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgIChyZS1zZWFyY2gtZm9yd2FyZCByZWdpb24tdGV4 dCkKKyAgICAgICAgKHNldC1tYXJrIChwb2ludCkpCisgICAgICAgIChwcmV2aW91cy1saW5lKSA7 OyBlbnN1cmUgdGhhdCBwb2ludCBpcyBvbiBhbiBlbXB0eSBsaW5lLgorICAgICAgICAob3JnLWJh YmVsLWRlbWFyY2F0ZS1ibG9jaykKKyAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAg ICAgICAgKG9yZy1iYWJlbC1uZXh0LXNyYy1ibG9jaykKKyAgICAgICAgKHNldHEgaW5mbyAob3Jn LWJhYmVsLWdldC1zcmMtYmxvY2staW5mbykpICA7OyB1cHBlciBzb3VyY2UgYmxvY2sgaW5mbwor ICAgICAgICAoc2hvdWxkIChzdHJpbmc9ICJhbnktbGFuZ3VhZ2UiIChudGggMCBpbmZvKSkpCisg ICAgICAgIChzaG91bGQgKHN0cmluZz0gInRvIHVwcGVyIGJsb2NrIiAob3JnLXRyaW0gKG50aCAx IGluZm8pKSkpCisgICAgICAgIChzaG91bGQgKHN0cmluZz0gIm5vdCBkdXBsaWNhdGVkIgorICAg ICAgICAgICAgICAgICAgICAgICAgIChjZHIgKGFzc3EgJ2hlcmUgKG9yZy1iYWJlbC0tZ2V0LXZh cnMgKG50aCAyIGluZm8pKSkpKSkKKyAgICAgICAgKHNob3VsZCAoc3RyaW5nPSAiLWkgLW4iIChu dGggMyBpbmZvKSkpCisgICAgICAgIChvcmctYmFiZWwtbmV4dC1zcmMtYmxvY2spCisgICAgICAg IChzZXRxIGluZm8gKG9yZy1iYWJlbC1nZXQtc3JjLWJsb2NrLWluZm8pKSA7OyBsb3dlciBzb3Vy Y2UgYmxvY2sgaW5mbworICAgICAgICAoc2hvdWxkIChzdHJpbmc9ICJhbnktbGFuZ3VhZ2UiIChu dGggMCBpbmZvKSkpCisgICAgICAgIChzaG91bGQgKHN0cmluZz0gcmVnaW9uLXRleHQgKG9yZy10 cmltIChudGggMSBpbmZvKSkpKQorICAgICAgICAoc2hvdWxkLW5vdCAob3JnLWJhYmVsLS1nZXQt dmFycyAobnRoIDIgaW5mbykpKQorICAgICAgICAoc2hvdWxkIChzdHJpbmc9ICIiIChudGggMyBp bmZvKSkpKSkpCisgIDs7IFRlc3QgcHJlZml4IGFyZ3VtZW50IHBvaW50IHNwbGl0dGluZy4KKyAg KGxldCAoKG9yZy1hZGFwdC1pbmRlbnRhdGlvbiB0KQorICAgICAgICAob2stY29sIDExKQorICAg ICAgICAoc3RhcnMgIl5cXCpcXCpcXCpcXCpcXCpcXCpcXCpcXCpcXCpcXCoiKSkKKyAgICAob3Jn LXRlc3Qtd2l0aC10ZW1wLXRleHQgIgorKioqKioqKioqKiAxMCBzdGFycyB3aXRoIHBvaW50IGJl dHdlZW4gdHdvIGxpbmVzCisgICAgICAgICAgICMrYmVnaW5fc3JjIGVtYWNzLWxpc3AKKyAgICAg ICAgICAgOzsgdG8gdXBwZXIgYmxvY2sKKyAgICAgICAgICAgPHBvaW50PgorICAgICAgICAgICA7 OyB0byBsb3dlciBibG9jaworICAgICAgICAgICAjK2VuZF9zcmMKKyIKKyAgICAgIChvcmctYmFi ZWwtZGVtYXJjYXRlLWJsb2NrICdhLXByZWZpeC1hcmcpCisgICAgICAoZ290by1jaGFyIChwb2lu dC1taW4pKQorICAgICAgKGRvbGlzdCAocmVnZXhwIGAoLHN0YXJzCisgICAgICAgICAgICAgICAg ICAgICAgICAiI1xcK2JlZyIgIjs7IHRvIHVwcGVyIGJsb2NrIiAiI1xcK2VuZCIKKyAgICAgICAg ICAgICAgICAgICAgICAgICxzdGFycworICAgICAgICAgICAgICAgICAgICAgICAgIiNcXCtiZWci ICI7OyB0byBsb3dlciBibG9jayIgIiNcXCtlbmQiKSkKKyAgICAgICAgKHNob3VsZCAocmUtc2Vh cmNoLWZvcndhcmQgcmVnZXhwKSkKKyAgICAgICAgKGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5n IDApKQorICAgICAgICAoaWYgKG9yIChzdHJpbmc9IHJlZ2V4cCBzdGFycykKKyAgICAgICAgICAg ICAgICAoc3RyaW5nLXByZWZpeC1wICI7OyIgcmVnZXhwKSkKKyAgICAgICAgICAgIChzaG91bGQg KD0gMCAoY3VycmVudC1jb2x1bW4pKSkKKyAgICAgICAgICAoc2hvdWxkICg9IG9rLWNvbCAoY3Vy cmVudC1jb2x1bW4pKSkpKSkpCisgIDs7IFRlc3QgcHJlZml4IGFyZ3VtZW50IHJlZ2lvbiBzcGxp dHRpbmcuCisgIChsZXQgKChvcmctYWRhcHQtaW5kZW50YXRpb24gdCkKKyAgICAgICAgKG9rLWNv bCAxMSkKKyAgICAgICAgKHN0YXJzICJeXFwqXFwqXFwqXFwqXFwqXFwqXFwqXFwqXFwqXFwqIikK KyAgICAgICAgKHBhcnRzICcoInRvIHVwcGVyIGJsb2NrIiAibWFyayB0aGlzIGxpbmUgYXMgcmVn aW9uIiAidG8gbG93ZXIgYmxvY2siKSkpCisgICAgKG9yZy10ZXN0LXdpdGgtdGVtcC10ZXh0IChm b3JtYXQgIgorKioqKioqKioqKiAxMCBzdGFycyB3aXRoIHJlZ2lvbiBiZXR3ZWVuIHR3byBsaW5l cworICAgICAgICAgICAjK2hlYWRlcjogOnZhciBiPVwiYWxzbyBzZWVuXCIKKyAgICAgICAgICAg IytiZWdpbl9zcmMgYW55LWxhbmd1YWdlIC1pIC1uIDp2YXIgYT1cInNlZW5cIgorICAgICAgICAg ICAlcworICAgICAgICAgICAlcworICAgICAgICAgICAlcworICAgICAgICAgICAjK2VuZF9zcmMK KyIgKG50aCAwIHBhcnRzKSAobnRoIDEgcGFydHMpIChudGggMiBwYXJ0cykpCisgICAgICAobGV0 ICgobiAwKSBpbmZvIHZhcnMpCisgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAg ICAgIChyZS1zZWFyY2gtZm9yd2FyZCAobnRoIDEgcGFydHMpKQorICAgICAgICAoc2V0LW1hcmsg KHBvaW50KSkKKyAgICAgICAgOzsgbWFyayB0aGUgcmVnaW9uIGJ5IG1vdmluZyBwb2ludCBtYWtl cyB0aGUgdGVzdCBwYXNzLgorICAgICAgICAoYmVnaW5uaW5nLW9mLWxpbmUpIDs7IChnb3RvLWNo YXIgKG1hdGNoLWJlZ2lubmluZyAwKSkgZmFpbHMuCisgICAgICAgIChvcmctYmFiZWwtZGVtYXJj YXRlLWJsb2NrICdhLXByZWZpeC1hcmd1bWVudCkKKyAgICAgICAgKGdvdG8tY2hhciAocG9pbnQt bWluKSkKKyAgICAgICAgKHdoaWxlICg8IG4gKGxlbmd0aCBwYXJ0cykpCisgICAgICAgICAgKG9y Zy1iYWJlbC1uZXh0LXNyYy1ibG9jaykKKyAgICAgICAgICAoc2V0cSBpbmZvIChvcmctYmFiZWwt Z2V0LXNyYy1ibG9jay1pbmZvKSkKKyAgICAgICAgICAoc2V0cSB2YXJzIChvcmctYmFiZWwtLWdl dC12YXJzIChudGggMiBpbmZvKSkpCisgICAgICAgICAgKHNob3VsZCAoc3RyaW5nPSAiYW55LWxh bmd1YWdlIiAobnRoIDAgaW5mbykpKQorICAgICAgICAgIChzaG91bGQgKHN0cmluZz0gKG50aCBu IHBhcnRzKSAob3JnLXRyaW0gKG50aCAxIGluZm8pKSkpCisgICAgICAgICAgKHNob3VsZCAoc3Ry aW5nPSAic2VlbiIgKGNkciAoYXNzcSAnYSB2YXJzKSkpKQorICAgICAgICAgIChzaG91bGQgKHN0 cmluZz0gImFsc28gc2VlbiIgKGNkciAoYXNzcSAnYiB2YXJzKSkpKQorICAgICAgICAgIChzaG91 bGQgKHN0cmluZz0gIi1pIC1uIiAobnRoIDMgaW5mbykpKQorICAgICAgICAgIChjbC1pbmNmIG4p KSkKKyAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAoZG9saXN0IChyZWdleHAg YCgsc3RhcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICIjXFwrYmVnIiAsKG50aCAwIHBhcnRz KSAiI1xcK2VuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICxzdGFycworICAgICAgICAgICAg ICAgICAgICAgICAgIiNcXCtiZWciICwobnRoIDEgcGFydHMpICIjXFwrZW5kIgorICAgICAgICAg ICAgICAgICAgICAgICAgLHN0YXJzCisgICAgICAgICAgICAgICAgICAgICAgICAiI1xcK2JlZyIg LChudGggMiBwYXJ0cykgIiNcXCtlbmQiKSkKKyAgICAgICAgKHNob3VsZCAocmUtc2VhcmNoLWZv cndhcmQgcmVnZXhwKSkKKyAgICAgICAgKGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5nIDApKQor ICAgICAgICAoaWYgKHN0cmluZz0gcmVnZXhwIHN0YXJzKQorICAgICAgICAgICAgKHNob3VsZCAo PSAwIChjdXJyZW50LWNvbHVtbikpKQorICAgICAgICAgIChzaG91bGQgKD0gb2stY29sIChjdXJy ZW50LWNvbHVtbikpKSkpKSkpCisKIChlcnQtZGVmdGVzdCB0ZXN0LW9iL2luZGVudGVkLWNhY2hl ZC1vcmctYnJhY2tldC1saW5rICgpCiAgICJXaGVuIHRoZSByZXN1bHQgb2YgYSBzb3VyY2UgYmxv Y2sgaXMgYSBjYWNoZWQgaW5kZW50ZWQgbGluayBpdAogc2hvdWxkIHN0aWxsIHJldHVybiB0aGUg bGluay4iCi0tIAoyLjQyLjAKCg== --=_d068ed98b055816f8480f6af197c48c0--