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 WN7EDn/ymmUYAAAAkFu2QA (envelope-from ) for ; Sun, 07 Jan 2024 19:50:39 +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 aGgRCn/ymmWVSAEAe85BDQ (envelope-from ) for ; Sun, 07 Jan 2024 19:50:39 +0100 X-Envelope-To: larch@yhetil.org Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=posteo.net header.s=2017 header.b=jPwKWlcP; 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=1704653439; 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=CJiNH0BvjHt4hoXgUJV1lcozAO7PuAD1HPYZ00PWP+U=; b=Hmo12/DaB+EkmeCrOKS1IdkieoyMPBmv6VJSWfJcY8vqznd5tCcxExKapDIT6eW/RIKBXu q9Pq1vCSQ6H1h29kFZdIGEZWJ9WZd+hK2dkQvyACRGluOTsTyvQyeZjS0CU1cBKSmJUeQ1 BRJLEGZaKxFJ1EJboTo4ZL0ZEnOfPAbWU2NflDDC9mAioecPE383rBoCXxJyumw0y9KZ3F GD6Qlr2kz77skEpO+7doBCzEZG/S62pegWPBQHzpQZmncdlx0TjdfuDTBaH2atRdUX2ZyZ 8gi3xp0HEgTFDAbIUOM/qyAp/CDV3i7+K7ugJ/xKLq4BMAuLBDdb7shCEN+1LA== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1704653439; a=rsa-sha256; cv=none; b=AUe5lIMqTWY4c1Af7uq7WAYaq7QMk+KQhiIJ4q6un4H7uugjoppgGckr8wwXX/kMFSN2uZ OtoAcqfBtAiHmUO5Timb03luYV6Tc2TspY9BsrbqsTl1xUHg1UMrap8QVgu0Fkgztq1neP ovrFXIl9V8GeMqMj2bClVTwKeF/HjpyKMppSjSSLDqAGAikCz0bowCcg9LfZrvkH9J7k2Q 5iLupjkDpoUtYQHCU/ZpgIqTvJWTmpBtm+BYkhm+dyl8mMRpvc4fgcwet+31NqrjWMDkp8 lZxVIfHQIRSYKrGoUOIYm93HH0nc7kxlyyW5dpwiDGZ633q52tCX2oWya/BSfw== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=pass header.d=posteo.net header.s=2017 header.b=jPwKWlcP; 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 192F66BDEA for ; Sun, 7 Jan 2024 19:50:38 +0100 (CET) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rMYDX-0000N7-50; Sun, 07 Jan 2024 13:49:51 -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 1rMYDV-0000Mu-9Z for emacs-orgmode@gnu.org; Sun, 07 Jan 2024 13:49:49 -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 1rMYDS-0002AR-AB for emacs-orgmode@gnu.org; Sun, 07 Jan 2024 13:49:49 -0500 Received: from submission (posteo.de [185.67.36.169]) by mout02.posteo.de (Postfix) with ESMTPS id 09CCB240101 for ; Sun, 7 Jan 2024 19:49:42 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.net; s=2017; t=1704653383; bh=mY/W1SzVDE0P8mG89v9UJLWqmwdb3LlFVN0SegYRCeU=; h=MIME-Version:Date:From:To:Cc:Subject:Message-ID:From; b=jPwKWlcPXZ5JaAYRJU6NTHv7/822ZhQQ3sa7xkhKaa8fymW3uJe7lZAAXMatcJ4Mk sWJt00Ryzt1RdLydoTOeuOa6EIFDvrdPf/bkGeJKy29HqKU+o6fZc2hfgeZlyffj2y EIvc3de060nyqFQH3C8iUH07mq8dA0YTPqUDdyNxv7AYlc1BxMFZw3oe5cWEUHPVvf rn1i3o7nLYBiQDzZm4FTRTr4WRDzmTL9aEadQjrzlAF2mZ/2NpPVvF8q38g4E8vW0g 3B6yDfpmrptXeJs3DS3Hi5UvnCHeY918s9qKLKNCUA8O0f/hYBYaFfpxaQoH8/8SxH 7O4ei9/1ySlAA== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4T7R7p2hh9z6twd; Sun, 7 Jan 2024 19:49:42 +0100 (CET) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_3b741f8298f07df77e8d4d2c4239aed7" Date: Sun, 07 Jan 2024 18:49:42 +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: <87y1d55fc6.fsf@localhost> References: <7e41f9b6e9026a404e256f33371e974c@posteo.net> <87zfxq78ff.fsf@localhost> <87zfxo3taa.fsf@localhost> <87v88a78qd.fsf@localhost> <7f23ea966f0f0aad3fad29b0b96864f3@posteo.net> <87y1d55fc6.fsf@localhost> Message-ID: <37fdcc4bfcf734c2e5ec439d40b4f7d8@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: -53 X-Spam_score: -5.4 X-Spam_bar: ----- X-Spam_report: (-5.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, RCVD_IN_MSPIKE_H5=-1, RCVD_IN_MSPIKE_WL=-0.01, 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: 192F66BDEA X-Migadu-Scanner: mx10.migadu.com X-Migadu-Spam-Score: -10.01 X-Spam-Score: -10.01 X-TUID: 0U6ahr095ntz --=_3b741f8298f07df77e8d4d2c4239aed7 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed On 04.01.2024 15:43, Ihor Radchenko wrote: > gerard.vermeulen@posteo.net writes: > Attached you'll find a new version of the patch that addresses your comments. I have modified the ERT test so that it checks most of your examples showing where the older versions of the patch failed. The test is now called `test-ob/demarcate-block' It also allows to split in three blocks when a region is selected (main does this contrary to my older patches). Below, I compare region splitting using main or my patch. White-space differs between main and the patch and one might argue that the result produced by the patch is more consistent. Maybe, the indenting of the input code block is somewhat contrived, because all code is moved completely to the left after calling `org-indent-block'. * main does this #+begin_src emacs-lisp :results silent (setopt org-adapt-indentation t org-src-preserve-indentation t org-edit-src-content-indentation 2) #+end_src ******** before C-u org-babel-demarcate-block region splitting #+begin_src emacs-lisp (defun above () (message "above")) (defun region () (message "mark region with leading and trailing blank lines")) (defun below () (message "below")) #+end_src ******** after C-u org-babel-demarcate-block region splitting #+begin_src emacs-lisp (defun above () (message "above")) #+end_src ******** #+begin_src emacs-lisp (defun region () (message "mark region with leading and trailing blank lines")) #+end_src ******** #+begin_src emacs-lisp (defun below () (message "below")) #+end_src * end main does this * patch does this #+begin_src emacs-lisp :results silent (setopt org-adapt-indentation t org-src-preserve-indentation t org-edit-src-content-indentation 2) #+end_src ******** before C-u org-babel-demarcate-block region splitting #+begin_src emacs-lisp (defun above () (message "above")) (defun region () (message "mark region with leading and trailing blank lines")) (defun below () (message "below")) #+end_src ******** after C-u org-babel-demarcate-block region splitting #+begin_src emacs-lisp (defun above () (message "above")) #+end_src ******** #+begin_src emacs-lisp (defun region () (message "mark region with leading and trailing blank lines")) #+end_src ******** #+begin_src emacs-lisp (defun below () (message "below")) #+end_src * end patch does this > >> I have tried to clean up the code. I have also tried to get >> `body-beg' >> and >> `body-end' marking the text between the #+begin_src and #+end_src >> lines >> from the element API, but I failed and had to fall back to >> `org-babel-where-is-src-block-head'. But only for that. > > org-element API does not provide this information for now. Maybe it is > a > good opportunity to alter the parser, so that code boundaries are > provided... > >> (defun org-babel-demarcate-block (&optional arg) >> ... >> -When called within blank lines after a code block, create a new code >> -block of the same language with the previous." > > Is there any reason why you dropped this feature? > > When I try > > #+begin_src emacs-lisp > (+ 1 2) > #+end_src > > > M-x org-babel-demarcate-block throws an error with your patch. > It creates a new block with the same language before your patch. 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'. I have patched the doc-string of `org-babel-get-src-block-info' to add the "blank lines below condition". This patch reverts all changes that are due to my misunderstanding of what `org-babel-get-src-block-info' does. Now demarcating with point below a source block works again and checking this is part of the ERT test. > >> + (let ((copy (org-element-copy (org-element-at-point))) >> + (stars (concat (make-string (or (org-current-level) 1) ?*) " >> "))) >> + (if (eq 'src-block (car copy)) > > You can instead use `org-element-type-p' This is now back to the original (if (and info start) ;; At src block, but ... > >> + ;; Keep this branch in sync with >> test-ob/demarcate-block-split. >> + ;; _start is never nil, since there is a source block element >> at point. > > May you elaborate what you mean by "keep in sync"? "keep in sync" is a kind of reminder to myself, because I think that test-ob/demarcate-block-split was fragile wrt where point is after demarcation. The test is now called test-ob/demarcate-block and I tried to make it more robust. > >> + (let* ((_start (org-babel-where-is-src-block-head)) > > Are you using (org-babel-where-is-src-block-head) for side effect of > modifying the match data? If so, please do it outside let, with > appropriate comment. This was based on my misunderstanding of `org-babel-get-src-block-info' and has been removed. > >> + (if (not org-adapt-indentation) >> + ;; Move point to the left of the lower block line >> #+begin_src. >> + (org-previous-block 1) >> + ;; Adapt the indentation: upper block first and lower >> block second. >> + (org-previous-block 2) >> + (org-indent-block) >> + ;; Move point to the left of the lower block line >> #+begin_src. >> + (org-next-block 1) >> + (org-indent-block))) > > `org-indent-block' should honor `org-adapt-indentation'. You do not > need > to call it conditionally. Re-indenting unconditionally should be better > here. OK. I have always used `org-adapt-indentation' set to nil and I do not like the result of `org-indent-block' when it is non-nil (#+begin_src and #+end_src indented and the code pushed to the left), but I will have to get used to it. Tests using `org-adapt-indention' non-nil are part of `test-ob/demarcate-block'. > >> (let ((start (point)) >> - (lang (or (car info) ; Reuse language from previous block. >> - (completing-read >> - "Lang: " >> - (mapcar #'symbol-name >> - (delete-dups >> - (append (mapcar #'car org-babel-load-languages) >> - (mapcar (lambda (el) (intern (car el))) >> - org-src-lang-modes))))))) >> + ;; (org-babel-get-src-block-info 'no-eval) returns nil, >> + ;; since there is no source block at point. Therefore, >> this >> + ;; cannot be used to get the language of a neighbour >> block. > > Why nil? The condition was > > (and info start) ;; At src block, but not within blank lines after > it. > > So, this branch of the if used to be INFO - non-nil, and START nil -> > re-use the information. And if INFO were nil, query. > This was based on my misunderstanding of `org-babel-get-src-block-info' and has been reverted. > >> + ;; Deleted code indicated that this may have worked in >> the past. >> + ;; I have removed upper-case-p, since it could never be >> true here. > > The idea of UPPER-CASE-P is to keep user preference for keyword style > (upper case or lower case). There is no reason to remove this feature. > Although, since we are using `org-element-interpret-data', it might be > a > good idea to extend org-element parser to preserve the keyword case > information. This was based on my misunderstanding of `org-babel-get-src-block-info' and has been removed. Regards -- Gerard --=_3b741f8298f07df77e8d4d2c4239aed7 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=14140 RnJvbSAxOGVlODM3Nzk2MDM5ZDU3N2RmNWIzOGNjMDYyNGMzNjc3NWI1ODY3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBHZXJhcmQgVmVybWV1bGVuIDxnZXJhcmQudmVybWV1bGVuQHBv c3Rlby5uZXQ+CkRhdGU6IFN1biwgNyBKYW4gMjAyNCAwOToxODozNiArMDEwMApTdWJqZWN0OiBb UEFUQ0hdIG9yZy1iYWJlbC1kZW1hcmNhdGUtYmxvY2s6IHNwbGl0IHVzaW5nIGVsZW1lbnQgQVBJ CgoqIGxpc3Avb2ItYmFiZWwuZWwgKG9yZy1iYWJlbC1kZW1hcmNhdGUtYmxvY2spOiBNb2RpZnkg YSBjb3B5Cm9mIChvcmctZWxlbWVudC1hdC1wb2ludCkgdG8gcmVwbGFjZSB0aGUgb2xkIHNvdXJj ZSBibG9jayB3aXRoIDIgb3IgMwpuZXcgbW9kaWZpZWQgY29waWVzIGJ5IG1lYW5zIG9mIGBvcmct ZWxlbWVudC1pbnRlcnByZXQtZGF0YScuICBUaGUgMXN0CnNvdXJjZSBibG9jayBjb250YWlucyB0 aGUgdGV4dCBmcm9tIHRoZSBib2R5IG9mIHRoZSBvbGQgYmxvY2sgYmVmb3JlCnBvaW50IG9yIHJl Z2lvbiwgdGhlIDJuZCBibG9jayBjb250YWlucyB0aGUgYm9keSB0ZXh0IGFmdGVyIHBvaW50IG9y CmJvZHkgdGV4dCB3aXRoaW4gcmVnaW9uLCBhbmQgaW4gY2FzZSBvZiByZWdpb24sIHRoZSAzcmQg YmxvY2sgY29udGFpbnMKdGhlIHRleHQgYWZ0ZXIgcmVnaW9uLiAgVGhlIGNhcHRpb24gYW5kIHRo ZSBuYW1lIGFyZSBkZWxldGVkIGZyb20gdGhlCjEgb3IgMiBibG9ja3MgYmVsb3cgdGhlIHVwcGVy IHNvdXJjZSBibG9jay4gIEluZGVudCBhbGwgYmxvY2tzCmltbWVkaWF0ZWx5IGFmdGVyIGluc2Vy dGlvbi4gIFRyeWluZyB0byBzcGxpdCB3aGVuIHBvaW50IGlzIGFib3ZlIHRoZQpib2R5IG9mIHRo ZSBvbGQgc291cmNlIGJsb2NrIHJhaXNlcyBhbiB1c2VyLWVycm9yLgoqIGxpc3Avb2ItYmFiZWwg KG9yZy1nZXQtc3JjLWJsb2NrLWluZm8pOiBhZGQgdGhlICJ3aXRoaW4gYmxhbmsgbGluZXMKYWZ0 ZXIgYSBzb3VyY2UgYmxvY2siIGNvbmRpdGlvbiB0byB0aGUgZG9jLXN0cmluZyB0byBtYXRjaCBp dCB3aXRoIHRoZQpkb2Mtc3RyaW5nIG9mIGFuZCBhIGNvbW1lbnQgaW4gYG9yZy1iYWJlbC1kZW1h cmNhdGUtYmxvY2snLgoqIHRlc3RpbmcvbGlzcC90ZXN0LW9iLmVsICh0ZXN0LW9iL2RlbWFyY2F0 ZS1ibG9jayk6IE5ldyB0ZXN0LiAgSXQKY2hlY2tzIHRlc3QgY2FzZXMgdGhhdCBicm9rZSBlYXJs aWVyIHZlcnNpb25zIG9mIHRoaXMgcGF0Y2guCi0tLQogbGlzcC9vYi1jb3JlLmVsICAgICAgICAg fCAgNjMgKysrKysrKystLS0tLS0tLQogdGVzdGluZy9saXNwL3Rlc3Qtb2IuZWwgfCAxNjAgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCAx OTQgaW5zZXJ0aW9ucygrKSwgMjkgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGlzcC9vYi1j b3JlLmVsIGIvbGlzcC9vYi1jb3JlLmVsCmluZGV4IDFkZTNhZjZhZC4uM2QyYjAzNWIyIDEwMDY0 NAotLS0gYS9saXNwL29iLWNvcmUuZWwKKysrIGIvbGlzcC9vYi1jb3JlLmVsCkBAIC0xLDYgKzEs NiBAQAogOzs7IG9iLWNvcmUuZWwgLS0tIFdvcmtpbmcgd2l0aCBDb2RlIEJsb2NrcyAgICAgICAg ICAtKi0gbGV4aWNhbC1iaW5kaW5nOiB0OyAtKi0KIAotOzsgQ29weXJpZ2h0IChDKSAyMDA5LTIw MjQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCis7OyBDb3B5cmlnaHQgKEMpIDIwMDkt MjAyMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KIAogOzsgQXV0aG9yczogRXJpYyBT Y2h1bHRlCiA7OwlEYW4gRGF2aXNvbgpAQCAtNzMsNiArNzMsNyBAQAogKGRlY2xhcmUtZnVuY3Rp b24gb3JnLWVsZW1lbnQtcGFyZW50ICJvcmctZWxlbWVudC1hc3QiIChub2RlKSkKIChkZWNsYXJl LWZ1bmN0aW9uIG9yZy1lbGVtZW50LXR5cGUgIm9yZy1lbGVtZW50LWFzdCIgKG5vZGUgJm9wdGlv bmFsIGFub255bW91cykpCiAoZGVjbGFyZS1mdW5jdGlvbiBvcmctZWxlbWVudC10eXBlLXAgIm9y Zy1lbGVtZW50LWFzdCIgKG5vZGUgJm9wdGlvbmFsIHR5cGVzKSkKKyhkZWNsYXJlLWZ1bmN0aW9u IG9yZy1lbGVtZW50LWludGVycHJldC1kYXRhICJvcmctZWxlbWVudCIgKGRhdGEpKQogKGRlY2xh cmUtZnVuY3Rpb24gb3JnLWVudHJ5LWdldCAib3JnIiAocG9tIHByb3BlcnR5ICZvcHRpb25hbCBp bmhlcml0IGxpdGVyYWwtbmlsKSkKIChkZWNsYXJlLWZ1bmN0aW9uIG9yZy1lc2NhcGUtY29kZS1p bi1yZWdpb24gIm9yZy1zcmMiIChiZWcgZW5kKSkKIChkZWNsYXJlLWZ1bmN0aW9uIG9yZy1mb3J3 YXJkLWhlYWRpbmctc2FtZS1sZXZlbCAib3JnIiAoYXJnICZvcHRpb25hbCBpbnZpc2libGUtb2sp KQpAQCAtNzAwLDggKzcwMSw5IEBAIEJ5IGRlZmF1bHQsIGNvbnNpZGVyIHRoZSBibG9jayBhdCBw b2ludC4gIEhvd2V2ZXIsIHdoZW4gb3B0aW9uYWwKIGFyZ3VtZW50IERBVFVNIGlzIHByb3ZpZGVk LCBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gdGhhdCBwYXJzZWQKIG9iamVjdCBpbnN0ZWFkLgog Ci1SZXR1cm4gbmlsIGlmIHBvaW50IGlzIG5vdCBvbiBhIHNvdXJjZSBibG9jay4gIE90aGVyd2lz ZSwgcmV0dXJuCi1hIGxpc3Qgd2l0aCB0aGUgZm9sbG93aW5nIHBhdHRlcm46CitSZXR1cm4gbmls IGlmIHBvaW50IGlzIG5vdCBvbiBhIHNvdXJjZSBibG9jayBvciBub3Qgd2l0aGluIGJsYW5rCits aW5lcyBhZnRlciBhIHNvdXJjZSBibG9jay4gIE90aGVyd2lzZSwgcmV0dXJuIGEgbGlzdCB3aXRo IHRoZQorZm9sbG93aW5nIHBhdHRlcm46CiAKICAgKGxhbmd1YWdlIGJvZHkgYXJndW1lbnRzIHN3 aXRjaGVzIG5hbWUgc3RhcnQgY29kZXJlZikiCiAgIChsZXQqICgoZGF0dW0gKG9yIGRhdHVtIChv cmctZWxlbWVudC1jb250ZXh0KSkpCkBAIC0yMDUxLDcgKzIwNTMsNyBAQCBXaXRoIG9wdGlvbmFs IHByZWZpeCBhcmd1bWVudCBBUkcsIGp1bXAgYmFja3dhcmQgQVJHIG1hbnkgc291cmNlIGJsb2Nr cy4iCiAgICAgICAoZ290by1jaGFyIChtYXRjaC1iZWdpbm5pbmcgNSkpKSkpCiAKIChkZWZ1biBv cmctYmFiZWwtZGVtYXJjYXRlLWJsb2NrICgmb3B0aW9uYWwgYXJnKQotICAiV3JhcCBvciBzcGxp dCB0aGUgY29kZSBpbiB0aGUgcmVnaW9uIG9yIG9uIHRoZSBwb2ludC4KKyAgIldyYXAgb3Igc3Bs aXQgdGhlIGNvZGUgaW4gYW4gYWN0aXZlIHJlZ2lvbiBvciBhdCBwb2ludC4KIAogV2l0aCBwcmVm aXggYXJndW1lbnQgQVJHLCBhbHNvIGNyZWF0ZSBhIG5ldyBoZWFkaW5nIGF0IHBvaW50LgogCkBA IC0yMDYxLDQxICsyMDYzLDQ0IEBAIGlzIGNyZWF0ZWQuICBJbiBib3RoIGNhc2VzIGlmIHRoZSBy ZWdpb24gaXMgZGVtYXJjYXRlZCBhbmQgaWYgdGhlCiByZWdpb24gaXMgbm90IGFjdGl2ZSB0aGVu IHRoZSBwb2ludCBpcyBkZW1hcmNhdGVkLgogCiBXaGVuIGNhbGxlZCB3aXRoaW4gYmxhbmsgbGlu ZXMgYWZ0ZXIgYSBjb2RlIGJsb2NrLCBjcmVhdGUgYSBuZXcgY29kZQotYmxvY2sgb2YgdGhlIHNh bWUgbGFuZ3VhZ2Ugd2l0aCB0aGUgcHJldmlvdXMuIgorYmxvY2sgb2YgdGhlIHNhbWUgbGFuZ3Vh Z2UgYXMgdGhlIHByZXZpb3VzLiIKICAgKGludGVyYWN0aXZlICJQIikKICAgKGxldCogKChpbmZv IChvcmctYmFiZWwtZ2V0LXNyYy1ibG9jay1pbmZvICduby1ldmFsKSkKIAkgKHN0YXJ0IChvcmct YmFiZWwtd2hlcmUtaXMtc3JjLWJsb2NrLWhlYWQpKQogICAgICAgICAgOzsgYHN0YXJ0JyB3aWxs IGJlIG5pbCB3aGVuIHdpdGhpbiBzcGFjZSBsaW5lcyBhZnRlciBzcmMgYmxvY2suCiAJIChibG9j ayAoYW5kIHN0YXJ0IChtYXRjaC1zdHJpbmcgMCkpKQotCSAoaGVhZGVycyAoYW5kIHN0YXJ0ICht YXRjaC1zdHJpbmcgNCkpKQorICAgICAgICAgKGJvZHktYmVnIChhbmQgc3RhcnQgKG1hdGNoLWJl Z2lubmluZyA1KSkpCisgICAgICAgICAoYm9keS1lbmQgKGFuZCBzdGFydCAobWF0Y2gtZW5kIDUp KSkKIAkgKHN0YXJzIChjb25jYXQgKG1ha2Utc3RyaW5nIChvciAob3JnLWN1cnJlbnQtbGV2ZWwp IDEpID8qKSAiICIpKQogCSAodXBwZXItY2FzZS1wIChhbmQgYmxvY2sKIAkJCSAgICAobGV0IChj YXNlLWZvbGQtc2VhcmNoKQogCQkJICAgICAgKHN0cmluZy1tYXRjaC1wICIjXFwrQkVHSU5fU1JD IiBibG9jaykpKSkpCiAgICAgKGlmIChhbmQgaW5mbyBzdGFydCkgOzsgQXQgc3JjIGJsb2NrLCBi dXQgbm90IHdpdGhpbiBibGFuayBsaW5lcyBhZnRlciBpdC4KLSAgICAgICAgKG1hcGMKLSAgICAg ICAgIChsYW1iZGEgKHBsYWNlKQotICAgICAgICAgICAoc2F2ZS1leGN1cnNpb24KLSAgICAgICAg ICAgICAoZ290by1jaGFyIHBsYWNlKQotICAgICAgICAgICAgIChsZXQgKChsYW5nIChudGggMCBp bmZvKSkKLSAgICAgICAgICAgICAgICAgICAoaW5kZW50IChtYWtlLXN0cmluZyAob3JnLWN1cnJl bnQtdGV4dC1pbmRlbnRhdGlvbikgP1xzKSkpCi0JICAgICAgICh3aGVuIChzdHJpbmctbWF0Y2gg Il5bWzpzcGFjZTpdXSokIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVm ZmVyLXN1YnN0cmluZyAobGluZS1iZWdpbm5pbmctcG9zaXRpb24pCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5lLWVuZC1wb3NpdGlvbikp KQotICAgICAgICAgICAgICAgICAoZGVsZXRlLXJlZ2lvbiAobGluZS1iZWdpbm5pbmctcG9zaXRp b24pIChsaW5lLWVuZC1wb3NpdGlvbikpKQotICAgICAgICAgICAgICAgKGluc2VydCAoY29uY2F0 Ci0JCSAgICAgICAgKGlmIChsb29raW5nLWF0ICJeIikgIiIgIlxuIikKLQkJICAgICAgICBpbmRl bnQgKGlmIHVwcGVyLWNhc2UtcCAiIytFTkRfU1JDXG4iICIjK2VuZF9zcmNcbiIpCi0JCSAgICAg ICAgKGlmIGFyZyBzdGFycyBpbmRlbnQpICJcbiIKLQkJICAgICAgICBpbmRlbnQgKGlmIHVwcGVy LWNhc2UtcCAiIytCRUdJTl9TUkMgIiAiIytiZWdpbl9zcmMgIikKLQkJICAgICAgICBsYW5nCi0J CSAgICAgICAgKGlmICg+IChsZW5ndGggaGVhZGVycykgMSkKLQkJCSAgICAoY29uY2F0ICIgIiBo ZWFkZXJzKSBoZWFkZXJzKQotCQkgICAgICAgIChpZiAobG9va2luZy1hdCAiW1xuXHJdIikKLQkJ CSAgICAiIgotCQkJICAoY29uY2F0ICJcbiIgKG1ha2Utc3RyaW5nIChjdXJyZW50LWNvbHVtbikg PyApKSkpKSkpCi0JICAgKG1vdmUtZW5kLW9mLWxpbmUgMikpCi0gICAgICAgICAoc29ydCAoaWYg KG9yZy1yZWdpb24tYWN0aXZlLXApIChsaXN0IChtYXJrKSAocG9pbnQpKSAobGlzdCAocG9pbnQp KSkgIyc+KSkKKyAgICAgICAgKGxldCogKChjb3B5IChvcmctZWxlbWVudC1jb3B5IChvcmctZWxl bWVudC1hdC1wb2ludCkpKQorICAgICAgICAgICAgICAgKGJlZm9yZSAob3JnLWVsZW1lbnQtYmVn aW4gY29weSkpCisgICAgICAgICAgICAgICAoYmV5b25kIChvcmctZWxlbWVudC1lbmQgY29weSkp CisgICAgICAgICAgICAgICAocGFydHMgKHNvcnQgKGlmIChvcmctcmVnaW9uLWFjdGl2ZS1wKQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCBib2R5LWJlZyAobWFyaykgKHBv aW50KSBib2R5LWVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0IGJvZHkt YmVnIChwb2ludCkgYm9keS1lbmQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnPCkp KQorICAgICAgICAgIDs7IFByZXZlbnQgIytjYXB0aW9uOiwgIytoZWFkZXI6LCBhbmQgIytiZWdp bl9zcmMgbGluZXMgaW4gYmxvY2suCisgICAgICAgICAgKHVubGVzcyAoYW5kICg+PSAocG9pbnQp IGJvZHktYmVnKSkKKyAgICAgICAgICAgICh1c2VyLWVycm9yICJtb3ZlIHBvaW50IHdpdGhpbiB0 aGUgc291cmNlIGJsb2NrIGJvZHkgdG8gc3BsaXQgaXQiKSkKKyAgICAgICAgICAoc2V0cSBwYXJ0 cyAobWFwY2FyIChsYW1iZGEgKHApIChidWZmZXItc3Vic3RyaW5nIChjYXIgcCkgKGNkciBwKSkp CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VxLW1hcG4gIydjb25zIHBhcnRzIChj ZHIgcGFydHMpKSkpCisgICAgICAgICAgKGRlbGV0ZS1yZWdpb24gYmVmb3JlIGJleW9uZCkKKyAg ICAgICAgICAoZGVhY3RpdmF0ZS1tYXJrKQorICAgICAgICAgIDs7IEluc2VydCB0aGUgMXN0IGJs b2NrLgorICAgICAgICAgIChvcmctZWxlbWVudC1wdXQtcHJvcGVydHkgY29weSA6dmFsdWUgKGNh ciBwYXJ0cykpCisgICAgICAgICAgKGluc2VydCAob3JnLWVsZW1lbnQtaW50ZXJwcmV0LWRhdGEg Y29weSkpCisgICAgICAgICAgKG9yZy1pbmRlbnQtYmxvY2spCisgICAgICAgICAgKG9yZy1lbGVt ZW50LXB1dC1wcm9wZXJ0eSBjb3B5IDpjYXB0aW9uIG5pbCkKKyAgICAgICAgICA7OyBJbnNlcnQg dGhlIDJuZCBibG9jaywgYW5kIHRoZSAzcmQgYmxvY2sgaWYgdGhlcmUgd2FzIGFuIGFjdGl2ZSBy ZWdpb24uCisgICAgICAgICAgKGRvbGlzdCAocGFydCAoY2RyIHBhcnRzKSkKKyAgICAgICAgICAg IChvcmctZWxlbWVudC1wdXQtcHJvcGVydHkgY29weSA6dmFsdWUgcGFydCkKKyAgICAgICAgICAg IChpbnNlcnQgKGlmIGFyZyAoY29uY2F0IHN0YXJzICJcbiIpICIiKSkKKyAgICAgICAgICAgIChp bnNlcnQgKG9yZy1lbGVtZW50LWludGVycHJldC1kYXRhIGNvcHkpKQorICAgICAgICAgICAgKG9y Zy1pbmRlbnQtYmxvY2spKSkKICAgICAgIChsZXQgKChzdGFydCAocG9pbnQpKQogCSAgICAobGFu ZyAob3IgKGNhciBpbmZvKSA7IFJldXNlIGxhbmd1YWdlIGZyb20gcHJldmlvdXMgYmxvY2suCiAg ICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZXRpbmctcmVhZApkaWZmIC0tZ2l0IGEvdGVzdGlu Zy9saXNwL3Rlc3Qtb2IuZWwgYi90ZXN0aW5nL2xpc3AvdGVzdC1vYi5lbAppbmRleCA0MmM3N2Nh NTYuLmI2YTNkYmY3MyAxMDA2NDQKLS0tIGEvdGVzdGluZy9saXNwL3Rlc3Qtb2IuZWwKKysrIGIv dGVzdGluZy9saXNwL3Rlc3Qtb2IuZWwKQEAgLTI2LDYgKzI2LDE2NiBAQAogKHJlcXVpcmUgJ29y Zy10YWJsZSkKIChldmFsLWFuZC1jb21waWxlIChyZXF1aXJlICdjbC1saWIpKQogCisoZXJ0LWRl ZnRlc3QgdGVzdC1vYi9kZW1hcmNhdGUtYmxvY2sgKCkKKyAgIlRlc3Qgc3BsaXR0aW5nIGFuZCB3 cmFwcGluZyBieSBkZW1hcmNhdGlvbi4iCisgIDs7IFRlc3Qgc3BsaXR0aW5nIHdpdGggZHVwbGlj YXRpb24gb2YgbGFuZ3VhZ2UsIGJvZHksIHN3aXRjaGVzLCBhbmQgaGVhZGVycy4KKyAgKG9yZy10 ZXN0LXdpdGgtdGVtcC10ZXh0ICIKKyMraGVhZGVyOiA6dmFyIGVkZ2U9XCJhbHNvIGR1cGxpY2F0 ZWRcIgorIytoZWFkZXI6IDp3cmFwIFwic3JjIGFueS1zcGFuaXNoIC1uXCIKKyMrYmVnaW5fc3Jj IGFueS1lbmdsaXNoIC1pIC1uIDp2YXIgaGVyZT1cImR1cGxpY2F0ZWRcIiA6d3JhcCBcInNyYyBh bnktZW5nbGlzaCAtblwiCisKK2Fib3ZlIHNwbGl0Cis8cG9pbnQ+CitiZWxvdyBzcGxpdAorCisj K2VuZF9zcmMKKyIKKyAgICAobGV0ICgod3JhcC12YWwgInNyYyBhbnktc3BhbmlzaCAtbiIpIGFi b3ZlIGJlbG93IGF2YXJzIGJ2YXJzKQorICAgICAgKG9yZy1iYWJlbC1kZW1hcmNhdGUtYmxvY2sp CisgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgKG9yZy1iYWJlbC1uZXh0LXNy Yy1ibG9jaykgOzsgdXBwZXIgc291cmNlIGJsb2NrCisgICAgICAoc2V0cSBhYm92ZSAob3JnLWJh YmVsLWdldC1zcmMtYmxvY2staW5mbykpCisgICAgICAoc2V0cSBhdmFycyAob3JnLWJhYmVsLS1n ZXQtdmFycyAobnRoIDIgYWJvdmUpKSkKKyAgICAgIChvcmctYmFiZWwtbmV4dC1zcmMtYmxvY2sp IDs7IGxvd2VyIHNvdXJjZSBibG9jaworICAgICAgKHNldHEgYmVsb3cgKG9yZy1iYWJlbC1nZXQt c3JjLWJsb2NrLWluZm8pKQorICAgICAgKHNldHEgYnZhcnMgKG9yZy1iYWJlbC0tZ2V0LXZhcnMg KG50aCAyIGJlbG93KSkpCisgICAgICA7OyBkdXBsaWNhdGVkIG11bHRpLWxpbmUgaGVhZGVyIGFy Z3VtZW50czoKKyAgICAgIChzaG91bGQgKHN0cmluZz0gImFsc28gZHVwbGljYXRlZCIgKGNkciAo YXNzcSAnZWRnZSBhdmFycykpKSkKKyAgICAgIChzaG91bGQgKHN0cmluZz0gImFsc28gZHVwbGlj YXRlZCIgKGNkciAoYXNzcSAnZWRnZSBidmFycykpKSkKKyAgICAgIChzaG91bGQgKHN0cmluZz0g d3JhcC12YWwgKGNkciAoYXNzcSA6d3JhcCAobnRoIDIgYWJvdmUpKSkpKQorICAgICAgKHNob3Vs ZCAoc3RyaW5nPSB3cmFwLXZhbCAoY2RyIChhc3NxIDp3cmFwIChudGggMiBiZWxvdykpKSkpCisg ICAgICA7OyBkdXBsaWNhdGVkIGxhbmd1YWdlLCBvdGhlciBoZWFkZXIgYXJndW1lbnRzLCBhbmQg c3dpdGNoZXM6CisgICAgICAoc2hvdWxkIChzdHJpbmc9ICJhbnktZW5nbGlzaCIgKG50aCAwIGFi b3ZlKSkpCisgICAgICAoc2hvdWxkIChzdHJpbmc9ICJhbnktZW5nbGlzaCIgKG50aCAwIGJlbG93 KSkpCisgICAgICAoc2hvdWxkIChzdHJpbmc9ICJhYm92ZSBzcGxpdCIgKG9yZy10cmltIChudGgg MSBhYm92ZSkpKSkKKyAgICAgIChzaG91bGQgKHN0cmluZz0gImJlbG93IHNwbGl0IiAob3JnLXRy aW0gKG50aCAxIGJlbG93KSkpKQorICAgICAgKHNob3VsZCAoc3RyaW5nPSAiZHVwbGljYXRlZCIg KGNkciAoYXNzcSAnaGVyZSBhdmFycykpKSkKKyAgICAgIChzaG91bGQgKHN0cmluZz0gImR1cGxp Y2F0ZWQiIChjZHIgKGFzc3EgJ2hlcmUgYnZhcnMpKSkpCisgICAgICAoc2hvdWxkIChzdHJpbmc9 ICItaSAtbiIgKG50aCAzIGFib3ZlKSkpCisgICAgICAoc2hvdWxkIChzdHJpbmc9ICItaSAtbiIg KG50aCAzIGJlbG93KSkpKSkKKyAgOzsgVGVzdCB3cmFwcGluZyBwb2ludCBpbiBibGFuayBsaW5l cyBiZWxvdyBzb3VyY2UgYmxvY2sKKyAgKG9yZy10ZXN0LXdpdGgtdGVtcC10ZXh0ICIKKyMrYmVn aW5fc3JjIGFueS1sYW5ndWFnZSAtaSAtbiA6dmFyIGhlcmU9XCJub3QgZHVwbGljYXRlZFwiCit0 byB1cHBlciBibG9jaworIytlbmRfc3JjCis8cG9pbnQ+CisiCisgICAgKGxldCAoaW5mbykKKyAg ICAgIChvcmctYmFiZWwtZGVtYXJjYXRlLWJsb2NrKQorICAgICAgKGdvdG8tY2hhciAocG9pbnQt bWluKSkKKyAgICAgIChvcmctYmFiZWwtbmV4dC1zcmMtYmxvY2spCisgICAgICAoc2V0cSBpbmZv IChvcmctYmFiZWwtZ2V0LXNyYy1ibG9jay1pbmZvKSkgIDs7IHVwcGVyIHNvdXJjZSBibG9jayBp bmZvCisgICAgICAoc2hvdWxkIChzdHJpbmc9ICJhbnktbGFuZ3VhZ2UiIChudGggMCBpbmZvKSkp CisgICAgICAoc2hvdWxkIChzdHJpbmc9ICJ0byB1cHBlciBibG9jayIgKG9yZy10cmltIChudGgg MSBpbmZvKSkpKQorICAgICAgKHNob3VsZCAoc3RyaW5nPSAibm90IGR1cGxpY2F0ZWQiCisgICAg ICAgICAgICAgICAgICAgICAgIChjZHIgKGFzc3EgJ2hlcmUgKG9yZy1iYWJlbC0tZ2V0LXZhcnMg KG50aCAyIGluZm8pKSkpKSkKKyAgICAgIChzaG91bGQgKHN0cmluZz0gIi1pIC1uIiAobnRoIDMg aW5mbykpKQorICAgICAgKG9yZy1iYWJlbC1uZXh0LXNyYy1ibG9jaykKKyAgICAgIChzZXRxIGlu Zm8gKG9yZy1iYWJlbC1nZXQtc3JjLWJsb2NrLWluZm8pKSA7OyBsb3dlciBzb3VyY2UgYmxvY2sg aW5mbworICAgICAgKHNob3VsZCAoc3RyaW5nPSAiYW55LWxhbmd1YWdlIiAobnRoIDAgaW5mbykp KQorICAgICAgKHNob3VsZCAoc3RyaW5nPSAiIiAob3JnLXRyaW0gKG50aCAxIGluZm8pKSkpCisg ICAgICAoc2hvdWxkLW5vdCAob3JnLWJhYmVsLS1nZXQtdmFycyAobnRoIDIgaW5mbykpKQorICAg ICAgKHNob3VsZCAoc3RyaW5nPSAiIiAobnRoIDMgaW5mbykpKSkpCisgIDs7IFRlc3Qgd3JhcHBp bmcgcmVnaW9uIGluIGJsYW5rIGxpbmVzIGJlbG93IHNvdXJjZSBibG9jaworICAobGV0ICgocmVn aW9uLXRleHQgIm1hcmsgdGhpcyBsaW5lIGFzIHJlZ2lvbiIpKQorICAgIChvcmctdGVzdC13aXRo LXRlbXAtdGV4dCAoZm9ybWF0ICIKKyMrYmVnaW5fc3JjIGFueS1sYW5ndWFnZSAtaSAtbiA6dmFy IGhlcmU9XCJub3QgZHVwbGljYXRlZFwiCit0byB1cHBlciBibG9jaworIytlbmRfc3JjCisKKyVz CisiIHJlZ2lvbi10ZXh0KQorICAgICAgKGxldCAoaW5mbykKKyAgICAgICAgKGdvdG8tY2hhciAo cG9pbnQtbWluKSkKKyAgICAgICAgKHJlLXNlYXJjaC1mb3J3YXJkIHJlZ2lvbi10ZXh0KQorICAg ICAgICAoc2V0LW1hcmsgKHBvaW50KSkKKyAgICAgICAgKHByZXZpb3VzLWxpbmUpIDs7IGVuc3Vy ZSB0aGF0IHBvaW50IGlzIG9uIGFuIGVtcHR5IGxpbmUuCisgICAgICAgIChvcmctYmFiZWwtZGVt YXJjYXRlLWJsb2NrKQorICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgICAo b3JnLWJhYmVsLW5leHQtc3JjLWJsb2NrKQorICAgICAgICAoc2V0cSBpbmZvIChvcmctYmFiZWwt Z2V0LXNyYy1ibG9jay1pbmZvKSkgIDs7IHVwcGVyIHNvdXJjZSBibG9jayBpbmZvCisgICAgICAg IChzaG91bGQgKHN0cmluZz0gImFueS1sYW5ndWFnZSIgKG50aCAwIGluZm8pKSkKKyAgICAgICAg KHNob3VsZCAoc3RyaW5nPSAidG8gdXBwZXIgYmxvY2siIChvcmctdHJpbSAobnRoIDEgaW5mbykp KSkKKyAgICAgICAgKHNob3VsZCAoc3RyaW5nPSAibm90IGR1cGxpY2F0ZWQiCisgICAgICAgICAg ICAgICAgICAgICAgICAgKGNkciAoYXNzcSAnaGVyZSAob3JnLWJhYmVsLS1nZXQtdmFycyAobnRo IDIgaW5mbykpKSkpKQorICAgICAgICAoc2hvdWxkIChzdHJpbmc9ICItaSAtbiIgKG50aCAzIGlu Zm8pKSkKKyAgICAgICAgKG9yZy1iYWJlbC1uZXh0LXNyYy1ibG9jaykKKyAgICAgICAgKHNldHEg aW5mbyAob3JnLWJhYmVsLWdldC1zcmMtYmxvY2staW5mbykpIDs7IGxvd2VyIHNvdXJjZSBibG9j ayBpbmZvCisgICAgICAgIChzaG91bGQgKHN0cmluZz0gImFueS1sYW5ndWFnZSIgKG50aCAwIGlu Zm8pKSkKKyAgICAgICAgKHNob3VsZCAoc3RyaW5nPSByZWdpb24tdGV4dCAob3JnLXRyaW0gKG50 aCAxIGluZm8pKSkpCisgICAgICAgIChzaG91bGQtbm90IChvcmctYmFiZWwtLWdldC12YXJzIChu dGggMiBpbmZvKSkpCisgICAgICAgIChzaG91bGQgKHN0cmluZz0gIiIgKG50aCAzIGluZm8pKSkp KSkKKyAgOzsgVGVzdCBwcmVmaXggYXJndW1lbnQgcG9pbnQgc3BsaXR0aW5nLgorICAobGV0ICgo b3JnLWFkYXB0LWluZGVudGF0aW9uIHQpCisgICAgICAgIChvay1jb2wgMTEpCisgICAgICAgIChz dGFycyAiXlxcKlxcKlxcKlxcKlxcKlxcKlxcKlxcKlxcKlxcKiIpKQorICAgIChvcmctdGVzdC13 aXRoLXRlbXAtdGV4dCAiCisqKioqKioqKioqIDEwIHN0YXJzIHdpdGggcG9pbnQgYmV0d2VlbiB0 d28gbGluZXMKKyAgICAgICAgICAgIytiZWdpbl9zcmMgZW1hY3MtbGlzcAorICAgICAgICAgICA7 OyB0byB1cHBlciBibG9jaworICAgICAgICAgICA8cG9pbnQ+CisgICAgICAgICAgIDs7IHRvIGxv d2VyIGJsb2NrCisgICAgICAgICAgICMrZW5kX3NyYworIgorICAgICAgKG9yZy1iYWJlbC1kZW1h cmNhdGUtYmxvY2sgJ2EtcHJlZml4LWFyZykKKyAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikp CisgICAgICAoZG9saXN0IChyZWdleHAgYCgsc3RhcnMKKyAgICAgICAgICAgICAgICAgICAgICAg ICIjXFwrYmVnIiAiOzsgdG8gdXBwZXIgYmxvY2siICIjXFwrZW5kIgorICAgICAgICAgICAgICAg ICAgICAgICAgLHN0YXJzCisgICAgICAgICAgICAgICAgICAgICAgICAiI1xcK2JlZyIgIjs7IHRv IGxvd2VyIGJsb2NrIiAiI1xcK2VuZCIpKQorICAgICAgICAoc2hvdWxkIChyZS1zZWFyY2gtZm9y d2FyZCByZWdleHApKQorICAgICAgICAoZ290by1jaGFyIChtYXRjaC1iZWdpbm5pbmcgMCkpCisg ICAgICAgIChpZiAob3IgKHN0cmluZz0gcmVnZXhwIHN0YXJzKQorICAgICAgICAgICAgICAgIChz dHJpbmctcHJlZml4LXAgIjs7IiByZWdleHApKQorICAgICAgICAgICAgKHNob3VsZCAoPSAwIChj dXJyZW50LWNvbHVtbikpKQorICAgICAgICAgIChzaG91bGQgKD0gb2stY29sIChjdXJyZW50LWNv bHVtbikpKSkpKSkKKyAgOzsgVGVzdCBwcmVmaXggYXJndW1lbnQgcmVnaW9uIHNwbGl0dGluZy4K KyAgKGxldCAoKG9yZy1hZGFwdC1pbmRlbnRhdGlvbiB0KQorICAgICAgICAob2stY29sIDExKQor ICAgICAgICAoc3RhcnMgIl5cXCpcXCpcXCpcXCpcXCpcXCpcXCpcXCpcXCpcXCoiKQorICAgICAg ICAocGFydHMgJygidG8gdXBwZXIgYmxvY2siICJtYXJrIHRoaXMgbGluZSBhcyByZWdpb24iICJ0 byBsb3dlciBibG9jayIpKSkKKyAgICAob3JnLXRlc3Qtd2l0aC10ZW1wLXRleHQgKGZvcm1hdCAi CisqKioqKioqKioqIDEwIHN0YXJzIHdpdGggcmVnaW9uIGJldHdlZW4gdHdvIGxpbmVzCisgICAg ICAgICAgICMraGVhZGVyOiA6dmFyIGI9XCJhbHNvIHNlZW5cIgorICAgICAgICAgICAjK2JlZ2lu X3NyYyBhbnktbGFuZ3VhZ2UgLWkgLW4gOnZhciBhPVwic2VlblwiCisgICAgICAgICAgICVzCisg ICAgICAgICAgICVzCisgICAgICAgICAgICVzCisgICAgICAgICAgICMrZW5kX3NyYworIiAobnRo IDAgcGFydHMpIChudGggMSBwYXJ0cykgKG50aCAyIHBhcnRzKSkKKyAgICAgIChsZXQgKChuIDAp IGluZm8gdmFycykKKyAgICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKKyAgICAgICAgKHJl LXNlYXJjaC1mb3J3YXJkIChudGggMSBwYXJ0cykpCisgICAgICAgIChzZXQtbWFyayAocG9pbnQp KQorICAgICAgICA7OyBtYXJrIHRoZSByZWdpb24gYnkgbW92aW5nIHBvaW50IG1ha2VzIHRoZSB0 ZXN0IHBhc3MuCisgICAgICAgIChiZWdpbm5pbmctb2YtbGluZSkgOzsgKGdvdG8tY2hhciAobWF0 Y2gtYmVnaW5uaW5nIDApKSBmYWlscy4KKyAgICAgICAgKG9yZy1iYWJlbC1kZW1hcmNhdGUtYmxv Y2sgJ2EtcHJlZml4LWFyZ3VtZW50KQorICAgICAgICAobWVzc2FnZSAiJXMiIChidWZmZXItc3Vi c3RyaW5nIChwb2ludC1taW4pIChwb2ludC1tYXgpKSkKKyAgICAgICAgKGdvdG8tY2hhciAocG9p bnQtbWluKSkKKyAgICAgICAgKHdoaWxlICg8IG4gKGxlbmd0aCBwYXJ0cykpCisgICAgICAgICAg KG9yZy1iYWJlbC1uZXh0LXNyYy1ibG9jaykKKyAgICAgICAgICAoc2V0cSBpbmZvIChvcmctYmFi ZWwtZ2V0LXNyYy1ibG9jay1pbmZvKSkKKyAgICAgICAgICAoc2V0cSB2YXJzIChvcmctYmFiZWwt LWdldC12YXJzIChudGggMiBpbmZvKSkpCisgICAgICAgICAgKHNob3VsZCAoc3RyaW5nPSAiYW55 LWxhbmd1YWdlIiAobnRoIDAgaW5mbykpKQorICAgICAgICAgIChzaG91bGQgKHN0cmluZz0gKG50 aCBuIHBhcnRzKSAob3JnLXRyaW0gKG50aCAxIGluZm8pKSkpCisgICAgICAgICAgKHNob3VsZCAo c3RyaW5nPSAic2VlbiIgKGNkciAoYXNzcSAnYSB2YXJzKSkpKQorICAgICAgICAgIChzaG91bGQg KHN0cmluZz0gImFsc28gc2VlbiIgKGNkciAoYXNzcSAnYiB2YXJzKSkpKQorICAgICAgICAgIChz aG91bGQgKHN0cmluZz0gIi1pIC1uIiAobnRoIDMgaW5mbykpKQorICAgICAgICAgIChjbC1pbmNm IG4pKSkKKyAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAoZG9saXN0IChyZWdl eHAgYCgsc3RhcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICIjXFwrYmVnIiAsKG50aCAwIHBh cnRzKSAiI1xcK2VuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICxzdGFycworICAgICAgICAg ICAgICAgICAgICAgICAgIiNcXCtiZWciICwobnRoIDEgcGFydHMpICIjXFwrZW5kIgorICAgICAg ICAgICAgICAgICAgICAgICAgLHN0YXJzCisgICAgICAgICAgICAgICAgICAgICAgICAiI1xcK2Jl ZyIgLChudGggMiBwYXJ0cykgIiNcXCtlbmQiKSkKKyAgICAgICAgKG1lc3NhZ2UgInJlZ2V4cDog JXMiIHJlZ2V4cCkKKyAgICAgICAgKHNob3VsZCAocmUtc2VhcmNoLWZvcndhcmQgcmVnZXhwKSkK KyAgICAgICAgKGdvdG8tY2hhciAobWF0Y2gtYmVnaW5uaW5nIDApKQorICAgICAgICAoaWYgKHN0 cmluZz0gcmVnZXhwIHN0YXJzKQorICAgICAgICAgICAgKHNob3VsZCAoPSAwIChjdXJyZW50LWNv bHVtbikpKQorICAgICAgICAgIChzaG91bGQgKD0gb2stY29sIChjdXJyZW50LWNvbHVtbikpKSkp KSkpCisKIChlcnQtZGVmdGVzdCB0ZXN0LW9iL2luZGVudGVkLWNhY2hlZC1vcmctYnJhY2tldC1s aW5rICgpCiAgICJXaGVuIHRoZSByZXN1bHQgb2YgYSBzb3VyY2UgYmxvY2sgaXMgYSBjYWNoZWQg aW5kZW50ZWQgbGluayBpdAogc2hvdWxkIHN0aWxsIHJldHVybiB0aGUgbGluay4iCi0tIAoyLjQy LjAKCg== --=_3b741f8298f07df77e8d4d2c4239aed7--