Subject: Re: [bug#38596] [PATCH] gnu: Add PureScript.

From: John Soo <[email-masked]>
Date: Thu, 07 May 2020 17:32:18 -0700

Hello,

Christopher Baines <[email-masked]> writes:

> Some really minor description things I missed earlier:
>
> ghc-aeson-better-errors, ghc-transformers and ghc-websockets have URLs
> in the description, @url could probably be used.
>
> I'd also remove the following from the ghc-bower-json description, it
> reads more like uninformative advertising to me and isn't really
> relevant to this specific package:
>
>   Bower is a package manager for the web (see http://bower.io).

Done!

> Maybe it would be good to note why the package in Guix didn't work, like
> I tried to use [email-masked], and the build phase failed with some
> type errors. That'll at least point out clearly that there's an
> incompatability. I don't think much detail is needed, the following
> would be fine.
>
>      `(("ghc-happy" ,ghc-happy-1.19.9)  ; build fails with 1.19.12

Done!

>> Ah thanks for the suggestion here. I found one that could be taken from
>> the existing package in (gnu packages haskell-xyz). The rest seemed to
>> be either pinned exactly or too strict to take from guix packages.
>
> Thanks, although my intent was more about adding something like this.
>
>   #:phases
>   (modify-phases %standard-phases
>     (add-after 'unpack 'patch
>       (lambda _
>         (substitute* "purescript.cabal"
>           (("clock .*$")
>            "clock,\n"))
>         #t)))))

With the addition of a patch I was able to relax most of the package
versions I introduced to ones we have. The final remaining required
dependency seems to be happy which I kept at 1.19.9.

> Now I'm not sure quite how risky this is, the purescript tests aren't
> being run, but given this is Haskell and it compiles, hopefully that
> provides some guarantees.
>
> What do you think?

My only caveat too is now I have not really tested this version. I had
done some work with a prior version.  I wish I could run the tests but
they seem to rely heavily on npm and bower.

Thanks again,

John

>From 561ac9e3b4fac1aa57e41173db4eeeed1bbd4f41 Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 07:00:31 -0800
Subject: [PATCH 01/17] gnu: Add ghc-utf8-light.

* gnu/packages/haskell-xyz.scm (ghc-utf8-light): New variable.
---
 gnu/packages/haskell-xyz.scm | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/gnu/packages/haskell-xyz.scm b/gnu/packages/haskell-xyz.scm
index c9119efd69..1ff6f30141 100644
--- a/gnu/packages/haskell-xyz.scm
+++ b/gnu/packages/haskell-xyz.scm
@@ -12671,6 +12671,31 @@ a style ready for qualification, that is, you should import them by
 parser that uses ByteStrings for parsing and representing the URI data.")
     (license license:bsd-3)))
 
+(define-public ghc-utf8-light
+  (package
+    (name "ghc-utf8-light")
+    (version "0.4.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/utf8-light/utf8-light-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0rwyc5z331yfnm4hpx0sph6i1zvkd1z10vvglhnp0vc9wy644k0q"))))
+    (build-system haskell-build-system)
+    (home-page
+     "http://hackage.haskell.org/package/utf8-light")
+    (synopsis "Lightweight unicode support for Haskell")
+    (description
+     "This package profides a class for encoding and decoding UTF8 strings
+with instances for several common types.  It also includes several functions
+for working with UTF8.  It aims to be lightweight, depending only on Base and
+including only one module.")
+    (license license:bsd-3)))
+
 (define-public ghc-utf8-string
   (package
     (name "ghc-utf8-string")
-- 
2.26.2

>From 5e2bedbb1a6aec231841af1ad4557291b641d857 Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 07:04:13 -0800
Subject: [PATCH 02/17] gnu: Add ghc-transformers.

* gnu/packages/haskell-xyz.scm (ghc-transformers): New variable.
---
 gnu/packages/haskell-xyz.scm | 39 ++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/gnu/packages/haskell-xyz.scm b/gnu/packages/haskell-xyz.scm
index 1ff6f30141..6a4d958490 100644
--- a/gnu/packages/haskell-xyz.scm
+++ b/gnu/packages/haskell-xyz.scm
@@ -12127,6 +12127,45 @@ from a shell.  The @code{tldr} pages are a community effort to simplify the
 man pages with practical examples.")
     (license license:bsd-3)))
 
+(define-public ghc-transformers
+  (package
+    (name "ghc-transformers")
+    (version "0.5.6.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/transformers/transformers-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0v66j5k0xqk51pmca55wq192qyw2p43s2mgxlz4f95q2c1fpjs5n"))))
+    (build-system haskell-build-system)
+    (home-page
+     "http://hackage.haskell.org/package/transformers")
+    (synopsis "Concrete functor and monad transformers")
+    (description
+     "Transformers provides functor and monad transformers, inspired by the
+paper \"Functional Programming with Overloading and Higher-Order
+Polymorphism\", by Mark P Jones, in Advanced School of Functional Programming,
+1995 @url{http://web.cecs.pdx.edu/~mpj/pubs/springschool.html}.
+
+This package contains:
+@itemize
+@item the monad transformer class (in @code{Control.Monad.Trans.Class})
+@item concrete functor and monad transformers, each with associated operations
+and functions to lift operations associated with other transformers.
+@end itemize
+
+This package can be used on its own in portable Haskell code, in which case
+operations need to be manually lifted through transformer stacks (see
+@code{Control.Monad.Trans.Class} for some examples).  Alternatively, it can be
+used with the non-portable monad classes in the mtl or monads-tf packages,
+which automatically lift operations introduced by monad transformers through
+other transformers.")
+    (license license:bsd-3)))
+
 (define-public ghc-transformers-base
   (package
     (name "ghc-transformers-base")
-- 
2.26.2

>From 13e623d00b1cdbc525afc810e58e488de346beb4 Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 07:06:52 -0800
Subject: [PATCH 03/17] gnu: Add ghc-tasty-hspec.

* gnu/packages/haskell-check.scm (ghc-tasty-hspec): New variable.
---
 gnu/packages/haskell-check.scm | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/gnu/packages/haskell-check.scm b/gnu/packages/haskell-check.scm
index c6e89460ea..7942f2019a 100644
--- a/gnu/packages/haskell-check.scm
+++ b/gnu/packages/haskell-check.scm
@@ -215,6 +215,39 @@ with the @url{https://hackage.haskell.org/package/tasty, tasty testing
 framework}.")
     (license license:bsd-3)))
 
+(define-public ghc-tasty-hspec
+  (package
+    (name "ghc-tasty-hspec")
+    (version "1.1.5.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/tasty-hspec/tasty-hspec-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0i9kdzjpk750sa078jj3iyhp72k0177zk7vxl131r6dkyz09x27y"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-hspec" ,ghc-hspec)
+       ("ghc-hspec-core" ,ghc-hspec-core)
+       ("ghc-quickcheck" ,ghc-quickcheck)
+       ("ghc-tasty" ,ghc-tasty)
+       ("ghc-tasty-smallcheck" ,ghc-tasty-smallcheck)
+       ("ghc-tasty-quickcheck" ,ghc-tasty-quickcheck)))
+    (arguments
+     `(#:cabal-revision
+       ("4" "1yppwhs2r2rlwrzli9ccv5ldgl95h5p7pqhsr898r3das6daf6sk")))
+    (home-page
+     "https://github.com/mitchellwrosen/tasty-hspec")
+    (synopsis
+     "Hspec support for the Tasty test framework")
+    (description
+     "This package provides a Tasty provider for Hspec test suites.")
+    (license license:bsd-3)))
+
 (define-public ghc-tasty-hunit
   (package
     (name "ghc-tasty-hunit")
-- 
2.26.2

>From 7c49c8e1b5ba6e9b5acd8e3de4cc30815a156f39 Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 07:12:42 -0800
Subject: [PATCH 04/17] gnu: Add ghc-websockets.

* gnu/packages/haskell-web.scm (ghc-websockets): New variable.
---
 gnu/packages/haskell-web.scm | 51 ++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/gnu/packages/haskell-web.scm b/gnu/packages/haskell-web.scm
index 05be862a85..09ed793323 100644
--- a/gnu/packages/haskell-web.scm
+++ b/gnu/packages/haskell-web.scm
@@ -655,6 +655,57 @@ limitation, automatic pruning, energy saving and replay resistance.")
 a WAI handler, via the native Haskell TLS implementation.")
     (license license:expat)))
 
