From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: dalanicolai Newsgroups: gmane.emacs.devel Subject: Re: Question about (excessive?) ram usage when many overlays (with large vscroll) Date: Thu, 28 Apr 2022 18:28:10 +0200 Message-ID: References: <87levs2enb.fsf@yahoo.com> <87zgk5za1w.fsf@yahoo.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="0000000000001d120b05ddb96a5c" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="6041"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Emacs Devel To: Po Lu Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Thu Apr 28 18:29:21 2022 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 1nk716-0001PA-HV for ged-emacs-devel@m.gmane-mx.org; Thu, 28 Apr 2022 18:29:20 +0200 Original-Received: from localhost ([::1]:39498 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nk715-0004OO-E7 for ged-emacs-devel@m.gmane-mx.org; Thu, 28 Apr 2022 12:29:19 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:57864) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nk70F-0002ie-HP for emacs-devel@gnu.org; Thu, 28 Apr 2022 12:28:27 -0400 Original-Received: from mail-yb1-xb2a.google.com ([2607:f8b0:4864:20::b2a]:46840) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nk70C-0001qg-68 for emacs-devel@gnu.org; Thu, 28 Apr 2022 12:28:27 -0400 Original-Received: by mail-yb1-xb2a.google.com with SMTP id i38so9917877ybj.13 for ; Thu, 28 Apr 2022 09:28:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=r2fDPw3oZvjQWSq6KMJ5a89Nl7oFNzv+oGTFBLufBbo=; b=aRa+3jiXG8zX5Q8qZ5f8k+4iT4/ArQWpgh5Z/pEpKxWJ9IBL2Pyd65Aew7HET2EmeB zRmvltb9IhxSPoZFF4m/fHtlwqFXNsGRQquwTnqXps/8EOz94DLWctbHLAdD5+quRk9Z inZfC4+FqajY8/lQC8r3DJbVOvud5PQYPs4NvSPcpzB9HL93n7eyecYCU14Nz9VbS1wY RKQf2D1ZcUpgfzseHR8Fu1UYphUMMyvi8z4WmILKEIIUTdaebfZ6ajiUAOv72+nv7uV+ 6BiB2PCh3IkofbeNFxKahEfrysLXNjqMkoGeHaF2DG/6M/W+I+8GwPtQdiyYVh1TQzhf MVdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=r2fDPw3oZvjQWSq6KMJ5a89Nl7oFNzv+oGTFBLufBbo=; b=Ch+qgt4k/RknL7nYQVp9qIOIzQKRNEeIXaQ/iUxvkuwY4XtJnnC0zIdNJ8tHiG4RXZ ay2y0mN9hfsVngXuJXBURBNGLkbtYtn3gOLHfEzIxETkQ7YU5tppEH2NyXIoHqi4vOlv eDQzA721BiFbFIiK1iU8O/SsK5A9smTBzihLrNoxfRJOdVoDfd8QCe4uS3msz2l0nhKW hv45VJe9pByjWF75yzt9z83dnoK4yQ8gwLABDPolEfKM/nQk6TRiWM3vkxVmRXKJQBAn dow7CVXqhKrbBmpaYCJX1fXpHg8e9/O9d7GIFNeGzgXrGQ10YRbdCcoZyXetTnYOr4oH +tuw== X-Gm-Message-State: AOAM530UyhGe6XJoq49UeO0xbac4N6sbRmhKepMlymJX4PeiHso5FMpq YIwsZJLtNrWLCQB2fQR95XAFb516LGDVnNlMT5g= X-Google-Smtp-Source: ABdhPJw22PYcSCPB/rpIGzkns8ZwN7gt8gYTJEyE3FJFeG9aFzjO7DY1hWa3K1m8RTWxzRIyHesa7DFytpXhjEecO6I= X-Received: by 2002:a5b:cc6:0:b0:648:aae2:db82 with SMTP id e6-20020a5b0cc6000000b00648aae2db82mr13038194ybr.488.1651163302520; Thu, 28 Apr 2022 09:28:22 -0700 (PDT) In-Reply-To: <87zgk5za1w.fsf@yahoo.com> Received-SPF: pass client-ip=2607:f8b0:4864:20::b2a; envelope-from=dalanicolai@gmail.com; helo=mail-yb1-xb2a.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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_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" Xref: news.gmane.io gmane.emacs.devel:288944 Archived-At: --0000000000001d120b05ddb96a5c Content-Type: multipart/alternative; boundary="0000000000001d120a05ddb96a5a" --0000000000001d120a05ddb96a5a Content-Type: text/plain; charset="UTF-8" Thank you Po, for your explanations. Indeed this clears things up a little, but unfortunately my question was not 'precise enough', for the answer to 'solve' the issue that motivated this question. (I wanted to keep my `image-mode.el` out of the question, but I guess it is necessary to add it to explain the issue I am experiencing). So I have rewritten `image-mode.el` to scroll by `line + vscroll` instead of using vscroll only. This solves the issue with the RAM usage for 'large documents'. Additionally, it made the code a little 'simpler', which is a welcome 'side effect' (I got rid of the 'gap' (page separation) overlays, and instead added margins to the images. So now the buffer contents is just single spaces on separate lines, where the number of lines is equal to the number of `images/pages`. The 'gap' color can be configured by adding the overlay's face background). It seems to work mostly correct (the 'scrolling' look a tiny bit less smooth than with the pure vscroll version, but I would say it is very acceptable). Anyway, I hope someone can quickly have a look at the issue explained below (this should take less than a minute). So let me quickly provide some context for the issue. Currently, each overlay is overlaid on a single space on separate lines. So the contents of the buffer is a single space (holding a page overlay) on every line. So to jump to the next page, I can simply use 'forward-line'. Now this works fine when the page is 'off-window` but when the next page is already within view ('on-window'), then going to the next line does not position that line at the top of the window, nor makes it the current `window-start. To get it at the top of the window, I could subsequently call `(set-window-start nil (point))`, but then subsequently, `set-window-vscroll` does not work. To make `set-window-vscroll` have effect, I can add a `redisplay` just before I call it. This works, but the 'jump' gets very/unacceptably ugly (you see the 'recentering' steps taking place). However, when the next page is 'off-window' than using the 'forward-line' works directly, and the page jump looks smooth. So to reproduce it from `emacs -Q` you can just load the `image-roll.el` file that I will attach here, then do `M-x image-roll-demo` and scroll down using the arrow keys until you see the page transition between page one and two. Now press the `page down` (PgDn) button to jump to the next page. Because page two is already 'on-window' this only moves the cursor one page down. If you now press a second time `PgDn` then, because page 3 is still `off-window`, the jump takes place how it should. I would be happy, if someone could tell me how I could 'solve' this issue. Otherwise, all scrolling functions work fine, although I did not yet take care of the 'edge cases' (i.e. first and last page). Also, I did not update the docstrings yet, so I am not asking for feedback on those. My only question is if someone could have a look at what I am describing above. On Thu, 28 Apr 2022 at 14:07, Po Lu wrote: > dalanicolai writes: > > > I have a question about this, namely: how to make a line the 'window > > start'? Using 'set-window-start` does not work. > > > > From 'emacs -Q' (which starts within the scratch buffer), immediately > > evaluate > > > > (set-window-start nil (point)) > > > > to set the 'new' window start. Subsequently do > > > > (set-window-vscroll nil 1) > > > > it will scroll from the start of the buffer, and not from the 'new' > > window start as I would expect > > That's because the point is obscured after the vscroll is applied, so > the display is recentered. You have to move point to some location that > is at least partially visible after the vscroll if you set > `make-cursor-line-fully-visible' to t, or a location that is fully > visible otherwise. > --0000000000001d120a05ddb96a5a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Thank you Po, for your explanations. Indeed this clea= rs things
up a little, but unfortunately my question was not '= ;precise enough',
for the answer to 'solve' the issue= that motivated this question.
(I wanted to keep my `image-mode.e= l` out of the question, but I
guess it is necessary to add it to = explain the issue I am experiencing).

