From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Robert Weiner Newsgroups: gmane.emacs.devel Subject: display-until.el - Display a window or frame topmost in the frame stack until a condition or timeout occurs Date: Sun, 17 Dec 2017 12:28:08 -0500 Message-ID: Reply-To: rswgnu@gmail.com NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="001a113d70187f782e05608c908b" X-Trace: blaine.gmane.org 1513531629 30423 195.159.176.226 (17 Dec 2017 17:27:09 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sun, 17 Dec 2017 17:27:09 +0000 (UTC) To: emacs-devel Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Dec 17 18:27:04 2017 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eQciM-0007Rw-O4 for ged-emacs-devel@m.gmane.org; Sun, 17 Dec 2017 18:27:03 +0100 Original-Received: from localhost ([::1]:54998 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eQckJ-00087g-EP for ged-emacs-devel@m.gmane.org; Sun, 17 Dec 2017 12:29:03 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:53274) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eQcjz-00082A-RQ for emacs-devel@gnu.org; Sun, 17 Dec 2017 12:28:45 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eQcjw-0001Lt-Iz for emacs-devel@gnu.org; Sun, 17 Dec 2017 12:28:43 -0500 Original-Received: from fencepost.gnu.org ([2001:4830:134:3::e]:50882) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eQcjw-0001LW-Da for emacs-devel@gnu.org; Sun, 17 Dec 2017 12:28:40 -0500 Original-Received: from mail-qt0-f180.google.com ([209.85.216.180]:40717) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.82) (envelope-from ) id 1eQcjw-00015x-0n for emacs-devel@gnu.org; Sun, 17 Dec 2017 12:28:40 -0500 Original-Received: by mail-qt0-f180.google.com with SMTP id u42so17534350qte.7 for ; Sun, 17 Dec 2017 09:28:39 -0800 (PST) X-Gm-Message-State: AKGB3mLXYT9VUlW5afAuI9zDW2wmOrXI4HUmV5yOuqWiGKBjwpdu6MAu KXqWcSAjVgeYlw7houjASWC1VHSi5XZQ3C7qxAY= X-Google-Smtp-Source: ACJfBosiOhAYn9oq6Gb8Cjv7lkJJuq1G+8EPsfMoDHDykqffQ9RvtLRG+SrmjlLtCWyS5C9M96ED4398p/A8vZbWGWs= X-Received: by 10.200.51.143 with SMTP id c15mr32543832qtb.46.1513531719474; Sun, 17 Dec 2017 09:28:39 -0800 (PST) Original-Received: by 10.200.55.124 with HTTP; Sun, 17 Dec 2017 09:28:08 -0800 (PST) X-Gmail-Original-Message-ID: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2001:4830:134:3::e X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 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.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:221176 Archived-At: --001a113d70187f782e05608c908b Content-Type: multipart/alternative; boundary="001a113d70187f782b05608c9089" --001a113d70187f782b05608c9089 Content-Type: text/plain; charset="UTF-8" If you have followed the lengthy recent discussions here: https://lists.gnu.org/archive/html/emacs-devel/2017-12/msg00418.html and https://lists.gnu.org/archive/html/emacs-devel/2017-12/msg00372.html on temporarily displaying frames when multiple overlapping frames are on screen, then you know this is a complex issue and hard to get right. I suggested a higher level programming model for this, so I wrote a library to make this easy: display-until.el. Please try it out and send any improvement suggestions. I would like to see this code added to core Emacs if it is acceptable and someone will help me add the external documentation and commits needed for it. The library is attached and the commentary is included below. -- Bob ----- # display-until - Display a window or frame topmost in the frame stack until a condition or timeout occurs. This library temporarily displays an existing or new frame topmost in the frame stack. Then it restores the prior topmost frame as well as any prior visibility status of the temporarily displayed frame, e.g. if it was hidden or iconified. See the end of the file for sample usage expressions. It includes the following: Variable: display-until-delay - time in seconds to display a temporary frame or window Display Functions: display-window-until - given a window and optional buffer, display the buffer in the window, make the window's frame topmost for `display-until-delay' seconds, then return the window's frame to its prior visibility display-frame-until - given a frame and optional buffer, display the buffer in the frame's selected window, make the frame topmost for `display-until-delay' seconds, then return the frame to its prior visibility Utility Functions: display-until-get-frame-by-name - given a name string, return the matching frame or nil Utility Macros: display-until-condition-or-timeout - wait for a boolean condition or timeout seconds display-until-thread-condition-or-timeout - run a thread until a boolean condition or timeout seconds --001a113d70187f782b05608c9089 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
  https://lists.gnu.org/archive/html/emacs-devel=
