From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Winston Carlile via "Emacs development discussions." Newsgroups: gmane.emacs.devel Subject: Making elp.el behave like a real profiler Date: Mon, 15 Aug 2022 12:22:54 -0700 Message-ID: Reply-To: Winston Carlile Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="000000000000a63fbf05e64c8f8d" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="9561"; mail-complaints-to="usenet@ciao.gmane.io" To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Tue Aug 16 04:25:10 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 1oNmGT-0002Jt-Tx for ged-emacs-devel@m.gmane-mx.org; Tue, 16 Aug 2022 04:25:10 +0200 Original-Received: from localhost ([::1]:56188 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oNmGS-0003Hs-C0 for ged-emacs-devel@m.gmane-mx.org; Mon, 15 Aug 2022 22:25:08 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:42050) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oNfg7-00050q-19 for emacs-devel@gnu.org; Mon, 15 Aug 2022 15:23:11 -0400 Original-Received: from mail-oi1-x233.google.com ([2607:f8b0:4864:20::233]:39647) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1oNfg3-0001Kn-Vz for emacs-devel@gnu.org; Mon, 15 Aug 2022 15:23:10 -0400 Original-Received: by mail-oi1-x233.google.com with SMTP id j5so9580412oih.6 for ; Mon, 15 Aug 2022 12:23:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=to:subject:message-id:date:from:mime-version:from:to:cc; bh=Hxy0dMcIXR+5M+WffEzH7Z5lTmhrV0cCkZF91GN6X3Y=; b=d723qU0cxjwSoDmjf63fQXVkwWkTNtcpKGnJMZg3fqdQWOBeBXuoP8JoKiVrokgCy0 kgsbD3ZBG1NQupRwTkF1F6f7agq5L8QGnQg2zWJVXVx/8kfx712oY4hFDhw7YV3jRmDD qyGv0MKh8PTJWxxmx0LwI6nnbfUoPjoouyaVKfpBVacfuGpBoiuHghdwLRiLFnV9t8Tt 3Pc7XjgpW0Lp7hiWUQqSvq8NZMpFg1EG011Lv1+PlFmVl06xKsMrJD507zUT8WPbE+Uw 5T1LtpRo+/IhNRYwHCbxgbQ96cLygV8hE6lGeEFxD9c/eulFyHtVYyRjA3L6rBAaNWfX ACRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc; bh=Hxy0dMcIXR+5M+WffEzH7Z5lTmhrV0cCkZF91GN6X3Y=; b=x276gjQlZB7oY6JQJ7N4pX+5AAq8gjhAdV0f5SFT3norPsekTRJQW3s5dbzQ7Qc2F/ UwV0AzGkclbzkelipQrNVcbwpXkHOFxg+4xqYGWu6F3L6hybhqbvXMJVvu9sw1mGYVer 984Lp3YrO9r9qwTelT1xg4AXgI91aMSoGMVdJfXv8kP5tbs/vWFRMiXccyMgajpjaMa3 +QcFmPqTXHbn7cnYPTBX4Mb+xaDQ3ULwP+acnz5JQgdVOaShqpJ5TN+j7Er1nhlpGVvg P3wpNWvs0ZctW8M/QuxAJcf/qAHEbG4Ewj6m9L5In5KmgGvC9QKgvcAUZuV6A84cX48v KGSg== X-Gm-Message-State: ACgBeo16v/I3zyp+ftQSxV7wh7zHEJGLZkkF6mEdgHtNTSdhzBdm7rw0 AxumuiHYrXg1quhEl+v/7khwFnb6I9hxeCv29Lc00S2Scb0PdA== X-Google-Smtp-Source: AA6agR6WtMvb36bHlB2JY7Ds9RIKVjjC92c0sUuqBYeGsuM29rVvSgqKhygqtdMpfyVIkCiBaPl8Kuo9XK6aeNwptRA= X-Received: by 2002:a05:6808:118f:b0:337:e9c2:8496 with SMTP id j15-20020a056808118f00b00337e9c28496mr11117904oil.20.1660591385445; Mon, 15 Aug 2022 12:23:05 -0700 (PDT) Received-SPF: pass client-ip=2607:f8b0:4864:20::233; envelope-from=winstonc@google.com; helo=mail-oi1-x233.google.com X-Spam_score_int: -175 X-Spam_score: -17.6 X-Spam_bar: ----------------- X-Spam_report: (-17.6 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, ENV_AND_HDR_SPF_MATCH=-0.5, 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, USER_IN_DEF_DKIM_WL=-7.5, USER_IN_DEF_SPF_WL=-7.5 autolearn=ham autolearn_force=no X-Spam_action: no action X-Mailman-Approved-At: Mon, 15 Aug 2022 22:24:24 -0400 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:293490 Archived-At: --000000000000a63fbf05e64c8f8d Content-Type: multipart/alternative; boundary="000000000000a63fbd05e64c8f8b" --000000000000a63fbd05e64c8f8b Content-Type: text/plain; charset="UTF-8" tl;dr: I'm working on adding one level of context to function calls in ELP reports, looking for implementation and usability feedback. ---- As a heavy TRAMP user I have been frustrated the past few years with slowness, and painstakingly looked for ways to remedy this. Along the way I started to explore Emacs' core file API and with it the magic filename system, specifically tramp-sh.el. I quickly came to realize its complexity and the inadequacy of the Emacs Lisp Profiler in a highly recursive and interconnected codebase. This comment from elp.el in particular resonated with me: ;; TBD: ;; Make this act like a real profiler, so that it records time spent ;; in all branches of execution. I decided to take one step in this direction and change ELP to have one additional level of context for each result. For example, (defun g (n) (f n)) (defun f (n) (when (not (= n 0)) (f (1- n)))) (g 3) currently results in this report: Function Name Call Count g 1 f 4 My changes produce a report like this: Function Name Call Count g 1 ;; calls from functions not instrumented `-f 1 f 0 ;; calls from functions not instrumented `-f 3 I implemented this by changing the elp-timer-info-property from a vector to a plist of vectors indexed by function symbol, a.k.a. the "caller". The advice wrapper sets a dynamically scoped variable to be the current function's symbol (the caller), which is used in callee functions to lookup which timer info vector to update. At reporting time, the plists are inverted from callee->caller to caller->callee. Before I go any further with this I thought I'd reach out to the community for some early-middle feedback in case there's something important I'm missing. Some topics I'm open to discuss: 1) Is there a better way to programmatically access the call stack than a dynamic binding hack? 2) How can I make the report more intuitive? Specifically I'm worried about confusing people with the 0 call count for f in the above example. 3) Maybe a hashmap would be better than a plist when the number of instrumented functions is large. Next on my plate: - Check for unexpected behavior with async functions (mainly the aio library) - Implement sorting by call count, total time & avg time (each section is sorted normally, and the entire report is sorted by the max value of each section) - Keybinding to toggle un-inverting the report - Keybinding to jump to section - Clean up documentation Looking forward to any feedback folks want to share. --000000000000a63fbd05e64c8f8b Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
tl;dr:

I'm working on adding one= level of context to function calls
in ELP reports, looking for implemen= tation and usability
feedback.

----

As a heavy TRAMP user = I have been frustrated the past few
years with slowness, and painstaking= ly looked for ways to
remedy this.=C2=A0 Along the way I started to expl= ore Emacs' core
file API and with it the magic filename system, spec= ifically
tramp-sh.el.=C2=A0 I quickly came to realize its complexity and=
the inadequacy of the Emacs Lisp Profiler in a highly
recursive and = interconnected codebase.

This comment from elp.el in particular reso= nated with me:
;; TBD:
;; Make this act like a real profiler, so that= it records time spent
;; in all branches of execution.

I decided= to take one step in this direction and change ELP
to have one additiona= l level of context for each result.
For example,

(defun g (n)
= =C2=A0 (f n))

(defun f (n)
=C2=A0 (when (not (=3D n 0))
=C2=A0= =C2=A0 (f (1- n))))
=C2=A0
(g 3)

currently results in this r= eport:

Function Name =C2=A0 Call Count =C2=A0
g =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 1 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
f = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 4

My changes produc= e a report like this:

Function Name =C2=A0 Call Count
g =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 1 =C2=A0;; calls from functions n= ot instrumented
`-f =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 1

= f =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0 =C2=A0;; calls from fu= nctions not instrumented
`-f =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 3=


I implemented this by changing the elp-timer-info-property
= from a vector to a plist of vectors indexed by function
symbol, a.k.a. t= he "caller".=C2=A0 The advice wrapper sets a
dynamically scope= d variable to be the current function's
symbol (the caller), which i= s used in callee functions to
lookup which timer info vector to update.= =C2=A0 At reporting
time, the plists are inverted from callee->caller= to
caller->callee.

Before I go any further with this I though= t I'd reach out to
the community for some early-middle feedback in c= ase there's
something important I'm missing.=C2=A0 Some topics I= 'm open to
discuss:

1) Is there a better way to programmatica= lly access the call
=C2=A0 =C2=A0stack than a dynamic binding hack?
2= ) How can I make the report more intuitive? Specifically
=C2=A0 =C2=A0I&= #39;m worried about confusing people with the 0 call count
=C2=A0 =C2=A0= for f in the above example.
3) Maybe a hashmap would be better than a pl= ist when the
=C2=A0 =C2=A0number of instrumented functions is large.
=
Next on my plate:

- Check for unexpected behavior with async fun= ctions (mainly
=C2=A0 the aio library)
- Implement sorting by call co= unt, total time & avg time
=C2=A0 (each section is sorted normally, = and the entire report is
=C2=A0 sorted by the max value of each section)=
- Keybinding to toggle un-inverting the report
- Keybinding to jump = to section
- Clean up documentation

Looking forward to any feedba= ck folks want to share.
--000000000000a63fbd05e64c8f8b-- --000000000000a63fbf05e64c8f8d Content-Type: text/plain; charset="US-ASCII"; name="tramp-profiling.txt" Content-Disposition: attachment; filename="tramp-profiling.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l6v4n06h1 ZmluZC1maWxlLW5vc2VsZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAw LjAgICAgICAgICAgIDAuMApgLWZpbGUtZGlyZWN0b3J5LXAgICAgICAgICAgICAgICAgICAgICAg ICAgIDEgICAgICAgICAgIDAuMDU4OTM2NzQ2ICAgMC4wNTg5MzY3NDYKYC1maWxlLWF0dHJpYnV0 ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAwLjE4Mjc2ODk3MiAgIDAu MDkxMzg0NDg2CmAtZmlsZS1yZW1vdGUtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAg ICAgICAgICAgMC4wMDEzODE2Mjg5ICAwLjAwMDQ2MDU0MjkKYC1maWxlLWxvY2FsLW5hbWUgICAg ICAgICAgICAgICAgICAgICAgICAgICA2ICAgICAgICAgICAwLjAwMDEyMTA1NDkgIDIuMDE3Li4u ZS0wNQpgLWZpbGUtbmFtZS1jYXNlLWluc2Vuc2l0aXZlLXAgICAgICAgICAgICAgIDIgICAgICAg ICAgIDAuMDA0Nzk2MzQ1MCAgMC4wMDIzOTgxNzI1CmAtZmlsZS10cnVlbmFtZSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgMC4zNDczMjU3NDUgICAwLjM0NzMyNTc0NQpg LWZpbGUtd3JpdGFibGUtcCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgIDAu Mjc3MDgyMzE4ICAgMC4yNzcwODIzMTgKYC1maWxlLW5hbWUtYWJzb2x1dGUtcCAgICAgICAgICAg ICAgICAgICAgICA2ICAgICAgICAgICAxLjEwNC4uLmUtMDUgIDEuODQwLi4uZS0wNgoKZmluZC1m aWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAwLjg4NjQy NDY3NCAgIDAuODg2NDI0Njc0CmAtZmluZC1maWxlLW5vc2VsZWN0ICAgICAgICAgICAgICAgICAg ICAgICAgMSAgICAgICAgICAgMC44NzQ0NTk2MDUgICAwLjg3NDQ1OTYwNQoKZmlsZS1zeW1saW5r LXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwLjAgICAgICAgICAg IDAuMApgLWZpbGUtYXR0cmlidXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAg ICAgIDAuMjM3NDA3NDMzICAgMC4yMzc0MDc0MzMKYC1maWxlLXJlbW90ZS1wICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAxICAgICAgICAgICAxLjU3MjhlLTA1ICAgIDEuNTcyOGUtMDUKYC1m aWxlLWxvY2FsLW5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgICAwLjAw MDEwNTQyNSAgIDMuNTE0Li4uZS0wNQpgLWZpbGUtbmFtZS1hYnNvbHV0ZS1wICAgICAgICAgICAg ICAgICAgICAgIDQgICAgICAgICAgIDEuMzE4MmUtMDUgICAgMy4yOTU1ZS0wNgoKZmlsZS13cml0 YWJsZS1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwLjAgICAgICAg ICAgIDAuMApgLWZpbGUtcmVtb3RlLXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgICAg ICAgICAgIDAuMDAwMTYzMTk3ICAgMy4yNjM5NGUtMDUKYC1maWxlLWxvY2FsLW5hbWUgICAgICAg ICAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgICAwLjAwMDYzNTkyMTkgIDUuNzgxLi4uZS0w NQpgLWZpbGUtbmFtZS1kaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAg IDAuMDAxMTU4OTgxICAgMC4wMDA1Nzk0OTA1CmAtZmlsZS1leGlzdHMtcCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgMSAgICAgICAgICAgMC4wOTk4OTY0NDggICAwLjA5OTg5NjQ0OApgLWZp bGUtbmFtZS1hYnNvbHV0ZS1wICAgICAgICAgICAgICAgICAgICAgIDUgICAgICAgICAgIDEuMDM1 NGUtMDUgICAgMi4wNzAuLi5lLTA2CgpmaWxlLWV4aXN0cy1wICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDEgICAgICAgICAgIDYuNzE2N2UtMDUgICAgNi43MTY3ZS0wNQpgLWZpbGUtcmVt b3RlLXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgIDAuMDAwMTQ3OTI4 ICAgMi40NjUuLi5lLTA1CmAtZmlsZS1sb2NhbC1uYW1lICAgICAgICAgICAgICAgICAgICAgICAg ICAgMTMgICAgICAgICAgMC4wMDA1MjY4NzcgICA0LjA1Mi4uLmUtMDUKYC1maWxlLW5hbWUtYWJz b2x1dGUtcCAgICAgICAgICAgICAgICAgICAgICA1ICAgICAgICAgICAxLjAwNzNlLTA1ICAgIDIu MDE0NmUtMDYKCmZpbGUtbmFtZS1kaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgNSAg ICAgICAgICAgNC4yODI5ZS0wNSAgICA4LjU2NThlLTA2CmAtZmlsZS1uYW1lLWRpcmVjdG9yeSAg ICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgNi44NDQ3ZS0wNSAgICAzLjQyMjM1ZS0w NQpgLWZpbGUtbmFtZS1hYnNvbHV0ZS1wICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAg IDcuNDI2ZS0wNiAgICAgMy43MTNlLTA2CgpmaWxlLXRydWVuYW1lICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDAgICAgICAgICAgIDAuMCAgICAgICAgICAgMC4wCmAtZmlsZS1yZW1vdGUt cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgICAgICAgICAgMC4wMDE0NTc1NjggICAw LjAwMDI0MjkyOApgLWZpbGUtbG9jYWwtbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEy ICAgICAgICAgIDAuMDAzMDkwMzEwMCAgMC4wMDAyNTc1MjU4CmAtZmlsZS1zeW1saW5rLXAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgMC4yMzg5NDA4ODkgICAwLjIzODk0 MDg4OQpgLWZpbGUtbmFtZS1hYnNvbHV0ZS1wICAgICAgICAgICAgICAgICAgICAgIDUgICAgICAg ICAgIDkuOWUtMDYgICAgICAgMS45OGUtMDYKYC1maW5kLWZpbGUtbmFtZS1oYW5kbGVyICAgICAg ICAgICAgICAgICAgICAxICAgICAgICAgICA1LjgxNDZlLTA1ICAgIDUuODE0NmUtMDUKCmZpbGUt bmFtZS1jYXNlLWluc2Vuc2l0aXZlLXAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMC4wICAg ICAgICAgICAwLjAKYC1maWxlLXJlbW90ZS1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2 ICAgICAgICAgICAwLjAwMTg5MzExOSAgIDAuMDAwMzE1NTE5OApgLWZpbGUtbG9jYWwtbmFtZSAg ICAgICAgICAgICAgICAgICAgICAgICAgIDEyICAgICAgICAgIDAuMDAwMjI4Mzc1ICAgMS45MDMu Li5lLTA1CmAtZmlsZS1uYW1lLWFic29sdXRlLXAgICAgICAgICAgICAgICAgICAgICAgMTQgICAg ICAgICAgMi4wMzIuLi5lLTA1ICAxLjQ1MS4uLmUtMDYKCmZpbGUtbG9jYWwtbmFtZSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMC4wICAgICAgICAgICAwLjAKYC1maWxl LXJlbW90ZS1wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjQgICAgICAgICAwLjAwNjE3 MTQ4ODAgIDQuOTc3Li4uZS0wNQoKZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSAgICAgICAgICAgICAg ICAgICAgICA2ICAgICAgICAgICA1LjcwNTJlLTA1ICAgIDkuNTA4Li4uZS0wNgoKZmlsZS1yZW1v dGUtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwLjAgICAgICAg ICAgIDAuMApgLWZpbGUtcmVtb3RlLXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgICAg ICAgICAgIDcuMjMxMmUtMDUgICAgMS4yMDUuLi5lLTA1CmAtZmlsZS1sb2NhbC1uYW1lICAgICAg ICAgICAgICAgICAgICAgICAgICAgMTggICAgICAgICAgMC4wMDA0MjkzNjE5ICAyLjM4NS4uLmUt MDUKYC1maWxlLW5hbWUtYWJzb2x1dGUtcCAgICAgICAgICAgICAgICAgICAgICAyNCAgICAgICAg ICA0LjU0MC4uLmUtMDUgIDEuODkxLi4uZS0wNgpgLWZpbmQtZmlsZS1uYW1lLWhhbmRsZXIgICAg ICAgICAgICAgICAgICAgIDE3OCAgICAgICAgIDAuMDAyNzc3MjIwMCAgMS41NjAuLi5lLTA1Cgpm aWxlLWF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDAu MCAgICAgICAgICAgMC4wCmAtZmlsZS1yZW1vdGUtcCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgMTcgICAgICAgICAgMC4wMDA1MTk3NTYgICAzLjA1Ny4uLmUtMDUKYC1maWxlLWxvY2FsLW5h bWUgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCAgICAgICAgICAwLjAwMjExMzAzNzAgIDUu MjgyLi4uZS0wNQpgLWZpbGUtbmFtZS1hYnNvbHV0ZS1wICAgICAgICAgICAgICAgICAgICAgIDI0 ICAgICAgICAgIDUuMjMwLi4uZS0wNSAgMi4xNzkuLi5lLTA2CgpmaWxlLWRpcmVjdG9yeS1wICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDAuMCAgICAgICAgICAgMC4wCmAt ZmlsZS1yZW1vdGUtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgNy40 NjI4ZS0wNSAgICAxLjg2NTdlLTA1CmAtZmlsZS1sb2NhbC1uYW1lICAgICAgICAgICAgICAgICAg ICAgICAgICAgOSAgICAgICAgICAgMC4wMDAyNzM5MzkgICAzLjA0My4uLmUtMDUKYC1maWxlLW5h bWUtYWJzb2x1dGUtcCAgICAgICAgICAgICAgICAgICAgICA1ICAgICAgICAgICAzLjYwNi4uLmUt MDYgIDcuMjEzLi4uZS0wNwoK --000000000000a63fbf05e64c8f8d Content-Type: text/x-patch; charset="US-ASCII"; name="contextual_elp.patch" Content-Disposition: attachment; filename="contextual_elp.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l6v2gkyo0 ZGlmZiAtLWdpdCBhL2xpc3AvZW1hY3MtbGlzcC9lbHAuZWwgYi9saXNwL2VtYWNzLWxpc3AvZWxw LmVsCmluZGV4IDM4NWRkYjNmNDEuLjY3YzgwYzBiYmIgMTAwNjQ0Ci0tLSBhL2xpc3AvZW1hY3Mt bGlzcC9lbHAuZWwKKysrIGIvbGlzcC9lbWFjcy1saXNwL2VscC5lbApAQCAtMjIxLDM0ICsyMjEs NDkgQEAgdGhlbSB3b3VsZCB0aHVzIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLiIpCiAgICAg ICAgICAgICAgICAgKGF1dG9sb2FkcCAoc3ltYm9sLWZ1bmN0aW9uIGZ1bikpIDtGSVhNRTogV2h5 IG5vdCBqdXN0IGxvYWQgaXQ/CiAgICAgICAgICAgICAgICAgKHNwZWNpYWwtZm9ybS1wIGZ1bikp KSkpCiAKKyhkZWZ2YXIgZWxwLS1pbnN0cnVtZW50ZWQtZnVuY3Rpb25zIG5pbCkKKwogKGRlZmNv bnN0IGVscC0tYWR2aWNlLW5hbWUgJ0VMUC1pbnN0cnVtZW50YXRpb25cICkKIAwKKworKGRlZnVu IG5ldy1pbmZvdmVjICgpCisgIDs7IFRoZSBpbmZvIHZlY3RvciBkYXRhIHN0cnVjdHVyZSBpcyBh IDIgZWxlbWVudCB2ZWN0b3IuICBUaGUgMHRoCisgIDs7IGVsZW1lbnQgaXMgdGhlIGNhbGwtY291 bnQsIGkuZS4gdGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGlzCisgIDs7IGZ1bmN0aW9uIGhh cyBiZWVuIGVudGVyZWQuICBUaGlzIHZhbHVlIGlzIGJ1bXBlZCB1cCBvbiBlbnRyeSB0bworICA7 OyB0aGUgZnVuY3Rpb24gc28gdGhhdCBub24tbG9jYWwgZXhpdHMgYXJlIHN0aWxsIHJlY29yZGVk LiBUQkQ6CisgIDs7IEkgaGF2ZW4ndCB0ZXN0ZWQgbm9uLWxvY2FsIGV4aXRzIGF0IGFsbCwgc28g bm8gZ3VhcmFudGVlcy4KKyAgOzsKKyAgOzsgVGhlIDFzdCBlbGVtZW50IGlzIHRoZSB0b3RhbCBh bW91bnQgb2YgdGltZSBpbiBzZWNvbmRzIHRoYXQgaGFzCisgIDs7IGJlZW4gc3BlbnQgaW5zaWRl IHRoaXMgZnVuY3Rpb24uICBUaGlzIG51bWJlciBpcyBhZGRlZCB0byBvbgorICA7OyBmdW5jdGlv biBleGl0LgorICAodmVjdG9yIDAgMCkpCisKIDs7OyMjI2F1dG9sb2FkCiAoZGVmdW4gZWxwLWlu c3RydW1lbnQtZnVuY3Rpb24gKGZ1bnN5bSkKICAgIkluc3RydW1lbnQgRlVOU1lNIGZvciBwcm9m aWxpbmcuCiBGVU5TWU0gbXVzdCBiZSBhIHN5bWJvbCBvZiBhIGRlZmluZWQgZnVuY3Rpb24uIgog ICAoaW50ZXJhY3RpdmUgImFGdW5jdGlvbiB0byBpbnN0cnVtZW50OiAiKQotICAobGV0KiAoKGlu Zm92ZWMgKHZlY3RvciAwIDApKSkKLSAgICA7OyBXZSBjYW5ub3QgcHJvZmlsZSBmdW5jdGlvbnMg dXNlZCBpbnRlcm5hbGx5IGR1cmluZyBwcm9maWxpbmcuCi0gICAgKHVubGVzcyAoZWxwLXByb2Zp bGFibGUtcCBmdW5zeW0pCi0gICAgICAoZXJyb3IgIkVMUCBjYW5ub3QgcHJvZmlsZSB0aGUgZnVu Y3Rpb246ICVzIiBmdW5zeW0pKQotICAgIDs7IFRoZSBpbmZvIHZlY3RvciBkYXRhIHN0cnVjdHVy ZSBpcyBhIDIgZWxlbWVudCB2ZWN0b3IuICBUaGUgMHRoCi0gICAgOzsgZWxlbWVudCBpcyB0aGUg Y2FsbC1jb3VudCwgaS5lLiB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoaXMKLSAgICA7OyBm dW5jdGlvbiBoYXMgYmVlbiBlbnRlcmVkLiAgVGhpcyB2YWx1ZSBpcyBidW1wZWQgdXAgb24gZW50 cnkgdG8KLSAgICA7OyB0aGUgZnVuY3Rpb24gc28gdGhhdCBub24tbG9jYWwgZXhpdHMgYXJlIHN0 aWxsIHJlY29yZGVkLiBUQkQ6Ci0gICAgOzsgSSBoYXZlbid0IHRlc3RlZCBub24tbG9jYWwgZXhp dHMgYXQgYWxsLCBzbyBubyBndWFyYW50ZWVzLgotICAgIDs7Ci0gICAgOzsgVGhlIDFzdCBlbGVt ZW50IGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBpbiBzZWNvbmRzIHRoYXQgaGFzCi0gICAg OzsgYmVlbiBzcGVudCBpbnNpZGUgdGhpcyBmdW5jdGlvbi4gIFRoaXMgbnVtYmVyIGlzIGFkZGVk IHRvIG9uCi0gICAgOzsgZnVuY3Rpb24gZXhpdC4KLQorICA7OyBXZSBjYW5ub3QgcHJvZmlsZSBm dW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGR1cmluZyBwcm9maWxpbmcuCisgICh1bmxlc3MgKGVs cC1wcm9maWxhYmxlLXAgZnVuc3ltKQorICAgIChlcnJvciAiRUxQIGNhbm5vdCBwcm9maWxlIHRo ZSBmdW5jdGlvbjogJXMiIGZ1bnN5bSkpCisKKyAgOzsgY2FsbHMgZnJvbSBmdW5jdGlvbnMgbm90 IGluc3RydW1lbnRlZAorICAocHV0IGZ1bnN5bSBlbHAtdGltZXItaW5mby1wcm9wZXJ0eSAobGlz dCB0IChuZXctaW5mb3ZlYykpKQorICA7OyByZWN1cnNpdmUgY2FsbHMgKHdpdGggbm8gb3RoZXIg aW5zdHJ1bWVudGVkIGZ1bmN0aW9uIGluIGJldHdlZW4pCisgIChwbGlzdC1wdXQgKGdldCBmdW5z eW0gZWxwLXRpbWVyLWluZm8tcHJvcGVydHkpIGZ1bnN5bSAobmV3LWluZm92ZWMpKQorICAoZG9s aXN0IChjYWxsZXIgZWxwLS1pbnN0cnVtZW50ZWQtZnVuY3Rpb25zKQogICAgIDs7IFB1dCB0aGUg aW5mbyB2ZWN0b3Igb24gdGhlIHByb3BlcnR5IGxpc3QuCi0gICAgKHB1dCBmdW5zeW0gZWxwLXRp bWVyLWluZm8tcHJvcGVydHkgaW5mb3ZlYykKKyAgICAocGxpc3QtcHV0IChnZXQgZnVuc3ltIGVs cC10aW1lci1pbmZvLXByb3BlcnR5KSBjYWxsZXIgKG5ldy1pbmZvdmVjKSkKKyAgICAocGxpc3Qt cHV0IChnZXQgY2FsbGVyIGVscC10aW1lci1pbmZvLXByb3BlcnR5KSBmdW5zeW0gKG5ldy1pbmZv dmVjKSkpCiAKLSAgICA7OyBTZXQgdGhlIHN5bWJvbCdzIG5ldyBwcm9maWxpbmcgZnVuY3Rpb24g ZGVmaW5pdGlvbiB0byBydW4KLSAgICA7OyBFTFAgd3JhcHBlci4KLSAgICAoYWR2aWNlLWFkZCBm dW5zeW0gOmFyb3VuZCAoZWxwLS1tYWtlLXdyYXBwZXIgZnVuc3ltKQotICAgICAgICAgICAgICAg IGAoKG5hbWUgLiAsZWxwLS1hZHZpY2UtbmFtZSkgKGRlcHRoIC4gLTk5KSkpKSkKKyAgKHVubGVz cyAoZWxwLS1pbnN0cnVtZW50ZWQtcCBmdW5zeW0pCisgICAgKHNldHEgZWxwLS1pbnN0cnVtZW50 ZWQtZnVuY3Rpb25zCisgICAgICAgICAgKGNvbnMgZnVuc3ltIGVscC0taW5zdHJ1bWVudGVkLWZ1 bmN0aW9ucykpKQorCisgIDs7IFNldCB0aGUgc3ltYm9sJ3MgbmV3IHByb2ZpbGluZyBmdW5jdGlv biBkZWZpbml0aW9uIHRvIHJ1bgorICA7OyBFTFAgd3JhcHBlci4KKyAgKGFkdmljZS1hZGQgZnVu c3ltIDphcm91bmQgKGVscC0tbWFrZS13cmFwcGVyIGZ1bnN5bSkKKyAgICAgICAgICAgICAgYCgo bmFtZSAuICxlbHAtLWFkdmljZS1uYW1lKSAoZGVwdGggLiAtOTkpKSkpCiAKIChkZWZ1biBlbHAt LWluc3RydW1lbnRlZC1wIChzeW0pCiAgIChhZHZpY2UtbWVtYmVyLXAgZWxwLS1hZHZpY2UtbmFt ZSBzeW0pKQpAQCAtMjY4LDggKzI4MywxMyBAQCBBcmd1bWVudCBGVU5TWU0gaXMgdGhlIHN5bWJv bCBvZiBhIGRlZmluZWQgZnVuY3Rpb24uIgogCiAgIDs7IFphcCB0aGUgcHJvcGVydGllcy4KICAg KHB1dCBmdW5zeW0gZWxwLXRpbWVyLWluZm8tcHJvcGVydHkgbmlsKQorICAoc2V0cSBlbHAtLWlu c3RydW1lbnRlZC1mdW5jdGlvbnMKKyAgICAgICAgKGRlbGV0ZSBmdW5zeW0gZWxwLS1pbnN0cnVt ZW50ZWQtZnVuY3Rpb25zKSkKKyAgKGFkdmljZS1yZW1vdmUgZnVuc3ltIGVscC0tYWR2aWNlLW5h bWUpCiAKLSAgKGFkdmljZS1yZW1vdmUgZnVuc3ltIGVscC0tYWR2aWNlLW5hbWUpKQorICA7OyBD bGVhbiB1cCByZWZlcmVuY2VzIGluIG90aGVyIGluc3RydW1lbnRlZCBmdW5jdGlvbnMKKyAgKGRv bGlzdCAoY2FsbGVyIGVscC0taW5zdHJ1bWVudGVkLWZ1bmN0aW9ucykKKyAgICAocGxpc3QtcHV0 IGZ1bnN5bSAoZ2V0IGNhbGxlciBlbHAtdGltZXItaW5mby1wcm9wZXJ0eSkgbmlsKSkpCiAKIDs7 OyMjI2F1dG9sb2FkCiAoZGVmdW4gZWxwLWluc3RydW1lbnQtbGlzdCAoJm9wdGlvbmFsIGxpc3Qp CkBAIC0zMjAsMTYgKzM0MCwyMiBAQCBVc2Ugb3B0aW9uYWwgTElTVCBpZiBwcm92aWRlZCBpbnN0 ZWFkLiIKIChkZWZ1biBlbHAtcmVzdG9yZS1hbGwgKCkKICAgIlJlc3RvcmUgdGhlIG9yaWdpbmFs IGRlZmluaXRpb25zIG9mIGFsbCBmdW5jdGlvbnMgYmVpbmcgcHJvZmlsZWQuIgogICAoaW50ZXJh Y3RpdmUpCi0gIChtYXBhdG9tcyAjJ2VscC1yZXN0b3JlLWZ1bmN0aW9uKSkKKyAgKG1hcGF0b21z IChsYW1iZGEgKGZ1bnN5bSkKKyAgICAgICAgICAgICAgKHB1dCBmdW5zeW0gZWxwLXRpbWVyLWlu Zm8tcHJvcGVydHkgbmlsKQorICAgICAgICAgICAgICAoYWR2aWNlLXJlbW92ZSBmdW5zeW0gZWxw LS1hZHZpY2UtbmFtZSkpKQorICAoc2V0cSBlbHAtLWluc3RydW1lbnRlZC1mdW5jdGlvbnMgbmls KSkKIAwKIChkZWZ1biBlbHAtcmVzZXQtZnVuY3Rpb24gKGZ1bnN5bSkKICAgIlJlc2V0IHRoZSBw cm9maWxpbmcgaW5mb3JtYXRpb24gZm9yIEZVTlNZTS4iCiAgIChpbnRlcmFjdGl2ZSAiYUZ1bmN0 aW9uIHRvIHJlc2V0OiAiKQotICAobGV0ICgoaW5mbyAoZ2V0IGZ1bnN5bSBlbHAtdGltZXItaW5m by1wcm9wZXJ0eSkpKQotICAgIChvciBpbmZvCisgIChlcnJvciAiTm90IGltcGxlbWVudGVkIikK KyAgKGxldCAoKGNhbGxlci1wbGlzdCAoZ2V0IGZ1bnN5bSBlbHAtdGltZXItaW5mby1wcm9wZXJ0 eSkpKQorICAgIChvciBjYWxsZXItcGxpc3QKIAkoZXJyb3IgIiVzIGlzIG5vdCBpbnN0cnVtZW50 ZWQgZm9yIHByb2ZpbGluZyIgZnVuc3ltKSkKLSAgICAoYXNldCBpbmZvIDAgMCkJCQk7cmVzZXQg Y2FsbCBjb3VudGVyCi0gICAgKGFzZXQgaW5mbyAxIDAuMCkJCQk7cmVzZXQgdG90YWwgdGltZQor ICAgIChkb2xpc3QgKGNhbGxlci1hbmQtaW5mbyBjYWxsZXItcGxpc3QpCisgICAgICAobGV0ICgo aW5mbyAoY2FkciBjYWxsZXItYW5kLWluZm8pKSkKKyAgICAgICAgKGFzZXQgaW5mbyAwIDApCQkJ O3Jlc2V0IGNhbGwgY291bnRlcgorICAgICAgICAoYXNldCBpbmZvIDEgMC4wKSkpCQkJO3Jlc2V0 IHRvdGFsIHRpbWUKICAgICA7OyBkb24ndCBtdWNrIHdpdGggYXJlZiAyIGFzIHRoYXQgaXMgdGhl IG9sZCBzeW1ib2wgZGVmaW5pdGlvbgogICAgICkpCiAKQEAgLTM0Myw5ICszNjksMTcgQEAgVXNl IG9wdGlvbmFsIExJU1QgaWYgcHJvdmlkZWQgaW5zdGVhZC4iCiAoZGVmdW4gZWxwLXJlc2V0LWFs bCAoKQogICAiUmVzZXQgdGhlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBmb3IgYWxsIGZ1bmN0aW9u cyBiZWluZyBwcm9maWxlZC4iCiAgIChpbnRlcmFjdGl2ZSkKLSAgKG1hcGF0b21zIChsYW1iZGEg KHN5bSkKLSAgICAgICAgICAgICAgKGlmIChnZXQgc3ltIGVscC10aW1lci1pbmZvLXByb3BlcnR5 KQotICAgICAgICAgICAgICAgICAgKGVscC1yZXNldC1mdW5jdGlvbiBzeW0pKSkpKQorICAoZG9s aXN0IChzeW0gZWxwLS1pbnN0cnVtZW50ZWQtZnVuY3Rpb25zKQorICAgIChpZiAoZ2V0IHN5bSBl bHAtdGltZXItaW5mby1wcm9wZXJ0eSkKKyAgICAgICAgKGxldCAoKGluZm8tcGxpc3QgKGdldCBz eW0gZWxwLXRpbWVyLWluZm8tcHJvcGVydHkpKSkKKyAgICAgICAgICAobGV0ICgoaW5mbyAocGxp c3QtZ2V0IGluZm8tcGxpc3QgdCkpKQorICAgICAgICAgICAgKGFzZXQgaW5mbyAwIDApCisgICAg ICAgICAgICAoYXNldCBpbmZvIDEgMC4wKSkKKyAgICAgICAgICAoZG9saXN0IChjYWxsZXIgZWxw LS1pbnN0cnVtZW50ZWQtZnVuY3Rpb25zKQorICAgICAgICAgICAgKGxldCAoKGluZm8gKHBsaXN0 LWdldCBpbmZvLXBsaXN0IGNhbGxlcikpKQorICAgICAgICAgICAgICAoYXNldCBpbmZvIDAgMCkg ICAgICAgICAgIDsgcmVzZXQgY2FsbCBjb3VudGVyCisgICAgICAgICAgICAgIChhc2V0IGluZm8g MSAwLjApKSkpICAgICAgOyByZXNldCB0b3RhbCB0aW1lCisgICAgICApKSkKIAogKGRlZnVuIGVs cC1zZXQtbWFzdGVyIChmdW5zeW0pCiAgICJTZXQgdGhlIG1hc3RlciBmdW5jdGlvbiBmb3IgcHJv ZmlsaW5nLiIKQEAgLTM3MywzOCArNDA3LDMzIEBAIFVzZSBvcHRpb25hbCBMSVNUIGlmIHByb3Zp ZGVkIGluc3RlYWQuIgogKGRlZnN1YnN0IGVscC1lbGFwc2VkLXRpbWUgKHN0YXJ0IGVuZCkKICAg KGZsb2F0LXRpbWUgKHRpbWUtc3VidHJhY3QgZW5kIHN0YXJ0KSkpCiAKKyhkZWZ2YXIgZWxwLS1w YXJlbnQtZnVuc3ltIG5pbCkKKwogKGRlZnVuIGVscC0tbWFrZS13cmFwcGVyIChmdW5zeW0pCiAg ICJNYWtlIHRoZSBwaWVjZSBvZiBhZHZpY2UgdGhhdCBpbnN0cnVtZW50cyBGVU5TWU0uIgogICAo bGFtYmRhIChmdW5jICZyZXN0IGFyZ3MpCiAgICAgIlRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gaW5z dHJ1bWVudGVkIGZvciBwcm9maWxpbmcgYnkgdGhlIEVMUC4KIEVMUCBpcyB0aGUgRW1hY3MgTGlz cCBQcm9maWxlci4gIFRvIHJlc3RvcmUgdGhlIGZ1bmN0aW9uIHRvIGl0cwogb3JpZ2luYWwgZGVm aW5pdGlvbiwgdXNlIFxcW2VscC1yZXN0b3JlLWZ1bmN0aW9uXSBvciBcXFtlbHAtcmVzdG9yZS1h bGxdLiIKLSAgICA7OyB0dXJuIG9uIHJlY29yZGluZyBpZiB0aGlzIGlzIHRoZSBtYXN0ZXIgZnVu Y3Rpb24KLSAgICAoaWYgKGFuZCBlbHAtbWFzdGVyCi0gICAgICAgICAgICAgKGVxIGZ1bnN5bSBl bHAtbWFzdGVyKSkKLSAgICAgICAgKHNldHEgZWxwLXJlY29yZC1wIHQpKQogICAgIDs7IGdldCBp bmZvIHZlY3RvciBhbmQgb3JpZ2luYWwgZnVuY3Rpb24gc3ltYm9sCi0gICAgKGxldCogKChpbmZv IChnZXQgZnVuc3ltIGVscC10aW1lci1pbmZvLXByb3BlcnR5KSkKLSAgICAgICAgICAgcmVzdWx0 KQotICAgICAgKG9yIGZ1bmMKKyAgICAobGV0ICgoaW5mby1wbGlzdCAoZ2V0IGZ1bnN5bSBlbHAt dGltZXItaW5mby1wcm9wZXJ0eSkpCisgICAgICAgICAgcmVzdWx0KQorICAgICAgKG9yIGluZm8t cGxpc3QKICAgICAgICAgICAoZXJyb3IgIiVzIGlzIG5vdCBpbnN0cnVtZW50ZWQgZm9yIHByb2Zp bGluZyIgZnVuc3ltKSkKLSAgICAgIChpZiAobm90IGVscC1yZWNvcmQtcCkKLSAgICAgICAgICA7 OyB3aGVuIG5vdCByZWNvcmRpbmcsIGp1c3QgY2FsbCB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gc3lt Ym9sCi0gICAgICAgICAgOzsgYW5kIHJldHVybiB0aGUgcmVzdWx0cy4KLSAgICAgICAgICAoc2V0 cSByZXN1bHQgKGFwcGx5IGZ1bmMgYXJncykpCi0gICAgICAgIDs7IHdlIGFyZSByZWNvcmRpbmcg dGltZXMKLSAgICAgICAgKGxldCAoZW50ZXItdGltZSkKLSAgICAgICAgICA7OyBpbmNyZW1lbnQg dGhlIGNhbGwtY291bnRlcgotICAgICAgICAgIChjbC1pbmNmIChhcmVmIGluZm8gMCkpCi0JICAo c2V0cSBlbnRlci10aW1lIChjdXJyZW50LXRpbWUpCi0JCXJlc3VsdCAoYXBwbHkgZnVuYyBhcmdz KSkKLSAgICAgICAgICA7OyBjYWxjdWxhdGUgdG90YWwgdGltZSBpbiBmdW5jdGlvbgotICAgICAg ICAgIChjbC1pbmNmIChhcmVmIGluZm8gMSkgKGVscC1lbGFwc2VkLXRpbWUgZW50ZXItdGltZSBu aWwpKQotICAgICAgICAgICkpCi0gICAgICA7OyB0dXJuIG9mZiByZWNvcmRpbmcgaWYgdGhpcyBp cyB0aGUgbWFzdGVyIGZ1bmN0aW9uCi0gICAgICAoaWYgKGFuZCBlbHAtbWFzdGVyCi0gICAgICAg ICAgICAgICAoZXEgZnVuc3ltIGVscC1tYXN0ZXIpKQotICAgICAgICAgIChzZXRxIGVscC1yZWNv cmQtcCBuaWwpKQorCisKKyAgICAgIChsZXQqICgob2xkLXBhcmVudCAoaWYgZWxwLS1wYXJlbnQt ZnVuc3ltCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVscC0tcGFyZW50LWZ1bnN5bQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgdCkpCisgICAgICAgICAgICAgKGluZm8gKHBsaXN0 LWdldCBpbmZvLXBsaXN0IG9sZC1wYXJlbnQpKQorICAgICAgICAgICAgIChlbHAtLXBhcmVudC1m dW5zeW0gZnVuc3ltKQorICAgICAgICAgICAgIGVudGVyLXRpbWUpCisgICAgICAgIDs7IGluY3Jl bWVudCB0aGUgY2FsbC1jb3VudGVyCisgICAgICAgIChjbC1pbmNmIChhcmVmIGluZm8gMCkpCisJ KHNldHEgZW50ZXItdGltZSAoY3VycmVudC10aW1lKQorCSAgICAgIHJlc3VsdCAoYXBwbHkgZnVu YyBhcmdzKSkKKyAgICAgICAgOzsgY2FsY3VsYXRlIHRvdGFsIHRpbWUgaW4gZnVuY3Rpb24KKyAg ICAgICAgKGNsLWluY2YgKGFyZWYgaW5mbyAxKSAoZWxwLWVsYXBzZWQtdGltZSBlbnRlci10aW1l IG5pbCkpKQogICAgICAgcmVzdWx0KSkpCiAKIAwKQEAgLTQ0MSw3ICs0NzAsMzkgQEAgb3JpZ2lu YWwgZGVmaW5pdGlvbiwgdXNlIFxcW2VscC1yZXN0b3JlLWZ1bmN0aW9uXSBvciBcXFtlbHAtcmVz dG9yZS1hbGxdLiIKIAkJKG1hdGNoLXN0cmluZyAyIG51bWJlcikpCiAgICAgICAoc3Vic3RyaW5n IG51bWJlciAwIHdpZHRoKSkpKQogCi0oZGVmdW4gZWxwLW91dHB1dC1yZXN1bHQgKHJlc3VsdHZl YykKKyhkZWZ2YXIgZWxwLS1pbmRlbnQgImAtIikKKworKGRlZnVuIGVscC0tb3V0cHV0LWZ1bmN0 aW9uLXAgKHJlc3VsdHZlYyAmb3B0aW9uYWwgY2MtbGltaXQpCisgICJXaGV0aGVyIHRvIHByaW50 IHRoZSBvdXRwdXQgZnVuY3Rpb24uCisKK1JFU1VMVFZFQyBpcyBhIHJlc3VsdCB2ZWN0b3IgYXMg ZGVmaW5lZCBmb3IgYGVscC0tb3V0cHV0LXJlc3VsdCcuCitDQy1MSU1JVCBpcyBhbiBvcHRpb25h bCBsb3dlciBib3VuZCBmb3IgdGhlIGNhbGwgY291bnQgaW4KK1JFU1VMVFZFQy4iCisgIChsZXQg KChjYy1saW1pdCAob3IgY2MtbGltaXQgZWxwLXJlcG9ydC1saW1pdCkpCisgICAgICAgIChjYyAo YXJlZiByZXN1bHR2ZWMgMCkpKQorICAgIChpZiBjYy1saW1pdAorICAgICAgICAoPj0gY2MgY2Mt bGltaXQpCisgICAgICB0KSkpCisKKyhkZWZ1biBlbHAtb3V0cHV0LWZ1bmN0aW9uIChyZXN1bHRz LXBsaXN0KQorICAoZG9saXN0IChwYXJlbnQtZnVuYyBlbHAtLWluc3RydW1lbnRlZC1mdW5jdGlv bnMpCisgICAgKGxldCogKChyZXN1bHQtdmVjdG9ycyAocGxpc3QtZ2V0IHJlc3VsdHMtcGxpc3Qg cGFyZW50LWZ1bmMpKQorICAgICAgICAgICAoZWxwLWZpZWxkLWxlbiBlbHAtZmllbGQtbGVuKQor ICAgICAgICAgICAocGFyZW50LXJlc3VsdHZlYyAoY2FyIHJlc3VsdC12ZWN0b3JzKSkKKyAgICAg ICAgICAgKHJlc3VsdHZlYy1saXN0IChjZHIgcmVzdWx0LXZlY3RvcnMpKSkKKyAgICAgIChpZiAo b3IgKGVscC0tb3V0cHV0LWZ1bmN0aW9uLXAgcGFyZW50LXJlc3VsdHZlYykKKyAgICAgICAgICAg ICAgKGV2YWwgYChvciAsQChtYXAgJ2xpc3QgIydlbHAtLW91dHB1dC1mdW5jdGlvbi1wCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHZlYy1saXN0KSkpKQorICAgICAgICAg IChwcm9nbgorICAgICAgICAgICAgKG1lc3NhZ2UgIiVzIiAoYXJlZiBwYXJlbnQtcmVzdWx0dmVj IDMpKQorICAgICAgICAgICAgKGVscC0tb3V0cHV0LXJlc3VsdCBwYXJlbnQtcmVzdWx0dmVjIHQp CisgICAgICAgICAgICAoZG9saXN0IChjaGlsZC1mdW5jIHJlc3VsdHZlYy1saXN0KQorICAgICAg ICAgICAgICAod2hlbiAoZWxwLS1vdXRwdXQtZnVuY3Rpb24tcCBjaGlsZC1mdW5jKQorICAgICAg ICAgICAgICAgIChlbHAtLW91dHB1dC1yZXN1bHQgY2hpbGQtZnVuYykpKQorICAgICAgICAgICAg KGluc2VydCAiXG4iKSkKKyAgICAgICAgKG1lc3NhZ2UgIn4lcyIgKGFyZWYgcGFyZW50LXJlc3Vs dHZlYyAzKSkpKSkpCisKKyhkZWZ1biBlbHAtLW91dHB1dC1yZXN1bHQgKHJlc3VsdHZlYyAmb3B0 aW9uYWwgcGFyZW50cCkKICAgOzsgb3V0cHV0IHRoZSBSRVNVTFRWRUMgaW50byB0aGUgcmVzdWx0 cyBidWZmZXIuIFJFU1VMVFZFQyBpcyBhIDQgb3IKICAgOzsgbW9yZSBlbGVtZW50IHZlY3RvciB3 aGVyZSBhcmVmIDAgaXMgdGhlIGNhbGwgY291bnQsIGFyZWYgMSBpcyB0aGUKICAgOzsgdG90YWwg dGltZSBzcGVudCBpbiB0aGUgZnVuY3Rpb24sIGFyZWYgMiBpcyB0aGUgYXZlcmFnZSB0aW1lCkBA IC00NTcsMTEgKzUxOCwxNyBAQCBvcmlnaW5hbCBkZWZpbml0aW9uLCB1c2UgXFxbZWxwLXJlc3Rv cmUtZnVuY3Rpb25dIG9yIFxcW2VscC1yZXN0b3JlLWFsbF0uIgogCSAgYXZldGltZSAobnVtYmVy LXRvLXN0cmluZyBhdCkpCiAgICAgOzsgcG9zc2libHkgcHJ1bmUgdGhlIHJlc3VsdHMKICAgICAo aWYgKGFuZCBlbHAtcmVwb3J0LWxpbWl0CisgICAgICAgICAgICAgKG5vdCBwYXJlbnRwKQogCSAg ICAgKG51bWJlcnAgZWxwLXJlcG9ydC1saW1pdCkKIAkgICAgICg8IGNjIGVscC1yZXBvcnQtbGlt aXQpKQogCW5pbAorICAgICAgKHdoZW4gKG5vdCBwYXJlbnRwKQorICAgICAgICAoaW5zZXJ0IGVs cC0taW5kZW50KSkKICAgICAgIChlbHAtb3V0cHV0LWluc2VydC1zeW1uYW1lIHN5bW5hbWUpCi0g ICAgICAoaW5zZXJ0LWNoYXIgMzIgKCsgZWxwLWZpZWxkLWxlbiAoLSAobGVuZ3RoIHN5bW5hbWUp KSAyKSkKKyAgICAgIChpbnNlcnQtY2hhciAzMiAoKyBlbHAtZmllbGQtbGVuCisgICAgICAgICAg ICAgICAgICAgICAgICAgKC0gKGxlbmd0aCBzeW1uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAoaWYgKG5vdCBwYXJlbnRwKSAoLSAobGVuZ3RoIGVscC0taW5kZW50KSkgMCkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAyKSkKICAgICAgIDs7IHByaW50IHN0dWZmIG91dCwgZm9ybWF0 dGluZyBpdCBuaWNlbHkKICAgICAgIChpbnNlcnQgY2FsbGNudCkKICAgICAgIChpbnNlcnQtY2hh ciAzMiAoKyBlbHAtY2MtbGVuICgtIChsZW5ndGggY2FsbGNudCkpIDIpKQpAQCAtNDc4LDcgKzU0 NSw3IEBAIG9yaWdpbmFsIGRlZmluaXRpb24sIHVzZSBcXFtlbHAtcmVzdG9yZS1mdW5jdGlvbl0g b3IgXFxbZWxwLXJlc3RvcmUtYWxsXS4iCiAgICAgKGRlZmluZS1rZXkgbWFwIFtmb2xsb3ctbGlu a10gJ21vdXNlLWZhY2UpCiAgICAgKGRlZmluZS1rZXkgbWFwICJcQy1tIiAnZWxwLXJlc3VsdHMt anVtcC10by1kZWZpbml0aW9uKQogICAgIG1hcCkKLSAgIktleW1hcCB1c2VkIG9uIHRoZSBmdW5j dGlvbiBuYW1lIGNvbHVtbi4iICkKKyAgIktleW1hcCB1c2VkIG9uIHRoZSBmdW5jdGlvbiBuYW1l IGNvbHVtbi4iKQogCiAoZGVmdW4gZWxwLXJlc3VsdHMtanVtcC10by1kZWZpbml0aW9uICgmb3B0 aW9uYWwgZXZlbnQpCiAgICJKdW1wIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmdW5jdGlvbiBh dCBwb2ludC4iCkBAIC01MjQsNjQgKzU5MSw3OCBAQCBkaXNwbGF5ZWQuIgogCSAgIChlbHAtZXQt bGVuICAgIChsZW5ndGggZXQtaGVhZGVyKSkKIAkgICAoYXQtaGVhZGVyICJBdmVyYWdlIFRpbWUi KQogCSAgIChlbHAtYXQtbGVuICAgIChsZW5ndGggYXQtaGVhZGVyKSkKLQkgICAocmVzdmVjICco KSkKLQkgICApCQkJCTsgZW5kIGxldCoKLSAgICAgIChtYXBhdG9tcwotICAgICAgIChsYW1iZGEg KGZ1bnN5bSkKLSAgICAgICAgICh3aGVuIChlbHAtLWluc3RydW1lbnRlZC1wIGZ1bnN5bSkKLSAg ICAgICAgICAgKGxldCogKChpbmZvIChnZXQgZnVuc3ltIGVscC10aW1lci1pbmZvLXByb3BlcnR5 KSkKLSAgICAgICAgICAgICAgICAgIChzeW1uYW1lIChmb3JtYXQgIiVzIiBmdW5zeW0pKQotICAg ICAgICAgICAgICAgICAgKGNjIChhcmVmIGluZm8gMCkpCi0gICAgICAgICAgICAgICAgICAodHQg KGFyZWYgaW5mbyAxKSkpCi0gICAgICAgICAgICAgKGlmIChub3QgaW5mbykKLSAgICAgICAgICAg ICAgICAgKGluc2VydCAiTm8gcHJvZmlsaW5nIGluZm9ybWF0aW9uIGZvdW5kIGZvcjogIgotICAg ICAgICAgICAgICAgICAgICAgICAgIHN5bW5hbWUpCi0gICAgICAgICAgICAgICAoc2V0cSBsb25n ZXN0IChtYXggbG9uZ2VzdCAobGVuZ3RoIHN5bW5hbWUpKSkKLSAgICAgICAgICAgICAgIChwdXNo Ci0gICAgICAgICAgICAgICAgKHZlY3RvciBjYyB0dCAoaWYgKHplcm9wIGNjKQotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCA7YXZvaWQgYXJpdGhtZXRpYyBkaXYtYnktemVy byBlcnJvcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC8gKGZsb2F0IHR0KSAo ZmxvYXQgY2MpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5hbWUpCi0gICAgICAgICAg ICAgICAgcmVzdmVjKSkpKSkpCisJICAgKHJlcy1wbGlzdCBuaWwpKQorICAgICAgKGRvbGlzdCAo ZnVuc3ltIGVscC0taW5zdHJ1bWVudGVkLWZ1bmN0aW9ucykKKyAgICAgICAgOzsocGxpc3QtcHV0 IHJlcy1wbGlzdCBmdW5zeW0gbmlsKQorICAgICAgICAocHVzaCBuaWwgcmVzLXBsaXN0KQorICAg ICAgICAocHVzaCBmdW5zeW0gcmVzLXBsaXN0KSkKKyAgICAgIDs7IGludmVydCB0aGUgY2FsbCBt YXRyaXgKKyAgICAgIChkb2xpc3QgKGNoaWxkLWZ1bmMgZWxwLS1pbnN0cnVtZW50ZWQtZnVuY3Rp b25zKQorICAgICAgICAoZG9saXN0IChwYXJlbnQtZnVuYyBlbHAtLWluc3RydW1lbnRlZC1mdW5j dGlvbnMpCisgICAgICAgICAgKGxldCogKChpbmZvLXBsaXN0IChnZXQgY2hpbGQtZnVuYyBlbHAt dGltZXItaW5mby1wcm9wZXJ0eSkpCisgICAgICAgICAgICAgICAgIChpbmZvIChwbGlzdC1nZXQg aW5mby1wbGlzdCBwYXJlbnQtZnVuYykpCisgICAgICAgICAgICAgICAgIChzeW1uYW1lIChmb3Jt YXQgIiVzIiBjaGlsZC1mdW5jKSkKKyAgICAgICAgICAgICAgICAgKGNjIChhcmVmIGluZm8gMCkp CisgICAgICAgICAgICAgICAgICh0dCAoYXJlZiBpbmZvIDEpKSkKKyAgICAgICAgICAgICh3aGVu IGluZm8KKyAgICAgICAgICAgICAgKHNldHEgbG9uZ2VzdCAobWF4IGxvbmdlc3QgKGxlbmd0aCBz eW1uYW1lKSkpCisgICAgICAgICAgICAgIChwbGlzdC1wdXQgcmVzLXBsaXN0IHBhcmVudC1mdW5j CisgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnMgKHZlY3RvciBjYyB0dCAoaWYgKHplcm9w IGNjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAw LjAgO2F2b2lkIGFyaXRobWV0aWMgZGl2LWJ5LXplcm8gZXJyb3JzCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLyAoZmxvYXQgdHQpIChmbG9hdCBjYykp KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5hbWUpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBsaXN0LWdldCByZXMtcGxpc3QgcGFyZW50LWZ1 bmMpKSkpKSkpCisgICAgICA7OyBwYXJlbnQgPT0gYHQnIHNpZ25hbHMgcGFyZW50IGZ1bmN0aW9u IGlzIG5vdCBwcm9maWxlZAorICAgICAgKGRvbGlzdCAoZnVuc3ltIGVscC0taW5zdHJ1bWVudGVk LWZ1bmN0aW9ucykKKyAgICAgICAgKGxldCogKChpbmZvLXBsaXN0IChnZXQgZnVuc3ltIGVscC10 aW1lci1pbmZvLXByb3BlcnR5KSkKKyAgICAgICAgICAgICAgIChpbmZvIChwbGlzdC1nZXQgaW5m by1wbGlzdCB0KSkKKyAgICAgICAgICAgICAgIChzeW1uYW1lIChmb3JtYXQgIiVzIiBmdW5zeW0p KQorICAgICAgICAgICAgICAgKGNjIChhcmVmIGluZm8gMCkpCisgICAgICAgICAgICAgICAodHQg KGFyZWYgaW5mbyAxKSkpCisgICAgICAgICAgKHBsaXN0LXB1dCByZXMtcGxpc3QgZnVuc3ltCisg ICAgICAgICAgICAgICAgICAgICAoY29ucyAodmVjdG9yIGNjIHR0IChpZiAoemVyb3AgY2MpCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLyAoZmxvYXQgdHQpIChmbG9hdCBj YykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1uYW1lKQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgKHBsaXN0LWdldCByZXMtcGxpc3QgZnVuc3ltKSkpKSkKICAg ICAgIDs7IElmIHByaW50aW5nIHRvIHN0ZG91dCwgaW5zZXJ0IHRoZSBoZWFkZXIgc28gaXQgd2ls bCBwcmludC4KICAgICAgIDs7IE90aGVyd2lzZSB1c2UgaGVhZGVyLWxpbmUtZm9ybWF0LgotICAg ICAgKHNldHEgZWxwLWZpZWxkLWxlbiAobWF4IHRpdGxlbGVuIGxvbmdlc3QpKQotICAgICAgKGlm IChvciBlbHAtdXNlLXN0YW5kYXJkLW91dHB1dCBub25pbnRlcmFjdGl2ZSkKLSAgICAgICAgICAo cHJvZ24KLSAgICAgICAgICAgIChpbnNlcnQgdGl0bGUpCi0gICAgICAgICAgICAoaWYgKD4gbG9u Z2VzdCB0aXRsZWxlbikKLSAgICAgICAgICAgICAgICAocHJvZ24KLSAgICAgICAgICAgICAgICAg IChpbnNlcnQtY2hhciAzMiAoLSBsb25nZXN0IHRpdGxlbGVuKSkpKQotICAgICAgICAgICAgKGlu c2VydCAiICAiIGNjLWhlYWRlciAiICAiIGV0LWhlYWRlciAiICAiIGF0LWhlYWRlciAiXG4iKQot ICAgICAgICAgICAgKGluc2VydC1jaGFyID89IGVscC1maWVsZC1sZW4pCi0gICAgICAgICAgICAo aW5zZXJ0ICIgICIpCi0gICAgICAgICAgICAoaW5zZXJ0LWNoYXIgPz0gZWxwLWNjLWxlbikKLSAg ICAgICAgICAgIChpbnNlcnQgIiAgIikKLSAgICAgICAgICAgIChpbnNlcnQtY2hhciA/PSBlbHAt ZXQtbGVuKQotICAgICAgICAgICAgKGluc2VydCAiICAiKQotICAgICAgICAgICAgKGluc2VydC1j aGFyID89IGVscC1hdC1sZW4pCi0gICAgICAgICAgICAoaW5zZXJ0ICJcbiIpKQotICAgICAgICAo bGV0ICgoY29sdW1uIDApKQotICAgICAgICAgIChzZXRxIGhlYWRlci1saW5lLWZvcm1hdAotICAg ICAgICAgICAgICAgIChtYXBjb25jYXQKLSAgICAgICAgICAgICAgICAgKGxhbWJkYSAodGl0bGUp Ci0gICAgICAgICAgICAgICAgICAgKHByb2cxCi0gICAgICAgICAgICAgICAgICAgICAgIChjb25j YXQKLSAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wZXJ0aXplICIgIgotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXkgKGxpc3QgJ3NwYWNlIDphbGlnbi10byBj b2x1bW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFjZSAnZml4ZWQt cGl0Y2gpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSkKLSAgICAgICAgICAgICAgICAg ICAgIChzZXRxIGNvbHVtbiAoKyBjb2x1bW4gMgotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIChpZiAoPSBjb2x1bW4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZWxwLWZpZWxkLWxlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGxlbmd0aCB0aXRsZSkpKSkpKQotICAgICAgICAgICAgICAgICAobGlzdCB0aXRs ZSBjYy1oZWFkZXIgZXQtaGVhZGVyIGF0LWhlYWRlcikgIiIpKSkpCi0gICAgICA7OyBpZiBzb3J0 aW5nIGlzIGVuYWJsZWQsIHRoZW4gc29ydCB0aGUgcmVzdWx0cyBsaXN0LiBpbiBlaXRoZXIKLSAg ICAgIDs7IGNhc2UsIGNhbGwgZWxwLW91dHB1dC1yZXN1bHQgdG8gb3V0cHV0IHRoZSByZXN1bHQg aW4gdGhlCi0gICAgICA7OyBidWZmZXIKLSAgICAgIChpZiBlbHAtc29ydC1ieS1mdW5jdGlvbgot CSAgKHNldHEgcmVzdmVjIChzb3J0IHJlc3ZlYyBlbHAtc29ydC1ieS1mdW5jdGlvbikpKQotICAg ICAgKG1hcGMgJ2VscC1vdXRwdXQtcmVzdWx0IHJlc3ZlYykpCisgICAgICAobGV0ICgoZWxwLWZp ZWxkLWxlbiAobWF4IHRpdGxlbGVuIGxvbmdlc3QpKSkKKyAgICAgICAgKGlmIChvciBlbHAtdXNl LXN0YW5kYXJkLW91dHB1dCBub25pbnRlcmFjdGl2ZSkKKyAgICAgICAgICAgIChwcm9nbgorICAg ICAgICAgICAgICAoaW5zZXJ0IHRpdGxlKQorICAgICAgICAgICAgICAoaWYgKD4gbG9uZ2VzdCB0 aXRsZWxlbikKKyAgICAgICAgICAgICAgICAgIChpbnNlcnQtY2hhciAzMiAoLSBsb25nZXN0IHRp dGxlbGVuKSkpCisgICAgICAgICAgICAgIChpbnNlcnQgIiAgIiBjYy1oZWFkZXIgIiAgIiBldC1o ZWFkZXIgIiAgIiBhdC1oZWFkZXIgIlxuIikKKyAgICAgICAgICAgICAgKGluc2VydC1jaGFyID89 IGVscC1maWVsZC1sZW4pCisgICAgICAgICAgICAgIChpbnNlcnQgIiAgIikKKyAgICAgICAgICAg ICAgKGluc2VydC1jaGFyID89IGVscC1jYy1sZW4pCisgICAgICAgICAgICAgIChpbnNlcnQgIiAg IikKKyAgICAgICAgICAgICAgKGluc2VydC1jaGFyID89IGVscC1ldC1sZW4pCisgICAgICAgICAg ICAgIChpbnNlcnQgIiAgIikKKyAgICAgICAgICAgICAgKGluc2VydC1jaGFyID89IGVscC1hdC1s ZW4pCisgICAgICAgICAgICAgIChpbnNlcnQgIlxuIikpCisgICAgICAgICAgKGxldCAoKGNvbHVt biAwKSkKKyAgICAgICAgICAgIChzZXRxIGhlYWRlci1saW5lLWZvcm1hdAorICAgICAgICAgICAg ICAgICAgKG1hcGNvbmNhdAorICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKHRpdGxlKQorICAg ICAgICAgICAgICAgICAgICAgKHByb2cxCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNh dAorICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSAiICIKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXkgKGxpc3QgJ3NwYWNlIDphbGlnbi10 byBjb2x1bW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWNlICdm aXhlZC1waXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUpCisgICAgICAgICAg ICAgICAgICAgICAgIChzZXRxIGNvbHVtbiAoKyBjb2x1bW4gMgorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKGlmICg9IGNvbHVtbiAwKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGVscC1maWVsZC1sZW4KKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGxlbmd0aCB0aXRsZSkpKSkpKQorICAgICAgICAgICAg ICAgICAgIChsaXN0IHRpdGxlIGNjLWhlYWRlciBldC1oZWFkZXIgYXQtaGVhZGVyKSAiIikpKSkK KyAgICAgICAgOzsgaWYgc29ydGluZyBpcyBlbmFibGVkLCB0aGVuIHNvcnQgdGhlIHJlc3VsdHMg bGlzdC4gaW4gZWl0aGVyCisgICAgICAgIDs7IGNhc2UsIGNhbGwgZWxwLW91dHB1dC1yZXN1bHQg dG8gb3V0cHV0IHRoZSByZXN1bHQgaW4gdGhlCisgICAgICAgIDs7IGJ1ZmZlcgorICAgICAgICA7 OyAoaWYgZWxwLXNvcnQtYnktZnVuY3Rpb24KKyAgICAgICAgOzsgICAgIChzZXRxIHJlc3ZlYyAo c29ydCByZXN2ZWMgZWxwLXNvcnQtYnktZnVuY3Rpb24pKSkKKyAgICAgICAgKGVscC1vdXRwdXQt ZnVuY3Rpb24gcmVzLXBsaXN0KSkpCiAgICAgOzsgY29weSByZXN1bHRzIHRvIHN0YW5kYXJkLW91 dHB1dD8KICAgICAoaWYgKG9yIGVscC11c2Utc3RhbmRhcmQtb3V0cHV0IG5vbmludGVyYWN0aXZl KQogICAgICAgICAocHJpbmMgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50LW1pbikgKHBvaW50LW1h eCkpKQpkaWZmIC0tZ2l0IGEvdGVzdC9saXNwL2VtYWNzLWxpc3AvZWxwLXRlc3RzLmVsIGIvdGVz dC9saXNwL2VtYWNzLWxpc3AvZWxwLXRlc3RzLmVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAuLmM4MzhjNzI3ODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2xpc3AvZW1h Y3MtbGlzcC9lbHAtdGVzdHMuZWwKQEAgLTAsMCArMSw2NCBAQAorKHJlcXVpcmUgJ2VscCkKKwor KGRlZnVuIGcgKG4pCisgIChmIChhYnMgbikpKQorCisoZGVmdW4gZiAobikKKyAgKHdoZW4gKG5v dCAoPSBuIDApKQorICAgIChmICgxLSBuKSkpKQorCisoZGVmdW4gZ2V0LXRpbWVyLWluZm8gKGZ1 bnN5bSBjYWxsZXIpCisgIChsZXQgKChpbmZvLXBsaXN0IChnZXQgZnVuc3ltIGVscC10aW1lci1p bmZvLXByb3BlcnR5KSkpCisgICAgKG9yIGluZm8tcGxpc3QgKGVycm9yICIlcyBpcyBub3QgaW5z dHJ1bWVudGVkIGZvciBwcm9maWxpbmciIGZ1bnN5bSkpCisgICAgKHBsaXN0LWdldCBpbmZvLXBs aXN0IGNhbGxlcikpKQorCisoZGVmdW4gY2FsbC1jb3VudCAoZnVuc3ltIGNhbGxlcikKKyAgKGxl dCAoKGluZm8gKGdldC10aW1lci1pbmZvIGZ1bnN5bSBjYWxsZXIpKSkKKyAgICAob3IgaW5mbwor ICAgICAgICAoZXJyb3IgIiVzIGlzIG5vdCBpbnN0cnVtZW50ZWQgZm9yIHByb2ZpbGluZyIgY2Fs bGVyKSkKKyAgICAoYXJlZiBpbmZvIDApKSkKKworKGVydC1kZWZ0ZXN0IHJvb3QtZnVuY3Rpb24t aXMtcHJvZmlsZWQgKCkKKyAgKGVscC1pbnN0cnVtZW50LWZ1bmN0aW9uICdnKQorICAoZyAzKQor ICA7OyBmKDMpIC0+IGYoMikgLT4gZigxKSAtPiBmKDApCisgIChzaG91bGQgKD0gKGNhbGwtY291 bnQgIydnIHQpIDEpKQorICAoc2hvdWxkICg9IChjYWxsLWNvdW50ICMnZyAjJ2cpIDApKQorICAo ZWxwLXJlc3RvcmUtYWxsKSkKKworKGVydC1kZWZ0ZXN0IHJlY3Vyc2l2ZS1jYWxscy1ub3QtcHJv ZmlsZWQgKCkKKyAgKGVscC1pbnN0cnVtZW50LWZ1bmN0aW9uICdmKQorICAoZWxwLWluc3RydW1l bnQtZnVuY3Rpb24gJ2cpCisgIChnIDMpCisgIDs7IGYoMykgLT4gZigyKSAtPiBmKDEpIC0+IGYo MCkKKyAgKHNob3VsZCAoPSAoY2FsbC1jb3VudCAjJ2YgIydnKSAxKSkKKyAgKHNob3VsZCAoPSAo Y2FsbC1jb3VudCAjJ2YgIydmKSAzKSkKKyAgKHNob3VsZCAoPSAoY2FsbC1jb3VudCAjJ2YgdCkg MCkpCisgIChlbHAtcmVzdG9yZS1hbGwpKQorCisoZXJ0LWRlZnRlc3QgcHJpbnQtZWxwLXJlc3Vs dCAoKQorICAoc2V0cSBlbHAtLWluc3RydW1lbnRlZC1mdW5jdGlvbnMgYChnIGYpKQorICAobGV0 ICgocmVzLXBsaXN0CisgICAgICAgICBgKGcgKCwodmVjdG9yIDEgMiAzICJnIikKKyAgICAgICAg ICAgICAgLCh2ZWN0b3IgNCA1IDYgImYiKQorICAgICAgICAgICAgICAsKHZlY3RvciAwIDAgMCAi ZyIpKQorICAgICAgICAgICAgICBmICgsKHZlY3RvciAzIDIgMSAiZiIpCisgICAgICAgICAgICAg ICAgICwodmVjdG9yIDkgOSA5ICJmIikpCisgICAgICAgICAgICAgICkpCisgICAgICAgIChlbHAt ZmllbGQtbGVuIDIpCisgICAgICAgIChlbHAtY2MtbGVuIDIpCisgICAgICAgIChlbHAtZXQtbGVu IDIpCisgICAgICAgIChlbHAtYXQtbGVuIDIpKQorICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAg ICAobWVzc2FnZSAoZm9ybWF0ICJlbHAtZmllbGQtbGVuOiAlcyIgZWxwLWZpZWxkLWxlbikpCisg ICAgICAoZWxwLW91dHB1dC1mdW5jdGlvbiByZXMtcGxpc3QpCisgICAgICAobGV0ICgoZmlyc3Qt bGluZSAoYnVmZmVyLXN1YnN0cmluZy1uby1wcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAg ICAgICAgKHBvaW50LW1pbikgKHBvaW50KSkpKQorICAgICAgICAoc2hvdWxkIChlcXVhbCBmaXJz dC1saW5lCisgICAgICAgICAgICAgICAgICAgICAgICIiKSkpKSkKKyAgKGVscC1yZXN0b3JlLWFs bCkpCisKKyhlcnQtZGVmdGVzdCBlbHAtcmVzZXQtdGVzdCAoKQorICAoZWxwLWluc3RydW1lbnQt bGlzdCBgKGcgZikpCisgIChnIDMpCisgIChlbHAtcmVzZXQtZnVuY3Rpb24gJ2cpKQo= --000000000000a63fbf05e64c8f8d--