+(define-public ghc-websockets
+  (package
+    (name "ghc-websockets")
+    (version "0.12.6.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/websockets/websockets-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1vp3790w3hmr6v96314vdx74f7sg2c7hvnc93gafq0xhbxnr7nvx"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-attoparsec" ,ghc-attoparsec)
+       ("ghc-base64-bytestring" ,ghc-base64-bytestring)
+       ("ghc-bytestring-builder" ,ghc-bytestring-builder)
+       ("ghc-case-insensitive" ,ghc-case-insensitive)
+       ("ghc-network" ,ghc-network)
+       ("ghc-random" ,ghc-random)
+       ("ghc-sha" ,ghc-sha)
+       ("ghc-streaming-commons" ,ghc-streaming-commons)
+       ("ghc-entropy" ,ghc-entropy)))
+    (native-inputs
+     `(("ghc-hunit" ,ghc-hunit)
+       ("ghc-quickcheck" ,ghc-quickcheck)
+       ("ghc-test-framework" ,ghc-test-framework)
+       ("ghc-test-framework-hunit" ,ghc-test-framework-hunit)
+       ("ghc-test-framework-quickcheck2" ,ghc-test-framework-quickcheck2)))
+    (home-page "https://jaspervdj.be/websockets/")
+    (synopsis
+     "Write WebSocket-capable servers in Haskell")
+    (description
+     "This library allows you to write WebSocket-capable servers.
+
+An example server:
+@url{https://github.com/jaspervdj/websockets/blob/master/example/server.lhs}
+An example client:
+@url{https://github.com/jaspervdj/websockets/blob/master/example/client.hs}
+
+See also:
+@itemize
+@item The specification of the WebSocket protocol:
+@url{http://www.whatwg.org/specs/web-socket-protocol/}
+@item The JavaScript API for dealing with WebSockets:
+@url{http://www.w3.org/TR/websockets/}
+@end itemize")
+    (license license:bsd-3)))
+
 (define-public ghc-xss-sanitize
   (package
     (name "ghc-xss-sanitize")
-- 
2.26.2

>From 553c2705238e7726650ef796785249963ce2c574 Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 07:37:29 -0800
Subject: [PATCH 05/17] gnu: Add ghc-wai-websockets.

* gnu/packages/haskell-web.scm (ghc-wai-websockets): New variable.
---
 gnu/packages/haskell-web.scm | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/gnu/packages/haskell-web.scm b/gnu/packages/haskell-web.scm
index 09ed793323..089df39ea6 100644
--- a/gnu/packages/haskell-web.scm
+++ b/gnu/packages/haskell-web.scm
@@ -706,6 +706,36 @@ See also:
 @end itemize")
     (license license:bsd-3)))
 
+(define-public ghc-wai-websockets
+  (package
+    (name "ghc-wai-websockets")
+    (version "3.0.1.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/wai-websockets/wai-websockets-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0b2xmdsrsqpssyib53wbr6r8hf75789ndyyanv37sv99iyqcwz4i"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-wai" ,ghc-wai)
+       ("ghc-case-insensitive" ,ghc-case-insensitive)
+       ("ghc-network" ,ghc-network)
+       ("ghc-websockets" ,ghc-websockets)
+       ("ghc-http-types" ,ghc-http-types)))
+    (arguments
+     `(#:configure-flags '("--flags=-example")))
+    (home-page "https://github.com/yesodweb/wai")
+    (synopsis
+     "Provide a bridge between WAI and the websockets package")
+    (description
+     "Use websockets with WAI applications, primarily those hosted via Warp.")
+    (license license:expat)))
+
 (define-public ghc-xss-sanitize
   (package
     (name "ghc-xss-sanitize")
-- 
2.26.2

>From 431ae381fde5a81b601967171b488cc0fe118fbb Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 07:39:09 -0800
Subject: [PATCH 06/17] gnu: Add ghc-sourcemap.

gnu/pacakges/haskell-web.scm (ghc-sourcemap): New variable.
---
 gnu/packages/haskell-web.scm | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/gnu/packages/haskell-web.scm b/gnu/packages/haskell-web.scm
index 089df39ea6..39ffe0f8d5 100644
--- a/gnu/packages/haskell-web.scm
+++ b/gnu/packages/haskell-web.scm
@@ -1774,3 +1774,37 @@ non-Haskell dependencies.")
 and Perl's @code{Web::Scraper}.  Scalpel builds on top of TagSoup to provide a
 declarative and monadic interface.")
     (license license:asl2.0)))
+
+(define-public ghc-sourcemap
+  (package
+    (name "ghc-sourcemap")
+    (version "0.1.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/sourcemap/sourcemap-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0ynfm44ym8y592wnzdwa0d05dbkffyyg5sm26y5ylzpynk64r85r"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-aeson" ,ghc-aeson)
+       ("ghc-unordered-containers" ,ghc-unordered-containers)
+       ("ghc-attoparsec" ,ghc-attoparsec)
+       ("ghc-utf8-string" ,ghc-utf8-string)))
+    (arguments
+     `(#:tests? #f ; FIXME: Fail to compile
+       #:cabal-revision
+       ("1" "1f7q44ar6qfip8fsllg43jyn7r15ifn2r0vz32cbmx0sb0d38dax")))
+    (home-page
+     "http://hackage.haskell.org/package/sourcemap")
+    (synopsis
+     "Implementation of source maps as proposed by Google and Mozilla")
+    (description
+     "Sourcemap provides an implementation of source maps, revision 3,
+proposed by Google and Mozilla here
+@url{https://wiki.mozilla.org/DevTools/Features/SourceMap}.")
+    (license license:bsd-3)))
-- 
2.26.2

>From 9b8e9092da36c9bfd681828126c443957727679d Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 09:32:28 -0800
Subject: [PATCH 07/17] gnu: Add ghc-mtl-compat.

* gnu/packages/haskell-xyz.scm (ghc-mtl-compat): New variable.
---
 gnu/packages/haskell-xyz.scm | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/gnu/packages/haskell-xyz.scm b/gnu/packages/haskell-xyz.scm
index 6a4d958490..05c0524e94 100644
--- a/gnu/packages/haskell-xyz.scm
+++ b/gnu/packages/haskell-xyz.scm
@@ -7631,6 +7631,41 @@ semi-direct products, \"deletable\" monoids, \"split\" monoids, and
 \"cut\" monoids.")
     (license license:bsd-3)))
 
+(define-public ghc-mtl-compat
+  (package
+    (name "ghc-mtl-compat")
+    (version "0.2.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/mtl-compat/mtl-compat-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "17iszr5yb4f17g8mq6i74hsamii8z6m2qfsmgzs78mhiwa7kjm8r"))))
+    (build-system haskell-build-system)
+    (home-page
+     "https://github.com/haskell-compat/mtl-compat")
+    (synopsis
+     "Backported Control.Monad.Except module from mtl")
+    (description
+     "This package backports the Control.Monad.Except module from mtl (if
+using mtl-2.2.0.1 or earlier), which reexports the ExceptT monad transformer
+and the MonadError class.
+
+This package should only be used if there is a need to use the
+Control.Monad.Except module specifically.  If you just want the mtl class
+instances for ExceptT, use transformers-compat instead, since mtl-compat does
+nothing but reexport the instances from that package.
+
+Note that unlike how mtl-2.2 or later works, the Control.Monad.Except
+module defined in this package exports all of ExceptT's monad class instances.
+Therefore, you may have to declare @code{import Control.Monad.Except ()} at
+the top of your file to get all of the ExceptT instances in scope.")
+    (license license:bsd-3)))
+
 (define-public ghc-murmur-hash
   (package
     (name "ghc-murmur-hash")
-- 
2.26.2

>From d08fe10ec20c748667d7218c26612294b9f029e7 Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 07:40:38 -0800
Subject: [PATCH 08/17] gnu: Add ghc-protolude.

* gnu/packages/haskell-xyz.scm (ghc-protolude): New variable.
---
 gnu/packages/haskell-xyz.scm | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/gnu/packages/haskell-xyz.scm b/gnu/packages/haskell-xyz.scm
index 05c0524e94..eef1765a71 100644
--- a/gnu/packages/haskell-xyz.scm
+++ b/gnu/packages/haskell-xyz.scm
@@ -9281,6 +9281,33 @@ project-template tries to provide a canonical Haskell library for implementing
 the ideal templating system.")
     (license license:bsd-3)))
 
+(define-public ghc-protolude
+  (package
+    (name "ghc-protolude")
+    (version "0.2.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/protolude/protolude-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0zzkyxz0vmcbncpid7gp72fpjj0fla3gqhlfkij5c5lg12skjgfj"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-async" ,ghc-async)
+       ("ghc-hashable" ,ghc-hashable)
+       ("ghc-mtl-compat" ,ghc-mtl-compat)
+       ("ghc-transformers-compat" ,ghc-transformers-compat)))
+    (home-page "https://github.com/protolude/protolude")
+    (synopsis "Sensible set of defaults for writing custom Preludes")
+    (description
+     "Protolude gives you sensible defaults for writing custom Preludes to
+replace the standard one provided by GHC.")
+    (license license:expat)))
+
 (define-public ghc-psqueues
   (package
     (name "ghc-psqueues")
-- 
2.26.2

>From 35d1ff83d469f0bb8323a142a3d7ea9656e74ab0 Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 07:41:40 -0800
Subject: [PATCH 09/17] gnu: Add ghc-pattern-arrows.

* gnu/packages/haskell-xyz.scm (ghc-pattern-arrows): New variable.
---
 gnu/packages/haskell-xyz.scm | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/gnu/packages/haskell-xyz.scm b/gnu/packages/haskell-xyz.scm
index eef1765a71..3f9fd167d1 100644
--- a/gnu/packages/haskell-xyz.scm
+++ b/gnu/packages/haskell-xyz.scm
@@ -8759,6 +8759,29 @@ of two versions of a source file.  It provides a good balance between
 performance, nice output for humans, and simplicity of implementation.")
     (license license:bsd-3)))
 
+(define-public ghc-pattern-arrows
+  (package
+    (name "ghc-pattern-arrows")
+    (version "0.0.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/pattern-arrows/pattern-arrows-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "13q7bj19hd60rnjfc05wxlyck8llxy11z3mns8kxg197wxrdkhkg"))))
+    (build-system haskell-build-system)
+    (home-page
+     "https://blog.functorial.com/posts/2013-10-27-Pretty-Printing-Arrows.html")
+    (synopsis "Arrows for Pretty Printing")
+    (description
+     "A library for generating concise pretty printers based on precedence
+rules.")
+    (license license:expat)))
+
 (define-public ghc-pcre-light
   (package
     (name "ghc-pcre-light")
-- 
2.26.2

>From e94d0ec89ba9cd08451340895dfa6ff89c91acd8 Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 07:43:44 -0800
Subject: [PATCH 10/17] gnu: Add ghc-language-javascript.

* gnu/packages/haskell-web.scm (ghc-language-javascript): New variable.
---
 gnu/packages/haskell-web.scm | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/gnu/packages/haskell-web.scm b/gnu/packages/haskell-web.scm
index 39ffe0f8d5..314e5b1e1b 100644
--- a/gnu/packages/haskell-web.scm
+++ b/gnu/packages/haskell-web.scm
@@ -1808,3 +1808,35 @@ declarative and monadic interface.")
 proposed by Google and Mozilla here
 @url{https://wiki.mozilla.org/DevTools/Features/SourceMap}.")
     (license license:bsd-3)))
+
+(define-public ghc-language-javascript
+  (package
+    (name "ghc-language-javascript")
+    (version "0.7.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/language-javascript/language-javascript-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "15bpqpkjf2y3fk8wff9zlnkpsjc63bnbvhlkxrs9alj0bikq17nk"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-blaze-builder" ,ghc-blaze-builder)
+       ("ghc-utf8-string" ,ghc-utf8-string)))
+    (native-inputs
+     `(("ghc-alex" ,ghc-alex)
+       ("ghc-quickcheck" ,ghc-quickcheck)
+       ("ghc-happy" ,ghc-happy)
+       ("ghc-hspec" ,ghc-hspec)
+       ("ghc-utf8-light" ,ghc-utf8-light)))
+    (home-page
+     "https://github.com/erikd/language-javascript")
+    (synopsis "Parser for JavaScript")
+    (description
+     "Parses Javascript into an Abstract Syntax Tree (AST).  Initially intended
+as frontend to hjsmin.")
+    (license license:bsd-3)))
-- 
2.26.2

>From 74e0c2704ffbb46542155da1cc984947cb64cf42 Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 07:44:47 -0800
Subject: [PATCH 11/17] gnu: Add ghc-bower-json.

* gnu/packages/haskell-web.scm (ghc-bower-json): New variable.
---
 gnu/packages/haskell-web.scm | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/gnu/packages/haskell-web.scm b/gnu/packages/haskell-web.scm
index 314e5b1e1b..aae1209218 100644
--- a/gnu/packages/haskell-web.scm
+++ b/gnu/packages/haskell-web.scm
@@ -1840,3 +1840,34 @@ proposed by Google and Mozilla here
      "Parses Javascript into an Abstract Syntax Tree (AST).  Initially intended
 as frontend to hjsmin.")
     (license license:bsd-3)))