/2017-12/msg00418.html
and
https://lists.gnu.org/archive/html/emacs-devel/2= 017-12/msg00372.html
on temporarily displaying frames when mul=
tiple overlapping frames are on screen, then you know this is a complex iss=
ue and hard to get right.  I suggested a higher level programming model for=
 this, so I wrote a library to make this easy: display-until.el.  Please tr=
y it out and send any improvement suggestions.
I would like to see this code added to core Emacs if it is acce=
ptable and someone will help me add the external documentation and commits =
needed for it.
The library is attac=
hed and the commentary is included below.
-- Bob
-----
# display-until - Display a window or frame topmost in the=
 frame stack until a condition or timeout occurs.
This library temporarily displays an existing or new frame t=
opmost in
the frame stack.  Then it restores the prior topmost frame as well
as any prior visibility status of the temporarily displayed frame,
e.g. if it was hidden or iconified.  See the end of the file for
sample usage expressions.


It includes the following:
  Variable:
    display-until-delay - time in seconds to display a temporary frame or
      window
     =20
  Display Functions:
    display-window-until - given a window and optional buffer, display the
      buffer in the window, make the window's frame topmost for
      `display-until-delay' seconds, then return the window's frame
      to its prior visibility

    display-frame-until - given a frame and optional buffer, display the
      buffer in the frame's selected window, make the frame topmost for
      `display-until-delay' seconds, then return the frame to its prior
      visibility

  Utility Functions:
    display-until-get-frame-by-name - given a name string, return the
      matching frame or nil

  Utility Macros:
    display-until-condition-or-timeout - wait for a boolean condition
      or timeout seconds
    display-until-thread-condition-or-timeout - run a thread until a boolea=
n
      condition or timeout seconds

