From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp12.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms9.migadu.com with LMTPS id wJI7DWrwS2Q3CQEASxT56A (envelope-from ) for ; Fri, 28 Apr 2023 18:12:26 +0200 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp12.migadu.com with LMTPS id AOX0DGrwS2SzNwAAauVa8A (envelope-from ) for ; Fri, 28 Apr 2023 18:12:26 +0200 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id F19A539D98 for ; Fri, 28 Apr 2023 18:12:25 +0200 (CEST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1psQ0m-0000Zw-5u; Fri, 28 Apr 2023 11:27:52 -0400 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 1psQ0k-0000Zi-Gm for emacs-orgmode@gnu.org; Fri, 28 Apr 2023 11:27:50 -0400 Received: from ciao.gmane.io ([116.202.254.214]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1psQ0i-0001z3-Gp for emacs-orgmode@gnu.org; Fri, 28 Apr 2023 11:27:50 -0400 Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1psQ0e-000AWB-Fx for emacs-orgmode@gnu.org; Fri, 28 Apr 2023 17:27:44 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: emacs-orgmode@gnu.org From: Max Nikulin Subject: Re: [PATCH v2] Add compat.el support to Org (was: [POLL] Use compat.el in Org? (was: Useful package? Compat.el)) Date: Fri, 28 Apr 2023 22:27:35 +0700 Message-ID: References: <87sfx7degz.fsf@gmail.com> <87v8ks6rhf.fsf@localhost> <87r0t3gahd.fsf@localhost> <87wn2ujk27.fsf@localhost> <87jzymk3dq.fsf@localhost> <87o7nsdkcw.fsf@localhost> <878remykby.fsf@localhost> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------hNUjTNN46gpefisu6rvt9LEc" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.10.0 Content-Language: en-US In-Reply-To: <878remykby.fsf@localhost> Received-SPF: pass client-ip=116.202.254.214; envelope-from=geo-emacs-orgmode@m.gmane-mx.org; helo=ciao.gmane.io X-Spam_score_int: 14 X-Spam_score: 1.4 X-Spam_bar: + X-Spam_report: (1.4 / 5.0 requ) BAYES_00=-1.9, DKIM_ADSP_CUSTOM_MED=0.001, FORGED_GMAIL_RCVD=1, FORGED_MUA_MOZILLA=2.309, FREEMAIL_FORGED_FROMDOMAIN=0.249, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.25, NICE_REPLY_A=-1.422, NML_ADSP_CUSTOM_MED=0.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: emacs-orgmode-bounces+larch=yhetil.org@gnu.org X-Migadu-Country: US X-Migadu-Flow: FLOW_IN ARC-Seal: i=1; s=key1; d=yhetil.org; t=1682698346; a=rsa-sha256; cv=none; b=J8GTa5KIoZ0DLol0uSXZZ2YzroJg+ZdywdENXTRfRnNqLe9QiufpexEzcmxyQLFBJyrEiU PxRvsPCOr4naoEwXIP752EfUw2kKENs/ipCbq5w/R9UQ3ckQLx5cc9xaJ55OKx4YIDHYz8 tRKDXLPyGooYmGC9sZdVF/k82MR2UicRlIl/RL5xMRgzIZV5bnso5HPNCy+84E+fmtB+qZ /eSIdCvaIoCfFYiJzKWWSGFne7QT9vO0vZLsy5//lhtLB1D0DBqINmD8H99JAIBWdI3Lf2 dshX9wdbxgOP9YRaK+7d8qBmuAFPkh2LhM+U016V1OvJ8AscWzHfDY7i2IMF0A== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1682698346; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references:list-id:list-help:list-unsubscribe: list-subscribe:list-post; bh=CdajDwz3x5JGEVqNMf6xBZdB+hp2o/kIljydqXtW0fs=; b=tDG12x0Z51T1TiB7/koOTAcVVGaQNXB6b9IGfBcdQZoLGmXMFcxUlyrYC2KGAYQnWtqTTe HfAxbHPhC43VXEN7XZc7K+wdy+PFYWhzOSvvWrqo3T/GdcwsET1c+BjazrrNm4QxPI1xot FbSyL4HgRghA9aPoniQoOpHICVvb/DBa8MYLwux1znAj2PDRKGG90Y2dkxmvkqWTHiao8S urTXObtSt9v2Sfl5ChcLjCMjGEHYpmHoPVXs/qqfOIxjupj+rW4bOIG7ma2HK3qS5k2as6 rzLsrte5qftjg4rLy1wTMBhjhhr7tMPA2/bddeGTJDvnLNeHnaZAqNWeePl+Bg== X-Migadu-Spam-Score: -0.51 X-Spam-Score: -0.51 X-Migadu-Queue-Id: F19A539D98 X-Migadu-Scanner: scn0.migadu.com Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=gmail.com (policy=none); spf=pass (aspmx1.migadu.com: domain of "emacs-orgmode-bounces+larch=yhetil.org@gnu.org" designates 209.51.188.17 as permitted sender) smtp.mailfrom="emacs-orgmode-bounces+larch=yhetil.org@gnu.org" X-TUID: z5eCab4b3fUc This is a multi-part message in MIME format. --------------hNUjTNN46gpefisu6rvt9LEc Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Ihor, I do not like lengthy emacs commands and make functions to generate them. I think, it is better to move such code to a script. A proof of concept is attached, however it is rather rough draft ./epm.el -Q --epm-dir $(emacs_pkgdir)/emacs-%e install compat ./epm.el -Q -L ~/src/compat install compat or export EPMDIR="$HOME/.cache/epm/emacs-%e" ./epm.el install compat to just abort compilation due to absent dependency ./epm.el missing compat On 20/04/2023 16:27, Ihor Radchenko wrote: > Max Nikulin writes: > >>> Sure. And you will have such option (EFLAGS). By the way, accordingly to (info "(make) Command Variables") or (info "(standards) Command Variables") "Variables for Specifying Commands" https://www.gnu.org/prep/standards/html_node/Command-Variables.html it should be EMACSFLAGS rather than EFLAGS. >> In my opinion, ideally there should be 3 options for dependency management: >> 1. Completely disabled. If load from default paths failed than it is a >> fatal error. > > I have no problem with this approach when using system packages. > However, it is almost guaranteed that compat.el is absent in global > load-path as long as compat.el is not built-in. I see that installation attempt is not performed when packages are available. However form my point of view it is normal when compilation fails when dependency are not provided. It works so for decades for applications that use make. To be precise, usually I expect detection of missed libraries from configure scrips, but in some cases they are missed. Maybe such experience was formed when access to network was limited. For me it is quite natural that make does try to pull dependencies (at least by default) and it is my responsibility to ensure availability of necessary libraries. >> 2. Use specified directory outside of Org tree (~/.emacs.d/elpa by >> default) or any other directory that you named pkgdir. Only dedicated >> target may clean this directory. > > This is mostly an equivalent of -L switch. No, -L is for source directories of package (e.g. git repositories). I mean namely alternative `package-user-dir', but not managed by make. > I do not like the idea of > using ~/.emacs.d/elpa default. It is fragile if this default ever > changes. I still consider it as a reasonable default for a user having just one emacs version who is going to build and run org. Both steps may use the same package directory. A developer who switches between various emacs versions may have set of packages for each emacs version. >> 3. Install packages to Org source/build directory. >> >> You decided to make 3 the default variant. I believe, it should be >> activated by a variable, e.g. AUTODEP = 1 in local.mk or from command >> line "make compile AUTODEP=1 > > It is now activated by EPACKAGES being non-empty. And it is non-empty by default because it defines list of build dependencies, not whether they should be managed by make. >> I think, it is better to require an additional command >> >> make autoloads >> make fetch-dependencies >> make compile > > Maybe. Then, also make doc and make install? In general "make install" may be executed by root while "make all" is a task for regular user. "make doc" is an optional step, so I do not see any problem. Ideally it might be make fetch-dependencies # or specify package directory # or load path in local.mk make all followed by optional doc or install > And make repro, I have not justified my point of view to make repro yet. >> I do not like that versions of dependencies are ignored. I have noticed >> `package-install-from-buffer'. Perhaps it can be used to generate a stub >> package (e.g. org-build-deps) with Package-Requires line obtained from >> org.el. The only purpose of this package is to pull dependencies. It is >> just an idea, I have not tried such approach. > > This sounds fragile. I see no reason to go this far and using so complex > approach. My idea is to ensure that *required* version is installed, not some stale one. I have not tried such approach though. >>> Subject: [PATCH 3/7] Use compat.el library instead of ad-hoc compatibility >>> function set >>> >>> * mk/default.mk (EPACKAGES): Demand compat library during compile time. >> >> when I asked for more granular commits I expected this change in >> >>> Subject: [PATCH 2/7] org-compat: Enable compat.el >> >> To separate adding dependency and replacing org-compat functions to compat. > > For me, PATCH 3/7 grouping is more reasonable. So, I disagree. > Splitting EPACKAGES modification would create transient commit with > non-working Org. I just do not like that a single line change in default.mk (modification of build process) is buried in a large patch (changes of the code). My idea was that > -EPACKAGES ?= > +EPACKAGES ?= compat should be in the same commit as > -;; Package-Requires: ((emacs "26.1")) > +;; Package-Requires: ((emacs "26.1") (compat "29.1.4.1")) Currently patch 2 requires compat, but it is provided till patch 3. Despite in commit 2 the package does not do anything useful, I considered this commit as preparations to actively use introduced dependency. --------------hNUjTNN46gpefisu6rvt9LEc Content-Type: text/x-emacs-lisp; charset=UTF-8; name="epm.el" Content-Disposition: attachment; filename="epm.el" Content-Transfer-Encoding: base64 IyEvYmluL3NoCiI6IjsgIyAtKi0gbW9kZTogZW1hY3MtbGlzcDsgbGV4aWNhbC1iaW5kaW5n OiB0OyAtKi0KIjoiOyBleGVjIGVtYWNzIC0tc2NyaXB0ICIkMCIgIiRAIgoKKHJlcXVpcmUg J2Zvcm1hdC1zcGVjKQoocmVxdWlyZSAncGFja2FnZSkKKHJlcXVpcmUgJ3N1YnIteCkKCihk ZWZ2YXIgZXBtLWRpciBuaWwKICAiT3ZlcnJpZGVzIGBwYWNrYWdlLXVzZXItZGlyJy4iKQoK KGRlZnZhciBlcG0tdmVyYm9zZSBuaWwpCgooZGVmdW4gZXBtLW5vbmVtcHR5LXAgKHMpCiAg KGFuZCBzIChub3QgKHN0cmluZy1lbXB0eS1wIHMpKSkpCgooZGVmdW4gZXBtLWluaXQgKCkK ICAodW5sZXNzIChlcG0tbm9uZW1wdHktcCBlcG0tZGlyKQogICAgKHNldHEgZXBtLWRpciAo Z2V0ZW52ICJFUE1ESVIiKSkpCiAgKHdoZW4gKGVwbS1ub25lbXB0eS1wIGVwbS1kaXIpCiAg ICAobGV0KiAoKGZtdC1leHBhbmRlZCAoZm9ybWF0LXNwZWMgZXBtLWRpciBgKCg/ZSAuICxl bWFjcy12ZXJzaW9uKSkpKQoJICAgKGRpciAoZGlyZWN0b3J5LWZpbGUtbmFtZSAoZXhwYW5k LWZpbGUtbmFtZSBmbXQtZXhwYW5kZWQpKSkpCiAgICAgIDs7IGBwYWNrYWdlLXVzZXItZGly JyB+Ly5lbWFjcy5kL2VscGEgYnkgZGVmYXVsdAogICAgICA7OyBgcGFja2FnZS1kaXJlY3Rv cnktbGlzdCcgZG9lcyBub3QgaW5jbHVkZSBpdAogICAgICAoc2V0cSBwYWNrYWdlLXVzZXIt ZGlyIGRpcikpKQogIChwYWNrYWdlLWluaXRpYWxpemUpKQoKKGRlZnVuIGVwbS1saWJyYXJ5 LXVuYXZhaWxhYmxlLXAgKGxpYikKICAodW5sZXNzIChsb2NhdGUtbGlicmFyeSBsaWIpCiAg ICBsaWIpKQoKKGRlZnVuIGVwbS1taXNzaW5nIChsaWJzKQogIDs7IFRPRE8gY29uc2lkZXIg YHJlcXVpcmUnIGNhdGNoaW5nIGxvYWQgZXJyb3JzCiAgKGRlbHEgbmlsIChtYXBjYXIgIydl cG0tbGlicmFyeS11bmF2YWlsYWJsZS1wIGxpYnMpKSkKCihkZWZ1biBlcG0tY21kLWhlbHAg KF9jbWQgX2FyZ3MpCiAgIkxpc3QgY29tbWFuZHMuIgogIChwcmluYyAiVXNhZ2U6IGVwbSBb LS1kYmd8LS1kZWJ1Zy1vbi1lcnJvcl0gWy0tZXBtLWRpcl0gQ09NTUFORCBBUkdTLi4uCgpD TEkgdG9vbCB0byBpbnN0YWxsIEVMUEEgcGFja2FnZXMuCgpBbnkgRW1hY3Mgb3B0aW9uIG1h eSBiZSBzcGVjaWZpZWQsIGUuZy4gLS1xdWNrLC1RIG9yIC0tZGlyZWN0b3J5LC1MIERJUgoK LS1kYmcsIC0tZGVidWctb24tZXJyb3IKICAgIEVuYWJsZSBgZGVidWctb24tZXJyb3InCgot LWVwbS1kaXIgRElSCiAgICBTZXQgYHBhY2thZ2UtdXNlci1kaXInLgogICAgXCIlZVwiIGlz IHJlcGxhY2VkIGJ5IGBlbWFjcy12ZXJzaW9uJy4KICAgIEFsdGVybmF0aXZlbHkgRVBNRElS IGVudmlyb25tZW50IG1heSBiZSBzcGVjaWZpZWQuClxuIikKICAocGNhc2UtZG9saXN0IChg KCxuYW1lIC4gLGZ1bmMpIGVwbS1jb21tYW5kcykKICAgIChwcmluYyAoY29uY2F0IG5hbWUg IlxuIikpCiAgICAocHJpbmMKICAgICAocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nCiAgICAg ICJcXGBcXHxcbiIgIlxcMSAgICAiCiAgICAgIChkb2N1bWVudGF0aW9uIGZ1bmMpICdmaXhl ZGNhc2UgbmlsKSkKICAgIChwcmluYyAiXG5cbiIpCiAgICApKQoKKGRlZnVuIGVwbS1jbWQt bWlzc2luZyAoXyBsaWJzKQogICJSZXBvcnQgbm90IGluc3RhbGxlZCBsaWJyYXJpZXMgYW5k IGV4aXQgd2l0aCBub24temVybyBjb2RlLiIKICAobGV0ICgobWlzc2luZyAoZXBtLW1pc3Np bmcgbGlicykpKQogICAgKHdoZW4gbWlzc2luZwogICAgICAocHJpbmMgKG1hcGNvbmNhdCAj J2lkZW50aXR5IG1pc3NpbmcgIiAiKSkKICAgICAgKHByaW5jICJcbiIpCiAgICAgIChraWxs LWVtYWNzIDEpKSkpCgooZGVmdW4gZXBtLWNtZC1pbnN0YWxsIChfIGxpYnMpCiAgIkluc3Rh bGwgcGFja2FnZXMgZnJvbSBMSUJTIHRoYXQgYXJlIG5vdCBhdmFpbGFibGUgeWV0IgogIDs7 IFRPRE8gZm9yY2Ugb3B0aW9uIG9yIHVwZGF0ZSBjb21tYW5kCiAgKGxldCAoKG1pc3Npbmcg KGVwbS1taXNzaW5nIGxpYnMpKSkKICAgICh3aGVuIG1pc3NpbmcKICAgICAgKHBhY2thZ2Ut cmVmcmVzaC1jb250ZW50cykKICAgICAgKG1ha2UtZGlyZWN0b3J5IHBhY2thZ2UtdXNlci1k aXIgJ3BhcmVudHMpKQogICAgKGRvbGlzdCAocGtnIG1pc3NpbmcpCiAgICAgIChwYWNrYWdl LWluc3RhbGwgKGludGVybiBwa2cpKSkpKQoKKGRlZnVuIGVwbS1jbWQtcmVwb3J0IChfIGxp YnMpCiAgIlJlcG9ydCBwYXRocyBvZiBhdmFpbGFibGUgbGlicmFyaWVzIgogIChwcmluYyAo Zm9ybWF0ICJwYWNrYWdlLXVzZXItZGlyOiAlc1xuIiBwYWNrYWdlLXVzZXItZGlyKSkKICA7 OyAocHJpbmMgKGZvcm1hdCAibG9hZC1wYXRoOiAlc1xuIiBsb2FkLXBhdGgpKQogIChkb2xp c3QgKG5hbWUgbGlicykKICAgIDs7ICh2ZXJzaW9uLXRvLWxpc3QgdmVyc2lvbikKICAgIChw cmluYyAoZm9ybWF0ICIlLTIwcyAlcyAiIG5hbWUKCQkgICAoaWYgKHBhY2thZ2UtaW5zdGFs bGVkLXAgKGludGVybiBuYW1lKSkKCQkgICAgICAgInBhY2thZ2UgIgoJCSAgICAgIiAgICAg ICAgIikpKQogICAgKHByaW5jIChsb2NhdGUtbGlicmFyeSBuYW1lKSkKICAgIChwcmluYyAi XG4iKSkpCgooZGVmdmFyIGVwbS1jb21tYW5kcwogICcoKCJoZWxwIiAuIGVwbS1jbWQtaGVs cCkKICAgICgiaW5zdGFsbCIgLiBlcG0tY21kLWluc3RhbGwpCiAgICAoIm1pc3NpbmciIC4g ZXBtLWNtZC1taXNzaW5nKQogICAgKCJyZXBvcnQiIC4gZXBtLWNtZC1yZXBvcnQpKSkKCjs7 IFBlcmhhcHMgdGhlcmUgaXMgYSB3YXkgdG8gdXNlIGBjb21tYW5kLXN3aXRjaC1hbGlzdCcu CihkZWZ1biBlcG0tYXJncy1wYXJzZSAoYXJnLWxpc3QpCiAgKGxldCAoKHBhcnNlLW9wdHMg dCkKCXVucHJvY2Vzc2VkCgljbWQpCiAgICAod2hpbGUgKGFuZCBhcmctbGlzdCAob3IgcGFy c2Utb3B0cyAobm90IGNtZCkpKQogICAgICAocGNhc2UgKHBvcCBhcmctbGlzdCkKCSgiLS0i CgkgKHNldHEgcGFyc2Utb3B0cyBuaWwpKQoJKChhbmQgKGd1YXJkIHBhcnNlLW9wdHMpIDs7 IG90aGVyd2lzZSBwcm9jZXNzZWQgYWZ0ZXIgc2NyaXB0IGV4aXQKCSAgICAgIChvciAiLUwi IChwcmVkIChsYW1iZGEgKHgpIChzdHJpbmctcHJlZml4LXAgeCAiLS1kaXJlY3RvcnkiKSkp KSkKCSAocHVzaAoJICAoZXhwYW5kLWZpbGUtbmFtZSAoY29tbWFuZC1saW5lLW5vcm1hbGl6 ZS1maWxlLW5hbWUKCQkJICAgICAocG9wIGFyZy1saXN0KSkpCgkgIGxvYWQtcGF0aCkpCgko KGFuZCAoZ3VhcmQgcGFyc2Utb3B0cykgIi0tZXBtLWRpciIpCgkgKHNldHEgZXBtLWRpciAo cG9wIGFyZy1saXN0KSkpCgkoKGFuZCAoZ3VhcmQgcGFyc2Utb3B0cykgKG9yICItLWRiZyIg Ii0tZGVidWctb24tZXJyb3IiKSkKCSA7OyAtZCBpcyBoYW5kbGVkIGFzIC0tZGlzcGxheSwg LS1kZWJ1ZyBhcyAtLWRlYnVnLWluaXQKCSAoc2V0cSBkZWJ1Zy1vbi1lcnJvciB0KSkKCSgo YW5kIChndWFyZCAobm90IGNtZCkpIChwcmVkIChzdHJpbmctbWF0Y2gtcCAiXFxgW14tXSIp KSBhcmcpCgkgKHB1c2ggYXJnIGNtZCkKCSAodW5sZXNzIHBhcnNlLW9wdHMKCSAgIChwdXNo ICItLSIgY21kKSkpCgkoYXJnCgkgKGlmIGNtZCAocHVzaCBhcmcgY21kKSAocHVzaCBhcmcg dW5wcm9jZXNzZWQpKSkpKQogIChjb25zIChucmV2ZXJzZSBjbWQpIChucmV2ZXJzZSB1bnBy b2Nlc3NlZCkpKSkKCihwY2FzZS1sZXQgKChgKCxjbWQgLiAsdW5wcm9jZXNzZWQpIChlcG0t YXJncy1wYXJzZSBjb21tYW5kLWxpbmUtYXJncy1sZWZ0KSkpCiAgKHVubGVzcyAoc2V0cSBj b21tYW5kLWxpbmUtYXJncy1sZWZ0IHVucHJvY2Vzc2VkKQogICAgKGVwbS1pbml0KQogICAg KGxldCAoKGZ1bmMgKGNkciAoYXNzb2MgKGNhciBjbWQpIGVwbS1jb21tYW5kcykpKSkKICAg ICAgKGlmIGZ1bmMKCSAgKGZ1bmNhbGwgZnVuYyAoY2FyIGNtZCkgKGNkciBjbWQpKQoJKGVy cm9yICJVbmtub3duIGNvbW1hbmQgJXMiIChjYXIgY21kKSkpKSkpCg== --------------hNUjTNN46gpefisu6rvt9LEc--