+
+(define-public ghc-bower-json
+  (package
+    (name "ghc-bower-json")
+    (version "1.0.0.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/bower-json/bower-json-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "0wvygg3rdbxzrmr61a9w6ddv9pfric85ih8hnxyk0ydzn7i59abs"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-aeson" ,ghc-aeson)
+       ("ghc-aeson-better-errors" ,ghc-aeson-better-errors)
+       ("ghc-scientific" ,ghc-scientific)
+       ("ghc-transformers" ,ghc-transformers)
+       ("ghc-unordered-containers" ,ghc-unordered-containers)))
+    (native-inputs
+     `(("ghc-tasty" ,ghc-tasty)
+       ("ghc-tasty-hunit" ,ghc-tasty-hunit)))
+    (home-page "https://github.com/hdgarrood/bower-json")
+    (synopsis "Read bower.json from Haskell")
+    (description
+     "This package provides a data type and ToJSON/FromJSON instances for
+Bower's package manifest file, bower.json.")
+    (license license:expat)))
-- 
2.26.2

>From d0ae54526bbad16610e4b1446c2f0d6f41ed0767 Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 07:45:59 -0800
Subject: [PATCH 12/17] gnu: Add ghc-aeson-better-errors.

* gnu/packages/haskell-web.scm (ghc-aeson-better-errors): New variable.
---
 gnu/packages/haskell-web.scm | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/gnu/packages/haskell-web.scm b/gnu/packages/haskell-web.scm
index aae1209218..4689025432 100644
--- a/gnu/packages/haskell-web.scm
+++ b/gnu/packages/haskell-web.scm
@@ -1005,6 +1005,39 @@ the function @code{aesonQQ} that compile-time converts a string representation
 of a JSON value into a @code{Data.Aeson.Value}.")
     (license license:expat)))
 
+(define-public ghc-aeson-better-errors
+  (package
+    (name "ghc-aeson-better-errors")
+    (version "0.9.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/aeson-better-errors/aeson-better-errors-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "09vkyrhwak3bmpfsqcd2az8hfqqkxyhg468hv5avgisy0nzh3w38"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-aeson" ,ghc-aeson)
+       ("ghc-unordered-containers" ,ghc-unordered-containers)
+       ("ghc-dlist" ,ghc-dlist)
+       ("ghc-scientific" ,ghc-scientific)
+       ("ghc-vector" ,ghc-vector)
+       ("ghc-transformers-compat" ,ghc-transformers-compat)
+       ("ghc-void" ,ghc-void)))
+    (home-page
+     "https://github.com/hdgarrood/aeson-better-errors")
+    (synopsis
+     "Better error messages when decoding JSON values in Haskell")
+    (description
+     "Gives you the tools to build parsers to decode JSON values, and gives
+good error messages when parsing fails.  See also
+@url{http://harry.garrood.me/blog/aeson-better-errors/}.")
+    (license license:expat)))
+
 (define-public ghc-multipart
   (package
     (name "ghc-multipart")
-- 
2.26.2

>From 1089e1bd113f1b8175ac87452b10cfa22195dbd0 Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 08:44:49 -0800
Subject: [PATCH 13/17] gnu: Add ghc-assoc.

* gnu/packages/haskell-xyz.scm (ghc-assoc): New variable.
---
 gnu/packages/haskell-xyz.scm | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/gnu/packages/haskell-xyz.scm b/gnu/packages/haskell-xyz.scm
index 3f9fd167d1..a54abd40f5 100644
--- a/gnu/packages/haskell-xyz.scm
+++ b/gnu/packages/haskell-xyz.scm
@@ -456,6 +456,34 @@ colored output using the ansi-terminal package.")
 style.")
     (license license:bsd-3)))
 
+(define-public ghc-assoc
+  (package
+    (name "ghc-assoc")
+    (version "1.0.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://hackage.haskell.org/package/assoc/assoc-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1m9n4vp190bvn2wcrd4ggfwa9pi93jp0zgx02mdgywn2zfidw020"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-bifunctors" ,ghc-bifunctors)
+       ("ghc-tagged" ,ghc-tagged)))
+    (home-page
+     "http://hackage.haskell.org/package/assoc")
+    (synopsis
+     "Swap and assoc: Symmetric and Semigroupy Bifunctors")
+    (description
+     "Provides generalisations of @code{swap :: (a,b) -> (b,a)} and
+@code{assoc :: ((a,b),c) -> (a,(b,c))} to @code{Bifunctor}s supporting
+similar operations (e.g. @code{Either}, @code{These}).")
+    (license license:bsd-3)))
+
 (define-public ghc-async
   (package
     (name "ghc-async")
-- 
2.26.2

>From 1b1e26acc3aa293cd17a3b0224a76abacf44f96c Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 08:45:42 -0800
Subject: [PATCH 14/17] gnu: Add ghc-these.

* gnu/packages/haskell-xyz.scm (ghc-these): New variable.
---
 gnu/packages/haskell-xyz.scm | 57 ++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)

diff --git a/gnu/packages/haskell-xyz.scm b/gnu/packages/haskell-xyz.scm
index a54abd40f5..51e447febd 100644
--- a/gnu/packages/haskell-xyz.scm
+++ b/gnu/packages/haskell-xyz.scm
@@ -12000,6 +12000,63 @@ and @code{Eq} instances.  These instances used to live in the haskell-src-meta
 package, and that's where the version number started.")
     (license license:bsd-3)))
 
+(define-public ghc-these
+  (package
+    (name "ghc-these")
+    (version "1.0.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://hackage.haskell.org/package/these/these-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1k0pi65g7cm9hzdw6my6bzz2zvddkmj1qs45ymqmi316bpiixk3r"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-base-compat" ,ghc-base-compat)
+       ("ghc-hashable" ,ghc-hashable)
+       ("ghc-aeson" ,ghc-aeson)
+       ("ghc-unordered-containers" ,ghc-unordered-containers)
+       ("ghc-assoc" ,ghc-assoc)
+       ("ghc-semigroupoids" ,ghc-semigroupoids)
+       ("ghc-quickcheck" ,ghc-quickcheck)))
+    (arguments
+     `(#:cabal-revision
+       ("1"
+        "0923r86fnmgpx0msm68aszirh2n19nn5bccgjxfh2146jw4z7w3z")))
+    (home-page
+     "https://github.com/isomorphism/these")
+    (synopsis "Either-or-both data type")
+    (description
+     "This package provides a data type @code{These a b} which can
+hold a value of either type or values of each type.  This is usually
+thought of as an \"inclusive or\" type (contrasting @code{Either a b} as
+\"exclusive or\") or as an \"outer join\" type (contrasting @code{(a, b)}
+as \"inner join\").
+
+@code{data These a b = This a | That b | These a b}
+
+Since version 1, this package was split into parts:
+
+@itemize
+@item
+https://hackage.haskell.org/package/semialign For @code{Align} and
+@code{Zip} type-classes.
+@item
+https://hackage.haskell.org/package/semialign-indexed For
+@code{SemialignWithIndex} class, providing @code{ialignWith} and
+@code{izipWith}
+@item
+https://hackage.haskell.org/package/these-lens For lens combinators.
+@item
+http://hackage.haskell.org/package/monad-chronicle For transformers
+variant of @code{These}.
+@end itemize")
+    (license license:bsd-3)))
+
 (define-public ghc-threads
   (package
     (name "ghc-threads")
-- 
2.26.2

>From d2826b44e2e1617dc0e8b456fa70b665cfc8792f Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 08:48:25 -0800
Subject: [PATCH 15/17] gnu: Add ghc-semialign.

* gnu/packages/haskell-xyz.scm (ghc-semialign): New variable.
---
 gnu/packages/haskell-xyz.scm | 40 ++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/gnu/packages/haskell-xyz.scm b/gnu/packages/haskell-xyz.scm
index 51e447febd..ed0b17bcd6 100644
--- a/gnu/packages/haskell-xyz.scm
+++ b/gnu/packages/haskell-xyz.scm
@@ -10519,6 +10519,46 @@ Haskell")
 a memory chunk that will be auto-scrubbed after it run out of scope.")
     (license license:bsd-3)))
 
