summary refs log tree commit diff
path: root/gnu
diff options
context:
space:
mode:
authorMarius Bakke <marius@gnu.org>2022-08-27 17:10:55 +0200
committerMarius Bakke <marius@gnu.org>2022-08-27 17:10:55 +0200
commitad384816fe260be98bc53701d9d761197ef162fc (patch)
treeff06eb12983b7cbd972c3153404bb3952e2f28c0 /gnu
parentd08411ffd0a36a6b67a238be69d32c9f74101389 (diff)
parentfb3d90b8f31c4b1e2e3d427544c6610f3fe1ce55 (diff)
downloadguix-ad384816fe260be98bc53701d9d761197ef162fc.tar.gz
Merge branch 'staging' into core-updates
Diffstat (limited to 'gnu')
-rw-r--r--gnu/bootloader.scm1
-rw-r--r--gnu/ci.scm61
-rw-r--r--gnu/home.scm2
-rw-r--r--gnu/home/services.scm5
-rw-r--r--gnu/home/services/ssh.scm12
-rw-r--r--gnu/installer/parted.scm1
-rw-r--r--gnu/local.mk13
-rw-r--r--gnu/packages/admin.scm55
-rw-r--r--gnu/packages/algebra.scm12
-rw-r--r--gnu/packages/animation.scm49
-rw-r--r--gnu/packages/assembly.scm7
-rw-r--r--gnu/packages/audio.scm32
-rw-r--r--gnu/packages/benchmark.scm4
-rw-r--r--gnu/packages/bioconductor.scm207
-rw-r--r--gnu/packages/bioinformatics.scm473
-rw-r--r--gnu/packages/bittorrent.scm3
-rw-r--r--gnu/packages/bootloaders.scm6
-rw-r--r--gnu/packages/browser-extensions.scm4
-rw-r--r--gnu/packages/build-tools.scm4
-rw-r--r--gnu/packages/c.scm4
-rw-r--r--gnu/packages/cdrom.scm83
-rw-r--r--gnu/packages/check.scm37
-rw-r--r--gnu/packages/chromium.scm6
-rw-r--r--gnu/packages/ci.scm22
-rw-r--r--gnu/packages/code.scm4
-rw-r--r--gnu/packages/coq.scm13
-rw-r--r--gnu/packages/cpp.scm34
-rw-r--r--gnu/packages/cran.scm238
-rw-r--r--gnu/packages/crates-io.scm328
-rw-r--r--gnu/packages/cups.scm35
-rw-r--r--gnu/packages/databases.scm109
-rw-r--r--gnu/packages/debian.scm6
-rw-r--r--gnu/packages/dezyne.scm4
-rw-r--r--gnu/packages/diffoscope.scm4
-rw-r--r--gnu/packages/dns.scm12
-rw-r--r--gnu/packages/documentation.scm12
-rw-r--r--gnu/packages/dunst.scm4
-rw-r--r--gnu/packages/ebook.scm4
-rw-r--r--gnu/packages/emacs-xyz.scm468
-rw-r--r--gnu/packages/engineering.scm80
-rw-r--r--gnu/packages/file-systems.scm44
-rw-r--r--gnu/packages/finance.scm175
-rw-r--r--gnu/packages/firmware.scm8
-rw-r--r--gnu/packages/fonts.scm25
-rw-r--r--gnu/packages/fontutils.scm10
-rw-r--r--gnu/packages/fpga.scm6
-rw-r--r--gnu/packages/game-development.scm87
-rw-r--r--gnu/packages/games.scm396
-rw-r--r--gnu/packages/gcc.scm4
-rw-r--r--gnu/packages/geo.scm41
-rw-r--r--gnu/packages/gnome-xyz.scm3
-rw-r--r--gnu/packages/gnome.scm86
-rw-r--r--gnu/packages/gnuzilla.scm247
-rw-r--r--gnu/packages/golang.scm106
-rw-r--r--gnu/packages/graph.scm4
-rw-r--r--gnu/packages/graphics.scm15
-rw-r--r--gnu/packages/graphviz.scm2
-rw-r--r--gnu/packages/gstreamer.scm2
-rw-r--r--gnu/packages/gtk.scm19
-rw-r--r--gnu/packages/guile-xyz.scm97
-rw-r--r--gnu/packages/hardware.scm90
-rw-r--r--gnu/packages/haskell.scm486
-rw-r--r--gnu/packages/image-viewers.scm50
-rw-r--r--gnu/packages/image.scm26
-rw-r--r--gnu/packages/instrumentation.scm35
-rw-r--r--gnu/packages/irc.scm4
-rw-r--r--gnu/packages/java.scm3
-rw-r--r--gnu/packages/julia.scm39
-rw-r--r--gnu/packages/libreoffice.scm5
-rw-r--r--gnu/packages/linux.scm123
-rw-r--r--gnu/packages/lisp-xyz.scm34
-rw-r--r--gnu/packages/lisp.scm8
-rw-r--r--gnu/packages/lxde.scm150
-rw-r--r--gnu/packages/lxqt.scm445
-rw-r--r--gnu/packages/machine-learning.scm8
-rw-r--r--gnu/packages/mail.scm49
-rw-r--r--gnu/packages/maths.scm64
-rw-r--r--gnu/packages/maven.scm4
-rw-r--r--gnu/packages/messaging.scm31
-rw-r--r--gnu/packages/moe.scm5
-rw-r--r--gnu/packages/music.scm21
-rw-r--r--gnu/packages/networking.scm19
-rw-r--r--gnu/packages/ocaml.scm394
-rw-r--r--gnu/packages/ocr.scm186
-rw-r--r--gnu/packages/package-management.scm17
-rw-r--r--gnu/packages/patches/crawl-upgrade-saves.patch4
-rw-r--r--gnu/packages/patches/guile-fibers-epoll-instance-is-dead.patch99
-rw-r--r--gnu/packages/patches/lcalc-default-parameters-1.patch26
-rw-r--r--gnu/packages/patches/lcalc-default-parameters-2.patch58
-rw-r--r--gnu/packages/patches/lcalc-lcommon-h.patch13
-rw-r--r--gnu/packages/patches/lcalc-using-namespace-std.patch43
-rw-r--r--gnu/packages/patches/lrcalc-includes.patch92
-rw-r--r--gnu/packages/patches/perl-class-methodmaker-reproducible.patch21
-rw-r--r--gnu/packages/patches/polkit-CVE-2021-4034.patch82
-rw-r--r--gnu/packages/patches/polkit-configure-elogind.patch15
-rw-r--r--gnu/packages/patches/polkit-use-duktape.patch5030
-rw-r--r--gnu/packages/patches/python-dateutil-pytest-compat.patch43
-rw-r--r--gnu/packages/patches/python-mypy-12332.patch68
-rw-r--r--gnu/packages/patches/python-mypy-use-sys-path.patch130
-rw-r--r--gnu/packages/perl-check.scm6
-rw-r--r--gnu/packages/perl.scm10
-rw-r--r--gnu/packages/plotutils.scm4
-rw-r--r--gnu/packages/polkit.scm108
-rw-r--r--gnu/packages/pulseaudio.scm55
-rw-r--r--gnu/packages/python-check.scm12
-rw-r--r--gnu/packages/python-compression.scm47
-rw-r--r--gnu/packages/python-crypto.scm29
-rw-r--r--gnu/packages/python-science.scm2
-rw-r--r--gnu/packages/python-web.scm25
-rw-r--r--gnu/packages/python-xyz.scm404
-rw-r--r--gnu/packages/qt.scm101
-rw-r--r--gnu/packages/radio.scm10
-rw-r--r--gnu/packages/rsync.scm4
-rw-r--r--gnu/packages/sagemath.scm72
-rw-r--r--gnu/packages/search.scm10
-rw-r--r--gnu/packages/security-token.scm8
-rw-r--r--gnu/packages/selinux.scm384
-rw-r--r--gnu/packages/shells.scm13
-rw-r--r--gnu/packages/sphinx.scm26
-rw-r--r--gnu/packages/syncthing.scm18
-rw-r--r--gnu/packages/telegram.scm2
-rw-r--r--gnu/packages/telephony.scm2
-rw-r--r--gnu/packages/terminals.scm56
-rw-r--r--gnu/packages/tex.scm2
-rw-r--r--gnu/packages/text-editors.scm4
-rw-r--r--gnu/packages/time.scm1
-rw-r--r--gnu/packages/tor.scm47
-rw-r--r--gnu/packages/upnp.scm4
-rw-r--r--gnu/packages/version-control.scm10
-rw-r--r--gnu/packages/video.scm94
-rw-r--r--gnu/packages/vim.scm8
-rw-r--r--gnu/packages/vpn.scm6
-rw-r--r--gnu/packages/web.scm117
-rw-r--r--gnu/packages/wm.scm10
-rw-r--r--gnu/packages/xfce.scm38
-rw-r--r--gnu/packages/xiph.scm12
-rw-r--r--gnu/packages/xorg.scm20
-rw-r--r--gnu/services/base.scm24
-rw-r--r--gnu/services/configuration.scm40
-rw-r--r--gnu/services/desktop.scm23
-rw-r--r--gnu/services/file-sharing.scm11
-rw-r--r--gnu/services/getmail.scm6
-rw-r--r--gnu/services/kerberos.scm1
-rw-r--r--gnu/services/messaging.scm17
-rw-r--r--gnu/services/networking.scm2
-rw-r--r--gnu/services/telephony.scm6
-rw-r--r--gnu/tests/desktop.scm17
147 files changed, 5342 insertions, 8441 deletions
diff --git a/gnu/bootloader.scm b/gnu/bootloader.scm
index 9cf5457873..70e1836179 100644
--- a/gnu/bootloader.scm
+++ b/gnu/bootloader.scm
@@ -69,7 +69,6 @@
             bootloader-configuration-terminal-inputs
             bootloader-configuration-serial-unit
             bootloader-configuration-serial-speed
-            bootloader-configuration-additional-configuration
 
             %bootloaders
             lookup-bootloader-by-name
diff --git a/gnu/ci.scm b/gnu/ci.scm
index 9cc3a1a81f..2c51ea7387 100644
--- a/gnu/ci.scm
+++ b/gnu/ci.scm
@@ -254,37 +254,40 @@ otherwise use the IMAGE name."
     (parameterize ((%graft? #f))
       (derivation->job name drv))))
 
-(define (image-jobs store system)
+(define* (image-jobs store system
+                     #:key source commit)
   "Return a list of jobs that build images for SYSTEM."
   (define MiB
     (expt 2 20))
 
-  (if (member system %guix-system-supported-systems)
-      `(,(image->job store
-                     (image
-                      (inherit efi-disk-image)
-                      (operating-system installation-os))
-                     #:name "usb-image"
-                     #:system system)
-        ,(image->job
-          store
-          (image
-           (inherit (image-with-label
-                     iso9660-image
-                     (string-append "GUIX_" system "_"
-                                    (if (> (string-length %guix-version) 7)
-                                        (substring %guix-version 0 7)
-                                        %guix-version))))
-           (operating-system installation-os))
-          #:name "iso9660-image"
-          #:system system)
-        ;; Only cross-compile Guix System images from x86_64-linux for now.
-        ,@(if (string=? system "x86_64-linux")
-              (map (cut image->job store <>
-                        #:system system)
-                   %guix-system-images)
-              '()))
-      '()))
+  (parameterize ((current-guix-package
+                  (channel-source->package source #:commit commit)))
+    (if (member system %guix-system-supported-systems)
+        `(,(image->job store
+                       (image
+                        (inherit efi-disk-image)
+                        (operating-system installation-os))
+                       #:name "usb-image"
+                       #:system system)
+          ,(image->job
+            store
+            (image
+             (inherit (image-with-label
+                       iso9660-image
+                       (string-append "GUIX_" system "_"
+                                      (if (> (string-length %guix-version) 7)
+                                          (substring %guix-version 0 7)
+                                          %guix-version))))
+             (operating-system installation-os))
+            #:name "iso9660-image"
+            #:system system)
+          ;; Only cross-compile Guix System images from x86_64-linux for now.
+          ,@(if (string=? system "x86_64-linux")
+                (map (cut image->job store <>
+                          #:system system)
+                     %guix-system-images)
+                '()))
+        '())))
 
 (define* (system-test-jobs store system
                            #:key source commit)
@@ -527,7 +530,9 @@ names."
                                hello system))))
          ('images
           ;; Build Guix System images only.
-          (image-jobs store system))
+          (image-jobs store system
+                      #:source source
+                      #:commit commit))
          ('system-tests
           ;; Build Guix System tests only.
           (system-test-jobs store system
diff --git a/gnu/home.scm b/gnu/home.scm
index 4ddbafe412..c95d1e0818 100644
--- a/gnu/home.scm
+++ b/gnu/home.scm
@@ -96,7 +96,7 @@
            (home-environment-essential-services he))))
 
 (define* (home-environment-derivation he)
-  "Return a derivation that builds OS."
+  "Return a derivation that builds home environment."
   (let* ((services         (home-environment-services he))
          (home (fold-services services
                               #:target-type home-service-type)))
diff --git a/gnu/home/services.scm b/gnu/home/services.scm
index 75ea54743d..99035686f1 100644
--- a/gnu/home/services.scm
+++ b/gnu/home/services.scm
@@ -420,8 +420,9 @@ extended with one gexp.")))
             (he-path (string-append (getenv "HOME") "/.guix-home"))
             (new-home-env (getenv "GUIX_NEW_HOME"))
             (new-home (or new-home-env
-                          ;; Path of the activation file if called interactively
-                          (dirname (car (command-line)))))
+                          ;; Absolute path of the directory of the activation
+                          ;; file if called interactively.
+                          (canonicalize-path (dirname (car (command-line))))))
             (old-home-env (getenv "GUIX_OLD_HOME"))
             (old-home (or old-home-env
                           (if (file-exists? (he-init-file he-path))
diff --git a/gnu/home/services/ssh.scm b/gnu/home/services/ssh.scm
index f0987aee23..d15f5ee912 100644
--- a/gnu/home/services/ssh.scm
+++ b/gnu/home/services/ssh.scm
@@ -69,17 +69,19 @@
                  " " value "\n"))
 
 (define (address-family? obj)
-  (memv obj (list 'unset AF_INET AF_INET6)))
+  (memv obj (list AF_INET AF_INET6)))
+
+(define-maybe address-family)
 
 (define (serialize-address-family field family)
-  (if (eq? 'unset family)
-      ""
+  (if (maybe-value-set? family)
       (string-append "  " (serialize-field-name field) " "
                      (cond ((= family AF_INET) "inet")
                            ((= family AF_INET6) "inet6")
                            ;; The 'else' branch is unreachable.
                            (else (raise (condition (&error)))))
-                     "\n")))
+                     "\n")
+      ""))
 
 (define (natural-number? obj)
   (and (integer? obj) (exact? obj) (> obj 0)))
@@ -115,7 +117,7 @@
    maybe-string
    "Host name---e.g., @code{\"foo.example.org\"} or @code{\"192.168.1.2\"}.")
   (address-family
-   address-family
+   maybe-address-family
    "Address family to use when connecting to this host: one of
 @code{AF_INET} (for IPv4 only), @code{AF_INET6} (for IPv6 only).
 Additionally, the field can be left unset to allow any address family.")
diff --git a/gnu/installer/parted.scm b/gnu/installer/parted.scm
index d942a2f49b..641a1f45e8 100644
--- a/gnu/installer/parted.scm
+++ b/gnu/installer/parted.scm
@@ -80,7 +80,6 @@
             efi-installation?
             default-esp-mount-point
 
-            with-delay-device-in-use?
             force-device-sync
             eligible-devices
             partition-user-type
diff --git a/gnu/local.mk b/gnu/local.mk
index a4238e5141..f061f1d4dd 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1246,6 +1246,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/guile-ac-d-bus-fix-tests.patch		\
   %D%/packages/patches/guile-cross-compilation.patch		\
   %D%/packages/patches/guile-fibers-destroy-peer-schedulers.patch \
+  %D%/packages/patches/guile-fibers-epoll-instance-is-dead.patch \
   %D%/packages/patches/guile-fibers-wait-for-io-readiness.patch \
   %D%/packages/patches/guile-gdbm-ffi-support-gdbm-1.14.patch	\
   %D%/packages/patches/guile-git-adjust-for-libgit2-1.2.0.patch \
@@ -1370,10 +1371,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/kodi-set-libcurl-ssl-parameters.patch		\
   %D%/packages/patches/kodi-skip-test-449.patch		\
   %D%/packages/patches/laby-make-install.patch			\
-  %D%/packages/patches/lcalc-default-parameters-1.patch		\
-  %D%/packages/patches/lcalc-default-parameters-2.patch		\
-  %D%/packages/patches/lcalc-lcommon-h.patch    		\
-  %D%/packages/patches/lcalc-using-namespace-std.patch 		\
   %D%/packages/patches/ldns-drill-examples.patch		\
   %D%/packages/patches/leela-zero-gtest.patch			\
   %D%/packages/patches/less-hurd-path-max.patch			\
@@ -1461,7 +1458,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/llvm-roc-4.0.0-remove-isystem-usr-include.patch \
   %D%/packages/patches/llvm-roc-5.0.0-linkdl.patch \
   %D%/packages/patches/lm-sensors-hwmon-attrs.patch		\
-  %D%/packages/patches/lrcalc-includes.patch    		\
   %D%/packages/patches/lsh-fix-x11-forwarding.patch		\
   %D%/packages/patches/lsof-fatal-test-failures.patch		\
   %D%/packages/patches/lua-CVE-2014-5461.patch                      \
@@ -1614,6 +1610,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/perl-5.14-module-pluggable-search.patch	\
   %D%/packages/patches/perl-5.14-no-sys-dirs.patch		\
   %D%/packages/patches/perl-autosplit-default-time.patch	\
+  %D%/packages/patches/perl-class-methodmaker-reproducible.patch \
   %D%/packages/patches/perl-finance-quote-unuse-mozilla-ca.patch \
   %D%/packages/patches/perl-image-exiftool-CVE-2021-22204.patch	\
   %D%/packages/patches/perl-net-amazon-s3-moose-warning.patch	\
@@ -1640,9 +1637,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/plib-CVE-2011-4620.patch		\
   %D%/packages/patches/plib-CVE-2012-4552.patch		\
   %D%/packages/patches/plotutils-spline-test.patch		\
-  %D%/packages/patches/polkit-CVE-2021-4034.patch		\
-  %D%/packages/patches/polkit-configure-elogind.patch		\
-  %D%/packages/patches/polkit-use-duktape.patch			\
   %D%/packages/patches/portaudio-audacity-compat.patch		\
   %D%/packages/patches/portmidi-modular-build.patch		\
   %D%/packages/patches/postgresql-disable-resolve_symlinks.patch	\
@@ -1680,6 +1674,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/python-argcomplete-1.11.1-fish31.patch	\
   %D%/packages/patches/python-cross-compile.patch		\
   %D%/packages/patches/python-configobj-setuptools.patch	\
+  %D%/packages/patches/python-dateutil-pytest-compat.patch	\
   %D%/packages/patches/python-debugpy-unbundle-pydevd.patch	\
   %D%/packages/patches/python-docopt-pytest6-compat.patch	\
   %D%/packages/patches/python-execnet-read-only-fix.patch	\
@@ -1721,8 +1716,6 @@ dist_patch_DATA =						\
   %D%/packages/patches/python-versioneer-guix-support.patch	\
   %D%/packages/patches/python-waitress-fix-tests.patch		\
   %D%/packages/patches/python-werkzeug-tests.patch		\
-  %D%/packages/patches/python-mypy-12332.patch			\
-  %D%/packages/patches/python-mypy-use-sys-path.patch		\
   %D%/packages/patches/python-zeep-Fix-pytest_httpx-test-cases.patch	\
   %D%/packages/patches/qemu-build-info-manual.patch		\
   %D%/packages/patches/qemu-glibc-2.27.patch 			\
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 06bc566cc7..db3e881228 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -784,7 +784,7 @@ memory, disks, network and processes.  It's a Python port and continuation of
 (define-public pies
   (package
     (name "pies")
-    (version "1.7")
+    (version "1.8")
     (source
      (origin
        (method url-fetch)
@@ -792,7 +792,16 @@ memory, disks, network and processes.  It's a Python port and continuation of
                            version ".tar.bz2"))
        (sha256
         (base32
-         "0ajcah2y6n55qc0ckspcx0hfpm1yb2xa1apcyij7mclic4q2y330"))))
+         "0v0xcq0mfil440xq2pa5mjkyva5c9ahqda54z5w2ksl2d78v8a35"))
+       (snippet
+        #~(begin
+            (use-modules (guix build utils))
+            (for-each delete-file
+                      (append
+                        ;; Generated by flex.
+                        (find-files "gres/src" "lex\\.c$")
+                        ;; Generated by bison.
+                        (find-files "gres/src" "-gram\\.[ch]$")))))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases (modify-phases %standard-phases
@@ -804,6 +813,7 @@ memory, disks, network and processes.  It's a Python port and continuation of
                         (substitute* '("src/progman.c" "src/comp.c")
                           (("\"/bin/sh\"")
                            (string-append "\"" bash "/bin/sh\"")))))))))
+    (native-inputs (list bison flex))
     (home-page "https://www.gnu.org.ua/software/pies/")
     (synopsis "Program invocation and execution supervisor")
     (description
@@ -4193,7 +4203,7 @@ Python loading in HPC environments.")
   (let ((real-name "inxi"))
     (package
       (name "inxi-minimal")
-      (version "3.3.19-1")
+      (version "3.3.20-1")
       (source
        (origin
          (method git-fetch)
@@ -4202,7 +4212,7 @@ Python loading in HPC environments.")
                (commit version)))
          (file-name (git-file-name real-name version))
          (sha256
-          (base32 "0g5m43cj4534gb181zy1hwjz5il88xibf8psxw8a4s6jnaq1zdlk"))))
+          (base32 "182lczpa217gpzn58nfdzjbbinp3bw9lbm1x9lck1mkdmqklgl2a"))))
       (build-system trivial-build-system)
       (inputs
        `(("bash" ,bash-minimal)
@@ -5444,3 +5454,40 @@ attempts, it cannot eliminate the risk presented by weak authentication.  Set
 up services to use only two factor, or public/private authentication
 mechanisms if you really want to protect services.")
     (license license:gpl2+)))
+
+(define-public rex
+  (package
+    (name "rex")
+    (version "4.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://download.gnu.org.ua/pub/releases/rex/rex-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "1arb8z602invwavskq36nhwy42a3v14iyhi06iqlngfai2k93fai"))))
+    (build-system gnu-build-system)
+    (arguments
+     (list
+      #:tests? #f                       ; no tests
+      #:phases
+      #~(modify-phases %standard-phases
+          ;; No configure script and Makefile.
+          (delete 'configure)
+          (delete 'build)
+          (add-before 'install 'patch-exec-expect
+            (lambda _
+              (substitute* "rex"
+                (("exec expect") (string-append "exec " (which "expect"))))))
+          (replace 'install
+            (lambda _
+              (invoke "./install"
+                      (string-append "--prefix=" #$output)))))))
+    (inputs (list expect))
+    (home-page "https://www.gnu.org.ua/software/rex/")
+    (synopsis "Remote execution utility")
+    (description "@command{rex} runs a supplied command or shell script on
+several hosts in succession or in parallel.  It can also be used to copy a
+file or files to several hosts.")
+    (license license:gpl3+)))
diff --git a/gnu/packages/algebra.scm b/gnu/packages/algebra.scm
index b3f0823daf..8ccb44c434 100644
--- a/gnu/packages/algebra.scm
+++ b/gnu/packages/algebra.scm
@@ -1628,7 +1628,7 @@ John Cremona to compute his elliptic curve database.")
 (define-public lrcalc
   (package
     (name "lrcalc")
-    (version "1.2")
+    (version "2.1")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -1637,18 +1637,10 @@ John Cremona to compute his elliptic curve database.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1c12d04jdyxkkav4ak8d1aqrv594gzihwhpxvc6p9js0ry1fahss"))
-              (patches (search-patches "lrcalc-includes.patch"))))
+                "0s3amf3z75hnrjyszdndrvk4wp5p630dcgyj341i6l57h43d1p4k"))))
     (build-system gnu-build-system)
     (native-inputs
      (list autoconf automake libtool))
-    (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-before 'build 'fix-permission
-           (lambda _
-             (chmod "lrcalc.maple.src" #o644)
-             #t)))))
     (synopsis "Littlewood-Richardson calculator in algebraic combinatorics")
     (description "The Littlewood-Richardson Calculator (lrcalc) is a
 program designed to compute Littlewood-Richardson coefficients.  It computes
diff --git a/gnu/packages/animation.scm b/gnu/packages/animation.scm
index ba8ce00fbd..b8524681fa 100644
--- a/gnu/packages/animation.scm
+++ b/gnu/packages/animation.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2015, 2017 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2018–2021 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2019 Pkill -9 <pkill9@runbox.com>
-;;; Copyright © 2020, 2021 Vinicius Monego <monego@posteo.net>
+;;; Copyright © 2020, 2021, 2022 Vinicius Monego <monego@posteo.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -323,7 +323,7 @@ audio or video backends, ensuring good performance.")
 (define-public lightspark
   (package
     (name "lightspark")
-    (version "0.8.5")
+    (version "0.8.6")
     (source
      (origin
        (method git-fetch)
@@ -332,7 +332,7 @@ audio or video backends, ensuring good performance.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "00535ndzjbz5xyr95cih01wlkc2mgvg60bv6amz4lnnglk0c5v0p"))))
+        (base32 "0v7d7vwb0xqkk3v8dyks0wyk52ga57v5lg93y74v1d2wh7spmmzw"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f ;requires Adobe Flex SDK, see README.tests
@@ -352,29 +352,28 @@ audio or video backends, ensuring good performance.")
              (when tests?
                (invoke "./tests")))))))
     (native-inputs
-     `(("gettext" ,gettext-minimal)
-       ("glib:bin" ,glib "bin")
-       ("nasm" ,nasm)
-       ("perl" ,perl)
-       ("pkg-config" ,pkg-config)
-       ("python" ,python-wrapper)))
+     (list gettext-minimal
+           `(,glib "bin")
+           nasm
+           perl
+           pkg-config
+           python-wrapper))
     (inputs
-     `(("cairo" ,cairo)
-       ("curl" ,curl)
-       ("ffmpeg" ,ffmpeg)
-       ("freeglut" ,freeglut)
-       ("glew" ,glew)
-       ("glibmm" ,glibmm)
-       ("gnash" ,gnash)
-       ("gnutls" ,gnutls)
-       ("libjpeg" ,libjpeg-turbo)
-       ("openssl" ,openssl)
-       ("pango" ,pango)
-       ("pcre2" ,pcre2)
-       ("rtmpdump" ,rtmpdump)
-       ("sdl2" ,sdl2)
-       ("sdl2-mixer" ,sdl2-mixer)
-       ("zlib" ,zlib)))
+     (list cairo
+           curl
+           ffmpeg
+           freeglut
+           glew
+           glibmm
+           gnutls
+           libjpeg-turbo
+           openssl
+           pango
+           pcre2
+           rtmpdump
+           sdl2
+           sdl2-mixer
+           zlib))
     (home-page "https://lightspark.github.io/")
     (synopsis "Flash player implementation")
     (description
diff --git a/gnu/packages/assembly.scm b/gnu/packages/assembly.scm
index ca50b00a06..df6587385f 100644
--- a/gnu/packages/assembly.scm
+++ b/gnu/packages/assembly.scm
@@ -291,7 +291,7 @@ runtime")
 (define-public rgbds
   (package
     (name "rgbds")
-    (version "0.4.2")
+    (version "0.5.2")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -300,7 +300,7 @@ runtime")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0lygj7jzjlq4w0mkiir7ycysrd1p1akyvzrppjcchja05mi8wy9p"))))
+                "13zy05xzh2yxyvzf78a5h59pabwrfr6qs5m453pfbdyd3msg2s7w"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
@@ -312,8 +312,7 @@ runtime")
                (("pkg-config")
                 (or (which "pkg-config")
                     (string-append ,(%current-target-system)
-                                   "-pkg-config"))))
-             #t))
+                                   "-pkg-config"))))))
          (replace 'check
            (lambda _
              (with-directory-excursion "test/asm"
diff --git a/gnu/packages/audio.scm b/gnu/packages/audio.scm
index aad86bac06..8795caef71 100644
--- a/gnu/packages/audio.scm
+++ b/gnu/packages/audio.scm
@@ -38,6 +38,7 @@
 ;;; Copyright © 2021 Aleksandr Vityazev <avityazev@posteo.org>
 ;;; Copyright © 2022 Arjan Adriaanse <arjan@adriaan.se>
 ;;; Copyright © 2022 Juliana Sims <jtsims@protonmail.com>
+;;; Copyright © 2022 Simon Streit <simon@netpanic.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -875,6 +876,10 @@ engineers, musicians, soundtrack editors and composers.")
            (lambda* (#:key inputs #:allow-other-keys)
              (substitute* '("libraries/lib-files/FileNames.cpp")
                (("\"/usr/include/linux/magic.h\"") "<linux/magic.h>"))))
+         (add-after 'install 'delete-gratuitous-script
+           (lambda* (#:key outputs #:allow-other-keys)
+             (delete-file (string-append (assoc-ref outputs "out")
+                                         "/audacity"))))
          (add-after 'wrap-program 'glib-or-gtk-wrap
            (assoc-ref glib-or-gtk:%standard-phases 'glib-or-gtk-wrap)))
        ;; The test suite is not "well exercised" according to the developers,
@@ -5863,3 +5868,30 @@ framework.  It provides a visual interface to audio and video connections
 managed by PipeWire.")
     (home-page "https://gitlab.freedesktop.org/rncbc/qpwgraph")
     (license license:gpl2)))
+
+(define-public streamripper
+  (package
+    (name "streamripper")
+    (version "1.64.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://sourceforge.net/projects/streamripper"
+                           "/files/streamripper%20(current)/"
+                           version "/streamripper-" version ".tar.gz"))
+       (sha256
+        (base32 "0hnyv3206r0rfprn3k7k6a0j959kagsfyrmyjm3gsf3vkhp5zmy1"))
+       (modules '((guix build utils)))
+       (snippet
+        ;; Delete bundled copy of libmad.
+        '(delete-file-recursively "libmad-0.15.1b"))))
+    (build-system gnu-build-system)
+    (native-inputs (list pkg-config))
+    (inputs (list faad2 glib libmad libvorbis))
+    (home-page "http://streamripper.sourceforge.net")
+    (synopsis "Record audio streams to your hard drive")
+    (description "Streamripper records shoutcast-compatible
+streams.  For shoutcast style streams it finds the “meta data” or track
+separation data, and uses that as a marker for where the track should
+be separated.")
+    (license license:gpl2+)))
diff --git a/gnu/packages/benchmark.scm b/gnu/packages/benchmark.scm
index 7be932f528..1b036e9bd4 100644
--- a/gnu/packages/benchmark.scm
+++ b/gnu/packages/benchmark.scm
@@ -72,14 +72,14 @@
 (define-public fio
   (package
     (name "fio")
-    (version "3.30")
+    (version "3.31")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://brick.kernel.dk/snaps/"
                                   "fio-" version ".tar.bz2"))
               (sha256
                (base32
-                "1qjivkisn7dxk8irrb0rglmmdpbnai6n7vindf18ln0j24cc1x56"))))
+                "03x0n18f2wsyjh6qv57kvgqcwga54rzngwzr6fzlrjsalqw7mxlp"))))
     (build-system gnu-build-system)
     (arguments
      (list #:modules
diff --git a/gnu/packages/bioconductor.scm b/gnu/packages/bioconductor.scm
index 94c92abefa..facfb75abf 100644
--- a/gnu/packages/bioconductor.scm
+++ b/gnu/packages/bioconductor.scm
@@ -35,6 +35,7 @@
   #:use-module (guix git-download)
   #:use-module (guix build-system r)
   #:use-module (gnu packages)
+  #:use-module (gnu packages autotools)
   #:use-module (gnu packages base)
   #:use-module (gnu packages bioinformatics)
   #:use-module (gnu packages boost)
@@ -1220,6 +1221,27 @@ demonstration purposes in the @code{AneuFinder} package.")
 from Illumina 450k methylation arrays.")
     (license license:artistic2.0)))
 
+(define-public r-bladderbatch
+  (package
+    (name "r-bladderbatch")
+    (version "1.34.0")
+    (source (origin
+              (method url-fetch)
+              (uri (bioconductor-uri "bladderbatch" version
+                                     'experiment))
+              (sha256
+               (base32
+                "1dpbaqsqizyi99r0imf5m4lndhhrkyiaqii9bi8rp18fjbjdd72k"))))
+    (properties `((upstream-name . "bladderbatch")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-biobase))
+    (home-page "https://bioconductor.org/packages/bladderbatch")
+    (synopsis "Bladder gene expression data illustrating batch effects")
+    (description
+     "This package contains microarray gene expression data on 57 bladder samples from
+5 batches.  The data are used as an illustrative example for the sva package.")
+    (license license:artistic2.0)))
+
 (define-public r-biscuiteerdata
   (package
     (name "r-biscuiteerdata")
@@ -1540,6 +1562,30 @@ harmonized subsetting of rows (features) and columns (patients / samples)
 across the entire multi-'omics experiment.")
     (license license:artistic2.0)))
 
+(define-public r-parathyroidse
+  (package
+    (name "r-parathyroidse")
+    (version "1.34.0")
+    (source (origin
+              (method url-fetch)
+              (uri (bioconductor-uri "parathyroidSE" version
+                                     'experiment))
+              (sha256
+               (base32
+                "1h33x55c4gbzmh085skqif04wdcvjp2l9fm55qzwws27kwd30c16"))))
+    (properties `((upstream-name . "parathyroidSE")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-summarizedexperiment))
+    (home-page "https://bioconductor.org/packages/parathyroidSE")
+    (synopsis "RangedSummarizedExperiment for RNA-Seq of parathyroid tumors")
+    (description
+     "This package provides @code{RangedSummarizedExperiment} objects of read
+counts in genes and exonic parts for paired-end RNA-Seq data from experiments on
+primary cultures of parathyroid tumors.  The sequencing was performed on tumor
+cultures from 4 patients at 2 time points over 3 conditions (DPN, OHT and control).")
+    ;; The author(s) mentions only LGPL without any specific version.
+    (license license:lgpl2.1+)))
+
 (define-public r-tcgabiolinksgui-data
   (package
     (name "r-tcgabiolinksgui-data")
@@ -2090,8 +2136,8 @@ canonical cancer pathways.")
     (description
      "The project is intended to support the use of @dfn{sequins}(synthetic
 sequencing spike-in controls) owned and made available by the Garvan Institute
-of Medical Research.  The goal is to provide a standard open source library for
-quantitative analysis, modelling and visualization of spike-in controls.")
+of Medical Research.  The goal is to provide a standard library for quantitative
+analysis, modelling, and visualization of spike-in controls.")
     (license license:bsd-3)))
 
 (define-public r-aneufinder
@@ -5016,6 +5062,45 @@ proteowizard library for mzML and mzIdentML.  The netCDF reading code has
 previously been used in XCMS.")
     (license license:artistic2.0)))
 
+(define-public r-organism-dplyr
+  (package
+    (name "r-organism-dplyr")
+    (version "1.24.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "Organism.dplyr" version))
+       (sha256
+        (base32
+         "0j29f85d66c45ww3417xx376vpz0mmvga5n7h2cl1sd4h70b55as"))))
+    (properties `((upstream-name . "Organism.dplyr")))
+    (build-system r-build-system)
+    (propagated-inputs
+     (list r-annotationdbi
+           r-annotationfilter
+           r-biocfilecache
+           r-dbi
+           r-dbplyr
+           r-dplyr
+           r-genomeinfodb
+           r-genomicfeatures
+           r-genomicranges
+           r-iranges
+           r-rlang
+           r-rsqlite
+           r-s4vectors
+           r-tibble))
+    (native-inputs (list r-knitr))
+    (home-page "https://bioconductor.org/packages/Organism.dplyr")
+    (synopsis "Dplyr-based access to Bioconductor annotation resources")
+    (description
+     "This package provides an alternative interface to Bioconductor @code{
+annotation} resources, in particular the gene identifier mapping functionality
+of the @code{org} packages (e.g., @code{org.Hs.eg.db}) and the genome coordinate
+functionality of the @code{TxDb} packages (e.g.,
+@code{TxDb.Hsapiens.UCSC.hg38.knownGene}).")
+    (license license:artistic2.0)))
+
 (define-public r-organismdbi
   (package
     (name "r-organismdbi")
@@ -5048,6 +5133,61 @@ annotation packages each of which has its own schema by taking advantage of
 the fact that each of these packages implements a select methods.")
     (license license:artistic2.0)))
 
+(define-public r-pcaexplorer
+  (package
+    (name "r-pcaexplorer")
+    (version "2.22.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (bioconductor-uri "pcaExplorer" version))
+       (sha256
+        (base32
+         "0xkafpi6y5n8hljdaj183hd5z4ik7lpbklg2cbx1hwfz4n4hh1bl"))))
+    (properties `((upstream-name . "pcaExplorer")))
+    (build-system r-build-system)
+    (propagated-inputs
+     (list r-annotationdbi
+           r-base64enc
+           r-biomart
+           r-deseq2
+           r-dt
+           r-genefilter
+           r-genomicranges
+           r-ggplot2
+           r-ggrepel
+           r-go-db
+           r-gostats
+           r-heatmaply
+           r-iranges
+           r-knitr
+           r-limma
+           r-nmf
+           r-pheatmap
+           r-plotly
+           r-plyr
+           r-rmarkdown
+           r-s4vectors
+           r-scales
+           r-shiny
+           r-shinyace
+           r-shinybs
+           r-shinydashboard
+           r-summarizedexperiment
+           r-threejs
+           r-tidyr
+           r-topgo))
+    (native-inputs (list r-knitr))
+    (home-page "https://github.com/federicomarini/pcaExplorer")
+    (synopsis
+     "Interactive Visualization of RNA-seq Data Using a Principal Components Approach")
+    (description
+     "This package provides functionality for interactive visualization of RNA-seq
+datasets based on Principal Components Analysis.  The methods provided allow for
+quick information extraction and effective data exploration.  A Shiny
+application encapsulates the whole analysis.")
+    (license license:expat)))
+
 (define-public r-pcamethods
   (package
     (name "r-pcamethods")
@@ -5611,6 +5751,38 @@ a scRNA-seq experiment onto the cell-types or individual cells identified in a
 different experiment.")
     (license license:gpl3)))
 
+(define-public r-scry
+  (package
+    (name "r-scry")
+    (version "1.8.0")
+    (source (origin
+              (method url-fetch)
+              (uri (bioconductor-uri "scry" version))
+              (sha256
+               (base32
+                "16mj21r91jy8ircdz8rfrdli9gjy0hrx90kf6ghs305d3d4dl193"))))
+    (properties `((upstream-name . "scry")))
+    (build-system r-build-system)
+    (propagated-inputs
+     (list r-biocsingular
+           r-delayedarray
+           r-glmpca
+           r-hdf5array
+           r-matrix
+           r-singlecellexperiment
+           r-summarizedexperiment))
+    (native-inputs (list r-knitr))
+    (home-page "https://bioconductor.org/packages/scry.html")
+    (synopsis "Small-count analysis methods for high-dimensional data")
+    (description
+     "Many modern biological datasets consist of small counts that are not
+well fit by standard linear-Gaussian methods such as principal component
+analysis.  This package provides implementations of count-based feature
+selection and dimension reduction algorithms.  These methods can be used to
+facilitate unsupervised analysis of any high-dimensional data such as
+single-cell RNA-seq.")
+    (license license:artistic2.0)))
+
 (define-public r-seqlogo
   (package
     (name "r-seqlogo")
@@ -6541,9 +6713,10 @@ problems in genomics, brain imaging, astrophysics, and data mining.")
     `(("r-knitr" ,r-knitr)))
    (home-page "https://github.com/yixuan/RcppNumerical")
    (synopsis "Rcpp integration for numerical computing libraries")
-   (description "This package provides a collection of open source libraries
-for numerical computing (numerical integration, optimization, etc.) and their
-integration with @code{Rcpp}.")
+   (description
+    "This package provides a collection of libraries for numerical computing
+(numerical integration, optimization, etc.) and their integration with
+@code{Rcpp}.")
    (license license:gpl2+)))
 
 (define-public r-apeglm
@@ -7917,6 +8090,16 @@ coordinates.")
         (base32
          "0kc708ss5byzw8qh439mb4nq6hsfmz73gfamiznw3lv352brd33g"))))
     (build-system r-build-system)
+    (arguments
+     (list
+      #:phases
+      '(modify-phases %standard-phases
+         (add-after 'unpack 'make-build-order-reproducible
+           (lambda _
+             (substitute* '("src/SYMPHONY/Cgl/configure.ac"
+                            "src/SYMPHONY/Cgl/configure")
+               (("for file in `ls \\*/Makefile.in`")
+                "for file in `ls */Makefile.in | sort`")))))))
     (inputs
      (list zlib))
     (native-inputs
@@ -12985,8 +13168,22 @@ gene expression.")
          "0q2y4n6bcc9pvz5sgfkw1lrb00rrp7q29i1vh7srdfmfhgpyz6bk"))))
     (properties `((upstream-name . "bgx")))
     (build-system r-build-system)
+    (arguments
+     (list
+      #:phases
+      '(modify-phases %standard-phases
+         (add-after 'unpack 'do-not-tune-cflags-for-reproducibility
+           (lambda _
+             (substitute* "configure.ac"
+               (("AX_GCC_ARCHFLAG.*") ""))
+             (delete-file "configure")
+             (invoke "autoreconf" "-vif"))))))
+    (inputs
+     (list boost))
     (propagated-inputs
      (list r-affy r-biobase r-gcrma r-rcpp))
+    (native-inputs
+     (list autoconf automake))
     (home-page "https://bioconductor.org/packages/bgx/")
     (synopsis "Bayesian gene expression")
     (description
diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
index 054776da5b..ba8c47451f 100644
--- a/gnu/packages/bioinformatics.scm
+++ b/gnu/packages/bioinformatics.scm
@@ -3985,26 +3985,44 @@ HMMs).")
 (define-public htseq
   (package
     (name "htseq")
-    (version "0.12.3")
+    (version "2.0.2")
+    ;; Sources on pypi do not include everything needed to run the tests.
     (source (origin
-              (method url-fetch)
-              (uri (pypi-uri "HTSeq" version))
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/htseq/htseq")
+                    (commit (string-append "release_" version))))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "0pk41vkzxsbb5nv644325mh8akmz4zdply9r2s80dgg5b21pgp0b"))))
+                "1kbr4ydjjhizz6r5m3xd4f0wj7qnn8zs0vnzghhgaa0yhbya5r19"))))
     (build-system python-build-system)
-    (native-inputs
-     (list python-cython))
-    ;; Numpy needs to be propagated when htseq is used as a Python library.
+    (arguments
+     (list
+      #:phases
+      '(modify-phases %standard-phases
+         ;; Avoid rebuilding the extension.  Everything is built during the
+         ;; 'install phase anyway.
+         (delete 'build)
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (invoke "pytest" "-v")))))))
     (propagated-inputs
-     (list python-numpy))
-    (inputs
-     (list python-pysam python-matplotlib))
-    (home-page "https://htseq.readthedocs.io/")
-    (synopsis "Analysing high-throughput sequencing data with Python")
+     (list python-matplotlib
+           python-numpy
+           python-pysam))
+    (native-inputs
+     (list python-cython
+           python-pandas
+           python-pytest
+           python-scipy
+           swig))
+    (home-page "https://github.com/htseq")
+    (synopsis "Framework for analyzing high-throughput sequencing data")
     (description
-     "HTSeq is a Python package that provides infrastructure to process data
-from high-throughput sequencing assays.")
+     "This package provides a framework to process and analyze data from
+high-throughput sequencing (HTS) assays")
     (license license:gpl3+)))
 
 (define-public java-htsjdk
@@ -6276,36 +6294,37 @@ subsequent visualization, annotation and storage of results.")
         (base32 "0m8wkyvbgvcr5kzc284w8fbhpxwglh2c1xq0yc3yv00a53gs7rv0"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:make-flags
-       ,#~(list "BLASFLAGS=-llapack -lopenblas"
-                (string-append "CFLAGS=-Wall -O2 -DDYNAMIC_ZLIB=1"
-                               " -I" (search-input-directory
-                                       %build-inputs "include/simde"))
-                "ZLIB=-lz"
-                "BIN=plink prettify"
-                (string-append "CC=" #$(cc-for-target))
-                (string-append "PREFIX=" #$output)
-                "DESTDIR=")
-       #:phases
-       (modify-phases %standard-phases
+     (list
+      #:tests? #false ;TEST_EXTRACT_CHR doesn't produce expected files
+      #:make-flags
+      #~(list "BLASFLAGS=-llapack -lopenblas"
+              "NO_SSE42=1"
+              "NO_AVX2=1"
+              "STATIC_ZSTD="
+              (string-append "CC=" #$(cc-for-target))
+              (string-append "PREFIX=" #$output)
+              "DESTDIR=")
+      #:phases
+      '(modify-phases %standard-phases
          (add-after 'unpack 'chdir
-           (lambda _ (chdir "1.9")))
-         (delete 'configure)  ; no "configure" script
+           (lambda _ (chdir "2.0/build_dynamic")))
+         (delete 'configure)            ; no "configure" script
          (replace 'check
            (lambda* (#:key tests? inputs #:allow-other-keys)
              (when tests?
-               (symlink "plink" "plink19")
-               (symlink (search-input-file inputs "/bin/plink") "plink107")
                (setenv "PATH" (string-append (getcwd) ":" (getenv "PATH")))
-               (with-directory-excursion "tests"
-                 ;; The model test fails because of a 0.0001 difference.
-                 (substitute* "tests.py"
-                   (("diff -q test1.model test2.model")
-                    "echo yes"))
-                 (invoke "bash" "test_setup.sh")
-                 (invoke "python3" "tests.py"))))))))
+               (with-directory-excursion "../Tests"
+                 (substitute* "run_tests.sh"
+                   (("^./run_tests" m)
+                    (string-append (which "bash") " " m)))
+                 (invoke "bash" "run_tests.sh")))))
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (install-file "plink2"
+                           (string-append
+                            (assoc-ref outputs "out") "/bin")))))))
     (inputs
-     (list lapack openblas zlib))
+     (list lapack openblas zlib `(,zstd "lib")))
     (native-inputs
      (list diffutils plink python simde)) ; for tests
     (home-page "https://www.cog-genomics.org/plink/")
@@ -6430,6 +6449,86 @@ Values such as sequence name, sequence description, sequence quality and the
 sequence itself can be retrieved from these databases.")
     (license license:bsd-3)))
 
+(define-public python-taggd
+  (package
+    (name "python-taggd")
+    (version "0.3.6")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/SpatialTranscriptomicsResearch/taggd")
+                    (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0j19ah81z7aqrdljah9hyarp91gvgbk63pz6fz3pdpksy1yqyi6k"))
+              (modules '((guix build utils)))
+              (snippet
+               '(for-each delete-file
+                          (find-files "taggd" "\\.c$")))))
+    (build-system python-build-system)
+    (arguments
+     (list
+      #:phases
+      '(modify-phases %standard-phases
+         (add-after 'unpack 'disable-broken-tests
+           (lambda _
+             (substitute* "tests/taggd_demultiplex_test.py"
+               (("def test_normal_bam_run")
+                "def _disabled_test_normal_bam_run")))))))
+    (propagated-inputs
+     (list python-numpy python-pysam python-setuptools))
+    (native-inputs
+     (list python-cython))
+    (home-page "https://github.com/SpatialTranscriptomicsResearch/taggd")
+    (synopsis "Genetic barcode demultiplexing")
+    (description "This package provides TagGD barcode demultiplexing utilities
+for Spatial Transcriptomics data.")
+    (license license:bsd-3)))
+
+(define-public stpipeline
+  (package
+    (name "stpipeline")
+    (version "1.8.1")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "stpipeline" version))
+              (sha256
+               (base32
+                "0har2g42fvaqpiz66lincy86aj1hvwzds26kxhxfamvyvv4721wk"))))
+    (build-system python-build-system)
+    (arguments
+     (list
+      #:phases
+      '(modify-phases %standard-phases
+         (add-after 'unpack 'relax-requirements
+           (lambda _
+             (substitute* "requirements.txt"
+               (("argparse.*") "")))))))
+    (propagated-inputs
+     (list htseq
+           python-cython
+           python-invoke
+           python-numpy
+           python-pandas
+           python-pympler
+           python-pysam
+           python-regex
+           python-scikit-learn
+           python-scipy
+           python-seaborn
+           python-setuptools
+           python-sqlitedict
+           python-taggd
+           samtools
+           star))
+    (home-page "https://github.com/SpatialTranscriptomicsResearch/st_pipeline")
+    (synopsis "Pipeline for spatial mapping of unique transcripts")
+    (description
+     "This package provides an automated pipeline for spatial mapping of
+unique transcripts.")
+    (license license:expat)))
+
 (define-public sra-tools
   (package
     (name "sra-tools")
@@ -11292,13 +11391,13 @@ cases include:
 (define-public python-mappy
   (package
    (name "python-mappy")
-   (version "2.18")
+   (version "2.24")
    (source (origin
             (method url-fetch)
             (uri (pypi-uri "mappy" version))
             (sha256
              (base32
-              "1a05p7rkmxa6qhm108na8flzj2v45jab06drk59kzk1ip2sgvzqq"))))
+              "1ycszza87p9qvx8mis9v1hry0ac465x1xcxbsn1k45qlxxrzp8im"))))
    (build-system python-build-system)
    (native-inputs
     (list python-cython))
@@ -16097,6 +16196,32 @@ control samples and applying quantile normalization on all markers of
 interest.")
       (license license:gpl2+))))
 
+(define-public r-kbet
+  (let ((commit "f35171dfb04c7951b8a09ac778faf7424c4b6bc0")
+        (revision "1"))
+    (package
+      (name "r-kbet")
+      (version (git-version "0.99.6" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/theislab/kBET")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "1r91prl2kki3zk694vhlmxdlqh0ixlhs8jfcqw6wc7cdsa0nv67k"))))
+      (properties `((upstream-name . "kBET")))
+      (build-system r-build-system)
+      (propagated-inputs (list r-cluster r-fnn r-ggplot2 r-mass r-rcolorbrewer))
+      (native-inputs (list r-knitr))
+      (home-page "https://github.com/theislab/kBET")
+      (synopsis "k-nearest neighbour batch effect test")
+      (description
+       "This tool detects batch effects in high-dimensional data based on chi^2-test.")
+      ;; Any version of the GPL
+      (license license:gpl3+))))
+
 (define-public ccwl
   (package
     (name "ccwl")
@@ -16330,3 +16455,271 @@ alignment algorithm.  It completes MashMap with a high-performance alignment
 module capable of computing base-level alignments for very large sequences.")
     (home-page "https://github.com/ekg/wfmash")
     (license license:expat)))
+
+(define-public flair
+  (package
+    (name "flair")
+    (version "1.6.2")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/BrooksLabUCSC/flair")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "106swb2q7l20ki58fca1hg95q5f79bgp9gjb0clr2243ycrzyxf8"))))
+    (build-system python-build-system)
+    (arguments
+     (list
+      #:tests? #false ;there are none
+      #:phases
+      #~(modify-phases %standard-phases
+          ;; TODO: implement as a feature of python-build-system (PEP-621,
+          ;; PEP-631, PEP-660)
+          (replace 'build
+            (lambda _
+              (setenv "SETUPTOOLS_SCM_PRETEND_VERSION" #$version)
+              ;; ZIP does not support timestamps before 1980.
+              (setenv "SOURCE_DATE_EPOCH" "315532800")
+              (invoke "python" "-m" "build" "--wheel" "--no-isolation" ".")))
+          (replace 'install
+            (lambda _
+              (apply invoke "pip" "--no-cache-dir" "--no-input"
+                     "install" "--no-deps" "--prefix" #$output
+                     (find-files "dist" "\\.whl$")))))))
+    (propagated-inputs
+     (list python-mappy
+           python-ncls
+           python-pybedtools
+           python-pysam
+           python-tqdm))
+    (native-inputs
+     (list python-pypa-build python-setuptools))
+    (home-page "https://flair.readthedocs.io/en/latest/")
+    (synopsis "Full-length alternative isoform analysis of RNA")
+    (description "This package implements FLAIR (Full-Length Alternative
+Isoform analysis of RNA) for the correction, isoform definition, and
+alternative splicing analysis of noisy reads.  FLAIR has primarily been used
+for nanopore cDNA, native RNA, and PacBio sequencing reads.")
+    (license license:bsd-3)))
+
+(define-public go-github-com-biogo-graph
+  (package
+    (name "go-github-com-biogo-graph")
+    (version "0.0.0-20150317020928-057c1989faed")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/biogo/graph")
+                    (commit (go-version->git-ref version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1kpzs5dfd5dsk4mg1g2qjz1prqd84ixhrcxxnf90hq25vxcnk7lh"))))
+    (build-system go-build-system)
+    (arguments
+     '(#:import-path "github.com/biogo/graph"
+       #:tests? #false))      ;TODO: one of 13 tests fails for unknown reasons
+    (propagated-inputs
+     (list go-gopkg-in-check-v1))
+    (home-page "https://github.com/biogo/graph")
+    (synopsis "Undirected graph analysis for biogo")
+    (description "The package @code{graph} implements graph manipulation
+functions.")
+    (license license:bsd-3)))
+
+(define-public go-github-com-biogo-store-interval
+  (package
+    (name "go-github-com-biogo-store-interval")
+    (version "0.0.0-20201120204734-aad293a2328f")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/biogo/store")
+                    (commit (go-version->git-ref version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0skizrp1j6vgbl0g1kmh73picagqlvwckaqs0gkl6rai5lckxj8a"))))
+    (build-system go-build-system)
+    (arguments
+     '(#:import-path "github.com/biogo/store/interval"
+       #:unpack-path "github.com/biogo/store"))
+    (propagated-inputs
+     (list go-gopkg-in-check-v1
+           go-github-com-kr-pretty))
+    (home-page "https://github.com/biogo/store")
+    (synopsis "Interval store type for biogo")
+    (description
+     "The @code{store} package provides a number of data store types that are
+useful for bioinformatic analysis.")
+    (license license:bsd-3)))
+
+(define-public go-github-com-biogo-store-kdtree
+  (package
+    (inherit go-github-com-biogo-store-interval)
+    (name "go-github-com-biogo-store-kdtree")
+    (arguments
+     '(#:import-path "github.com/biogo/store/kdtree"
+       #:unpack-path "github.com/biogo/store"))
+    (propagated-inputs
+     (list go-gopkg-in-check-v1
+           go-github-com-kr-pretty))
+    (synopsis "kdtree store type for biogo")))
+
+(define-public go-github-com-biogo-store-llrb
+  (package
+    (inherit go-github-com-biogo-store-interval)
+    (name "go-github-com-biogo-store-llrb")
+    (arguments
+     '(#:import-path "github.com/biogo/store/llrb"
+       #:unpack-path "github.com/biogo/store"))
+    (propagated-inputs
+     (list go-gopkg-in-check-v1
+           go-github-com-kr-pretty))
+    (synopsis "LLRB store for biogo")))
+
+(define-public go-github-com-biogo-store-step
+  (package
+    (inherit go-github-com-biogo-store-interval)
+    (name "go-github-com-biogo-store-step")
+    (arguments
+     '(#:import-path "github.com/biogo/store/step"
+       #:unpack-path "github.com/biogo/store"))
+    (propagated-inputs
+     (list go-gopkg-in-check-v1
+           go-github-com-kr-pretty))
+    (synopsis "Step store for biogo")))
+
+(define-public go-github-com-biogo-hts-bam
+  (package
+    (name "go-github-com-biogo-hts-bam")
+    (version "1.4.3")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/biogo/hts")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "013ga6ilc4m3hyfr3yyiva9g4vs81afhj73v2sy7r75b5zxw7lx1"))))
+    (build-system go-build-system)
+    (arguments
+     '(#:import-path "github.com/biogo/hts/bam"
+       #:unpack-path "github.com/biogo/hts"))
+    (propagated-inputs
+     (list go-gopkg-in-check-v1))
+    (home-page "https://github.com/biogo/hts")
+    (synopsis "HTS BAM module for biogo")
+    (description "This package provides tools for handling BAM files.")
+    (license license:bsd-3)))
+
+(define-public go-github-com-biogo-hts-sam
+  (package
+    (inherit go-github-com-biogo-hts-bam)
+    (name "go-github-com-biogo-hts-sam")
+    (arguments
+     '(#:import-path "github.com/biogo/hts/sam"
+       #:unpack-path "github.com/biogo/hts"))
+    (propagated-inputs
+     (list go-gopkg-in-check-v1))
+    (synopsis "HTS SAM module for biogo")
+    (description "This package provides tools for handling SAM files.")))
+
+(define-public go-github-com-biogo-hts-tabix
+  (package
+    (inherit go-github-com-biogo-hts-bam)
+    (name "go-github-com-biogo-hts-tabix")
+    (arguments
+     '(#:import-path "github.com/biogo/hts/tabix"
+       #:unpack-path "github.com/biogo/hts"))
+    (propagated-inputs
+     (list go-gopkg-in-check-v1))
+    (synopsis "HTS Tabix module for biogo")
+    (description "This package provides tools for handling Tabix files.")))
+
+(define-public go-github-com-biogo-hts-bgzf
+  (package
+    (inherit go-github-com-biogo-hts-bam)
+    (name "go-github-com-biogo-hts-bgzf")
+    (arguments
+     '(#:import-path "github.com/biogo/hts/bgzf"
+       #:unpack-path "github.com/biogo/hts"))
+    (propagated-inputs
+     (list go-gopkg-in-check-v1))
+    (synopsis "HTS bgzf module for biogo")
+    (description "This package provides tools for handling bgzf files.")))
+
+(define-public go-github-com-biogo-hts-cram
+  (package
+    (inherit go-github-com-biogo-hts-bam)
+    (name "go-github-com-biogo-hts-cram")
+    (arguments
+     '(#:import-path "github.com/biogo/hts/cram"
+       #:unpack-path "github.com/biogo/hts"
+       #:tests? #false)) ;require network access
+    (propagated-inputs
+     (list go-gopkg-in-check-v1
+           go-github.com-ulikunitz-xz
+           go-github-com-kortschak-utter))
+    (synopsis "HTS CRAM module for biogo")
+    (description "This package provides tools for handling CRAM files.")))
+
+(define-public go-github-com-biogo-hts-csi
+  (package
+    (inherit go-github-com-biogo-hts-bam)
+    (name "go-github-com-biogo-hts-csi")
+    (arguments
+     '(#:import-path "github.com/biogo/hts/csi"
+       #:unpack-path "github.com/biogo/hts"))
+    (propagated-inputs
+     (list go-gopkg-in-check-v1))
+    (synopsis "Coordinate sorted indexing for biogo")
+    (description "This package implements CSIv1 and CSIv2 coordinate sorted
+indexing.")))
+
+(define-public go-github-com-biogo-hts-fai
+  (package
+    (inherit go-github-com-biogo-hts-bam)
+    (name "go-github-com-biogo-hts-fai")
+    (arguments
+     '(#:import-path "github.com/biogo/hts/fai"
+       #:unpack-path "github.com/biogo/hts"))
+    (propagated-inputs
+     (list go-gopkg-in-check-v1))
+    (synopsis "Fasta sequence file index handling for biogo")
+    (description "This package implements FAI fasta sequence file index
+handling.")))
+
+(define-public go-github-com-biogo-biogo
+  (package
+    (name "go-github-com-biogo-biogo")
+    (version "1.0.4")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/biogo/biogo")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0ali1mqf3dc26myv6l7wmqfr8i25461rbq3qdad8s0wi29622199"))))
+    (build-system go-build-system)
+    (arguments
+     '(#:import-path "github.com/biogo/biogo"))
+    (propagated-inputs
+     (list go-gopkg-in-check-v1
+           go-github-com-biogo-store-interval
+           go-github-com-biogo-store-kdtree
+           go-github-com-biogo-store-llrb
+           go-github-com-biogo-store-step
+           go-github-com-biogo-hts-bam
+           go-github-com-biogo-graph))
+    (home-page "https://github.com/biogo/biogo")
+    (synopsis "Bioinformatics library for Go")
+    (description
+     "Bíogo is a bioinformatics library for the Go language.")
+    (license license:bsd-3)))
diff --git a/gnu/packages/bittorrent.scm b/gnu/packages/bittorrent.scm
index fcb59368e9..4fc250e7b6 100644
--- a/gnu/packages/bittorrent.scm
+++ b/gnu/packages/bittorrent.scm
@@ -16,6 +16,7 @@
 ;;; Copyright © 2021 Josselin Poiret <josselin.poiret@protonmail.ch>
 ;;; Copyright © 2022 Brice Waegeneire <brice@waegenei.re>
 ;;; Copyright © 2022 Jacob Hart <hartja1@yahoo.com>
+;;; Copyright © 2022 Simon Streit <simon@netpanic.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -132,7 +133,7 @@
                 (string-append gui "/share/man/man1/transmission-gtk.1"))
              #t))))))
     (inputs
-     (list libevent curl openssl zlib gtk+))
+     (list libevent curl openssl zlib gtk+ libappindicator))
     (native-inputs
      (list intltool pkg-config))
     (home-page "https://transmissionbt.com/")
diff --git a/gnu/packages/bootloaders.scm b/gnu/packages/bootloaders.scm
index d19cf55bc4..b521b57ecd 100644
--- a/gnu/packages/bootloaders.scm
+++ b/gnu/packages/bootloaders.scm
@@ -7,7 +7,7 @@
 ;;; Copyright © 2016, 2017 Danny Milosavljevic <dannym@scratchpost.org>
 ;;; Copyright © 2016, 2017 David Craven <david@craven.ch>
 ;;; Copyright © 2017, 2018, 2020, 2021, 2022 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2018, 2019, 2020, 2021 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018–2022 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2019 nee <nee@cock.li>
 ;;; Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2020 Björn Höfling <bjoern.hoefling@bjoernhoefling.de>
@@ -1157,14 +1157,14 @@ tools, and more.")
 (define-public os-prober
   (package
     (name "os-prober")
-    (version "1.80")
+    (version "1.81")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://debian/pool/main/o/os-prober/os-prober_"
                            version ".tar.xz"))
        (sha256
-        (base32 "13z3rshgz5xj0328a80wavdimjw925yha9s1ks398sq0kn5w6qw0"))))
+        (base32 "10w8jz6mqhp0skdcam9mpgv79vx1sv7lkpra3rqjg0jkhvn2in9g"))))
     (build-system gnu-build-system)
     (arguments
      `(#:modules ((guix build gnu-build-system)
diff --git a/gnu/packages/browser-extensions.scm b/gnu/packages/browser-extensions.scm
index 1012e4b643..63bd11b226 100644
--- a/gnu/packages/browser-extensions.scm
+++ b/gnu/packages/browser-extensions.scm
@@ -51,7 +51,7 @@ supported content to the Kodi media center.")
 (define ublock-origin
   (package
     (name "ublock-origin")
-    (version "1.43.0")
+    (version "1.44.0")
     (home-page "https://github.com/gorhill/uBlock")
     (source (origin
               (method git-fetch)
@@ -62,7 +62,7 @@ supported content to the Kodi media center.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0w0by41v1s1cbd3bfjlb7kxr2bl6r5z3jvizlx02x14hqlppma9k"))))
+                "0sws7xd8nvxnzcyw92i9sc5xv3hpqw1kzdj9vm8bhfxlh042l7ly"))))
     (build-system gnu-build-system)
     (outputs '("xpi" "firefox" "chromium"))
     (arguments
diff --git a/gnu/packages/build-tools.scm b/gnu/packages/build-tools.scm
index 1134b8eb3c..38a7ee2783 100644
--- a/gnu/packages/build-tools.scm
+++ b/gnu/packages/build-tools.scm
@@ -102,7 +102,7 @@ makes a few sacrifices to acquire fast full and incremental build times.")
 (define-public bear
   (package
     (name "bear")
-    (version "3.0.19")
+    (version "3.0.20")
     (source
      (origin
        (method git-fetch)
@@ -111,7 +111,7 @@ makes a few sacrifices to acquire fast full and incremental build times.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "05jbcx5m923dg27j3i442hc73hdci5n7vp7a671x1w7bdivgqg96"))))
+        (base32 "0k89ccp9vz3x71w3r2wfpng9b8s0rxp4qr0ch9q32wq6y1ik847j"))))
     (build-system cmake-build-system)
     (arguments
      `(#:phases (modify-phases %standard-phases
diff --git a/gnu/packages/c.scm b/gnu/packages/c.scm
index 39f048e993..d7d649488b 100644
--- a/gnu/packages/c.scm
+++ b/gnu/packages/c.scm
@@ -463,7 +463,7 @@ as dictionaries, skip lists, and memory pools.")
 (define-public packcc
   (package
     (name "packcc")
-    (version "1.7.2")
+    (version "1.8.0")
     (home-page "https://github.com/arithy/packcc")
     (source (origin
               (method git-fetch)
@@ -473,7 +473,7 @@ as dictionaries, skip lists, and memory pools.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1mb6ys5ylvjz0xpq6769ir98s80p98s9ahd0c9k8p2ra1w20vz33"))))
+                "0b25p7ri1l2l20awyknljfnj7r4rg7cf2x3bljijx5q6j8rxdcsg"))))
     (build-system gnu-build-system)
     (arguments
      '(#:phases (modify-phases %standard-phases
diff --git a/gnu/packages/cdrom.scm b/gnu/packages/cdrom.scm
index 56a4ab8a10..6391bd6fec 100644
--- a/gnu/packages/cdrom.scm
+++ b/gnu/packages/cdrom.scm
@@ -408,58 +408,59 @@ or @command{xorrisofs} to create ISO 9660 images.")
 (define-public dvdisaster
   (package
     (name "dvdisaster")
-    (version "0.79.9")
+    (version "0.79.10")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://dvdisaster.jcea.es/downloads/dvdisaster-"
                            version ".tar.bz2"))
        (sha256
-        (base32 "1hz3fvqfdrwb7dn6ggqkpcgyjag37ivm1layw27ncjz9glklxjbr"))))
+        (base32 "1s3z4098ixdjr3gjs36fg7rykqs0zz1rnvz2v9rvyj0s5zv9y2nx"))))
     (build-system gnu-build-system)
     (inputs
      (list gtk+-2))
     (native-inputs
-     `(("gettext" ,gettext-minimal)
-       ("pkg-config" ,pkg-config)
-       ("which" ,which)))
+     (list gettext-minimal pkg-config which))
     (arguments
-     `(;; Parallel builds appear to be unsafe, see
-       ;; <http://hydra.gnu.org/build/49331/nixlog/1/raw>.
-       #:parallel-build? #f
-       #:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (with-directory-excursion "regtest"
-               (substitute* "common.bash"
-                 (("ISODIR=/var/tmp/regtest") "ISODIR=/tmp"))
-               (for-each invoke (find-files "." "rs.*\\.bash")))))
-         (add-after 'install 'install-desktop
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let* ((datadir (string-append (assoc-ref outputs "out") "/share")))
-               (substitute* "contrib/dvdisaster.desktop"
-                 (("dvdisaster48.png") "dvdisaster.png"))
-               (install-file "contrib/dvdisaster.desktop"
-                             (string-append datadir "/applications"))
-               (for-each
-                (lambda (png)
-                  (let* ((size (substring png
-                                          (string-index png char-set:digit)
-                                          (string-rindex png #\.)))
-                         (icondir (string-append datadir "/icons/"
-                                                 size "x" size "/apps")))
-                    (mkdir-p icondir)
-                    (copy-file png (string-append icondir "/dvdisaster.png"))))
-                (find-files "contrib" "dvdisaster[0-9]*\\.png"))
-               (mkdir-p (string-append datadir "/pixmaps"))
-               (copy-file "contrib/dvdisaster48.xpm"
-                          (string-append datadir "/pixmaps/dvdisaster.xpm")))))
-         (add-after 'install 'remove-uninstall-script
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out")))
-               (delete-file
-                (string-append out "/bin/dvdisaster-uninstall.sh"))))))))
+     (list #:parallel-build? #f ; http://hydra.gnu.org/build/49331/nixlog/1/raw
+           #:phases
+           #~(modify-phases %standard-phases
+               (replace 'check
+                 (lambda _
+                   (with-directory-excursion "regtest"
+                     (substitute* "common.bash"
+                       (("ISODIR=/var/tmp/regtest") "ISODIR=/tmp"))
+                     (for-each invoke (find-files "." "rs.*\\.bash")))))
+               (add-after 'install 'install-desktop
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let* ((datadir (string-append (assoc-ref outputs "out")
+                                                  "/share")))
+                     (substitute* "contrib/dvdisaster.desktop"
+                       (("dvdisaster48.png") "dvdisaster.png"))
+                     (install-file "contrib/dvdisaster.desktop"
+                                   (string-append datadir "/applications"))
+                     (for-each
+                      (lambda (png)
+                        (let* ((size (substring
+                                      png
+                                      (string-index png char-set:digit)
+                                      (string-rindex png #\.)))
+                               (icondir (string-append datadir "/icons/"
+                                                       size "x" size "/apps")))
+                          (mkdir-p icondir)
+                          (copy-file png
+                                     (string-append icondir
+                                                    "/dvdisaster.png"))))
+                      (find-files "contrib" "dvdisaster[0-9]*\\.png"))
+                     (mkdir-p (string-append datadir "/pixmaps"))
+                     (copy-file "contrib/dvdisaster48.xpm"
+                                (string-append datadir
+                                               "/pixmaps/dvdisaster.xpm")))))
+               (add-after 'install 'remove-uninstall-script
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let* ((out (assoc-ref outputs "out")))
+                     (delete-file
+                      (string-append out "/bin/dvdisaster-uninstall.sh"))))))))
     (home-page "https://dvdisaster.jcea.es/")
     (synopsis "Error correcting codes for optical media images")
     (description "Optical media (CD,DVD,BD) keep their data only for a
diff --git a/gnu/packages/check.scm b/gnu/packages/check.scm
index aa7dd41af4..d7920ee27b 100644
--- a/gnu/packages/check.scm
+++ b/gnu/packages/check.scm
@@ -665,19 +665,27 @@ test) much simpler.")
 (define-public go-github.com-smartystreets-assertions
   (package
     (name "go-github.com-smartystreets-assertions")
-    (version "1.8.1")
+    (version "1.13.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
                     (url "https://github.com/smartystreets/assertions")
-                    (commit version)))
+                    (commit (string-append "v" version))))
               (file-name (git-file-name name version))
               (sha256
-               (base32
-                "1j0adgbykl55rf2945g0n5bmqdsnjcqlx5dcmpfh4chki43hiwg9"))))
+               (base32 "0flf3fb6fsw3bk1viva0fzrzw87djaj1mqvrx2gzg1ssn7xzfrzr"))))
     (build-system go-build-system)
     (arguments
-     '(#:import-path "github.com/smartystreets/assertions"))
+     (list
+       #:import-path "github.com/smartystreets/assertions"
+       #:phases
+       #~(modify-phases %standard-phases
+           (replace 'check
+             (lambda* (#:key inputs #:allow-other-keys #:rest args)
+               (unless
+                 ;; The tests fail when run with gccgo.
+                 (false-if-exception (search-input-file inputs "/bin/gccgo"))
+                 (apply (assoc-ref %standard-phases 'check) args)))))))
     (native-inputs
      (list go-github.com-smartystreets-gunit))
     (synopsis "Assertions for testing with Go")
@@ -2689,18 +2697,29 @@ create data based on random numbers and yet remain repeatable.")
 (define-public python-freezegun
   (package
     (name "python-freezegun")
-    (version "0.3.14")
+    (version "1.2.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "freezegun" version))
        (sha256
-        (base32 "0al75mk829j1izxi760b7yjnknjihyfhp2mvi5qiyrxb9cpxwqk2"))))
+        (base32 "0ijlq32qvpm5zprfzbyzawpl9qjsknlxhryr1i0q84wl0sxd28nd"))
+       (modules '((guix build utils)))
+       (snippet
+        ;; Add an explicit case for static methods as they are callable
+        ;; in Python 3.10, breaking this conditional.
+        ;; XXX Taken from upstream pull request:
+        ;; https://github.com/spulec/freezegun/pull/397
+        '(substitute* "freezegun/api.py"
+           (("if not callable\\(attr_value\\) or \
+inspect\\.isclass\\(attr_value\\):")
+            "if (not callable(attr_value) or inspect.isclass(attr_value)\
+or isinstance(attr_value, staticmethod)):")))))
     (build-system python-build-system)
     (native-inputs
-     (list python-mock python-pytest))
+     (list python-pytest))
     (propagated-inputs
-     (list python-six python-dateutil))
+     (list python-dateutil))
     (arguments
      `(#:phases
        (modify-phases %standard-phases
diff --git a/gnu/packages/chromium.scm b/gnu/packages/chromium.scm
index c91a8f250c..2f67e23f4d 100644
--- a/gnu/packages/chromium.scm
+++ b/gnu/packages/chromium.scm
@@ -316,7 +316,7 @@
   ;; run the Blink performance tests, just remove everything to save ~70MiB.
   '("third_party/blink/perf_tests"))
 
-(define %chromium-version "104.0.5112.81")
+(define %chromium-version "104.0.5112.101")
 (define %ungoogled-revision (string-append %chromium-version "-1"))
 (define %debian-revision "debian/102.0.5005.61-1")
 
@@ -328,7 +328,7 @@
     (file-name (git-file-name "ungoogled-chromium" %ungoogled-revision))
     (sha256
      (base32
-      "0dvwh470h06x5a4p8kw22pi4lvch16knh90i2kh10y0wfggqz78w"))))
+      "0jy5hjn61p5mnbqns3jlybim7iy8w9cmzm3i84wn68cyyx1bk25m"))))
 
 (define %debian-origin
   (origin
@@ -477,7 +477,7 @@
                                   %chromium-version ".tar.xz"))
               (sha256
                (base32
-                "0x17jzzvn2aqx3ahqyi6ijyn70sn79kg648r0ks9m5gib1bbgf0y"))
+                "0nrghgngxdn9richjnxii9y94dg5zpwc3gd3vx609r4xaphibw30"))
               (modules '((guix build utils)))
               (snippet (force ungoogled-chromium-snippet))))
     (build-system gnu-build-system)
diff --git a/gnu/packages/ci.scm b/gnu/packages/ci.scm
index 9cd2f6884e..86d99c9031 100644
--- a/gnu/packages/ci.scm
+++ b/gnu/packages/ci.scm
@@ -5,6 +5,7 @@
 ;;; Copyright © 2017, 2020, 2021 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2017, 2019, 2020 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2018 Clément Lassieur <clement@lassieur.org>
+;;; Copyright © 2022 Arun Isaac <arunisaac@systemreboot.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -193,16 +194,16 @@ intended as a replacement for Hydra.")
 (define-public laminar
   (package
     (name "laminar")
-    (version "1.1")
+    (version "1.2")
     (source
-     (origin (method url-fetch)
-             (uri (string-append "https://github.com/ohwgiles/laminar/archive/"
-                                 version
-                                 ".tar.gz"))
-             (file-name (string-append name "-" version ".tar.gz"))
+     (origin (method git-fetch)
+             (uri (git-reference
+                   (url "https://github.com/ohwgiles/laminar")
+                   (commit version)))
+             (file-name (git-file-name name version))
              (sha256
               (base32
-               "1lzfmfjygmbdr2n1q49kwwffw8frz5y6iczhdz5skwmzwg0chbsf"))))
+               "1sg0kccp3nczkn2vxcsqv10vyvmjnhpaykc1nfhh55jyda4xzf9w"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f                      ; TODO Can't build tests
@@ -223,8 +224,7 @@ intended as a replacement for Hydra.")
                (("install\\(FILES \\$\\{CMAKE\\_CURRENT\\_BINARY\\_DIR\\}\\/laminar\\.service DESTINATION \\$\\{SYSTEMD\\_UNITDIR\\}\\)")
                 "")
                (("install\\(FILES etc/laminar\\.conf DESTINATION \\/etc\\)") "")
-               (("\\/usr\\/") ""))
-             #t))
+               (("\\/usr\\/") ""))))
          (add-after 'configure 'copy-in-javascript-and-css
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (use-modules (ice-9 popen))
@@ -253,9 +253,7 @@ intended as a replacement for Hydra.")
 
              ;; ansi_up.js isn't minified
              (copy-file (assoc-ref inputs "ansi_up.js")
-                        "../build/js/ansi_up.js")
-
-             #t)))))
+                        "../build/js/ansi_up.js"))))))
     (inputs
      (list capnproto rapidjson sqlite boost zlib))
     (native-inputs
diff --git a/gnu/packages/code.scm b/gnu/packages/code.scm
index 96736aac84..f4855e12e9 100644
--- a/gnu/packages/code.scm
+++ b/gnu/packages/code.scm
@@ -390,7 +390,7 @@ features that are not supported by the standard @code{stdio} implementation.")
 (define-public universal-ctags
   (package
     (name "universal-ctags")
-    (version "5.9.20220626.0")
+    (version "5.9.20220807.0")
     (source
      (origin
        (method git-fetch)
@@ -400,7 +400,7 @@ features that are not supported by the standard @code{stdio} implementation.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1x5kqqznlbndwln8g0kcxnla6b94i7x7cd63ba2sj0fzzms5gx24"))
+         "1wjj6hlda7xyjm8yrl2zz74ks7azymm9yyrpz36zxxpx2scf6lsk"))
        (modules '((guix build utils)))
        (snippet
         '(begin
diff --git a/gnu/packages/coq.scm b/gnu/packages/coq.scm
index bbb6c4d435..bbb34df27d 100644
--- a/gnu/packages/coq.scm
+++ b/gnu/packages/coq.scm
@@ -101,7 +101,18 @@ It is developed using Objective Caml and Camlp5.")
     (name "coq-stdlib")
     (arguments
      `(#:package "coq-stdlib"
-       #:test-target "."))
+       #:test-target "."
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'build 'fix-dune
+           (lambda _
+             (substitute* "user-contrib/Ltac2/dune"
+               (("coq-core.plugins.ltac2")
+                (string-join
+                  (map (lambda (plugin) (string-append "coq-core.plugins." plugin))
+                       '("ltac2" "number_string_notation" "tauto" "cc"
+                         "firstorder"))
+                  " "))))))))
     (inputs
      (list coq-core gmp ocaml-zarith))
     (native-inputs '())))
diff --git a/gnu/packages/cpp.scm b/gnu/packages/cpp.scm
index 1c9e57fb1c..e6d734010d 100644
--- a/gnu/packages/cpp.scm
+++ b/gnu/packages/cpp.scm
@@ -1871,3 +1871,37 @@ std::filesystem compatible helper library, based on the C++17 and C++20 specs,
 but implemented for C++11, C++14, C++17 or C++20.")
     (home-page "https://github.com/gulrak/filesystem")
     (license license:expat)))
+
+(define-public cpp-mustache
+  (package
+    (name "cpp-mustache")
+    (version "4.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/kainjow/Mustache")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0r9rbk6v1wpld2ismfsk2lkhbyv3dkf0p03hkjivbj05qkfhvlbb"))))
+    (build-system cmake-build-system)
+    (arguments
+     (list #:phases
+           #~(modify-phases %standard-phases
+               (replace 'check
+                 (lambda* (#:key tests? #:allow-other-keys)
+                   (when tests?
+                     (invoke "./mustache"))))
+               (replace 'install
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (install-file "../source/mustache.hpp"
+                                 (string-append (assoc-ref outputs "out")
+                                                "/include")))))))
+    (home-page "https://github.com/kainjow/Mustache")
+    (synopsis "Mustache text templates for modern C++")
+    (description "@code{cpp-mustache} is a Mustache implementation for C++ 11
+and above.  It is header only and has zero dependencies.  It provides a
+templated string type for compatibility with any STL-like string (std::string,
+std::wstring, etc).")
+    (license license:boost1.0)))
diff --git a/gnu/packages/cran.scm b/gnu/packages/cran.scm
index e2425ec16e..8b521aa980 100644
--- a/gnu/packages/cran.scm
+++ b/gnu/packages/cran.scm
@@ -104,6 +104,7 @@
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages sqlite)
   #:use-module (gnu packages statistics)
+  #:use-module (gnu packages tbb)
   #:use-module (gnu packages tcl)
   #:use-module (gnu packages tex)
   #:use-module (gnu packages textutils)
@@ -115,6 +116,35 @@
   #:use-module (gnu packages xml)
   #:use-module (gnu packages xorg))
 
+(define-public r-aer
+  (package
+    (name "r-aer")
+    (version "1.2-10")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "AER" version))
+              (sha256
+               (base32
+                "1p6vxr0220lim5i4gwsvphqrfd65zbs8h3qydz4gipca9asmy2k5"))))
+    (properties `((upstream-name . "AER")))
+    (build-system r-build-system)
+    (propagated-inputs
+     (list r-car
+           r-formula
+           r-lmtest
+           r-sandwich
+           r-survival
+           r-zoo))
+    (home-page "https://cran.r-project.org/package=AER")
+    (synopsis "Applied econometrics with R")
+    (description
+     "This package provides functions, data sets, examples, demos, and
+vignettes for the book Christian Kleiber and Achim Zeileis (2008), Applied
+Econometrics with R, Springer-Verlag, New York.  ISBN 978-0-387-77316-2. (See
+the vignette \"AER\" for a package overview.)")
+    ;; Either version of the GPL
+    (license (list license:gpl2 license:gpl3))))
+
 (define-public r-afpt
   (package
     (name "r-afpt")
@@ -392,6 +422,28 @@ Gaussian quadrature for a numerical solution.")
 Distance (EMD).")
     (license license:expat)))
 
+(define-public r-glmpca
+  (package
+    (name "r-glmpca")
+    (version "0.2.0")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "glmpca" version))
+              (sha256
+               (base32
+                "02xjf0gg52925hw9nw2j0znfmzfzfwbv0fxjl9d2fy9j63drr2h4"))))
+    (properties `((upstream-name . "glmpca")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-mass))
+    (native-inputs (list r-knitr))
+    (home-page "https://github.com/willtownes/glmpca")
+    (synopsis "Dimension Reduction of Non-Normally Distributed Data")
+    (description
+     "This package implements a generalized version of principal components
+analysis (GLM-PCA) for dimension reduction of non-normally distributed data
+such as counts or binary matrices.")
+    (license license:lgpl3+)))
+
 (define-public r-googledrive
   (package
     (name "r-googledrive")
@@ -748,6 +800,42 @@ similar rank-based tests for equal probability distributions due to Neuhauser
 WebAssembly engine.")
     (license license:expat)))
 
+(define-public r-rvenn
+  (package
+    (name "r-rvenn")
+    (version "1.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "RVenn" version))
+       (sha256
+        (base32
+         "016m00xv59lkwm2is32v5nr4lw5a1ymdnz34r3ffflcv9bfrc6n4"))))
+    (properties `((upstream-name . "RVenn")))
+    (build-system r-build-system)
+    (propagated-inputs
+     (list r-ggforce
+           r-ggplot2
+           r-magrittr
+           r-pheatmap
+           r-purrr
+           r-rlang
+           r-vegan))
+    (native-inputs (list r-knitr))
+    (home-page "https://cran.r-project.org/package=RVenn")
+    (synopsis "Set operations for many sets")
+    (description
+     "The base functions for set operations in @code{R} can be used for only two
+sets.  This package @code{RVenn} provides functions for dealing with multiple sets.
+It uses @code{purr} to find the union, intersection and difference of three or
+more sets.  This package also provides functions for pairwise set operations among
+several sets.  Further, based on @code{ggplot2} and @code{ggforce}, a Venn diagram
+can be drawn for two or three sets.  For bigger data sets, a clustered heatmap
+showing the presence or absence of the elements of the sets can be drawn based on
+the @code{pheatmap} package.  Finally, enrichment test can be applied to two sets
+whether an overlap is statistically significant or not.")
+    (license license:gpl3)))
+
 (define-public r-dot
   (package
     (name "r-dot")
@@ -1060,6 +1148,65 @@ the reasonable size limit without losing vector properties of the
 scale-sensitive information.")
     (license license:expat)))
 
+(define-public r-ggvenn
+  (package
+    (name "r-ggvenn")
+    (version "0.1.9")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "ggvenn" version))
+              (sha256
+               (base32
+                "0bm52j3idchignp6nrw7c76jlbfkjf5zng258957vq019vx9qxrq"))))
+    (properties `((upstream-name . "ggvenn")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-dplyr r-ggplot2))
+    (home-page "https://cran.r-project.org/package=ggvenn")
+    (synopsis "Draw Venn diagram with ggplot2")
+    (description
+     "This package offers an easy to use way to draw a Venn diagram with
+@code{ggplot2}.")
+    (license license:expat)))
+
+(define-public r-ggvenndiagram
+  (package
+    (name "r-ggvenndiagram")
+    (version "1.2.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "ggVennDiagram" version))
+       (sha256
+        (base32
+         "1mjs488npnxd53nsw936iw2vzv7z38h8d02pm4lwrz4i83jg3www"))))
+    (properties `((upstream-name . "ggVennDiagram")))
+    (build-system r-build-system)
+    (propagated-inputs
+     (list r-dplyr
+           r-ggplot2
+           r-magrittr
+           r-plotly
+           r-purrr
+           r-rvenn
+           r-sf
+           r-stringr
+           r-tibble))
+    (native-inputs (list r-knitr))
+    (home-page "https://github.com/gaospecial/ggVennDiagram")
+    (synopsis "Implementention of the Venn diagram using ggplot2")
+    (description
+     "This package implements easy-to-use functions to generate 2-7 sets Venn
+plot in publication quality.  @code{ggVennDiagram} plot Venn using
+well-defined geometry dataset and @code{ggplot2}.  The shapes of 2-4 sets Venn
+use circles and ellipses, while the shapes of 4-7 sets Venn use irregular
+polygons (4 has both forms), which are developed and imported from another
+package @code{venn}.  We provide internal functions to integrate shape data
+with user provided sets data, and calculated the geometry of every
+regions/intersections of them, then separately plot Venn in three components:
+set edges, set labels, and regions.  From version 1.0, it is possible to
+customize these components as you demand in ordinary @code{ggplot2} grammar.")
+    (license license:gpl3)))
+
 (define-public r-lmds
   (package
     (name "r-lmds")
@@ -1482,6 +1629,28 @@ qualitative palettes with many (20-30 or more) colors.  See Coombes and
 colleagues (2019) @url{https://doi:10.18637/jss.v090.c01}.")
     (license license:asl2.0)))
 
+(define-public r-polylabelr
+  (package
+    (name "r-polylabelr")
+    (version "0.2.0")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "polylabelr" version))
+              (sha256
+               (base32
+                "01b2v0l5g8nxwbd6nwqv8ahypgh6gfhd4qabg75brlj7z1iyfzf2"))))
+    (properties `((upstream-name . "polylabelr")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-rcpp))
+    (home-page "https://github.com/jolars/polylabelr")
+    (synopsis "Finding pole of inaccessibility (visual center) of a polygon")
+    (description
+     "This package provides a wrapper around the @code{C++} library @code{
+polylabel} from @code{Mapbox}, providing an efficient routine for finding the
+approximate pole of inaccessibility of a polygon, which usually serves as an
+excellent candidate for labeling of a polygon.")
+    (license license:expat)))
+
 (define-public r-poorman
   (package
     (name "r-poorman")
@@ -3512,6 +3681,24 @@ coordinates.")
 @end enumerate\n")
     (license license:gpl2+)))
 
+(define-public r-gensa
+  (package
+    (name "r-gensa")
+    (version "1.1.7")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "GenSA" version))
+              (sha256
+               (base32
+                "03xqwxm7v7rnihx730a4p65dfwhjh4345r3d78y0qxxplk8d76cx"))))
+    (properties `((upstream-name . "GenSA")))
+    (build-system r-build-system)
+    (home-page "https://cran.r-project.org/package=GenSA")
+    (synopsis "Generalized simulated annealing")
+    (description "This package performs search for the global minimum of a very
+complex non-linear objective function with a very large number of optima.")
+    (license license:gpl2)))
+
 (define-public r-geosphere
   (package
     (name "r-geosphere")
@@ -6393,6 +6580,27 @@ Information-Maximization (Infomax), and @dfn{Joint Approximate Diagonalization
 of Eigenmatrices} (JADE).")
     (license license:gpl2+)))
 
+(define-public r-ips
+  (package
+    (name "r-ips")
+    (version "0.0.11")
+    (source (origin
+              (method url-fetch)
+              (uri (cran-uri "ips" version))
+              (sha256
+               (base32
+                "02jxanfhsjrabj33nwjv71vdc87hiyzikyqrfdj9ix6dky6lm199"))))
+    (properties `((upstream-name . "ips")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-ape r-phangorn r-plyr r-seqinr r-xml))
+    (home-page "https://cran.r-project.org/package=ips")
+    (synopsis "Interfaces to phylogenetic software in R")
+    (description
+     "This package provides functions that wrap popular phylogenetic software
+for sequence alignment, masking of sequence alignments, and estimation of
+phylogenies and ancestral character states.")
+    (license license:gpl3)))
+
 (define-public r-dtw
   (package
     (name "r-dtw")
@@ -9216,6 +9424,14 @@ always locate the files relative to your project root.")
         (base32
          "0b1szzsqyc8wcfpkn5517bb1ds064vs2hky71my3p74kfngay991"))))
     (build-system r-build-system)
+    (arguments
+     (list
+      #:phases
+      '(modify-phases %standard-phases
+         (add-after 'unpack 'build-reproducibly
+           (lambda _
+             (setenv "PYTHONHASHSEED" "0")
+             (setenv "PYTHONDONTWRITEBYTECODE" "1"))))))
     (inputs (list python))
     (propagated-inputs
      (list r-here
@@ -13657,9 +13873,20 @@ package provides a minimal R interface by relying on the Rcpp package.")
        (uri (cran-uri "RcppParallel" version))
        (sha256
         (base32
-         "1sn211ajlb1p12sglxqns175rg078yvww268m8cp0vvd7cmk55k3"))))
+         "1sn211ajlb1p12sglxqns175rg078yvww268m8cp0vvd7cmk55k3"))
+       (modules '((guix build utils)))
+       (snippet
+        '(delete-file-recursively "src/tbb/"))))
     (properties `((upstream-name . "RcppParallel")))
     (build-system r-build-system)
+    (arguments
+     (list
+      #:phases
+      '(modify-phases %standard-phases
+         (add-after 'unpack 'use-system-tbb
+           (lambda* (#:key inputs #:allow-other-keys)
+             (setenv "TBB_ROOT" (assoc-ref inputs "tbb")))))))
+    (inputs (list tbb-2020))
     (home-page "https://rcppcore.github.io/RcppParallel/")
     (synopsis "Parallel programming tools for Rcpp")
     (description
@@ -19040,6 +19267,15 @@ packages with Rcpp.")
         (base32
          "17znizh4yabh2zs9mzyr0sl6p0pw49961i61br7cl1b7v9sza18q"))))
     (build-system r-build-system)
+    (arguments
+     (list
+      #:phases
+      '(modify-phases %standard-phases
+         (add-after 'unpack 'build-reproducibly
+           (lambda _
+             (substitute* "R/aaa.R"
+               (("BASEDATETIME <- Sys.time.*")
+                "BASEDATETIME <- structure(0, class = c(\"POSIXct\", \"POSIXt\"))\n")))))))
     (propagated-inputs
      (list r-farver r-magrittr r-rcpp r-rlang))
     (home-page "https://github.com/thomasp85/tweenr")
diff --git a/gnu/packages/crates-io.scm b/gnu/packages/crates-io.scm
index db820a3d24..34514ea0c7 100644
--- a/gnu/packages/crates-io.scm
+++ b/gnu/packages/crates-io.scm
@@ -10307,7 +10307,7 @@ box''.")
 (define-public rust-cc-1
   (package
     (name "rust-cc")
-    (version "1.0.67")
+    (version "1.0.73")
     (source
      (origin
        (method url-fetch)
@@ -10315,7 +10315,7 @@ box''.")
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "1z9p27ys80shv09zhknmlal8jjra78agdwg97i6jjd6lg83rpip3"))))
+         "04ccylrjq94jssh8f7d7hxv64gs9f1m1jrsxb7wqgfxk4xljmzrg"))))
     (build-system cargo-build-system)
     (arguments
      `(#:tests? #f
@@ -25025,14 +25025,14 @@ authenticated encryption cipher.")
 (define-public rust-ghost-0.1
   (package
     (name "rust-ghost")
-    (version "0.1.2")
+    (version "0.1.6")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "ghost" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "0yalg3g1g3cz63n3phy7cdhh7p2qd220mrpxy96alwxbpqdwynqs"))))
+        (base32 "0fj42hmlgcj1rbqcshlvk65npsks4ba7vdzphb9202gawf6zw6gb"))))
     (build-system cargo-build-system)
     (arguments
      `(#:skip-build? #t
@@ -28897,14 +28897,14 @@ Rust.")
 (define-public rust-indoc-1
   (package
     (name "rust-indoc")
-    (version "1.0.3")
+    (version "1.0.7")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "indoc" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "0diih20xsxjb159nr0dq6jxnyhq7gg10dlsnh2siikphmvm5m9z5"))))
+        (base32 "1qs42cn8rj7kdpmp1dlkzhv62rfmbx3ffwvsfw67zyq86jm1xaxd"))))
     (build-system cargo-build-system)
     (arguments
      `(#:skip-build? #true
@@ -29479,8 +29479,37 @@ primitive Rust types.")
 immutable interval tree.")
     (license license:expat)))
 
+(define-public rust-inventory-0.2
+  (package
+    (name "rust-inventory")
+    (version "0.2.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "inventory" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "06h9xw67wx18rank4yyz93iq89j0fk6fbazryfvf5ach1dp4qd44"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-ctor" ,rust-ctor-0.1)
+        ("rust-ghost" ,rust-ghost-0.1))
+       #:cargo-development-inputs
+       (("rust-rustversion" ,rust-rustversion-1)
+        ("rust-trybuild" ,rust-trybuild-1))))
+    (home-page "https://github.com/dtolnay/inventory")
+    (synopsis "Typed distributed plugin registration")
+    (description
+     "This package provides a way to set up a plugin registry into which
+plugins can be registered from any source file linked into your program.
+There does not need to be a central list of all the plugins.")
+    ;; Either license can be chosen at the users option.
+    (license (list license:expat license:asl2.0))))
+
 (define-public rust-inventory-0.1
   (package
+    (inherit rust-inventory-0.2)
     (name "rust-inventory")
     (version "0.1.11")
     (source
@@ -29490,21 +29519,12 @@ immutable interval tree.")
         (file-name (string-append name "-" version ".tar.gz"))
         (sha256
           (base32 "1m1zdjgs3nzfdxf86mc1i0id56fvk8rfw63rf04yi88bqrh53szh"))))
-    (build-system cargo-build-system)
     (arguments
       `(#:skip-build? #t
         #:cargo-inputs
         (("rust-ctor" ,rust-ctor-0.1)
          ("rust-ghost" ,rust-ghost-0.1)
-         ("rust-inventory-impl" ,rust-inventory-impl-0.1))))
-    (home-page "https://github.com/dtolnay/inventory")
-    (synopsis "Typed distributed plugin registration")
-    (description
-     "This package provides a way to set up a plugin registry into which
-plugins can be registered from any source file linked into your program.
-There does not need to be a central list of all the plugins.")
-    ;; Either license can be chosen at the users option.
-    (license (list license:expat license:asl2.0))))
+         ("rust-inventory-impl" ,rust-inventory-impl-0.1))))))
 
 (define-public rust-inventory-impl-0.1
   (package
@@ -40387,17 +40407,17 @@ platform-native strings.")
          "11agh8n3x2l4sr3sxvx6byc1j3ryb1g6flb1ywn0qhq7xv1y3cmg"))))
     (arguments `(#:skip-build? #t))))
 
-(define-public rust-ouroboros-macro-0.14
+(define-public rust-ouroboros-macro-0.15
   (package
     (name "rust-ouroboros-macro")
-    (version "0.14.0")
+    (version "0.15.2")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "ouroboros_macro" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "11cav04x82liknlrv50lpl1i1ln2jw4isdqzdjnjsg0pcpvwik9r"))))
+        (base32 "01lgyj5nxgr6r1l0m20pp4ilz3m14clsqg2j28hic2rrlsjafjkk"))))
     (build-system cargo-build-system)
     (arguments
      `(#:skip-build? #t
@@ -40413,22 +40433,35 @@ platform-native strings.")
      "This package provides a proc macro for the @code{ouroboros} crate.")
     (license (list license:expat license:asl2.0))))
 
-(define-public rust-ouroboros-0.14
+(define-public rust-ouroboros-macro-0.14
   (package
-    (name "rust-ouroboros")
+    (inherit rust-ouroboros-macro-0.15)
+    (name "rust-ouroboros-macro")
     (version "0.14.0")
     (source
      (origin
        (method url-fetch)
+       (uri (crate-uri "ouroboros_macro" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "11cav04x82liknlrv50lpl1i1ln2jw4isdqzdjnjsg0pcpvwik9r"))))))
+
+(define-public rust-ouroboros-0.15
+  (package
+    (name "rust-ouroboros")
+    (version "0.15.2")
+    (source
+     (origin
+       (method url-fetch)
        (uri (crate-uri "ouroboros" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "1ih1lna1d2is3a6aicmc7lpfhqmg046kssxpryk24kwg8j42ymh6"))))
+        (base32 "1qhd9cvc4hwdbr37da1jh0k0742slchixlxn4wxgc7g3l63yl9bl"))))
     (build-system cargo-build-system)
     (arguments
      `(#:cargo-inputs
        (("rust-aliasable" ,rust-aliasable-0.1)
-        ("rust-ouroboros-macro" ,rust-ouroboros-macro-0.14)
+        ("rust-ouroboros-macro" ,rust-ouroboros-macro-0.15)
         ("rust-stable-deref-trait" ,rust-stable-deref-trait-1))))
     (home-page "https://github.com/joshua-maros/ouroboros")
     (synopsis "Self-referential struct generation")
@@ -40436,6 +40469,24 @@ platform-native strings.")
      "Easy, safe self-referential struct generation for Rust.")
     (license (list license:expat license:asl2.0))))
 
+(define-public rust-ouroboros-0.14
+  (package
+    (inherit rust-ouroboros-0.15)
+    (name "rust-ouroboros")
+    (version "0.14.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "ouroboros" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1ih1lna1d2is3a6aicmc7lpfhqmg046kssxpryk24kwg8j42ymh6"))))
+    (arguments
+     `(#:cargo-inputs
+       (("rust-aliasable" ,rust-aliasable-0.1)
+        ("rust-ouroboros-macro" ,rust-ouroboros-macro-0.14)
+        ("rust-stable-deref-trait" ,rust-stable-deref-trait-1))))))
+
 (define-public rust-output-vt100-0.1
   (package
     (name "rust-output-vt100")
@@ -46269,8 +46320,34 @@ they were parsed from")
 @code{LC_COLLATE} and @code{LC_CTYPE} are not yet supported.")
     (license license:expat)))
 
+(define-public rust-pyo3-build-config-0.16
+  (package
+    (name "rust-pyo3-build-config")
+    (version "0.16.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "pyo3-build-config" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1j2jj5qnnpagi3gvkwjpydcxfsd5qv3vmpghnaqs7n1mdia5pdmm"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-once-cell" ,rust-once-cell-1)
+        ("rust-python3-dll-a" ,rust-python3-dll-a-0.2)
+        ("rust-target-lexicon" ,rust-target-lexicon-0.12))))
+    (native-inputs (list python))       ;for tests
+    (home-page "https://github.com/pyo3/pyo3")
+    (synopsis "Build configuration for PyO3")
+    (description
+     "This package contains build configuration helpers for the PyO3
+ecosystem.")
+    (license license:asl2.0)))
+
 (define-public rust-pyo3-build-config-0.15
   (package
+    (inherit rust-pyo3-build-config-0.16)
     (name "rust-pyo3-build-config")
     (version "0.15.1")
     (source
@@ -46280,20 +46357,63 @@ they were parsed from")
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32 "0aw5zfqwzj5rzfxjyqvrqfam138d1009jh6kia4xrgdz538y9yfv"))))
-    (build-system cargo-build-system)
     (arguments
      `(#:skip-build? #t
        #:cargo-inputs
        (("rust-once-cell" ,rust-once-cell-1))))
+    (native-inputs '())))
+
+(define-public rust-pyo3-ffi-0.16
+  (package
+    (name "rust-pyo3-ffi")
+    (version "0.16.5")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "pyo3-ffi" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "0avls4q393nmzhb124zg6kp5lj6xzy2f6qx564qa7b614xqs0xf2"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:skip-build? #t
+       #:cargo-inputs
+       (("rust-libc" ,rust-libc-0.2)
+        ("rust-pyo3-build-config" ,rust-pyo3-build-config-0.16))))
     (home-page "https://github.com/pyo3/pyo3")
-    (synopsis "Build configuration for PyO3")
+    (synopsis "Python API bindings for the PyO3 ecosystem")
     (description
-     "This package contains build configuration helpers for the PyO3
-ecosystem.")
+     "This crate provides Rust FFI declarations for Python 3.")
+    (license license:asl2.0)))
+
+(define-public rust-pyo3-macros-backend-0.16
+  (package
+    (name "rust-pyo3-macros-backend")
+    (version "0.16.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "pyo3-macros-backend" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1bvzvdx2a6hhliny12n2vy7v7gbsgzanxjckjr1cbxbkizss1gak"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:skip-build? #t
+       #:cargo-inputs
+       (("rust-proc-macro2" ,rust-proc-macro2-1)
+        ("rust-pyo3-build-config" ,rust-pyo3-build-config-0.16)
+        ("rust-quote" ,rust-quote-1)
+        ("rust-syn" ,rust-syn-1))))
+    (home-page "https://github.com/pyo3/pyo3")
+    (synopsis "Code generation for PyO3")
+    (description
+     "This package provides code generation backends for PyO3.")
     (license license:asl2.0)))
 
 (define-public rust-pyo3-macros-backend-0.15
   (package
+    (inherit rust-pyo3-macros-backend-0.16)
     (name "rust-pyo3-macros-backend")
     (version "0.15.1")
     (source
@@ -46310,15 +46430,35 @@ ecosystem.")
        (("rust-proc-macro2" ,rust-proc-macro2-1)
         ("rust-pyo3-build-config" ,rust-pyo3-build-config-0.15)
         ("rust-quote" ,rust-quote-1)
-        ("rust-syn" ,rust-syn-1))))
+        ("rust-syn" ,rust-syn-1))))))
+
+(define-public rust-pyo3-macros-0.16
+  (package
+    (name "rust-pyo3-macros")
+    (version "0.16.5")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (crate-uri "pyo3-macros" version))
+        (file-name (string-append name "-" version ".tar.gz"))
+        (sha256
+          (base32 "1xwh7sl4n73746q80n5m5afd261zg0kxcqfnlr89ik7vbd4c8kr8"))))
+    (build-system cargo-build-system)
+    (arguments
+      `(#:skip-build? #t
+        #:cargo-inputs
+        (("rust-pyo3-macros-backend" ,rust-pyo3-macros-backend-0.16)
+         ("rust-quote" ,rust-quote-1)
+         ("rust-syn" ,rust-syn-1))))
     (home-page "https://github.com/pyo3/pyo3")
-    (synopsis "Code generation for PyO3")
+    (synopsis "Proc macros for PyO3")
     (description
-     "This package provides code generation backends for PyO3.")
+     "This package provides compiler macros for use with PyO3.")
     (license license:asl2.0)))
 
 (define-public rust-pyo3-macros-0.15
   (package
+    (inherit rust-pyo3-macros-0.16)
     (name "rust-pyo3-macros")
     (version "0.15.1")
     (source
@@ -46334,15 +46474,64 @@ ecosystem.")
         #:cargo-inputs
         (("rust-pyo3-macros-backend" ,rust-pyo3-macros-backend-0.15)
          ("rust-quote" ,rust-quote-1)
-         ("rust-syn" ,rust-syn-1))))
+         ("rust-syn" ,rust-syn-1))))))
+
+(define-public rust-pyo3-0.16
+  (package
+    (name "rust-pyo3")
+    (version "0.16.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "pyo3" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1p5kjsj3jdw2gnahdjrzljmi93w3nxdp11qq8x3i80b0a3l04qqy"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:cargo-inputs
+       (("rust-anyhow" ,rust-anyhow-1)
+        ("rust-cfg-if" ,rust-cfg-if-1)
+        ("rust-eyre" ,rust-eyre-0.6)
+        ("rust-hashbrown" ,rust-hashbrown-0.11)
+        ("rust-indexmap" ,rust-indexmap-1)
+        ("rust-indoc" ,rust-indoc-1)
+        ("rust-inventory" ,rust-inventory-0.2)
+        ("rust-libc" ,rust-libc-0.2)
+        ("rust-num-bigint" ,rust-num-bigint-0.4)
+        ("rust-num-complex" ,rust-num-complex-0.4)
+        ("rust-parking-lot" ,rust-parking-lot-0.11)
+        ("rust-paste" ,rust-paste-0.1)
+        ("rust-pyo3-build-config" ,rust-pyo3-build-config-0.16)
+        ("rust-pyo3-ffi" ,rust-pyo3-ffi-0.16)
+        ("rust-pyo3-macros" ,rust-pyo3-macros-0.16)
+        ("rust-serde" ,rust-serde-1)
+        ("rust-unindent" ,rust-unindent-0.1))
+       #:cargo-development-inputs
+       (("rust-assert-approx-eq" ,rust-assert-approx-eq-1)
+        ("rust-bitflags" ,rust-bitflags-1.2)
+        ("rust-criterion" ,rust-criterion-0.3)
+        ("rust-half" ,rust-half-1)
+        ("rust-proptest" ,rust-proptest-0.10)
+        ("rust-rustversion" ,rust-rustversion-1)
+        ("rust-send-wrapper" ,rust-send-wrapper-0.5)
+        ("rust-serde-json" ,rust-serde-json-1)
+        ("rust-trybuild" ,rust-trybuild-1)
+        ("rust-widestring" ,rust-widestring-0.5))
+       ;; FIXME: fails to initialize Python interpreter.
+       #:tests? #f))
+    (inputs (list python))
     (home-page "https://github.com/pyo3/pyo3")
-    (synopsis "Proc macros for PyO3")
+    (synopsis "Rust bindings for the Python interpreter")
     (description
-     "This package provides compiler macros for use with PyO3.")
+     "This package provides Rust bindings for Python, including tools for
+creating native Python extension modules.  Running and interacting with
+Python code from a Rust binary is also supported.")
     (license license:asl2.0)))
 
 (define-public rust-pyo3-0.15
   (package
+    (inherit rust-pyo3-0.16)
     (name "rust-pyo3")
     (version "0.15.1")
     (source
@@ -46388,15 +46577,29 @@ ecosystem.")
         ("rust-serde-json" ,rust-serde-json-1)
         ("rust-trybuild" ,rust-trybuild-1))
        ;; FIXME: fails to initialize Python interpreter.
-       #:tests? #f))
-    (inputs (list python))
-    (home-page "https://github.com/pyo3/pyo3")
-    (synopsis "Rust bindings for the Python interpreter")
+       #:tests? #f))))
+
+(define-public rust-python3-dll-a-0.2
+  (package
+    (name "rust-python3-dll-a")
+    (version "0.2.5")
+    (source (origin
+              (method url-fetch)
+              (uri (crate-uri "python3-dll-a" version))
+              (file-name (string-append name "-" version ".tar.gz"))
+              (sha256
+               (base32
+                "01k2nf4wq4f4xnaq3fy1gx12v10pndwmdrjq4x4pshhjxxnrpml9"))))
+    (build-system cargo-build-system)
+    (arguments
+     `(#:tests? #f                      ;Windows-like targets only
+       #:cargo-inputs (("rust-cc" ,rust-cc-1))))
+    (home-page "https://github.com/pyo3/python3-dll-a")
+    (synopsis "Python import library generator")
     (description
-     "This package provides Rust bindings for Python, including tools for
-creating native Python extension modules.  Running and interacting with
-Python code from a Rust binary is also supported.")
-    (license license:asl2.0)))
+     "This crate generates import libraries for the Python shared library
+for MinGW-w64 and MSVC (cross-)compile targets.")
+    (license license:expat)))
 
 (define-public rust-qstring-0.7
   (package
@@ -54504,17 +54707,17 @@ Semantic Versioning.")
          (base32
           "18vhypw6zgccnrlm5ps1pwa0khz7ry927iznpr88b87cagr1v2iq"))))))
 
-(define-public rust-send-wrapper-0.4
+(define-public rust-send-wrapper-0.5
   (package
     (name "rust-send-wrapper")
-    (version "0.4.0")
+    (version "0.5.0")
     (source
      (origin
        (method url-fetch)
        (uri (crate-uri "send_wrapper" version))
        (file-name (string-append name "-" version ".tar.gz"))
        (sha256
-        (base32 "1l7s28vfnwdbjyrrk3lx81jy4f0dcrv4iwyah2wj6vndxhqxaf7n"))))
+        (base32 "1mwbg1nv36d5kdjb0iwmprz24km0m8ck08dn59gdngqdc77hl34k"))))
     (build-system cargo-build-system)
     (arguments `(#:skip-build? #t))
     (home-page "https://github.com/thk1/send_wrapper")
@@ -54527,6 +54730,20 @@ also have to make sure that the wrapper is dropped from within the original
 thread.  If any of these constraints is violated, a panic occurs.")
     (license (list license:expat license:asl2.0))))
 
+(define-public rust-send-wrapper-0.4
+  (package
+    (inherit rust-send-wrapper-0.5)
+    (name "rust-send-wrapper")
+    (version "0.4.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (crate-uri "send_wrapper" version))
+       (file-name (string-append name "-" version ".tar.gz"))
+       (sha256
+        (base32 "1l7s28vfnwdbjyrrk3lx81jy4f0dcrv4iwyah2wj6vndxhqxaf7n"))))
+    (arguments `(#:skip-build? #t))))
+
 (define-public rust-seq-io-0.3
   (package
     (name "rust-seq-io")
@@ -71599,10 +71816,10 @@ terms of allowing LLVM's auto-vectorizer to do its job.")
        (("rust-bytemuck" ,rust-bytemuck-1))))
     (license (list license:zlib))))
 
-(define-public rust-widestring-0.4
+(define-public rust-widestring-0.5
   (package
     (name "rust-widestring")
-    (version "0.4.2")
+    (version "0.5.1")
     (source
       (origin
         (method url-fetch)
@@ -71610,7 +71827,7 @@ terms of allowing LLVM's auto-vectorizer to do its job.")
         (file-name (string-append name "-" version ".tar.gz"))
         (sha256
          (base32
-          "13565qy4jhpg4x0xw8mwxzzsh0p8c93p5208lh6kpwp0q01y6qx7"))))
+          "10qrilijh1qzw362mvd4nsz3vv32dxx530vk41hkcx8hah22z20p"))))
     (build-system cargo-build-system)
     (arguments
      `(#:cargo-development-inputs
@@ -71624,6 +71841,23 @@ UTF-32 types are provided, including support for malformed encoding.")
     (license (list license:asl2.0
                    license:expat))))
 
+(define-public rust-widestring-0.4
+  (package
+    (inherit rust-widestring-0.5)
+    (name "rust-widestring")
+    (version "0.4.2")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (crate-uri "widestring" version))
+        (file-name (string-append name "-" version ".tar.gz"))
+        (sha256
+         (base32
+          "13565qy4jhpg4x0xw8mwxzzsh0p8c93p5208lh6kpwp0q01y6qx7"))))
+    (arguments
+     `(#:cargo-development-inputs
+       (("rust-winapi" ,rust-winapi-0.3))))))
+
 (define-public rust-wild-2
   (package
     (name "rust-wild")
diff --git a/gnu/packages/cups.scm b/gnu/packages/cups.scm
index bd5e06a9a5..4c8b9cd4d2 100644
--- a/gnu/packages/cups.scm
+++ b/gnu/packages/cups.scm
@@ -51,6 +51,7 @@
   #:use-module (gnu packages tls)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system meson)
   #:use-module (guix build-system python)
   #:use-module (guix download)
   #:use-module (guix gexp)
@@ -457,17 +458,33 @@ applications''.  These must be installed separately.")
 (define-public cups-pk-helper
   (package
     (name "cups-pk-helper")
-    (version "0.2.6")
+    (version "0.2.7")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://freedesktop.org/software/"
                                   name "/releases/" name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0a52jw6rm7lr5nbyksiia0rn7sasyb5cjqcb95z1wxm2yprgi6lm"))))
-    (build-system gnu-build-system)
+                "0cg8wbxpkz9bkpasz973cdazi02svqpbw9mafvpgrscg8kdhs1v6"))))
+    (build-system meson-build-system)
+    (arguments
+     ;; XXX The tests require a running D-Bus and CUPS daemon, of course.
+     (list #:tests? #f
+           #:phases
+           #~(modify-phases %standard-phases
+               (add-after 'install 'install-compatibility-symlink
+                 ;; XXX Upstream (and, presumably, the world) has moved to
+                 ;; /share/dbus-1 over /etc/dbus-1, but Guix System's
+                 ;; dbus-configuration-directory has yet to catch up.
+                 ;; TODO It should be properly fixed and this phase removed.
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (with-directory-excursion (assoc-ref outputs "out")
+                     (mkdir-p "etc")
+                     (symlink "../share/dbus-1" "etc/dbus-1")))))))
     (native-inputs
-     (list intltool pkg-config glib polkit cups))
+     (list intltool pkg-config `(,glib "bin")))
+    (inputs
+     (list glib polkit cups-minimal))
     (home-page "https://www.freedesktop.org/wiki/Software/cups-pk-helper/")
     (synopsis "PolicyKit helper to configure CUPS with fine-grained privileges")
     (description
@@ -846,7 +863,7 @@ HP@tie{}LaserJet, and possibly other printers.  See @file{README} for details.")
 (define-public epson-inkjet-printer-escpr
   (package
     (name "epson-inkjet-printer-escpr")
-    (version "1.7.18")
+    (version "1.7.21")
     ;; XXX: This currently works.  But it will break as soon as a newer
     ;; version is available since the URLs for older versions are not
     ;; preserved.  An alternative source will be added as soon as
@@ -854,11 +871,11 @@ HP@tie{}LaserJet, and possibly other printers.  See @file{README} for details.")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://download3.ebz.epson.net/dsc/f/03/00/13/43/"
-                           "81/cbdd80826424935cef20d16be8ee5851388977a7/"
-                           "epson-inkjet-printer-escpr-1.7.18-1lsb3.2.tar.gz"))
+       (uri (string-append "https://download3.ebz.epson.net/dsc/f/03/00/13/77/"
+                           "93/e85dc2dc266e96fdc242bd95758bd88d1a51963e/"
+                           "epson-inkjet-printer-escpr-1.7.21-1lsb3.2.tar.gz"))
        (sha256
-        (base32 "06pa47rl1gy19bg3fsp4a4y9vdy4ya2maajm14n791ivhf2hcwyh"))))
+        (base32 "0z1x9p58321plf2swfxgl72wn7ls8bfbyjwd9l9c8jxfr1v2skkz"))))
     (build-system gnu-build-system)
     (arguments
      (list #:modules
diff --git a/gnu/packages/databases.scm b/gnu/packages/databases.scm
index ad425cb617..7002aedd05 100644
--- a/gnu/packages/databases.scm
+++ b/gnu/packages/databases.scm
@@ -481,14 +481,14 @@ mapping from string keys to string values.")
 (define-public memcached
   (package
     (name "memcached")
-    (version "1.6.15")
+    (version "1.6.16")
     (source
      (origin
        (method url-fetch)
        (uri (string-append
              "https://memcached.org/files/memcached-" version ".tar.gz"))
        (sha256
-        (base32 "05fmds73hr71bha9gszjfp02lgyacqfyyhkgl6xysy4kchyvwyld"))))
+        (base32 "1nilmfhy8hc7zzlihnx3hmiqf7siyrpgz2g5s3r3l36xy4xsjl9h"))))
     (build-system gnu-build-system)
     (inputs
      (list libevent cyrus-sasl))
@@ -699,6 +699,38 @@ auto-completion and syntax highlighting.")
 \"special\", or \"backslash commands\") on PostgreSQL.")
     (license license:bsd-3)))
 
+(define-public python-sqlitedict
+  (package
+    (name "python-sqlitedict")
+    (version "2.0.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "sqlitedict" version))
+              (sha256
+               (base32
+                "05sxy016k3p5sjjhdg0ad9z15i6vm3rq4cr9m8nrc7jfdx0p18r3"))))
+    (build-system python-build-system)
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (replace 'check
+            (lambda* (#:key tests? #:allow-other-keys)
+              (when tests?
+                (invoke "pytest" "-vv"
+                        "-k"
+                        ;; No idea why these fail.
+                        (string-append "not test_py24_error"
+                                       " and not test_tablenames"))))))))
+    (native-inputs (list python-pytest))
+    (home-page "https://github.com/piskvorky/sqlitedict")
+    (synopsis "Persistent dict backed up by sqlite3 and pickle")
+    (description
+     "This package provides a lightweight wrapper around the sqlite3 database
+with a simple, Pythonic @code{dict}-like interface and support for
+multi-thread access.")
+    (license license:asl2.0)))
+
 (define-public pgcli
   (package
     (name "pgcli")
@@ -1489,8 +1521,6 @@ CSV, DB3, iXF, SQLite, MS-SQL or MySQL to PostgreSQL.")
        (sha256
         (base32 "1ry8lxgdc1p3k7gbw20r405jqi5lvhi5wk83kxdbiv8xv3f5kh6q"))))
     (build-system python-build-system)
-    (native-inputs
-     (list python-unittest2))
     (inputs
      (list python-cryptography))
     (arguments
@@ -3510,44 +3540,37 @@ PickleShare.")
 (define-public python-apsw
   (package
     (name "python-apsw")
-    (version "3.36.0-r1")
+    (version "3.39.2.0")
     (source
-      (origin
-        (method url-fetch)
-        (uri (string-append "https://github.com/rogerbinns/apsw/releases"
-                            "/download/" version "/apsw-" version ".zip"))
-        (sha256
-          (base32
-           "0w8q73147hv77dlpqrx6h1gx03acc8xqhvdpfp6vkffdm0wmqd8p"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/rogerbinns/apsw")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0q7fnk8n3m5mpjzh6xyhj409k8sacdbjsfis98my9c50fdn5sr7y"))))
     (build-system python-build-system)
-    (native-inputs
-     (list unzip))
-    (inputs
-     (list sqlite))
+    (inputs (list sqlite))
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (replace 'build
-           (lambda _
-             (invoke "python" "setup.py" "build" "--enable-all-extensions"
-                     "--enable=load_extension")
-             #t))
-         (add-after 'build 'build-test-helper
-           (lambda _
-             (invoke "gcc" "-fPIC" "-shared" "-o" "./testextension.sqlext"
-                     "-I." "-Isqlite3" "src/testextension.c")
-             #t))
-         (replace 'check
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (add-installed-pythonpath inputs outputs)
-             (invoke "python" "setup.py" "test")
-             #t)))))
+     (list #:phases
+           #~(modify-phases %standard-phases
+               (replace 'build
+                 (lambda _
+                   (invoke "python" "setup.py" "build" "--enable-all-extensions"
+                           "--enable=load_extension")))
+               (add-after 'build 'build-test-helper
+                 (lambda _
+                   (invoke "gcc" "-fPIC" "-shared" "-o" "./testextension.sqlext"
+                           "-I." "-Isqlite3" "src/testextension.c"))))))
     (home-page "https://github.com/rogerbinns/apsw/")
     (synopsis "Another Python SQLite Wrapper")
-    (description "APSW is a Python wrapper for the SQLite
-embedded relational database engine.  In contrast to other wrappers such as
-pysqlite it focuses on being a minimal layer over SQLite attempting just to
-translate the complete SQLite API into Python.")
+    (description
+     "APSW is a Python wrapper for the SQLite embedded relational database
+engine.  In contrast to other wrappers such as pysqlite it focuses on being a
+minimal layer over SQLite attempting just to translate the complete SQLite API
+into Python.")
     (license license:zlib)))
 
 (define-public python-aiosqlite
@@ -3931,7 +3954,7 @@ reasonable substitute.")
 (define-public python-rq
   (package
     (name "python-rq")
-    (version "1.5.2")
+    (version "1.11")
     (source
      (origin
        (method git-fetch)
@@ -3940,7 +3963,7 @@ reasonable substitute.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0ikqmpq0g1qiqwd7ar1286l4hqjb6aj2wr844gihhb8ijzwhp8va"))))
+        (base32 "1dj3m8dh9vf1qiq1drjhfw5xbr975v1kpzn4fwja83cfd7jrpzvy"))))
     (build-system python-build-system)
     (arguments
      '(#:phases (modify-phases %standard-phases
@@ -3957,7 +3980,7 @@ reasonable substitute.")
                                                       (getenv "PATH")))
                         (invoke "pytest" "-vv")))))))
     (native-inputs
-     (list python-mock python-pytest redis))
+     (list python-mock python-psutil python-pytest redis))
     (propagated-inputs
      (list python-click python-redis))
     (home-page "https://python-rq.org/")
@@ -4757,9 +4780,9 @@ a Gtk.Grid Widget.")
            sqlite))
     (native-inputs (list qttools-5))
     (home-page "https://sqlitebrowser.org/")
-    (synopsis "Database browser for SQLite")
-    (description "Sqlitebrowser is a high quaility, visual, open source tool to
-create design, and edit database file compatible with SQLite.")
+    (synopsis "Visual database browser and editor for SQLite")
+    (description "Sqlitebrowser lets you create, design, and edit database files
+compatible with SQLite using a graphical user interface.")
     (license
      ;; dual license
      (list license:gpl3+
diff --git a/gnu/packages/debian.scm b/gnu/packages/debian.scm
index 5ff09393b9..67b66be38d 100644
--- a/gnu/packages/debian.scm
+++ b/gnu/packages/debian.scm
@@ -331,9 +331,9 @@ debian/copyright for more information.")))))
       (home-page "http://apt-mirror.github.io/")
       (synopsis "Script for mirroring a Debian repository")
       (description
-       "apt-mirror is a small tool that provides the ability to
-selectively mirror Debian and Ubuntu GNU/Linux distributions or any
-other apt sources typically provided by open source developers.")
+       "apt-mirror is a small tool that provides the ability to selectively
+mirror @acronym{APT, advanced package tool} sources, including GNU/Linux
+distributions such as Debian and Trisquel.")
       (license license:gpl2))))
 
 (define-public dpkg
diff --git a/gnu/packages/dezyne.scm b/gnu/packages/dezyne.scm
index 5b79f0883a..413da49ece 100644
--- a/gnu/packages/dezyne.scm
+++ b/gnu/packages/dezyne.scm
@@ -31,14 +31,14 @@
 (define-public dezyne
   (package
     (name "dezyne")
-    (version "2.15.4")
+    (version "2.16.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://dezyne.org/download/dezyne/"
                            name "-" version ".tar.gz"))
        (sha256
-        (base32 "0d0jnnb3pgmspsz5qbgf33wsav5yp8wb45igns1sfinaz743n870"))))
+        (base32 "1x14jpv89dmrldar9g8pighbm68pvm4fvxz81mhjkimgf7kb4hbd"))))
     (inputs (list bash-minimal
                   guile-3.0-latest
                   guile-json-4
diff --git a/gnu/packages/diffoscope.scm b/gnu/packages/diffoscope.scm
index 5648c03a3e..adc68d6af6 100644
--- a/gnu/packages/diffoscope.scm
+++ b/gnu/packages/diffoscope.scm
@@ -74,7 +74,7 @@
 (define-public diffoscope
   (package
     (name "diffoscope")
-    (version "220")
+    (version "221")
     (source
      (origin
        (method git-fetch)
@@ -83,7 +83,7 @@
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0lkwbyf1z93skgqp1w4p0d7y8wwqf0bs53i43micwaq8p8xjs1ph"))
+        (base32 "0b89hygd4m18p3wcx7haz0kwx7gn7irjswxz29lv8sb2r1vqq4za"))
        (patches
         (search-patches "diffoscope-fix-llvm-test.patch"))))
     (build-system python-build-system)
diff --git a/gnu/packages/dns.scm b/gnu/packages/dns.scm
index a6521eafb5..e4dd8365f8 100644
--- a/gnu/packages/dns.scm
+++ b/gnu/packages/dns.scm
@@ -140,7 +140,7 @@ protocol.")
 (define-public ldns
   (package
     (name "ldns")
-    (version "1.8.1")
+    (version "1.8.3")
     (source
      (origin
        (method url-fetch)
@@ -148,7 +148,7 @@ protocol.")
         (string-append "https://www.nlnetlabs.nl/downloads/"
                        "ldns/ldns-" version ".tar.gz"))
        (sha256
-        (base32 "18vzdmyg9bm45janw602d4hifjsncrv143awlwcslfjdrsmjk0lm"))
+        (base32 "0q3q1svyxpj2g5wdkfy1ndb14m9fzffwyskflpihfabb0g8jvxy3"))
        (patches
         (search-patches
          ;; To create make-flag variables,
@@ -333,14 +333,14 @@ and BOOTP/TFTP for network booting of diskless machines.")
     ;; When updating, check whether isc-dhcp's bundled copy should be as well.
     ;; The BIND release notes are available here:
     ;; https://www.isc.org/bind/
-    (version "9.16.31")
+    (version "9.16.32")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://ftp.isc.org/isc/bind9/" version
                            "/bind-" version ".tar.xz"))
        (sha256
-        (base32 "1yvwdvcyy996p50j7nr4b010w16jjj5czw15g87wf1dn6xncp8lc"))
+        (base32 "0w2rcjxqnbhwzgsdsas36dadjq0qn6s1xjx4g4qk0ph2nvf4gj9j"))
        (patches
         (search-patches "bind-re-add-attr-constructor-priority.patch"))))
     (build-system gnu-build-system)
@@ -871,7 +871,7 @@ Extensions} (DNSSEC).")
 (define-public knot
   (package
     (name "knot")
-    (version "3.1.8")
+    (version "3.1.9")
     (source
      (origin
        (method git-fetch)
@@ -880,7 +880,7 @@ Extensions} (DNSSEC).")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0v3rh27qnyihdqp5nm8bnn9xd5rl2fbwhj4cmdpc8ik4qs21xyf4"))
+        (base32 "0w3jyz9qgkb34gkv2lr71phk5ad3rycn86qyw7n88ryhdsk45j73"))
        (modules '((guix build utils)))
        (snippet
         '(begin
diff --git a/gnu/packages/documentation.scm b/gnu/packages/documentation.scm
index 4e0612a460..ab54041320 100644
--- a/gnu/packages/documentation.scm
+++ b/gnu/packages/documentation.scm
@@ -341,12 +341,12 @@ additional metadata about the object to which the docstring belongs.")
      (list intltool))
     (home-page "http://scrollkeeper.sourceforge.net/")
     (synopsis "Open Documentation Cataloging Project")
-    (description "ScrollKeeper is a cataloging system for documentation on open
-systems.  It manages documentation metadata as specified by the Open Source
-Metadata Framework and provides a simple API to allow help browsers to find,
-sort, and search the document catalog.  It will also be able to communicate
-with catalog servers on the Net to search for documents which are not on the
-local system.")
+    (description
+     "ScrollKeeper is a cataloging system for documentation.  It manages
+documentation metadata as specified by the Open Source Metadata Framework and
+provides a simple API to allow help browsers to find, sort, and search the
+document catalog.  It will also be able to communicate with catalog servers on
+the Net to search for documents which are not on the local system.")
     (license lgpl2.1+)))
 
 (define-public zeal
diff --git a/gnu/packages/dunst.scm b/gnu/packages/dunst.scm
index 35df682d46..0855e45084 100644
--- a/gnu/packages/dunst.scm
+++ b/gnu/packages/dunst.scm
@@ -41,7 +41,7 @@
 (define-public dunst
   (package
     (name "dunst")
-    (version "1.8.1")
+    (version "1.9.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -50,7 +50,7 @@
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "19bh5789whlc0n5wbyx3yx8px93hccn42f1p6i1dz96hdkk5mjb8"))))
+                "1nfxf2rahngxpy606yrizrz16d0pswl5sa9jfzpv7h19x6xy24vx"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f                      ; no check target
diff --git a/gnu/packages/ebook.scm b/gnu/packages/ebook.scm
index ccc0bdf88d..c3a27cb113 100644
--- a/gnu/packages/ebook.scm
+++ b/gnu/packages/ebook.scm
@@ -518,7 +518,7 @@ following formats:
 (define-public cozy
   (package
     (name "cozy")
-    (version "1.2.0")
+    (version "1.2.1")
     (source
      (origin
        (method git-fetch)
@@ -527,7 +527,7 @@ following formats:
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0igqf9b77i13sxlk4ziw549h379hmz1slrb3vvf8irk94gxabsaw"))))
+        (base32 "0qky885fl63d5ih5d3rggm8rhp00sk6lny26qljyz3gga8n9y6ki"))))
     (build-system meson-build-system)
     (arguments
      `(#:glib-or-gtk? #t
diff --git a/gnu/packages/emacs-xyz.scm b/gnu/packages/emacs-xyz.scm
index 3c1d322db3..379c5fb22c 100644
--- a/gnu/packages/emacs-xyz.scm
+++ b/gnu/packages/emacs-xyz.scm
@@ -49,7 +49,7 @@
 ;;; Copyright © 2019, 2020, 2021 Joseph LaFreniere <joseph@lafreniere.xyz>
 ;;; Copyright © 2019 Todor Kondić <tk.code@protonmail.com>15669
 ;;; Copyright © 2019 Amar Singh <nly@disroot.org>
-;;; Copyright © 2019 Baptiste Strazzulla <bstrazzull@hotmail.fr>
+;;; Copyright © 2019, 2022 Baptiste Strazzulla <bstrazzull@hotmail.fr>
 ;;; Copyright © 2019 Giacomo Leidi <goodoldpaul@autistici.org>
 ;;; Copyright © 2019 Jens Mølgaard <jens@zete.tk>
 ;;; Copyright © 2019, 2020 Amin Bandali <bandali@gnu.org>
@@ -250,7 +250,7 @@
 (define-public emacs-geiser
   (package
     (name "emacs-geiser")
-    (version "0.23.2")
+    (version "0.26")
     (source
      (origin
        (method git-fetch)
@@ -259,7 +259,7 @@
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0p5cwx0xwva4ajgj8hnrk8bx6n3hv1z7aqs4zivp81crnq4077yw"))))
+        (base32 "1pm33zlcq84h61xhplmrlicckrax1pv39zrmv8ryzhi9mqrb6bdg"))))
     (build-system emacs-build-system)
     (arguments
      '(#:phases
@@ -328,7 +328,7 @@ e.g. emacs-geiser-guile for Guile.")
                 (("\\(geiser-activate-implementation .*\\)" all)
                  (string-append
                   "(eval-after-load 'geiser-impl '" all ")"))))))))
-    (inputs (list guile-3.0))
+    (inputs (list guile-3.0-latest))
     (propagated-inputs (list emacs-geiser))
     (home-page "https://www.nongnu.org/geiser/")
     (synopsis "Guile Scheme support for Geiser")
@@ -642,6 +642,25 @@ outlines, manage all your contacts, your windows and frames, and search across
 buffers, directory trees, or the web.")
     (license license:gpl3+)))
 
+(define-public emacs-vlf
+  (package
+    (name "emacs-vlf")
+    (version "1.7.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "https://elpa.gnu.org/packages/"
+                           "vlf-" version ".tar"))
+       (sha256
+        (base32 "0hpri19z6b7dqmrj5ckp8sf0m0l72lkgahqzvfmwhgpgv2p81bny"))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/m00natic/vlfi/")
+    (synopsis "View large files in Emacs")
+    (description
+"Vlf is an Emacs minor mode that allows viewing, editing, searching and
+comparing large files in batches.")
+    (license license:gpl2+)))
+
 (define-public emacs-hg-histedit
   ;; From 2021-03-02.
   ;; No releases available.
@@ -2881,7 +2900,7 @@ while paused.")
   (package
     (name "emacs-async")
     (home-page "https://github.com/jwiegley/emacs-async")
-    (version "1.9.4")
+    (version "1.9.6")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -2890,7 +2909,7 @@ while paused.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0hhpyxb3d531jb2f3wvzx25183f0anm8nxv6mh0p825q2gkm6ly7"))))
+                "1q480ss2jgijdpy6pa4xrjni9pf5q6dwf8hv052fhdpi55bmfdn2"))))
     (build-system emacs-build-system)
     (synopsis "Asynchronous processing in Emacs")
     (description
@@ -2961,7 +2980,7 @@ or XEmacs.")
 (define-public emacs-autothemer
   (package
     (name "emacs-autothemer")
-    (version "0.2.2")
+    (version "0.2.9")
     (source
      (origin
        (method git-fetch)
@@ -2971,7 +2990,7 @@ or XEmacs.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0cd2pqh6k32sjidkcd8682y4l6mx52xw4a05f38kk8nsrk28m74k"))))
+         "1p7ii7f0w607zxyqnr8ivi0n0sg2p93pi6dpd9kjqywdagqyrnw1"))))
     (build-system emacs-build-system)
     (propagated-inputs
      (list emacs-dash))
@@ -3162,7 +3181,7 @@ Its features are:
 (define-public emacs-citeproc-el
   (package
     (name "emacs-citeproc-el")
-    (version "0.9")
+    (version "0.9.1")
     (source
      (origin
        (method git-fetch)
@@ -3171,7 +3190,7 @@ Its features are:
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1m5j1abyk68f3d1v781yrx2xkg42vyfgfckbj2yk2lgk6d7rz0p1"))))
+        (base32 "0rkwqn9pcimfcyq19wlrcij0kcjyhbwisla7vwbhjj8ang0bq9rm"))))
     (build-system emacs-build-system)
     (arguments
      `(#:emacs ,emacs))                 ;need libxml support
@@ -4300,6 +4319,34 @@ which is restored where possible when the file is loaded again.")
 strings.")
     (license license:gpl3+)))
 
+(define-public emacs-blight
+  (let ((commit "6bf9c6192d2bf979eebbfae1963401ef3ff4ef5d")
+        (revision "0"))
+    (package
+      (name "emacs-blight")
+      (version (git-version "0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://codeberg.org/emacs-weirdware/blight")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "1x7s1fcva5kkl9iyb5grd6crf38rrz3zb0c6wb85khi9far10vgq"))))
+      (build-system emacs-build-system)
+      (home-page "https://codeberg.org/emacs-weirdware/blight")
+      (synopsis "Control display brightness")
+      (description
+       "Blight allows you to control display brightness from Emacs.  It
+features object-oriented code using EIEIO, a base class implementing
+a reasonable API which focuses on the @emph{set the back light to this
+percentage} functionality, it includes a concrete implementation that uses
+SysFS to control brightness.  Other systems (D-Bus, xbacklight, XELB using
+XRandR) are easily supportable, giving the same experience across
+environments.")
+      (license license:gpl3+))))
+
 (define-public emacs-symon
   (package
     (name "emacs-symon")
@@ -4320,6 +4367,35 @@ strings.")
      "Tiny graphical system monitor for the Emacs minibuffer when idle.")
     (license license:gpl2+)))
 
+(define-public emacs-lemon
+  (let ((commit "37a6e6d6ef0900ca19c820a2dbc122c7fe6d86cf")
+        (revision "0"))
+    (package
+      (name "emacs-lemon")
+      (version (git-version "2.0.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://codeberg.org/emacs-weirdware/lemon")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "0bc77vzi4p6mlzmhgybbldlpcsiiv4xqrd5lnc7wzvmxv8byhqpm"))))
+      (build-system emacs-build-system)
+      (native-inputs
+       (list emacs-blight emacs-emms))
+      (propagated-inputs
+       (list emacs-s))
+      (home-page "https://codeberg.org/emacs-weirdware/lemon")
+      (synopsis "System monitors in the echo area")
+      (description
+       "Lemon is a tiny system monitor which displays system information in
+the echo area when Emacs is has been idle for a few seconds.  This is a fork
+of zk_phi’s Symon, which has been largely rewritten.  It works nicely with
+EXWM.")
+      (license license:gpl3+))))
+
 (define-public emacs-sx
   (let ((version "20191229")
         (revision "0")
@@ -6629,14 +6705,14 @@ src blocks.")
 (define-public emacs-debbugs
   (package
     (name "emacs-debbugs")
-    (version "0.32")
+    (version "0.33")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://elpa.gnu.org/packages/debbugs-"
                            version ".tar"))
        (sha256
-        (base32 "1xp3mj3ndaljma0g7x9abziphgi2a6j8k1v52sb8xwgn4p5gdvby"))))
+        (base32 "1s4p3jf9yrm8pn5pljpkrw05n2p9v6fpl141rh1df7f7l0w80qbk"))))
     (build-system emacs-build-system)
     (arguments '(#:include '("\\.el$" "\\.wsdl$" "\\.info$")))
     (propagated-inputs
@@ -8708,7 +8784,7 @@ built-in custom themes.")
 (define-public emacs-gruvbox-theme
   (package
     (name "emacs-gruvbox-theme")
-    (version "1.29.0")
+    (version "1.30.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -8717,7 +8793,7 @@ built-in custom themes.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0ydwr2l3jhqbs3gk5qajirl54vfb8i65qrlzrs04jnsj1pkzq5xa"))))
+                "1dzaivis9cpqzb53qmkmhijr5l4hl2l3yr2412jxrz2jmqi3q4c5"))))
     (build-system emacs-build-system)
     (propagated-inputs
      (list emacs-autothemer))
@@ -9086,6 +9162,28 @@ Emacs completion function completing-read, which allows quickly selecting from a
 list of candidates.")
     (license license:gpl3+)))
 
+(define-public emacs-consult-bibtex
+  ;; XXX: Upstream contains a single commit, which matches the version below.
+  (let ((commit "2f870d6eefb54a53216d90a82cff0ff97ba54725"))
+    (package
+      (name "emacs-consult-bibtex")
+      (version "0.1")
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/mohkale/consult-bibtex")
+                      (commit commit)))
+                (sha256
+                 (base32
+                  "0jxjvpg3j8zk77sfhyy27fd1zbj2zz7xayavan3hhj4853q92kwq"))))
+      (build-system emacs-build-system)
+      (inputs (list emacs-consult emacs-embark emacs-org-roam-bibtex))
+      (home-page "https://github.com/mohkale/consult-bibtex")
+      (synopsis "Consulting-read interface for BibTeX completion")
+      (description "This package provides a read interface for BibTeX
+completion using Consult.")
+      (license license:gpl3+))))
+
 (define-public emacs-consult-dir
   (package
     (name "emacs-consult-dir")
@@ -9155,6 +9253,31 @@ provides a front-end interface for the workspace/symbols LSP procedure
 call.")
    (license license:gpl3+)))
 
+(define-public emacs-consult-yasnippet
+  (let ((commit "ae0450889484f23dc4ec37518852a2c61b89f184")
+        (revision "0"))
+    (package
+      (name "emacs-consult-yasnippet")
+      (version (git-version "0.2" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/mohkale/consult-yasnippet")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "13hmmsnmh32vafws61sckzzy354rq0nslqpyzhw97iwvn0fpsa35"))))
+      (build-system emacs-build-system)
+      (propagated-inputs (list emacs-consult emacs-yasnippet))
+      (home-page "https://github.com/mohkale/consult-yasnippet")
+      (synopsis "Consulting-read interface for Yasnippet")
+      (description
+       "This package allows you to expand Yasnippet' snippets through
+a completing-read interface.  It supports previewing the current snippet
+expansion and overwriting the marked region with a new snippet completion.")
+      (license license:gpl3+))))
+
 (define-public emacs-marginalia
   (package
     (name "emacs-marginalia")
@@ -10503,14 +10626,14 @@ as Fuseki or DBPedia.")
      (origin
        (method git-fetch)
        (uri (git-reference
-              (url "https://github.com/technomancy/better-defaults")
+              (url "https://git.sr.ht/~technomancy/better-defaults")
               (commit version)))
        (file-name (git-file-name name version))
        (sha256
         (base32
          "1rxznx2l0cdpiz8mad8s6q17m1fngpgb1cki7ch6yh18r3qz8ysr"))))
     (build-system emacs-build-system)
-    (home-page "https://github.com/technomancy/better-defaults")
+    (home-page "https://git.sr.ht/~technomancy/better-defaults")
     (synopsis "Better defaults for Emacs")
     (description
      "Better defaults attempts to address the most obvious deficiencies of the
@@ -13618,10 +13741,35 @@ provides functions to convert hash tables from and to alists and plists.")
 you to deal with multiple log levels.")
     (license license:gpl3+)))
 
+(define-public emacs-denote
+  (package
+    (name "emacs-denote")
+    (version "0.5.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://git.sr.ht/~protesilaos/denote")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "00f50dhw0x1hn87rc6vkrdwpybnbphg5z0g2c6c4r4cbgaiia8bi"))))
+    (build-system emacs-build-system)
+    (native-inputs (list texinfo))
+    (home-page "https://protesilaos.com/emacs/denote/")
+    (synopsis "Simple notes for Emacs")
+    (description
+"Denote is a simple note-taking tool for Emacs.  It is based on the idea that
+notes should follow a predictable and descriptive file-naming scheme.  The
+file name must offer a clear indication of what the note is about, without
+reference to any other metadata.  Denote basically streamlines the creation of
+such files while providing facilities to link between them.")
+    (license license:gpl3+)))
+
 (define-public emacs-logos
   (package
     (name "emacs-logos")
-    (version "0.3.1")
+    (version "0.4.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -13630,7 +13778,7 @@ you to deal with multiple log levels.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1xhnhaxmjqdv0bbh22gj9ak83hha8d59q64b6aa4rynrgcyajk45"))))
+                "1f40h8kbmza2rgmz84rgwbb4bwqkbfxnc3sc7gqshvxdkz3flbb7"))))
     (native-inputs (list texinfo))
     (build-system emacs-build-system)
     (arguments
@@ -13654,6 +13802,40 @@ structure, or any other pattern.")
     (license (list license:gpl3+
                    license:fdl1.3+)))) ; GFDLv1.3+ for the manual
 
+(define-public emacs-tmr
+  (package
+    (name "emacs-tmr")
+    (version "0.4.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://git.sr.ht/~protesilaos/tmr")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1vz9zfqap221baiy41wpxph33g6h2plnanzgpjs0wk8dz1fpwfky"))))
+    (build-system emacs-build-system)
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'patch-ffplay
+            (lambda* (#:key inputs #:allow-other-keys)
+              (let ((ffplay (search-input-file inputs "/bin/ffplay")))
+                (make-file-writable "tmr.el")
+                (substitute* "tmr.el"
+                  (("\"ffplay")
+                   (string-append "\"" ffplay)))))))))
+    (native-inputs (list texinfo))
+    (inputs (list ffmpeg))
+    (home-page "https://protesilaos.com/emacs/tmr/")
+    (synopsis "Set timers using a convenient notation")
+    (description
+     "TMR is an Emacs package that provides facilities for setting timers
+using a convenient notation.")
+    (license license:gpl3+)))
+
 (define-public emacs-gn-mode
   (package
     (name "emacs-gn-mode")
@@ -14944,7 +15126,7 @@ letter of Pinyin to Simplified/Traditional Chinese characters.")
 (define-public emacs-reverse-im
   (package
     (name "emacs-reverse-im")
-    (version "0.0.7")
+    (version "0.0.8")
     (source
      (origin
        (method git-fetch)
@@ -14953,7 +15135,7 @@ letter of Pinyin to Simplified/Traditional Chinese characters.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "05k2zp2hldzq5h6nl8gx79dd8lvfn507ad4x3naichdqgn2013nn"))))
+        (base32 "1h4gpyqir0kqf6a7ni8dbqwd4mr33imay0fmprrpfpfqxj0lj7c1"))))
     (build-system emacs-build-system)
     (home-page "https://github.com/a13/reverse-im.el")
     (synopsis "Reverse mapping for non-default system layouts")
@@ -14962,6 +15144,31 @@ letter of Pinyin to Simplified/Traditional Chinese characters.")
 methods from a given list.")
     (license license:gpl3+)))
 
+(define-public emacs-mini-frame
+  (let ((commit "60838f3cab438dcbda8eaa15ab3e5d1af88910e9")
+        (revision "0"))
+    (package
+      (name "emacs-mini-frame")
+      (version (git-version "1.19" revision commit))
+      (source
+       (origin
+         (uri (git-reference
+               (url "https://github.com/muffinmad/emacs-mini-frame.git")
+               (commit commit)))
+         (method git-fetch)
+         (sha256
+          (base32 "0q01iymz657bg3mcmq7vcl8r0ypsa1pqj1p6gxs7ywx1d33lan4d"))
+         (file-name (git-file-name name version))))
+      (build-system emacs-build-system)
+      (home-page "https://github.com/muffinmad/emacs-mini-frame")
+      (synopsis "Show minibuffer in child frame")
+      (description
+       "@dfn{mini-frame-mode} adds an advice around @code{read-from-minibuffer}
+to show the minibuffer as a child frame on top of the current frame.
+@code{find-file} and similar functions associated mini-buffers may appear at
+the center of the screen and not at the bottom.")
+      (license license:gpl3+))))
+
 (define-public emacs-posframe
   (package
     (name "emacs-posframe")
@@ -18673,7 +18880,7 @@ according to a parsing expression grammar.")
 (define-public emacs-eldev
   (package
     (name "emacs-eldev")
-    (version "1.1.3")
+    (version "1.2.1")
     (source
      (origin
        (method git-fetch)
@@ -18682,7 +18889,7 @@ according to a parsing expression grammar.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1dgbwaar8l8nl79mlzf5g1n49f1j9yj4772yfmim9vv8ppxnzbqk"))))
+        (base32 "1zf3vrk9yw4f4fj31g3vphjd3rhr2hv3q2crkdsgi7z5xlb8frds"))))
     (build-system emacs-build-system)
     (arguments
      (list
@@ -18820,7 +19027,7 @@ Chinese to English.")
 (define-public emacs-org-auto-tangle
   (package
     (name "emacs-org-auto-tangle")
-    (version "0.4.1")
+    (version "0.6.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -18829,7 +19036,7 @@ Chinese to English.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1zb7vcmhmjiqpbbhqrqci689rnpn10p985cs5jk9sgg66xsbrgs3"))))
+                "1kn1jsbv97ps280lcdx19d6hs7pvz7q9ng67xlb1kwjb680pa7rl"))))
     (build-system emacs-build-system)
     (propagated-inputs (list emacs-async))
     (home-page "https://github.com/yilkalargaw/org-auto-tangle")
@@ -18942,7 +19149,7 @@ automatically fetched from well-curated sources, and formatted as BibTeX.")
 (define-public emacs-citar
   (package
     (name "emacs-citar")
-    (version "0.9.7")
+    (version "1.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -18951,7 +19158,7 @@ automatically fetched from well-curated sources, and formatted as BibTeX.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1f49l1zmy4fnz75b0m2rav5jm8yp6hry44bv9xasiszyy3bn0hv8"))))
+                "1n69lkp7298gasm9hlbx9nhgp9ggh8w8ffyvi1rmbj96lcnpsyi9"))))
     (build-system emacs-build-system)
     (arguments
      `(#:phases (modify-phases %standard-phases
@@ -18980,6 +19187,36 @@ With Embark, it also makes available at-point actions in Org
 citations.")
     (license license:gpl3+)))
 
+(define-public emacs-citar-org-roam
+  (package
+    (name "emacs-citar-org-roam")
+    (version "0.3")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/emacs-citar/citar-org-roam")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1ldfs7g7ixnrwj23draiph4vy6xq7qgw18vhi7vbw6wvkh9fcv9r"))))
+    (build-system emacs-build-system)
+    (propagated-inputs (list emacs-org-roam emacs-citar))
+    (home-page "https://github.com/emacs-citar/citar-org-roam")
+    (synopsis "Emacs pacakge to provide tighter Citar and Org-Roam integration")
+    (description "\
+Out-of-box, Citar provides default support for file-per-note bibliographic
+notes that are compatible with Org-Roam v2.  This package integrates directly
+with the Org-Roam database, and provides the following additional features to
+Citar note support:
+@itemize
+@item multiple references per note
+@item multiple reference notes per file
+@item ability to query note citations by reference
+@item ``live'' updating of Citar UI for presence of notes
+@end itemize")
+    (license license:gpl3)))
+
 (define-public emacs-helm-bibtex
   (let ((commit "aa775340ba691d2322948bfdc6a88158568a1399")
         (revision "3"))
@@ -19333,7 +19570,7 @@ navigate and display hierarchy structures.")
 (define-public emacs-pulsar
   (package
     (name "emacs-pulsar")
-    (version "0.3.0")
+    (version "0.4.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -19342,7 +19579,7 @@ navigate and display hierarchy structures.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "09s1r9zqc28g75jjxajdm34ni4m7gynh0xsffy5d60c50igiqa94"))))
+                "05ig8p3y5k20w4xy0ahaml9z0i0xyw6fkypzvz0mjpldhxl7dbxd"))))
     (native-inputs (list texinfo))
     (build-system emacs-build-system)
     (arguments
@@ -19520,8 +19757,8 @@ never confused by comments or @code{foo-bar} matching @code{foo}.")
 (define-public emacs-crdt
   ;; XXX: Upstream does not always tag new releases.  The commit below
   ;; corresponds exactly to latest version bump.
-  (let ((commit "77be6cded0e2d24fc9c132032ae3bf7ae8ed2cf9")
-        (version "0.3.0"))
+  (let ((commit "2feb88ea9a2589946014878790af585cad9f28fc")
+        (version "0.3.2"))
     (package
       (name "emacs-crdt")
       (version version)
@@ -19533,7 +19770,7 @@ never confused by comments or @code{foo-bar} matching @code{foo}.")
                (commit commit)))
          (file-name (git-file-name name version))
          (sha256
-          (base32 "0irf2allz7bp696nqlgg70ma6n336bspz8794bff1s1pramrzlhz"))))
+          (base32 "1fc98kl5qm7h5hrd70g61zzbdinnbf0zvk9rghf6w78ndp6lv7fz"))))
       (build-system emacs-build-system)
       (home-page "https://code.librehq.com/qhong/crdt.el")
       (synopsis "Real-time collaborative editing environment")
@@ -20309,7 +20546,7 @@ powerful Org contents.")
 (define-public emacs-org-re-reveal
   (package
     (name "emacs-org-re-reveal")
-    (version "3.14.1")
+    (version "3.15.0")
     (source
      (origin
        (method git-fetch)
@@ -20318,7 +20555,7 @@ powerful Org contents.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "180dn5iywarljbmx8lm61y30n2d800kg96psrvc8ghfglnvp6964"))))
+        (base32 "0mn7qn80289gizvnxyjjs00b7qmlf0692kai7qgzgfj6i87pjc38"))))
     (build-system emacs-build-system)
     (propagated-inputs
      (list emacs-htmlize emacs-org))
@@ -23033,7 +23270,7 @@ source code.")
 (define-public emacs-rustic
   (package
     (name "emacs-rustic")
-    (version "3.2")
+    (version "3.3")
     (source
      (origin
        (method git-fetch)
@@ -23042,7 +23279,7 @@ source code.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "000awxvnwxg2hmhhn6yd9pnvflr91npfs2v1p5y7hcwg1d6mmvgk"))))
+        (base32 "088g6arlbq7czxyg5f31zmcm0gla7qh4vapaaskf6866yyqhizvb"))))
     (build-system emacs-build-system)
     (propagated-inputs
      (list emacs-dash
@@ -23999,7 +24236,7 @@ targets the Emacs based IDEs (CIDER, ESS, Geiser, Robe, SLIME etc.)")
 (define-public emacs-buttercup
   (package
     (name "emacs-buttercup")
-    (version "1.25")
+    (version "1.26")
     (source
      (origin
        (method git-fetch)
@@ -24009,18 +24246,18 @@ targets the Emacs based IDEs (CIDER, ESS, Geiser, Robe, SLIME etc.)")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0fsysvsypda6b7azc15bpaprq3bwx4gb6rlq2mj6f8rgwdqc8153"))))
+         "1zr9lczdr9dfh99n079d5advxm9p32a8f984dx14f3jn5mx750b1"))))
     (build-system emacs-build-system)
     (arguments
-     `(#:tests? #t
-       #:test-command '("make" "test")
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'install 'install-bin
-           (lambda* (#:key outputs #:allow-other-keys)
-             (install-file "bin/buttercup"
-                           (string-append (assoc-ref outputs "out") "/bin"))
-             #t)))))
+     (list
+      #:tests? #t
+      #:test-command #~(list "make" "test")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'install 'install-bin
+            (lambda _
+              (install-file "bin/buttercup"
+                            (string-append #$output "/bin")))))))
     (home-page "https://github.com/jorgenschaefer/emacs-buttercup")
     (synopsis "Behavior driven emacs lisp testing framework")
     (description "Buttercup is a behavior-driven development framework for
@@ -25089,7 +25326,7 @@ constant expressions.")
 (define-public emacs-dockerfile-mode
   (package
     (name "emacs-dockerfile-mode")
-    (version "1.6")
+    (version "1.7")
     (source
      (origin
        (method git-fetch)
@@ -25099,7 +25336,7 @@ constant expressions.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0nmybfc9qch0jng06qgs2xb41dl9v52ckc9nc20d7hv3x36w555x"))))
+         "0hmzwh8m72rj6cwaxfypnv3fmjrs11iqr15vsdw1rw7m55xi675f"))))
     (build-system emacs-build-system)
     (propagated-inputs
      (list emacs-s))
@@ -27962,6 +28199,29 @@ It can also be useful on Unix-like platforms to delay having to enter your
 passphrase until the first time you push to a remote.")
     (license license:gpl3+)))
 
+(define-public emacs-super-save
+  (package
+    (name "emacs-super-save")
+    (version "0.3.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/bbatsov/super-save")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "066fyg4r4pksyandpd7s53hagpvm2rw90q5ks4jlpgy7x00hw09l"))))
+    (build-system emacs-build-system)
+    (home-page "https://github.com/bbatsov/super-save")
+    (synopsis "Auto-save buffers, based on your activity")
+    (description "Super-save auto-saves your buffers, when certain events
+happen, e.g., when you switch between buffers or when an Emacs frame loses
+focus.  You can think of it as both something that augments and replaces the
+standard Auto-save mode.")
+    (license license:gpl3+)))
+
 (define-public emacs-tao-theme
   (let ((commit "468ee4f6ba7afb9dbfc8855ae2c333cb16ca4408")
         (revision "1"))
@@ -28081,7 +28341,7 @@ Emacs that integrate with major modes like Org-mode.")
 (define-public emacs-modus-themes
   (package
     (name "emacs-modus-themes")
-    (version "2.5.0")
+    (version "2.6.0")
     (source
      (origin
        (method git-fetch)
@@ -28090,7 +28350,7 @@ Emacs that integrate with major modes like Org-mode.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0ng85240zabw87ac53xnrlrafp10ns5wn6dgv9d1jxvnq40p7zqz"))))
+        (base32 "1zl1gd3jlkanjmlsxmwhqaiwyblp6kzznfjnw9cq8ah2390y9n1c"))))
     (native-inputs (list texinfo))
     (build-system emacs-build-system)
     (arguments
@@ -28147,7 +28407,7 @@ color.  Designed for 256-color terminals.  Comes in light and dark!")
 (define-public emacs-spacemacs-theme
   (package
     (name "emacs-spacemacs-theme")
-    (version "0.2")
+    (version "0.3")
     (source
      (origin
        (method git-fetch)
@@ -28156,7 +28416,7 @@ color.  Designed for 256-color terminals.  Comes in light and dark!")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "15l9hb8f08nkxsaj8pxbg2mip4pp2msnrl0nvlq22zg40gh7pqsn"))))
+        (base32 "1yz8xg9ni9290nly5b93djkzk9235q6k4lhb5ghs6snr0r39157n"))))
     (build-system emacs-build-system)
     (home-page "https://github.com/nashamri/spacemacs-theme")
     (synopsis
@@ -29432,6 +29692,27 @@ text, such a marking style might be used to show externally included text or
 example code.")
     (license license:gpl3+)))
 
+(define-public emacs-buffer-env
+  (package
+    (name "emacs-buffer-env")
+    (version "0.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://elpa.gnu.org/packages/buffer-env-"
+                                  version ".tar"))
+              (sha256
+               (base32
+                "0y8ik87dqldhn6q631zp2ln9z5byqgm9icrvr4xrdx6g8mr9c56z"))))
+    (build-system emacs-build-system)
+    (propagated-inputs (list emacs-compat))
+    (home-page "https://github.com/astoff/buffer-env")
+    (synopsis "Create buffer-local process environments")
+    (description "This package creates buffer-local environments using scripts
+similar to Direnv.  This allows Emacs to call the correct version of external
+programs such as linters, compilers, and language servers on a per-project
+basis.")
+    (license license:gpl3+)))
+
 (define-public emacs-buffer-move
   (package
     (name "emacs-buffer-move")
@@ -31012,14 +31293,14 @@ work on alists, hash-table and arrays.  All functions are prefixed with
 (define-public emacs-xref
   (package
     (name "emacs-xref")
-    (version "1.4.1")
+    (version "1.5.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://elpa.gnu.org/packages/xref-"
                            version ".tar"))
        (sha256
-        (base32 "1vbpplw0sngymmawi940nlqmncqznb5vp7zi0ib8v66g3y33ijrf"))))
+        (base32 "0xl6aiwkjbgs44c3wxk6s85diydm3y5lsd7znb0dhbqb7milid2d"))))
     (build-system emacs-build-system)
     (home-page "http://elpa.gnu.org/packages/xref.html")
     (synopsis "Cross-referencing commands")
@@ -31762,7 +32043,7 @@ headlines, keywords, tables and source blocks.")
       (license license:gpl3+)))) ; License is in pyimport.el
 
 (define-public emacs-straight-el
-  (let ((commit "4517e118ee43f849f708025dbb2cf4f281793121")
+  (let ((commit "fed215348076ba9182f634e0770a175220474b5a")
         (revision "0"))
     (package
       (name "emacs-straight-el")
@@ -31772,11 +32053,11 @@ headlines, keywords, tables and source blocks.")
          (method git-fetch)
          (uri
           (git-reference
-           (url "https://github.com/raxod502/straight.el")
+           (url "https://github.com/radian-software/straight.el")
            (commit commit)))
          (file-name (git-file-name name version))
          (sha256
-          (base32 "0idhgh203rac9c046286gir9rq0lgnlllzj4b4hrjpd3idg9v0r8"))))
+          (base32 "0z0j670s18mp1bhrsnng0mybcbnlywarhlz7zmrf9399rr513z1x"))))
       (build-system emacs-build-system)
       (arguments
        (list
@@ -31808,7 +32089,7 @@ headlines, keywords, tables and source blocks.")
        (list git))
       (propagated-inputs
        (list emacs-magit))
-      (home-page "https://github.com/raxod502/straight.el/")
+      (home-page "https://github.com/radian-software/straight.el/")
       (synopsis "Purely functional package manager for the Emacs hacker")
       (description
        "@code{emacs-straight-el} is a purely functional package manager for the Emacs
@@ -31925,6 +32206,53 @@ scrolling, and they even don't go away when switching buffer, but you
 can bind a popon to a specific buffer to only show on that buffer.")
       (license license:gpl3+))))
 
+(define-public emacs-consult-lsp
+  (package
+    (name "emacs-consult-lsp")
+    (version "1.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/gagbo/consult-lsp")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "14dyclspkf1a34nvjj800ckz1phsizq07ps8k4x0ah6ik0hfhy1w"))))
+    (build-system emacs-build-system)
+    (propagated-inputs (list emacs-consult emacs-lsp-mode emacs-f))
+    (home-page "https://github.com/gagbo/consult-lsp/")
+    (synopsis "LSP-mode and consult helping each other")
+    (description
+"@code{emacs-consult-lsp} provides helpers for interactively selecting LSP
+workspace diagnostics, symbols, and file symbols from @{emacs-lsp-mode}
+by leveraging @code{emacs-consult} APIs.")
+    (license license:expat)))
+
+(define-public emacs-pdb-capf
+  (let ((commit "31602ccab53aa7dcf26a1af222c7da2bcc1390ed")
+        (revision "0"))
+    (package
+      (name "emacs-pdb-capf")
+      (version (git-version "1.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri
+          (git-reference
+           (url "https://github.com/muffinmad/emacs-pdb-capf")
+           (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "0x2pg03csf25vj8y2zb5sv493dk3n0s4xbkihii2mzhkx82vgpxg"))))
+      (build-system emacs-build-system)
+      (home-page "https://github.com/muffinmad/emacs-pdb-capf")
+      (synopsis "Completion-at-point function for pdb")
+      (description
+"@code{emacs-pdb-capf} provides a @code{completion-at-point} function
+for pdb allowing completion in a @code{*gud-pdb*} buffer.")
+      (license license:gpl3+))))
+
 (define-public emacs-bitbake-modes
   (package
    (name "emacs-bitbake-modes")
@@ -31967,3 +32295,27 @@ projects.")
 tree to go back to previous buffer states.  To use vundo, type @kbd{M-x vundo RET} in
 the buffer you want to undo.  An undo tree buffer should pop up.")
     (license license:gpl3+)))
+
+(define-public emacs-vertico-posframe
+  (package
+    (name "emacs-vertico-posframe")
+    (version "0.5.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://elpa.gnu.org/packages/vertico-posframe-" version
+                    ".tar"))
+              (sha256
+               (base32
+                "19lx6p06wkwfivxgswdljdsh9bgcd1b9zkzx426w3pwicdk0cvgg"))))
+    (build-system emacs-build-system)
+    (propagated-inputs (list emacs-posframe emacs-vertico))
+    (home-page "https://github.com/tumashu/vertico-posframe")
+    (synopsis "Pop up a frame at point to show vertical completion UI")
+    (description
+     "Vertico is an Emacs package that provides a vertical completion UI based
+on the default completion system.  Posframe is an Emacs package that provides
+a way to pop up a frame at point.  Vertico-posframe is an Emacs package and
+a Vertico extension which provides a way to pop up a frame at point to show
+a vertical completion UI.")
+    (license license:gpl3+)))
diff --git a/gnu/packages/engineering.scm b/gnu/packages/engineering.scm
index ed87cd8d6a..f195179413 100644
--- a/gnu/packages/engineering.scm
+++ b/gnu/packages/engineering.scm
@@ -67,6 +67,7 @@
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system emacs)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system meson)
   #:use-module (guix build-system python)
   #:use-module (guix build-system qt)
   #:use-module (gnu packages)
@@ -88,6 +89,7 @@
   #:use-module (gnu packages digest)
   #:use-module (gnu packages docbook)
   #:use-module (gnu packages documentation)
+  #:use-module (gnu packages file)
   #:use-module (gnu packages flex)
   #:use-module (gnu packages fontutils)
   #:use-module (gnu packages fpga)
@@ -142,6 +144,7 @@
   #:use-module (gnu packages tbb)
   #:use-module (gnu packages tcl)
   #:use-module (gnu packages texinfo)
+  #:use-module (gnu packages text-editors)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages tex)
   #:use-module (gnu packages version-control)
@@ -2438,7 +2441,7 @@ comments.")))
 (define-public freecad
   (package
     (name "freecad")
-    (version "0.20")
+    (version "0.20.1")
     (source
      (origin
        (method git-fetch)
@@ -2447,7 +2450,7 @@ comments.")))
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "14bn75bjh93f8k3hinqw913z1q0ywq7niklwbbd99hf5n342hsv4"))))
+        (base32 "1pgkjlahisqjvi3dd7ywj1zwhsl3wn3p15sifbmrdfdmw9is3z2b"))))
     (build-system qt-build-system)
     (native-inputs
      (list doxygen
@@ -2524,12 +2527,11 @@ comments.")))
     (home-page "https://www.freecadweb.org/")
     (synopsis "Your Own 3D Parametric Modeler")
     (description
-     "FreeCAD is a general purpose feature-based, parametric 3D modeler for
-CAD, MCAD, CAx, CAE and PLM, aimed directly at mechanical engineering and
-product design but also fits a wider range of uses in engineering, such as
-architecture or other engineering specialties.  It is 100% Open Source (LGPL2+
-license) and extremely modular, allowing for very advanced extension and
-customization.")
+     "FreeCAD is a general-purpose, feature-based, parametric 3D modeler for
+CAD, MCAD, CAx, CAE, and PLM.  It is aimed directly at mechanical engineering
+and product design but also fits a wider range of uses in engineering, such as
+architecture or other engineering specialties.  It is modular, allowing for
+extension and customization.")
     (license
      (list
       license:lgpl2.1+
@@ -3352,10 +3354,10 @@ facilitate the communication between Cura and its backend and similar code.")
                 "stb_image.h")))))))
     (home-page "https://github.com/Ultimaker/CuraEngine")
     (synopsis "Cura slicing engine")
-    (description "CuraEngine is a powerful, fast and robust engine for
-processing 3D models into 3D printing instruction for Ultimaker and other
-GCode based 3D printers.  It is part of the larger open source project called
-Cura.")
+    (description
+     "CuraEngine is an engine for processing 3D models into 3D printing
+instructions for Ultimaker and other GCode-based 3D printers.  It is part of a
+larger project called Cura.")
     (license license:agpl3+)))
 
 (define-public cura-binary-data
@@ -3757,3 +3759,57 @@ form, numpad.
 @item Visualizing G-code files.
 @end itemize")
       (license license:gpl3+))))
+
+(define-public rizin
+  (package
+    (name "rizin")
+    (version "0.4.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "https://github.com/rizinorg/rizin/releases/download/v"
+                    version "/rizin-src-v" version ".tar.xz"))
+              (sha256
+               (base32
+                "0nkb6v9lks25w5sv5s6p2ghgqnnnsf39md8nlx1cy4z89xlaisq9"))))
+    (build-system meson-build-system)
+    (arguments
+     (list
+      #:configure-flags
+      #~(list "-Dpackager=guix"
+              (string-append "-Dpackager_version=" #$version)
+              "-Duse_sys_capstone=enabled"
+              "-Duse_sys_magic=enabled"
+              "-Duse_sys_libzip=enabled"
+              "-Duse_sys_zlib=enabled"
+              "-Duse_sys_lz4=enabled"
+              "-Duse_sys_xxhash=enabled"
+              "-Duse_sys_openssl=enabled"
+              "-Duse_sys_tree_sitter=enabled"
+              "-Duse_sys_libuv=enabled"
+              "-Duse_gpl=true")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'configure 'skip-integration-tests
+            (lambda _
+              ;; Skip integration tests, which require prebuilt binaries at:
+              ;; <https://github.com/rizinorg/rizin-testbins>.
+              ;; And 2 of them are failing, reported upstream:
+              ;; <https://github.com/rizinorg/rizin/issues/2905>.
+              (substitute* "test/meson.build"
+                (("subdir\\('integration'\\)") "")))))))
+    (native-inputs (list pkg-config))
+    (inputs
+     (list capstone file libuv libzip lz4 openssl tree-sitter xxhash zlib))
+    (home-page "https://rizin.re")
+    (synopsis "Disasm, debug, analyze and manipulate binary files")
+    (description
+     "Rizin is a reverse engineering framework and a set of small command-line
+utilities, providing a complete binary analysis experience with features like
+disassembler, hexadecimal editor, emulation, binary inspection, debugger, and
+more.")
+    ;; Most files are under LGPL-3.0-only, other are under: Apache-2.0,
+    ;; BSD-2-Clause, BSD-3-Clause, CC0-1.0, CC-BY-SA-4.0, GPL-1.0-or-later,
+    ;; GPL-2.0-only, GPL-2.0-or-later, GPL-3.0-or-later, LGPL-2.0-or-later,
+    ;; LGPL-2.1-only, LGPL-2.1-or-later, LGPL-3.0-only, MIT, NCSA.
+    (license license:gpl3+)))
diff --git a/gnu/packages/file-systems.scm b/gnu/packages/file-systems.scm
index c6063c42c4..d326b9cc3d 100644
--- a/gnu/packages/file-systems.scm
+++ b/gnu/packages/file-systems.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2017, 2018, 2020, 2021 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2017, 2018, 2020–2022 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2017 Gábor Boskovits <boskovits@gmail.com>
 ;;; Copyright © 2017, 2018, 2021 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2018 Leo Famulari <leo@famulari.name>
@@ -380,6 +380,48 @@ is corrupted you'll lose the affected file(s) but not the whole back-up.")
     (home-page "https://www.fsarchiver.org/")
     (license license:gpl2)))
 
+(define-public fstransform
+  (package
+    (name "fstransform")
+    (version "0.9.4")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/cosmos72/fstransform")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0vhypb6pbghja95av62ds4mhldbg0h8g4yg94k9r7lsxm7bgpfr3"))))
+    (build-system gnu-build-system)
+    (arguments
+     (list #:phases
+           #~(modify-phases %standard-phases
+               (add-after 'install 'install-README
+                 ;; There are no man pages.  Install a poor substitute.
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let* ((out (assoc-ref outputs "out"))
+                          (doc (string-append out "/share/doc/" #$name)))
+                     (install-file "README" doc)))))))
+    (inputs (list e2fsprogs))
+    (home-page "https://github.com/cosmos72/fstransform")
+    (synopsis "Convert file system types in place without copying all data")
+    (description
+     "This package provides several command-line tools to transform a supported
+file system, such as XFS, into one of a different supported type, such as ext4.
+All existing file contents, names, and directories are preserved.
+
+The conversion happens @dfn{in place}, without the need to create a complete
+copy of the original data.  This lets you transform almost full file systems on
+systems where adding (sufficient) additional storage space is not an option.
+
+Do @emph{not} use this package when you could simply create an empty file system
+from scratch and restore from a back-up.  Transformation is limited, slow, and
+significantly increases the risk of irreversible data loss!")
+    ;; Please follow <https://github.com/cosmos72/fstransform/issues/46>.
+    (license (list license:gpl2         ; fsattr/src/e4attr.* → sbin/fsattr
+                   license:gpl3+))))    ; the rest
+
 (define-public gphotofs
   (package
     (name "gphotofs")
diff --git a/gnu/packages/finance.scm b/gnu/packages/finance.scm
index 4b5ab2924b..849f9aba99 100644
--- a/gnu/packages/finance.scm
+++ b/gnu/packages/finance.scm
@@ -9,7 +9,7 @@
 ;;; Copyright © 2017–2021 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2018 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2018 Adriano Peluso <catonano@gmail.com>
-;;; Copyright © 2018, 2019, 2020, 2021 Nicolas Goaziou <mail@nicolasgoaziou.fr>
+;;; Copyright © 2018, 2019, 2020, 2021, 2022 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2018 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2019, 2020, 2021, 2022 Guillaume Le Vaillant <glv@posteo.net>
 ;;; Copyright © 2019 Tanguy Le Carrour <tanguy@bioneland.org>
@@ -30,6 +30,8 @@
 ;;; Copyright © 2022 Aleksandr Vityazev <avityazev@posteo.org>
 ;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2022 Philip McGrath <philip@philipmcgrath.com>
+;;; Copyright © 2022 Collin J. Doering <collin@rekahsoft.ca>
+;;; Copyright © 2022 Justin Veilleux <terramorpha@cock.li>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -78,14 +80,16 @@
   #:use-module (gnu packages documentation)
   #:use-module (gnu packages dns)
   #:use-module (gnu packages emacs)
+  #:use-module (gnu packages emacs-xyz)
   #:use-module (gnu packages dbm)
   #:use-module (gnu packages gettext)
-  #:use-module (gnu packages gnome)
-  #:use-module (gnu packages golang)
   #:use-module (gnu packages glib)
+  #:use-module (gnu packages gnome)
   #:use-module (gnu packages gnupg)
+  #:use-module (gnu packages golang)
   #:use-module (gnu packages graphviz)
   #:use-module (gnu packages groff)
+  #:use-module (gnu packages gsasl)
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages haskell-check)
   #:use-module (gnu packages haskell-web)
@@ -98,6 +102,7 @@
   #:use-module (gnu packages linux)
   #:use-module (gnu packages man)
   #:use-module (gnu packages maths)
+  #:use-module (gnu packages mpi)
   #:use-module (gnu packages multiprecision)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages networking)
@@ -278,14 +283,14 @@ Accounting.")
 (define-public homebank
   (package
     (name "homebank")
-    (version "5.5.5")
+    (version "5.5.6")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://homebank.free.fr/public/homebank-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "0rwykjpv4w7bffyvx2j6py17nxw9jcbml7ma4is194i3npn0bkmy"))))
+                "1nn75wzk9h82zsakxng1v94nlg7hq3ssicvskl1m5hg4fa68w3j6"))))
     (build-system glib-or-gtk-build-system)
     (native-inputs
      (list pkg-config intltool))
@@ -462,6 +467,37 @@ in ability, and easy to use.
 This package provides the Emacs mode.")
       (license license:gpl2+))))
 
+(define-public emacs-hledger-mode
+  (let ((commit "400bde42a8d2712af80cd7c773c9cdfbb63a515a")
+        (revision "1"))
+    (package
+      (name "emacs-hledger-mode")
+      (version (git-version "20220515" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/narendraj9/hledger-mode")
+                      (commit commit)))
+                (sha256
+                 (base32
+                  "0xmcfpr3rxli1adwypg18npl8hb8ak5rg6a6i26inzzqja6vr897"))))
+      (build-system emacs-build-system)
+      (propagated-inputs
+       (list emacs-popup
+             emacs-async
+             emacs-htmlize))
+      (arguments
+       '(#:include '("^[^/]+.el$")
+         #:exclude '()))
+      (home-page "https://github.com/narendraj9/hledger-mode")
+      (synopsis "Mode for writing journal entries for hledger")
+      (description
+       "This major mode for Emacs enables writing and managing hledger
+journal files.  It generates some useful reports along with some financial
+ratios that can help you keep a check on your financial health for users of
+the plaintext accounting system hledger.")
+      (license license:gpl3))))
+
 (define-public geierlein
   (package
     (name "geierlein")
@@ -590,7 +626,7 @@ other machines/servers.  Electrum does not download the Bitcoin blockchain.")
 (define-public electron-cash
   (package
     (name "electron-cash")
-    (version "4.2.10")
+    (version "4.2.11")
     (source
      (origin
        (method git-fetch)
@@ -599,7 +635,7 @@ other machines/servers.  Electrum does not download the Bitcoin blockchain.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0axpypq9byda61rp3sznrq24b24qxbfwk56j75qp06s1ackg0pcv"))))
+        (base32 "1g0xnb63c52l379zrqkfhxlkg1d2hf2dgjs2swspa0vah845r282"))))
     (build-system python-build-system)
     (arguments
      (list
@@ -671,7 +707,7 @@ blockchain.")
   ;; the system's dynamically linked library.
   (package
     (name "monero")
-    (version "0.18.0.0")
+    (version "0.18.1.0")
     (source
      (origin
        (method git-fetch)
@@ -689,7 +725,7 @@ blockchain.")
             delete-file-recursively
             '("external/miniupnp" "external/rapidjson"))))
        (sha256
-        (base32 "1jq2v2dg50gl3cf9s61jssny5rraclxqj4cc4y0sl00ip8icj08v"))))
+        (base32 "18yj44pki7x8ir6wg02g1h6yxp1hnqb0nrx9x5dvv94rda48cy66"))))
     (build-system cmake-build-system)
     (native-inputs
      (list doxygen
@@ -776,7 +812,7 @@ the Monero command line client and daemon.")
 (define-public monero-gui
   (package
     (name "monero-gui")
-    (version "0.18.0.0")
+    (version "0.18.1.0")
     (source
      (origin
        (method git-fetch)
@@ -792,7 +828,7 @@ the Monero command line client and daemon.")
            ;; See the 'extract-monero-sources' phase.
            (delete-file-recursively "monero")))
        (sha256
-        (base32 "14rbw9803h3g7ld3d24vc3i9n55n09x13frkmd128xx5jw17v5sr"))))
+        (base32 "1z627jy9n6cwc9yv0w58fbhix4qnllk0q42ga75mhlawaz68j0qi"))))
     (build-system qt-build-system)
     (native-inputs
      `(,@(package-native-inputs monero)
@@ -801,6 +837,7 @@ the Monero command line client and daemon.")
      (modify-inputs (package-inputs monero)
        (append libgcrypt
                monero
+               p2pool
                qtbase-5
                qtdeclarative-5
                qtgraphicaleffects
@@ -834,6 +871,17 @@ the Monero command line client and daemon.")
                       (string-append
                        "set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -fPIC\")\n"
                        all)))))
+               (add-after 'unpack 'fix-p2pool-path
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   (substitute* "src/p2pool/P2PoolManager.cpp"
+                     ;; Location for files created by P2Pool
+                     (("m_p2poolPath = QApplication::applicationDirPath\\(\\);")
+                      "m_p2poolPath = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);")
+                     ;; Location of p2pool program
+                     (("m_p2pool = m_p2poolPath \\+ \"/p2pool\";")
+                      (string-append "m_p2pool = \""
+                                     (search-input-file inputs "/bin/p2pool")
+                                     "\";")))))
                (replace 'install
                  (lambda _
                    (let ((bin (string-append #$output "/bin")))
@@ -1236,13 +1284,13 @@ Luhn and family of ISO/IEC 7064 check digit algorithms.")
 (define-public python-duniterpy
   (package
     (name "python-duniterpy")
-    (version "1.0.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "duniterpy" version))
        (sha256
-        (base32 "13kp2ph7fb1cdkx1y6j2h8q33fj2akc104l77ng52cy4v8jic9nz"))))
+        (base32 "18i5bqz58vjp740pxb4wb4ixg1g2d73cwi0d8gp85fmj5p8f2gx7"))))
     (build-system python-build-system)
     (arguments
      ;; FIXME: Tests fail with: "TypeError: block_uid() missing 1 required
@@ -1255,13 +1303,11 @@ Luhn and family of ISO/IEC 7064 check digit algorithms.")
                         (("mnemonic>=0\\.19,<0.20")
                          "mnemonic>=0.19")))))))
     (propagated-inputs
-     (list python-aiohttp
-           python-attrs
+     (list python-attrs
            python-base58
            python-jsonschema
            python-libnacl
            python-pyaes
-           python-pylibscrypt
            python-graphql-core
            python-mnemonic
            python-websocket-client
@@ -2081,3 +2127,100 @@ analysis of financial market data.")
 format used by SWIFT.  It returns smart Python collections for statistics
 and manipulation.")
     (license license:bsd-3)))
+
+(define-public xmrig
+  (package
+    (name "xmrig")
+    (version "6.18.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/xmrig/xmrig")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256 (base32 "1ncnfjpjwjdv29plyiam2nh01bfni49sgfi3qkijygi1450w71dx"))
+       (modules '((guix build utils)))
+       (snippet
+        ;; TODO: Try to use system libraries instead of bundled ones in
+        ;; "src/3rdparty/". It requires changes to some "cmake/..." scripts
+        ;; and to some source files.
+        #~(substitute* "src/donate.h"
+            (("constexpr const int kDefaultDonateLevel = 1;")
+             "constexpr const int kDefaultDonateLevel = 0;")
+            (("constexpr const int kMinimumDonateLevel = 1;")
+             "constexpr const int kMinimumDonateLevel = 0;")))))
+    (build-system cmake-build-system)
+    (inputs
+     (list
+      `(,hwloc "lib")
+      libuv
+      openssl))
+    (arguments
+     (list
+      ;; There are no tests.
+      #:tests? #f
+      #:phases
+      #~(modify-phases
+         %standard-phases
+         (replace 'install
+           ;; There is no 'install' target, we must install xmrig manually
+           (lambda* (#:key #:allow-other-keys)
+             (install-file "xmrig"
+                           (string-append #$output "/bin")))))))
+    (home-page "https://xmrig.com/")
+    (synopsis "Monero miner")
+    (description
+     "XMRig is a high performance, cross platform RandomX, KawPow,
+CryptoNight, AstroBWT and GhostRider unified CPU/GPU miner and RandomX
+benchmark.
+
+Warning: upstream, by default, receives a percentage of the mining time.  This
+anti-functionality has been neutralised in Guix, but possibly not in all other
+distributions.
+
+Warning: this software, because of it's nature, has high energy consumption.
+Also, the energy expenses might be higher that the cryptocurrency gained by
+mining.")
+    (license license:gpl3+)))
+
+(define-public p2pool
+  (package
+    (name "p2pool")
+    (version "2.2.1")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/SChernykh/p2pool")
+             (commit (string-append "v" version))
+             (recursive? #t)))
+       (file-name (git-file-name name version))
+       (sha256 (base32 "19pn7axj96yvza2x7678rs79c2vgmhl8d7f9ki72v2n6l2630fw8"))
+       (modules '((guix build utils)))
+       (snippet
+        #~(for-each delete-file-recursively
+                    '("external/lib"
+                      "external/src/cppzmq"
+                      "external/src/curl"
+                      "external/src/libuv"
+                      "external/src/libzmq"
+                      "external/src/rapidjson")))))
+    (build-system cmake-build-system)
+    (inputs
+     (list cppzmq curl gss libuv rapidjson zeromq))
+    (arguments
+     (list
+      #:tests? #f
+      #:phases
+      #~(modify-phases %standard-phases
+          (replace 'install
+            (lambda _
+              (install-file "p2pool" (string-append #$output "/bin")))))))
+    (home-page "https://p2pool.io/")
+    (synopsis "Decentralized Monero mining pool")
+    (description "Monero P2Pool is a peer-to-peer Monero mining pool.  P2Pool
+combines the advantages of pool and solo mining; you still fully control your
+Monero node and what it mines, but you get frequent payouts like on a regular
+pool.")
+    (license license:gpl3)))
diff --git a/gnu/packages/firmware.scm b/gnu/packages/firmware.scm
index a258af30bf..3ba5078b63 100644
--- a/gnu/packages/firmware.scm
+++ b/gnu/packages/firmware.scm
@@ -265,9 +265,11 @@ broadband modem as found, for example, on PinePhone.")
                  bin))
              #t)))))
     (home-page "https://github.com/riscv-software-src/opensbi")
-    (synopsis "RISC-V Open Source Supervisor Binary Interface")
-    (description "A reference implementation of the RISC-V SBI specifications
-for platform-specific firmwares executing in M-mode.")
+    (synopsis "RISC-V @acronym{SBI, Supervisor Binary Interface} implementation")
+    (description
+     "OpenSBI is the reference implementation of the RISC-V @acronym{SBI,
+Supervisory Binary Interface} specifications for platform-specific firmwares
+executing in M-mode.")
     (license (list license:bsd-2
                    ;; lib/utils/libfdt/* is dual licensed under bsd-2 and gpl2+.
                    license:gpl2+
diff --git a/gnu/packages/fonts.scm b/gnu/packages/fonts.scm
index 20b55bce96..09445cd00c 100644
--- a/gnu/packages/fonts.scm
+++ b/gnu/packages/fonts.scm
@@ -51,6 +51,7 @@
 ;;; Copyright © 2021 Liliana Marie Prikler <liliana.prikler@gmail.com>
 ;;; Copyright © 2022 Jose G Perez Taveras <josegpt27@gmail.com>
 ;;; Copyright © 2022 Hilton Chain <hako@ultrarare.space>
+;;; Copyright © 2022 Nguyễn Gia Phong <mcsinyx@disroot.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -732,6 +733,26 @@ following fonts in the OpenType format: Adventor, Bonum, Chorus, Cursor,
 Heros, Pagella, Schola, Termes.")
     (license license:gfl1.0)))
 
+(define-public font-latin-modern
+  (package
+    (name "font-latin-modern")
+    (version "2.004")
+    (source
+     (origin
+       (method url-fetch/zipbomb)
+       (uri (string-append "https://www.gust.org.pl/projects/e-foundry/"
+                           "latin-modern/download/lm" version "otf.zip"))
+       (sha256
+        (base32 "06qnvd6kh07gy2197vx3nmskhiqhp7ip9cpi2rkbwa1p3l2kc0jv"))))
+    (build-system font-build-system)
+    (home-page "https://www.gust.org.pl/projects/e-foundry/latin-modern")
+    (synopsis "OpenType fonts based on Computer Modern")
+    (description "The Latin Modern fonts are a set of scalable fonts based on
+the PostScript Type 1 version of the Computer Modern fonts and contain many
+additional characters (mostly accented ones).  This package provides the
+OpenType variant of these fonts.")
+    (license license:gfl1.0)))
+
 (define-public font-amiri
   (package
     (name "font-amiri")
@@ -821,7 +842,7 @@ for use at smaller text sizes")))
 (define-public font-gnu-unifont
   (package
     (name "font-gnu-unifont")
-    (version "14.0.03")
+    (version "14.0.04")
     (source
      (origin
        (method url-fetch)
@@ -831,7 +852,7 @@ for use at smaller text sizes")))
              (string-append "mirror://gnu/unifont/unifont-"
                             version "/unifont-" version ".tar.gz")))
        (sha256
-        (base32 "1swzwh355ipqhm3vvy7005fqawydlcdbkxm3h04vhicahp8hl06l"))))
+        (base32 "1fzycjxmgnq77r2s5914w1phg3qdwwnwa6p3zyfa1cscrxy52phz"))))
     (build-system gnu-build-system)
     (outputs '("out"   ; TrueType version
                "pcf"   ; PCF (bitmap) version
diff --git a/gnu/packages/fontutils.scm b/gnu/packages/fontutils.scm
index 278695a03c..f8d500d1c0 100644
--- a/gnu/packages/fontutils.scm
+++ b/gnu/packages/fontutils.scm
@@ -195,7 +195,8 @@ them as it goes.")
                               `("PATH" prefix (,bindir))))
                           commands)))))))
     (native-inputs
-     (list ninja python-pytest python-scikit-build python-wheel))
+     (list ninja python-pytest python-scikit-build python-setuptools-scm
+           python-wheel))
     (inputs (list java-antlr4-runtime-cpp `(,util-linux "lib")))
     (propagated-inputs
      (list psautohint
@@ -389,7 +390,8 @@ converts any cubic curves to quadratic.  The most useful function is probably
        (sha256
         (base32 "0a6iq5g6qdxj7nvip8nnf0mf8y5wmpd3wwq0dv7d4nm9bjrh0r6m"))))
     (build-system python-build-system)
-    (native-inputs (list python-pytest python-pytest-runner))
+    (native-inputs
+     (list python-pytest python-pytest-runner python-setuptools-scm))
     (propagated-inputs
      (list python-booleanoperations
            python-cffsubr
@@ -497,7 +499,7 @@ implementing the pen protocol for manipulating glyphs.")
             python-defcon-bootstrap
             python-fontmath
             python-fonttools))
-     (native-inputs (list unzip))
+     (native-inputs (list python-setuptools-scm unzip))
      (home-page "https://github.com/robotools/fontParts")
      (synopsis "Library for interacting with font parts")
      (description "FontParts is an @acronym{API, Application Programming
@@ -734,7 +736,7 @@ paths (intersection, union, difference, xor).")
            python-fontparts
            python-fonttools
            python-mutatormath))
-    (native-inputs (list unzip))
+    (native-inputs (list python-setuptools-scm unzip))
     (home-page "https://github.com/LettError/ufoProcessor")
     (synopsis "Process and generate @acronym{UFO, Unified Font Object} files")
     (description "This Python package processes and generates instances for
diff --git a/gnu/packages/fpga.scm b/gnu/packages/fpga.scm
index b8f98ca63e..06d4a10e7e 100644
--- a/gnu/packages/fpga.scm
+++ b/gnu/packages/fpga.scm
@@ -226,8 +226,8 @@ For synthesis, the compiler generates netlists in the desired format.")
     (license license:isc)))
 
 (define-public icestorm
-  (let ((commit "0ec00d892a91cc68e45479b46161f649caea2933")
-        (revision "3"))
+  (let ((commit "2bc541743ada3542c6da36a50e66303b9cbd2059")
+        (revision "4"))
    (package
     (name "icestorm")
     (version (git-version "0.0" revision commit))
@@ -239,7 +239,7 @@ For synthesis, the compiler generates netlists in the desired format.")
               (file-name (git-file-name name version))
               (sha256
                 (base32
-                   "1qlh99fafb7xga702k64fmc9m700nsddrfgcq4x8qn8fplsb64f1"))))
+                 "0d0ibdq3rzmjcbv97h4b9wgq8ikvgwlfw60spi2w81mis317lis8"))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f ; no unit tests that don't need an FPGA exist.
diff --git a/gnu/packages/game-development.scm b/gnu/packages/game-development.scm
index 3e0301a199..661e1c0e07 100644
--- a/gnu/packages/game-development.scm
+++ b/gnu/packages/game-development.scm
@@ -2136,10 +2136,11 @@ of the others")
 
 (define-public ioquake3
   ;; We follow master since it seems that there won't be releases after 1.3.6.
-  (let ((commit "95b9cab4d644fa3bf757cfff821cc4f7d76e38b0"))
+  (let ((revision "2")
+        (commit "29b0cc3a4d037046eb3247fc04f4b703f6a33452"))
     (package
       (name "ioquake3")
-      (version (git-version "1.3.6" "1" commit))
+      (version (git-version "1.3.6" revision commit))
       (source
        (origin
          (method git-fetch)
@@ -2148,48 +2149,48 @@ of the others")
                (commit commit)))
          (file-name (git-file-name name version))
          (sha256
-          (base32
-           "1vflk028z9gccg5yfi5451y1k5wxjdh3qbhjf4x6r7w2pzlxh16z"))))
+          (base32 "0fqq2qpnrgpgf3gs71wvxlkcihxcrvhvllh88ii4ip134c1qbs9q"))))
       (build-system gnu-build-system)
       (inputs
-       `(("sdl2" ,sdl2)
-         ("libjpeg" ,libjpeg-turbo)
-         ("openal" ,openal)
-         ("curl" ,curl)
-         ("opusfile" ,opusfile)
-         ("opus" ,opus)
-         ("libvorbis" ,libvorbis)
-         ("freetype" ,freetype)
-         ("libogg" ,libogg)))
+       (list curl
+             freetype
+             libjpeg-turbo
+             libogg
+             libvorbis
+             openal
+             opus
+             opusfile
+             sdl2))
       (native-inputs
-       (list which ; Else SDL_version.h won't be found.
+       (list which                      ; else SDL_version.h won't be found.
              pkg-config))
       (arguments
-       '(#:tests? #f                    ; No tests.
-         #:make-flags '("CC=gcc"
-                        "USE_INTERNAL_LIBS=0"
-                        "USE_FREETYPE=1"
-                        "USE_RENDERER_DLOPEN=0"
-                        "USE_OPENAL_DLOPEN=0"
-                        "USE_CURL_DLOPEN=0")
-         #:phases
-         (modify-phases %standard-phases
-           (delete 'configure)
-           (replace 'install
-             (lambda* (#:key outputs #:allow-other-keys)
-               (invoke "make" "copyfiles" "CC=gcc"
-                        "USE_INTERNAL_LIBS=0"
+       (list
+        #:tests? #f                     ; no tests
+        #:make-flags
+        #~(list (string-append "CC=" #$(cc-for-target))
+                "USE_INTERNAL_LIBS=0"
+                "USE_FREETYPE=1"
+                "USE_RENDERER_DLOPEN=0"
+                "USE_OPENAL_DLOPEN=0"
+                "USE_CURL_DLOPEN=0")
+        #:phases
+        #~(modify-phases %standard-phases
+            (delete 'configure)         ; no configure-script
+            (replace 'install
+              (lambda* (#:key make-flags outputs #:allow-other-keys)
+                (apply invoke "make" "copyfiles"
                        (string-append "COPYDIR="
                                       (assoc-ref outputs "out")
-                                      "/bin")))))))
+                                      "/bin")
+                       make-flags))))))
       (home-page "https://ioquake3.org/")
       (synopsis "FPS game engine based on Quake 3")
       (description "ioquake3 is a free software first person shooter engine
 based on the Quake 3: Arena and Quake 3: Team Arena source code.  Compared to
 the original, ioquake3 has been cleaned up, bugs have been fixed and features
-added.  The permanent goal is to create the open source Quake 3 distribution
-upon which people base their games, ports to new platforms, and other
-projects.")
+added.  The permanent goal is to create a Quake 3 distribution upon which
+people base their games, ports to new platforms, and other projects.")
       (license license:gpl2))))
 
 (define-public instead
@@ -2651,7 +2652,7 @@ game engine.  id Tech 2 is the engine originally behind Quake 2.")
 (define-public dhewm3
   (package
     (name "dhewm3")
-    (version "1.5.1")
+    (version "1.5.2")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -2659,7 +2660,7 @@ game engine.  id Tech 2 is the engine originally behind Quake 2.")
                     version "/dhewm3-" version "-src.tar.xz"))
               (sha256
                (base32
-                "0s2brx6wyljhjbpli97iy4lc4fqqsvdc09raz8njg0vgzcsiyrri"))))
+                "10p0w1x5wx9b7d8mzvb6yqjia9prhkjwz04vbvphy8p383r33am6"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f                      ; No tests.
@@ -2667,17 +2668,13 @@ game engine.  id Tech 2 is the engine originally behind Quake 2.")
        (modify-phases %standard-phases
          (add-after 'unpack 'change-to-build-dir
            (lambda _
-             (chdir "neo")
-             #t)))))
+             (chdir "neo"))))))
     (inputs
-     `(("curl" ,curl)
-       ("libjpeg" ,libjpeg-turbo)
-       ("libogg" ,libogg)
-       ("libvorbis" ,libvorbis)
-       ("libx11" ,libx11)
-       ("openal" ,openal)
-       ("sdl2" ,sdl2)
-       ("zlib" ,zlib)))
+     (list curl
+           libx11
+           openal
+           sdl2
+           zlib))
     (home-page "https://dhewm3.org/")
     (synopsis "Port of the original Doom 3 engine")
     (description
@@ -2810,8 +2807,6 @@ construction toolset for games.
 @item It is automatic, which means that you can throw any level geometry
       at it and you will get robust mesh out.
 @item It is fast which means swift turnaround times for level designers.
-@item It is open source so it comes with full source and you can
-      customize it to your heart's content.
 @end itemize
 
 The Recast process starts with constructing a voxel mold from a level
diff --git a/gnu/packages/games.scm b/gnu/packages/games.scm
index 99eccca04d..aa2e4e04b0 100644
--- a/gnu/packages/games.scm
+++ b/gnu/packages/games.scm
@@ -10,7 +10,7 @@
 ;;; Copyright © 2014, 2015, 2019 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015, 2016 Andreas Enge <andreas@enge.fr>
 ;;; Copyright © 2015 David Hashe <david.hashe@dhashe.com>
-;;; Copyright © 2015, 2017, 2018, 2021 Chris Lemmer Webber <cwebber@dustycloud.org>
+;;; Copyright © 2015, 2017, 2018, 2021 Christine Lemmer-Webber <cwebber@dustycloud.org>
 ;;; Copyright © 2015, 2016, 2017, 2018, 2019, 2021 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2015, 2016, 2017 Alex Kost <alezost@gmail.com>
 ;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
@@ -4163,7 +4163,7 @@ falling, themeable graphics and sounds, and replays.")
 (define-public wesnoth
   (package
     (name "wesnoth")
-    (version "1.16.1")
+    (version "1.16.5")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://sourceforge/wesnoth/wesnoth-"
@@ -4172,7 +4172,7 @@ falling, themeable graphics and sounds, and replays.")
                                   "wesnoth-" version ".tar.bz2"))
               (sha256
                (base32
-                "0cyrwmdg93pqpdm7030540jznaky9rda355i9ym8am4k9civlcwf"))))
+                "02pzijbmkgcb8hc4l3f4r3r3mxqda936dp488i9sd9d4m3xdzimh"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f))                    ;no check target
@@ -6515,14 +6515,16 @@ fish.  The whole game is accompanied by quiet, comforting music.")
 (define-public crawl
   (package
     (name "crawl")
-    (version "0.28.0")
+    (version "0.29.0")
     (source
      (origin
-       (method url-fetch)
-       (uri (string-append "https://github.com/crawl/crawl/releases/download/"
-                           version "/stone_soup-" version "-nodeps.tar.xz"))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/crawl/crawl")
+             (commit version)))
+       (file-name (git-file-name name version))
        (sha256
-        (base32 "0irg5w4m127fxcj037kyp9vnyqyq1fi4q64rn6yq92w8z1lf2sss"))
+        (base32 "0cx67ln5qr4bawidi48ss63wflx7x22901da683c9wvy6m41vks8"))
        (patches (search-patches "crawl-upgrade-saves.patch"))))
     (build-system gnu-build-system)
     (inputs
@@ -6552,24 +6554,30 @@ fish.  The whole game is accompanied by quiet, comforting music.")
               "BUILD_LUA="
               "BUILD_SQLITE="
               "BUILD_ZLIB="
-              "-Csource")
+              "-Ccrawl-ref/source")
       #:phases
       #~(modify-phases %standard-phases
+          (add-after 'unpack 'set-version
+            (lambda _
+              (call-with-output-file "crawl-ref/source/util/release_ver"
+                (lambda (port)
+                  (display #$version port)))))
           (add-after 'unpack 'find-SDL-image
             (lambda _
-              (substitute* "source/windowmanager-sdl.cc"
+              (substitute* "crawl-ref/source/windowmanager-sdl.cc"
                 (("SDL_image.h") "SDL2/SDL_image.h"))))
           (delete 'configure)
           (replace 'check
-            (lambda* (#:key make-flags #:allow-other-keys)
-              (setenv "HOME" (getcwd))
-              ;; Fake a terminal for the test cases.
-              (setenv "TERM" "xterm-256color")
-              ;; Run the tests that don't require a debug build.
-              (apply invoke "make" "nondebugtest"
-                     (format #f "-j~d" (parallel-job-count))
-                     ;; Force command line build for test cases.
-                     (append make-flags '("GAME=crawl" "TILES="))))))))
+            (lambda* (#:key tests? make-flags #:allow-other-keys)
+              (when tests?
+                (setenv "HOME" (getcwd))
+                ;; Fake a terminal for the test cases.
+                (setenv "TERM" "xterm-256color")
+                ;; Run the tests that don't require a debug build.
+                (apply invoke "make" "nondebugtest"
+                       (format #f "-j~d" (parallel-job-count))
+                       ;; Force command line build for test cases.
+                       (append make-flags '("GAME=crawl" "TILES=")))))))))
     (synopsis "Roguelike dungeon crawler game")
     (description "Dungeon Crawl Stone Soup (also known as \"Crawl\" or DCSS
 for short) is a roguelike adventure through dungeons filled with dangerous
@@ -6728,7 +6736,7 @@ fight against their plot and save his fellow rabbits from slavery.")
            libxcursor
            libxml2
            miniupnpc
-           mozjs
+           mozjs-78
            openal
            sdl2
            wxwidgets
@@ -7759,38 +7767,33 @@ quotation from a collection of quotes.")
 (define xonotic-data
   (package
     (name "xonotic-data")
-    (version "0.8.2")
+    (version "0.8.5")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "http://dl.xonotic.org/xonotic-"
+       (uri (string-append "https://dl.xonotic.org/xonotic-"
                            version ".zip"))
        (file-name (string-append name "-" version ".zip"))
        (sha256
-        (base32
-         "1mcs6l4clvn7ibfq3q69k2p0z6ww75rxvnngamdq5ic6yhq74bx2"))))
+        (base32 "1r9pdrrki7mkdw99zh9m7911fqldsfdnl0nrp5cv1bk2hcism4hg"))))
     (build-system trivial-build-system)
-    (native-inputs
-     `(("unzip" ,unzip)))
+    (native-inputs (list unzip))
     (arguments
-     `(#:modules ((guix build utils))
-       #:builder
-       (begin
-         (use-modules (guix build utils))
-         (let* ((out (assoc-ref %outputs "out"))
-                (xonotic (string-append out "/share/xonotic"))
-                (source (assoc-ref %build-inputs "source"))
-                (unzip (search-input-file %build-inputs "/bin/unzip")))
-           (copy-file source (string-append ,name "-" ,version ".zip"))
-           (invoke unzip (string-append ,name "-" ,version ".zip"))
-           (mkdir-p out)
-           (mkdir-p xonotic)
-           (chdir "Xonotic")
-           (copy-recursively "data"
-                             (string-append xonotic "/data"))
-           (copy-recursively "server"
-                             (string-append xonotic "/server"))
-           (install-file "key_0.d0pk" xonotic)))))
+     (list #:modules '((guix build utils))
+           #:builder
+           #~(begin
+               (use-modules (guix build utils))
+               (let* ((out (assoc-ref %outputs "out"))
+                      (xonotic (string-append out "/share/xonotic"))
+                      (source (assoc-ref %build-inputs "source"))
+                      (unzip (search-input-file %build-inputs "/bin/unzip")))
+                 (invoke unzip source)
+                 (chdir "Xonotic")
+                 (install-file "key_0.d0pk" xonotic)
+                 (copy-recursively "data"
+                                   (string-append xonotic "/data"))
+                 (copy-recursively "server"
+                                   (string-append xonotic "/server"))))))
     (home-page "http://xonotic.org")
     (synopsis "Data files for Xonotic")
     (description
@@ -7801,192 +7804,142 @@ quotation from a collection of quotes.")
 (define-public xonotic
   (package
     (name "xonotic")
-    (version "0.8.2")
+    (version "0.8.5")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "http://dl.xonotic.org/xonotic-"
+       (uri (string-append "https://dl.xonotic.org/xonotic-"
                            version "-source.zip"))
        (file-name (string-append name "-" version ".zip"))
        (sha256
-        (base32
-         "0axxw04fyz6jlfqd0kp7hdrqa0li31sx1pbipf2j5qp9wvqicsay"))))
+        (base32 "0pgahai0gk8bjmvkwx948bl50l9f9dhmjzwffl4vyldibajipa51"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:configure-flags (list (string-append "--prefix="
-                                              (assoc-ref %outputs "out"))
-                               "--disable-rijndael")
-       #:phases
-       (modify-phases %standard-phases
-         (add-before 'configure 'make-darkplaces
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out"))
-                    (sharedir (string-append out "/share/xonotic/")))
-               (invoke "make" "-C" "source/darkplaces"
-                       (string-append "DP_FS_BASEDIR="
-                                      sharedir)
-                       "DP_LINK_TO_LIBJPEG=1"
-                       "DP_SOUND_API=ALSA"
-                       "CC=gcc"
-                       "-f" "makefile"
-                       "cl-release")
-               (invoke "make" "-C" "source/darkplaces"
-                       (string-append "DP_FS_BASEDIR="
-                                      sharedir)
-                       "DP_LINK_TO_LIBJPEG=1"
-                       "DP_SOUND_API=ALSA"
-                       "CC=gcc"
-                       "-f" "makefile"
-                       "sdl-release")
-               (invoke "make" "-C" "source/darkplaces"
-                       (string-append "DP_FS_BASEDIR="
-                                      sharedir)
-                       "DP_LINK_TO_LIBJPEG=1"
-                       "DP_SOUND_API=ALSA"
-                       "CC=gcc"
-                       "-f" "makefile"
-                       "sv-release"))))
-         (add-before 'configure 'bootstrap
-           (lambda _
-             (chdir "source/d0_blind_id")
-             (invoke "sh" "autogen.sh")))
-         (add-after 'build 'install-desktop-entry
-           (lambda* (#:key outputs #:allow-other-keys)
-             ;; Add .desktop files for the 2 variants and the symlink
-             (let* ((output (assoc-ref outputs "out"))
-                    (apps (string-append output "/share/applications")))
-               (mkdir-p apps)
-               (with-output-to-file
-                   (string-append apps "/xonotic-glx.desktop")
-                 (lambda _
-                   (format #t
-                           "[Desktop Entry]~@
-                     Name=xonotic-glx~@
-                     Comment=Xonotic glx~@
-                     Exec=~a/bin/xonotic-glx~@
-                     TryExec=~@*~a/bin/xonotic-glx~@
-                     Icon=xonotic~@
-                     Categories=Game~@
-                     Type=Application~%"
-                           output)))
-               (with-output-to-file
-                   (string-append apps "/xonotic-sdl.desktop")
-                 (lambda _
-                   (format #t
-                           "[Desktop Entry]~@
-                     Name=xonotic-sdl~@
-                     Comment=Xonotic sdl~@
-                     Exec=~a/bin/xonotic-sdl~@
-                     TryExec=~@*~a/bin/xonotic-sdl~@
-                     Icon=xonotic~@
-                     Categories=Game~@
-                     Type=Application~%"
-                           output)))
-               (with-output-to-file
-                   (string-append apps "/xonotic.desktop")
+     (list #:configure-flags
+           #~(list (string-append "--prefix=" #$output)
+                   "--disable-rijndael")
+           #:modules '((guix build gnu-build-system)
+                       (guix build utils)
+                       (srfi srfi-26))
+           #:phases
+           #~(modify-phases %standard-phases
+               (add-before 'configure 'build-darkplaces
+                 (lambda* (#:key make-flags parallel-build? outputs
+                           #:allow-other-keys)
+                   (let* ((out (assoc-ref outputs "out"))
+                          (share (string-append out "/share/xonotic/")))
+                     (apply invoke "make"
+                            "-C" "source/darkplaces"
+                            "-f" "makefile"
+                            "-j" (if parallel-build?
+                                     (number->string (parallel-job-count))
+                                     "1")
+                            (string-append "CC=" #$(cc-for-target))
+                            (string-append "DP_FS_BASEDIR=" share)
+                            "DP_LINK_TO_LIBJPEG=1"
+                            "DP_SOUND_API=ALSA"
+                            "cl-release"
+                            "sdl-release"
+                            "sv-release"
+                            make-flags))))
+               (add-before 'configure 'preconfigure
                  (lambda _
-                   (format #t
-                           "[Desktop Entry]~@
-                     Name=xonotic~@
-                     Comment=Xonotic~@
-                     Exec=~a/bin/xonotic-glx~@
-                     TryExec=~@*~a/bin/xonotic~@
-                     Icon=xonotic~@
-                     Categories=Game~@
-                     Type=Application~%"
-                           output)))
-               #t)))
-         (add-after 'install-desktop-entry 'install-icons
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out")))
-               (with-directory-excursion "../../misc/logos/icons_png/"
-                 (for-each
-                  (lambda (file)
-                    (let* ((size (string-filter char-numeric? file))
-                           (icons (string-append out "/share/icons/hicolor/"
-                                                 size "x" size "/apps")))
-                      (mkdir-p icons)
-                      (copy-file file (string-append icons "/xonotic.png"))))
-                  '("xonotic_16.png" "xonotic_22.png" "xonotic_24.png"
-                    "xonotic_32.png" "xonotic_48.png" "xonotic_64.png"
-                    "xonotic_128.png" "xonotic_256.png" "xonotic_512.png"))))))
-         (add-after 'install-icons 'install-binaries
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out")))
-               (define (install src dst)
-                 (let ((dst (string-append out dst)))
-                   (mkdir-p (dirname dst))
-                   (copy-file src dst)))
-               (mkdir-p (string-append out "/bin"))
-               (install "../darkplaces/darkplaces-dedicated"
-                        "/bin/xonotic-dedicated")
-               (install "../darkplaces/darkplaces-glx"
-                        "/bin/xonotic-glx")
-               (install "../darkplaces/darkplaces-sdl"
-                        "/bin/xonotic-sdl")
-               ;; Provide a default xonotic executable, defaulting to SDL.
-               (symlink (string-append out "/bin/xonotic-sdl")
-                        (string-append out "/bin/xonotic"))
-               #t)))
-         (add-after 'install-binaries 'install-data
-           (lambda* (#:key outputs inputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out"))
-                    (data (assoc-ref inputs "xonotic-data")))
-               (symlink (string-append data "/share/xonotic")
-                        (string-append out "/share/xonotic"))
-               #t)))
-         (add-after 'install-binaries 'wrap-binaries
-           (lambda* (#:key outputs inputs #:allow-other-keys)
-             ;; Curl and libvorbis need to be wrapped so that we get
-             ;; sound and networking.
-             (let* ((out (assoc-ref outputs "out"))
-                    (bin (string-append out "/bin/xonotic"))
-                    (bin-sdl (string-append out "/bin/xonotic-sdl"))
-                    (bin-glx (string-append out "/bin/xonotic-glx"))
-                    (bin-dedicated (string-append out "/bin/xonotic-dedicated"))
-                    (curl (assoc-ref inputs "curl"))
-                    (vorbis (assoc-ref inputs "libvorbis")))
-               (wrap-program bin
-                 `("LD_LIBRARY_PATH" ":" prefix
-                   (,(string-append curl "/lib:" vorbis "/lib"))))
-               (wrap-program bin-sdl
-                 `("LD_LIBRARY_PATH" ":" prefix
-                   (,(string-append curl "/lib:" vorbis "/lib"))))
-               (wrap-program bin-glx
-                 `("LD_LIBRARY_PATH" ":" prefix
-                   (,(string-append curl "/lib:" vorbis "/lib"))))
-               (wrap-program bin-dedicated
-                 `("LD_LIBRARY_PATH" ":" prefix
-                   (,(string-append curl "/lib:" vorbis "/lib"))))
-               #t))))))
-    (inputs
-     `(("xonotic-data" ,xonotic-data)
-       ("alsa-lib" ,alsa-lib)
-       ("curl" ,curl)
-       ("libjpeg" ,libjpeg-turbo)
-       ("libmodplug" ,libmodplug)
-       ("libvorbis" ,libvorbis)
-       ("libogg" ,libogg)
-       ("libxpm" ,libxpm)
-       ("libxxf86dga" ,libxxf86dga)
-       ("libxxf86vm" ,libxxf86vm)
-       ("libx11" ,libx11)
-       ("libxext" ,libxext)
-       ("libxau" ,libxau)
-       ("libxdmcp" ,libxdmcp)
-       ("mesa" ,mesa)
-       ("glu" ,glu)
-       ("freetype" ,freetype)
-       ("sdl2" ,sdl2)
-       ("libpng" ,libpng)
-       ("hicolor-icon-theme" ,hicolor-icon-theme)))
-    (native-inputs
-     (list unzip
-           autoconf
+                   (chdir "source/d0_blind_id")
+                   (invoke "sh" "autogen.sh")))
+               (add-after 'install 'symlink-data
+                 (lambda* (#:key outputs inputs #:allow-other-keys)
+                   (let* ((out (assoc-ref outputs "out"))
+                          (data (assoc-ref inputs "xonotic-data")))
+                     (symlink (string-append data "/share/xonotic")
+                              (string-append out "/share/xonotic")))))
+               (add-after 'install 'install-desktop-entries
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let* ((out (assoc-ref outputs "out"))
+                          (app (string-append out "/share/applications")))
+                     ;; Add .desktop files for the 2 variants and the symlink.
+                     (for-each
+                      (lambda (variant)
+                        (let* ((file (if variant
+                                         (format #f "xonotic-~(~a~)" variant)
+                                         "xonotic"))
+                               (name (if variant
+                                         (format #f "Xonotic (~a)" variant)
+                                         "Xonotic"))
+                               (exec (string-append out "/bin/" file)))
+                          (make-desktop-entry-file
+                           (string-append app "/" file ".desktop")
+                           #:name name
+                           #:comment `((#f #$(package-synopsis this-package)))
+                           #:exec exec
+                           #:try-exec exec
+                           #:icon "xonotic"
+                           #:categories '("Game"))))
+                      (list #f "GLX" "SDL")))))
+               (add-after 'install 'install-icons
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let ((out (assoc-ref outputs "out")))
+                     (for-each
+                      (lambda (file)
+                        (let* ((size (string-filter char-numeric? file))
+                               (icons (string-append out "/share/icons/hicolor/"
+                                                     size "x" size "/apps")))
+                          (mkdir-p icons)
+                          (copy-file file (string-append icons "/xonotic.png"))))
+                      (find-files "../../misc/logos/icons_png"
+                                  "^xonotic_[0-9]+\\.png$")))))
+               (add-after 'install 'install-binaries
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let* ((out (assoc-ref outputs "out"))
+                          (bin (string-append out "/bin")))
+                     (for-each
+                      (lambda (variant)
+                        (copy-file
+                         (string-append "../darkplaces/darkplaces-" variant)
+                         (string-append bin "/xonotic-" variant)))
+                      (list "dedicated" "glx" "sdl")))))
+               (add-after 'install-binaries 'wrap-binaries
+                 (lambda* (#:key outputs inputs #:allow-other-keys)
+                   ;; All games must be wrapped to get sound and networking.
+                   (let* ((out (assoc-ref outputs "out"))
+                          (bin (string-append out "/bin"))
+                          (curl (assoc-ref inputs "curl"))
+                          (vorbis (assoc-ref inputs "libvorbis")))
+                     (for-each (cut wrap-program <>
+                                    `("LD_LIBRARY_PATH" ":" prefix
+                                      (,(string-append curl "/lib:"
+                                                       vorbis "/lib"))))
+                               (find-files bin "^xonotic"))
+
+                     ;; Provide a default xonotic executable, defaulting to SDL.
+                     (symlink "xonotic-sdl" (string-append bin "/xonotic"))))))))
+    (native-inputs
+     (list autoconf
            automake
-           pkg-config
+           gmp
            libtool
-           gmp))
+           pkg-config
+           unzip))
+    (inputs
+     (list alsa-lib
+           curl
+           libjpeg-turbo
+           libmodplug
+           libvorbis
+           libogg
+           libpng
+           libx11
+           libxpm
+           libxxf86dga
+           libxxf86vm
+           libxext
+           libxau
+           libxdmcp
+           mesa
+           glu
+           freetype
+           sdl2
+           hicolor-icon-theme
+           xonotic-data))
     (home-page "https://xonotic.org")
     (synopsis "Fast-paced first-person shooter game")
     (description
@@ -8772,15 +8725,14 @@ game field is extended to 4D space, which has to filled up by the gamer with
 (define-public arx-libertatis
   (package
     (name "arx-libertatis")
-    (version "1.2")
+    (version "1.2.1")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "http://arx-libertatis.org/files/arx-libertatis-"
                            version ".tar.xz"))
        (sha256
-        (base32
-         "035dflxffa98bxmxkrqfizmhvnr09wyhhmzaqxk92772qil7gkxs"))))
+        (base32 "1pxf86sgwvy3785sq2wb4jvz6bdxm81ilrxd8xv7s61dxqqqizda"))))
     (build-system cmake-build-system)
     (outputs '("out" "installer"))
     (arguments
diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm
index a957ae3480..b6854813d7 100644
--- a/gnu/packages/gcc.scm
+++ b/gnu/packages/gcc.scm
@@ -702,14 +702,14 @@ It also includes runtime support libraries for these languages.")
   (package
     (inherit gcc-11)
     ;; Note: 'compiler-cpu-architectures' is unchanged compared to GCC 11.
-    (version "12.1.0")
+    (version "12.2.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnu/gcc/gcc-"
                                   version "/gcc-" version ".tar.xz"))
               (sha256
                (base32
-                "0ywws66myjxcwsmla721g35d2ymlckq6ii7j9av0477ki5467zb2"))
+                "1zrhca90c7hqnjz3jgr1vl675q3h5lrd92b5ggi00jjryffcyjg5"))
               (patches (search-patches "gcc-12-strmov-store-file-names.patch"
                                        "gcc-5.0-libvtv-runpath.patch"))
               (modules '((guix build utils)))
diff --git a/gnu/packages/geo.scm b/gnu/packages/geo.scm
index fe2174b106..66c97d3d6a 100644
--- a/gnu/packages/geo.scm
+++ b/gnu/packages/geo.scm
@@ -17,7 +17,7 @@
 ;;; Copyright © 2021 Sharlatan Hellseher <sharlatanus@gmail.com>
 ;;; Copyright © 2021 Vinicius Monego <monego@posteo.net>
 ;;; Copyright © 2021 Clément Lassieur <clement@lassieur.org>
-;;; Copyright © 2021 Nikolay Korotkiy <sikmir@disroot.org>
+;;; Copyright © 2021, 2022 Nikolay Korotkiy <sikmir@disroot.org>
 ;;; Copyright © 2022 Roman Scherer <roman.scherer@burningswell.com>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -100,6 +100,7 @@
   #:use-module (gnu packages perl)
   #:use-module (gnu packages photo)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages pretty-print)
   #:use-module (gnu packages protobuf)
   #:use-module (gnu packages pulseaudio)
   #:use-module (gnu packages python)
@@ -216,7 +217,7 @@ OpenStreetMap written in C using eXpat, Cairo and GLib.")
 (define-public geos
   (package
     (name "geos")
-    (version "3.10.2")
+    (version "3.11.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://download.osgeo.org/geos/geos-"
@@ -224,7 +225,7 @@ OpenStreetMap written in C using eXpat, Cairo and GLib.")
                                   ".tar.bz2"))
               (sha256
                (base32
-                "05apyh6dvv15fax4xvxa0kr622h4y08w9p3274mlqsrqmjcwbfsh"))))
+                "12l59pxawyizmc4wn20dvjn7aifqwkim4ysmc78h91mayjmqravr"))))
     (build-system cmake-build-system)
     (arguments `(#:phases
                  (modify-phases %standard-phases
@@ -940,7 +941,7 @@ development.")
 (define-public gdal
   (package
     (name "gdal")
-    (version "3.5.0")
+    (version "3.5.1")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -948,7 +949,7 @@ development.")
                      version ".tar.gz"))
               (sha256
                (base32
-                "0h7dgjx8nk3dd17wwqm2yjnaqciyrd2mz9gcjswpcnmap09wbzrs"))
+                "1l93q7xf6qx9ck5axfkf3ygmvclxkvrjd8x00ckn7j0d0750ci3w"))
               (modules '((guix build utils)))
               (snippet
                 `(begin
@@ -1322,7 +1323,7 @@ based on the Osmium library.")
 (define-public osm2pgsql
   (package
     (name "osm2pgsql")
-    (version "1.5.1")
+    (version "1.7.0")
     (source
      (origin
        (method git-fetch)
@@ -1331,32 +1332,30 @@ based on the Osmium library.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0i18mskcs087dn3f3h9n7j0wafn8502m0h13mrjwin38xsz0crfj"))
+        (base32 "15fxr4xq7siy237763l7nswx7v0swr3qzs2h3zkjzgvajw4p6qii"))
        (modules '((guix build utils)))
        (snippet
-        '(begin
-           (delete-file-recursively "contrib/protozero")
-           (delete-file-recursively "contrib/libosmium")
-           #t))))
+        ;; Remove bundled libraries.
+        '(delete-file-recursively "contrib"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f; tests fail because we need to setup a database
        #:configure-flags
-       (list (string-append "-DOSMIUM_INCLUDE_DIR="
-                            (assoc-ref %build-inputs "libosmium")
-                            "/include")
-             (string-append "-DPROTOZERO_INCLUDE_DIR="
-                            (assoc-ref %build-inputs "protozero")
-                            "/include"))))
+       (list "-DEXTERNAL_LIBOSMIUM=ON"
+             "-DEXTERNAL_PROTOZERO=ON"
+             "-DEXTERNAL_FMT=ON"
+             "-DEXTERNAL_RAPIDJSON=ON")))
     (inputs
      (list boost
            bzip2
            expat
+           fmt
            libosmium
            lua
            postgresql
            proj
            protozero
+           rapidjson
            zlib))
     (native-inputs
      (list python python-psycopg2))
@@ -1828,7 +1827,7 @@ ways, and relations) and their metadata tags.")
 (define-public libmaxminddb
   (package
     (name "libmaxminddb")
-    (version "1.4.3")
+    (version "1.6.0")
     (source
      (origin
        (method url-fetch)
@@ -1836,7 +1835,7 @@ ways, and relations) and their metadata tags.")
                            "/releases/download/" version "/"
                            "/libmaxminddb-" version ".tar.gz"))
        (sha256
-        (base32 "0fd4a4sxiiwzbd5h74wl1ijnb7xybjyybb7q41vdq3w8nk3zdzd5"))))
+        (base32 "0rw2z7rx8jzgdcgqlmc4wqrsjmiwd8vm5wvvrldy472rghcaq83n"))))
     (build-system gnu-build-system)
     (arguments
      `(#:make-flags
@@ -1855,14 +1854,14 @@ associated with an address.")
 (define-public python-maxminddb
   (package
     (name "python-maxminddb")
-    (version "1.5.1")
+    (version "2.2.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "maxminddb" version))
        (sha256
         (base32
-         "0y9giw81k4wdmpryr4k42w50z292mf364a6vs1vxf83ksc9ig6j4"))))
+         "1rc4a403r3b4vhmhb03gidd0fmsbvfpbf3qfcw25h4db9zn0fxz3"))))
     (build-system python-build-system)
     (arguments
      `(#:tests? #f)) ;; Tests require a copy of the maxmind database
diff --git a/gnu/packages/gnome-xyz.scm b/gnu/packages/gnome-xyz.scm
index c37ae27cc5..beab5429bf 100644
--- a/gnu/packages/gnome-xyz.scm
+++ b/gnu/packages/gnome-xyz.scm
@@ -18,6 +18,7 @@
 ;;; Copyright © 2021 Charles Jackson <charles.b.jackson@protonmail.com>
 ;;; Copyright © 2022 Eric Bavier <bavier@posteo.net>
 ;;; Copyright © 2022 Sughosha <sughosha@proton.me>
+;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1137,7 +1138,7 @@ like GNOME, Unity, Budgie, Pantheon, XFCE, Mate, etc.")
     (native-inputs
      (list gtk+
            `(,glib "bin") ; for "glib-compile-resources"
-           librsvg
+           (librsvg-for-system)
            pkg-config
            ruby-sass
            sassc))
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index 017a230721..8199a8af29 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -4904,7 +4904,7 @@ and the GLib main loop, to integrate well with GNOME applications.")
 (define-public libsecret
   (package
     (name "libsecret")
-    (version "0.20.4")
+    (version "0.20.5")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -4913,28 +4913,47 @@ and the GLib main loop, to integrate well with GNOME applications.")
                     "libsecret-" version ".tar.xz"))
               (sha256
                (base32
-                "0a4xnfmraxchd9cq5ai66j12jv2vrgjmaaxz25kl031jvda4qnij"))))
-    (build-system gnu-build-system)
-    (outputs '("out" "doc"))
+                "0k9bs47rzb3dwvznb4179d6nw7rbzjdyd4y8hx6vazfd1wscxcrz"))))
+    (build-system meson-build-system)
     (arguments
-     `(#:tests? #f ; FIXME: Testing hangs.
-       #:configure-flags
-       (list (string-append "--with-html-dir="
-                            (assoc-ref %outputs "doc")
-                            "/share/gtk-doc/html"))))
+     (list
+      #:configure-flags
+      #~(list "-Dgtk_doc=false")        ;requires gi-docgen
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'disable-problematic-tests
+            (lambda _
+              (substitute* "libsecret/meson.build"
+                ;; The test-collection test fails non-deterministically (see:
+                ;; https://gitlab.gnome.org/GNOME/libsecret/-/issues/80).
+                ((".*'test-collection',.*") ""))))
+          (delete 'check)
+          (add-after 'install 'check
+            (lambda* (#:key tests? test-options #:allow-other-keys)
+              (when tests?
+                (setenv "HOME" "/tmp")
+                (setenv "XDG_DATA_DIRS" ;for /org/freedesktop/secrets/collection
+                        (string-append #$output "/share:"
+                                       (getenv "XDG_DATA_DIRS")))
+                (apply invoke "dbus-run-session" "--"
+                       "meson" "test" "--print-errorlogs" "-t" "0"
+                       test-options)))))))
     (native-inputs
-     `(("gettext" ,gettext-minimal)
-       ("glib:bin" ,glib "bin") ; for gdbus-codegen, etc.
-       ("gobject-introspection" ,gobject-introspection)
-       ("pkg-config" ,pkg-config)
-       ("vala" ,vala)
-       ("xsltproc" ,libxslt)))
+     (list dbus
+           docbook-xml-4.2
+           docbook-xsl
+           gettext-minimal
+           `(,glib "bin")               ;for gdbus-codegen, etc.
+           gobject-introspection
+           libxml2                      ;for XML_CATALOG_FILES
+           libxslt
+           pkg-config
+           python
+           python-dbus
+           python-pygobject
+           vala))
     (propagated-inputs
-     (list glib)) ; required by libsecret-1.pc
-    (inputs
-     ;; The ‘build’ phase complains about missing docbook-xml-4.2 but adding it
-     ;; doesn't seem to affect the build result.
-     (list docbook-xsl libgcrypt libxml2)) ; for XML_CATALOG_FILES
+     (list glib libgcrypt))             ;required by libsecret-1.pc
     (home-page "https://wiki.gnome.org/Projects/Libsecret/")
     (synopsis "GObject bindings for \"Secret Service\" API")
     (description
@@ -7130,7 +7149,7 @@ configuration program to choose applications starting on login.")
 (define-public gjs
   (package
     (name "gjs")
-    (version "1.70.0")
+    (version "1.72.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://gnome/sources/" name "/"
@@ -7138,7 +7157,7 @@ configuration program to choose applications starting on login.")
                                   name "-" version ".tar.xz"))
               (sha256
                (base32
-                "0pqwhq0znprs0h5ixz396912acwzk9zvjfhi9qvh52ii38s2j1jb"))
+                "0xrrv9lsi087yb9yf146a1aarf5yh6rf4jw9blx30zasvjdkgvnx"))
               (modules '((guix build utils)))
               (snippet
                '(begin
@@ -7147,10 +7166,7 @@ configuration program to choose applications starting on login.")
                     (("☭") ""))))))
     (build-system meson-build-system)
     (arguments
-     ;; Use meson-0.59, otherwise we'd get "ERROR: "install_dir" must be
-     ;; specified when installing a target".
-     `(#:meson ,meson-0.59
-       #:configure-flags '("-Dinstalled_tests=false")
+     '(#:configure-flags '("-Dinstalled_tests=false")
        #:phases
        (modify-phases %standard-phases
          (add-before 'check 'pre-check
@@ -7162,17 +7178,17 @@ configuration program to choose applications starting on login.")
              ;; For the missing /etc/machine-id.
              (setenv "DBUS_FATAL_WARNINGS" "0"))))))
     (native-inputs
-     `(("glib:bin" ,glib "bin")       ; for glib-compile-resources
-       ("pkg-config" ,pkg-config)
-       ("xmllint" ,libxml2)
-       ;; For testing
-       ("dbus-launch" ,dbus)
-       ("dconf" ,dconf) ; required to properly store settings
-       ("uuidgen" ,util-linux)
-       ("xvfb" ,xorg-server-for-tests)))
+     (list `(,glib "bin")               ;for glib-compile-resources
+           pkg-config
+           libxml2
+           ;; For testing
+           dbus
+           dconf                        ;required to properly store settings
+           util-linux
+           xorg-server-for-tests))
     (propagated-inputs
      ;; These are all in the Requires.private field of gjs-1.0.pc.
-     (list cairo gobject-introspection mozjs))
+     (list cairo gobject-introspection mozjs-91))
     (inputs
      (list gtk+ readline))
     (synopsis "Javascript bindings for GNOME")
diff --git a/gnu/packages/gnuzilla.scm b/gnu/packages/gnuzilla.scm
index faebb2c349..c4239d769f 100644
--- a/gnu/packages/gnuzilla.scm
+++ b/gnu/packages/gnuzilla.scm
@@ -14,7 +14,7 @@
 ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net>
 ;;; Copyright © 2019, 2020 Adrian Malacoda <malacoda@monarch-pass.net>
 ;;; Copyright © 2020, 2021, 2022 Jonathan Brielmaier <jonathan.brielmaier@web.de>
-;;; Copyright © 2020 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2020, 2022 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2021 Brice Waegeneire <brice@waegenei.re>
 ;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;; Copyright © 2021, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
@@ -97,16 +97,16 @@
 (define-public mozjs
   (package
     (name "mozjs")
-    (version "78.15.0")
+    (version "102.2.0")
     (source (origin
               (method url-fetch)
               ;; TODO: Switch to IceCat source once available on ftp.gnu.org.
-              (uri (string-append "https://archive.mozilla.org/pub/firefox"
+              (uri (string-append "https://ftp.mozilla.org/pub/firefox"
                                   "/releases/" version "esr/source/firefox-"
                                   version "esr.source.tar.xz"))
               (sha256
                (base32
-                "0l91cxdc5v9fps79ckb1kid4gw6v5qng1jd9zvaacwaiv628shx4"))))
+                "1zwpgis7py1bf8p88pz3mpai6a02qrdb8ww2fa9kxxdl9b8r2k81"))))
     (build-system gnu-build-system)
     (arguments
      (list
@@ -148,7 +148,7 @@
                 (for-each generate-all-checksums
                           '("js" "third_party/rust")))))
           (replace 'configure
-            (lambda* (#:key inputs configure-flags #:allow-other-keys)
+            (lambda* (#:key configure-flags #:allow-other-keys)
               ;; The configure script does not accept environment variables as
               ;; arguments.  It also must be run from a different directory,
               ;; but not the root directory either.
@@ -157,43 +157,11 @@
               (setenv "SHELL" (which "sh"))
               (setenv "CONFIG_SHELL" (which "sh"))
               (setenv "AUTOCONF" (which "autoconf"))
-              (apply invoke "../js/src/configure"
-                     (cons (string-append "--prefix=" #$output)
-                           configure-flags))))
-          (add-after 'unpack 'adjust-for-icu-68
-            (lambda _
-              (with-directory-excursion "js/src/tests"
-                ;; The test suite expects a lightly patched ICU 67.  Since
-                ;; Guix is about to switch to ICU 68, massage the tests to
-                ;; work with that instead of patching ICU.  Try removing this
-                ;; phase for newer versions of mozjs.
-
-                ;; These tests look up locale names and expects to get
-                ;; "GB" instead of "UK".
-                (substitute* "non262/Intl/DisplayNames/language.js"
-                  (("Traditionell, GB")
-                   "Traditionell, UK"))
-                (substitute* "non262/Intl/DisplayNames/region.js"
-                  (("\"GB\": \"GB\"")
-                   "\"GB\": \"UK\""))
-
-                ;; XXX: Some localized time formats have changed, and
-                ;; substitution fails for accented characters, even though
-                ;; it works in the REPL(?).  Just delete these for now.
-                (delete-file "non262/Intl/Date/toLocaleString_timeZone.js")
-                (delete-file "non262/Intl/Date/toLocaleDateString_timeZone.js")
-
-                ;; Similarly, these get an unexpected "A" suffix when looking
-                ;; up a time in the "ar-MA-u-ca-islamicc" locale, which is
-                ;; tricky to substitute.
-                (delete-file "non262/Intl/DateTimeFormat/format_timeZone.js")
-                (delete-file "non262/Intl/DateTimeFormat/format.js")
-
-                ;; This file compares a generated list of ICU locale names
-                ;; with actual lookups.  Some have changed slightly, i.e.
-                ;; daf-Latn-ZZ -> daf-Latn-CI, so drop it for simplicity.
-                (delete-file "non262/Intl/Locale/likely-subtags-generated.js"))))
-          (add-before 'check 'pre-check
+              (apply invoke "python" "../configure.py"
+                     "--enable-project=js"
+                     (string-append "--prefix=" #$output)
+                     configure-flags)))
+          (add-before 'check 'adjust-tests
             (lambda _
               (with-directory-excursion "../js/src/tests"
                 (substitute* "shell/os.js"
@@ -201,34 +169,44 @@
                   ((".*killed process should not have exitStatus.*")
                    ""))
 
-                ;; XXX: Delete all tests that test time zone functionality,
-                ;; because the test suite uses /etc/localtime to figure out
-                ;; the offset from the hardware clock, which does not work
-                ;; in the build container.  See <tests/non262/Date/shell.js>.
-                (delete-file-recursively "non262/Date")
-                (delete-file "non262/Intl/DateTimeFormat/tz-environment-variable.js")
+                ;; The test suite expects a lightly patched ICU.  Disable tests
+                ;; that do not work with the system version.  See
+                ;; "intl/icu-patches" for clues.
 
-                (setenv "JSTESTS_EXTRA_ARGS"
-                        (string-join
-                         (list
-                          ;; Do not run tests marked as "random".
-                          "--exclude-random"
-                          ;; Exclude web platform tests.
-                          "--wpt=disabled"
-                          ;; Respect the daemons configured number of jobs.
-                          (string-append "--worker-count="
-                                         (number->string (parallel-job-count))))))))))))
+                ;; See <https://unicode-org.atlassian.net/browse/ICU-20992> and
+                ;; <https://bugzilla.mozilla.org/show_bug.cgi?id=1636984> and
+                ;; related patch for why this is failing.
+                (delete-file "non262/Intl/DateTimeFormat/\
+fractional-second-digits-append-item.js")
+                ;; FIXME: got "0 \u251CAM/PM: noon\u2524", expected "0 (AM/PM: noon)"
+                (delete-file "non262/Intl/DateTimeFormat/day-period-hour-cycle.js")
+                ;; FIXME: got "en-US-posix", expected "en-US-POSIX".
+                (delete-file "non262/Intl/available-locales-supported.js")
+                ;; FIXME: got "en-US", expected "en-US-POSIX"
+                (delete-file "non262/Intl/available-locales-resolved.js"))))
+          (add-before 'check 'pre-check
+            (lambda _
+              (setenv "JSTESTS_EXTRA_ARGS"
+                      (string-join
+                       (list
+                        ;; Do not run tests marked as "random".
+                        "--exclude-random"
+                        ;; Exclude web platform tests.
+                        "--wpt=disabled"
+                        ;; Respect the daemons configured number of jobs.
+                        (string-append "--worker-count="
+                                       (number->string (parallel-job-count)))))))))))
     (native-inputs
-     (list autoconf-2.13
-           automake
+     (list autoconf
            llvm                         ;for llvm-objdump
+           m4
            perl
            pkg-config
-           python-3
+           python-wrapper
            rust
            `(,rust "cargo")))
     (inputs
-     (list icu4c-69 readline zlib))
+     (list icu4c readline zlib))
     (propagated-inputs
      (list nspr))                ; in the Requires.private field of mozjs-*.pc
     (home-page
@@ -238,6 +216,139 @@
 in C/C++.")
     (license license:mpl2.0))) ; and others for some files
 
+(define-public mozjs-91
+  (package
+    (inherit mozjs)
+    (version "91.13.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://ftp.mozilla.org/pub/firefox"
+                                  "/releases/" version "esr/source/firefox-"
+                                  version "esr.source.tar.xz"))
+              (sha256
+               (base32
+                "0qh7j960wdp5zcfqhkj8ki47spp9i9ms12xx0v0kxvmmw36jpgjk"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments mozjs)
+       ((#:phases phases)
+        #~(modify-phases #$phases
+            (add-before 'check 'disable-timezone-tests
+              (lambda _
+                (with-directory-excursion "../js/src/tests"
+                  ;; FIXME: Assertion failed: got "2021a", expected "2021a3"?
+                  (delete-file "non262/Intl/DateTimeFormat/timeZone_version.js")
+                  ;; XXX: Delete all tests that test time zone functionality,
+                  ;; because the test suite uses /etc/localtime to figure out
+                  ;; the offset from the hardware clock, which does not work
+                  ;; in the build container.  See <tests/non262/Date/shell.js>.
+                  (delete-file-recursively "non262/Date")
+                  (delete-file
+                   "non262/Intl/DateTimeFormat/tz-environment-variable.js"))))))))
+    (inputs (modify-inputs (package-inputs mozjs)
+              (replace "icu4c" icu4c-69)))))
+
+(define-public mozjs-78
+  (package
+    (inherit mozjs)
+    (name "mozjs")
+    (version "78.15.0")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://archive.mozilla.org/pub/firefox"
+                                  "/releases/" version "esr/source/firefox-"
+                                  version "esr.source.tar.xz"))
+              (sha256
+               (base32
+                "0l91cxdc5v9fps79ckb1kid4gw6v5qng1jd9zvaacwaiv628shx4"))))
+    (build-system gnu-build-system)
+    (arguments
+     (substitute-keyword-arguments (package-arguments mozjs)
+       ((#:phases phases)
+        #~(modify-phases #$phases
+            (replace 'configure
+              (lambda* (#:key configure-flags #:allow-other-keys)
+                ;; The configure script does not accept environment variables as
+                ;; arguments.  It also must be run from a different directory,
+                ;; but not the root directory either.
+                (mkdir "run-configure-from-here")
+                (chdir "run-configure-from-here")
+                (setenv "SHELL" (which "sh"))
+                (setenv "CONFIG_SHELL" (which "sh"))
+                (setenv "AUTOCONF" (which "autoconf"))
+                (apply invoke "../js/src/configure"
+                       (cons (string-append "--prefix=" #$output)
+                             configure-flags))))
+            (replace 'adjust-tests
+              (lambda _
+                (with-directory-excursion "../js/src/tests"
+                  ;; The test suite expects a lightly patched ICU 67.  Since
+                  ;; Guix is about to switch to ICU 68, massage the tests to
+                  ;; work with that instead of patching ICU.  Try removing this
+                  ;; phase for newer versions of mozjs.
+
+                  ;; These tests look up locale names and expects to get
+                  ;; "GB" instead of "UK".
+                  (substitute* "non262/Intl/DisplayNames/language.js"
+                    (("Traditionell, GB")
+                     "Traditionell, UK"))
+                  (substitute* "non262/Intl/DisplayNames/region.js"
+                    (("\"GB\": \"GB\"")
+                     "\"GB\": \"UK\""))
+
+                  ;; XXX: Some localized time formats have changed, and
+                  ;; substitution fails for accented characters, even though
+                  ;; it works in the REPL(?).  Just delete these for now.
+                  (delete-file "non262/Intl/Date/toLocaleString_timeZone.js")
+                  (delete-file "non262/Intl/Date/toLocaleDateString_timeZone.js")
+
+                  ;; Similarly, these get an unexpected "A" suffix when looking
+                  ;; up a time in the "ar-MA-u-ca-islamicc" locale, which is
+                  ;; tricky to substitute.
+                  (delete-file "non262/Intl/DateTimeFormat/format_timeZone.js")
+                  (delete-file "non262/Intl/DateTimeFormat/format.js")
+
+                  ;; This file compares a generated list of ICU locale names
+                  ;; with actual lookups.  Some have changed slightly, i.e.
+                  ;; daf-Latn-ZZ -> daf-Latn-CI, so drop it for simplicity.
+                  (delete-file "non262/Intl/Locale/likely-subtags-generated.js"))))
+            (replace 'pre-check
+              (lambda _
+                (with-directory-excursion "../js/src/tests"
+                  (substitute* "shell/os.js"
+                    ;; FIXME: Why does the killed process have an exit status?
+                    ((".*killed process should not have exitStatus.*")
+                     ""))
+
+                  ;; XXX: Delete all tests that test time zone functionality,
+                  ;; because the test suite uses /etc/localtime to figure out
+                  ;; the offset from the hardware clock, which does not work
+                  ;; in the build container.  See <tests/non262/Date/shell.js>.
+                  (delete-file-recursively "non262/Date")
+                  (delete-file "non262/Intl/DateTimeFormat/tz-environment-variable.js")
+
+                  (setenv "JSTESTS_EXTRA_ARGS"
+                          (string-join
+                           (list
+                            ;; Do not run tests marked as "random".
+                            "--exclude-random"
+                            ;; Exclude web platform tests.
+                            "--wpt=disabled"
+                            ;; Respect the daemons configured number of jobs.
+                            (string-append "--worker-count="
+                                           (number->string
+                                            (parallel-job-count)))))))))))))
+    (native-inputs
+     (list autoconf-2.13
+           automake
+           llvm                         ;for llvm-objdump
+           perl
+           pkg-config
+           python-3
+           rust
+           `(,rust "cargo")))
+    (inputs
+     (list icu4c-69 readline zlib))))
+
 (define mozilla-compare-locales
   (origin
     (method hg-fetch)
@@ -367,8 +478,8 @@ in C/C++.")
 ;; XXXX: Workaround 'snippet' limitations.
 (define computed-origin-method (@@ (guix packages) computed-origin-method))
 
-(define %icecat-version "91.12.0-guix0-preview1")
-(define %icecat-build-id "20220726000000") ;must be of the form YYYYMMDDhhmmss
+(define %icecat-version "91.13.0-guix0-preview1")
+(define %icecat-build-id "20220823000000") ;must be of the form YYYYMMDDhhmmss
 
 ;; 'icecat-source' is a "computed" origin that generates an IceCat tarball
 ;; from the corresponding upstream Firefox ESR tarball, using the 'makeicecat'
@@ -390,11 +501,11 @@ in C/C++.")
                   "firefox-" upstream-firefox-version ".source.tar.xz"))
             (sha256
              (base32
-              "0p1bhc1qla4a7iqk0fc6sj224ld6wplpmj4yw6nfx1b8hbqqy2vc"))))
+              "0qh7j960wdp5zcfqhkj8ki47spp9i9ms12xx0v0kxvmmw36jpgjk"))))
 
-         (upstream-icecat-base-version "91.12.0") ; maybe older than base-version
+         (upstream-icecat-base-version "91.13.0") ; maybe older than base-version
          ;;(gnuzilla-commit (string-append "v" upstream-icecat-base-version))
-         (gnuzilla-commit "298024d727053a1609df4003fb4438836d5181f4")
+         (gnuzilla-commit "4a87716686104266a9cccc2d83cc249e312f3673")
          (gnuzilla-source
           (origin
             (method git-fetch)
@@ -406,7 +517,7 @@ in C/C++.")
                                       (string-take gnuzilla-commit 8)))
             (sha256
              (base32
-              "1lgz6knklxbrqr1vaj9d0y0997f4f6v44a8cng8ihkmn7aa7lvwg"))))
+              "070j78al04xzchfl5xj1w300hmw17a3iqcw7mnlxf6b8rqlgj20p"))))
 
          ;; 'search-patch' returns either a valid file name or #f, so wrap it
          ;; in 'assume-valid-file-name' to avoid 'local-file' warnings.
diff --git a/gnu/packages/golang.scm b/gnu/packages/golang.scm
index 1ce55875d8..383d4d1618 100644
--- a/gnu/packages/golang.scm
+++ b/gnu/packages/golang.scm
@@ -23,7 +23,7 @@
 ;;; Copyright © 2020 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2020 raingloom <raingloom@riseup.net>
 ;;; Copyright © 2020 Martin Becze <mjbecze@riseup.net>
-;;; Copyright © 2021 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2021, 2022 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2021 Guillaume Le Vaillant <glv@posteo.net>
 ;;; Copyright © 2021 Sharlatan Hellseher <sharlatanus@mgail.com>
 ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
@@ -54,6 +54,7 @@
 (define-module (gnu packages golang)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (guix memoization)
   #:use-module ((guix build utils) #:select (alist-replace))
   #:use-module (guix download)
@@ -1142,6 +1143,29 @@ different output targets.  Supports colors and text decoration to all popular
 terminals.")
     (license license:bsd-3)))
 
+(define-public go-github-com-kortschak-utter
+  (package
+    (name "go-github-com-kortschak-utter")
+    (version "1.5.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/kortschak/utter")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "13lg8gzvgjnljf1lz8qsfz3qcmbvrsxp3ip7mp2kscfz07r69dyw"))))
+    (build-system go-build-system)
+    (arguments
+     '(#:import-path "github.com/kortschak/utter"))
+    (home-page "https://github.com/kortschak/utter")
+    (synopsis "Deep pretty printer")
+    (description
+     "This package implements a deep pretty printer for Go data structures to
+aid data snapshotting.")
+    (license license:isc)))
+
 (define-public go-github-com-shadowsocks-go-shadowsocks2
   (package
     (name "go-github-com-shadowsocks-go-shadowsocks2")
@@ -2415,7 +2439,16 @@ termination.")
                 "1k7xd2q2ysv2xsh373qs801v6f359240kx0vrl0ydh7731lngvk6"))))
     (build-system go-build-system)
     (arguments
-     '(#:import-path "github.com/jtolds/gls"))
+     (list
+       #:import-path "github.com/jtolds/gls"
+       #:phases
+       #~(modify-phases %standard-phases
+           (replace 'check
+             (lambda* (#:key inputs #:allow-other-keys #:rest args)
+               (unless
+                 ;; The tests fail when run with gccgo.
+                 (false-if-exception (search-input-file inputs "/bin/gccgo"))
+                 (apply (assoc-ref %standard-phases 'check) args)))))))
     (synopsis "@code{gls} provides Goroutine local storage")
     (description
      "The @code{gls} package provides a way to store a retrieve values
@@ -2976,7 +3009,7 @@ Go.")
 (define-public go-github-com-stretchr-objx
   (package
     (name "go-github-com-stretchr-objx")
-    (version "0.2.0")
+    (version "0.4.0")
     (source
      (origin
        (method git-fetch)
@@ -2986,14 +3019,23 @@ Go.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0pcdvakxgddaiwcdj73ra4da05a3q4cgwbpm2w75ycq4kzv8ij8k"))
+         "0dygds32qxx6x1x2mmn7msyjr15qi5r70pyzv8dz8cprxq32nzc1"))
         (modules '((guix build utils)))
         (snippet
          '(begin
             (delete-file-recursively "vendor")))))
     (build-system go-build-system)
     (arguments
-     '(#:import-path "github.com/stretchr/objx"))
+     (list
+       #:import-path "github.com/stretchr/objx"
+       #:phases
+       #~(modify-phases %standard-phases
+           (replace 'check
+             (lambda* (#:key inputs #:allow-other-keys #:rest args)
+               (unless
+                 ;; The tests fail when run with gccgo.
+                 (false-if-exception (search-input-file inputs "/bin/gccgo"))
+                 (apply (assoc-ref %standard-phases 'check) args)))))))
     (propagated-inputs
      (list go-github-com-davecgh-go-spew
            go-github-com-pmezard-go-difflib))
@@ -3758,7 +3800,7 @@ application's http.Handlers.")
 (define-public go-github-com-sirupsen-logrus
   (package
     (name "go-github-com-sirupsen-logrus")
-    (version "1.8.1")
+    (version "1.9.0")
     (source
      (origin
        (method git-fetch)
@@ -3768,14 +3810,23 @@ application's http.Handlers.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0rvqzic2zz7fpxyizmqxwmhv1m52ii9bgxnqa6km8wsa0l08wh42"))))
+         "12i402dxq5js4npnncg043vx874h6nk4ffn4gswcccxrp6h10ivz"))))
     (build-system go-build-system)
+    (arguments
+     (list
+       #:import-path "github.com/sirupsen/logrus"
+       #:phases
+       #~(modify-phases %standard-phases
+           (replace 'check
+             (lambda* (#:key inputs #:allow-other-keys #:rest args)
+               (unless
+                 ;; The tests fail when run with gccgo.
+                 (false-if-exception (search-input-file inputs "/bin/gccgo"))
+                 (apply (assoc-ref %standard-phases 'check) args)))))))
     (propagated-inputs
      (list go-github-com-davecgh-go-spew go-github-com-pmezard-go-difflib
            go-github-com-stretchr-testify go-golang-org-x-crypto
            go-golang-org-x-sys))
-    (arguments
-     '(#:import-path "github.com/sirupsen/logrus"))
     (home-page "https://github.com/sirupsen/logrus")
     (synopsis "Structured, pluggable logging for Go")
     (description "Logrus is a structured logger for Go, completely API
@@ -4018,7 +4069,16 @@ which satisfies the cron expression.")
          "1jwxndf8rsyx0fgrp47d99rp55yzssmryb92jfj3yf7zd8rjjljn"))))
     (build-system go-build-system)
     (arguments
-     '(#:import-path "gopkg.in/check.v1"))
+     (list
+       #:import-path "gopkg.in/check.v1"
+       #:phases
+       #~(modify-phases %standard-phases
+           (replace 'check
+             (lambda* (#:key inputs #:allow-other-keys #:rest args)
+               (unless
+                 ;; The tests fail when run with gccgo.
+                 (false-if-exception (search-input-file inputs "/bin/gccgo"))
+                 (apply (assoc-ref %standard-phases 'check) args)))))))
     (propagated-inputs
      (list go-github-com-kr-pretty))
     (home-page "https://gopkg.in/check.v1")
@@ -5994,7 +6054,16 @@ decode/encode structures and slices.")
                 "1761pybhc2kqr6v5fm8faj08x9bql8427yqg6vnfv6nhrasx1mwq"))))
     (build-system go-build-system)
     (arguments
-     `(#:import-path "github.com/pkg/errors"))
+     (list
+       #:import-path "github.com/pkg/errors"
+       #:phases
+       #~(modify-phases %standard-phases
+           (replace 'check
+             (lambda* (#:key inputs #:allow-other-keys #:rest args)
+               (unless
+                 ;; The tests fail when run with gccgo.
+                 (false-if-exception (search-input-file inputs "/bin/gccgo"))
+                 (apply (assoc-ref %standard-phases 'check) args)))))))
     (synopsis "Go error handling primitives")
     (description "This package provides @code{error}, which offers simple
 error handling primitives in Go.")
@@ -9069,7 +9138,7 @@ anti-fragmentation protection.")
 (define-public go-github-com-valyala-fasthttp
   (package
     (name "go-github-com-valyala-fasthttp")
-    (version "1.31.0")
+    (version "1.39.0")
     (source
      (origin
        (method git-fetch)
@@ -9078,10 +9147,19 @@ anti-fragmentation protection.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0ra0n2shcp11736xv37cjnsqn32gvqfm3dkf9v8j98xmch2wqxqg"))))
+        (base32 "12qwx0yk7wjj25v4fswgmj28r69gk94kqdmzavca8k9f0yznniz1"))))
     (build-system go-build-system)
     (arguments
-     '(#:import-path "github.com/valyala/fasthttp"))
+     (list
+       #:import-path "github.com/valyala/fasthttp"
+       #:phases
+       #~(modify-phases %standard-phases
+           (replace 'check
+             (lambda* (#:key inputs #:allow-other-keys #:rest args)
+               (unless
+                 ;; Tests hang forever with gccgo.
+                 (false-if-exception (search-input-file inputs "/bin/gccgo"))
+                 (apply (assoc-ref %standard-phases 'check) args)))))))
     (propagated-inputs
      (list go-golang-org-x-sys
            go-golang-org-x-net
diff --git a/gnu/packages/graph.scm b/gnu/packages/graph.scm
index 9aadab45e6..109ba68675 100644
--- a/gnu/packages/graph.scm
+++ b/gnu/packages/graph.scm
@@ -537,7 +537,7 @@ of the Louvain algorithm, for a number of different methods.")
 (define-public edge-addition-planarity-suite
   (package
     (name "edge-addition-planarity-suite")
-    (version "3.0.0.5")
+    (version "3.0.2.0")
     (source
      (origin
        (method git-fetch)
@@ -548,7 +548,7 @@ of the Louvain algorithm, for a number of different methods.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "01cm7ay1njkfsdnmnvh5zwc7wg7x189hq1vbfhh9p3ihrbnmqzh8"))))
+         "1c7bnxgiz28mqsq3a3msznmjq629w0qqjynm2rqnnjn2qpc22h3i"))))
     (build-system gnu-build-system)
     (native-inputs
      (list autoconf automake libtool))
diff --git a/gnu/packages/graphics.scm b/gnu/packages/graphics.scm
index 26c6a27113..a09e20b174 100644
--- a/gnu/packages/graphics.scm
+++ b/gnu/packages/graphics.scm
@@ -177,6 +177,11 @@ framebuffer graphics, audio output and input event.")
     (arguments
      `(#:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'remove-buildtime
+           ;; Remove embedded build time for reproducible builds
+           (lambda _
+             (substitute* "src/core/core.c"
+               (("..BUILDTIME..") ""))))
          (add-after 'unpack 'disable-configure-during-bootstrap
            (lambda _
              (substitute* "autogen.sh"
@@ -852,6 +857,7 @@ basic geometries.")
     (native-inputs
      (list python-defcon-bootstrap
            python-fontpens-bootstrap
+           python-setuptools-scm
            python-pytest
            python-wheel
            unzip))
@@ -1915,8 +1921,9 @@ Cflags: -I${includedir}~%" #$output #$version))))))))
       (inputs (list expat fontconfig freetype harfbuzz mesa libwebp zlib))
       (home-page "https://skia.org/")
       (synopsis "2D graphics library")
-      (description "Skia is an open source 2D graphics library.  It can be
-used for drawing text, geometries, and images and has support for:
+      (description
+       "Skia is a 2D graphics library for drawing text, geometries, and images.
+It supports:
 @itemize
 @item 3x3 matrices with perspective
 @item antialiasing, transparency, filters
@@ -2018,7 +2025,7 @@ Some feature highlights:
 (define-public openxr
   (package
     (name "openxr")
-    (version "1.0.23")
+    (version "1.0.24")
     (source
      (origin
        (method git-fetch)
@@ -2032,7 +2039,7 @@ Some feature highlights:
            ;; Delete bundled jsoncpp.
            (delete-file-recursively "src/external/jsoncpp")))
        (sha256
-        (base32 "11w5a2ny30r8jghd5jwdxi5b2c84m21fmkp0lhpicbrwr98xgpj3"))))
+        (base32 "1lkbw03hpwnqcbn0fmxs4cnp5m04hc0ys6y111n7vlrg11sjdpq5"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f))                    ; there are no tests
diff --git a/gnu/packages/graphviz.scm b/gnu/packages/graphviz.scm
index 61ec399dd1..a938800d04 100644
--- a/gnu/packages/graphviz.scm
+++ b/gnu/packages/graphviz.scm
@@ -121,6 +121,8 @@ way of representing structural information as diagrams of abstract graphs and
 networks.  It has important applications in networking, bioinformatics,
 software engineering, database and web design, machine learning, and in visual
 interfaces for other technical domains.")
+    (properties
+     '((release-monitoring-url . "https://graphviz.org/download/source/")))
     (license license:epl1.0)))
 
 ;; Older Graphviz needed for pygraphviz.  See
diff --git a/gnu/packages/gstreamer.scm b/gnu/packages/gstreamer.scm
index 85937ed7dd..ecf6413d9d 100644
--- a/gnu/packages/gstreamer.scm
+++ b/gnu/packages/gstreamer.scm
@@ -531,6 +531,7 @@ This package provides the core library and elements.")
     (propagated-inputs
      (cons* glib                    ;required by gstreamer-sdp-1.0.pc
             gstreamer               ;required by gstreamer-plugins-base-1.0.pc
+            libgudev                ;required by gstreamer-gl-1.0.pc
             ;; wayland-client.h is referred to in
             ;; include/gstreamer-1.0/gst/gl/wayland/gstgldisplay_wayland.h
             wayland
@@ -547,7 +548,6 @@ This package provides the core library and elements.")
            cdparanoia
            graphene
            iso-codes
-           libgudev
            libjpeg-turbo
            libogg
            libpng
diff --git a/gnu/packages/gtk.scm b/gnu/packages/gtk.scm
index ab0f3e2467..428273ee89 100644
--- a/gnu/packages/gtk.scm
+++ b/gnu/packages/gtk.scm
@@ -2190,13 +2190,13 @@ information.")
                              `("GUIX_PYTHONPATH" ":" prefix (,(getenv "GUIX_PYTHONPATH")))))
                          (find-files (string-append out "/bin")))))))))
     (native-inputs
-     `(("gettext" ,gettext-minimal)
-       ("glib:bin" ,glib "bin")
-       ("gobject-introspection" ,gobject-introspection)
-       ("itstool" ,itstool)
-       ("perl" ,perl)
-       ("pkg-config" ,pkg-config)
-       ("python-wrapper" ,python-wrapper)))
+     (list gettext-minimal
+           `(,glib "bin")
+           gobject-introspection
+           itstool
+           perl
+           pkg-config
+           python-wrapper))
     (inputs
      (list bc
            dblatex
@@ -2210,7 +2210,6 @@ information.")
            python-lxml
            python-parameterized
            python-pygments
-           python-unittest2
            source-highlight
            yelp-tools))
     (home-page "https://wiki.gnome.org/DocumentationProject/GtkDoc")
@@ -2235,8 +2234,8 @@ with some extra work.")
 (define-public gtk-doc/stable
   (hidden-package
    (package/inherit gtk-doc
-     (inputs (alist-replace "dblatex" `(,dblatex/stable)
-                            (package-inputs gtk-doc))))))
+     (inputs (modify-inputs (package-inputs gtk-doc)
+               (replace "dblatex" dblatex/stable))))))
 
 (define-public gtk-engines
   (package
diff --git a/gnu/packages/guile-xyz.scm b/gnu/packages/guile-xyz.scm
index 8e8a73ad30..a85c7e0fc4 100644
--- a/gnu/packages/guile-xyz.scm
+++ b/gnu/packages/guile-xyz.scm
@@ -417,43 +417,36 @@ dictionary and suggesting spelling corrections.")
     (package
       (name "guile2.0-bash")
       (version (string-append "0.1.6-" revision "." (string-take commit 7)))
-      (home-page
-       "https://anonscm.debian.org/cgit/users/kaction-guest/retired/dev.guile-bash.git")
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
                       (commit commit)
-                      (url home-page)))
+                      (url "https://git.sr.ht/~kaction/guile-bash")))
                 (sha256
                  (base32
                   "097vny990wp2qpjij6a5a5gwc6fxzg5wk56inhy18iki5v6pif1p"))
                 (file-name (string-append name "-" version "-checkout"))))
       (build-system gnu-build-system)
       (arguments
-       '(#:configure-flags
-         ;; Add -I to match 'bash.pc' of Bash 4.4.
-         (list (string-append "CPPFLAGS=-I"
-                              (assoc-ref %build-inputs "bash:include")
-                              "/include/bash/include")
-
-               ;; The '.a' file is useless.
-               "--disable-static"
-
-               ;; Install 'lib/bash' as Bash 4.4 expects.
-               (string-append "--libdir=" (assoc-ref %outputs "out")
-                              "/lib/bash"))))
-      (native-inputs `(("pkg-config" ,pkg-config)
-                       ("autoconf" ,autoconf)
-                       ("automake" ,automake)
-                       ("libtool" ,libtool)
-                       ;; Gettext brings 'AC_LIB_LINKFLAGS_FROM_LIBS'.
-                       ("gettext" ,gettext-minimal)
-
-                       ;; Bash with loadable module support, for the test
-                       ;; suite.
-                       ("bash-full" ,bash)))
+       (list
+        #:configure-flags
+        #~(list (string-append "CPPFLAGS=-I" ; match bash.pc
+                               (assoc-ref %build-inputs "bash:include")
+                               "/include/bash/include")
+                ;; The '.a' file is useless.
+                "--disable-static"
+                ;; Install 'lib/bash' as Bash 4.4 expects.
+                (string-append "--libdir=" #$output "/lib/bash"))))
+      (native-inputs
+       (list autoconf
+             automake
+             bash                    ; with loadable module support, for tests
+             gettext-minimal         ; for AC_LIB_LINKFLAGS_FROM_LIBS
+             libtool
+             pkg-config))
       (inputs `(("guile" ,guile-2.0)
                 ("bash:include" ,bash "include")))
+      (home-page "https://git.sr.ht/~kaction/guile-bash")
       (synopsis "Extend Bash using Guile")
       (description
        "Guile-Bash provides a shared library and set of Guile modules,
@@ -483,19 +476,20 @@ and then run @command{scm example.scm}.")
     (inherit guile2.0-bash)
     (name "guile-bash")
     (inputs
-     `(("guile" ,guile-3.0-latest)
-       ,@(assoc-remove! (package-inputs guile2.0-bash) "guile")))
+     (modify-inputs (package-inputs guile2.0-bash)
+       (replace "guile" guile-3.0-latest)))
     (arguments
-     `(#:tests? #f
-       #:phases (modify-phases %standard-phases
-                  (add-after 'install 'install-guile
-                    (lambda* (#:key inputs outputs #:allow-other-keys)
-                      (copy-recursively
-                       (string-append (assoc-ref outputs "out")
-                                      (assoc-ref inputs "guile") "/share")
-                       (string-append (assoc-ref outputs "out") "/share"))
-                      #t)))
-       ,@(package-arguments guile2.0-bash)))))
+     (substitute-keyword-arguments (package-arguments guile2.0-bash)
+       ;; XXX The tests succeed with Guile 2.0 but fail with 3.0.
+       ((#:tests? _ #f) #f)
+       ((#:phases phases #~%standard-phases)
+        #~(modify-phases #$phases
+            (add-after 'install 'install-guile
+              (lambda* (#:key inputs outputs #:allow-other-keys)
+                (copy-recursively
+                 (string-append (assoc-ref outputs "out")
+                                (assoc-ref inputs "guile") "/share")
+                 (string-append (assoc-ref outputs "out") "/share"))))))))))
 
 (define-public guile-8sync
   (let ((commit "183b4f02e68279d4984e79b79e06bfcf1861fcbf") (revision "0"))
@@ -621,7 +615,8 @@ Unix-style DSV format and RFC 4180 format.")
                (base32
                 "0ll63d7202clapg1k4bilbnlmfa4qvpjnsd7chbkka4kxf5klilc"))
               (patches
-               (search-patches "guile-fibers-wait-for-io-readiness.patch"))))
+               (search-patches "guile-fibers-wait-for-io-readiness.patch"
+                               "guile-fibers-epoll-instance-is-dead.patch"))))
     (build-system gnu-build-system)
     (native-inputs
      (list texinfo pkg-config autoconf automake libtool
@@ -3703,12 +3698,12 @@ the style of the Node Package Manager (NPM).")
   (package
     (name "guile-hashing")
     (version "1.2.0")
-    (home-page "https://github.com/weinholt/hashing")
+    (home-page "https://gitlab.com/weinholt/hashing")
     (source (origin
               (method git-fetch)
               (uri (git-reference
                     (url home-page)
-                    (commit (string-append "v" version))))
+                    (commit "f138deaec38d54ddb621c082764ece276deebe7f")))
               (file-name (git-file-name name version))
               (sha256
                (base32
@@ -3761,12 +3756,12 @@ SHA-512).")
   (package
     (name "guile-packrat")
     (version "0.1.1")
-    (home-page "https://github.com/weinholt/packrat")
+    (home-page "https://gitlab.com/weinholt/packrat")
     (source (origin
               (method git-fetch)
               (uri (git-reference
                     (url home-page)
-                    (commit (string-append "v" version))))
+                    (commit "4201ebe741b605db58a21d70195cfb7db3c38eae")))
               (file-name (git-file-name name version))
               (sha256
                (base32
@@ -4176,8 +4171,8 @@ more objects or strings, represented by a Json object or an IRI.")
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/weinholt/struct-pack")
-             (commit (string-append "v" version))))
+             (url "https://gitlab.com/weinholt/struct-pack")
+             (commit "11b71963793ed4a3bf761efdd83cf2fe123239ee")))
        (file-name (git-file-name name version))
        (sha256
         (base32 "0hd72m821pahjphzyjn26i55542v8makr55xzjll2cycja4wsbc1"))))
@@ -4205,7 +4200,7 @@ more objects or strings, represented by a Json object or an IRI.")
                       #t)))))
     (native-inputs
      (list guile-3.0))
-    (home-page "https://github.com/weinholt/struct-pack")
+    (home-page "https://gitlab.com/weinholt/struct-pack")
     (synopsis "R6RS library for working with packed byte structures")
     (description
      "This is an R6RS library for working with packed byte structures.  It is
@@ -4215,16 +4210,16 @@ similar to struct in Python or pack and unpack in Perl.")
 (define-public guile-machine-code
   (package
     (name "guile-machine-code")
-    (version "2.1.0")
+    (version "2.2.0")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/weinholt/machine-code")
+             (url "https://gitlab.com/weinholt/machine-code")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0wzj3caj2jypzyjqfkfqkvr3kkbjabsnhldv9kvnx9w9qnria5yd"))))
+        (base32 "1yjzpg5p082kg4vaqlwbwddrrhxyxar6gsx9ql72hpwah4ka82h5"))))
     (build-system guile-build-system)
     (arguments
      `(#:compile-flags '("--r6rs" "-Wunbound-variable" "-Warity-mismatch")
@@ -4251,7 +4246,7 @@ similar to struct in Python or pack and unpack in Perl.")
      (list guile-3.0))
     (propagated-inputs
      (list guile-struct-pack))
-    (home-page "https://github.com/weinholt/machine-code")
+    (home-page "https://gitlab.com/weinholt/machine-code")
     (synopsis "Tools that relate to machine code and object formats")
     (description
      "This project is about the development of tools that relate to machine
@@ -4268,7 +4263,7 @@ object formats and related areas.")
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/weinholt/laesare")
+             (url "https://gitlab.com/weinholt/laesare")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
@@ -4297,7 +4292,7 @@ object formats and related areas.")
                       #t)))))
     (native-inputs
      (list guile-3.0))
-    (home-page "https://github.com/weinholt/laesare")
+    (home-page "https://gitlab.com/weinholt/laesare")
     (synopsis "R6RS Scheme library that provides a reader")
     (description
      "This is an R6RS Scheme library that provides a reader with some extra
diff --git a/gnu/packages/hardware.scm b/gnu/packages/hardware.scm
index 68c4667662..d47be7a55d 100644
--- a/gnu/packages/hardware.scm
+++ b/gnu/packages/hardware.scm
@@ -1147,9 +1147,7 @@ applications.")
 (define-public usbguard
   (package
     (name "usbguard")
-    ;; Note: Use a recent snapshot to get compatibility with newer system
-    ;; libraries.
-    (version "1.0.0-55-g466f1f0")
+    (version "1.1.1")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -1157,51 +1155,51 @@ applications.")
                     (commit (string-append "usbguard-" version))))
               (file-name (git-file-name name version))
               (sha256
-               (base32 "0rc0213qsfap3sgx9m3m1kppxbjl2fdwmzlbn5rbmn1i33125dfi"))))
+               (base32 "0lpyhkz5nr0c9mq57mgcvam5c8qfqqwjc4xd46n2ldqc9vhfsask"))))
     (build-system gnu-build-system)
     (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-bootstrap-script
-           (lambda _
-             ;; Don't attempt to fetch git submodules.
-             (substitute* "autogen.sh"
-               (("^git submodule.*")
-                ""))))
-         (add-after 'bootstrap 'patch-build-scripts
-           (lambda* (#:key inputs #:allow-other-keys)
-             (substitute* "configure"
-               (("/usr/include/catch")
-                (dirname (search-input-file inputs "include/catch.hpp"))))
-             ;; Do not create log directory.
-             (substitute* "Makefile.in" ((".*/log/usbguard.*") ""))
-             ;; Disable LDAP tests: they use 'sudo'.
-             (substitute* "src/Tests/Makefile.in"
-               (("\\$\\(am__append_2\\)") ""))))
-         (add-after 'install 'delete-static-library
-           (lambda* (#:key outputs #:allow-other-keys)
-             ;; It can't be direclty disabled since it's needed for the tests.
-             (delete-file (string-append (assoc-ref outputs "out")
-                                         "/lib/libusbguard.a"))))
-         (add-after 'install 'install-zsh-completion
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out"))
-                    (site-functions
-                     (string-append out "/share/zsh/site-functions")))
-               (mkdir-p site-functions)
-               (copy-file "scripts/usbguard-zsh-completion"
-                          (string-append site-functions "/_usbguard"))))))
-       #:make-flags
-       (list (string-append "BASH_COMPLETION_DIR="
-                            (assoc-ref %outputs "out")
-                            "/etc/bash_completion.d"))
-       #:configure-flags
-       (list
-        "--localstatedir=/var"
-        "--enable-systemd=no"
-        "--with-ldap"
-        "--with-dbus"
-        "--with-polkit")))
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'patch-bootstrap-script
+            (lambda _
+              ;; Don't attempt to fetch git submodules.
+              (substitute* "autogen.sh"
+                (("^git submodule.*")
+                 ""))))
+          (add-after 'bootstrap 'patch-build-scripts
+            (lambda* (#:key inputs #:allow-other-keys)
+              (substitute* "configure"
+                (("/usr/include/catch")
+                 (dirname (search-input-file inputs "include/catch.hpp"))))
+              ;; Do not create log directory.
+              (substitute* "Makefile.in" ((".*/log/usbguard.*") ""))
+              ;; Disable LDAP tests: they use 'sudo'.
+              (substitute* "src/Tests/Makefile.in"
+                (("\\$\\(am__append_2\\)") ""))))
+          (add-after 'install 'delete-static-library
+            (lambda args
+              ;; It can't be directly disabled since it's needed for the tests.
+              (delete-file (string-append #$output
+                                          "/lib/libusbguard.a"))))
+          (add-after 'install 'install-zsh-completion
+            (lambda args
+              (let ((site-functions
+                     (string-append #$output "/share/zsh/site-functions")))
+                (mkdir-p site-functions)
+                (copy-file "scripts/usbguard-zsh-completion"
+                           (string-append site-functions "/_usbguard"))))))
+      #:make-flags
+      #~(list (string-append "BASH_COMPLETION_DIR="
+                             #$output
+                             "/etc/bash_completion.d"))
+      #:configure-flags
+      #~(list
+         "--localstatedir=/var"
+         "--enable-systemd=no"
+         "--with-ldap"
+         "--with-dbus"
+         "--with-polkit")))
     (inputs
      (list audit
            catch-framework
diff --git a/gnu/packages/haskell.scm b/gnu/packages/haskell.scm
index ad2aa20ee1..2eb5d6461c 100644
--- a/gnu/packages/haskell.scm
+++ b/gnu/packages/haskell.scm
@@ -408,7 +408,7 @@ libraries are included in this package.")
 (define-public ghc-7
   (package
     (name "ghc")
-    (version "7.10.2")
+    (version "7.10.3")
     (source
      (origin
       (method url-fetch)
@@ -416,7 +416,7 @@ libraries are included in this package.")
                           version "/" name "-" version "-src.tar.xz"))
       (sha256
        (base32
-        "1x8m4rp2v7ydnrz6z9g8x7z3x3d3pxhv2pixy7i7hkbqbdsp7kal"))))
+        "1vsgmic8csczl62ciz51iv8nhrkm72lyhbz7p7id13y2w7fcx46g"))))
     (build-system gnu-build-system)
     (supported-systems '("i686-linux" "x86_64-linux"))
     (outputs '("out" "doc"))
@@ -436,7 +436,7 @@ libraries are included in this package.")
                  version "/" name "-" version "-testsuite.tar.xz"))
            (sha256
             (base32
-             "0qp9da9ar87zbyn6wjgacd2ic1vgzbi3cklxnhsmjqyafv9qaj4b"))))))
+             "0fk4xjw1x5lk2ifvgqij06lrbf1vxq9qfix86h9r16c0bilm3hah"))))))
     (native-inputs
      `(("perl" ,perl)
        ("python" ,python-2)                ; for tests (fails with python-3)
@@ -448,7 +448,8 @@ libraries are included in this package.")
              ghc-bootstrap-x86_64-7.8.4
              ghc-bootstrap-i686-7.8.4))))
     (arguments
-     `(#:test-target "test"
+     (list
+       #:test-target "test"
        ;; We get a smaller number of test failures by disabling parallel test
        ;; execution.
        #:parallel-tests? #f
@@ -458,117 +459,108 @@ libraries are included in this package.")
        ;; then complains that they don't match.
        #:build #f
 
-       #:modules ((guix build gnu-build-system)
-                  (guix build utils)
-                  (srfi srfi-26)
-                  (srfi srfi-1))
+       #:modules '((guix build gnu-build-system)
+                   (guix build utils)
+                   (srfi srfi-26)
+                   (srfi srfi-1))
        #:configure-flags
-       (list
-        (string-append "--with-gmp-libraries="
-                       (assoc-ref %build-inputs "gmp") "/lib")
-        (string-append "--with-gmp-includes="
-                       (assoc-ref %build-inputs "gmp") "/include")
-        "--with-system-libffi"
-        (string-append "--with-ffi-libraries="
-                       (assoc-ref %build-inputs "libffi") "/lib")
-        (string-append "--with-ffi-includes="
-                       (assoc-ref %build-inputs "libffi") "/include"))
+       #~(list
+           (string-append "--with-gmp-libraries="
+                          (assoc-ref %build-inputs "gmp") "/lib")
+           (string-append "--with-gmp-includes="
+                          (assoc-ref %build-inputs "gmp") "/include")
+           "--with-system-libffi"
+           (string-append "--with-ffi-libraries="
+                          (assoc-ref %build-inputs "libffi") "/lib")
+           (string-append "--with-ffi-includes="
+                          (assoc-ref %build-inputs "libffi") "/include"))
        ;; FIXME: The user-guide needs dblatex, docbook-xsl and docbook-utils.
        ;; Currently we do not have the last one.
        ;; #:make-flags
        ;; (list "BUILD_DOCBOOK_HTML = YES")
        #:phases
-       (let* ((ghc-bootstrap-path
-               (string-append (getcwd) "/" ,name "-" ,version "/ghc-bin"))
-              (ghc-bootstrap-prefix
-               (string-append ghc-bootstrap-path "/usr" )))
-         (alist-cons-after
-          'unpack-bin 'unpack-testsuite-and-fix-bins
-          (lambda* (#:key inputs outputs #:allow-other-keys)
-            (with-directory-excursion ".."
-              (copy-file (assoc-ref inputs "ghc-testsuite")
-                         "ghc-testsuite.tar.xz")
-              (invoke "tar" "xvf" "ghc-testsuite.tar.xz"))
-            (substitute*
-                (list "testsuite/timeout/Makefile"
-                      "testsuite/timeout/timeout.py"
-                      "testsuite/timeout/timeout.hs"
-                      "testsuite/tests/rename/prog006/Setup.lhs"
-                      "testsuite/tests/programs/life_space_leak/life.test"
-                      "libraries/process/System/Process/Internals.hs"
-                      "libraries/unix/cbits/execvpe.c")
-              (("/bin/sh") (which "sh"))
-              (("/bin/rm") "rm"))
-            #t)
-          (alist-cons-after
-           'unpack 'unpack-bin
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (mkdir-p ghc-bootstrap-prefix)
-             (with-directory-excursion ghc-bootstrap-path
-               (copy-file (assoc-ref inputs "ghc-binary")
-                          "ghc-bin.tar.xz")
-               (invoke "tar" "xvf" "ghc-bin.tar.xz")))
-           (alist-cons-before
-            'install-bin 'configure-bin
-            (lambda* (#:key inputs outputs #:allow-other-keys)
-              (let* ((binaries
-                      (list
-                       "./utils/ghc-pwd/dist-install/build/tmp/ghc-pwd"
-                       "./utils/hpc/dist-install/build/tmp/hpc"
-                       "./utils/haddock/dist/build/tmp/haddock"
-                       "./utils/hsc2hs/dist-install/build/tmp/hsc2hs"
-                       "./utils/runghc/dist-install/build/tmp/runghc"
-                       "./utils/ghc-cabal/dist-install/build/tmp/ghc-cabal"
-                       "./utils/hp2ps/dist/build/tmp/hp2ps"
-                       "./utils/ghc-pkg/dist-install/build/tmp/ghc-pkg"
-                       "./utils/unlit/dist/build/tmp/unlit"
-                       "./ghc/stage2/build/tmp/ghc-stage2"))
-                     (gmp (assoc-ref inputs "gmp"))
-                     (gmp-lib (string-append gmp "/lib"))
-                     (gmp-include (string-append gmp "/include"))
-                     (ncurses-lib
-                      (dirname (search-input-file inputs "/lib/libncurses.so")))
-                     (ld-so (search-input-file inputs ,(glibc-dynamic-linker)))
-                     (libtinfo-dir
-                      (string-append ghc-bootstrap-prefix
-                                     "/lib/ghc-7.8.4/terminfo-0.4.0.0")))
-                (with-directory-excursion
-                    (string-append ghc-bootstrap-path "/ghc-7.8.4")
-                  (setenv "CONFIG_SHELL" (which "bash"))
-                  (setenv "LD_LIBRARY_PATH" gmp-lib)
-                  ;; The binaries have "/lib64/ld-linux-x86-64.so.2" hardcoded.
-                  (for-each
-                   (cut invoke "patchelf" "--set-interpreter" ld-so <>)
-                   binaries)
-                  ;; The binaries include a reference to libtinfo.so.5 which
-                  ;; is a subset of libncurses.so.5.  We create a symlink in a
-                  ;; directory included in the bootstrap binaries rpath.
-                  (mkdir-p libtinfo-dir)
-                  (symlink
-                   (string-append ncurses-lib "/libncursesw.so."
-                                  ;; Extract "6.0" from "6.0-20170930" if a
-                                  ;; dash-separated version tag exists.
-                                  ,(let* ((v (package-version ncurses))
-                                          (d (or (string-index v #\-)
-                                                 (string-length v))))
-                                     (version-major+minor (string-take v d))))
-                   (string-append libtinfo-dir "/libtinfo.so.5"))
-
-                  (setenv "PATH"
-                          (string-append (getenv "PATH") ":"
-                                         ghc-bootstrap-prefix "/bin"))
-                  (invoke
-                   (string-append (getcwd) "/configure")
-                   (string-append "--prefix=" ghc-bootstrap-prefix)
-                   (string-append "--with-gmp-libraries=" gmp-lib)
-                   (string-append "--with-gmp-includes=" gmp-include)))))
-            (alist-cons-before
-             'configure 'install-bin
-             (lambda* (#:key inputs outputs #:allow-other-keys)
-               (with-directory-excursion
+       #~(let* ((ghc-bootstrap-path
+                  (string-append (getcwd) "/" #$name "-" #$version "/ghc-bin"))
+                (ghc-bootstrap-prefix
+                  (string-append ghc-bootstrap-path "/usr" )))
+           (modify-phases %standard-phases
+             (add-after 'unpack 'unpack-bin
+               (lambda* (#:key inputs outputs #:allow-other-keys)
+                (mkdir-p ghc-bootstrap-prefix)
+                (with-directory-excursion ghc-bootstrap-path
+                  (invoke "tar" "xvf" (assoc-ref inputs "ghc-binary")))))
+             (add-after 'unpack-bin 'unpack-testsuite-and-fix-bins
+               (lambda* (#:key inputs outputs #:allow-other-keys)
+                 (with-directory-excursion ".."
+                   (invoke "tar" "xvf" (assoc-ref inputs "ghc-testsuite")))
+                 (substitute*
+                   (list "testsuite/timeout/Makefile"
+                         "testsuite/timeout/timeout.py"
+                         "testsuite/timeout/timeout.hs"
+                         "testsuite/tests/rename/prog006/Setup.lhs"
+                         "testsuite/tests/programs/life_space_leak/life.test"
+                         "libraries/process/System/Process/Internals.hs"
+                         "libraries/unix/cbits/execvpe.c")
+                   (("/bin/sh") (search-input-file inputs "/bin/sh"))
+                   (("/bin/rm") "rm"))))
+             (add-before 'configure 'install-bin
+               (lambda* (#:key inputs outputs #:allow-other-keys)
+                 (with-directory-excursion
                    (string-append ghc-bootstrap-path "/ghc-7.8.4")
-                 (invoke "make" "install")))
-             %standard-phases)))))))
+                   (invoke "make" "install"))))
+             (add-before 'install-bin 'configure-bin
+               (lambda* (#:key inputs outputs #:allow-other-keys)
+                 (let* ((binaries
+                          (list
+                            "./utils/ghc-pwd/dist-install/build/tmp/ghc-pwd"
+                            "./utils/hpc/dist-install/build/tmp/hpc"
+                            "./utils/haddock/dist/build/tmp/haddock"
+                            "./utils/hsc2hs/dist-install/build/tmp/hsc2hs"
+                            "./utils/runghc/dist-install/build/tmp/runghc"
+                            "./utils/ghc-cabal/dist-install/build/tmp/ghc-cabal"
+                            "./utils/hp2ps/dist/build/tmp/hp2ps"
+                            "./utils/ghc-pkg/dist-install/build/tmp/ghc-pkg"
+                            "./utils/unlit/dist/build/tmp/unlit"
+                            "./ghc/stage2/build/tmp/ghc-stage2"))
+                        (gmp (assoc-ref inputs "gmp"))
+                        (gmp-lib (string-append gmp "/lib"))
+                        (gmp-include (string-append gmp "/include"))
+                        (ncurses-lib
+                         (dirname (search-input-file inputs "/lib/libncurses.so")))
+                        (ld-so (search-input-file inputs #$(glibc-dynamic-linker)))
+                        (libtinfo-dir
+                         (string-append ghc-bootstrap-prefix
+                                        "/lib/ghc-7.8.4/terminfo-0.4.0.0")))
+                   (with-directory-excursion
+                     (string-append ghc-bootstrap-path "/ghc-7.8.4")
+                     (setenv "CONFIG_SHELL" (which "bash"))
+                     (setenv "LD_LIBRARY_PATH" gmp-lib)
+                     ;; The binaries have "/lib64/ld-linux-x86-64.so.2" hardcoded.
+                     (for-each
+                      (cut invoke "patchelf" "--set-interpreter" ld-so <>)
+                      binaries)
+                     ;; The binaries include a reference to libtinfo.so.5 which
+                     ;; is a subset of libncurses.so.5.  We create a symlink in a
+                     ;; directory included in the bootstrap binaries rpath.
+                     (mkdir-p libtinfo-dir)
+                     (symlink
+                      (string-append ncurses-lib "/libncursesw.so."
+                                     ;; Extract "6.0" from "6.0-20170930" if a
+                                     ;; dash-separated version tag exists.
+                                     #$(let* ((v (package-version ncurses))
+                                              (d (or (string-index v #\-)
+                                                     (string-length v))))
+                                         (version-major+minor (string-take v d))))
+                      (string-append libtinfo-dir "/libtinfo.so.5"))
+
+                     (setenv "PATH"
+                             (string-append (getenv "PATH") ":"
+                                            ghc-bootstrap-prefix "/bin"))
+                     (invoke
+                      (string-append (getcwd) "/configure")
+                      (string-append "--prefix=" ghc-bootstrap-prefix)
+                      (string-append "--with-gmp-libraries=" gmp-lib)
+                      (string-append "--with-gmp-includes=" gmp-include))))))))))
     (native-search-paths (list (search-path-specification
                                 (variable "GHC_PACKAGE_PATH")
                                 (files (list
@@ -599,29 +591,26 @@ interactive environment for the functional language Haskell.")
     (supported-systems '("i686-linux" "x86_64-linux"))
     (outputs '("out" "doc"))
     (inputs
-     `(("gmp" ,gmp)
-       ("ncurses" ,ncurses)
-
-       ;; Use a LibFFI variant without static trampolines to work around
-       ;; <https://gitlab.haskell.org/ghc/ghc/-/issues/20051>.
-       ("libffi" ,libffi-sans-static-trampolines)
-
-       ("ghc-testsuite"
-        ,(origin
-           (method url-fetch)
-           (uri (string-append
-                 "https://www.haskell.org/ghc/dist/"
-                 version "/" name "-" version "-testsuite.tar.xz"))
-           (sha256
-            (base32 "1wjc3x68l305bl1h1ijd3yhqp2vqj83lkp3kqbr94qmmkqlms8sj"))))))
+     ;; Use a LibFFI variant without static trampolines to work around
+     ;; <https://gitlab.haskell.org/ghc/ghc/-/issues/20051>.
+     (list gmp ncurses libffi-sans-static-trampolines))
     (native-inputs
      `(("perl" ,perl)
        ("python" ,python-2)                ; for tests
        ("ghostscript" ,ghostscript)        ; for tests
        ;; GHC is built with GHC.
-       ("ghc-bootstrap" ,ghc-7)))
+       ("ghc-bootstrap" ,ghc-7)
+       ("ghc-testsuite"
+        ,(origin
+           (method url-fetch)
+           (uri (string-append
+                  "https://www.haskell.org/ghc/dist/"
+                  version "/" name "-" version "-testsuite.tar.xz"))
+           (sha256
+            (base32 "1wjc3x68l305bl1h1ijd3yhqp2vqj83lkp3kqbr94qmmkqlms8sj")))) ))
     (arguments
-     `(#:test-target "test"
+     (list
+       #:test-target "test"
        ;; We get a smaller number of test failures by disabling parallel test
        ;; execution.
        #:parallel-tests? #f
@@ -632,53 +621,48 @@ interactive environment for the functional language Haskell.")
        #:build #f
 
        #:configure-flags
-       (list
-        (string-append "--with-gmp-libraries="
-                       (assoc-ref %build-inputs "gmp") "/lib")
-        (string-append "--with-gmp-includes="
-                       (assoc-ref %build-inputs "gmp") "/include")
-        "--with-system-libffi"
-        (string-append "--with-ffi-libraries="
-                       (assoc-ref %build-inputs "libffi") "/lib")
-        (string-append "--with-ffi-includes="
-                       (assoc-ref %build-inputs "libffi") "/include")
-        (string-append "--with-curses-libraries="
-                       (assoc-ref %build-inputs "ncurses") "/lib")
-        (string-append "--with-curses-includes="
-                       (assoc-ref %build-inputs "ncurses") "/include"))
+       #~(list
+           (string-append "--with-gmp-libraries="
+                          (assoc-ref %build-inputs "gmp") "/lib")
+           (string-append "--with-gmp-includes="
+                          (assoc-ref %build-inputs "gmp") "/include")
+           "--with-system-libffi"
+           (string-append "--with-ffi-libraries="
+                          (assoc-ref %build-inputs "libffi") "/lib")
+           (string-append "--with-ffi-includes="
+                          (assoc-ref %build-inputs "libffi") "/include")
+           (string-append "--with-curses-libraries="
+                          (assoc-ref %build-inputs "ncurses") "/lib")
+           (string-append "--with-curses-includes="
+                          (assoc-ref %build-inputs "ncurses") "/include"))
        #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'unpack-testsuite
-           (lambda* (#:key inputs #:allow-other-keys)
-             (with-directory-excursion ".."
-               (copy-file (assoc-ref inputs "ghc-testsuite")
-                          "ghc-testsuite.tar.xz")
-               (zero? (system* "tar" "xvf" "ghc-testsuite.tar.xz")))))
-         (add-before 'build 'fix-lib-paths
-           (lambda _
-             (substitute*
+       #~(modify-phases %standard-phases
+           (add-after 'unpack 'unpack-testsuite
+             (lambda* (#:key inputs #:allow-other-keys)
+               (with-directory-excursion ".."
+                 (invoke "tar" "xvf" (assoc-ref inputs "ghc-testsuite")))))
+           (add-before 'build 'fix-lib-paths
+             (lambda* (#:key inputs #:allow-other-keys)
+               (substitute*
                  (list "libraries/process/System/Process/Posix.hs"
                        "libraries/process/tests/process001.hs"
                        "libraries/process/tests/process002.hs"
                        "libraries/unix/cbits/execvpe.c")
-               (("/bin/sh") (which "sh"))
-               (("/bin/ls") (which "ls")))
-             #t))
-         (add-before 'build 'fix-environment
-           (lambda _
-             (unsetenv "GHC_PACKAGE_PATH")
-             (setenv "CONFIG_SHELL" (which "bash"))
-             #t))
-         (add-before 'check 'fix-testsuite
-           (lambda _
-             (substitute*
+                 (("/bin/sh") (search-input-file inputs "/bin/sh"))
+                 (("/bin/ls") (search-input-file inputs "/bin/ls")))))
+           (add-before 'build 'fix-environment
+             (lambda _
+               (unsetenv "GHC_PACKAGE_PATH")
+               (setenv "CONFIG_SHELL" (which "bash"))))
+           (add-before 'check 'fix-testsuite
+             (lambda _
+               (substitute*
                  (list "testsuite/timeout/Makefile"
                        "testsuite/timeout/timeout.py"
                        "testsuite/timeout/timeout.hs"
                        "testsuite/tests/programs/life_space_leak/life.test")
-               (("/bin/sh") (which "sh"))
-               (("/bin/rm") "rm"))
-             #t)))))
+                 (("/bin/sh") (which "sh"))
+                 (("/bin/rm") "rm")))))))
     (native-search-paths (list (search-path-specification
                                 (variable "GHC_PACKAGE_PATH")
                                 (files (list
@@ -703,15 +687,11 @@ interactive environment for the functional language Haskell.")
                            version "/" name "-" version "-src.tar.xz"))
        (sha256
         (base32 "1ch4j2asg7pr52ai1hwzykxyj553wndg7wq93i47ql4fllspf48i"))))
-    (inputs
-     ;; Note: GHC < 9 requires LibFFI < 3.4, or a variant without static
-     ;; trampolines.
-     (list gmp ncurses libffi-sans-static-trampolines))
     (native-inputs
      `(("perl" ,perl)
        ("python" ,python)               ; for tests
        ("ghostscript" ,ghostscript)     ; for tests
-       ;; GHC 8.4.3 is built with GHC 8.
+       ;; GHC 8.4.4 is built with GHC >= 8.0.
        ("ghc-bootstrap" ,ghc-8.0)
        ("ghc-testsuite"
         ,(origin
@@ -723,92 +703,39 @@ interactive environment for the functional language Haskell.")
             (base32
              "0s8lf9sxj7n89pjagi58b3fahnp34qvmwhnn0j1fbg6955vbrfj6"))))))
     (arguments
-     `(#:test-target "test"
-       ;; We get a smaller number of test failures by disabling parallel test
-       ;; execution.
-       #:parallel-tests? #f
-
-       ;; Don't pass --build=<triplet>, because the configure script
-       ;; auto-detects slightly different triplets for --host and --target and
-       ;; then complains that they don't match.
-       #:build #f
-
-       #:configure-flags
-       (list
-        (string-append "--with-gmp-libraries="
-                       (assoc-ref %build-inputs "gmp") "/lib")
-        (string-append "--with-gmp-includes="
-                       (assoc-ref %build-inputs "gmp") "/include")
-        "--with-system-libffi"
-        (string-append "--with-ffi-libraries="
-                       (assoc-ref %build-inputs "libffi") "/lib")
-        (string-append "--with-ffi-includes="
-                       (assoc-ref %build-inputs "libffi") "/include")
-        (string-append "--with-curses-libraries="
-                       (assoc-ref %build-inputs "ncurses") "/lib")
-        (string-append "--with-curses-includes="
-                       (assoc-ref %build-inputs "ncurses") "/include"))
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'unpack-testsuite
-           (lambda* (#:key inputs #:allow-other-keys)
-             (invoke "tar" "xvf"
-                     (assoc-ref inputs "ghc-testsuite")
-                     "--strip-components=1")
-             #t))
-         ;; This phase patches the 'ghc-pkg' command so that it sorts the list
-         ;; of packages in the binary cache it generates.
-         (add-before 'build 'fix-ghc-pkg-nondeterminism
-           (lambda _
-             (substitute* "utils/ghc-pkg/Main.hs"
-               (("confs = map \\(path </>\\) \\$ filter \\(\".conf\" `isSuffixOf`\\) fs")
-                "confs = map (path </>) $ filter (\".conf\" `isSuffixOf`) (sort fs)"))
-             #t))
-         (add-after 'unpack-testsuite 'fix-shell-wrappers
-           (lambda _
-             (substitute* '("driver/ghci/ghc.mk"
-                            "utils/mkdirhier/ghc.mk"
-                            "rules/shell-wrapper.mk")
-               (("echo '#!/bin/sh'")
-                (format #f "echo '#!~a'" (which "sh"))))
-             #t))
-         ;; This is necessary because the configure system no longer uses
-         ;; “AC_PATH_” but “AC_CHECK_”, setting the variables to just the
-         ;; plain command names.
-         (add-before 'configure 'set-target-programs
-           (lambda* (#:key inputs #:allow-other-keys)
-             (let ((binutils (assoc-ref inputs "binutils"))
-                   (gcc (assoc-ref inputs "gcc"))
-                   (ld-wrapper (assoc-ref inputs "ld-wrapper")))
-               (setenv "CC" (string-append gcc "/bin/gcc"))
-               (setenv "CXX" (string-append gcc "/bin/g++"))
-               (setenv "LD" (string-append ld-wrapper "/bin/ld"))
-               (setenv "NM" (string-append binutils "/bin/nm"))
-               (setenv "RANLIB" (string-append binutils "/bin/ranlib"))
-               (setenv "STRIP" (string-append binutils "/bin/strip"))
-               ;; The 'ar' command does not follow the same pattern.
-               (setenv "fp_prog_ar" (string-append binutils "/bin/ar"))
-               #t)))
-         (add-before 'build 'fix-references
-           (lambda _
-             (substitute* '("testsuite/timeout/Makefile"
-                            "testsuite/timeout/timeout.py"
-                            "testsuite/timeout/timeout.hs"
-                            "testsuite/tests/programs/life_space_leak/life.test"
-                            ;; libraries
-                            "libraries/process/System/Process/Posix.hs"
-                            "libraries/process/tests/process001.hs"
-                            "libraries/process/tests/process002.hs"
-                            "libraries/unix/cbits/execvpe.c")
-               (("/bin/sh") (which "sh"))
-               (("/bin/ls") (which "ls"))
-               (("/bin/rm") "rm"))
-             #t))
-         (add-before 'build 'fix-environment
-           (lambda _
-             (unsetenv "GHC_PACKAGE_PATH")
-             (setenv "CONFIG_SHELL" (which "bash"))
-             #t)))))
+     (substitute-keyword-arguments (package-arguments ghc-8.0)
+       ((#:phases phases)
+        #~(modify-phases #$phases
+            ;; This phase patches the 'ghc-pkg' command so that it sorts the list
+            ;; of packages in the binary cache it generates.
+            (add-before 'build 'fix-ghc-pkg-nondeterminism
+              (lambda _
+                (substitute* "utils/ghc-pkg/Main.hs"
+                  (("confs = map \\(path </>\\) \\$ filter \\(\".conf\" `isSuffixOf`\\) fs")
+                   "confs = map (path </>) $ filter (\".conf\" `isSuffixOf`) (sort fs)"))))
+            (add-after 'unpack-testsuite 'fix-shell-wrappers
+              (lambda _
+                (substitute* '("driver/ghci/ghc.mk"
+                               "utils/mkdirhier/ghc.mk"
+                               "rules/shell-wrapper.mk")
+                  (("echo '#!/bin/sh'")
+                   (format #f "echo '#!~a'" (which "sh"))))))
+            ;; This is necessary because the configure system no longer uses
+            ;; “AC_PATH_” but “AC_CHECK_”, setting the variables to just the
+            ;; plain command names.
+            (add-before 'configure 'set-target-programs
+              (lambda* (#:key inputs #:allow-other-keys)
+                (let ((binutils (assoc-ref inputs "binutils"))
+                      (gcc (assoc-ref inputs "gcc"))
+                      (ld-wrapper (assoc-ref inputs "ld-wrapper")))
+                  (setenv "CC" (string-append gcc "/bin/gcc"))
+                  (setenv "CXX" (string-append gcc "/bin/g++"))
+                  (setenv "LD" (string-append ld-wrapper "/bin/ld"))
+                  (setenv "NM" (string-append binutils "/bin/nm"))
+                  (setenv "RANLIB" (string-append binutils "/bin/ranlib"))
+                  (setenv "STRIP" (string-append binutils "/bin/strip"))
+                  ;; The 'ar' command does not follow the same pattern.
+                  (setenv "fp_prog_ar" (string-append binutils "/bin/ar")))))))))
     (native-search-paths (list (search-path-specification
                                 (variable "GHC_PACKAGE_PATH")
                                 (files (list
@@ -848,10 +775,10 @@ interactive environment for the functional language Haskell.")
     (arguments
      (substitute-keyword-arguments (package-arguments ghc-8.4)
        ((#:make-flags make-flags ''())
-        `(cons "EXTRA_RUNTEST_OPTS=--skip-perf-tests"
-               ,make-flags))
+        #~(cons "EXTRA_RUNTEST_OPTS=--skip-perf-tests"
+                #$make-flags))
        ((#:phases phases '%standard-phases)
-        `(modify-phases ,phases
+        #~(modify-phases #$phases
            (add-after 'install 'remove-unnecessary-references
              (lambda* (#:key outputs #:allow-other-keys)
                (substitute* (find-files (string-append (assoc-ref outputs "out") "/lib/")
@@ -876,8 +803,7 @@ interactive environment for the functional language Haskell.")
                                     (new    (string-append out subdir)))
                                (mkdir-p (dirname new))
                                (rename-file haddock-file new)))
-                           (find-files doc "\\.haddock$")))
-               #t))
+                           (find-files doc "\\.haddock$")))))
            (add-after 'unpack-testsuite 'skip-tests
              (lambda _
                ;; These two tests refer to the root user, which doesn't exist
@@ -885,8 +811,7 @@ interactive environment for the functional language Haskell.")
                (substitute* "libraries/unix/tests/all.T"
                  (("^test\\('T8108'") "# guix skipped: test('T8108'"))
                (substitute* "libraries/unix/tests/libposix/all.T"
-                 (("^test\\('posix010'") "# guix skipped: test('posix010'"))
-               #t))))))
+                 (("^test\\('posix010'") "# guix skipped: test('posix010'"))))))))
     (native-search-paths (list (search-path-specification
                                 (variable "GHC_PACKAGE_PATH")
                                 (files (list
@@ -926,19 +851,17 @@ interactive environment for the functional language Haskell.")
     (arguments
      (substitute-keyword-arguments (package-arguments ghc-8.6)
        ((#:phases phases '%standard-phases)
-        `(modify-phases ,phases
-           (add-after 'fix-references 'fix-cc-reference
+        #~(modify-phases #$phases
+           (add-before 'build 'fix-cc-reference
              (lambda _
                (substitute* "utils/hsc2hs/Common.hs"
-                 (("\"cc\"") "\"gcc\""))
-               #t))
+                 (("\"cc\"") "\"gcc\""))))
            (add-after 'unpack-testsuite 'skip-more-tests
              (lambda _
                ;; XXX: This test fails because our ld-wrapper script
                ;; mangles the response file passed to the linker.
                (substitute* "testsuite/tests/hp2ps/all.T"
-                 (("^test\\('T15904'") "# guix skipped: test('T15904'"))
-               #t))))))
+                 (("^test\\('T15904'") "# guix skipped: test('T15904'"))))))))
     (native-search-paths (list (search-path-specification
                                 (variable "GHC_PACKAGE_PATH")
                                 (files (list
@@ -959,7 +882,8 @@ interactive environment for the functional language Haskell.")
        (sha256
         (base32 "179ws2q0dinl1a39wm9j37xzwm84zfz3c5543vz8v479khigdvp3"))))
     (native-inputs
-     `(("ghc-bootstrap" ,ghc-8.8)
+     `(;; GHC 8.10.7 must be built with GHC >= 8.6.
+       ("ghc-bootstrap" ,ghc-8.6)
        ("ghc-testsuite"
         ,(origin
            (method url-fetch)
@@ -979,7 +903,7 @@ interactive environment for the functional language Haskell.")
     (arguments
      (substitute-keyword-arguments (package-arguments ghc-8.8)
        ((#:phases phases '%standard-phases)
-        `(modify-phases ,phases
+        #~(modify-phases #$phases
            (add-after 'unpack-testsuite 'patch-more-shebangs
              (lambda* (#:key inputs #:allow-other-keys)
                (let ((bash (assoc-ref inputs "bash")))
@@ -993,20 +917,16 @@ interactive environment for the functional language Haskell.")
                  (("extra_files" all) (string-append "[" all))
                  (("\\]\\), " all)
                   (string-append all "expect_broken(0)], ")))))
-           ;; TODO: Turn this into an undconditional patch on the next rebuild.
-           ,@(if (string-prefix? "i686" (or (%current-target-system)
-                                                  (%current-system)))
-              '((add-after 'skip-more-tests 'skip-failing-tests-i686
-                 (lambda _
-                   (substitute* '("testsuite/tests/codeGen/should_compile/all.T")
-                     (("(test\\('T15155l', )when\\(unregisterised\\(\\), skip\\)" all before)
-                      (string-append before "when(arch('i386'), skip)")))
-                   ;; Unexpected failures:
-                   ;;    quasiquotation/T14028.run  T14028 [bad stderr] (dyn)
-                   (substitute* '("testsuite/tests/quasiquotation/all.T")
-                     (("unless\\(config.have_ext_interp, skip\\),")
-                      "unless(config.have_ext_interp, skip), when(arch('i386'), skip),")))))
-              '())))))
+           (add-after 'skip-more-tests 'skip-failing-tests-i686
+             (lambda _
+               (substitute* '("testsuite/tests/codeGen/should_compile/all.T")
+                 (("(test\\('T15155l', )when\\(unregisterised\\(\\), skip\\)" all before)
+                  (string-append before "when(arch('i386'), skip)")))
+               ;; Unexpected failures:
+               ;;    quasiquotation/T14028.run  T14028 [bad stderr] (dyn)
+               (substitute* '("testsuite/tests/quasiquotation/all.T")
+                 (("unless\\(config.have_ext_interp, skip\\),")
+                  "unless(config.have_ext_interp, skip), when(arch('i386'), skip),"))))))))
     (native-search-paths (list (search-path-specification
                                 (variable "GHC_PACKAGE_PATH")
                                 (files (list
diff --git a/gnu/packages/image-viewers.scm b/gnu/packages/image-viewers.scm
index 88dbba866b..52c9584f67 100644
--- a/gnu/packages/image-viewers.scm
+++ b/gnu/packages/image-viewers.scm
@@ -24,6 +24,7 @@
 ;;; Copyright © 2021 Zheng Junjie <873216071@qq.com>
 ;;; Copyright © 2021 dissent <disseminatedissent@protonmail.com>
 ;;; Copyright © 2022 Michael Rohleder <mike@rohleder.de>
+;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -287,7 +288,8 @@ collection.  Geeqie was initially based on GQview.")
                (base32
                 "0hi9v0rdx47nys0wvm9xasdrafa34r5kq6crb074a0ipwmc60iiq"))))
     (build-system gnu-build-system)
-    (inputs (list gtk+-2 libjpeg-turbo))
+    (arguments (list #:configure-flags #~(list "--enable-gtk3")))
+    (inputs (list gtk+ libjpeg-turbo))
     (native-inputs (list intltool pkg-config))
     (synopsis "Simple and fast image viewer for X")
     (description "gpicview is a lightweight GTK+ 2.x based image viewer.
@@ -411,34 +413,32 @@ needs.")
     (name "viewnior")
     (version "1.8")
     (source
-      (origin
-        (method git-fetch)
-        (uri (git-reference
-               (url "https://github.com/hellosiyan/Viewnior")
-               (commit (string-append name "-" version))))
-        (file-name (git-file-name name version))
-        (sha256
-         (base32 "14qvx1wajncd5ab0207274cwk32f4ipfnlaci6phmah0cwra2did"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/hellosiyan/Viewnior")
+             (commit (string-append name "-" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "14qvx1wajncd5ab0207274cwk32f4ipfnlaci6phmah0cwra2did"))))
     (build-system meson-build-system)
     (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             ;; Don't create 'icon-theme.cache'
-             (substitute* "meson.build"
-               (("meson.add_install_script*") ""))
-             #t)))
-       #:tests? #f)) ; no tests
+     '(#:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'patch-source
+                    (lambda _
+                      ;; Don't create 'icon-theme.cache'
+                      (substitute* "meson.build"
+                        (("meson.add_install_script*") "")))))
+       #:tests? #f))                    ;no tests
     (native-inputs
-     `(("gettext" ,gettext-minimal)
-       ("glib" ,glib "bin") ; glib-genmarshal
-       ("pkg-config" ,pkg-config)
-       ("shared-mime-info" ,shared-mime-info)))
+     (list gettext-minimal
+           `(,glib "bin")               ;glib-genmarshal
+           pkg-config
+           shared-mime-info))
     (inputs
-     `(("exiv2" ,exiv2)
-       ("gdk-pixbuf" ,gdk-pixbuf)
-       ("gtk+-2" ,gtk+-2)))
+     (list exiv2
+           gdk-pixbuf
+           gtk+-2))
     (home-page "https://siyanpanayotov.com/project/viewnior")
     (synopsis "Simple, fast and elegant image viewer")
     (description "Viewnior is an image viewer program.  Created to be simple,
diff --git a/gnu/packages/image.scm b/gnu/packages/image.scm
index 7c23b308fd..60b710b53b 100644
--- a/gnu/packages/image.scm
+++ b/gnu/packages/image.scm
@@ -33,6 +33,7 @@
 ;;; Copyright © 2021 Nicolò Balzarotti <nicolo@nixo.xyz>
 ;;; Copyright © 2021 Alexandr Vityazev <avityazev@posteo.org>
 ;;; Copyright © 2022 Jai Vetrivelan <jaivetrivelan@gmail.com>
+;;; Copyright © 2022 ( <paren@disroot.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -2425,3 +2426,28 @@ month and day.  All files which are not images or videos or those which do not
 have creation date information will be placed in a folder called
 @file{unknown}.")
     (license license:expat)))
+
+(define-public spng
+  (package
+   (name "spng")
+   (version "0.7.2")
+   (source (origin
+            (method git-fetch)
+            (uri (git-reference
+                  (url "https://github.com/randy408/libspng")
+                  (commit (string-append "v" version))))
+            (file-name (git-file-name name version))
+            (sha256
+             (base32
+              "0src9ii9w9afz2vgridn9r38pa6888myk28x2bjw0ynw5xcd62hs"))))
+   (build-system meson-build-system)
+   (inputs (list zlib))
+   (native-inputs (list libpng))
+   (home-page "https://libspng.org")
+   (synopsis "Simple PNG loading library")
+   (description
+    "@code{libspng} is a simple C library for loading Portable Network
+Graphics (PNGs), intended as an easy-to-use replacement for @code{libpng}.")
+   (license license:bsd-2)
+   ;; Supports SSE on x86-64 and NEON on AArch64.
+   (properties '((tunable? . #t)))))
diff --git a/gnu/packages/instrumentation.scm b/gnu/packages/instrumentation.scm
index f52cf11505..2d2f53225c 100644
--- a/gnu/packages/instrumentation.scm
+++ b/gnu/packages/instrumentation.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2021 Olivier Dion <olivier.dion@polymtl.ca>
+;;; Copyright © 2021, 2022 Olivier Dion <olivier.dion@polymtl.ca>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -50,6 +50,7 @@
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system copy)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system linux-module)
   #:use-module (guix download)
   #:use-module (guix gexp)
   #:use-module (guix git-download)
@@ -206,17 +207,41 @@ interactive SVGs out of traces genated from various tracing tools.  It comes
 with the script @command{flamegraph.pl} and many stackcollapse scripts.")
       (license license:cddl1.0))))
 
+(define-public lttng-modules
+  (package
+    (name "lttng-modules")
+    (version "2.13.4")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://lttng.org/files/lttng-modules/"
+                                  "lttng-modules-" version ".tar.bz2"))
+              (sha256
+               (base32
+                "1vm9nnjvid7acsvgwnjyxd60ih9rmbhnfjldxip58n8x9q7d0nb1"))))
+    (build-system linux-module-build-system)
+    (arguments
+     `(#:tests? #f ; no tests
+       #:make-flags (list "CONFIG_LTTNG=m"
+                          "CONFIG_LTTNG_CLOCK_PLUGIN_TEST=m")))
+    (home-page "https://lttng.org/")
+    (synopsis "LTTng kernel modules for the LTTng tracer toolset")
+    (description
+     "LTTng kernel modules are Linux kernel modules which make
+LTTng kernel tracing possible.  They include essential control modules and
+many probes which instrument numerous interesting parts of Linux.")
+    (license (list license:lgpl2.1 license:gpl2 license:expat))))
+
 (define-public lttng-ust
   (package
     (name "lttng-ust")
-    (version "2.13.1")
+    (version "2.13.3")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://lttng.org/files/lttng-ust/"
                                   "lttng-ust-" version ".tar.bz2"))
               (sha256
                (base32
-                "1p7d94r275yvby6zqfxaswdl1q46zxbc8x5rkhnjxrp1d41byrsn"))))
+                "0vwgxp027pgwm0a4xr6bdibday7xjlnv6wmbqh546l2h2i8jzi1c"))))
     (build-system gnu-build-system)
     (inputs
      (list numactl))
@@ -235,14 +260,14 @@ to ring buffers shared with a consumer daemon.")
 (define-public lttng-tools
   (package
     (name "lttng-tools")
-    (version "2.13.2")
+    (version "2.13.7")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://lttng.org/files/lttng-tools/"
                                   "lttng-tools-" version ".tar.bz2"))
               (sha256
                (base32
-                "1gfp9y24lpaiz4lcmbp30yd400jmh99mlay9gb8pz9qd080bmlnf"))))
+                "13gh4bvlgbh82h9vb80aw8l1cfmdj3xyvjg30cscz9vqy7l04yni"))))
     (build-system gnu-build-system)
     (arguments
      `( ;; FIXME - Currently there's a segmentation fault by swig when enabling
diff --git a/gnu/packages/irc.scm b/gnu/packages/irc.scm
index efb32a39e0..b82210081c 100644
--- a/gnu/packages/irc.scm
+++ b/gnu/packages/irc.scm
@@ -261,7 +261,7 @@ using a mouse.  It is customizable and extensible with plugins and scripts.")
 (define-public srain
   (package
     (name "srain")
-    (version "1.4.0")
+    (version "1.4.1")
     (source
      (origin
        (method git-fetch)
@@ -270,7 +270,7 @@ using a mouse.  It is customizable and extensible with plugins and scripts.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "113nvai3nr2c8mrr5q56fb7smg5awgb2f243sib4k1zj437v9q51"))))
+        (base32 "05n8j36yrmk353nkapc1vywf25wklwbzwkl2a4kz92wv74zrwi6f"))))
     (build-system meson-build-system)
     (arguments
      `(#:tests? #f ;there are no tests
diff --git a/gnu/packages/java.scm b/gnu/packages/java.scm
index 14fef6986c..73898d120c 100644
--- a/gnu/packages/java.scm
+++ b/gnu/packages/java.scm
@@ -2284,6 +2284,9 @@ new Date();"))
                  (("^#!.*") "#! java BlockedCertsConverter SHA-256\n"))))))))
     (home-page "https://openjdk.java.net/projects/jdk/17")))
 
+;;; Convenience alias to point to the latest version of OpenJDK.
+(define-public openjdk openjdk17)
+
 (define-public icedtea icedtea-8)
 
 
diff --git a/gnu/packages/julia.scm b/gnu/packages/julia.scm
index 0bdac66175..29c981189c 100644
--- a/gnu/packages/julia.scm
+++ b/gnu/packages/julia.scm
@@ -1,10 +1,10 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015, 2016, 2017 Ricardo Wurmus <rekado@elephly.net>
-;;; Copyright © 2016, 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2020-2022 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2020, 2021 Nicolò Balzarotti <nicolo@nixo.xyz>
 ;;; Copyright © 2020 Tim Howes <timhowes@lavabit.com>
 ;;; Copyright © 2020 Tobias Geerinckx-Rice <me@tobias.gr>
-;;; Copyright © 2021 Jean-Baptiste Volatier <jbv@pm.me>
+;;; Copyright © 2021, 2022 Jean-Baptiste Volatier <jbv@pm.me>
 ;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
@@ -139,7 +139,7 @@ libraries.  It is also a bit like @code{ldd} and @code{otool -L}.")
 (define-public julia
   (package
     (name "julia")
-    (version "1.6.3")
+    (version "1.6.7")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -147,7 +147,7 @@ libraries.  It is also a bit like @code{ldd} and @code{otool -L}.")
                     version "/julia-" version ".tar.gz"))
               (sha256
                (base32
-                "1515x8fs25l3f9csbmd1v4nm041zvjnvigy6s5iidy4yrkwdx4r5"))
+                "0q9xgdpvdkskpzl294w215f6c15c5jk276c9dah5f5w4np3ivbvl"))
               (patches
                (search-patches "julia-SOURCE_DATE_EPOCH-mtime.patch"
                                "julia-allow-parallel-build.patch"))))
@@ -206,6 +206,10 @@ libraries.  It is also a bit like @code{ldd} and @code{otool -L}.")
              (substitute* "base/Makefile"
                (("\\$\\$\\(build_depsbindir\\)/libwhich")
                 (search-input-file inputs "/bin/libwhich")))))
+         (add-after 'unpack 'activate-gnu-source-for-loader
+           (lambda _
+             (substitute* "cli/Makefile"
+               (("LOADER_CFLAGS =") "LOADER_CFLAGS = -D_GNU_SOURCE"))))
          (add-after 'unpack 'change-number-of-precompile-statements
            (lambda _
              ;; Remove nss-certs drops the number of statements below 1200,
@@ -222,12 +226,11 @@ libraries.  It is also a bit like @code{ldd} and @code{otool -L}.")
                                   "base/Makefile")
                      ((".*libquadmath.*") ""))
                    (substitute* "Makefile"
-                     (("libquadmath ") ""))
-                   #t)))
+                     (("libquadmath ") "")))))
              '())
          (add-before 'check 'set-home
            ;; Some tests require a home directory to be set.
-           (lambda _ (setenv "HOME" "/tmp") #t))
+           (lambda _ (setenv "HOME" "/tmp")))
          (add-before 'build 'fix-include-and-link-paths
            (lambda* (#:key inputs #:allow-other-keys)
              ;; LIBUTF8PROC is a linker flag, not a build target.  It is
@@ -332,10 +335,11 @@ libraries.  It is also a bit like @code{ldd} and @code{otool -L}.")
                    (mpfr (assoc-ref inputs "mpfr"))
                    (gmp (assoc-ref inputs "gmp"))
                    (nghttp2 (assoc-ref inputs "libnghttp2"))
+                   (zlib (assoc-ref inputs "zlib"))
                    (suitesparse (assoc-ref inputs "suitesparse")))
                ;; Some tests only check to see if the input is the correct version.
                (substitute* "stdlib/PCRE2_jll/test/runtests.jl"
-                 (("10.36.0") ,(package-version pcre2)))
+                 (("10.40.0") ,(package-version pcre2)))
                (substitute* "stdlib/MbedTLS_jll/test/runtests.jl"
                  (("2.24.0") ,(package-version mbedtls-apache)))
                (substitute* "stdlib/MPFR_jll/test/runtests.jl"
@@ -344,6 +348,8 @@ libraries.  It is also a bit like @code{ldd} and @code{otool -L}.")
                  (("6.2.0") ,(package-version gmp)))
                (substitute* "stdlib/nghttp2_jll/test/runtests.jl"
                  (("1.41.0") ,(package-version nghttp2)))
+               (substitute* "stdlib/Zlib_jll/test/runtests.jl"
+                 (("1.2.12") ,(package-version zlib)))
                (substitute* "stdlib/SuiteSparse_jll/test/runtests.jl"
                  (("5004") ,(string-replace-substring
                               (version-major+minor
@@ -355,17 +361,12 @@ libraries.  It is also a bit like @code{ldd} and @code{otool -L}.")
              ;; https://github.com/JuliaLang/julia/pull/41614
              ;; https://github.com/JuliaLang/julia/issues/41156
              (substitute* "test/choosetests.jl"
-               (("skip_tests = \\[\\]")
-                "skip_tests = [\"REPL\", \"precompile\"]"))
+               (("\"precompile\",") ""))
              ;; Dates/io tests fail on master when networking is unavailable
              ;; https://github.com/JuliaLang/julia/issues/34655
              (substitute* "stdlib/Dates/test/io.jl"
                (("using Dates") "import Dates
 using Dates: @dateformat_str, Date, DateTime, DateFormat, Time"))
-             ;; Upstream bug I found when packaging
-             ;; https://github.com/JuliaLang/julia/issues/35785
-             (substitute* "test/file.jl"
-               (("@test dirname\\(t\\) == d") "@test_broken dirname(t) == d"))
              ;; julia embeds a certificate, we are not doing that
              (substitute* "stdlib/MozillaCACerts_jll/test/runtests.jl"
                (("@test isfile\\(MozillaCACerts_jll.cacert\\)")
@@ -385,14 +386,7 @@ using Dates: @dateformat_str, Date, DateTime, DateFormat, Time"))
              (substitute* "test/cmdlineargs.jl"
                (("test v\\[3") "test_broken v[3")
                (("test isempty\\(v\\[3") "test_broken isempty(v[3"))
-             ;; These tests randomly fails because they depend on CPU.
-             (substitute* "stdlib/LinearAlgebra/test/matmul.jl"
-               ;; Fixed in v1.6.4 (see:
-               ;; https://github.com/JuliaLang/julia/blob/v1.6.4/
-               ;; stdlib/LinearAlgebra/test/matmul.jl#L155).
-               (("@test mul\\!\\(C, vf, transpose\\(vf\\), 2, 3\\)\
- == 2vf\\*vf' \\.\\+ 3C0")
-                "@test mul!(C, vf, transpose(vf), 2, 3) ≈ 2vf*vf' .+ 3C0"))
+             ;; These test(s) randomly fails because they depend on CPU.
              (substitute* "test/math.jl"
                ;; @test_broken cannot be used because if the test randomly
                ;; passes, then it also raises an error.
@@ -447,6 +441,7 @@ using Dates: @dateformat_str, Date, DateTime, DateFormat, Time"))
                      ("" "$JULIA_DEPOT_PATH"))))))))
        #:make-flags
        (list
+        "VERBOSE=1" ;; more helpful logging of what make is doing
         (string-append "prefix=" (assoc-ref %outputs "out"))
 
          ;; Passing the MARCH or JULIA_CPU_TARGET flag is necessary to build
diff --git a/gnu/packages/libreoffice.scm b/gnu/packages/libreoffice.scm
index f3d24343c6..f58887c50b 100644
--- a/gnu/packages/libreoffice.scm
+++ b/gnu/packages/libreoffice.scm
@@ -1254,8 +1254,6 @@ converting QuarkXPress file format.  It supports versions 3.1 to 4.1.")
                        (dirname
                         (search-input-file %build-inputs
                                            "lib/libboost_system.so")))
-        ;; Avoid undefined symbols required by boost::spirit
-        "LDFLAGS=-lboost_system"
         ;; Avoid a dependency on ucpp.
         "--with-idlc-cpp=cpp"
         ;; The fonts require an external tarball (crosextrafonts).
@@ -1282,4 +1280,7 @@ a number of components: Writer, a word processor; Calc, a spreadsheet
 application; Impress, a presentation engine; Draw, a drawing and
 flowcharting application; Base, a database and database frontend;
 Math for editing mathematics.")
+  (properties
+   '((release-monitoring-url
+      . "https://www.libreoffice.org/download/download-libreoffice/")))
   (license license:mpl2.0)))
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 3de751e789..aa777095c4 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -352,17 +352,17 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
 ;; The current "stable" kernels. That is, the most recently released major
 ;; versions that are still supported upstream.
 
-(define-public linux-libre-5.18-version "5.18.16")
+(define-public linux-libre-5.18-version "5.18.19")
 (define-public linux-libre-5.18-gnu-revision "gnu")
 (define deblob-scripts-5.18
   (linux-libre-deblob-scripts
    linux-libre-5.18-version
    linux-libre-5.18-gnu-revision
    (base32 "09aikdhij4d89wqd8mmkdr0nrfwqz6dx3n74qm6wx815rfngd2dz")
-   (base32 "0vjpn8iw9yg39sr6jfhzyvivf159h9zfgnjamwa283zfll0h0a53")))
+   (base32 "03w1p49rf7sqsxvwpdndqa0k9hc9748rplyqiiw1q6cbdjficwyw")))
 (define-public linux-libre-5.18-pristine-source
   (let ((version linux-libre-5.18-version)
-        (hash (base32 "1khi1npn8d8jimwdy8bf3r7l780mxdmvk5azdv419pk33qjqdxgi")))
+        (hash (base32 "1mc8zhiw0v7fka64mydpdrxkrvy0jyqggq5lghw3pyqj2wjrpw6z")))
    (make-linux-libre-source version
 
                             (%upstream-linux-source version hash)
@@ -371,22 +371,22 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
 ;; The "longterm" kernels — the older releases with long-term upstream support.
 ;; Here are the support timelines:
 ;; <https://www.kernel.org/category/releases.html>
-(define-public linux-libre-5.15-version "5.15.59")
+(define-public linux-libre-5.15-version "5.15.63")
 (define-public linux-libre-5.15-gnu-revision "gnu")
 (define deblob-scripts-5.15
   (linux-libre-deblob-scripts
    linux-libre-5.15-version
    linux-libre-5.15-gnu-revision
    (base32 "1n57mz5agvf1d0ggbg080d7hvx8p9y0iqxkq4ypg10a7n96zy7y5")
-   (base32 "129qlhwdv2mfb85gbvq03kkbdfp73b444rryr4rrbvi0jmq4cp24")))
+   (base32 "1r189c704jvizk452zcsm9v3g27ybjcjchjwxazsy3nx0wdwx7si")))
 (define-public linux-libre-5.15-pristine-source
   (let ((version linux-libre-5.15-version)
-        (hash (base32 "1jxw6fnc7yaw7r6193wy6l8wdlpy3frw48drnc3dnh3k0m1cdpg6")))
+        (hash (base32 "0hbkxgadz0vcslni4r46yc202wcnxblcfvkcph1017b2b8gcvlvd")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-5.15)))
 
-(define-public linux-libre-5.10-version "5.10.135")
+(define-public linux-libre-5.10-version "5.10.138")
 (define-public linux-libre-5.10-gnu-revision "gnu1")
 (define deblob-scripts-5.10
   (linux-libre-deblob-scripts
@@ -396,12 +396,12 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
    (base32 "1981axxswghza3iadp94q54y8w30h9w9vyq4cbjiiv9alvbv0pb8")))
 (define-public linux-libre-5.10-pristine-source
   (let ((version linux-libre-5.10-version)
-        (hash (base32 "0i1kahv739qpyyml7d7sx306nv7gp55i5d97vlb0fryfx4dsd6g4")))
+        (hash (base32 "1a2vmcqzi71w88j79lxsrgyycq1l1gxp0cvh5ya4afhfisxh7819")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-5.10)))
 
-(define-public linux-libre-5.4-version "5.4.209")
+(define-public linux-libre-5.4-version "5.4.211")
 (define-public linux-libre-5.4-gnu-revision "gnu1")
 (define deblob-scripts-5.4
   (linux-libre-deblob-scripts
@@ -411,12 +411,12 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
    (base32 "1vnjbdyssa7dwyjl9kg35alwvf7yh597cl74yr1wy2gk5bc9paw6")))
 (define-public linux-libre-5.4-pristine-source
   (let ((version linux-libre-5.4-version)
-        (hash (base32 "1kdnz99k7zspzaxqaxahbf6hncigy4cvjlb79jsy7a95qxxr31qf")))
+        (hash (base32 "1v1dgsk66fi6x6v9k6hg9ik3f3b3pv7a3gk8mybmgm9cnx0k5d5z")))
    (make-linux-libre-source version
                             (%upstream-linux-source version hash)
                             deblob-scripts-5.4)))
 
-(define-public linux-libre-4.19-version "4.19.254")
+(define-public linux-libre-4.19-version "4.19.256")
 (define-public linux-libre-4.19-gnu-revision "gnu1")
 (define deblob-scripts-4.19
   (linux-libre-deblob-scripts
@@ -426,12 +426,12 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
    (base32 "00i91lx938nqlgy63hiricqd0fnbbf26vgya9c5lb7m1f4x324im")))
 (define-public linux-libre-4.19-pristine-source
   (let ((version linux-libre-4.19-version)
-        (hash (base32 "1rd40wmdaymbly2zvf60mjqsflkd4n1y232qz0ixn1rfl28yz62i")))
+        (hash (base32 "0jgm7ydha9achbcq3a6q85wq1nz4qg7phx122jzk0mqb1339bpk7")))
     (make-linux-libre-source version
                              (%upstream-linux-source version hash)
                              deblob-scripts-4.19)))
 
-(define-public linux-libre-4.14-version "4.14.290")
+(define-public linux-libre-4.14-version "4.14.291")
 (define-public linux-libre-4.14-gnu-revision "gnu1")
 (define deblob-scripts-4.14
   (linux-libre-deblob-scripts
@@ -441,12 +441,12 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
    (base32 "00i91lx938nqlgy63hiricqd0fnbbf26vgya9c5lb7m1f4x324im")))
 (define-public linux-libre-4.14-pristine-source
   (let ((version linux-libre-4.14-version)
-        (hash (base32 "0zyxb99a7fa2l85vnzmvg2nry99clj20d4j38piqm921iqxak2j4")))
+        (hash (base32 "15h76l81zn733g8dc6gsymf52nz325plhminv3m4x3klwhav34zc")))
     (make-linux-libre-source version
                              (%upstream-linux-source version hash)
                              deblob-scripts-4.14)))
 
-(define-public linux-libre-4.9-version "4.9.325")
+(define-public linux-libre-4.9-version "4.9.326")
 (define-public linux-libre-4.9-gnu-revision "gnu1")
 (define deblob-scripts-4.9
   (linux-libre-deblob-scripts
@@ -456,7 +456,7 @@ corresponding UPSTREAM-SOURCE (an origin), using the given DEBLOB-SCRIPTS."
    (base32 "0bib3641dbcqdkx3anna3caxnsg3nw9cnmhcklq0s93g3m57041h")))
 (define-public linux-libre-4.9-pristine-source
   (let ((version linux-libre-4.9-version)
-        (hash (base32 "04msx0x0d8v93zjr3jj0qqkgg7m4hb7rj6hk5vzrzasmgbjmb3dl")))
+        (hash (base32 "0yw83a8nk5abjsvqrz8m2sj699c228j2f2wr5q8m95vgqzfw5wrb")))
     (make-linux-libre-source version
                              (%upstream-linux-source version hash)
                              deblob-scripts-4.9)))
@@ -1373,81 +1373,6 @@ and the notification, WiFi, and Bluetooth LED.")
 detection of security vulnerability exploits against the kernel.")
     (license license:gpl2)))
 
-(define-public rtl8821ce-linux-module
-  (let ((commit "be733dc86781c68571650b395dd0fa6b53c0a039")
-        (revision "6"))
-    (package
-      (name "rtl8821ce-linux-module")
-      (version (git-version "0.0.0" revision commit))
-      (source
-       (origin
-         (method git-fetch)
-         (uri (git-reference
-               (url "https://github.com/tomaspinho/rtl8821ce")
-               (commit commit)))
-         (file-name (git-file-name name version))
-         (sha256
-          (base32
-           "00sd7s0582b9jcpfgy0fw6418dwg700mfyizkfr22jf2x140iy70"))))
-      (build-system linux-module-build-system)
-      (arguments
-       (list #:make-flags
-             #~(list (string-append "CC=" #$(cc-for-target))
-                     (string-append "KSRC="
-                                    (assoc-ref %build-inputs
-                                               "linux-module-builder")
-                                    "/lib/modules/build"))
-             #:phases
-             #~(modify-phases %standard-phases
-                 (replace 'build
-                   (lambda* (#:key (make-flags '()) (parallel-build? #t)
-                                   #:allow-other-keys)
-                     (apply invoke "make"
-                            `(,@(if parallel-build?
-                                    `("-j" ,(number->string (parallel-job-count)))
-                                    '())
-                              ,@make-flags)))))
-             #:tests? #f))                  ; no test suite
-      (home-page "https://github.com/tomaspinho/rtl8821ce")
-      (synopsis "Linux driver for Realtek RTL8821CE wireless network adapters")
-      (description "This is Realtek's RTL8821CE Linux driver for wireless
-network adapters.")
-      (license license:gpl2))))
-
-(define-public rtl8812au-aircrack-ng-linux-module
-  (let ((commit "6d0d9fb56d4d918012a5c7a030b9233cad039cdd")
-        (revision "8"))
-    (package
-      (inherit rtl8821ce-linux-module)
-      (name "rtl8812au-aircrack-ng-linux-module")
-      (version (git-version "5.6.4.2" revision commit))
-      (source
-       (origin
-         (method git-fetch)
-         (uri (git-reference
-               (url "https://github.com/aircrack-ng/rtl8812au")
-               (commit commit)))
-         (file-name (git-file-name name version))
-         (sha256
-          (base32 "012asiy43ik13kl9p97sscdsqq5jihq73s4ws3g5wqqczqcgrsvc"))
-         (modules '((guix build utils)))
-         (snippet
-          #~(begin
-              ;; Remove bundled tarballs, APKs, word lists, speadsheets,
-              ;; and other unnecessary unlicenced things.
-              (for-each delete-file-recursively (list "android"
-                                                      "docs"
-                                                      "tools"))))))
-      (supported-systems '("x86_64-linux" "i686-linux"))
-      (home-page "https://github.com/aircrack-ng/rtl8812au")
-      (synopsis "Linux driver for Realtek USB wireless network adapters")
-      (description
-       "This is Realtek's rtl8812au Linux driver for USB 802.11n wireless
-network adapters, modified by the aircrack-ng project to support monitor mode
-and frame injection.  It provides a @code{88XXau} kernel module that supports
-RTL8812AU, RTL8821AU, and RTL8814AU chips.")
-      (license license:gpl2+))))
-
 (define-public vhba-module
   (package
     (name "vhba-module")
@@ -6662,7 +6587,7 @@ the @code{mce-inject} module loaded if it exists.")
 (define-public mcelog
   (package
     (name "mcelog")
-    (version "181")
+    (version "187")
     (source
      (origin
        (method git-fetch)
@@ -6671,7 +6596,7 @@ the @code{mce-inject} module loaded if it exists.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0c9zdivv86xd8dmwia0k9fbr52zrafbyzn7ss53mh17sry5gm716"))
+        (base32 "0zdlwbdqs4s72yrpz4irhp12c1wqzy8kmf4hxahk13dmafd6dbnj"))
        (modules '((guix build utils)))
        (snippet
         `(begin
@@ -7286,14 +7211,14 @@ re-use code and to avoid re-inventing the wheel.")
 (define-public libnftnl
   (package
     (name "libnftnl")
-    (version "1.2.2")
+    (version "1.2.3")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://netfilter.org/libnftnl/"
                            "libnftnl-" version ".tar.bz2"))
        (sha256
-        (base32 "02kdxp4l1ds5lpkw6rxv6f7icc70am6ik3p9z5l8v48mkm7h1z4y"))))
+        (base32 "0m82bmh8i24hwxmz7rxwxjll4904ghd2b1x1p5h8algrg6dyl5p9"))))
     (build-system gnu-build-system)
     (native-inputs
      (list pkg-config))
@@ -7328,7 +7253,7 @@ used by nftables.")
 (define-public nftables
   (package
     (name "nftables")
-    (version "1.0.4")
+    (version "1.0.5")
     (source
      (origin
        (method url-fetch)
@@ -7337,7 +7262,7 @@ used by nftables.")
                   (string-append "https://www.nftables.org/projects/nftables"
                                  "/files/nftables-" version ".tar.bz2")))
        (sha256
-        (base32 "0ddsdj6zs78hndffl3iikpa1wzjxcpmr3xqcq4la71gnl7zb2zwj"))))
+        (base32 "02p59m773l2xqcb7ib7cprlpjfdnp792bahbs6c3dx1s74c4n6wd"))))
     (build-system gnu-build-system)
     (arguments `(#:configure-flags
                  '("--disable-static"
@@ -7840,14 +7765,14 @@ available in the kernel Linux.")
 (define-public cpuid
   (package
     (name "cpuid")
-    (version "20220620")
+    (version "20220812")
     (source (origin
               (method url-fetch)
               (uri (string-append "http://www.etallen.com/cpuid/cpuid-"
                                   version ".src.tar.gz"))
               (sha256
                (base32
-                "06nb69vlv1szdzq1dp784pgbr9z2py050v1hlrn4rr56jp0a2nci"))))
+                "1gss85szv4b48d93d6hzkkzggicdvw8dijiwfs84ywclgnwqzxiv"))))
     (build-system gnu-build-system)
     (arguments
      (list #:make-flags
diff --git a/gnu/packages/lisp-xyz.scm b/gnu/packages/lisp-xyz.scm
index 03e474831d..6018c4deff 100644
--- a/gnu/packages/lisp-xyz.scm
+++ b/gnu/packages/lisp-xyz.scm
@@ -6831,7 +6831,7 @@ extension-points via the concept of hooks.")
       (synopsis "Common Lisp abstraction layer over platform dependent functionality")
       (description "@code{s-sysdeps} is an abstraction layer over platform
 dependent functionality.  This simple package is used as a building block in a
-number of other open source projects.
+number of other projects.
 
 @code{s-sysdeps} abstracts:
 
@@ -22665,6 +22665,38 @@ the Processing language and shares some of the API.")
 (define-public ecl-sketch
   (sbcl-package->ecl-package sbcl-sketch))
 
+(define-public sbcl-string-pokemonize
+  (let ((commit "2dc01643defb497e4d1eb833def71dfc1e8d5da6")
+        (revision "0"))
+    (package
+     (name "sbcl-string-pokemonize")
+     (version (git-version "20210503" revision commit))
+     (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/phoe/string-pokemonize")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32 "1zk5klc94pxv7mhx6qrp93rk4ypwd6wfijap7gf9l0wpphg90r9x"))))
+     (build-system asdf-build-system/sbcl)
+     (arguments
+      `(#:tests? #f ; There are no tests.
+        #:asd-systems '("string-pokemonize")))
+     (synopsis "Alternate upper- and lowercase")
+     (description
+      "@code{string-pokemonize} provides a function that alternates uppercase
+and lowercase characters for a given string.")
+     (home-page "https://github.com/phoe/string-pokemonize")
+     (license license:expat))))
+
+(define-public cl-string-pokemonize
+  (sbcl-package->cl-source-package sbcl-string-pokemonize))
+
+(define-public ecl-string-pokemonize
+  (sbcl-package->ecl-package sbcl-string-pokemonize))
+
 (define-public sbcl-binary-types
   (let ((commit "9ec42042a50403961c08179a892ae3de725b1d7a"))
     (package
diff --git a/gnu/packages/lisp.scm b/gnu/packages/lisp.scm
index 8e59ec956b..2f37b82ea5 100644
--- a/gnu/packages/lisp.scm
+++ b/gnu/packages/lisp.scm
@@ -984,7 +984,7 @@ the HTML documentation of TXR.")
 (define-public txr
   (package
     (name "txr")
-    (version "278")
+    (version "280")
     (source
      (origin
        (method git-fetch)
@@ -993,7 +993,7 @@ the HTML documentation of TXR.")
              (commit (string-append "txr-" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "08jmqv245vnvl4xx6x5a5hxlnhdcipfdbja54dvsi6wkiks2fif7"))))
+        (base32 "1ni2yb9dggldgizfp13mvrw5vzk13pg74dpk2lyn9dijqvs293s4"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags
@@ -1232,7 +1232,7 @@ including a built-in database engine and a GUI system.")
 (define-public janet
   (package
     (name "janet")
-    (version "1.23.0")
+    (version "1.24.0")
     (source
      (origin
        (method git-fetch)
@@ -1241,7 +1241,7 @@ including a built-in database engine and a GUI system.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1qfahq1203kv5jxd0im7nxm3yy1p9k1wc0pk34b5h2sfships1hm"))))
+        (base32 "07kyjzbj5g197008n9qwpdnagylzlv8x4zbsf2d233mpskv3dixi"))))
     (build-system gnu-build-system)
     (arguments
      (list #:make-flags
diff --git a/gnu/packages/lxde.scm b/gnu/packages/lxde.scm
index 55deae26ea..0291f50302 100644
--- a/gnu/packages/lxde.scm
+++ b/gnu/packages/lxde.scm
@@ -10,6 +10,7 @@
 ;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2019 Meiyo Peng <meiyo@riseup.net>
 ;;; Copyright © 2021 Guillaume Le Vaillant <glv@posteo.net>
+;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -59,6 +60,7 @@
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system trivial)
   #:use-module (guix download)
+  #:use-module (guix gexp)
   #:use-module (guix git-download)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
@@ -77,7 +79,8 @@
                (base32
                 "1rfira3lx8v6scz1aq69925j4vslpp36bmgrrzcfby2c60q2c155"))))
     (build-system gnu-build-system)
-    (inputs (list glib gtk+-2))
+    (arguments (list #:configure-flags #~(list "--with-gtk=3")))
+    (inputs (list glib gtk+))
     (native-inputs (list intltool
                          `(,glib "bin") ; for gtester
                          libtool
@@ -87,7 +90,7 @@
     (synopsis "File management support (core library)")
     (description "LibFM provides file management functions built on top of
 Glib/GIO giving a higher-level API.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:gpl2+)))
 
 (define-public libfm-extra
@@ -112,12 +115,13 @@ libFM file management library.")))
        (sha256
         (base32 "0f4bjaamfxxdr9civvy55pa6vv9dx1hjs522gjbbgx7yp1cdh8kj"))))
     (build-system gnu-build-system)
-    (inputs (list gtk+-2))
+    (arguments (list #:configure-flags #~(list "--enable-gtk3")))
+    (inputs (list gtk+))
     (native-inputs (list intltool pkg-config))
     (synopsis "LXDE GTK+ theme switcher")
     (description "LXAppearance is a desktop-independent GTK+ theme switcher
 able to change themes, icons, and fonts used by GTK+ applications.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:gpl2+)))
 
 (define-public lxrandr
@@ -135,7 +139,8 @@ able to change themes, icons, and fonts used by GTK+ applications.")
                 "04n3vgh3ix12p8jfs4w0dyfq3anbjy33h7g53wbbqqc0f74xyplb"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:phases
+     `(#:configure-flags (list "--enable-gtk3")
+       #:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'xrandr-absolutely
            ;; lxrandr is useless without xrandr and gives an unhelpful error
@@ -143,9 +148,8 @@ able to change themes, icons, and fonts used by GTK+ applications.")
            (lambda* (#:key input #:allow-other-keys)
              (substitute* "src/lxrandr.c"
                (("(\"|')xrandr\"" _ match)
-                (string-append match (which "xrandr") "\"")))
-             #t)))))
-    (inputs (list gtk+-2 xrandr))
+                (string-append match (which "xrandr") "\""))))))))
+    (inputs (list gtk+ xrandr))
     (native-inputs (list intltool pkg-config))
     (synopsis "LXDE monitor configuration tool")
     (description "LXRandR is a very basic monitor configuration tool.  It
@@ -153,7 +157,7 @@ relies on the X11 resize-and-rotate (RandR) extension but doesn't aim to be a
 full frontend of it.  LXRandR only gives you some easy and quick options which
 are intuitive.  It's suitable for laptop users who frequently uses projectors
 or external monitor.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:gpl2+)))
 
 (define-public lxtask
@@ -170,13 +174,14 @@ or external monitor.")
                (base32
                 "0b2fxg8jjjpk219gh7qa18g45365598nd2bq7rrq0bdvqjdxy5i2"))))
     (build-system gnu-build-system)
-    (inputs (list gtk+-2))
+    (arguments (list #:configure-flags #~(list "--enable-gtk3")))
+    (inputs (list gtk+))
     (native-inputs (list intltool pkg-config))
     (synopsis "LXDE task manager")
     (description "LXTask is a lightweight task manager derived from Xfce task
 manager with all dependencies on Xfce removed.  LXTask is based on the GTK+
 toolkit.  It allows users to monitor and control of running processes.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:gpl2+)))
 
 (define-public lxterminal
@@ -192,14 +197,15 @@ toolkit.  It allows users to monitor and control of running processes.")
                (base32
                 "1124pghrhnx6q4391ri8nvi6bsmvbj1dx81an08mird8jf2b2rii"))))
     (build-system gnu-build-system)
-    (inputs (list gtk+-2 vte/gtk+-2))
+    (arguments (list #:configure-flags #~(list "--enable-gtk3")))
+    (inputs (list gtk+ vte))
     (native-inputs (list intltool pkg-config))
     (synopsis "LXDE terminal emulator")
     (description "LXTerminal is a VTE-based terminal emulator.  It supports
 multiple tabs and has only minimal dependencies thus being completely
 desktop-independent.  In order to reduce memory usage and increase the
 performance, all instances of the terminal are sharing a single process.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:gpl2+)))
 
 (define-public menu-cache
@@ -223,7 +229,7 @@ performance, all instances of the terminal are sharing a single process.")
     (synopsis "LXDE implementation of the freedesktop menu's cache")
     (description "Menu-cache is a library creating and utilizing caches to
 speed up the access to freedesktop.org defined application menus.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:lgpl2.1+)))
 
 (define-public pcmanfm
@@ -239,15 +245,16 @@ speed up the access to freedesktop.org defined application menus.")
                (base32
                 "1xqc2k2jh165mm81xg0ghxx0ml1s3rhh4ndvbzkcri4kfhj7pjql"))))
     (build-system gnu-build-system)
-    (inputs (list gtk+-2 gvfs ; for trash and mount support
+    (arguments (list #:configure-flags #~(list "--with-gtk=3")))
+    (inputs (list gtk+ gvfs             ;for trash and mount support
                   libfm libx11))
     (native-inputs (list intltool libtool pkg-config))
     (propagated-inputs
-     (list lxmenu-data))   ; for "Open With..." application list
+     (list lxmenu-data))                ;for "Open With..." application list
     (synopsis "LXDE file manager")
     (description "PCMan is a lightweight GTK+ based file manager, compliant
 with freedesktop.org standard.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:gpl2+)))
 
 (define-public spacefm
@@ -415,7 +422,8 @@ customizable menu system, and Bash integration.")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://downloads.sourceforge.net/lxde/"
+       (uri (string-append "mirror://sourceforge//lxde/"
+                           "lxmenu-data%20%28desktop%20menu%29/"
                            name "-" version ".tar.xz"))
        (sha256
         (base32
@@ -427,7 +435,7 @@ customizable menu system, and Bash integration.")
     (description
      "Lxmenu-data provides files required to build freedesktop.org
 menu spec-compliant desktop menus for LXDE.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:lgpl2.1+)))
 
 (define-public lxde-icon-theme
@@ -437,7 +445,8 @@ menu spec-compliant desktop menus for LXDE.")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://downloads.sourceforge.net/lxde/"
+       (uri (string-append "mirror://sourceforge/lxde/LXDE%20Icon%20Theme/"
+                           "lxde-icon-theme-" version "/"
                            name "-" version ".tar.xz"))
        (sha256
         (base32
@@ -448,7 +457,7 @@ menu spec-compliant desktop menus for LXDE.")
     (synopsis "LXDE default icon theme based on nuoveXT2")
     (description
      "Lxde-icon-theme provides an default icon theme for LXDE.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:lgpl3)))
 
 (define-public lxde-common
@@ -458,7 +467,9 @@ menu spec-compliant desktop menus for LXDE.")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://downloads.sourceforge.net/lxde/"
+       (uri (string-append "mirror://sourceforge/lxde/"
+                           "lxde-common%20%28default%20config%29/"
+                           "lxde-common%20" (version-major+minor version) "/"
                            name "-" version ".tar.xz"))
        (sha256
         (base32
@@ -484,7 +495,7 @@ menu spec-compliant desktop menus for LXDE.")
     (synopsis "Common files of the LXDE Desktop")
     (description
      "Lxde-common provides common files of the LXDE Desktop.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:gpl2+)))
 
 (define-public lxinput
@@ -494,21 +505,23 @@ menu spec-compliant desktop menus for LXDE.")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://downloads.sourceforge.net/lxde/"
-                           name "-" version ".tar.xz"))
+       (uri (string-append "mirror://sourceforge/lxde/"
+                           "LXInput%20%28Kbd%20and%20amp_%20mouse%20config%29/"
+                           "LXInput%200.3.x/" name "-" version ".tar.xz"))
        (sha256
         (base32
          "123f3yn4rp1w5b3n5aj3ad9snkxab29qkrs7bcvf5bx4cn57g3sf"))))
     (build-system gnu-build-system)
+    (arguments (list #:configure-flags #~(list "--enable-gtk3")))
     (inputs
-     (list gtk+-2))
+     (list gtk+))
     (native-inputs
      (list pkg-config intltool))
     (synopsis "Tool for mouse and keyboard configuration in LXDE")
     (description
      "Lxinput provides a small program to configure keyboard and mouse
 in LXDE.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:gpl2+)))
 
 (define-public lxsession
@@ -518,7 +531,9 @@ in LXDE.")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://downloads.sourceforge.net/lxde/"
+       (uri (string-append "mirror://sourceforge/lxde/"
+                           "LXSession%20%28session%20manager%29/"
+                           "LXSession%200.5.x/"
                            "lxsession-" version ".tar.xz"))
        (sha256
         (base32 "0imv9nysip1j9lrb2z96kl05isjgp312323wnnd5b59h0ff0sgp4"))
@@ -534,21 +549,20 @@ in LXDE.")
                    (and (string-suffix? ".c" file)
                         (file-exists? (c->vala file))))))
            (for-each delete-file
-                     (find-files "." generated-c-file?))
-           #t))))
+                     (find-files "." generated-c-file?))))))
     (build-system gnu-build-system)
     (arguments
-     `(#:phases
+     `(#:configure-flags (list "--enable-gtk3")
+       #:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'rm-stamp
            (lambda _
              (for-each delete-file (find-files "." "\\.stamp$"))
              ;; Force regeneration of configure script.
-             (delete-file "configure")
-             #t)))))
+             (delete-file "configure"))))))
     (inputs
-     `(("gtk+-2" ,gtk+-2)
-       ("polkit" ,polkit)))
+     (list gtk+
+           polkit))
     (native-inputs
      (list pkg-config
            intltool
@@ -560,7 +574,7 @@ in LXDE.")
     (synopsis "Lightweight X11 session manager")
     (description
      "Lxsession provides an lightweight X11 session manager.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:gpl2+)))
 
 (define-public lxpanel
@@ -570,43 +584,51 @@ in LXDE.")
     (source
      (origin
        (method url-fetch)
-       (uri (string-append "https://downloads.sourceforge.net/lxde/"
-                           "lxpanel-" version ".tar.xz"))
+       (uri (string-append "mirror://sourceforge/lxde/"
+                           "LXPanel%20%28desktop%20panel%29/"
+                           "LXPanel%200.10.x/lxpanel-"
+                           version ".tar.xz"))
        (sha256
         (base32 "1s0y8jjkw6qz0r8l90618b8xly0c8g906kah7b162sz3sxbqyc8y"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-after 'install 'wrap
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out"))
-                   (menu (assoc-ref inputs "lxmenu-data")))
-               (wrap-program (string-append out "/bin/lxpanel")
-                 `("XDG_DATA_DIRS" ":" prefix
-                   (,(string-append menu "/share"))))
-               #t))))))
+     (list
+      #:configure-flags #~(list "--enable-gtk3")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'install 'wrap
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              (wrap-program (search-input-file outputs "bin/lxpanel")
+                `("XDG_DATA_DIRS" ":" prefix
+                  (,(string-append #$(this-package-input "lxmenu-data")
+                                   "/share")))))))))
     (inputs
-     ;; TODO: libindicator-0.3.0
-     `(("curl" ,curl)
-       ("gtk+-2" ,gtk+-2)
-       ("alsa-lib" ,alsa-lib)
-       ("libwnck-2" ,libwnck-2)
-       ("keybinder" ,keybinder)
-       ("libxmu" ,libxmu)
-       ("libxpm" ,libxpm)
-       ("libxml2" ,libxml2)
-       ("cairo" ,cairo)
-       ("libx11" ,libx11)
-       ("wireless-tools" ,wireless-tools)))
+     (list alsa-lib
+           bash-minimal                 ;for wrap-program
+           cairo
+           curl
+           gtk+
+           keybinder
+           libindicator
+           libwnck
+           libx11
+           libxml2
+           libxmu
+           libxpm
+           wireless-tools))
     (native-inputs
-     (list pkg-config intltool docbook-xml gettext-minimal))
+     (list docbook-xml
+           gettext-minimal
+           intltool
+           pkg-config))
     (propagated-inputs
-     (list lxmenu-data libfm menu-cache))
+     (list libfm
+           lxmenu-data
+           menu-cache))
     (synopsis "X11 Desktop panel for LXDE")
     (description
      "Lxpanel provides an X11 desktop panel for LXDE.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:gpl2+)))
 
 (define-public lxde
@@ -645,7 +667,7 @@ user friendly and slim, while keeping the resource usage low.  LXDE uses
 less RAM and less CPU while being a feature rich desktop environment.  Unlike
 other tightly integrated desktops LXDE strives to be modular, so each
 component can be used independently with few dependencies.")
-    (home-page "https://lxde.github.io")
+    (home-page "https://www.lxde.org/")
     (license license:gpl2+))) ; And others.
 
 ;;; lxde.scm ends here
diff --git a/gnu/packages/lxqt.scm b/gnu/packages/lxqt.scm
index eab9a24d1d..ceb69f2199 100644
--- a/gnu/packages/lxqt.scm
+++ b/gnu/packages/lxqt.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
-;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
+;;; Copyright © 2015, 2022 Sou Bunnbu <iyzsong@gmail.com>
 ;;; Copyright © 2016 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2017 Nikita <nikita@n0.is>
@@ -31,6 +31,7 @@
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix gexp)
   #:use-module (guix packages)
   #:use-module (guix utils)
   #:use-module (guix build-system cmake)
@@ -129,7 +130,7 @@ to statistics about the system on which it's run.")
 (define-public lxqt-build-tools
   (package
     (name "lxqt-build-tools")
-    (version "0.9.0")
+    (version "0.11.0")
     (source
      (origin
        (method url-fetch)
@@ -137,16 +138,29 @@ to statistics about the system on which it's run.")
                            "/download/" version
                            "/lxqt-build-tools-" version ".tar.xz"))
        (sha256
-        (base32 "0kayad5l72h8n90zkf3hy8fxy72n4b1mrkjglpa9dj0cdj6qg0lp"))))
+        (base32 "1ff1pkrlxd8h0j8v49p6wrfhnqrz8s5b53hi835m41cvkzjljpfx"))))
     (build-system cmake-build-system)
     (arguments
-     `(#:tests? #f                      ; no tests
-       #:configure-flags
-       ;; 'startlxqt' will add LXQT_DATA_DIR to XDG_DATA_DIRS,
-       ;; LXQT_ETC_XDG_DIR to XDG_CONFIG_DIRS, and 'lxqt-about' will report
-       ;; LXQT_ETC_XDG_DIR in its "Technical Info".
-       '("-DLXQT_DATA_DIR=/run/current-system/profile/share"
-         "-DLXQT_ETC_XDG_DIR=/run/current-system/profile/etc/xdg")))
+     (list
+      #:tests? #f                       ; no tests
+      #:modules `((ice-9 regex)
+                  (guix build cmake-build-system)
+                  (guix build utils))
+      ;; In phases and configure-flags: Set LXQT_TRANSLATIONS_DIR,
+      ;; LXQT_DATA_DIR, etc. to relative paths, so that packages using
+      ;; LXQtConfigVars.cmake from lxqt-build-tools will install translations
+      ;; and data files into their outputs, remove the need to patch their
+      ;; cmake files.
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'install 'patch-LXQtConfigVars.cmake
+            (lambda _
+              (substitute* (string-append #$output
+                                          "/share/cmake/lxqt-build-tools"
+                                          "/modules/LXQtConfigVars.cmake")
+                (((regexp-quote (string-append #$output "/"))) "")))))
+      #:configure-flags
+      #~(list "-DLXQT_ETC_XDG_DIR=etc/xdg")))
     (native-inputs
      (list pkg-config glib))
     (inputs
@@ -164,7 +178,7 @@ itself as well as other components maintained by the LXQt project.")
 (define-public libqtxdg
   (package
     (name "libqtxdg")
-    (version "3.7.1")
+    (version "3.9.1")
     (source
      (origin
        (method url-fetch)
@@ -172,7 +186,7 @@ itself as well as other components maintained by the LXQt project.")
              "https://github.com/lxqt/libqtxdg/releases/download/"
              version "/libqtxdg-" version ".tar.xz"))
        (sha256
-        (base32 "16wav2b948c837cpbvdr6hs1zifwrpdk3yjvbzzp2l1hndvbwz27"))))
+        (base32 "1kh4hv59bkjifq20ksh1mizf9mp7x30v6fpwccr45mi7hasqvvfi"))))
     (build-system cmake-build-system)
     (arguments
      '(#:configure-flags
@@ -196,10 +210,33 @@ itself as well as other components maintained by the LXQt project.")
 in Qt.")
     (license license:lgpl2.1+)))
 
+(define-public qtxdg-tools
+  (package
+    (name "qtxdg-tools")
+    (version "3.9.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://github.com/lxqt/qtxdg-tools/releases/download/"
+             version "/qtxdg-tools-" version ".tar.xz"))
+       (sha256
+        (base32 "0qn35v4dv71g0a4cqkbikppwmihxmfa560q9kw5pwk2y0xiwpncr"))))
+    (build-system cmake-build-system)
+    (arguments '(#:tests? #f))          ; no tests
+    (propagated-inputs (list libqtxdg))
+    (native-inputs (list lxqt-build-tools))
+    (home-page "https://github.com/lxqt/qtxdg-tools")
+    (synopsis "User tools for libqtxdg")
+    (description "This package contains a CLI MIME tool, @command{qtxdg-mat},
+for handling file associations and opening files with their default
+applications.")
+    (license license:lgpl2.1+)))
+
 (define-public liblxqt
   (package
     (name "liblxqt")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
@@ -207,7 +244,7 @@ in Qt.")
              "https://github.com/lxqt/" name "/releases/download/"
              version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0ay3j6zdgffw3mzaq3wdq96la7fnn2dw52ij6987slv31563nknl"))))
+        (base32 "1fickg1q54pcb8bv3x0ydg4xx02cqykibnjcq09as2kws6xbhk9n"))))
     (build-system cmake-build-system)
     (arguments
      `(#:tests? #f                      ; no tests
@@ -218,13 +255,6 @@ in Qt.")
              (substitute* "CMakeLists.txt"
                (("DESTINATION \"\\$\\{POLKITQT-1_POLICY_FILES_INSTALL_DIR\\}")
                 "DESTINATION \"share/polkit-1/actions"))
-             #t))
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* "CMakeLists.txt"
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
              #t)))))
     (inputs
      (list kwindowsystem
@@ -244,14 +274,14 @@ components of the LXQt desktop environment.")
 (define-public libsysstat
   (package
     (name "libsysstat")
-    (version "0.4.5")
+    (version "0.4.6")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "1ljy5ggvqvpm3k6kfy03dn47ygr9lzi8hmqws4dcqfc9sx86b6zi"))))
+        (base32 "1ghkzgz3ypjii08f00g26pnmw0s5naf344p83dwnf3kfdlykiip6"))))
     (build-system cmake-build-system)
     (arguments '(#:tests? #f))          ; no tests
     (inputs
@@ -270,14 +300,14 @@ and memory usage or network traffic.")
 (define-public lxqt-about
   (package
     (name "lxqt-about")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "04riqf2xgbcnq67l5zb0dfnnmc4a2zljx8zfn3jlvxirnd73l0zm"))))
+        (base32 "03bqhbpdnfpan3l4snzzz6j0054m4r9zcgygcg21znslwicbqnw3"))))
     (build-system cmake-build-system)
     (inputs
      (list kwindowsystem
@@ -295,13 +325,6 @@ and memory usage or network traffic.")
          (add-before 'build 'setenv
            (lambda _
              (setenv "QT_RCC_SOURCE_DATE_OVERRIDE" "1")
-             #t))
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* "CMakeLists.txt"
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
              #t)))))
     (home-page "https://lxqt-project.org")
     (synopsis "Provides information about LXQt and the system")
@@ -312,14 +335,14 @@ LXQt and the system it's running on.")
 (define-public lxqt-admin
   (package
     (name "lxqt-admin")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "07fkn3zmpfxjzzsv1hyv50sx0359n10lxjil35qn266nz165wj43"))))
+        (base32 "1zah3xdnif9miaq52mmfbbzvqjhca7w7h81ngrn25j9pvd2bflm8"))))
     (build-system cmake-build-system)
     (inputs
      (list kwindowsystem
@@ -340,14 +363,6 @@ LXQt and the system it's running on.")
                             "lxqt-admin-time/CMakeLists.txt")
                (("DESTINATION \"\\$\\{POLKITQT-1_POLICY_FILES_INSTALL_DIR\\}")
                 "DESTINATION \"share/polkit-1/actions"))
-             #t))
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* '("lxqt-admin-time/CMakeLists.txt"
-                            "lxqt-admin-user/CMakeLists.txt")
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
              #t)))))
     (home-page "https://lxqt-project.org")
     (synopsis "LXQt system administration tool")
@@ -358,14 +373,14 @@ the operating system LXQt is running on.")
 (define-public lxqt-config
   (package
     (name "lxqt-config")
-    (version "0.17.1")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0nr43d6fyc5zg4b3iwpca2cy58ry8q0rahrk6ixm7wrvmaiwkh93"))))
+        (base32 "0f0x82qma86kjdvn08qlg0ydxh9fnqikijfhnicynxdqfnp50ia5"))))
     (build-system cmake-build-system)
     (inputs
      (list eudev
@@ -391,12 +406,6 @@ the operating system LXQt is running on.")
      '(#:tests? #f                      ; no tests
        #:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* '("src/CMakeLists.txt")
-               (("DESTINATION \"\\$\\{LXQT_ETC_XDG_DIR\\}")
-                "DESTINATION \"etc/xdg"))
-             #t))
          (add-after 'unpack 'set-xkeyboard-config-file-name
            (lambda* (#:key inputs #:allow-other-keys)
              ;; Set the file name to xkeyboard-config.
@@ -404,21 +413,7 @@ the operating system LXQt is running on.")
                (substitute* "lxqt-config-input/keyboardlayoutconfig.h"
                  (("/usr/share/X11/xkb/rules/base.lst")
                   (string-append xkb "/share/X11/xkb/rules/base.lst")))
-               #t)))
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* '("lxqt-config-file-associations/CMakeLists.txt"
-                            "lxqt-config-brightness/CMakeLists.txt"
-                            "lxqt-config-appearance/CMakeLists.txt"
-                            "lxqt-config-locale/CMakeLists.txt"
-                            "lxqt-config-monitor/CMakeLists.txt"
-                            "lxqt-config-input/CMakeLists.txt"
-                            "liblxqt-config-cursor/CMakeLists.txt"
-                            "src/CMakeLists.txt")
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
-             #t)))))
+               #t))))))
     (home-page "https://lxqt-project.org")
     (synopsis "Tools to configure LXQt and the underlying operating system")
     (description "lxqt-config is providing several tools involved in the
@@ -428,7 +423,7 @@ configuration of both LXQt and the underlying operating system.")
 (define-public lxqt-globalkeys
   (package
     (name "lxqt-globalkeys")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
@@ -436,7 +431,7 @@ configuration of both LXQt and the underlying operating system.")
                            "releases/download/" version "/"
                            "lxqt-globalkeys-" version ".tar.xz"))
        (sha256
-        (base32 "0pnyqiqhaawrnyvw3ljp850d911abaalnl4rgvl2xyzybvlhki4h"))))
+        (base32 "0bbw85aa59w0qnvkdggm3hbacps6yfcvcrs32d34mvvhc7d6g04l"))))
     (build-system cmake-build-system)
     (inputs
      (list kwindowsystem
@@ -447,24 +442,7 @@ configuration of both LXQt and the underlying operating system.")
            qtx11extras))
     (native-inputs
      (list pkg-config qttools-5 lxqt-build-tools))
-    (arguments
-     '(#:tests? #f                      ; no tests
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* '("autostart/CMakeLists.txt"
-                            "xdg/CMakeLists.txt")
-               (("DESTINATION \"\\$\\{LXQT_ETC_XDG_DIR\\}")
-                "DESTINATION \"etc/xdg"))
-             #t))
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* "config/CMakeLists.txt"
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
-             #t)))))
+    (arguments '(#:tests? #f))          ; no tests
     (home-page "https://lxqt-project.org")
     (synopsis "Daemon used to register global keyboard shortcuts")
     (description "lxqt-globalkeys is providing tools to set global keyboard
@@ -475,14 +453,14 @@ as a whole and are not limited to distinct applications.")
 (define-public lxqt-notificationd
   (package
     (name "lxqt-notificationd")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "1dyal7brmfnydfgb6lpxnqww8fj5gzixs7s3wf5nn2ihsz1wm4nk"))))
+        (base32 "0bz3qdvv591zvpkxqzqqmh1yq5icc3iinmjr13qzws3ajlj19z44"))))
     (build-system cmake-build-system)
     (inputs
      (list kwindowsystem
@@ -493,24 +471,7 @@ as a whole and are not limited to distinct applications.")
            qtx11extras))
     (native-inputs
      (list lxqt-build-tools qttools-5))
-    (arguments
-     '(#:tests? #f                      ; no test target
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* '("autostart/CMakeLists.txt")
-               (("DESTINATION \"\\$\\{LXQT_ETC_XDG_DIR\\}")
-                "DESTINATION \"etc/xdg"))
-             #t))
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* '("config/CMakeLists.txt"
-                            "src/CMakeLists.txt")
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
-             #t)))))
+    (arguments '(#:tests? #f))          ; no test target
     (home-page "https://lxqt-project.org")
     (synopsis "The LXQt notification daemon")
     (description "lxqt-notificationd is LXQt's implementation of a daemon
@@ -520,14 +481,14 @@ according to the Desktop Notifications Specification.")
 (define-public lxqt-openssh-askpass
   (package
     (name "lxqt-openssh-askpass")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0gdcy8c21sbfrlfz9c3zqw4dvdwf309flkjgqanwwl9i8hr26chr"))))
+        (base32 "1hxix513z2sanmygfzq1fgx30kaxw5rjmmklbyyzl8bv1xzjcwk7"))))
     (build-system cmake-build-system)
     (inputs
      (list kwindowsystem
@@ -538,17 +499,7 @@ according to the Desktop Notifications Specification.")
            qtx11extras))
     (native-inputs
      (list lxqt-build-tools qttools-5))
-    (arguments
-     '(#:tests? #f                      ; no tests
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* "CMakeLists.txt"
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
-             #t)))))
+    (arguments '(#:tests? #f))          ; no tests
     (home-page "https://lxqt-project.org")
     (synopsis "GUI to query passwords on behalf of SSH agents")
     (description "lxqt-openssh-askpass is a GUI to query credentials on behalf
@@ -558,14 +509,14 @@ of other programs.")
 (define-public lxqt-panel
   (package
     (name "lxqt-panel")
-    (version "0.17.1")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "1k2cfs1mhad486kh93vbxma3jpjksp4hzjv1xmp1g5alb5dgnc0q"))))
+        (base32 "11dg18ac6kj8qkkrg940bzpykjih6nnw8y3hfww3wiyg6dka9gd7"))))
     (build-system cmake-build-system)
     (inputs
      (list alsa-lib
@@ -579,6 +530,7 @@ of other programs.")
            libxdamage
            libxkbcommon
            libxrender
+           libxtst
            `(,lm-sensors "lib")
            lxqt-globalkeys
            pcre
@@ -588,6 +540,7 @@ of other programs.")
            qtx11extras
            solid
            xcb-util
+           xcb-util-image
            xkeyboard-config))
     (native-inputs
      (list pkg-config lxqt-build-tools qttools-5))
@@ -599,21 +552,6 @@ of other programs.")
      '(#:tests? #f                      ; no tests
        #:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* '("autostart/CMakeLists.txt"
-                            "menu/CMakeLists.txt")
-               (("DESTINATION \"\\$\\{LXQT_ETC_XDG_DIR\\}")
-                "DESTINATION \"etc/xdg"))
-             #t))
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* '("cmake/BuildPlugin.cmake"
-                            "panel/CMakeLists.txt")
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
-             #t))
          (add-after 'unpack 'set-xkeyboard-config-file-path
                 (lambda* (#:key inputs #:allow-other-keys)
                   ;; Set the path to xkeyboard-config.
@@ -630,14 +568,14 @@ of other programs.")
 (define-public lxqt-policykit
   (package
     (name "lxqt-policykit")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "119bjhx208g7wxmr8r0ajb3wl6vagq1aks6zz07df4bgjs3nnpli"))))
+        (base32 "150ggcfprascnwgsz721vnmay9cbar9annlhp6h2yzkl69iyc49r"))))
     (build-system cmake-build-system)
     (inputs
      (list kwindowsystem
@@ -650,23 +588,7 @@ of other programs.")
            qtx11extras))
     (native-inputs
      (list pkg-config polkit lxqt-build-tools qttools-5))
-    (arguments
-     '(#:tests? #f                      ; no test target
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* '("autostart/CMakeLists.txt")
-               (("DESTINATION \"\\$\\{LXQT_ETC_XDG_DIR\\}")
-                "DESTINATION \"etc/xdg"))
-             #t))
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* "CMakeLists.txt"
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
-             #t)))))
+    (arguments '(#:tests? #f))          ; no test target
     (home-page "https://lxqt-project.org")
     (synopsis "The LXQt PolicyKit agent")
     (description "lxqt-policykit is the polkit authentication agent of
@@ -676,14 +598,14 @@ LXQt.")
 (define-public lxqt-powermanagement
   (package
     (name "lxqt-powermanagement")
-    (version "0.17.1")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "00njx8a8cs0zzpz798qc9j16k7i4y0ydy1xmmcq9yv0wawh4gqck"))))
+        (base32 "0zy6abbf3iwrxsr18gbxidb4m5spsigpa2778xg7y9r7fwgmqqkk"))))
     (build-system cmake-build-system)
     (inputs
      (list kidletime
@@ -697,24 +619,7 @@ LXQt.")
            solid))
     (native-inputs
      (list lxqt-build-tools qttools-5))
-    (arguments
-     '(#:tests? #f                      ; no tests
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* '("autostart/CMakeLists.txt")
-               (("DESTINATION \"\\$\\{LXQT_ETC_XDG_DIR\\}")
-                "DESTINATION \"etc/xdg"))
-             #t))
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* '("config/CMakeLists.txt"
-                            "src/CMakeLists.txt")
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
-             #t)))))
+    (arguments '(#:tests? #f))          ; no tests
     (home-page "https://lxqt-project.org")
     (synopsis "Power management module for LXQt")
     (description "lxqt-powermanagement is providing tools to monitor power
@@ -725,14 +630,14 @@ when laptop batteries are low on power.")
 (define-public lxqt-qtplugin
   (package
     (name "lxqt-qtplugin")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "14c6abxfg3vda333wrvb5lk45c45hnb66jclbs3vsmrjxdb13vv5"))))
+        (base32 "1zw79lnm35gj3dyd4vlnk08n1lnr8391n36nbn81d0fgmvs21yx4"))))
     (build-system cmake-build-system)
     (inputs
      (list libdbusmenu-qt
@@ -762,14 +667,14 @@ Qt with LXQt.")
 (define-public lxqt-runner
   (package
     (name "lxqt-runner")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0n53jbvkmp4vgi21a720gsvi407m4ybqk8xrpnm5f48yjr88r9i4"))))
+        (base32 "1wfng8g28mq97ibrgpfbj353i15vdimmjp83pfqrmkddx0yvzcdv"))))
     (build-system cmake-build-system)
     (inputs
      (list kwindowsystem
@@ -783,23 +688,7 @@ Qt with LXQt.")
            qtx11extras))
     (native-inputs
      (list pkg-config qttools-5 lxqt-build-tools))
-    (arguments
-     '(#:tests? #f                      ; no tests
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* '("autostart/CMakeLists.txt")
-               (("DESTINATION \"\\$\\{LXQT_ETC_XDG_DIR\\}")
-                "DESTINATION \"etc/xdg"))
-             #t))
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* "CMakeLists.txt"
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
-             #t)))))
+    (arguments '(#:tests? #f))          ; no tests
     (home-page "https://lxqt-project.org")
     (synopsis "Tool used to launch programs quickly by typing their names")
     (description "lxqt-runner provides a GUI that comes up on the desktop and
@@ -809,20 +698,20 @@ allows for launching applications or shutting down the system.")
 (define-public lxqt-session
   (package
     (name "lxqt-session")
-    (version "0.17.1")
+    (version "1.1.1")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0iwwfyngpbhs2dwvbw0cci0bf3qbqcpjjw7h5vm46nimvgp8q1fr"))))
+        (base32 "0j8q5jfpb2l0vvji3xs8y0jcr792z6sxzj111qqvmdrbpxrkwxnw"))))
     (build-system cmake-build-system)
     (inputs
      (list eudev
            kwindowsystem
            liblxqt
-           libqtxdg
+           qtxdg-tools
            procps
            qtbase-5
            qtsvg-5
@@ -836,40 +725,28 @@ allows for launching applications or shutting down the system.")
        (modify-phases %standard-phases
          (add-after 'unpack 'patch-source
            (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* '("autostart/CMakeLists.txt"
-                            "config/CMakeLists.txt")
-               (("DESTINATION \"\\$\\{LXQT_ETC_XDG_DIR\\}")
-                "DESTINATION \"etc/xdg"))
              (let ((out (assoc-ref outputs "out")))
                (substitute* '("xsession/lxqt.desktop.in")
                  (("Exec=startlxqt") (string-append "Exec=" out "/bin/startlxqt"))
-                 (("TryExec=lxqt-session") (string-append "TryExec=" out "/bin/startlxqt")))
-               #t)))
-         ;; add write permission to lxqt-rc.xml file which is stored as read-only in store
+                 (("TryExec=lxqt-session") (string-append "TryExec=" out "/bin/startlxqt"))))))
+
          (add-after 'unpack 'patch-openbox-permission
            (lambda _
              (substitute* "startlxqt.in"
+               ;; Don't add 'etc/xdg' to XDG_CONFIG_DIRS, and 'share' to XDG_DATA_DIRS.
+               (("! contains .*;") "false;")
+               ;; Add write permission to lxqt-rc.xml file which is stored as
+               ;; read-only in store.
                (("cp \"\\$LXQT_DEFAULT_OPENBOX_CONFIG\" \"\\$XDG_CONFIG_HOME/openbox\"")
                  (string-append "cp \"$LXQT_DEFAULT_OPENBOX_CONFIG\" \"$XDG_CONFIG_HOME/openbox\"\n"
                                 "        # fix openbox permission issue\n"
-                                "        chmod u+w  \"$XDG_CONFIG_HOME/openbox\"/*")))
-             #t))
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* '("lxqt-config-session/CMakeLists.txt"
-                            "lxqt-leave/CMakeLists.txt"
-                            "lxqt-session/CMakeLists.txt")
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
-             #t))
-         (add-after 'install 'wrap-program
-           (lambda* (#:key inputs outputs #:allow-other-keys)
-             (let ((out (assoc-ref outputs "out")))
-               (wrap-program (string-append out "/bin/startlxqt")
-                 `("XDG_CONFIG_DIRS" ":" suffix ("/run/current-system/profile/share"
-                                                 "/run/current-system/profile/share/pcmanfm-qt")))
-               #t))))))
+                                "        chmod u+w  \"$XDG_CONFIG_HOME/openbox\"/*"))))))))
+    (native-search-paths
+     (list (search-path-specification
+            ;; LXQt applications install their default config files into
+            ;; 'share/lxqt' and search them from XDG_CONFIG_DIRS/lxqt.
+            (variable "XDG_CONFIG_DIRS")
+            (files '("share")))))
     (home-page "https://lxqt-project.org")
     (synopsis "Session manager for LXQt")
     (description "lxqt-session provides the standard session manager
@@ -879,14 +756,14 @@ for the LXQt desktop environment.")
 (define-public lxqt-sudo
   (package
     (name "lxqt-sudo")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "02s38m0ywp0gjkjczvrc4r1ignshbajlj084xd61d3rcm7vahhic"))))
+        (base32 "064w40v43m91y9aywxxf2pj5rpcl4gbsgj7dv97pg4vhj9s790b8"))))
     (build-system cmake-build-system)
     (inputs
      (list kwindowsystem
@@ -898,17 +775,7 @@ for the LXQt desktop environment.")
            sudo))
     (native-inputs
      (list pkg-config qttools-5 lxqt-build-tools))
-    (arguments
-     '(#:tests? #f                      ; no tests
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-translations-dir
-           (lambda* (#:key outputs #:allow-other-keys)
-             (substitute* "CMakeLists.txt"
-               (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                (string-append (assoc-ref outputs "out")
-                               "/share/lxqt/translations")))
-             #t)))))
+    (arguments '(#:tests? #f))          ; no tests
     (home-page "https://lxqt-project.org")
     (synopsis "GUI frontend for sudo/su")
     (description "lxqt-sudo is a graphical front-end of commands sudo and su
@@ -919,30 +786,18 @@ permissions of other users including root.")
 (define-public lxqt-themes
   (package
     (name "lxqt-themes")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0kmvcz6rxghxxgb0m264zbvycc1zjma8mr4cpwg5kyrzb47rdw9z"))))
+        (base32 "18zrp2j0xpsrzy6m2dw8k55zczcc9jzavncasrp5j1dxscnzwrcr"))))
     (build-system cmake-build-system)
     (native-inputs
      (list lxqt-build-tools))
-    (arguments
-     `(#:tests? #f                      ; no tests
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* '("CMakeLists.txt")
-               (("DESTINATION \"\\$\\{LXQT_GRAPHICS_DIR\\}")
-                "DESTINATION \"share/lxqt/graphics"))
-             (substitute* '("themes/CMakeLists.txt")
-               (("DESTINATION \"\\$\\{LXQT_SHARE_DIR\\}")
-                "DESTINATION \"share/lxqt"))
-             #t)))))
+    (arguments '(#:tests? #f))          ; no tests
     (home-page "https://lxqt-project.org")
     (synopsis "Themes, graphics and icons for LXQt")
     (description "This package comprises a number of graphic files and themes
@@ -957,14 +812,14 @@ for LXQt.")
 (define-public libfm-qt
   (package
     (name "libfm-qt")
-    (version "0.17.1")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "1991lm1gnw9s5wwn1yf3vba63bfmrrgsxc70h3nhdl9mh16qygxa"))))
+        (base32 "0m2fq1wh553yqi64a5nrdvm57fk3jnc3kxgaf0ja7h95jw6czvm5"))))
     (build-system cmake-build-system)
     (arguments
      '(#:tests? #f))                    ; no tests
@@ -988,32 +843,31 @@ components to build desktop file managers which belongs to LXDE.")
 (define-public pcmanfm-qt
   (package
     (name "pcmanfm-qt")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "1axs7dnh2z08ygy28iipfbgfck15k2i2pwlf0v8d8axjrmavzb3l"))))
+        (base32 "0pwl2j5kbs86vmq86phavq89bl2i82ic839bjk0v8kmxm9q2mrh9"))))
     (build-system cmake-build-system)
+    (arguments
+     (list
+      #:tests? #f                       ; no tests
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-before 'configure 'patch-settings.conf.in
+            (lambda* (#:key inputs #:allow-other-keys)
+              (let ((wallpaper (search-input-file inputs
+                                "share/lxqt/wallpapers/waves-logo.png")))
+               (substitute* "config/pcmanfm-qt/lxqt/settings.conf.in"
+                 (("Wallpaper=.*")
+                  (string-append "Wallpaper=" wallpaper "\n")))))))))
     (inputs
-     (list libfm-qt qtbase-5 qtx11extras))
+     (list libfm-qt qtbase-5 qtx11extras lxqt-themes))
     (native-inputs
      (list pkg-config qttools-5 lxqt-build-tools))
-    (arguments
-     '(#:tests? #f                      ; no tests
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* '("autostart/CMakeLists.txt")
-               (("DESTINATION \"\\$\\{LXQT_ETC_XDG_DIR\\}")
-                "DESTINATION \"etc/xdg"))
-             (substitute* '("config/pcmanfm-qt/lxqt/settings.conf.in")
-               (("@LXQT_SHARE_DIR@")
-                "/run/current-system/profile/share/lxqt" ))
-             #t)))))
     (home-page "https://lxqt-project.org")
     (synopsis "File manager and desktop icon manager")
     (description "PCManFM-Qt is the Qt port of PCManFM, the file manager of
@@ -1039,16 +893,7 @@ LXDE.")
      (list libconfig qtbase-5))
     (native-inputs
      (list lxqt-build-tools pkg-config qttools-5))
-    (arguments
-     '(#:tests? #f                      ; no tests
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-source
-           (lambda _
-             (substitute* '("autostart/CMakeLists.txt")
-               (("DESTINATION \"\\$\\{LXQT_ETC_XDG_DIR\\}")
-                "DESTINATION \"etc/xdg"))
-             #t)))))
+    (arguments '(#:tests? #f))          ; no tests
     (home-page "https://lxqt-project.org")
     (synopsis "GUI configuration tool for compton X composite manager")
     (description "@code{compton-conf} is a configuration tool for X composite
@@ -1058,14 +903,14 @@ manager Compton.")
 (define-public lximage-qt
   (package
     (name "lximage-qt")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0g6hs41xfw2ghhwpj0rqr2ciri0x9v984689yrnmnvah88zlya1f"))))
+        (base32 "0nal8n7nmkafapdbcs9c8rk313md2fak4xjl9m56n10dxcjpi2wb"))))
     (build-system cmake-build-system)
     (inputs
      (list libexif libfm-qt qtbase-5 qtsvg-5 qtx11extras))
@@ -1082,14 +927,14 @@ image viewer.")
 (define-public obconf-qt
   (package
     (name "obconf-qt")
-    (version "0.16.1")
+    (version "0.16.2")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0hlbivdbiw7wjhwrp8qfmq50ks19v0q21m3pyjj0k2na7nv9d3a5"))))
+        (base32 "0q29f77dkwy005gzrmn2wj2ga1hdnfd2gwp05h72i2dj0qbdla3k"))))
     (build-system cmake-build-system)
     (inputs
      (list imlib2
@@ -1115,14 +960,14 @@ window manager OpenBox.")
 (define-public pavucontrol-qt
   (package
     (name "pavucontrol-qt")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0w51dpjayav78lmhw966fz3gvypkmv64xgsd7x5rqs8am39lq9vc"))))
+        (base32 "0y3ql25cmg1cmzjvadf7zcb58hh69gcslvr944sxxhaqp4daz10v"))))
     (build-system cmake-build-system)
     (inputs
      (list glib pcre pulseaudio qtbase-5 qtx11extras))
@@ -1139,14 +984,14 @@ window manager OpenBox.")
 (define-public qps
   (package
     (name "qps")
-    (version "2.3.0")
+    (version "2.5.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0zg0czrh3dlbnl5smxamhkdbj1g0szm47w1c0fwpaplgc1vv5lfq"))))
+        (base32 "16ybq07xpkl22mszakc1175xlqcayyj21i2h6wlxb8bmb7csg30n"))))
     (build-system cmake-build-system)
     (inputs
      (list kwindowsystem
@@ -1168,14 +1013,14 @@ processes currently in existence, much like code{top} or code{ps}.")
 (define-public qtermwidget
   (package
     (name "qtermwidget")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "10lv475qj0x3c3vl4yhjyr6y10qj5pq8n5pal5k24f6pf7xv412f"))))
+        (base32 "1m64c1m8dkb06fgfk09da2anjspphph6qdk41rqhds2qymh090v4"))))
     (build-system cmake-build-system)
     (inputs
      (list qtbase-5 utf8proc))
@@ -1191,14 +1036,14 @@ processes currently in existence, much like code{top} or code{ps}.")
 (define-public qterminal
   (package
     (name "qterminal")
-    (version "0.17.0")
+    (version "1.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
        (sha256
-        (base32 "0rfv7a6ncm8fs8aicinh9l29w4636gxzcqz735jmch2r41v9i1d9"))))
+        (base32 "1b9568y5xyxymk8r7pkz878ba24dyaxql2sfiy6blr8szf308c5l"))))
     (build-system cmake-build-system)
     (inputs
      (list qtbase-5 qtx11extras qtermwidget))
@@ -1215,14 +1060,14 @@ QTermWidget.")
 (define-public screengrab
   (package
     (name "screengrab")
-    (version "2.2.0")
+    (version "2.4.0")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://github.com/lxqt/screengrab/releases/download/"
                            version "/screengrab-" version ".tar.xz"))
        (sha256
-        (base32 "0cilzw7rz5m2klzpax7rrs5rr6whfda2svwzsn2jvmrirmh5by7r"))))
+        (base32 "14kh287d70v1lpd5w8pji88nmw3jd44q4h927vnszrkv6bwplzx7"))))
     (build-system cmake-build-system)
     (inputs
      (list kwindowsystem libqtxdg qtbase-5 qtsvg-5 qtx11extras))
@@ -1240,14 +1085,14 @@ easily publishing them on internet image hosting services.")
 (define-public lxqt-archiver
   (package
     (name "lxqt-archiver")
-    (version "0.4.0")
+    (version "0.6.0")
     (source
       (origin
         (method url-fetch)
         (uri (string-append "https://github.com/lxqt/" name "/releases/download/"
                            version "/" name "-" version ".tar.xz"))
         (sha256
-          (base32 "0fzgq7cyr7hx8qmq84xfgbsdx04mc1r7vzq5mz79j7bp2ysh134z"))))
+          (base32 "1cxxr7rpflh2ki272pac927gzcw2w1lp3qz8vplflf148laigwc0"))))
     (build-system cmake-build-system)
     (inputs
       (list glib json-glib libfm-qt qtbase-5 qtx11extras))
@@ -1294,14 +1139,6 @@ like @command{tar} and @command{zip}.")
         `(#:tests? #f                   ; no tests
           #:phases
             (modify-phases %standard-phases
-              (add-after 'unpack 'patch-translations-dir
-                (lambda* (#:key outputs #:allow-other-keys)
-                  (substitute* "CMakeLists.txt"
-                    (("\\$\\{LXQT_TRANSLATIONS_DIR\\}")
-                     (string-append (assoc-ref outputs "out")
-                                    "/share/lxqt/translations"))
-                    (("\\$\\{LXQT_ETC_XDG_DIR\\}") "etc/xdg"))
-                  #t))
               (add-after 'unpack 'remove-definitions
                 (lambda _
                   (substitute* "CMakeLists.txt"
@@ -1357,7 +1194,7 @@ desktop.")
            lximage-qt
            obconf-qt
            openbox
-           oxygen-icons
+           breeze-icons       ; default by <lxqt-session>/share/lxqt/lxqt.conf
            pavucontrol-qt
            qps
            qterminal))
diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
index cd0640cd27..c61428486c 100644
--- a/gnu/packages/machine-learning.scm
+++ b/gnu/packages/machine-learning.scm
@@ -828,10 +828,10 @@ in terms of new algorithms.")
     (home-page "https://onnx.ai/")
     (synopsis "Open Neural Network Exchange")
     (description
-     "Open Neural Network Exchange (ONNX) provides an open source format for
-AI models, both deep learning and traditional ML.  It defines an extensible
-computation graph model, as well as definitions of built-in operators and
-standard data types.")
+     "@acronym{ONNX, Open Neural Network Exchange} is a format for AI models,
+both deep learning and traditional @acronym{ML, machine learning}.  It defines
+an extensible computation graph model, as well as definitions of built-in
+operators and standard data types.")
     (license license:expat)))
 
 (define-public python-onnx
diff --git a/gnu/packages/mail.scm b/gnu/packages/mail.scm
index 33dcc48e04..646902b4db 100644
--- a/gnu/packages/mail.scm
+++ b/gnu/packages/mail.scm
@@ -558,7 +558,7 @@ aliasing facilities to work just as they would on normal mail.")
 (define-public mutt
   (package
     (name "mutt")
-    (version "2.2.6")
+    (version "2.2.7")
     (source (origin
              (method url-fetch)
              (uri (list
@@ -568,7 +568,7 @@ aliasing facilities to work just as they would on normal mail.")
                                    version ".tar.gz")))
              (sha256
               (base32
-               "1lw8111wbsw4hkvrlfsd2cf2l1j25vqwbzys07z0ding2wsxk8pz"))
+               "1wbdsgx5x7h4alsfmjqac46xvbbakc7djlpngd3rydmvb27qa4zb"))
              (patches (search-patches "mutt-store-references.patch"))))
     (build-system gnu-build-system)
     (inputs
@@ -1160,7 +1160,7 @@ security functionality including PGP, S/MIME, SSH, and SSL.")
 (define-public mu
   (package
     (name "mu")
-    (version "1.8.7")
+    (version "1.8.9")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -1169,7 +1169,7 @@ security functionality including PGP, S/MIME, SSH, and SSL.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0yfbw234yqnqfnsn5bj1hqwpy78pkxn05vl18z8nvsqdmpzal4gx"))))
+                "1anpv49242qpayziz111rzznkmfgkd2a9y5xda6xhmzhqdhx79h2"))))
     (build-system meson-build-system)
     (native-inputs
      (list pkg-config
@@ -1179,29 +1179,30 @@ security functionality including PGP, S/MIME, SSH, and SSL.")
     (inputs
      (list glib gmime xapian))
     (arguments
-     `(#:modules ((guix build meson-build-system)
+     (list
+      #:modules '((guix build meson-build-system)
                   (guix build emacs-utils)
                   (guix build utils))
-       #:imported-modules (,@%meson-build-system-modules
+      #:imported-modules `(,@%meson-build-system-modules
                            (guix build emacs-utils))
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-bin-references
-           (lambda _
-             (substitute* '("guile/tests/test-mu-guile.cc"
-                            "mu/tests/test-mu-cmd.cc"
-                            "mu/tests/test-mu-cmd-cfind.cc"
-                            "mu/tests/test-mu-query.cc")
-               (("/bin/sh") (which "sh")))
-             (substitute* '("lib/tests/bench-indexer.cc"
-                            "lib/utils/mu-utils.cc")
-               (("/bin/rm") (which "rm")))))
-         (add-after 'install 'install-emacs-autoloads
-           (lambda* (#:key outputs #:allow-other-keys)
-             (emacs-generate-autoloads
-              "mu4e"
-              (string-append (assoc-ref outputs "out")
-                             "/share/emacs/site-lisp")))))))
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'patch-bin-references
+            (lambda _
+              (substitute* '("guile/tests/test-mu-guile.cc"
+                             "mu/tests/test-mu-cmd.cc"
+                             "mu/tests/test-mu-cmd-cfind.cc"
+                             "mu/tests/test-mu-query.cc")
+                (("/bin/sh") (which "sh")))
+              (substitute* '("lib/tests/bench-indexer.cc"
+                             "lib/utils/mu-test-utils.cc")
+                (("/bin/rm") (which "rm")))))
+          (add-after 'install 'install-emacs-autoloads
+            (lambda* (#:key outputs #:allow-other-keys)
+              (emacs-generate-autoloads
+               "mu4e"
+               (string-append (assoc-ref outputs "out")
+                              "/share/emacs/site-lisp/mu4e")))))))
     (home-page "https://www.djcbsoftware.nl/code/mu/")
     (synopsis "Quickly find emails")
     (description
diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm
index 47d19eaadf..5f03f4aa2c 100644
--- a/gnu/packages/maths.scm
+++ b/gnu/packages/maths.scm
@@ -1824,6 +1824,12 @@ the resulting text.")
     (arguments `(#:tests? #f ; Tests require googletest *sources*
                  #:phases
                  (modify-phases %standard-phases
+                   (add-after 'install 'delete-formulas-log
+                     ;; Contains date and timing information which is unreproducible,
+                     ;; and should not be needed when using the package
+                     (lambda* (#:key outputs #:allow-other-keys)
+                       (let ((out (assoc-ref outputs "out")))
+                         (delete-file (string-append out "/share/doc/itpp/html/_formulas.log")))))
                    (add-after 'unpack 'set-man-page-date
                      (lambda _
                        (substitute* "itpp-config.1.cmake.in"
@@ -7312,6 +7318,64 @@ researchers and developers alike to get started on SAT.")
        "http://minisat.se/MiniSat.html")
       (license license:expat))))
 
+(define-public kissat
+  (package
+    (name "kissat")
+    (version "3.0.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/arminbiere/kissat")
+             (commit (string-append "rel-" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "04x4w760srbdi4zci0s747qxk717x5d2x59ixraxh5104s9nyn8b"))))
+    (build-system gnu-build-system)
+    (inputs (list xz gzip lzip bzip2 p7zip))
+    (arguments
+     (list
+      #:test-target "test"
+      #:configure-flags #~(list "-shared")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'patch-source
+            (lambda* (#:key inputs #:allow-other-keys)
+              (substitute* "src/file.c"
+                (("(bzip2|gzip|lzma|xz) -c" all cmd)
+                 (string-append (search-input-file inputs
+                                                   (string-append "bin/" cmd))
+                                " -c"))
+                (("7z ([ax])" all mode)
+                 (string-append (search-input-file inputs "bin/7z")
+                                " " mode))
+                ;; Since we hard-coded the paths, we no longer need to find
+                ;; them.
+                (("bool found = kissat_find_executable \\(name\\);")
+                 "bool found = true;"))
+              (substitute* "test/testmain.c"
+                ;; SIGINT is ignored inside invoke.
+                (("^SIGNAL\\(SIGINT\\)") ""))))
+          (replace 'configure
+            (lambda* (#:key configure-flags #:allow-other-keys)
+              ;; The configure script does not support standard GNU options.
+              (apply invoke "./configure" configure-flags)))
+          (replace 'install
+            (lambda* (#:key inputs outputs #:allow-other-keys)
+              (let ((out (assoc-ref outputs "out")))
+                (install-file "build/kissat" (string-append out "/bin"))
+                (install-file "build/libkissat.so" (string-append out "/lib"))
+                (install-file "src/kissat.h"
+                              (string-append out "/include"))))))))
+    (home-page "https://github.com/arminbiere/kissat")
+    (synopsis "Bare-metal SAT solver")
+    (description
+     "Kissat is a bare-metal SAT-solver written in C.  It is a port of CaDiCaL
+back to C with improved data structures, better scheduling of inprocessing and
+optimized algorithms and implementation.")
+    (license license:expat)))
+
 (define-public libqalculate
   (package
     (name "libqalculate")
diff --git a/gnu/packages/maven.scm b/gnu/packages/maven.scm
index f84f1ae177..28ec4eb9a8 100644
--- a/gnu/packages/maven.scm
+++ b/gnu/packages/maven.scm
@@ -1118,13 +1118,13 @@ gets and puts artifacts through HTTP(S) using Apache HttpClient-4.x.")))
 (define maven-pom
   (package
     (name "maven-pom")
-    (version "3.8.5")
+    (version "3.8.6")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://apache/maven/"
                                   "maven-3/" version "/source/"
                                   "apache-maven-" version "-src.tar.gz"))
-              (sha256 (base32 "01y0fjvlvgy1bl3mdhbjll2xhzpli6aklqb3w29xpbgk6frxn3d6"))
+              (sha256 (base32 "0jszmcaxp597a62ajrc478jxix1qmw4pknhiygsbjdy3kccc7gvj"))
               (modules '((guix build utils)))
               (snippet
                '(begin
diff --git a/gnu/packages/messaging.scm b/gnu/packages/messaging.scm
index 47798c3586..a2695370e3 100644
--- a/gnu/packages/messaging.scm
+++ b/gnu/packages/messaging.scm
@@ -3446,4 +3446,35 @@ Discord.")
     (home-page "https://github.com/taylordotfish/harmony")
     (license license:gpl3+)))
 
+(define-public pn
+  (package
+    (name "pn")
+    (version "0.9.0")
+    (home-page "https://github.com/Orange-OpenSource/pn")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url home-page)
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1lvzb0yixj7wmmqzsri20k9nn3gf06j0yjvmg2mi1zihywq7s4dx"))))
+    (build-system cmake-build-system)
+    (arguments
+     (list #:tests? #f ;no tests
+           #:phases #~(modify-phases %standard-phases
+                        (add-after 'unpack 'set-lib-destination
+                          (lambda _
+                            (substitute* "CMakeLists.txt"
+                              (("DESTINATION \\$\\{AWKLIBPATH\\}")
+                               "DESTINATION lib")))))))
+    (inputs (list icu4c libphonenumber protobuf))
+    (synopsis "Command-line validation tool for phone numbers")
+    (description
+     "@code{pn} provides a command line tool that allows users to operate on
+phone numbers (get validity information, reformat them, or extract numbers from
+a text snippet), using @code{libphonenumber}.")
+    (license license:asl2.0)))
+
 ;;; messaging.scm ends here
diff --git a/gnu/packages/moe.scm b/gnu/packages/moe.scm
index 819a6298e3..82db1621db 100644
--- a/gnu/packages/moe.scm
+++ b/gnu/packages/moe.scm
@@ -28,15 +28,14 @@
 (define-public moe
   (package
     (name "moe")
-    (version "1.11")
+    (version "1.12")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "mirror://gnu/moe/moe-"
                           version ".tar.lz"))
       (sha256
-       (base32
-        "1yg2ln2mm6gzv61cxnv60dw1cr5bl2dhkjy685jrd3aabb7wpyqf"))))
+       (base32 "1s51swk8h5k32r2z4i1pla2l15b0v0mh35lwsd5f1y16whmmz24a"))))
     (build-system gnu-build-system)
     (native-inputs (list lzip))
     (inputs (list ncurses))
diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index dcc1a43d2d..e1de632dda 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -2181,7 +2181,7 @@ users to select LV2 plugins and run them with jalv.")
 (define-public mixxx
   (package
     (name "mixxx")
-    (version "2.3.2")
+    (version "2.3.3")
     (source
      (origin
        (method git-fetch)
@@ -2193,7 +2193,7 @@ users to select LV2 plugins and run them with jalv.")
         (search-patches "mixxx-link-qtscriptbytearray-qtscript.patch"
                         "mixxx-system-googletest-benchmark.patch"))
        (sha256
-        (base32 "1h26vpf60rk56fsw1nvmxihg7ammlj8q4zgim49q4s4ww7j8wwqj"))
+        (base32 "0zrmy97lk0xdfnlvygshr8vradypmnypki3s1mhc296xhq96n6rm"))
        (modules '((guix build utils)))
        (snippet
         ;; Delete libraries that we already have or don't need.
@@ -3310,7 +3310,7 @@ from the command line.")
            lilv
            lv2
            qtbase-5
-           qtsvg
+           qtsvg-5
            qtx11extras
            rubberband
            suil
@@ -3724,13 +3724,13 @@ websites such as Libre.fm.")
 (define-public beets
   (package
     (name "beets")
-    (version "1.5.0")
+    (version "1.6.0")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "beets" version))
               (sha256
                (base32
-                "0arl4nc3y8iwa331hf6ggai19y8ns9pl03g5d6ac857wq2x7nzw8"))))
+                "0paj2nxvdx4zz9xawjpbsh0dy1kp9kfhxg8akh1rpz2awhsbfvxa"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -3773,7 +3773,6 @@ websites such as Libre.fm.")
            python-munkres
            python-musicbrainzngs
            python-pyyaml
-           python-six
            python-unidecode
            ;; Optional dependencies for plugins. Some of these are also required by tests.
            python-beautifulsoup4 ; For lyrics.
@@ -4849,7 +4848,7 @@ studio.")
 (define-public gsequencer
   (package
     (name "gsequencer")
-    (version "3.18.2")
+    (version "4.3.4")
     (source
      (origin
        (method git-fetch)
@@ -4858,7 +4857,7 @@ studio.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1lkn7rfrjvmds62i69igcgmic2snscgb9f6gdg5nzyfkis1fq5iz"))))
+        (base32 "10rf9li9kr6qdzkqv66wlg7gw2il18n7kd4fhk848hh5dcmg1icv"))))
     (build-system glib-or-gtk-build-system)
     (arguments
      `(#:phases
@@ -4884,18 +4883,18 @@ studio.")
            fftw
            gst-plugins-base
            gstreamer
-           gtk+
+           gtk
            jack-1
            ladspa
            libinstpatch
            libsamplerate
            libsndfile
-           libsoup-minimal-2
+           libsoup
            libxml2
            lv2
            pulseaudio
            `(,util-linux "lib")
-           webkitgtk-with-libsoup2))
+           webkitgtk))
     (home-page "https://nongnu.org/gsequencer/")
     (synopsis "Advanced Gtk+ Sequencer")
     (description
diff --git a/gnu/packages/networking.scm b/gnu/packages/networking.scm
index 25beef8dc1..f1e1433d8c 100644
--- a/gnu/packages/networking.scm
+++ b/gnu/packages/networking.scm
@@ -3055,6 +3055,11 @@ interface and a programmable text output for scripting.")
     (arguments
      `(#:phases
        (modify-phases %standard-phases
+         (add-after 'unpack 'fix-manpage-date
+           (lambda _
+             ;; Replace current date with specific date to build reproducibly
+             (substitute* "doc/fixmanpages.in"
+               (("pod2man -d .* -n") "pod2man -d \"1970-01-01\" -n"))))
          (add-before 'build 'build-doc
            (lambda* (#:key make-flags #:allow-other-keys)
              (apply invoke "make" "-C" "doc" "doc"
@@ -3756,14 +3761,14 @@ protocol daemons for BGP, IS-IS, LDP, OSPF, PIM, and RIP.")
 (define-public bird
   (package
     (name "bird")
-    (version "2.0.8")
+    (version "2.0.10")
     (source (origin
               (method url-fetch)
               (uri (string-append "ftp://bird.network.cz/pub/bird/bird-"
                                   version ".tar.gz"))
               (sha256
                (base32
-                "1xp7f0im1v8pqqx3xqyfkd1nsxk8vnbqgrdrwnwhg8r5xs1xxlhr"))))
+                "0npx3zgbjnhm4905zmj2qkz3d13s8hakassq6sbzm1ywv3fl3lvy"))))
     (inputs
      (list libssh readline))
     (native-inputs
@@ -4149,11 +4154,11 @@ cables.")
      (list lua openssl pcre2 zlib))
     (home-page "https://www.haproxy.org/")
     (synopsis "Reliable, high performance TCP/HTTP load balancer")
-    (description "HAProxy is a free, very fast and reliable solution offering
-high availability, load balancing, and proxying for TCP and HTTP-based
-applications.  It is particularly suited for web sites crawling under very
-high loads while needing persistence or Layer7 processing.  Supporting tens of
-thousands of connections is clearly realistic with today's hardware.")
+    (description "HAProxy offers @acronym{HA, high availability}, load
+balancing, and proxying for TCP and HTTP-based applications.  It is particularly
+suited to Web sites crawling under very high loads while needing persistence or
+Layer 7 processing.  Supporting tens of thousands of connections is clearly
+realistic with today's hardware.")
     (license (list license:gpl2+
                    license:lgpl2.1
                    license:lgpl2.1+))))
diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 6d4f8c8836..0e8e5b2adc 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -591,31 +591,26 @@ for day to day programming.")
 (define-public ocaml-cudf
   (package
     (name "ocaml-cudf")
-    (version "0.9")
-    (source
-      (origin
-        (method url-fetch)
-        (uri "https://gforge.inria.fr/frs/download.php/36602/cudf-0.9.tar.gz")
-        (sha256
-          (base32
-            "0771lwljqwwn3cryl0plny5a5dyyrj4z6bw66ha5n8yfbpcy8clr"))))
-    (build-system ocaml-build-system)
-    (propagated-inputs (list ocaml-extlib))
-    (native-inputs
-      (list perl ocamlbuild ocaml-ounit))
+    (version "0.10")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                     (url "https://gitlab.com/irill/cudf")
+                     (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1lvrmpscbk1kjv5ag5bzlzv520xk5zw2haf6q7chvz98gcm9g0hk"))))
+    (build-system dune-build-system)
     (arguments
-     `(#:make-flags
-       ,#~(list
-           "all" "opt"
-           (string-append "BINDIR=" #$output "/bin"))
-       #:phases
-       (modify-phases %standard-phases
-         (delete 'configure))))
+     '(#:test-target "."))
+    (propagated-inputs (list ocaml-extlib))
+    (native-inputs (list ocaml-ounit2))
     (home-page "https://www.mancoosi.org/cudf/")
     (synopsis "CUDF library (part of the Mancoosi tools)")
-    (description "CUDF (for Common Upgradeability Description Format) is a
-format for describing upgrade scenarios in package-based Free and Open Source
-Software distribution.")
+    (description
+     "@acronym{CUDF, Common Upgradeability Description Format} is a format for
+describing upgrade scenarios in package-based software distributions.")
     ;; With static-linking exception
     (license license:lgpl2.1+)))
 
@@ -783,7 +778,7 @@ the opam file format.")
 (define-public opam
   (package
     (name "opam")
-    (version "2.1.2")
+    (version "2.1.3")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -792,7 +787,7 @@ the opam file format.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0mdr32mg63yaw89p44zx8b9dxp1167ckmlxkp8svd6fwgb3z49yx"))))
+                "1mw535zsw7xlvpgwnk1dan76z3f7lh5imlg0s6kdyhfg0iqisjd7"))))
     (build-system dune-build-system)
     (arguments
      `(#:test-target "."
@@ -827,6 +822,12 @@ the opam file format.")
              ;; home directory.
              (mkdir-p "test-home")
              (setenv "HOME" (string-append (getcwd) "/test-home"))
+             (with-output-to-file (string-append (getcwd) "/test-home/.gitconfig")
+               (lambda _
+                 (display "[user]
+email = guix@localhost.none
+name = Guix Builder")
+                 (newline)))
 
              ;; Opam tests require data from opam-repository. Instead of
              ;; downloading them with wget from the guix environment, copy the
@@ -837,11 +838,17 @@ the opam file format.")
                                (assoc-ref inputs (string-append "opam-repo-" commit))
                                "/ %{targets}) (run chmod +w -R %{targets}"))
                (("wget[^)]*") "touch %{targets}")
-               ;; Disable a failing test because of different line wrapping
-               (("diff cli-versioning.test cli-versioning.out") "run true")
                ;; Disable a failing test because it tries to clone a git
                ;; repository from inside bwrap
-               (("diff upgrade-format.test upgrade-format.out") "run true"))
+               (("diff upgrade-format.test upgrade-format.out") "run true")
+               ;; Disable a failing test because it tries to figure out which
+               ;; distro this is, and it doesn't know Guix
+               (("diff pin.unix.test pin.unix.out") "run true")
+               ;; Disable a failing test because of a failed expansion
+               (("diff opamroot-versions.test opamroot-versions.out") "run true")
+               ;; Disable a failing test, probably because the repository we
+               ;; replaced is not as expected
+               (("diff opamrt-big-upgrade.test opamrt-big-upgrade.out") "run true"))
              (substitute* "tests/reftests/dune"
                ;; Because of our changes to the previous file, we cannot check
                ;; it can be regenerated
@@ -879,6 +886,10 @@ the opam file format.")
          ;; Data for tests
          ("opam-repo-009e00fa" ,(opam-repo "009e00fa86300d11c311309a2544e5c6c3eb8de2"
                                            "1wwy0rwrsjf4q10j1rh1dazk32fbzhzy6f7zl6qmndidx9b1bq7w"))
+         ("opam-repo-7090735c" ,(opam-repo "7090735c9d1dd2dc481c4128c5ef4d3667238f15"
+                                           "1bccsgjhlp64lmvfjfn6viywf3x73ji75myg9ssf1ij1fkmabn0z"))
+         ("opam-repo-a5d7cdc0" ,(opam-repo "a5d7cdc0c91452b0aef4fa71c331ee5237f6dddd"
+                                           "0z7kawqisy07088p5xjxwpvmvzlbj1d9cgdipsj90yx7nc5qh369"))
          ("opam-repo-ad4dd344" ,(opam-repo "ad4dd344fe5cd1cab49ced49d6758a9844549fb4"
                                            "1a1qj47kj8xjdnc4zc50ijrix1kym1n7k20n3viki80a7518baw8"))
          ("opam-repo-c1d23f0e" ,(opam-repo "c1d23f0e17ec83a036ebfbad1c78311b898a2ca0"
@@ -1705,7 +1716,7 @@ full_split, cut, rcut, etc..")
 (define dune-bootstrap
   (package
     (name "dune")
-    (version "3.3.1")
+    (version "3.4.1")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -1714,7 +1725,7 @@ full_split, cut, rcut, etc..")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "0wdja70l7y1cj1d0sijm0q0cbics8xd9wqka7zyb29y1cc57pasa"))))
+                "02zn79l7y7rvy7b6bimlf5qymrvzc43w8q7l4jx3k8wzn2g5326z"))))
     (build-system ocaml-build-system)
     (arguments
      `(#:tests? #f; require odoc
@@ -2428,7 +2439,7 @@ immutability.")
 (define-public ocaml-alcotest
   (package
     (name "ocaml-alcotest")
-    (version "1.5.0")
+    (version "1.6.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -2437,7 +2448,7 @@ immutability.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1lgadc7p56677fi5gwl7r9bml4z87rzh50khhqaij7bwp37zrmpi"))))
+                "195612n7p8y5ba6n19glql7qffl8n3aqkl9nrlln5lb9739gpv4w"))))
     (build-system dune-build-system)
     (arguments
      `(#:package "alcotest"
@@ -2449,7 +2460,6 @@ immutability.")
              ;; cmdliner changed the format and the tests fail
              (substitute* "test/e2e/alcotest/failing/unknown_option.expected"
                (("`") "'")
-               (("COMMAND") "[COMMAND]")
                (("\\.\\.\\.") "…")))))))
     (native-inputs
      (list ocamlbuild))
@@ -2550,21 +2560,21 @@ lets the client choose the concrete timeline.")
 (define-public ocaml-ssl
   (package
     (name "ocaml-ssl")
-    (version "0.5.10")
+    (version "0.5.12")
     (source
       (origin
         (method git-fetch)
         (uri (git-reference
               (url "https://github.com/savonet/ocaml-ssl")
-              (commit (string-append "v" version))))
+              (commit version)))
         (file-name (git-file-name name version))
         (sha256 (base32
-                  "1rszqiqayh67xlwd5411k8vib47x9kapdr037z1majd2c14z3kcb"))))
+                  "1dr7yghbv0wncvggd2105bj097msgrdzxd9wjkw1xxf2vvp0j1bi"))))
     (build-system dune-build-system)
     (arguments
      `(#:test-target "."))
     (native-inputs
-     (list autoconf automake which))
+     (list autoconf automake ocaml-alcotest which))
     (propagated-inputs (list openssl))
     (home-page "https://github.com/savonet/ocaml-ssl/")
     (synopsis "OCaml bindings for OpenSSL")
@@ -3753,7 +3763,7 @@ big- and little-endian, with their unsafe counter-parts.")
 (define-public ocaml-cstruct
   (package
     (name "ocaml-cstruct")
-    (version "6.1.0")
+    (version "6.1.1")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -3762,7 +3772,7 @@ big- and little-endian, with their unsafe counter-parts.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1pwfkfs8zzr88slnvl5b28lx6w2k149ybgvrs6diay3qvwcmkhx5"))))
+                "0dpbirs6lzp0bclr3wcw407jjspll7iy66z18zks3mjccvlxd21w"))))
     (build-system dune-build-system)
     (arguments
      `(#:package "cstruct"
@@ -3946,7 +3956,7 @@ Format module of the OCaml standard library.")
 (define-public ocaml-piqilib
   (package
     (name "ocaml-piqilib")
-    (version "0.6.15")
+    (version "0.6.16")
     (source
      (origin
        (method git-fetch)
@@ -3955,7 +3965,7 @@ Format module of the OCaml standard library.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0v04hs85xv6d4ysqxyv1dik34dx49yab9shpi4x7iv19qlzl7csb"))))
+        (base32 "0mbhfrfrik3jlzx9zz680g0qdvv0b7cbjz28cgdlryp7nk4v4kx8"))))
     (build-system ocaml-build-system)
     (arguments
      `(#:phases
@@ -4074,7 +4084,7 @@ and 4 (random based) according to RFC 4122.")
 (define-public ocaml-piqi
   (package
     (name "ocaml-piqi")
-    (version "0.7.7")
+    (version "0.7.8")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -4083,7 +4093,7 @@ and 4 (random based) according to RFC 4122.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1913jpsb8mvqi8609j4g4sm5jhg50dq0xqxgy8nmvknfryyc89nm"))))
+                "12m9vxir0cs2155nxs0a3m3npf3w79kyxf9a5lmf18qvvgismfz8"))))
     (build-system ocaml-build-system)
     (arguments
      `(#:make-flags
@@ -4293,7 +4303,7 @@ function that follows the prototype of POSIX's wcwidth.")
 (define-public ocaml-zed
   (package
     (name "ocaml-zed")
-    (version "3.1.0")
+    (version "3.2.0")
     (home-page "https://github.com/ocaml-community/zed")
     (source
      (origin
@@ -4303,14 +4313,18 @@ function that follows the prototype of POSIX's wcwidth.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "04vr1a94imsghm98iigc35rhifsz0rh3qz2qm0wam2wvp6vmrx0p"))))
+        (base32 "1g171kk5wxnk66d4vwz2crh5i19vhqghp78iybl5am17gl9qf8pb"))))
     (build-system dune-build-system)
+    (propagated-inputs
+     (list ocaml-react
+           ocaml-result
+           ocaml-uchar
+           ocaml-uutf
+           ocaml-uucp
+           ocaml-uuseg
+           ocaml-odoc))
     (arguments
      `(#:test-target "."))
-    (propagated-inputs
-     `(("ocaml-charInfo-width" ,ocaml-charinfo-width)
-       ("ocaml-camomile" ,ocaml-camomile)
-       ("ocaml-react" ,ocaml-react)))
     (properties `((ocaml4.07-variant . ,(delay ocaml4.07-zed))))
     (synopsis "Abstract engine for text edition in OCaml")
     (description
@@ -4337,12 +4351,16 @@ capabilities, Zed provides macro recording and cursor management facilities.")
                (sha256
                 (base32
                  "0pa9awinqr0plp4b2az78dwpvh01pwaljnn5ydg8mc6hi7rmir55"))))
+    (propagated-inputs
+     `(("ocaml-charInfo-width" ,ocaml-charinfo-width)
+       ("ocaml-camomile" ,ocaml-camomile)
+       ("ocaml-react" ,ocaml-react)))
      (properties '()))))
 
 (define-public ocaml-lambda-term
   (package
     (name "ocaml-lambda-term")
-    (version "3.2.0")
+    (version "3.3.1")
     (home-page "https://github.com/ocaml-community/lambda-term")
     (source (origin
               (method git-fetch)
@@ -4352,18 +4370,18 @@ capabilities, Zed provides macro recording and cursor management facilities.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "048k26644wq5wlwk0j179dxrxyz9nxqqq4vvhyh6pqpgxdajd44i"))))
+                "1pkamblc6h0rsbk901cqn3xr9gqa3g8wrwyx5zryaqvb2xpbhp8b"))))
     (build-system dune-build-system)
     (arguments
      `(#:test-target "."))
     (propagated-inputs
-     (list ocaml-lwt
-           ocaml-lwt-log
-           ocaml-react
-           ocaml-zed
-           ocaml-camomile
+     (list ocaml-logs
+           ocaml-lwt
            ocaml-lwt-react
-           ocaml-mew-vi))
+           ocaml-mew-vi
+           ocaml-odoc
+           ocaml-react
+           ocaml-zed))
     (properties `((ocaml4.07-variant . ,(delay ocaml4.07-lambda-term))))
     (synopsis "Terminal manipulation library for OCaml")
     (description "Lambda-Term is a cross-platform library for manipulating the
@@ -4398,7 +4416,7 @@ instead of bindings to a C library.")
 (define-public ocaml-utop
   (package
     (name "ocaml-utop")
-    (version "2.9.2")
+    (version "2.10.0")
     (source
      (origin
        (method git-fetch)
@@ -4407,15 +4425,19 @@ instead of bindings to a C library.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0z5anakgbndhyzbi570pfs2fy69bnmgq9jflgfbly2rhbhwa7wgj"))))
+        (base32 "1pcix3h9f7is06581iax4i08zkd6sv8y5hy1vvxhqhcsd9z0qfl3"))))
     (build-system dune-build-system)
     (arguments
      `(#:test-target "."))
     (native-inputs
      (list ocaml-cppo))
     (propagated-inputs
-     (list ocaml-lambda-term ocaml-lwt ocaml-lwt-react ocaml-camomile
-           ocaml-react))
+     (list ocaml-lambda-term
+           ocaml-logs
+           ocaml-lwt
+           ocaml-lwt-react
+           ocaml-react
+           ocaml-zed))
     (properties `((ocaml4.07-variant . ,(delay ocaml4.07-utop))))
     (home-page "https://github.com/ocaml-community/utop")
     (synopsis "Improved interface to the OCaml toplevel")
@@ -4900,31 +4922,20 @@ is also support for writing OCaml syntax extensions in a camlp4 style.")
 (define-public ocaml-timed
   (package
     (name "ocaml-timed")
-    (version "1.0")
+    (version "1.1")
     (home-page "https://github.com/rlepigre/ocaml-timed")
     (source (origin
               (method git-fetch)
               (uri (git-reference
                     (url (string-append home-page ".git"))
-                    (commit (string-append name "_" version))))
+                    (commit version)))
               (sha256
                (base32
-                "0hfxz710faxy5yk97bkfnw87r732jcxxhmjppwrbfdb6pd0wks96"))
+                "1aqmkpjv5jk95lc2m3qyyrhw8ra7n9wj8pv3bfc83l737zv0hjn1"))
               (file-name (git-file-name name version))))
-    (build-system ocaml-build-system)
+    (build-system dune-build-system)
     (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (delete 'configure)
-         (replace 'build
-           (lambda _
-             (invoke "make")))
-         (replace 'install
-           (lambda _
-             (invoke "make" "install")))
-         (replace 'check
-           (lambda _
-             (invoke "make" "tests"))))))
+     '(#:test-target "."))
     (synopsis "Timed references for imperative state")
     (description "Timed references for imperative state.  This module provides
 an alternative type for references (or mutable cells) supporting undo/redo
@@ -4941,7 +4952,7 @@ than the first one.")
 (define-public ocaml-biniou
  (package
    (name "ocaml-biniou")
-   (version "1.2.1")
+   (version "1.2.2")
    (home-page "https://github.com/mjambon/biniou")
     (source
      (origin
@@ -4952,7 +4963,7 @@ than the first one.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0x2kiy809n1j0yf32l7hj102y628jp5jdrkbi3z7ld8jq04h1790"))))
+         "1gd4nqffm9h7dzxyvpfpww24l61fqgazyh3p5f7k9jvgyv9y4vcn"))))
    (build-system dune-build-system)
    (arguments
     `(#:phases
@@ -4960,7 +4971,7 @@ than the first one.")
         (add-before 'build 'make-writable
           (lambda _ (for-each make-file-writable (find-files "." ".")))))))
    (inputs
-    (list ocaml-easy-format))
+    (list ocaml-easy-format ocaml-camlp-streams))
    (native-inputs
     (list which))
    (synopsis "Data format designed for speed, safety, ease of use and backward
@@ -4975,7 +4986,7 @@ than yojson), with 25-35% space savings.")
 (define-public ocaml-yojson
   (package
     (name "ocaml-yojson")
-    (version "1.7.0")
+    (version "2.0.2")
     (home-page "https://github.com/ocaml-community/yojson")
     (source
      (origin
@@ -4986,14 +4997,13 @@ than yojson), with 25-35% space savings.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0zncsw8bgbkh1pfvfc7nh628hfj84lgx6jwhp9ashj3z1z0w3xjn"))))
+         "1habsh00ihjhk1g1csxqg3hj8izk5zvgc7wm579wyjw35vzcmwr1"))))
     (build-system dune-build-system)
     (arguments
-     `(#:test-target "."))
-    (propagated-inputs
-     (list ocaml-biniou ocaml-easy-format))
-    (native-inputs
-     (list ocaml-alcotest ocaml-cppo))
+     `(#:test-target "."
+       #:package "yojson"))
+    (propagated-inputs (list ocaml-seq))
+    (native-inputs (list ocaml-alcotest ocaml-cppo))
     (synopsis "Low-level JSON library for OCaml")
     (description "Yojson is an optimized parsing and printing library for the
 JSON format.  It addresses a few shortcomings of json-wheel including 2x
@@ -5036,10 +5046,10 @@ Mercurial's @code{https://www.selenic.com/blog/?p=663, unified test
 format}.  @code{craml} is released as a single binary (called @code{craml}).")
     (license license:isc)))
 
-(define-public ocaml-dot-merlin-reader
+(define-public ocaml-merlin-lib
   (package
-    (name "ocaml-dot-merlin-reader")
-    (version "4.5-414")
+    (name "ocaml-merlin-lib")
+    (version "4.6-414")
     (source
      (origin
        (method git-fetch)
@@ -5049,17 +5059,27 @@ format}.  @code{craml} is released as a single binary (called @code{craml}).")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "125gyk63fg9plqkyrkl3wvpr3czjxgvshf4496fc4swldl7z587c"))))
+         "1cpa9x45w54l4mqqmc8z3s5gscggw37gb6z9i7wwss86fj1wgclh"))))
     (build-system dune-build-system)
-    (arguments '(#:package "dot-merlin-reader"
+    (arguments '(#:package "merlin-lib"
                  #:tests? #f))          ; no tests
-    (inputs
-     (list ocaml-yojson ocaml-csexp ocaml-result))
+    (propagated-inputs (list ocaml-csexp ocaml-menhir))
     (home-page "https://ocaml.github.io/merlin/")
+    (synopsis "Merlin libraries")
+    (description "These libraries provides access to low-level compiler
+interfaces and the standard higher-level merlin protocol.")
+    (license license:expat)))
+
+(define-public ocaml-dot-merlin-reader
+  (package
+    (inherit ocaml-merlin-lib)
+    (name "ocaml-dot-merlin-reader")
+    (arguments '(#:package "dot-merlin-reader"
+                 #:tests? #f))          ; no tests
+    (propagated-inputs (list ocaml-merlin-lib))
     (synopsis "Reads config files for @code{ocaml-merlin}")
     (description "@code{ocaml-dot-merlin-reader} is an external reader for
-@code{ocaml-merlin} configurations.")
-    (license license:expat)))
+@code{ocaml-merlin} configurations.")))
 
 (define-public ocaml-merlin
   (package
@@ -5073,8 +5093,7 @@ format}.  @code{craml} is released as a single binary (called @code{craml}).")
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?
                (invoke "dune" "runtest" "-p" "merlin,dot-merlin-reader")))))))
-    (inputs
-     (list ocaml-yojson ocaml-csexp ocaml-result))
+    (propagated-inputs (list ocaml-merlin-lib ocaml-yojson))
     (native-inputs
      (list ocaml-dot-merlin-reader ; required for tests
            ocaml-mdx jq))
@@ -5299,11 +5318,17 @@ parsexp_io.")
 (define-public ocaml-sexplib
   (package
     (name "ocaml-sexplib")
-    (version "0.15.0")
+    (version "0.15.1")
     (home-page "https://github.com/janestreet/sexplib")
-    (source
-     (janestreet-origin "sexplib" version
-                        "1xs55f11yhscnfrzpvy1vn05j6xi9kxy097465624l615j7k8qm5"))
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                     (url home-page)
+                     (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1gcvcc0jw6pb69wwfjnaqz1jk5simap2kdb7g43v7v7mksg8sh9f"))))
     (build-system dune-build-system)
     (propagated-inputs
      (list ocaml-base ocaml-num ocaml-parsexp ocaml-sexplib0))
@@ -7632,7 +7657,8 @@ then run the Bisect_ppx report tool on the generated visitation files.")
         (base32 "07zjkk455l51i29lcayzrc1q8j5bvbv97sscv8yhcj7x6h6q2nag"))))
     (build-system dune-build-system)
     (arguments
-     `(#:phases
+     `(#:tests? #f; not compatible with current version of ocaml-yojson
+       #:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'fix-test
            (lambda _
@@ -7677,7 +7703,7 @@ complexity of the OCaml module system.")
 (define-public ocaml-odoc-parser
   (package
     (name "ocaml-odoc-parser")
-    (version "1.0.0")
+    (version "2.0.0")
     (source
       (origin
         (method git-fetch)
@@ -7687,10 +7713,10 @@ complexity of the OCaml module system.")
         (file-name (git-file-name name version))
         (sha256
           (base32
-           "0mvwbnla0wd29bc7ckwpb494qv7p616cx8hnm0zg36np7v3zwy4w"))))
+           "1x48kf051xs98rd6cri591bk1ccp9hyp93n1rlf6qnxic55jw683"))))
     (build-system dune-build-system)
     (propagated-inputs
-      (list ocaml-astring ocaml-result))
+      (list ocaml-astring ocaml-camlp-streams ocaml-result))
     (native-inputs
       (list ocaml-ppx-expect))
     (home-page "https://github.com/ocaml-doc/odoc-parser")
@@ -7831,7 +7857,7 @@ and SVG file output.")
 (define-public ocaml-version
   (package
     (name "ocaml-version")
-    (version "3.4.0")
+    (version "3.5.0")
     (source
      (origin
        (method git-fetch)
@@ -7841,7 +7867,7 @@ and SVG file output.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1c13zk1qna59m5z9jx7da3p7cxd48scpyk7zg7gi6gc6hx5hhjx8"))))
+         "1pnw2ym021j48zknhbi1kdiyfv9si8p2l04rdzbv4g51fclsqs92"))))
     (build-system dune-build-system)
     (arguments `(#:tests? #f))          ; no tests
     (properties '((upstream-name . "ocaml-version")))
@@ -8206,7 +8232,7 @@ defined in OCaml 4.12.0.")
 (define-public ocamlformat
   (package
     (name "ocamlformat")
-    (version "0.22.4")
+    (version "0.24.1")
     (source
       (origin
         (method git-fetch)
@@ -8216,7 +8242,7 @@ defined in OCaml 4.12.0.")
         (file-name (git-file-name name version))
         (sha256
           (base32
-            "171lq3vx4y8xj4by5zy93isx8nhg6ysxg1hxmkqkq16fdaiz8mnc"))))
+            "0y1j5mwwrliy6a78cmpi6j8gw425shghqg9ylyl3qw5fx4b088pp"))))
     (build-system dune-build-system)
     (arguments
      '(#:package "ocamlformat"
@@ -8535,6 +8561,156 @@ It makes it possible to run pure OCaml programs in JavaScript environment like
 browsers and Node.js.")
     (license license:lgpl2.1+)))
 
+(define-public ocaml-afl-persistent
+  (package
+    (name "ocaml-afl-persistent")
+    (version "1.3")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+              (url "https://github.com/stedolan/ocaml-afl-persistent")
+              (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+          (base32
+           "06yyds2vcwlfr2nd3gvyrazlijjcrd1abnvkfpkaadgwdw3qam1i"))))
+    (build-system ocaml-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (delete 'configure)
+         (replace 'build
+           (lambda _
+             (invoke "./build.sh")))
+         ;; XXX: The tests are already run in the build.sh script.
+         (delete 'check))))
+    (native-inputs
+     `(("opam" ,opam)))
+    (home-page "https://github.com/stedolan/ocaml-afl-persistent")
+    (synopsis "Use afl-fuzz in persistent mode")
+    (description
+      "afl-fuzz normally works by repeatedly forking the program being tested.
+Using this package, you can run afl-fuzz in ``persistent mode'', which avoids
+repeated forking and is much faster.")
+    (license license:expat)))
+
+(define-public ocaml-pprint
+  (package
+    (name "ocaml-pprint")
+    (version "20220103")
+    (home-page "https://github.com/fpottier/pprint")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url home-page)
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "09y6nwnjldifm47406q1r9987njlk77g4ifqg6qs54dckhr64vax"))))
+    (build-system dune-build-system)
+    (synopsis "OCaml pretty-printing combinator library and rendering
+engine")
+    (description "This OCaml library offers a set of combinators for building
+so-called documents as well as an efficient engine for converting documents to
+a textual, fixed-width format.  The engine takes care of indentation and line
+breaks, while respecting the constraints imposed by the structure of the
+document and by the text width.")
+    (license license:lgpl2.0)))
+
+(define-public ocaml-crowbar
+  (package
+    (name "ocaml-crowbar")
+    (version "0.2.1")
+    (home-page "https://github.com/stedolan/crowbar")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url home-page)
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "11f3kiw58g8njx15akx16xcplzvzdw9y6c4jpyfxylkxws4g0f6j"))))
+    (build-system dune-build-system)
+    (arguments
+     `(#:test-target "."))
+    (propagated-inputs
+     (list ocaml-ocplib-endian
+           ocaml-cmdliner
+           ocaml-afl-persistent))
+    (native-inputs
+     (list ocaml-calendar
+           ocaml-fpath
+           ocaml-uucp
+           ocaml-uunf
+           ocaml-uutf
+           ocaml-pprint))
+    (synopsis "Ocaml library for tests, let a fuzzer find failing cases")
+    (description "Crowbar is a library for testing code, combining
+QuickCheck-style property-based testing and the magical bug-finding powers of
+@uref{http://lcamtuf.coredump.cx/afl/, afl-fuzz}.")
+    (license license:expat)))
+
+(define-public ocaml-eqaf
+  (package
+    (name "ocaml-eqaf")
+    (version "0.9")
+    (home-page "https://github.com/mirage/eqaf")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url home-page)
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "16ics56wiqyng70dy2hqikicm8ag1mv5w1h7hkiwvydw1x2j2rsl"))))
+    (build-system dune-build-system)
+    (propagated-inputs (list ocaml-cstruct))
+    (native-inputs (list ocaml-alcotest ocaml-crowbar))
+    (synopsis "OCaml library for constant-time equal function on string")
+    (description "This OCaml library provides an equal function on string in
+constant-time to avoid timing-attack with crypto stuff.")
+    (license license:expat)))
+
+(define-public ocaml-digestif
+  (package
+    (name "ocaml-digestif")
+    (version "1.1.2")
+    (home-page "https://github.com/mirage/digestif")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url home-page)
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0mc233d63y04jznsn3bxncgv7fkvyngbv6hcka412iq0y3x4qsmq"))))
+    (build-system dune-build-system)
+    (propagated-inputs (list ocaml-eqaf))
+    (native-inputs
+     (list pkg-config
+           ocaml-fmt
+           ocaml-alcotest
+           ocaml-bos
+           ocaml-astring
+           ocaml-fpath
+           ocaml-rresult
+           ocaml-findlib))
+    (synopsis "Simple hash algorithms in OCaml")
+    (description
+     "Digestif is an OCaml library that provides implementations of hash
+algorithms.  Implemented hash algorithms include MD5, SHA1, SHA224, SHA256,
+SHA384, SHA512, Blake2b, Blake2s and RIPEMD160.")
+    (license license:expat)))
+
 (define-public ocaml-bibtex2html
   (package
     (name "ocaml-bibtex2html")
diff --git a/gnu/packages/ocr.scm b/gnu/packages/ocr.scm
index cc0f84d55c..21d257ef24 100644
--- a/gnu/packages/ocr.scm
+++ b/gnu/packages/ocr.scm
@@ -5,6 +5,7 @@
 ;;; Copyright © 2019 Alex Vong <alexvong1995@gmail.com>
 ;;; Copyright © 2021 Andy Tai <atai@atai.org>
 ;;; Copyright © 2021, 2022 Nicolas Goaziou <mail@nicolasgoaziou.fr>
+;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -28,6 +29,7 @@
   #:use-module (guix gexp)
   #:use-module (guix git-download)
   #:use-module (guix build-system cmake)
+  #:use-module (guix build-system copy)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system python)
   #:use-module (gnu packages)
@@ -55,16 +57,16 @@
 (define-public ocrad
   (package
     (name "ocrad")
-    (version "0.27")
+    (version "0.28")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/ocrad/ocrad-"
                                  version ".tar.lz"))
              (sha256
               (base32
-               "0divffvcaim89g4pvqs8kslbcxi475bcl3b4ynphf284k9zfdgx9"))))
+               "0bmzpcv7sjf8f5pvd9wwh9yp6s7zqd226876g5csmbdxdmbymk1l"))))
     (build-system gnu-build-system)
-    (native-inputs (list lzip))
+    (native-inputs (list libpng lzip))
     (home-page "https://www.gnu.org/software/ocrad/")
     (synopsis "Optical character recognition based on feature extraction")
     (description
@@ -73,72 +75,126 @@ feature extraction method.  It can read images in PBM, PGM or PPM formats and
 it produces text in 8-bit or UTF-8 formats.")
     (license license:gpl3+)))
 
+(define-public tesseract-ocr-tessdata-fast
+  (package
+    (name "tesseract-ocr-tessdata-fast")
+    (version "4.1.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/tesseract-ocr/tessdata_fast")
+                    (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1m310cpb87xx8l8q7jy9fvzf6a0m8rm0dmjpbiwhc2mi6w4gn084"))))
+    (build-system copy-build-system)
+    (arguments (list #:install-plan #~'(("." "share/tesseract-ocr/tessdata"))
+                     #:phases #~(modify-phases %standard-phases
+                                  (add-after 'unpack 'delete-broken-links
+                                    (lambda _
+                                      (delete-file "configs")
+                                      (delete-file "pdf.ttf"))))))
+    (home-page "https://github.com/tesseract-ocr/tessdata_fast")
+    (synopsis "Fast integer versions of trained LSTM models")
+    (description "This repository contains fast integer versions of trained
+models for the Tesseract OCR Engine.")
+    (license license:asl2.0)))
+
 (define-public tesseract-ocr
-  ;; There are useful commits beyond the last official stable release.
-  (let ((commit "97079fa353557af6df86fd20b5d2e0dff5d8d5df")
-        (revision "1"))
-    (package
-      (name "tesseract-ocr")
-      (version (git-version "4.1.1" revision commit))
-      (source
-       (origin
-         (method git-fetch)
-         (uri (git-reference
-               (url "https://github.com/tesseract-ocr/tesseract")
-               (commit commit)))
-         (file-name (git-file-name name version))
-         (sha256
-          (base32
-           "11137a4aaay7qp64vdjd83hz1l089nzi5a0ql0qgk8gn79pyhi98"))))
-      (build-system gnu-build-system)
-      (inputs
-       `(("cairo" ,cairo)
-         ("icu" ,icu4c)
-         ("leptonica" ,leptonica)
-         ("pango" ,pango)
-         ("python-wrapper" ,python-wrapper)))
-      (native-inputs
-       `(("asciidoc" ,asciidoc)
-         ("autoconf" ,autoconf)
-         ("automake" ,automake)
-         ("docbook-xsl" ,docbook-xsl)
-         ("libarchive" ,libarchive)
-         ("libcurl" ,curl)
-         ("libtool" ,libtool)
-         ("libtiff" ,libtiff)
-         ("pkg-config" ,pkg-config)
-         ("xsltproc" ,libxslt)))
-      (arguments
-       `(#:configure-flags
-         (let ((leptonica (assoc-ref %build-inputs "leptonica")))
-           (list (string-append "LIBLEPT_HEADERSDIR=" leptonica "/include")))
-         #:tests? #f ; Tests currently result in a segfault
-         #:phases
-         (modify-phases %standard-phases
-           (add-after 'unpack 'fix-docbook
-             (lambda* (#:key inputs #:allow-other-keys)
-               ;; Don't attempt to download XSL schema.
-               (substitute* "doc/Makefile.am"
-                 (("http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl")
-                  (string-append (assoc-ref inputs "docbook-xsl")
-                                 "/xml/xsl/docbook-xsl-"
-                                 ,(package-version docbook-xsl)
-                                 "/manpages/docbook.xsl")))))
-           (add-after 'install 'build-training
-             (lambda _
-               (invoke "make" "training")))
-           (add-after 'build-training 'install-training
-             (lambda _
-               (invoke "make" "training-install"))))))
-      (home-page "https://github.com/tesseract-ocr/tesseract")
-      (synopsis "Optical character recognition engine")
-      (description
-       "Tesseract is an optical character recognition (OCR) engine with very
+  (package
+    (name "tesseract-ocr")
+    (version "5.2.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/tesseract-ocr/tesseract")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0dai539h07lqj8lyhznd3wbwdpqr78qrsczq78rsmsryqvmdbyaa"))))
+    (build-system gnu-build-system)
+    (arguments
+     (list
+      #:configure-flags
+      #~(list (string-append "LIBLEPT_HEADERSDIR="
+                             #$(this-package-input "leptonica") "/include")
+              "--disable-static")       ;avoid 6 MiB static archive
+      ;; The unit tests are disabled because they require building bundled
+      ;; third party libraries.
+      #:tests? #f
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'do-not-override-xml-catalog-files
+            (lambda _
+              (substitute* "configure.ac"
+                (("AC_SUBST\\(\\[XML_CATALOG_FILES])")
+                 ""))))
+          (add-after 'unpack 'adjust-TESSDATA_PREFIX-macro
+            (lambda _
+              ;; Use a deeper TESSDATA_PREFIX hierarchy so that a more
+              ;; specific search-path than '/share' can be specified.  The
+              ;; build system uses CPPFLAGS for itself, so we can't simply set
+              ;; a make flag.
+              (substitute* "Makefile.am"
+                (("-DTESSDATA_PREFIX='\"@datadir@\"'")
+                 "-DTESSDATA_PREFIX='\"@datadir@/tesseract-ocr\"'"))))
+          (add-after 'build 'build-training
+            (lambda* (#:key parallel-build? #:allow-other-keys)
+              (define n (if parallel-build? (number->string
+                                             (parallel-job-count))
+                            "1"))
+              (invoke "make" "-j" n "training")))
+          (add-after 'install 'install-training
+            (lambda _
+              (invoke "make" "training-install")))
+          (add-after 'install 'install-minimal-tessdata
+            ;; tesseract-ocr cannot be used without its trained models data;
+            ;; install the English language as a minimal base which can be
+            ;; extended via TESSDATA_PREFIX.
+            (lambda* (#:key native-inputs inputs #:allow-other-keys)
+              (define eng.traineddata
+                "/share/tesseract-ocr/tessdata/eng.traineddata")
+              (install-file (search-input-file (or native-inputs inputs)
+                                               eng.traineddata)
+                            (dirname (string-append #$output
+                                                    eng.traineddata))))))))
+    (native-inputs
+     (list asciidoc
+           autoconf
+           automake
+           curl
+           docbook-xsl
+           libarchive
+           libtiff
+           libtool
+           libxml2                      ;for XML_CATALOG_FILES
+           libxslt
+           pkg-config
+           tesseract-ocr-tessdata-fast))
+    (inputs
+     (list cairo
+           icu4c
+           leptonica
+           pango
+           python-wrapper))
+    (native-search-paths (list (search-path-specification
+                                (variable "TESSDATA_PREFIX")
+                                (files (list "share/tesseract-ocr/tessdata"))
+                                (separator #f)))) ;single value
+    (home-page "https://github.com/tesseract-ocr/tesseract")
+    (synopsis "Optical character recognition engine")
+    (description
+     "Tesseract is an optical character recognition (OCR) engine with very
 high accuracy.  It supports many languages, output text formatting, hOCR
 positional information and page layout analysis.  Several image formats are
 supported through the Leptonica library.  It can also detect whether text is
-monospaced or proportional.")
-      (license license:asl2.0))))
+monospaced or proportional.  Support for the English language is included by
+default.  To add support for more languages, the
+@code{tesseract-ocr-tessdata-fast} package should be installed.")
+    (license license:asl2.0)))
 
 (define-public gimagereader
   (package
diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm
index ce990a0321..b090f714fb 100644
--- a/gnu/packages/package-management.scm
+++ b/gnu/packages/package-management.scm
@@ -1356,6 +1356,23 @@ environments.")
     ;; and the fonts included in this package are licensed OFL1.1.
     (license (list license:gpl3+ license:agpl3+ license:silofl1.1))))
 
+(define-public gwl/next
+  (let ((commit "706a0895f639ed3ed77d0fe88382f51a6638b514")
+        (revision "1"))
+    (package
+      (inherit gwl)
+      (name "gwl-next")
+      (version (git-version "0.5.0" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://git.savannah.gnu.org/git/gwl.git")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "0k9zkdyyzir3fvlbcfcqy17k28b51i20rpbjwlx2i1mwd2pw9cxc")))))))
+
 (define-public guix-build-coordinator
   (let ((commit "cc884efa7ee8a481cd3dae1b93d27454ac8dfcd2")
         (revision "59"))
diff --git a/gnu/packages/patches/crawl-upgrade-saves.patch b/gnu/packages/patches/crawl-upgrade-saves.patch
index 720a94f3e5..831f3c60be 100644
--- a/gnu/packages/patches/crawl-upgrade-saves.patch
+++ b/gnu/packages/patches/crawl-upgrade-saves.patch
@@ -6,8 +6,8 @@ upgrade is required, but guix nulls all file dates,
 and crawl would never upgrade saves.
 
 diff -ur a/source/database.cc b/source/database.cc
---- a/source/database.cc	2018-08-09 21:49:26.000000000 -0400
-+++ b/source/database.cc	2018-10-07 18:06:41.022445789 -0400
+--- a/crawl-ref/source/database.cc	2018-08-09 21:49:26.000000000 -0400
++++ b/crawl-ref/source/database.cc	2018-10-07 18:06:41.022445789 -0400
 @@ -24,6 +24,7 @@
  #include "stringutil.h"
  #include "syscalls.h"
diff --git a/gnu/packages/patches/guile-fibers-epoll-instance-is-dead.patch b/gnu/packages/patches/guile-fibers-epoll-instance-is-dead.patch
new file mode 100644
index 0000000000..ba191f765d
--- /dev/null
+++ b/gnu/packages/patches/guile-fibers-epoll-instance-is-dead.patch
@@ -0,0 +1,99 @@
+From 5db4077e9f5166033637d2af9532ec6144b85646 Mon Sep 17 00:00:00 2001
+From: Maxime Devos <maximedevos@telenet.be>
+Date: Thu, 30 Jun 2022 14:21:47 +0000
+Subject: [PATCH 1/2] Fix behaviour of 'epoll-wake!' after 'run-fibers'.
+
+This avoids the "epoll instance is dead" error noticed in
+GNUnet-Scheme's test suite, as reported at
+<https://github.com/wingo/fibers/issues/61>.
+A test is added in the next commit.
+
+This patch has been applied upstream, but there hasn't been
+a new release yet at time of writing.
+
+* fibers/epoll.scm (epoll-wake!)[dead]: Instead of throwing an error,
+just return #t.
+---
+ fibers/epoll.scm | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/fibers/epoll.scm b/fibers/epoll.scm
+index d26db4d..eb63242 100644
+--- a/fibers/epoll.scm
++++ b/fibers/epoll.scm
+@@ -1,6 +1,7 @@
+ ;; epoll
+ 
+ ;;;; Copyright (C) 2016 Andy Wingo <wingo@pobox.com>
++;;;; Copyright (C) 2022 Maxime Devos <maximedevos@telenet.be>
+ ;;;; 
+ ;;;; This library is free software; you can redistribute it and/or
+ ;;;; modify it under the terms of the GNU Lesser General Public
+@@ -135,7 +136,12 @@ epoll wait (if appropriate)."
+     ('waiting
+      (primitive-epoll-wake (fileno (epoll-wake-write-pipe epoll))))
+     ('not-waiting #t)
+-    ('dead (error "epoll instance is dead"))))
++    ;; This can happen if a fiber was waiting on a condition and
++    ;; run-fibers completes before the fiber completes and afterwards
++    ;; the condition is signalled.  In that case, we don't have to
++    ;; resurrect the fiber or something, we can just do nothing.
++    ;; (Bug report: https://github.com/wingo/fibers/issues/61)
++    ('dead #t)))
+ 
+ (define (epoll-default-folder fd events seed)
+   (acons fd events seed))
+
+From c01d3853eb56ea4adacc31f51f6e917f8c0abe1c Mon Sep 17 00:00:00 2001
+From: Maxime Devos <maximedevos@telenet.be>
+Date: Thu, 30 Jun 2022 14:18:36 +0000
+Subject: [PATCH 2/2] Test for issue #61.
+
+* tests/conditions.scm: Add a test.
+---
+ tests/conditions.scm | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+diff --git a/tests/conditions.scm b/tests/conditions.scm
+index 505c42a..179605a 100644
+--- a/tests/conditions.scm
++++ b/tests/conditions.scm
+@@ -1,6 +1,7 @@
+ ;; Fibers: cooperative, event-driven user-space threads.
+ 
+ ;;;; Copyright (C) 2016 Free Software Foundation, Inc.
++;;;; Copyright (C) 2022 Maxime Devos <maximedevos@telenet.be>
+ ;;;;
+ ;;;; This library is free software; you can redistribute it and/or
+ ;;;; modify it under the terms of the GNU Lesser General Public
+@@ -21,6 +22,7 @@
+   #:use-module (fibers)
+   #:use-module (fibers conditions)
+   #:use-module (fibers operations)
++  #:use-module (fibers scheduler)
+   #:use-module (fibers timers))
+ 
+ (define failed? #f)
+@@ -78,4 +80,22 @@
+                              (wait cv)
+                              #t))
+ 
++;; Make a condition, wait for it inside a fiber, let the fiber abruptly
++;; terminate and signal the condition afterwards.  This tests for the bug
++;; noticed at <https://github.com/wingo/fibers/issues/61>.
++(assert-equal #t
++	      (let ((cv (make-condition)))
++		(run-fibers
++		 (lambda ()
++		   (spawn-fiber (lambda () (wait cv)))
++		   (yield-current-task)) ; let the other fiber wait forever
++		 ;; This test relies on not draining -- this is the default,
++		 ;; but let's make this explicit.
++		 #:drain? #false ;
++		 ;; For simplicity, disable concurrency and preemption.
++		 ;; That way, we can use 'yield-current-task' instead of an
++		 ;; arbitrary sleep time.
++		 #:hz 0 #:parallelism 1)
++		(signal-condition! cv)))
++
+ (exit (if failed? 1 0))
diff --git a/gnu/packages/patches/lcalc-default-parameters-1.patch b/gnu/packages/patches/lcalc-default-parameters-1.patch
deleted file mode 100644
index 19b0776320..0000000000
--- a/gnu/packages/patches/lcalc-default-parameters-1.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-Patch taken from the Sage packaging system.
-
-diff -Naur lcalc-1.23-vanilla/include/Ldirichlet_series.h lcalc-1.23-fixed-gcc.4.9/include/Ldirichlet_series.h
---- lcalc-1.23-vanilla/include/Ldirichlet_series.h	2012-08-08 23:21:55.000000000 +0200
-+++ lcalc-1.23-fixed-gcc.4.9/include/Ldirichlet_series.h	2014-04-21 14:37:59.027464849 +0200
-@@ -43,7 +43,7 @@
-  //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- template <class ttype>
- Complex L_function <ttype>::
--dirichlet_series(Complex s, long long N=-1)
-+dirichlet_series(Complex s, long long N)
- {
-     Complex z=0.;
-     long long m,n;
-diff -Naur lcalc-1.23-vanilla/include/L.h lcalc-1.23-fixed-gcc.4.9/include/L.h
---- lcalc-1.23-vanilla/include/L.h	2012-08-08 23:21:55.000000000 +0200
-+++ lcalc-1.23-fixed-gcc.4.9/include/L.h	2014-04-21 14:32:04.003467348 +0200
-@@ -491,7 +491,7 @@
- 
-     //#include "Ldirichlet_series.h" //for computing Dirichlet series
-     Complex partial_dirichlet_series(Complex s, long long N1, long long N2);
--    Complex dirichlet_series(Complex s, long long N);
-+    Complex dirichlet_series(Complex s, long long N=-1LL);
- 
-     //#include "Ltaylor_series.h" //for computing taylor series for Dirichlet series
-     //void compute_taylor_series(int N, int K, Complex s_0, Complex *series);
diff --git a/gnu/packages/patches/lcalc-default-parameters-2.patch b/gnu/packages/patches/lcalc-default-parameters-2.patch
deleted file mode 100644
index 1d881ee0c4..0000000000
--- a/gnu/packages/patches/lcalc-default-parameters-2.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-Patch taken from the Sage packaging system.
-
---- lcalc-1.23/include/Lgamma.h	2012-08-08 23:21:55.000000000 +0200
-+++ lcalc-1.23/include/Lgamma.h	2014-05-18 21:15:27.786889718 +0200
-@@ -77,7 +77,7 @@
- //n=0 should just give log_GAMMA(z)... thus making log_GAMMA
- //code obsolete. But leave log_GAMMA intact anyways.
- template <class ttype>
--precise(ttype) log_GAMMA (ttype z,int n=0)
-+precise(ttype) log_GAMMA (ttype z,int n)
- {
-     int M;
-     precise(ttype) log_G,r,r2,y;
-@@ -230,7 +230,7 @@
- //value exp_w which holds exp(-w)
- //computes G(z,w), so there's an extra w^(-z) factor.
- template <class ttype>
--Complex inc_GAMMA (ttype z,ttype w, const char *method="temme", ttype exp_w = 0, bool recycle=false)
-+Complex inc_GAMMA (ttype z,ttype w, const char *method, ttype exp_w, bool recycle)
- {
- 
-     Complex G;
-@@ -334,7 +334,7 @@
- 
- 
- template <class ttype>
--ttype cfrac_GAMMA (ttype z,ttype w, ttype exp_w=0, bool recycle=false)  //computes G(z,w) via continued fraction
-+ttype cfrac_GAMMA (ttype z,ttype w, ttype exp_w, bool recycle)  //computes G(z,w) via continued fraction
- {
- 
-         ttype G;
-@@ -424,7 +424,7 @@
- }
- 
- template <class ttype>
--ttype asympt_GAMMA (ttype z,ttype w, ttype exp_w = 0, bool recycle=false)  //computes G(z,w) via asymptotic series
-+ttype asympt_GAMMA (ttype z,ttype w, ttype exp_w, bool recycle)  //computes G(z,w) via asymptotic series
- {
- 
-         if(my_verbose>3) cout << "called asympt_GAMMA("<<z<<","<<w<<")"<< endl;
-@@ -446,7 +446,7 @@
- 
- 
- template <class ttype>
--ttype comp_inc_GAMMA (ttype z,ttype w,ttype exp_w = 0, bool recycle=false)  //computes g(z,w)
-+ttype comp_inc_GAMMA (ttype z,ttype w,ttype exp_w, bool recycle)  //computes g(z,w)
- {
- 
-     ttype g;
-@@ -604,7 +604,7 @@
- }
- 
- template <class ttype>
--Complex gamma_sum(Complex s, int what_type, ttype *coeff, int N, Double g, Complex l, Double Q, Long Period, Complex delta=1, const char *method="temme")
-+Complex gamma_sum(Complex s, int what_type, ttype *coeff, int N, Double g, Complex l, Double Q, Long Period, Complex delta, const char *method)
- {
-     Complex SUM=0;
- 
diff --git a/gnu/packages/patches/lcalc-lcommon-h.patch b/gnu/packages/patches/lcalc-lcommon-h.patch
deleted file mode 100644
index 897956de64..0000000000
--- a/gnu/packages/patches/lcalc-lcommon-h.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-Patch taken from the Sage packaging system.
-
---- src/include/Lcommon.h	2010-01-31 15:16:45.000000000 +0000
-+++ src/include/Lcommon.h	2011-03-08 21:19:11.849443238 +0000
-@@ -25,7 +25,7 @@
- #ifdef USE_MPFR
- inline double lcalc_to_double(const double& x) { return x; }
- #endif
--//inline double lcalc_to_double(const long double& x) { return x; }
-+inline double lcalc_to_double(const long double& x) { return x; }
- inline double lcalc_to_double(const int& x) { return x; }
- inline double lcalc_to_double(const long long& x) { return x; }
- inline double lcalc_to_double(const short& x) { return x; }
diff --git a/gnu/packages/patches/lcalc-using-namespace-std.patch b/gnu/packages/patches/lcalc-using-namespace-std.patch
deleted file mode 100644
index 6e0075fdc8..0000000000
--- a/gnu/packages/patches/lcalc-using-namespace-std.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-Patch taken from the Sage packaging system.
-
-diff --git a/include/Lcommon.h b/include/Lcommon.h
-index 1b3be43..bf40532 100644
---- a/include/Lcommon.h
-+++ b/include/Lcommon.h
-@@ -48,7 +48,7 @@ const bool outputSeries=true;	  // Whether to output the coefficients or just th
- 
- // Loop i from m to n
- // Useful in tidying up most for loops
--#define loop(i,m,n) for(typeof(m) i=(m); i!=(n); i++)
-+#define loop(i,m,n) for(auto i=(m); i!=(n); i++)
- 
- // A class for calculations involving polynomials of small degree
- // Not efficient enough for huge polynomials
-diff --git a/include/Lcommon_ld.h b/include/Lcommon_ld.h
-index 86ae4df..33c560c 100644
---- a/include/Lcommon_ld.h
-+++ b/include/Lcommon_ld.h
-@@ -53,7 +53,7 @@ const bool outputSeries=true;	  // Whether to output the coefficients or just th
- 
- // Loop i from m to n
- // Useful in tidying up most for loops
--#define loop(i,m,n) for(typeof(m) i=(m); i!=(n); i++)
-+#define loop(i,m,n) for(auto i=(m); i!=(n); i++)
- 
- // A class for calculations involving polynomials of small degree
- // Not efficient enough for huge polynomials
-diff --git a/include/Lglobals.h b/include/Lglobals.h
-index 60002e4..ca2606c 100644
---- a/include/Lglobals.h
-+++ b/include/Lglobals.h
-@@ -24,9 +24,9 @@
- #ifndef Lglobals_H
- #define Lglobals_H
- 
-+#include <valarray>
- using namespace std;
- 
--#include <valarray>
- #ifdef USE_MPFR
-     #include "Lgmpfrxx.h"
-     typedef mpfr_class Double;
diff --git a/gnu/packages/patches/lrcalc-includes.patch b/gnu/packages/patches/lrcalc-includes.patch
deleted file mode 100644
index e15286905b..0000000000
--- a/gnu/packages/patches/lrcalc-includes.patch
+++ /dev/null
@@ -1,92 +0,0 @@
-Patch taken from the Sage packaging system.
-
-From 4a5e1c8c3c11efdb1cbb4239825a6bf4bf1c52f8 Mon Sep 17 00:00:00 2001
-From: Anders Skovsted Buch <asbuch@math.rutgers.edu>
-Date: Sun, 29 Nov 2015 16:25:56 -0500
-Subject: [PATCH] Patch by Jeroen Demeyer to change include <vector.h> to
- "vector.h", plus similar cases.
-
----
- src/lrcalc.c   | 2 +-
- src/maple.c    | 4 ++--
- src/schublib.h | 2 +-
- src/symfcn.c   | 6 +++---
- src/symfcn.h   | 4 ++--
- 5 files changed, 9 insertions(+), 9 deletions(-)
-
-diff --git a/src/lrcalc.c b/src/lrcalc.c
-index aff3f75..60df49e 100644
---- a/src/lrcalc.c
-+++ b/src/lrcalc.c
-@@ -8,7 +8,7 @@
- #include <stdlib.h>
- extern char *optarg;
- 
--#include <vectarg.h>
-+#include "vectarg.h"
- 
- #include "symfcn.h"
- #include "maple.h"
-diff --git a/src/maple.c b/src/maple.c
-index fdc0768..a5f4d14 100644
---- a/src/maple.c
-+++ b/src/maple.c
-@@ -4,8 +4,8 @@
-  */
- 
- #include <stdio.h>
--#include <vector.h>
--#include <hashtab.h>
-+#include "vector.h"
-+#include "hashtab.h"
- #include "maple.h"
- 
- 
-diff --git a/src/schublib.h b/src/schublib.h
-index a8e8511..864850c 100644
---- a/src/schublib.h
-+++ b/src/schublib.h
-@@ -1,7 +1,7 @@
- #ifndef _SCHUBLIB_H
- #define _SCHUBLIB_H
- 
--#include <hashtab.h>
-+#include "hashtab.h"
- 
- hashtab *trans(vector *w, int vars, hashtab *res);
- hashtab *monk(int i, hashtab *slc, int rank);
-diff --git a/src/symfcn.c b/src/symfcn.c
-index 4ffbe4b..fd5df5d 100644
---- a/src/symfcn.c
-+++ b/src/symfcn.c
-@@ -5,9 +5,9 @@
- 
- #include <stdio.h>
- 
--#include <alloc.h>
--#include <vector.h>
--#include <hashtab.h>
-+#include "alloc.h"
-+#include "vector.h"
-+#include "hashtab.h"
- 
- #include "symfcn.h"
- 
-diff --git a/src/symfcn.h b/src/symfcn.h
-index b8543b1..29bb00d 100644
---- a/src/symfcn.h
-+++ b/src/symfcn.h
-@@ -1,8 +1,8 @@
- #ifndef _SYMFCN_H
- #define _SYMFCN_H
- 
--#include <hashtab.h>
--#include <vector.h>
-+#include "hashtab.h"
-+#include "vector.h"
- 
- int part_itr_sz(vector *part);
- int part_itr_sub(vector *part, vector *outer);
--- 
-2.1.1.1.g1fb337f
-
diff --git a/gnu/packages/patches/perl-class-methodmaker-reproducible.patch b/gnu/packages/patches/perl-class-methodmaker-reproducible.patch
new file mode 100644
index 0000000000..29a71babd1
--- /dev/null
+++ b/gnu/packages/patches/perl-class-methodmaker-reproducible.patch
@@ -0,0 +1,21 @@
+Description: make build reproducible by sorting hash keys
+ cf. https://reproducible.debian.net/dbd/unstable/amd64/libclass-methodmaker-perl_2.21-1.debbindiff.html
+Origin: vendor
+Bug-Debian: https://bugs.debian.org/778979
+Author: Chris Lamb <lamby@debian.org>
+Reviewed-by: gregor herrmann <gregoa@debian.org>
+Last-Update: 2015-05-02
+Forwarded: https://rt.cpan.org/Ticket/Display.html?id=104163
+Bug: https://rt.cpan.org/Ticket/Display.html?id=104163
+
+--- a/lib/Class/MethodMaker/OptExt.pm
++++ b/lib/Class/MethodMaker/OptExt.pm
+@@ -357,7 +357,7 @@
+ 
+ # -------------------------------------
+ 
+-sub option_names { grep $_ ne 'DEFAULT', keys %{OPTEXT()} }
++sub option_names { grep $_ ne 'DEFAULT', sort keys %{OPTEXT()} }
+ 
+ sub optcode {
+   my $class = shift;
diff --git a/gnu/packages/patches/polkit-CVE-2021-4034.patch b/gnu/packages/patches/polkit-CVE-2021-4034.patch
deleted file mode 100644
index ca766cb3be..0000000000
--- a/gnu/packages/patches/polkit-CVE-2021-4034.patch
+++ /dev/null
@@ -1,82 +0,0 @@
-Fixes CVE-2021-4034, local privilege escalation with 'pkexec':
-
-  https://www.openwall.com/lists/oss-security/2022/01/25/11
-
-Patch from <https://gitlab.freedesktop.org/polkit/polkit/-/commit/a2bf5c9c83b6ae46cbd5c779d3055bff81ded683>.
-
-From a2bf5c9c83b6ae46cbd5c779d3055bff81ded683 Mon Sep 17 00:00:00 2001
-From: Jan Rybar <jrybar@redhat.com>
-Date: Tue, 25 Jan 2022 17:21:46 +0000
-Subject: [PATCH] pkexec: local privilege escalation (CVE-2021-4034)
-
----
- src/programs/pkcheck.c |  5 +++++
- src/programs/pkexec.c  | 23 ++++++++++++++++++++---
- 2 files changed, 25 insertions(+), 3 deletions(-)
-
-diff --git a/src/programs/pkcheck.c b/src/programs/pkcheck.c
-index f1bb4e1..768525c 100644
---- a/src/programs/pkcheck.c
-+++ b/src/programs/pkcheck.c
-@@ -363,6 +363,11 @@ main (int argc, char *argv[])
-   local_agent_handle = NULL;
-   ret = 126;
- 
-+  if (argc < 1)
-+    {
-+      exit(126);
-+    }
-+
-   /* Disable remote file access from GIO. */
-   setenv ("GIO_USE_VFS", "local", 1);
- 
-diff --git a/src/programs/pkexec.c b/src/programs/pkexec.c
-index 7698c5c..84e5ef6 100644
---- a/src/programs/pkexec.c
-+++ b/src/programs/pkexec.c
-@@ -488,6 +488,15 @@ main (int argc, char *argv[])
-   pid_t pid_of_caller;
-   gpointer local_agent_handle;
- 
-+
-+  /*
-+   * If 'pkexec' is called THIS wrong, someone's probably evil-doing. Don't be nice, just bail out.
-+   */
-+  if (argc<1)
-+    {
-+      exit(127);
-+    }
-+
-   ret = 127;
-   authority = NULL;
-   subject = NULL;
-@@ -614,10 +623,10 @@ main (int argc, char *argv[])
- 
-       path = g_strdup (pwstruct.pw_shell);
-       if (!path)
--	{
-+        {
-           g_printerr ("No shell configured or error retrieving pw_shell\n");
-           goto out;
--	}
-+        }
-       /* If you change this, be sure to change the if (!command_line)
- 	 case below too */
-       command_line = g_strdup (path);
-@@ -636,7 +645,15 @@ main (int argc, char *argv[])
-           goto out;
-         }
-       g_free (path);
--      argv[n] = path = s;
-+      path = s;
-+
-+      /* argc<2 and pkexec runs just shell, argv is guaranteed to be null-terminated.
-+       * /-less shell shouldn't happen, but let's be defensive and don't write to null-termination
-+       */
-+      if (argv[n] != NULL)
-+      {
-+        argv[n] = path;
-+      }
-     }
-   if (access (path, F_OK) != 0)
-     {
diff --git a/gnu/packages/patches/polkit-configure-elogind.patch b/gnu/packages/patches/polkit-configure-elogind.patch
deleted file mode 100644
index 8fefb7a0c2..0000000000
--- a/gnu/packages/patches/polkit-configure-elogind.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-Even when the polkit configure script detects elogind, it does not use
-it.  This patch ensures that elogind is used when it is detected.
-
-diff -ruN a/configure b/configure
---- a/configure	1969-12-31 19:00:01.000000000 -0500
-+++ b/configure	2021-11-19 00:04:55.581385020 -0500
-@@ -20390,7 +20390,7 @@
- 
- 
- 
-- if test "$have_libsystemd" = "yes"; then
-+ if test "$have_libsystemd" = "yes" || test "$have_libelogind" = "yes"; then
-   HAVE_LIBSYSTEMD_TRUE=
-   HAVE_LIBSYSTEMD_FALSE='#'
- else
diff --git a/gnu/packages/patches/polkit-use-duktape.patch b/gnu/packages/patches/polkit-use-duktape.patch
deleted file mode 100644
index 4eaa7963c2..0000000000
--- a/gnu/packages/patches/polkit-use-duktape.patch
+++ /dev/null
@@ -1,5030 +0,0 @@
-From 4f66a9549a393e4d74b93eb85301a04ea94bc750 Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Wed, 24 Jul 2019 15:55:17 +0800
-Subject: [PATCH 01/16] Add duktape as javascript engine.
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- configure.ac                                  |   28 +-
- src/polkitbackend/Makefile.am                 |   14 +-
- .../polkitbackendduktapeauthority.c           | 1402 +++++++++++++++++
- 3 files changed, 1436 insertions(+), 8 deletions(-)
- create mode 100644 src/polkitbackend/polkitbackendduktapeauthority.c
-
-diff --git a/configure.ac b/configure.ac
-index e434ca2..5a03593 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -80,11 +80,22 @@ PKG_CHECK_MODULES(GLIB, [gmodule-2.0 gio-unix-2.0 >= 2.30.0])
- AC_SUBST(GLIB_CFLAGS)
- AC_SUBST(GLIB_LIBS)
- 
--PKG_CHECK_MODULES(LIBJS, [mozjs-78])
--
--AC_SUBST(LIBJS_CFLAGS)
--AC_SUBST(LIBJS_CXXFLAGS)
--AC_SUBST(LIBJS_LIBS)
-+dnl ---------------------------------------------------------------------------
-+dnl - Check javascript backend
-+dnl ---------------------------------------------------------------------------
-+AC_ARG_WITH(duktape, AS_HELP_STRING([--with-duktape],[Use Duktape as javascript backend]),with_duktape=yes,with_duktape=no)
-+AS_IF([test x${with_duktape} == xyes], [
-+  PKG_CHECK_MODULES(LIBJS, [duktape >= 2.0.0 ])
-+  AC_SUBST(LIBJS_CFLAGS)
-+  AC_SUBST(LIBJS_LIBS)
-+], [
-+  PKG_CHECK_MODULES(LIBJS, [mozjs-78])
-+
-+  AC_SUBST(LIBJS_CFLAGS)
-+  AC_SUBST(LIBJS_CXXFLAGS)
-+  AC_SUBST(LIBJS_LIBS)
-+])
-+AM_CONDITIONAL(USE_DUKTAPE, [test x$with_duktape == xyes], [Using duktape as javascript engine library])
- 
- EXPAT_LIB=""
- AC_ARG_WITH(expat, [  --with-expat=<dir>      Use expat from here],
-@@ -585,6 +596,13 @@ echo "
-         PAM support:                ${have_pam}
-         systemdsystemunitdir:       ${systemdsystemunitdir}
-         polkitd user:               ${POLKITD_USER}"
-+if test "x${with_duktape}" = xyes; then
-+echo "
-+        Javascript engine:          Duktape"
-+else
-+echo "
-+        Javascript engine:          Mozjs"
-+fi
- 
- if test "$have_pam" = yes ; then
- echo "
-diff --git a/src/polkitbackend/Makefile.am b/src/polkitbackend/Makefile.am
-index 7e3c080..abcbc6f 100644
---- a/src/polkitbackend/Makefile.am
-+++ b/src/polkitbackend/Makefile.am
-@@ -33,7 +33,7 @@ libpolkit_backend_1_la_SOURCES =                                   			\
- 	polkitbackendprivate.h								\
- 	polkitbackendauthority.h		polkitbackendauthority.c		\
- 	polkitbackendinteractiveauthority.h	polkitbackendinteractiveauthority.c	\
--	polkitbackendjsauthority.h		polkitbackendjsauthority.cpp		\
-+	polkitbackendjsauthority.h				\
- 	polkitbackendactionpool.h		polkitbackendactionpool.c		\
- 	polkitbackendactionlookup.h		polkitbackendactionlookup.c		\
-         $(NULL)
-@@ -51,19 +51,27 @@ libpolkit_backend_1_la_CFLAGS =                                        	\
-         -D_POLKIT_BACKEND_COMPILATION                                  	\
-         $(GLIB_CFLAGS)							\
- 	$(LIBSYSTEMD_CFLAGS)						\
--	$(LIBJS_CFLAGS)							\
-+	$(LIBJS_CFLAGS)						\
-         $(NULL)
- 
- libpolkit_backend_1_la_CXXFLAGS = $(libpolkit_backend_1_la_CFLAGS)
- 
- libpolkit_backend_1_la_LIBADD =                               		\
-         $(GLIB_LIBS)							\
-+        $(DUKTAPE_LIBS)							\
- 	$(LIBSYSTEMD_LIBS)						\
- 	$(top_builddir)/src/polkit/libpolkit-gobject-1.la		\
- 	$(EXPAT_LIBS)							\
--	$(LIBJS_LIBS)							\
-+	$(LIBJS_LIBS)                                                   \
-         $(NULL)
- 
-+if USE_DUKTAPE
-+libpolkit_backend_1_la_SOURCES += polkitbackendduktapeauthority.c
-+libpolkit_backend_1_la_LIBADD += -lm
-+else
-+libpolkit_backend_1_la_SOURCES += polkitbackendjsauthority.cpp
-+endif
-+
- rulesdir = $(sysconfdir)/polkit-1/rules.d
- rules_DATA = 50-default.rules
- 
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-new file mode 100644
-index 0000000..ae98453
---- /dev/null
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -0,0 +1,1402 @@
-+/*
-+ * Copyright (C) 2008-2012 Red Hat, Inc.
-+ * Copyright (C) 2015 Tangent Space <jstpierre@mecheye.net>
-+ * Copyright (C) 2019 Wu Xiaotian <yetist@gmail.com>
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library 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
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General
-+ * Public License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ *
-+ * Author: David Zeuthen <davidz@redhat.com>
-+ */
-+
-+#include "config.h"
-+#include <sys/wait.h>
-+#include <errno.h>
-+#include <pwd.h>
-+#include <grp.h>
-+#include <netdb.h>
-+#include <string.h>
-+#include <glib/gstdio.h>
-+#include <locale.h>
-+#include <glib/gi18n-lib.h>
-+
-+#include <polkit/polkit.h>
-+#include "polkitbackendjsauthority.h"
-+
-+#include <polkit/polkitprivate.h>
-+
-+#ifdef HAVE_LIBSYSTEMD
-+#include <systemd/sd-login.h>
-+#endif /* HAVE_LIBSYSTEMD */
-+
-+#include "initjs.h" /* init.js */
-+#include "duktape.h"
-+
-+/**
-+ * SECTION:polkitbackendjsauthority
-+ * @title: PolkitBackendJsAuthority
-+ * @short_description: JS Authority
-+ * @stability: Unstable
-+ *
-+ * An implementation of #PolkitBackendAuthority that reads and
-+ * evalates Javascript files and supports interaction with
-+ * authentication agents (virtue of being based on
-+ * #PolkitBackendInteractiveAuthority).
-+ */
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+struct _PolkitBackendJsAuthorityPrivate
-+{
-+  gchar **rules_dirs;
-+  GFileMonitor **dir_monitors; /* NULL-terminated array of GFileMonitor instances */
-+  duk_context *cx;
-+};
-+
-+#define WATCHDOG_TIMEOUT (15 * G_TIME_SPAN_SECOND)
-+
-+static void utils_spawn (const gchar *const  *argv,
-+                         guint                timeout_seconds,
-+                         GCancellable        *cancellable,
-+                         GAsyncReadyCallback  callback,
-+                         gpointer             user_data);
-+
-+gboolean utils_spawn_finish (GAsyncResult   *res,
-+                             gint           *out_exit_status,
-+                             gchar         **out_standard_output,
-+                             gchar         **out_standard_error,
-+                             GError        **error);
-+
-+static void on_dir_monitor_changed (GFileMonitor     *monitor,
-+                                    GFile            *file,
-+                                    GFile            *other_file,
-+                                    GFileMonitorEvent event_type,
-+                                    gpointer          user_data);
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+enum
-+{
-+  PROP_0,
-+  PROP_RULES_DIRS,
-+};
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static GList *polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *authority,
-+                                                                     PolkitSubject                     *caller,
-+                                                                     PolkitSubject                     *subject,
-+                                                                     PolkitIdentity                    *user_for_subject,
-+                                                                     gboolean                           subject_is_local,
-+                                                                     gboolean                           subject_is_active,
-+                                                                     const gchar                       *action_id,
-+                                                                     PolkitDetails                     *details);
-+
-+static PolkitImplicitAuthorization polkit_backend_js_authority_check_authorization_sync (
-+                                                          PolkitBackendInteractiveAuthority *authority,
-+                                                          PolkitSubject                     *caller,
-+                                                          PolkitSubject                     *subject,
-+                                                          PolkitIdentity                    *user_for_subject,
-+                                                          gboolean                           subject_is_local,
-+                                                          gboolean                           subject_is_active,
-+                                                          const gchar                       *action_id,
-+                                                          PolkitDetails                     *details,
-+                                                          PolkitImplicitAuthorization        implicit);
-+
-+G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BACKEND_TYPE_INTERACTIVE_AUTHORITY);
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static void
-+polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
-+{
-+  authority->priv = G_TYPE_INSTANCE_GET_PRIVATE (authority,
-+                                                 POLKIT_BACKEND_TYPE_JS_AUTHORITY,
-+                                                 PolkitBackendJsAuthorityPrivate);
-+}
-+
-+static gint
-+rules_file_name_cmp (const gchar *a,
-+                     const gchar *b)
-+{
-+  gint ret;
-+  const gchar *a_base;
-+  const gchar *b_base;
-+
-+  a_base = strrchr (a, '/');
-+  b_base = strrchr (b, '/');
-+
-+  g_assert (a_base != NULL);
-+  g_assert (b_base != NULL);
-+  a_base += 1;
-+  b_base += 1;
-+
-+  ret = g_strcmp0 (a_base, b_base);
-+  if (ret == 0)
-+    {
-+      /* /etc wins over /usr */
-+      ret = g_strcmp0 (a, b);
-+      g_assert (ret != 0);
-+    }
-+
-+  return ret;
-+}
-+
-+static void
-+load_scripts (PolkitBackendJsAuthority  *authority)
-+{
-+  duk_context *cx = authority->priv->cx;
-+  GList *files = NULL;
-+  GList *l;
-+  guint num_scripts = 0;
-+  GError *error = NULL;
-+  guint n;
-+
-+  files = NULL;
-+
-+  for (n = 0; authority->priv->rules_dirs != NULL && authority->priv->rules_dirs[n] != NULL; n++)
-+    {
-+      const gchar *dir_name = authority->priv->rules_dirs[n];
-+      GDir *dir = NULL;
-+
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Loading rules from directory %s",
-+                                    dir_name);
-+
-+      dir = g_dir_open (dir_name,
-+                        0,
-+                        &error);
-+      if (dir == NULL)
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Error opening rules directory: %s (%s, %d)",
-+                                        error->message, g_quark_to_string (error->domain), error->code);
-+          g_clear_error (&error);
-+        }
-+      else
-+        {
-+          const gchar *name;
-+          while ((name = g_dir_read_name (dir)) != NULL)
-+            {
-+              if (g_str_has_suffix (name, ".rules"))
-+                files = g_list_prepend (files, g_strdup_printf ("%s/%s", dir_name, name));
-+            }
-+          g_dir_close (dir);
-+        }
-+    }
-+
-+  files = g_list_sort (files, (GCompareFunc) rules_file_name_cmp);
-+
-+  for (l = files; l != NULL; l = l->next)
-+    {
-+      const gchar *filename = l->data;
-+
-+#if (DUK_VERSION >= 20000)
-+      gchar *contents;
-+      gsize length;
-+      GError *error = NULL;
-+      if (!g_file_get_contents (filename, &contents, &length, &error)){
-+        g_warning("Error when file contents of %s: %s\n", filename, error->message);
-+        g_error_free (error);
-+        continue;
-+      }
-+      if (duk_peval_lstring_noresult(cx, contents,length) != 0)
-+#else
-+      if (duk_peval_file_noresult (cx, filename) != 0)
-+#endif
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Error compiling script %s: %s",
-+                                        filename, duk_safe_to_string (authority->priv->cx, -1));
-+#if (DUK_VERSION >= 20000)
-+          g_free (contents);
-+#endif
-+          continue;
-+        }
-+#if (DUK_VERSION >= 20000)
-+      g_free (contents);
-+#endif
-+      num_scripts++;
-+    }
-+
-+  polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                "Finished loading, compiling and executing %d rules",
-+                                num_scripts);
-+  g_list_free_full (files, g_free);
-+}
-+
-+static void
-+reload_scripts (PolkitBackendJsAuthority *authority)
-+{
-+  duk_context *cx = authority->priv->cx;
-+
-+  duk_set_top (cx, 0);
-+  duk_get_global_string (cx, "polkit");
-+  duk_push_string (cx, "_deleteRules");
-+
-+  duk_call_prop (cx, 0, 0);
-+
-+  polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                "Collecting garbage unconditionally...");
-+
-+  load_scripts (authority);
-+
-+  /* Let applications know we have new rules... */
-+  g_signal_emit_by_name (authority, "changed");
-+}
-+
-+static void
-+on_dir_monitor_changed (GFileMonitor     *monitor,
-+                        GFile            *file,
-+                        GFile            *other_file,
-+                        GFileMonitorEvent event_type,
-+                        gpointer          user_data)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (user_data);
-+
-+  /* TODO: maybe rate-limit so storms of events are collapsed into one with a 500ms resolution?
-+   *       Because when editing a file with emacs we get 4-8 events..
-+   */
-+
-+  if (file != NULL)
-+    {
-+      gchar *name;
-+
-+      name = g_file_get_basename (file);
-+
-+      /* g_print ("event_type=%d file=%p name=%s\n", event_type, file, name); */
-+      if (!g_str_has_prefix (name, ".") &&
-+          !g_str_has_prefix (name, "#") &&
-+          g_str_has_suffix (name, ".rules") &&
-+          (event_type == G_FILE_MONITOR_EVENT_CREATED ||
-+           event_type == G_FILE_MONITOR_EVENT_DELETED ||
-+           event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT))
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Reloading rules");
-+          reload_scripts (authority);
-+        }
-+      g_free (name);
-+    }
-+}
-+
-+
-+static void
-+setup_file_monitors (PolkitBackendJsAuthority *authority)
-+{
-+  guint n;
-+  GPtrArray *p;
-+
-+  p = g_ptr_array_new ();
-+  for (n = 0; authority->priv->rules_dirs != NULL && authority->priv->rules_dirs[n] != NULL; n++)
-+    {
-+      GFile *file;
-+      GError *error;
-+      GFileMonitor *monitor;
-+
-+      file = g_file_new_for_path (authority->priv->rules_dirs[n]);
-+      error = NULL;
-+      monitor = g_file_monitor_directory (file,
-+                                          G_FILE_MONITOR_NONE,
-+                                          NULL,
-+                                          &error);
-+      g_object_unref (file);
-+      if (monitor == NULL)
-+        {
-+          g_warning ("Error monitoring directory %s: %s",
-+                     authority->priv->rules_dirs[n],
-+                     error->message);
-+          g_clear_error (&error);
-+        }
-+      else
-+        {
-+          g_signal_connect (monitor,
-+                            "changed",
-+                            G_CALLBACK (on_dir_monitor_changed),
-+                            authority);
-+          g_ptr_array_add (p, monitor);
-+        }
-+    }
-+  g_ptr_array_add (p, NULL);
-+  authority->priv->dir_monitors = (GFileMonitor**) g_ptr_array_free (p, FALSE);
-+}
-+
-+static duk_ret_t js_polkit_log (duk_context *cx);
-+static duk_ret_t js_polkit_spawn (duk_context *cx);
-+static duk_ret_t js_polkit_user_is_in_netgroup (duk_context *cx);
-+
-+static const duk_function_list_entry js_polkit_functions[] =
-+{
-+  { "log", js_polkit_log, 1 },
-+  { "spawn", js_polkit_spawn, 1 },
-+  { "_userIsInNetGroup", js_polkit_user_is_in_netgroup, 2 },
-+  { NULL, NULL, 0 },
-+};
-+
-+static void
-+polkit_backend_js_authority_constructed (GObject *object)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-+  duk_context *cx;
-+
-+  cx = duk_create_heap (NULL, NULL, NULL, authority, NULL);
-+  if (cx == NULL)
-+    goto fail;
-+
-+  authority->priv->cx = cx;
-+
-+  duk_push_global_object (cx);
-+  duk_push_object (cx);
-+  duk_put_function_list (cx, -1, js_polkit_functions);
-+  duk_put_prop_string (cx, -2, "polkit");
-+
-+  duk_eval_string (cx, init_js);
-+
-+  if (authority->priv->rules_dirs == NULL)
-+    {
-+      authority->priv->rules_dirs = g_new0 (gchar *, 3);
-+      authority->priv->rules_dirs[0] = g_strdup (PACKAGE_SYSCONF_DIR "/polkit-1/rules.d");
-+      authority->priv->rules_dirs[1] = g_strdup (PACKAGE_DATA_DIR "/polkit-1/rules.d");
-+    }
-+
-+  setup_file_monitors (authority);
-+  load_scripts (authority);
-+
-+  G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->constructed (object);
-+  return;
-+
-+ fail:
-+  g_critical ("Error initializing JavaScript environment");
-+  g_assert_not_reached ();
-+}
-+
-+static void
-+polkit_backend_js_authority_finalize (GObject *object)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-+  guint n;
-+
-+  for (n = 0; authority->priv->dir_monitors != NULL && authority->priv->dir_monitors[n] != NULL; n++)
-+    {
-+      GFileMonitor *monitor = authority->priv->dir_monitors[n];
-+      g_signal_handlers_disconnect_by_func (monitor,
-+                                            G_CALLBACK (on_dir_monitor_changed),
-+                                            authority);
-+      g_object_unref (monitor);
-+    }
-+  g_free (authority->priv->dir_monitors);
-+  g_strfreev (authority->priv->rules_dirs);
-+
-+  duk_destroy_heap (authority->priv->cx);
-+
-+  G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->finalize (object);
-+}
-+
-+static void
-+polkit_backend_js_authority_set_property (GObject      *object,
-+                                          guint         property_id,
-+                                          const GValue *value,
-+                                          GParamSpec   *pspec)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-+
-+  switch (property_id)
-+    {
-+      case PROP_RULES_DIRS:
-+        g_assert (authority->priv->rules_dirs == NULL);
-+        authority->priv->rules_dirs = (gchar **) g_value_dup_boxed (value);
-+        break;
-+
-+      default:
-+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-+        break;
-+    }
-+}
-+
-+static const gchar *
-+polkit_backend_js_authority_get_name (PolkitBackendAuthority *authority)
-+{
-+  return "js";
-+}
-+
-+static const gchar *
-+polkit_backend_js_authority_get_version (PolkitBackendAuthority *authority)
-+{
-+  return PACKAGE_VERSION;
-+}
-+
-+static PolkitAuthorityFeatures
-+polkit_backend_js_authority_get_features (PolkitBackendAuthority *authority)
-+{
-+  return POLKIT_AUTHORITY_FEATURES_TEMPORARY_AUTHORIZATION;
-+}
-+
-+static void
-+polkit_backend_js_authority_class_init (PolkitBackendJsAuthorityClass *klass)
-+{
-+  GObjectClass *gobject_class;
-+  PolkitBackendAuthorityClass *authority_class;
-+  PolkitBackendInteractiveAuthorityClass *interactive_authority_class;
-+
-+
-+  gobject_class = G_OBJECT_CLASS (klass);
-+  gobject_class->finalize                               = polkit_backend_js_authority_finalize;
-+  gobject_class->set_property                           = polkit_backend_js_authority_set_property;
-+  gobject_class->constructed                            = polkit_backend_js_authority_constructed;
-+
-+  authority_class = POLKIT_BACKEND_AUTHORITY_CLASS (klass);
-+  authority_class->get_name                             = polkit_backend_js_authority_get_name;
-+  authority_class->get_version                          = polkit_backend_js_authority_get_version;
-+  authority_class->get_features                         = polkit_backend_js_authority_get_features;
-+
-+  interactive_authority_class = POLKIT_BACKEND_INTERACTIVE_AUTHORITY_CLASS (klass);
-+  interactive_authority_class->get_admin_identities     = polkit_backend_js_authority_get_admin_auth_identities;
-+  interactive_authority_class->check_authorization_sync = polkit_backend_js_authority_check_authorization_sync;
-+
-+  g_object_class_install_property (gobject_class,
-+                                   PROP_RULES_DIRS,
-+                                   g_param_spec_boxed ("rules-dirs",
-+                                                       NULL,
-+                                                       NULL,
-+                                                       G_TYPE_STRV,
-+                                                       G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
-+
-+
-+  g_type_class_add_private (klass, sizeof (PolkitBackendJsAuthorityPrivate));
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static void
-+set_property_str (duk_context *cx,
-+                  const gchar *name,
-+                  const gchar *value)
-+{
-+  duk_push_string (cx, value);
-+  duk_put_prop_string (cx, -2, name);
-+}
-+
-+static void
-+set_property_strv (duk_context *cx,
-+                   const gchar *name,
-+                   GPtrArray   *value)
-+{
-+  guint n;
-+  duk_push_array (cx);
-+  for (n = 0; n < value->len; n++)
-+    {
-+      duk_push_string (cx, g_ptr_array_index (value, n));
-+      duk_put_prop_index (cx, -2, n);
-+    }
-+  duk_put_prop_string (cx, -2, name);
-+}
-+
-+static void
-+set_property_int32 (duk_context *cx,
-+                    const gchar *name,
-+                    gint32       value)
-+{
-+  duk_push_int (cx, value);
-+  duk_put_prop_string (cx, -2, name);
-+}
-+
-+static void
-+set_property_bool (duk_context *cx,
-+                   const char  *name,
-+                   gboolean     value)
-+{
-+  duk_push_boolean (cx, value);
-+  duk_put_prop_string (cx, -2, name);
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static gboolean
-+push_subject (duk_context               *cx,
-+              PolkitSubject             *subject,
-+              PolkitIdentity            *user_for_subject,
-+              gboolean                   subject_is_local,
-+              gboolean                   subject_is_active,
-+              GError                   **error)
-+{
-+  gboolean ret = FALSE;
-+  pid_t pid;
-+  uid_t uid;
-+  gchar *user_name = NULL;
-+  GPtrArray *groups = NULL;
-+  struct passwd *passwd;
-+  char *seat_str = NULL;
-+  char *session_str = NULL;
-+
-+  duk_get_global_string (cx, "Subject");
-+  duk_new (cx, 0);
-+
-+  if (POLKIT_IS_UNIX_PROCESS (subject))
-+    {
-+      pid = polkit_unix_process_get_pid (POLKIT_UNIX_PROCESS (subject));
-+    }
-+  else if (POLKIT_IS_SYSTEM_BUS_NAME (subject))
-+    {
-+      PolkitSubject *process;
-+      process = polkit_system_bus_name_get_process_sync (POLKIT_SYSTEM_BUS_NAME (subject), NULL, error);
-+      if (process == NULL)
-+        goto out;
-+      pid = polkit_unix_process_get_pid (POLKIT_UNIX_PROCESS (process));
-+      g_object_unref (process);
-+    }
-+  else
-+    {
-+      g_assert_not_reached ();
-+    }
-+
-+#ifdef HAVE_LIBSYSTEMD
-+  if (sd_pid_get_session (pid, &session_str) == 0)
-+    {
-+      if (sd_session_get_seat (session_str, &seat_str) == 0)
-+        {
-+          /* do nothing */
-+        }
-+    }
-+#endif /* HAVE_LIBSYSTEMD */
-+
-+  g_assert (POLKIT_IS_UNIX_USER (user_for_subject));
-+  uid = polkit_unix_user_get_uid (POLKIT_UNIX_USER (user_for_subject));
-+
-+  groups = g_ptr_array_new_with_free_func (g_free);
-+
-+  passwd = getpwuid (uid);
-+  if (passwd == NULL)
-+    {
-+      user_name = g_strdup_printf ("%d", (gint) uid);
-+      g_warning ("Error looking up info for uid %d: %m", (gint) uid);
-+    }
-+  else
-+    {
-+      gid_t gids[512];
-+      int num_gids = 512;
-+
-+      user_name = g_strdup (passwd->pw_name);
-+
-+      if (getgrouplist (passwd->pw_name,
-+                        passwd->pw_gid,
-+                        gids,
-+                        &num_gids) < 0)
-+        {
-+          g_warning ("Error looking up groups for uid %d: %m", (gint) uid);
-+        }
-+      else
-+        {
-+          gint n;
-+          for (n = 0; n < num_gids; n++)
-+            {
-+              struct group *group;
-+              group = getgrgid (gids[n]);
-+              if (group == NULL)
-+                {
-+                  g_ptr_array_add (groups, g_strdup_printf ("%d", (gint) gids[n]));
-+                }
-+              else
-+                {
-+                  g_ptr_array_add (groups, g_strdup (group->gr_name));
-+                }
-+            }
-+        }
-+    }
-+
-+  set_property_int32 (cx, "pid", pid);
-+  set_property_str (cx, "user", user_name);
-+  set_property_strv (cx, "groups", groups);
-+  set_property_str (cx, "seat", seat_str);
-+  set_property_str (cx, "session", session_str);
-+  set_property_bool (cx, "local", subject_is_local);
-+  set_property_bool (cx, "active", subject_is_active);
-+
-+  ret = TRUE;
-+
-+ out:
-+  free (session_str);
-+  free (seat_str);
-+  g_free (user_name);
-+  if (groups != NULL)
-+    g_ptr_array_unref (groups);
-+
-+  return ret;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static gboolean
-+push_action_and_details (duk_context               *cx,
-+                         const gchar               *action_id,
-+                         PolkitDetails             *details,
-+                         GError                   **error)
-+{
-+  gchar **keys;
-+  guint n;
-+
-+  duk_get_global_string (cx, "Action");
-+  duk_new (cx, 0);
-+
-+  set_property_str (cx, "id", action_id);
-+
-+  keys = polkit_details_get_keys (details);
-+  for (n = 0; keys != NULL && keys[n] != NULL; n++)
-+    {
-+      gchar *key;
-+      const gchar *value;
-+      key = g_strdup_printf ("_detail_%s", keys[n]);
-+      value = polkit_details_lookup (details, keys[n]);
-+      set_property_str (cx, key, value);
-+      g_free (key);
-+    }
-+  g_strfreev (keys);
-+
-+  return TRUE;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static GList *
-+polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
-+                                                       PolkitSubject                     *caller,
-+                                                       PolkitSubject                     *subject,
-+                                                       PolkitIdentity                    *user_for_subject,
-+                                                       gboolean                           subject_is_local,
-+                                                       gboolean                           subject_is_active,
-+                                                       const gchar                       *action_id,
-+                                                       PolkitDetails                     *details)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-+  GList *ret = NULL;
-+  guint n;
-+  GError *error = NULL;
-+  const char *ret_str = NULL;
-+  gchar **ret_strs = NULL;
-+  duk_context *cx = authority->priv->cx;
-+
-+  duk_set_top (cx, 0);
-+  duk_get_global_string (cx, "polkit");
-+  duk_push_string (cx, "_runAdminRules");
-+
-+  if (!push_action_and_details (cx, action_id, details, &error))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error converting action and details to JS object: %s",
-+                                    error->message);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (!push_subject (cx, subject, user_for_subject, subject_is_local, subject_is_active, &error))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error converting subject to JS object: %s",
-+                                    error->message);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (duk_pcall_prop (cx, 0, 2) != DUK_ERR_NONE)
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error evaluating admin rules: ",
-+                                    duk_safe_to_string (cx, -1));
-+      goto out;
-+    }
-+
-+  ret_str = duk_require_string (cx, -1);
-+
-+  ret_strs = g_strsplit (ret_str, ",", -1);
-+  for (n = 0; ret_strs != NULL && ret_strs[n] != NULL; n++)
-+    {
-+      const gchar *identity_str = ret_strs[n];
-+      PolkitIdentity *identity;
-+
-+      error = NULL;
-+      identity = polkit_identity_from_string (identity_str, &error);
-+      if (identity == NULL)
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Identity `%s' is not valid, ignoring: %s",
-+                                        identity_str, error->message);
-+          g_clear_error (&error);
-+        }
-+      else
-+        {
-+          ret = g_list_prepend (ret, identity);
-+        }
-+    }
-+  ret = g_list_reverse (ret);
-+
-+ out:
-+  g_strfreev (ret_strs);
-+  /* fallback to root password auth */
-+  if (ret == NULL)
-+    ret = g_list_prepend (ret, polkit_unix_user_new (0));
-+
-+  return ret;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static PolkitImplicitAuthorization
-+polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
-+                                                      PolkitSubject                     *caller,
-+                                                      PolkitSubject                     *subject,
-+                                                      PolkitIdentity                    *user_for_subject,
-+                                                      gboolean                           subject_is_local,
-+                                                      gboolean                           subject_is_active,
-+                                                      const gchar                       *action_id,
-+                                                      PolkitDetails                     *details,
-+                                                      PolkitImplicitAuthorization        implicit)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-+  PolkitImplicitAuthorization ret = implicit;
-+  GError *error = NULL;
-+  gchar *ret_str = NULL;
-+  gboolean good = FALSE;
-+  duk_context *cx = authority->priv->cx;
-+
-+  duk_set_top (cx, 0);
-+  duk_get_global_string (cx, "polkit");
-+  duk_push_string (cx, "_runRules");
-+
-+  if (!push_action_and_details (cx, action_id, details, &error))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error converting action and details to JS object: %s",
-+                                    error->message);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (!push_subject (cx, subject, user_for_subject, subject_is_local, subject_is_active, &error))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error converting subject to JS object: %s",
-+                                    error->message);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (duk_pcall_prop (cx, 0, 2) != DUK_ERR_NONE)
-+  {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error evaluating authorization rules: ",
-+                                    duk_safe_to_string (cx, -1));
-+      goto out;
-+  }
-+
-+  if (duk_is_null(cx, -1)) {
-+    good = TRUE;
-+    goto out;
-+  }
-+  ret_str = g_strdup (duk_require_string (cx, -1));
-+  if (!polkit_implicit_authorization_from_string (ret_str, &ret))
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Returned result `%s' is not valid",
-+                                    ret_str);
-+      goto out;
-+    }
-+
-+  good = TRUE;
-+
-+ out:
-+  if (!good)
-+    ret = POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED;
-+  g_free (ret_str);
-+
-+  return ret;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static duk_ret_t
-+js_polkit_log (duk_context *cx)
-+{
-+  const char *str = duk_require_string (cx, 0);
-+  fprintf (stderr, "%s\n", str);
-+  return 0;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+static const gchar *
-+get_signal_name (gint signal_number)
-+{
-+  switch (signal_number)
-+    {
-+#define _HANDLE_SIG(sig) case sig: return #sig;
-+    _HANDLE_SIG (SIGHUP);
-+    _HANDLE_SIG (SIGINT);
-+    _HANDLE_SIG (SIGQUIT);
-+    _HANDLE_SIG (SIGILL);
-+    _HANDLE_SIG (SIGABRT);
-+    _HANDLE_SIG (SIGFPE);
-+    _HANDLE_SIG (SIGKILL);
-+    _HANDLE_SIG (SIGSEGV);
-+    _HANDLE_SIG (SIGPIPE);
-+    _HANDLE_SIG (SIGALRM);
-+    _HANDLE_SIG (SIGTERM);
-+    _HANDLE_SIG (SIGUSR1);
-+    _HANDLE_SIG (SIGUSR2);
-+    _HANDLE_SIG (SIGCHLD);
-+    _HANDLE_SIG (SIGCONT);
-+    _HANDLE_SIG (SIGSTOP);
-+    _HANDLE_SIG (SIGTSTP);
-+    _HANDLE_SIG (SIGTTIN);
-+    _HANDLE_SIG (SIGTTOU);
-+    _HANDLE_SIG (SIGBUS);
-+#ifdef SIGPOLL
-+    _HANDLE_SIG (SIGPOLL);
-+#endif
-+    _HANDLE_SIG (SIGPROF);
-+    _HANDLE_SIG (SIGSYS);
-+    _HANDLE_SIG (SIGTRAP);
-+    _HANDLE_SIG (SIGURG);
-+    _HANDLE_SIG (SIGVTALRM);
-+    _HANDLE_SIG (SIGXCPU);
-+    _HANDLE_SIG (SIGXFSZ);
-+#undef _HANDLE_SIG
-+    default:
-+      break;
-+    }
-+  return "UNKNOWN_SIGNAL";
-+}
-+
-+typedef struct
-+{
-+  GMainLoop *loop;
-+  GAsyncResult *res;
-+} SpawnData;
-+
-+static void
-+spawn_cb (GObject       *source_object,
-+          GAsyncResult  *res,
-+          gpointer       user_data)
-+{
-+  SpawnData *data = user_data;
-+  data->res = g_object_ref (res);
-+  g_main_loop_quit (data->loop);
-+}
-+
-+static duk_ret_t
-+js_polkit_spawn (duk_context *cx)
-+{
-+#if (DUK_VERSION >= 20000)
-+  duk_ret_t ret = DUK_RET_ERROR;
-+#else
-+  duk_ret_t ret = DUK_RET_INTERNAL_ERROR;
-+#endif
-+  gchar *standard_output = NULL;
-+  gchar *standard_error = NULL;
-+  gint exit_status;
-+  GError *error = NULL;
-+  guint32 array_len;
-+  gchar **argv = NULL;
-+  GMainContext *context = NULL;
-+  GMainLoop *loop = NULL;
-+  SpawnData data = {0};
-+  char *err_str = NULL;
-+  guint n;
-+
-+  if (!duk_is_array (cx, 0))
-+    goto out;
-+
-+  array_len = duk_get_length (cx, 0);
-+
-+  argv = g_new0 (gchar*, array_len + 1);
-+  for (n = 0; n < array_len; n++)
-+    {
-+      duk_get_prop_index (cx, 0, n);
-+      argv[n] = g_strdup (duk_to_string (cx, -1));
-+      duk_pop (cx);
-+    }
-+
-+  context = g_main_context_new ();
-+  loop = g_main_loop_new (context, FALSE);
-+
-+  g_main_context_push_thread_default (context);
-+
-+  data.loop = loop;
-+  utils_spawn ((const gchar *const *) argv,
-+               10, /* timeout_seconds */
-+               NULL, /* cancellable */
-+               spawn_cb,
-+               &data);
-+
-+  g_main_loop_run (loop);
-+
-+  g_main_context_pop_thread_default (context);
-+
-+  if (!utils_spawn_finish (data.res,
-+                           &exit_status,
-+                           &standard_output,
-+                           &standard_error,
-+                           &error))
-+    {
-+      err_str = g_strdup_printf ("Error spawning helper: %s (%s, %d)",
-+                                 error->message, g_quark_to_string (error->domain), error->code);
-+      g_clear_error (&error);
-+      goto out;
-+    }
-+
-+  if (!(WIFEXITED (exit_status) && WEXITSTATUS (exit_status) == 0))
-+    {
-+      GString *gstr;
-+      gstr = g_string_new (NULL);
-+      if (WIFEXITED (exit_status))
-+        {
-+          g_string_append_printf (gstr,
-+                                  "Helper exited with non-zero exit status %d",
-+                                  WEXITSTATUS (exit_status));
-+        }
-+      else if (WIFSIGNALED (exit_status))
-+        {
-+          g_string_append_printf (gstr,
-+                                  "Helper was signaled with signal %s (%d)",
-+                                  get_signal_name (WTERMSIG (exit_status)),
-+                                  WTERMSIG (exit_status));
-+        }
-+      g_string_append_printf (gstr, ", stdout=`%s', stderr=`%s'",
-+                              standard_output, standard_error);
-+      err_str = g_string_free (gstr, FALSE);
-+      goto out;
-+    }
-+
-+  duk_push_string (cx, standard_output);
-+  ret = 1;
-+
-+ out:
-+  g_strfreev (argv);
-+  g_free (standard_output);
-+  g_free (standard_error);
-+  g_clear_object (&data.res);
-+  if (loop != NULL)
-+    g_main_loop_unref (loop);
-+  if (context != NULL)
-+    g_main_context_unref (context);
-+
-+  if (err_str)
-+    duk_error (cx, DUK_ERR_ERROR, err_str);
-+
-+  return ret;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+
-+static duk_ret_t
-+js_polkit_user_is_in_netgroup (duk_context *cx)
-+{
-+  const char *user;
-+  const char *netgroup;
-+  gboolean is_in_netgroup = FALSE;
-+
-+  user = duk_require_string (cx, 0);
-+  netgroup = duk_require_string (cx, 1);
-+
-+  if (innetgr (netgroup,
-+               NULL,  /* host */
-+               user,
-+               NULL)) /* domain */
-+    {
-+      is_in_netgroup = TRUE;
-+    }
-+
-+  duk_push_boolean (cx, is_in_netgroup);
-+  return 1;
-+}
-+
-+/* ---------------------------------------------------------------------------------------------------- */
-+
-+typedef struct
-+{
-+  GSimpleAsyncResult *simple; /* borrowed reference */
-+  GMainContext *main_context; /* may be NULL */
-+
-+  GCancellable *cancellable;  /* may be NULL */
-+  gulong cancellable_handler_id;
-+
-+  GPid child_pid;
-+  gint child_stdout_fd;
-+  gint child_stderr_fd;
-+
-+  GIOChannel *child_stdout_channel;
-+  GIOChannel *child_stderr_channel;
-+
-+  GSource *child_watch_source;
-+  GSource *child_stdout_source;
-+  GSource *child_stderr_source;
-+
-+  guint timeout_seconds;
-+  gboolean timed_out;
-+  GSource *timeout_source;
-+
-+  GString *child_stdout;
-+  GString *child_stderr;
-+
-+  gint exit_status;
-+} UtilsSpawnData;
-+
-+static void
-+utils_child_watch_from_release_cb (GPid     pid,
-+                                   gint     status,
-+                                   gpointer user_data)
-+{
-+}
-+
-+static void
-+utils_spawn_data_free (UtilsSpawnData *data)
-+{
-+  if (data->timeout_source != NULL)
-+    {
-+      g_source_destroy (data->timeout_source);
-+      data->timeout_source = NULL;
-+    }
-+
-+  /* Nuke the child, if necessary */
-+  if (data->child_watch_source != NULL)
-+    {
-+      g_source_destroy (data->child_watch_source);
-+      data->child_watch_source = NULL;
-+    }
-+
-+  if (data->child_pid != 0)
-+    {
-+      GSource *source;
-+      kill (data->child_pid, SIGTERM);
-+      /* OK, we need to reap for the child ourselves - we don't want
-+       * to use waitpid() because that might block the calling
-+       * thread (the child might handle SIGTERM and use several
-+       * seconds for cleanup/rollback).
-+       *
-+       * So we use GChildWatch instead.
-+       *
-+       * Avoid taking a references to ourselves. but note that we need
-+       * to pass the GSource so we can nuke it once handled.
-+       */
-+      source = g_child_watch_source_new (data->child_pid);
-+      g_source_set_callback (source,
-+                             (GSourceFunc) utils_child_watch_from_release_cb,
-+                             source,
-+                             (GDestroyNotify) g_source_destroy);
-+      g_source_attach (source, data->main_context);
-+      g_source_unref (source);
-+      data->child_pid = 0;
-+    }
-+
-+  if (data->child_stdout != NULL)
-+    {
-+      g_string_free (data->child_stdout, TRUE);
-+      data->child_stdout = NULL;
-+    }
-+
-+  if (data->child_stderr != NULL)
-+    {
-+      g_string_free (data->child_stderr, TRUE);
-+      data->child_stderr = NULL;
-+    }
-+
-+  if (data->child_stdout_channel != NULL)
-+    {
-+      g_io_channel_unref (data->child_stdout_channel);
-+      data->child_stdout_channel = NULL;
-+    }
-+  if (data->child_stderr_channel != NULL)
-+    {
-+      g_io_channel_unref (data->child_stderr_channel);
-+      data->child_stderr_channel = NULL;
-+    }
-+
-+  if (data->child_stdout_source != NULL)
-+    {
-+      g_source_destroy (data->child_stdout_source);
-+      data->child_stdout_source = NULL;
-+    }
-+  if (data->child_stderr_source != NULL)
-+    {
-+      g_source_destroy (data->child_stderr_source);
-+      data->child_stderr_source = NULL;
-+    }
-+
-+  if (data->child_stdout_fd != -1)
-+    {
-+      g_warn_if_fail (close (data->child_stdout_fd) == 0);
-+      data->child_stdout_fd = -1;
-+    }
-+  if (data->child_stderr_fd != -1)
-+    {
-+      g_warn_if_fail (close (data->child_stderr_fd) == 0);
-+      data->child_stderr_fd = -1;
-+    }
-+
-+  if (data->cancellable_handler_id > 0)
-+    {
-+      g_cancellable_disconnect (data->cancellable, data->cancellable_handler_id);
-+      data->cancellable_handler_id = 0;
-+    }
-+
-+  if (data->main_context != NULL)
-+    g_main_context_unref (data->main_context);
-+
-+  if (data->cancellable != NULL)
-+    g_object_unref (data->cancellable);
-+
-+  g_slice_free (UtilsSpawnData, data);
-+}
-+
-+/* called in the thread where @cancellable was cancelled */
-+static void
-+utils_on_cancelled (GCancellable *cancellable,
-+                    gpointer      user_data)
-+{
-+  UtilsSpawnData *data = user_data;
-+  GError *error;
-+
-+  error = NULL;
-+  g_warn_if_fail (g_cancellable_set_error_if_cancelled (cancellable, &error));
-+  g_simple_async_result_take_error (data->simple, error);
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+}
-+
-+static gboolean
-+utils_read_child_stderr (GIOChannel *channel,
-+                         GIOCondition condition,
-+                         gpointer user_data)
-+{
-+  UtilsSpawnData *data = user_data;
-+  gchar buf[1024];
-+  gsize bytes_read;
-+
-+  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
-+  g_string_append_len (data->child_stderr, buf, bytes_read);
-+  return TRUE;
-+}
-+
-+static gboolean
-+utils_read_child_stdout (GIOChannel *channel,
-+                         GIOCondition condition,
-+                         gpointer user_data)
-+{
-+  UtilsSpawnData *data = user_data;
-+  gchar buf[1024];
-+  gsize bytes_read;
-+
-+  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
-+  g_string_append_len (data->child_stdout, buf, bytes_read);
-+  return TRUE;
-+}
-+
-+static void
-+utils_child_watch_cb (GPid     pid,
-+                      gint     status,
-+                      gpointer user_data)
-+{
-+  UtilsSpawnData *data = user_data;
-+  gchar *buf;
-+  gsize buf_size;
-+
-+  if (g_io_channel_read_to_end (data->child_stdout_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
-+    {
-+      g_string_append_len (data->child_stdout, buf, buf_size);
-+      g_free (buf);
-+    }
-+  if (g_io_channel_read_to_end (data->child_stderr_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
-+    {
-+      g_string_append_len (data->child_stderr, buf, buf_size);
-+      g_free (buf);
-+    }
-+
-+  data->exit_status = status;
-+
-+  /* ok, child watch is history, make sure we don't free it in spawn_data_free() */
-+  data->child_pid = 0;
-+  data->child_watch_source = NULL;
-+
-+  /* we're done */
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+}
-+
-+static gboolean
-+utils_timeout_cb (gpointer user_data)
-+{
-+  UtilsSpawnData *data = user_data;
-+
-+  data->timed_out = TRUE;
-+
-+  /* ok, timeout is history, make sure we don't free it in spawn_data_free() */
-+  data->timeout_source = NULL;
-+
-+  /* we're done */
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+
-+  return FALSE; /* remove source */
-+}
-+
-+static void
-+utils_spawn (const gchar *const  *argv,
-+             guint                timeout_seconds,
-+             GCancellable        *cancellable,
-+             GAsyncReadyCallback  callback,
-+             gpointer             user_data)
-+{
-+  UtilsSpawnData *data;
-+  GError *error;
-+
-+  data = g_slice_new0 (UtilsSpawnData);
-+  data->timeout_seconds = timeout_seconds;
-+  data->simple = g_simple_async_result_new (NULL,
-+                                            callback,
-+                                            user_data,
-+                                            utils_spawn);
-+  data->main_context = g_main_context_get_thread_default ();
-+  if (data->main_context != NULL)
-+    g_main_context_ref (data->main_context);
-+
-+  data->cancellable = cancellable != NULL ? g_object_ref (cancellable) : NULL;
-+
-+  data->child_stdout = g_string_new (NULL);
-+  data->child_stderr = g_string_new (NULL);
-+  data->child_stdout_fd = -1;
-+  data->child_stderr_fd = -1;
-+
-+  /* the life-cycle of UtilsSpawnData is tied to its GSimpleAsyncResult */
-+  g_simple_async_result_set_op_res_gpointer (data->simple, data, (GDestroyNotify) utils_spawn_data_free);
-+
-+  error = NULL;
-+  if (data->cancellable != NULL)
-+    {
-+      /* could already be cancelled */
-+      error = NULL;
-+      if (g_cancellable_set_error_if_cancelled (data->cancellable, &error))
-+        {
-+          g_simple_async_result_take_error (data->simple, error);
-+          g_simple_async_result_complete_in_idle (data->simple);
-+          g_object_unref (data->simple);
-+          goto out;
-+        }
-+
-+      data->cancellable_handler_id = g_cancellable_connect (data->cancellable,
-+                                                            G_CALLBACK (utils_on_cancelled),
-+                                                            data,
-+                                                            NULL);
-+    }
-+
-+  error = NULL;
-+  if (!g_spawn_async_with_pipes (NULL, /* working directory */
-+                                 (gchar **) argv,
-+                                 NULL, /* envp */
-+                                 G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
-+                                 NULL, /* child_setup */
-+                                 NULL, /* child_setup's user_data */
-+                                 &(data->child_pid),
-+                                 NULL, /* gint *stdin_fd */
-+                                 &(data->child_stdout_fd),
-+                                 &(data->child_stderr_fd),
-+                                 &error))
-+    {
-+      g_prefix_error (&error, "Error spawning: ");
-+      g_simple_async_result_take_error (data->simple, error);
-+      g_simple_async_result_complete_in_idle (data->simple);
-+      g_object_unref (data->simple);
-+      goto out;
-+    }
-+
-+  if (timeout_seconds > 0)
-+    {
-+      data->timeout_source = g_timeout_source_new_seconds (timeout_seconds);
-+      g_source_set_priority (data->timeout_source, G_PRIORITY_DEFAULT);
-+      g_source_set_callback (data->timeout_source, utils_timeout_cb, data, NULL);
-+      g_source_attach (data->timeout_source, data->main_context);
-+      g_source_unref (data->timeout_source);
-+    }
-+
-+  data->child_watch_source = g_child_watch_source_new (data->child_pid);
-+  g_source_set_callback (data->child_watch_source, (GSourceFunc) utils_child_watch_cb, data, NULL);
-+  g_source_attach (data->child_watch_source, data->main_context);
-+  g_source_unref (data->child_watch_source);
-+
-+  data->child_stdout_channel = g_io_channel_unix_new (data->child_stdout_fd);
-+  g_io_channel_set_flags (data->child_stdout_channel, G_IO_FLAG_NONBLOCK, NULL);
-+  data->child_stdout_source = g_io_create_watch (data->child_stdout_channel, G_IO_IN);
-+  g_source_set_callback (data->child_stdout_source, (GSourceFunc) utils_read_child_stdout, data, NULL);
-+  g_source_attach (data->child_stdout_source, data->main_context);
-+  g_source_unref (data->child_stdout_source);
-+
-+  data->child_stderr_channel = g_io_channel_unix_new (data->child_stderr_fd);
-+  g_io_channel_set_flags (data->child_stderr_channel, G_IO_FLAG_NONBLOCK, NULL);
-+  data->child_stderr_source = g_io_create_watch (data->child_stderr_channel, G_IO_IN);
-+  g_source_set_callback (data->child_stderr_source, (GSourceFunc) utils_read_child_stderr, data, NULL);
-+  g_source_attach (data->child_stderr_source, data->main_context);
-+  g_source_unref (data->child_stderr_source);
-+
-+ out:
-+  ;
-+}
-+
-+gboolean
-+utils_spawn_finish (GAsyncResult   *res,
-+                    gint           *out_exit_status,
-+                    gchar         **out_standard_output,
-+                    gchar         **out_standard_error,
-+                    GError        **error)
-+{
-+  GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
-+  UtilsSpawnData *data;
-+  gboolean ret = FALSE;
-+
-+  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE);
-+  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-+
-+  g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == utils_spawn);
-+
-+  if (g_simple_async_result_propagate_error (simple, error))
-+    goto out;
-+
-+  data = g_simple_async_result_get_op_res_gpointer (simple);
-+
-+  if (data->timed_out)
-+    {
-+      g_set_error (error,
-+                   G_IO_ERROR,
-+                   G_IO_ERROR_TIMED_OUT,
-+                   "Timed out after %d seconds",
-+                   data->timeout_seconds);
-+      goto out;
-+    }
-+
-+  if (out_exit_status != NULL)
-+    *out_exit_status = data->exit_status;
-+
-+  if (out_standard_output != NULL)
-+    *out_standard_output = g_strdup (data->child_stdout->str);
-+
-+  if (out_standard_error != NULL)
-+    *out_standard_error = g_strdup (data->child_stderr->str);
-+
-+  ret = TRUE;
-+
-+ out:
-+  return ret;
-+}
--- 
-GitLab
-
-
-From d74aad8152a7c51999fffa9abe28e4306a052399 Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 13:15:17 +0800
-Subject: [PATCH 02/16] check netgroup.h header file
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index ae98453..543d6fd 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -26,7 +26,11 @@
- #include <errno.h>
- #include <pwd.h>
- #include <grp.h>
-+#ifdef HAVE_NETGROUP_H
-+#include <netgroup.h>
-+#else
- #include <netdb.h>
-+#endif
- #include <string.h>
- #include <glib/gstdio.h>
- #include <locale.h>
--- 
-GitLab
-
-
-From 69c761506cbe458807e4ae2742c9e05bc60dad3d Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 10:59:03 +0800
-Subject: [PATCH 03/16] check return value
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 543d6fd..a54ed5b 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -249,7 +249,11 @@ reload_scripts (PolkitBackendJsAuthority *authority)
-   duk_context *cx = authority->priv->cx;
- 
-   duk_set_top (cx, 0);
--  duk_get_global_string (cx, "polkit");
-+  if (!duk_get_global_string (cx, "polkit")) {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error deleting old rules, not loading new ones");
-+      return;
-+  }
-   duk_push_string (cx, "_deleteRules");
- 
-   duk_call_prop (cx, 0, 0);
--- 
-GitLab
-
-
-From f1536c4899934fd3c8243fda2d084a472fe57d2e Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 11:22:39 +0800
-Subject: [PATCH 04/16] check return value
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 12 ++++++++++--
- 1 file changed, 10 insertions(+), 2 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index a54ed5b..1a7e6d3 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -656,7 +656,10 @@ push_action_and_details (duk_context               *cx,
-   gchar **keys;
-   guint n;
- 
--  duk_get_global_string (cx, "Action");
-+  if (!duk_get_global_string (cx, "Action")) {
-+    return FALSE;
-+  }
-+
-   duk_new (cx, 0);
- 
-   set_property_str (cx, "id", action_id);
-@@ -699,7 +702,12 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
-   duk_context *cx = authority->priv->cx;
- 
-   duk_set_top (cx, 0);
--  duk_get_global_string (cx, "polkit");
-+  if (!duk_get_global_string (cx, "polkit")) {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                    "Error deleting old rules, not loading new ones");
-+      goto out;
-+  }
-+
-   duk_push_string (cx, "_runAdminRules");
- 
-   if (!push_action_and_details (cx, action_id, details, &error))
--- 
-GitLab
-
-
-From ca15eecf5dc7755947515c1bfc651fd8770aaf8f Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 13:17:16 +0800
-Subject: [PATCH 05/16] check return value
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 10 ++++++++--
- 1 file changed, 8 insertions(+), 2 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 1a7e6d3..3f1b32d 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -550,7 +550,10 @@ push_subject (duk_context               *cx,
-   char *seat_str = NULL;
-   char *session_str = NULL;
- 
--  duk_get_global_string (cx, "Subject");
-+  if (!duk_get_global_string (cx, "Subject")) {
-+    return FALSE;
-+  }
-+
-   duk_new (cx, 0);
- 
-   if (POLKIT_IS_UNIX_PROCESS (subject))
-@@ -789,8 +792,11 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu
-   gboolean good = FALSE;
-   duk_context *cx = authority->priv->cx;
- 
-+  if (!duk_get_global_string (cx, "polkit")) {
-+      goto out;
-+  }
-+
-   duk_set_top (cx, 0);
--  duk_get_global_string (cx, "polkit");
-   duk_push_string (cx, "_runRules");
- 
-   if (!push_action_and_details (cx, action_id, details, &error))
--- 
-GitLab
-
-
-From 870348365cc0166e14f28e0d144ed552bba4d794 Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 13:18:13 +0800
-Subject: [PATCH 06/16] check return value
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 3f1b32d..6294ad9 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -843,7 +843,8 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu
-  out:
-   if (!good)
-     ret = POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED;
--  g_free (ret_str);
-+  if (ret_str != NULL)
-+      g_free (ret_str);
- 
-   return ret;
- }
--- 
-GitLab
-
-
-From 81c916ff08fdcee3c7340c4b2d4632086b89666c Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 11:23:04 +0800
-Subject: [PATCH 07/16] fix typecase
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 6294ad9..d466c9d 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -1191,7 +1191,7 @@ static void
- utils_on_cancelled (GCancellable *cancellable,
-                     gpointer      user_data)
- {
--  UtilsSpawnData *data = user_data;
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-   GError *error;
- 
-   error = NULL;
-@@ -1206,7 +1206,7 @@ utils_read_child_stderr (GIOChannel *channel,
-                          GIOCondition condition,
-                          gpointer user_data)
- {
--  UtilsSpawnData *data = user_data;
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-   gchar buf[1024];
-   gsize bytes_read;
- 
-@@ -1220,7 +1220,7 @@ utils_read_child_stdout (GIOChannel *channel,
-                          GIOCondition condition,
-                          gpointer user_data)
- {
--  UtilsSpawnData *data = user_data;
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-   gchar buf[1024];
-   gsize bytes_read;
- 
-@@ -1234,7 +1234,7 @@ utils_child_watch_cb (GPid     pid,
-                       gint     status,
-                       gpointer user_data)
- {
--  UtilsSpawnData *data = user_data;
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-   gchar *buf;
-   gsize buf_size;
- 
-@@ -1263,7 +1263,7 @@ utils_child_watch_cb (GPid     pid,
- static gboolean
- utils_timeout_cb (gpointer user_data)
- {
--  UtilsSpawnData *data = user_data;
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
- 
-   data->timed_out = TRUE;
- 
--- 
-GitLab
-
-
-From acb956bf52f0a78bf7aaf925876f96e97a146995 Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 18:04:27 +0800
-Subject: [PATCH 08/16] typecase
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index d466c9d..237b1ad 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -915,8 +915,8 @@ spawn_cb (GObject       *source_object,
-           GAsyncResult  *res,
-           gpointer       user_data)
- {
--  SpawnData *data = user_data;
--  data->res = g_object_ref (res);
-+  SpawnData *data = (SpawnData *)user_data;
-+  data->res = (GAsyncResult*)g_object_ref (res);
-   g_main_loop_quit (data->loop);
- }
- 
-@@ -1292,12 +1292,12 @@ utils_spawn (const gchar *const  *argv,
-   data->simple = g_simple_async_result_new (NULL,
-                                             callback,
-                                             user_data,
--                                            utils_spawn);
-+                                            (gpointer*)utils_spawn);
-   data->main_context = g_main_context_get_thread_default ();
-   if (data->main_context != NULL)
-     g_main_context_ref (data->main_context);
- 
--  data->cancellable = cancellable != NULL ? g_object_ref (cancellable) : NULL;
-+  data->cancellable = cancellable != NULL ? (GCancellable*)g_object_ref (cancellable) : NULL;
- 
-   data->child_stdout = g_string_new (NULL);
-   data->child_stderr = g_string_new (NULL);
-@@ -1397,7 +1397,7 @@ utils_spawn_finish (GAsyncResult   *res,
-   if (g_simple_async_result_propagate_error (simple, error))
-     goto out;
- 
--  data = g_simple_async_result_get_op_res_gpointer (simple);
-+  data = (UtilsSpawnData*)g_simple_async_result_get_op_res_gpointer (simple);
- 
-   if (data->timed_out)
-     {
--- 
-GitLab
-
-
-From be060e4d48aceb09af34868b555b6c73c7afdabb Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 13:53:23 +0800
-Subject: [PATCH 09/16] some change
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- .../polkitbackendduktapeauthority.c           | 26 +++++++++++--------
- 1 file changed, 15 insertions(+), 11 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 237b1ad..fad9017 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -207,18 +207,22 @@ load_scripts (PolkitBackendJsAuthority  *authority)
- 
-   for (l = files; l != NULL; l = l->next)
-     {
--      const gchar *filename = l->data;
--
-+      const gchar *filename = (gchar *)l->data;
- #if (DUK_VERSION >= 20000)
--      gchar *contents;
--      gsize length;
--      GError *error = NULL;
--      if (!g_file_get_contents (filename, &contents, &length, &error)){
--        g_warning("Error when file contents of %s: %s\n", filename, error->message);
--        g_error_free (error);
--        continue;
--      }
--      if (duk_peval_lstring_noresult(cx, contents,length) != 0)
-+      GFile *file = g_file_new_for_path (filename);
-+      char *contents;
-+      gsize len;
-+      if (!g_file_load_contents (file, NULL, &contents, &len, NULL, NULL))
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Error compiling script %s",
-+                                        filename);
-+          g_object_unref (file);
-+          continue;
-+        }
-+
-+      g_object_unref (file);
-+      if (duk_peval_lstring_noresult(cx, contents,len) != 0)
- #else
-       if (duk_peval_file_noresult (cx, filename) != 0)
- #endif
--- 
-GitLab
-
-
-From 2ffb62048a5ebedfe3bb053feb7385c7270ede28 Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 15:25:45 +0800
-Subject: [PATCH 10/16] some change
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- .../polkitbackendduktapeauthority.c           | 24 +++++++++----------
- 1 file changed, 12 insertions(+), 12 deletions(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index fad9017..6fac3be 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -125,6 +125,18 @@ G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BAC
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
-+static duk_ret_t js_polkit_log (duk_context *cx);
-+static duk_ret_t js_polkit_spawn (duk_context *cx);
-+static duk_ret_t js_polkit_user_is_in_netgroup (duk_context *cx);
-+
-+static const duk_function_list_entry js_polkit_functions[] =
-+{
-+  { "log", js_polkit_log, 1 },
-+  { "spawn", js_polkit_spawn, 1 },
-+  { "_userIsInNetGroup", js_polkit_user_is_in_netgroup, 2 },
-+  { NULL, NULL, 0 },
-+};
-+
- static void
- polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
- {
-@@ -347,18 +359,6 @@ setup_file_monitors (PolkitBackendJsAuthority *authority)
-   authority->priv->dir_monitors = (GFileMonitor**) g_ptr_array_free (p, FALSE);
- }
- 
--static duk_ret_t js_polkit_log (duk_context *cx);
--static duk_ret_t js_polkit_spawn (duk_context *cx);
--static duk_ret_t js_polkit_user_is_in_netgroup (duk_context *cx);
--
--static const duk_function_list_entry js_polkit_functions[] =
--{
--  { "log", js_polkit_log, 1 },
--  { "spawn", js_polkit_spawn, 1 },
--  { "_userIsInNetGroup", js_polkit_user_is_in_netgroup, 2 },
--  { NULL, NULL, 0 },
--};
--
- static void
- polkit_backend_js_authority_constructed (GObject *object)
- {
--- 
-GitLab
-
-
-From edb70ef69eed3275f5654510d135e680eb46c85d Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 15:25:35 +0800
-Subject: [PATCH 11/16] remove WATCHDOG_TIMEOUT define
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 1 -
- 1 file changed, 1 deletion(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 6fac3be..51e03fd 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -69,7 +69,6 @@ struct _PolkitBackendJsAuthorityPrivate
-   duk_context *cx;
- };
- 
--#define WATCHDOG_TIMEOUT (15 * G_TIME_SPAN_SECOND)
- 
- static void utils_spawn (const gchar *const  *argv,
-                          guint                timeout_seconds,
--- 
-GitLab
-
-
-From 906ae404f29f15ef8c529b999bf091b5d18ed7ac Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 12:46:40 +0800
-Subject: [PATCH 12/16] add meson build system support
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- meson.build                   | 11 ++++++++++-
- meson_options.txt             |  1 +
- src/polkitbackend/meson.build | 10 ++++++++--
- 3 files changed, 19 insertions(+), 3 deletions(-)
-
-diff --git a/meson.build b/meson.build
-index 858078d..4e44723 100644
---- a/meson.build
-+++ b/meson.build
-@@ -133,7 +133,13 @@ expat_dep = dependency('expat')
- assert(cc.has_header('expat.h', dependencies: expat_dep), 'Can\'t find expat.h. Please install expat.')
- assert(cc.has_function('XML_ParserCreate', dependencies: expat_dep), 'Can\'t find expat library. Please install expat.')
- 
--mozjs_dep = dependency('mozjs-78')
-+js_engine = get_option('js_engine')
-+if js_engine == 'duktape'
-+  js_dep = dependency('duktape')
-+  libm_dep = cc.find_library('m')
-+elif js_engine == 'mozjs'
-+  js_dep = dependency('mozjs-78')
-+endif
- 
- dbus_dep = dependency('dbus-1', required: false)
- dbus_policydir = pk_prefix / pk_datadir / 'dbus-1/system.d'
-@@ -361,6 +367,9 @@ if enable_logind
-   output += '        systemdsystemunitdir:     ' + systemd_systemdsystemunitdir + '\n'
- endif
- output += '        polkitd user:             ' + polkitd_user + ' \n'
-+output += '        Javascript engine:        ' + js_engine + '\n'
-+if enable_logind
-+endif
- output += '        PAM support:              ' + enable_pam.to_string() + '\n\n'
- if enable_pam
-   output += '        PAM file auth:            ' + pam_conf['PAM_FILE_INCLUDE_AUTH'] + '\n'
-diff --git a/meson_options.txt b/meson_options.txt
-index 25e3e77..76aa311 100644
---- a/meson_options.txt
-+++ b/meson_options.txt
-@@ -16,3 +16,4 @@ option('introspection', type: 'boolean', value: true, description: 'Enable intro
- 
- option('gtk_doc', type: 'boolean', value: false, description: 'use gtk-doc to build documentation')
- option('man', type: 'boolean', value: false, description: 'build manual pages')
-+option('js_engine', type: 'combo', choices: ['mozjs', 'duktape'], value: 'duktape', description: 'javascript engine')
-diff --git a/src/polkitbackend/meson.build b/src/polkitbackend/meson.build
-index 64f0e4a..489897d 100644
---- a/src/polkitbackend/meson.build
-+++ b/src/polkitbackend/meson.build
-@@ -5,7 +5,6 @@ sources = files(
-   'polkitbackendactionpool.c',
-   'polkitbackendauthority.c',
-   'polkitbackendinteractiveauthority.c',
--  'polkitbackendjsauthority.cpp',
- )
- 
- output = 'initjs.h'
-@@ -21,7 +20,7 @@ sources += custom_target(
- deps = [
-   expat_dep,
-   libpolkit_gobject_dep,
--  mozjs_dep,
-+  js_dep,
- ]
- 
- c_flags = [
-@@ -31,6 +30,13 @@ c_flags = [
-   '-DPACKAGE_SYSCONF_DIR="@0@"'.format(pk_prefix / pk_sysconfdir),
- ]
- 
-+if js_engine == 'duktape'
-+  sources += files('polkitbackendduktapeauthority.c')
-+  deps += libm_dep
-+elif js_engine == 'mozjs'
-+  sources += files('polkitbackendjsauthority.cpp')
-+endif
-+
- if enable_logind
-   sources += files('polkitbackendsessionmonitor-systemd.c')
- 
--- 
-GitLab
-
-
-From 1380b505c25be4aebe54b1b4223a570d64af83cc Mon Sep 17 00:00:00 2001
-From: Wu Xiaotian <yetist@gmail.com>
-Date: Sun, 22 Nov 2020 18:49:14 +0800
-Subject: [PATCH 13/16] fix run error
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/polkitbackendduktapeauthority.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 51e03fd..4b4f8fd 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -795,11 +795,11 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu
-   gboolean good = FALSE;
-   duk_context *cx = authority->priv->cx;
- 
-+  duk_set_top (cx, 0);
-   if (!duk_get_global_string (cx, "polkit")) {
-       goto out;
-   }
- 
--  duk_set_top (cx, 0);
-   duk_push_string (cx, "_runRules");
- 
-   if (!push_action_and_details (cx, action_id, details, &error))
--- 
-GitLab
-
-
-From 6856a704b70378948ef5f66e9b09555d97d4070b Mon Sep 17 00:00:00 2001
-From: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
-Date: Fri, 10 Sep 2021 15:17:58 -0700
-Subject: [PATCH 14/16] Deduplicate code for "Add duktape as JS engine backend"
- effort/MR
-
-This leverages Wu Xiaotian (@yetist)'s original MR
-(https://gitlab.freedesktop.org/polkit/polkit/-/merge_requests/35), in
-an effort to complete said work.
-
-This is the first of the requests from maintainers--to reduce
-eliminate code duplication.
-
-The runaway-killer missing functionality will come in the sequence.
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- src/polkitbackend/Makefile.am                 |   1 +
- src/polkitbackend/meson.build                 |   1 +
- src/polkitbackend/polkitbackendcommon.c       | 530 +++++++++++++
- src/polkitbackend/polkitbackendcommon.h       | 156 ++++
- .../polkitbackendduktapeauthority.c           | 714 ++----------------
- .../polkitbackendjsauthority.cpp              | 711 ++---------------
- 6 files changed, 790 insertions(+), 1323 deletions(-)
- create mode 100644 src/polkitbackend/polkitbackendcommon.c
- create mode 100644 src/polkitbackend/polkitbackendcommon.h
-
-diff --git a/src/polkitbackend/Makefile.am b/src/polkitbackend/Makefile.am
-index abcbc6f..6a8b4ae 100644
---- a/src/polkitbackend/Makefile.am
-+++ b/src/polkitbackend/Makefile.am
-@@ -31,6 +31,7 @@ libpolkit_backend_1_la_SOURCES =                                   			\
-         polkitbackend.h									\
- 	polkitbackendtypes.h								\
- 	polkitbackendprivate.h								\
-+	polkitbackendcommon.h			polkitbackendcommon.c			\
- 	polkitbackendauthority.h		polkitbackendauthority.c		\
- 	polkitbackendinteractiveauthority.h	polkitbackendinteractiveauthority.c	\
- 	polkitbackendjsauthority.h				\
-diff --git a/src/polkitbackend/meson.build b/src/polkitbackend/meson.build
-index 489897d..9ec01b2 100644
---- a/src/polkitbackend/meson.build
-+++ b/src/polkitbackend/meson.build
-@@ -4,6 +4,7 @@ sources = files(
-   'polkitbackendactionlookup.c',
-   'polkitbackendactionpool.c',
-   'polkitbackendauthority.c',
-+  'polkitbackendcommon.c',
-   'polkitbackendinteractiveauthority.c',
- )
- 
-diff --git a/src/polkitbackend/polkitbackendcommon.c b/src/polkitbackend/polkitbackendcommon.c
-new file mode 100644
-index 0000000..6783dff
---- /dev/null
-+++ b/src/polkitbackend/polkitbackendcommon.c
-@@ -0,0 +1,530 @@
-+/*
-+ * Copyright (C) 2008 Red Hat, Inc.
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library 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
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General
-+ * Public License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ *
-+ * Author: David Zeuthen <davidz@redhat.com>
-+ */
-+
-+#include "polkitbackendcommon.h"
-+
-+static void
-+utils_child_watch_from_release_cb (GPid     pid,
-+                                   gint     status,
-+                                   gpointer user_data)
-+{
-+}
-+
-+static void
-+utils_spawn_data_free (UtilsSpawnData *data)
-+{
-+  if (data->timeout_source != NULL)
-+    {
-+      g_source_destroy (data->timeout_source);
-+      data->timeout_source = NULL;
-+    }
-+
-+  /* Nuke the child, if necessary */
-+  if (data->child_watch_source != NULL)
-+    {
-+      g_source_destroy (data->child_watch_source);
-+      data->child_watch_source = NULL;
-+    }
-+
-+  if (data->child_pid != 0)
-+    {
-+      GSource *source;
-+      kill (data->child_pid, SIGTERM);
-+      /* OK, we need to reap for the child ourselves - we don't want
-+       * to use waitpid() because that might block the calling
-+       * thread (the child might handle SIGTERM and use several
-+       * seconds for cleanup/rollback).
-+       *
-+       * So we use GChildWatch instead.
-+       *
-+       * Avoid taking a references to ourselves. but note that we need
-+       * to pass the GSource so we can nuke it once handled.
-+       */
-+      source = g_child_watch_source_new (data->child_pid);
-+      g_source_set_callback (source,
-+                             (GSourceFunc) utils_child_watch_from_release_cb,
-+                             source,
-+                             (GDestroyNotify) g_source_destroy);
-+      g_source_attach (source, data->main_context);
-+      g_source_unref (source);
-+      data->child_pid = 0;
-+    }
-+
-+  if (data->child_stdout != NULL)
-+    {
-+      g_string_free (data->child_stdout, TRUE);
-+      data->child_stdout = NULL;
-+    }
-+
-+  if (data->child_stderr != NULL)
-+    {
-+      g_string_free (data->child_stderr, TRUE);
-+      data->child_stderr = NULL;
-+    }
-+
-+  if (data->child_stdout_channel != NULL)
-+    {
-+      g_io_channel_unref (data->child_stdout_channel);
-+      data->child_stdout_channel = NULL;
-+    }
-+  if (data->child_stderr_channel != NULL)
-+    {
-+      g_io_channel_unref (data->child_stderr_channel);
-+      data->child_stderr_channel = NULL;
-+    }
-+
-+  if (data->child_stdout_source != NULL)
-+    {
-+      g_source_destroy (data->child_stdout_source);
-+      data->child_stdout_source = NULL;
-+    }
-+  if (data->child_stderr_source != NULL)
-+    {
-+      g_source_destroy (data->child_stderr_source);
-+      data->child_stderr_source = NULL;
-+    }
-+
-+  if (data->child_stdout_fd != -1)
-+    {
-+      g_warn_if_fail (close (data->child_stdout_fd) == 0);
-+      data->child_stdout_fd = -1;
-+    }
-+  if (data->child_stderr_fd != -1)
-+    {
-+      g_warn_if_fail (close (data->child_stderr_fd) == 0);
-+      data->child_stderr_fd = -1;
-+    }
-+
-+  if (data->cancellable_handler_id > 0)
-+    {
-+      g_cancellable_disconnect (data->cancellable, data->cancellable_handler_id);
-+      data->cancellable_handler_id = 0;
-+    }
-+
-+  if (data->main_context != NULL)
-+    g_main_context_unref (data->main_context);
-+
-+  if (data->cancellable != NULL)
-+    g_object_unref (data->cancellable);
-+
-+  g_slice_free (UtilsSpawnData, data);
-+}
-+
-+/* called in the thread where @cancellable was cancelled */
-+static void
-+utils_on_cancelled (GCancellable *cancellable,
-+                    gpointer      user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+  GError *error;
-+
-+  error = NULL;
-+  g_warn_if_fail (g_cancellable_set_error_if_cancelled (cancellable, &error));
-+  g_simple_async_result_take_error (data->simple, error);
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+}
-+
-+static gboolean
-+utils_timeout_cb (gpointer user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+
-+  data->timed_out = TRUE;
-+
-+  /* ok, timeout is history, make sure we don't free it in spawn_data_free() */
-+  data->timeout_source = NULL;
-+
-+  /* we're done */
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+
-+  return FALSE; /* remove source */
-+}
-+
-+static void
-+utils_child_watch_cb (GPid     pid,
-+                      gint     status,
-+                      gpointer user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+  gchar *buf;
-+  gsize buf_size;
-+
-+  if (g_io_channel_read_to_end (data->child_stdout_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
-+    {
-+      g_string_append_len (data->child_stdout, buf, buf_size);
-+      g_free (buf);
-+    }
-+  if (g_io_channel_read_to_end (data->child_stderr_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
-+    {
-+      g_string_append_len (data->child_stderr, buf, buf_size);
-+      g_free (buf);
-+    }
-+
-+  data->exit_status = status;
-+
-+  /* ok, child watch is history, make sure we don't free it in spawn_data_free() */
-+  data->child_pid = 0;
-+  data->child_watch_source = NULL;
-+
-+  /* we're done */
-+  g_simple_async_result_complete_in_idle (data->simple);
-+  g_object_unref (data->simple);
-+}
-+
-+static gboolean
-+utils_read_child_stderr (GIOChannel *channel,
-+                         GIOCondition condition,
-+                         gpointer user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+  gchar buf[1024];
-+  gsize bytes_read;
-+
-+  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
-+  g_string_append_len (data->child_stderr, buf, bytes_read);
-+  return TRUE;
-+}
-+
-+static gboolean
-+utils_read_child_stdout (GIOChannel *channel,
-+                         GIOCondition condition,
-+                         gpointer user_data)
-+{
-+  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
-+  gchar buf[1024];
-+  gsize bytes_read;
-+
-+  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
-+  g_string_append_len (data->child_stdout, buf, bytes_read);
-+  return TRUE;
-+}
-+
-+void
-+polkit_backend_common_spawn (const gchar *const  *argv,
-+                             guint                timeout_seconds,
-+                             GCancellable        *cancellable,
-+                             GAsyncReadyCallback  callback,
-+                             gpointer             user_data)
-+{
-+  UtilsSpawnData *data;
-+  GError *error;
-+
-+  data = g_slice_new0 (UtilsSpawnData);
-+  data->timeout_seconds = timeout_seconds;
-+  data->simple = g_simple_async_result_new (NULL,
-+                                            callback,
-+                                            user_data,
-+                                            (gpointer*)polkit_backend_common_spawn);
-+  data->main_context = g_main_context_get_thread_default ();
-+  if (data->main_context != NULL)
-+    g_main_context_ref (data->main_context);
-+
-+  data->cancellable = cancellable != NULL ? (GCancellable*)g_object_ref (cancellable) : NULL;
-+
-+  data->child_stdout = g_string_new (NULL);
-+  data->child_stderr = g_string_new (NULL);
-+  data->child_stdout_fd = -1;
-+  data->child_stderr_fd = -1;
-+
-+  /* the life-cycle of UtilsSpawnData is tied to its GSimpleAsyncResult */
-+  g_simple_async_result_set_op_res_gpointer (data->simple, data, (GDestroyNotify) utils_spawn_data_free);
-+
-+  error = NULL;
-+  if (data->cancellable != NULL)
-+    {
-+      /* could already be cancelled */
-+      error = NULL;
-+      if (g_cancellable_set_error_if_cancelled (data->cancellable, &error))
-+        {
-+          g_simple_async_result_take_error (data->simple, error);
-+          g_simple_async_result_complete_in_idle (data->simple);
-+          g_object_unref (data->simple);
-+          goto out;
-+        }
-+
-+      data->cancellable_handler_id = g_cancellable_connect (data->cancellable,
-+                                                            G_CALLBACK (utils_on_cancelled),
-+                                                            data,
-+                                                            NULL);
-+    }
-+
-+  error = NULL;
-+  if (!g_spawn_async_with_pipes (NULL, /* working directory */
-+                                 (gchar **) argv,
-+                                 NULL, /* envp */
-+                                 G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
-+                                 NULL, /* child_setup */
-+                                 NULL, /* child_setup's user_data */
-+                                 &(data->child_pid),
-+                                 NULL, /* gint *stdin_fd */
-+                                 &(data->child_stdout_fd),
-+                                 &(data->child_stderr_fd),
-+                                 &error))
-+    {
-+      g_prefix_error (&error, "Error spawning: ");
-+      g_simple_async_result_take_error (data->simple, error);
-+      g_simple_async_result_complete_in_idle (data->simple);
-+      g_object_unref (data->simple);
-+      goto out;
-+    }
-+
-+  if (timeout_seconds > 0)
-+    {
-+      data->timeout_source = g_timeout_source_new_seconds (timeout_seconds);
-+      g_source_set_priority (data->timeout_source, G_PRIORITY_DEFAULT);
-+      g_source_set_callback (data->timeout_source, utils_timeout_cb, data, NULL);
-+      g_source_attach (data->timeout_source, data->main_context);
-+      g_source_unref (data->timeout_source);
-+    }
-+
-+  data->child_watch_source = g_child_watch_source_new (data->child_pid);
-+  g_source_set_callback (data->child_watch_source, (GSourceFunc) utils_child_watch_cb, data, NULL);
-+  g_source_attach (data->child_watch_source, data->main_context);
-+  g_source_unref (data->child_watch_source);
-+
-+  data->child_stdout_channel = g_io_channel_unix_new (data->child_stdout_fd);
-+  g_io_channel_set_flags (data->child_stdout_channel, G_IO_FLAG_NONBLOCK, NULL);
-+  data->child_stdout_source = g_io_create_watch (data->child_stdout_channel, G_IO_IN);
-+  g_source_set_callback (data->child_stdout_source, (GSourceFunc) utils_read_child_stdout, data, NULL);
-+  g_source_attach (data->child_stdout_source, data->main_context);
-+  g_source_unref (data->child_stdout_source);
-+
-+  data->child_stderr_channel = g_io_channel_unix_new (data->child_stderr_fd);
-+  g_io_channel_set_flags (data->child_stderr_channel, G_IO_FLAG_NONBLOCK, NULL);
-+  data->child_stderr_source = g_io_create_watch (data->child_stderr_channel, G_IO_IN);
-+  g_source_set_callback (data->child_stderr_source, (GSourceFunc) utils_read_child_stderr, data, NULL);
-+  g_source_attach (data->child_stderr_source, data->main_context);
-+  g_source_unref (data->child_stderr_source);
-+
-+ out:
-+  ;
-+}
-+
-+void
-+polkit_backend_common_on_dir_monitor_changed (GFileMonitor     *monitor,
-+                                              GFile            *file,
-+                                              GFile            *other_file,
-+                                              GFileMonitorEvent event_type,
-+                                              gpointer          user_data)
-+{
-+  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (user_data);
-+
-+  /* TODO: maybe rate-limit so storms of events are collapsed into one with a 500ms resolution?
-+   *       Because when editing a file with emacs we get 4-8 events..
-+   */
-+
-+  if (file != NULL)
-+    {
-+      gchar *name;
-+
-+      name = g_file_get_basename (file);
-+
-+      /* g_print ("event_type=%d file=%p name=%s\n", event_type, file, name); */
-+      if (!g_str_has_prefix (name, ".") &&
-+          !g_str_has_prefix (name, "#") &&
-+          g_str_has_suffix (name, ".rules") &&
-+          (event_type == G_FILE_MONITOR_EVENT_CREATED ||
-+           event_type == G_FILE_MONITOR_EVENT_DELETED ||
-+           event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT))
-+        {
-+          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                        "Reloading rules");
-+          polkit_backend_common_reload_scripts (authority);
-+        }
-+      g_free (name);
-+    }
-+}
-+
-+gboolean
-+polkit_backend_common_spawn_finish (GAsyncResult   *res,
-+                                    gint           *out_exit_status,
-+                                    gchar         **out_standard_output,
-+                                    gchar         **out_standard_error,
-+                                    GError        **error)
-+{
-+  GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
-+  UtilsSpawnData *data;
-+  gboolean ret = FALSE;
-+
-+  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE);
-+  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
-+
-+  g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == polkit_backend_common_spawn);
-+
-+  if (g_simple_async_result_propagate_error (simple, error))
-+    goto out;
-+
-+  data = (UtilsSpawnData*)g_simple_async_result_get_op_res_gpointer (simple);
-+
-+  if (data->timed_out)
-+    {
-+      g_set_error (error,
-+                   G_IO_ERROR,
-+                   G_IO_ERROR_TIMED_OUT,
-+                   "Timed out after %d seconds",
-+                   data->timeout_seconds);
-+      goto out;
-+    }
-+
-+  if (out_exit_status != NULL)
-+    *out_exit_status = data->exit_status;
-+
-+  if (out_standard_output != NULL)
-+    *out_standard_output = g_strdup (data->child_stdout->str);
-+
-+  if (out_standard_error != NULL)
-+    *out_standard_error = g_strdup (data->child_stderr->str);
-+
-+  ret = TRUE;
-+
-+ out:
-+  return ret;
-+}
-+
-+static const gchar *
-+polkit_backend_js_authority_get_name (PolkitBackendAuthority *authority)
-+{
-+  return "js";
-+}
-+
-+static const gchar *
-+polkit_backend_js_authority_get_version (PolkitBackendAuthority *authority)
-+{
-+  return PACKAGE_VERSION;
-+}
-+
-+static PolkitAuthorityFeatures
-+polkit_backend_js_authority_get_features (PolkitBackendAuthority *authority)
-+{
-+  return POLKIT_AUTHORITY_FEATURES_TEMPORARY_AUTHORIZATION;
-+}
-+
-+void
-+polkit_backend_common_js_authority_class_init_common (PolkitBackendJsAuthorityClass *klass)
-+{
-+  GObjectClass *gobject_class;
-+  PolkitBackendAuthorityClass *authority_class;
-+  PolkitBackendInteractiveAuthorityClass *interactive_authority_class;
-+
-+  gobject_class = G_OBJECT_CLASS (klass);
-+  gobject_class->finalize                               = polkit_backend_common_js_authority_finalize;
-+  gobject_class->set_property                           = polkit_backend_common_js_authority_set_property;
-+  gobject_class->constructed                            = polkit_backend_common_js_authority_constructed;
-+
-+  authority_class = POLKIT_BACKEND_AUTHORITY_CLASS (klass);
-+  authority_class->get_name                             = polkit_backend_js_authority_get_name;
-+  authority_class->get_version                          = polkit_backend_js_authority_get_version;
-+  authority_class->get_features                         = polkit_backend_js_authority_get_features;
-+
-+  interactive_authority_class = POLKIT_BACKEND_INTERACTIVE_AUTHORITY_CLASS (klass);
-+  interactive_authority_class->get_admin_identities     = polkit_backend_common_js_authority_get_admin_auth_identities;
-+  interactive_authority_class->check_authorization_sync = polkit_backend_common_js_authority_check_authorization_sync;
-+
-+  g_object_class_install_property (gobject_class,
-+                                   PROP_RULES_DIRS,
-+                                   g_param_spec_boxed ("rules-dirs",
-+                                                       NULL,
-+                                                       NULL,
-+                                                       G_TYPE_STRV,
-+                                                       G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
-+}
-+
-+gint
-+polkit_backend_common_rules_file_name_cmp (const gchar *a,
-+                                           const gchar *b)
-+{
-+  gint ret;
-+  const gchar *a_base;
-+  const gchar *b_base;
-+
-+  a_base = strrchr (a, '/');
-+  b_base = strrchr (b, '/');
-+
-+  g_assert (a_base != NULL);
-+  g_assert (b_base != NULL);
-+  a_base += 1;
-+  b_base += 1;
-+
-+  ret = g_strcmp0 (a_base, b_base);
-+  if (ret == 0)
-+    {
-+      /* /etc wins over /usr */
-+      ret = g_strcmp0 (a, b);
-+      g_assert (ret != 0);
-+    }
-+
-+  return ret;
-+}
-+
-+const gchar *
-+polkit_backend_common_get_signal_name (gint signal_number)
-+{
-+  switch (signal_number)
-+    {
-+#define _HANDLE_SIG(sig) case sig: return #sig;
-+    _HANDLE_SIG (SIGHUP);
-+    _HANDLE_SIG (SIGINT);
-+    _HANDLE_SIG (SIGQUIT);
-+    _HANDLE_SIG (SIGILL);
-+    _HANDLE_SIG (SIGABRT);
-+    _HANDLE_SIG (SIGFPE);
-+    _HANDLE_SIG (SIGKILL);
-+    _HANDLE_SIG (SIGSEGV);
-+    _HANDLE_SIG (SIGPIPE);
-+    _HANDLE_SIG (SIGALRM);
-+    _HANDLE_SIG (SIGTERM);
-+    _HANDLE_SIG (SIGUSR1);
-+    _HANDLE_SIG (SIGUSR2);
-+    _HANDLE_SIG (SIGCHLD);
-+    _HANDLE_SIG (SIGCONT);
-+    _HANDLE_SIG (SIGSTOP);
-+    _HANDLE_SIG (SIGTSTP);
-+    _HANDLE_SIG (SIGTTIN);
-+    _HANDLE_SIG (SIGTTOU);
-+    _HANDLE_SIG (SIGBUS);
-+#ifdef SIGPOLL
-+    _HANDLE_SIG (SIGPOLL);
-+#endif
-+    _HANDLE_SIG (SIGPROF);
-+    _HANDLE_SIG (SIGSYS);
-+    _HANDLE_SIG (SIGTRAP);
-+    _HANDLE_SIG (SIGURG);
-+    _HANDLE_SIG (SIGVTALRM);
-+    _HANDLE_SIG (SIGXCPU);
-+    _HANDLE_SIG (SIGXFSZ);
-+#undef _HANDLE_SIG
-+    default:
-+      break;
-+    }
-+  return "UNKNOWN_SIGNAL";
-+}
-+
-+void
-+polkit_backend_common_spawn_cb (GObject       *source_object,
-+                                GAsyncResult  *res,
-+                                gpointer       user_data)
-+{
-+  SpawnData *data = (SpawnData *)user_data;
-+  data->res = (GAsyncResult*)g_object_ref (res);
-+  g_main_loop_quit (data->loop);
-+}
-diff --git a/src/polkitbackend/polkitbackendcommon.h b/src/polkitbackend/polkitbackendcommon.h
-new file mode 100644
-index 0000000..6d0d267
---- /dev/null
-+++ b/src/polkitbackend/polkitbackendcommon.h
-@@ -0,0 +1,156 @@
-+/*
-+ * Copyright (C) 2008 Red Hat, Inc.
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library 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
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General
-+ * Public License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ *
-+ * Author: David Zeuthen <davidz@redhat.com>
-+ */
-+
-+#if !defined (_POLKIT_BACKEND_COMPILATION) && !defined(_POLKIT_BACKEND_INSIDE_POLKIT_BACKEND_H)
-+#error "Only <polkitbackend/polkitbackend.h> can be included directly, this file may disappear or change contents."
-+#endif
-+
-+#ifndef __POLKIT_BACKEND_COMMON_H
-+#define __POLKIT_BACKEND_COMMON_H
-+
-+#include "config.h"
-+#include <sys/wait.h>
-+#include <errno.h>
-+#include <pwd.h>
-+#include <grp.h>
-+#ifdef HAVE_NETGROUP_H
-+#include <netgroup.h>
-+#else
-+#include <netdb.h>
-+#endif
-+#include <string.h>
-+#include <glib/gstdio.h>
-+#include <locale.h>
-+#include <glib/gi18n-lib.h> //here, all things glib via glib.h (including -> gspawn.h)
-+
-+#include <polkit/polkit.h>
-+#include "polkitbackendjsauthority.h"
-+
-+#include <polkit/polkitprivate.h>
-+
-+#ifdef HAVE_LIBSYSTEMD
-+#include <systemd/sd-login.h>
-+#endif /* HAVE_LIBSYSTEMD */
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+enum
-+{
-+  PROP_0,
-+  PROP_RULES_DIRS,
-+};
-+
-+typedef struct
-+{
-+  GSimpleAsyncResult *simple; /* borrowed reference */
-+  GMainContext *main_context; /* may be NULL */
-+
-+  GCancellable *cancellable;  /* may be NULL */
-+  gulong cancellable_handler_id;
-+
-+  GPid child_pid;
-+  gint child_stdout_fd;
-+  gint child_stderr_fd;
-+
-+  GIOChannel *child_stdout_channel;
-+  GIOChannel *child_stderr_channel;
-+
-+  GSource *child_watch_source;
-+  GSource *child_stdout_source;
-+  GSource *child_stderr_source;
-+
-+  guint timeout_seconds;
-+  gboolean timed_out;
-+  GSource *timeout_source;
-+
-+  GString *child_stdout;
-+  GString *child_stderr;
-+
-+  gint exit_status;
-+} UtilsSpawnData;
-+
-+typedef struct
-+{
-+  GMainLoop *loop;
-+  GAsyncResult *res;
-+} SpawnData;
-+
-+void polkit_backend_common_spawn (const gchar *const  *argv,
-+                                  guint                timeout_seconds,
-+                                  GCancellable        *cancellable,
-+                                  GAsyncReadyCallback  callback,
-+                                  gpointer             user_data);
-+void polkit_backend_common_spawn_cb (GObject       *source_object,
-+                                     GAsyncResult  *res,
-+                                     gpointer       user_data);
-+gboolean polkit_backend_common_spawn_finish (GAsyncResult   *res,
-+                                             gint           *out_exit_status,
-+                                             gchar         **out_standard_output,
-+                                             gchar         **out_standard_error,
-+                                             GError        **error);
-+
-+void polkit_backend_common_on_dir_monitor_changed (GFileMonitor     *monitor,
-+                                                   GFile            *file,
-+                                                   GFile            *other_file,
-+                                                   GFileMonitorEvent event_type,
-+                                                   gpointer          user_data);
-+
-+void polkit_backend_common_js_authority_class_init_common (PolkitBackendJsAuthorityClass *klass);
-+
-+gint polkit_backend_common_rules_file_name_cmp (const gchar *a,
-+                                                const gchar *b);
-+
-+const gchar *polkit_backend_common_get_signal_name (gint signal_number);
-+
-+/* To be provided by each JS backend, from here onwards  ---------------------------------------------- */
-+
-+void polkit_backend_common_reload_scripts (PolkitBackendJsAuthority *authority);
-+void polkit_backend_common_js_authority_finalize (GObject *object);
-+void polkit_backend_common_js_authority_constructed (GObject *object);
-+GList *polkit_backend_common_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
-+                                                                     PolkitSubject                     *caller,
-+                                                                     PolkitSubject                     *subject,
-+                                                                     PolkitIdentity                    *user_for_subject,
-+                                                                     gboolean                           subject_is_local,
-+                                                                     gboolean                           subject_is_active,
-+                                                                     const gchar                       *action_id,
-+                                                                     PolkitDetails                     *details);
-+void polkit_backend_common_js_authority_set_property (GObject      *object,
-+                                                      guint         property_id,
-+                                                      const GValue *value,
-+                                                      GParamSpec   *pspec);
-+PolkitImplicitAuthorization polkit_backend_common_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
-+                                                                                         PolkitSubject                     *caller,
-+                                                                                         PolkitSubject                     *subject,
-+                                                                                         PolkitIdentity                    *user_for_subject,
-+                                                                                         gboolean                           subject_is_local,
-+                                                                                         gboolean                           subject_is_active,
-+                                                                                         const gchar                       *action_id,
-+                                                                                         PolkitDetails                     *details,
-+                                                                                         PolkitImplicitAuthorization        implicit);
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* __POLKIT_BACKEND_COMMON_H */
-+
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index 4b4f8fd..a2b4420 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -21,32 +21,12 @@
-  * Author: David Zeuthen <davidz@redhat.com>
-  */
- 
--#include "config.h"
--#include <sys/wait.h>
--#include <errno.h>
--#include <pwd.h>
--#include <grp.h>
--#ifdef HAVE_NETGROUP_H
--#include <netgroup.h>
--#else
--#include <netdb.h>
--#endif
--#include <string.h>
--#include <glib/gstdio.h>
--#include <locale.h>
--#include <glib/gi18n-lib.h>
--
--#include <polkit/polkit.h>
--#include "polkitbackendjsauthority.h"
--
--#include <polkit/polkitprivate.h>
-+#include "polkitbackendcommon.h"
- 
--#ifdef HAVE_LIBSYSTEMD
--#include <systemd/sd-login.h>
--#endif /* HAVE_LIBSYSTEMD */
-+#include "duktape.h"
- 
-+/* Built source and not too big to worry about deduplication */
- #include "initjs.h" /* init.js */
--#include "duktape.h"
- 
- /**
-  * SECTION:polkitbackendjsauthority
-@@ -54,10 +34,9 @@
-  * @short_description: JS Authority
-  * @stability: Unstable
-  *
-- * An implementation of #PolkitBackendAuthority that reads and
-- * evalates Javascript files and supports interaction with
-- * authentication agents (virtue of being based on
-- * #PolkitBackendInteractiveAuthority).
-+ * An (Duktape-based) implementation of #PolkitBackendAuthority that reads and
-+ * evaluates Javascript files and supports interaction with authentication
-+ * agents (virtue of being based on #PolkitBackendInteractiveAuthority).
-  */
- 
- /* ---------------------------------------------------------------------------------------------------- */
-@@ -66,64 +45,16 @@ struct _PolkitBackendJsAuthorityPrivate
- {
-   gchar **rules_dirs;
-   GFileMonitor **dir_monitors; /* NULL-terminated array of GFileMonitor instances */
--  duk_context *cx;
--};
--
--
--static void utils_spawn (const gchar *const  *argv,
--                         guint                timeout_seconds,
--                         GCancellable        *cancellable,
--                         GAsyncReadyCallback  callback,
--                         gpointer             user_data);
--
--gboolean utils_spawn_finish (GAsyncResult   *res,
--                             gint           *out_exit_status,
--                             gchar         **out_standard_output,
--                             gchar         **out_standard_error,
--                             GError        **error);
- 
--static void on_dir_monitor_changed (GFileMonitor     *monitor,
--                                    GFile            *file,
--                                    GFile            *other_file,
--                                    GFileMonitorEvent event_type,
--                                    gpointer          user_data);
--
--/* ---------------------------------------------------------------------------------------------------- */
--
--enum
--{
--  PROP_0,
--  PROP_RULES_DIRS,
-+  duk_context *cx;
- };
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static GList *polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *authority,
--                                                                     PolkitSubject                     *caller,
--                                                                     PolkitSubject                     *subject,
--                                                                     PolkitIdentity                    *user_for_subject,
--                                                                     gboolean                           subject_is_local,
--                                                                     gboolean                           subject_is_active,
--                                                                     const gchar                       *action_id,
--                                                                     PolkitDetails                     *details);
--
--static PolkitImplicitAuthorization polkit_backend_js_authority_check_authorization_sync (
--                                                          PolkitBackendInteractiveAuthority *authority,
--                                                          PolkitSubject                     *caller,
--                                                          PolkitSubject                     *subject,
--                                                          PolkitIdentity                    *user_for_subject,
--                                                          gboolean                           subject_is_local,
--                                                          gboolean                           subject_is_active,
--                                                          const gchar                       *action_id,
--                                                          PolkitDetails                     *details,
--                                                          PolkitImplicitAuthorization        implicit);
--
- G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BACKEND_TYPE_INTERACTIVE_AUTHORITY);
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--/* ---------------------------------------------------------------------------------------------------- */
--
- static duk_ret_t js_polkit_log (duk_context *cx);
- static duk_ret_t js_polkit_spawn (duk_context *cx);
- static duk_ret_t js_polkit_user_is_in_netgroup (duk_context *cx);
-@@ -144,33 +75,6 @@ polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
-                                                  PolkitBackendJsAuthorityPrivate);
- }
- 
--static gint
--rules_file_name_cmp (const gchar *a,
--                     const gchar *b)
--{
--  gint ret;
--  const gchar *a_base;
--  const gchar *b_base;
--
--  a_base = strrchr (a, '/');
--  b_base = strrchr (b, '/');
--
--  g_assert (a_base != NULL);
--  g_assert (b_base != NULL);
--  a_base += 1;
--  b_base += 1;
--
--  ret = g_strcmp0 (a_base, b_base);
--  if (ret == 0)
--    {
--      /* /etc wins over /usr */
--      ret = g_strcmp0 (a, b);
--      g_assert (ret != 0);
--    }
--
--  return ret;
--}
--
- static void
- load_scripts (PolkitBackendJsAuthority  *authority)
- {
-@@ -214,7 +118,7 @@ load_scripts (PolkitBackendJsAuthority  *authority)
-         }
-     }
- 
--  files = g_list_sort (files, (GCompareFunc) rules_file_name_cmp);
-+  files = g_list_sort (files, (GCompareFunc) polkit_backend_common_rules_file_name_cmp);
- 
-   for (l = files; l != NULL; l = l->next)
-     {
-@@ -258,8 +162,8 @@ load_scripts (PolkitBackendJsAuthority  *authority)
-   g_list_free_full (files, g_free);
- }
- 
--static void
--reload_scripts (PolkitBackendJsAuthority *authority)
-+void
-+polkit_backend_common_reload_scripts (PolkitBackendJsAuthority *authority)
- {
-   duk_context *cx = authority->priv->cx;
- 
-@@ -282,42 +186,6 @@ reload_scripts (PolkitBackendJsAuthority *authority)
-   g_signal_emit_by_name (authority, "changed");
- }
- 
--static void
--on_dir_monitor_changed (GFileMonitor     *monitor,
--                        GFile            *file,
--                        GFile            *other_file,
--                        GFileMonitorEvent event_type,
--                        gpointer          user_data)
--{
--  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (user_data);
--
--  /* TODO: maybe rate-limit so storms of events are collapsed into one with a 500ms resolution?
--   *       Because when editing a file with emacs we get 4-8 events..
--   */
--
--  if (file != NULL)
--    {
--      gchar *name;
--
--      name = g_file_get_basename (file);
--
--      /* g_print ("event_type=%d file=%p name=%s\n", event_type, file, name); */
--      if (!g_str_has_prefix (name, ".") &&
--          !g_str_has_prefix (name, "#") &&
--          g_str_has_suffix (name, ".rules") &&
--          (event_type == G_FILE_MONITOR_EVENT_CREATED ||
--           event_type == G_FILE_MONITOR_EVENT_DELETED ||
--           event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT))
--        {
--          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                        "Reloading rules");
--          reload_scripts (authority);
--        }
--      g_free (name);
--    }
--}
--
--
- static void
- setup_file_monitors (PolkitBackendJsAuthority *authority)
- {
-@@ -349,7 +217,7 @@ setup_file_monitors (PolkitBackendJsAuthority *authority)
-         {
-           g_signal_connect (monitor,
-                             "changed",
--                            G_CALLBACK (on_dir_monitor_changed),
-+                            G_CALLBACK (polkit_backend_common_on_dir_monitor_changed),
-                             authority);
-           g_ptr_array_add (p, monitor);
-         }
-@@ -358,8 +226,8 @@ setup_file_monitors (PolkitBackendJsAuthority *authority)
-   authority->priv->dir_monitors = (GFileMonitor**) g_ptr_array_free (p, FALSE);
- }
- 
--static void
--polkit_backend_js_authority_constructed (GObject *object)
-+void
-+polkit_backend_common_js_authority_constructed (GObject *object)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-   duk_context *cx;
-@@ -395,8 +263,8 @@ polkit_backend_js_authority_constructed (GObject *object)
-   g_assert_not_reached ();
- }
- 
--static void
--polkit_backend_js_authority_finalize (GObject *object)
-+void
-+polkit_backend_common_js_authority_finalize (GObject *object)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-   guint n;
-@@ -405,7 +273,7 @@ polkit_backend_js_authority_finalize (GObject *object)
-     {
-       GFileMonitor *monitor = authority->priv->dir_monitors[n];
-       g_signal_handlers_disconnect_by_func (monitor,
--                                            G_CALLBACK (on_dir_monitor_changed),
-+                                            G_CALLBACK (polkit_backend_common_on_dir_monitor_changed),
-                                             authority);
-       g_object_unref (monitor);
-     }
-@@ -417,11 +285,11 @@ polkit_backend_js_authority_finalize (GObject *object)
-   G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->finalize (object);
- }
- 
--static void
--polkit_backend_js_authority_set_property (GObject      *object,
--                                          guint         property_id,
--                                          const GValue *value,
--                                          GParamSpec   *pspec)
-+void
-+polkit_backend_common_js_authority_set_property (GObject      *object,
-+                                                 guint         property_id,
-+                                                 const GValue *value,
-+                                                 GParamSpec   *pspec)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
- 
-@@ -438,55 +306,10 @@ polkit_backend_js_authority_set_property (GObject      *object,
-     }
- }
- 
--static const gchar *
--polkit_backend_js_authority_get_name (PolkitBackendAuthority *authority)
--{
--  return "js";
--}
--
--static const gchar *
--polkit_backend_js_authority_get_version (PolkitBackendAuthority *authority)
--{
--  return PACKAGE_VERSION;
--}
--
--static PolkitAuthorityFeatures
--polkit_backend_js_authority_get_features (PolkitBackendAuthority *authority)
--{
--  return POLKIT_AUTHORITY_FEATURES_TEMPORARY_AUTHORIZATION;
--}
--
- static void
- polkit_backend_js_authority_class_init (PolkitBackendJsAuthorityClass *klass)
- {
--  GObjectClass *gobject_class;
--  PolkitBackendAuthorityClass *authority_class;
--  PolkitBackendInteractiveAuthorityClass *interactive_authority_class;
--
--
--  gobject_class = G_OBJECT_CLASS (klass);
--  gobject_class->finalize                               = polkit_backend_js_authority_finalize;
--  gobject_class->set_property                           = polkit_backend_js_authority_set_property;
--  gobject_class->constructed                            = polkit_backend_js_authority_constructed;
--
--  authority_class = POLKIT_BACKEND_AUTHORITY_CLASS (klass);
--  authority_class->get_name                             = polkit_backend_js_authority_get_name;
--  authority_class->get_version                          = polkit_backend_js_authority_get_version;
--  authority_class->get_features                         = polkit_backend_js_authority_get_features;
--
--  interactive_authority_class = POLKIT_BACKEND_INTERACTIVE_AUTHORITY_CLASS (klass);
--  interactive_authority_class->get_admin_identities     = polkit_backend_js_authority_get_admin_auth_identities;
--  interactive_authority_class->check_authorization_sync = polkit_backend_js_authority_check_authorization_sync;
--
--  g_object_class_install_property (gobject_class,
--                                   PROP_RULES_DIRS,
--                                   g_param_spec_boxed ("rules-dirs",
--                                                       NULL,
--                                                       NULL,
--                                                       G_TYPE_STRV,
--                                                       G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE));
--
--
-+  polkit_backend_common_js_authority_class_init_common (klass);
-   g_type_class_add_private (klass, sizeof (PolkitBackendJsAuthorityPrivate));
- }
- 
-@@ -689,15 +512,15 @@ push_action_and_details (duk_context               *cx,
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static GList *
--polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
--                                                       PolkitSubject                     *caller,
--                                                       PolkitSubject                     *subject,
--                                                       PolkitIdentity                    *user_for_subject,
--                                                       gboolean                           subject_is_local,
--                                                       gboolean                           subject_is_active,
--                                                       const gchar                       *action_id,
--                                                       PolkitDetails                     *details)
-+GList *
-+polkit_backend_common_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
-+                                                              PolkitSubject                     *caller,
-+                                                              PolkitSubject                     *subject,
-+                                                              PolkitIdentity                    *user_for_subject,
-+                                                              gboolean                           subject_is_local,
-+                                                              gboolean                           subject_is_active,
-+                                                              const gchar                       *action_id,
-+                                                              PolkitDetails                     *details)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-   GList *ret = NULL;
-@@ -777,16 +600,16 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static PolkitImplicitAuthorization
--polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
--                                                      PolkitSubject                     *caller,
--                                                      PolkitSubject                     *subject,
--                                                      PolkitIdentity                    *user_for_subject,
--                                                      gboolean                           subject_is_local,
--                                                      gboolean                           subject_is_active,
--                                                      const gchar                       *action_id,
--                                                      PolkitDetails                     *details,
--                                                      PolkitImplicitAuthorization        implicit)
-+PolkitImplicitAuthorization
-+polkit_backend_common_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
-+                                                             PolkitSubject                     *caller,
-+                                                             PolkitSubject                     *subject,
-+                                                             PolkitIdentity                    *user_for_subject,
-+                                                             gboolean                           subject_is_local,
-+                                                             gboolean                           subject_is_active,
-+                                                             const gchar                       *action_id,
-+                                                             PolkitDetails                     *details,
-+                                                             PolkitImplicitAuthorization        implicit)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-   PolkitImplicitAuthorization ret = implicit;
-@@ -864,65 +687,6 @@ js_polkit_log (duk_context *cx)
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static const gchar *
--get_signal_name (gint signal_number)
--{
--  switch (signal_number)
--    {
--#define _HANDLE_SIG(sig) case sig: return #sig;
--    _HANDLE_SIG (SIGHUP);
--    _HANDLE_SIG (SIGINT);
--    _HANDLE_SIG (SIGQUIT);
--    _HANDLE_SIG (SIGILL);
--    _HANDLE_SIG (SIGABRT);
--    _HANDLE_SIG (SIGFPE);
--    _HANDLE_SIG (SIGKILL);
--    _HANDLE_SIG (SIGSEGV);
--    _HANDLE_SIG (SIGPIPE);
--    _HANDLE_SIG (SIGALRM);
--    _HANDLE_SIG (SIGTERM);
--    _HANDLE_SIG (SIGUSR1);
--    _HANDLE_SIG (SIGUSR2);
--    _HANDLE_SIG (SIGCHLD);
--    _HANDLE_SIG (SIGCONT);
--    _HANDLE_SIG (SIGSTOP);
--    _HANDLE_SIG (SIGTSTP);
--    _HANDLE_SIG (SIGTTIN);
--    _HANDLE_SIG (SIGTTOU);
--    _HANDLE_SIG (SIGBUS);
--#ifdef SIGPOLL
--    _HANDLE_SIG (SIGPOLL);
--#endif
--    _HANDLE_SIG (SIGPROF);
--    _HANDLE_SIG (SIGSYS);
--    _HANDLE_SIG (SIGTRAP);
--    _HANDLE_SIG (SIGURG);
--    _HANDLE_SIG (SIGVTALRM);
--    _HANDLE_SIG (SIGXCPU);
--    _HANDLE_SIG (SIGXFSZ);
--#undef _HANDLE_SIG
--    default:
--      break;
--    }
--  return "UNKNOWN_SIGNAL";
--}
--
--typedef struct
--{
--  GMainLoop *loop;
--  GAsyncResult *res;
--} SpawnData;
--
--static void
--spawn_cb (GObject       *source_object,
--          GAsyncResult  *res,
--          gpointer       user_data)
--{
--  SpawnData *data = (SpawnData *)user_data;
--  data->res = (GAsyncResult*)g_object_ref (res);
--  g_main_loop_quit (data->loop);
--}
--
- static duk_ret_t
- js_polkit_spawn (duk_context *cx)
- {
-@@ -962,21 +726,21 @@ js_polkit_spawn (duk_context *cx)
-   g_main_context_push_thread_default (context);
- 
-   data.loop = loop;
--  utils_spawn ((const gchar *const *) argv,
--               10, /* timeout_seconds */
--               NULL, /* cancellable */
--               spawn_cb,
--               &data);
-+  polkit_backend_common_spawn ((const gchar *const *) argv,
-+                               10, /* timeout_seconds */
-+                               NULL, /* cancellable */
-+                               polkit_backend_common_spawn_cb,
-+                               &data);
- 
-   g_main_loop_run (loop);
- 
-   g_main_context_pop_thread_default (context);
- 
--  if (!utils_spawn_finish (data.res,
--                           &exit_status,
--                           &standard_output,
--                           &standard_error,
--                           &error))
-+  if (!polkit_backend_common_spawn_finish (data.res,
-+                                           &exit_status,
-+                                           &standard_output,
-+                                           &standard_error,
-+                                           &error))
-     {
-       err_str = g_strdup_printf ("Error spawning helper: %s (%s, %d)",
-                                  error->message, g_quark_to_string (error->domain), error->code);
-@@ -998,7 +762,7 @@ js_polkit_spawn (duk_context *cx)
-         {
-           g_string_append_printf (gstr,
-                                   "Helper was signaled with signal %s (%d)",
--                                  get_signal_name (WTERMSIG (exit_status)),
-+                                  polkit_backend_common_get_signal_name (WTERMSIG (exit_status)),
-                                   WTERMSIG (exit_status));
-         }
-       g_string_append_printf (gstr, ", stdout=`%s', stderr=`%s'",
-@@ -1052,377 +816,3 @@ js_polkit_user_is_in_netgroup (duk_context *cx)
- }
- 
- /* ---------------------------------------------------------------------------------------------------- */
--
--typedef struct
--{
--  GSimpleAsyncResult *simple; /* borrowed reference */
--  GMainContext *main_context; /* may be NULL */
--
--  GCancellable *cancellable;  /* may be NULL */
--  gulong cancellable_handler_id;
--
--  GPid child_pid;
--  gint child_stdout_fd;
--  gint child_stderr_fd;
--
--  GIOChannel *child_stdout_channel;
--  GIOChannel *child_stderr_channel;
--
--  GSource *child_watch_source;
--  GSource *child_stdout_source;
--  GSource *child_stderr_source;
--
--  guint timeout_seconds;
--  gboolean timed_out;
--  GSource *timeout_source;
--
--  GString *child_stdout;
--  GString *child_stderr;
--
--  gint exit_status;
--} UtilsSpawnData;
--
--static void
--utils_child_watch_from_release_cb (GPid     pid,
--                                   gint     status,
--                                   gpointer user_data)
--{
--}
--
--static void
--utils_spawn_data_free (UtilsSpawnData *data)
--{
--  if (data->timeout_source != NULL)
--    {
--      g_source_destroy (data->timeout_source);
--      data->timeout_source = NULL;
--    }
--
--  /* Nuke the child, if necessary */
--  if (data->child_watch_source != NULL)
--    {
--      g_source_destroy (data->child_watch_source);
--      data->child_watch_source = NULL;
--    }
--
--  if (data->child_pid != 0)
--    {
--      GSource *source;
--      kill (data->child_pid, SIGTERM);
--      /* OK, we need to reap for the child ourselves - we don't want
--       * to use waitpid() because that might block the calling
--       * thread (the child might handle SIGTERM and use several
--       * seconds for cleanup/rollback).
--       *
--       * So we use GChildWatch instead.
--       *
--       * Avoid taking a references to ourselves. but note that we need
--       * to pass the GSource so we can nuke it once handled.
--       */
--      source = g_child_watch_source_new (data->child_pid);
--      g_source_set_callback (source,
--                             (GSourceFunc) utils_child_watch_from_release_cb,
--                             source,
--                             (GDestroyNotify) g_source_destroy);
--      g_source_attach (source, data->main_context);
--      g_source_unref (source);
--      data->child_pid = 0;
--    }
--
--  if (data->child_stdout != NULL)
--    {
--      g_string_free (data->child_stdout, TRUE);
--      data->child_stdout = NULL;
--    }
--
--  if (data->child_stderr != NULL)
--    {
--      g_string_free (data->child_stderr, TRUE);
--      data->child_stderr = NULL;
--    }
--
--  if (data->child_stdout_channel != NULL)
--    {
--      g_io_channel_unref (data->child_stdout_channel);
--      data->child_stdout_channel = NULL;
--    }
--  if (data->child_stderr_channel != NULL)
--    {
--      g_io_channel_unref (data->child_stderr_channel);
--      data->child_stderr_channel = NULL;
--    }
--
--  if (data->child_stdout_source != NULL)
--    {
--      g_source_destroy (data->child_stdout_source);
--      data->child_stdout_source = NULL;
--    }
--  if (data->child_stderr_source != NULL)
--    {
--      g_source_destroy (data->child_stderr_source);
--      data->child_stderr_source = NULL;
--    }
--
--  if (data->child_stdout_fd != -1)
--    {
--      g_warn_if_fail (close (data->child_stdout_fd) == 0);
--      data->child_stdout_fd = -1;
--    }
--  if (data->child_stderr_fd != -1)
--    {
--      g_warn_if_fail (close (data->child_stderr_fd) == 0);
--      data->child_stderr_fd = -1;
--    }
--
--  if (data->cancellable_handler_id > 0)
--    {
--      g_cancellable_disconnect (data->cancellable, data->cancellable_handler_id);
--      data->cancellable_handler_id = 0;
--    }
--
--  if (data->main_context != NULL)
--    g_main_context_unref (data->main_context);
--
--  if (data->cancellable != NULL)
--    g_object_unref (data->cancellable);
--
--  g_slice_free (UtilsSpawnData, data);
--}
--
--/* called in the thread where @cancellable was cancelled */
--static void
--utils_on_cancelled (GCancellable *cancellable,
--                    gpointer      user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  GError *error;
--
--  error = NULL;
--  g_warn_if_fail (g_cancellable_set_error_if_cancelled (cancellable, &error));
--  g_simple_async_result_take_error (data->simple, error);
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--}
--
--static gboolean
--utils_read_child_stderr (GIOChannel *channel,
--                         GIOCondition condition,
--                         gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar buf[1024];
--  gsize bytes_read;
--
--  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
--  g_string_append_len (data->child_stderr, buf, bytes_read);
--  return TRUE;
--}
--
--static gboolean
--utils_read_child_stdout (GIOChannel *channel,
--                         GIOCondition condition,
--                         gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar buf[1024];
--  gsize bytes_read;
--
--  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
--  g_string_append_len (data->child_stdout, buf, bytes_read);
--  return TRUE;
--}
--
--static void
--utils_child_watch_cb (GPid     pid,
--                      gint     status,
--                      gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar *buf;
--  gsize buf_size;
--
--  if (g_io_channel_read_to_end (data->child_stdout_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
--    {
--      g_string_append_len (data->child_stdout, buf, buf_size);
--      g_free (buf);
--    }
--  if (g_io_channel_read_to_end (data->child_stderr_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
--    {
--      g_string_append_len (data->child_stderr, buf, buf_size);
--      g_free (buf);
--    }
--
--  data->exit_status = status;
--
--  /* ok, child watch is history, make sure we don't free it in spawn_data_free() */
--  data->child_pid = 0;
--  data->child_watch_source = NULL;
--
--  /* we're done */
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--}
--
--static gboolean
--utils_timeout_cb (gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--
--  data->timed_out = TRUE;
--
--  /* ok, timeout is history, make sure we don't free it in spawn_data_free() */
--  data->timeout_source = NULL;
--
--  /* we're done */
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--
--  return FALSE; /* remove source */
--}
--
--static void
--utils_spawn (const gchar *const  *argv,
--             guint                timeout_seconds,
--             GCancellable        *cancellable,
--             GAsyncReadyCallback  callback,
--             gpointer             user_data)
--{
--  UtilsSpawnData *data;
--  GError *error;
--
--  data = g_slice_new0 (UtilsSpawnData);
--  data->timeout_seconds = timeout_seconds;
--  data->simple = g_simple_async_result_new (NULL,
--                                            callback,
--                                            user_data,
--                                            (gpointer*)utils_spawn);
--  data->main_context = g_main_context_get_thread_default ();
--  if (data->main_context != NULL)
--    g_main_context_ref (data->main_context);
--
--  data->cancellable = cancellable != NULL ? (GCancellable*)g_object_ref (cancellable) : NULL;
--
--  data->child_stdout = g_string_new (NULL);
--  data->child_stderr = g_string_new (NULL);
--  data->child_stdout_fd = -1;
--  data->child_stderr_fd = -1;
--
--  /* the life-cycle of UtilsSpawnData is tied to its GSimpleAsyncResult */
--  g_simple_async_result_set_op_res_gpointer (data->simple, data, (GDestroyNotify) utils_spawn_data_free);
--
--  error = NULL;
--  if (data->cancellable != NULL)
--    {
--      /* could already be cancelled */
--      error = NULL;
--      if (g_cancellable_set_error_if_cancelled (data->cancellable, &error))
--        {
--          g_simple_async_result_take_error (data->simple, error);
--          g_simple_async_result_complete_in_idle (data->simple);
--          g_object_unref (data->simple);
--          goto out;
--        }
--
--      data->cancellable_handler_id = g_cancellable_connect (data->cancellable,
--                                                            G_CALLBACK (utils_on_cancelled),
--                                                            data,
--                                                            NULL);
--    }
--
--  error = NULL;
--  if (!g_spawn_async_with_pipes (NULL, /* working directory */
--                                 (gchar **) argv,
--                                 NULL, /* envp */
--                                 G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
--                                 NULL, /* child_setup */
--                                 NULL, /* child_setup's user_data */
--                                 &(data->child_pid),
--                                 NULL, /* gint *stdin_fd */
--                                 &(data->child_stdout_fd),
--                                 &(data->child_stderr_fd),
--                                 &error))
--    {
--      g_prefix_error (&error, "Error spawning: ");
--      g_simple_async_result_take_error (data->simple, error);
--      g_simple_async_result_complete_in_idle (data->simple);
--      g_object_unref (data->simple);
--      goto out;
--    }
--
--  if (timeout_seconds > 0)
--    {
--      data->timeout_source = g_timeout_source_new_seconds (timeout_seconds);
--      g_source_set_priority (data->timeout_source, G_PRIORITY_DEFAULT);
--      g_source_set_callback (data->timeout_source, utils_timeout_cb, data, NULL);
--      g_source_attach (data->timeout_source, data->main_context);
--      g_source_unref (data->timeout_source);
--    }
--
--  data->child_watch_source = g_child_watch_source_new (data->child_pid);
--  g_source_set_callback (data->child_watch_source, (GSourceFunc) utils_child_watch_cb, data, NULL);
--  g_source_attach (data->child_watch_source, data->main_context);
--  g_source_unref (data->child_watch_source);
--
--  data->child_stdout_channel = g_io_channel_unix_new (data->child_stdout_fd);
--  g_io_channel_set_flags (data->child_stdout_channel, G_IO_FLAG_NONBLOCK, NULL);
--  data->child_stdout_source = g_io_create_watch (data->child_stdout_channel, G_IO_IN);
--  g_source_set_callback (data->child_stdout_source, (GSourceFunc) utils_read_child_stdout, data, NULL);
--  g_source_attach (data->child_stdout_source, data->main_context);
--  g_source_unref (data->child_stdout_source);
--
--  data->child_stderr_channel = g_io_channel_unix_new (data->child_stderr_fd);
--  g_io_channel_set_flags (data->child_stderr_channel, G_IO_FLAG_NONBLOCK, NULL);
--  data->child_stderr_source = g_io_create_watch (data->child_stderr_channel, G_IO_IN);
--  g_source_set_callback (data->child_stderr_source, (GSourceFunc) utils_read_child_stderr, data, NULL);
--  g_source_attach (data->child_stderr_source, data->main_context);
--  g_source_unref (data->child_stderr_source);
--
-- out:
--  ;
--}
--
--gboolean
--utils_spawn_finish (GAsyncResult   *res,
--                    gint           *out_exit_status,
--                    gchar         **out_standard_output,
--                    gchar         **out_standard_error,
--                    GError        **error)
--{
--  GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
--  UtilsSpawnData *data;
--  gboolean ret = FALSE;
--
--  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE);
--  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
--
--  g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == utils_spawn);
--
--  if (g_simple_async_result_propagate_error (simple, error))
--    goto out;
--
--  data = (UtilsSpawnData*)g_simple_async_result_get_op_res_gpointer (simple);
--
--  if (data->timed_out)
--    {
--      g_set_error (error,
--                   G_IO_ERROR,
--                   G_IO_ERROR_TIMED_OUT,
--                   "Timed out after %d seconds",
--                   data->timeout_seconds);
--      goto out;
--    }
--
--  if (out_exit_status != NULL)
--    *out_exit_status = data->exit_status;
--
--  if (out_standard_output != NULL)
--    *out_standard_output = g_strdup (data->child_stdout->str);
--
--  if (out_standard_error != NULL)
--    *out_standard_error = g_strdup (data->child_stderr->str);
--
--  ret = TRUE;
--
-- out:
--  return ret;
--}
-diff --git a/src/polkitbackend/polkitbackendjsauthority.cpp b/src/polkitbackend/polkitbackendjsauthority.cpp
-index ca17108..e28091d 100644
---- a/src/polkitbackend/polkitbackendjsauthority.cpp
-+++ b/src/polkitbackend/polkitbackendjsauthority.cpp
-@@ -19,29 +19,7 @@
-  * Author: David Zeuthen <davidz@redhat.com>
-  */
- 
--#include "config.h"
--#include <sys/wait.h>
--#include <errno.h>
--#include <pwd.h>
--#include <grp.h>
--#ifdef HAVE_NETGROUP_H
--#include <netgroup.h>
--#else
--#include <netdb.h>
--#endif
--#include <string.h>
--#include <glib/gstdio.h>
--#include <locale.h>
--#include <glib/gi18n-lib.h>
--
--#include <polkit/polkit.h>
--#include "polkitbackendjsauthority.h"
--
--#include <polkit/polkitprivate.h>
--
--#ifdef HAVE_LIBSYSTEMD
--#include <systemd/sd-login.h>
--#endif /* HAVE_LIBSYSTEMD */
-+#include "polkitbackendcommon.h"
- 
- #include <js/CompilationAndEvaluation.h>
- #include <js/ContextOptions.h>
-@@ -52,6 +30,7 @@
- #include <js/Array.h>
- #include <jsapi.h>
- 
-+/* Built source and not too big to worry about deduplication */
- #include "initjs.h" /* init.js */
- 
- #ifdef JSGC_USE_EXACT_ROOTING
-@@ -67,10 +46,9 @@
-  * @short_description: JS Authority
-  * @stability: Unstable
-  *
-- * An implementation of #PolkitBackendAuthority that reads and
-- * evalates Javascript files and supports interaction with
-- * authentication agents (virtue of being based on
-- * #PolkitBackendInteractiveAuthority).
-+ * An (SpiderMonkey-based) implementation of #PolkitBackendAuthority that reads
-+ * and evaluates Javascript files and supports interaction with authentication
-+ * agents (virtue of being based on #PolkitBackendInteractiveAuthority).
-  */
- 
- /* ---------------------------------------------------------------------------------------------------- */
-@@ -100,57 +78,11 @@ static bool execute_script_with_runaway_killer (PolkitBackendJsAuthority *author
-                                     JS::HandleScript                 script,
-                                     JS::MutableHandleValue           rval);
- 
--static void utils_spawn (const gchar *const  *argv,
--                         guint                timeout_seconds,
--                         GCancellable        *cancellable,
--                         GAsyncReadyCallback  callback,
--                         gpointer             user_data);
--
--gboolean utils_spawn_finish (GAsyncResult   *res,
--                             gint           *out_exit_status,
--                             gchar         **out_standard_output,
--                             gchar         **out_standard_error,
--                             GError        **error);
--
--static void on_dir_monitor_changed (GFileMonitor     *monitor,
--                                    GFile            *file,
--                                    GFile            *other_file,
--                                    GFileMonitorEvent event_type,
--                                    gpointer          user_data);
--
--/* ---------------------------------------------------------------------------------------------------- */
--
--enum
--{
--  PROP_0,
--  PROP_RULES_DIRS,
--};
--
- /* ---------------------------------------------------------------------------------------------------- */
- 
- static gpointer runaway_killer_thread_func (gpointer user_data);
- static void runaway_killer_terminate (PolkitBackendJsAuthority *authority);
- 
--static GList *polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *authority,
--                                                                     PolkitSubject                     *caller,
--                                                                     PolkitSubject                     *subject,
--                                                                     PolkitIdentity                    *user_for_subject,
--                                                                     gboolean                           subject_is_local,
--                                                                     gboolean                           subject_is_active,
--                                                                     const gchar                       *action_id,
--                                                                     PolkitDetails                     *details);
--
--static PolkitImplicitAuthorization polkit_backend_js_authority_check_authorization_sync (
--                                                          PolkitBackendInteractiveAuthority *authority,
--                                                          PolkitSubject                     *caller,
--                                                          PolkitSubject                     *subject,
--                                                          PolkitIdentity                    *user_for_subject,
--                                                          gboolean                           subject_is_local,
--                                                          gboolean                           subject_is_active,
--                                                          const gchar                       *action_id,
--                                                          PolkitDetails                     *details,
--                                                          PolkitImplicitAuthorization        implicit);
--
- G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BACKEND_TYPE_INTERACTIVE_AUTHORITY);
- 
- /* ---------------------------------------------------------------------------------------------------- */
-@@ -229,33 +161,6 @@ polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
-                                                  PolkitBackendJsAuthorityPrivate);
- }
- 
--static gint
--rules_file_name_cmp (const gchar *a,
--                     const gchar *b)
--{
--  gint ret;
--  const gchar *a_base;
--  const gchar *b_base;
--
--  a_base = strrchr (a, '/');
--  b_base = strrchr (b, '/');
--
--  g_assert (a_base != NULL);
--  g_assert (b_base != NULL);
--  a_base += 1;
--  b_base += 1;
--
--  ret = g_strcmp0 (a_base, b_base);
--  if (ret == 0)
--    {
--      /* /etc wins over /usr */
--      ret = g_strcmp0 (a, b);
--      g_assert (ret != 0);
--    }
--
--  return ret;
--}
--
- /* authority->priv->cx must be within a request */
- static void
- load_scripts (PolkitBackendJsAuthority  *authority)
-@@ -299,7 +204,7 @@ load_scripts (PolkitBackendJsAuthority  *authority)
-         }
-     }
- 
--  files = g_list_sort (files, (GCompareFunc) rules_file_name_cmp);
-+  files = g_list_sort (files, (GCompareFunc) polkit_backend_common_rules_file_name_cmp);
- 
-   for (l = files; l != NULL; l = l->next)
-     {
-@@ -365,8 +270,8 @@ load_scripts (PolkitBackendJsAuthority  *authority)
-   g_list_free_full (files, g_free);
- }
- 
--static void
--reload_scripts (PolkitBackendJsAuthority *authority)
-+void
-+polkit_backend_common_reload_scripts (PolkitBackendJsAuthority *authority)
- {
-   JS::RootedValueArray<1> args(authority->priv->cx);
-   JS::RootedValue rval(authority->priv->cx);
-@@ -395,42 +300,6 @@ reload_scripts (PolkitBackendJsAuthority *authority)
-   g_signal_emit_by_name (authority, "changed");
- }
- 
--static void
--on_dir_monitor_changed (GFileMonitor     *monitor,
--                        GFile            *file,
--                        GFile            *other_file,
--                        GFileMonitorEvent event_type,
--                        gpointer          user_data)
--{
--  PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (user_data);
--
--  /* TODO: maybe rate-limit so storms of events are collapsed into one with a 500ms resolution?
--   *       Because when editing a file with emacs we get 4-8 events..
--   */
--
--  if (file != NULL)
--    {
--      gchar *name;
--
--      name = g_file_get_basename (file);
--
--      /* g_print ("event_type=%d file=%p name=%s\n", event_type, file, name); */
--      if (!g_str_has_prefix (name, ".") &&
--          !g_str_has_prefix (name, "#") &&
--          g_str_has_suffix (name, ".rules") &&
--          (event_type == G_FILE_MONITOR_EVENT_CREATED ||
--           event_type == G_FILE_MONITOR_EVENT_DELETED ||
--           event_type == G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT))
--        {
--          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                        "Reloading rules");
--          reload_scripts (authority);
--        }
--      g_free (name);
--    }
--}
--
--
- static void
- setup_file_monitors (PolkitBackendJsAuthority *authority)
- {
-@@ -462,7 +331,7 @@ setup_file_monitors (PolkitBackendJsAuthority *authority)
-         {
-           g_signal_connect (monitor,
-                             "changed",
--                            G_CALLBACK (on_dir_monitor_changed),
-+                            G_CALLBACK (polkit_backend_common_on_dir_monitor_changed),
-                             authority);
-           g_ptr_array_add (p, monitor);
-         }
-@@ -471,8 +340,8 @@ setup_file_monitors (PolkitBackendJsAuthority *authority)
-   authority->priv->dir_monitors = (GFileMonitor**) g_ptr_array_free (p, FALSE);
- }
- 
--static void
--polkit_backend_js_authority_constructed (GObject *object)
-+void
-+polkit_backend_common_js_authority_constructed (GObject *object)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
- 
-@@ -561,8 +430,8 @@ polkit_backend_js_authority_constructed (GObject *object)
-   g_assert_not_reached ();
- }
- 
--static void
--polkit_backend_js_authority_finalize (GObject *object)
-+void
-+polkit_backend_common_js_authority_finalize (GObject *object)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-   guint n;
-@@ -577,7 +446,7 @@ polkit_backend_js_authority_finalize (GObject *object)
-     {
-       GFileMonitor *monitor = authority->priv->dir_monitors[n];
-       g_signal_handlers_disconnect_by_func (monitor,
--                                            (gpointer*)G_CALLBACK (on_dir_monitor_changed),
-+                                            (gpointer*)G_CALLBACK (polkit_backend_common_on_dir_monitor_changed),
-                                             authority);
-       g_object_unref (monitor);
-     }
-@@ -594,11 +463,11 @@ polkit_backend_js_authority_finalize (GObject *object)
-   G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->finalize (object);
- }
- 
--static void
--polkit_backend_js_authority_set_property (GObject      *object,
--                                          guint         property_id,
--                                          const GValue *value,
--                                          GParamSpec   *pspec)
-+void
-+polkit_backend_common_js_authority_set_property (GObject      *object,
-+                                                 guint         property_id,
-+                                                 const GValue *value,
-+                                                 GParamSpec   *pspec)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
- 
-@@ -615,57 +484,12 @@ polkit_backend_js_authority_set_property (GObject      *object,
-     }
- }
- 
--static const gchar *
--polkit_backend_js_authority_get_name (PolkitBackendAuthority *authority)
--{
--  return "js";
--}
--
--static const gchar *
--polkit_backend_js_authority_get_version (PolkitBackendAuthority *authority)
--{
--  return PACKAGE_VERSION;
--}
--
--static PolkitAuthorityFeatures
--polkit_backend_js_authority_get_features (PolkitBackendAuthority *authority)
--{
--  return POLKIT_AUTHORITY_FEATURES_TEMPORARY_AUTHORIZATION;
--}
--
- static void
- polkit_backend_js_authority_class_init (PolkitBackendJsAuthorityClass *klass)
- {
--  GObjectClass *gobject_class;
--  PolkitBackendAuthorityClass *authority_class;
--  PolkitBackendInteractiveAuthorityClass *interactive_authority_class;
--
--
--  gobject_class = G_OBJECT_CLASS (klass);
--  gobject_class->finalize                               = polkit_backend_js_authority_finalize;
--  gobject_class->set_property                           = polkit_backend_js_authority_set_property;
--  gobject_class->constructed                            = polkit_backend_js_authority_constructed;
--
--  authority_class = POLKIT_BACKEND_AUTHORITY_CLASS (klass);
--  authority_class->get_name                             = polkit_backend_js_authority_get_name;
--  authority_class->get_version                          = polkit_backend_js_authority_get_version;
--  authority_class->get_features                         = polkit_backend_js_authority_get_features;
--
--  interactive_authority_class = POLKIT_BACKEND_INTERACTIVE_AUTHORITY_CLASS (klass);
--  interactive_authority_class->get_admin_identities     = polkit_backend_js_authority_get_admin_auth_identities;
--  interactive_authority_class->check_authorization_sync = polkit_backend_js_authority_check_authorization_sync;
--
--  g_object_class_install_property (gobject_class,
--                                   PROP_RULES_DIRS,
--                                   g_param_spec_boxed ("rules-dirs",
--                                                       NULL,
--                                                       NULL,
--                                                       G_TYPE_STRV,
--                                                       GParamFlags(G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE)));
--
-+  polkit_backend_common_js_authority_class_init_common (klass);
- 
-   g_type_class_add_private (klass, sizeof (PolkitBackendJsAuthorityPrivate));
--
-   JS_Init ();
- }
- 
-@@ -1099,15 +923,15 @@ call_js_function_with_runaway_killer (PolkitBackendJsAuthority *authority,
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static GList *
--polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
--                                                       PolkitSubject                     *caller,
--                                                       PolkitSubject                     *subject,
--                                                       PolkitIdentity                    *user_for_subject,
--                                                       gboolean                           subject_is_local,
--                                                       gboolean                           subject_is_active,
--                                                       const gchar                       *action_id,
--                                                       PolkitDetails                     *details)
-+GList *
-+polkit_backend_common_js_authority_get_admin_auth_identities (PolkitBackendInteractiveAuthority *_authority,
-+                                                              PolkitSubject                     *caller,
-+                                                              PolkitSubject                     *subject,
-+                                                              PolkitIdentity                    *user_for_subject,
-+                                                              gboolean                           subject_is_local,
-+                                                              gboolean                           subject_is_active,
-+                                                              const gchar                       *action_id,
-+                                                              PolkitDetails                     *details)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-   GList *ret = NULL;
-@@ -1202,16 +1026,16 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static PolkitImplicitAuthorization
--polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
--                                                      PolkitSubject                     *caller,
--                                                      PolkitSubject                     *subject,
--                                                      PolkitIdentity                    *user_for_subject,
--                                                      gboolean                           subject_is_local,
--                                                      gboolean                           subject_is_active,
--                                                      const gchar                       *action_id,
--                                                      PolkitDetails                     *details,
--                                                      PolkitImplicitAuthorization        implicit)
-+PolkitImplicitAuthorization
-+polkit_backend_common_js_authority_check_authorization_sync (PolkitBackendInteractiveAuthority *_authority,
-+                                                             PolkitSubject                     *caller,
-+                                                             PolkitSubject                     *subject,
-+                                                             PolkitIdentity                    *user_for_subject,
-+                                                             gboolean                           subject_is_local,
-+                                                             gboolean                           subject_is_active,
-+                                                             const gchar                       *action_id,
-+                                                             PolkitDetails                     *details,
-+                                                             PolkitImplicitAuthorization        implicit)
- {
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
-   PolkitImplicitAuthorization ret = implicit;
-@@ -1324,65 +1148,6 @@ js_polkit_log (JSContext  *cx,
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
--static const gchar *
--get_signal_name (gint signal_number)
--{
--  switch (signal_number)
--    {
--#define _HANDLE_SIG(sig) case sig: return #sig;
--    _HANDLE_SIG (SIGHUP);
--    _HANDLE_SIG (SIGINT);
--    _HANDLE_SIG (SIGQUIT);
--    _HANDLE_SIG (SIGILL);
--    _HANDLE_SIG (SIGABRT);
--    _HANDLE_SIG (SIGFPE);
--    _HANDLE_SIG (SIGKILL);
--    _HANDLE_SIG (SIGSEGV);
--    _HANDLE_SIG (SIGPIPE);
--    _HANDLE_SIG (SIGALRM);
--    _HANDLE_SIG (SIGTERM);
--    _HANDLE_SIG (SIGUSR1);
--    _HANDLE_SIG (SIGUSR2);
--    _HANDLE_SIG (SIGCHLD);
--    _HANDLE_SIG (SIGCONT);
--    _HANDLE_SIG (SIGSTOP);
--    _HANDLE_SIG (SIGTSTP);
--    _HANDLE_SIG (SIGTTIN);
--    _HANDLE_SIG (SIGTTOU);
--    _HANDLE_SIG (SIGBUS);
--#ifdef SIGPOLL
--    _HANDLE_SIG (SIGPOLL);
--#endif
--    _HANDLE_SIG (SIGPROF);
--    _HANDLE_SIG (SIGSYS);
--    _HANDLE_SIG (SIGTRAP);
--    _HANDLE_SIG (SIGURG);
--    _HANDLE_SIG (SIGVTALRM);
--    _HANDLE_SIG (SIGXCPU);
--    _HANDLE_SIG (SIGXFSZ);
--#undef _HANDLE_SIG
--    default:
--      break;
--    }
--  return "UNKNOWN_SIGNAL";
--}
--
--typedef struct
--{
--  GMainLoop *loop;
--  GAsyncResult *res;
--} SpawnData;
--
--static void
--spawn_cb (GObject       *source_object,
--          GAsyncResult  *res,
--          gpointer       user_data)
--{
--  SpawnData *data = (SpawnData *)user_data;
--  data->res = (GAsyncResult*)g_object_ref (res);
--  g_main_loop_quit (data->loop);
--}
--
- static bool
- js_polkit_spawn (JSContext  *cx,
-                  unsigned    js_argc,
-@@ -1440,21 +1205,21 @@ js_polkit_spawn (JSContext  *cx,
-   g_main_context_push_thread_default (context);
- 
-   data.loop = loop;
--  utils_spawn ((const gchar *const *) argv,
--               10, /* timeout_seconds */
--               NULL, /* cancellable */
--               spawn_cb,
--               &data);
-+  polkit_backend_common_spawn ((const gchar *const *) argv,
-+                               10, /* timeout_seconds */
-+                               NULL, /* cancellable */
-+                               polkit_backend_common_spawn_cb,
-+                               &data);
- 
-   g_main_loop_run (loop);
- 
-   g_main_context_pop_thread_default (context);
- 
--  if (!utils_spawn_finish (data.res,
--                           &exit_status,
--                           &standard_output,
--                           &standard_error,
--                           &error))
-+  if (!polkit_backend_common_spawn_finish (data.res,
-+                                           &exit_status,
-+                                           &standard_output,
-+                                           &standard_error,
-+                                           &error))
-     {
-       JS_ReportErrorUTF8 (cx,
-                       "Error spawning helper: %s (%s, %d)",
-@@ -1477,7 +1242,7 @@ js_polkit_spawn (JSContext  *cx,
-         {
-           g_string_append_printf (gstr,
-                                   "Helper was signaled with signal %s (%d)",
--                                  get_signal_name (WTERMSIG (exit_status)),
-+                                  polkit_backend_common_get_signal_name (WTERMSIG (exit_status)),
-                                   WTERMSIG (exit_status));
-         }
-       g_string_append_printf (gstr, ", stdout=`%s', stderr=`%s'",
-@@ -1542,381 +1307,5 @@ js_polkit_user_is_in_netgroup (JSContext  *cx,
-   return ret;
- }
- 
--
--
- /* ---------------------------------------------------------------------------------------------------- */
- 
--typedef struct
--{
--  GSimpleAsyncResult *simple; /* borrowed reference */
--  GMainContext *main_context; /* may be NULL */
--
--  GCancellable *cancellable;  /* may be NULL */
--  gulong cancellable_handler_id;
--
--  GPid child_pid;
--  gint child_stdout_fd;
--  gint child_stderr_fd;
--
--  GIOChannel *child_stdout_channel;
--  GIOChannel *child_stderr_channel;
--
--  GSource *child_watch_source;
--  GSource *child_stdout_source;
--  GSource *child_stderr_source;
--
--  guint timeout_seconds;
--  gboolean timed_out;
--  GSource *timeout_source;
--
--  GString *child_stdout;
--  GString *child_stderr;
--
--  gint exit_status;
--} UtilsSpawnData;
--
--static void
--utils_child_watch_from_release_cb (GPid     pid,
--                                   gint     status,
--                                   gpointer user_data)
--{
--}
--
--static void
--utils_spawn_data_free (UtilsSpawnData *data)
--{
--  if (data->timeout_source != NULL)
--    {
--      g_source_destroy (data->timeout_source);
--      data->timeout_source = NULL;
--    }
--
--  /* Nuke the child, if necessary */
--  if (data->child_watch_source != NULL)
--    {
--      g_source_destroy (data->child_watch_source);
--      data->child_watch_source = NULL;
--    }
--
--  if (data->child_pid != 0)
--    {
--      GSource *source;
--      kill (data->child_pid, SIGTERM);
--      /* OK, we need to reap for the child ourselves - we don't want
--       * to use waitpid() because that might block the calling
--       * thread (the child might handle SIGTERM and use several
--       * seconds for cleanup/rollback).
--       *
--       * So we use GChildWatch instead.
--       *
--       * Avoid taking a references to ourselves. but note that we need
--       * to pass the GSource so we can nuke it once handled.
--       */
--      source = g_child_watch_source_new (data->child_pid);
--      g_source_set_callback (source,
--                             (GSourceFunc) utils_child_watch_from_release_cb,
--                             source,
--                             (GDestroyNotify) g_source_destroy);
--      /* attach source to the global default main context */
--      g_source_attach (source, NULL);
--      g_source_unref (source);
--      data->child_pid = 0;
--    }
--
--  if (data->child_stdout != NULL)
--    {
--      g_string_free (data->child_stdout, TRUE);
--      data->child_stdout = NULL;
--    }
--
--  if (data->child_stderr != NULL)
--    {
--      g_string_free (data->child_stderr, TRUE);
--      data->child_stderr = NULL;
--    }
--
--  if (data->child_stdout_channel != NULL)
--    {
--      g_io_channel_unref (data->child_stdout_channel);
--      data->child_stdout_channel = NULL;
--    }
--  if (data->child_stderr_channel != NULL)
--    {
--      g_io_channel_unref (data->child_stderr_channel);
--      data->child_stderr_channel = NULL;
--    }
--
--  if (data->child_stdout_source != NULL)
--    {
--      g_source_destroy (data->child_stdout_source);
--      data->child_stdout_source = NULL;
--    }
--  if (data->child_stderr_source != NULL)
--    {
--      g_source_destroy (data->child_stderr_source);
--      data->child_stderr_source = NULL;
--    }
--
--  if (data->child_stdout_fd != -1)
--    {
--      g_warn_if_fail (close (data->child_stdout_fd) == 0);
--      data->child_stdout_fd = -1;
--    }
--  if (data->child_stderr_fd != -1)
--    {
--      g_warn_if_fail (close (data->child_stderr_fd) == 0);
--      data->child_stderr_fd = -1;
--    }
--
--  if (data->cancellable_handler_id > 0)
--    {
--      g_cancellable_disconnect (data->cancellable, data->cancellable_handler_id);
--      data->cancellable_handler_id = 0;
--    }
--
--  if (data->main_context != NULL)
--    g_main_context_unref (data->main_context);
--
--  if (data->cancellable != NULL)
--    g_object_unref (data->cancellable);
--
--  g_slice_free (UtilsSpawnData, data);
--}
--
--/* called in the thread where @cancellable was cancelled */
--static void
--utils_on_cancelled (GCancellable *cancellable,
--                    gpointer      user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  GError *error;
--
--  error = NULL;
--  g_warn_if_fail (g_cancellable_set_error_if_cancelled (cancellable, &error));
--  g_simple_async_result_take_error (data->simple, error);
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--}
--
--static gboolean
--utils_read_child_stderr (GIOChannel *channel,
--                         GIOCondition condition,
--                         gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar buf[1024];
--  gsize bytes_read;
--
--  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
--  g_string_append_len (data->child_stderr, buf, bytes_read);
--  return TRUE;
--}
--
--static gboolean
--utils_read_child_stdout (GIOChannel *channel,
--                         GIOCondition condition,
--                         gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar buf[1024];
--  gsize bytes_read;
--
--  g_io_channel_read_chars (channel, buf, sizeof buf, &bytes_read, NULL);
--  g_string_append_len (data->child_stdout, buf, bytes_read);
--  return TRUE;
--}
--
--static void
--utils_child_watch_cb (GPid     pid,
--                      gint     status,
--                      gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--  gchar *buf;
--  gsize buf_size;
--
--  if (g_io_channel_read_to_end (data->child_stdout_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
--    {
--      g_string_append_len (data->child_stdout, buf, buf_size);
--      g_free (buf);
--    }
--  if (g_io_channel_read_to_end (data->child_stderr_channel, &buf, &buf_size, NULL) == G_IO_STATUS_NORMAL)
--    {
--      g_string_append_len (data->child_stderr, buf, buf_size);
--      g_free (buf);
--    }
--
--  data->exit_status = status;
--
--  /* ok, child watch is history, make sure we don't free it in spawn_data_free() */
--  data->child_pid = 0;
--  data->child_watch_source = NULL;
--
--  /* we're done */
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--}
--
--static gboolean
--utils_timeout_cb (gpointer user_data)
--{
--  UtilsSpawnData *data = (UtilsSpawnData *)user_data;
--
--  data->timed_out = TRUE;
--
--  /* ok, timeout is history, make sure we don't free it in spawn_data_free() */
--  data->timeout_source = NULL;
--
--  /* we're done */
--  g_simple_async_result_complete_in_idle (data->simple);
--  g_object_unref (data->simple);
--
--  return FALSE; /* remove source */
--}
--
--static void
--utils_spawn (const gchar *const  *argv,
--             guint                timeout_seconds,
--             GCancellable        *cancellable,
--             GAsyncReadyCallback  callback,
--             gpointer             user_data)
--{
--  UtilsSpawnData *data;
--  GError *error;
--
--  data = g_slice_new0 (UtilsSpawnData);
--  data->timeout_seconds = timeout_seconds;
--  data->simple = g_simple_async_result_new (NULL,
--                                            callback,
--                                            user_data,
--                                            (gpointer*)utils_spawn);
--  data->main_context = g_main_context_get_thread_default ();
--  if (data->main_context != NULL)
--    g_main_context_ref (data->main_context);
--
--  data->cancellable = cancellable != NULL ? (GCancellable*)g_object_ref (cancellable) : NULL;
--
--  data->child_stdout = g_string_new (NULL);
--  data->child_stderr = g_string_new (NULL);
--  data->child_stdout_fd = -1;
--  data->child_stderr_fd = -1;
--
--  /* the life-cycle of UtilsSpawnData is tied to its GSimpleAsyncResult */
--  g_simple_async_result_set_op_res_gpointer (data->simple, data, (GDestroyNotify) utils_spawn_data_free);
--
--  error = NULL;
--  if (data->cancellable != NULL)
--    {
--      /* could already be cancelled */
--      error = NULL;
--      if (g_cancellable_set_error_if_cancelled (data->cancellable, &error))
--        {
--          g_simple_async_result_take_error (data->simple, error);
--          g_simple_async_result_complete_in_idle (data->simple);
--          g_object_unref (data->simple);
--          goto out;
--        }
--
--      data->cancellable_handler_id = g_cancellable_connect (data->cancellable,
--                                                            G_CALLBACK (utils_on_cancelled),
--                                                            data,
--                                                            NULL);
--    }
--
--  error = NULL;
--  if (!g_spawn_async_with_pipes (NULL, /* working directory */
--                                 (gchar **) argv,
--                                 NULL, /* envp */
--                                 GSpawnFlags(G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD),
--                                 NULL, /* child_setup */
--                                 NULL, /* child_setup's user_data */
--                                 &(data->child_pid),
--                                 NULL, /* gint *stdin_fd */
--                                 &(data->child_stdout_fd),
--                                 &(data->child_stderr_fd),
--                                 &error))
--    {
--      g_prefix_error (&error, "Error spawning: ");
--      g_simple_async_result_take_error (data->simple, error);
--      g_simple_async_result_complete_in_idle (data->simple);
--      g_object_unref (data->simple);
--      goto out;
--    }
--
--  if (timeout_seconds > 0)
--    {
--      data->timeout_source = g_timeout_source_new_seconds (timeout_seconds);
--      g_source_set_priority (data->timeout_source, G_PRIORITY_DEFAULT);
--      g_source_set_callback (data->timeout_source, utils_timeout_cb, data, NULL);
--      g_source_attach (data->timeout_source, data->main_context);
--      g_source_unref (data->timeout_source);
--    }
--
--  data->child_watch_source = g_child_watch_source_new (data->child_pid);
--  g_source_set_callback (data->child_watch_source, (GSourceFunc) utils_child_watch_cb, data, NULL);
--  g_source_attach (data->child_watch_source, data->main_context);
--  g_source_unref (data->child_watch_source);
--
--  data->child_stdout_channel = g_io_channel_unix_new (data->child_stdout_fd);
--  g_io_channel_set_flags (data->child_stdout_channel, G_IO_FLAG_NONBLOCK, NULL);
--  data->child_stdout_source = g_io_create_watch (data->child_stdout_channel, G_IO_IN);
--  g_source_set_callback (data->child_stdout_source, (GSourceFunc) utils_read_child_stdout, data, NULL);
--  g_source_attach (data->child_stdout_source, data->main_context);
--  g_source_unref (data->child_stdout_source);
--
--  data->child_stderr_channel = g_io_channel_unix_new (data->child_stderr_fd);
--  g_io_channel_set_flags (data->child_stderr_channel, G_IO_FLAG_NONBLOCK, NULL);
--  data->child_stderr_source = g_io_create_watch (data->child_stderr_channel, G_IO_IN);
--  g_source_set_callback (data->child_stderr_source, (GSourceFunc) utils_read_child_stderr, data, NULL);
--  g_source_attach (data->child_stderr_source, data->main_context);
--  g_source_unref (data->child_stderr_source);
--
-- out:
--  ;
--}
--
--gboolean
--utils_spawn_finish (GAsyncResult   *res,
--                    gint           *out_exit_status,
--                    gchar         **out_standard_output,
--                    gchar         **out_standard_error,
--                    GError        **error)
--{
--  GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
--  UtilsSpawnData *data;
--  gboolean ret = FALSE;
--
--  g_return_val_if_fail (G_IS_ASYNC_RESULT (res), FALSE);
--  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
--
--  g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == utils_spawn);
--
--  if (g_simple_async_result_propagate_error (simple, error))
--    goto out;
--
--  data = (UtilsSpawnData*)g_simple_async_result_get_op_res_gpointer (simple);
--
--  if (data->timed_out)
--    {
--      g_set_error (error,
--                   G_IO_ERROR,
--                   G_IO_ERROR_TIMED_OUT,
--                   "Timed out after %d seconds",
--                   data->timeout_seconds);
--      goto out;
--    }
--
--  if (out_exit_status != NULL)
--    *out_exit_status = data->exit_status;
--
--  if (out_standard_output != NULL)
--    *out_standard_output = g_strdup (data->child_stdout->str);
--
--  if (out_standard_error != NULL)
--    *out_standard_error = g_strdup (data->child_stderr->str);
--
--  ret = TRUE;
--
-- out:
--  return ret;
--}
--- 
-GitLab
-
-
-From 4858128107be9c3ab11828ee8f35c5e26efd36ce Mon Sep 17 00:00:00 2001
-From: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
-Date: Tue, 14 Sep 2021 14:38:15 -0700
-Subject: [PATCH 15/16] Gitlab CI: add duktape pkgconfig dependency
-
-Make way for the CI to be able to build with duktape too
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- .gitlab-ci.yml | 1 +
- 1 file changed, 1 insertion(+)
-
-GitLab
-
-
-From cd5d6da837fce95f8831a355dad88c83347c7337 Mon Sep 17 00:00:00 2001
-From: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
-Date: Mon, 20 Sep 2021 17:17:26 -0700
-Subject: [PATCH 16/16] duktape: implement runaway scripts killer timeout
-
-This was missing on Duktape's JS backend proposal, now in. As
-discussed in
-https://gitlab.freedesktop.org/polkit/polkit/-/merge_requests/35 and
-verified by the commit author, Duktape has no interrupt injection
-mechanism (it has no thread-safe API entry whatsoever, even). Using
-DUK_USE_EXEC_TIMEOUT_CHECK is also not feasible, because:
-
-  i) It must be enabled at build time and shared object builds of the
-  lib on distros go with the default options, something we cannot
-  change/control
-
-  ii) That does not account for non-ECMAScript explicit execution
-  contexts, like regex execution, native C calls, etc.
-
-It has been agreed, on that thread, that pthread_cond_timedwait()-ing
-and having proper Duktape evaluation/execution calls take place in a
-separate thread, to be killed after the runaway script killer's
-accorded timeout value, a reasonable approach. We have considered
-using glib wrappers for direct pthread usage, but that way would make
-it impossible to issue
-pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, ...) and we want to
-be paranoid in that regard.
-
-On Duktape, we don't get to err from the JS context (to be captured by
-the offending script), but to be forcibly killed on timeout scenarios,
-leading to null returns, thus polkit negation, by definition. It's a
-reasonable design/compromise.
-
-A fatal error handler routine, for the Duktape context, has also been
-added, using the polkit_backend_authority_log() logging infra to
-better assist users on what went wrong.
-
-Finally, the script evaluation routine has been made to use
-duk_peval_lstring() (previously using _noresult variant), so to able
-to present the user with proper error messages, should any occur.
-
-The original runaway script killer test has been adjusted to please
-both JS backends.
-
-Signed-off-by: Gustavo Lima Chaves <gustavo.chaves@microsoft.com>
----
- meson.build                                   |   1 +
- src/polkitbackend/meson.build                 |   1 +
- src/polkitbackend/polkitbackendcommon.h       |   2 +
- .../polkitbackendduktapeauthority.c           | 236 ++++++++++++++----
- .../polkitbackendjsauthority.cpp              |  10 +-
- .../etc/polkit-1/rules.d/10-testing.rules     |   6 +-
- .../test-polkitbackendjsauthority.c           |   2 +-
- 7 files changed, 209 insertions(+), 49 deletions(-)
-
-diff --git a/meson.build b/meson.build
-index 4e44723..46956e3 100644
---- a/meson.build
-+++ b/meson.build
-@@ -137,6 +137,7 @@ js_engine = get_option('js_engine')
- if js_engine == 'duktape'
-   js_dep = dependency('duktape')
-   libm_dep = cc.find_library('m')
-+  libpthread_dep = cc.find_library('pthread')
- elif js_engine == 'mozjs'
-   js_dep = dependency('mozjs-78')
- endif
-diff --git a/src/polkitbackend/meson.build b/src/polkitbackend/meson.build
-index 9ec01b2..4dfea39 100644
---- a/src/polkitbackend/meson.build
-+++ b/src/polkitbackend/meson.build
-@@ -34,6 +34,7 @@ c_flags = [
- if js_engine == 'duktape'
-   sources += files('polkitbackendduktapeauthority.c')
-   deps += libm_dep
-+  deps += libpthread_dep
- elif js_engine == 'mozjs'
-   sources += files('polkitbackendjsauthority.cpp')
- endif
-diff --git a/src/polkitbackend/polkitbackendcommon.h b/src/polkitbackend/polkitbackendcommon.h
-index 6d0d267..dd700fc 100644
---- a/src/polkitbackend/polkitbackendcommon.h
-+++ b/src/polkitbackend/polkitbackendcommon.h
-@@ -50,6 +50,8 @@
- #include <systemd/sd-login.h>
- #endif /* HAVE_LIBSYSTEMD */
- 
-+#define RUNAWAY_KILLER_TIMEOUT (15)
-+
- #ifdef __cplusplus
- extern "C" {
- #endif
-diff --git a/src/polkitbackend/polkitbackendduktapeauthority.c b/src/polkitbackend/polkitbackendduktapeauthority.c
-index a2b4420..80f1976 100644
---- a/src/polkitbackend/polkitbackendduktapeauthority.c
-+++ b/src/polkitbackend/polkitbackendduktapeauthority.c
-@@ -47,8 +47,20 @@ struct _PolkitBackendJsAuthorityPrivate
-   GFileMonitor **dir_monitors; /* NULL-terminated array of GFileMonitor instances */
- 
-   duk_context *cx;
-+
-+  pthread_t runaway_killer_thread;
-+};
-+
-+enum
-+{
-+  RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET,
-+  RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS,
-+  RUNAWAY_KILLER_THREAD_EXIT_STATUS_FAILURE,
- };
- 
-+static gboolean execute_script_with_runaway_killer(PolkitBackendJsAuthority *authority,
-+                                                   const gchar *filename);
-+
- /* ---------------------------------------------------------------------------------------------------- */
- 
- G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BACKEND_TYPE_INTERACTIVE_AUTHORITY);
-@@ -67,6 +79,15 @@ static const duk_function_list_entry js_polkit_functions[] =
-   { NULL, NULL, 0 },
- };
- 
-+static void report_error (void     *udata,
-+                          const char *msg)
-+{
-+    PolkitBackendJsAuthority *authority = udata;
-+    polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
-+                                  "fatal Duktape JS backend error: %s",
-+                                  (msg ? msg : "no message"));
-+}
-+
- static void
- polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
- {
-@@ -78,7 +99,6 @@ polkit_backend_js_authority_init (PolkitBackendJsAuthority *authority)
- static void
- load_scripts (PolkitBackendJsAuthority  *authority)
- {
--  duk_context *cx = authority->priv->cx;
-   GList *files = NULL;
-   GList *l;
-   guint num_scripts = 0;
-@@ -123,36 +143,9 @@ load_scripts (PolkitBackendJsAuthority  *authority)
-   for (l = files; l != NULL; l = l->next)
-     {
-       const gchar *filename = (gchar *)l->data;
--#if (DUK_VERSION >= 20000)
--      GFile *file = g_file_new_for_path (filename);
--      char *contents;
--      gsize len;
--      if (!g_file_load_contents (file, NULL, &contents, &len, NULL, NULL))
--        {
--          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                        "Error compiling script %s",
--                                        filename);
--          g_object_unref (file);
--          continue;
--        }
- 
--      g_object_unref (file);
--      if (duk_peval_lstring_noresult(cx, contents,len) != 0)
--#else
--      if (duk_peval_file_noresult (cx, filename) != 0)
--#endif
--        {
--          polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                        "Error compiling script %s: %s",
--                                        filename, duk_safe_to_string (authority->priv->cx, -1));
--#if (DUK_VERSION >= 20000)
--          g_free (contents);
--#endif
-+      if (!execute_script_with_runaway_killer(authority, filename))
-           continue;
--        }
--#if (DUK_VERSION >= 20000)
--      g_free (contents);
--#endif
-       num_scripts++;
-     }
- 
-@@ -232,7 +225,7 @@ polkit_backend_common_js_authority_constructed (GObject *object)
-   PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
-   duk_context *cx;
- 
--  cx = duk_create_heap (NULL, NULL, NULL, authority, NULL);
-+  cx = duk_create_heap (NULL, NULL, NULL, authority, report_error);
-   if (cx == NULL)
-     goto fail;
- 
-@@ -243,6 +236,9 @@ polkit_backend_common_js_authority_constructed (GObject *object)
-   duk_put_function_list (cx, -1, js_polkit_functions);
-   duk_put_prop_string (cx, -2, "polkit");
- 
-+  /* load polkit objects/functions into JS context (e.g. addRule(),
-+   * _deleteRules(), _runRules() et al)
-+   */
-   duk_eval_string (cx, init_js);
- 
-   if (authority->priv->rules_dirs == NULL)
-@@ -510,6 +506,167 @@ push_action_and_details (duk_context               *cx,
- 
- /* ---------------------------------------------------------------------------------------------------- */
- 
-+typedef struct {
-+  PolkitBackendJsAuthority *authority;
-+  const gchar *filename;
-+  pthread_cond_t cond;
-+  pthread_mutex_t mutex;
-+  gint ret;
-+} RunawayKillerCtx;
-+
-+static gpointer
-+runaway_killer_thread_execute_js (gpointer user_data)
-+{
-+  RunawayKillerCtx *ctx = user_data;
-+  duk_context *cx = ctx->authority->priv->cx;
-+
-+  int oldtype;
-+
-+  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
-+
-+#if (DUK_VERSION >= 20000)
-+  GFile *file = g_file_new_for_path(ctx->filename);
-+  char *contents;
-+  gsize len;
-+
-+  if (!g_file_load_contents(file, NULL, &contents, &len, NULL, NULL)) {
-+    polkit_backend_authority_log(POLKIT_BACKEND_AUTHORITY(ctx->authority),
-+                                 "Error compiling script %s", ctx->filename);
-+    g_object_unref(file);
-+    goto err;
-+  }
-+
-+  g_object_unref(file);
-+
-+  /* evaluate the script, trying to print context in any syntax errors
-+     found */
-+  if (duk_peval_lstring(cx, contents, len) != 0)
-+#else
-+  if (duk_peval_file(cx, ctx->filename) != 0)
-+#endif
-+  {
-+    polkit_backend_authority_log(POLKIT_BACKEND_AUTHORITY(ctx->authority),
-+                                 "Error compiling script %s: %s", ctx->filename,
-+                                 duk_safe_to_string(cx, -1));
-+    duk_pop(cx);
-+    goto free_err;
-+  }
-+#if (DUK_VERSION >= 20000)
-+  g_free(contents);
-+#endif
-+
-+  ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS;
-+  goto end;
-+
-+free_err:
-+#if (DUK_VERSION >= 20000)
-+  g_free(contents);
-+#endif
-+err:
-+  ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_FAILURE;
-+end:
-+  pthread_cond_signal(&ctx->cond);
-+  return NULL;
-+}
-+
-+static gpointer
-+runaway_killer_thread_call_js (gpointer user_data)
-+{
-+  RunawayKillerCtx *ctx = user_data;
-+  duk_context *cx = ctx->authority->priv->cx;
-+  int oldtype;
-+
-+  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype);
-+
-+  if (duk_pcall_prop (cx, 0, 2) != DUK_EXEC_SUCCESS)
-+    {
-+      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (ctx->authority),
-+                                    "Error evaluating admin rules: ",
-+                                    duk_safe_to_string (cx, -1));
-+      goto err;
-+    }
-+
-+  ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS;
-+  goto end;
-+
-+err:
-+  ctx->ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_FAILURE;
-+end:
-+  pthread_cond_signal(&ctx->cond);
-+  return NULL;
-+}
-+
-+/* Blocking for at most for RUNAWAY_KILLER_TIMEOUT */
-+static gboolean
-+execute_script_with_runaway_killer(PolkitBackendJsAuthority *authority,
-+                                   const gchar *filename)
-+{
-+  gint64 end_time;
-+  gboolean cancel = FALSE;
-+  RunawayKillerCtx ctx = {.authority = authority, .filename = filename,
-+                          .ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET,
-+                          .mutex = PTHREAD_MUTEX_INITIALIZER,
-+                          .cond = PTHREAD_COND_INITIALIZER};
-+  struct timespec abs_time;
-+
-+  pthread_mutex_lock(&ctx.mutex);
-+
-+  clock_gettime(CLOCK_REALTIME, &abs_time);
-+  abs_time.tv_sec += RUNAWAY_KILLER_TIMEOUT;
-+
-+  pthread_create(&authority->priv->runaway_killer_thread, NULL, runaway_killer_thread_execute_js, &ctx);
-+
-+  while (ctx.ret == RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET) /* loop to treat spurious wakeups */
-+    if (pthread_cond_timedwait(&ctx.cond, &ctx.mutex, &abs_time) == ETIMEDOUT) {
-+      cancel = TRUE;
-+      break;
-+    }
-+
-+  pthread_mutex_unlock(&ctx.mutex);
-+
-+  if (cancel)
-+    pthread_cancel (authority->priv->runaway_killer_thread);
-+  pthread_join (authority->priv->runaway_killer_thread, NULL);
-+
-+  return ctx.ret == RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS;
-+}
-+
-+/* Calls already stacked function and args. Blocking for at most for
-+ * RUNAWAY_KILLER_TIMEOUT
-+ */
-+static gboolean
-+call_js_function_with_runaway_killer(PolkitBackendJsAuthority *authority)
-+{
-+  gint64 end_time;
-+  gboolean cancel = FALSE;
-+  RunawayKillerCtx ctx = {.authority = authority,
-+                          .ret = RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET,
-+                          .mutex = PTHREAD_MUTEX_INITIALIZER,
-+                          .cond = PTHREAD_COND_INITIALIZER};
-+  struct timespec abs_time;
-+
-+  pthread_mutex_lock(&ctx.mutex);
-+
-+  clock_gettime(CLOCK_REALTIME, &abs_time);
-+  abs_time.tv_sec += RUNAWAY_KILLER_TIMEOUT;
-+
-+  pthread_create(&authority->priv->runaway_killer_thread, NULL, runaway_killer_thread_call_js, &ctx);
-+
-+  while (ctx.ret == RUNAWAY_KILLER_THREAD_EXIT_STATUS_UNSET) /* loop to treat spurious wakeups */
-+    if (pthread_cond_timedwait(&ctx.cond, &ctx.mutex, &abs_time) == ETIMEDOUT) {
-+      cancel = TRUE;
-+      break;
-+    }
-+
-+  pthread_mutex_unlock(&ctx.mutex);
-+
-+  if (cancel)
-+    pthread_cancel (authority->priv->runaway_killer_thread);
-+  pthread_join (authority->priv->runaway_killer_thread, NULL);
-+
-+  return ctx.ret == RUNAWAY_KILLER_THREAD_EXIT_STATUS_SUCCESS;
-+}
-+
- /* ---------------------------------------------------------------------------------------------------- */
- 
- GList *
-@@ -557,13 +714,8 @@ polkit_backend_common_js_authority_get_admin_auth_identities (PolkitBackendInter
-       goto out;
-     }
- 
--  if (duk_pcall_prop (cx, 0, 2) != DUK_ERR_NONE)
--    {
--      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                    "Error evaluating admin rules: ",
--                                    duk_safe_to_string (cx, -1));
--      goto out;
--    }
-+  if (!call_js_function_with_runaway_killer (authority))
-+    goto out;
- 
-   ret_str = duk_require_string (cx, -1);
- 
-@@ -643,15 +795,11 @@ polkit_backend_common_js_authority_check_authorization_sync (PolkitBackendIntera
-       goto out;
-     }
- 
--  if (duk_pcall_prop (cx, 0, 2) != DUK_ERR_NONE)
--  {
--      polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
--                                    "Error evaluating authorization rules: ",
--                                    duk_safe_to_string (cx, -1));
--      goto out;
--  }
-+  if (!call_js_function_with_runaway_killer (authority))
-+    goto out;
- 
-   if (duk_is_null(cx, -1)) {
-+    /* this fine, means there was no match, use implicit authorizations */
-     good = TRUE;
-     goto out;
-   }
-diff --git a/src/polkitbackend/polkitbackendjsauthority.cpp b/src/polkitbackend/polkitbackendjsauthority.cpp
-index e28091d..11e91c0 100644
---- a/src/polkitbackend/polkitbackendjsauthority.cpp
-+++ b/src/polkitbackend/polkitbackendjsauthority.cpp
-@@ -829,11 +829,14 @@ runaway_killer_setup (PolkitBackendJsAuthority *authority)
- {
-   g_assert (authority->priv->rkt_source == NULL);
- 
--  /* set-up timer for runaway scripts, will be executed in runaway_killer_thread */
-+  /* set-up timer for runaway scripts, will be executed in
-+     runaway_killer_thread, that is one, permanent thread running a glib
-+     mainloop (rkt_loop) whose context (rkt_context) has a timeout source
-+     (rkt_source) */
-   g_mutex_lock (&authority->priv->rkt_timeout_pending_mutex);
-   authority->priv->rkt_timeout_pending = FALSE;
-   g_mutex_unlock (&authority->priv->rkt_timeout_pending_mutex);
--  authority->priv->rkt_source = g_timeout_source_new_seconds (15);
-+  authority->priv->rkt_source = g_timeout_source_new_seconds (RUNAWAY_KILLER_TIMEOUT);
-   g_source_set_callback (authority->priv->rkt_source, rkt_on_timeout, authority, NULL);
-   g_source_attach (authority->priv->rkt_source, authority->priv->rkt_context);
- 
-@@ -893,6 +896,9 @@ execute_script_with_runaway_killer (PolkitBackendJsAuthority *authority,
- {
-   bool ret;
- 
-+  // tries to JS_ExecuteScript(), may hang for > RUNAWAY_KILLER_TIMEOUT,
-+  // runaway_killer_thread makes sure the call returns, due to exception
-+  // injection
-   runaway_killer_setup (authority);
-   ret = JS_ExecuteScript (authority->priv->cx,
-                           script,
-diff --git a/test/data/etc/polkit-1/rules.d/10-testing.rules b/test/data/etc/polkit-1/rules.d/10-testing.rules
-index 98bf062..e346b5d 100644
---- a/test/data/etc/polkit-1/rules.d/10-testing.rules
-+++ b/test/data/etc/polkit-1/rules.d/10-testing.rules
-@@ -189,8 +189,10 @@ polkit.addRule(function(action, subject) {
-                 ;
-         } catch (error) {
-             if (error == "Terminating runaway script")
--                return polkit.Result.YES;
--            return polkit.Result.NO;
-+                // Inverted logic to accomodate Duktape's model as well, which
-+                // will always fail with negation, on timeouts
-+                return polkit.Result.NO;
-+            return polkit.Result.YES;
-         }
-     }
- });
-diff --git a/test/polkitbackend/test-polkitbackendjsauthority.c b/test/polkitbackend/test-polkitbackendjsauthority.c
-index f97e0e0..2103b17 100644
---- a/test/polkitbackend/test-polkitbackendjsauthority.c
-+++ b/test/polkitbackend/test-polkitbackendjsauthority.c
-@@ -328,7 +328,7 @@ static const RulesTestCase rules_test_cases[] = {
-     "net.company.run_away_script",
-     "unix-user:root",
-     NULL,
--    POLKIT_IMPLICIT_AUTHORIZATION_AUTHORIZED,
-+    POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED,
-   },
- 
-   {
--- 
-GitLab
-
diff --git a/gnu/packages/patches/python-dateutil-pytest-compat.patch b/gnu/packages/patches/python-dateutil-pytest-compat.patch
new file mode 100644
index 0000000000..5cff57e94c
--- /dev/null
+++ b/gnu/packages/patches/python-dateutil-pytest-compat.patch
@@ -0,0 +1,43 @@
+Add compatibility with newer versions of pytest.
+
+Taken from upstream:
+
+  https://github.com/dateutil/dateutil/commit/2bdd63158b7f981fc6d70a869680451bdfd8d848
+
+diff --git a/dateutil/test/test_internals.py b/dateutil/test/test_internals.py
+index 53081314..b32e6723 100644
+--- a/dateutil/test/test_internals.py
++++ b/dateutil/test/test_internals.py
+@@ -9,6 +9,7 @@
+ 
+ import sys
+ import pytest
++import warnings
+ 
+ from dateutil.parser._parser import _ymd
+ from dateutil import tz
+@@ -65,18 +66,17 @@ def test_parser_parser_private_not_warns():
+     from dateutil.parser._parser import _timelex, _tzparser
+     from dateutil.parser._parser import _parsetz
+ 
+-    with pytest.warns(None) as recorder:
++    with warnings.catch_warnings():
++        warnings.simplefilter("error")
+         _tzparser()
+-        assert len(recorder) == 0
+ 
+-    with pytest.warns(None) as recorder:
++    with warnings.catch_warnings():
++        warnings.simplefilter("error")
+         _timelex('2014-03-03')
+ 
+-        assert len(recorder) == 0
+-
+-    with pytest.warns(None) as recorder:
++    with warnings.catch_warnings():
++        warnings.simplefilter("error")
+         _parsetz('+05:00')
+-        assert len(recorder) == 0
+ 
+ 
+ @pytest.mark.tzstr
diff --git a/gnu/packages/patches/python-mypy-12332.patch b/gnu/packages/patches/python-mypy-12332.patch
deleted file mode 100644
index d43cf42ed1..0000000000
--- a/gnu/packages/patches/python-mypy-12332.patch
+++ /dev/null
@@ -1,68 +0,0 @@
-From 518c864805dd93e62d59439e665a0ce9d6778419 Mon Sep 17 00:00:00 2001
-From: Ekin Dursun <ekindursun@gmail.com>
-Date: Thu, 10 Mar 2022 22:06:48 +0300
-Subject: [PATCH] mypyc: Fix overflow in id function (CPyTagged_Id)
-
-In CPython, the id of an object is its address. It's computed by
-converting the pointer to an unsigned integer (PyLong_FromVoidPtr). A
-similar logic is present here, pointer is converted to a Py_ssize_t and
-CPyTagged_FromSsize_t is called with that integer.
-
-There is a problem with that approach: Py_ssize_t cannot hold every
-pointer value. Sometimes overflow happens and CPyTagged_FromSsize_t is
-called with a negative integer.
-
-With the new approach, the number is checked: If it fits in a
-Py_ssize_t, CPyTagged_FromSsize_t is called. If not, it is directly
-converted to a PyObject using PyLong_FromVoidPtr.
----
- mypyc/lib-rt/CPy.h      | 1 +
- mypyc/lib-rt/int_ops.c  | 9 +++++++++
- mypyc/lib-rt/misc_ops.c | 2 +-
- 3 files changed, 11 insertions(+), 1 deletion(-)
-
-diff --git a/mypyc/lib-rt/CPy.h b/mypyc/lib-rt/CPy.h
-index 987819154ab..9f5ae52d4e4 100644
---- a/mypyc/lib-rt/CPy.h
-+++ b/mypyc/lib-rt/CPy.h
-@@ -121,6 +121,7 @@ static inline size_t CPy_FindAttrOffset(PyTypeObject *trait, CPyVTableItem *vtab
- 
- 
- CPyTagged CPyTagged_FromSsize_t(Py_ssize_t value);
-+CPyTagged CPyTagged_FromVoidPtr(void *ptr);
- CPyTagged CPyTagged_FromObject(PyObject *object);
- CPyTagged CPyTagged_StealFromObject(PyObject *object);
- CPyTagged CPyTagged_BorrowFromObject(PyObject *object);
-diff --git a/mypyc/lib-rt/int_ops.c b/mypyc/lib-rt/int_ops.c
-index 1275f2c1057..edf06314161 100644
---- a/mypyc/lib-rt/int_ops.c
-+++ b/mypyc/lib-rt/int_ops.c
-@@ -26,6 +26,15 @@ CPyTagged CPyTagged_FromSsize_t(Py_ssize_t value) {
-     }
- }
- 
-+CPyTagged CPyTagged_FromVoidPtr(void *ptr) {
-+    if ((uintptr_t)ptr > PY_SSIZE_T_MAX) {
-+        PyObject *object = PyLong_FromVoidPtr(ptr);
-+        return ((CPyTagged)object) | CPY_INT_TAG;
-+    } else {
-+        return CPyTagged_FromSsize_t((Py_ssize_t)ptr);
-+    }
-+}
-+
- CPyTagged CPyTagged_FromObject(PyObject *object) {
-     int overflow;
-     // The overflow check knows about CPyTagged's width
-diff --git a/mypyc/lib-rt/misc_ops.c b/mypyc/lib-rt/misc_ops.c
-index cebd1cf997f..dcce89d9072 100644
---- a/mypyc/lib-rt/misc_ops.c
-+++ b/mypyc/lib-rt/misc_ops.c
-@@ -437,7 +437,7 @@ CPyPickle_GetState(PyObject *obj)
- }
- 
- CPyTagged CPyTagged_Id(PyObject *o) {
--    return CPyTagged_FromSsize_t((Py_ssize_t)o);
-+    return CPyTagged_FromVoidPtr(o);
- }
- 
- #define MAX_INT_CHARS 22
diff --git a/gnu/packages/patches/python-mypy-use-sys-path.patch b/gnu/packages/patches/python-mypy-use-sys-path.patch
deleted file mode 100644
index 1b12526456..0000000000
--- a/gnu/packages/patches/python-mypy-use-sys-path.patch
+++ /dev/null
@@ -1,130 +0,0 @@
-This patch fixes the annotation files search of mypy on non-FHS distributions.
-
-Submitted upstream: https://github.com/python/mypy/pull/12530
-
-diff --git a/mypy/main.py b/mypy/main.py
-index 3d9836587..f9b0cbd39 100644
---- a/mypy/main.py
-+++ b/mypy/main.py
-@@ -1033,10 +1033,10 @@ def process_options(args: List[str],
-     # Set target.
-     if special_opts.modules + special_opts.packages:
-         options.build_type = BuildType.MODULE
--        egg_dirs, site_packages = get_site_packages_dirs(options.python_executable)
-+        site_packages = get_site_packages_dirs(options.python_executable)
-         search_paths = SearchPaths((os.getcwd(),),
-                                    tuple(mypy_path() + options.mypy_path),
--                                   tuple(egg_dirs + site_packages),
-+                                   tuple(site_packages),
-                                    ())
-         targets = []
-         # TODO: use the same cache that the BuildManager will
-diff --git a/mypy/modulefinder.py b/mypy/modulefinder.py
-index 94d2dd34c..337a2d59b 100644
---- a/mypy/modulefinder.py
-+++ b/mypy/modulefinder.py
-@@ -629,7 +629,7 @@ def get_prefixes(python_executable: Optional[str]) -> Tuple[str, str]:
- 
- 
- @functools.lru_cache(maxsize=None)
--def get_site_packages_dirs(python_executable: Optional[str]) -> Tuple[List[str], List[str]]:
-+def get_site_packages_dirs(python_executable: Optional[str]) -> List[str]:
-     """Find package directories for given python.
- 
-     This runs a subprocess call, which generates a list of the egg directories, and the site
-@@ -648,51 +648,7 @@ def get_site_packages_dirs(python_executable: Optional[str]) -> Tuple[List[str],
-         site_packages = ast.literal_eval(
-             subprocess.check_output([python_executable, pyinfo.__file__, 'getsitepackages'],
-             stderr=subprocess.PIPE).decode())
--    return expand_site_packages(site_packages)
--
--
--def expand_site_packages(site_packages: List[str]) -> Tuple[List[str], List[str]]:
--    """Expands .pth imports in site-packages directories"""
--    egg_dirs: List[str] = []
--    for dir in site_packages:
--        if not os.path.isdir(dir):
--            continue
--        pth_filenames = sorted(name for name in os.listdir(dir) if name.endswith(".pth"))
--        for pth_filename in pth_filenames:
--            egg_dirs.extend(_parse_pth_file(dir, pth_filename))
--
--    return egg_dirs, site_packages
--
--
--def _parse_pth_file(dir: str, pth_filename: str) -> Iterator[str]:
--    """
--    Mimics a subset of .pth import hook from Lib/site.py
--    See https://github.com/python/cpython/blob/3.5/Lib/site.py#L146-L185
--    """
--
--    pth_file = os.path.join(dir, pth_filename)
--    try:
--        f = open(pth_file, "r")
--    except OSError:
--        return
--    with f:
--        for line in f.readlines():
--            if line.startswith("#"):
--                # Skip comment lines
--                continue
--            if line.startswith(("import ", "import\t")):
--                # import statements in .pth files are not supported
--                continue
--
--            yield _make_abspath(line.rstrip(), dir)
--
--
--def _make_abspath(path: str, root: str) -> str:
--    """Take a path and make it absolute relative to root if not already absolute."""
--    if os.path.isabs(path):
--        return os.path.normpath(path)
--    else:
--        return os.path.join(root, os.path.normpath(path))
-+    return site_packages
- 
- 
- def add_py2_mypypath_entries(mypypath: List[str]) -> List[str]:
-@@ -781,7 +737,7 @@ def compute_search_paths(sources: List[BuildSource],
-     if options.python_version[0] == 2:
-         mypypath = add_py2_mypypath_entries(mypypath)
- 
--    egg_dirs, site_packages = get_site_packages_dirs(options.python_executable)
-+    site_packages = get_site_packages_dirs(options.python_executable)
-     base_prefix, prefix = get_prefixes(options.python_executable)
-     is_venv = base_prefix != prefix
-     for site_dir in site_packages:
-@@ -801,7 +757,7 @@ def compute_search_paths(sources: List[BuildSource],
- 
-     return SearchPaths(python_path=tuple(reversed(python_path)),
-                        mypy_path=tuple(mypypath),
--                       package_path=tuple(egg_dirs + site_packages),
-+                       package_path=tuple(site_packages),
-                        typeshed_path=tuple(lib_path))
- 
- 
-diff --git a/mypy/pyinfo.py b/mypy/pyinfo.py
-index ab2d3286b..9fb0501a1 100644
---- a/mypy/pyinfo.py
-+++ b/mypy/pyinfo.py
-@@ -24,16 +24,11 @@ def getprefixes():
- 
- def getsitepackages():
-     # type: () -> List[str]
--    res = []
--    if hasattr(site, 'getsitepackages'):
--        res.extend(site.getsitepackages())
- 
--        if hasattr(site, 'getusersitepackages') and site.ENABLE_USER_SITE:
--            res.insert(0, site.getusersitepackages())
--    else:
--        from distutils.sysconfig import get_python_lib
--        res = [get_python_lib()]
--    return res
-+    # Simply return sys.path, which has already been expanded
-+    # correctly via Python's site.py module, which takes care of .pth,
-+    # sitecustomize.py files, etc.
-+    return sys.path
- 
- 
- if __name__ == '__main__':
diff --git a/gnu/packages/perl-check.scm b/gnu/packages/perl-check.scm
index bde3079bef..6562390d20 100644
--- a/gnu/packages/perl-check.scm
+++ b/gnu/packages/perl-check.scm
@@ -4,7 +4,7 @@
 ;;; Copyright © 2016 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2016 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2016 Nikita <nikita@n0.is>
-;;; Copyright © 2016, 2017, 2019, 2021 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2017, 2019, 2021, 2022 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016, 2017 Alex Sassmannshausen <alex@pompo.co>
 ;;; Copyright © 2016, 2017 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
@@ -1288,14 +1288,14 @@ makes fork(2) safe to use in test cases.")
 (define-public perl-test-simple
   (package
     (name "perl-test-simple")
-    (version "1.302183")
+    (version "1.302191")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://cpan/authors/id/E/EX/EXODIST/"
                                   "Test-Simple-" version ".tar.gz"))
               (sha256
                (base32
-                "1zq6841yrwxmrmhgzmzx0njlymsv9mzl6l5njabfl2j2xjjvs0ws"))))
+                "1ax7qlmkgy5b78vap8k6c0w3ajljz304zl4rmvf1vvzjqhmnabx8"))))
     (build-system perl-build-system)
     (synopsis "Basic utilities for writing tests")
     (description
diff --git a/gnu/packages/perl.scm b/gnu/packages/perl.scm
index 259db6e2bf..2ffe5fddc3 100644
--- a/gnu/packages/perl.scm
+++ b/gnu/packages/perl.scm
@@ -6,7 +6,7 @@
 ;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr>
 ;;; Copyright © 2016, 2018 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2016 Jochem Raat <jchmrt@riseup.net>
-;;; Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016-2022 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Nikita <nikita@n0.is>
 ;;; Copyright © 2016 Alex Sassmannshausen <alex@pompo.co>
 ;;; Copyright © 2016, 2018, 2020, 2021 Roel Janssen <roel@gnu.org>
@@ -1601,7 +1601,9 @@ Class::Load.")
                            version ".tar.gz"))
        (sha256
         (base32
-         "0a03i4k3a33qqwhykhz5k437ld5mag2vq52vvsy03gbynb65ivsy"))))
+         "0a03i4k3a33qqwhykhz5k437ld5mag2vq52vvsy03gbynb65ivsy"))
+       (patches (search-patches
+                 "perl-class-methodmaker-reproducible.patch"))))
     (build-system perl-build-system)
     (home-page "https://metacpan.org/release/Class-MethodMaker")
     (synopsis "Create generic methods for OO Perl")
@@ -2687,7 +2689,7 @@ point values at a low level.")
 (define-public perl-data-optlist
   (package
     (name "perl-data-optlist")
-    (version "0.110")
+    (version "0.112")
     (source
      (origin
        (method url-fetch)
@@ -2696,7 +2698,7 @@ point values at a low level.")
              version ".tar.gz"))
        (sha256
         (base32
-         "1hzmgr2imdg1fc3hmwx0d56fhsdfyrgmgx7jb4jkyiv6575ifq9n"))))
+         "1arv203h6c4b3y5q49xzmn2cz21kn108kk3bwfd37mc8mv50rik2"))))
     (build-system perl-build-system)
     (propagated-inputs
      (list perl-sub-install perl-params-util))
diff --git a/gnu/packages/plotutils.scm b/gnu/packages/plotutils.scm
index c2c7cedd99..4dcf4802a2 100644
--- a/gnu/packages/plotutils.scm
+++ b/gnu/packages/plotutils.scm
@@ -269,14 +269,14 @@ colors, styles, options and details.")
 (define-public asymptote
   (package
     (name "asymptote")
-    (version "2.81")
+    (version "2.82")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "mirror://sourceforge/asymptote/"
                            version "/asymptote-" version ".src.tgz"))
        (sha256
-        (base32 "0wq0xnkxb8rsphmgls5f38ll61j8i0plh7cr1n0kldvpr14bm3kn"))
+        (base32 "13blmsapbai4hqynyj1r1sjpypdv6frfassl2f2x7j2ql1dbqvsg"))
        (modules '((guix build utils)))
        (snippet
         ;; Remove bundled RapidJSON.
diff --git a/gnu/packages/polkit.scm b/gnu/packages/polkit.scm
index 2fd777ade8..18d299bbd1 100644
--- a/gnu/packages/polkit.scm
+++ b/gnu/packages/polkit.scm
@@ -10,6 +10,7 @@
 ;;; Copyright © 2021 Morgan Smith <Morgan.J.Smith@outlook.com>
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2022 Jean-Pierre De Jesus DIAZ <me@jeandudey.tech>
+;;; Copyright © 2022 Marius Bakke <marius@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -29,14 +30,16 @@
 (define-module (gnu packages polkit)
   #:use-module ((guix licenses) #:select (lgpl2.0+))
   #:use-module (guix packages)
+  #:use-module (guix gexp)
   #:use-module (guix download)
   #:use-module (guix memoization)
   #:use-module (guix utils)
   #:use-module (guix build utils)
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
+  #:use-module (guix build-system meson)
   #:use-module (gnu packages)
-  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages gettext)
   #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages glib)
   #:use-module (gnu packages gtk)
@@ -54,7 +57,7 @@
 (define-public polkit-mozjs
   (package
     (name "polkit")
-    (version "0.120")
+    (version "121")
     (source (origin
              (method url-fetch)
              (uri (string-append
@@ -62,22 +65,15 @@
                    name "-" version ".tar.gz"))
              (sha256
               (base32
-               "00zfg9b9ivkcj2jcf5b92cpvvyljz8cmfwj86lkvy5rihnd5jypf"))
-             (patches (search-patches "polkit-configure-elogind.patch"
-                                      "polkit-CVE-2021-4034.patch"))
+               "1apz3bh7nbpmlp1cr00pb8z8wp0c7yb23ninb959jz3r38saxiwx"))
              (modules '((guix build utils)))
              (snippet
               '(begin
-                 (use-modules (guix build utils))
-                 ;; Disable broken test.
-                 (substitute* "test/Makefile.in"
-                   (("SUBDIRS = mocklibc . polkit polkitbackend")
-                    "SUBDIRS = mocklibc . polkit"))
                  ;; Disable a test that requires Python, D-Bus and a few
                  ;; libraries and fails with "ERROR: timed out waiting for bus
                  ;; process to terminate".
-                 (substitute* "test/polkitbackend/Makefile.am"
-                   (("TEST_PROGS \\+= polkitbackendjsauthoritytest-wrapper.py")
+                 (substitute* "test/meson.build"
+                   (("subdir\\('polkitbackend'\\)")
                     ""))
                  ;; Guix System's polkit
                  ;; service stores actions under /etc/polkit-1/actions.
@@ -88,58 +84,39 @@
                  (substitute* "src/polkitagent/polkitagentsession.c"
                    (("PACKAGE_PREFIX \"/lib/polkit-1/polkit-agent-helper-1\"")
                     "\"/run/setuid-programs/polkit-agent-helper-1\""))))))
-    (build-system gnu-build-system)
+    (build-system meson-build-system)
     (inputs
-     (list expat linux-pam elogind mozjs nspr))
+     (list elogind
+           expat
+           linux-pam
+           mozjs-91
+           nspr))
     (propagated-inputs
-     (list glib)) ; required by polkit-gobject-1.pc
+     (list glib))                       ;required by polkit-gobject-1.pc
     (native-inputs
      (list pkg-config
+           gettext-minimal
            perl
-           `(,glib "bin")                         ;for glib-mkenums
+           `(,glib "bin")               ;for glib-mkenums
            gobject-introspection
-           libxslt                                ;for man page generation
-           docbook-xsl))                          ;for man page generation
+           libxml2                      ;for man page generation
+           libxslt                      ;for man page generation
+           docbook-xsl))                ;for man page generation
     (arguments
-     `(#:configure-flags '("--sysconfdir=/etc"
-                           "--enable-man-pages"
-                           ;; Prevent ‘configure: error: cannot check for
-                           ;; file existence when cross compiling’.
-                           ,@(if (%current-target-system)
-                                 '("--with-os-type=unknown")
-                                 '()))
-       #:phases
-       (modify-phases %standard-phases
-         (add-after
-          'unpack 'fix-introspection-install-dir
-          (lambda* (#:key outputs #:allow-other-keys)
-            (let ((out (assoc-ref outputs "out")))
-              (substitute* (find-files "." "Makefile.in")
-                (("@INTROSPECTION_GIRDIR@")
-                 (string-append out "/share/gir-1.0/"))
-                (("@INTROSPECTION_TYPELIBDIR@")
-                 (string-append out "/lib/girepository-1.0/"))))))
-         (add-after 'unpack 'fix-manpage-generation
-           (lambda* (#:key inputs native-inputs #:allow-other-keys)
-             (let ((xsldoc (string-append
-                             (assoc-ref (or native-inputs inputs) "docbook-xsl")
-                             "/xml/xsl/docbook-xsl-"
-                             ,(package-version docbook-xsl))))
-               (substitute* '("docs/man/Makefile.am" "docs/man/Makefile.in")
-                 (("http://docbook.sourceforge.net/release/xsl/current")
-                  xsldoc)))))
-         (replace
-          'install
-          (lambda* (#:key outputs (make-flags '()) #:allow-other-keys)
-            ;; Override sysconfdir during "make install", to avoid attempting
-            ;; to install in /etc, and to instead install the skeletons in the
-            ;; output directory.
-            (let ((out (assoc-ref outputs "out")))
-             (apply invoke "make" "install"
-                           (string-append "sysconfdir=" out "/etc")
-                           (string-append "polkit_actiondir="
-                                          out "/share/polkit-1/actions")
-                           make-flags)))))))
+     (list #:configure-flags
+           #~'("-Dman=true"
+               "-Dtests=true"
+               "-Djs_engine=mozjs"
+               ;; Work around broken gobject-introspection detection when
+               ;; cross-compiling.  The build system probes for the _target_
+               ;; gobject-introspection, but if we change it to native, Meson
+               ;; fails with:
+               ;; ERROR: Pkg-config binary for machine MachineChoice.BUILD
+               ;; not found, giving up.
+               ;; Just disable introspection for now.
+               #$@(if (%current-target-system)
+                      '("-Dintrospection=false")
+                      '()))))
     (home-page "https://www.freedesktop.org/wiki/Software/polkit/")
     (synopsis "Authorization API for privilege management")
     (description "Polkit is an application-level toolkit for defining and
@@ -155,25 +132,10 @@ for unprivileged applications.")
   (let ((base polkit-mozjs))
     (package/inherit base
       (name "polkit-duktape")
-      (source
-       (origin
-         (inherit (package-source base))
-         (patches
-          (append
-              (search-patches "polkit-use-duktape.patch")
-              (origin-patches (package-source base))))))
       (arguments
        (substitute-keyword-arguments (package-arguments base)
          ((#:configure-flags flags)
-          `(cons "--with-duktape" ,flags))
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (add-after 'unpack 'force-gnu-build-system-bootstrap
-               (lambda _
-                 (delete-file "configure")))))))
-      (native-inputs
-       (modify-inputs (package-native-inputs base)
-         (prepend autoconf automake libtool)))
+          #~(delete "-Djs_engine=mozjs" #$flags))))
       (inputs
        (modify-inputs (package-inputs base)
          (replace "mozjs" duktape))))))
diff --git a/gnu/packages/pulseaudio.scm b/gnu/packages/pulseaudio.scm
index 1fb64fd8a6..96ba13d484 100644
--- a/gnu/packages/pulseaudio.scm
+++ b/gnu/packages/pulseaudio.scm
@@ -450,9 +450,9 @@ only configure local servers, and requires that a special module
 module-gsettings is loaded in the sound server.")
     (license l:gpl2)))
 
-(define-public rnnoise
+(define-public noise-suppression-for-voice
   (package
-    (name "rnnoise")
+    (name "noise-suppression-for-voice")
     (version "0.91")
     (source
      (origin
@@ -472,67 +472,58 @@ module-gsettings is loaded in the sound server.")
            pulseaudio))
     (home-page "https://github.com/werman/noise-suppression-for-voice")
     (synopsis "Real-time Noise suppression plugin based on Xiph's RNNoise")
-    (description "The plugin is meant to suppress a wide range of noise
-origins: computer fans, office, crowd, airplane, car, train, construction.
+    (description "This plug-in is meant to suppress a wide range of noise
+origins: computer fans, offices, crowds, airplanes, cars, trains,
+construction, and more.
 
 Mild background noise is always suppressed, loud sounds, like
 clicking of mechanical keyboard, are suppressed while there is no voice
 however they are only reduced in volume when voice is present.
 
-The plugin is made to work with 1 or 2 channels (ladspa plugin),
+The plug-in is made to work with 1 or 2 channels (LADSPA plugin),
 16 bit, 48000 Hz audio input.")
     (license l:gpl3)))
 
 (define-public noisetorch
   (package
     (name "noisetorch")
-    (version "0.8.3")
+    (version "0.12.2")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/lawl/NoiseTorch")
-             (commit version)))
+             (url "https://github.com/noisetorch/NoiseTorch")
+             (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "115sq4waq048bv82lnq5sblf62m50yvyakx7x06qq359v7qf5ji1"))))
+        (base32 "1qwzqv4rww9xywkfnjr79489d35cypa1zm9rgm966g51zzwhxrck"))))
     (build-system go-build-system)
     (arguments
-     `(#:import-path "github.com/lawl/NoiseTorch"
+     `(#:import-path "github.com/noisetorch/NoiseTorch"
        #:install-source? #f
        #:phases
        (modify-phases %standard-phases
-         (add-after 'unpack 'symlink-rnnoise
+         (add-after 'unpack 'copy-rnnoise-library
            (lambda* (#:key inputs #:allow-other-keys)
-             (with-directory-excursion "src/github.com/lawl/NoiseTorch"
-               (let ((dir "librnnoise_ladspa/bin/ladspa")
-                     (rnnoise (assoc-ref inputs "rnnoise")))
+             (with-directory-excursion "src/github.com/noisetorch/NoiseTorch"
+               (let ((lib (search-input-file inputs
+                                             "lib/ladspa/librnnoise_ladspa.so"))
+                     (dir "c/ladspa"))
                  (mkdir-p dir)
-                 (symlink (string-append rnnoise "/lib/ladspa/librnnoise_ladspa.so")
-                          (string-append dir "/librnnoise_ladspa.so"))))
-             #t))
-         (add-after 'unpack 'gen-version.go
-           (lambda _
-             (with-directory-excursion "src/github.com/lawl/NoiseTorch"
-               (substitute* "main.go"
-                 (("//go:generate go run scripts/embedversion\\.go") ""))
-               (with-output-to-file "version.go"
-                 (lambda ()
-                   (format #t "package main~%~%var version=~s~&" ,version))))
-             #t))
+                 ;; Symlinking won't work: ‘cannot embed irregular file’!
+                 (copy-file lib (string-append dir "/rnnoise_ladspa.so"))))))
          (add-after 'unpack 'disable-update-check.go
            (lambda _
-             (with-directory-excursion "src/github.com/lawl/NoiseTorch"
+             (with-directory-excursion "src/github.com/noisetorch/NoiseTorch"
                (substitute* "main.go"
-                 ((".*updateCheck.*") "")))
-             #t))
+                 ((".*updateCheck.*") "")))))
          (add-before 'build 'go-generate
            (lambda _
-             (with-directory-excursion "src/github.com/lawl/NoiseTorch"
+             (with-directory-excursion "src/github.com/noisetorch/NoiseTorch"
                (invoke "go" "generate")))))))
     (inputs
-     (list rnnoise))
-    (home-page "https://github.com/lawl/NoiseTorch")
+     (list noise-suppression-for-voice))
+    (home-page "https://github.com/noisetorch/NoiseTorch")
     (synopsis "Real-time microphone noise suppression")
     (description "NoiseTorch creates a virtual PulseAudio microphone that
 suppresses noise, in any application.  Use whichever conferencing or VOIP
diff --git a/gnu/packages/python-check.scm b/gnu/packages/python-check.scm
index 1522bdf758..1da5dc6fe4 100644
--- a/gnu/packages/python-check.scm
+++ b/gnu/packages/python-check.scm
@@ -1771,7 +1771,7 @@ supported by the MyPy typechecker.")
 (define-public python-mypy
   (package
     (name "python-mypy")
-    (version "0.942")
+    (version "0.971")
     (source
      (origin
        ;; Because of https://github.com/python/mypy/issues/9584, the
@@ -1788,10 +1788,7 @@ supported by the MyPy typechecker.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0hxnrqhvskiclwfj2s4gyfclzjas1dvpfxhyng8v7mq38rqps1j5"))
-       (patches
-        (search-patches "python-mypy-12332.patch"
-                        "python-mypy-use-sys-path.patch"))))
+         "0i8swdynms1wpiprgqn24za6mx8rlgxr2jash3cb5xi8jyf58n97"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -1799,7 +1796,10 @@ supported by the MyPy typechecker.")
          (replace 'check
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?
-               (invoke "pytest" "mypyc")))))))
+               (invoke "pytest" "-vv" "mypyc"
+                       ;; XXX: This test gets an unexpected DeprecationWarning
+                       ;; from recent versions of setuptools.  Ignore for now.
+                       "-k" "not testImports")))))))
     (native-inputs
      (list python-attrs
            python-lxml
diff --git a/gnu/packages/python-compression.scm b/gnu/packages/python-compression.scm
index edfa974a71..0504dd0b2a 100644
--- a/gnu/packages/python-compression.scm
+++ b/gnu/packages/python-compression.scm
@@ -5,7 +5,7 @@
 ;;; Copyright © 2017 Julien Lepiller <julien@lepiller.eu>
 ;;; Copyright © 2018, 2019, 2020 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2020 Nicolas Goaziou <mail@nicolasgoaziou.fr>
-;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
+;;; Copyright © 2020, 2022 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2021 Brendan Tildesley <mail@brendan.scot>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -195,28 +195,27 @@ Python.")
 (define-public python-lzo
   (package
     (name "python-lzo")
-    (version "1.12")
+    (version "1.14")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "python-lzo" version))
        (sha256
-        (base32
-         "0iakqgd51n1cd7r3lpdylm2rgbmd16y74cra9kcapwg84mlf9a4p"))))
+        (base32 "0315nq6r39n51n8qqamb7xv0ib0qrh76q7g3a1977172mbndijw3"))))
     (build-system python-build-system)
     (arguments
-     `(#:test-target "check"
-       #:phases
-       (modify-phases %standard-phases
-         (add-after 'unpack 'patch-setuppy
-           (lambda _
-             (substitute* "setup.py"
-               (("include_dirs.append\\(.*\\)")
-                (string-append "include_dirs.append('"
-                               (assoc-ref %build-inputs "lzo")
-                               "/include/lzo"
-                               "')")))
-             #t)))))
+     (list
+      #:test-target "check"
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'patch-setuppy
+            (lambda _
+              (substitute* "setup.py"
+                (("include_dirs.append\\(.*\\)")
+                 (string-append "include_dirs.append('"
+                                #$(this-package-input "lzo")
+                                "/include/lzo"
+                                "')"))))))))
     (inputs
      (list lzo))
     (home-page "https://github.com/jd-boyd/python-lzo")
@@ -230,14 +229,14 @@ Python strings.")
 (define-public python-lz4
   (package
     (name "python-lz4")
-    (version "0.10.1")
+    (version "4.0.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "lz4" version))
        (sha256
         (base32
-         "0ghv1xbaq693kgww1x9c22bplz479ls9szjsaa4ig778ls834hm0"))
+         "16vj2bnhhdkcz2a2ai2mx2kf9ngx1cjr18636yp1514kq9r72fq8"))
        (modules '((guix build utils)))
        (snippet
         '(begin
@@ -245,8 +244,18 @@ Python strings.")
            (delete-file-recursively "lz4libs")
            #t))))
     (build-system python-build-system)
+    (arguments
+     (list #:phases
+           #~(modify-phases %standard-phases
+               (replace 'check
+                 (lambda* (#:key tests? #:allow-other-keys)
+                   (when tests?
+                     ;; Taken from tox.ini (excludes experimental tests).
+                     (invoke "pytest" "-vv" "tests/block" "tests/frame")))))))
     (native-inputs
-     (list pkg-config python-nose python-setuptools-scm))
+     (list pkg-config python-pytest python-pkgconfig python-setuptools-scm
+           ;; For tests.
+           python-psutil))
     (inputs
      (list lz4))
     (home-page "https://github.com/python-lz4/python-lz4")
diff --git a/gnu/packages/python-crypto.scm b/gnu/packages/python-crypto.scm
index 4c3602ab54..3ff05c0c9f 100644
--- a/gnu/packages/python-crypto.scm
+++ b/gnu/packages/python-crypto.scm
@@ -441,14 +441,14 @@ is used by the Requests library to verify HTTPS requests.")
 (define-public python-cryptography-vectors-next
   (package
     (name "python-cryptography-vectors")
-    (version "36.0.1")
+    (version "37.0.4")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "cryptography_vectors" version))
        (sha256
         (base32
-         "166mvhhmgglqai1sjkkb76mpdkad2yykam11d2w44hs2snpr117w"))))
+         "1a1yi37ygw0jp72q280cmxd3qn9y9vmcch2bcnjkg2g2202l0qas"))))
     (build-system python-build-system)
     (home-page "https://github.com/pyca/cryptography")
     (synopsis "Test vectors for the cryptography package")
@@ -470,14 +470,14 @@ is used by the Requests library to verify HTTPS requests.")
 (define-public python-cryptography-next
   (package
     (name "python-cryptography")
-    (version "36.0.1")
+    (version "37.0.4")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "cryptography" version))
        (sha256
         (base32
-         "0f1n8bvngarhsssm60xc59xfzkh7yqpyyyypaph3v5bs7pfc3rak"))))
+         "10haq7sn8mrdlhcfs791rczknnxm0wpww0lkpjzcqx141ryc3yb3"))))
     (build-system python-build-system)
     (arguments
      (list
@@ -489,11 +489,13 @@ is used by the Requests library to verify HTTPS requests.")
                   (ice-9 match))
       #:phases
       #~(modify-phases (@ (guix build python-build-system) %standard-phases)
-          (add-after 'unpack 'loosen-ouroboros-version
+          (add-after 'unpack 'adjust-pyo3-requirement
             (lambda _
+              ;; The package depends on 0.15.2, which is not on crates.io(!?).
+              ;; Downgrade to 0.15.1...
               (substitute* "src/rust/Cargo.toml"
-                (("ouroboros = \"0\\.13\"")
-                 "ouroboros = \"0.14\""))))
+                (("pyo3 = \\{ version = \"0\\.15\\.2\"")
+                 "pyo3 = { version = \"0.15.1\""))))
           (add-before 'build 'configure-cargo
             (lambda* (#:key inputs #:allow-other-keys)
               ;; Hide irrelevant inputs from cargo-build-system so it does
@@ -518,6 +520,9 @@ is used by the Requests library to verify HTTPS requests.")
                 (invoke "pytest" "-vv" "tests")))))))
     (inputs
      (list openssl
+           ;; TODO: Most of these inputs are transitive dependencies of
+           ;; the Rust requirements (see src/rust/cargo.toml).  Surely
+           ;; there is a better way than manually listing everything..?
            rust-aliasable-0.1
            rust-asn1-0.8
            rust-asn1-derive-0.8
@@ -538,8 +543,8 @@ is used by the Requests library to verify HTTPS requests.")
            rust-num-integer-0.1
            rust-num-traits-0.2
            rust-once-cell-1
-           rust-ouroboros-0.14
-           rust-ouroboros-macro-0.14
+           rust-ouroboros-0.15
+           rust-ouroboros-macro-0.15
            rust-parking-lot-0.11
            rust-parking-lot-core-0.8
            rust-paste-0.1
@@ -572,6 +577,7 @@ is used by the Requests library to verify HTTPS requests.")
            python-pretend
            python-pytz
            python-pytest
+           python-pytest-benchmark
            python-pytest-subtests
            python-setuptools-rust
            rust
@@ -1610,11 +1616,6 @@ can also encrypt and decrypt messages using RSA and ECDH.")
     (build-system python-build-system)
     (arguments '(#:tests? #f))          ;none included
     (propagated-inputs (list python-six))
-    (native-inputs
-     (list python-mock
-           python-pyfakefs
-           python-pytest
-           python-unittest2))
     (home-page "https://github.com/google/pyu2f/")
     (synopsis "U2F host library for interacting with a U2F device over USB")
     (description
diff --git a/gnu/packages/python-science.scm b/gnu/packages/python-science.scm
index 95f60aae7b..ce0ba4b6d2 100644
--- a/gnu/packages/python-science.scm
+++ b/gnu/packages/python-science.scm
@@ -146,7 +146,7 @@ atlas_libs = openblas~%"  #$(this-package-input "openblas"))))))
            python-pydata-sphinx-theme
            python-pytest
            python-pytest-xdist
-           python-sphinx
+           python-sphinx-4
            python-sphinx-panels
            python-threadpoolctl
            which))
diff --git a/gnu/packages/python-web.scm b/gnu/packages/python-web.scm
index da5a22e395..8760b3968f 100644
--- a/gnu/packages/python-web.scm
+++ b/gnu/packages/python-web.scm
@@ -53,6 +53,7 @@
 ;;; Copyright © 2022 Peter Polidoro <peter@polidoro.io>
 ;;; Copyright © 2022 Antero Mejr <antero@mailbox.org>
 ;;; Copyright © 2022 Luis Henrique Gomes Higino <luishenriquegh2701@gmail.com>
+;;; Copyright © 2022 Nicolas Graves <ngraves@ngraves.fr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -362,6 +363,13 @@ for adding, removing and dropping callbacks.")
                        ;; This test probably requires to be run with the
                        ;; library loaded from the the build directory.
                        "not test_c_parser_loaded and "
+                       ;; TODO: These tests fail with recent versions of Pytest
+                       ;; and the fix is difficult to backport:
+                       ;; https://github.com/aio-libs/aiohttp/pull/6872
+                       ;; Re-enable after 3.9.
+                       "not test_session_close_awaitable and "
+                       "not test_async_with_session and "
+                       "not test_close_run_until_complete_not_deprecated and "
                        ;; Disable the following tests as they require
                        ;; networking.
                        "not TestDeflateBuffer and "
@@ -7761,3 +7769,20 @@ admin section of stores using an ActiveResource-like interface similar the
 ruby Shopify API gem.  The library makes HTTP requests to Shopify in order to
 list, create, update, or delete resources (e.g. Order, Product, Collection).")
     (license license:expat)))
+
+(define-public python-whatthepatch
+  (package
+    (name "python-whatthepatch")
+    (version "1.0.2")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "whatthepatch" version))
+              (sha256
+               (base32
+                "17zspm5sxhvggkdhwq4s0fzf4mkc825xshn734g2j2iy2xcylh65"))))
+    (build-system python-build-system)
+    (home-page "https://github.com/cscorley/whatthepatch")
+    (synopsis "Patch parsing and application")
+    (description
+     "This package provides a library to parse and apply patches.")
+    (license license:expat)))
diff --git a/gnu/packages/python-xyz.scm b/gnu/packages/python-xyz.scm
index 68d4ae8687..e71b921896 100644
--- a/gnu/packages/python-xyz.scm
+++ b/gnu/packages/python-xyz.scm
@@ -1211,13 +1211,13 @@ iotop, uptime, pidof, tty, taskset, pmap.")
 (define-public python-shapely
   (package
     (name "python-shapely")
-    (version "1.8.2")
+    (version "1.8.4")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Shapely" version))
        (sha256
-        (base32 "1dpbjw0w2l1r9s5drmi4cyr1yd5h2a4m9vip7qhy7mbg03azjajp"))))
+        (base32 "130rqd0czi128wm5pdn47v4m6czxd7pkzanbya8q48gsm8ffb5d1"))))
     (build-system python-build-system)
     (native-inputs
      (list python-cython python-matplotlib python-pytest
@@ -1766,6 +1766,26 @@ client-side scripting and application development around the NETCONF
 protocol.")
     (license license:asl2.0)))
 
+(define-public python-ncls
+  (package
+    (name "python-ncls")
+    (version "0.0.65")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "ncls" version))
+              (sha256
+               (base32
+                "1wx06xqknd2r98w8z93f47g5dpxzn92kamhj8vkq0nj569hf7cg1"))))
+    (build-system python-build-system)
+    (propagated-inputs (list python-numpy))
+    (home-page "https://github.com/endrebak/ncls")
+    (synopsis "Nested containment list data structure")
+    (description
+     "This package provides a wrapper for the nested containment list data
+structure.  It is a static interval-tree that is fast for both construction
+and lookups.")
+    (license license:bsd-3)))
+
 (define-public python-license-expression
   (package
     (name "python-license-expression")
@@ -1792,13 +1812,13 @@ conventions and aliases in the same expression.")
 (define-public python-wand
   (package
     (name "python-wand")
-    (version "0.6.7")
+    (version "0.6.10")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Wand" version))
        (sha256
-        (base32 "1nxn7zvbnfgk4kkxajbzglcjpbgr84ilhnxm990nifjxqb61ph7b"))))
+        (base32 "0mywzs235skwq670c80achrd34kangwy24793k1nij3651zllgrp"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -1814,8 +1834,7 @@ conventions and aliases in the same expression.")
     (home-page "https://docs.wand-py.org/")
     (synopsis "MagickWand API binding for Python")
     (description
-     "Wand is a ctypes-based binding for the C API of ImageMagick's MagickWand
-library.")
+     "Wand is a ctypes-based binding for ImageMagick's MagickWand library.")
     (license license:expat)))
 
 (define-public python-lockfile
@@ -1935,14 +1954,14 @@ other machines, such as over the network.")
 (define-public python-setuptools
   (package
     (name "python-setuptools")
-    (version "62.0.0")
+    (version "64.0.3")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "setuptools" version))
        (sha256
         (base32
-         "0sm8n6y6q640cpac9wjyggidbgi4n9la7vs7pwriyvhvgzccp6br"))
+         "1sllqf0bhsl2yilf1w0xnlz0r4yaksmwaj0ap91zdc6kgbigdjiv"))
        (modules '((guix build utils)))
        (snippet
         ;; Remove included binaries which are used to build self-extracting
@@ -2414,7 +2433,7 @@ for additional processing.")
          "1cagg06vfph864s6l5jb0zqliwxh647bki8j6lf4a4qrv40jnhs8"))))
     (build-system python-build-system)
     (propagated-inputs
-     (list python-mock python-nose python-six python-unittest2))
+     (list python-mock python-nose python-six))
     (native-inputs
      (list python-coverage))
     (home-page "https://github.com/celery/case")
@@ -3454,14 +3473,14 @@ interfaces.")
 (define-public python-click
   (package
     (name "python-click")
-    (version "8.1.2")
+    (version "8.1.3")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "click" version))
        (sha256
         (base32
-         "0whs38a2i0561kwbgigs6vic9r0a1887m2v1aw3rmv6r2kz0g5s7"))))
+         "13kvp8visj5xh9d43brnda6q0kc1s40flxa5cw0p0a9hzf5dr0kn"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
@@ -3850,21 +3869,14 @@ JavaScript-like message boxes.  Types of dialog boxes include:
   (package
     (name "python-pympler")
     (home-page "https://pythonhosted.org/Pympler/")
-    (version "0.9")
+    (version "1.0.1")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "Pympler" version))
               (sha256
                (base32
-                "0ivfw2k86nbw9ck9swidl4422w7bhjldxwj90a4sy5r1cbgygjzj"))))
+                "1ynkqpv2akldmvkll5vh5zhwj433s1d59iv0f76lygyak4silgwr"))))
     (build-system python-build-system)
-    (arguments
-     `(#:phases (modify-phases %standard-phases
-                  (delete 'check)
-                  (add-after 'install 'check
-                    (lambda* (#:key inputs outputs #:allow-other-keys)
-                      (add-installed-pythonpath inputs outputs)
-                      (invoke "python" "setup.py" "test"))))))
     (synopsis "Measure, monitor and analyze memory behavior")
     (description
      "Pympler is a development tool to measure, monitor and analyze
@@ -4232,7 +4244,6 @@ logging and tracing of the execution.")
      (list python-lockfile))
     (native-inputs
      (list python-coverage
-           python-unittest2
            python-testtools
            python-testscenarios
            python-twine
@@ -4873,6 +4884,60 @@ utility, a static analysis tool (linter) for Robot Framework source files.")
     (description "Pabot is a parallel executor for Robot Framework tests.")
     (license license:asl2.0)))
 
+(define-public python-sshtunnel
+  (package
+    (name "python-sshtunnel")
+    (version "0.4.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "sshtunnel" version))
+              (sha256
+               (base32
+                "1z7rdgpp9m36ysh9pfzrn3vyiaj05bkjvcjdhj8vz0fvfjkhxjz7"))))
+    (build-system python-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests? (invoke "pytest" "-vv" "tests")))))))
+    (propagated-inputs (list python-paramiko))
+    (native-inputs (list openssh python-pytest))
+    (home-page "https://github.com/pahaz/sshtunnel")
+    (synopsis "Python SSH tunnels library")
+    (description "@code{sshtunnel} is a Python module for easily creating SSH
+tunnels in the background, using Python.")
+    (license license:expat)))
+
+(define-public python-robotframework-sshtunnellibrary
+  (package
+    (name "python-robotframework-sshtunnellibrary")
+    (version "1.0.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/C-Squad/robotframework-sshtunnellibrary")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1vkkmkb8iql13xpbyj4hvnnmfgzqlr8rffgryp2082cadb3w7xrd"))))
+    (build-system python-build-system)
+    (arguments
+     (list #:phases #~(modify-phases %standard-phases
+                        (replace 'check
+                          (lambda* (#:key tests? #:allow-other-keys)
+                            (when tests?
+                              (invoke "python" "-m" "unittest"
+                                      "discover" "-s" "test")))))))
+    (propagated-inputs (list python-robotframework python-sshtunnel))
+    (home-page "https://github.com/C-Squad/robotframework-sshtunnellibrary")
+    (synopsis "Alternative RobotFramework library for SSH tunnels")
+    (description "SSHTunnelLibrary is an alternative RobotFramework
+library (to the more official one that comes from the
+@code{robotframework-sshlibrary} package) to support SSH tunnels.")
+    (license license:asl2.0)))
+
 (define-public python-robotframework-stacktrace
   (package
     (name "python-robotframework-stacktrace")
@@ -5503,13 +5568,13 @@ provides additional functionality on the produced Mallard documents.")
 (define-public python-cython
   (package
     (name "python-cython")
-    (version "0.29.30")
+    (version "0.29.32")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Cython" version))
        (sha256
-        (base32 "1qzrcnla3fg4fmf7ncvxhr1y35gvya1ybj12jjwshvzym0nvcd92"))))
+        (base32 "1xqsihpqnfal29nb5kmw8z71nd4jbsnbz7p3lkr094xpb13wycw7"))))
     (build-system python-build-system)
     ;; we need the full python package and not just the python-wrapper
     ;; because we need libpython3.3m.so
@@ -5644,6 +5709,8 @@ with Python.  It contains among other things: a powerful N-dimensional array
 object, sophisticated (broadcasting) functions, tools for integrating C/C++
 and Fortran code, useful linear algebra, Fourier transform, and random number
 capabilities.")
+    (properties
+     '((upstream-name . "numpy")))
     (license license:bsd-3)))
 
 (define-public python-numpy-documentation
@@ -5723,7 +5790,7 @@ capabilities.")
            python-pandas
            python-pydata-sphinx-theme
            python-scipy                 ;used by matplotlib
-           python-sphinx
+           python-sphinx-4
            python-sphinx-panels
            texinfo
            texlive-bin
@@ -8268,8 +8335,11 @@ module with a few extra procedures.")
               (lambda* (#:key tests? #:allow-other-keys)
                 (when tests?
                   ;; Do not test the myproject.toml build as it tries to pull
-                  ;; dependencies from the Internet.
-                  (invoke "pytest" "-vv" "-k" "not project"))))))))
+                  ;; dependencies from the Internet.  Do not run a test that
+                  ;; tries to emulate a broken proprietary CI set-up, fails
+                  ;; to do so correctly, and then throws an error about it.
+                  (invoke "pytest" "-vv" "-k"
+                          "not project and not test_function_throttled"))))))))
     (native-inputs
      (modify-inputs
          (package-native-inputs python-jaraco-functools-bootstrap)
@@ -14122,13 +14192,13 @@ minimal and fast API targeting the following uses:
 (define-public python-icalendar
   (package
     (name "python-icalendar")
-    (version "4.0.7")
+    (version "4.1.0")
     (source (origin
              (method url-fetch)
              (uri (pypi-uri "icalendar" version))
              (sha256
               (base32
-               "19574j3jwssm2dkqykih4568xqfgjsa3hcd79yl5s2vfys3qvh8g"))))
+               "15dkq42rkqjdi17rpvmd1plnbwn4daby0nk1s1c3xi7w5v0bfj4p"))))
     (build-system python-build-system)
     (propagated-inputs
      (list python-dateutil python-pytz))
@@ -17216,13 +17286,13 @@ addresses, and phone numbers.")
 (define-public python-pyaml
   (package
     (name "python-pyaml")
-    (version "18.11.0")
+    (version "21.10.1")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "pyaml" version))
               (sha256
                (base32
-                "0fi604ix8lbpj1266q7js6szm771saprdzzcdwmj43wy83694qmr"))))
+                "10w3frzqir5sbpglc9bwb8w414dsivmcvji07yxy61mz2gp9ylf6"))))
     (build-system python-build-system)
     (native-inputs
      (list python-unidecode))
@@ -18104,9 +18174,17 @@ JSON) codec.")
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (replace 'check
+         (add-after 'unpack 'remove-test-hypothesis-deadlines
            (lambda _
-             (invoke "pytest" "-v"))))))
+             (substitute* "tests/test_utils.py"
+               (("from hypothesis import given")
+                "from hypothesis import given, settings")
+               (("( +)@given" all spaces)
+                (string-append spaces "@settings(deadline=None)\n" all)))))
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (invoke "pytest" "-v")))))))
     (native-inputs
      (list python-hypothesis python-pytest-cov python-pytest-mock
            python-pytest))
@@ -18116,13 +18194,13 @@ JSON) codec.")
     (synopsis "Natural sorting for python and shell")
     (description
      "Natsort lets you apply natural sorting on lists instead of
-     lexicographical.  If you use the built-in @code{sorted} method in python
-     on a list such as @code{[@code{a20}, @code{a9}, @code{a1}, @code{a4},
-                                   @code{a10}]}, it would be returned as @code{[@code{a1}, @code{a10}, @code{a20},
-                                   @code{a4}, @code{a9}]}.  Natsort provides a function @code{natsorted} that
-     identifies numbers and sorts them separately from strings.  It can also sort
-     version numbers, real numbers, mixed types and more, and comes with a shell
-     command @command{natsort} that exposes this functionality in the command line.")
+lexicographical.  If you use the built-in @code{sorted} method in python on a
+list such as @code{[@code{a20}, @code{a9}, @code{a1}, @code{a4}, @code{a10}]},
+it would be returned as @code{[@code{a1}, @code{a10}, @code{a20}, @code{a4},
+@code{a9}]}.  Natsort provides a function @code{natsorted} that identifies
+numbers and sorts them separately from strings.  It can also sort version
+numbers, real numbers, mixed types and more, and comes with a shell command
+@command{natsort} that exposes this functionality in the command line.")
     (license license:expat)))
 
 (define-public glances
@@ -18302,40 +18380,40 @@ JSON) codec.")
 (define-public python-setproctitle
   (package
     (name "python-setproctitle")
-    (version "1.1.10")
+    (version "1.3.2")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "setproctitle" version))
        (sha256
         (base32
-         "163kplw9dcrw0lffq1bvli5yws3rngpnvrxrzdw89pbphjjvg0v2"))))
+         "1zbp6kyzfbrmbh9j3idai0mnpa28zn5db3k5l07jc3c3gj89gyxr"))))
     (build-system python-build-system)
     (arguments
      '(#:phases
        (modify-phases %standard-phases
          (replace 'check
-           (lambda _
+           (lambda* (#:key tests? #:allow-other-keys)
              (setenv "PYTHON" (or (which "python3") (which "python")))
              (setenv "PYCONFIG" (if (which "python3-config")
                                     "python3-config --embed"
                                     "python-config"))
-             (setenv "CC" "gcc")
-             ;; No need to extend PYTHONPATH to find the built package, since
-             ;; the Makefile will build anyway
-             (invoke "make" "check"))))))
+             (substitute* "tests/conftest.py"
+               (("cc") "gcc"))
+             (when tests?
+               (invoke "pytest" "tests/")))))))
     (native-inputs
-     (list procps))             ; required for tests
+     (list procps python-pytest))   ; required for tests
     (home-page "https://github.com/dvarrazzo/py-setproctitle")
     (synopsis
      "Setproctitle implementation for Python to customize the process title")
     (description "The library allows a process to change its title (as displayed
-                                                                       by system tools such as ps and top).
+by system tools such as @code{ps} and @code{top}).
 
-     Changing the title is mostly useful in multi-process systems, for
-     example when a master process is forked: changing the children's title
-     allows identifying the task each process is busy with.  The technique
-     is used by PostgreSQL and the OpenSSH Server for example.")
+Changing the title is mostly useful in multi-process systems, for example when a
+master process is forked: changing the children's title allows identifying the
+task each process is busy with.  The technique is used by PostgreSQL and the
+OpenSSH Server for example.")
     (license license:bsd-3)))
 
 (define-public python-validictory
@@ -19078,7 +19156,15 @@ from the header, as well as section details and data available.")
               (uri (pypi-uri "m2r" version))
               (sha256
                (base32
-                "16gdm8i06jjmlpvckpfmlkr4693dh0vs192vgsqn84fsdkbbm45z"))))
+                "16gdm8i06jjmlpvckpfmlkr4693dh0vs192vgsqn84fsdkbbm45z"))
+              (modules '((guix build utils)))
+              (snippet
+               ;; Adjust test regex for Python 3.10 compatibility.
+               ;; Taken from upstream pull request:
+               ;; https://github.com/miyakogi/m2r/pull/62
+               '(substitute* "tests/test_cli.py"
+                  (("self.assertIn\\('optional arguments:', message\\)")
+                   "self.assertRegex(message, r'option(s|al arguments):')")))))
     (build-system python-build-system)
     (propagated-inputs
      (list python-docutils python-mistune))
@@ -19423,14 +19509,21 @@ builds partial trees by inspecting living objects.")
 (define-public python-mando
   (package
     (name "python-mando")
-    (version "0.6.4")
+    (version "0.7.1")
     (source (origin
               (method url-fetch)
               (uri (pypi-uri "mando" version))
               (sha256
                (base32
-                "0q6rl085q1hw1wic52pqfndr0x3nirbxnhqj9akdm5zhq2fv3zkr"))))
+                "001mikga36i811pbc95rb45m2kzivkx4xb0fn3pzl4xnnjcskfhq"))))
     (build-system python-build-system)
+    (arguments
+     (list #:phases
+           #~(modify-phases %standard-phases
+               (replace 'check
+                 (lambda* (#:key tests? #:allow-other-keys)
+                   (when tests?
+                     (invoke "pytest" "-vv")))))))
     (propagated-inputs
      (list python-rst2ansi python-six))
     (native-inputs
@@ -19757,6 +19850,8 @@ while only declaring the test-specific fields.")
                       (substitute* "setup.py"
                         ((".*'future'.*")
                          "")
+                        (("mando>=0\\.6,<0\\.7")
+                         "mando>=0.6")
                         (("colorama==0.4.1")
                          "colorama>=0.4.1"))))
                   (replace 'check
@@ -20833,31 +20928,29 @@ Rust Python extensions implemented with @code{PyO3} or @code{rust-cpython}.")
 (define-public python-pyclipper
   (package
     (name "python-pyclipper")
-    (version "1.1.0.post3")
+    (version "1.3.0.post3")
     (source
      (origin
        (method url-fetch)
-       (uri (pypi-uri "pyclipper" version ".zip"))
+       (uri (pypi-uri "pyclipper" version))
        (sha256
-        (base32 "164yksvqwqvwzh8f8lq92asg87hd8rvcy2xb5vm4y4ccvd5xgb7i"))
+        (base32 "0vqzbmq2di1jaj6230m5i1ld0mg6wdb1c6r6i5zli54varavr7v3"))
       (modules '((guix build utils)))
       (snippet
        '(begin
           ;; This file is generated by Cython.
-          (delete-file "pyclipper/pyclipper.cpp") #t))))
+          (delete-file "src/pyclipper/_pyclipper.cpp") #t))))
     (build-system python-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
          (add-before 'build 'cythonize-sources
            (lambda _
-             (with-directory-excursion "pyclipper"
-               (invoke "cython" "--cplus" "pyclipper.pyx")))))))
-    (propagated-inputs
-     (list python-setuptools-scm-git-archive))
+             (with-directory-excursion "src/pyclipper"
+               (invoke "cython" "--cplus" "_pyclipper.pyx")))))))
     (native-inputs
-     (list python-cython python-pytest python-pytest-runner
-           python-unittest2 unzip))
+     (list python-cython python-setuptools-scm
+           python-pytest python-pytest-runner))
     (home-page "https://github.com/greginvm/pyclipper")
     (synopsis "Wrapper for Angus Johnson's Clipper library")
     (description
@@ -21497,53 +21590,69 @@ based on the CPython 2.7 and 3.7 parsers.")
 (define-public python-typer
   (package
     (name "python-typer")
-    (version "0.3.2")
+    (version "0.6.1")
     (source
      (origin
-       ;; Building `python-typer` from the git repository requires the `flit-core`
-       ;; Python package that is not installed by `python-flit`.
-       (method url-fetch)
-       (uri (pypi-uri "typer" version))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/tiangolo/typer")
+             (commit version)))
+       (file-name (git-file-name name version))
        (sha256
-        (base32 "00v3h63dq8yxahp9vg3yb9r27l2niwv8gv0dbds9dzrc298dfmal"))))
+        (base32 "1knv353qhkl2imav3jfp6bgq47m8wkkqhq1dzmqg2sv8rsy7zgl7"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
-       (modify-phases %standard-phases
-         ;; Unfortunately, this doesn't seem to be enough to fix these two
-         ;; tests, but we'll patch this anyway.
-         (add-after 'unpack 'patch-shell-reference
-           (lambda _
-             (substitute* "tests/test_completion/test_completion.py"
-               (("\"bash\"") (string-append "\"" (which "bash") "\""))
-               (("\"/bin/bash\"") (string-append "\"" (which "bash") "\"")))))
-         (replace 'check
-           (lambda* (#:key tests? #:allow-other-keys)
-             (when tests?
-               (setenv "HOME" "/tmp") ; some tests need it
-
-               ;; This is for completion tests
-               (with-output-to-file "/tmp/.bashrc" (lambda _ (display "# dummy")))
-
-               (setenv "GUIX_PYTHONPATH"
-                       (string-append (getcwd) ":"
-                                      (getenv "GUIX_PYTHONPATH")))
-               (let ((disabled-tests (list "test_show_completion"
-                                           "test_install_completion")))
-                 (invoke "python" "-m" "pytest" "tests/"
-                         "-k"
-                         (string-append "not "
-                                        (string-join disabled-tests
-                                                     " and not "))))))))))
+       ,#~(modify-phases %standard-phases
+            ;; Unfortunately, this doesn't seem to be enough to fix these two
+            ;; tests, but we'll patch this anyway.
+            (add-after 'unpack 'patch-shell-reference
+              (lambda _
+                (substitute* "tests/test_completion/test_completion.py"
+                  (("\"bash\"") (string-append "\"" (which "bash") "\""))
+                  (("\"/bin/bash\"")
+                   (string-append "\"" (which "bash") "\"")))))
+            (replace 'build
+              (lambda _
+                (invoke "flit" "build")))
+            (replace 'install
+              (lambda* (#:key inputs outputs #:allow-other-keys)
+                (add-installed-pythonpath inputs outputs)
+                (for-each
+                 (lambda (wheel)
+                   (format #true wheel)
+                   (invoke "python" "-m" "pip" "install"
+                           wheel (string-append "--prefix=" #$output)))
+                 (find-files "dist" "\\.whl$"))))
+            (replace 'check
+              (lambda* (#:key tests? #:allow-other-keys)
+                (when tests?
+                  (setenv "HOME" "/tmp") ; some tests need it
+
+                  ;; This is for completion tests
+                  (with-output-to-file "/tmp/.bashrc"
+                    (lambda _ (display "# dummy")))
+
+                  (setenv "GUIX_PYTHONPATH"
+                          (string-append (getcwd) ":"
+                                         (getenv "GUIX_PYTHONPATH")))
+                  (let ((disabled-tests (list "test_show_completion"
+                                              "test_install_completion")))
+                    (invoke "python" "-m" "pytest" "tests/"
+                            "-k"
+                            (string-append "not "
+                                           (string-join disabled-tests
+                                                        " and not "))))))))))
     (propagated-inputs
      (list python-click))
     (native-inputs
-     (list python-coverage python-pytest python-shellingham))
+     (list python-coverage python-flit python-pytest python-rich
+           python-shellingham))
     (home-page "https://github.com/tiangolo/typer")
     (synopsis
-      "Typer builds CLI based on Python type hints")
+     "Typer builds CLI based on Python type hints")
     (description
-      "Typer is a library for building CLI applications.  It's based on
+     "Typer is a library for building CLI applications.  It's based on
 Python 3.6+ type hints.")
     ;; MIT license
     (license license:expat)))
@@ -23332,7 +23441,6 @@ Features:
      (list python-cfgv
            python-identify
            python-importlib-metadata
-           python-importlib-resources
            python-nodeenv
            python-pyyaml
            python-toml
@@ -29717,8 +29825,6 @@ fashion.")
                    (substitute* "prober.py"
                      (("cmd = .cc")
                       (string-append "cmd = \"" #$(cc-for-target)))))))))
-    (native-inputs
-     (list python-unittest2))
     (home-page "http://semanchuk.com/philip/posix_ipc/")
     (synopsis "POSIX IPC primitives for Python")
     (description
@@ -30395,7 +30501,7 @@ window managers.")
 (define-public i3-autotiling
   (package
     (name "i3-autotiling")
-    (version "1.6")
+    (version "1.6.1")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -30404,7 +30510,7 @@ window managers.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1hjlvg7095s322gb43r9g7mqlsy3pj13l827jpnbn5x0918rq9rr"))))
+                "1m8k3g83n2n1xws89dh20f3sy6753wvip9dzf6bssv2cz9ll7406"))))
     (build-system python-build-system)
     (arguments (list #:tests? #f))      ;no tests
     (native-inputs (list python-wheel))
@@ -30482,3 +30588,91 @@ both.")
 package.  It can be used by type-checking tools like mypy, PyCharm, pytype
 etc. to check code that uses @code{orjson}.")
     (license license:asl2.0)))
+
+(define-public python-nanoid
+  ;; There are no tests on PyPi.
+  (let ((commit "061f9a598f310b0e2e91b9ed6ce725a22770da64")
+        (revision "0"))
+  (package
+    (name "python-nanoid")
+    (version "2.0.0")
+      (source
+       (origin
+         (method git-fetch)
+         (uri
+          (git-reference
+           (url "https://github.com/puyuan/py-nanoid")
+           (commit commit)))
+         (file-name (git-file-name name commit))
+         (sha256
+          (base32 "0y1bcw0h27g8rkqq7cp33ywn0i0lp0q3rjixzkh4191y1dp9yf8s"))))
+    (build-system python-build-system)
+    (native-inputs (list python-pytest))
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? inputs outputs #:allow-other-keys)
+             (when tests?
+               (invoke "pytest")))))))
+    (home-page "https://github.com/puyuan/py-nanoid")
+    (synopsis "Unique string ID generator")
+    (description
+     "This package provides a tiny, secure, URL-friendly, unique string ID
+generator for Python.")
+    (license license:expat))))
+
+(define-public python-misskey
+  (package
+    (name "python-misskey")
+    (version "4.1.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/YuzuRyo61/Misskey.py")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0rma8pdsjsy00cg76q6q4qki4xpldykmz1m6dl3w2bjjxfhlbaz5"))))
+    (build-system python-build-system)
+    (arguments (list #:tests? #f))      ;needs network
+    (propagated-inputs (list python-requests))
+    (home-page "https://misskeypy.readthedocs.io")
+    (synopsis "Python bindings for Misskey's API")
+    (description
+     "This package provides access to Misskey's API.  Misskey is a SNS
+platform using the ActivityPub protocol.")
+    (license license:expat)))
+
+(define-public python-lief
+  (package
+    (name "python-lief")
+    (version "0.12.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/lief-project/LIEF")
+                    (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1xzbh3bxy4rw1yamnx68da1v5s56ay4g081cyamv67256g0qy2i1"))))
+    (build-system python-build-system)
+    (native-inputs (list cmake))
+    (arguments
+     (list
+      #:tests? #f                  ;needs network
+      #:phases #~(modify-phases %standard-phases
+                   (replace 'build
+                     (lambda _
+                       (invoke
+                        "python" "setup.py" "--sdk" "build"
+                        (string-append
+                         "-j" (number->string (parallel-job-count)))))))))
+    (home-page "https://github.com/lief-project/LIEF")
+    (synopsis "Library to instrument executable formats")
+    (description
+     "@code{python-lief} is a cross platform library which can parse, modify
+and abstract ELF, PE and MachO formats.")
+    (license license:asl2.0)))
diff --git a/gnu/packages/qt.scm b/gnu/packages/qt.scm
index 2e0ade2376..cc41338b74 100644
--- a/gnu/packages/qt.scm
+++ b/gnu/packages/qt.scm
@@ -262,7 +262,7 @@ other text such as code.  The syntax uses the syntax of the Django template
 system, and the core design of Django is reused in Grantlee.")
     (license license:lgpl2.1+)))
 
-(define (qt5-urls component version)
+(define (qt-urls component version)
   "Return a list of URLs for VERSION of the Qt5 COMPONENT."
   ;; We can't use a mirror:// scheme because these URLs are not exact copies:
   ;; the layout differs between them.
@@ -290,7 +290,7 @@ system, and the core design of Django is reused in Grantlee.")
     (version "5.15.5")
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "1p2fa94m1y8qzhdfi2d7dck93qh1lgsinibwl1wy92bwmacwfhhc"))
@@ -543,7 +543,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
     (version "6.3.1")
     (source (origin
               (inherit (package-source qtbase-5))
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "00sfya41ihqb0zwg6wf1kiy02iymj6mk584hhk2c4s94khfl4r0a"))
@@ -825,7 +825,7 @@ developers using C++ or QML, a CSS & JavaScript like language.")
     (version "6.3.1")
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "1zbcaswpl79ixcxzj85qzjq73962s4c7316pibwfrskqswmwcgm4"))))
@@ -855,7 +855,7 @@ came with the @{qtgraphicaleffects} Qt 5 package.")
     (version "5.15.5")
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "0cdhmhxngv4y7kl5vbcii4l4anbz0hj7dvhlddy1agyl19j9xky4"))))
@@ -923,7 +923,7 @@ HostData=lib/qt5
     (version "6.3.1")
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "1xvxz2jfpr1al85rhwss7ji5vkxa812d0b888hry5f7pwqcg86bv"))))
@@ -954,7 +954,7 @@ HostData=lib/qt5
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "1xjb2z2h1ajw7z9cwq8djpdvjwalpnmirwcwrlbjqv5r4ghmi82a"))
@@ -981,7 +981,7 @@ support for MNG, TGA, TIFF and WBMP image formats.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0wxsrnnkkn68myy211rfz98brs7j3qmx3hmy097vh5avgsmw11bn"))))
@@ -1001,7 +1001,7 @@ from within Qt 5.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "065vj1gk5i4cg0f9spksyb9ps4px0vssx262y77aakvw408vfmq5"))))
@@ -1029,7 +1029,7 @@ xmlpatternsvalidator.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0ji5131g7h2mrgxw1wxc5mcvmsn3fbw64j28gzpa25gv3vcnkhaw"))))
@@ -1069,7 +1069,7 @@ with JavaScript and C++.")))
     ;; TODO: Package 'masm' and unbundle from sources.
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "1s268fha3650dn1lqxf8jfa07wxpw09f6p7rjyiwq3w24d0nkrq3"))))
@@ -1196,7 +1196,7 @@ integrate QML code with JavaScript and C++.")
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0b2dnxw1rjbp1srhgns148cwl99f50mx29588dal3avv0f73s597"))))
@@ -1214,7 +1214,7 @@ with Bluetooth and NFC.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0f120rfqnmlffjhrm5jbpipk1qsbzp1a2v3q8gz94hz6n9dqpav6"))))
@@ -1237,7 +1237,7 @@ consume data received from the server, or both.")))
     (version "6.3.1")
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "06hj0pkdzjicmbiinjp1dk1ziz8cb3fgcwy7a0dxxjvzr680v64z"))))
@@ -1276,7 +1276,7 @@ consume data received from the server, or both.")
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0zlhm4js02niibb23rw87wf4ik0gy4ai08fwprnwy7zf4rm1ss3d"))))
@@ -1305,7 +1305,7 @@ recognition API for devices.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0q76iy1frcgm85mid17lh4p6gnn04n19n6zklgpv4w3md1ng97xw"))
@@ -1349,7 +1349,7 @@ set of plugins for interacting with pulseaudio and GStreamer.")))
     (version "6.3.1")
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               ;; Note: the source bundles *patched* glslang and SPIRV-Cross
               ;; sources.
               (sha256
@@ -1378,7 +1378,7 @@ Vulkan, OpenGL and other main graphic APIs.")
     (version "6.3.1")
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "0dkk3lmzi2fs13cnj8q1lpcs6gghj219826gkwnzyd6nmlm280vy"))
@@ -1443,7 +1443,7 @@ set of plugins for interacting with pulseaudio and GStreamer.")
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (patches (search-patches "qtwayland-gcc-11.patch"))
              (sha256
               (base32
@@ -1491,7 +1491,7 @@ compositor libraries.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0xg2djwhrj5jqamawlp75g70nmwbp2ph2hh1pm45s36jkxm0k7al"))))
@@ -1520,7 +1520,7 @@ interacting with serial ports from within Qt.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "180gm1jvqfn0h3251zafdd1wd3af00phwaa5qljsbrj6s6ywj79j"))))
@@ -1549,7 +1549,7 @@ and others.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "1w8mcpdqlphgg3a6yfq18liwlj2nkwrafv0n80h242x5l2mk3ljf"))))
@@ -1568,7 +1568,7 @@ popular web engines, Qt WebKit 2 and Qt WebEngine.")))
     (version "6.3.1")
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "0s16zx3qn3byldvhmsnwijm8rmizk8vpqj7fnwhjg6c67z10m8ma"))))
@@ -1605,7 +1605,7 @@ application).")
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "1m0p4ssykw07lbip2qyv6w34f8ng13bxb63j0w446f5w0492nn9f"))))
@@ -1633,7 +1633,7 @@ OpenGL ES 2.0 and can be used in HTML5 canvas elements")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0arwaky3jy5ql3z4d8f7k7diidzb1kncdans7pn50hsa1bzacfal"))))
@@ -1652,7 +1652,7 @@ native APIs where it makes sense.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0mlhhhcxx3gpr9kh04c6fljxcj50c2j21r0wb9f7d7nk4flip7b2"))))
@@ -1678,7 +1678,7 @@ positioning and geolocation plugins.")))
     (version "6.3.1")
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "1x8wmc6gwmxk92zjcsrbhrbqbfvnk7302ggghld5wk8jk5lsf2vl"))))
@@ -1710,7 +1710,7 @@ plugin for Adobe After Effects.")
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0v7wkzq9i8w3qrw0z8al7lb6clr57lfisyb1fm9cnhi73fvph1vd"))))
@@ -1732,7 +1732,7 @@ that helps in Qt development.")))
     (version "6.3.1")
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "1h96w4bzkbd80vr7lh6hnypdlmbzc1y52c2zrqzvkgm3587pa4n4"))))
@@ -1759,7 +1759,7 @@ that helps in Qt development.")
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "17yk0p8ci47xlfpllc17arlycng47wrnnskimskzz85bspabc8pm"))
@@ -1779,7 +1779,7 @@ ECMAScript and Qt.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0mjw25wcgd2bvjz9rr4qjydb423c63615rcx1vws4jmydqdihssr"))))
@@ -1799,7 +1799,7 @@ can be used to build complete interfaces in Qt Quick.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "1cxg4ml07k1zcyi5m4lx06sz8f5l67isb5vhk7nakxm0wnn7p8y4"))))
@@ -1826,7 +1826,7 @@ not available.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0xznn5zqp6xrqfgl54l8cig9asqf9m2hz0p3ga514rh8spmdazr3"))))
@@ -1849,7 +1849,7 @@ coloring, and many more.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0wa4d8f025hlp4bmdzdy5wcahm9wjg6bkwig8dpw9nrsj3idz5b0"))))
@@ -1875,7 +1875,7 @@ and mobile applications targeting TV-like form factors.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0xf5mqsrw16h8xjglymgfc8qg2qa5bi4fgdl4j3dkhvvpr7vrphp"))
@@ -1887,7 +1887,7 @@ and mobile applications targeting TV-like form factors.")))
                  (substitute* "tests/auto/auto.pro"
                    (("scion") "#"))))))
     (arguments
-     (substitute-keyword-arguments (package-arguments qtsvg)
+     (substitute-keyword-arguments (package-arguments qtsvg-5)
        ((#:tests? _ #f) #f))) ; TODO: Enable the tests
     (inputs
      (list qtbase-5 qtdeclarative-5))
@@ -1904,7 +1904,7 @@ also contains functionality to support data models and executable content.")))
     (version "6.3.1")
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "0v78wamvdw02kf9rq7m5v24q2g6jmgq4ch0fnfa014p1r978wy06"))))
@@ -1934,7 +1934,7 @@ information and perform area based monitoring.")
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "04z6mwzn73gg56hgs7gividinfgndx4kmcnp7w6h3wamrdlkfdx7"))))
@@ -1950,7 +1950,7 @@ purchasing goods and services.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0y051i1837bfybkf8cm7cx8k5wjmbi47pxawaaz6wm0hd2z5b4qi"))))
@@ -1979,7 +1979,7 @@ selecting one of the charts themes.")
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0sczwqlc36jdywf7bqxz0hm6mr7fn8p1fsnc33jliiqzn9yrg77x"))))
@@ -2002,7 +2002,7 @@ customized by using themes or by adding custom items and labels to them.")
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0c7mz715rlpg0cqgs6s0aszmslyamkhnpamc1iij6i571sj5j2f1"))))
@@ -2018,7 +2018,7 @@ implementation of OAuth and OAuth2 authenticathon methods for Qt.")))
     (version "6.3.1")
     (source (origin
               (method url-fetch)
-              (uri (qt5-urls name version))
+              (uri (qt-urls name version))
               (sha256
                (base32
                 "0apvsb2ip1m3kw8vi9spvf6f6q72ys8vr40rpyysi7shsjwm83yn"))))
@@ -2038,7 +2038,7 @@ implementation of OAuth and OAuth2 authenticathon methods for Qt.")
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "1m0xcqlbxsfn0cd4ajin1h3i4l51dajmkw91v0r4a61xi14i0kks"))))
@@ -2070,7 +2070,7 @@ processes or computers.")))
     (version "5.15.5")
     (source (origin
              (method url-fetch)
-             (uri (qt5-urls name version))
+             (uri (qt-urls name version))
              (sha256
               (base32
                "0xskp9dzjy5nqszygk8gwvjyiylgynx5sq3nk2vi3zwgfdh5jpm4"))))
@@ -2126,7 +2126,7 @@ using the Enchant spell-checking library.")
     (source
      (origin
        (method url-fetch)
-       (uri (qt5-urls name version))
+       (uri (qt-urls name version))
        (sha256
         (base32
          "0zahr9w6rqdxwh2whsgk3fhcszs7wa9j95lq4sqi8xzin2wcgl17"))
@@ -2504,7 +2504,7 @@ and binaries removed, and adds modular support for using system libraries.")
     (source
      (origin
        (method url-fetch)
-       (uri (qt5-urls name version))
+       (uri (qt-urls name version))
        (sha256
         (base32
          "0ivfsqd5c0cxsnssj6z37901cf6a47w50zaqgjiysvcm3ar36ymd"))
@@ -3202,14 +3202,14 @@ top of the PyQt bindings for Qt.  PyQt-builder is used to build PyQt itself.")
 (define-public python-qtpy
   (package
     (name "python-qtpy")
-    (version "2.0.1")
+    (version "2.2.0")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "QtPy" version))
        (sha256
           (base32
-           "13zbhnl2rm30xafwrzfwdb4mjp7gk4s9h2xagbf83pnjzczhgzdd"))))
+           "051rj10lbv2ny48lz34zhclcbdxxdbk4di2mdk91m9143w91npyq"))))
     (build-system python-build-system)
     (propagated-inputs (list python-packaging))
     (arguments
@@ -3629,7 +3629,7 @@ time Web content can be enhanced with native controls.")
 (define-public dotherside
   (package
     (name "dotherside")
-    (version "0.6.4")
+    (version "0.9.0")
     (source
      (origin
        (method git-fetch)
@@ -3639,11 +3639,12 @@ time Web content can be enhanced with native controls.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "09fz6v8rp28997f235yaifj8p4vvsyv45knc1iivgdvx7msgcd0m"))))
+         "13n2qb8q9jz4ihwlbs7y15lw90w9113gb1bgnb1dggpxkj64r953"))))
     (build-system cmake-build-system)
     (native-inputs
      (list qttools-5))
     (inputs
+     ;; TODO: Support Qt 6 (requires qtdeclarative of Qt6).
      (list qtbase-5 qtdeclarative-5))
     (home-page "https://filcuc.github.io/DOtherSide/index.html")
     (synopsis "C language library for creating bindings for the Qt QML language")
diff --git a/gnu/packages/radio.scm b/gnu/packages/radio.scm
index 0417abc5b3..520799b6d4 100644
--- a/gnu/packages/radio.scm
+++ b/gnu/packages/radio.scm
@@ -1415,14 +1415,14 @@ operators.")
 (define-public xnec2c
   (package
     (name "xnec2c")
-    (version "4.4.5")
+    (version "4.4.11")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://www.xnec2c.org/releases/xnec2c-v"
                            version ".tar.gz"))
        (sha256
-        (base32 "0v3qr16d42jri2vwwgrhhknaypdcjyn6ccdjpqfzr8zzr33z5pca"))))
+        (base32 "13ybnb1v1y9wjmj49s8ir2rpfsz7h8r9jwv0qd4if9wsn44jg29k"))))
     (build-system gnu-build-system)
     (native-inputs
      (list autoconf
@@ -2126,7 +2126,7 @@ voice formats.")
 (define-public sdrangel
   (package
     (name "sdrangel")
-    (version "6.18.1")
+    (version "7.6.2")
     (source
      (origin
        (method git-fetch)
@@ -2135,7 +2135,7 @@ voice formats.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "17lakqy55p481fa5w6ylh79xbd4rdiqk9y21vmi4m2r4wx893zw1"))))
+        (base32 "193iwwb4mbr29mlgaqb67j8214k10k2q0ky9fcl1ja52vmdzz71b"))))
     (build-system qt-build-system)
     (native-inputs
      (list doxygen graphviz pkg-config))
@@ -2165,6 +2165,8 @@ voice formats.")
            qtquickcontrols2-5
            qtserialport
            qtspeech
+           qtwebchannel-5
+           qtwebengine-5
            qtwebsockets-5
            rtl-sdr
            serialdv
diff --git a/gnu/packages/rsync.scm b/gnu/packages/rsync.scm
index 2b3673c90c..5f549ef234 100644
--- a/gnu/packages/rsync.scm
+++ b/gnu/packages/rsync.scm
@@ -39,14 +39,14 @@
 (define-public rsync
   (package
    (name "rsync")
-   (version "3.2.4")
+   (version "3.2.5")
    (source (origin
             (method url-fetch)
             (uri (string-append "https://rsync.samba.org/ftp/rsync/src/rsync-"
                                 version ".tar.gz"))
             (sha256
              (base32
-              "1lgslprbfirl9p9ca16syh0pzr4kgmrzdxwwayvb0ll0s0w1hxkg"))))
+              "1flsqq01dmbz0m2vwn4sj46zb9yxlrfc6xy3gf393xyd6lbd5i1a"))))
    (build-system gnu-build-system)
    (arguments
     `(#:configure-flags
diff --git a/gnu/packages/sagemath.scm b/gnu/packages/sagemath.scm
index bb80ff4db5..4542bc1c88 100644
--- a/gnu/packages/sagemath.scm
+++ b/gnu/packages/sagemath.scm
@@ -38,6 +38,7 @@
   #:use-module (gnu packages lisp)
   #:use-module (gnu packages multiprecision)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages popt)
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-xyz))
 
@@ -309,59 +310,28 @@ used as internal storage type for polynomial structures.")
 (define-public lcalc
   (package
     (name "lcalc")
-    (version "1.23")
-    ;; The original home page of the project has disappeared, as well as
-    ;; code hosted by the original author on Google Code. The latter has
-    ;; been copied to gitlab.com/sagemath and purportedly contains patches
-    ;; for a never released version 1.3, that supposedly follows 1.23.
-    ;; We use the tarball as well as the patches hosted inside the sage
-    ;; package system distributed with the sage tarball.
-    (source
-     (origin
-       (method url-fetch)
-       (uri (string-append "ftp://ftp.fu-berlin.de/unix/misc/sage/spkg/"
-                           "upstream/lcalc/lcalc-1.23.tar.bz2"))
-       (sha256
-        (base32
-         "1c6dsdshgxhqppjxvxhp8yhpxaqvnz3d1mlh26r571gkq8z2bm43"))
-       (patches (search-patches "lcalc-lcommon-h.patch"
-                                "lcalc-default-parameters-1.patch"
-                                "lcalc-default-parameters-2.patch"
-                                "lcalc-using-namespace-std.patch"))))
+    (version "2.0.5")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://gitlab.com/sagemath/lcalc")
+                    (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1rwyx292y3jbsp88wagn9nhl9z7wsnl2yrs5imxkbxq87pnrj5a7"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:tests? #f ;no tests
-       #:phases
-       (modify-phases %standard-phases
-         (delete 'configure)
-         (add-before 'build 'prepare-build
-           (lambda* (#:key outputs #:allow-other-keys)
-             (chdir "src")
-             (let ((out (assoc-ref outputs "out")))
-               (substitute* "Makefile"
-                 (("^INSTALL_DIR= /usr/local")
-                  (string-append "INSTALL_DIR=" out))))
-             #t))
-         (add-before 'install 'make-output-dirs
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out"))
-                    (bin (string-append out "/bin"))
-                    (lib (string-append out "/lib"))
-                    (include (string-append out "/include")))
-               (mkdir-p bin)
-               (mkdir-p lib)
-               (mkdir-p include))
-             #t)))))
-    ;; FIXME:
-    ;; We need to add pari-gp and probably pari related patches from the
-    ;; sage project, as well as uncomment the line setting PARI_DEFINE in
-    ;; the Makefile to get the full functionality of this package.
-    ;; For the time being, we hope that sage can be compiled without.
-    (synopsis "C++ library for L-functions")
-    (description "Lcalc computes L-functions, in particular the Riemann
-zeta function and its twists by quadratic characters.")
-    (license license:gpl2+)
-    (home-page "https://gitlab.com/sagemath/sage")))
+     (list #:configure-flags '(list "--with-pari")))
+    (inputs (list pari-gp))
+    (native-inputs (list autoconf automake libtool pkg-config gengetopt))
+    (home-page "https://gitlab.com/sagemath/lcalc")
+    (synopsis "C++ library for computing with L-functions")
+    (description
+     "Lcalc computes L-functions, in particular the Riemann zeta function,
+Dirichlet L-functions and L-functions attached to elliptic curves and
+modular forms.")
+    (license license:gpl2+)))
 
 (define-public ratpoints
   (package
diff --git a/gnu/packages/search.scm b/gnu/packages/search.scm
index 2d652f5789..84c4af68a3 100644
--- a/gnu/packages/search.scm
+++ b/gnu/packages/search.scm
@@ -330,7 +330,7 @@ for parsing HTML files.")
 (define-public fsearch
   (package
     (name "fsearch")
-    (version "0.1.4")
+    (version "0.2.2")
     (source
      (origin
        (method git-fetch)
@@ -339,7 +339,7 @@ for parsing HTML files.")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1lc6fhz4zhjbs29xn53v97dqrxwmqaplhky8sm9776ws6fyifwd7"))))
+        (base32 "126sg0fa96vxwinih120riqhj42jlxs2h1bp373r6ml7jwkvlyyn"))))
     (build-system meson-build-system)
     (native-inputs
      (list autoconf
@@ -350,7 +350,7 @@ for parsing HTML files.")
            libtool
            pkg-config))
     (inputs
-     (list gtk+ icu4c pcre))
+     (list gtk+ icu4c pcre2))
     (home-page "https://github.com/cboxdoerfer/fsearch")
     (synopsis "Fast file search utility")
     (description
@@ -506,14 +506,14 @@ conflict with slocate compatibility.")
 (define-public plocate
   (package
     (name "plocate")
-    (version "1.1.15")
+    (version "1.1.16")
     (source
      (origin
        (method url-fetch)
        (uri (string-append "https://plocate.sesse.net/download/"
                            "plocate-" version ".tar.gz"))
        (sha256
-        (base32 "0l7igd81acsha5l5mv2rv7n9j1bc4f6ys4hfvs3ii0cbv9a5k1fi"))))
+        (base32 "0ccn785yi069dgwp4j3g23zvvivzsf5chadbdr357qphkmpxy125"))))
     (build-system meson-build-system)
     (arguments
      `(#:configure-flags
diff --git a/gnu/packages/security-token.scm b/gnu/packages/security-token.scm
index 3242d630d8..ef11db8888 100644
--- a/gnu/packages/security-token.scm
+++ b/gnu/packages/security-token.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014, 2021 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2016, 2021 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2016, 2021, 2022 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2016 Mike Gerwitz <mtg@gnu.org>
 ;;; Copyright © 2016 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2017 Thomas Danckaert <post@thomasdanckaert.be>
@@ -891,15 +891,15 @@ phone is required.")
 (define-public libfido2
   (package
     (name "libfido2")
-    (version "1.9.0")
+    (version "1.11.0")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "git://github.com/Yubico/libfido2")
+             (url "https://github.com/Yubico/libfido2")
              (commit version)))
        (file-name (git-file-name name version))
-       (sha256 (base32 "12zy4cnlcffcb64lsx8198y09j1dwi0bcn9rr82q6i1k950yzd3p"))))
+       (sha256 (base32 "1nk4irmdg36930lgc892qmlmd4whz4fq37wknkdx5ap57i5x18i6"))))
     (native-inputs (list pkg-config))
     (inputs (list eudev libcbor openssl zlib))
     (build-system cmake-build-system)
diff --git a/gnu/packages/selinux.scm b/gnu/packages/selinux.scm
index 0000bc7bc9..b4f074b695 100644
--- a/gnu/packages/selinux.scm
+++ b/gnu/packages/selinux.scm
@@ -1,7 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2016, 2017, 2018 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
-;;; Copyright © 2019, 2020 Marius Bakke <mbakke@fastmail.com>
+;;; Copyright © 2019, 2020, 2022 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2021 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2021 Guillaume Le Vaillant <glv@posteo.net>
 ;;;
@@ -23,6 +23,7 @@
 (define-module (gnu packages selinux)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
+  #:use-module (guix gexp)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix utils)
@@ -49,41 +50,42 @@
 (define-public libsepol
   (package
     (name "libsepol")
-    (version "3.2")
+    (version "3.4")
     (source (origin
               (method git-fetch)
               (uri (git-reference
-                     (url "https://github.com/SELinuxProject/selinux")
-                     (commit version)))
+                    (url "https://github.com/SELinuxProject/selinux")
+                    (commit version)))
               (file-name (git-file-name "selinux" version))
               (sha256
                (base32
-                "03p3lmvrvkcvsmiczsjzhyfgxlxdkdyq0p8igv3s3hdak5n92jjn"))))
+                "1lcmgmfr0q7g5cwg6b7jm6ncw8cw6c1jblkm93v1g37bfhcgrqc0"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:tests? #f ; tests require checkpolicy, which requires libsepol
-       #:test-target "test"
-       #:make-flags
-       (let ((out (assoc-ref %outputs "out")))
-         (list (string-append "PREFIX=" out)
-               (string-append "SHLIBDIR=" out "/lib")
-               (string-append "MAN3DIR=" out "/share/man/man3")
-               (string-append "MAN5DIR=" out "/share/man/man5")
-               (string-append "MAN8DIR=" out "/share/man/man8")
-               (string-append "CFLAGS=-Wno-error")
-               (string-append "LDFLAGS=-Wl,-rpath=" out "/lib")
-               (string-append "CC=" ,(cc-for-target))))
-       #:phases
-       (modify-phases %standard-phases
-         (delete 'configure)
-         (add-after 'unpack 'enter-dir
-           (lambda _ (chdir ,name)))
-         (add-after 'enter-dir 'portability
-           (lambda _
-             (substitute* "src/ibpkeys.c"
-               (("#include \"ibpkey_internal.h\"" line)
-                (string-append line "\n#include <inttypes.h>\n"))
-               (("%#lx") "%#\" PRIx64 \"")))))))
+     (list
+      #:tests? #f         ; tests require checkpolicy, which requires libsepol
+      #:test-target "test"
+      #:make-flags
+      #~(let ((out #$output))
+          (list (string-append "PREFIX=" out)
+                (string-append "SHLIBDIR=" out "/lib")
+                (string-append "MAN3DIR=" out "/share/man/man3")
+                (string-append "MAN5DIR=" out "/share/man/man5")
+                (string-append "MAN8DIR=" out "/share/man/man8")
+                (string-append "CFLAGS=-Wno-error")
+                (string-append "LDFLAGS=-Wl,-rpath=" out "/lib")
+                (string-append "CC=" #$(cc-for-target))))
+      #:phases
+      #~(modify-phases %standard-phases
+          (delete 'configure)
+          (add-after 'unpack 'enter-dir
+            (lambda _ (chdir #$name)))
+          (add-after 'enter-dir 'portability
+            (lambda _
+              (substitute* "src/ibpkeys.c"
+                (("#include \"ibpkey_internal.h\"" line)
+                 (string-append line "\n#include <inttypes.h>\n"))
+                (("%#lx") "%#\" PRIx64 \"")))))))
     (native-inputs
      (list flex))
     (home-page "https://selinuxproject.org/")
@@ -100,25 +102,24 @@ boolean settings).")
   (package/inherit libsepol
     (name "checkpolicy")
     (arguments
-     `(#:tests? #f ; there is no check target
-       #:make-flags
-       (let ((out (assoc-ref %outputs "out")))
-         (list (string-append "PREFIX=" out)
-               (string-append "LIBSEPOLA="
-                              (assoc-ref %build-inputs "libsepol")
-                              "/lib/libsepol.a")
-               (string-append "CC=" ,(cc-for-target))))
-       #:phases
-       (modify-phases %standard-phases
-         (delete 'configure)
-         (delete 'portability)
-         (add-after 'unpack 'enter-dir
-           (lambda _ (chdir ,name))))))
+     (list
+      #:tests? #f                       ; there is no check target
+      #:make-flags
+      #~(list (string-append "PREFIX=" #$output)
+              (string-append "LIBSEPOLA="
+                             (search-input-file %build-inputs
+                                                "/lib/libsepol.a"))
+              (string-append "CC=" #$(cc-for-target)))
+      #:phases
+      #~(modify-phases %standard-phases
+          (delete 'configure)
+          (delete 'portability)
+          (add-after 'unpack 'enter-dir
+            (lambda _ (chdir #$name))))))
     (inputs
-     `(("libsepol" ,libsepol)))
+     (list libsepol))
     (native-inputs
-     `(("bison" ,bison)
-       ("flex" ,flex)))
+     (list bison flex))
     (synopsis "Check SELinux security policy configurations and modules")
     (description
      "This package provides the tools \"checkpolicy\" and \"checkmodule\".
@@ -136,44 +137,42 @@ module into a binary representation.")
     (arguments
      (substitute-keyword-arguments (package-arguments libsepol)
        ((#:make-flags flags)
-        `(cons* "PYTHON=python3"
-                (string-append "LIBSEPOLA="
-                              (assoc-ref %build-inputs "libsepol")
-                              "/lib/libsepol.a")
-                (string-append "PYTHONLIBDIR="
-                               (assoc-ref %outputs "python")
-                               "/lib/python"
-                               ,(version-major+minor (package-version python))
-                               "/site-packages/")
-                ,flags))
+        #~(cons* "PYTHON=python3"
+                 (string-append "LIBSEPOLA="
+                                (search-input-file %build-inputs
+                                                   "/lib/libsepol.a"))
+                 (string-append "PYTHONLIBDIR="
+                                #$output:python
+                                "/lib/python"
+                                #$(version-major+minor (package-version python))
+                                "/site-packages/")
+                 #$flags))
        ((#:phases phases)
-        `(modify-phases ,phases
-           (delete 'portability)
-           (replace 'enter-dir
-             (lambda _ (chdir ,name)))
-           (add-after 'build 'pywrap
-             (lambda* (#:key make-flags #:allow-other-keys)
-               (apply invoke "make" "pywrap" make-flags)))
-           (add-after 'install 'install-pywrap
-             (lambda* (#:key make-flags outputs #:allow-other-keys)
-               ;; The build system uses "python setup.py install" to install
-               ;; Python bindings.  Instruct it to use the correct output.
-               (substitute* "src/Makefile"
-                 (("--prefix=\\$\\(PREFIX\\)")
-                  (string-append "--prefix=" (assoc-ref outputs "python"))))
+        #~(modify-phases #$phases
+            (delete 'portability)
+            (replace 'enter-dir
+              (lambda _ (chdir #$name)))
+            (add-after 'build 'pywrap
+              (lambda* (#:key make-flags #:allow-other-keys)
+                (apply invoke "make" "pywrap" make-flags)))
+            (add-after 'install 'install-pywrap
+              (lambda* (#:key make-flags #:allow-other-keys)
+                ;; The build system uses "python setup.py install" to install
+                ;; Python bindings.  Instruct it to use the correct output.
+                (substitute* "src/Makefile"
+                  (("--prefix=\\$\\(PREFIX\\)")
+                   (string-append "--prefix=" #$output:python)))
 
-               (apply invoke "make" "install-pywrap" make-flags)))))))
+                (apply invoke "make" "install-pywrap" make-flags)))))))
     ;; These libraries are in "Requires.private" in libselinux.pc.
     (propagated-inputs
-     `(("libsepol" ,libsepol)
-       ("pcre" ,pcre)))
+     (list libsepol pcre2))
     ;; For pywrap phase
     (inputs
-     `(("python" ,python-wrapper)))
+     (list python-wrapper))
     ;; These inputs are only needed for the pywrap phase.
     (native-inputs
-     `(("swig" ,swig)
-       ("pkg-config" ,pkg-config)))
+     (list pkg-config swig))
     (synopsis "SELinux core libraries and utilities")
     (description
      "The libselinux library provides an API for SELinux applications to get
@@ -189,41 +188,33 @@ the core SELinux management utilities.")
     (arguments
      (substitute-keyword-arguments (package-arguments libsepol)
        ((#:make-flags flags)
-        `(cons* "PYTHON=python3"
-                (string-append "PYTHONLIBDIR="
-                               (assoc-ref %outputs "out")
-                               "/lib/python"
-                               ,(version-major+minor (package-version python))
-                               "/site-packages/")
-                ,flags))
+        #~(cons* "PYTHON=python3"
+                 (string-append "PYTHONLIBDIR="
+                                #$output
+                                "/lib/python"
+                                #$(version-major+minor (package-version python))
+                                "/site-packages/")
+                 #$flags))
        ((#:phases phases)
-        `(modify-phases ,phases
-           (delete 'portability)
-           (replace 'enter-dir
-             (lambda _ (chdir ,name)))
-           (add-before 'install 'adjust-semanage-conf-location
-             (lambda _
-               (substitute* "src/Makefile"
-                 (("DEFAULT_SEMANAGE_CONF_LOCATION=/etc")
-                  "DEFAULT_SEMANAGE_CONF_LOCATION=$(PREFIX)/etc"))))
-           (add-after 'build 'pywrap
-             (lambda* (#:key make-flags #:allow-other-keys)
-               (apply invoke "make" "pywrap" make-flags)))
-           (add-after 'install 'install-pywrap
-             (lambda* (#:key make-flags #:allow-other-keys)
-               (apply invoke "make" "install-pywrap" make-flags)))))))
+        #~(modify-phases #$phases
+            (delete 'portability)
+            (replace 'enter-dir
+              (lambda _ (chdir #$name)))
+            (add-before 'install 'adjust-semanage-conf-location
+              (lambda _
+                (substitute* "src/Makefile"
+                  (("DEFAULT_SEMANAGE_CONF_LOCATION=/etc")
+                   "DEFAULT_SEMANAGE_CONF_LOCATION=$(PREFIX)/etc"))))
+            (add-after 'build 'pywrap
+              (lambda* (#:key make-flags #:allow-other-keys)
+                (apply invoke "make" "pywrap" make-flags)))
+            (add-after 'install 'install-pywrap
+              (lambda* (#:key make-flags #:allow-other-keys)
+                (apply invoke "make" "install-pywrap" make-flags)))))))
     (inputs
-     `(("libsepol" ,libsepol)
-       ("libselinux" ,libselinux)
-       ("audit" ,audit)
-       ;; For pywrap phase
-       ("python" ,python-wrapper)))
+     (list audit libsepol libselinux python-wrapper))
     (native-inputs
-     `(("bison" ,bison)
-       ("flex" ,flex)
-       ;; For pywrap phase
-       ("swig" ,swig)
-       ("pkg-config" ,pkg-config)))
+     (list bison flex pkg-config swig))
     (synopsis "SELinux policy management libraries")
     (description
      "The libsemanage library provides an API for the manipulation of SELinux
@@ -236,22 +227,22 @@ binary policies.")
     (arguments
      (substitute-keyword-arguments (package-arguments libsepol)
        ((#:make-flags flags)
-        `(let ((docbook (assoc-ref %build-inputs "docbook-xsl")))
-           (cons (string-append "XMLTO=xmlto --skip-validation -x "
-                                docbook "/xml/xsl/docbook-xsl-"
-                                ,(package-version docbook-xsl)
-                                "/manpages/docbook.xsl")
-                 ,flags)))
+        #~(let ((xsl (search-input-directory %build-inputs "xml/xsl")))
+            (cons (string-append "XMLTO=xmlto --skip-validation -x "
+                                 xsl "/docbook-xsl-"
+                                 #$(package-version
+                                    (this-package-native-input "docbook-xsl"))
+                                 "/manpages/docbook.xsl")
+                  #$flags)))
        ((#:phases phases)
-        `(modify-phases ,phases
-           (delete 'portability)
-           (replace 'enter-dir
-             (lambda _ (chdir ,name)))))))
+        #~(modify-phases #$phases
+            (delete 'portability)
+            (replace 'enter-dir
+              (lambda _ (chdir #$name)))))))
     (inputs
-     `(("libsepol" ,libsepol)))
+     (list libsepol))
     (native-inputs
-     `(("xmlto" ,xmlto)
-       ("docbook-xsl" ,docbook-xsl)))
+     (list xmlto docbook-xsl))
     (synopsis "SELinux common intermediate language (CIL) compiler")
     (description "The SELinux CIL compiler is a compiler that converts the
 @dfn{common intermediate language} (CIL) into a kernel binary policy file.")
@@ -261,39 +252,41 @@ binary policies.")
   (package/inherit libsepol
     (name "python-sepolgen")
     (arguments
-     `(#:modules ((srfi srfi-1)
-                  (guix build gnu-build-system)
-                  (guix build utils))
-       ,@(substitute-keyword-arguments (package-arguments libsepol)
-           ((#:phases phases)
-            `(modify-phases ,phases
-               (delete 'portability)
-               (replace 'enter-dir
-                 (lambda _ (chdir "python/sepolgen")))
-               ;; By default all Python files would be installed to
-               ;; $out/gnu/store/...-python-.../, so we override the
-               ;; PACKAGEDIR to fix this.
-               (add-after 'enter-dir 'fix-target-path
-                 (lambda* (#:key inputs outputs #:allow-other-keys)
-                   (let ((get-python-version
-                          ;; FIXME: copied from python-build-system
-                          (lambda (python)
-                            (let* ((version     (last (string-split python #\-)))
-                                   (components  (string-split version #\.))
-                                   (major+minor (take components 2)))
-                              (string-join major+minor ".")))))
-                     (substitute* "src/sepolgen/Makefile"
-                       (("^PACKAGEDIR.*")
-                        (string-append "PACKAGEDIR="
-                                       (assoc-ref outputs "out")
-                                       "/lib/python"
-                                       (get-python-version
-                                        (assoc-ref inputs "python"))
-                                       "/site-packages/sepolgen")))
-                     (substitute* "src/share/Makefile"
-                       (("\\$\\(DESTDIR\\)") (assoc-ref outputs "out")))))))))))
+     (substitute-keyword-arguments (package-arguments libsepol)
+       ((#:modules _ #~%gnu-build-system-modules)
+        '((srfi srfi-1)
+          (guix build gnu-build-system)
+          (guix build utils)))
+       ((#:phases phases)
+        #~(modify-phases #$phases
+            (delete 'portability)
+            (replace 'enter-dir
+              (lambda _ (chdir "python/sepolgen")))
+            ;; By default all Python files would be installed to
+            ;; $out/gnu/store/...-python-.../, so we override the
+            ;; PACKAGEDIR to fix this.
+            (add-after 'enter-dir 'fix-target-path
+              (lambda* (#:key inputs #:allow-other-keys)
+                (let ((get-python-version
+                       ;; FIXME: copied from python-build-system
+                       (lambda (python)
+                         (let* ((version     (last (string-split python #\-)))
+                                (components  (string-split version #\.))
+                                (major+minor (take components 2)))
+                           (string-join major+minor "."))))
+                      (python (dirname (dirname (search-input-file
+                                                 inputs "bin/python3")))))
+                  (substitute* "src/sepolgen/Makefile"
+                    (("^PACKAGEDIR.*")
+                     (string-append "PACKAGEDIR="
+                                    #$output
+                                    "/lib/python"
+                                    (get-python-version python)
+                                    "/site-packages/sepolgen")))
+                  (substitute* "src/share/Makefile"
+                    (("\\$\\(DESTDIR\\)") #$output)))))))))
     (inputs
-     `(("python" ,python-wrapper)))
+     (list python-wrapper))
     (native-inputs '())
     (synopsis "Python module for generating SELinux policies")
     (description
@@ -361,51 +354,52 @@ tools, and libraries designed to facilitate SELinux policy analysis.")
   (package/inherit libsepol
     (name "policycoreutils")
     (arguments
-     `(#:test-target "test"
-       #:make-flags
-       (let ((out (assoc-ref %outputs "out")))
-         (list (string-append "CC=" ,(cc-for-target))
-               (string-append "PREFIX=" out)
-               (string-append "LOCALEDIR=" out "/share/locale")
-               (string-append "BASHCOMPLETIONDIR=" out
-                              "/share/bash-completion/completions")
-               "INSTALL=install -c -p"
-               "INSTALL_DIR=install -d"
-               ;; These ones are needed because some Makefiles define the
-               ;; directories relative to DESTDIR, not relative to PREFIX.
-               (string-append "SBINDIR=" out "/sbin")
-               (string-append "ETCDIR=" out "/etc")
-               (string-append "SYSCONFDIR=" out "/etc/sysconfig")
-               (string-append "MAN5DIR=" out "/share/man/man5")
-               (string-append "INSTALL_NLS_DIR=" out "/share/locale")
-               (string-append "AUTOSTARTDIR=" out "/etc/xdg/autostart")
-               (string-append "DBUSSERVICEDIR=" out "/share/dbus-1/services")
-               (string-append "SYSTEMDDIR=" out "/lib/systemd")
-               (string-append "INITDIR=" out "/etc/rc.d/init.d")
-               (string-append "SELINUXDIR=" out "/etc/selinux")))
-       #:phases
-       (modify-phases %standard-phases
-         (delete 'configure)
-         (add-after 'unpack 'enter-dir
-           (lambda _ (chdir ,name)))
-         (add-after 'enter-dir 'ignore-/usr-tests
-           (lambda* (#:key inputs #:allow-other-keys)
-             ;; Rewrite lookup paths for header files.
-             (substitute* '("newrole/Makefile"
-                            "setfiles/Makefile"
-                            "run_init/Makefile")
-               (("/usr(/include/security/pam_appl.h)" _ file)
-                (search-input-file inputs file))
-               (("/usr(/include/libaudit.h)" _ file)
-                (search-input-file inputs file))))))))
+     (list
+      #:test-target "test"
+      #:make-flags
+      #~(let ((out #$output))
+          (list (string-append "CC=" #$(cc-for-target))
+                (string-append "PREFIX=" out)
+                (string-append "LOCALEDIR=" out "/share/locale")
+                (string-append "BASHCOMPLETIONDIR=" out
+                               "/share/bash-completion/completions")
+                "INSTALL=install -c -p"
+                "INSTALL_DIR=install -d"
+                ;; These ones are needed because some Makefiles define the
+                ;; directories relative to DESTDIR, not relative to PREFIX.
+                (string-append "SBINDIR=" out "/sbin")
+                (string-append "ETCDIR=" out "/etc")
+                (string-append "SYSCONFDIR=" out "/etc/sysconfig")
+                (string-append "MAN5DIR=" out "/share/man/man5")
+                (string-append "INSTALL_NLS_DIR=" out "/share/locale")
+                (string-append "AUTOSTARTDIR=" out "/etc/xdg/autostart")
+                (string-append "DBUSSERVICEDIR=" out "/share/dbus-1/services")
+                (string-append "SYSTEMDDIR=" out "/lib/systemd")
+                (string-append "INITDIR=" out "/etc/rc.d/init.d")
+                (string-append "SELINUXDIR=" out "/etc/selinux")))
+      #:phases
+      #~(modify-phases %standard-phases
+          (delete 'configure)
+          (add-after 'unpack 'enter-dir
+            (lambda _ (chdir #$name)))
+          (add-after 'enter-dir 'ignore-/usr-tests
+            (lambda* (#:key inputs #:allow-other-keys)
+              ;; Rewrite lookup paths for header files.
+              (substitute* '("newrole/Makefile"
+                             "setfiles/Makefile"
+                             "run_init/Makefile")
+                (("/usr(/include/security/pam_appl.h)" _ file)
+                 (search-input-file inputs file))
+                (("/usr(/include/libaudit.h)" _ file)
+                 (search-input-file inputs file))))))))
     (inputs
-     `(("audit" ,audit)
-       ("pam" ,linux-pam)
-       ("libsepol" ,libsepol)
-       ("libselinux" ,libselinux)
-       ("libsemanage" ,libsemanage)))
+     (list audit
+           linux-pam
+           libsepol
+           libselinux
+           libsemanage))
     (native-inputs
-     `(("gettext" ,gettext-minimal)))
+     (list gettext-minimal))
     (synopsis "SELinux core utilities")
     (description "The policycoreutils package contains the core utilities that
 are required for the basic operation of an SELinux-enabled GNU system and its
diff --git a/gnu/packages/shells.scm b/gnu/packages/shells.scm
index 6b3acc0579..7bb2557249 100644
--- a/gnu/packages/shells.scm
+++ b/gnu/packages/shells.scm
@@ -119,7 +119,7 @@ direct descendant of NetBSD's Almquist Shell (@command{ash}).")
 (define-public fish
   (package
     (name "fish")
-    (version "3.3.1")
+    (version "3.5.1")
     (source
      (origin
        (method url-fetch)
@@ -127,7 +127,7 @@ direct descendant of NetBSD's Almquist Shell (@command{ash}).")
                            "releases/download/" version "/"
                            "fish-" version ".tar.xz"))
        (sha256
-        (base32 "12dfkyqv5vm52i1fifz91h8f8xg60xjvv94kx6xjqxk9a8dfxd5m"))
+        (base32 "0a39vf0wqq6asw5xcrwgdsc67h5bxkgxzy77f8bx6pd4qlympm56"))
        (modules '((guix build utils)))
        (snippet
         '(begin
@@ -536,13 +536,14 @@ ksh, and tcsh.")
 (define-public xonsh
   (package
     (name "xonsh")
-    (version "0.13.0")
+    (version "0.13.1")
     (source
       (origin
         (method url-fetch)
         (uri (pypi-uri "xonsh" version))
         (sha256
-          (base32 "12ayz1kw2ag3r407j0lng2kfp75im8xqap1nvpmpa0lmsx8wk7ll"))
+          (base32
+           "1b409wkh41inn6m0qmps4iq6bgvwg465dcfcbffqd15fr1j2d0hq"))
         (modules '((guix build utils)))
         (snippet
          #~(begin
@@ -844,7 +845,7 @@ Shell (pdksh).")
 (define-public oil
   (package
     (name "oil")
-    (version "0.12.0")
+    (version "0.12.4")
     (source
      ;; oil's sources contain a modified version of CPython 2.7.13.
      ;; According to https://www.oilshell.org/blog/2017/05/05.html
@@ -857,7 +858,7 @@ Shell (pdksh).")
        (uri (string-append "https://www.oilshell.org/download/oil-"
                            version ".tar.gz"))
        (sha256
-        (base32 "1sz5xb88773ass6ip5yxmnby9p6h0bz1d02n6n0cna3hdzqn7bpv"))))
+        (base32 "1ck59fs2mkid4d9fss6kplvv0aiimsr9m3gv75ckivb376sd8pmc"))))
     (build-system gnu-build-system)
     (arguments
      (list #:strip-binaries? #f         ; strip breaks the binary
diff --git a/gnu/packages/sphinx.scm b/gnu/packages/sphinx.scm
index 065358a57f..dc3a90bbcb 100644
--- a/gnu/packages/sphinx.scm
+++ b/gnu/packages/sphinx.scm
@@ -62,14 +62,14 @@
 (define-public python-sphinx
   (package
     (name "python-sphinx")
-    (version "5.0.2")
+    (version "5.1.1")
     (source
      (origin
        (method url-fetch)
        (uri (pypi-uri "Sphinx" version))
        (sha256
         (base32
-         "1c67w48509k07pa1q3rp93lpchy8hp6h5iqrc3r20msnly79g3mi"))))
+         "12cdy3m5c09lpf2bbxzbhm5v5y9fk7jgm94qrzggpq86waj28cms"))))
     (build-system python-build-system)
     (arguments
      '(#:phases
@@ -111,10 +111,6 @@
            texlive-etoolbox
            texlive-ltxcmds
            texlive-hyperref
-           ;; TODO: Remove texlive-stringenc and texlive-zapfding after
-           ;; propagating them in texlive-hyperref in next rebuild cycle.
-           texlive-stringenc
-           texlive-zapfding
            texlive-latex-base           ;alltt, atbegshi, makeidx, textcomp
            texlive-latex-cmap
            texlive-fancyhdr
@@ -148,6 +144,18 @@ for Python projects or other documents consisting of multiple reStructuredText
 sources.")
     (license license:bsd-2)))
 
+;; Some packages do not support Sphinx 5 yet.  Remove when unused.
+(define-public python-sphinx-4
+  (package
+    (inherit python-sphinx)
+    (version "4.5.0")
+    (source (origin
+              (method url-fetch)
+              (uri (pypi-uri "Sphinx" version))
+              (sha256
+               (base32
+                "1rp28jryxwy24y8vpacclqihbizyi6b1s6id86pibvm46ybcmy3v"))))))
+
 (define-public python-sphinxcontrib-apidoc
   (package
     (name "python-sphinxcontrib-apidoc")
@@ -365,14 +373,16 @@ Blog, News or Announcements section to a Sphinx website.")
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?
                (invoke "pytest")))))))
-    (propagated-inputs (list python-docutils python-sphinx))
+    (propagated-inputs (list python-docutils python-sphinx-4))
     (native-inputs
      (list python-pytest
            python-pytest-regressions))
     (home-page "https://github.com/executablebooks/sphinx-panels")
     (synopsis "Sphinx extension for creating panels in a grid layout")
     (description
-     "This package provides a sphinx extension for creating panels in a grid layout.")
+     "This package provides a sphinx extension for creating panels in a
+grid layout.  It is no longer maintained and users are encouraged to use
+@code{sphinx-design} instead.")
     (license license:expat)))
 
 (define-public python-sphinxcontrib-programoutput
diff --git a/gnu/packages/syncthing.scm b/gnu/packages/syncthing.scm
index 717a953f2f..15ce6a8e29 100644
--- a/gnu/packages/syncthing.scm
+++ b/gnu/packages/syncthing.scm
@@ -2,7 +2,7 @@
 ;;; Copyright © 2016 Petter <petter@mykolab.ch>
 ;;; Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2020 Tobias Geerinckx-Rice <me@tobias.gr>
-;;; Copyright © 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2020-2022 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2020 Giacomo Leidi <goodoldpaul@autistici.org>
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2021 Arun Isaac <arunisaac@systemreboot.net>
@@ -27,6 +27,7 @@
   #:use-module (guix build-system go)
   #:use-module (guix build-system python)
   #:use-module (guix build-system trivial)
+  #:use-module (guix gexp)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
@@ -1111,7 +1112,7 @@ and RFC 5389).")
 (define-public go-github-com-cespare-xxhash
   (package
     (name "go-github-com-cespare-xxhash")
-    (version "2.1.0")
+    (version "2.1.2")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -1120,10 +1121,19 @@ and RFC 5389).")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "12ad3z7ki9j07c4kx3ywkl6188i2afsjg7sl60wd21p6zkkpfjxq"))))
+                "1f3wyr9msnnz94szrkmnfps9wm40s5sp9i4ak0kl92zcrkmpy29a"))))
     (build-system go-build-system)
     (arguments
-     '(#:import-path "github.com/cespare/xxhash"))
+     (list
+       #:import-path "github.com/cespare/xxhash"
+       #:phases
+       #~(modify-phases %standard-phases
+           (replace 'check
+             (lambda* (#:key inputs #:allow-other-keys #:rest args)
+               (unless
+                 ;; The tests fail when run with gccgo.
+                 (false-if-exception (search-input-file inputs "/bin/gccgo"))
+                 (apply (assoc-ref %standard-phases 'check) args)))))))
     (synopsis "Go implementation of xxHash")
     (description "This package provides of Go implementation of the 64-bit
 xxHash algorithm (XXH64).")
diff --git a/gnu/packages/telegram.scm b/gnu/packages/telegram.scm
index 873ff6246b..4976acbc0c 100644
--- a/gnu/packages/telegram.scm
+++ b/gnu/packages/telegram.scm
@@ -572,7 +572,7 @@ Telegram project, for its use in telegram desktop client.")
        ("qtwayland" ,qtwayland)
        ("range-v3" ,range-v3)
        ("rlottie" ,rlottie-for-telegram-desktop)
-       ("rnnoise" ,xiph-rnnoise)
+       ("rnnoise" ,rnnoise)
        ("tgcalls-source"
         ,(origin
            (method git-fetch)
diff --git a/gnu/packages/telephony.scm b/gnu/packages/telephony.scm
index 14c7087125..0c12341771 100644
--- a/gnu/packages/telephony.scm
+++ b/gnu/packages/telephony.scm
@@ -650,7 +650,7 @@ address of one of the participants.")
            speech-dispatcher
            speex ; avoid bundled
            speexdsp ; avoid bundled
-           ;; xiph-rnnoise ; TODO: unbundle rnnoise
+           ;; rnnoise ; TODO: unbundle rnnoise
            ))
     (native-inputs
      (list pkg-config python qttools-5))
diff --git a/gnu/packages/terminals.scm b/gnu/packages/terminals.scm
index 1b08ec4979..7f9764fa75 100644
--- a/gnu/packages/terminals.scm
+++ b/gnu/packages/terminals.scm
@@ -31,6 +31,7 @@
 ;;; Copyright © 2021 Solene Rapenne <solene@perso.pw>
 ;;; Copyright © 2021 Petr Hodina <phodina@protonmail.com>
 ;;; Copyright © 2022 Felipe Balbi <balbi@kernel.org>
+;;; Copyright © 2022 ( <paren@disroot.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1303,60 +1304,7 @@ while also supporting native scrolling and @command{tmux} control mode
     (license license:asl2.0)))
 
 (define-public wterm
-  (package
-    (name "wterm")
-    (version "0.7")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-             (url "https://github.com/majestrate/wterm")
-             (commit "0ae42717c08a85a6509214e881422c7fbe7ecc45")))
-       (sha256
-         (base32
-          "0g4lzmc1w6na81i6hny32xds4xfig4xzswzfijyi6p93a1226dv0"))
-       (file-name (git-file-name name version))))
-    (build-system gnu-build-system)
-    (native-inputs
-     (list pkg-config))
-    (inputs
-     `(("fontconfig" ,fontconfig)
-       ("freetype" ,freetype)
-       ("libdrm" ,libdrm)
-       ("libxkbcommon" ,libxkbcommon)
-       ("ncurses" ,ncurses)
-       ("pixman" ,pixman)
-       ("wayland" ,wayland)))
-    (arguments
-     '(#:tests? #f
-
-       ;; Without -j1 it fails to find file libwld.a.
-       #:parallel-build? #f
-
-       #:make-flags (list "CC=gcc"
-                          (string-append "PREFIX=" %output)
-                          (string-append "TERMINFO="
-                                         (assoc-ref %outputs "out")
-                                         "/share/terminfo"))
-       #:phases
-       (modify-phases %standard-phases
-         (delete 'configure)
-         (add-after 'unpack 'terminfo-fix
-           (lambda _
-             (substitute* "Makefile"
-               (("\ttic .*") "\tmkdir -p $(SHARE_PREFIX)/share/terminfo
-\ttic -o $(SHARE_PREFIX)/share/terminfo -s wterm.info\n"))
-             #t)))))
-    (native-search-paths
-      (list (search-path-specification
-              (variable "TERMINFO_DIRS")
-              (files '("share/terminfo")))))
-    (home-page "https://github.com/majestrate/wterm")
-    (synopsis "Terminal emulator for Wayland")
-    (description "wterm is a native Wayland terminal emulator based on
-an st fork using wld. st is a simple terminal emulator for X originally
-made by suckless.")
-    (license license:x11)))
+  (deprecated-package "wterm" foot))
 
 (define-public tio
   (package
diff --git a/gnu/packages/tex.scm b/gnu/packages/tex.scm
index d4db2a61ac..16024ada52 100644
--- a/gnu/packages/tex.scm
+++ b/gnu/packages/tex.scm
@@ -3557,8 +3557,10 @@ XML, using UTF-8 or a suitable 8-bit encoding.")
        (list texlive-atbegshi
              texlive-auxhook
              texlive-bitset
+             texlive-cm
              texlive-etexcmds
              texlive-gettitlestring
+             texlive-graphics           ;for keyval
              texlive-hycolor
              texlive-intcalc
              texlive-kvdefinekeys
diff --git a/gnu/packages/text-editors.scm b/gnu/packages/text-editors.scm
index 485661fe6b..839f812733 100644
--- a/gnu/packages/text-editors.scm
+++ b/gnu/packages/text-editors.scm
@@ -899,14 +899,14 @@ Octave.  TeXmacs is completely extensible via Guile.")
 (define-public scintilla
   (package
     (name "scintilla")
-    (version "5.2.1")
+    (version "5.2.4")
     (source
      (origin
        (method url-fetch)
        (uri (let ((v (apply string-append (string-split version #\.))))
               (string-append "https://www.scintilla.org/scintilla" v ".tgz")))
        (sha256
-        (base32 "1q6z8v2anbdwcxqfqjs0mwl2z4cdzarj0hqxj86fvvdxsr25649r"))))
+        (base32 "0rncbac9r9ahkxgmv7faj4dms4wy0ik2axmb0lp1ffx4r6419vsa"))))
     (build-system gnu-build-system)
     (arguments
      (list
diff --git a/gnu/packages/time.scm b/gnu/packages/time.scm
index fea9ff25f7..9128056f78 100644
--- a/gnu/packages/time.scm
+++ b/gnu/packages/time.scm
@@ -196,6 +196,7 @@ Pendulum instances.")
      (origin
        (method url-fetch)
        (uri (pypi-uri "python-dateutil" version))
+       (patches (search-patches "python-dateutil-pytest-compat.patch"))
        (sha256
         (base32
          "11iy7m4bp2lgfkcl0r6xzf34bvk7ppjmsyn2ygfikbi72v6cl8q1"))))
diff --git a/gnu/packages/tor.scm b/gnu/packages/tor.scm
index a6a1f4edfb..36ad5e765a 100644
--- a/gnu/packages/tor.scm
+++ b/gnu/packages/tor.scm
@@ -12,6 +12,7 @@
 ;;; Copyright © 2020 André Batista <nandre@riseup.net>
 ;;; Copyright © 2021-2022 Danial Behzadi <dani.behzi@ubuntu.com>
 ;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2022 Jim Newsome <jnewsome@torproject.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -60,14 +61,14 @@
 (define-public tor
   (package
     (name "tor")
-    (version "0.4.7.9")
+    (version "0.4.7.10")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://dist.torproject.org/tor-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "08lva4jrash1fhq8vim56alria5kfganmp3y3lhddx08h9cki7fk"))))
+               "0nss8g6hx42nqiir6l03dj15r433fvygq9r00nmnv8wylpgmczk4"))))
     (build-system gnu-build-system)
     (arguments
      (list #:configure-flags
@@ -160,31 +161,35 @@ This package only provides a client to the Tor Network.")))
 (define-public torsocks
   (package
     (name "torsocks")
-    (version "2.3.0")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append "https://people.torproject.org/~dgoulet/"
-                                  "torsocks/torsocks-" version ".tar.xz"))
-              (sha256
-               (base32
-                "08inrkap29gikb6sdmb58z43hw4abwrfw7ny40c4xzdkss0vkwdr"))))
+    (version "2.4.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append
+             "https://gitlab.torproject.org/tpo/core/torsocks/-/archive/v"
+             version "/torsocks-v" version ".tar.bz2"))
+       (sha256
+        (base32
+         "1a7k3njdhp7dz603knhisna1zvxw35j3g213p6dvczv9bcjy7cjl"))))
     (build-system gnu-build-system)
     (inputs
      (list libcap))
+    (native-inputs
+     (list autoconf automake libtool))
     (arguments
-     `(#:phases (modify-phases %standard-phases
-                  (add-after 'build 'absolutize
-                    (lambda* (#:key inputs #:allow-other-keys)
-                      (substitute* "src/bin/torsocks"
-                        (("getcap=.*")
-                         (string-append "getcap=" (which "getcap") "\n")))
-                      #t)))))
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'build 'absolutize
+           (lambda* (#:key inputs #:allow-other-keys)
+             (substitute* "src/bin/torsocks"
+               (("getcap=.*")
+                (string-append "getcap=" (which "getcap") "\n"))))))))
     (home-page "https://www.torproject.org/")
-    (synopsis "Use socks-friendly applications with Tor")
+    (synopsis "Transparently route an application's traffic through Tor.")
     (description
-     "Torsocks allows you to use most socks-friendly applications in a safe
-way with Tor.  It ensures that DNS requests are handled safely and explicitly
-rejects UDP traffic from the application you're using.")
+     "Torsocks allows you to use most applications in a safe way with Tor.  It
+ensures that DNS requests are handled safely and explicitly rejects UDP
+traffic from the application you're using.")
 
     ;; All the files explicitly say "version 2 only".
     (license license:gpl2)))
diff --git a/gnu/packages/upnp.scm b/gnu/packages/upnp.scm
index 5718235109..ba2eb5b416 100644
--- a/gnu/packages/upnp.scm
+++ b/gnu/packages/upnp.scm
@@ -96,14 +96,14 @@ over IRC, instant messaging, network games, and most server software.")
 (define-public libupnp
   (package
     (name "libupnp")
-    (version "1.14.12")
+    (version "1.14.13")
     (source
      (origin
       (method url-fetch)
       (uri (string-append "https://github.com/pupnp/pupnp/releases/download"
                           "/release-" version "/libupnp-" version".tar.bz2"))
       (sha256
-       (base32 "1b5mnn01cx840paggxrajg63gqzmw8mi4p14jhi9r4qyvam80709"))))
+       (base32 "0klag10gwrr6yx41v72w1jmyz87wzj1qpdcwv45qzjn53bp7lp82"))))
     (native-inputs
      (list pkg-config))
     (build-system gnu-build-system)
diff --git a/gnu/packages/version-control.scm b/gnu/packages/version-control.scm
index 9529963a85..15f3471c88 100644
--- a/gnu/packages/version-control.scm
+++ b/gnu/packages/version-control.scm
@@ -221,14 +221,14 @@ Python 3.3 and later, rather than on Python 2.")
 (define-public git
   (package
     (name "git")
-    (version "2.37.1")
+    (version "2.37.2")
     (source (origin
               (method url-fetch)
               (uri (string-append "mirror://kernel.org/software/scm/git/git-"
                                   version ".tar.xz"))
               (sha256
                (base32
-                "001m3gnal902hv22gp1m44c6247357pb80db0svms74gidmjq5n8"))))
+                "00xhdm086bxm4v2p8m7ra7vf9kwdppw4l2n3vakfff253j19qg8w"))))
     (build-system gnu-build-system)
     (native-inputs
      `(("native-perl" ,perl)
@@ -248,7 +248,7 @@ Python 3.3 and later, rather than on Python 2.")
                  version ".tar.xz"))
            (sha256
             (base32
-             "098yz8kzvzmmrkyiv8j79s5nryws302pnq6jcbrqbidrziwcxkjd"))))
+             "1zhn91fzyyz890a5hm0bvs0vnhy8c81q1fhsk2gfwbbh73z161nz"))))
        ;; For subtree documentation.
        ("asciidoc" ,asciidoc)
        ("docbook2x" ,docbook2x)
@@ -1655,7 +1655,7 @@ visualize your public Git repositories on a web interface.")
 (define-public pre-commit
   (package
     (name "pre-commit")
-    (version "2.19.0")
+    (version "2.20.0")
     (source
      (origin
        (method git-fetch)               ; no tests in PyPI release
@@ -1664,7 +1664,7 @@ visualize your public Git repositories on a web interface.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "102z1n6wjrmk5h4p59l929bi0r91bl3vz62j4k6sz2j7k0a791g5"))))
+        (base32 "19jcg6nfnscp87h4wmbpw6r3lc8c75zkvb6wqgavq5dh7wkyg6pq"))))
     (build-system python-build-system)
     (arguments
      `(#:phases
diff --git a/gnu/packages/video.scm b/gnu/packages/video.scm
index 4e808570e7..e59ff028e8 100644
--- a/gnu/packages/video.scm
+++ b/gnu/packages/video.scm
@@ -143,6 +143,7 @@
   #:use-module (gnu packages gnupg)
   #:use-module (gnu packages gstreamer)
   #:use-module (gnu packages gtk)
+  #:use-module (gnu packages haskell-xyz)
   #:use-module (gnu packages image)
   #:use-module (gnu packages imagemagick)
   #:use-module (gnu packages iso-codes)
@@ -162,6 +163,7 @@
   #:use-module (gnu packages networking)
   #:use-module (gnu packages ocr)
   #:use-module (gnu packages pcre)
+  #:use-module (gnu packages pciutils)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages perl-check)
   #:use-module (gnu packages perl-web)
@@ -773,7 +775,7 @@ old-fashioned output methods with powerful ascii-art renderer.")
 (define-public celluloid
   (package
     (name "celluloid")
-    (version "0.23")
+    (version "0.24")
     (source
      (origin
        (method url-fetch)
@@ -781,12 +783,12 @@ old-fashioned output methods with powerful ascii-art renderer.")
                            "/releases/download/v" version
                            "/celluloid-" version ".tar.xz"))
        (sha256
-        (base32 "0x23y09jwkg8wbb0yp5f03sj5hwjg3kyhbbww2y1a0izs1iijbdj"))))
+        (base32 "0ns9xh582c8kajw4v2x5ap5jfiba3gxywqc2klc0v6fc3id1gqii"))))
     (build-system glib-or-gtk-build-system)
     (native-inputs
      (list intltool pkg-config))
     (inputs
-     (list gtk libepoxy mpv))
+     (list gtk libadwaita libepoxy mpv))
     (home-page "https://github.com/celluloid-player/celluloid")
     (synopsis "GTK+ frontend for the mpv media player")
     (description "Celluloid is a simple GTK+ frontend for the mpv media player.
@@ -2483,26 +2485,16 @@ YouTube.com and many more sites.")
 (define-public yt-dlp
   (package/inherit youtube-dl
     (name "yt-dlp")
-    (version "2022.07.18")
-    (source (origin
-              (method url-fetch)
-              (uri (string-append "https://github.com/yt-dlp/yt-dlp/"
-                                  "releases/download/"
-                                  version "/yt-dlp.tar.gz"))
-              (sha256
-               (base32
-                "1wmzfqhysx1mqdba4ikvm6nbahasihi4xgqwqad20y3vs701slyj"))
-              (snippet
-               #~(begin
-                   ;; Delete the pre-generated files, except for the man page
-                   ;; which requires 'pandoc' to build.
-                   (for-each delete-file
-                             (list "yt-dlp"
-                                   ;;pandoc is needed to generate
-                                   ;;"yt-dlp.1"
-                                   "completions/bash/yt-dlp"
-                                   "completions/fish/yt-dlp.fish"
-                                   "completions/zsh/_yt-dlp"))))))
+    (version "2022.08.08")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/yt-dlp/yt-dlp/")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "07qz1zdndlpki0asw35zk5hdjcwpl3n1g54nxg4yb1iykbyv7rll"))))
     (arguments
      (substitute-keyword-arguments (package-arguments youtube-dl)
        ((#:tests? _) #t)
@@ -2515,9 +2507,17 @@ YouTube.com and many more sites.")
                   (("\\.get_param\\('ffmpeg_location'\\)" match)
                    (format #f "~a or '~a'" match (which "ffmpeg"))))))
             (replace 'build-generated-files
-              (lambda _
-                ;; Avoid the yt-dlp.1 target, which requires pandoc.
-                (invoke "make" "PYTHON=python" "yt-dlp" "completions")))
+              (lambda* (#:key inputs #:allow-other-keys)
+                (if (assoc-ref inputs "pandoc")
+                  (invoke "make"
+                          "PYTHON=python"
+                          "yt-dlp"
+                          "yt-dlp.1"
+                          "completions")
+                  (invoke "make"
+                          "PYTHON=python"
+                          "yt-dlp"
+                          "completions"))))
             (replace 'fix-the-data-directories
               (lambda* (#:key outputs #:allow-other-keys)
                 (let ((prefix (assoc-ref outputs "out")))
@@ -2537,8 +2537,14 @@ YouTube.com and many more sites.")
                       python-mutagen
                       python-pycryptodomex
                       python-websockets)))
-    (native-inputs (modify-inputs (package-native-inputs youtube-dl)
-                     (append python-pytest)))
+    (native-inputs
+     (append
+       ;; To generate the manpage.
+       (if (member (%current-system)
+                   (package-transitive-supported-systems pandoc))
+         (list pandoc)
+         '())
+       (list python-pytest zip)))
     (description
      "yt-dlp is a small command-line program to download videos from
 YouTube.com and many more sites.  It is a fork of youtube-dl with a
@@ -3147,7 +3153,7 @@ from sites like Twitch.tv and pipes them into a video player of choice.")
 (define-public mlt
   (package
     (name "mlt")
-    (version "7.6.0")
+    (version "7.8.0")
     (source
      (origin
        (method git-fetch)
@@ -3156,7 +3162,7 @@ from sites like Twitch.tv and pipes them into a video player of choice.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "1dj7jb5nk0qy28mlw0pcmj4nd607mgx229nhf14gjc0fq9gx71sd"))))
+        (base32 "01589xpx1vgx1l1zjg553nbjks5wy31rdvyq1sjnbp9w7p7nzjdg"))))
     (build-system cmake-build-system)
     (arguments
      (list
@@ -3312,7 +3318,7 @@ be used for realtime video capture via Linux-specific APIs.")
 (define-public obs
   (package
     (name "obs")
-    (version "27.1.3")
+    (version "27.2.4")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -3322,7 +3328,7 @@ be used for realtime video capture via Linux-specific APIs.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1ndiarr3d6qihymaigf34jjml0lrgbj640fnpnffz2ysj7276q0j"))
+                "13bfzjqmvabli99yr1h0306w5lx72mbl5sxrnr46hjig1a6rw91s"))
               (patches
                (search-patches "obs-modules-location.patch"))))
     (build-system cmake-build-system)
@@ -3330,10 +3336,10 @@ be used for realtime video capture via Linux-specific APIs.")
      (list
       #:configure-flags
       #~(list (string-append "-DOBS_VERSION_OVERRIDE=" #$version)
-              "-DENABLE_UNIT_TESTS=TRUE"
+              "-DENABLE_UNIT_TESTS=ON"
               ;; Browser plugin requires cef, but it is not packaged yet.
               ;; <https://bitbucket.org/chromiumembedded/cef/src/master/>
-              "-DBUILD_BROWSER=FALSE")
+              "-DBUILD_BROWSER=OFF")
        #:phases
        #~(modify-phases %standard-phases
            (add-after 'install 'wrap-executable
@@ -3351,10 +3357,11 @@ be used for realtime video capture via Linux-specific APIs.")
             (separator #f)                         ;single entry
             (files '("share/obs/obs-plugins")))))
     (native-inputs
-     (list cmocka pkg-config))
+     (list cmocka pkg-config swig))
     (inputs
      (list
       alsa-lib
+      bash-minimal
       curl
       eudev
       ffmpeg
@@ -3365,10 +3372,14 @@ be used for realtime video capture via Linux-specific APIs.")
       jansson
       libx264
       libxcomposite
+      libxkbcommon
+      luajit
       mbedtls-apache
       mesa
+      pciutils
       pipewire-0.3
       pulseaudio
+      python
       qtbase-5
       qtsvg-5
       qtx11extras
@@ -4801,7 +4812,7 @@ transitions, and effects and then export your film to many common formats.")
 (define-public shotcut
   (package
     (name "shotcut")
-    (version "22.04.25")
+    (version "22.06.23")
     (source
      (origin
        (method git-fetch)
@@ -4810,7 +4821,7 @@ transitions, and effects and then export your film to many common formats.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0ccbx2crqrnhl19d7267xc40vs0cjmps2cnhi1g1l6bqxbi7k88x"))))
+        (base32 "1kvhcblzjdjiv3jggdx41djq9pz6a9hg4ilgcwin13gb19ir7dcc"))))
     (build-system qt-build-system)
     (arguments
      `(#:tests? #f                      ;there are no tests
@@ -4827,14 +4838,6 @@ transitions, and effects and then export your film to many common formats.")
                (substitute* "src/jobs/meltjob.cpp"
                  (("\"melt\"") (string-append "\"" mlt "/bin/melt\""))
                  (("\"melt-7\"") (string-append "\"" mlt "/bin/melt-7\""))))))
-         (replace 'configure
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out")))
-               (invoke "qmake"
-                       (string-append "PREFIX=" out)
-                       "QMAKE_LRELEASE=lrelease"
-                       "QMAKE_LUPDATE=lupdate"
-                       "shotcut.pro"))))
          (add-after 'install 'wrap-executable
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
@@ -4859,6 +4862,7 @@ transitions, and effects and then export your film to many common formats.")
     (inputs
      (list bash-minimal
            ffmpeg
+           fftw
            frei0r-plugins
            jack-1
            ladspa
diff --git a/gnu/packages/vim.scm b/gnu/packages/vim.scm
index 945c7f3863..a07c681cb3 100644
--- a/gnu/packages/vim.scm
+++ b/gnu/packages/vim.scm
@@ -77,7 +77,7 @@
 (define-public vim
   (package
     (name "vim")
-    (version "9.0.0000")
+    (version "9.0.0235")
     (source (origin
              (method git-fetch)
              (uri (git-reference
@@ -86,7 +86,7 @@
              (file-name (git-file-name name version))
              (sha256
               (base32
-               "0zzhpkcx0gi2hngwvp0w8c4f289fzxvdc4955spkb9f1f3119pwb"))))
+               "1fshlggcq1fw4cbsgmagwxkmdiwv2cla0vds383z49ayqgqnamnj"))))
     (build-system gnu-build-system)
     (arguments
      `(#:test-target "test"
@@ -659,7 +659,7 @@ are detected, the user is notified.")))
 (define-public neovim
   (package
     (name "neovim")
-    (version "0.7.0")
+    (version "0.7.2")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -668,7 +668,7 @@ are detected, the user is notified.")))
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1m7xmry66pn27gvk7qj9di83xa1h7zjp4c6ygnf218pqhr08x06g"))))
+                "1jn4i4ral79ys06i50bimylm515sfh41z503gj50a74h1ylg0z4w"))))
     (build-system cmake-build-system)
     (arguments
      (list #:modules
diff --git a/gnu/packages/vpn.scm b/gnu/packages/vpn.scm
index c4e0287bf8..1ec619b0c2 100644
--- a/gnu/packages/vpn.scm
+++ b/gnu/packages/vpn.scm
@@ -4,7 +4,7 @@
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2015 Jeff Mickey <j@codemac.net>
 ;;; Copyright © 2016, 2017, 2019, 2021, 2022 Efraim Flashner <efraim@flashner.co.il>
-;;; Copyright © 2016–2021 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2016–2022 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2017 Julien Lepiller <julien@lepiller.eu>
 ;;; Copyright © 2018, 2020 Pierre Langlois <pierre.langlois@gmx.com>
 ;;; Copyright © 2018 Meiyo Peng <meiyo.peng@gmail.com>
@@ -794,7 +794,7 @@ this process.  It is compatible with Fortinet VPNs.")
 (define-public openvpn
   (package
     (name "openvpn")
-    (version "2.5.6")
+    (version "2.5.7")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -802,7 +802,7 @@ this process.  It is compatible with Fortinet VPNs.")
                     version ".tar.gz"))
               (sha256
                (base32
-                "0gdd88rcan9vfiwkzsqn6fxxdim7kb1bsxrcra59c5xksprpwfik"))))
+                "0s1yq530j4i4kicgvsxgl532vyn03gfhlxfdnsb43j05k4w0ld08"))))
     (build-system gnu-build-system)
     (arguments
      '(#:configure-flags '("--enable-iproute2=yes")))
diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
index e00be562c2..24991879ff 100644
--- a/gnu/packages/web.scm
+++ b/gnu/packages/web.scm
@@ -109,6 +109,7 @@
   #:use-module (gnu packages boost)
   #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages cpp)
   #:use-module (gnu packages crates-gtk)
   #:use-module (gnu packages crates-io)
   #:use-module (gnu packages curl)
@@ -2006,6 +2007,8 @@ communication asynchronously.  Memory copies and transformations are kept to a
 minimum to provide high performance operation.")
     ;; Most of the code is covered by the Apache License, Version 2.0, but the
     ;; bundled CuTest framework uses a different non-copyleft license.
+    (properties
+     '((release-monitoring-url . "https://serf.apache.org/download")))
     (license (list license:asl2.0 (license:non-copyleft "file://test/CuTest-README.txt")))))
 
 (define-public libsass
@@ -3111,7 +3114,7 @@ RSS 0.91, RSS 1.0, RSS 2.0, Atom.")
 (define-public perl-file-listing
   (package
     (name "perl-file-listing")
-    (version "6.11")
+    (version "6.15")
     (source (origin
              (method url-fetch)
              (uri (string-append
@@ -3119,7 +3122,7 @@ RSS 0.91, RSS 1.0, RSS 2.0, Atom.")
                    version ".tar.gz"))
              (sha256
               (base32
-               "0vmzw1mhv580flzkla80gvwfpficnhlbqr1dnlf9x50bw7n18k62"))))
+               "033p2ckkjbxrl390x8aq4wq4fpj5aidsazkbw82mhqxrksgzpi26"))))
     (build-system perl-build-system)
     (propagated-inputs
      (list perl-http-date))
@@ -3445,7 +3448,7 @@ jar in conformance with RFC 6265 <http://tools.ietf.org/html/rfc6265>.")
 (define-public perl-http-cookies
   (package
     (name "perl-http-cookies")
-    (version "6.06")
+    (version "6.10")
     (source (origin
              (method url-fetch)
              (uri (string-append
@@ -3453,7 +3456,7 @@ jar in conformance with RFC 6265 <http://tools.ietf.org/html/rfc6265>.")
                    version ".tar.gz"))
              (sha256
               (base32
-               "13rnz3233vbsfariya4njiyfaj6k94j6bvlyh3dmfmh24hpqgx77"))))
+               "01vhppq18g6ppn3z9mvdfghfzibwg1sczzvnp3jbbrjw7iikcvz3"))))
     (build-system perl-build-system)
     (propagated-inputs
      (list perl-http-message))
@@ -3805,7 +3808,7 @@ select or poll.")
 (define-public perl-libwww
   (package
     (name "perl-libwww")
-    (version "6.55")
+    (version "6.67")
     (source (origin
              (method url-fetch)
              (uri (string-append
@@ -3813,7 +3816,7 @@ select or poll.")
                    version ".tar.gz"))
              (sha256
               (base32
-               "0869hn711d6fd6yil8p88wij6p1zdrbnycy7p9p176q39ajd7l61"))))
+               "08xp4q90nkvpwnks2qfqjhqgff6447myayqi6kc1panh7w5c9vln"))))
     (build-system perl-build-system)
     (native-inputs
      (list perl-test-fatal perl-test-needs perl-test-requiresinternet))
@@ -4034,7 +4037,7 @@ is limited to http and https.")
 (define-public perl-net-http
   (package
     (name "perl-net-http")
-    (version "6.21")
+    (version "6.22")
     (source (origin
              (method url-fetch)
              (uri (string-append
@@ -4042,7 +4045,7 @@ is limited to http and https.")
                    "Net-HTTP-" version ".tar.gz"))
              (sha256
               (base32
-               "1i7fk6q1iaxzgf82mjd5hg77hvy7dbb79488cijg16dyfrds6nip"))))
+               "18m1b1274wmsl3cdfwg27pm7s1fgrrlhwy4gw4zl8da2p2jzkyk2"))))
     (build-system perl-build-system)
     (propagated-inputs
      (list perl-io-socket-ssl perl-uri))
@@ -5746,14 +5749,14 @@ on the fly.")
                          "$(ps -p $HITCH_PID -o state= | grep -qv '^Z$')"))
                       #t)))))
     (native-inputs
-     `(("pkg-config" ,pkg-config)
+     (list pkg-config
 
-       ;; For tests.
-       ("curl" ,curl)
-       ("egrep" ,grep)
-       ("lsof" ,lsof)
-       ("procps" ,procps)
-       ("python" ,python)))
+           ;; For tests.
+           curl
+           grep
+           lsof
+           procps
+           python))
     (inputs
      (list libev openssl))
     (synopsis "Scalable TLS proxy")
@@ -5853,13 +5856,13 @@ deployments.")
   (package
     (name "varnish")
     (home-page "https://varnish-cache.org/")
-    (version "7.0.1")
+    (version "7.1.1")
     (source (origin
               (method url-fetch)
               (uri (string-append home-page "_downloads/varnish-" version ".tgz"))
               (sha256
                (base32
-                "0q265fzarz5530g8lasvfpgks8z1kq1yh7rn88bn2qfly3pmpry4"))))
+                "14512fjjzwini3fics6sib9y83s45vlrpncamixqmmg7j0jvxbrc"))))
     (build-system gnu-build-system)
     (arguments
      `(#:configure-flags (list (string-append "LDFLAGS=-Wl,-rpath=" %output "/lib")
@@ -5920,6 +5923,8 @@ deployments.")
 reverse proxy and load balancer.  You install it in front of any server that
 speaks HTTP and configure it to cache the contents through an extensive
 configuration language.")
+    (properties
+     '((release-monitoring-url . "https://varnish-cache.org/releases/index.html")))
     (license (list license:bsd-2           ;main distribution
                    license:zlib            ;lib/libvgz/*
                    license:public-domain   ;bin/varnishncsa/as64.c, include/miniobj.h
@@ -7976,7 +7981,7 @@ concurrency, and return status.")
 (define-public libzim
   (package
     (name "libzim")
-    (version "6.3.2")
+    (version "8.0.0")
     (source (origin
               (method git-fetch)
               (uri (git-reference
@@ -7984,19 +7989,19 @@ concurrency, and return status.")
                     (commit version)))
               (sha256
                (base32
-                "00kc4qc0a69jh1jwk5xhi567b7ffpc3p38ffrf2xaax4hvpjwmn6"))
+                "1a7wj8kmpx5aqx0wsfcnaqlfsf1gr66iqxyn24cgjnk4d1rjsahm"))
               (file-name (git-file-name name version))))
     (build-system meson-build-system)
     (arguments
      ;; TODO: Find out why tests fail.
      '(#:tests? #f))
     (inputs
-     `(("icu4c" ,icu4c)
-       ("liblzma" ,xz)
-       ("libuuid" ,util-linux "lib")
-       ("python" ,python-wrapper)       ;for libzim-compile-resources
-       ("xapian" ,xapian)
-       ("zstd" ,zstd "lib")))
+     (list icu4c
+           python-wrapper ; for libzim-compile-resources
+           xapian
+           xz
+           (list util-linux "lib")
+           (list zstd "lib")))
     (native-inputs
      (list pkg-config googletest))
     (home-page "https://wiki.openzim.org/wiki/Main_Page")
@@ -8010,7 +8015,7 @@ for ZIM files.")
 (define-public kiwix-lib
   (package
     (name "kiwix-lib")
-    (version "9.4.1")
+    (version "11.0.0")
     (home-page "https://github.com/kiwix/kiwix-lib/")
     (source (origin
               (method git-fetch)
@@ -8019,7 +8024,7 @@ for ZIM files.")
                     (commit version)))
               (sha256
                (base32
-                "034nk6l623v78clrs2d0k1vg69sbzrd8c0q79qiqmlkinck1nkxw"))
+                "1w5dabzvd3cnhw064qf9166476fszkkxjcml21x35av0dcd1vlk6"))
               (file-name (git-file-name name version))))
     (build-system meson-build-system)
     (arguments
@@ -8027,13 +8032,11 @@ for ZIM files.")
        (modify-phases %standard-phases
          (add-before 'configure 'fix-paths-and-includes
            (lambda* (#:key inputs #:allow-other-keys)
-             (setenv "CPPFLAGS" (string-append "-I" (assoc-ref inputs "mustache")))
              (substitute* "src/aria2.cpp"
                (("ARIA2_CMD \"aria2c\"")
                 (string-append "ARIA2_CMD \""
-                               (assoc-ref inputs "aria2")
-                               "/bin/aria2c\"")))
-             #t)))))
+                               (search-input-file inputs "/bin/aria2c")
+                               "\""))))))))
     (inputs
      (list aria2
            curl
@@ -8045,19 +8048,10 @@ for ZIM files.")
            zlib
            `(,zstd "lib")))
     (native-inputs
-     `(("mustache" ,(origin
-                      (method git-fetch)
-                      (uri (git-reference
-                            (url "https://github.com/kainjow/Mustache")
-                            ;; XXX: Readme says to use version 3.  Can we use 3.2.1?
-                            (commit "v4.1")))
-                      (file-name (git-file-name "mustache" "4.1"))
-                      (sha256
-                       (base32
-                        "0r9rbk6v1wpld2ismfsk2lkhbyv3dkf0p03hkjivbj05qkfhvlbb"))))
-       ("pkg-config" ,pkg-config)
-       ;; for kiwix-compile-resources
-       ("python" ,python-wrapper)))
+     (list cpp-mustache
+           pkg-config
+           ;; for kiwix-compile-resources
+           python-wrapper))
     (synopsis "Common code base for all Kiwix ports")
     (description "The Kiwix library provides the Kiwix software suite core.
 It contains the code shared by all Kiwix ports.")
@@ -8066,7 +8060,7 @@ It contains the code shared by all Kiwix ports.")
 (define-public kiwix-desktop
   (package
     (name "kiwix-desktop")
-    (version "2.0.5")
+    (version "2.2.2")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -8075,7 +8069,7 @@ It contains the code shared by all Kiwix ports.")
                     ".tar.gz"))
               (sha256
                (base32
-                "1a9h4qmh6fkfscyp6lax0ri07dvvzw2wp4kr1sm86n0bdk3cwwha"))))
+                "0ani12d91azcwwys499848ws7rx0m7c23nalcm5fanjak76bg6n6"))))
     (build-system gnu-build-system)
     (arguments
      `(#:phases
@@ -8085,30 +8079,17 @@ It contains the code shared by all Kiwix ports.")
              (invoke "qmake"
                      (string-append "PREFIX="
                                     (assoc-ref outputs "out")))))
-         (add-before 'configure 'enable-print-support
-           (lambda _
-             (substitute* "kiwix-desktop.pro"
-               (("webenginewidgets") "webenginewidgets printsupport"))
-             #t))
-         (add-before 'configure 'substitute-source
-           ;; Looks like .pro file is missing a feature.
-           ;; See https://github.com/kiwix/kiwix-desktop/issues/556.
-           (lambda* (#:key inputs #:allow-other-keys)
-             (substitute* "kiwix-desktop.pro"
-               (("webenginewidgets" all) (string-append all " printsupport")))
-             #t))
          (add-after 'install 'wrap-qt-process-path
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
                     (bin (string-append out "/bin/kiwix-desktop"))
-                    (qt-process-path (string-append
-                                      (assoc-ref inputs "qtwebengine-5")
-                                      "/lib/qt5/libexec/QtWebEngineProcess")))
+                    (qt-process-path (search-input-file
+                                      inputs "/lib/qt5/libexec/QtWebEngineProcess")))
                (wrap-program bin
-                 `("QTWEBENGINEPROCESS_PATH" = (,qt-process-path)))
-               #t))))))
+                 `("QTWEBENGINEPROCESS_PATH" = (,qt-process-path)))))))))
     (inputs
-     (list curl
+     (list bash-minimal
+           curl
            icu4c
            kiwix-lib
            libmicrohttpd
@@ -8122,8 +8103,8 @@ It contains the code shared by all Kiwix ports.")
            zlib
            `(,zstd "lib")))
     (native-inputs
-     `(("pkg-config" ,pkg-config)
-       ("qmake" ,qtbase-5)))
+     (list pkg-config
+           qtbase-5))
     (home-page "https://wiki.kiwix.org/wiki/Software")
     (synopsis "Viewer and manager of ZIM files")
     (description "Kiwix Desktop allows you to enjoy a lot of different content
@@ -8133,14 +8114,14 @@ offline (such as Wikipedia), without any access to Internet.")
 (define-public kiwix-tools
   (package
     (name "kiwix-tools")
-    (version "3.1.2")
+    (version "3.3.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://download.kiwix.org/release/"
                                   "kiwix-tools/kiwix-tools-" version ".tar.xz"))
               (sha256
                (base32
-                "1npf9ddhpkmx97gxmvmwmi8a69md8kh2szimd9rpg6ggd4big03a"))))
+                "07mj0lrznydhdbirybdyxswypr7hy290mjdv7lkjr6gxgdp29d37"))))
     (build-system meson-build-system)
     (inputs
      (list curl
diff --git a/gnu/packages/wm.scm b/gnu/packages/wm.scm
index 584178fa61..ebbd1a06bd 100644
--- a/gnu/packages/wm.scm
+++ b/gnu/packages/wm.scm
@@ -1931,8 +1931,8 @@ productive, customizable lisp based systems.")
            (delete 'cleanup)))))))
 
 (define stumpwm-contrib
-  (let ((commit "a7dc1c663d04e6c73a4772c8a6ad56a34381096a")
-        (revision "3"))
+  (let ((commit "d0c05077eca5257d33083de949c10bca4aac4242")
+        (revision "4"))
     (package
       (name "stumpwm-contrib")
       (version (git-version "0.0.1" revision commit)) ;no upstream release
@@ -1944,13 +1944,13 @@ productive, customizable lisp based systems.")
                (commit commit)))
          (file-name (git-file-name name version))
          (sha256
-          (base32 "09akdaaya7lga5lzbq1aj1filsyjwvflghkidpmr0nk0jz5xx1g7"))))
+          (base32 "0zxhqh9wjfk7zas67kmwfx0a47y8rxmh8f1a5rcs300bv1083lkb"))))
       (build-system asdf-build-system/sbcl)
       (inputs
        `(("stumpwm" ,stumpwm "lib")))
       (home-page "https://github.com/stumpwm/stumpwm-contrib")
-      (synopsis "StumpWM interactive shell")
-      (description "This package provides a StumpWM interactive shell.")
+      (synopsis "StumpWM extra modules")
+      (description "This package provides extra modules for StumpWM.")
       (license (list license:gpl2+ license:gpl3+ license:bsd-2)))))
 
 (define-public stumpish
diff --git a/gnu/packages/xfce.scm b/gnu/packages/xfce.scm
index 12c490f622..bcf255864f 100644
--- a/gnu/packages/xfce.scm
+++ b/gnu/packages/xfce.scm
@@ -7,7 +7,7 @@
 ;;; Copyright © 2017, 2019 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2017 Petter <petter@mykolab.ch>
 ;;; Copyright © 2017 Nikita <nikita@n0.is>
-;;; Copyright © 2018–2021 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2018–2022 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2019 Pkill -9 <pkill9@runbox.com>
 ;;; Copyright © 2019 L  p R n  d n <guix@lprndn.info>
 ;;; Copyright © 2019 Ingo Ruhnke <grumbel@gmail.com>
@@ -218,7 +218,7 @@ to share commonly used Xfce widgets among the Xfce applications.")
 (define-public catfish
   (package
     (name "catfish")
-    (version "4.16.3")
+    (version "4.16.4")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://archive.xfce.org/src/apps/"
@@ -226,7 +226,7 @@ to share commonly used Xfce widgets among the Xfce applications.")
                                   "/catfish-" version ".tar.bz2"))
               (sha256
                (base32
-                "1nng7mklrfihgppyxldpssdscl1dzb5z6hyx10akk089s5i9mag9"))))
+                "1z5m9f4cj473n68rrhhbkq3x5df5k394qp4n27lqqyny6k2h2p3f"))))
     (build-system python-build-system)
     (arguments
      '(#:phases
@@ -270,7 +270,7 @@ it to your needs by using several command line options.")
 (define-public elementary-xfce-icon-theme
   (package
     (name "elementary-xfce-icon-theme")
-    (version "0.16")
+    (version "0.17")
     (source (origin
               (method git-fetch)
               (uri
@@ -280,7 +280,7 @@ it to your needs by using several command line options.")
               (file-name (git-file-name name version))
               (sha256
                (base32
-                "1s8g7qyjdlq93fbrgysahy5kcbd8b2cpnfmpdvl0vbzyhy2x18d7"))))
+                "0jlawp6rg55w5cm4d7836r660i2pnc5gkzpdjsq7w5875i85arzm"))))
     (build-system gnu-build-system)
     (arguments
      '(#:tests? #f                      ; no check target
@@ -359,7 +359,7 @@ merging features essential for loading menus modified with menu editors.")
 (define-public tumbler
   (package
     (name "tumbler")
-    (version "4.16.0")
+    (version "4.16.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://archive.xfce.org/src/xfce/"
@@ -367,7 +367,7 @@ merging features essential for loading menus modified with menu editors.")
                                   "tumbler-" version ".tar.bz2"))
               (sha256
                (base32
-                "0rmga1l7da0pjrs6jlyq1nfn513r543v7cchshrif1341knpy2wv"))))
+                "0gi77675gi1bbhrrg0p60dy06clf24xa0hz2jb74hnzk2gxbyaw5"))))
     (build-system gnu-build-system)
     (native-inputs
      (list pkg-config intltool
@@ -397,7 +397,7 @@ management D-Bus specification.")
 (define-public xfce4-panel
   (package
     (name "xfce4-panel")
-    (version "4.16.4")
+    (version "4.16.5")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://archive.xfce.org/src/xfce/"
@@ -405,7 +405,7 @@ management D-Bus specification.")
                                   name "-" version ".tar.bz2"))
               (sha256
                (base32
-                "116dr516dvcgnccc55p0ks5dgc1s7v9rvb66lkdl8lk53al53bqz"))
+                "0c42qy76wqa1mr2rk8ka2vwj6k8w2bn7dp00zq67dkvnpki96rh9"))
               (patches (search-patches "xfce4-panel-plugins.patch"))))
     (build-system gnu-build-system)
     (arguments
@@ -737,7 +737,7 @@ like appearance, display, keyboard and mouse settings.")
 (define-public thunar
   (package
     (name "thunar")
-    (version "4.16.10")                           ;stable version = even minor
+    (version "4.16.11")                           ;stable version = even minor
     (source (origin
               (method url-fetch)
               (uri (string-append "https://archive.xfce.org/src/xfce/"
@@ -745,7 +745,7 @@ like appearance, display, keyboard and mouse settings.")
                                   "thunar-" version ".tar.bz2"))
               (sha256
                (base32
-                "14lwi4ax0wj77980kkfhdf18b97339b17y8qc8gl2365mgswh1gi"))))
+                "06wa58dy9z28j7l4a2l7j052sa3h6vfpvxd440cy7qz5na8dwzgl"))))
     (build-system gnu-build-system)
     (native-inputs
      (list pkg-config intltool))
@@ -826,7 +826,7 @@ on the screen.")
 (define-public xfdesktop
   (package
     (name "xfdesktop")
-    (version "4.16.0")
+    (version "4.16.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://archive.xfce.org/src/xfce/"
@@ -834,7 +834,7 @@ on the screen.")
                                   "xfdesktop-" version ".tar.bz2"))
               (sha256
                (base32
-                "1bjv2mpkv7zmpzssbvvzh0x4pn8cqm8dvhgsv5i1xwngzspsajwk"))
+                "04dxljc74zlkz7h8wjj3hx9300r202a4d2hj8agfjmdf100cn7g3"))
               (modules '((guix build utils)))
               (snippet
                #~(begin
@@ -955,7 +955,7 @@ features playback of local media files, DVD/CD and live streams.")
 (define-public xfce4-terminal
   (package
     (name "xfce4-terminal")
-    (version "1.0.3")
+    (version "1.0.4")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://archive.xfce.org/src/apps/" name "/"
@@ -963,7 +963,7 @@ features playback of local media files, DVD/CD and live streams.")
                                   name "-" version ".tar.bz2"))
               (sha256
                (base32
-                "1vgmgz38q5902m4prbww4zy5j8n10pyq5ni3f46z7fpzxp9acs8w"))))
+                "1x5saijxykxmn2hksf4qvaj965b6i0wy62z9hgrc2vvwmxbmkrbq"))))
     (build-system gnu-build-system)
     (native-inputs
      (list pkg-config intltool))
@@ -1348,7 +1348,7 @@ of data to either CD/DVD/BD.")
 (define-public xfce4-screenshooter
   (package
    (name "xfce4-screenshooter")
-   (version "1.9.10")
+   (version "1.9.11")
    (source (origin
             (method url-fetch)
             (uri (string-append "https://archive.xfce.org/src/apps/"
@@ -1358,7 +1358,7 @@ of data to either CD/DVD/BD.")
                                 version ".tar.bz2"))
             (sha256
              (base32
-              "1mwjhakbjv9g6ffn6c55cbrfsrqhb2apwhmffvz8rfgm4y2igd04"))))
+              "1d7qyc2w4962crmkz5n0mma2qmyp9hhq455karyzacjbb6z0cgg7"))))
    (build-system gnu-build-system)
    (native-inputs
     (list pkg-config intltool
@@ -1504,7 +1504,7 @@ watch your every step.")
 (define-public xfce4-equake-plugin
    (package
    (name "xfce4-equake-plugin")
-   (version "1.3.8")
+   (version "1.3.8.1")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://archive.xfce.org/src/panel-plugins/"
@@ -1513,7 +1513,7 @@ watch your every step.")
                                   "/xfce4-equake-plugin-" version ".tar.bz2"))
               (sha256
                (base32
-                "09b9k0n5xm115k44x74w4ad0xqklilyfh0hglsps7zj97pd7a5a3"))))
+                "073lxks7fb0bwgsp5rfwa310b9vd5jz6y5q8aa69kgfi0kbczygg"))))
     (build-system gnu-build-system)
     (native-inputs
      (list intltool pkg-config))
diff --git a/gnu/packages/xiph.scm b/gnu/packages/xiph.scm
index ac476285ee..96651c03a0 100644
--- a/gnu/packages/xiph.scm
+++ b/gnu/packages/xiph.scm
@@ -499,7 +499,7 @@ icecast server.  It handles the socket connection, the timing of the data,
 and prevents bad data from getting to the icecast server.")
     (license license:gpl2+)))
 
-(define-public xiph-rnnoise
+(define-public rnnoise
   ;; No upstream release
   (let ((commit "7f449bf8bd3b933891d12c30112268c4090e4d59")
         (revision "0"))
@@ -517,17 +517,11 @@ and prevents bad data from getting to the icecast server.")
                  "0y8jdvxd9namw4f9hcmcmm2q0f32mnhfyjap8906hl308cws3rkj"))))
      (build-system gnu-build-system)
      (native-inputs
-      `(("autoconf" ,autoconf)
-        ("automake" ,automake)
-        ("libtool" ,libtool)))
+      (list autoconf automake libtool))
      (home-page "https://gitlab.xiph.org/xiph/rnnoise")
      (synopsis "Real-time noise suppression")
      (description "RNNoise is a noise suppression library based on a recurrent
 neural network.  The algorithm is described in Jean-Marc Valin's paper
 @cite{A Hybrid DSP/Deep Learning Approach to Real-Time Full-Band Speech
 Enhancement}.")
-     (license license:bsd-3)
-     (properties
-      ;; There's no public release and a conflicting package, so hide it for
-      ;; now.
-      `((hidden? . #t))))))
+     (license license:bsd-3))))
diff --git a/gnu/packages/xorg.scm b/gnu/packages/xorg.scm
index da4e4305e7..d3919cb0ce 100644
--- a/gnu/packages/xorg.scm
+++ b/gnu/packages/xorg.scm
@@ -450,16 +450,14 @@ Resources file.")
 (define-public encodings
   (package
     (name "encodings")
-    (version "1.0.5")
+    (version "1.0.6")
     (source
       (origin
         (method url-fetch)
-        (uri (string-append
-               "mirror://xorg/individual/font/encodings-"
-               version
-               ".tar.bz2"))
+        (uri (string-append "mirror://xorg/individual/font/encodings-"
+                            version ".tar.xz"))
         (sha256
-          (base32 "0caafx0yqqnqyvbalxhh3mb0r9v36xmcy5zjhygb2i508dhy35mx"))))
+          (base32 "09pwhj8arm9hx0819m1yykaw9n77lxavaq4gn4iacd8zcvg03qvp"))))
     (build-system gnu-build-system)
     (inputs
       (list mkfontscale))
@@ -825,16 +823,14 @@ For example: @code{6x10}, @code{9x15bold}, etc.")
 (define-public font-util
   (package
     (name "font-util")
-    (version "1.3.2")
+    (version "1.3.3")
     (source
       (origin
         (method url-fetch)
-        (uri (string-append
-               "mirror://xorg/individual/font/font-util-"
-               version
-               ".tar.bz2"))
+        (uri (string-append "mirror://xorg/individual/font/font-util-"
+                            version ".tar.xz"))
         (sha256
-          (base32 "10i2a8b3d1h3w7klsqf31iz7zbd6l8wglil54fkhdb1385281n1s"))))
+          (base32 "1lpb5qd2drilql4wl644m682hvmv67hdbbisnrm0ah4wfy8ci4g7"))))
     (build-system gnu-build-system)
     (native-inputs (list pkg-config))
     (home-page "https://www.x.org/wiki/")
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 27eae75c46..bb11732de2 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -2918,17 +2918,6 @@ to handle."
      "user = " default-session-user "\n"
      "command = " default-session-command "\n")))
 
-(define %greetd-accounts
-  (list (user-account
-         (name "greeter")
-         (group "greeter")
-         ;; video group is required for graphical greeters.
-         (supplementary-groups '("video"))
-         (system? #t))
-        (user-group
-         (name "greeter")
-         (system? #t))))
-
 (define %greetd-file-systems
   (list (file-system
           (device "none")
@@ -2956,7 +2945,16 @@ to handle."
   greetd-configuration?
   (motd greetd-motd (default %default-motd))
   (allow-empty-passwords? greetd-allow-empty-passwords? (default #t))
-  (terminals greetd-terminals (default '())))
+  (terminals greetd-terminals (default '()))
+  (greeter-supplementary-groups greetd-greeter-supplementary-groups (default '())))
+
+(define (greetd-accounts config)
+  (list (user-group (name "greeter") (system? #t))
+        (user-account
+         (name "greeter")
+         (group "greeter")
+         (supplementary-groups (greetd-greeter-supplementary-groups config))
+         (system? #t))))
 
 (define (make-greetd-pam-mount-conf-file config)
   (computed-file
@@ -3033,7 +3031,7 @@ mount/unmount /run/user/<uid> directory for user and @code{greetd}
 login manager daemon.")
    (extensions
     (list
-     (service-extension account-service-type (const %greetd-accounts))
+     (service-extension account-service-type greetd-accounts)
      (service-extension file-system-service-type (const %greetd-file-systems))
      (service-extension etc-service-type greetd-etc-service)
      (service-extension pam-root-service-type greetd-pam-service)
diff --git a/gnu/services/configuration.scm b/gnu/services/configuration.scm
index 3007e8de35..83da63c1b3 100644
--- a/gnu/services/configuration.scm
+++ b/gnu/services/configuration.scm
@@ -57,6 +57,9 @@
             serialize-configuration
             define-maybe
             define-maybe/no-serialization
+            %unset-value
+            maybe-value
+            maybe-value-set?
             generate-documentation
             configuration->documentation
             empty-serializer
@@ -142,7 +145,8 @@ does not have a default value" field kind)))
                                     (id #'stem #'serialize-maybe- #'stem))))
        #`(begin
            (define (maybe-stem? val)
-             (or (eq? val 'unset) (stem? val)))
+             (or (not (maybe-value-set? val))
+                 (stem? val)))
            #,@(if serialize?
                   (list #'(define (serialize-maybe-stem field-name val)
                             (if (stem? val)
@@ -170,10 +174,10 @@ does not have a default value" field kind)))
      (values #'(field-type def)))
     ((field-type)
      (identifier? #'field-type)
-     (values #'(field-type 'unset)))
+     (values #'(field-type %unset-value)))
     (field-type
      (identifier? #'field-type)
-     (values #'(field-type 'unset)))))
+     (values #'(field-type %unset-value)))))
 
 (define (define-configuration-helper serialize? serializer-prefix syn)
   (syntax-case syn ()
@@ -260,11 +264,10 @@ does not have a default value" field kind)))
                       (default-value-thunk
                         (lambda ()
                           (display '#,(id #'stem #'% #'stem))
-                          (if (eq? (syntax->datum field-default)
-                                   'unset)
+                          (if (maybe-value-set? (syntax->datum field-default))
+                              field-default
                               (configuration-missing-default-value
-                               '#,(id #'stem #'% #'stem) 'field)
-                              field-default)))
+                               '#,(id #'stem #'% #'stem) 'field))))
                       (documentation doc))
                      ...))))))))
 
@@ -300,6 +303,29 @@ does not have a default value" field kind)))
 (define (empty-serializer field-name val) "")
 (define serialize-package empty-serializer)
 
+;; Ideally this should be an implementation detail, but we export it
+;; to provide a simpler API that enables unsetting a configuration
+;; field that has a maybe type, but also a default value.  We give it
+;; a value that sticks out to the reader when something goes wrong.
+;;
+;; An example use-case would be something like a network application
+;; that uses a default port, but the field can explicitly be unset to
+;; request a random port at startup.
+(define %unset-value '%unset-marker%)
+
+(define (maybe-value-set? value)
+  "Predicate to check whether a 'maybe' value was explicitly provided."
+  (not (eq? %unset-value value)))
+
+;; Ideally there should be a compiler macro for this predicate, that expands
+;; to a conditional that only instantiates the default value when needed.
+(define* (maybe-value value #:optional (default #f))
+  "Returns VALUE, unless it is the unset value, in which case it returns
+DEFAULT."
+  (if (maybe-value-set? value)
+      value
+      default))
+
 ;; A little helper to make it easier to document all those fields.
 (define (generate-documentation documentation documentation-name)
   (define (str x) (object->string x))
diff --git a/gnu/services/desktop.scm b/gnu/services/desktop.scm
index f891d1b5cc..f60365abac 100644
--- a/gnu/services/desktop.scm
+++ b/gnu/services/desktop.scm
@@ -13,7 +13,7 @@
 ;;; Copyright © 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2020 Reza Alizadeh Majd <r.majd@pantherx.org>
 ;;; Copyright © 2021 Brice Waegeneire <brice@waegenei.re>
-;;; Copyright © 2021 muradm <mail@muradm.net>
+;;; Copyright © 2021, 2022 muradm <mail@muradm.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -69,6 +69,7 @@
   #:use-module (guix records)
   #:use-module (guix packages)
   #:use-module (guix store)
+  #:use-module (guix ui)
   #:use-module (guix utils)
   #:use-module (guix gexp)
   #:use-module (srfi srfi-1)
@@ -1643,12 +1644,19 @@ or setting its password with passwd.")))
 ;;; seatd-service-type -- minimal seat management daemon
 ;;;
 
+(define (seatd-group-sanitizer group-or-name)
+  (match group-or-name
+    ((? user-group? group) group)
+    ((? string? group-name) (user-group (name group-name) (system? #t)))
+    (_ (leave (G_ "seatd: '~a' is not a valid group~%") group-or-name))))
+
 (define-record-type* <seatd-configuration> seatd-configuration
   make-seatd-configuration
   seatd-configuration?
   (seatd seatd-package (default seatd))
-  (user seatd-user (default "root"))
-  (group seatd-group (default "users"))
+  (group seatd-group                    ; string | <user-group>
+         (default "seat")
+         (sanitize seatd-group-sanitizer))
   (socket seatd-socket (default "/run/seatd.sock"))
   (logfile seatd-logfile (default "/var/log/seatd.log"))
   (loglevel seatd-loglevel (default "info")))
@@ -1662,8 +1670,7 @@ or setting its password with passwd.")))
          (provision '(seatd elogind))
          (start #~(make-forkexec-constructor
                    (list #$(file-append (seatd-package config) "/bin/seatd")
-                         "-u" #$(seatd-user config)
-                         "-g" #$(seatd-group config))
+                         "-g" #$(user-group-name (seatd-group config)))
                    #:environment-variables
                    (list (string-append "SEATD_LOGLEVEL="
                                         #$(seatd-loglevel config))
@@ -1672,9 +1679,12 @@ or setting its password with passwd.")))
                    #:log-file #$(seatd-logfile config)))
          (stop #~(make-kill-destructor)))))
 
+(define seatd-accounts
+  (match-lambda (($ <seatd-configuration> _ group) (list group))))
+
 (define seatd-environment
   (match-lambda
-    (($ <seatd-configuration> _ _ _ socket)
+    (($ <seatd-configuration> _ _ socket)
      `(("SEATD_SOCK" . ,socket)))))
 
 (define seatd-service-type
@@ -1685,6 +1695,7 @@ to shared devices (graphics, input), without requiring the
 applications needing access to be root.")
    (extensions
     (list
+     (service-extension account-service-type seatd-accounts)
      (service-extension session-environment-service-type seatd-environment)
      ;; TODO: once cgroups is separate dependency we should not mount it here
      ;; for now it is mounted here, because elogind mounts it
diff --git a/gnu/services/file-sharing.scm b/gnu/services/file-sharing.scm
index 5df8b0d597..75e99f20b7 100644
--- a/gnu/services/file-sharing.scm
+++ b/gnu/services/file-sharing.scm
@@ -114,10 +114,7 @@ type generated and used by Transmission clients, suitable for passing to the
 ;; name-value pair for the JSON builder.
 (set! serialize-maybe-string
   (lambda (field-name val)
-    (serialize-string field-name
-                      (if (eq? val 'unset)
-                          ""
-                          val))))
+    (serialize-string field-name (maybe-value val ""))))
 
 (define (string-list? val)
   (and (list? val)
@@ -180,9 +177,9 @@ type generated and used by Transmission clients, suitable for passing to the
 (define-maybe file-object)
 (set! serialize-maybe-file-object
   (lambda (field-name val)
-    (if (eq? val 'unset)
-        (serialize-string field-name "")
-        (serialize-file-object field-name val))))
+    (if (maybe-value-set? val)
+        (serialize-file-object field-name val)
+        (serialize-string field-name ""))))
 
 (define (file-object-list? val)
   (and (list? val)
diff --git a/gnu/services/getmail.scm b/gnu/services/getmail.scm
index ce124f6b11..0a1c34cfd3 100644
--- a/gnu/services/getmail.scm
+++ b/gnu/services/getmail.scm
@@ -111,10 +111,10 @@
    "The type of mail retriever to use.  Valid values include
 @samp{passwd} and @samp{static}.")
   (server
-   (string 'unset)
+   string
    "Name or IP address of the server to retrieve mail from.")
   (username
-   (string 'unset)
+   string
    "Username to login to the mail server with.")
   (port
    (non-negative-integer #f)
@@ -143,7 +143,7 @@
 
 (define-configuration getmail-destination-configuration
   (type
-   (string 'unset)
+   string
    "The type of mail destination.  Valid values include @samp{Maildir},
 @samp{Mboxrd} and @samp{MDA_external}.")
   (path
diff --git a/gnu/services/kerberos.scm b/gnu/services/kerberos.scm
index f845c1bd89..c3c7872734 100644
--- a/gnu/services/kerberos.scm
+++ b/gnu/services/kerberos.scm
@@ -39,6 +39,7 @@
 
 
 
+;; TODO Use %unset-value and the define-maybe infrastructure.
 (define unset-field (list 'unset-field))
 
 (define (predicate/unset pred)
diff --git a/gnu/services/messaging.scm b/gnu/services/messaging.scm
index 00a1c80a14..02712ede7c 100644
--- a/gnu/services/messaging.scm
+++ b/gnu/services/messaging.scm
@@ -90,7 +90,12 @@
                      ((new-def ...)
                       (map (lambda (def target)
                              (if (eq? 'common (syntax->datum target))
-                                 #''unset def))
+                                 ;; TODO Use the %unset-value variable, or
+                                 ;; even better just simplify this so that it
+                                 ;; doesn't interfere with
+                                 ;; define-configuration and define-maybe
+                                 ;; internals.
+                                 #''%unset-marker% def))
                            #'(def ...) #'(target ...)))
                      ((new-doc ...)
                       (map (lambda (doc target)
@@ -200,7 +205,7 @@
 (define-maybe file-object-list)
 
 (define (raw-content? val)
-  (not (eq? val 'unset)))
+  (maybe-value-set? val))
 (define (serialize-raw-content field-name val)
   val)
 (define-maybe raw-content)
@@ -474,12 +479,12 @@ by the Prosody service.  See @url{https://prosody.im/doc/logging}."
      global)
 
     (http-max-content-size
-     (maybe-non-negative-integer 'unset)
+     (maybe-non-negative-integer %unset-value)
      "Maximum allowed size of the HTTP body (in bytes)."
      common)
 
     (http-external-url
-     (maybe-string 'unset)
+     (maybe-string %unset-value)
      "Some modules expose their own URL in various ways.  This URL is built
 from the protocol, host and port used.  If Prosody sits behind a proxy, the
 public URL will be @code{http-external-url} instead.  See
@@ -556,7 +561,7 @@ support.  To add an external component, you simply fill the hostname field.  See
      int-component)
 
     (mod-muc
-     (maybe-mod-muc-configuration 'unset)
+     (maybe-mod-muc-configuration %unset-value)
      "Multi-user chat (MUC) is Prosody's module for allowing you to create
 hosted chatrooms/conferences for XMPP users.
 
@@ -573,7 +578,7 @@ See also @url{https://prosody.im/doc/modules/mod_muc}."
      ext-component)
 
     (raw-content
-     (maybe-raw-content 'unset)
+     (maybe-raw-content %unset-value)
      "Raw content that will be added to the configuration file."
      common)))
 
diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
index 3c6395b6ca..9d85728371 100644
--- a/gnu/services/networking.scm
+++ b/gnu/services/networking.scm
@@ -772,7 +772,7 @@ logging is disabled.")
 network.  A specific port value can be provided by appending the @code{:PORT}
 suffix.  By default, it uses the Jami bootstrap nodes, but any host can be
 specified here.  It's also possible to disable bootstrapping by explicitly
-setting this field to the @code{'unset} value.")
+setting this field to @code{%unset-value}.")
   (port
    (maybe-number 4222)
    "The UDP port to bind to.  When left unspecified, an available port is
diff --git a/gnu/services/telephony.scm b/gnu/services/telephony.scm
index 7152f3b38d..3d855221e5 100644
--- a/gnu/services/telephony.scm
+++ b/gnu/services/telephony.scm
@@ -307,7 +307,7 @@ CONFIG, a <jami-configuration> object."
          (dbus (jami-configuration-dbus config))
          (dbus-daemon (file-append dbus "/bin/dbus-daemon"))
          (accounts (jami-configuration-accounts config))
-         (declarative-mode? (not (eq? 'unset accounts))))
+         (declarative-mode? (maybe-value-set? accounts)))
 
     (with-extensions (list guile-packrat ;used by guile-ac-d-bus
                            guile-ac-d-bus
@@ -649,7 +649,7 @@ argument, either a registered username or the fingerprint of the account.")
                                           account-details)
                            (let ((username (archive-name->username
                                             archive)))
-                             (when (not (eq? 'unset allowed-contacts))
+                             (when (not (eq? '#$%unset-value allowed-contacts))
                                ;; Reject calls from unknown contacts.
                                (set-account-details
                                 '(("DHT.PublicInCalls" . "false")) username)
@@ -659,7 +659,7 @@ argument, either a registered username or the fingerprint of the account.")
                                ;; Add allowed ones.
                                (for-each (cut add-contact <> username)
                                          allowed-contacts))
-                             (when (not (eq? 'unset moderators))
+                             (when (not (eq? '#$%unset-value moderators))
                                ;; Disable the 'AllModerators' property.
                                (set-all-moderators #f username)
                                ;; Remove all moderators.
diff --git a/gnu/tests/desktop.scm b/gnu/tests/desktop.scm
index 25971f9225..95b33da25e 100644
--- a/gnu/tests/desktop.scm
+++ b/gnu/tests/desktop.scm
@@ -122,6 +122,7 @@
     (service seatd-service-type)
     (service greetd-service-type
              (greetd-configuration
+              (greeter-supplementary-groups '("input" "video"))
               (terminals
                (list
                 ;; we can make any terminal active by default
@@ -255,6 +256,15 @@ minimal %BASE-SERVICES."
                    (socks (map wait-for-unix-socket-m socks)))
                 (and (= 2 (length socks)) (every identity socks)))))
 
+          (test-equal "seatd.sock ownership"
+            '("root" "seat")
+            `(,(marionette-eval
+                '(passwd:name (getpwuid (stat:uid (stat "/run/seatd.sock"))))
+                marionette)
+              ,(marionette-eval
+                '(group:name (getgrgid (stat:gid (stat "/run/seatd.sock"))))
+                marionette)))
+
           (test-assert "greetd is ready"
             (begin
               (marionette-type "ps -C greetd -o pid,args --no-headers > ps-greetd\n"
@@ -286,6 +296,13 @@ minimal %BASE-SERVICES."
               (marionette-type "echo alice > /run/user/1000/test\n" marionette)
               (file-get-all-strings "/run/user/1000/test")))
 
+          (test-equal "check greeter user has correct groups"
+            "greeter input video\n"
+            (begin
+              (marionette-type "id -Gn greeter > /run/user/1000/greeter-groups\n"
+                               marionette)
+              (file-get-all-strings "/run/user/1000/greeter-groups")))
+
           (test-assert "screendump"
             (begin
               (marionette-control (string-append "screendump " #$output