--001a113d70187f782b05608c9089-- --001a113d70187f782e05608c908b Content-Type: application/octet-stream; name="display-until.el" Content-Disposition: attachment; filename="display-until.el" Content-Transfer-Encoding: base64 X-Attachment-Id: f_jbb1l87b0 Ozs7IGRpc3BsYXktdW50aWwuZWwgLS0tIHRlbXBvcmFyaWx5IGRpc3BsYXkgd2luZG93cyBhbmQg ZnJhbWVzICAtKi0gbGV4aWNhbC1iaW5kaW5nOiB0IC0qLQoKOzsgQ29weXJpZ2h0IChDKSAyMDE3 IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKOzsgQXV0aG9yOiBSb2JlcnQgV2VpbmVy Cjs7IE1haW50YWluZXI6IGVtYWNzLWRldmVsQGdudS5vcmcKOzsgS2V5d29yZHM6IGludGVybmFs Cjs7IFBhY2thZ2U6IGVtYWNzCjs7IFZlcnNpb246IDEuMAo7OyBPcmlnLURhdGU6IDE2LURlYy0x Nwo7OyBMYXN0LU1vZDogIDE3LURlYy0xNwoKOzsgVGhpcyBmaWxlIGNvdWxkIGJlY29tZSBwYXJ0 IG9mIEdOVSBFbWFjcy4KCjs7IEdOVSBFbWFjcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJl ZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cjs7IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cjs7IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCjs7 IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgo7OyBHTlUgRW1hY3MgaXMgZGlz dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKOzsgYnV0IFdJVEhP VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKOzsg TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl IHRoZQo7OyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKOzsg WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UKOzsgYWxvbmcgd2l0aCBHTlUgRW1hY3MuICBJZiBub3QsIHNlZSA8aHR0cHM6Ly93 d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKOzs7IENvbW1lbnRhcnk6Cgo7OyAoUlNXIHdvdWxkIGxp a2UgdGhpcyBjb2RlIHRvIGJlIGFkZGVkIHRvIGNvcmUgRW1hY3MgaWYgaXQgaXMKOzsgIGFjY2Vw dGFibGUuICBTb21lb25lIGVsc2Ugd2hvIGFkZHMgdG8gRW1hY3MgcmVndWxhcmx5IHdvdWxkIGhh dmUKOzsgIHRvIGFkZCB0aGUgTkVXUyBlbnRyeSwgRWxpc3AgTWFudWFsIGVudHJ5IGFuZCBjb21t aXQgdGhlIGNvZGUuCjs7ICBJbiB0aGF0IGNhc2UsIHRoZSB1dGlsdHkgbWFjcm9zIGFuZCBmdW5j dGlvbiBuYW1lcyBjb3VsZCBiZSBnZW5lcmFsaXplZCkuCgo7OyBUaGlzIGxpYnJhcnkgdGVtcG9y YXJpbHkgZGlzcGxheXMgYW4gZXhpc3Rpbmcgb3IgbmV3IGZyYW1lIHRvcG1vc3QgaW4KOzsgdGhl IGZyYW1lIHN0YWNrLiAgVGhlbiBpdCByZXN0b3JlcyB0aGUgcHJpb3IgdG9wbW9zdCBmcmFtZSBh cyB3ZWxsCjs7IGFzIGFueSBwcmlvciB2aXNpYmlsaXR5IHN0YXR1cyBvZiB0aGUgdGVtcG9yYXJp bHkgZGlzcGxheWVkIGZyYW1lLAo7OyBlLmcuIGlmIGl0IHdhcyBoaWRkZW4gb3IgaWNvbmlmaWVk LiAgU2VlIHRoZSBlbmQgb2YgdGhlIGZpbGUgZm9yCjs7IHNhbXBsZSB1c2FnZSBleHByZXNzaW9u cy4KCjs7IFRoaXMgbGlicmFyeSBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOgo7OyAgIFZhcmlhYmxl Ogo7OyAgICAgZGlzcGxheS11bnRpbC1kZWxheSAtIHRpbWUgaW4gc2Vjb25kcyB0byBkaXNwbGF5 IGEgdGVtcG9yYXJ5IGZyYW1lIG9yCjs7ICAgICAgIHdpbmRvdwo7Owo7OyAgIERpc3BsYXkgRnVu Y3Rpb25zOgo7OyAgICAgZGlzcGxheS13aW5kb3ctdW50aWwgLSBnaXZlbiBhIHdpbmRvdyBhbmQg b3B0aW9uYWwgYnVmZmVyLCBkaXNwbGF5IHRoZQo7OyAgICAgICBidWZmZXIgaW4gdGhlIHdpbmRv dywgbWFrZSB0aGUgd2luZG93J3MgZnJhbWUgdG9wbW9zdCBmb3IKOzsgICAgICAgYGRpc3BsYXkt dW50aWwtZGVsYXknIHNlY29uZHMsIHRoZW4gcmV0dXJuIHRoZSB3aW5kb3cncyBmcmFtZQo7OyAg ICAgICB0byBpdHMgcHJpb3IgdmlzaWJpbGl0eQo7Owo7OyAgICAgZGlzcGxheS1mcmFtZS11bnRp bCAtIGdpdmVuIGEgZnJhbWUgYW5kIG9wdGlvbmFsIGJ1ZmZlciwgZGlzcGxheSB0aGUKOzsgICAg ICAgYnVmZmVyIGluIHRoZSBmcmFtZSdzIHNlbGVjdGVkIHdpbmRvdywgbWFrZSB0aGUgZnJhbWUg dG9wbW9zdCBmb3IKOzsgICAgICAgYGRpc3BsYXktdW50aWwtZGVsYXknIHNlY29uZHMsIHRoZW4g cmV0dXJuIHRoZSBmcmFtZSB0byBpdHMgcHJpb3IKOzsgICAgICAgdmlzaWJpbGl0eQo7Owo7OyAg IFV0aWxpdHkgRnVuY3Rpb25zOgo7OyAgICAgZGlzcGxheS11bnRpbC1nZXQtZnJhbWUtYnktbmFt ZSAtIGdpdmVuIGEgbmFtZSBzdHJpbmcsIHJldHVybiB0aGUKOzsgICAgICAgbWF0Y2hpbmcgZnJh bWUgb3IgbmlsCjs7Cjs7ICAgVXRpbGl0eSBNYWNyb3M6Cjs7ICAgICBkaXNwbGF5LXVudGlsLWNv bmRpdGlvbi1vci10aW1lb3V0IC0gd2FpdCBmb3IgYSBib29sZWFuIGNvbmRpdGlvbgo7OyAgICAg ICBvciB0aW1lb3V0IHNlY29uZHMKOzsgICAgIGRpc3BsYXktdW50aWwtdGhyZWFkLWNvbmRpdGlv bi1vci10aW1lb3V0IC0gcnVuIGEgdGhyZWFkIHVudGlsIGEgYm9vbGVhbgo7OzsgICAgICBjb25k aXRpb24gb3IgdGltZW91dCBzZWNvbmRzCgo7OzsgQ29kZToKCihkZWZ2YXIgZGlzcGxheS11bnRp bC1kZWxheSAwLjUKICAiRGVsYXkgdGltZSBpbiBzZWNvbmRzIHRvIGRpc3BsYXkgYSB0ZW1wb3Jh cnkgZnJhbWUgb3Igd2luZG93LiIpCgooZGVmdmFyIGRpc3BsYXktdW50aWwtZnJhbWUtcGFyYW1l dGVycyBuaWwKICAiQWxpc3Qgb2YgZnJhbWUgcGFyYW1ldGVycyB0byBhcHBseSB0byBhbnkgbmV3 bHkgY3JlYXRlZCB0ZW1wb3JhcmlseSBkaXNwbGF5ZWQgZnJhbWUuIikKCihkZWZ1biBkaXNwbGF5 LXVudGlsLWdldC1mcmFtZS1ieS1uYW1lIChuYW1lKQogICJSZXR1cm4gYW55IGZyYW1lIG5hbWVk IE5BTUUsIGEgc3RyaW5nLCBlbHNlIG5pbC4iCiAgKGlmIChzdHJpbmdwIG5hbWUpCiAgICAgIChj YXRjaCAnZG9uZQoJKG1hcGMgKGxhbWJkYSAoZnJhbWUpCgkJKHdoZW4gKHN0cmluZy1lcXVhbCBu YW1lIChnZXQtZnJhbWUtbmFtZSBmcmFtZSkpCgkJICAodGhyb3cgJ2RvbmUgZnJhbWUpKSkKCSAg ICAgIChmcmFtZS1saXN0KSkKCW5pbCkKICAgIChlcnJvciAiKGRpc3BsYXktdW50aWwtZ2V0LWZy YW1lLWJ5LW5hbWUpOiBBcmd1bWVudCBtdXN0IGJlIGEgbmFtZSBzdHJpbmcsIG5vdCBgJXMnIiBu YW1lKSkpCgooZGVmbWFjcm8gZGlzcGxheS11bnRpbC1jb25kaXRpb24tb3ItdGltZW91dCAoY29u ZGl0aW9uIHRpbWVvdXQpCiAgIldhaXQgZm9yIHRoZSBlaXRoZXIgQ09ORElUSU9OIHRvIGJlY29t ZSBub24tbmlsIG9yIGZvciBUSU1FT1VUIHNlY29uZHMgdG8gZXhwaXJlLgpDT05ESVRJT04gbXVz dCBiZSBhIGJvb2xlYW4gcHJlZGljYXRlIGZvcm0uICBUSU1FT1VUIG11c3QgYmUgPiB6ZXJvLiIK ICBgKGxldCAoKGRlY3JlbWVudCAwLjA1KSkKICAgICAoc2V0cSB0aW1lb3V0ICx0aW1lb3V0KQog ICAgICh3aGlsZSAobm90IChvciAsY29uZGl0aW9uICg8PSB0aW1lb3V0IDApKSkKICAgICAgIChz bGVlcC1mb3IgZGVjcmVtZW50KQogICAgICAgKHNldHEgdGltZW91dCAoLSB0aW1lb3V0IGRlY3Jl bWVudCkpKSkpCgooZGVmbWFjcm8gZGlzcGxheS11bnRpbC10aHJlYWQtY29uZGl0aW9uLW9yLXRp bWVvdXQgKGNvbmRpdGlvbiB0aW1lb3V0KQogICJXYWl0IGluIGEgc2VwYXJhdGUgdGhyZWFkIGZv ciBlaXRoZXIgQ09ORElUSU9OIHRvIGJlY29tZSBub24tbmlsIG9yIGZvciBUSU1FT1VUIHNlY29u ZHMgdG8gZXhwaXJlLgpDT05ESVRJT04gbXVzdCBiZSBhIGJvb2xlYW4gcHJlZGljYXRlIGZvcm0u ICBUSU1FT1VUIG11c3QgYmUgPiB6ZXJvLiIKICBgKG1ha2UtdGhyZWFkIChsYW1iZGEgKCkKCQkg IChkaXNwbGF5LXVudGlsLWNvbmRpdGlvbi1vci10aW1lb3V0ICxjb25kaXRpb24gLHRpbWVvdXQp KSkpCgooZGVmdW4gZGlzcGxheS1mcmFtZS11bnRpbC1jb25kaXRpb24gKGZyYW1lICZvcHRpb25h bCBidWZmZXIgY29uZGl0aW9uKQogICJEaXNwbGF5IEZSQU1FIHRvcG1vc3Qgd2l0aCBvcHRpb25h bCBCVUZGRVIgaW4gaXRzIHNlbGVjdGVkIHdpbmRvdyB1bnRpbCBDT05ESVRJT04gb3IgYGRpc3Bs YXktdW50aWwtZGVsYXknIHNlY29uZHMuCgpGUkFNRSBtYXkgYmUgYW4gZXhpc3RpbmcsIGV2ZW4g aW52aXNpYmxlIGZyYW1lLCBmcmFtZSBuYW1lIG9yCm5pbC4gIElmIG5pbCwgdGhlIHNlbGVjdGVk IGZyYW1lIGlzIHVzZWQuICBJZiBGUkFNRSBpcyBhIHN0cmluZwphbmQgbm8gbGl2ZSBmcmFtZSB3 aXRoIHRoYXQgbmFtZSBpcyBmb3VuZCwgYSBuZXcgb25lIHdpdGggdGhlCm5hbWUgYW5kIGFueSBg ZGlzcGxheS11bnRpbC1mcmFtZS1wYXJhbWV0ZXJzJyBpcyBjcmVhdGVkLgoKQlVGRkVSIG1heSBi ZSBhbiBleGlzdGluZyBidWZmZXIgb3IgYnVmZmVyIG5hbWUuCgpBZnRlciBkaXNwbGF5LCBGUkFN RSdzIHByaW9yIHZpc2liaWxpdHkgc3RhdHVzIGlzIHJlc3RvcmVkLgpGUkFNRSdzIGRlcHRoIGlu IHRoZSBmcmFtZSBzdGFja2luZyBvcmRlciBpcyBub3QgcmVzdG9yZWQuIgogICh1bmxlc3MgZnJh bWUKICAgIChzZXRxIGZyYW1lIChzZWxlY3RlZC1mcmFtZSkpKQogICh3aGVuIChzdHJpbmdwIGZy YW1lKQogICAgKHNldHEgZnJhbWUgKG9yIChkaXNwbGF5LXVudGlsLWdldC1mcmFtZS1ieS1uYW1l IGZyYW1lKQoJCSAgICAobWFrZS1mcmFtZSAoY29ucyBgKG5hbWUgLiAsZnJhbWUpCgkJCQkgICAg ICBkaXNwbGF5LXVudGlsLWZyYW1lLXBhcmFtZXRlcnMpKSkpKQogIChjb25kICgobm90IChmcmFt ZXAgZnJhbWUpKQoJIChlcnJvciAiKGRpc3BsYXktZnJhbWUtdW50aWwpOiBGaXJzdCBhcmd1bWVu dCBtdXN0IGJlIGEgZnJhbWUsIG5vdCBgJXMnIgoJCWZyYW1lKSkKCSgobm90IChmcmFtZS1saXZl LXAgZnJhbWUpKQoJIChlcnJvciAiKGRpc3BsYXktZnJhbWUtdW50aWwpOiBGaXJzdCBhcmd1bWVu dCBtdXN0IGJlIGEgbGl2ZSBmcmFtZSwgbm90IGAlcyciCgkJZnJhbWUpKQoJKChhbmQgYnVmZmVy IChub3QgKG9yIChidWZmZXJwIGJ1ZmZlcikgKGFuZCAoc3RyaW5ncCBidWZmZXIpCgkJCQkJCSAg ICAoZ2V0LWJ1ZmZlciBidWZmZXIpKSkpKQoJIChyZWRpc3BsYXkgdCkKCSAoZXJyb3IgIihkaXNw bGF5LWZyYW1lLXVudGlsKTogU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYW4gZXhpc3RpbmcgYnVm ZmVyIG9yIGJ1ZmZlciBuYW1lLCBub3QgYCVzJyIKCQlidWZmZXIpKQoJKHQKCSAobGV0ICgoZnJh bWUtdmlzaWJsZS1mbGFnIChmcmFtZS12aXNpYmxlLXAgZnJhbWUpKSkKCSAgIChzZWxlY3QtZnJh bWUgZnJhbWUpCgkgICAocmFpc2UtZnJhbWUgZnJhbWUpCgkgICAoZGlzcGxheS1idWZmZXIgKG9y IGJ1ZmZlciAod2luZG93LWJ1ZmZlcikpCgkJCSAgIChjb25zICdkaXNwbGF5LWJ1ZmZlci1zYW1l LXdpbmRvdwoJCQkJIGRpc3BsYXktdW50aWwtZnJhbWUtcGFyYW1ldGVycykgZnJhbWUpCgkgICA7 OyBGb3JjZSByZWRpc3BsYXkgb3IgYW55IGNoYW5nZXMgdG8gZnJhbWUgd29uJ3QgYmUgZGlzcGxh eWVkIGhlcmUuCgkgICAocmVkaXNwbGF5IHQpCgkgICAoaWYgY29uZGl0aW9uCgkgICAgICAgKGRp c3BsYXktdW50aWwtY29uZGl0aW9uLW9yLXRpbWVvdXQgY29uZGl0aW9uIGRpc3BsYXktdW50aWwt ZGVsYXkpCgkgICAgIDs7IERvbid0IHVzZSBzaXQtZm9yIGhlcmUgYmVjYXVzZSBpdCBjYW4gYmUg aW50ZXJydXB0ZWQgZWFybHkuCgkgICAgIChzbGVlcC1mb3IgZGlzcGxheS11bnRpbC1kZWxheSkp CgkgICAocGNhc2UgZnJhbWUtdmlzaWJsZS1mbGFnCgkgICAgICgnaWNvbiAoaWNvbmlmeS1mcmFt ZSBmcmFtZSkpCgkgICAgICgnbmlsICAobWFrZS1mcmFtZS1pbnZpc2libGUgZnJhbWUpKSkpKSkp CgooZGVmdW4gZGlzcGxheS1mcmFtZS11bnRpbCAoZnJhbWUgJm9wdGlvbmFsIGJ1ZmZlciBjb25k aXRpb24pCiAgIkRpc3BsYXkgRlJBTUUgdG9wbW9zdCB3aXRoIG9wdGlvbmFsIEJVRkZFUiBpbiBp dHMgc2VsZWN0ZWQgd2luZG93IHVudGlsIENPTkRJVElPTiBvciBgZGlzcGxheS11bnRpbC1kZWxh eScgc2Vjb25kcy4KCkZSQU1FIG1heSBiZSBhbiBleGlzdGluZywgZXZlbiBpbnZpc2libGUgZnJh bWUsIGZyYW1lIG5hbWUgb3IKbmlsLiAgSWYgbmlsLCB0aGUgc2VsZWN0ZWQgZnJhbWUgaXMgdXNl ZC4gIElmIEZSQU1FIGlzIGEgc3RyaW5nCmFuZCBubyBsaXZlIGZyYW1lIHdpdGggdGhhdCBuYW1l IGlzIGZvdW5kLCBhIG5ldyBvbmUgd2l0aCB0aGUKbmFtZSBhbmQgYW55IGBkaXNwbGF5LXVudGls LWZyYW1lLXBhcmFtZXRlcnMnIGlzIGNyZWF0ZWQuCgpCVUZGRVIgbWF5IGJlIGFuIGV4aXN0aW5n IGJ1ZmZlciBvciBidWZmZXIgbmFtZS4KCkNPTkRJVElPTiBtdXN0IGJlIGFuIHVucXVvdGVkIGJv b2xlYW4gcHJlZGljYXRlIGZvcm0uCgpBZnRlciBkaXNwbGF5LCBGUkFNRSdzIHByaW9yIHZpc2li aWxpdHkgc3RhdHVzIGlzIHJlc3RvcmVkLCBhcyBpcwp0aGUgcHJpb3IgZnJhbWUgdGhhdCBoYWQg aW5wdXQgZm9jdXMuICBGUkFNRSdzIGRlcHRoIGluIHRoZSBmcmFtZQpzdGFja2luZyBvcmRlciBp cyBub3QgcmVzdG9yZWQuIgogIChsZXQgKChwcmlvci1mcmFtZSAob3IgKGZyYW1lLWZvY3VzKSAo c2VsZWN0ZWQtZnJhbWUpKSkpCiAgICAoZGlzcGxheS1mcmFtZS11bnRpbC1jb25kaXRpb24gZnJh bWUgYnVmZmVyIGNvbmRpdGlvbikKICAgIChzZWxlY3QtZnJhbWUtc2V0LWlucHV0LWZvY3VzIHBy aW9yLWZyYW1lKSkpCgooZGVmdW4gZGlzcGxheS13aW5kb3ctdW50aWwgKHdpbi1vci1idWYgJm9w dGlvbmFsIGJ1ZmZlciBjb25kaXRpb24pCiAgIkRpc3BsYXkgV0lOLU9SLUJVRidzIGZyYW1lIHRv cG1vc3Qgd2l0aCBvcHRpb25hbCBCVUZGRVIgaW4gaXRzIHNlbGVjdGVkIHdpbmRvdyB1bnRpbCBD T05ESVRJT04gb3IgYGRpc3BsYXktdW50aWwtZGVsYXknIHNlY29uZHMuCgpXSU4tT1ItQlVGIG1h eSBiZSBhIHdpbmRvdywgZXhpc3RpbmcgYnVmZmVyIG9yIGJ1ZmZlciBuYW1lLCBvciBuaWwuCklm IGEgYnVmZmVyIG9yIGJ1ZmZlciBuYW1lLCBhbnkgd2luZG93IHByZXNlbnRseSB3aXRoIHRoYXQg YnVmZmVyCmlzIHVzZWQuICBJZiBuaWwgb3IgaWYgbm8gd2luZG93IGlzIGFzc29jaWF0ZWQgd2l0 aCB0aGUgYnVmZmVyLCB0aGUKc2VsZWN0ZWQgd2luZG93IGlzIHVzZWQuCgpUaGUgZmlyc3QgbWF0 Y2hpbmcgaXRlbSBmcm9tIHRoaXMgbGlzdCBpcyBkaXNwbGF5ZWQgaW4gdGhlIGNob3NlbiB3aW5k b3c6CkJVRkZFUiBpZiBpdCBpcyBub24tbmlsOyBXSU4tT1ItQlVGIGlmIGl0IGlzIGEgYnVmZmVy IG9yIGJ1ZmZlciBuYW1lOwp0aGUgd2luZG93J3MgY3VycmVudCBidWZmZXIuCgpDT05ESVRJT04g bXVzdCBiZSBhbiB1bnF1b3RlZCBib29sZWFuIHByZWRpY2F0ZSBmb3JtLgoKQWZ0ZXIgZGlzcGxh eSwgV0lOLU9SLUJVRiBmcmFtZSdzIHByaW9yIHZpc2liaWxpdHkgc3RhdHVzIGlzCnJlc3RvcmVk LCBhcyBpcyB0aGUgcHJpb3IgZnJhbWUgdGhhdCBoYWQgaW5wdXQgZm9jdXMuICBXSU4tT1ItQlVG CmZyYW1lJ3MgZGVwdGggaW4gdGhlIGZyYW1lIHN0YWNraW5nIG9yZGVyIGlzIG5vdCByZXN0b3Jl ZC4iCiAgKHVubGVzcyB3aW4tb3ItYnVmCiAgICAoc2V0cSB3aW4tb3ItYnVmIChzZWxlY3RlZC13 aW5kb3cpKSkKICAod2hlbiAob3IgKHN0cmluZ3Agd2luLW9yLWJ1ZikgKGJ1ZmZlcnAgd2luLW9y LWJ1ZikpCiAgICAoc2V0cSB3aW4tb3ItYnVmIChvciAoZ2V0LWJ1ZmZlci13aW5kb3cgd2luLW9y LWJ1ZiB0KSB3aW4tb3ItYnVmKSkKICAgICh3aGVuIChhbmQgKHN0cmluZ3Agd2luLW9yLWJ1Zikg KGdldC1idWZmZXIgd2luLW9yLWJ1ZikpCiAgICAgIDs7IFNldCB0byBkaXNwbGF5IHRoZSBidWZm ZXIgZ2l2ZW4gYnkgd2luLW9yLWJ1Zi4KICAgICAgKHVubGVzcyBidWZmZXIgKHNldHEgYnVmZmVy IHdpbi1vci1idWYpKQogICAgICA7OyBVc2Ugc2VsZWN0ZWQgd2luZG93IHNpbmNlIG5vIG90aGVy IHdpbmRvdyB0byB1c2Ugd2FzIGZvdW5kLgogICAgICAoc2V0cSB3aW4tb3ItYnVmIChzZWxlY3Rl ZC13aW5kb3cpKSkpCiAgKHVubGVzcyAod2luZG93LWxpdmUtcCB3aW4tb3ItYnVmKQogICAgKGVy cm9yICIoZGlzcGxheS13aW5kb3ctdW50aWwpOiBGaXJzdCBhcmd1bWVudCBtdXN0IHJlZmVyZW5j ZSBhIGxpdmUgd2luZG93LCBub3QgYCVzJyIKCSAgIHdpbi1vci1idWYpKQogIDs7IERvbid0IHVz ZSB3aXRoLXNlbGVjdGVkLXdpbmRvdyBoZXJlIHNpbmNlIGl0IGFmZmVjdHMgZnJhbWUgdmlzaWJp bGl0eS4KICAobGV0ICgoc2VsLXdpbmRvdyAoc2VsZWN0ZWQtd2luZG93KSkpCiAgICAoc2VsZWN0 LXdpbmRvdyB3aW4tb3ItYnVmKQogICAgKGRpc3BsYXktZnJhbWUtdW50aWwtY29uZGl0aW9uICh3 aW5kb3ctZnJhbWUgd2luLW9yLWJ1ZikgYnVmZmVyIGNvbmRpdGlvbikKICAgIChzZWxlY3Qtd2lu ZG93IHNlbC13aW5kb3cpCiAgICAoc2VsZWN0LWZyYW1lLXNldC1pbnB1dC1mb2N1cyAod2luZG93 LWZyYW1lIHNlbC13aW5kb3cpKSkpCgo7OzsgU2FtcGxlIFVzYWdlIGFuZCBUZXN0cyAtIEludGVy YWN0aXZlbHkgZXZhbHVhdGUgdGhlc2UgTGlzcCBmb3JtcwoKOzsgVGhlIExpc3AgcmVhZGVyIHdp bGwgaWdub3JlIHRoZXNlIHNhbXBsZXMgd2hlbiBsb2FkaW5nIHRoZSBsaWJyYXJ5Cih3aGVuIG5p bAoKICA7OyBEaXNwbGF5IGZyYW1lcyBhdG9wIHRoZSB3aW5kb3cgc3RhY2sgZm9yIDIgc2Vjb25k cwogIChzZXRxIGRpc3BsYXktdW50aWwtZGVsYXkgMikKCiAgOzsgQ3JlYXRlIGEgbmV3IGZyYW1l IG5hbWVkICdNeS1GcmFtZScsIG1ha2UgaXQgZGlzcGxheSB0aGUgKk1lc3NhZ2VzKgogIDs7IGJ1 ZmZlciwgdGVtcG9yYXJpbHkgZGlzcGxheSBpdCwgdGhlbiBoaWRlIGl0LgogIChwcm9nbiAod2hl biAoZGlzcGxheS11bnRpbC1nZXQtZnJhbWUtYnktbmFtZSAiTXktRnJhbWUiKQoJICAgKGRlbGV0 ZS1mcmFtZSAoZGlzcGxheS11bnRpbC1nZXQtZnJhbWUtYnktbmFtZSAiTXktRnJhbWUiKSkpCgkg KGxldCAoKGRpc3BsYXktdW50aWwtZnJhbWUtcGFyYW1ldGVycyAnKCh2aXNpYmlsaXR5IC4gbmls KSkpKQoJICAgKGRpc3BsYXktZnJhbWUtdW50aWwgIk15LUZyYW1lIiAiKk1lc3NhZ2VzKiIpKSkK CiAgOzsgVGVtcG9yYXJpbHkgZGlzcGxheSBNeS1GcmFtZSwgdGhlbiBsZWF2ZSBpdCBkaXNwbGF5 ZWQgYnV0IG1vdmUKICA7OyBwcmlvciB0b3Btb3N0IGZyYW1lIGJhY2sgdG8gdGhlIHRvcC4KICAo cHJvZ24gKHNldC1mcmFtZS1wYXJhbWV0ZXIgKGRpc3BsYXktdW50aWwtZ2V0LWZyYW1lLWJ5LW5h bWUgIk15LUZyYW1lIikgJ3Zpc2liaWxpdHkgdCkKCSAoZGlzcGxheS1mcmFtZS11bnRpbCAiTXkt RnJhbWUiKSkKCiAgOzsgVGVtcG9yYXJpbHkgZGlzcGxheSB0aGUgZnJhbWUgb2YgYSBzcGVjaWZp YyB3aW5kb3cgKG9uZSBjdXJyZW50bHkKICA7OyBzaG93aW5nIHRoZSAqTWVzc2FnZXMqIGJ1ZmZl cikgYW5kIG1ha2UgaXQgZGlzcGxheSB0aGUgKnNjcmF0Y2gqIGJ1ZmZlci4KICAoZGlzcGxheS13 aW5kb3ctdW50aWwgIipNZXNzYWdlcyoiICIqc2NyYXRjaCoiKQoKICA7OyBUZW1wb3JhcmlseSBk aXNwbGF5IGFuIGV4aXN0aW5nIGZyYW1lLgogIChkaXNwbGF5LWZyYW1lLXVudGlsICJNeS1GcmFt ZSIpCgogIDs7IFRlbXBvcmFyaWx5IGRpc3BsYXkgYW4gZXhpc3Rpbmcgd2luZG93LgogIChkaXNw bGF5LXdpbmRvdy11bnRpbCAiKnNjcmF0Y2gqIikKCiAgOzsgVGVtcG9yYXJpbHkgZGlzcGxheSBh IHdpbmRvdyBjdXJyZW50bHkgc2hvd2luZyAiKnNjcmF0Y2gqIiBhbmQKICA7OyBzd2l0Y2ggaXQg dG8gdGhlIGJ1ZmZlciAiKk1lc3NhZ2VzKiIuCiAgKGRpc3BsYXktd2luZG93LXVudGlsICIqc2Ny YXRjaCoiICIqTWVzc2FnZXMqIikKCiAgOzsgTGlrZWx5IGRpc3BsYXkgdGhlIGJ1ZmZlciAiKnNj cmF0Y2gqIiBpbiB0aGUgc2VsZWN0ZWQgd2luZG93LgogIChkaXNwbGF5LXdpbmRvdy11bnRpbCAi KnNjcmF0Y2gqIikKICApCgoocHJvdmlkZSAnZGlzcGxheS11bnRpbCkK --001a113d70187f782e05608c908b--