So I have re= written `image-mode.el` to scroll by `line + vscroll` instead
of = using vscroll only. This solves the issue with the RAM usage for
= 'large documents'.
Additionally, it made the code a l= ittle 'simpler', which is a welcome 'side effect'
(I got rid of the 'gap' (page separation) overlays, and instead ad= ded margins
=C2=A0to the images. So now the buffer contents is ju= st single spaces=C2=A0 on separate
lines, where the number of lin= es is equal to the number of `images/pages`.
The 'gap' co= lor can be configured by adding the overlay's face background).
It seems to work mostly correct (the 'scrolling' look a tiny= bit less smooth than
with the pure vscroll version, but I would = say it is very acceptable).

Anyway, I hope someone= can quickly have a look at the issue explained below
(this s= hould take less than a minute). So let me quickly provide some context
for the issue.

Currently, each overlay is ov= erlaid on a single space on separate lines. So the
contents of th= e buffer is a single space (holding a page overlay) on every line.
So to jump to the next page, I can simply use 'forward-line'. Now= this works fine
when the page is 'off-window` but when the n= ext page is already within view
('on-window'), then going= to the next line does not position that line at the top of
the w= indow, nor makes it the current `window-start. To get it at the top of the<= /div>
=C2=A0window, I could subsequently call `(set-window-start nil (p= oint))`,
but then subsequently, `set-window-vscroll` does not wor= k. To make
`set-window-vscroll` have effect, I can add a `redispl= ay` just before I call it.
This works, but the 'jump' get= s very/unacceptably ugly (you see the 'recentering'
steps= taking place).

However, when the next page is = 9;off-window' than using the 'forward-line' works
dir= ectly, and the page jump looks smooth.

So to repro= duce it from `emacs -Q` you can just load the `image-roll.el` file that I
will attach here, then do `M-x image-roll-demo` and scroll down us= ing the arrow
keys until you see the page transition between page= one and two. Now press the
`page down` (PgDn) button to jump= to the next page.

Because page two is already = 9;on-window' this only moves the cursor one page down.

If you now press a second time `PgDn` then, because page 3 is stil= l `off-window`,
the jump takes place how it should.
I would be happy, if someone could tell me how I could 'sol= ve' this issue. Otherwise,
all scrolling functions work fine,= although I did not yet take care of the 'edge cases'
(i.= e. first and last page). Also, I did not update the docstrings yet, so I am= not asking
for feedback on those. My only question is if someone= could have a look at what I am
describing above.
=
On Thu= , 28 Apr 2022 at 14:07, Po Lu <lua= ngruo@yahoo.com> wrote:
dalanicolai <dalanicolai@gmail.com> writes:

> I have a question about this, namely: how to make a line the 'wind= ow
> start'?=C2=A0 Using 'set-window-start` does not work.
>
> From 'emacs -Q' (which starts within the scratch buffer), imme= diately
> evaluate
>
> (set-window-start nil (point))
>
> to set the 'new' window start. Subsequently do
>
> (set-window-vscroll nil 1)
>
> it will scroll from the start of the buffer, and not from the 'new= '
> window start as I would expect

That's because the point is obscured after the vscroll is applied, so the display is recentered.=C2=A0 You have to move point to some location th= at
is at least partially visible after the vscroll if you set
`make-cursor-line-fully-visible' to t, or a location that is fully
visible otherwise.
--0000000000001d120a05ddb96a5a-- --0000000000001d120b05ddb96a5c Content-Type: text/x-emacs-lisp; charset="US-ASCII"; name="image-roll.el" Content-Disposition: attachment; filename="image-roll.el" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l2j7yqd50 KHJlcXVpcmUgJ2ltYWdlLW1vZGUpCihyZXF1aXJlICdzdmcpCgooZGVmZ3JvdXAgaW1hZ2Utcm9s bCBuaWwKICAiSW1hZ2Ugcm9sbCBjb25maWd1cmF0aW9ucy4iKQoKKGRlZmN1c3RvbSBpbWFnZS1y b2xsLXZlcnRpY2FsLW1hcmdpbiAyCiAgIlBhZ2UgZ2FwIGhlaWdodC4iCiAgOnR5cGUgJ2ludGVn ZXIpCgooZGVmY3VzdG9tIGltYWdlLXJvbGwtc3RlcC1zaXplCiAgKGxhbWJkYSAoKQogICAgKGxl dCogKChvIChpbWFnZS1yb2xsLXBhZ2Utb3ZlcmxheSkpCiAgICAgICAgICAgKHMgKG92ZXJsYXkt Z2V0IG8gJ2Rpc3BsYXkpKQogICAgICAgICAgICh3IChpbWFnZS1wcm9wZXJ0eSBzIDp3aWR0aCkp KQogICAgICAoaWYgdwogICAgICAgICAgKCogNTAKICAgICAgICAgICAgICgvICAoZmxvYXQgKGlm IChjb25zcCB3KSAoY2FyIHcpIHcpKQogICAgICAgICAgICAgICAgICh3aW5kb3ctcGl4ZWwtaGVp Z2h0KSkpCiAgICAgICAgNTApKSkKICAiU2Nyb2xsIHN0ZXAgc2l6ZS4KVGhlIHZhbHVlIGNhbiBi ZSBlaXRoZXIgYSBudW1iZXIgb3IgYSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vCmFyZ3VtZW50cyBh bmQgcmV0dXJucyBhIHBvc2l0aXZlIG51bWJlci4gSWYgdGhlIG51bWJlciBpcyBlcXVhbAp0byBv ciBsYXJnZXIgdGhhbiAxLCBpdCByZXByZXNlbnRzIHBpeGVsIHVuaXRzLiBPdGhlcndpc2UsIGlm IHRoZQp2YWx1ZSBpcyBiZXR3ZWVuIDAgYW5kIDEsIGl0IHJlcHJlc2VudHMgYSBmcmFjdGlvbiBv ZiB0aGUgY3VycmVudApwYWdlIGhlaWdodC4iCiAgOnR5cGUgJyhjaG9pY2UgZnVuY3Rpb24gaW50 ZXJnZXIgZmxvYXQpKQoKKGRlZmN1c3RvbSBpbWFnZS1yb2xsLWNlbnRlciBuaWwKICAiV2hlbiBu b24tbmlsLCBjZW50ZXIgdGhlIHJvbGwgaG9yaXpvbnRhbGx5IGluIHRoZSB3aW5kb3cuIgogIDp0 eXBlICdib29sZWFuKQoKCihkZWZ2YXItbG9jYWwgaW1hZ2Utcm9sbC1udW1iZXItb2YtcGFnZXMt ZnVuY3Rpb24gbmlsCiAgIkZ1bmN0aW9uIHRoYXQgc2hvdWxkIHJldHVybiB0aGUgdG90YWwgbnVt YmVyIG9mIHBhZ2VzLgpUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyIHdpdGgg dGhlIHRvdGFsIG51bWJlciBvZgpwYWdlcyBpbiB0aGUgZG9jdW1lbnQuIikKCihkZWZ2YXItbG9j YWwgaW1hZ2Utcm9sbC1wYWdlLXNpemVzLWZ1bmN0aW9uIG5pbAogICJGdW5jdGlvbiB0aGF0IHNo b3VsZCByZXR1cm4gcGFnZS1zaXplcyBvZiBkb2N1bWVudC4KVGhlIGZ1bmN0aW9uIHNob3VsZCBy ZXR1cm4gYSBsaXN0IG9mIGNvbnNlcyBvZiB0aGUgZm9ybSAoV0lEVEggLgpIRUlHSFQpLCBib3Ro IG51bWJlcnMuIikKCihkZWZ2YXItbG9jYWwgaW1hZ2Utcm9sbC1zZXQtcmVkaXNwbGF5LWZsYWct ZnVuY3Rpb24gbmlsKQoKKGRlZnZhci1sb2NhbCBpbWFnZS1yb2xsLWRpc3BsYXktcGFnZSAnaW1h Z2Utcm9sbC1kZW1vLWRpc3BsYXktcGFnZQogICJGdW5jdGlvbiB0aGF0IHNldHMgdGhlIG92ZXJs YXkncyBkaXNwbGF5IHByb3BlcnR5LgpUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgdGhlIHBhZ2UgbnVt YmVyIGFzIGEgc2luZ2xlCmFyZ3VtZW50IChQQUdFKS4gVGhlIGZ1bmN0aW9uIHNob3VsZCB1c2Ug YChpbWFnZS1yb2xsLXBhZ2Utb3ZlcmxheQpQQUdFKScgdG8gYWRkIHRoZSBpbWFnZSBvZiB0aGUg cGFnZSBhcyB0aGUgb3ZlcmxheSdzCmRpc3BsYXktcHJvcGVydHkuIikKCihkZWZtYWNybyBpbWFn ZS1yb2xsLWRlYnVnIChvYmplY3QpCiAgYChwcm9nbiAocHJpbnQgKGZvcm1hdCAiJXMgPSAlcyIg LG9iamVjdCAoZXZhbCAsb2JqZWN0KSkKICAgICAgICAgICAgICAgICAjJ2V4dGVybmFsLWRlYnVn Z2luZy1vdXRwdXQpCiAgICAgICAgICAoZXZhbCAsb2JqZWN0KSkpCgo7OyBkZWZpbmUgYXMgbWFj cm8ncyBmb3Igc2V0Zi1hYmlsaXR5Cgo7OyBUT0RPIHVwZGF0ZSBkb2NzdHJpbmcKKGRlZm1hY3Jv IGltYWdlLXJvbGwtb3ZlcmxheXMgKCZvcHRpb25hbCB3aW5kb3cpCiAgIkxpc3Qgb2Ygb3Zlcmxh eXMgdGhhdCBtYWtlIHVwIGEgc2Nyb2xsLgpPdmVybGF5cyB3aXRoIGFuIGV2ZW4gaW5kZXggaG9s ZCB0aGUgcGFnZS1vdmVybGF5cywgd2hlcmUgdGhlCm92ZXJsYXkgYXQgaW5kZXggMCBob2xkcyBw YWdlIG51bWJlciAxLiBGb3IgZWFjaCBwYWdlLCBleGNlcHQgZm9yCnRoZSBsYXN0IHBhZ2UsIHRo ZSBzdWJzZXF1ZW50IGVsZW1lbnQgaG9sZHMgdGhlIGdhcC1vdmVybGF5LiIKICBgKGltYWdlLW1v ZGUtd2luZG93LWdldCAnb3ZlcmxheXMgLHdpbmRvdykpCgooZGVmbWFjcm8gaW1hZ2Utcm9sbC1w YWdlLW92ZXJsYXkgKCZvcHRpb25hbCBwYWdlKQogICJSZXR1cm4gdGhlIG92ZXJsYXkgdGhhdCBo b2xkIHBhZ2UgbnVtYmVyIFBBR0UuCkltcGxlbWVudGVkIGFzIG1hY3JvIHRvIG1ha2UgaXQgc2V0 ZidhYmxlLiIKICBgKG50aCAoMS0gLHBhZ2UpIChpbWFnZS1yb2xsLW92ZXJsYXlzKSkpCgooZGVm bWFjcm8gaW1hZ2Utcm9sbC1wYWdlLW92ZXJsYXktZ2V0IChwYWdlIHByb3ApCiAgIkdldCBvdmVy bGF5LXByb3BlcnR5IFBST1Agb2Ygb3ZlcmxheSBob2xkaW5nIHBhZ2UgbnVtYmVyIFBBR0UuCklt cGxlbWVudGVkIGFzIG1hY3JvIHRvIG1ha2UgaXQgc2V0ZidhYmxlLiIKICBgKG92ZXJsYXktZ2V0 IChudGggKDEtICxwYWdlKSAoaW1hZ2Utcm9sbC1vdmVybGF5cykpCiAgICAgICAgICAgICAgICAs cHJvcCkpCgooZGVmbWFjcm8gaW1hZ2Utcm9sbC1jdXJyZW50LXBhZ2UgKCZvcHRpb25hbCB3aW5k b3cpCiAgIlJldHVybiB0aGUgcGFnZSBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQg cGFnZS4KVGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgcGFnZSB0aGF0IG92ZXJsYXBzIHdpdGggdGhl IHdpbmRvdwpzdGFydCAodGhpcyBjaG9pY2Ugd2FzIG1hZGUgaW4gb3JkZXIgdG8gc2ltcGxpZnkg dGhlIHNjcm9sbGluZwpsb2dpYykiCiAgYChpbWFnZS1tb2RlLXdpbmRvdy1nZXQgJ3BhZ2UgLHdp bmRvdykpCgooZGVmdW4gaW1hZ2Utcm9sbC1vdmVybGF5LWhlaWdodCAocGFnZSkKICAoKyAoY2Ry IChpbWFnZS1yb2xsLXBhZ2Utb3ZlcmxheS1nZXQgcGFnZSAncGFnZS1zaXplKSkKICAgICAoKiAy IGltYWdlLXJvbGwtdmVydGljYWwtbWFyZ2luKSkpCgooZGVmdW4gaW1hZ2Utcm9sbC12aXNpYmxl LW92ZXJsYXlzICgpCiAgIlBhZ2UgbnVtYmVycyBjb3JyZXNwb25kaW5nIG9mIGN1cnJlbnRseSB2 aXNpYmxlIG92ZXJsYXlzLgpUaGUgbnVtYmVycyBhcmUgcmV0dXJuZWQgaW4gYSBsaXN0LiBPdmVy bGF5cyB0aGF0IGFyZSBvbmx5CnBhcnRpYWxseSB2aXNpYmxlIGFyZSBpbmNsdWRlZC4iCiAgKGxl dCogKHZpc2libGUKICAgICAgICAgKHBhZ2UgKGltYWdlLXJvbGwtY3VycmVudC1wYWdlKSkKICAg ICAgICAgKGF2YWlsYWJsZS1oZWlnaHQgKHdpbmRvdy1waXhlbC1oZWlnaHQpKSkKCiAgICAocHVz aCBwYWdlIHZpc2libGUpCiAgICAoY2wtZGVjZiBhdmFpbGFibGUtaGVpZ2h0ICgtIChpbWFnZS1y b2xsLW92ZXJsYXktaGVpZ2h0IHBhZ2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICh3aW5kb3ctdnNjcm9sbCBuaWwgdCkpKQogICAgKGNsLWluY2YgcGFnZSkKCiAgICAod2hpbGUg KD4gYXZhaWxhYmxlLWhlaWdodCAwKQogICAgICAocHVzaCBwYWdlIHZpc2libGUpCiAgICAgIChj bC1kZWNmIGF2YWlsYWJsZS1oZWlnaHQgKGltYWdlLXJvbGwtb3ZlcmxheS1oZWlnaHQgcGFnZSkp CiAgICAgIChjbC1pbmNmIHBhZ2UpKQogICAgdmlzaWJsZSkpCgooZGVmdW4gaW1hZ2Utcm9sbC11 bmRpc3BsYXktcGFnZSAocGFnZSkKICAiVW5kaXNwbGF5IFBBR0UuClRoZSBmdW5jdGlvbiByZXBs YWNlcyB0aGUgaW1hZ2UgZGlzcGxheSBwcm9wZXJ0eSBvZiB0aGUgb3ZlcmxheQpob2xkaW5nIFBB R0Ugd2l0aCBhIHNwYWNlLiBJdCBzaXplIGlzIGRldGVybWluZWQgZnJvbSB0aGUgaW1hZ2UKaXRz IGBpbWFnZS1zaXplJy4iCiAgKGRpc3BsYXktd2FybmluZyAnKGltYWdlLXJvbGwpIChmb3JtYXQg InVuZGlzcGxheSAlcyIgcGFnZSkKICAgICAgICAgICAgICAgICAgIDpkZWJ1ZyAiKmltYWdlLXJv bGwtZGVidWctbG9nKiIpCiAgKGxldCogKChvIChpbWFnZS1yb2xsLXBhZ2Utb3ZlcmxheSBwYWdl KSkKICAgICAgICAgKGltIChvdmVybGF5LWdldCBvICdkaXNwbGF5KSkKICAgICAgICAgKHMgKGlt YWdlLXNpemUgaW0gdCkpCiAgICAgICAgICh3IChjYXIgcykpCiAgICAgICAgIChoIChjZHIgcykp KQogICAgKG92ZXJsYXktcHV0IG8gJ2Rpc3BsYXkgYChzcGFjZSAuICg6d2lkdGggKCx3KSA6aGVp Z2h0ICgsaCkpKSkKICAgIChvdmVybGF5LXB1dCBvICdmYWNlIGAoOmJhY2tncm91bmQgImdyYXki KSkpKQoKKGRlZnVuIGltYWdlLXJvbGwtLW5ldy13aW5kb3ctZnVuY3Rpb24gKHdpbnByb3BzKQog ICJGdW5jdGlvbiBjYWxsZWQgZmlyc3QgYWZ0ZXIgZGlzcGxheWluZyBidWZmZXIgaW4gYSBuZXcg d2luZG93LgpJZiB0aGUgYnVmZmVyIGlzIG5ld2x5IGNyZWF0ZWQsIHRoZW4gaXQgZG9lcyBub3Qg Y29udGFpbiBhbnkKb3ZlcmxheSBhbmQgdGhpcyBmdW5jdGlvbiBjcmVhdGVzIGVyYXNlcyB0aGUg YnVmZmVyIGNvbnRlbnRzCmFmdGVyIHdoaWNoIGl0IGluc2VydHMgZW1wdHkgc3BhY2VzIHRoYXQg ZWFjaCBob2xkcyBhIHBhZ2Ugb3IgZ2FwCm92ZXJsYXkuIElmIHRoZSBidWZmZXIgYWxyZWFkeSBo YXMgb3ZlcmxheXMgKGkuZS4gYSBzZWNvbmQgb3IKc3Vic2VxdWVudCB3aW5kb3cgaXMgY3JlYXRl ZCksIHRoZSBmdW5jdGlvbiBzaW1wbHkgY29waWVzIHRoZQpvdmVybGF5cyBhbmQgYWRkcyB0aGUg bmV3IHdpbmRvdyBhcyB3aW5kb3cgb3ZlcmxheS1wcm9wZXJ0eSB0bwplYWNoIG92ZXJsYXkuIgog IDs7IChpZiAoPSAoYnVmZmVyLXNpemUpIDApCiAgKGlmIChub3QgKG92ZXJsYXlzLWF0IDEpKQog ICAgICAobGV0IChvdmVybGF5cwogICAgICAgICAgICAocGFnZXMgKGlmIGltYWdlLXJvbGwtbnVt YmVyLW9mLXBhZ2VzLWZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwgaW1h Z2Utcm9sbC1udW1iZXItb2YtcGFnZXMtZnVuY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgIGlt YWdlLXJvbGwtZGVtby1udW1iZXItb2YtcGFnZXMpKQogICAgICAgICAgICAod2luIChjYXIgd2lu cHJvcHMpKQogICAgICAgICAgICAoaW5oaWJpdC1yZWFkLW9ubHkgdCkpCgogICAgICAgIChlcmFz ZS1idWZmZXIpCgogICAgICAgIDs7IGhlcmUgd2Ugb25seSBhZGQgdGhlICdwYWdlJyBhbmQgJ3dp bmRvdycgb3ZlcmxheS1wcm9wZXJ0aWVzLCB3ZSBhZGQKICAgICAgICA7OyBtb3JlIHByb3BlcnRp ZXMvaW5mb3JtYXRpb24gYXMgc29vbiBhcyBpdCBiZWNvbWVzIGF2YWlsYWJsZSBpbiB0aGUKICAg ICAgICA7OyAnaW1hZ2Utcm9sbC1kaXNwbGF5JyBmdW5jdGlvbgogICAgICAgIChkb3RpbWVzIChp IHBhZ2VzKQogICAgICAgICAgKGxldCAoKGkgKDErIGkpKSkKICAgICAgICAgICAgKGluc2VydCAi ICIpCiAgICAgICAgICAgIChsZXQgKChwbyAobWFrZS1vdmVybGF5ICgxLSAocG9pbnQpKSAocG9p bnQpKSkpCiAgICAgICAgICAgICAgKG92ZXJsYXktcHV0IHBvICdwYWdlICBpKQogICAgICAgICAg ICAgIChvdmVybGF5LXB1dCBwbyAnd2luZG93IHdpbikKICAgICAgICAgICAgICAocHVzaCBwbyBv dmVybGF5cykpCiAgICAgICAgICAgIChpbnNlcnQgIlxuIikpKQogICAgICAgIChkZWxldGUtY2hh ciAtMSkKICAgICAgICAoaW1hZ2UtbW9kZS13aW5kb3ctcHV0ICdvdmVybGF5cyAobnJldmVyc2Ug b3ZlcmxheXMpKQogICAgICAgIChzZXQtYnVmZmVyLW1vZGlmaWVkLXAgbmlsKQoKICAgICAgICA7 OyB3ZSBtdXN0IHB1dCB0aGUgY3Vyc29yIGF0IHRoZSBgcG9pbnQtbWluJyBmb3IgdGhlIHZzY3Jv bGwKICAgICAgICA7OyBmdW5jdGlvbmFsaXR5IHRvIHdvcmsuIEl0IGlzIG9ubHkgcmVxdWlyZWQg aGVyZSBiZWNhdXNlIHdlIHdpbGwgbmV2ZXIKICAgICAgICA7OyBtb3ZlIHRoZSBjdXJzb3IgKHdl IHdpbGwgbWVyZWx5IHVwZGF0ZSBvdmVybGF5IHByb3BlcnRpZXMgYW5kIHZzY3JvbGwpCiAgICAg ICAgOzsgKGdvdG8tY2hhciAocG9pbnQtbWluKSkKCiAgICAgICAgOzsgcmVxdWlyZWQgdG8gbWFr ZSBgcGRmLXZpZXctcmVkaXNwbGF5LXNvbWUtd2luZG93cycgY2FsbCBgcGRmLXZpZXctcmVkaXNw bGF5JwogICAgICAgICh3aGVuLWxldCAoZnVuIGltYWdlLXJvbGwtc2V0LXJlZGlzcGxheS1mbGFn LWZ1bmN0aW9uKQogICAgICAgICAgKGZ1bmNhbGwgZnVuKSkpCiAgICAobGV0ICgob2xzIChtYXBj YXIgKGxhbWJkYSAobykKICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgKChvYyAoY29weS1v dmVybGF5IG8pKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKG92ZXJsYXktcHV0IG9jICd3 aW5kb3cgKGNhciB3aW5wcm9wcykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKSkKICAg ICAgICAgICAgICAgICAgICAgICAoaW1hZ2Utcm9sbC1vdmVybGF5cykpKSkKICAgICAgKGltYWdl LW1vZGUtd2luZG93LXB1dCAnb3ZlcmxheXMgb2xzIHdpbnByb3BzKSkpCiAgKGltYWdlLXJvbGwt Z290by1wYWdlIDEpKQoKKGRlZnVuIGltYWdlLXJvbGwtLXJlZGlzcGxheSAoJm9wdGlvbmFsIHdp bmRvdyBuby1yZWxhdGl2ZS12c2Nyb2xsKQogICJSZWRpc3BsYXkgdGhlIHNjcm9sbC4KQmVzaWRl cyB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBkaXJlY3RseSwgaXQgc2hvdWxkIGFs c28KYmUgYWRkZWQgdG8gdGhlIGB3aW5kb3ctY29uZmlndXJhdGlvbi1jaGFuZ2UtaG9vaycuCgpU aGUgYXJndW1lbnQgV0lORE9XIGlzIG5vdCB1c2UgaW4gdGhlIGJvZHksIGJ1dCBpdCBleGlzdHMg dG8gbWFrZQp0aGUgZnVuY3Rpb24gY29tcGF0aWJsZSB3aXRoIGBwZGYtdG9vbHMnIChpbiB3aGlj aCBjYXNlIGlzIGEKc3Vic3RpdHV0ZSBmb3IgYHBkZi12aWV3LXJlZGlzcGxheScpLgoKV2hlbiBO Ty1SRUxBVElWRS1TQ1JPTEwgaXMgbm9uLW5pbCwgdGhlbiB0aGUgcmVsYXRpdmUtc2Nyb2xsIGlz Cm5vdCBpbmNsdWRlZCB3aGVuIHNldHRpbmcgdGVoIHZzY3JvbGwgcG9zaXRpb24uIEZvciBleGFt cGxlIHRoaXMKaXMgdXNlZCBpbiBgcGRmLXZpZXctZ290by1wYWdlJyAoaW4gdGhlIGBwZGYtc2Ny b2xsLmVsJwpleHRlbnNpb24pIHRvIG1ha2UgaXQgc2Nyb2xsIHRvIHRoZSBzdGFydCBvZiB0aGUg cGFnZS4iCiAgKGRpc3BsYXktd2FybmluZyAnKGltYWdlLXJvbGwpIChmb3JtYXQgInJlZGlzcGxh eSAlcyIgKGNhciAoaW1hZ2UtbW9kZS13aW5wcm9wcykpKSA6ZGVidWcgIippbWFnZS1yb2xsLWRl YnVnLWxvZyoiKQoKICA7OyBOT1RFIHRoZSBgKHdoZW4gKGxpc3RwIGltYWdlLW1vZGUtd2lucHJv cHMtYWxpc3QpJyBmcm9tCiAgOzsgYGltYWdlLW1vZGUtcmVhcHBseS13aW5wcm9wcycgd2FzIHJl bW92ZWQgaGVyZSAoYnV0IGluIHRoZSBlbmQgbWlnaHQgdHVybgogIDs7IG91dCB0byBiZSByZXF1 aXJlZCkKCiAgOzsgQmV3YXJlOiB0aGlzIGNhbGwgdG8gaW1hZ2UtbW9kZS13aW5wcm9wcyBjYW4n dCBiZSBvcHRpbWl6ZWQgYXdheSwgYmVjYXVzZQogIDs7IGl0IG5vdCBvbmx5IGdldHMgdGhlIHdp bnByb3BzIGRhdGEgYnV0IHNldHMgaXQgdXAgaWYgbmVlZGVkIChlLmcuIGl0J3MgdXNlZAogIDs7 IGJ5IGRvYy12aWV3IHRvIGRpc3BsYXkgdGhlIGltYWdlIGluIGEgbmV3IHdpbmRvdykuCiAgKGlt YWdlLW1vZGUtd2lucHJvcHMgbmlsIHQpCiAgKGxldCogKChwYWdlcyBpbWFnZS1yb2xsLWRlbW8t bnVtYmVyLW9mLXBhZ2VzKQogICAgICAgICA7OyAocGFnZS1zaXplcyAobWFrZS1saXN0IHBhZ2Vz IChjb25zICgtICh3aW5kb3ctdGV4dC13aWR0aCBuaWwgdCkgMjAwKQogICAgICAgICA7OyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIDEuNCAod2luZG93LXRleHQtd2lkdGgg bmlsIHQpKSkpKQogICAgICAgICAocGFnZS1zaXplcyAoaWYgaW1hZ2Utcm9sbC1wYWdlLXNpemVz LWZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY2FsbCBpbWFnZS1yb2xsLXBh Z2Utc2l6ZXMtZnVuY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgKG1ha2UtbGlzdCBwYWdl cyAoaWYgKGZ1bmN0aW9ucCBpbWFnZS1yb2xsLWRlbW8tcGFnZS1zaXplKQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jYWxsIGltYWdlLXJvbGwtZGVtby1w YWdlLXNpemUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdl LXJvbGwtZGVtby1wYWdlLXNpemUpKSkpCiAgICAgICAgIDs7IChsZXQgKCh3ICh3aW5kb3ctcGl4 ZWwtd2lkdGgpKSkKICAgICAgICAgOzsgICAobWFrZS1saXN0IHBhZ2VzIChjb25zIHcgKCogMS40 IHcpKSkpKSkKCiAgICAgICAgIChuIDApKQogICAgICAgICA7OyAodnBvcyAwKSkKCiAgICAoZG9s aXN0IChwYWdlLXNpemUgcGFnZS1zaXplcykKICAgICAgKGxldCogKChwYWdlLXdpZHRoIChjYXIg cGFnZS1zaXplKSkKICAgICAgICAgICAgIChvdmVybGV5LWhlaWd0aCAoKyAoY2RyIHBhZ2Utc2l6 ZSkgKCogMiBpbWFnZS1yb2xsLXZlcnRpY2FsLW1hcmdpbikpKQogICAgICAgICAgICAgKG8gKG50 aCBuIChpbWFnZS1yb2xsLW92ZXJsYXlzKSkpKQogICAgICAgICh3aGVuIGltYWdlLXJvbGwtY2Vu dGVyCiAgICAgICAgICAob3ZlcmxheS1wdXQgbyAnYmVmb3JlLXN0cmluZwogICAgICAgICAgICAg ICAgICAgICAgICh3aGVuICg+ICh3aW5kb3ctcGl4ZWwtd2lkdGgpIHBhZ2Utd2lkdGgpCiAgICAg ICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAiICIgJ2Rpc3BsYXkKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGAoc3BhY2UgOmFsaWduLXRvCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgsKGZsb29yICgvICgtICh3aW5kb3ctcGl4 ZWwtd2lkdGgpIHBhZ2Utd2lkdGgpIDIpKSkpKSkpKQogICAgICAgIChvdmVybGF5LXB1dCBvICdk aXNwbGF5IGAoc3BhY2UgLiAoOndpZHRoICgscGFnZS13aWR0aCkgOmhlaWdodCAoLG92ZXJsZXkt aGVpZ3RoKSkpKQogICAgICAgIChvdmVybGF5LXB1dCBvICdmYWNlIGAoOmJhY2tncm91bmQgImdy YXkiKSkKICAgICAgICAob3ZlcmxheS1wdXQgbyAncGFnZS1zaXplIHBhZ2Utc2l6ZSkKICAgICAg ICAoc2V0cSBuICgrIG4gMSkpKSkpCiAgOzsgKGxldCAoKGN1cnJlbnQtcGFnZSAoY2FyIChpbWFn ZS1tb2RlLXdpbmRvdy1nZXQgJ2Rpc3BsYXllZC1wYWdlcykpKSkKICAobGV0IChkaXNwbGF5ZWQp CiAgICAoZG9saXN0IChwIChpbWFnZS1yb2xsLXZpc2libGUtb3ZlcmxheXMpKQogICAgICAoZnVu Y2FsbCBpbWFnZS1yb2xsLWRpc3BsYXktcGFnZSBwKQogICAgICAocHVzaCBwIGRpc3BsYXllZCkp CiAgOzsgKGltYWdlLW1vZGUtd2luZG93LXB1dCAncGFnZSAoY2FyIChsYXN0IGRpc3BsYXllZCkp KSA7IFRPRE8gY2hlY2sgaWYgcG9zc2libGUgdG8gdXNlICdkaXNwbGF5ZWQtcGFnZXMKICAoaW1h Z2UtbW9kZS13aW5kb3ctcHV0ICdkaXNwbGF5ZWQtcGFnZXMgKHJldmVyc2UgZGlzcGxheWVkKSkK ICAoaW1hZ2UtbW9kZS13aW5kb3ctcHV0ICd2aXNpYmxlLXBhZ2VzLXZzY3JvbGwtbGltaXQKICAg ICAgICAgICAgICAgICAgICAgICAgICgtIChhcHBseSAjJysgKG1hcGNhciAjJ2ltYWdlLXJvbGwt b3ZlcmxheS1oZWlnaHQgZGlzcGxheWVkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3 aW5kb3ctdGV4dC1oZWlnaHQgbmlsIHQpKSkpCiAgKHdoZW4tbGV0IChwIChpbWFnZS1yb2xsLWN1 cnJlbnQtcGFnZSkpCiAgICAoZ290by1saW5lIHApCiAgICA7OyAocmVkaXNwbGF5KQogICAgKGlt YWdlLXNldC13aW5kb3ctdnNjcm9sbCAob3IgKGltYWdlLW1vZGUtd2luZG93LWdldCAndnNjcm9s bCkgMTApKSkpCgooZGVmdW4gaW1hZ2Utcm9sbC1nb3RvLXBhZ2UgKHBhZ2UgJm9wdGlvbmFsIHdp bmRvdykKICAiR28gdG8gUEFHRSBpbiBQREYuCgpJZiBvcHRpb25hbCBwYXJhbWV0ZXIgV0lORE9X LCBnbyB0byBQQUdFIGluIGFsbCBgcGRmLXZpZXcnCndpbmRvd3MuIgogIChpbnRlcmFjdGl2ZQog ICAobGlzdCAoaWYgY3VycmVudC1wcmVmaXgtYXJnCiAgICAgICAgICAgICAocHJlZml4LW51bWVy aWMtdmFsdWUgY3VycmVudC1wcmVmaXgtYXJnKQogICAgICAgICAgIChyZWFkLW51bWJlciAiUGFn ZTogIikpKSkKICAodW5sZXNzIChhbmQgKD49IHBhZ2UgMSkKICAgICAgICAgICAgICAgKDw9IHBh Z2UgKGNvdW50LWxpbmVzIChwb2ludC1taW4pIChwb2ludC1tYXgpKSkpCiAgICAoZXJyb3IgIk5v IHN1Y2ggcGFnZTogJWQiIHBhZ2UpKQogIDs7ICh1bmxlc3Mgd2luZG93CiAgOzsgICAoc2V0cSB3 aW5kb3cKICA7OyAgICAgICAgIChpZiAocGRmLXV0aWwtcGRmLXdpbmRvdy1wKQogIDs7ICAgICAg ICAgICAgIChzZWxlY3RlZC13aW5kb3cpCiAgOzsgICAgICAgICAgIHQpKSkKICAoc2F2ZS1zZWxl Y3RlZC13aW5kb3cKICAgIDs7IFNlbGVjdCB0aGUgd2luZG93IGZvciB0aGUgaG9va3MgYmVsb3cu CiAgICAod2hlbiAod2luZG93LWxpdmUtcCB3aW5kb3cpCiAgICAgIChzZWxlY3Qtd2luZG93IHdp bmRvdyAnbm9yZWNvcmQpKQogICAgKGxldCAoKGNoYW5naW5nLXAKICAgICAgICAgICAobm90IChl cSBwYWdlIChpbWFnZS1yb2xsLWN1cnJlbnQtcGFnZSB3aW5kb3cpKSkpKQogICAgICAod2hlbiBj aGFuZ2luZy1wCiAgICAgICAgOzsgKHJ1bi1ob29rcyAncGRmLXZpZXctYmVmb3JlLWNoYW5nZS1w YWdlLWhvb2spCiAgICAgICAgKHNldGYgKGltYWdlLXJvbGwtY3VycmVudC1wYWdlIHdpbmRvdykg cGFnZSkKICAgICAgICA7OyAocnVuLWhvb2tzICdwZGYtdmlldy1jaGFuZ2UtcGFnZS1ob29rKSkK ICAgICAgKHdoZW4gKHdpbmRvdy1saXZlLXAgd2luZG93KQogICAgICAgIChpbWFnZS1yb2xsLS1y ZWRpc3BsYXkgd2luZG93KSkKICAgICAgOzsgKHdoZW4gY2hhbmdpbmctcAogICAgICA7OyAgIChw ZGYtdmlldy1kZWFjdGl2YXRlLXJlZ2lvbikKICAgICAgOzsgICAoZm9yY2UtbW9kZS1saW5lLXVw ZGF0ZSkKICAgICAgOzsgICAocnVuLWhvb2tzICdwZGYtdmlldy1hZnRlci1jaGFuZ2UtcGFnZS1o b29rKSkpKQogIG5pbCkpKSkKCihkZWZ1biBpbWFnZS1yb2xsLXVwZGF0ZS1kaXNwbGF5ZWQtcGFn ZXMgKCkKICAobGV0ICgob2xkIChwcmludCAoaW1hZ2UtbW9kZS13aW5kb3ctZ2V0ICdkaXNwbGF5 ZWQtcGFnZXMpICMnZXh0ZXJuYWwtZGVidWdnaW5nLW91dHB1dCkpCiAgICAgICAgKG5ldyAocHJp bnQgKGltYWdlLXJvbGwtdmlzaWJsZS1vdmVybGF5cykgIydleHRlcm5hbC1kZWJ1Z2dpbmctb3V0 cHV0KSkpCiAgICA7OyBkb2xpc3QgYmVjYXVzZSBpZiBpbWFnZXMvcGFnZXMgYXJlIHNtYWxsIGVu b3VnaCwgdGhlcmUgbWlnaHQgYmUKICAgIDs7IG11bHRpcGxlIGltYWdlIHRoYXQgbmVlZCB0byBn ZXQgdXBkYXRlZAogICAgKGRvbGlzdCAocCAoY2wtc2V0LWRpZmZlcmVuY2Ugb2xkIG5ldykpCiAg ICAgIChpbWFnZS1yb2xsLXVuZGlzcGxheS1wYWdlIHApCiAgICAgIChpbWFnZS1tb2RlLXdpbmRv dy1wdXQgJ2Rpc3BsYXllZC1wYWdlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRx IG9sZCAoZGVsZXRlIHAgb2xkKSkpKSA7IGltcG9ydGFudCB0byB1cGRhdGUvc2V0cSBvbGQgYmVm b3JlCiAgICA7OyBzZXR0aW5nL2FwcGVuZGluZyBuZXcgYmVsb3cKICAgIChkb2xpc3QgKHAgKGNs LXNldC1kaWZmZXJlbmNlIG5ldyBvbGQpKQogICAgICAoZnVuY2FsbCBpbWFnZS1yb2xsLWRpc3Bs YXktcGFnZSBwKQogICAgICAoaW1hZ2UtbW9kZS13aW5kb3ctcHV0ICdkaXNwbGF5ZWQtcGFnZXMg KHNldHEgb2xkIChhcHBlbmQgb2xkIChsaXN0IHApKSkpKQogICAgOzsgdXBkYXRlIGFsc28gdmlz aWJsZS1yYW5nZQogICAgKGltYWdlLW1vZGUtd2luZG93LXB1dCAndmlzaWJsZS1wYWdlcy12c2Ny b2xsLWxpbWl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgtIChhcHBseSAjJysgKG1hcGNh ciAjJ2ltYWdlLXJvbGwtb3ZlcmxheS1oZWlnaHQgbmV3KSkKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKHdpbmRvdy10ZXh0LWhlaWdodCBuaWwgdCkpKSkpCgooZGVmdW4gaW1hZ2Utcm9s bC1uZXh0LXBhZ2UgKCZvcHRpb25hbCBuKQogIChpbnRlcmFjdGl2ZSkKICAoY2wtaW5jZiAoaW1h Z2Utcm9sbC1jdXJyZW50LXBhZ2UpIChvciBuIDEpKQogIDs7IChzZXQtd2luZG93LXN0YXJ0IG5p bCAoKyAocG9pbnQpIDIpKQogIChpbWFnZS1yb2xsLS1yZWRpc3BsYXkpKQoKKGRlZnVuIGltYWdl LXJvbGwtcHJldmlvdXMtcGFnZSAoKQogIChpbnRlcmFjdGl2ZSkKICAoaW1hZ2Utcm9sbC1uZXh0 LXBhZ2UgLTEpKQoKKGRlZnVuIGltYWdlLXJvbGwtc2Nyb2xsLWZvcndhcmQgKCZvcHRpb25hbCBi YWNrd2FyZCBzY3JlZW4pCiAgKGludGVyYWN0aXZlKQogIChsZXQqICgoY3VycmVudC1wYWdlIChp bWFnZS1yb2xsLWN1cnJlbnQtcGFnZSkpCiAgICAgICAgIChjdXJyZW50LW92ZXJsYXktaGVpZ2h0 IChpbWFnZS1yb2xsLW92ZXJsYXktaGVpZ2h0IGN1cnJlbnQtcGFnZSkpCiAgICAgICAgICh2aXNp YmxlLXBhZ2VzLXZzY3JvbGwtbGltaXQgKGltYWdlLW1vZGUtd2luZG93LWdldCAndmlzaWJsZS1w YWdlcy12c2Nyb2xsLWxpbWl0KSkKICAgICAgICAgKHN0ZXAtc2l6ZSAoaWYgc2NyZWVuCiAgICAg ICAgICAgICAgICAgICAgICAgICh3aW5kb3ctdGV4dC1oZWlnaHQgbmlsIHQpCiAgICAgICAgICAg ICAgICAgICAgICBpbWFnZS1yb2xsLXN0ZXAtc2l6ZSkpCgogICAgICAgICA7OyBkZXRlcm1pbmUg bnVtYmVyIG9mIHBhZ2VzIHRvIGZvcndhcmQvYmFja3dhcmQKICAgICAgICAgOzsgKHJlcXVpcmVk IGlmIHBhZ2VzIGFyZSBzbWFsbCkKICAgICAgICAgKG4gMCkKICAgICAgICAgKGF2YWlsYWJsZS1o ZWlnaHQgc3RlcC1zaXplKQogICAgICAgICAocmVtYWluaW5nLWhlaWdodCBhdmFpbGFibGUtaGVp Z2h0KQogICAgICAgICBuZXctdnNjcm9sbCkKICAgIChjb25kIChiYWNrd2FyZAogICAgICAgICAg IChjbC1kZWNmIGF2YWlsYWJsZS1oZWlnaHQgKHdpbmRvdy12c2Nyb2xsIG5pbCB0KSkKICAgICAg ICAgICAod2hpbGUgKD4gYXZhaWxhYmxlLWhlaWdodCAwKQogICAgICAgICAgICAgKHNldHEgcmVt YWluaW5nLWhlaWdodCBhdmFpbGFibGUtaGVpZ2h0KQogICAgICAgICAgICAgKHNldHEgbiAoMSsg bikpCiAgICAgICAgICAgICAoY2wtZGVjZiBhdmFpbGFibGUtaGVpZ2h0IChpbWFnZS1yb2xsLW92 ZXJsYXktaGVpZ2h0ICgtIGN1cnJlbnQtcGFnZSBuKSkpKQogICAgICAgICAgIChzZXRxIG4gKC0g bikpKQogICAgICAgICAgKHQKICAgICAgICAgICAoY2wtZGVjZiBhdmFpbGFibGUtaGVpZ2h0ICgt IChpbWFnZS1yb2xsLW92ZXJsYXktaGVpZ2h0IGN1cnJlbnQtcGFnZSkKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICh3aW5kb3ctdnNjcm9sbCBuaWwgdCkpKQogICAgICAg ICAgICh3aGlsZSAoPiBhdmFpbGFibGUtaGVpZ2h0IDApCiAgICAgICAgICAgICAoc2V0cSByZW1h aW5pbmctaGVpZ2h0IGF2YWlsYWJsZS1oZWlnaHQpCiAgICAgICAgICAgICAoc2V0cSBuICgxKyBu KSkKICAgICAgICAgICAgIChjbC1kZWNmIGF2YWlsYWJsZS1oZWlnaHQgKGltYWdlLXJvbGwtb3Zl cmxheS1oZWlnaHQgKCsgY3VycmVudC1wYWdlIG4pKSkpKSkKCiAgICAod2hlbiBiYWNrd2FyZAog ICAgICAoc2V0cSBzdGVwLXNpemUgKC0gc3RlcC1zaXplKSkpCgogICAgKGltYWdlLXJvbGwtZGVi dWcgJ24pCgogICAgKGlmICg9IG4gMCkKICAgICAgICAoc2V0cSBuZXctdnNjcm9sbCAoKyAod2lu ZG93LXZzY3JvbGwgbmlsIHQpIHN0ZXAtc2l6ZSkpCiAgICAgIChzZXRxIG5ldy12c2Nyb2xsICgr ICh3aW5kb3ctdnNjcm9sbCBuaWwgdCkgcmVtYWluaW5nLWhlaWdodCkpKQoKCiAgICAoaWYgKGNv bmQgKCg8IG4gMCkKICAgICAgICAgICAgICAgKGZvcndhcmQtbGluZSBuKQogICAgICAgICAgICAg ICAoY2wtZGVjZiAoaW1hZ2Utcm9sbC1jdXJyZW50LXBhZ2UpKQogICAgICAgICAgICAgICAoaW1h Z2Utc2V0LXdpbmRvdy12c2Nyb2xsCiAgICAgICAgICAgICAgICAoLSAoaW1hZ2Utcm9sbC1vdmVy bGF5LWhlaWdodCAoaW1hZ2Utcm9sbC1jdXJyZW50LXBhZ2UpKQogICAgICAgICAgICAgICAgICAg cmVtYWluaW5nLWhlaWdodCkpKQogICAgICAgICAgICAgICgoPiBuIDApCiAgICAgICAgICAgICAg IChmb3J3YXJkLWxpbmUgbikKICAgICAgICAgICAgICAgKGNsLWluY2YgKGltYWdlLXJvbGwtY3Vy cmVudC1wYWdlKSBuKQogICAgICAgICAgICAgICAoaW1hZ2Utc2V0LXdpbmRvdy12c2Nyb2xsCiAg ICAgICAgICAgICAgICByZW1haW5pbmctaGVpZ2h0KSkKICAgICAgICAgICAgICAoKD4gKGltYWdl LXJvbGwtZGVidWcgJ25ldy12c2Nyb2xsKQogICAgICAgICAgICAgICAgICAoaW1hZ2Utcm9sbC1k ZWJ1ZyAndmlzaWJsZS1wYWdlcy12c2Nyb2xsLWxpbWl0KSkKICAgICAgICAgICAgICAgKGltYWdl LXNldC13aW5kb3ctdnNjcm9sbCBuZXctdnNjcm9sbCkpKQogICAgICAgIChpbWFnZS1yb2xsLXVw ZGF0ZS1kaXNwbGF5ZWQtcGFnZXMpCiAgICAgIChpbWFnZS1zZXQtd2luZG93LXZzY3JvbGwgbmV3 LXZzY3JvbGwpKSkpCgooZGVmdW4gaW1hZ2Utcm9sbC1zY3JvbGwtYmFja3dhcmQgKCkKICAoaW50 ZXJhY3RpdmUpCiAgKGltYWdlLXJvbGwtc2Nyb2xsLWZvcndhcmQgdCkpCgooZGVmdW4gaW1hZ2Ut cm9sbC1zY3JvbGwtc2NyZWVuLWZvcndhcmQgKCkKICAoaW50ZXJhY3RpdmUpCiAgKGltYWdlLXJv bGwtc2Nyb2xsLWZvcndhcmQgbmlsIHQpKQoKKGRlZnVuIGltYWdlLXJvbGwtc2Nyb2xsLXNjcmVl bi1iYWNrd2FyZCAoKQogIChpbnRlcmFjdGl2ZSkKICAoaW1hZ2Utcm9sbC1zY3JvbGwtZm9yd2Fy ZCB0IHQpKQoKKGRlZnVuIGltYWdlLXJvbGwtZGVtby1kaXNwbGF5LXBhZ2UgKHBhZ2UpCiAgIlJl dHVybiBkZW1vIGltYWdlIG9mIHBhZ2UuClRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGlt YWdlLXJvbGwtZGVtby4iCiAgKGltYWdlLXJvbGwtZGVidWcgJ3BhZ2UpCiAgKGxldCogKChvIChp bWFnZS1yb2xsLXBhZ2Utb3ZlcmxheSBwYWdlKSkKICAgICAgICAgKHMgKGNkciAob3ZlcmxheS1n ZXQgbyAnZGlzcGxheSkpKQogICAgICAgICAodyAoY2FyIChwbGlzdC1nZXQgcyA6d2lkdGgpKSkK ICAgICAgICAgKGggKGNhciAocGxpc3QtZ2V0IHMgOmhlaWdodCkpKQogICAgICAgICAoc3ZnIChz dmctY3JlYXRlIHcgaCkpKQogICAgKHVubGVzcyB3IChwcmludCAiTk8gVyIgIydleHRlcm5hbC1k ZWJ1Z2dpbmctb3V0cHV0KSkKICAgIChzdmctcmVjdGFuZ2xlIHN2ZyAwIDAgdyBoIDpmaWxsLWNv bG9yICJ3aGl0ZSIpCiAgICAoc3ZnLXRleHQgc3ZnCiAgICAgICAgICAgICAgKG51bWJlci10by1z dHJpbmcgcGFnZSkKICAgICAgICAgICAgICA6Zm9udC1zaXplICI0MCIKICAgICAgICAgICAgICA6 ZmlsbCAiYmxhY2siCiAgICAgICAgICAgICAgOnggMjAKICAgICAgICAgICAgICA6eSA1MCkKICAg ICh3aGVuIGltYWdlLXJvbGwtY2VudGVyCiAgICAgIChvdmVybGF5LXB1dCBvICdiZWZvcmUtc3Ry aW5nCiAgICAgICAgICAgICAgICAgICAod2hlbiAoPiAod2luZG93LXBpeGVsLXdpZHRoKSB3KQog ICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAiICIgJ2Rpc3BsYXkKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgYChzcGFjZSA6YWxpZ24tdG8KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoLChmbG9vciAoLyAoLSAod2luZG93LXBpeGVsLXdpZHRo KSB3KSAyKSkpKSkpKSkKICAgIChvdmVybGF5LXB1dCBvICdkaXNwbGF5IChzdmctaW1hZ2Ugc3Zn IDptYXJnaW4gYCgwIC4gLGltYWdlLXJvbGwtdmVydGljYWwtbWFyZ2luKSkpKSkKCihkZWZpbmUt ZGVyaXZlZC1tb2RlIGltYWdlLXJvbGwtbW9kZSBzcGVjaWFsLW1vZGUgIkltYWdlIFJvbGwiCiAg Ozsgd2UgZG9uJ3QgdXNlIGAoaW1hZ2UtbW9kZS1zZXR1cC13aW5wcm9wcyknIGJlY2F1c2UgaXQg d291bGQgYWRkaXRpb25hbGx5CiAgOzsgYWRkIGBpbWFnZS1tb2RlLXJlYXBwbHktd2lucHJvcHMn IHRvIHRoZQogIDs7IGB3aW5kb3ctY29uZmlndXJhdGlvbi1jaGFuZ2UtaG9vaycsIGJ1dCBgaW1h Z2Utcm9sbC0tcmVkaXNwbGF5JyBhbHJlYWR5CiAgOzsgcmVhcHBsaWVzIHRoZSB2c2Nyb2xsLCBz byB3ZSBzaW1wbHkgaW5pdGlhbGl6ZSB0aGUKICA7OyBgaW1hZ2UtbW9kZS13aW5wcm9wcy1hbGlz dCcgaGVyZSwgYW5kIGFkZCBsaW5lcyBmcm9tCiAgOzsgYGltYWdlLW1vZGUtcmVhcHBseS13aW5w cm9wcycgYXQgdGhlIHN0YXJ0IG9mIGBpbWFnZS1yb2xsLS1yZWRpc3BsYXknLgogIChhZGQtaG9v ayAnd2luZG93LWNvbmZpZ3VyYXRpb24tY2hhbmdlLWhvb2sgJ2ltYWdlLXJvbGwtLXJlZGlzcGxh eSBuaWwgdCkKICAoYWRkLWhvb2sgJ2ltYWdlLW1vZGUtbmV3LXdpbmRvdy1mdW5jdGlvbnMgJ2lt YWdlLXJvbGwtLW5ldy13aW5kb3ctZnVuY3Rpb24gbmlsIHQpCiAgKHVubGVzcyAobGlzdHAgaW1h Z2UtbW9kZS13aW5wcm9wcy1hbGlzdCkKICAgIChzZXRxIGltYWdlLW1vZGUtd2lucHJvcHMtYWxp c3QgbmlsKSkpCjs7IChhZGQtaG9vayAnd2luZG93LWNvbmZpZ3VyYXRpb24tY2hhbmdlLWhvb2sK OzsgICAgICAgICAgICMnaW1hZ2UtbW9kZS1yZWFwcGx5LXdpbnByb3BzIG5pbCB0KSkKOzsgKGlt YWdlLW1vZGUtc2V0dXAtd2lucHJvcHMpKQoKKHNldHEgaW1hZ2Utcm9sbC1tb2RlLW1hcAogICAg ICAobGV0ICgobWFwIChtYWtlLXNwYXJzZS1rZXltYXApKSkKICAgICAgICAoZGVmaW5lLWtleSBt YXAgKGtiZCAiPGRvd24+IikgJ2ltYWdlLXJvbGwtc2Nyb2xsLWZvcndhcmQpCiAgICAgICAgKGRl ZmluZS1rZXkgbWFwIChrYmQgIjx1cD4iKSAnaW1hZ2Utcm9sbC1zY3JvbGwtYmFja3dhcmQpCiAg ICAgICAgKGRlZmluZS1rZXkgbWFwIChrYmQgIjxuZXh0PiIpICdpbWFnZS1yb2xsLW5leHQtcGFn ZSkKICAgICAgICAoZGVmaW5lLWtleSBtYXAgKGtiZCAiPHByaW9yPiIpICdpbWFnZS1yb2xsLXBy ZXZpb3VzLXBhZ2UpCiAgICAgICAgKGRlZmluZS1rZXkgbWFwIChrYmQgIlMtPG5leHQ+IikgJ2lt YWdlLXJvbGwtc2Nyb2xsLXNjcmVlbi1mb3J3YXJkKQogICAgICAgIChkZWZpbmUta2V5IG1hcCAo a2JkICJTLTxwcmlvcj4iKSAnaW1hZ2Utcm9sbC1zY3JvbGwtc2NyZWVuLWJhY2t3YXJkKQogICAg ICAgIG1hcCkpCgood2hlbiAoZmVhdHVyZXAgJ2V2aWwpCiAgKGV2aWwtZGVmaW5lLWtleSAnbW90 aW9uIGltYWdlLXJvbGwtbW9kZS1tYXAKICAgICJqIiAnaW1hZ2Utcm9sbC1zY3JvbGwtZm9yd2Fy ZAogICAgImsiICdpbWFnZS1yb2xsLXNjcm9sbC1iYWNrd2FyZAogICAgIkoiICdpbWFnZS1yb2xs LW5leHQtcGFnZQogICAgIksiICdpbWFnZS1yb2xsLXByZXZpb3VzLXBhZ2UKICAgIChrYmQgIkMt aiIpICdpbWFnZS1yb2xsLXNjcm9sbC1zY3JlZW4tZm9yd2FyZAogICAgKGtiZCAiQy1rIikgJ2lt YWdlLXJvbGwtc2Nyb2xsLXNjcmVlbi1iYWNrd2FyZCkpCgooZGVmdW4gaW1hZ2Utcm9sbC1kZW1v ICgmb3B0aW9uYWwgcGFnZS1zaXplIHBhZ2VzKQogIChpbnRlcmFjdGl2ZSkKICAod2l0aC1jdXJy ZW50LWJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIippbWFnZS1yb2xsLWRlbW8qIikKICAgIChl cmFzZS1idWZmZXIpCiAgICAoaW1hZ2Utcm9sbC1tb2RlKQogICAgKHNldHEgY3Vyc29yLXR5cGUg bmlsKQogICAgKHNldHEgaW1hZ2Utcm9sbC1zdGVwLXNpemUgNTApCiAgICAoc2V0cS1sb2NhbCBp bWFnZS1yb2xsLWRlbW8tcGFnZS1zaXplIChvciBwYWdlLXNpemUKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKCkKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCAoKHcgKHdpbmRvdy1waXhlbC13aWR0 aCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChj b25zIHcgKCogMS40IHcpKSkpKSkKICAgIChzZXRxLWxvY2FsIGltYWdlLXJvbGwtZGVtby1udW1i ZXItb2YtcGFnZXMgKG9yIHBhZ2VzIDEwMDApKQogICAgKHNldHEgaW1hZ2Utcm9sbC1jZW50ZXIg dCkKICAgIChzd2l0Y2gtdG8tYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpKSkK --0000000000001d120b05ddb96a5c--