From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Danny Freeman via "Bug reports for GNU Emacs, the Swiss army knife of text editors" Newsgroups: gmane.emacs.bugs Subject: bug#58790: Eglot URI parsing bug when using clojure-lsp server Date: Mon, 31 Oct 2022 10:40:22 -0400 Message-ID: <4d50b820-7053-75eb-5b11-d3d36a02b013@dfreeman.email> References: <8cf8ba5d-c604-b2dc-274a-7597b19fb73f@dfreeman.email> <87ilk5xq01.fsf@gmail.com> <87r0yrwfn3.fsf@gmail.com> <37716e41-5955-99f6-5204-e760a716fbf6@yandex.ru> <9bb290c8-f000-31d8-265d-b5441c33eb38@dfreeman.email> Reply-To: Danny Freeman Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------0HhFE34BX7RjIzlTVDyCKbjZ" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="12083"; mail-complaints-to="usenet@ciao.gmane.io" Cc: 58790@debbugs.gnu.org, Stefan Kangas To: Dmitry Gutov , =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Mon Oct 31 15:41:23 2022 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1opVyc-0002wI-Gc for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 31 Oct 2022 15:41:23 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1opVyL-0005Lm-O9; Mon, 31 Oct 2022 10:41:05 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1opVyI-00051C-LU for bug-gnu-emacs@gnu.org; Mon, 31 Oct 2022 10:41:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1opVyI-0000Op-6s for bug-gnu-emacs@gnu.org; Mon, 31 Oct 2022 10:41:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1opVyI-00043v-0B for bug-gnu-emacs@gnu.org; Mon, 31 Oct 2022 10:41:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Danny Freeman Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 31 Oct 2022 14:41:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 58790 X-GNU-PR-Package: emacs Original-Received: via spool by 58790-submit@debbugs.gnu.org id=B58790.166722723115571 (code B ref 58790); Mon, 31 Oct 2022 14:41:01 +0000 Original-Received: (at 58790) by debbugs.gnu.org; 31 Oct 2022 14:40:31 +0000 Original-Received: from localhost ([127.0.0.1]:41474 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1opVxm-000434-O2 for submit@debbugs.gnu.org; Mon, 31 Oct 2022 10:40:31 -0400 Original-Received: from out0.migadu.com ([94.23.1.103]:48063) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1opVxj-00042v-S0 for 58790@debbugs.gnu.org; Mon, 31 Oct 2022 10:40:29 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dfreeman.email; s=key1; t=1667227226; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=vF70c3FvKB48pZwP5dMrrGUK/IqXMS55jQeatyYAkyw=; b=tgPYxBai8bIgp35QfJj+Zk4Y+KZ/qHN/jbB5dsQTD+xE44FXDTFPzTbdZH+eKGcu+9552w WESfOYupyk9vR6dQJ6Pqw5RfD8O4BNiZitcgzB/LZBOMPf4quSqUuv7SLR6ACkp5iQNFYK aEMKwhrxdSdLcsYFkPjeqJYynTVt2ng= Content-Language: en-US X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. Autocrypt: addr=danny@dfreeman.email; keydata= xsFNBF/FF5oBEACwm2hCve4DBa0zxaHGuT5G8ul/QXCCeFXgDpmQv56giEh1aeFz0O1NkbcV 4Y/1aw8Jwc2A84QuYbYDXiuLGyB8DSUAGbZCgSz5pJadSniv7Qy/fNsE7gb23+vqcZRZ1Wcc 0C5pEuCVnqqim9hBirTahbQXVj8cXocI9hKxCSDJDHc0RABi4llTRWAQXNGxImaQqFML2IEG I5LoWbLswdoZNfE181lX2iY9EeH1SyOHL6VN3O+EMpsfe3409Vc4OXABTb64RX4JchtfSgil LVPq1mK5xKOacmTPe+gQytdIvmCsw+bvD2Isuao1vSfwsFaFpl6p1AhSx9SXl9SsSML4FUVV kQVYbDThp8epGu6ceVswU96ZFYBlLARTI9EwzfvoClBkHtj6TNVBzIYK8IIOHolY26qYXNk9 bOn0eeEezkB37/DM81Z9OzYmwHlmeFLSzhNk/106uFSL2X1N3o2Yowz4Na0y0TwkG5KFvyAb c5dN3YWFhqjIZ0yoc1XJExzn/cuV8JJd8QZ5wDGbX/nbLhBxVlYPUhdbx6c/Xm5L24tOwy8+ EXUFFmPVs8wTON/sjRzrlkhrai32PIO1LUTzqrDTW05bqH3BCpP9ilOwvt4Reegg9NNk9G0o kY4ANlUip4x7nt4pD9SH29BlJ/F3NHJODprJ6IQ3vU+GF538LwARAQABzSREYW5ueSBGcmVl bWFuIDxkYW5ueUBkZnJlZW1hbi5lbWFpbD7CwY4EEwEIADgWIQRmWaR91YJz1zZ7X1Q2nVVu IE0Z1gUCYeXbkgIbAwULCQgHAgYVCgkICwIEFg In-Reply-To: <9bb290c8-f000-31d8-265d-b5441c33eb38@dfreeman.email> X-Migadu-Flow: FLOW_OUT X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: "bug-gnu-emacs" Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:246695 Archived-At: This is a multi-part message in MIME format. --------------0HhFE34BX7RjIzlTVDyCKbjZ Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit I have a new patch attached that does what João suggested in the 5 point list, which I will respond to again > 2. Eglot converts the URI X into a some file designator Y, using > eglot--uri-to-path. Y may or may not be === X, as long as there is > exactly one X for every Y. Eglot makes xref-item objects from it > using xref-make-match and xref-make-file-location. The designator Y > goes into the 'file' slot of the xref-file-location object. The patch leaves X === Y for `jar` type URIs. My updated packages now deals with the full jar URIs. No conversion are done. My new package can be found here: https://git.sr.ht/~dannyfreeman/jarchive/tree/9148ed7ada03ff2516f6e4ede20c453974d6da19/item/jarchive.el > 4. B2 can be setup in a way so that project-current returns the same > object which is returned in B. If this is true, > eglot--current-server discovers the same connection which also > manages B1 and Eglot adds buffer B2 to the list of managed buffers in > that connection. > > However, if eglot-extend-to-xref is non-nil, eglot--current-server > should also discover the correct connection. This is less ideal than > making project-current know that the buffers of source code inside > the jar are also in the same project, but it works. I can explain > the downsides, but it's not very relevant right now. My newly updated package does nothing with `project-current`, as I have no obvious way to access the previous project when extracting files from the jar. (Extracting now happens in `insert-file-contents` instead of `get-file-buffer`) BUT eglot-extend-to-xref works as it should with this, and I think I prefer that. It allows people who don't want that behavior to disable `eglot-extend-to-xref` and have eglot start up a new lsp server when visiting the file. Idk why anyone would want that but you never know. > 5. Upon findin the "file", Eglot transmits a :textDocument/didOpen > notification to the server. This requires eglot--path-to-uri, the > reciprocal of eglot--uri-to-path to convert the path Y to URI X > again. Again, maybe this conversion is just #'identity. > > Eventually, the LSP server knows that the client is now working on a > textDocument whose relationship to other opened documents in the > workspace it understands (which may or may not be read-only). Sending the full jar uri back to the lsp server worked exactly as intended here. I am honestly surprised I didn't have to change anything in clojure-lsp. It can do it's analysis on the file without issue. > 6. xref-find-definition on any part of the B2 should now work similarly > to this whole flow. It does!!!!! As for this question > I don't know what happens if another server also points to the same file. > Probably nothing very bad, but there may be some suprising behavior: I > haven't tested. The same file continues to work with respect to the original lsp server that was used to open it. The second lsp server is not conidered. I guess because eglot can only work with one lsp server at a time. If you want to associate the un-jar'd file with the second server, close it and xref-find-defintions to it from a file in the second server. That seems like a fine workaround to me, and its not something I've ever encountered in my routine development workflow. So, what do yall think about the patch? Is that something you might consider for eglot? I believe I could also accomplish something similar with "advice" in my package and leave eglot alone, but I would be poking at eglot internals which seems not ideal. --------------0HhFE34BX7RjIzlTVDyCKbjZ Content-Type: text/x-patch; charset=UTF-8; name="0001-Do-not-parse-jar-type-URIs-provided-by-lsp-servers-i.patch" Content-Disposition: attachment; filename*0="0001-Do-not-parse-jar-type-URIs-provided-by-lsp-servers-i.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA2NzFkMzExN2JkOWE4MTA2MTZkZDViYmRmZmZhMThlOTFhNGQ5ODk2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBkYW5ueWZyZWVtYW4gPGRhbm55QGRmcmVlbWFuLmVt YWlsPgpEYXRlOiBNb24sIDMxIE9jdCAyMDIyIDEwOjAxOjIxIC0wNDAwClN1YmplY3Q6IFtQ QVRDSF0gRG8gbm90IHBhcnNlIGphciB0eXBlIFVSSXMgcHJvdmlkZWQgYnkgbHNwIHNlcnZl cnMgaW4gZWdsb3QKCkNsb2p1cmUtbHNwIGFuZCBwb3NzaWJseSBvdGhlciBsc3Agc2VydmVy cyBmb3IgSlZNIGxhbmd1YWdlcywgY2FuCnByb3ZpZGUgZmlsZSBsb2NhdGlvbnMgYXMgamFy IHNjaGVtZSBVUklzIGZvciBkZXBlbmRlbmNpZXMgbG9jYXRlZAppbnNpZGUgb2YgamFyIGFy Y2hpdmVzLiBUaGVzZSBVUklzIGNvbnRhaW4gbmVzdGVkIFVSSXMgdGhhdCBFbWFjcyBvdXQg b2YKdGhlIGJveCBkb2VzIG5vdCBrbm93IGhvdyB0byB3b3JrIHdpdGguIEV4YW1wbGU6CiAg amFyOmZpbGU6Ly8vcGF0aC90by9saWIuamFyIS9wYXRoL2luc2lkZS9qYXIvc291cmNlLmV4 dAoKRXZlbiBpZiB0aGV5IGFyZSBwYXJzZWQgdHdpY2UsIHRoZSBsb2NhdGlvbnMgYXJlIG9m IHRoZSBmb3JtYXQKICAvcGF0aC90by9saWIuamFyIS9wYXRoL2luc2lkZS9qYXIvc291cmNl LmV4dAp3aGljaCBFbWFjcyBhbHNvIGRvZXMgbm90IGtub3cgaG93IHRvIGhhbmRsZS4KClRo aXMgY29tbWl0IGludHJvZHVjZXMgYSB2YXIgYGVnbG90LXByZXNlcnZlLWphci11cmlgIHRo YXQsIHdoZW4gdHJ1ZSwKd2lsbCBwYXNzIGFsb25nIGphciBVUklzIHdpdGhvdXQgcGFyc2lu ZyB0aGVtLiBUaGlzIGFsbG93cyBvdGhlcgpwYWNrYWdlcyB0byBoYW5kbGUgdGhlbSB0aHJv dWdoIHRoZSBgZmlsZS1uYW1lLWhhbmRsZXItYWxpc3RgIG1lY2hhbmlzbS4KQWRkaXRpb25h bGx5LCBhbnkgamFycyBzZW50IEJBQ0sgdG8gdGhlIGxzcCBzZXJ2ZXIgYnkgZWdsb3Qgd2ls bCBhbHNvCnJlbWFpbiBpbiB0aGUgYGphcmAgZm9ybWF0LCB3aGljaCBhdCBsZWFzdCBjbG9q dXJlLWxzcCBrbm93cyBob3cgdG8KaW50ZXJwcmV0LgoKR2l2ZW4gdGhlIGNvcnJlY3QgZmls ZS1uYW1lLWhhbmRsZXItYWxpc3QgaW1wbGVtZW50YXRpb24sIHRoaXMgY2hhbmdlCmFsbG93 cyB4cmVmIHRvIG5hdmlnYXRlIHRvIGEgZmlsZSB3aXRoaW4gYSBqYXIuIFdoZW4KYGVnbG90 LWV4dGVuZC10by14cmVmYCBvcHRpb24gaXMgZW5hYmxlZCwgZWdsb3QgY2FuIGNvcnJlY3Rs eSBjb25uZWN0IHRvCnRoZSBwcmV2aW91cyBsc3Agc2VydmVyIGFuZCBjb250aW51ZSB0byB3 b3JrIGluIHRoZSBuZXdseSBvcGVuZWQgZmlsZS4KClRvIGVuc3VyZSBjbG9qdXJlLWxzcCBz ZXJ2ZXJzIGFsd2F5cyB1c2UgdGhlICJqYXIiIFVSSSBzY2hlbWUgZm9yIHRoZXNlCnR5cGVz IG9mIGRlcGVuZGVuY2llcywgYW4gaW5pdGlhbGl6YXRpb24gb3B0aW9uIGlzIHNldC4gVGhl IGRlZmF1bHQKb3B0aW9uLCB0aGUgInppcGZpbGUiIHNjaGVtZSwgaXMgdmVyeSBzaW1pbGFy IHRvIHRoZSBqYXIKc2NoZW1lLiBIb3dldmVyLCB0aGUgInppcGZpbGUiIHNjaGVtZSBpcyBz b21ldGhpbmcgdGhhdCB0aGUgY2xvanVyZS1sc3AKbWFpbnRhaW5lcnMgd2FudCB0byBtb3Zl IGF3YXkgZnJvbSBhbmQgZXZlbnR1YWxseSByZW1vdmUuCi0tLQogbGlzcC9wcm9nbW9kZXMv ZWdsb3QuZWwgfCAzNyArKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tCiAx IGZpbGUgY2hhbmdlZCwgMjUgaW5zZXJ0aW9ucygrKSwgMTIgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvbGlzcC9wcm9nbW9kZXMvZWdsb3QuZWwgYi9saXNwL3Byb2dtb2Rlcy9lZ2xv dC5lbAppbmRleCBjNTg3MDYxODM3Li5iOGY1MGUzY2Q4IDEwMDY0NAotLS0gYS9saXNwL3By b2dtb2Rlcy9lZ2xvdC5lbAorKysgYi9saXNwL3Byb2dtb2Rlcy9lZ2xvdC5lbApAQCAtMjMx LDcgKzIzMSw3IEBAIGVnbG90LXNlcnZlci1wcm9ncmFtcwogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoaHRtbC1tb2RlIC4gLChlZ2xvdC1hbHRlcm5hdGl2ZXMgJygoInZz Y29kZS1odG1sLWxhbmd1YWdlLXNlcnZlciIgIi0tc3RkaW8iKSAoImh0bWwtbGFuZ3VhZ2Vz ZXJ2ZXIiICItLXN0ZGlvIikpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KGRvY2tlcmZpbGUtbW9kZSAuICgiZG9ja2VyLWxhbmdzZXJ2ZXIiICItLXN0ZGlvIikpCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2xvanVyZS1tb2RlIGNsb2p1cmVz Y3JpcHQtbW9kZSBjbG9qdXJlYy1tb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLiAoImNsb2p1cmUtbHNwIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAuICgiY2xvanVyZS1sc3AiIDppbml0aWFsaXphdGlvbk9wdGlvbnMgKDpkZXBlbmRl bmN5LXNjaGVtZSAiamFyIikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo Y3NoYXJwLW1vZGUgLiAoIm9tbmlzaGFycCIgIi1sc3AiKSkKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKHB1cmVzY3JpcHQtbW9kZSAuICgicHVyZXNjcmlwdC1sYW5ndWFn ZS1zZXJ2ZXIiICItLXN0ZGlvIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChwZXJsLW1vZGUgLiAoInBlcmwiICItTVBlcmw6Okxhbmd1YWdlU2VydmVyIiAiLWUiICJQ ZXJsOjpMYW5ndWFnZVNlcnZlcjo6cnVuIikpCkBAIC0xNDkyLDI1ICsxNDkyLDM4IEBAIGVn bG90LS11cmktcGF0aC1hbGxvd2VkLWNoYXJzCiAgICAgdmVjKQogICAiTGlrZSBgdXJsLXBh dGgtYWxsb3dzLWNoYXJzJyBidXQgbW9yZSByZXN0cmljdGl2ZS4iKQogCisoZGVmdmFyIGVn bG90LXByZXNlcnZlLWphci11cmkgbmlsCisgICJJZiBub24tbmlsLCBqYXI6IHR5cGUgVVJJ cyB3aWxsIG5vdCBiZSBjb252ZXJ0ZWQgdG8gcGF0aHMuCitUaGlzIG1lYW5zIHRoZXkgd2ls bCBiZSBwcm92aWRlZCB0byB4cmVmIGFzIFVSSXMgYW5kIG5vdCBmaWxlIHBhdGhzLiIpCisK IChkZWZ1biBlZ2xvdC0tcGF0aC10by11cmkgKHBhdGgpCiAgICJVUklmeSBQQVRILiIKLSAg KGxldCAoKHRydWVwYXRoIChmaWxlLXRydWVuYW1lIHBhdGgpKSkKLSAgICAoY29uY2F0ICJm aWxlOi8vIgotICAgICAgICAgICAgOzsgQWRkIGEgbGVhZGluZyAiLyIgZm9yIGxvY2FsIE1T IFdpbmRvd3Mtc3R5bGUgcGF0aHMuCi0gICAgICAgICAgICAoaWYgKGFuZCAoZXEgc3lzdGVt LXR5cGUgJ3dpbmRvd3MtbnQpCi0gICAgICAgICAgICAgICAgICAgICAobm90IChmaWxlLXJl bW90ZS1wIHRydWVwYXRoKSkpCi0gICAgICAgICAgICAgICAgIi8iKQotICAgICAgICAgICAg KHVybC1oZXhpZnktc3RyaW5nCi0gICAgICAgICAgICAgOzsgQWdhaW4gd2F0Y2ggb3V0IGZv ciB0cmFtcHkgcGF0aHMuCi0gICAgICAgICAgICAgKGRpcmVjdG9yeS1maWxlLW5hbWUgKGZp bGUtbG9jYWwtbmFtZSB0cnVlcGF0aCkpCi0gICAgICAgICAgICAgZWdsb3QtLXVyaS1wYXRo LWFsbG93ZWQtY2hhcnMpKSkpCisgIChpZiAoYW5kIGVnbG90LXByZXNlcnZlLWphci11cmkg KGVxdWFsICJqYXIiICh1cmwtdHlwZSAodXJsLWdlbmVyaWMtcGFyc2UtdXJsIHBhdGgpKSkp CisgICAgICBwYXRoCisgICAgKGxldCAoKHRydWVwYXRoIChmaWxlLXRydWVuYW1lIHBhdGgp KSkKKyAgICAgIChjb25jYXQgImZpbGU6Ly8iCisgICAgICAgICAgICAgIDs7IEFkZCBhIGxl YWRpbmcgIi8iIGZvciBsb2NhbCBNUyBXaW5kb3dzLXN0eWxlIHBhdGhzLgorICAgICAgICAg ICAgICAoaWYgKGFuZCAoZXEgc3lzdGVtLXR5cGUgJ3dpbmRvd3MtbnQpCisgICAgICAgICAg ICAgICAgICAgICAgIChub3QgKGZpbGUtcmVtb3RlLXAgdHJ1ZXBhdGgpKSkKKyAgICAgICAg ICAgICAgICAgICIvIikKKyAgICAgICAgICAgICAgKHVybC1oZXhpZnktc3RyaW5nCisgICAg ICAgICAgICAgICA7OyBBZ2FpbiB3YXRjaCBvdXQgZm9yIHRyYW1weSBwYXRocy4KKyAgICAg ICAgICAgICAgIChkaXJlY3RvcnktZmlsZS1uYW1lIChmaWxlLWxvY2FsLW5hbWUgdHJ1ZXBh dGgpKQorICAgICAgICAgICAgICAgZWdsb3QtLXVyaS1wYXRoLWFsbG93ZWQtY2hhcnMpKSkp KQorCisoZGVmdW4gZWdsb3QtLXBhcnNlLXVyaSAodXJpKQorICAiVHJ5IHRvIHBhcnNlIGEg VVJJLiIKKyAgKGxldCAoKHVybCAodXJsLWdlbmVyaWMtcGFyc2UtdXJsIHVyaSkpKQorICAg IChpZiAoYW5kIGVnbG90LXByZXNlcnZlLWphci11cmkgKHN0cmluZz0gImphciIgKHVybC10 eXBlIHVybCkpKQorICAgICAgICB1cmkKKyAgICAgICh1cmwtdW5oZXgtc3RyaW5nICh1cmwt ZmlsZW5hbWUgdXJsKSkpKSkKIAogKGRlZnVuIGVnbG90LS11cmktdG8tcGF0aCAodXJpKQog ICAiQ29udmVydCBVUkkgdG8gZmlsZSBwYXRoLCBoZWxwZWQgYnkgYGVnbG90LS1jdXJyZW50 LXNlcnZlcicuIgogICAod2hlbiAoa2V5d29yZHAgdXJpKSAoc2V0cSB1cmkgKHN1YnN0cmlu ZyAoc3ltYm9sLW5hbWUgdXJpKSAxKSkpCiAgIChsZXQqICgoc2VydmVyIChlZ2xvdC1jdXJy ZW50LXNlcnZlcikpCiAgICAgICAgICAocmVtb3RlLXByZWZpeCAoYW5kIHNlcnZlciAoZWds b3QtLXRyYW1waXNoLXAgc2VydmVyKSkpCi0gICAgICAgICAocmV0dmFsICh1cmwtdW5oZXgt c3RyaW5nICh1cmwtZmlsZW5hbWUgKHVybC1nZW5lcmljLXBhcnNlLXVybCB1cmkpKSkpCisg ICAgICAgICAocmV0dmFsIChlZ2xvdC0tcGFyc2UtdXJpIHVyaSkpCiAgICAgICAgICA7OyBS ZW1vdmUgdGhlIGxlYWRpbmcgIi8iIGZvciBsb2NhbCBNUyBXaW5kb3dzLXN0eWxlIHBhdGhz LgogICAgICAgICAgKG5vcm1hbGl6ZWQgKGlmIChhbmQgKG5vdCByZW1vdGUtcHJlZml4KQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVxIHN5c3RlbS10eXBlICd3aW5kb3dz LW50KQotLSAKMi4zNy4zCgo= --------------0HhFE34BX7RjIzlTVDyCKbjZ--