+(define-public ghc-semialign
+  (package
+    (name "ghc-semialign")
+    (version "1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://hackage.haskell.org/package/semialign/semialign-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "004x0a80sqqdgvsyk4z0nasxpi6z3g1d8kgwj804bj9ka8dlc75m"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-these" ,ghc-these)
+       ("ghc-base-compat" ,ghc-base-compat)
+       ("ghc-hashable" ,ghc-hashable)
+       ("ghc-tagged" ,ghc-tagged)
+       ("ghc-unordered-containers" ,ghc-unordered-containers)
+       ("ghc-vector" ,ghc-vector)
+       ("ghc-semigroupoids" ,ghc-semigroupoids)))
+    (arguments
+     `(#:cabal-revision
+       ("1"
+        "0qnqnyfng4kwy2h2anrcy5id2ijnawava3zcc5h5b8ri1y6ks6zi")))
+    (home-page
+     "https://github.com/isomorphism/these")
+    (synopsis
+     "Align and Zip type-classes from the common Semialign ancestor ")
+    (description
+     "The major use of @code{These} of this is provided by the
+@code{align} member of @code{Semialign} class, representing a
+generalized notion of \"zipping with padding\" that combines
+structures without truncating to the size of the smaller input.  It
+turns out that @code{zip} operation fits well the @code{Semialign}
+class, forming lattice-like structure.")
+    (license license:bsd-3)))
+
 (define-public ghc-semigroupoids
   (package
     (name "ghc-semigroupoids")
-- 
2.26.2

>From ab8ff0bddfa195709887b0389698a2a691f5865d Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 08:52:48 -0800
Subject: [PATCH 16/17] gnu: Add [email-masked]

* gnu/packages/purescript.scm (ghc-happy-1.19.9): New file, New variable.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add purescript.scm.
---
 gnu/local.mk                |  3 ++-
 gnu/packages/purescript.scm | 44 +++++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 gnu/packages/purescript.scm

diff --git a/gnu/local.mk b/gnu/local.mk
index 98bdf69c53..4f618bcc17 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -21,7 +21,7 @@
 # Copyright © 2018 Stefan Stefanović <[email-masked]>
 # Copyright © 2018 Maxim Cournoyer <[email-masked]>
 # Copyright © 2019 Guillaume Le Vaillant <[email-masked]>
-# Copyright © 2019 John Soo <[email-masked]>
+# Copyright © 2019, 2020 John Soo <[email-masked]>
 # Copyright © 2019 Jonathan Brielmaier <[email-masked]>
 # Copyright © 2019 Evan Straw <[email-masked]>
 # Copyright © 2019 Brett Gilio <[email-masked]>
@@ -430,6 +430,7 @@ GNU_SYSTEM_MODULES =				\
   %D%/packages/pretty-print.scm			\
   %D%/packages/protobuf.scm			\
   %D%/packages/pure.scm				\
+  %D%/packages/purescript.scm			\
   %D%/packages/pv.scm				\
   %D%/packages/python.scm			\
   %D%/packages/python-check.scm			\
diff --git a/gnu/packages/purescript.scm b/gnu/packages/purescript.scm
new file mode 100644
index 0000000000..244fe0ed7d
--- /dev/null
+++ b/gnu/packages/purescript.scm
@@ -0,0 +1,44 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2020 John Soo <[email-masked]>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu packages purescript)
+  #:use-module (gnu packages haskell-xyz)
+  #:use-module (gnu packages haskell-check)
+  #:use-module (gnu packages haskell-crypto)
+  #:use-module (gnu packages haskell-web)
+  #:use-module ((gnu packages python) #:select (python))
+  #:use-module (guix download)
+  #:use-module (guix git-download)
+  #:use-module (guix packages)
+  #:use-module (guix build-system haskell)
+  #:use-module ((guix licenses) #:prefix license:))
+
+(define ghc-happy-1.19.9
+  (package
+    (inherit ghc-happy)
+    (version "1.19.9")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://hackage.haskell.org/package/happy/happy-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "138xpxdb7x62lpmgmb6b3v3vgdqqvqn4273jaap3mjmc2gla709y"))))))
-- 
2.26.2

>From 474b6af6dbd79a8c93a457b99d1465d6e9ede306 Mon Sep 17 00:00:00 2001
From: John Soo <[email-masked]>
Date: Fri, 13 Dec 2019 09:21:50 -0800
Subject: [PATCH 17/17] gnu: Add purescript.

* gnu/packages/purescript.scm (purescript): New variable.
* gnu/packages/patches/purescript-relax-dependencies.patch: Relax cabal dependencies.
---
 .../purescript-relax-dependencies.patch       | 39 ++++++++
 gnu/packages/purescript.scm                   | 89 +++++++++++++++++++
 2 files changed, 128 insertions(+)
 create mode 100644 gnu/packages/patches/purescript-relax-dependencies.patch

diff --git a/gnu/packages/patches/purescript-relax-dependencies.patch b/gnu/packages/patches/purescript-relax-dependencies.patch
new file mode 100644
index 0000000000..4571fea654
--- /dev/null
+++ b/gnu/packages/patches/purescript-relax-dependencies.patch
@@ -0,0 +1,39 @@
+diff --git purescript-0.13.6/purescript.cabal purescript-0.13.6/purescript.cabal.orig
+index 7e38070..0724a0b 100644
+--- purescript-0.13.6/purescript.cabal
++++ purescript-0.13.6/purescript.cabal.orig
+@@ -1167,1 +1167,1 @@ library
+-        Glob ==0.9.*,
++        Glob ==0.10.*,
+@@ -1171,1 +1171,1 @@ library
+-        ansi-terminal >=0.7.1 && <0.9,
++        ansi-terminal ==0.9.*,
+@@ -1180,1 +1180,1 @@ library
+-        clock <0.8,
++        clock ==0.8.*,
+@@ -1246,1 +1246,1 @@ executable purs
+-        Glob ==0.9.*,
++        Glob ==0.10.*,
+@@ -1250,1 +1250,1 @@ executable purs
+-        ansi-terminal >=0.7.1 && <0.9,
++        ansi-terminal ==0.9.*,
+@@ -1260,1 +1260,1 @@ executable purs
+-        clock <0.8,
++        clock ==0.8.*,
+@@ -1281,1 +1281,1 @@ executable purs
+-        network >=3.0.1.1 && <3.1,
++        network >=2.8 && <3.1,
+@@ -1358,1 +1358,1 @@ test-suite tests
+-        Glob ==0.9.*,
++        Glob ==0.10.*,
+@@ -1363,1 +1363,1 @@ test-suite tests
+-        ansi-terminal >=0.7.1 && <0.9,
++        ansi-terminal ==0.9.*,
+@@ -1372,1 +1372,1 @@ test-suite tests
+-        clock <0.8,
++        clock ==0.8.*,
+@@ -1384,2 +1384,2 @@ test-suite tests
+-        hspec <2.7,
+-        hspec-discover <2.7,
++        hspec ==2.7.*,
++        hspec-discover ==2.7.*,
diff --git a/gnu/packages/purescript.scm b/gnu/packages/purescript.scm
index 244fe0ed7d..13cd773839 100644
--- a/gnu/packages/purescript.scm
+++ b/gnu/packages/purescript.scm
@@ -17,6 +17,7 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages purescript)
+  #:use-module (gnu packages)
   #:use-module (gnu packages haskell-xyz)
   #:use-module (gnu packages haskell-check)
   #:use-module (gnu packages haskell-crypto)
@@ -42,3 +43,91 @@
        (sha256
         (base32
          "138xpxdb7x62lpmgmb6b3v3vgdqqvqn4273jaap3mjmc2gla709y"))))))
+
+(define-public purescript
+  (package
+    (name "purescript")
+    (version "0.13.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "mirror://hackage/package/purescript/purescript-"
+             version
+             ".tar.gz"))
+       (sha256
+        (base32
+         "1xss3wpv6wb38gsh9r635s09cxzmiz81hhssdxzdba2pw6ifzx8j"))
+       (patches (search-patches "purescript-relax-dependencies.patch"))))
+    (build-system haskell-build-system)
+    (inputs
+     `(("ghc-glob" ,ghc-glob)
+       ("ghc-aeson" ,ghc-aeson)
+       ("ghc-aeson-better-errors" ,ghc-aeson-better-errors)
+       ("ghc-aeson-pretty" ,ghc-aeson-pretty)
+       ("ghc-ansi-terminal" ,ghc-ansi-terminal)
+       ("ghc-base-compat" ,ghc-base-compat)
+       ("ghc-blaze-html" ,ghc-blaze-html)
+       ("ghc-bower-json" ,ghc-bower-json)
+       ("ghc-boxes" ,ghc-boxes)
+       ("ghc-cheapskate" ,ghc-cheapskate)
+       ("ghc-clock" ,ghc-clock)
+       ("ghc-cryptonite" ,ghc-cryptonite)
+       ("ghc-data-ordlist" ,ghc-data-ordlist)
+       ("ghc-dlist" ,ghc-dlist)
+       ("ghc-edit-distance" ,ghc-edit-distance)
+       ("ghc-file-embed" ,ghc-file-embed)
+       ("ghc-fsnotify" ,ghc-fsnotify)
+       ("ghc-happy" ,ghc-happy)
+       ("ghc-language-javascript" ,ghc-language-javascript)
+       ("ghc-lifted-async" ,ghc-lifted-async)
+       ("ghc-lifted-base" ,ghc-lifted-base)
+       ("ghc-memory" ,ghc-memory)
+       ("ghc-microlens-platform" ,ghc-microlens-platform)
+       ("ghc-monad-control" ,ghc-monad-control)
+       ("ghc-monad-logger" ,ghc-monad-logger)
+       ("ghc-network" ,ghc-network)
+       ("ghc-parallel" ,ghc-parallel)
+       ("ghc-pattern-arrows" ,ghc-pattern-arrows)
+       ("ghc-protolude" ,ghc-protolude)
+       ("ghc-regex-tdfa" ,ghc-regex-tdfa)
+       ("ghc-safe" ,ghc-safe)
+       ("ghc-scientific" ,ghc-scientific)
+       ("ghc-semialign" ,ghc-semialign)
+       ("ghc-semigroups" ,ghc-semigroups)
+       ("ghc-sourcemap" ,ghc-sourcemap)
+       ("ghc-split" ,ghc-split)
+       ("ghc-stringsearch" ,ghc-stringsearch)
+       ("ghc-syb" ,ghc-syb)
+       ("ghc-these" ,ghc-these)
+       ("ghc-transformers-base" ,ghc-transformers-base)
+       ("ghc-transformers-compat" ,ghc-transformers-compat)
+       ("ghc-unordered-containers" ,ghc-unordered-containers)
+       ("ghc-utf8-string" ,ghc-utf8-string)
+       ("ghc-vector" ,ghc-vector)
+       ("ghc-ansi-wl-pprint" ,ghc-ansi-wl-pprint)
+       ("ghc-http-types" ,ghc-http-types)
+       ("ghc-network" ,ghc-network)
+       ("ghc-optparse-applicative" ,ghc-optparse-applicative)
+       ("ghc-wai" ,ghc-wai)
+       ("ghc-wai-websockets" ,ghc-wai-websockets)
+       ("ghc-warp" ,ghc-warp)
+       ("ghc-websockets" ,ghc-websockets)))
+    (native-inputs
+     `(("ghc-happy" ,ghc-happy-1.19.9) ; build fails with 1.19.12
+       ("ghc-hunit" ,ghc-hunit)
+       ("ghc-hspec" ,ghc-hspec)
+       ("hspec-discover" ,hspec-discover)
+       ("ghc-tasty" ,ghc-tasty)
+       ("ghc-tasty-golden" ,ghc-tasty-golden)
+       ("ghc-tasty-hspec" ,ghc-tasty-hspec)))
+    (arguments
+     `(;; Tests require npm
+       #:tests? #f
+       #:configure-flags '("--flags=release")))
+    (home-page "https://www.purescript.org/")
+    (synopsis "Haskell inspired programming language compiling to JavaScript")
+    (description
+     "Purescript is a small strongly, statically typed programming language with
+expressive types, inspired by Haskell and compiling to JavaScript.")
+    (license license:bsd-3)))
-- 
2.26.2