From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Jim Porter Newsgroups: gmane.emacs.bugs Subject: bug#66756: 30.0.50; [PATCH] Improve discussion of 'let' in Elisp Introduction manual Date: Sun, 3 Dec 2023 20:34:49 -0800 Message-ID: <8cea0f24-e868-2236-2697-bd4af1c863d3@gmail.com> References: <3ade119d-0f0d-e60e-1bdc-9c7e02c1559c@gmail.com> <381836df-c16f-b3e7-d0c4-473290e165de@gmail.com> <9239b6bd-b476-b6c1-aef9-245e439aee42@gmail.com> <83jzq7fx5o.fsf@gnu.org> <64d90b0b-e003-7bc3-5312-6c7ab4c4591f@gmail.com> <838r6nfkfj.fsf@gnu.org> <83jzq6e0dn.fsf@gnu.org> <0fe9fc29-11d5-2983-8970-3f4b7969df2d@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------PqrLK7WcJY5KW0Q0vbC1M0wq" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="6321"; mail-complaints-to="usenet@ciao.gmane.io" Cc: eliz@gnu.org, 66756@debbugs.gnu.org To: rms@gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Mon Dec 04 05:36:16 2023 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1rA0gp-0001Tu-SA for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 04 Dec 2023 05:36:16 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rA0gb-0002tt-I6; Sun, 03 Dec 2023 23:36:04 -0500 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 1rA0gT-0002t1-05 for bug-gnu-emacs@gnu.org; Sun, 03 Dec 2023 23:35:53 -0500 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1rA0gS-0004OY-5K for bug-gnu-emacs@gnu.org; Sun, 03 Dec 2023 23:35:52 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1rA0gc-0005qh-Ee for bug-gnu-emacs@gnu.org; Sun, 03 Dec 2023 23:36:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Jim Porter Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 04 Dec 2023 04:36:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 66756 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 66756-submit@debbugs.gnu.org id=B66756.170166450922417 (code B ref 66756); Mon, 04 Dec 2023 04:36:02 +0000 Original-Received: (at 66756) by debbugs.gnu.org; 4 Dec 2023 04:35:09 +0000 Original-Received: from localhost ([127.0.0.1]:33274 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rA0fk-0005pU-K6 for submit@debbugs.gnu.org; Sun, 03 Dec 2023 23:35:09 -0500 Original-Received: from mail-pg1-x535.google.com ([2607:f8b0:4864:20::535]:51207) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rA0fi-0005ox-Lf for 66756@debbugs.gnu.org; Sun, 03 Dec 2023 23:35:08 -0500 Original-Received: by mail-pg1-x535.google.com with SMTP id 41be03b00d2f7-5c1a75a4b6cso913239a12.2 for <66756@debbugs.gnu.org>; Sun, 03 Dec 2023 20:34:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1701664490; x=1702269290; darn=debbugs.gnu.org; h=in-reply-to:from:content-language:references:cc:to:subject :mime-version:date:message-id:from:to:cc:subject:date:message-id :reply-to; bh=bSBV2/8h3rrfZ/eTGCxJirKjHjA9z606ACu1NU8RfCo=; b=QWK+ULKe7DAUEYTZNBpK6AMim8/b0ZGFLsCV8bnKIzmIrlskqCXRZeNmuqdF2dTLQ6 gNh5CyMFARCoOA0IY8RprAnPustsZ2c3AWl3qIvdWRARSdkUgwkeKYJI5rorOz2kJktH hWSVjOY5mKTbjv8pSRNYKXlkpqVnddcLKmZEfhozBoPMVdFUC7V334LSvaQCkdiMWYXE xHZvXZAagi45I60sxuWgUhHlC8bVpOwvu0HnPRbrdwOh4wvsk/1GjcBfPGJ5plEDQLFH frwkBm7Eve4lwQQz1F2vbYA0LFs0eN75sF83fSLp4LQAwjDag59QBkicpDNeJ8Az+lYc sRzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701664490; x=1702269290; h=in-reply-to:from:content-language:references:cc:to:subject :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=bSBV2/8h3rrfZ/eTGCxJirKjHjA9z606ACu1NU8RfCo=; b=aDUNodHMzY1hTd5on7nmGeSG+BH6g1ozUMsrqbiq9KlxOTmIvVRgA9bUEE35vwt9Bv wAhzgyjsaX3aliHpwZxKa3F4QTAXUvvXXRKxtvpnlJxDnzDuVP8YZW7HLk+6/aGaegXl grZqagtyLwfGyJQ4DjZ9YBBPXdsNFtpHRWQ/HnAOw/a2tQZPh7vnQ+RccP7fu7hYFF3X 3FHYmc9lgHHoHutNw/rDgx9r7YdD4cjeGEKl87z0YggsDyxyS70XVFZ8RTfA82BfSvwu euLVaOOmpedZMhBcpHH5zUk+SdIiNUICGGcFfFDn/TWxk++9c+7u+keHSpKM415arRPP xjOA== X-Gm-Message-State: AOJu0YwhQ0ksPCOXChxAN/Yg3F1Sy5pp3sINwfCq1DOP35p4Whvdb3XJ PBZzFl5vvz/624mUteGkjtY= X-Google-Smtp-Source: AGHT+IH0cTGSZWlTuEgJySRgVpbk2U3ClvC99os5fJpAD09id9RCBHEBkZZNsyg8N6yaAAlaoOFhNw== X-Received: by 2002:a17:90b:1983:b0:286:6cc1:291 with SMTP id mv3-20020a17090b198300b002866cc10291mr842270pjb.92.1701664490068; Sun, 03 Dec 2023 20:34:50 -0800 (PST) Original-Received: from [192.168.1.2] (076-168-148-233.res.spectrum.com. [76.168.148.233]) by smtp.googlemail.com with ESMTPSA id b6-20020a17090a7ac600b002868635df0asm2236103pjl.37.2023.12.03.20.34.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 03 Dec 2023 20:34:49 -0800 (PST) Content-Language: en-US In-Reply-To: X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:275474 Archived-At: This is a multi-part message in MIME format. --------------PqrLK7WcJY5KW0Q0vbC1M0wq Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 12/3/2023 7:08 PM, Richard Stallman wrote: > [[[ To any NSA and FBI agents reading my email: please consider ]]] > [[[ whether defending the US Constitution against all enemies, ]]] > [[[ foreign or domestic, requires you to follow Snowden's example. ]]] > > > +means his house, not yours. (Symbols used in argument lists work the > > +same way. > > Maybe that sentence should be more explicit about which symbols it > refers to and which aspect of "working". Perhaps like this: > > (The symbols used to name function arguments are bound as local variables > in exactly the same way.) Makes sense to me. Done. > This statement > > However, outside > +of the @code{let} body (such as when calling a function that was > +defined elsewhere), calling @code{setq} for a variable named by the > +@code{let} expression will @emph{not} affect that local variable. > > is true only in lexical binding. With dynamic binding, such a setq > _will_ set the let's local variable (in the simplest cases). Correct. Based on Eli's suggestions, I've worded this initial section to assume that lexical binding is in effect. I put a footnote here to mention this, but otherwise I'm trying my hardest to avoid front-loading the 'let' documentation with an explanation of lexical binding. > +Emacs Lisp supports two different ways of binding variable names to > +their values. These ways affect the parts of your program where a > +particular binding is validscop. > > Typo there. Thanks. I think that was a mistake from when I was searching for "scope" to ensure I didn't inadvertently use the term in this section. (I wanted to avoid mentioning another CS term here, and I think "binding" is enough for what we want to say.) > +As we discussed before, when you create local variables with > +@code{let} under lexical binding, those variables are valid only > +within the body of the @code{let} expression. > > Where is this previous discussion? I don't see it. The distinction > of dynamic vs lexical was first introduced two paragraphs above, > and its effects on binding have not been discussed yet. > > Is this a reference to the following? > > However, outside > +of the @code{let} body (such as when calling a function that was > +defined elsewhere), calling @code{setq} for a variable named by the > +@code{let} expression will @emph{not} affect that local variable. > > That may be meant as a discussion of local binding with lexical scoping, > but it isn't one, since it doesn't say "lexical scoping." Correct. I added a cross-reference back to that section. With that and the footnote in the "let Prevents Confusion" section, hopefully this is clearer now. > (On the other hand, if > +you call a function defined within a @code{let} body, > > I recommend "that was defined within"; it is more clear. Done. > +Under dynamic binding, the rules are different: instead, when you use > +@code{let}, the local variables you've created are valid during > +execution of the let expression. > > @code needed here. Fixed. > When you bind a variable > +with @code{let}, it puts the new binding you've specified on the top > +of the stack, > > For clarity, I suggest "bind a variable dynamically" or something to reiterate > that this sentence is only about dynamic binding. Without that, the reader > could take it to be independent of which mode is currently selected. Done. On 12/3/2023 7:08 PM, Richard Stallman wrote: > The new node How let Binds Variables is 110 lines long. Such a long > node is cumbersome, especially for cross-references to it. > > Can you find a way to subdivide it into smaller nodes? > > It could have some text at the beginning, then a few subnodes. I've split this into a main section and two subnodes: one describing how lexical and dynamic binding work, and one showing an example of how they behave differently in practice. Maybe the titles could be improved, but they're the best I could come up with at the time... --------------PqrLK7WcJY5KW0Q0vbC1M0wq Content-Type: text/plain; charset=UTF-8; name="0001-Introduce-let-using-lexical-binding-in-the-Lisp-Intr.patch" Content-Disposition: attachment; filename*0="0001-Introduce-let-using-lexical-binding-in-the-Lisp-Intr.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSAwMzdhMzU3ODgxNWRiYWVkNzFlYTkwZWJjOTU5ODY4MmZiMTU5ZTIzIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKaW0gUG9ydGVyIDxqcG9ydGVyYnVnc0BnbWFpbC5j b20+CkRhdGU6IFdlZCwgMjUgT2N0IDIwMjMgMjA6NDM6NTcgLTA3MDAKU3ViamVjdDogW1BB VENIXSBJbnRyb2R1Y2UgJ2xldCcgdXNpbmcgbGV4aWNhbCBiaW5kaW5nIGluIHRoZSBMaXNw CiBJbnRyb2R1Y3Rpb24KCiogZG9jL2xpc3BpbnRyby9lbWFjcy1saXNwLWludHJvLnRleGkg KFByZXZlbnQgY29uZnVzaW9uKTogUmV3b3JrIHRoZQpleHBsYW5hdGlvbiB0byBkaXNjdXNz IGhvdyB0aGluZ3Mgd29yayB1bmRlciBsZXhpY2FsIGJpbmRpbmcuCihIb3cgbGV0IEJpbmRz IFZhcmlhYmxlcyk6IERlc2NyaWJlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGxleGljYWwK YW5kIGR5bmFtaWMgYmluZGluZyAoaW5jbHVkaW5nIGhvdyB0byBjb25maWd1cmUgaXQpLgoo ZGVmdmFyKTogTWVudGlvbiB0aGF0ICdkZWZ2YXInIGRlY2xhcmVzIHZhcmlhYmxlcyBhcyBh bHdheXMKZHluYW1pY2FsbHktYm91bmQgKGJ1ZyM2Njc1NikuCi0tLQogZG9jL2xpc3BpbnRy by9lbWFjcy1saXNwLWludHJvLnRleGkgfCAxNzEgKysrKysrKysrKysrKysrKysrKysrKysr LS0tLQogMSBmaWxlIGNoYW5nZWQsIDE0OSBpbnNlcnRpb25zKCspLCAyMiBkZWxldGlvbnMo LSkKCmRpZmYgLS1naXQgYS9kb2MvbGlzcGludHJvL2VtYWNzLWxpc3AtaW50cm8udGV4aSBi L2RvYy9saXNwaW50cm8vZW1hY3MtbGlzcC1pbnRyby50ZXhpCmluZGV4IGM1YjMzYWM1ZWFh Li40NTY1YjZjMGZmMCAxMDA2NDQKLS0tIGEvZG9jL2xpc3BpbnRyby9lbWFjcy1saXNwLWlu dHJvLnRleGkKKysrIGIvZG9jL2xpc3BpbnRyby9lbWFjcy1saXNwLWludHJvLnRleGkKQEAg LTM1OTEsNiArMzU5MSw3IEBAIGxldAogKiBQYXJ0cyBvZiBsZXQgRXhwcmVzc2lvbjo6CiAq IFNhbXBsZSBsZXQgRXhwcmVzc2lvbjo6CiAqIFVuaW5pdGlhbGl6ZWQgbGV0IFZhcmlhYmxl czo6CisqIEhvdyBsZXQgQmluZHMgVmFyaWFibGVzOjoKIEBlbmQgbWVudQogCiBAaWZub3R0 ZXgKQEAgLTM2MDIsMjQgKzM2MDMsMjYgQEAgUHJldmVudCBjb25mdXNpb24KIEBjaW5kZXgg QHNhbXB7dmFyaWFibGUsIGxvY2FsfSwgZGVmaW5lZAogVGhlIEBjb2Rle2xldH0gc3BlY2lh bCBmb3JtIHByZXZlbnRzIGNvbmZ1c2lvbi4gIEBjb2Rle2xldH0gY3JlYXRlcyBhCiBuYW1l IGZvciBhIEBkZm57bG9jYWwgdmFyaWFibGV9IHRoYXQgb3ZlcnNoYWRvd3MgYW55IHVzZSBv ZiB0aGUgc2FtZQotbmFtZSBvdXRzaWRlIHRoZSBAY29kZXtsZXR9IGV4cHJlc3Npb24uICBU aGlzIGlzIGxpa2UgdW5kZXJzdGFuZGluZwotdGhhdCB3aGVuZXZlciB5b3VyIGhvc3QgcmVm ZXJzIHRvIGBgdGhlIGhvdXNlJycsIGhlIG1lYW5zIGhpcyBob3VzZSwgbm90Ci15b3Vycy4g IChTeW1ib2xzIHVzZWQgaW4gYXJndW1lbnQgbGlzdHMgd29yayB0aGUgc2FtZSB3YXkuCitu YW1lIG91dHNpZGUgdGhlIEBjb2Rle2xldH0gZXhwcmVzc2lvbiAoaW4gY29tcHV0ZXIgc2Np ZW5jZSBqYXJnb24sIHdlCitjYWxsIHRoaXMgQGRmbntiaW5kaW5nfSB0aGUgdmFyaWFibGUp LiAgVGhpcyBpcyBsaWtlIHVuZGVyc3RhbmRpbmcKK3RoYXQgaW4geW91ciBob3N0J3MgaG9t ZSwgd2hlbmV2ZXIgaGUgcmVmZXJzIHRvIGBgdGhlIGhvdXNlJycsIGhlCittZWFucyBoaXMg aG91c2UsIG5vdCB5b3Vycy4gIChUaGUgc3ltYm9scyB1c2VkIHRvIG5hbWUgZnVuY3Rpb24K K2FyZ3VtZW50cyBhcmUgYm91bmQgYXMgbG9jYWwgdmFyaWFibGVzIGluIGV4YWN0bHkgdGhl IHNhbWUgd2F5LgogQHhyZWZ7ZGVmdW4sICwgVGhlIEBjb2Rle2RlZnVufSBNYWNyb30uKQog Ci1Mb2NhbCB2YXJpYWJsZXMgY3JlYXRlZCBieSBhIEBjb2Rle2xldH0gZXhwcmVzc2lvbiBy ZXRhaW4gdGhlaXIgdmFsdWUKLUBlbXBoe29ubHl9IHdpdGhpbiB0aGUgQGNvZGV7bGV0fSBl eHByZXNzaW9uIGl0c2VsZiAoYW5kIHdpdGhpbgotZXhwcmVzc2lvbnMgY2FsbGVkIHdpdGhp biB0aGUgQGNvZGV7bGV0fSBleHByZXNzaW9uKTsgdGhlIGxvY2FsCi12YXJpYWJsZXMgaGF2 ZSBubyBlZmZlY3Qgb3V0c2lkZSB0aGUgQGNvZGV7bGV0fSBleHByZXNzaW9uLgotCi1Bbm90 aGVyIHdheSB0byB0aGluayBhYm91dCBAY29kZXtsZXR9IGlzIHRoYXQgaXQgaXMgbGlrZSBh IEBjb2Rle3NldHF9Ci10aGF0IGlzIHRlbXBvcmFyeSBhbmQgbG9jYWwuICBUaGUgdmFsdWVz IHNldCBieSBAY29kZXtsZXR9IGFyZQotYXV0b21hdGljYWxseSB1bmRvbmUgd2hlbiB0aGUg QGNvZGV7bGV0fSBpcyBmaW5pc2hlZC4gIFRoZSBzZXR0aW5nCi1vbmx5IGFmZmVjdHMgZXhw cmVzc2lvbnMgdGhhdCBhcmUgaW5zaWRlIHRoZSBib3VuZHMgb2YgdGhlIEBjb2Rle2xldH0K LWV4cHJlc3Npb24uICBJbiBjb21wdXRlciBzY2llbmNlIGphcmdvbiwgd2Ugd291bGQgc2F5 IHRoZSBiaW5kaW5nIG9mCi1hIHN5bWJvbCBpcyB2aXNpYmxlIG9ubHkgaW4gZnVuY3Rpb25z IGNhbGxlZCBpbiB0aGUgQGNvZGV7bGV0fSBmb3JtOwotaW4gRW1hY3MgTGlzcCwgdGhlIGRl ZmF1bHQgc2NvcGluZyBpcyBkeW5hbWljLCBub3QgbGV4aWNhbC4gIChUaGUKLW5vbi1kZWZh dWx0IGxleGljYWwgYmluZGluZyBpcyBub3QgZGlzY3Vzc2VkIGluIHRoaXMgbWFudWFsLikK K0Fub3RoZXIgd2F5IHRvIHRoaW5rIGFib3V0IEBjb2Rle2xldH0gaXMgdGhhdCBpdCBkZWZp bmVzIGEgc3BlY2lhbAorcmVnaW9uIGluIHlvdXIgY29kZTogd2l0aGluIHRoZSBib2R5IG9m IHRoZSBAY29kZXtsZXR9IGV4cHJlc3Npb24sIHRoZQordmFyaWFibGVzIHlvdSd2ZSBuYW1l ZCBoYXZlIHRoZWlyIG93biBsb2NhbCBtZWFuaW5nLiAgT3V0c2lkZSBvZiB0aGUKK0Bjb2Rl e2xldH0gYm9keSwgdGhleSBoYXZlIG90aGVyIG1lYW5pbmdzIChvciB0aGV5IG1heSBub3Qg YmUgZGVmaW5lZAorYXQgYWxsKS4gIFRoaXMgbWVhbnMgdGhhdCBpbnNpZGUgdGhlIEBjb2Rl e2xldH0gYm9keSwgY2FsbGluZworQGNvZGV7c2V0cX0gZm9yIGEgdmFyaWFibGUgbmFtZWQg YnkgdGhlIEBjb2Rle2xldH0gZXhwcmVzc2lvbiB3aWxsIHNldAordGhlIHZhbHVlIG9mIHRo ZSBAZW1waHtsb2NhbH0gdmFyaWFibGUgb2YgdGhhdCBuYW1lLiAgSG93ZXZlciwgb3V0c2lk ZQorb2YgdGhlIEBjb2Rle2xldH0gYm9keSAoc3VjaCBhcyB3aGVuIGNhbGxpbmcgYSBmdW5j dGlvbiB0aGF0IHdhcworZGVmaW5lZCBlbHNld2hlcmUpLCBjYWxsaW5nIEBjb2Rle3NldHF9 IGZvciBhIHZhcmlhYmxlIG5hbWVkIGJ5IHRoZQorQGNvZGV7bGV0fSBleHByZXNzaW9uIHdp bGwgQGVtcGh7bm90fSBhZmZlY3QgdGhhdCBsb2NhbAordmFyaWFibGUuQGZvb3Rub3Rle1Ro aXMgZGVzY3JpYmVzIHRoZSBiZWhhdmlvciBvZiBAY29kZXtsZXR9IHdoZW4KK3VzaW5nIGEg c3R5bGUgY2FsbGVkIGBgbGV4aWNhbCBiaW5kaW5nJycgKEBweHJlZntIb3cgbGV0IEJpbmRz CitWYXJpYWJsZXN9KS59CiAKIEBjb2Rle2xldH0gY2FuIGNyZWF0ZSBtb3JlIHRoYW4gb25l IHZhcmlhYmxlIGF0IG9uY2UuICBBbHNvLAogQGNvZGV7bGV0fSBnaXZlcyBlYWNoIHZhcmlh YmxlIGl0IGNyZWF0ZXMgYW4gaW5pdGlhbCB2YWx1ZSwgZWl0aGVyIGEKQEAgLTM3NzksNiAr Mzc4MiwxMjggQEAgVW5pbml0aWFsaXplZCBsZXQgVmFyaWFibGVzCiBAc2FtcHslc30uKSAg VGhlIGZvdXIgdmFyaWFibGVzIGFzIGEgZ3JvdXAgYXJlIHB1dCBpbnRvIGEgbGlzdCB0bwog ZGVsaW1pdCB0aGVtIGZyb20gdGhlIGJvZHkgb2YgdGhlIEBjb2Rle2xldH0uCiAKK0Bub2Rl IEhvdyBsZXQgQmluZHMgVmFyaWFibGVzCitAc3Vic2VjdGlvbiBIb3cgQGNvZGV7bGV0fSBC aW5kcyBWYXJpYWJsZXMKKworRW1hY3MgTGlzcCBzdXBwb3J0cyB0d28gZGlmZmVyZW50IHdh eXMgb2YgYmluZGluZyB2YXJpYWJsZSBuYW1lcyB0bwordGhlaXIgdmFsdWVzLiAgVGhlc2Ug d2F5cyBhZmZlY3QgdGhlIHBhcnRzIG9mIHlvdXIgcHJvZ3JhbSB3aGVyZSBhCitwYXJ0aWN1 bGFyIGJpbmRpbmcgaXMgdmFsaWQuICBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBFbWFjcyBM aXNwIHVzZXMKK2EgZm9ybSBvZiB2YXJpYWJsZSBiaW5kaW5nIGNhbGxlZCBAZGZue2R5bmFt aWMgYmluZGluZ30gYnkgZGVmYXVsdC4KK0hvd2V2ZXIsIGluIHRoaXMgbWFudWFsIHdlIGRp c2N1c3MgdGhlIHByZWZlcnJlZCBmb3JtIG9mIGJpbmRpbmcsCitjYWxsZWQgQGRmbntsZXhp Y2FsIGJpbmRpbmd9LCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkIChpbiB0aGUgZnV0dXJlLAor dGhlIEVtYWNzIG1haW50YWluZXJzIHBsYW4gdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHRvIGxl eGljYWwgYmluZGluZykuCitJZiB5b3UgaGF2ZSBwcm9ncmFtbWVkIGluIG90aGVyIGxhbmd1 YWdlcyBiZWZvcmUsIHlvdSdyZSBsaWtlbHkKK2FscmVhZHkgZmFtaWxpYXIgd2l0aCBob3cg bGV4aWNhbCBiaW5kaW5nIGJlaGF2ZXMuCisKK0luIG9yZGVyIHRvIHVzZSBsZXhpY2FsIGJp bmRpbmcgaW4gYSBwcm9ncmFtLCB5b3Ugc2hvdWxkIGFkZCB0aGlzIHRvCit0aGUgZmlyc3Qg bGluZSBvZiB5b3VyIEVtYWNzIExpc3AgZmlsZToKKworQGV4YW1wbGUKKzs7OyAtKi0gbGV4 aWNhbC1iaW5kaW5nOiB0IC0qLQorQGVuZCBleGFtcGxlCisKK0ZvciBtb3JlIGluZm9ybWF0 aW9uIGFib3V0IHRoaXMsIEBweHJlZntTZWxlY3RpbmcgTGlzcCBEaWFsZWN0LCAsICwKK2Vs aXNwLCBUaGUgRW1hY3MgTGlzcCBSZWZlcmVuY2UgTWFudWFsfS4KKworQG1lbnUKKyogTGV4 aWNhbCAmIER5bmFtaWMgQmluZGluZyBEaWZmZXJlbmNlczo6CisqIExleGljYWwgdnMuIER5 bmFtaWMgQmluZGluZyBFeGFtcGxlOjoKK0BlbmQgbWVudQorCitAbm9kZSBMZXhpY2FsICYg RHluYW1pYyBCaW5kaW5nIERpZmZlcmVuY2VzCitAdW5udW1iZXJlZHN1YnN1YnNlYyBEaWZm ZXJlbmNlcyBCZXR3ZWVuIExleGljYWwgYW5kIER5bmFtaWMgQmluZGluZworCitAY2luZGV4 IExleGljYWwgYmluZGluZworQGNpbmRleCBCaW5kaW5nLCBsZXhpY2FsCitBcyB3ZSBkaXNj dXNzZWQgYmVmb3JlIChAcHhyZWZ7UHJldmVudCBjb25mdXNpb259KSwgd2hlbiB5b3UgY3Jl YXRlCitsb2NhbCB2YXJpYWJsZXMgd2l0aCBAY29kZXtsZXR9IHVuZGVyIGxleGljYWwgYmlu ZGluZywgdGhvc2UgdmFyaWFibGVzCithcmUgdmFsaWQgb25seSB3aXRoaW4gdGhlIGJvZHkg b2YgdGhlIEBjb2Rle2xldH0gZXhwcmVzc2lvbi4gIEluIG90aGVyCitwYXJ0cyBvZiB5b3Vy IGNvZGUsIHRoZXkgaGF2ZSBvdGhlciBtZWFuaW5ncywgc28gaWYgeW91IGNhbGwgYQorZnVu Y3Rpb24gZGVmaW5lZCBlbHNld2hlcmUgd2l0aGluIHRoZSBAY29kZXtsZXR9IGJvZHksIHRo YXQgZnVuY3Rpb24KK3dvdWxkIGJlIHVuYWJsZSB0byBgYHNlZScnIHRoZSBsb2NhbCB2YXJp YWJsZXMgeW91J3ZlIGNyZWF0ZWQuICAoT24KK3RoZSBvdGhlciBoYW5kLCBpZiB5b3UgY2Fs bCBhIGZ1bmN0aW9uIHRoYXQgd2FzIGRlZmluZWQgd2l0aGluIGEKK0Bjb2Rle2xldH0gYm9k eSwgdGhhdCBmdW5jdGlvbiBAZW1waHt3b3VsZH0gYmUgYWJsZSB0byBzZWUtLS1hbmQKK21v ZGlmeS0tLXRoZSBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGF0IEBjb2Rle2xldH0gZXhwcmVz c2lvbi4pCisKK0BjaW5kZXggRHluYW1pYyBiaW5kaW5nCitAY2luZGV4IEJpbmRpbmcsIGR5 bmFtaWMKK1VuZGVyIGR5bmFtaWMgYmluZGluZywgdGhlIHJ1bGVzIGFyZSBkaWZmZXJlbnQ6 IGluc3RlYWQsIHdoZW4geW91IHVzZQorQGNvZGV7bGV0fSwgdGhlIGxvY2FsIHZhcmlhYmxl cyB5b3UndmUgY3JlYXRlZCBhcmUgdmFsaWQgZHVyaW5nCitleGVjdXRpb24gb2YgdGhlIEBj b2Rle2xldH0gZXhwcmVzc2lvbi4gIFRoaXMgbWVhbnMgdGhhdCwgaWYgeW91cgorQGNvZGV7 bGV0fSBleHByZXNzaW9uIGNhbGxzIGEgZnVuY3Rpb24sIHRoYXQgZnVuY3Rpb24gY2FuIHNl ZSB0aGVzZQorbG9jYWwgdmFyaWFibGVzLCByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZSBmdW5j dGlvbiBpcyBkZWZpbmVkCisoaW5jbHVkaW5nIGluIGFub3RoZXIgZmlsZSBlbnRpcmVseSku CisKK0Fub3RoZXIgd2F5IHRvIHRoaW5rIGFib3V0IEBjb2Rle2xldH0gd2hlbiB1c2luZyBk eW5hbWljIGJpbmRpbmcgaXMKK3RoYXQgZXZlcnkgdmFyaWFibGUgbmFtZSBoYXMgYSBnbG9i YWwgYGBzdGFjaycnIG9mIGJpbmRpbmdzLCBhbmQKK3doZW5ldmVyIHlvdSB1c2UgdGhhdCB2 YXJpYWJsZSdzIG5hbWUsIGl0IHJlZmVycyB0byB0aGUgYmluZGluZyBvbiB0aGUKK3RvcCBv ZiB0aGUgc3RhY2suICAoWW91IGNhbiBpbWFnaW5lIHRoaXMgbGlrZSBhIHN0YWNrIG9mIHBh cGVycyBvbgoreW91ciBkZXNrIHdpdGggdGhlIHZhbHVlcyB3cml0dGVuIG9uIHRoZW0uKSAg V2hlbiB5b3UgYmluZCBhIHZhcmlhYmxlCitkeW5hbWljYWxseSB3aXRoIEBjb2Rle2xldH0s IGl0IHB1dHMgdGhlIG5ldyBiaW5kaW5nIHlvdSd2ZSBzcGVjaWZpZWQKK29uIHRoZSB0b3Ag b2YgdGhlIHN0YWNrLCBhbmQgdGhlbiBleGVjdXRlcyB0aGUgQGNvZGV7bGV0fSBib2R5LiAg T25jZQordGhlIEBjb2Rle2xldH0gYm9keSBmaW5pc2hlcywgaXQgdGFrZXMgdGhhdCBiaW5k aW5nIG9mZiBvZiB0aGUgc3RhY2ssCityZXZlYWxpbmcgdGhlIG9uZSBpdCBoYWQgKGlmIGFu eSkgYmVmb3JlIHRoZSBAY29kZXtsZXR9IGV4cHJlc3Npb24uCisKK0Bub2RlIExleGljYWwg dnMuIER5bmFtaWMgQmluZGluZyBFeGFtcGxlCitAdW5udW1iZXJlZHN1YnN1YnNlYyBFeGFt cGxlIG9mIExleGljYWwgdnMuIER5bmFtaWMgQmluZGluZworSW4gc29tZSBjYXNlcywgYm90 aCBsZXhpY2FsIGFuZCBkeW5hbWljIGJpbmRpbmcgYmVoYXZlIGlkZW50aWNhbGx5LgorSG93 ZXZlciwgaW4gb3RoZXIgY2FzZXMsIHRoZXkgY2FuIGNoYW5nZSB0aGUgbWVhbmluZyBvZiB5 b3VyIHByb2dyYW0uCitGb3IgZXhhbXBsZSwgc2VlIHdoYXQgaGFwcGVucyBpbiB0aGlzIGNv ZGUgdW5kZXIgbGV4aWNhbCBiaW5kaW5nOgorCitAZXhhbXBsZQorOzs7IC0qLSBsZXhpY2Fs LWJpbmRpbmc6IHQgLSotCisKKyhzZXRxIHggMCkKKworKGRlZnVuIGdldHggKCkKKyAgeCkK KworKHNldHEgeCAxKQorCisobGV0ICgoeCAyKSkKKyAgKGdldHgpKQorICAgICBAcmVzdWx0 e30gMQorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorSGVyZSwgdGhlIHJlc3VsdCBvZiBA Y29kZXsoZ2V0eCl9IGlzIEBjb2RlezF9LiAgVW5kZXIgbGV4aWNhbCBiaW5kaW5nLAorQGNv ZGV7Z2V0eH0gZG9lc24ndCBzZWUgdGhlIHZhbHVlIGZyb20gb3VyIEBjb2Rle2xldH0gZXhw cmVzc2lvbi4KK1RoYXQncyBiZWNhdXNlIHRoZSBib2R5IG9mIEBjb2Rle2dldHh9IGlzIG91 dHNpZGUgb2YgdGhlIGJvZHkgb2Ygb3VyCitAY29kZXtsZXR9IGV4cHJlc3Npb24uICBTaW5j ZSBAY29kZXtnZXR4fSBpcyBkZWZpbmVkIGF0IHRoZSB0b3AsCitnbG9iYWwgbGV2ZWwgb2Yg b3VyIGNvZGUgKGkuZS5AOiBub3QgaW5zaWRlIHRoZSBib2R5IG9mIGFueSBAY29kZXtsZXR9 CitleHByZXNzaW9uKSwgaXQgbG9va3MgZm9yIGFuZCBmaW5kcyBAY29kZXt4fSBhdCB0aGUg Z2xvYmFsIGxldmVsIGFzCit3ZWxsLiAgV2hlbiBleGVjdXRpbmcgQGNvZGV7Z2V0eH0sIHRo ZSBjdXJyZW50IGdsb2JhbCB2YWx1ZSBvZgorQGNvZGV7eH0gaXMgQGNvZGV7MX0sIHNvIHRo YXQncyB3aGF0IEBjb2Rle2dldHh9IHJldHVybnMuCisKK0lmIHdlIHVzZSBkeW5hbWljIGJp bmRpbmcgaW5zdGVhZCwgdGhlIGJlaGF2aW9yIGlzIGRpZmZlcmVudDoKKworQGV4YW1wbGUK Kzs7OyAtKi0gbGV4aWNhbC1iaW5kaW5nOiBuaWwgLSotCisKKyhzZXRxIHggMCkKKworKGRl ZnVuIGdldHggKCkKKyAgeCkKKworKHNldHEgeCAxKQorCisobGV0ICgoeCAyKSkKKyAgKGdl dHgpKQorICAgICBAcmVzdWx0e30gMgorQGVuZCBleGFtcGxlCisKK0Bub2luZGVudAorTm93 LCB0aGUgcmVzdWx0IG9mIEBjb2RleyhnZXR4KX0gaXMgQGNvZGV7Mn0hICBUaGF0J3MgYmVj YXVzZSB1bmRlcgorZHluYW1pYyBiaW5kaW5nLCB3aGVuIGV4ZWN1dGluZyBAY29kZXtnZXR4 fSwgdGhlIGN1cnJlbnQgYmluZGluZyBmb3IKK0Bjb2Rle3h9IGF0IHRoZSB0b3Agb2Ygb3Vy IHN0YWNrIGlzIHRoZSBvbmUgZnJvbSBvdXIgQGNvZGV7bGV0fQorYmluZGluZy4gIFRoaXMg dGltZSwgQGNvZGV7Z2V0eH0gZG9lc24ndCBzZWUgdGhlIGdsb2JhbCB2YWx1ZSBmb3IKK0Bj b2Rle3h9LCBzaW5jZSBpdHMgYmluZGluZyBpcyBiZWxvdyB0aGUgb25lIGZyb20gb3VyIEBj b2Rle2xldH0KK2V4cHJlc3Npb24gaW4gdGhlIHN0YWNrIG9mIGJpbmRpbmdzLgorCisoU29t ZSB2YXJpYWJsZXMgYXJlIGFsc28gYGBzcGVjaWFsJycsIGFuZCB0aGV5IGFyZSBhbHdheXMg ZHluYW1pY2FsbHkKK2JvdW5kIGV2ZW4gd2hlbiBAY29kZXtsZXhpY2FsLWJpbmRpbmd9IGlz IEBjb2Rle3R9LiAgQHhyZWZ7ZGVmdmFyLCAsCitJbml0aWFsaXppbmcgYSBWYXJpYWJsZSB3 aXRoIEBjb2Rle2RlZnZhcn19LikKKwogQG5vZGUgaWYKIEBzZWN0aW9uIFRoZSBAY29kZXtp Zn0gU3BlY2lhbCBGb3JtCiBAZmluZGV4IGlmCkBAIC05MTMwLDEyICs5MjU1LDE0IEBAIGRl ZnZhcgogZ2l2ZW4gYW4gaW5pdGlhbCB2YWx1ZSBieSB1c2luZyB0aGUgQGNvZGV7ZGVmdmFy fSBzcGVjaWFsIGZvcm0uICBUaGUKIG5hbWUgY29tZXMgZnJvbSBgYGRlZmluZSB2YXJpYWJs ZScnLgogCi1UaGUgQGNvZGV7ZGVmdmFyfSBzcGVjaWFsIGZvcm0gaXMgc2ltaWxhciB0byBA Y29kZXtzZXRxfSBpbiB0aGF0IGl0IHNldHMKLXRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLiAg SXQgaXMgdW5saWtlIEBjb2Rle3NldHF9IGluIHR3byB3YXlzOiBmaXJzdCwKLWl0IG9ubHkg c2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGlmIHRoZSB2YXJpYWJsZSBkb2VzIG5v dCBhbHJlYWR5Ci1oYXZlIGEgdmFsdWUuICBJZiB0aGUgdmFyaWFibGUgYWxyZWFkeSBoYXMg YSB2YWx1ZSwgQGNvZGV7ZGVmdmFyfSBkb2VzCi1ub3Qgb3ZlcnJpZGUgdGhlIGV4aXN0aW5n IHZhbHVlLiAgU2Vjb25kLCBAY29kZXtkZWZ2YXJ9IGhhcyBhCi1kb2N1bWVudGF0aW9uIHN0 cmluZy4KK1RoZSBAY29kZXtkZWZ2YXJ9IHNwZWNpYWwgZm9ybSBpcyBzaW1pbGFyIHRvIEBj b2Rle3NldHF9IGluIHRoYXQgaXQKK3NldHMgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuICBJ dCBpcyB1bmxpa2UgQGNvZGV7c2V0cX0gaW4gdGhyZWUgd2F5czoKK2ZpcnN0LCBpdCBtYXJr cyB0aGUgdmFyaWFibGUgYXMgYGBzcGVjaWFsJycgc28gdGhhdCBpdCBpcyBhbHdheXMKK2R5 bmFtaWNhbGx5IGJvdW5kLCBldmVuIHdoZW4gQGNvZGV7bGV4aWNhbC1iaW5kaW5nfSBpcyBA Y29kZXt0fQorKEBweHJlZntIb3cgbGV0IEJpbmRzIFZhcmlhYmxlc30pLiAgU2Vjb25kLCBp dCBvbmx5IHNldHMgdGhlIHZhbHVlIG9mCit0aGUgdmFyaWFibGUgaWYgdGhlIHZhcmlhYmxl IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIHZhbHVlLiAgSWYgdGhlCit2YXJpYWJsZSBhbHJl YWR5IGhhcyBhIHZhbHVlLCBAY29kZXtkZWZ2YXJ9IGRvZXMgbm90IG92ZXJyaWRlIHRoZQor ZXhpc3RpbmcgdmFsdWUuICBUaGlyZCwgQGNvZGV7ZGVmdmFyfSBoYXMgYSBkb2N1bWVudGF0 aW9uIHN0cmluZy4KIAogKFRoZXJlIGlzIGEgcmVsYXRlZCBtYWNybywgQGNvZGV7ZGVmY3Vz dG9tfSwgZGVzaWduZWQgZm9yIHZhcmlhYmxlcwogdGhhdCBwZW9wbGUgY3VzdG9taXplLiAg SXQgaGFzIG1vcmUgZmVhdHVyZXMgdGhhbiBAY29kZXtkZWZ2YXJ9LgotLSAKMi4yNS4xCgo= --------------PqrLK7WcJY5KW0Q0vbC1M0wq--