texlive[63007] Master/texmf-dist: l3 (11apr22)

commits+karl at tug.org commits+karl at tug.org
Mon Apr 11 22:14:44 CEST 2022


Revision: 63007
          http://tug.org/svn/texlive?view=revision&revision=63007
Author:   karl
Date:     2022-04-11 22:14:43 +0200 (Mon, 11 Apr 2022)
Log Message:
-----------
l3 (11apr22)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3backend/README.md
    trunk/Master/texmf-dist/doc/latex/l3backend/l3backend-code.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3bitset/l3bitset.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3opacity/l3opacity.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
    trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
    trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3doc.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
    trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx
    trunk/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
    trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
    trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-luatex.def
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
    trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-xetex.def
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
    trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua
    trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def

Modified: trunk/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3backend/CHANGELOG.md	2022-04-11 20:14:43 UTC (rev 63007)
@@ -6,6 +6,19 @@
 
 ## [Unreleased]
 
+## [2022-04-10]
+
+### Added
+- Support for graphics (PDF) page count extraction
+
+### Fixed
+- Setup for graphics extension searching
+- Various internal issues in graphics inclusion
+- Some missing functions for `dvisvgm` color support added
+
+### Removed
+- Support for pre-2020-11-11 `dvipdfmx`
+
 ## [2022-02-07]
 
 ### Fixed
@@ -217,7 +230,8 @@
 - Include `l3backend` in file names
 - Moved backend code to internal for each 'parent' module
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2022-02-07...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2022-04-10...HEAD
+[2022-04-10]: https://github.com/latex3/latex3/compare/2022-02-07...2022-04-10
 [2022-02-07]: https://github.com/latex3/latex3/compare/2022-01-12...2022-02-07
 [2022-01-12]: https://github.com/latex3/latex3/compare/2021-12-14...2022-01-12
 [2021-12-14]: https://github.com/latex3/latex3/compare/2021-10-17...2021-12-14

Modified: trunk/Master/texmf-dist/doc/latex/l3backend/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3backend/README.md	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3backend/README.md	2022-04-11 20:14:43 UTC (rev 63007)
@@ -1,7 +1,7 @@
 LaTeX3 Backend Drivers
 ======================
 
-Release 2022-02-07
+Release 2022-04-10
 
 This package forms parts of `expl3`, and contains the code used to interface
 with backends (drivers) across the `expl3` codebase. The functions here are

Modified: trunk/Master/texmf-dist/doc/latex/l3backend/l3backend-code.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/CHANGELOG.md	2022-04-11 20:14:43 UTC (rev 63007)
@@ -7,6 +7,16 @@
 
 ## [Unreleased]
 
+## [2022-04-10]
+
+### Added
+- `\graphics_get_pagecount:nN(TF)`
+
+### Changed
+- Return an empty `seq` when `\sys_shell_split_ls:nN` is applied with a
+  glob which matched no entries
+- Heavily revise `l3graphics` to provide only necessary public interfaces
+
 ## [2022-02-05]
 
 ### Changed
@@ -236,7 +246,8 @@
 - New `l3color` module using `xcolor`-like expression syntax
 - New `l3draw` module, based on `pgf` layer of the TikZ system
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2022-02-05...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2022-04-10...HEAD
+[2022-04-10]: https://github.com/latex3/latex3/compare/2022-02-05...2022-04-10
 [2022-02-05]: https://github.com/latex3/latex3/compare/2021-11-12...2022-02-05
 [2021-11-12]: https://github.com/latex3/latex3/compare/2021-08-27...2021-11-12
 [2021-08-27]: https://github.com/latex3/latex3/compare/2021-08-04...2021-08-27

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3experimental/README.md	2022-04-11 20:14:43 UTC (rev 63007)
@@ -1,7 +1,7 @@
 Experimental LaTeX3 Concepts
 ============================
 
-Release 2022-02-05
+Release 2022-04-10
 
 Overview
 --------

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3bitset/l3bitset.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw-code.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3draw/l3draw.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3graphics/l3graphics.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3opacity/l3opacity.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3str/l3str-format.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/l3sys-shell/l3sys-shell.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xcoffins/xcoffins.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/l3galley.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3experimental/xgalley/xgalley.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2022-04-11 20:14:43 UTC (rev 63007)
@@ -7,6 +7,26 @@
 
 ## [Unreleased]
 
+## [2022-04-10]
+
+### Added
+- `\keys_precompile:nnN` for conversion of keyvals to fast-to-apply token
+  lists
+- Missing `\str_if_empty:n(TF)` (see issue \#1071)
+- Missing `\str_case:Nn(TF)` (see issue \#1071)
+- `\tex_...:D` names for primitives added in TeX Live 2022
+
+### Changed
+- Definition of `\legacy_if:n(TF)` to support primitive conditionals
+- `\str_<type>case:n` now case changes codepoints above 127 with all engines
+- `\char_generate:nn` now also allows to generate category 10 tokens (spaces)
+  except for char code 0
+
+### Fixed
+- Handling of 'misplaced' `\protect` by `\text_expand:n`
+- Nesting of `\tl_analysis_map_inline:nn`
+- Naming of an error message
+
 ## [2022-02-24]
 
 ### Changed
@@ -1053,7 +1073,8 @@
 - Step functions have been added for dim variables,
   e.g. `\dim_step_inline:nnnn`
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2022-02-24...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2022-04-10...HEAD
+[2022-04-10]: https://github.com/latex3/latex3/compare/2022-02-24...2022-04-10
 [2022-02-24]: https://github.com/latex3/latex3/compare/2022-02-21...2022-02-24
 [2022-02-21]: https://github.com/latex3/latex3/compare/2022-02-05...2022-02-21
 [2022-02-05]: https://github.com/latex3/latex3/compare/2022-01-21...2022-02-05

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2022-04-11 20:14:43 UTC (rev 63007)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2022-02-24
+Release 2022-04-10
 
 Overview
 --------

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/expl3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2022-04-11 20:14:43 UTC (rev 63007)
@@ -54,7 +54,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2022-02-24}
+\date{Released 2022-04-10}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3doc.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3docstrip.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news01.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news02.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news03.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news04.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news05.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news06.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news07.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news08.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news09.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news10.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news11.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3news12.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.csv	2022-04-11 20:14:43 UTC (rev 63007)
@@ -40,6 +40,7 @@
 cmd,latex2e,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex2e.git,https://github.com/latex3/latex2e/issues,2021-01-20,2021-03-03,
 code,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2021-04-23,2021-04-23,
 codedoc,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,Somewhat experimental: may change
+codehigh,codehigh,Jianrui Lyu,https://github.com/lvjr/codehigh,https://github.com/lvjr/codehigh.git,https://github.com/lvjr/codehigh/issues,2022-04-02,2022-04-02,
 coffin,"l3kernel,xcoffins",The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
 colon,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
 color,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
@@ -89,6 +90,7 @@
 fontsizes,fontsizes,Julien Rivaud,,,,,2018-06-13,
 fontspec,fontspec,Will Robertson,https://github.com/wspr/fontspec,https://github.com/wspr/fontspec.git,https://github.com/wspr/fontspec/issues,2013-03-16,2013-03-16,
 fp,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
+fun,functional,Jianrui Lyu,https://github.com/lvjr/functional,https://github.com/lvjr/functional.git,https://github.com/lvjr/functional/issues,2022-04-02,2022-04-02,
 galley,l3galley,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
 gatherenum,gatherenum,Julien Rivaud,,,,2018-06-13,2018-06-14,
 getree,genealogytree,Thomas F. Sturm,https://github.com/T-F-S/genealogytree,https://github.com/T-F-S/genealogytree.git,https://github.com/T-F-S/genealogytree/issues,2020-02-19,2020-02-19,
@@ -125,6 +127,7 @@
 log,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
 lua,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
 luatex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
+lwc,lua-widow-control,Max Chernoff,https://github.com/gucci-on-fleek/lua-widow-control,https://github.com/gucci-on-fleek/lua-widow-control.git,https://github.com/gucci-on-fleek/lua-widow-control/issues,2022-02-24,2022-02-24,
 mark,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
 markdown,markdown,Vít Novotný,https://ctan.org/pkg/markdown,https://github.com/witiko/markdown.git,https://github.com/witiko/markdown/issues,2021-09-08,2021-09-08,
 marks,l3kernel/xmarks,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2020-02-17,2020-02-17,
@@ -149,6 +152,7 @@
 nan,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
 nicematrix,nicematrix,François Pantigny,,,,2019-12-19,2019-12-19,
 nil,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
+ninecolors,ninecolors,Jianrui Lyu,https://github.com/lvjr/ninecolors,https://github.com/lvjr/ninecolors.git,https://github.com/lvjr/ninecolors/issues,2022-04-02,2022-04-02,
 nmc,numerica,Andrew Parsloe,,,,2021-06-30,2021-06-30,
 no,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
 notestobib,notes2bib,Joseph Wright,https://github.com/josephwright/notes2bib,https://github.com/josephwright/notes2bib.git,https://github.com/josephwright/notes2bib/issues,2012-11-07,2012-11-07,
@@ -218,6 +222,7 @@
 sys,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2015-09-07,2015-09-08,
 tag,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2019-06-02,2019-06-02,
 tasks,tasks,Clemens Niederberger,https://github.com/cgnieder/tasks/,https://github.com/cgnieder/tasks.git,https://github.com/cgnieder/cgnieder/tasks/issues,2013-03-16,2020-04-14,
+tblr,tabularray,Jianrui Lyu,https://github.com/lvjr/tabularray,https://github.com/lvjr/tabularray.git,https://github.com/lvjr/tabularray/issues,2022-04-02,2022-04-02
 tcobox,tcolorbox,Thomas F. Sturm,https://github.com/T-F-S/tcolorbox,https://github.com/T-F-S/tcolorbox.git,https://github.com/T-F-S/tcolorbox/issues,2020-02-19,2020-02-19,
 term,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
 tex,l3kernel,The LaTeX Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3prefixes.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2022-04-11 20:14:43 UTC (rev 63007)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2022-02-24}
+\date{Released 2022-04-10}
 
 \begin{document}
 

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2022-04-11 20:14:43 UTC (rev 63007)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2022-02-24}
+\date{Released 2022-04-10}
 
 \newcommand{\TF}{\textit{(TF)}}
 

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2022-04-11 20:14:43 UTC (rev 63007)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2022-02-24}
+\date{Released 2022-04-10}
 
 \newcommand{\TF}{\textit{(TF)}}
 

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2022-04-11 20:14:43 UTC (rev 63007)
@@ -53,7 +53,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2022-02-24}
+\date{Released 2022-04-10}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3body.tex	2022-04-11 20:14:43 UTC (rev 63007)
@@ -207,7 +207,9 @@
   \item[\texttt{c}] This means \emph{csname}, and indicates that the
     argument will be turned into a csname before being used. So
     |\foo:c| |{ArgumentOne}| will act in the same way as |\foo:N|
-    |\ArgumentOne|.
+    |\ArgumentOne|. All macros that appear in the argument are expanded.
+    An internal error will occur if the result of expansion inside
+    a \texttt{c}-type argument is not a series of character tokens.
   \item[\texttt{V} and \texttt{v}] These mean \emph{value
     of variable}. The \texttt{V} and \texttt{v} specifiers are used to
     get the content of a variable without needing to worry about the

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-basics.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -70,27 +70,27 @@
 %    \begin{macrocode}
 \ProvidesExplFile
 %<*dvipdfmx>
-  {l3backend-dvipdfmx.def}{2022-02-07}{}
+  {l3backend-dvipdfmx.def}{2022-04-10}{}
   {L3 backend support: dvipdfmx}
 %</dvipdfmx>
 %<*dvips>
-  {l3backend-dvips.def}{2022-02-07}{}
+  {l3backend-dvips.def}{2022-04-10}{}
   {L3 backend support: dvips}
 %</dvips>
 %<*dvisvgm>
-  {l3backend-dvisvgm.def}{2022-02-07}{}
+  {l3backend-dvisvgm.def}{2022-04-10}{}
   {L3 backend support: dvisvgm}
 %</dvisvgm>
 %<*luatex>
-  {l3backend-luatex.def}{2022-02-07}{}
+  {l3backend-luatex.def}{2022-04-10}{}
   {L3 backend support: PDF output (LuaTeX)}
 %</luatex>
 %<*pdftex>
-  {l3backend-pdftex.def}{2022-02-07}{}
+  {l3backend-pdftex.def}{2022-04-10}{}
   {L3 backend support: PDF output (pdfTeX)}
 %</pdftex>
 %<*xetex>
-  {l3backend-xetex.def}{2022-02-07}{}
+  {l3backend-xetex.def}{2022-04-10}{}
   {L3 backend support: XeTeX}
 %</xetex>
 %    \end{macrocode}
@@ -395,35 +395,6 @@
 % \end{macro}
 %
 %    \begin{macrocode}
-%<@@=sys>
-%    \end{macrocode}
-%
-% \begin{macro}{\c__kernel_sys_dvipdfmx_version_int}
-%   A short excursion into the |sys| module to set up the backend version
-%   information.
-%    \begin{macrocode}
-\group_begin:
-  \cs_set:Npn \@@_tmp:w #1 Version ~ #2 ~ #3 \q_stop {#2}
-  \sys_get_shell:nnNTF { extractbb~--version }
-    { \char_set_catcode_space:n { `\  } }
-    \l_@@_internal_tl
-    {
-      \int_const:Nn \c__kernel_sys_dvipdfmx_version_int
-        {
-          \exp_after:wN \@@_tmp:w \l_@@_internal_tl
-            \q_stop
-        }
-    }
-    { \int_const:Nn \c__kernel_sys_dvipdfmx_version_int { 0 } }
-\group_end:
-%    \end{macrocode}
-% \end{macro}
-%
-%    \begin{macrocode}
-%<@@=>
-%    \end{macrocode}
-%
-%    \begin{macrocode}
 %</dvipdfmx|xetex>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-box.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-color.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -203,54 +203,50 @@
 %   In \texttt{(x)dvipdfmx}, the base color stack is not set up, so we have to
 %   force that, as well as providing a mechanism more generally.
 %    \begin{macrocode}
-\int_compare:nNnTF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  { \cs_new_protected:Npn \__kernel_color_backend_stack_init:Nnn #1#2#3 { } }
+\int_new:N \g_@@_backend_stack_int
+\cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3
   {
-    \int_new:N \g_@@_backend_stack_int
-    \cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3
+    \int_gincr:N \exp_not:N \g_@@_backend_stack_int
+    \int_const:Nn #1 { \exp_not:N \g_@@_backend_stack_int }
+    \use:x
       {
-        \int_gincr:N \exp_not:N \g_@@_backend_stack_int
-        \int_const:Nn #1 { \exp_not:N \g_@@_backend_stack_int }
-        \use:x
+        \__kernel_backend_first_shipout:n
           {
-            \__kernel_backend_first_shipout:n
+            \__kernel_backend_literal:n
               {
-                \__kernel_backend_literal:n
-                  {
-                    pdfcolorstackinit ~
-                    \exp_not:N \int_use:N \exp_not:N \g_@@_backend_stack_int
-                    \c_space_tl
-                    \exp_not:N \tl_if_blank:nF {#2} { #2 ~ }
-                    (#3)
-                  }
+                pdfcolorstackinit ~
+                \exp_not:N \int_use:N \exp_not:N \g_@@_backend_stack_int
+                \c_space_tl
+                \exp_not:N \tl_if_blank:nF {#2} { #2 ~ }
+                (#3)
               }
-          }
+        }
       }
-    \cs_if_exist:cTF { main at pdfcolorstack }
-      {
-        \int_set:Nn \l_@@_backend_stack_int
-          { \int_use:c { main at pdfcolorstack } }
-      }
-      {
-        \__kernel_color_backend_stack_init:Nnn \c_@@_backend_main_stack_int
-          { page ~ direct } { 0 ~ g ~ 0 ~ G }
-        \int_set_eq:NN \l_@@_backend_stack_int
-          \c_@@_backend_main_stack_int
-        \int_const:cn { main at pdfcolorstack } { \c_@@_backend_main_stack_int }
-      }
+  }
+\cs_if_exist:cTF { main at pdfcolorstack }
+  {
+    \int_set:Nn \l_@@_backend_stack_int
+      { \int_use:c { main at pdfcolorstack } }
+  }
+  {
+    \__kernel_color_backend_stack_init:Nnn \c_@@_backend_main_stack_int
+      { page ~ direct } { 0 ~ g ~ 0 ~ G }
+    \int_set_eq:NN \l_@@_backend_stack_int
+      \c_@@_backend_main_stack_int
+    \int_const:cn { main at pdfcolorstack } { \c_@@_backend_main_stack_int }
+  }
 %    \end{macrocode}
 %   The backend automatically restores the stack color from the \enquote{classical}
 %   approach (\texttt{pdf:bcolor}) after a scope. That will be an issue for us, so
 %   we manually ensure that the one we are using is inserted.
 %    \begin{macrocode}
-    \cs_gset_protected:Npn \__kernel_backend_scope_end:
+\cs_gset_protected:Npn \__kernel_backend_scope_end:
+  {
+    \__kernel_backend_literal:n { x:grestore }
+    \__kernel_backend_literal:x
       {
-        \__kernel_backend_literal:n { x:grestore }
-        \__kernel_backend_literal:x
-          {
-            pdfcolorstack ~
-            \int_use:N \g_@@_backend_stack_int \c_space_tl current
-          }
+        pdfcolorstack ~
+        \int_use:N \g_@@_backend_stack_int \c_space_tl current
       }
   }
 %    \end{macrocode}
@@ -261,26 +257,23 @@
 % \begin{macro}{\__kernel_color_backend_stack_pop:n}
 %   Simple enough but needs a version check.
 %    \begin{macrocode}
-\int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
+\cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2
   {
-    \cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2
+    \__kernel_backend_literal:x
       {
-        \__kernel_backend_literal:x
-          {
-            pdfcolorstack ~
-            \int_eval:n {#1} ~
-            push ~ (#2)
-          }
+        pdfcolorstack ~
+        \int_eval:n {#1} ~
+        push ~ (#2)
       }
-    \cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx }
-    \cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1
+  }
+\cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx }
+\cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1
+  {
+    \__kernel_backend_literal:x
       {
-        \__kernel_backend_literal:x
-          {
-            pdfcolorstack ~
-            \int_eval:n {#1} ~
-            pop
-          }
+        pdfcolorstack ~
+        \int_eval:n {#1} ~
+        pop
       }
   }
 %    \end{macrocode}
@@ -440,10 +433,6 @@
 %
 % \subsubsection{\texttt{dvipmdfx}/\XeTeX{}}
 %
-%    \begin{macrocode}
-%<*dvipdfmx|xetex>
-%    \end{macrocode}
-%
 % These backends have the most possible approaches: it recognises both
 % \texttt{dvips}-based color specials and it's own format, plus one can
 % include PDF statements directly. Recent releases also have a color stack
@@ -452,32 +441,6 @@
 % we have. Thus it is used in preference to the \texttt{dvips}-style interface
 % or the \enquote{native} color specials (which have only one stack).
 %
-% \begin{macro}
-%   {
-%     \@@_backend_select_cmyk:n  ,
-%     \@@_backend_select_gray:n  ,
-%     \@@_backend_select_rgb:n
-%   }
-% \begin{macro}{\@@_backend_reset:}
-%    Push the data to the stack.
-%    \begin{macrocode}
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  {
-    \cs_gset_protected:Npn \@@_backend_select_cmyk:n #1
-      { \__kernel_backend_literal:n { pdf: bc ~ [#1] } }
-    \cs_gset_eq:NN \@@_backend_select_gray:n \@@_backend_select_cmyk:n
-    \cs_gset_eq:NN \@@_backend_select_rgb:n \@@_backend_select_cmyk:n
-    \cs_gset_protected:Npn \@@_backend_reset:
-      { \__kernel_backend_literal:n { pdf: ec } }
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%    \begin{macrocode}
-%</dvipdfmx|xetex>
-%    \end{macrocode}
-%
 % \subsection{Separations}
 %
 % Here, life gets interesting and we need essentially one approach per
@@ -1097,28 +1060,6 @@
 %</dvipdfmx|luatex|pdftex|xetex>
 %    \end{macrocode}
 %
-%    \begin{macrocode}
-%<*dvipdfmx|xetex>
-%    \end{macrocode}
-%
-% \begin{macro}{\@@_backend_select_separation:nn, \@@_backend_select_devicen:nn}
-%   For older \texttt{(x)dvipdfmx}, we \emph{could} support separations using a
-%   dedicated mechanism, but it was not added that long before the color
-%   stacks. So instead of having two complex paths, just disable here.
-%    \begin{macrocode}
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  {
-    \cs_gset_protected:Npn \@@_backend_select_separation:nn #1#2 { }
-    \cs_gset_eq:NN \@@_backend_select_devicen:nn
-      \@@_backend_select_separation:nn
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-%    \begin{macrocode}
-%</dvipdfmx|xetex>
-%    \end{macrocode}
-%
 % \subsection{Fill and stroke color}
 %
 % Here, \texttt{dvipdfmx}/\XeTeX{} follows \LuaTeX{} and \pdfTeX{},
@@ -1198,52 +1139,6 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-%<*dvipdfmx|xetex>
-%    \end{macrocode}
-%
-% \begin{macro}
-%   {
-%     \@@_backend_fill_cmyk:n   ,
-%     \@@_backend_fill_gray:n   ,
-%     \@@_backend_fill_rgb:n
-%   }
-% \begin{macro}{\@@_backend_reset:}
-% \begin{macro}{\@@_backend_stroke:n}
-% \begin{macro}{\@@_backend_fill_separation:nn, \@@_backend_stroke_separation:nn}
-%   Deal with older \texttt{(x)dvipdfmx}.
-%    \begin{macrocode}
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  {
-    \cs_gset_protected:Npn \@@_backend_fill_cmyk:n #1
-      {
-        \__kernel_backend_literal:n { pdf: bc ~ [#1] }
-        \group_insert_after:N \@@_backend_reset:
-      }
-    \cs_gset_eq:NN \@@_backend_fill_gray:n \@@_backend_fill_cmyk:n
-    \cs_gset_eq:NN \@@_backend_fill_rgb:n \@@_backend_fill_cmyk:n
-    \cs_gset_protected:Npn \@@_backend_reset:
-      { \__kernel_backend_literal:n { pdf: ec } }
-    \cs_gset_protected:Npn \@@_backend_stroke:n #1
-      { \__kernel_backend_literal:n {#1} }
-    \cs_gset_protected:Npn \@@_backend_fill_separation:nn #1#2 { }
-    \cs_gset_eq:NN \@@_backend_fill_devicen:nn
-      \@@_backend_fill_separation:nn
-    \cs_gset_eq:NN \@@_backend_stroke_separation:nn
-      \@@_backend_fill_separation:nn
-    \cs_gset_eq:NN \@@_backend_stroke_devicen:nn
-      \@@_backend_stroke_separation:nn
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%    \begin{macrocode}
-%</dvipdfmx|xetex>
-%    \end{macrocode}
-%
-%    \begin{macrocode}
 %<*dvips>
 %    \end{macrocode}
 %
@@ -1414,7 +1309,15 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_backend_devicen_init:nnn, \@@_backend_iccbased_init:nnn}
+%   No support at present.
 %    \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_devicen_init:nnn #1#2#3 { }
+\cs_new_protected:Npn \@@_backend_iccbased_init:nnn #1#2#3 { }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</dvisvgm>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-draw.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-graphics.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -60,6 +60,23 @@
 %<@@=graphics>
 %    \end{macrocode}
 %
+% \begin{macro}{\@@_backend_loaded:n}
+%   To deal with file load ordering. Plain users are on their own.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_loaded:n #1
+  {
+    \cs_if_exist:NTF \hook_gput_code:nnn
+      {
+        \hook_gput_code:nnn
+          { file / l3graphics.sty / after }
+          { backend }
+          {#1}
+      }
+      {#1}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{\texttt{dvips} backend}
 %
 %    \begin{macrocode}
@@ -66,14 +83,25 @@
 %<*dvips>
 %    \end{macrocode}
 %
-% \begin{macro}{\@@_backend_getbb_eps:n}
+% \begin{variable}{\l_graphics_search_ext_seq}
+%    \begin{macrocode}
+\@@_backend_loaded:n
+  { \seq_set_from_clist:Nn \l_graphics_search_ext_seq { .eps , .ps } }
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}{\@@_backend_getbb_eps:n, \@@_backend_getbb_ps:n}
 %   Simply use the generic function.
 %    \begin{macrocode}
-\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n
+\@@_backend_loaded:n
+  {
+    \cs_new_eq:NN \@@_backend_getbb_eps:n \@@_read_bb:n
+    \cs_new_eq:NN \@@_backend_getbb_ps:n \@@_read_bb:n
+  }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_backend_include_eps:n}
+% \begin{macro}{\@@_backend_include_eps:n, \@@_backend_include_ps:n}
 %  The special syntax is relatively clear here: remember we need PostScript
 %  sizes here.
 %    \begin{macrocode}
@@ -82,16 +110,24 @@
     \__kernel_backend_literal:x
       {
         PSfile = #1 \c_space_tl
-        llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
-        lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
-        urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
-        ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim
+        llx = \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl
+        lly = \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl
+        urx = \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl
+        ury = \dim_to_decimal_in_bp:n \l_@@_ury_dim
       }
   }
+\cs_new_eq:NN \@@_backend_include_ps:n \@@_backend_include_eps:n
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_backend_get_pagecount:n}
 %    \begin{macrocode}
+\@@_backend_loaded:n
+  { \cs_new_eq:NN \@@_backend_get_pagecount:n \@@_get_pagecount:n }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</dvips>
 %    \end{macrocode}
 %
@@ -101,6 +137,17 @@
 %<*luatex|pdftex>
 %    \end{macrocode}
 %
+% \begin{variable}{\l_graphics_search_ext_seq}
+%    \begin{macrocode}
+\@@_backend_loaded:n
+  {
+    \seq_set_from_clist:Nn
+      \l_graphics_search_ext_seq
+      { .pdf , .eps , .png , .jpg , .jpeg  }
+  }
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{variable}{\l_@@_graphics_attr_tl}
 %   In PDF mode, additional attributes of an graphic (such as page number) are
 %   needed both to obtain the bounding box and when inserting the graphic: this
@@ -115,12 +162,18 @@
 %
 % \begin{macro}
 %   {
-%     \@@_backend_getbb_jpg:n,
-%     \@@_backend_getbb_pdf:n,
+%     \@@_backend_getbb_jpg:n  ,
+%     \@@_backend_getbb_jpeg:n ,
+%     \@@_backend_getbb_pdf:n  ,
 %     \@@_backend_getbb_png:n
 %   }
 % \begin{macro}
-%   {\@@_backend_getbb_auxi:n, \@@_backend_getbb_auxii:n}
+%   {
+%     \@@_backend_getbb_auxi:n   ,
+%     \@@_backend_getbb_auxii:n  ,
+%     \@@_backend_getbb_auxiii:n
+%   }
+% \begin{macro}[EXP]{\@@_backend_dequote:w}
 %   Getting the bounding box here requires us to box up the graphic and
 %   measure it. To deal with the difference in feature support in bitmap
 %   and vector graphics but keeping the common parts, there is a little work
@@ -130,34 +183,35 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_backend_getbb_jpg:n #1
   {
-    \int_zero:N \l_graphics_page_int
-    \tl_clear:N \l_graphics_pagebox_tl
+    \int_zero:N \l_@@_page_int
+    \tl_clear:N \l_@@_pagebox_tl
     \tl_set:Nx \l_@@_graphics_attr_tl
       {
-        \tl_if_empty:NF \l_graphics_decodearray_tl
-          { :D \l_graphics_decodearray_tl }
-        \bool_if:NT \l_graphics_interpolate_bool
+        \tl_if_empty:NF \l_@@_decodearray_str
+          { :D \l_@@_decodearray_str }
+        \bool_if:NT \l_@@_interpolate_bool
           { :I }
       }
     \tl_clear:N \l_@@_graphics_attr_tl
     \@@_backend_getbb_auxi:n {#1}
   }
+\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n
 \cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n
 \cs_new_protected:Npn \@@_backend_getbb_pdf:n #1
   {
-    \tl_clear:N \l_graphics_decodearray_tl
-    \bool_set_false:N \l_graphics_interpolate_bool
+    \tl_clear:N \l_@@_decodearray_str
+    \bool_set_false:N \l_@@_interpolate_bool
     \tl_set:Nx \l_@@_graphics_attr_tl
       {
-        : \l_graphics_pagebox_tl
-        \int_compare:nNnT \l_graphics_page_int > 1
-          { :P \int_use:N \l_graphics_page_int }
+        : \l_@@_pagebox_tl
+        \int_compare:nNnT \l_@@_page_int > 1
+          { :P \int_use:N \l_@@_page_int }
       }
     \@@_backend_getbb_auxi:n {#1}
   }
 \cs_new_protected:Npn \@@_backend_getbb_auxi:n #1
   {
-    \graphics_bb_restore:xF { #1 \l_@@_graphics_attr_tl }
+    \@@_bb_restore:xF { #1 \l_@@_graphics_attr_tl }
       { \@@_backend_getbb_auxii:n {#1} }
   }
 %    \end{macrocode}
@@ -164,44 +218,53 @@
 %   Measuring the graphic is done by boxing up: for PDF graphics we could
 %   use |\tex_pdfximagebbox:D|, but if doesn't work for other types.
 %   As the box always starts at $(0,0)$ there is no need to worry about
-%   the lower-left position.
+%   the lower-left position. Quotes need to be \emph{removed} as \LuaTeX{}
+%   does not like them here.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_backend_getbb_auxii:n #1
   {
+    \exp_args:Ne \@@_backend_getbb_auxiii:n
+      { \@@_backend_dequote:w #1 " #1 " \s_@@_stop }
+    \int_const:cn { c_@@_ #1 \l_@@_graphics_attr_tl _int }
+      { \tex_the:D \tex_pdflastximage:D }
+    \@@_bb_save:x { #1 \l_@@_graphics_attr_tl }
+  }
+\cs_new_protected:Npn \@@_backend_getbb_auxiii:n #1
+  {
     \tex_immediate:D \tex_pdfximage:D
       \bool_lazy_or:nnT
-        { \l_graphics_interpolate_bool }
-        { ! \tl_if_empty_p:N \l_graphics_decodearray_tl }
+        { \l_@@_interpolate_bool }
+        { ! \tl_if_empty_p:N \l_@@_decodearray_str }
         {
           attr ~
             {
-              \tl_if_empty:NF \l_graphics_decodearray_tl
-                { /Decode~[ \l_graphics_decodearray_tl ] }
-              \bool_if:NT \l_graphics_interpolate_bool
+              \tl_if_empty:NF \l_@@_decodearray_str
+                { /Decode~[ \l_@@_decodearray_str ] }
+              \bool_if:NT \l_@@_interpolate_bool
                 { /Interpolate~true }
             }
         }
-      \int_compare:nNnT \l_graphics_page_int > 0
-        { page ~ \int_use:N \l_graphics_page_int }
-      \tl_if_empty:NF \l_graphics_pagebox_tl
-        { \l_graphics_pagebox_tl }
+      \int_compare:nNnT \l_@@_page_int > 0
+        { page ~ \int_use:N \l_@@_page_int }
+      \tl_if_empty:NF \l_@@_pagebox_tl
+        { \l_@@_pagebox_tl }
       {#1}
     \hbox_set:Nn \l_@@_internal_box
       { \tex_pdfrefximage:D \tex_pdflastximage:D }
-    \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l_@@_internal_box }
-    \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l_@@_internal_box }
-    \int_const:cn { c_@@_graphics_ #1 \l_@@_graphics_attr_tl _int }
-      { \tex_the:D \tex_pdflastximage:D }
-    \graphics_bb_save:x { #1 \l_@@_graphics_attr_tl }
+    \dim_set:Nn \l_@@_urx_dim { \box_wd:N \l_@@_internal_box }
+    \dim_set:Nn \l_@@_ury_dim { \box_ht:N \l_@@_internal_box }
   }
+\cs_new:Npn \@@_backend_dequote:w #1 " #2 " #3 \s_@@_stop {#2}
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
 % \begin{macro}
 %   {
-%     \@@_backend_include_jpg:n,
-%     \@@_backend_include_pdf:n,
+%     \@@_backend_include_jpg:n  ,
+%     \@@_backend_include_jpeg:n ,
+%     \@@_backend_include_pdf:n  ,
 %     \@@_backend_include_png:n
 %   }
 %   Images are already loaded for the measurement part of the code, so
@@ -211,8 +274,9 @@
 \cs_new_protected:Npn \@@_backend_include_jpg:n #1
   {
     \tex_pdfrefximage:D
-      \int_use:c { c_@@_graphics_ #1 \l_@@_graphics_attr_tl _int }
+      \int_use:c { c_@@_ #1 \l_@@_graphics_attr_tl _int }
   }
+\cs_new_eq:NN \@@_backend_include_jpeg:n \@@_backend_include_jpg:n
 \cs_new_eq:NN \@@_backend_include_pdf:n \@@_backend_include_jpg:n
 \cs_new_eq:NN \@@_backend_include_png:n \@@_backend_include_jpg:n
 %    \end{macrocode}
@@ -241,8 +305,12 @@
           \l_@@_backend_ext_str
         \exp_args:Nx \@@_backend_getbb_eps:nn
           {
-            \l_@@_backend_name_str - \str_tail:N \l_@@_backend_ext_str
-            -converted-to.pdf
+            \exp_args:Ne \__kernel_file_name_quote:n
+              {
+                \l_@@_backend_name_str
+                - \str_tail:N \l_@@_backend_ext_str
+                -converted-to.pdf
+              }
           }
           {#1}
      }
@@ -253,7 +321,7 @@
             \sys_shell_now:n
               { repstopdf ~ #2 ~ #1 }
           }
-        \tl_set:Nn \l_graphics_name_tl {#1}
+        \tl_set:Nn \l_@@_final_name_str {#1}
         \@@_backend_getbb_pdf:n {#1}
       }
     \cs_new_protected:Npn \@@_backend_include_eps:n #1
@@ -262,8 +330,12 @@
           \l_@@_backend_dir_str \l_@@_backend_name_str \l_@@_backend_ext_str
         \exp_args:Nx \@@_backend_include_pdf:n
           {
-            \l_@@_backend_name_str - \str_tail:N \l_@@_backend_ext_str
-            -converted-to.pdf
+            \exp_args:Ne \__kernel_file_name_quote:n
+              {
+                \l_@@_backend_name_str
+                - \str_tail:N \l_@@_backend_ext_str
+                -converted-to.pdf
+              }
           }
       }
   }
@@ -273,7 +345,19 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\@@_backend_get_pagecount:n}
+%   Simply load and store.
 %    \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_get_pagecount:n #1
+  {
+    \tex_immediate:D \tex_pdfximage:D {#1}
+    \int_const:cn { c_@@_ #1 _pages_int }
+      { \int_use:N \tex_pdflastximagepages:D }
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</luatex|pdftex>
 %    \end{macrocode}
 %
@@ -283,28 +367,46 @@
 %<*dvipdfmx|xetex>
 %    \end{macrocode}
 %
+% \begin{variable}{\l_graphics_search_ext_seq}
+%    \begin{macrocode}
+\@@_backend_loaded:n
+  {
+    \seq_set_from_clist:Nn \l_graphics_search_ext_seq
+      { .pdf , .eps , .ps , .png , .jpg ., jpeg , .bmp }
+   }
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}
 %   {
-%     \@@_backend_getbb_eps:n, \@@_backend_getbb_jpg:n,
-%     \@@_backend_getbb_pdf:n, \@@_backend_getbb_png:n
+%     \@@_backend_getbb_eps:n ,
+%     \@@_backend_getbb_jpg:n , \@@_backend_getbb_jpeg:n ,
+%     \@@_backend_getbb_pdf:n , \@@_backend_getbb_png:n  ,
+%     \@@_backend_getbb_bmp:n
 %   }
 %   Simply use the generic functions: only for \texttt{dvipdfmx} in the
 %   extraction cases.
 %    \begin{macrocode}
-\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n
+\@@_backend_loaded:n
+  {
+    \cs_new_eq:NN \@@_backend_getbb_eps:n \@@_read_bb:n
+    \cs_new_eq:NN \@@_backend_getbb_ps:n \@@_read_bb:n
+  }
 %<*dvipdfmx>
 \cs_new_protected:Npn \@@_backend_getbb_jpg:n #1
   {
-    \int_zero:N \l_graphics_page_int
-    \tl_clear:N \l_graphics_pagebox_tl
-    \graphics_extract_bb:n {#1}
+    \int_zero:N \l_@@_page_int
+    \tl_clear:N \l_@@_pagebox_tl
+    \@@_extract_bb:n {#1}
   }
+\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n
 \cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n
+\cs_new_eq:NN \@@_backend_getbb_bmp:n \@@_backend_getbb_jpg:n
 \cs_new_protected:Npn \@@_backend_getbb_pdf:n #1
   {
-    \tl_clear:N \l_graphics_decodearray_tl
-    \bool_set_false:N \l_graphics_interpolate_bool
-    \graphics_extract_bb:n {#1}
+    \tl_clear:N \l_@@_decodearray_str
+    \bool_set_false:N \l_@@_interpolate_bool
+    \@@_extract_bb:n {#1}
   }
 %</dvipdfmx>
 %    \end{macrocode}
@@ -319,8 +421,10 @@
 %
 % \begin{macro}
 %   {
-%     \@@_backend_include_eps:n, \@@_backend_include_jpg:n,
-%     \@@_backend_include_pdf:n, \@@_backend_include_png:n
+%     \@@_backend_include_eps:n , \@@_backend_include_ps:n ,
+%     \@@_backend_include_jpg:n , \@@_backend_include_jpseg:n ,
+%     \@@_backend_include_pdf:n , \@@_backend_include_png:n ,
+%     \@@_backend_include_bmp:n ,
 %   }
 %  \begin{macro}{\@@_backend_include_auxi:nn}
 %  \begin{macro}{\@@_backend_include_auxii:nnn, \@@_backend_include_auxii:xnn}
@@ -335,15 +439,18 @@
     \__kernel_backend_literal:x
       {
         PSfile = #1 \c_space_tl
-        llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
-        lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
-        urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
-        ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim
+        llx = \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl
+        lly = \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl
+        urx = \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl
+        ury = \dim_to_decimal_in_bp:n \l_@@_ury_dim
       }
   }
+\cs_new_eq:NN \@@_backend_include_ps:n \@@_backend_include_eps:n
 \cs_new_protected:Npn \@@_backend_include_jpg:n #1
   { \@@_backend_include_auxi:nn {#1} { image } }
+\cs_new_eq:NN \@@_backend_include_jpeg:n \@@_backend_include_jpg:n
 \cs_new_eq:NN \@@_backend_include_png:n \@@_backend_include_jpg:n
+\cs_new_eq:NN \@@_backend_include_bmp:n \@@_backend_include_jpg:n
 %<*dvipdfmx>
 \cs_new_protected:Npn \@@_backend_include_pdf:n #1
   { \@@_backend_include_auxi:nn {#1} { epdf } }
@@ -358,13 +465,13 @@
   {
     \@@_backend_include_auxii:xnn
       {
-        \tl_if_empty:NF \l_graphics_pagebox_tl
-          { : \l_graphics_pagebox_tl }
-        \int_compare:nNnT \l_graphics_page_int > 1
-          { :P \int_use:N \l_graphics_page_int }
-        \tl_if_empty:NF \l_graphics_decodearray_tl
-          { :D \l_graphics_decodearray_tl }
-        \bool_if:NT \l_graphics_interpolate_bool
+        \tl_if_empty:NF \l_@@_pagebox_tl
+          { : \l_@@_pagebox_tl }
+        \int_compare:nNnT \l_@@_page_int > 1
+          { :P \int_use:N \l_@@_page_int }
+        \tl_if_empty:NF \l_@@_decodearray_str
+          { :D \l_@@_decodearray_str }
+        \bool_if:NT \l_@@_interpolate_bool
            { :I }
       }
       {#1} {#2}
@@ -371,10 +478,10 @@
   }
 \cs_new_protected:Npn \@@_backend_include_auxii:nnn #1#2#3
   {
-    \int_if_exist:cTF { c_@@_graphics_ #2#1 _int }
+    \int_if_exist:cTF { c_@@_ #2#1 _int }
       {
         \__kernel_backend_literal:x
-          { pdf:usexobj~@graphic \int_use:c { c_@@_graphics_ #2#1 _int } }
+          { pdf:usexobj~@graphic \int_use:c { c_@@_ #2#1 _int } }
       }
       { \@@_backend_include_auxiii:nnn {#2} {#1} {#3} }
   }
@@ -388,31 +495,31 @@
 \cs_new_protected:Npn \@@_backend_include_auxiii:nnn #1#2#3
   {
     \int_gincr:N \g_@@_track_int
-    \int_const:cn { c_@@_graphics_ #1#2 _int } { \g_@@_track_int }
+    \int_const:cn { c_@@_ #1#2 _int } { \g_@@_track_int }
     \__kernel_backend_literal:x
       {
         pdf:#3~
-        @graphic \int_use:c { c_@@_graphics_ #1#2 _int } ~
-        \int_compare:nNnT \l_graphics_page_int > 1
-          { page ~ \int_use:N \l_graphics_page_int \c_space_tl }
-        \tl_if_empty:NF \l_graphics_pagebox_tl
+        @graphic \int_use:c { c_@@_ #1#2 _int } ~
+        \int_compare:nNnT \l_@@_page_int > 1
+          { page ~ \int_use:N \l_@@_page_int \c_space_tl }
+        \tl_if_empty:NF \l_@@_pagebox_tl
           {
-            pagebox ~ \l_graphics_pagebox_tl \c_space_tl
+            pagebox ~ \l_@@_pagebox_tl \c_space_tl
             bbox ~
-              \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l_graphics_ury_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l_@@_ury_dim \c_space_tl
           }
         (#1)
         \bool_lazy_or:nnT
-          { \l_graphics_interpolate_bool }
-          { ! \tl_if_empty_p:N \l_graphics_decodearray_tl }
+          { \l_@@_interpolate_bool }
+          { ! \tl_if_empty_p:N \l_@@_decodearray_str }
           {
             <<
-              \tl_if_empty:NF \l_graphics_decodearray_tl
-                { /Decode~[ \l_graphics_decodearray_tl ] }
-              \bool_if:NT \l_graphics_interpolate_bool
+              \tl_if_empty:NF \l_@@_decodearray_str
+                { /Decode~[ \l_@@_decodearray_str ] }
+              \bool_if:NT \l_@@_interpolate_bool
                 { /Interpolate~true> }
             >>
           }
@@ -424,7 +531,16 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\@@_backend_get_pagecount:n}
 %    \begin{macrocode}
+%<*dvipdfmx>
+\@@_backend_loaded:n
+  { \cs_new_eq:NN \@@_backend_get_pagecount:n \@@_get_pagecount:n }
+%</dvipdfmx>
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</dvipdfmx|xetex>
 %    \end{macrocode}
 %
@@ -434,13 +550,13 @@
 %<*xetex>
 %    \end{macrocode}
 %
-% \subsubsection{Images}
-%
 % \begin{macro}
 %   {
-%     \@@_backend_getbb_jpg:n,
-%     \@@_backend_getbb_pdf:n,
-%     \@@_backend_getbb_png:n
+%     \@@_backend_getbb_jpg:n  ,
+%     \@@_backend_getbb_jpeg:n ,
+%     \@@_backend_getbb_pdf:n  ,
+%     \@@_backend_getbb_png:n  ,
+%     \@@_backend_getbb_bmp:n
 %   }
 % \begin{macro}{\@@_backend_getbb_auxi:nN}
 % \begin{macro}{\@@_backend_getbb_auxii:nnN, \@@_backend_getbb_auxii:VnN}
@@ -456,21 +572,23 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_backend_getbb_jpg:n #1
   {
-    \int_zero:N \l_graphics_page_int
-    \tl_clear:N \l_graphics_pagebox_tl
+    \int_zero:N \l_@@_page_int
+    \tl_clear:N \l_@@_pagebox_tl
     \@@_backend_getbb_auxi:nN {#1} \tex_XeTeXpicfile:D
   }
+\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n
 \cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n
+\cs_new_eq:NN \@@_backend_getbb_bmp:n \@@_backend_getbb_jpg:n
 \cs_new_protected:Npn \@@_backend_getbb_pdf:n #1
   {
-    \tl_clear:N \l_graphics_decodearray_tl
-    \bool_set_false:N \l_graphics_interpolate_bool
+    \tl_clear:N \l_@@_decodearray_str
+    \bool_set_false:N \l_@@_interpolate_bool
     \@@_backend_getbb_auxi:nN {#1} \tex_XeTeXpdffile:D
   }
 \cs_new_protected:Npn \@@_backend_getbb_auxi:nN #1#2
   {
-    \int_compare:nNnTF \l_graphics_page_int > 1
-      { \@@_backend_getbb_auxii:VnN \l_graphics_page_int {#1} #2  }
+    \int_compare:nNnTF \l_@@_page_int > 1
+      { \@@_backend_getbb_auxii:VnN \l_@@_page_int {#1} #2  }
       { \@@_backend_getbb_auxiii:nNnn {#1} #2 { :P 1 } { page 1 } }
   }
 \cs_new_protected:Npn \@@_backend_getbb_auxii:nnN #1#2#3
@@ -478,8 +596,8 @@
 \cs_generate_variant:Nn \@@_backend_getbb_auxii:nnN { V }
 \cs_new_protected:Npn \@@_backend_getbb_auxiii:nNnn #1#2#3#4
   {
-    \tl_if_empty:NTF \l_graphics_pagebox_tl
-      { \@@_backend_getbb_auxiv:VnNnn \l_graphics_pagebox_tl }
+    \tl_if_empty:NTF \l_@@_pagebox_tl
+      { \@@_backend_getbb_auxiv:VnNnn \l_@@_pagebox_tl }
       { \@@_backend_getbb_auxv:nNnn }
       {#1} #2 {#3} {#4}
   }
@@ -488,21 +606,25 @@
     \use:x
       {
         \@@_backend_getbb_auxv:nNnn {#2} #3 { : #1 #4 }
-          { #5 ~ \@@_backend_getbb_pagebox:w #1 }
+          {
+            #5
+            \tl_if_blank:nF {#1}
+              { \c_space_tl \@@_backend_getbb_pagebox:w #1 }
+          }
       }
   }
 \cs_generate_variant:Nn \@@_backend_getbb_auxiv:nnNnn { V }
 \cs_new_protected:Npn \@@_backend_getbb_auxv:nNnn #1#2#3#4
   {
-    \graphics_bb_restore:nF {#1#3}
+    \@@_bb_restore:nF {#1#3}
       { \@@_backend_getbb_auxvi:nNnn {#1} #2 {#3} {#4} }
   }
 \cs_new_protected:Npn \@@_backend_getbb_auxvi:nNnn #1#2#3#4
   {
     \hbox_set:Nn \l_@@_internal_box { #2 #1 ~ #4 }
-    \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l_@@_internal_box }
-    \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l_@@_internal_box }
-    \graphics_bb_save:n {#1#3}
+    \dim_set:Nn \l_@@_urx_dim { \box_wd:N \l_@@_internal_box }
+    \dim_set:Nn \l_@@_ury_dim { \box_ht:N \l_@@_internal_box }
+    \@@_bb_save:n {#1#3}
   }
 \cs_new:Npn \@@_backend_getbb_pagebox:w #1 box {#1}
 %    \end{macrocode}
@@ -515,7 +637,6 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_backend_include_pdf:n}
-% \begin{macro}{\@@_backend_include_bitmap_quote:w}
 %   For PDF graphics, properly supporting the |pagebox| concept in \XeTeX{}
 %   is best done using the |\tex_XeTeXpdffile:D| primitive. The syntax here
 %   is the same as for the graphic measurement part, although we know at this
@@ -523,16 +644,27 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_backend_include_pdf:n #1
   {
-    \tex_XeTeXpdffile:D
-      \@@_backend_include_pdf_quote:w #1 "#1" \s_@@_stop \c_space_tl
-      \int_compare:nNnT \l_graphics_page_int > 0
-        { page ~ \int_use:N \l_graphics_page_int \c_space_tl }
-        \exp_after:wN \@@_backend_getbb_pagebox:w \l_graphics_pagebox_tl
+    \tex_XeTeXpdffile:D #1 ~
+      \int_compare:nNnT \l_@@_page_int > 0
+        { page ~ \int_use:N \l_@@_page_int \c_space_tl }
+        \exp_after:wN \@@_backend_getbb_pagebox:w \l_@@_pagebox_tl
   }
-\cs_new:Npn \@@_backend_include_pdf_quote:w #1 " #2 " #3 \s_@@_stop
-  { " #2 " }
 %    \end{macrocode}
 % \end{macro}
+%
+% \begin{macro}{\@@_backend_get_pagecount:n}
+%   Very little to do here other than cover the case of a non-PDF file.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_backend_get_pagecount:n #1
+  {
+    \int_const:cn { c_@@_ #1 _pages_int }
+      {
+        \int_max:nn
+          { \int_use:N \tex_XeTeXpdfpagecount:D #1 ~ }
+          { 1 }
+      }
+  }
+%    \end{macrocode}
 % \end{macro}
 %
 %    \begin{macrocode}
@@ -545,22 +677,35 @@
 %<*dvisvgm>
 %    \end{macrocode}
 %
+% \begin{variable}{\l_graphics_search_ext_seq}
+%    \begin{macrocode}
+\@@_backend_loaded:n
+  {
+    \seq_set_from_clist:Nn
+      \l_graphics_search_ext_seq
+      { .pdf , .eps , .png , .jpg , .jpeg }
+  }
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}{\@@_backend_getbb_eps:n}
 %   Simply use the generic function.
 %    \begin{macrocode}
-\cs_new_eq:NN \@@_backend_getbb_eps:n \graphics_read_bb:n
+\@@_backend_loaded:n
+  { \cs_new_eq:NN \@@_backend_getbb_eps:n \@@_read_bb:n }
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\@@_backend_getbb_png:n, \@@_backend_getbb_jpg:n}
+% \begin{macro}{\@@_backend_getbb_png:n, \@@_backend_getbb_jpg:n, \@@_backend_getbb_jpeg:n}
 %   These can be included by extracting the bounding box data.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_backend_getbb_jpg:n #1
   {
-    \int_zero:N \l_graphics_page_int
-    \tl_clear:N \l_graphics_pagebox_tl
-    \graphics_extract_bb:n {#1}
+    \int_zero:N \l_@@_page_int
+    \tl_clear:N \l_@@_pagebox_tl
+    \@@_extract_bb:n {#1}
   }
+\cs_new_eq:NN \@@_backend_getbb_jpeg:n \@@_backend_getbb_jpg:n
 \cs_new_eq:NN \@@_backend_getbb_png:n \@@_backend_getbb_jpg:n
 %    \end{macrocode}
 % \end{macro}
@@ -570,9 +715,9 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_backend_getbb_pdf:n #1
   {
-    \tl_clear:N \l_graphics_decodearray_tl
-    \bool_set_false:N \l_graphics_interpolate_bool
-    \graphics_extract_bb:n {#1}
+    \tl_clear:N \l_@@_decodearray_str
+    \bool_set_false:N \l_@@_interpolate_bool
+    \@@_extract_bb:n {#1}
   }
 %    \end{macrocode}
 % \end{macro}
@@ -583,18 +728,18 @@
 %   sizes here. (This is the same as the \texttt{dvips} code.)
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_backend_include_eps:n #1
-  { @@_backend_include:nn { PSfile } {#1} }
+  { \@@_backend_include:nn { PSfile } {#1} }
 \cs_new_protected:Npn \@@_backend_include_pdf:n #1
-  { @@_backend_include:nn { pdffile } {#1} }
+  { \@@_backend_include:nn { pdffile } {#1} }
 \cs_new_protected:Npn \@@_backend_include:nn #1#2
   {
     \__kernel_backend_literal:x
       {
         #1 = #2 \c_space_tl
-        llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
-        lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
-        urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
-        ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim
+        llx = \dim_to_decimal_in_bp:n \l_@@_llx_dim \c_space_tl
+        lly = \dim_to_decimal_in_bp:n \l_@@_lly_dim \c_space_tl
+        urx = \dim_to_decimal_in_bp:n \l_@@_urx_dim \c_space_tl
+        ury = \dim_to_decimal_in_bp:n \l_@@_ury_dim
       }
   }
 %    \end{macrocode}
@@ -601,7 +746,12 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\@@_backend_include_png:n, \@@_backend_include_jpg:n}
+% \begin{macro}
+%   {
+%     \@@_backend_include_png:n ,
+%     \@@_backend_include_jpg:n ,
+%     \@@_backend_include_jpeg:n
+%   }
 % \begin{macro}{\@@_backend_include_bitmap_quote:w}
 %   The backend here has built-in support for basic graphic inclusion (see
 %   \texttt{dvisvgm.def} for a more complex approach, needed if clipping,
@@ -615,11 +765,12 @@
      \__kernel_backend_literal:x
        {
          dvisvgm:img~
-         \dim_to_decimal:n { \l_graphics_ury_dim } ~
-         \dim_to_decimal:n { \l_graphics_ury_dim } ~
+         \dim_to_decimal:n { \l_@@_ury_dim } ~
+         \dim_to_decimal:n { \l_@@_ury_dim } ~
          \@@_backend_include_bitmap_quote:w #1 " #1 " \s_@@_stop
        }
   }
+\cs_new_eq:NN \@@_backend_include_jpeg:n \@@_backend_include_png:n
 \cs_new_eq:NN \@@_backend_include_jpg:n \@@_backend_include_png:n
 \cs_new:Npn \@@_backend_include_bitmap_quote:w #1 " #2 " #3 \s_@@_stop
   { " #2 " }
@@ -627,7 +778,14 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\@@_backend_get_pagecount:n}
 %    \begin{macrocode}
+\@@_backend_loaded:n
+  { \cs_new_eq:NN \@@_backend_get_pagecount:n \@@_get_pagecount:n }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</dvisvgm>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-header.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-opacity.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -239,49 +239,6 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-%<*dvipdfmx|xdvipdfmx>
-%    \end{macrocode}
-%
-% \begin{macro}{\@@_backend_select:n}
-%   Older backends have no stack support, so everything is done directly.
-%    \begin{macrocode}
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  {
-    \cs_gset_protected:Npn \@@_backend_select_aux:n #1
-      {
-        \tl_set:Nn \l_@@_backend_fill_tl {#1}
-        \tl_set:Nn \l_@@_backend_stroke_tl {#1}
-        \pdfmanagement_add:nnn { Page / Resources / ExtGState }
-          { opacity #1 }
-          { << /ca ~ #1 /CA ~ #1 >> }
-        \__kernel_backend_literal_pdf:n { /opacity #1 ~ gs }
-      }
-    \cs_gset_protected:Npn \@@_backend_fill_stroke:nn #1#2
-      {
-        \str_if_eq:nnTF {#1} {#2}
-          { \@@_backend_select_aux:n {#1} }
-          {
-            \tl_set:Nn \l_@@_backend_fill_tl {#1}
-            \tl_set:Nn \l_@@_backend_stroke_tl {#2}
-            \pdfmanagement_add:nnn { Page / Resources / ExtGState }
-              { opacity.fill #1 }
-              { << /ca ~ #1 >> }
-            \pdfmanagement_add:nnn { Page / Resources / ExtGState }
-              { opacity.stroke #1 }
-              { << /CA ~ #2 >> }
-            \__kernel_backend_literal_pdf:n
-             { /opacity.fill #1 ~ gs /opacity.stroke #2 ~ gs }
-          }
-      }
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-%    \begin{macrocode}
-%</dvipdfmx|xdvipdfmx>
-%    \end{macrocode}
-%
-%    \begin{macrocode}
 %<*dvisvgm>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3backend/l3backend-pdf.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-07}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -1421,19 +1421,13 @@
   { \@@_backend_link_begin:n {#1#2} }
 \cs_new_protected:Npx \@@_backend_link_begin:n #1
   {
-    \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-      {
-        \exp_not:N \int_gincr:N \exp_not:N  \g_@@_backend_link_int
-      }
+    \exp_not:N \int_gincr:N \exp_not:N  \g_@@_backend_link_int
     \@@_backend:x
       {
          bann ~
-         \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-           {
-             @pdf.lnk
-             \exp_not:N \int_use:N \exp_not:N  \g_@@_backend_link_int
-             \c_space_tl
-           }
+         @pdf.lnk
+         \exp_not:N \int_use:N \exp_not:N  \g_@@_backend_link_int
+         \c_space_tl
          <<
            /Type /Annot
            #1
@@ -1451,14 +1445,8 @@
 %   Available using the backend mechanism with a suitably-recent
 %   version.
 %    \begin{macrocode}
-\cs_new:Npx \@@_backend_link_last:
-  {
-    \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-      {
-        @pdf.lnk
-          \exp_not:N \int_use:N \exp_not:N \g_@@_backend_link_int
-      }
-  }
+\cs_new:Npn \@@_backend_link_last:
+  { @pdf.lnk \int_use:N \g_@@_backend_link_int }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -122,7 +122,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3benchmark}{2022-02-05}{}
+\ProvidesExplPackage{l3benchmark}{2022-04-10}{}
   {L3 Experimental benchmarking}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3bitset/l3bitset.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 % \begin{documentation}
@@ -264,7 +264,7 @@
 %<@@=bitset>
 %    \end{macrocode}
 %    \begin{macrocode}
-\ProvidesExplPackage{l3bitset}{2022-02-05}{}
+\ProvidesExplPackage{l3bitset}{2022-04-10}{}
   {L3 Experimental bitset support}
 %    \end{macrocode}
 % A bitset is a string variable.

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -110,7 +110,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -1173,7 +1173,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3draw}{2022-02-05}{}
+\ProvidesExplPackage{l3draw}{2022-04-10}{}
   {L3 Experimental core drawing support}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3graphics/l3graphics.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -54,142 +54,62 @@
 %
 % \section{\pkg{l3graphics} documentation}
 %
-% \subsection{Driver functions}
+% \subsection{Graphics keys}
 %
 % Inclusion of graphic files requires a range of low-level data be passed to
-% the driver layer. These functions are primarily aimed at supporting this
-% work.
+% the backend. This is set up using a small number of key--value settings,
+% which are stored in the |graphics| tree.
 %
-% \begin{variable}{\l_graphics_decodearray_tl}
+% \begin{variable}{decodearray}
 %   Array to decode color in bitmap graphic: when non-empty, this should
 %   be in the form of one, two or three pairs of real numbers in the range
 %   $[0,1]$, separated by spaces.
 % \end{variable}
 %
-% \begin{variable}{\l_graphics_interpolate_bool}
-%   Indicates whether interpolation should be applied to bitmap graphic files.
+% \begin{variable}{draft}
+%   Switch to enable draft mode: graphics are read but not included when this is
+%   true.
 % \end{variable}
 %
-% \begin{variable}{\l_graphics_page_int}
+% \begin{variable}{interpolate}
+%   Switch which indicates whether interpolation should be applied to bitmap
+%   graphic files.
+% \end{variable}
+%
+% \begin{variable}{page}
 %   The page to extract from a multi-page graphic file: used for |.pdf| files
 %   which may contain multiple pages.
 % \end{variable}
 %
-% \begin{variable}{\l_graphics_pagebox_tl}
+% \begin{variable}{pagebox}
 %   The nature of the page box setting used to determine the bounding box of
 %   material: used for |.pdf| files which feature multiple page box
-%   specifications.
+%   specifications. A choice from |art|, |bleed|, |crop|, |media|, |trim|.
+%   The standard setting is |crop|.
 % \end{variable}
 %
-% \begin{variable}{\l_graphics_draft_bool}
+% \begin{variable}{draft}
 %   Switch to enable draft mode: graphics are read but not included when this is
 %   true.
 % \end{variable}
 %
-% \begin{variable}
-%   {\l_graphics_llx_dim, \l_graphics_lly_dim, \l_graphics_urx_dim, \l_graphics_ury_dim}
-%   Dimensions which return the points $(\meta{llx},\meta{lly})$ and
-%   $(\meta{urx},\meta{ury})$ for the graphic. For many graphics only the resulting
-%   height and width are significant, but this is driver-dependent.
+% \begin{variable}{type}
+%   The type of graphic file beign included: if this key is not set, the
+%   \emph{type} is determined from the file extension.
 % \end{variable}
 %
-% \begin{variable}{\l_graphics_name_bool}
-%   The name of a graphics file being loaded: usually the same as the
-%   input file name, but may be altered by some drivers.
-% \end{variable}
+% \subsection{Including graphics}
 %
-% \begin{function}
-%   {
-%     \graphics_bb_save:n, \graphics_bb_save:x,
-%     \graphics_bb_restore:nF, \graphics_bb_restore:xF
-%   }
+% \begin{function}{\graphics_include:nn, \graphics_include:nV}
 %   \begin{syntax}
-%     \cs{graphics_bb_save:n} \Arg{graphic}
-%     \cs{graphics_bb_restore:nF} \Arg{graphic} \Arg{false code}
+%     \cs{graphics_include:nn} \Arg{keys} \Arg{file}
 %   \end{syntax}
-%   This pair of functions are used to cache the bounding box of an \meta{graphic}
-%   so that extraction/reading is only required once. The \texttt{save}
-%   function stores the values from \cs{l_graphics_llx_dim},
-%   \cs{l_graphics_lly_dim}, \cs{l_graphics_urx_dim} and
-%   \cs{l_graphics_ury_dim} as constants. The \texttt{restore} function will then
-%   look up values for the bounding box of an \meta{graphic} and set the four
-%   dimensions appropriately. For any one \meta{graphic} the bounding box will
-%   be constant, so the \texttt{save} function should only be called once. Thus
-%   a typical use case is
-%   \begin{verbatim}
-%   \graphics_bb_restore:nF { <name> }
-%     {
-%       % Code to read the bb
-%       \graphics_bb_save:n { <name> }
-%     }
-%   \end{verbatim}
-%   \emph{i.e.}~every use of a bounding box will attempt to restore saved data,
-%   and saving will only take place where that is not possible.
-%
-%   Note that the \meta{graphic} may not be a simple file name: a multi-page PDF,
-%   for example, will need to have the bounding box cached for each page used.
+%   Horizontal-mode command which includes the \meta{file} as an graphic
+%   at the current location. The file \meta{type} may be given as one of the
+%   \meta{keys}, or will otherwise be determined from file extension. The
+%   \meta{keys} is used to pass settings as detailed above.
 % \end{function}
 %
-% \begin{function}{\graphics_extract_bb:n}
-%   \begin{syntax}
-%     \cs{graphics_extract_bb:n} \Arg{file}
-%   \end{syntax}
-%   Extracts bounding box data for the graphic \meta{file} using the |extractbb|
-%   utility, and stores the bounding box of the graphic file in
-%   \cs{l_graphics_llx_dim}, \cs{l_graphics_lly_dim}, \cs{l_graphics_urx_dim} and
-%   \cs{l_graphics_ury_dim}.
-%
-%   The \meta{file} name should be fully-qualified and sanitized: no search
-%   or other manipulation is carried out at this level. No check is made on
-%   the file \emph{type} at this stage: it is assumed that the driver code
-%   using this function has made such a check. File types such as |.pdf| and
-%   |.jpg| are appropriate for parsing using this function.
-%
-%   When \cs{l_graphics_page_int} is positive the appropriate page will be
-%   queried from the graphic file.
-%
-%   Note that this function requires pipe shell calls to be enabled: this is
-%   generally true but may require the option |--enable-pipes| to be enabled
-%   when running the \TeX{} job.
-% \end{function}
-%
-% \begin{function}{\graphics_read_bb:n}
-%   \begin{syntax}
-%     \cs{graphics_read_bb:n} \Arg{file}
-%   \end{syntax}
-%   Parses the graphic \meta{file} to find a PostScript-style bounding box
-%   line of the form
-%   \begin{verbatim}
-%   %%BoundingBox: llx lly urx urx
-%   \end{verbatim}
-%   where \meta{llx}, \meta{lly}, \meta{urx} and \meta{ury} are the corners
-%   of the bounding box expressed in PostScript (\enquote{big}) points. The
-%   values are stored in \cs{l_graphics_llx_dim}, \cs{l_graphics_lly_dim},
-%   \cs{l_graphics_urx_dim} and \cs{l_graphics_ury_dim}.
-%
-%   The \meta{file} name should be fully-qualified and sanitized: no search
-%   or other manipulation is carried out at this level. No check is made on
-%   the file \emph{type} at this stage: it is assumed that the driver code
-%   using this function has made such a check. File types such as |.eps| and
-%   |.bb|/|.xbb| are appropriate for parsing using this function.
-% \end{function}
-%
-% \begin{function}{\graphics_include:n, \graphics_include:nn}
-%   \begin{syntax}
-%     \cs{graphics_include:n} \Arg{file}
-%     \cs{graphics_include:nn} \Arg{file} \Arg{type}
-%   \end{syntax}
-%   Horizontal-mode commands which include the \meta{file} as an graphic
-%   at the current location. The file \meta{type} is given explicitly in
-%   the two-argument version, or is inferred from the file extension extracted
-%   in the single-argument form. The exact graphic types supported depend upon
-%   the driver in use.
-%
-%   Where the \meta{file} is not found and the \meta{type} is \emph{not}
-%   given, a search for possible graphic files is undertaken using the extensions
-%   stored in \cs{l_graphics_search_ext_seq}.
-% \end{function}
-%
 % \begin{variable}{\l_graphics_ext_type_prop}
 %   Defines mapping between file extensions and file types; where there is
 %   no entry for an extension, the type is assumed to be the extension
@@ -200,11 +120,6 @@
 %   \end{verbatim}
 % \end{variable}
 %
-% \begin{variable}{\l_graphics_search_ext_seq}
-%   Extensions to use for graphic searching when the given \meta{file} name is not
-%   found by \cs{graphics_include:n}.
-% \end{variable}
-%
 % \begin{variable}{\l_graphics_search_path_seq}
 %   Each entry is the path to a directory which should be searched when
 %   seeking an graphic file. Each path can be relative or absolute, and should
@@ -213,6 +128,36 @@
 %   variable content. Spaces need not be quoted.
 % \end{variable}
 %
+% \subsection{Utility functions}
+%
+% \begin{function}[noTF]{\graphics_get_full_name:nN}
+%   \begin{syntax}
+%     \cs{graphics_get_full_name:nN} \Arg{file} \meta{tl~var}
+%     \cs{graphics_get_full_name:nNTF} \Arg{file} \meta{tl~var} \Arg{true code} \Arg{false code}
+%   \end{syntax}
+%   Searches for \meta{file} first as given and then using the extensions
+%   listed in \cs{l_graphics_search_ext_seq}. The search path used will be
+%   the entries of \cs{l_graphics_search_path_seq}. If found, the full file
+%   name including any path and extension will be returned in the
+%   \meta{tl~var}. In the non-branching version, the \meta{tl var} will be
+%   set to \cs{q_no_value} in the case that the graphics is not found.
+% \end{function}
+%
+% \begin{variable}{\l_graphics_search_ext_seq}
+%   Extensions to use for graphic searching when the given \meta{file} name is not
+%   found by \cs{graphics_get_full_name:nN}.
+% \end{variable}
+%
+% \begin{function}{\graphics_get_pagecount:nN}
+%   \begin{syntax}
+%     \cs{graphics_get_pagecount:nn} \Arg{file} \meta{tl~var}
+%   \end{syntax}
+%   Reads the graphics \meta{file} and extracts the number of pages, which
+%   are stored in the \meta{tl~var}.
+% \end{function}
+%
+% \subsection{Showing and logging included graphics}
+%
 % \begin{function}{\graphics_show_list:, \graphics_log_list:}
 %   \begin{syntax}
 %     \cs{graphics_show_list:}
@@ -240,15 +185,15 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3graphics}{2022-02-05}{}
+\ProvidesExplPackage{l3graphics}{2022-04-10}{}
   {L3 Experimental graphics inclusion support}
 %    \end{macrocode}
 %
-% \begin{variable}{\l_@@_tmp_ior, \l_@@_tmp_tl}
+% \begin{variable}{\l_@@_internal_ior, \l_@@_internal_tl}
 %   Scratch space.
 %    \begin{macrocode}
-\ior_new:N \l_@@_tmp_ior
-\tl_new:N  \l_@@_tmp_tl
+\ior_new:N \l_@@_internal_ior
+\tl_new:N  \l_@@_internal_tl
 %    \end{macrocode}
 % \end{variable}
 %
@@ -259,24 +204,47 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \subsection{Image feature support}
+% \subsection{Graphics keys}
 %
 % \begin{macro}
 %   {
-%     \l_graphics_decodearray_tl  ,
-%     \l_graphics_interpolate_bool,
-%     \l_graphics_page_int        ,
-%     \l_graphics_pagebox_tl
+%     \l_@@_decodearray_str  ,
+%     \l__@@_draft_bool      ,
+%     \l_@@_interpolate_bool ,
+%     \l_@@_page_int         ,
+%     \l_@@_pagebox_tl       ,
+%     \l_@@_type_str
 %   }
 %   Keys which control features of graphics. The standard value of |pagebox|
-%   set up here should match the default for the drivers themselves: in
-%   the absence of any other setting the |cropbox| should be used.
+%   set up here should match the default for the backends themselves: in
+%   the absence of any other setting the |crop| should be used. Note that
+%   the variable \cs{l_@@_pagebox_str} can be empty internally, as backends
+%   which do not support |pagebox| are set up to clear it entirely. The
+%   store for |pagebox| is a |tl| as that makes extracting the data
+%   easier for some backends.
 %    \begin{macrocode}
-\tl_new:N \l_graphics_decodearray_tl
-\tl_new:N \l_graphics_pagebox_tl
-\bool_new:N \l_graphics_interpolate_bool
-\tl_set:Nn \l_graphics_pagebox_tl { cropbox }
-\int_new:N \l_graphics_page_int
+\tl_new:N \l_@@_pagebox_tl
+\keys_define:nn { graphics }
+  {
+    decodearray .str_set:N =
+      \l_@@_decodearray_str ,
+    draft .bool_set:N =
+      \l_@@_draft_bool ,
+    interpolate .bool_set:N =
+      \l_@@_interpolate_bool ,
+    pagebox .choices:nn =
+      { art , bleed , crop , media , trim }
+      {
+        \tl_set:Nx \l_@@_pagebox_tl
+           { \tl_use:N \l_keys_choice_tl box }
+      } ,
+    pagebox .initial:n =
+      crop ,
+    page .int_set:N =
+      \l_@@_page_int ,
+    type . str_set:N =
+      \l_@@_type_str
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -284,60 +252,60 @@
 %
 % \begin{variable}
 %   {
-%     \l_graphics_llx_dim , \l_graphics_lly_dim,
-%     \l_graphics_urx_dim , \l_graphics_ury_dim
+%     \l_@@_llx_dim , \l_@@_lly_dim,
+%     \l_@@_urx_dim , \l_@@_ury_dim
 %   }
 %   Storage for the return of bounding box.
 %    \begin{macrocode}
-\dim_new:N \l_graphics_llx_dim
-\dim_new:N \l_graphics_lly_dim
-\dim_new:N \l_graphics_urx_dim
-\dim_new:N \l_graphics_ury_dim
+\dim_new:N \l_@@_llx_dim
+\dim_new:N \l_@@_lly_dim
+\dim_new:N \l_@@_urx_dim
+\dim_new:N \l_@@_ury_dim
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}{\graphics_bb_save:n, \graphics_bb_save:x}
-% \begin{macro}{\graphics_bb_restore:nF, \graphics_bb_restore:xF}
+% \begin{macro}{\@@_bb_save:n, \@@_bb_save:x}
+% \begin{macro}{\@@_bb_restore:nF, \@@_bb_restore:xF}
 %   Caching graphic bounding boxes is sensible, and these functions are needed both
 %   here and for drive-specific work. So they are made available as documented
 %   functions. To save on registers, the \enquote{origin} is only saved if it is
 %   not at zero.
 %     \begin{macrocode}
-\cs_new_protected:Npn \graphics_bb_save:n #1
+\cs_new_protected:Npn \@@_bb_save:n #1
   {
     \dim_if_exist:cTF { c_@@_ #1 _urx_dim }
       { \msg_error:nnn { graphic } { bb-already-cached } {#1} }
       {
-        \dim_compare:nNnF \l_graphics_llx_dim = { 0pt }
-          { \dim_const:cn { c_@@_ #1 _llx_dim } { \l_graphics_llx_dim } }
-        \dim_compare:nNnF \l_graphics_lly_dim = { 0pt }
-          { \dim_const:cn { c_@@_ #1 _lly_dim } { \l_graphics_lly_dim } }
-        \dim_const:cn { c_@@_ #1 _urx_dim } { \l_graphics_urx_dim }
-        \dim_const:cn { c_@@_ #1 _ury_dim } { \l_graphics_ury_dim }
+        \dim_compare:nNnF \l_@@_llx_dim = { 0pt }
+          { \dim_const:cn { c_@@_ #1 _llx_dim } { \l_@@_llx_dim } }
+        \dim_compare:nNnF \l_@@_lly_dim = { 0pt }
+          { \dim_const:cn { c_@@_ #1 _lly_dim } { \l_@@_lly_dim } }
+        \dim_const:cn { c_@@_ #1 _urx_dim } { \l_@@_urx_dim }
+        \dim_const:cn { c_@@_ #1 _ury_dim } { \l_@@_ury_dim }
       }
   }
-\cs_generate_variant:Nn \graphics_bb_save:n { x }
-\cs_new_protected:Npn \graphics_bb_restore:nF #1#2
+\cs_generate_variant:Nn \@@_bb_save:n { x }
+\cs_new_protected:Npn \@@_bb_restore:nF #1#2
   {
     \dim_if_exist:cTF { c_@@_ #1 _urx_dim }
       {
-        \dim_set_eq:Nc \l_graphics_urx_dim { c_@@_ #1 _urx_dim }
-        \dim_set_eq:Nc \l_graphics_ury_dim { c_@@_ #1 _ury_dim }
+        \dim_set_eq:Nc \l_@@_urx_dim { c_@@_ #1 _urx_dim }
+        \dim_set_eq:Nc \l_@@_ury_dim { c_@@_ #1 _ury_dim }
         \dim_if_exist:cTF { c_@@_ #1 _llx_dim }
-          { \dim_set_eq:Nc \l_graphics_llx_dim { c_@@_ #1 _llx_dim } }
-          { \dim_zero:N \l_graphics_llx_dim }
+          { \dim_set_eq:Nc \l_@@_llx_dim { c_@@_ #1 _llx_dim } }
+          { \dim_zero:N \l_@@_llx_dim }
         \dim_if_exist:cTF { c_@@_ #1 _lly_dim }
-          { \dim_set_eq:Nc \l_graphics_lly_dim { c_@@_ #1 _lly_dim } }
-          { \dim_zero:N \l_graphics_lly_dim }
+          { \dim_set_eq:Nc \l_@@_lly_dim { c_@@_ #1 _lly_dim } }
+          { \dim_zero:N \l_@@_lly_dim }
       }
       {#2}
   }
-\cs_generate_variant:Nn \graphics_bb_restore:nF { x }
+\cs_generate_variant:Nn \@@_bb_restore:nF { x }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\graphics_extract_bb:n, \graphics_read_bb:n}
+% \begin{macro}{\@@_extract_bb:n, \@@_read_bb:n}
 % \begin{macro}{\@@_extract_bb_auix:nn, \@@_extract_bb_auix:Vn}
 % \begin{macro}{\@@_extract_bb_auxii:nnn}
 % \begin{macro}{\@@_extract_bb_auxiii:nnnn, \@@_extract_bb_auxiii:Vnnn}
@@ -357,10 +325,10 @@
 %  box has to be calculated by |extractbb|, with just the initial phase
 %  different.
 %    \begin{macrocode}
-\cs_new_protected:Npn \graphics_extract_bb:n #1
+\cs_new_protected:Npn \@@_extract_bb:n #1
   {
-    \int_compare:nNnTF \l_graphics_page_int > 0
-      { \@@_extract_bb_auxi:Vn \l_graphics_page_int {#1} }
+    \int_compare:nNnTF \l_@@_page_int > 0
+      { \@@_extract_bb_auxi:Vn \l_@@_page_int {#1} }
       { \@@_extract_bb_auxii:nnn {#1} { } { } }
   }
 \cs_new_protected:Npn \@@_extract_bb_auxi:nn #1#2
@@ -368,9 +336,9 @@
 \cs_generate_variant:Nn \@@_extract_bb_auxi:nn { Vn }
 \cs_new_protected:Npn \@@_extract_bb_auxii:nnn #1#2#3
   {
-   \tl_if_empty:NTF \l_graphics_pagebox_tl
+    \tl_if_empty:NTF \l_@@_pagebox_tl
       { \@@_extract_bb_auxiv:nnn }
-      { \@@_extract_bb_auxiii:Vnnn \l_graphics_pagebox_tl }
+      { \@@_extract_bb_auxiii:Vnnn \l_@@_pagebox_tl }
       {#1} {#2} {#3}
   }
 \cs_new_protected:Npn \@@_extract_bb_auxiii:nnnn #1#2#3#4
@@ -379,13 +347,13 @@
 \cs_new_protected:Npn \@@_extract_bb_auxiv:nnn #1#2#3
   {
     \@@_read_bb_auxi:nnnn {#1} {#2}
-      { \ior_shell_open:Nn \l_@@_tmp_ior { extractbb~#3-O~#1 } }
+      { \ior_shell_open:Nn \l_@@_internal_ior { extractbb~#3-O~#1 } }
       { pipe-failed }
   }
-\cs_new_protected:Npn \graphics_read_bb:n #1
+\cs_new_protected:Npn \@@_read_bb:n #1
   {
     \@@_read_bb_auxi:nnnn {#1} { }
-      { \ior_open:Nn \l_@@_tmp_ior {#1} }
+      { \ior_open:Nn \l_@@_internal_ior {#1} }
       { graphic-not-found }
   }
 %   \end{macrocode}
@@ -401,31 +369,23 @@
 %   \begin{macrocode}
 \cs_new_protected:Npn \@@_read_bb_auxi:nnnn #1#2#3#4
   {
-    \graphics_bb_restore:nF {#1#2}
+    \@@_bb_restore:nF {#1#2}
       { \@@_read_bb_auxii:nnnn {#3} {#4} {#1} {#2} }
   }
 \cs_new_protected:Npx \@@_read_bb_auxii:nnnn #1#2#3#4
   {
     #1
-    \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_tmp_ior
+    \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_internal_ior
       { \msg_error:nnn { graphics } {#2} {#3} }
       {
-        \ior_str_map_inline:Nn \exp_not:N \l_@@_tmp_ior
+        \ior_str_map_inline:Nn \exp_not:N \l_@@_internal_ior
           {
             \exp_not:N \@@_read_bb_auxiii:w
               ##1 ~ \c_colon_str \s_@@_stop
           }
+        \@@_bb_save:n {#3#4}
       }
-    \exp_not:n
-      {
-        \ior_close:N \l_@@_tmp_ior
-        \dim_compare:nNnF \l_graphics_llx_dim = { 0pt }
-          { \dim_const:cn { c_@@_ #3#4 _llx_dim } { \l_graphics_llx_dim } }
-        \dim_compare:nNnF \l_graphics_lly_dim = { 0pt }
-          { \dim_const:cn { c_@@_ #3#4 _lly_dim } { \l_graphics_lly_dim } }
-        \dim_const:cn { c_@@_ #3#4 _urx_dim } { \l_graphics_urx_dim }
-        \dim_const:cn { c_@@_ #3#4 _ury_dim } { \l_graphics_ury_dim }
-      }
+    \ior_close:N \exp_not:N \l_@@_internal_ior
   }
 \use:x
   {
@@ -450,13 +410,13 @@
   {
     \str_if_eq:nnF {#2} { atend }
       {
-        \tl_set_rescan:Nnx \l_@@_tmp_tl
+        \tl_set_rescan:Nnx \l_@@_internal_tl
           {
             \char_set_catcode_space:n {  9 }
             \char_set_catcode_space:n { 32 }
           }
           { \use:n #1 }
-        \exp_after:wN \@@_read_bb_auxv:w \l_@@_tmp_tl \s_@@_stop
+        \exp_after:wN \@@_read_bb_auxv:w \l_@@_internal_tl \s_@@_stop
       }
   }
 %    \end{macrocode}
@@ -465,10 +425,10 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_read_bb_auxv:w #1~#2~#3~#4~#5 \s_@@_stop
   {
-    \dim_set:Nn \l_graphics_llx_dim { #1 bp }
-    \dim_set:Nn \l_graphics_lly_dim { #2 bp }
-    \dim_set:Nn \l_graphics_urx_dim { #3 bp }
-    \dim_set:Nn \l_graphics_ury_dim { #4 bp }
+    \dim_set:Nn \l_@@_llx_dim { #1 bp }
+    \dim_set:Nn \l_@@_lly_dim { #2 bp }
+    \dim_set:Nn \l_@@_urx_dim { #3 bp }
+    \dim_set:Nn \l_@@_ury_dim { #4 bp }
     \ior_map_break:
   }
 %    \end{macrocode}
@@ -480,20 +440,16 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{variable}{\l_graphics_draft_bool}
-%   Relevant to including graphics but not to reading them.
+% \begin{variable}{\l_@@_final_name_str, \l_@@_full_name_str}
+%   The full name is as you'd expect the name including path and extension.
+%   The final name here reflects any conversions carried out by the backend,
+%   for example if an |.eps| is converted to |.pdf|.
 %    \begin{macrocode}
-\bool_new:N \l_graphics_draft_bool
+\str_new:N \l_@@_final_name_str
+\str_new:N \l_@@_full_name_str
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_graphics_name_tl, \l_@@_name_tl}
-%    \begin{macrocode}
-\tl_new:N \l_graphics_name_tl
-\tl_new:N \l_@@_name_tl
-%    \end{macrocode}
-% \end{variable}
-%
 % \begin{variable}{\l_@@_internal_box}
 %    \begin{macrocode}
 \box_new:N \l_@@_internal_box
@@ -515,7 +471,7 @@
 % \end{variable}
 %
 % \begin{variable}{\l_graphics_search_ext_seq}
-%   Used to specify fall-back extensions: actually set on a per-driver basis.
+%   Used to specify fall-back extensions: actually set on a per-backend basis.
 %    \begin{macrocode}
 \seq_new:N \l_graphics_search_ext_seq
 %    \end{macrocode}
@@ -536,67 +492,50 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}{\graphics_include:n}
+% \begin{macro}{\graphics_include:nn, \graphics_include:nV}
 % \begin{macro}{\@@_include_search:n}
 % \begin{macro}{\@@_include:}
-% \begin{macro}{\graphics_include:nn}
 % \begin{macro}
 %   {
-%     \@@_include_auxi:n, \@@_include_auxii:n,
+%     \@@_include_auxi:n, \@@_include_auxi:e, \@@_include_auxii:n,
 %     \@@_include_auxiii:n, \@@_include_auxiv:n
 %   }
 %   Actually including an graphic is relatively straight-forward: most of the
-%   work is done by the driver. We only have to deal with making sure the
+%   work is done by the backend. We only have to deal with making sure the
 %   box has no apparent depth. Where the first given name is not found, we
 %   search based on extension only if the \meta{type} was not given. The one
 %   wrinkle is that we may have found a \texttt{.tex} file matching the file
 %   name stem: that's not what we want, so we have to filter out.
 %    \begin{macrocode}
-\cs_new_protected:Npn \graphics_include:n #1
+\cs_new_protected:Npn \graphics_include:nn #1#2
   {
     \group_begin:
+      \keys_set:nn { graphics } {#1}
       \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
-      \file_get_full_name:nNTF {#1} \l_@@_name_tl
+      \file_get_full_name:nNTF {#2} \l_@@_full_name_str
         {
-          \str_if_eq:eeTF { \l_@@_name_tl } { #1 .tex }
-            { \@@_include_search:n {#1} }
+          \str_if_eq:eeTF { \l_@@_full_name_str } { #2 .tex }
+            { \msg_error:nnn { graphics } { graphic-not-found } {#2} }
             { \@@_include: }
         }
-        { \@@_include_search:n {#1} }
+        { \msg_error:nnn { graphics } { graphic-not-found } {#2} }
     \group_end:
   }
-\cs_new_protected:Npn \@@_include_search:n #1
-  {
-    \seq_map_inline:Nn \l_graphics_search_ext_seq
-      {
-        \file_get_full_name:nNT { #1 . ##1 } \l_@@_name_tl
-          { \seq_map_break:n { \use_i:nnn \@@_include: } }
-      }
-    \use:n
-      { \msg_error:nnn { graphics } { graphic-not-found } {#1} }
-  }
+\cs_generate_variant:Nn \graphics_include:nn { nV }
 \cs_new_protected:Npn \@@_include:
   {
-    \file_parse_full_name:VNNN \l_@@_name_tl
-      \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
-    \exp_args:Ne \@@_include_auxi:n
+    \str_if_empty:NTF \l_@@_type_str
       {
-        \exp_args:Ne \str_tail:n
-          { \str_foldcase:V \l_@@_ext_str }
-      }
+        \file_parse_full_name:VNNN \l_@@_full_name_str
+          \l_@@_dir_str \l_@@_name_str \l_@@_ext_str
+        \@@_include_auxi:e
+          {
+            \exp_args:Ne \str_tail:n
+              { \str_foldcase:V \l_@@_ext_str }
+          }
+       }
+       { \@@_include_auxi:e { \l_@@_type_str } }
   }
-\cs_new_protected:Npn \graphics_include:nn #1#2
-  {
-    \group_begin:
-      \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
-      \file_get_full_name:nNTF {#1} \l_@@_name_tl
-        {
-          \exp_args:Ne \@@_include_auxi:n
-            { \str_foldcase:n {#1} }
-        }
-        { \msg_error:nnn { graphics } { graphic-not-found } {#1} }
-    \group_end:
-  }
 \cs_new_protected:Npn \@@_include_auxi:n #1
   {
     \prop_get:NnNF \l_graphics_ext_type_prop { .#1 } \l_@@_internal_tl
@@ -603,20 +542,21 @@
       { \tl_set:Nn \l_@@_internal_tl {#1} }
     \exp_args:NV \@@_include_auxii:n \l_@@_internal_tl
   }
+\cs_generate_variant:Nn \@@_include_auxi:n { e }
 \cs_new_protected:Npn \@@_include_auxii:n #1
   {
     \mode_leave_vertical:
     \cs_if_exist:cTF { @@_backend_include_ #1 :n }
       {
-        \tl_set_eq:NN \l_graphics_name_tl \l_@@_name_tl
+        \tl_set_eq:NN \l_@@_final_name_str \l_@@_full_name_str
+        \str_set:Nx \l_@@_full_name_str
+         { \exp_args:NV \__kernel_file_name_quote:n \l_@@_full_name_str }
         \exp_args:NnV \use:c { @@_backend_getbb_ #1 :n }
-          \l_@@_name_tl
-        \seq_gput_right:NV \g_@@_record_seq \l_graphics_name_tl
-%<*package>
+          \l_@@_full_name_str
+        \seq_gput_right:NV \g_@@_record_seq \l_@@_final_name_str
         \clist_if_exist:NT \@filelist
-          { \exp_args:NV \@addtofilelist \l_graphics_name_tl }
-%</package>
-        \bool_if:NTF \l_graphics_draft_bool
+          { \exp_args:NV \@addtofilelist \l_@@_final_name_str }
+        \bool_if:NTF \l_@@_draft_bool
           { \@@_include_auxiii:n }
           { \@@_include_auxiv:n }
             {#1}
@@ -625,23 +565,21 @@
   }
 \cs_new_protected:Npn \@@_include_auxiii:n #1
   {
-    \hbox_to_wd:nn { \l_graphics_urx_dim - \l_graphics_llx_dim }
+    \hbox_to_wd:nn { \l_@@_urx_dim - \l_@@_llx_dim }
       {
         \tex_vrule:D
         \tex_hss:D
         \vbox_to_ht:nn
-          { \l_graphics_ury_dim - \l_graphics_lly_dim }
+          { \l_@@_ury_dim - \l_@@_lly_dim }
           {
             \tex_hrule:D width
-              \dim_eval:n { \l_graphics_urx_dim - \l_graphics_llx_dim }
+              \dim_eval:n { \l_@@_urx_dim - \l_@@_llx_dim }
             \tex_vss:D
             \hbox_to_wd:nn
-              { \l_graphics_urx_dim - \l_graphics_llx_dim }
+              { \l_@@_urx_dim - \l_@@_llx_dim }
               {
-%<*package>
                 \ttfamily
-%</package>
-                \tex_hss:D \l_@@_name_tl \tex_hss:D
+                \tex_hss:D \l_@@_full_name_str \tex_hss:D
               }
             \tex_vss:D
             \tex_hrule:D
@@ -655,13 +593,13 @@
     \hbox_set:Nn \l_@@_internal_box
       {
         \exp_args:NnV \use:c { @@_backend_include_ #1 :n }
-          \l_@@_name_tl
+          \l_@@_full_name_str
       }
     \box_set_dp:Nn \l_@@_internal_box { 0pt }
     \box_set_ht:Nn \l_@@_internal_box
-      { \l_graphics_ury_dim - \l_graphics_lly_dim }
+      { \l_@@_ury_dim - \l_@@_lly_dim }
      \box_set_wd:Nn \l_@@_internal_box
-      { \l_graphics_urx_dim - \l_graphics_llx_dim }
+      { \l_@@_urx_dim - \l_@@_llx_dim }
     \box_use_drop:N \l_@@_internal_box
   }
 %    \end{macrocode}
@@ -669,7 +607,6 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}{\graphics_show_list:, \graphics_log_list:, \@@_list:N}
 % \begin{macro}[EXP]{\@@_list_aux:n}
@@ -680,7 +617,7 @@
 \cs_new_protected:Npn \@@_list:N #1
   {
     \seq_remove_duplicates:N \g_@@_record_seq
-    #1 { LaTeX/kernel } { file-list }
+    #1 { kernel } { file-list }
       { \seq_map_function:NN \g_@@_record_seq \@@_list_aux:n }
         { } { } { }
   }
@@ -689,6 +626,115 @@
 % \end{macro}
 % \end{macro}
 %
+% \subsection{Utility functions}
+%
+% \begin{macro}{\graphics_get_full_name:nN}
+% \begin{macro}[TF]{\graphics_get_full_name:nN}
+% \begin{macro}{\@@_get_full_name:n}
+%   A simple search.
+%    \begin{macrocode}
+\cs_new_protected:Npn \graphics_get_full_name:nN #1#2
+  {
+    \graphics_get_full_name:nNF {#1} #2
+      { \tl_set:Nn #2 { \q_no_value } }
+  }
+\prg_new_protected_conditional:Npnn \graphics_get_full_name:nN #1#2
+  { T , F , TF }
+  {
+    \group_begin:
+      \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
+      \file_get_full_name:nNTF {#1} \l_@@_full_name_str
+        {
+          \str_if_eq:eeT { \l_@@_full_name_str } { #1 .tex }
+            { \@@_get_full_name:n {#1} }
+        }
+        { \@@_get_full_name:n {#1} }
+    \exp_args:NNNV \group_end:
+    \tl_set:Nn #2 \l_@@_full_name_str
+    \tl_if_empty:NTF #2
+      { \prg_return_false: }
+      { \prg_return_true: }
+  }
+\cs_new_protected:Npn \@@_get_full_name:n #1
+  {
+    \str_clear:N \l_@@_full_name_str
+    \seq_map_inline:Nn \l_graphics_search_ext_seq
+      {
+        \file_get_full_name:nNT { #1 ##1 } \l_@@_full_name_str
+          { \seq_map_break:n { \use_none:nn } }
+      }
+    \use:n
+      { \str_clear:N \l_@@_full_name_str }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\graphics_get_pagecount:nN}
+% \begin{macro}{\@@_get_pagecount:n}
+% \begin{macro}{\@@_get_pagecount:nw}
+%   A generic function to read the number of pages in a graphic file. This is
+%   used by all of the backend where there is not a dedicated primitive. The
+%   plan is essentially the same as reading the bounding box. To avoid multiple
+%   calls, the value is cached either here or in the backend.
+%    \begin{macrocode}
+\cs_new_protected:Npn \graphics_get_pagecount:nN #1#2
+  {
+    \group_begin:
+      \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
+      \file_get_full_name:nNTF {#1} \l_@@_full_name_str
+        {
+          \int_if_exist:cF { c_@@_ \l_@@_full_name_str _pages_int }
+            {
+              \exp_args:NV \@@_backend_get_pagecount:n
+                \l_@@_full_name_str
+            }
+          \tl_set:Nv #2 { c_@@_ \l_@@_full_name_str _pages_int }
+        }
+        {
+          \tl_set:Nn #2 { 0 }
+          \msg_error:nnn { graphics } { graphic-not-found } {#1}
+        }
+    \exp_args:NNNV \group_end:
+    \tl_set:Nn #2 #2
+  }
+\cs_new_protected:Npx \@@_get_pagecount:n #1
+  {
+    \ior_shell_open:Nn \exp_not:N \l_@@_internal_ior
+      { extractbb~-O~#1 }
+    \exp_not:N \ior_if_eof:NTF \exp_not:N \l_@@_internal_ior
+      { \msg_error:nnn { graphics } { pipe-failed } }
+      {
+        \ior_str_map_inline:Nn \exp_not:N \l_@@_internal_ior
+          {
+            \exp_not:N \@@_get_pagecount:nw {#1}
+              ##1 ~ \c_colon_str \c_colon_str \s_@@_stop
+          }
+        \exp_not:N \int_if_exist:cF { c_@@_ #1 _pages_int }
+          { \int_const:cn { c_@@_ #1 _pages_int } { 1 } }
+      }
+    \ior_close:N \exp_not:N \l_@@_internal_ior
+  }
+\use:x
+  {
+    \cs_new_protected:Npn \exp_not:N \@@_get_pagecount:nw
+      ##1##2 \c_colon_str ##3 \c_colon_str ##4 \s_@@_stop
+      {
+        \exp_not:N \str_if_eq:nnT
+          { \c_percent_str \c_percent_str Pages }
+          {##2}
+          {
+            \int_const:cn { c_@@_ ##1 _pages_int } {##3}
+            \exp_not:N \ior_map_break:
+          }
+      }
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro} 
+%
 % \subsection{Messages}
 %
 %    \begin{macrocode}
@@ -695,8 +741,8 @@
 \msg_new:nnnn { graphics } { graphic-not-found }
   { Image~file~'#1'~not~found. }
   {
-    LaTeX~tried~to~open~graphic~file~'#1',
-    ~but~the~file~could~not~be~read.
+    LaTeX~tried~to~open~graphic~file~'#1',~
+    but~the~file~could~not~be~read.
   }
 \msg_new:nnnn { graphics } { pipe-failed }
   { Cannot~run~piped~system~commands. }

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3opacity/l3opacity.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -97,7 +97,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3opacity}{2022-02-05}{}
+\ProvidesExplPackage{l3opacity}{2022-04-10}{}
   {L3 Experimental opacity support}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -48,7 +48,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -166,7 +166,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3str-format}{2022-02-05}{}
+\ProvidesExplPackage{l3str-format}{2022-04-10}{}
   {L3 Experimental string formatting}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -46,7 +46,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -151,7 +151,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3sys-shell}{2022-02-05}{}
+\ProvidesExplPackage{l3sys-shell}{2022-04-10}{}
   {L3 Experimental system shell functions}
 %    \end{macrocode}
 %
@@ -393,6 +393,8 @@
         \seq_set_split:NnV #2 { \char_generate:nn { `\^^M } { 12 } }
           \exp_not:N \l_@@_tmp_tl
         \seq_pop_right:NN #2 \exp_not:N \l_@@_tmp_tl
+        \exp_not:N \tl_if_blank:eTF { \exp_not:N \seq_item:Nn #2 { 1 } }
+          { \seq_clear:N #2 }
       }
   }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -53,7 +53,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -672,7 +672,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2022-02-05}{}
+\ProvidesExplPackage{xcoffins}{2022-04-10}{}
   {L3 Experimental design level coffins}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -61,7 +61,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -686,7 +686,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{l3galley}{2022-02-05}{}
+\ProvidesExplPackage{l3galley}{2022-04-10}{}
   {L3 Experimental galley code}
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-05}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -731,7 +731,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2022-02-05}{}
+\ProvidesExplPackage{xgalley}{2022-04-10}{}
   {L3 Experimental galley}
 \RequirePackage{xtemplate,l3galley}
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -24,7 +24,7 @@
 %
 %<*driver|generic|package|2ekernel>
 %</driver|generic|package|2ekernel>
-\def\ExplFileDate{2022-02-24}%
+\def\ExplFileDate{2022-04-10}%
 %<*driver>
 \documentclass[full]{l3doc}
 \usepackage{graphicx}
@@ -51,7 +51,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -727,13 +727,6 @@
 %   \meta{control sequence name} must, when fully expanded, consist of
 %   character tokens, typically a mixture of category code $10$ (space),
 %   $11$ (letter) and $12$ (other).
-%   \begin{texnote}
-%     Protected macros that appear in a \texttt{c}-type argument are
-%     expanded despite being protected; \cs{exp_not:n} also has no
-%     effect.  An internal error occurs if non-characters or active
-%     characters remain after full expansion, as the conversion to a
-%     control sequence is not possible.
-%   \end{texnote}
 % \end{function}
 %
 % As an example of the \cs{use:c} function, both

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -596,7 +596,7 @@
 %
 % \begin{function}[added = 2018-04-01]{\tl_build_get:NN}
 %   \begin{syntax}
-%     \cs{tl_build_get:N} \meta{tl~var_1} \meta{tl~var_2}
+%     \cs{tl_build_get:NN} \meta{tl~var_1} \meta{tl~var_2}
 %   \end{syntax}
 %   Stores the contents of the \meta{tl~var_1} in the \meta{tl~var_2}.
 %   The \meta{tl~var_1} must have been set up with \cs{tl_build_begin:N}
@@ -1415,7 +1415,7 @@
     \tl_if_in:nnTF {#1} { " }
       {
         \msg_error:nnx
-          { ior } { quote-in-shell } {#1}
+          { kernel } { quote-in-shell } {#1}
       }
       { \__kernel_ior_open:Nn #2 { |#1 } }
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -1015,7 +1015,7 @@
         { \__kernel_debug_log:x { Defining~key~#1~\msg_line_context: } }
     }
     { }
-    { \@@_cmd_set:nn }
+    { \@@_cmd_set_direct:nn }
 %<@@=msg>
   \__kernel_patch:nnn
     { }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -85,7 +85,7 @@
 %    require you to do updates, if the class changes.}}
 %
 % \author{\Team}
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 % \maketitle
 % \tableofcontents
 %
@@ -361,17 +361,22 @@
 % \subsection{Describing functions in the documentation}
 %
 % \DescribeEnv{function}
+% \DescribeEnv{variable}
+% Two heavily-used environments are defined to describe \pkg{expl3} functions
+% and variables.  If describing a variable, use the latter environment; it
+% behaves identically to the \env{function} environment.
 % \DescribeEnv{syntax}
-% Two heavily-used environments are defined to describe the syntax of
-% \pkg{expl3} functions and variables.
+% Both of the above environments are typically combined with the \env{syntax}
+% environment, to describe their syntax.
 % \begin{framed}
 %   \vspace{-\baselineskip}
 % \begin{verbatim}
-% \begin{function}{\function_one:, \function_two:}
+% \begin{function}{\package_function_one:N, \package_function_two:n}
 %   \begin{syntax}
-%     |\foo_bar:| \Arg{meta} \meta{test_1}
+%     \cs{package_function_one:N} \meta{cs}
+%     \cs{package_function_two:n} \marg{Argument}
 %   \end{syntax}
-% \meta{description}
+% Descriptive text here ...
 % \end{function}
 % \end{verbatim}
 %   \hrulefill
@@ -378,29 +383,38 @@
 %   \par
 %   \hspace*{0.25\textwidth}
 %   \begin{minipage}{0.5\textwidth}
-%     \begin{function}{\function_one:, \function_two:}
+%     \begin{function}{\package_function_one:N, \package_function_two:n}
 %       \begin{syntax}
-%         |\foo_bar:| \Arg{meta} \meta{test_1}
+%         \cs[no-index]{package_function_one:N} \meta{cs}
+%         \cs[no-index]{package_function_two:n} \marg{Argument}
 %       \end{syntax}
-%       \meta{description}
+%       \emph{Descriptive text here …}
 %     \end{function}
 %   \end{minipage}
 % \end{framed}
 %
 % Function environments take an optional argument to indicate whether
-% the function(s) it describes are expandable or restricted-expandable
-% or defined in conditional forms. Use |EXP|, |rEXP|, |TF|, |pTF|, or |noTF| for
-% this; note that |pTF| implies |EXP| since predicates must always be
-% expandable, and that |noTF| means that the function without |TF|
-% should be documented in addition to |TF|.  As an example:
+% the function(s) it describes are expandable (use |EXP|) or
+% restricted-expandable (use |rEXP|) or defined in conditional forms
+% (use |TF|, |pTF|, or |noTF|).  Note that |pTF| implies |EXP| since
+% predicates must always be expandable, and that |noTF| means that the
+% function without |TF| should be documented in addition to |TF|.  For
+% the conditional forms |TF| and |pTF|, the argument of the
+% \env{function} environment is \emph{not} in fact a command that
+% exists: in the example below, \cs[no-index]{tl_if_empty:N} does not
+% exist, but its conditional forms \cs{tl_if_empty:NT},
+% \cs{tl_if_empty:NF}, \cs{tl_if_empty:NTF} and predicate form
+% \cs{tl_if_empty_p:N} exist:
 % \begin{framed}
 %   \vspace{-\baselineskip}
 % \begin{verbatim}
-% \begin{function}[pTF]{\cs_if_exist:N}
+% \begin{function}[pTF]{\tl_if_empty:N, \tl_if_empty:c}
 %   \begin{syntax}
-%     \cs{cs_if_exist_p:N} \meta{cs}
+%     \cs{tl_if_empty_p:N} \meta{tl~var}
+%     \cs{tl_if_empty:NTF} \meta{tl~var} \Arg{true code} \Arg{false code}
 %   \end{syntax}
-% \meta{description}
+%   Tests if the \meta{token list variable} is entirely empty
+%   (\emph{i.e.}~contains no tokens at all).
 % \end{function}
 % \end{verbatim}
 %   \hrulefill
@@ -407,23 +421,21 @@
 %   \par
 %   \hspace*{0.25\textwidth}
 %   \begin{minipage}{0.5\textwidth}
-%     \begin{function}[pTF]{\cs_if_exist:N}
+%     \begin{function}[pTF]{\tl_if_empty:N, \tl_if_empty:c}
 %       \begin{syntax}
-%         \cs{cs_if_exist_p:N} \meta{cs}
+%         \cs{tl_if_empty_p:N} \meta{tl~var}
+%         \cs{tl_if_empty:NTF} \meta{tl~var} \Arg{true code} \Arg{false code}
 %       \end{syntax}
-%       \meta{description}
+%       Tests if the \meta{token list variable} is entirely empty
+%       (\emph{i.e.}~contains no tokens at all).
 %     \end{function}
 %   \end{minipage}
 % \end{framed}
 %
-% \DescribeEnv{variable}
-% If you are documenting a variable instead of a function, use the
-% \env{variable} environment instead; it behaves identically to the
-% \env{function} environment above.
-%
 % \DescribeEnv{texnote}
 % This environment is used to call out sections within \env{function}
-% and similar that are only of interest to seasoned \TeX{} developers.
+% and similar environments that are only of interest to seasoned
+% \TeX{} developers.
 %
 % \subsection{Describing functions in the implementation}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -331,13 +331,6 @@
 %
 %   The |:cc| variant constructs the \meta{function} name in the same
 %   manner as described for the \meta{tokens}.
-%   \begin{texnote}
-%     Protected macros that appear in a \texttt{c}-type argument are
-%     expanded despite being protected; \cs{exp_not:n} also has no
-%     effect.  An internal error occurs if non-characters or active
-%     characters remain after full expansion, as the conversion to a
-%     control sequence is not possible.
-%   \end{texnote}
 % \end{function}
 %
 % \begin{function}[EXP]{\exp_args:No}
@@ -374,13 +367,6 @@
 %   recovered and placed inside braces into the input stream \emph{after}
 %   reinsertion of the \meta{function}. Thus the \meta{function} may take more
 %   than one argument: all others are left unchanged.
-%   \begin{texnote}
-%     Protected macros that appear in a \texttt{v}-type argument are
-%     expanded despite being protected; \cs{exp_not:n} also has no
-%     effect.  An internal error occurs if non-characters or active
-%     characters remain after full expansion, as the conversion to a
-%     control sequence is not possible.
-%   \end{texnote}
 % \end{function}
 %
 % \begin{function}[EXP, added = 2018-05-15]{\exp_args:Ne}
@@ -683,13 +669,6 @@
 %   converts this into a control sequence.
 %   Further expansion of this control sequence is then inhibited using
 %   \cs{exp_not:N}.
-%   \begin{texnote}
-%     Protected macros that appear in a \texttt{c}-type argument are
-%     expanded despite being protected; \cs{exp_not:n} also has no
-%     effect.  An internal error occurs if non-characters or active
-%     characters remain after full expansion, as the conversion to a
-%     control sequence is not possible.
-%   \end{texnote}
 % \end{function}
 %
 % \begin{function}[EXP]{\exp_not:n}
@@ -736,13 +715,6 @@
 %   name.
 %   The content of the \meta{variable} is recovered, and further
 %   expansion in |x|-type or \texttt{e}-type arguments is prevented using \cs{exp_not:n}.
-%   \begin{texnote}
-%     Protected macros that appear in a \texttt{v}-type argument are
-%     expanded despite being protected; \cs{exp_not:n} also has no
-%     effect.  An internal error occurs if non-characters or active
-%     characters remain after full expansion, as the conversion to a
-%     control sequence is not possible.
-%   \end{texnote}
 % \end{function}
 %
 % \begin{function}[EXP]{\exp_not:e}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 % \maketitle
 %
 % \begin{documentation}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -882,6 +882,18 @@
 %   group and are thus never set.
 % \end{function}
 %
+% \section{Digesting keys}
+%
+% \begin{function}[added = 2022-03-09]{\keys_precompile:nnN}
+%   \begin{syntax}
+%     \cs{keys_precompile:nnN} \Arg{module} \Arg{keyval list} \meta{tl}
+%   \end{syntax}
+%   Parses the \meta{keyval list} as for \cs{keys_set:nn}, placing the
+%   resulting code for those which set variables or functions into the
+%   \meta{tl}. Thus this function \enquote{precompiles} the keyval list into
+%   a set of results which can be applied rapidly.
+% \end{function}
+%
 % \section{Utility functions for keys}
 %
 % \begin{function}[EXP, pTF, updated = 2022-01-10]
@@ -1661,6 +1673,14 @@
 %    \end{macrocode}
 % \end{variable}
 %
+% \begin{variable}{\l_@@_precompile_bool, \l_@@_precompile_tl}
+%   For digesting keys.
+%    \begin{macrocode}
+\bool_new:N \l_@@_precompile_bool
+\tl_new:N \l_@@_precompile_tl
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{variable}{\l_keys_usage_load_prop, \l_keys_usage_preamble_prop}
 %   Global data for document-level information.
 %    \begin{macrocode}
@@ -1694,6 +1714,19 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\@@_precompile:n}
+%   An auxiliary to allow cleaner showing of code.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_precompile:n #1
+  {
+    \bool_if:NTF \l_@@_precompile_bool
+      { \tl_put_right:Nn \l_@@_precompile_tl }
+      { \use:n }
+        {#1}
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{The key defining mechanism}
 %
 % \begin{macro}{\keys_define:nn}
@@ -1866,7 +1899,7 @@
       { \exp_not:c { bool_ #2 set_ #3 :N } \exp_not:N #1 }
     \@@_cmd_set:nx { \l_keys_path_str / false }
       { \exp_not:c { bool_ #2 set_ #4 :N } \exp_not:N #1 }
-    \@@_cmd_set:nn { \l_keys_path_str / unknown }
+    \@@_cmd_set_direct:nn { \l_keys_path_str / unknown }
       {
         \msg_error:nnx { keys } { boolean-values-only }
           \l_keys_key_str
@@ -1909,8 +1942,8 @@
   {
     \cs_set_nopar:cpn { \c_@@_type_root_str \l_keys_path_str }
       { choice }
-    \@@_cmd_set:nn \l_keys_path_str { #1 {##1} }
-    \@@_cmd_set:nn { \l_keys_path_str / unknown }
+    \@@_cmd_set_direct:nn \l_keys_path_str { #1 {##1} }
+    \@@_cmd_set_direct:nn { \l_keys_path_str / unknown }
       {
         \msg_error:nnxx { keys } { choice-unknown }
           \l_keys_path_str {##1}
@@ -1952,13 +1985,18 @@
 % \end{macro}
 %
 % \begin{macro}
-%   {\@@_cmd_set:nn, \@@_cmd_set:nx, \@@_cmd_set:Vn, \@@_cmd_set:Vo}
+%   {
+%     \@@_cmd_set:nn, \@@_cmd_set:nx, \@@_cmd_set:Vn, \@@_cmd_set:Vo,
+%     \@@_cmd_set_direct:nn
+%   }
 %   Setting the code for a key first logs if appropriate that we are
 %   defining a new key, then saves the code.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_cmd_set:nn #1#2
+  {  \@@_cmd_set_direct:nn {#1} { \@@_precompile:n {#2} } }
+\cs_generate_variant:Nn \@@_cmd_set:nn { nx , Vn , Vo }
+\cs_new_protected:Npn \@@_cmd_set_direct:nn #1#2
   { \cs_set_protected:cpn { \c_@@_code_root_str #1 } ##1 {#2} }
-\cs_generate_variant:Nn \@@_cmd_set:nn { nx , Vn , Vo }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1970,7 +2008,10 @@
 \cs_new_protected:Npn \@@_cs_set:NNpn #1#2#3#
   {
     \cs_set_protected:cpx { \c_@@_code_root_str \l_keys_path_str } ##1
-      { #1 \exp_not:N #2 \exp_not:n {#3} {##1} }
+      {
+        \@@_precompile:n
+          { #1 \exp_not:N #2 \exp_not:n {#3} {##1} }
+      }
     \use_none:n
   }
 \cs_generate_variant:Nn \@@_cs_set:NNpn { Nc }
@@ -2089,13 +2130,17 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_meta_make:n #1
   {
-    \@@_cmd_set:Vo \l_keys_path_str
+    \exp_args:NVo \@@_cmd_set_direct:nn \l_keys_path_str
       {
-        \exp_after:wN \keys_set:nn \exp_after:wN { \l_@@_module_str } {#1}
+        \exp_after:wN \keys_set:nn \exp_after:wN 
+          { \l_@@_module_str } {#1}
       }
   }
 \cs_new_protected:Npn \@@_meta_make:nn #1#2
-  { \@@_cmd_set:Vn \l_keys_path_str { \keys_set:nn {#1} {#2} } }
+  {
+    \exp_args:NV \@@_cmd_set_direct:nn
+      \l_keys_path_str { \keys_set:nn {#1} {#2} }
+  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -2895,6 +2940,20 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\keys_precompile:nnN}
+%   A simple wrapper.
+%    \begin{macrocode}
+\cs_new_protected:Npn \keys_precompile:nnN #1#2#3
+  {
+    \bool_set_true:N \l_@@_precompile_bool
+    \tl_clear:N \l_@@_precompile_tl
+    \keys_set:nn {#1} {#2}
+    \bool_set_false:N \l_@@_precompile_bool
+    \tl_set_eq:NN #3 \l_@@_precompile_tl
+  }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{macro}{\@@_set_keyval:n, \@@_set_keyval:nn}
 % \begin{macro}{\@@_set_keyval:nnn, \@@_set_keyval:onn}
 % \begin{macro}{\@@_find_key_module:wNN}
@@ -3379,7 +3438,11 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}{\keys_show:nn, \keys_log:nn, \@@_show:Nnn}
+% \begin{macro}{\keys_show:nn, \keys_log:nn}
+% \begin{macro}{\@@_show:Nnn}
+% \begin{macro}{\@@_show:n}
+% \begin{macro}{\@@_show:w}
+% \begin{macro}{\@@_show:Nw}
 %   To show a key, show its code using a message.
 %    \begin{macrocode}
 \cs_new_protected:Npn \keys_show:nn
@@ -3395,10 +3458,13 @@
           {
             \exp_args:Nnf \msg_show_item_unbraced:nn { code }
               {
-                \exp_args:Nc \cs_replacement_spec:N
+                \exp_args:Ne \@@_show:n
                   {
-                    \c_@@_code_root_str
-                    \@@_trim_spaces:n { #2 / #3 }
+                    \exp_args:Nc \cs_replacement_spec:N
+                    {
+                      \c_@@_code_root_str
+                      \@@_trim_spaces:n { #2 / #3 }
+                    }
                   }
               }
           }
@@ -3405,8 +3471,39 @@
       }
       { } { }
   }
+\cs_new:Npx \@@_show:n #1
+  {
+    \exp_not:N \@@_show:w
+      #1
+      \tl_to_str:n { \@@_precompile:n }
+      #1
+      \tl_to_str:n { \@@_precompile:n }
+      \exp_not:N \s_@@_stop
+  }
+\use:x
+  {
+    \cs_new:Npn \exp_not:N \@@_show:w
+      ##1 \tl_to_str:n { \@@_precompile:n }
+      ##2 \tl_to_str:n { \@@_precompile:n }
+      ##3 \exp_not:N \s_@@_stop
+  }
+  {
+    \tl_if_blank:nTF {#2}
+      {#1}
+      { \@@_show:Nw #2 \s_@@_stop }
+  }
+\use:x
+  {
+    \cs_new:Npn \exp_not:N \@@_show:Nw ##1##2
+      \c_right_brace_str \exp_not:N \s_@@_stop
+  }
+  {#2}
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \subsection{Messages}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -100,15 +100,19 @@
 %    \end{macrocode}
 %
 % \begin{macro}[EXP,pTF]{\legacy_if:n}
-%   A friendly wrapper.
+%   A friendly wrapper. We need to use the \cs{if:w} approach here, rather than
+%   testing against \tn{iftrue}/\tn{iffalse} as the latter approach fails for
+%   primitive conditionals such as \tn{ifmmode}. The \cs{reverse_if:N} here
+%   means that we get a slightly more useful error if the name is undefined.
 %    \begin{macrocode}
 \prg_new_conditional:Npnn \legacy_if:n #1 { p , T , F , TF }
   {
-    \exp_args:Nc \if_meaning:w { if#1 } \iftrue
+    \exp_after:wN \reverse_if:N
+      \cs:w if#1 \cs_end:
+      \prg_return_false:
+    \else:
       \prg_return_true:
-    \else:
-      \prg_return_false:
-    \fi:
+    \fi: 
   }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -317,6 +317,7 @@
 local scan_keyword = token.scan_keyword
 local put_next     = token.put_next
 local token_create = token.create
+local token_new    = token.new
 %    \end{macrocode}
 %
 %   Since token.create only returns useful values after the tokens

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -1854,9 +1854,7 @@
   { Cannot~generate~null~char~as~a~space. }
 \msg_new:nnn { char } { out-of-range }
   { Charcode~requested~out~of~engine~range. }
-\msg_new:nnn { char } { space }
-  { Cannot~generate~space~chars. }
-\msg_new:nnnn { ior } { quote-in-shell }
+\msg_new:nnnn { kernel } { quote-in-shell }
   { Quotes~in~shell~command~'#1'. }
   { Shell~commands~cannot~contain~quotes~("). }
 \msg_new:nnnn { keys } { no-property }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -1140,6 +1140,7 @@
   \@@_primitive:NN \kcatcode              \tex_kcatcode:D
   \@@_primitive:NN \kuten                 \tex_kuten:D
   \@@_primitive:NN \lastnodechar          \tex_lastnodechar:D
+  \@@_primitive:NN \lastnodefont          \tex_lastnodefont:D
   \@@_primitive:NN \lastnodesubtype       \tex_lastnodesubtype:D
   \@@_primitive:NN \noautospacing         \tex_noautospacing:D
   \@@_primitive:NN \noautoxspacing        \tex_noautoxspacing:D
@@ -1146,6 +1147,7 @@
   \@@_primitive:NN \pagefistretch         \tex_pagefistretch:D
   \@@_primitive:NN \postbreakpenalty      \tex_postbreakpenalty:D
   \@@_primitive:NN \prebreakpenalty       \tex_prebreakpenalty:D
+  \@@_primitive:NN \ptexlineendmode       \tex_lineendmode:D
   \@@_primitive:NN \ptexminorversion      \tex_ptexminorversion:D
   \@@_primitive:NN \ptexrevision          \tex_ptexrevision:D
   \@@_primitive:NN \ptexversion           \tex_ptexversion:D
@@ -1161,6 +1163,8 @@
   \@@_primitive:NN \textbaselineshiftfactor
     \tex_textbaselineshiftfactor:D
   \@@_primitive:NN \tfont                 \tex_tfont:D
+  \@@_primitive:NN \toucs                 \tex_toucs:D
+  \@@_primitive:NN \ucs                   \tex_ucs:D
   \@@_primitive:NN \xkanjiskip            \tex_xkanjiskip:D
   \@@_primitive:NN \xspcode               \tex_xspcode:D
   \@@_primitive:NN \ybaselineshift        \tex_ybaselineshift:D
@@ -1176,7 +1180,6 @@
   \@@_primitive:NN \kchar                 \tex_kchar:D
   \@@_primitive:NN \kchardef              \tex_kchardef:D
   \@@_primitive:NN \kuten                 \tex_kuten:D
-  \@@_primitive:NN \ucs                   \tex_ucs:D
   \@@_primitive:NN \uptexrevision         \tex_uptexrevision:D
   \@@_primitive:NN \uptexversion          \tex_uptexversion:D
 %    \end{macrocode}
@@ -1195,6 +1198,7 @@
 %    \begin{macrocode}
   \@@_primitive:NN \partokencontext       \tex_partokencontext:D
   \@@_primitive:NN \partokenname          \tex_partokenname:D
+  \@@_primitive:NN \showstream            \tex_showstream:D
   \@@_primitive:NN \tracingstacklevels    \tex_tracingstacklevels:D
 %    \end{macrocode}
 % End of the \enquote{just the names} part of the source.
@@ -1470,9 +1474,9 @@
 %   Here \enquote{smaller} refers to codepoint order which does not correspond to
 %   the user expected order for most non-ASCII strings.
 %    \begin{macrocode}
-local minus_tok = token.new(string.byte'-', 12)
-local zero_tok = token.new(string.byte'0', 12)
-local one_tok = token.new(string.byte'1', 12)
+local minus_tok = token_new(string.byte'-', 12)
+local zero_tok = token_new(string.byte'0', 12)
+local one_tok = token_new(string.byte'1', 12)
 luacmd('tex_strcmp:D', function()
   local first = scan_string()
   local second = scan_string()
@@ -1487,14 +1491,19 @@
 %
 % \begin{macro}{\tex_Ucharcat:D}
 %   Creating arbitrary chars using |tex.cprint|.
-%   The alternative approach using |token.put_next(token.create(...))|
-%   would be about 10\% slower.
+%   The alternative approach using |token.new(...)| is about 10\% slower
+%   but needed to create arbitrary space tokens.
 %    \begin{macrocode}
+local sprint = tex.sprint
 local cprint = tex.cprint
 luacmd('tex_Ucharcat:D', function()
   local charcode = scan_int()
   local catcode = scan_int()
-  cprint(catcode, utf8_char(charcode))
+  if catcode == 10 then
+    sprint(token_new(charcode, 10))
+  else
+    cprint(catcode, utf8_char(charcode))
+  end
 end, 'global')
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -222,8 +222,8 @@
 %
 % \section{String conditionals}
 %
-% \begin{function}[EXP,pTF, added = 2015-09-18]
-%   {\str_if_empty:N, \str_if_empty:c}
+% \begin{function}[EXP,pTF, added = 2015-09-18, updated = 2022-03-21]
+%   {\str_if_empty:N, \str_if_empty:c, \str_if_empty:n}
 %   \begin{syntax}
 %     \cs{str_if_empty_p:N} \meta{str~var}
 %     \cs{str_if_empty:NTF} \meta{str~var} \Arg{true code} \Arg{false code}
@@ -282,8 +282,8 @@
 %   tests whether \meta{string_2} is found inside \meta{string_1}.
 % \end{function}
 %
-% \begin{function}[added = 2013-07-24, updated = 2015-02-28, EXP, noTF]
-%   {\str_case:nn, \str_case:Vn, \str_case:on, \str_case:nV, \str_case:nv}
+% \begin{function}[added = 2013-07-24, updated = 2022-03-21, EXP, noTF]
+%   {\str_case:nn, \str_case:Vn, \str_case:Nn, \str_case:on, \str_case:nV, \str_case:nv}
 %   \begin{syntax}
 %     \cs{str_case:nnTF} \Arg{test string} \\
 %     ~~|{| \\
@@ -747,16 +747,6 @@
 %       correctly deal with context-dependence and other factors appropriate
 %       to text case changing.
 %   \end{itemize}
-%
-%   \begin{texnote}
-%     As with all \pkg{expl3} functions, the input supported by
-%     \cs{str_foldcase:n} is \emph{engine-native} characters which are or
-%     interoperate with \textsc{utf-8}. As such, when used with \pdfTeX{}
-%     \emph{only} the Latin alphabet characters A--Z are case-folded
-%     (\emph{i.e.}~the \textsc{ascii} range which coincides with
-%     \textsc{utf-8}). Full \textsc{utf-8} support is available with both
-%     \XeTeX{} and \LuaTeX{}.
-%   \end{texnote}
 % \end{function}
 %
 % \begin{function}[EXP, added = 2019-11-26]
@@ -789,18 +779,6 @@
 %   a language-insensitive process, there is no special treatment of
 %   Turkic input (\emph{i.e.}~\texttt{I} always folds to \texttt{i} and
 %   not to \texttt{\i}).
-%
-%   \begin{texnote}
-%     As with all \pkg{expl3} functions, the input supported by
-%     \cs{str_foldcase:n} is \emph{engine-native} characters which are or
-%     interoperate with \textsc{utf-8}. As such, when used with \pdfTeX{}
-%     \emph{only} the Latin alphabet characters A--Z are case-folded
-%     (\emph{i.e.}~the \textsc{ascii} range which coincides with
-%     \textsc{utf-8}). Full \textsc{utf-8} support is available with both
-%     \XeTeX{} and \LuaTeX{}, subject only to the fact that \XeTeX{} in
-%     particular has issues with characters of code above hexadecimal
-%     $0\mathrm{xFFFF}$ when interacting with \cs{tl_to_str:n}.
-%   \end{texnote}
 % \end{function}
 %
 % \section{Viewing strings}
@@ -1113,7 +1091,7 @@
 %
 % \begin{macro}[pTF, EXP]
 %   {
-%     \str_if_empty:N, \str_if_empty:c,
+%     \str_if_empty:N, \str_if_empty:c, \str_if_empty:n,
 %     \str_if_exist:N, \str_if_exist:c
 %   }
 %   More copy-paste!
@@ -1126,6 +1104,8 @@
   { p , T , F , TF }
 \prg_new_eq_conditional:NNn \str_if_empty:c \tl_if_empty:c
   { p , T , F , TF }
+\prg_new_eq_conditional:NNn \str_if_empty:n \tl_if_empty:n
+  { p , T , F , TF }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1224,7 +1204,7 @@
 % \end{macro}
 %
 % \begin{macro}[EXP, noTF]
-%   {\str_case:nn, \str_case:Vn, \str_case:on, \str_case:nV, \str_case:nv, \str_case_e:nn}
+%   {\str_case:nn, \str_case:Vn, \str_case:Nn, \str_case:on, \str_case:nV, \str_case:nv, \str_case_e:nn}
 % \begin{macro}[EXP]{\@@_case:nnTF, \@@_case_e:nnTF}
 % \begin{macro}[EXP]
 %   {\@@_case:nw, \@@_case_e:nw, \@@_case_end:nw}
@@ -1254,6 +1234,10 @@
 \cs_new:Npn \@@_case:nnTF #1#2#3#4
   { \@@_case:nw {#1} #2 {#1} { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop }
 \cs_generate_variant:Nn \str_case:nn   { V , o , nV , nv }
+\cs_new_eq:NN \str_case:Nn   \str_case:Vn
+\cs_new_eq:NN \str_case:NnT  \str_case:VnT
+\cs_new_eq:NN \str_case:NnF  \str_case:VnF
+\cs_new_eq:NN \str_case:NnTF \str_case:VnTF
 \prg_generate_conditional_variant:Nnn \str_case:nn
   { V , o , nV , nv } { T , F , TF }
 \cs_new:Npn \@@_case:nw #1#2#3
@@ -1918,10 +1902,21 @@
 % \begin{macro}[EXP]{\@@_change_case_loop:nw}
 % \begin{macro}[EXP]{\@@_change_case_space:n}
 % \begin{macro}[EXP]{\@@_change_case_char:nN}
+% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNN}
+% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNNN}
+% \begin{macro}[EXP]{\@@_change_case_char_UTFviii:nNNNN}
+% \begin{macro}[EXP]
+%   {
+%     \@@_change_case_char_UTFviii:nn ,
+%     \@@_change_case_char_UTFviii_lower:nn ,
+%     \@@_change_case_char_UTFviii_upper:nn ,
+%     \@@_change_case_char_UTFviii_fold:nn
+%   }
 %   Case changing for programmatic reasons is done by first detokenizing
 %   input then doing a simple loop that only has to worry about spaces
 %   and everything else. The output is detokenized to allow data sharing
-%   with text-based case changing.
+%   with text-based case changing. Similarly, for $8$-bit engines the
+%   multi-byte information is shared.
 %    \begin{macrocode}
 \cs_new:Npn \str_foldcase:n  #1 { \@@_change_case:nn {#1} { fold } }
 \cs_new:Npn \str_lowercase:n #1 { \@@_change_case:nn {#1} { lower } }
@@ -1965,7 +1960,96 @@
       { \use:c { char_str_ #1 case:N } #2 }
     \@@_change_case_loop:nw {#1}
   }
+\if_int_compare:w 0
+  \cs_if_exist:NT \tex_XeTeXversion:D { 1 }
+  \cs_if_exist:NT \tex_luatexversion:D { 1 }
+  > 0 \exp_stop_f:
+\else:
+  \cs_gset:Npn \@@_change_case_char:nN #1#2
+    {
+      \@@_if_recursion_tail_stop_do:Nn #2
+        { \@@_change_case_end:wn }
+      \int_compare:nNnTF { `#2 } > { "80 }
+        {
+          \int_compare:nNnTF { `#2 } < { "E0 }
+            { \@@_change_case_char_UTFviii:nNN }
+            {
+              \int_compare:nNnTF { `#2 } < { "F0 }
+                { \@@_change_case_char_UTFviii:nNNN }
+                { \@@_change_case_char_UTFviii:nNNNN }
+            }
+          {#1} #2
+        }
+        {
+          \@@_change_case_output:fw
+            { \use:c { char_str_ #1 case:N } #2 }
+          \@@_change_case_loop:nw {#1}
+        }
+    }
+  \cs_new:Npn \@@_change_case_char_UTFviii:nNN #1#2#3
+    { \@@_change_case_char_UTFviii:nn {#1} {#2#3} }
+  \cs_new:Npn \@@_change_case_char_UTFviii:nNNN #1#2#3#4
+    { \@@_change_case_char_UTFviii:nn {#1} {#2#3#4} }
+  \cs_new:Npn \@@_change_case_char_UTFviii:nNNNN #1#2#3#4#5
+    { \@@_change_case_char_UTFviii:nn {#1} {#2#3#4#5} }
 %    \end{macrocode}
+%   Skip high chars for the Japanese engines.
+%    \begin{macrocode}
+  \cs_if_exist:NF \tex_pdftexversion:D
+    {
+      \cs_gset:Npn \@@_change_case_char_UTFviii:nNNN #1#2#3#4
+        {
+          \@@_change_case_output:nw {#2#3#4}
+          \@@_change_case_loop:nw {#1}
+        }
+      \cs_gset:Npn \@@_change_case_char_UTFviii:nNNNN #1#2#3#4#5
+        {
+          \@@_change_case_output:nw {#2#3#4#5}
+          \@@_change_case_loop:nw {#1}
+        }
+    }
+  \cs_new:Npn \@@_change_case_char_UTFviii:nn #1#2
+    {
+      \use:c { @@_change_case_char_UTFviii_ #1 :nn } {#1} {#2}
+    }
+  \cs_new:Npn \@@_change_case_char_UTFviii_upper:nn #1#2
+    {
+      \@@_change_case_output:fw
+        {
+          \cs_if_exist:cTF { c__kernel_ #1 case_ #2 _tl }
+            {
+              \__kernel_tl_to_str:w \exp_after:wN \exp_after:wN \exp_after:wN
+                { \cs:w c__kernel_ #1 case_ #2 _tl \cs_end: }
+            }
+            {#2}
+        }
+      \@@_change_case_loop:nw {#1}
+    }
+  \cs_new_eq:NN \@@_change_case_char_UTFviii_lower:nn
+    \@@_change_case_char_UTFviii_upper:nn
+  \cs_new:Npn \@@_change_case_char_UTFviii_fold:nn #1#2
+    {
+      \@@_change_case_output:fw
+        {
+          \cs_if_exist:cTF { c__kernel_ #1 case_ #2 _tl }
+            {
+              \__kernel_tl_to_str:w \exp_after:wN \exp_after:wN \exp_after:wN
+                { \cs:w c__kernel_ #1 case_ #2 _tl \cs_end: }
+            }
+            {
+              \cs_if_exist:cTF { c__kernel_lowercase_ #2 _tl }
+                {
+                  \__kernel_tl_to_str:w
+                    \exp_after:wN \exp_after:wN \exp_after:wN
+                    { \cs:w c__kernel_lowercase_ #2 _tl \cs_end: }
+                }
+                {#2}
+            }
+        }
+      \@@_change_case_loop:nw {#1}
+    }
+\fi:
+%    \end{macrocode}
 % \end{macro}
 % \end{macro}
 % \end{macro}
@@ -1975,6 +2059,10 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \begin{variable}
 %   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -670,10 +670,10 @@
       { \@@_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5#6#7} }
     \cs_new:Npn \@@_change_case_char_UTFviii:nnnn #1#2#3#4
       {
-        \cs_if_exist:cTF { c_@@_ #1 case_ \tl_to_str:n {#4} _tl }
+        \cs_if_exist:cTF { c__kernel_ #1 case_ \tl_to_str:n {#4} _tl }
           {
             \@@_change_case_store:v
-              { c_@@_ #1 case_ \tl_to_str:n {#4} _tl }
+              { c__kernel_ #1 case_ \tl_to_str:n {#4} _tl }
           }
           { \@@_change_case_store:n {#4} }
         \use:c { @@_change_case_char_next_ #2 :nn } {#2} {#3}
@@ -1536,11 +1536,11 @@
 %
 % For $8$-bit engines we now need to define the case-change data for
 % the multi-octet mappings. This data is here not in the \pkg{char} module
-% as the multi-byte nature means they are never |N|-type.
-% These need a list of what code points are
-% doable in |T1| so the list is hard coded (there's no saving in loading
-% the mappings dynamically). All of the straight-forward ones have two
-% octets, so that is taken as read.
+% as the multi-byte nature means they are never |N|-type. As this data is
+% needed both for text and string work, it is stored as |kernel|: it remains
+% internal as it is not really suitable for wider exposure.
+%
+% The first set of codepoints are those in |T1|: all of these are two bytes. 
 %    \begin{macrocode}
 \group_begin:
   \bool_lazy_or:nnF
@@ -1562,7 +1562,7 @@
         {
           \tl_const:cx
             {
-              c_@@_ #1 case_
+              c__kernel_ #1 case_
               \char_generate:nn {#2} { 12 }
               \char_generate:nn {#3} { 12 }
               _tl
@@ -1578,7 +1578,7 @@
         {
           \tl_const:cx
             {
-              c_@@_lowercase_
+              c__kernel_lowercase_
               \char_generate:nn {#1} { 12 }
               \char_generate:nn {#2} { 12 }
               _tl
@@ -1694,8 +1694,7 @@
         { 0218 } { 0219 }
         { 021A } { 021B }
 %    \end{macrocode}
-% Add |T2| (Cyrillic) as this is doable using a classical \tn{MakeUppercase}
-% approach.
+% Add |T2| (Cyrillic) : again two bytes.
 %    \begin{macrocode}
         { 0400 } { 0450 }
         { 0401 } { 0451 }
@@ -1818,7 +1817,7 @@
               {
                 \tl_const:cx
                   {
-                    c_@@_ #3 case_
+                    c__kernel_ #3 case_
                     \char_generate:nn {##1} { 12 }
                     \char_generate:nn {##2} { 12 }
                     _tl
@@ -1859,7 +1858,7 @@
               {
                 \tl_const:cn
                   {
-                    c_@@_ #3 case_
+                    c__kernel_ #3 case_
                     \char_generate:nn {##1} { 12 }
                     \char_generate:nn {##2} { 12 }
                     _tl
@@ -1880,7 +1879,7 @@
         {
           \tl_const:cx
             {
-              c_@@_ #1 case_
+              c__kernel_ #1 case_
               \char_generate:nn {#2} { 12 }
               \char_generate:nn {#3} { 12 }
               \char_generate:nn {#4} { 12 }
@@ -1899,7 +1898,7 @@
         {
           \tl_const:cx
             {
-              c_@@_lowercase_
+              c__kernel_lowercase_
               \char_generate:nn {#1} { 12 }
               \char_generate:nn {#2} { 12 }
               \char_generate:nn {#3} { 12 }
@@ -2025,7 +2024,7 @@
               {
                 \tl_const:cx
                   {
-                    c_@@_ #3 case_
+                    c__kernel_ #3 case_
                     \char_generate:nn {##1} { 12 }
                     \char_generate:nn {##2} { 12 }
                     \char_generate:nn {##3} { 12 }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -562,11 +562,45 @@
 % \end{variable}
 %
 % \begin{variable}{\l_text_expand_exclude_tl}
-%   Commands which need not to expand.
+%   Commands which need not to expand. We start with a somewhat historical
+%   list, and tidy up if possible.
 %    \begin{macrocode}
 \tl_new:N \l_text_expand_exclude_tl
 \tl_set:Nn \l_text_expand_exclude_tl
   { \begin \cite \end \label \ref }
+\bool_lazy_and:nnT
+  { \str_if_eq_p:Vn \fmtname { LaTeX2e } }
+  { \tl_if_exist_p:N \@expl at finalise@setup@@@@ }
+  {
+    \tl_gput_right:Nn \@expl at finalise@setup@@@@
+      {
+        \tl_gput_right:Nn \@kernel at after@begindocument
+          {
+            \group_begin:
+              \cs_set_protected:Npn \@@_tmp:w #1
+                {
+                  \tl_clear:N \l_text_expand_exclude_tl
+                  \tl_map_inline:nn {#1}
+                    {
+                      \bool_lazy_any:nF
+                        {
+                          { \token_if_protected_macro_p:N ##1 }
+                          { \token_if_protected_long_macro_p:N ##1 }
+                          {
+                            \str_if_eq_p:ee
+                              { \cs_replacement_spec:N ##1 }
+                              { \exp_not:n { \protect ##1 } \c_space_tl }
+                          }
+                        }
+                        { \tl_put_right:Nn \l_text_expand_exclude_tl {##1} }
+                    }
+                }
+              \exp_args:NV \@@_tmp:w \l_text_expand_exclude_tl
+            \exp_args:NNNV \group_end:
+            \tl_set:Nn \l_text_expand_exclude_tl \l_text_expand_exclude_tl
+          }
+      }
+  }
 %    \end{macrocode}
 % \end{variable}
 %
@@ -632,13 +666,14 @@
 % \begin{macro}[EXP]{\@@_expand_accent:NN}
 % \begin{macro}[EXP]{\@@_expand_letterlike:N}
 % \begin{macro}[EXP]{\@@_expand_letterlike:NN}
-% \begin{macro}[EXP]{\@@_expand_cs:N, \@@_expand_encoding:N}
-% \begin{macro}[EXP]{\@@_expand_encoding_escape:N}
+% \begin{macro}[EXP]{\@@_expand_cs:N}
+% \begin{macro}[EXP]{\@@_expand_protect:w}
 % \begin{macro}[EXP]{\@@_expand_protect:N}
 % \begin{macro}[EXP]{\@@_expand_protect:nN}
 % \begin{macro}[EXP]{\@@_expand_protect:Nw}
 % \begin{macro}[EXP]{\@@_expand_testopt:N}
 % \begin{macro}[EXP]{\@@_expand_testopt:NNn}
+% \begin{macro}[EXP]{\@@_expand_encoding:N, \@@_expand_encoding_escape:N}
 % \begin{macro}[EXP]{\@@_expand_replace:N}
 % \begin{macro}[EXP]{\@@_expand_replace:n}
 % \begin{macro}[EXP]{\@@_expand_cs_expand:N}
@@ -947,14 +982,15 @@
 %    \end{macrocode}
 %   \LaTeXe{}'s \cs{protect} makes life interesting. Where possible, we
 %   simply remove it and replace with the \enquote{parent} command; of course,
-%   the \cs{protect} might be explicit, in which case we need to leave it alone
-%   if it's required. There is also the case of a straight \tn{@protected at testopt}
-%   to cover.
+%   the \cs{protect} might be explicit, in which case we need to leave it alone.
+%   That includes the case where it's not even followed by an \texttt{N}-type
+%   token. There is also the case of a straight \tn{@protected at testopt} to
+%   cover.
 %    \begin{macrocode}
 \cs_new:Npx \@@_expand_cs:N #1
   {
     \exp_not:N \str_if_eq:nnTF {#1} { \exp_not:N \protect }
-      { \exp_not:N \@@_expand_protect:N }
+      { \exp_not:N \@@_expand_protect:w }
       {
         \bool_lazy_and:nnTF
           { \cs_if_exist_p:N \fmtname }
@@ -963,8 +999,23 @@
           { \exp_not:N \@@_expand_replace:N #1 }
       }
   }
+\cs_new:Npn \@@_expand_protect:w #1 \q_@@_recursion_stop
+  {
+    \tl_if_head_is_N_type:nTF {#1}
+      { \@@_expand_protect:N }
+      {
+        \@@_expand_store:n { \protect }
+        \@@_expand_loop:w
+      }
+        #1 \q_@@_recursion_stop
+  }
 \cs_new:Npn \@@_expand_protect:N #1
   {
+    \@@_if_recursion_tail_stop_do:Nn #1
+      {
+        \@@_expand_store:n { \protect }
+        \@@_expand_end:w
+      }
     \exp_args:Ne \@@_expand_protect:nN
       { \cs_to_str:N #1 } #1
   }
@@ -1122,6 +1173,7 @@
 % \end{macro}
 % \end{macro}
 % \end{macro}
+% \end{macro}
 %
 % \begin{macro}
 %   {

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -90,7 +90,7 @@
 %   characters, and the value of registers.
 % \end{function}
 %
-% \begin{function}[added = 2018-04-09]
+% \begin{function}[added = 2018-04-09, updated = 2022-03-26]
 %   {\tl_analysis_map_inline:nn, \tl_analysis_map_inline:Nn}
 %   \begin{syntax}
 %     \cs{tl_analysis_map_inline:nn} \Arg{token list} \Arg{inline function}
@@ -935,47 +935,46 @@
 %
 % \subsection{Mapping through the analysis}
 %
-% \begin{macro}{\tl_analysis_map_inline:nn, \tl_analysis_map_inline:Nn}
-% \begin{macro}{\@@_analysis_map_inline_aux:Nn}
-% \begin{macro}{\@@_analysis_map_inline_aux:nnn}
+% \begin{macro}{\tl_analysis_map_inline:Nn, \tl_analysis_map_inline:nn}
+% \begin{macro}{\@@_analysis_map:Nn}
+% \begin{macro}{\@@_analysis_map:NwNw}
 %   First obtain the analysis of the token list into
 %   \cs{g_@@_analysis_result_tl}. To allow nested mappings, increase the
-%   nesting depth \cs{g__kernel_prg_map_int} (shared between all modules), then
-%   define the looping macro, which has a name specific to that nesting
-%   depth. That looping grabs the \meta{tokens}, \meta{catcode} and
-%   \meta{char code}; it checks for the end of the loop with
-%   \cs{use_none:n} |##2|, normally empty, but which becomes
-%   \cs{tl_map_break:} at the end; it then performs the user's code
-%   |#2|, and loops by calling itself. When the loop ends, remember to
-%   decrease the nesting depth.
+%   nesting depth \cs{g__kernel_prg_map_int} (shared between all
+%   modules), then define the payload macro, which runs the user code
+%   and has a name specific to that nesting depth. The looping macro
+%   grabs the \meta{tokens}, \meta{catcode} and \meta{char code}; it
+%   checks for the end of the loop with \cs{use_none:n} |##2|, normally
+%   empty, but which becomes \cs{tl_map_break:} at the end; it then
+%   calls the payload macro with the arguments in the correct order
+%   (this is the reason why we cannot directly use the same macro for
+%   looping and payload), and loops by calling itself. When the loop
+%   ends, remember to decrease the nesting depth.
 %    \begin{macrocode}
+\cs_new_protected:Npn \tl_analysis_map_inline:Nn #1
+  { \exp_args:No \tl_analysis_map_inline:nn #1 }
 \cs_new_protected:Npn \tl_analysis_map_inline:nn #1
   {
     \@@_analysis:n {#1}
     \int_gincr:N \g__kernel_prg_map_int
-    \exp_args:Nc \@@_analysis_map_inline_aux:Nn
+    \exp_args:Nc \@@_analysis_map:Nn
       { @@_analysis_map_inline_ \int_use:N \g__kernel_prg_map_int :wNw }
   }
-\cs_new_protected:Npn  \tl_analysis_map_inline:Nn #1
-  { \exp_args:No \tl_analysis_map_inline:nn #1 }
-\cs_new_protected:Npn \@@_analysis_map_inline_aux:Nn #1#2
+\cs_new_protected:Npn \@@_analysis_map:Nn #1#2
   {
-    \cs_gset_protected:Npn #1 ##1 \s_@@ ##2 ##3 \s_@@
-      {
-        \use_none:n ##2
-        \@@_analysis_map_inline_aux:nnn {##1} {##3} {##2}
-      }
-    \cs_gset_protected:Npn \@@_analysis_map_inline_aux:nnn ##1##2##3
-      {
-        #2
-        #1
-      }
-    \exp_after:wN #1
+    \cs_gset_protected:Npn #1 ##1##2##3 {#2}
+    \exp_after:wN \@@_analysis_map:NwNw \exp_after:wN #1
       \g_@@_analysis_result_tl
       \s_@@ { ? \tl_map_break: } \s_@@
     \prg_break_point:Nn \tl_map_break:
       { \int_gdecr:N \g__kernel_prg_map_int }
   }
+\cs_new_protected:Npn \@@_analysis_map:NwNw #1 #2 \s_@@ #3 #4 \s_@@
+  {
+    \use_none:n #3
+    #1 {#2} {#4} {#3}
+    \@@_analysis_map:NwNw #1
+  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %
@@ -139,12 +139,14 @@
 %     \item $6$ (parameter)
 %     \item $7$ (math superscript)
 %     \item $8$ (math subscript)
+%     \item $10$ (space)
 %     \item $11$ (letter)
 %     \item $12$ (other)
 %     \item $13$ (active)
 %   \end{itemize}
 %   and other values raise an error. The \meta{charcode} may be any one valid
-%   for the engine in use.
+%   for the engine in use, except that for \meta{catcode} $10$, \meta{charcode}
+%   $0$ is not allowed.
 %   Active characters cannot be generated in older versions of \XeTeX{}.
 %   Another way to build token lists with unusual category codes is
 %   \cs{regex_replace:nnN} |{.*}| \Arg{replacement} \meta{tl~var}.
@@ -1527,26 +1529,22 @@
 %    \begin{macrocode}
 \cs_new:Npn \@@_generate_aux:w #1 ; #2 ;
   {
-    \if_int_compare:w #2 = 10 \exp_stop_f:
-      \if_int_compare:w #1 =  \c_zero_int
-        \msg_expandable_error:nn { char } { null-space }
-      \else:
-        \msg_expandable_error:nn { char } { space }
-      \fi:
+    \if_int_odd:w 0
+        \if_int_compare:w #2 < 1  \exp_stop_f: 1 \fi:
+        \if_int_compare:w #2 = 5  \exp_stop_f: 1 \fi:
+        \if_int_compare:w #2 = 9  \exp_stop_f: 1 \fi:
+        \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
+      \msg_expandable_error:nn { char }
+        { invalid-catcode }
     \else:
       \if_int_odd:w 0
-          \if_int_compare:w #2 < 1  \exp_stop_f: 1 \fi:
-          \if_int_compare:w #2 = 5  \exp_stop_f: 1 \fi:
-          \if_int_compare:w #2 = 9  \exp_stop_f: 1 \fi:
-          \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
+        \if_int_compare:w #1 < \c_zero_int 1 \fi:
+        \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f:
         \msg_expandable_error:nn { char }
-          { invalid-catcode }
+          { out-of-range }
       \else:
-        \if_int_odd:w 0
-          \if_int_compare:w #1 < \c_zero_int 1 \fi:
-          \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f:
-          \msg_expandable_error:nn { char }
-            { out-of-range }
+        \if_int_compare:w #2#1 = 100 \exp_stop_f:
+          \msg_expandable_error:nn { char } { null-space }
         \else:
           \@@_generate_aux:nnw {#1} {#2}
         \fi:

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2022-02-24}
+% \date{Released 2022-04-10}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def	2022-04-11 20:14:43 UTC (rev 63007)
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-dvipdfmx.def}{2022-02-07}{}
+  {l3backend-dvipdfmx.def}{2022-04-10}{}
   {L3 backend support: dvipdfmx}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -65,20 +65,6 @@
   { \__kernel_backend_literal:n { x:gsave } }
 \cs_new_protected:Npn \__kernel_backend_scope_end:
   { \__kernel_backend_literal:n { x:grestore } }
-\group_begin:
-  \cs_set:Npn \__sys_tmp:w #1 Version ~ #2 ~ #3 \q_stop {#2}
-  \sys_get_shell:nnNTF { extractbb~--version }
-    { \char_set_catcode_space:n { `\  } }
-    \l__sys_internal_tl
-    {
-      \int_const:Nn \c__kernel_sys_dvipdfmx_version_int
-        {
-          \exp_after:wN \__sys_tmp:w \l__sys_internal_tl
-            \q_stop
-        }
-    }
-    { \int_const:Nn \c__kernel_sys_dvipdfmx_version_int { 0 } }
-\group_end:
 %% File: l3backend-color.dtx
 \cs_new_protected:Npn \__color_backend_pickup:N #1 { }
 \cs_if_exist:cT { ver at color.sty }
@@ -102,72 +88,65 @@
       { \tl_set:Nn #3 { {#1} {#2} } }
   }
 \int_new:N \l__color_backend_stack_int
-\int_compare:nNnTF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  { \cs_new_protected:Npn \__kernel_color_backend_stack_init:Nnn #1#2#3 { } }
+\int_new:N \g__color_backend_stack_int
+\cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3
   {
-    \int_new:N \g__color_backend_stack_int
-    \cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3
+    \int_gincr:N \exp_not:N \g__color_backend_stack_int
+    \int_const:Nn #1 { \exp_not:N \g__color_backend_stack_int }
+    \use:x
       {
-        \int_gincr:N \exp_not:N \g__color_backend_stack_int
-        \int_const:Nn #1 { \exp_not:N \g__color_backend_stack_int }
-        \use:x
+        \__kernel_backend_first_shipout:n
           {
-            \__kernel_backend_first_shipout:n
+            \__kernel_backend_literal:n
               {
-                \__kernel_backend_literal:n
-                  {
-                    pdfcolorstackinit ~
-                    \exp_not:N \int_use:N \exp_not:N \g__color_backend_stack_int
-                    \c_space_tl
-                    \exp_not:N \tl_if_blank:nF {#2} { #2 ~ }
-                    (#3)
-                  }
+                pdfcolorstackinit ~
+                \exp_not:N \int_use:N \exp_not:N \g__color_backend_stack_int
+                \c_space_tl
+                \exp_not:N \tl_if_blank:nF {#2} { #2 ~ }
+                (#3)
               }
-          }
+        }
       }
-    \cs_if_exist:cTF { main at pdfcolorstack }
+  }
+\cs_if_exist:cTF { main at pdfcolorstack }
+  {
+    \int_set:Nn \l__color_backend_stack_int
+      { \int_use:c { main at pdfcolorstack } }
+  }
+  {
+    \__kernel_color_backend_stack_init:Nnn \c__color_backend_main_stack_int
+      { page ~ direct } { 0 ~ g ~ 0 ~ G }
+    \int_set_eq:NN \l__color_backend_stack_int
+      \c__color_backend_main_stack_int
+    \int_const:cn { main at pdfcolorstack } { \c__color_backend_main_stack_int }
+  }
+\cs_gset_protected:Npn \__kernel_backend_scope_end:
+  {
+    \__kernel_backend_literal:n { x:grestore }
+    \__kernel_backend_literal:x
       {
-        \int_set:Nn \l__color_backend_stack_int
-          { \int_use:c { main at pdfcolorstack } }
+        pdfcolorstack ~
+        \int_use:N \g__color_backend_stack_int \c_space_tl current
       }
+  }
+\cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2
+  {
+    \__kernel_backend_literal:x
       {
-        \__kernel_color_backend_stack_init:Nnn \c__color_backend_main_stack_int
-          { page ~ direct } { 0 ~ g ~ 0 ~ G }
-        \int_set_eq:NN \l__color_backend_stack_int
-          \c__color_backend_main_stack_int
-        \int_const:cn { main at pdfcolorstack } { \c__color_backend_main_stack_int }
+        pdfcolorstack ~
+        \int_eval:n {#1} ~
+        push ~ (#2)
       }
-    \cs_gset_protected:Npn \__kernel_backend_scope_end:
-      {
-        \__kernel_backend_literal:n { x:grestore }
-        \__kernel_backend_literal:x
-          {
-            pdfcolorstack ~
-            \int_use:N \g__color_backend_stack_int \c_space_tl current
-          }
-      }
   }
-\int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
+\cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx }
+\cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1
   {
-    \cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2
+    \__kernel_backend_literal:x
       {
-        \__kernel_backend_literal:x
-          {
-            pdfcolorstack ~
-            \int_eval:n {#1} ~
-            push ~ (#2)
-          }
+        pdfcolorstack ~
+        \int_eval:n {#1} ~
+        pop
       }
-    \cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx }
-    \cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1
-      {
-        \__kernel_backend_literal:x
-          {
-            pdfcolorstack ~
-            \int_eval:n {#1} ~
-            pop
-          }
-      }
   }
 \tl_new:N \l__color_backend_fill_tl
 \tl_new:N \l__color_backend_stroke_tl
@@ -185,15 +164,6 @@
   }
 \cs_new_protected:Npn \__color_backend_reset:
   { \__kernel_color_backend_stack_pop:n \l__color_backend_stack_int }
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  {
-    \cs_gset_protected:Npn \__color_backend_select_cmyk:n #1
-      { \__kernel_backend_literal:n { pdf: bc ~ [#1] } }
-    \cs_gset_eq:NN \__color_backend_select_gray:n \__color_backend_select_cmyk:n
-    \cs_gset_eq:NN \__color_backend_select_rgb:n \__color_backend_select_cmyk:n
-    \cs_gset_protected:Npn \__color_backend_reset:
-      { \__kernel_backend_literal:n { pdf: ec } }
-  }
 \prop_new:N \g__color_backend_colorant_prop
 \cs_new:Npx \__color_backend_devicen_colorants:n #1
   {
@@ -380,12 +350,6 @@
           }
       }
   }
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  {
-    \cs_gset_protected:Npn \__color_backend_select_separation:nn #1#2 { }
-    \cs_gset_eq:NN \__color_backend_select_devicen:nn
-      \__color_backend_select_separation:nn
-  }
 \cs_new_protected:Npn \__color_backend_fill_cmyk:n #1
   { \__color_backend_fill:n { #1 ~ k } }
 \cs_new_protected:Npn \__color_backend_fill_gray:n #1
@@ -418,27 +382,6 @@
   { \__color_backend_stroke:n { /#1 ~ CS ~ #2 ~ SCN } }
 \cs_new_eq:NN \__color_backend_fill_devicen:nn \__color_backend_fill_separation:nn
 \cs_new_eq:NN \__color_backend_stroke_devicen:nn \__color_backend_stroke_separation:nn
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  {
-    \cs_gset_protected:Npn \__color_backend_fill_cmyk:n #1
-      {
-        \__kernel_backend_literal:n { pdf: bc ~ [#1] }
-        \group_insert_after:N \__color_backend_reset:
-      }
-    \cs_gset_eq:NN \__color_backend_fill_gray:n \__color_backend_fill_cmyk:n
-    \cs_gset_eq:NN \__color_backend_fill_rgb:n \__color_backend_fill_cmyk:n
-    \cs_gset_protected:Npn \__color_backend_reset:
-      { \__kernel_backend_literal:n { pdf: ec } }
-    \cs_gset_protected:Npn \__color_backend_stroke:n #1
-      { \__kernel_backend_literal:n {#1} }
-    \cs_gset_protected:Npn \__color_backend_fill_separation:nn #1#2 { }
-    \cs_gset_eq:NN \__color_backend_fill_devicen:nn
-      \__color_backend_fill_separation:nn
-    \cs_gset_eq:NN \__color_backend_stroke_separation:nn
-      \__color_backend_fill_separation:nn
-    \cs_gset_eq:NN \__color_backend_stroke_devicen:nn
-      \__color_backend_stroke_separation:nn
-  }
 %% File: l3backend-box.dtx
 \cs_new_protected:Npn \__box_backend_clip:N #1
   {
@@ -660,19 +603,41 @@
     \__kernel_backend_scope_end:
   }
 %% File: l3backend-graphics.dtx
-\cs_new_eq:NN \__graphics_backend_getbb_eps:n \graphics_read_bb:n
+\cs_new_protected:Npn \__graphics_backend_loaded:n #1
+  {
+    \cs_if_exist:NTF \hook_gput_code:nnn
+      {
+        \hook_gput_code:nnn
+          { file / l3graphics.sty / after }
+          { backend }
+          {#1}
+      }
+      {#1}
+  }
+\__graphics_backend_loaded:n
+  {
+    \seq_set_from_clist:Nn \l_graphics_search_ext_seq
+      { .pdf , .eps , .ps , .png , .jpg ., jpeg , .bmp }
+   }
+\__graphics_backend_loaded:n
+  {
+    \cs_new_eq:NN \__graphics_backend_getbb_eps:n \__graphics_read_bb:n
+    \cs_new_eq:NN \__graphics_backend_getbb_ps:n \__graphics_read_bb:n
+  }
 \cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1
   {
-    \int_zero:N \l_graphics_page_int
-    \tl_clear:N \l_graphics_pagebox_tl
-    \graphics_extract_bb:n {#1}
+    \int_zero:N \l__graphics_page_int
+    \tl_clear:N \l__graphics_pagebox_tl
+    \__graphics_extract_bb:n {#1}
   }
+\cs_new_eq:NN \__graphics_backend_getbb_jpeg:n \__graphics_backend_getbb_jpg:n
 \cs_new_eq:NN \__graphics_backend_getbb_png:n \__graphics_backend_getbb_jpg:n
+\cs_new_eq:NN \__graphics_backend_getbb_bmp:n \__graphics_backend_getbb_jpg:n
 \cs_new_protected:Npn \__graphics_backend_getbb_pdf:n #1
   {
-    \tl_clear:N \l_graphics_decodearray_tl
-    \bool_set_false:N \l_graphics_interpolate_bool
-    \graphics_extract_bb:n {#1}
+    \tl_clear:N \l__graphics_decodearray_str
+    \bool_set_false:N \l__graphics_interpolate_bool
+    \__graphics_extract_bb:n {#1}
   }
 \int_new:N \g__graphics_track_int
 \cs_new_protected:Npn \__graphics_backend_include_eps:n #1
@@ -680,15 +645,18 @@
     \__kernel_backend_literal:x
       {
         PSfile = #1 \c_space_tl
-        llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
-        lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
-        urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
-        ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim
+        llx = \dim_to_decimal_in_bp:n \l__graphics_llx_dim \c_space_tl
+        lly = \dim_to_decimal_in_bp:n \l__graphics_lly_dim \c_space_tl
+        urx = \dim_to_decimal_in_bp:n \l__graphics_urx_dim \c_space_tl
+        ury = \dim_to_decimal_in_bp:n \l__graphics_ury_dim
       }
   }
+\cs_new_eq:NN \__graphics_backend_include_ps:n \__graphics_backend_include_eps:n
 \cs_new_protected:Npn \__graphics_backend_include_jpg:n #1
   { \__graphics_backend_include_auxi:nn {#1} { image } }
+\cs_new_eq:NN \__graphics_backend_include_jpeg:n \__graphics_backend_include_jpg:n
 \cs_new_eq:NN \__graphics_backend_include_png:n \__graphics_backend_include_jpg:n
+\cs_new_eq:NN \__graphics_backend_include_bmp:n \__graphics_backend_include_jpg:n
 \cs_new_protected:Npn \__graphics_backend_include_pdf:n #1
   { \__graphics_backend_include_auxi:nn {#1} { epdf } }
 \cs_new_protected:Npn \__graphics_backend_include_auxi:nn #1#2
@@ -695,13 +663,13 @@
   {
     \__graphics_backend_include_auxii:xnn
       {
-        \tl_if_empty:NF \l_graphics_pagebox_tl
-          { : \l_graphics_pagebox_tl }
-        \int_compare:nNnT \l_graphics_page_int > 1
-          { :P \int_use:N \l_graphics_page_int }
-        \tl_if_empty:NF \l_graphics_decodearray_tl
-          { :D \l_graphics_decodearray_tl }
-        \bool_if:NT \l_graphics_interpolate_bool
+        \tl_if_empty:NF \l__graphics_pagebox_tl
+          { : \l__graphics_pagebox_tl }
+        \int_compare:nNnT \l__graphics_page_int > 1
+          { :P \int_use:N \l__graphics_page_int }
+        \tl_if_empty:NF \l__graphics_decodearray_str
+          { :D \l__graphics_decodearray_str }
+        \bool_if:NT \l__graphics_interpolate_bool
            { :I }
       }
       {#1} {#2}
@@ -708,10 +676,10 @@
   }
 \cs_new_protected:Npn \__graphics_backend_include_auxii:nnn #1#2#3
   {
-    \int_if_exist:cTF { c__graphics_graphics_ #2#1 _int }
+    \int_if_exist:cTF { c__graphics_ #2#1 _int }
       {
         \__kernel_backend_literal:x
-          { pdf:usexobj~@graphic \int_use:c { c__graphics_graphics_ #2#1 _int } }
+          { pdf:usexobj~@graphic \int_use:c { c__graphics_ #2#1 _int } }
       }
       { \__graphics_backend_include_auxiii:nnn {#2} {#1} {#3} }
   }
@@ -719,36 +687,38 @@
 \cs_new_protected:Npn \__graphics_backend_include_auxiii:nnn #1#2#3
   {
     \int_gincr:N \g__graphics_track_int
-    \int_const:cn { c__graphics_graphics_ #1#2 _int } { \g__graphics_track_int }
+    \int_const:cn { c__graphics_ #1#2 _int } { \g__graphics_track_int }
     \__kernel_backend_literal:x
       {
         pdf:#3~
-        @graphic \int_use:c { c__graphics_graphics_ #1#2 _int } ~
-        \int_compare:nNnT \l_graphics_page_int > 1
-          { page ~ \int_use:N \l_graphics_page_int \c_space_tl }
-        \tl_if_empty:NF \l_graphics_pagebox_tl
+        @graphic \int_use:c { c__graphics_ #1#2 _int } ~
+        \int_compare:nNnT \l__graphics_page_int > 1
+          { page ~ \int_use:N \l__graphics_page_int \c_space_tl }
+        \tl_if_empty:NF \l__graphics_pagebox_tl
           {
-            pagebox ~ \l_graphics_pagebox_tl \c_space_tl
+            pagebox ~ \l__graphics_pagebox_tl \c_space_tl
             bbox ~
-              \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l_graphics_ury_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__graphics_llx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__graphics_lly_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__graphics_urx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__graphics_ury_dim \c_space_tl
           }
         (#1)
         \bool_lazy_or:nnT
-          { \l_graphics_interpolate_bool }
-          { ! \tl_if_empty_p:N \l_graphics_decodearray_tl }
+          { \l__graphics_interpolate_bool }
+          { ! \tl_if_empty_p:N \l__graphics_decodearray_str }
           {
             <<
-              \tl_if_empty:NF \l_graphics_decodearray_tl
-                { /Decode~[ \l_graphics_decodearray_tl ] }
-              \bool_if:NT \l_graphics_interpolate_bool
+              \tl_if_empty:NF \l__graphics_decodearray_str
+                { /Decode~[ \l__graphics_decodearray_str ] }
+              \bool_if:NT \l__graphics_interpolate_bool
                 { /Interpolate~true> }
             >>
           }
       }
   }
+\__graphics_backend_loaded:n
+  { \cs_new_eq:NN \__graphics_backend_get_pagecount:n \__graphics_get_pagecount:n }
 %% File: l3backend-pdf.dtx
 \box_new:N \l__pdf_internal_box
 \cs_new_protected:Npx \__pdf_backend:n #1
@@ -838,19 +808,13 @@
   { \__pdf_backend_link_begin:n {#1#2} }
 \cs_new_protected:Npx \__pdf_backend_link_begin:n #1
   {
-    \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-      {
-        \exp_not:N \int_gincr:N \exp_not:N  \g__pdf_backend_link_int
-      }
+    \exp_not:N \int_gincr:N \exp_not:N  \g__pdf_backend_link_int
     \__pdf_backend:x
       {
          bann ~
-         \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-           {
-             @pdf.lnk
-             \exp_not:N \int_use:N \exp_not:N  \g__pdf_backend_link_int
-             \c_space_tl
-           }
+         @pdf.lnk
+         \exp_not:N \int_use:N \exp_not:N  \g__pdf_backend_link_int
+         \c_space_tl
          <<
            /Type /Annot
            #1
@@ -859,14 +823,8 @@
   }
 \cs_new_protected:Npn \__pdf_backend_link_end:
   { \__pdf_backend:n { eann } }
-\cs_new:Npx \__pdf_backend_link_last:
-  {
-    \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-      {
-        @pdf.lnk
-          \exp_not:N \int_use:N \exp_not:N \g__pdf_backend_link_int
-      }
-  }
+\cs_new:Npn \__pdf_backend_link_last:
+  { @pdf.lnk \int_use:N \g__pdf_backend_link_int }
 \cs_new_protected:Npn \__pdf_backend_link_margin:n #1
   { \__kernel_backend_literal:x { dvipdfmx:config~g~ \dim_eval:n {#1} } }
 \cs_new_protected:Npn \__pdf_backend_destination:nn #1#2
@@ -1019,35 +977,6 @@
       }
   }
 \cs_generate_variant:Nn \__opacity_backend_fill_stroke:nn { xx }
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  {
-    \cs_gset_protected:Npn \__opacity_backend_select_aux:n #1
-      {
-        \tl_set:Nn \l__opacity_backend_fill_tl {#1}
-        \tl_set:Nn \l__opacity_backend_stroke_tl {#1}
-        \pdfmanagement_add:nnn { Page / Resources / ExtGState }
-          { opacity #1 }
-          { << /ca ~ #1 /CA ~ #1 >> }
-        \__kernel_backend_literal_pdf:n { /opacity #1 ~ gs }
-      }
-    \cs_gset_protected:Npn \__opacity_backend_fill_stroke:nn #1#2
-      {
-        \str_if_eq:nnTF {#1} {#2}
-          { \__opacity_backend_select_aux:n {#1} }
-          {
-            \tl_set:Nn \l__opacity_backend_fill_tl {#1}
-            \tl_set:Nn \l__opacity_backend_stroke_tl {#2}
-            \pdfmanagement_add:nnn { Page / Resources / ExtGState }
-              { opacity.fill #1 }
-              { << /ca ~ #1 >> }
-            \pdfmanagement_add:nnn { Page / Resources / ExtGState }
-              { opacity.stroke #1 }
-              { << /CA ~ #2 >> }
-            \__kernel_backend_literal_pdf:n
-             { /opacity.fill #1 ~ gs /opacity.stroke #2 ~ gs }
-          }
-      }
-  }
 %% 
 %%
 %% End of file `l3backend-dvipdfmx.def'.

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def	2022-04-11 20:14:43 UTC (rev 63007)
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-dvips.def}{2022-02-07}{}
+  {l3backend-dvips.def}{2022-04-10}{}
   {L3 backend support: dvips}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -597,18 +597,38 @@
     \__draw_backend_literal:n { @beginspecial }
   }
 %% File: l3backend-graphics.dtx
-\cs_new_eq:NN \__graphics_backend_getbb_eps:n \graphics_read_bb:n
+\cs_new_protected:Npn \__graphics_backend_loaded:n #1
+  {
+    \cs_if_exist:NTF \hook_gput_code:nnn
+      {
+        \hook_gput_code:nnn
+          { file / l3graphics.sty / after }
+          { backend }
+          {#1}
+      }
+      {#1}
+  }
+\__graphics_backend_loaded:n
+  { \seq_set_from_clist:Nn \l_graphics_search_ext_seq { .eps , .ps } }
+\__graphics_backend_loaded:n
+  {
+    \cs_new_eq:NN \__graphics_backend_getbb_eps:n \__graphics_read_bb:n
+    \cs_new_eq:NN \__graphics_backend_getbb_ps:n \__graphics_read_bb:n
+  }
 \cs_new_protected:Npn \__graphics_backend_include_eps:n #1
   {
     \__kernel_backend_literal:x
       {
         PSfile = #1 \c_space_tl
-        llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
-        lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
-        urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
-        ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim
+        llx = \dim_to_decimal_in_bp:n \l__graphics_llx_dim \c_space_tl
+        lly = \dim_to_decimal_in_bp:n \l__graphics_lly_dim \c_space_tl
+        urx = \dim_to_decimal_in_bp:n \l__graphics_urx_dim \c_space_tl
+        ury = \dim_to_decimal_in_bp:n \l__graphics_ury_dim
       }
   }
+\cs_new_eq:NN \__graphics_backend_include_ps:n \__graphics_backend_include_eps:n
+\__graphics_backend_loaded:n
+  { \cs_new_eq:NN \__graphics_backend_get_pagecount:n \__graphics_get_pagecount:n }
 %% File: l3backend-pdf.dtx
 \box_new:N \l__pdf_internal_box
 \cs_new_protected:Npn \__pdf_backend_pdfmark:n #1

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def	2022-04-11 20:14:43 UTC (rev 63007)
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-dvisvgm.def}{2022-02-07}{}
+  {l3backend-dvisvgm.def}{2022-04-10}{}
   {L3 backend support: dvisvgm}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -216,6 +216,8 @@
 \cs_new_protected:Npn \__color_backend_stroke_separation:nn #1#2 { }
 \cs_new_eq:NN \__color_backend_fill_devicen:nn \__color_backend_fill_separation:nn
 \cs_new_eq:NN \__color_backend_stroke_devicen:nn \__color_backend_stroke_separation:nn
+\cs_new_protected:Npn \__color_backend_devicen_init:nnn #1#2#3 { }
+\cs_new_protected:Npn \__color_backend_iccbased_init:nnn #1#2#3 { }
 %% File: l3backend-box.dtx
 \cs_new_protected:Npn \__box_backend_clip:N #1
   {
@@ -490,33 +492,52 @@
     \__kernel_backend_scope_end:
   }
 %% File: l3backend-graphics.dtx
-\cs_new_eq:NN \__graphics_backend_getbb_eps:n \graphics_read_bb:n
+\cs_new_protected:Npn \__graphics_backend_loaded:n #1
+  {
+    \cs_if_exist:NTF \hook_gput_code:nnn
+      {
+        \hook_gput_code:nnn
+          { file / l3graphics.sty / after }
+          { backend }
+          {#1}
+      }
+      {#1}
+  }
+\__graphics_backend_loaded:n
+  {
+    \seq_set_from_clist:Nn
+      \l_graphics_search_ext_seq
+      { .pdf , .eps , .png , .jpg , .jpeg }
+  }
+\__graphics_backend_loaded:n
+  { \cs_new_eq:NN \__graphics_backend_getbb_eps:n \__graphics_read_bb:n }
 \cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1
   {
-    \int_zero:N \l_graphics_page_int
-    \tl_clear:N \l_graphics_pagebox_tl
-    \graphics_extract_bb:n {#1}
+    \int_zero:N \l__graphics_page_int
+    \tl_clear:N \l__graphics_pagebox_tl
+    \__graphics_extract_bb:n {#1}
   }
+\cs_new_eq:NN \__graphics_backend_getbb_jpeg:n \__graphics_backend_getbb_jpg:n
 \cs_new_eq:NN \__graphics_backend_getbb_png:n \__graphics_backend_getbb_jpg:n
 \cs_new_protected:Npn \__graphics_backend_getbb_pdf:n #1
   {
-    \tl_clear:N \l_graphics_decodearray_tl
-    \bool_set_false:N \l_graphics_interpolate_bool
-    \graphics_extract_bb:n {#1}
+    \tl_clear:N \l__graphics_decodearray_str
+    \bool_set_false:N \l__graphics_interpolate_bool
+    \__graphics_extract_bb:n {#1}
   }
 \cs_new_protected:Npn \__graphics_backend_include_eps:n #1
-  { __graphics_backend_include:nn { PSfile } {#1} }
+  { \__graphics_backend_include:nn { PSfile } {#1} }
 \cs_new_protected:Npn \__graphics_backend_include_pdf:n #1
-  { __graphics_backend_include:nn { pdffile } {#1} }
+  { \__graphics_backend_include:nn { pdffile } {#1} }
 \cs_new_protected:Npn \__graphics_backend_include:nn #1#2
   {
     \__kernel_backend_literal:x
       {
         #1 = #2 \c_space_tl
-        llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
-        lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
-        urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
-        ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim
+        llx = \dim_to_decimal_in_bp:n \l__graphics_llx_dim \c_space_tl
+        lly = \dim_to_decimal_in_bp:n \l__graphics_lly_dim \c_space_tl
+        urx = \dim_to_decimal_in_bp:n \l__graphics_urx_dim \c_space_tl
+        ury = \dim_to_decimal_in_bp:n \l__graphics_ury_dim
       }
   }
 \cs_new_protected:Npn \__graphics_backend_include_png:n #1
@@ -524,14 +545,17 @@
      \__kernel_backend_literal:x
        {
          dvisvgm:img~
-         \dim_to_decimal:n { \l_graphics_ury_dim } ~
-         \dim_to_decimal:n { \l_graphics_ury_dim } ~
+         \dim_to_decimal:n { \l__graphics_ury_dim } ~
+         \dim_to_decimal:n { \l__graphics_ury_dim } ~
          \__graphics_backend_include_bitmap_quote:w #1 " #1 " \s__graphics_stop
        }
   }
+\cs_new_eq:NN \__graphics_backend_include_jpeg:n \__graphics_backend_include_png:n
 \cs_new_eq:NN \__graphics_backend_include_jpg:n \__graphics_backend_include_png:n
 \cs_new:Npn \__graphics_backend_include_bitmap_quote:w #1 " #2 " #3 \s__graphics_stop
   { " #2 " }
+\__graphics_backend_loaded:n
+  { \cs_new_eq:NN \__graphics_backend_get_pagecount:n \__graphics_get_pagecount:n }
 %% File: l3backend-pdf.dtx
 \box_new:N \l__pdf_internal_box
 \cs_new_protected:Npn \__pdf_backend_catalog_gput:nn #1#2 { }

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-luatex.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-luatex.def	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-luatex.def	2022-04-11 20:14:43 UTC (rev 63007)
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-luatex.def}{2022-02-07}{}
+  {l3backend-luatex.def}{2022-04-10}{}
   {L3 backend support: PDF output (LuaTeX)}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -535,72 +535,97 @@
     \__kernel_backend_scope_end:
   }
 %% File: l3backend-graphics.dtx
+\cs_new_protected:Npn \__graphics_backend_loaded:n #1
+  {
+    \cs_if_exist:NTF \hook_gput_code:nnn
+      {
+        \hook_gput_code:nnn
+          { file / l3graphics.sty / after }
+          { backend }
+          {#1}
+      }
+      {#1}
+  }
+\__graphics_backend_loaded:n
+  {
+    \seq_set_from_clist:Nn
+      \l_graphics_search_ext_seq
+      { .pdf , .eps , .png , .jpg , .jpeg  }
+  }
 \tl_new:N \l__graphics_graphics_attr_tl
 \cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1
   {
-    \int_zero:N \l_graphics_page_int
-    \tl_clear:N \l_graphics_pagebox_tl
+    \int_zero:N \l__graphics_page_int
+    \tl_clear:N \l__graphics_pagebox_tl
     \tl_set:Nx \l__graphics_graphics_attr_tl
       {
-        \tl_if_empty:NF \l_graphics_decodearray_tl
-          { :D \l_graphics_decodearray_tl }
-        \bool_if:NT \l_graphics_interpolate_bool
+        \tl_if_empty:NF \l__graphics_decodearray_str
+          { :D \l__graphics_decodearray_str }
+        \bool_if:NT \l__graphics_interpolate_bool
           { :I }
       }
     \tl_clear:N \l__graphics_graphics_attr_tl
     \__graphics_backend_getbb_auxi:n {#1}
   }
+\cs_new_eq:NN \__graphics_backend_getbb_jpeg:n \__graphics_backend_getbb_jpg:n
 \cs_new_eq:NN \__graphics_backend_getbb_png:n \__graphics_backend_getbb_jpg:n
 \cs_new_protected:Npn \__graphics_backend_getbb_pdf:n #1
   {
-    \tl_clear:N \l_graphics_decodearray_tl
-    \bool_set_false:N \l_graphics_interpolate_bool
+    \tl_clear:N \l__graphics_decodearray_str
+    \bool_set_false:N \l__graphics_interpolate_bool
     \tl_set:Nx \l__graphics_graphics_attr_tl
       {
-        : \l_graphics_pagebox_tl
-        \int_compare:nNnT \l_graphics_page_int > 1
-          { :P \int_use:N \l_graphics_page_int }
+        : \l__graphics_pagebox_tl
+        \int_compare:nNnT \l__graphics_page_int > 1
+          { :P \int_use:N \l__graphics_page_int }
       }
     \__graphics_backend_getbb_auxi:n {#1}
   }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxi:n #1
   {
-    \graphics_bb_restore:xF { #1 \l__graphics_graphics_attr_tl }
+    \__graphics_bb_restore:xF { #1 \l__graphics_graphics_attr_tl }
       { \__graphics_backend_getbb_auxii:n {#1} }
   }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxii:n #1
   {
+    \exp_args:Ne \__graphics_backend_getbb_auxiii:n
+      { \__graphics_backend_dequote:w #1 " #1 " \s__graphics_stop }
+    \int_const:cn { c__graphics_ #1 \l__graphics_graphics_attr_tl _int }
+      { \tex_the:D \tex_pdflastximage:D }
+    \__graphics_bb_save:x { #1 \l__graphics_graphics_attr_tl }
+  }
+\cs_new_protected:Npn \__graphics_backend_getbb_auxiii:n #1
+  {
     \tex_immediate:D \tex_pdfximage:D
       \bool_lazy_or:nnT
-        { \l_graphics_interpolate_bool }
-        { ! \tl_if_empty_p:N \l_graphics_decodearray_tl }
+        { \l__graphics_interpolate_bool }
+        { ! \tl_if_empty_p:N \l__graphics_decodearray_str }
         {
           attr ~
             {
-              \tl_if_empty:NF \l_graphics_decodearray_tl
-                { /Decode~[ \l_graphics_decodearray_tl ] }
-              \bool_if:NT \l_graphics_interpolate_bool
+              \tl_if_empty:NF \l__graphics_decodearray_str
+                { /Decode~[ \l__graphics_decodearray_str ] }
+              \bool_if:NT \l__graphics_interpolate_bool
                 { /Interpolate~true }
             }
         }
-      \int_compare:nNnT \l_graphics_page_int > 0
-        { page ~ \int_use:N \l_graphics_page_int }
-      \tl_if_empty:NF \l_graphics_pagebox_tl
-        { \l_graphics_pagebox_tl }
+      \int_compare:nNnT \l__graphics_page_int > 0
+        { page ~ \int_use:N \l__graphics_page_int }
+      \tl_if_empty:NF \l__graphics_pagebox_tl
+        { \l__graphics_pagebox_tl }
       {#1}
     \hbox_set:Nn \l__graphics_internal_box
       { \tex_pdfrefximage:D \tex_pdflastximage:D }
-    \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l__graphics_internal_box }
-    \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l__graphics_internal_box }
-    \int_const:cn { c__graphics_graphics_ #1 \l__graphics_graphics_attr_tl _int }
-      { \tex_the:D \tex_pdflastximage:D }
-    \graphics_bb_save:x { #1 \l__graphics_graphics_attr_tl }
+    \dim_set:Nn \l__graphics_urx_dim { \box_wd:N \l__graphics_internal_box }
+    \dim_set:Nn \l__graphics_ury_dim { \box_ht:N \l__graphics_internal_box }
   }
+\cs_new:Npn \__graphics_backend_dequote:w #1 " #2 " #3 \s__graphics_stop {#2}
 \cs_new_protected:Npn \__graphics_backend_include_jpg:n #1
   {
     \tex_pdfrefximage:D
-      \int_use:c { c__graphics_graphics_ #1 \l__graphics_graphics_attr_tl _int }
+      \int_use:c { c__graphics_ #1 \l__graphics_graphics_attr_tl _int }
   }
+\cs_new_eq:NN \__graphics_backend_include_jpeg:n \__graphics_backend_include_jpg:n
 \cs_new_eq:NN \__graphics_backend_include_pdf:n \__graphics_backend_include_jpg:n
 \cs_new_eq:NN \__graphics_backend_include_png:n \__graphics_backend_include_jpg:n
 \sys_if_shell:T
@@ -616,8 +641,12 @@
           \l__graphics_backend_ext_str
         \exp_args:Nx \__graphics_backend_getbb_eps:nn
           {
-            \l__graphics_backend_name_str - \str_tail:N \l__graphics_backend_ext_str
-            -converted-to.pdf
+            \exp_args:Ne \__kernel_file_name_quote:n
+              {
+                \l__graphics_backend_name_str
+                - \str_tail:N \l__graphics_backend_ext_str
+                -converted-to.pdf
+              }
           }
           {#1}
      }
@@ -628,7 +657,7 @@
             \sys_shell_now:n
               { repstopdf ~ #2 ~ #1 }
           }
-        \tl_set:Nn \l_graphics_name_tl {#1}
+        \tl_set:Nn \l__graphics_final_name_str {#1}
         \__graphics_backend_getbb_pdf:n {#1}
       }
     \cs_new_protected:Npn \__graphics_backend_include_eps:n #1
@@ -637,11 +666,21 @@
           \l__graphics_backend_dir_str \l__graphics_backend_name_str \l__graphics_backend_ext_str
         \exp_args:Nx \__graphics_backend_include_pdf:n
           {
-            \l__graphics_backend_name_str - \str_tail:N \l__graphics_backend_ext_str
-            -converted-to.pdf
+            \exp_args:Ne \__kernel_file_name_quote:n
+              {
+                \l__graphics_backend_name_str
+                - \str_tail:N \l__graphics_backend_ext_str
+                -converted-to.pdf
+              }
           }
       }
   }
+\cs_new_protected:Npn \__graphics_backend_get_pagecount:n #1
+  {
+    \tex_immediate:D \tex_pdfximage:D {#1}
+    \int_const:cn { c__graphics_ #1 _pages_int }
+      { \int_use:N \tex_pdflastximagepages:D }
+  }
 %% File: l3backend-pdf.dtx
 \box_new:N \l__pdf_internal_box
 \cs_new_protected:Npn \__pdf_backend_annotation:nnnn #1#2#3#4

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def	2022-04-11 20:14:43 UTC (rev 63007)
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-pdftex.def}{2022-02-07}{}
+  {l3backend-pdftex.def}{2022-04-10}{}
   {L3 backend support: PDF output (pdfTeX)}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -535,72 +535,97 @@
     \__kernel_backend_scope_end:
   }
 %% File: l3backend-graphics.dtx
+\cs_new_protected:Npn \__graphics_backend_loaded:n #1
+  {
+    \cs_if_exist:NTF \hook_gput_code:nnn
+      {
+        \hook_gput_code:nnn
+          { file / l3graphics.sty / after }
+          { backend }
+          {#1}
+      }
+      {#1}
+  }
+\__graphics_backend_loaded:n
+  {
+    \seq_set_from_clist:Nn
+      \l_graphics_search_ext_seq
+      { .pdf , .eps , .png , .jpg , .jpeg  }
+  }
 \tl_new:N \l__graphics_graphics_attr_tl
 \cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1
   {
-    \int_zero:N \l_graphics_page_int
-    \tl_clear:N \l_graphics_pagebox_tl
+    \int_zero:N \l__graphics_page_int
+    \tl_clear:N \l__graphics_pagebox_tl
     \tl_set:Nx \l__graphics_graphics_attr_tl
       {
-        \tl_if_empty:NF \l_graphics_decodearray_tl
-          { :D \l_graphics_decodearray_tl }
-        \bool_if:NT \l_graphics_interpolate_bool
+        \tl_if_empty:NF \l__graphics_decodearray_str
+          { :D \l__graphics_decodearray_str }
+        \bool_if:NT \l__graphics_interpolate_bool
           { :I }
       }
     \tl_clear:N \l__graphics_graphics_attr_tl
     \__graphics_backend_getbb_auxi:n {#1}
   }
+\cs_new_eq:NN \__graphics_backend_getbb_jpeg:n \__graphics_backend_getbb_jpg:n
 \cs_new_eq:NN \__graphics_backend_getbb_png:n \__graphics_backend_getbb_jpg:n
 \cs_new_protected:Npn \__graphics_backend_getbb_pdf:n #1
   {
-    \tl_clear:N \l_graphics_decodearray_tl
-    \bool_set_false:N \l_graphics_interpolate_bool
+    \tl_clear:N \l__graphics_decodearray_str
+    \bool_set_false:N \l__graphics_interpolate_bool
     \tl_set:Nx \l__graphics_graphics_attr_tl
       {
-        : \l_graphics_pagebox_tl
-        \int_compare:nNnT \l_graphics_page_int > 1
-          { :P \int_use:N \l_graphics_page_int }
+        : \l__graphics_pagebox_tl
+        \int_compare:nNnT \l__graphics_page_int > 1
+          { :P \int_use:N \l__graphics_page_int }
       }
     \__graphics_backend_getbb_auxi:n {#1}
   }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxi:n #1
   {
-    \graphics_bb_restore:xF { #1 \l__graphics_graphics_attr_tl }
+    \__graphics_bb_restore:xF { #1 \l__graphics_graphics_attr_tl }
       { \__graphics_backend_getbb_auxii:n {#1} }
   }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxii:n #1
   {
+    \exp_args:Ne \__graphics_backend_getbb_auxiii:n
+      { \__graphics_backend_dequote:w #1 " #1 " \s__graphics_stop }
+    \int_const:cn { c__graphics_ #1 \l__graphics_graphics_attr_tl _int }
+      { \tex_the:D \tex_pdflastximage:D }
+    \__graphics_bb_save:x { #1 \l__graphics_graphics_attr_tl }
+  }
+\cs_new_protected:Npn \__graphics_backend_getbb_auxiii:n #1
+  {
     \tex_immediate:D \tex_pdfximage:D
       \bool_lazy_or:nnT
-        { \l_graphics_interpolate_bool }
-        { ! \tl_if_empty_p:N \l_graphics_decodearray_tl }
+        { \l__graphics_interpolate_bool }
+        { ! \tl_if_empty_p:N \l__graphics_decodearray_str }
         {
           attr ~
             {
-              \tl_if_empty:NF \l_graphics_decodearray_tl
-                { /Decode~[ \l_graphics_decodearray_tl ] }
-              \bool_if:NT \l_graphics_interpolate_bool
+              \tl_if_empty:NF \l__graphics_decodearray_str
+                { /Decode~[ \l__graphics_decodearray_str ] }
+              \bool_if:NT \l__graphics_interpolate_bool
                 { /Interpolate~true }
             }
         }
-      \int_compare:nNnT \l_graphics_page_int > 0
-        { page ~ \int_use:N \l_graphics_page_int }
-      \tl_if_empty:NF \l_graphics_pagebox_tl
-        { \l_graphics_pagebox_tl }
+      \int_compare:nNnT \l__graphics_page_int > 0
+        { page ~ \int_use:N \l__graphics_page_int }
+      \tl_if_empty:NF \l__graphics_pagebox_tl
+        { \l__graphics_pagebox_tl }
       {#1}
     \hbox_set:Nn \l__graphics_internal_box
       { \tex_pdfrefximage:D \tex_pdflastximage:D }
-    \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l__graphics_internal_box }
-    \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l__graphics_internal_box }
-    \int_const:cn { c__graphics_graphics_ #1 \l__graphics_graphics_attr_tl _int }
-      { \tex_the:D \tex_pdflastximage:D }
-    \graphics_bb_save:x { #1 \l__graphics_graphics_attr_tl }
+    \dim_set:Nn \l__graphics_urx_dim { \box_wd:N \l__graphics_internal_box }
+    \dim_set:Nn \l__graphics_ury_dim { \box_ht:N \l__graphics_internal_box }
   }
+\cs_new:Npn \__graphics_backend_dequote:w #1 " #2 " #3 \s__graphics_stop {#2}
 \cs_new_protected:Npn \__graphics_backend_include_jpg:n #1
   {
     \tex_pdfrefximage:D
-      \int_use:c { c__graphics_graphics_ #1 \l__graphics_graphics_attr_tl _int }
+      \int_use:c { c__graphics_ #1 \l__graphics_graphics_attr_tl _int }
   }
+\cs_new_eq:NN \__graphics_backend_include_jpeg:n \__graphics_backend_include_jpg:n
 \cs_new_eq:NN \__graphics_backend_include_pdf:n \__graphics_backend_include_jpg:n
 \cs_new_eq:NN \__graphics_backend_include_png:n \__graphics_backend_include_jpg:n
 \sys_if_shell:T
@@ -616,8 +641,12 @@
           \l__graphics_backend_ext_str
         \exp_args:Nx \__graphics_backend_getbb_eps:nn
           {
-            \l__graphics_backend_name_str - \str_tail:N \l__graphics_backend_ext_str
-            -converted-to.pdf
+            \exp_args:Ne \__kernel_file_name_quote:n
+              {
+                \l__graphics_backend_name_str
+                - \str_tail:N \l__graphics_backend_ext_str
+                -converted-to.pdf
+              }
           }
           {#1}
      }
@@ -628,7 +657,7 @@
             \sys_shell_now:n
               { repstopdf ~ #2 ~ #1 }
           }
-        \tl_set:Nn \l_graphics_name_tl {#1}
+        \tl_set:Nn \l__graphics_final_name_str {#1}
         \__graphics_backend_getbb_pdf:n {#1}
       }
     \cs_new_protected:Npn \__graphics_backend_include_eps:n #1
@@ -637,11 +666,21 @@
           \l__graphics_backend_dir_str \l__graphics_backend_name_str \l__graphics_backend_ext_str
         \exp_args:Nx \__graphics_backend_include_pdf:n
           {
-            \l__graphics_backend_name_str - \str_tail:N \l__graphics_backend_ext_str
-            -converted-to.pdf
+            \exp_args:Ne \__kernel_file_name_quote:n
+              {
+                \l__graphics_backend_name_str
+                - \str_tail:N \l__graphics_backend_ext_str
+                -converted-to.pdf
+              }
           }
       }
   }
+\cs_new_protected:Npn \__graphics_backend_get_pagecount:n #1
+  {
+    \tex_immediate:D \tex_pdfximage:D {#1}
+    \int_const:cn { c__graphics_ #1 _pages_int }
+      { \int_use:N \tex_pdflastximagepages:D }
+  }
 %% File: l3backend-pdf.dtx
 \box_new:N \l__pdf_internal_box
 \cs_new_protected:Npn \__pdf_backend_annotation:nnnn #1#2#3#4

Modified: trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-xetex.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-xetex.def	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3backend/l3backend-xetex.def	2022-04-11 20:14:43 UTC (rev 63007)
@@ -26,7 +26,7 @@
 %% 
 %% File: l3backend-basics.dtx
 \ProvidesExplFile
-  {l3backend-xetex.def}{2022-02-07}{}
+  {l3backend-xetex.def}{2022-04-10}{}
   {L3 backend support: XeTeX}
 \cs_if_exist:NTF \__kernel_dependency_version_check:nn
   {
@@ -65,20 +65,6 @@
   { \__kernel_backend_literal:n { x:gsave } }
 \cs_new_protected:Npn \__kernel_backend_scope_end:
   { \__kernel_backend_literal:n { x:grestore } }
-\group_begin:
-  \cs_set:Npn \__sys_tmp:w #1 Version ~ #2 ~ #3 \q_stop {#2}
-  \sys_get_shell:nnNTF { extractbb~--version }
-    { \char_set_catcode_space:n { `\  } }
-    \l__sys_internal_tl
-    {
-      \int_const:Nn \c__kernel_sys_dvipdfmx_version_int
-        {
-          \exp_after:wN \__sys_tmp:w \l__sys_internal_tl
-            \q_stop
-        }
-    }
-    { \int_const:Nn \c__kernel_sys_dvipdfmx_version_int { 0 } }
-\group_end:
 %% File: l3backend-color.dtx
 \cs_new_protected:Npn \__color_backend_pickup:N #1 { }
 \cs_if_exist:cT { ver at color.sty }
@@ -102,72 +88,65 @@
       { \tl_set:Nn #3 { {#1} {#2} } }
   }
 \int_new:N \l__color_backend_stack_int
-\int_compare:nNnTF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  { \cs_new_protected:Npn \__kernel_color_backend_stack_init:Nnn #1#2#3 { } }
+\int_new:N \g__color_backend_stack_int
+\cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3
   {
-    \int_new:N \g__color_backend_stack_int
-    \cs_new_protected:Npx \__kernel_color_backend_stack_init:Nnn #1#2#3
+    \int_gincr:N \exp_not:N \g__color_backend_stack_int
+    \int_const:Nn #1 { \exp_not:N \g__color_backend_stack_int }
+    \use:x
       {
-        \int_gincr:N \exp_not:N \g__color_backend_stack_int
-        \int_const:Nn #1 { \exp_not:N \g__color_backend_stack_int }
-        \use:x
+        \__kernel_backend_first_shipout:n
           {
-            \__kernel_backend_first_shipout:n
+            \__kernel_backend_literal:n
               {
-                \__kernel_backend_literal:n
-                  {
-                    pdfcolorstackinit ~
-                    \exp_not:N \int_use:N \exp_not:N \g__color_backend_stack_int
-                    \c_space_tl
-                    \exp_not:N \tl_if_blank:nF {#2} { #2 ~ }
-                    (#3)
-                  }
+                pdfcolorstackinit ~
+                \exp_not:N \int_use:N \exp_not:N \g__color_backend_stack_int
+                \c_space_tl
+                \exp_not:N \tl_if_blank:nF {#2} { #2 ~ }
+                (#3)
               }
-          }
+        }
       }
-    \cs_if_exist:cTF { main at pdfcolorstack }
+  }
+\cs_if_exist:cTF { main at pdfcolorstack }
+  {
+    \int_set:Nn \l__color_backend_stack_int
+      { \int_use:c { main at pdfcolorstack } }
+  }
+  {
+    \__kernel_color_backend_stack_init:Nnn \c__color_backend_main_stack_int
+      { page ~ direct } { 0 ~ g ~ 0 ~ G }
+    \int_set_eq:NN \l__color_backend_stack_int
+      \c__color_backend_main_stack_int
+    \int_const:cn { main at pdfcolorstack } { \c__color_backend_main_stack_int }
+  }
+\cs_gset_protected:Npn \__kernel_backend_scope_end:
+  {
+    \__kernel_backend_literal:n { x:grestore }
+    \__kernel_backend_literal:x
       {
-        \int_set:Nn \l__color_backend_stack_int
-          { \int_use:c { main at pdfcolorstack } }
+        pdfcolorstack ~
+        \int_use:N \g__color_backend_stack_int \c_space_tl current
       }
+  }
+\cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2
+  {
+    \__kernel_backend_literal:x
       {
-        \__kernel_color_backend_stack_init:Nnn \c__color_backend_main_stack_int
-          { page ~ direct } { 0 ~ g ~ 0 ~ G }
-        \int_set_eq:NN \l__color_backend_stack_int
-          \c__color_backend_main_stack_int
-        \int_const:cn { main at pdfcolorstack } { \c__color_backend_main_stack_int }
+        pdfcolorstack ~
+        \int_eval:n {#1} ~
+        push ~ (#2)
       }
-    \cs_gset_protected:Npn \__kernel_backend_scope_end:
-      {
-        \__kernel_backend_literal:n { x:grestore }
-        \__kernel_backend_literal:x
-          {
-            pdfcolorstack ~
-            \int_use:N \g__color_backend_stack_int \c_space_tl current
-          }
-      }
   }
-\int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
+\cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx }
+\cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1
   {
-    \cs_new_protected:Npn \__kernel_color_backend_stack_push:nn #1#2
+    \__kernel_backend_literal:x
       {
-        \__kernel_backend_literal:x
-          {
-            pdfcolorstack ~
-            \int_eval:n {#1} ~
-            push ~ (#2)
-          }
+        pdfcolorstack ~
+        \int_eval:n {#1} ~
+        pop
       }
-    \cs_generate_variant:Nn \__kernel_color_backend_stack_push:nn { nx }
-    \cs_new_protected:Npn \__kernel_color_backend_stack_pop:n #1
-      {
-        \__kernel_backend_literal:x
-          {
-            pdfcolorstack ~
-            \int_eval:n {#1} ~
-            pop
-          }
-      }
   }
 \tl_new:N \l__color_backend_fill_tl
 \tl_new:N \l__color_backend_stroke_tl
@@ -185,15 +164,6 @@
   }
 \cs_new_protected:Npn \__color_backend_reset:
   { \__kernel_color_backend_stack_pop:n \l__color_backend_stack_int }
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  {
-    \cs_gset_protected:Npn \__color_backend_select_cmyk:n #1
-      { \__kernel_backend_literal:n { pdf: bc ~ [#1] } }
-    \cs_gset_eq:NN \__color_backend_select_gray:n \__color_backend_select_cmyk:n
-    \cs_gset_eq:NN \__color_backend_select_rgb:n \__color_backend_select_cmyk:n
-    \cs_gset_protected:Npn \__color_backend_reset:
-      { \__kernel_backend_literal:n { pdf: ec } }
-  }
 \prop_new:N \g__color_backend_colorant_prop
 \cs_new:Npx \__color_backend_devicen_colorants:n #1
   {
@@ -380,12 +350,6 @@
           }
       }
   }
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  {
-    \cs_gset_protected:Npn \__color_backend_select_separation:nn #1#2 { }
-    \cs_gset_eq:NN \__color_backend_select_devicen:nn
-      \__color_backend_select_separation:nn
-  }
 \cs_new_protected:Npn \__color_backend_fill_cmyk:n #1
   { \__color_backend_fill:n { #1 ~ k } }
 \cs_new_protected:Npn \__color_backend_fill_gray:n #1
@@ -418,27 +382,6 @@
   { \__color_backend_stroke:n { /#1 ~ CS ~ #2 ~ SCN } }
 \cs_new_eq:NN \__color_backend_fill_devicen:nn \__color_backend_fill_separation:nn
 \cs_new_eq:NN \__color_backend_stroke_devicen:nn \__color_backend_stroke_separation:nn
-\int_compare:nNnT \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-  {
-    \cs_gset_protected:Npn \__color_backend_fill_cmyk:n #1
-      {
-        \__kernel_backend_literal:n { pdf: bc ~ [#1] }
-        \group_insert_after:N \__color_backend_reset:
-      }
-    \cs_gset_eq:NN \__color_backend_fill_gray:n \__color_backend_fill_cmyk:n
-    \cs_gset_eq:NN \__color_backend_fill_rgb:n \__color_backend_fill_cmyk:n
-    \cs_gset_protected:Npn \__color_backend_reset:
-      { \__kernel_backend_literal:n { pdf: ec } }
-    \cs_gset_protected:Npn \__color_backend_stroke:n #1
-      { \__kernel_backend_literal:n {#1} }
-    \cs_gset_protected:Npn \__color_backend_fill_separation:nn #1#2 { }
-    \cs_gset_eq:NN \__color_backend_fill_devicen:nn
-      \__color_backend_fill_separation:nn
-    \cs_gset_eq:NN \__color_backend_stroke_separation:nn
-      \__color_backend_fill_separation:nn
-    \cs_gset_eq:NN \__color_backend_stroke_devicen:nn
-      \__color_backend_stroke_separation:nn
-  }
 %% File: l3backend-box.dtx
 \cs_new_protected:Npn \__box_backend_clip:N #1
   {
@@ -660,7 +603,27 @@
     \__kernel_backend_scope_end:
   }
 %% File: l3backend-graphics.dtx
-\cs_new_eq:NN \__graphics_backend_getbb_eps:n \graphics_read_bb:n
+\cs_new_protected:Npn \__graphics_backend_loaded:n #1
+  {
+    \cs_if_exist:NTF \hook_gput_code:nnn
+      {
+        \hook_gput_code:nnn
+          { file / l3graphics.sty / after }
+          { backend }
+          {#1}
+      }
+      {#1}
+  }
+\__graphics_backend_loaded:n
+  {
+    \seq_set_from_clist:Nn \l_graphics_search_ext_seq
+      { .pdf , .eps , .ps , .png , .jpg ., jpeg , .bmp }
+   }
+\__graphics_backend_loaded:n
+  {
+    \cs_new_eq:NN \__graphics_backend_getbb_eps:n \__graphics_read_bb:n
+    \cs_new_eq:NN \__graphics_backend_getbb_ps:n \__graphics_read_bb:n
+  }
 \int_new:N \g__graphics_track_int
 \cs_new_protected:Npn \__graphics_backend_include_eps:n #1
   {
@@ -667,26 +630,29 @@
     \__kernel_backend_literal:x
       {
         PSfile = #1 \c_space_tl
-        llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
-        lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
-        urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
-        ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim
+        llx = \dim_to_decimal_in_bp:n \l__graphics_llx_dim \c_space_tl
+        lly = \dim_to_decimal_in_bp:n \l__graphics_lly_dim \c_space_tl
+        urx = \dim_to_decimal_in_bp:n \l__graphics_urx_dim \c_space_tl
+        ury = \dim_to_decimal_in_bp:n \l__graphics_ury_dim
       }
   }
+\cs_new_eq:NN \__graphics_backend_include_ps:n \__graphics_backend_include_eps:n
 \cs_new_protected:Npn \__graphics_backend_include_jpg:n #1
   { \__graphics_backend_include_auxi:nn {#1} { image } }
+\cs_new_eq:NN \__graphics_backend_include_jpeg:n \__graphics_backend_include_jpg:n
 \cs_new_eq:NN \__graphics_backend_include_png:n \__graphics_backend_include_jpg:n
+\cs_new_eq:NN \__graphics_backend_include_bmp:n \__graphics_backend_include_jpg:n
 \cs_new_protected:Npn \__graphics_backend_include_auxi:nn #1#2
   {
     \__graphics_backend_include_auxii:xnn
       {
-        \tl_if_empty:NF \l_graphics_pagebox_tl
-          { : \l_graphics_pagebox_tl }
-        \int_compare:nNnT \l_graphics_page_int > 1
-          { :P \int_use:N \l_graphics_page_int }
-        \tl_if_empty:NF \l_graphics_decodearray_tl
-          { :D \l_graphics_decodearray_tl }
-        \bool_if:NT \l_graphics_interpolate_bool
+        \tl_if_empty:NF \l__graphics_pagebox_tl
+          { : \l__graphics_pagebox_tl }
+        \int_compare:nNnT \l__graphics_page_int > 1
+          { :P \int_use:N \l__graphics_page_int }
+        \tl_if_empty:NF \l__graphics_decodearray_str
+          { :D \l__graphics_decodearray_str }
+        \bool_if:NT \l__graphics_interpolate_bool
            { :I }
       }
       {#1} {#2}
@@ -693,10 +659,10 @@
   }
 \cs_new_protected:Npn \__graphics_backend_include_auxii:nnn #1#2#3
   {
-    \int_if_exist:cTF { c__graphics_graphics_ #2#1 _int }
+    \int_if_exist:cTF { c__graphics_ #2#1 _int }
       {
         \__kernel_backend_literal:x
-          { pdf:usexobj~@graphic \int_use:c { c__graphics_graphics_ #2#1 _int } }
+          { pdf:usexobj~@graphic \int_use:c { c__graphics_ #2#1 _int } }
       }
       { \__graphics_backend_include_auxiii:nnn {#2} {#1} {#3} }
   }
@@ -704,31 +670,31 @@
 \cs_new_protected:Npn \__graphics_backend_include_auxiii:nnn #1#2#3
   {
     \int_gincr:N \g__graphics_track_int
-    \int_const:cn { c__graphics_graphics_ #1#2 _int } { \g__graphics_track_int }
+    \int_const:cn { c__graphics_ #1#2 _int } { \g__graphics_track_int }
     \__kernel_backend_literal:x
       {
         pdf:#3~
-        @graphic \int_use:c { c__graphics_graphics_ #1#2 _int } ~
-        \int_compare:nNnT \l_graphics_page_int > 1
-          { page ~ \int_use:N \l_graphics_page_int \c_space_tl }
-        \tl_if_empty:NF \l_graphics_pagebox_tl
+        @graphic \int_use:c { c__graphics_ #1#2 _int } ~
+        \int_compare:nNnT \l__graphics_page_int > 1
+          { page ~ \int_use:N \l__graphics_page_int \c_space_tl }
+        \tl_if_empty:NF \l__graphics_pagebox_tl
           {
-            pagebox ~ \l_graphics_pagebox_tl \c_space_tl
+            pagebox ~ \l__graphics_pagebox_tl \c_space_tl
             bbox ~
-              \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl
-              \dim_to_decimal_in_bp:n \l_graphics_ury_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__graphics_llx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__graphics_lly_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__graphics_urx_dim \c_space_tl
+              \dim_to_decimal_in_bp:n \l__graphics_ury_dim \c_space_tl
           }
         (#1)
         \bool_lazy_or:nnT
-          { \l_graphics_interpolate_bool }
-          { ! \tl_if_empty_p:N \l_graphics_decodearray_tl }
+          { \l__graphics_interpolate_bool }
+          { ! \tl_if_empty_p:N \l__graphics_decodearray_str }
           {
             <<
-              \tl_if_empty:NF \l_graphics_decodearray_tl
-                { /Decode~[ \l_graphics_decodearray_tl ] }
-              \bool_if:NT \l_graphics_interpolate_bool
+              \tl_if_empty:NF \l__graphics_decodearray_str
+                { /Decode~[ \l__graphics_decodearray_str ] }
+              \bool_if:NT \l__graphics_interpolate_bool
                 { /Interpolate~true> }
             >>
           }
@@ -736,21 +702,23 @@
   }
 \cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1
   {
-    \int_zero:N \l_graphics_page_int
-    \tl_clear:N \l_graphics_pagebox_tl
+    \int_zero:N \l__graphics_page_int
+    \tl_clear:N \l__graphics_pagebox_tl
     \__graphics_backend_getbb_auxi:nN {#1} \tex_XeTeXpicfile:D
   }
+\cs_new_eq:NN \__graphics_backend_getbb_jpeg:n \__graphics_backend_getbb_jpg:n
 \cs_new_eq:NN \__graphics_backend_getbb_png:n \__graphics_backend_getbb_jpg:n
+\cs_new_eq:NN \__graphics_backend_getbb_bmp:n \__graphics_backend_getbb_jpg:n
 \cs_new_protected:Npn \__graphics_backend_getbb_pdf:n #1
   {
-    \tl_clear:N \l_graphics_decodearray_tl
-    \bool_set_false:N \l_graphics_interpolate_bool
+    \tl_clear:N \l__graphics_decodearray_str
+    \bool_set_false:N \l__graphics_interpolate_bool
     \__graphics_backend_getbb_auxi:nN {#1} \tex_XeTeXpdffile:D
   }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxi:nN #1#2
   {
-    \int_compare:nNnTF \l_graphics_page_int > 1
-      { \__graphics_backend_getbb_auxii:VnN \l_graphics_page_int {#1} #2  }
+    \int_compare:nNnTF \l__graphics_page_int > 1
+      { \__graphics_backend_getbb_auxii:VnN \l__graphics_page_int {#1} #2  }
       { \__graphics_backend_getbb_auxiii:nNnn {#1} #2 { :P 1 } { page 1 } }
   }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxii:nnN #1#2#3
@@ -758,8 +726,8 @@
 \cs_generate_variant:Nn \__graphics_backend_getbb_auxii:nnN { V }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxiii:nNnn #1#2#3#4
   {
-    \tl_if_empty:NTF \l_graphics_pagebox_tl
-      { \__graphics_backend_getbb_auxiv:VnNnn \l_graphics_pagebox_tl }
+    \tl_if_empty:NTF \l__graphics_pagebox_tl
+      { \__graphics_backend_getbb_auxiv:VnNnn \l__graphics_pagebox_tl }
       { \__graphics_backend_getbb_auxv:nNnn }
       {#1} #2 {#3} {#4}
   }
@@ -768,33 +736,43 @@
     \use:x
       {
         \__graphics_backend_getbb_auxv:nNnn {#2} #3 { : #1 #4 }
-          { #5 ~ \__graphics_backend_getbb_pagebox:w #1 }
+          {
+            #5
+            \tl_if_blank:nF {#1}
+              { \c_space_tl \__graphics_backend_getbb_pagebox:w #1 }
+          }
       }
   }
 \cs_generate_variant:Nn \__graphics_backend_getbb_auxiv:nnNnn { V }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxv:nNnn #1#2#3#4
   {
-    \graphics_bb_restore:nF {#1#3}
+    \__graphics_bb_restore:nF {#1#3}
       { \__graphics_backend_getbb_auxvi:nNnn {#1} #2 {#3} {#4} }
   }
 \cs_new_protected:Npn \__graphics_backend_getbb_auxvi:nNnn #1#2#3#4
   {
     \hbox_set:Nn \l__graphics_internal_box { #2 #1 ~ #4 }
-    \dim_set:Nn \l_graphics_urx_dim { \box_wd:N \l__graphics_internal_box }
-    \dim_set:Nn \l_graphics_ury_dim { \box_ht:N \l__graphics_internal_box }
-    \graphics_bb_save:n {#1#3}
+    \dim_set:Nn \l__graphics_urx_dim { \box_wd:N \l__graphics_internal_box }
+    \dim_set:Nn \l__graphics_ury_dim { \box_ht:N \l__graphics_internal_box }
+    \__graphics_bb_save:n {#1#3}
   }
 \cs_new:Npn \__graphics_backend_getbb_pagebox:w #1 box {#1}
 \cs_new_protected:Npn \__graphics_backend_include_pdf:n #1
   {
-    \tex_XeTeXpdffile:D
-      \__graphics_backend_include_pdf_quote:w #1 "#1" \s__graphics_stop \c_space_tl
-      \int_compare:nNnT \l_graphics_page_int > 0
-        { page ~ \int_use:N \l_graphics_page_int \c_space_tl }
-        \exp_after:wN \__graphics_backend_getbb_pagebox:w \l_graphics_pagebox_tl
+    \tex_XeTeXpdffile:D #1 ~
+      \int_compare:nNnT \l__graphics_page_int > 0
+        { page ~ \int_use:N \l__graphics_page_int \c_space_tl }
+        \exp_after:wN \__graphics_backend_getbb_pagebox:w \l__graphics_pagebox_tl
   }
-\cs_new:Npn \__graphics_backend_include_pdf_quote:w #1 " #2 " #3 \s__graphics_stop
-  { " #2 " }
+\cs_new_protected:Npn \__graphics_backend_get_pagecount:n #1
+  {
+    \int_const:cn { c__graphics_ #1 _pages_int }
+      {
+        \int_max:nn
+          { \int_use:N \tex_XeTeXpdfpagecount:D #1 ~ }
+          { 1 }
+      }
+  }
 %% File: l3backend-pdf.dtx
 \box_new:N \l__pdf_internal_box
 \cs_new_protected:Npx \__pdf_backend:n #1
@@ -884,19 +862,13 @@
   { \__pdf_backend_link_begin:n {#1#2} }
 \cs_new_protected:Npx \__pdf_backend_link_begin:n #1
   {
-    \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-      {
-        \exp_not:N \int_gincr:N \exp_not:N  \g__pdf_backend_link_int
-      }
+    \exp_not:N \int_gincr:N \exp_not:N  \g__pdf_backend_link_int
     \__pdf_backend:x
       {
          bann ~
-         \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-           {
-             @pdf.lnk
-             \exp_not:N \int_use:N \exp_not:N  \g__pdf_backend_link_int
-             \c_space_tl
-           }
+         @pdf.lnk
+         \exp_not:N \int_use:N \exp_not:N  \g__pdf_backend_link_int
+         \c_space_tl
          <<
            /Type /Annot
            #1
@@ -905,14 +877,8 @@
   }
 \cs_new_protected:Npn \__pdf_backend_link_end:
   { \__pdf_backend:n { eann } }
-\cs_new:Npx \__pdf_backend_link_last:
-  {
-    \int_compare:nNnF \c__kernel_sys_dvipdfmx_version_int < { 20201111 }
-      {
-        @pdf.lnk
-          \exp_not:N \int_use:N \exp_not:N \g__pdf_backend_link_int
-      }
-  }
+\cs_new:Npn \__pdf_backend_link_last:
+  { @pdf.lnk \int_use:N \g__pdf_backend_link_int }
 \cs_new_protected:Npn \__pdf_backend_link_margin:n #1
   { \__kernel_backend_literal:x { dvipdfmx:config~g~ \dim_eval:n {#1} } }
 \cs_new_protected:Npn \__pdf_backend_destination:nn #1#2

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3benchmark/l3benchmark.sty	2022-04-11 20:14:43 UTC (rev 63007)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3benchmark.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3benchmark}{2022-02-05}{}
+\ProvidesExplPackage{l3benchmark}{2022-04-10}{}
   {L3 Experimental benchmarking}
 \fp_new:N \g_benchmark_duration_target_fp
 \fp_gset:Nn \g_benchmark_duration_target_fp { 1 }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3bitset/l3bitset.sty	2022-04-11 20:14:43 UTC (rev 63007)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: l3bitset.dtx
-\ProvidesExplPackage{l3bitset}{2022-02-05}{}
+\ProvidesExplPackage{l3bitset}{2022-04-10}{}
   {L3 Experimental bitset support}
 \cs_new_protected:Npn \bitset_new:N #1
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3draw/l3draw.sty	2022-04-11 20:14:43 UTC (rev 63007)
@@ -28,7 +28,7 @@
 %% 
 %% File: l3draw.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3draw}{2022-02-05}{}
+\ProvidesExplPackage{l3draw}{2022-04-10}{}
   {L3 Experimental core drawing support}
 \scan_new:N \s__draw_mark
 \scan_new:N \s__draw_stop

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3graphics/l3graphics.sty	2022-04-11 20:14:43 UTC (rev 63007)
@@ -20,54 +20,71 @@
 %% 
 %% File: l3graphics.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3graphics}{2022-02-05}{}
+\ProvidesExplPackage{l3graphics}{2022-04-10}{}
   {L3 Experimental graphics inclusion support}
-\ior_new:N \l__graphics_tmp_ior
-\tl_new:N  \l__graphics_tmp_tl
+\ior_new:N \l__graphics_internal_ior
+\tl_new:N  \l__graphics_internal_tl
 \scan_new:N \s__graphics_stop
-\tl_new:N \l_graphics_decodearray_tl
-\tl_new:N \l_graphics_pagebox_tl
-\bool_new:N \l_graphics_interpolate_bool
-\tl_set:Nn \l_graphics_pagebox_tl { cropbox }
-\int_new:N \l_graphics_page_int
-\dim_new:N \l_graphics_llx_dim
-\dim_new:N \l_graphics_lly_dim
-\dim_new:N \l_graphics_urx_dim
-\dim_new:N \l_graphics_ury_dim
-\cs_new_protected:Npn \graphics_bb_save:n #1
+\tl_new:N \l__graphics_pagebox_tl
+\keys_define:nn { graphics }
   {
+    decodearray .str_set:N =
+      \l__graphics_decodearray_str ,
+    draft .bool_set:N =
+      \l__graphics_draft_bool ,
+    interpolate .bool_set:N =
+      \l__graphics_interpolate_bool ,
+    pagebox .choices:nn =
+      { art , bleed , crop , media , trim }
+      {
+        \tl_set:Nx \l__graphics_pagebox_tl
+           { \tl_use:N \l_keys_choice_tl box }
+      } ,
+    pagebox .initial:n =
+      crop ,
+    page .int_set:N =
+      \l__graphics_page_int ,
+    type . str_set:N =
+      \l__graphics_type_str
+  }
+\dim_new:N \l__graphics_llx_dim
+\dim_new:N \l__graphics_lly_dim
+\dim_new:N \l__graphics_urx_dim
+\dim_new:N \l__graphics_ury_dim
+\cs_new_protected:Npn \__graphics_bb_save:n #1
+  {
     \dim_if_exist:cTF { c__graphics_ #1 _urx_dim }
       { \msg_error:nnn { graphic } { bb-already-cached } {#1} }
       {
-        \dim_compare:nNnF \l_graphics_llx_dim = { 0pt }
-          { \dim_const:cn { c__graphics_ #1 _llx_dim } { \l_graphics_llx_dim } }
-        \dim_compare:nNnF \l_graphics_lly_dim = { 0pt }
-          { \dim_const:cn { c__graphics_ #1 _lly_dim } { \l_graphics_lly_dim } }
-        \dim_const:cn { c__graphics_ #1 _urx_dim } { \l_graphics_urx_dim }
-        \dim_const:cn { c__graphics_ #1 _ury_dim } { \l_graphics_ury_dim }
+        \dim_compare:nNnF \l__graphics_llx_dim = { 0pt }
+          { \dim_const:cn { c__graphics_ #1 _llx_dim } { \l__graphics_llx_dim } }
+        \dim_compare:nNnF \l__graphics_lly_dim = { 0pt }
+          { \dim_const:cn { c__graphics_ #1 _lly_dim } { \l__graphics_lly_dim } }
+        \dim_const:cn { c__graphics_ #1 _urx_dim } { \l__graphics_urx_dim }
+        \dim_const:cn { c__graphics_ #1 _ury_dim } { \l__graphics_ury_dim }
       }
   }
-\cs_generate_variant:Nn \graphics_bb_save:n { x }
-\cs_new_protected:Npn \graphics_bb_restore:nF #1#2
+\cs_generate_variant:Nn \__graphics_bb_save:n { x }
+\cs_new_protected:Npn \__graphics_bb_restore:nF #1#2
   {
     \dim_if_exist:cTF { c__graphics_ #1 _urx_dim }
       {
-        \dim_set_eq:Nc \l_graphics_urx_dim { c__graphics_ #1 _urx_dim }
-        \dim_set_eq:Nc \l_graphics_ury_dim { c__graphics_ #1 _ury_dim }
+        \dim_set_eq:Nc \l__graphics_urx_dim { c__graphics_ #1 _urx_dim }
+        \dim_set_eq:Nc \l__graphics_ury_dim { c__graphics_ #1 _ury_dim }
         \dim_if_exist:cTF { c__graphics_ #1 _llx_dim }
-          { \dim_set_eq:Nc \l_graphics_llx_dim { c__graphics_ #1 _llx_dim } }
-          { \dim_zero:N \l_graphics_llx_dim }
+          { \dim_set_eq:Nc \l__graphics_llx_dim { c__graphics_ #1 _llx_dim } }
+          { \dim_zero:N \l__graphics_llx_dim }
         \dim_if_exist:cTF { c__graphics_ #1 _lly_dim }
-          { \dim_set_eq:Nc \l_graphics_lly_dim { c__graphics_ #1 _lly_dim } }
-          { \dim_zero:N \l_graphics_lly_dim }
+          { \dim_set_eq:Nc \l__graphics_lly_dim { c__graphics_ #1 _lly_dim } }
+          { \dim_zero:N \l__graphics_lly_dim }
       }
       {#2}
   }
-\cs_generate_variant:Nn \graphics_bb_restore:nF { x }
-\cs_new_protected:Npn \graphics_extract_bb:n #1
+\cs_generate_variant:Nn \__graphics_bb_restore:nF { x }
+\cs_new_protected:Npn \__graphics_extract_bb:n #1
   {
-    \int_compare:nNnTF \l_graphics_page_int > 0
-      { \__graphics_extract_bb_auxi:Vn \l_graphics_page_int {#1} }
+    \int_compare:nNnTF \l__graphics_page_int > 0
+      { \__graphics_extract_bb_auxi:Vn \l__graphics_page_int {#1} }
       { \__graphics_extract_bb_auxii:nnn {#1} { } { } }
   }
 \cs_new_protected:Npn \__graphics_extract_bb_auxi:nn #1#2
@@ -75,9 +92,9 @@
 \cs_generate_variant:Nn \__graphics_extract_bb_auxi:nn { Vn }
 \cs_new_protected:Npn \__graphics_extract_bb_auxii:nnn #1#2#3
   {
-   \tl_if_empty:NTF \l_graphics_pagebox_tl
+    \tl_if_empty:NTF \l__graphics_pagebox_tl
       { \__graphics_extract_bb_auxiv:nnn }
-      { \__graphics_extract_bb_auxiii:Vnnn \l_graphics_pagebox_tl }
+      { \__graphics_extract_bb_auxiii:Vnnn \l__graphics_pagebox_tl }
       {#1} {#2} {#3}
   }
 \cs_new_protected:Npn \__graphics_extract_bb_auxiii:nnnn #1#2#3#4
@@ -86,42 +103,34 @@
 \cs_new_protected:Npn \__graphics_extract_bb_auxiv:nnn #1#2#3
   {
     \__graphics_read_bb_auxi:nnnn {#1} {#2}
-      { \ior_shell_open:Nn \l__graphics_tmp_ior { extractbb~#3-O~#1 } }
+      { \ior_shell_open:Nn \l__graphics_internal_ior { extractbb~#3-O~#1 } }
       { pipe-failed }
   }
-\cs_new_protected:Npn \graphics_read_bb:n #1
+\cs_new_protected:Npn \__graphics_read_bb:n #1
   {
     \__graphics_read_bb_auxi:nnnn {#1} { }
-      { \ior_open:Nn \l__graphics_tmp_ior {#1} }
+      { \ior_open:Nn \l__graphics_internal_ior {#1} }
       { graphic-not-found }
   }
 \cs_new_protected:Npn \__graphics_read_bb_auxi:nnnn #1#2#3#4
   {
-    \graphics_bb_restore:nF {#1#2}
+    \__graphics_bb_restore:nF {#1#2}
       { \__graphics_read_bb_auxii:nnnn {#3} {#4} {#1} {#2} }
   }
 \cs_new_protected:Npx \__graphics_read_bb_auxii:nnnn #1#2#3#4
   {
     #1
-    \exp_not:N \ior_if_eof:NTF \exp_not:N \l__graphics_tmp_ior
+    \exp_not:N \ior_if_eof:NTF \exp_not:N \l__graphics_internal_ior
       { \msg_error:nnn { graphics } {#2} {#3} }
       {
-        \ior_str_map_inline:Nn \exp_not:N \l__graphics_tmp_ior
+        \ior_str_map_inline:Nn \exp_not:N \l__graphics_internal_ior
           {
             \exp_not:N \__graphics_read_bb_auxiii:w
               ##1 ~ \c_colon_str \s__graphics_stop
           }
+        \__graphics_bb_save:n {#3#4}
       }
-    \exp_not:n
-      {
-        \ior_close:N \l__graphics_tmp_ior
-        \dim_compare:nNnF \l_graphics_llx_dim = { 0pt }
-          { \dim_const:cn { c__graphics_ #3#4 _llx_dim } { \l_graphics_llx_dim } }
-        \dim_compare:nNnF \l_graphics_lly_dim = { 0pt }
-          { \dim_const:cn { c__graphics_ #3#4 _lly_dim } { \l_graphics_lly_dim } }
-        \dim_const:cn { c__graphics_ #3#4 _urx_dim } { \l_graphics_urx_dim }
-        \dim_const:cn { c__graphics_ #3#4 _ury_dim } { \l_graphics_ury_dim }
-      }
+    \ior_close:N \exp_not:N \l__graphics_internal_ior
   }
 \use:x
   {
@@ -138,26 +147,25 @@
   {
     \str_if_eq:nnF {#2} { atend }
       {
-        \tl_set_rescan:Nnx \l__graphics_tmp_tl
+        \tl_set_rescan:Nnx \l__graphics_internal_tl
           {
             \char_set_catcode_space:n {  9 }
             \char_set_catcode_space:n { 32 }
           }
           { \use:n #1 }
-        \exp_after:wN \__graphics_read_bb_auxv:w \l__graphics_tmp_tl \s__graphics_stop
+        \exp_after:wN \__graphics_read_bb_auxv:w \l__graphics_internal_tl \s__graphics_stop
       }
   }
 \cs_new_protected:Npn \__graphics_read_bb_auxv:w #1~#2~#3~#4~#5 \s__graphics_stop
   {
-    \dim_set:Nn \l_graphics_llx_dim { #1 bp }
-    \dim_set:Nn \l_graphics_lly_dim { #2 bp }
-    \dim_set:Nn \l_graphics_urx_dim { #3 bp }
-    \dim_set:Nn \l_graphics_ury_dim { #4 bp }
+    \dim_set:Nn \l__graphics_llx_dim { #1 bp }
+    \dim_set:Nn \l__graphics_lly_dim { #2 bp }
+    \dim_set:Nn \l__graphics_urx_dim { #3 bp }
+    \dim_set:Nn \l__graphics_ury_dim { #4 bp }
     \ior_map_break:
   }
-\bool_new:N \l_graphics_draft_bool
-\tl_new:N \l_graphics_name_tl
-\tl_new:N \l__graphics_name_tl
+\str_new:N \l__graphics_final_name_str
+\str_new:N \l__graphics_full_name_str
 \box_new:N \l__graphics_internal_box
 \str_new:N \l__graphics_dir_str
 \str_new:N \l__graphics_name_str
@@ -167,51 +175,35 @@
 \prop_new:N \l_graphics_ext_type_prop
 \prop_put:Nnn \l_graphics_ext_type_prop { .ps } { eps }
 \seq_new:N \g__graphics_record_seq
-\cs_new_protected:Npn \graphics_include:n #1
+\cs_new_protected:Npn \graphics_include:nn #1#2
   {
     \group_begin:
+      \keys_set:nn { graphics } {#1}
       \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
-      \file_get_full_name:nNTF {#1} \l__graphics_name_tl
+      \file_get_full_name:nNTF {#2} \l__graphics_full_name_str
         {
-          \str_if_eq:eeTF { \l__graphics_name_tl } { #1 .tex }
-            { \__graphics_include_search:n {#1} }
+          \str_if_eq:eeTF { \l__graphics_full_name_str } { #2 .tex }
+            { \msg_error:nnn { graphics } { graphic-not-found } {#2} }
             { \__graphics_include: }
         }
-        { \__graphics_include_search:n {#1} }
+        { \msg_error:nnn { graphics } { graphic-not-found } {#2} }
     \group_end:
   }
-\cs_new_protected:Npn \__graphics_include_search:n #1
-  {
-    \seq_map_inline:Nn \l_graphics_search_ext_seq
-      {
-        \file_get_full_name:nNT { #1 . ##1 } \l__graphics_name_tl
-          { \seq_map_break:n { \use_i:nnn \__graphics_include: } }
-      }
-    \use:n
-      { \msg_error:nnn { graphics } { graphic-not-found } {#1} }
-  }
+\cs_generate_variant:Nn \graphics_include:nn { nV }
 \cs_new_protected:Npn \__graphics_include:
   {
-    \file_parse_full_name:VNNN \l__graphics_name_tl
-      \l__graphics_dir_str \l__graphics_name_str \l__graphics_ext_str
-    \exp_args:Ne \__graphics_include_auxi:n
+    \str_if_empty:NTF \l__graphics_type_str
       {
-        \exp_args:Ne \str_tail:n
-          { \str_foldcase:V \l__graphics_ext_str }
-      }
+        \file_parse_full_name:VNNN \l__graphics_full_name_str
+          \l__graphics_dir_str \l__graphics_name_str \l__graphics_ext_str
+        \__graphics_include_auxi:e
+          {
+            \exp_args:Ne \str_tail:n
+              { \str_foldcase:V \l__graphics_ext_str }
+          }
+       }
+       { \__graphics_include_auxi:e { \l__graphics_type_str } }
   }
-\cs_new_protected:Npn \graphics_include:nn #1#2
-  {
-    \group_begin:
-      \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
-      \file_get_full_name:nNTF {#1} \l__graphics_name_tl
-        {
-          \exp_args:Ne \__graphics_include_auxi:n
-            { \str_foldcase:n {#1} }
-        }
-        { \msg_error:nnn { graphics } { graphic-not-found } {#1} }
-    \group_end:
-  }
 \cs_new_protected:Npn \__graphics_include_auxi:n #1
   {
     \prop_get:NnNF \l_graphics_ext_type_prop { .#1 } \l__graphics_internal_tl
@@ -218,18 +210,21 @@
       { \tl_set:Nn \l__graphics_internal_tl {#1} }
     \exp_args:NV \__graphics_include_auxii:n \l__graphics_internal_tl
   }
+\cs_generate_variant:Nn \__graphics_include_auxi:n { e }
 \cs_new_protected:Npn \__graphics_include_auxii:n #1
   {
     \mode_leave_vertical:
     \cs_if_exist:cTF { __graphics_backend_include_ #1 :n }
       {
-        \tl_set_eq:NN \l_graphics_name_tl \l__graphics_name_tl
+        \tl_set_eq:NN \l__graphics_final_name_str \l__graphics_full_name_str
+        \str_set:Nx \l__graphics_full_name_str
+         { \exp_args:NV \__kernel_file_name_quote:n \l__graphics_full_name_str }
         \exp_args:NnV \use:c { __graphics_backend_getbb_ #1 :n }
-          \l__graphics_name_tl
-        \seq_gput_right:NV \g__graphics_record_seq \l_graphics_name_tl
+          \l__graphics_full_name_str
+        \seq_gput_right:NV \g__graphics_record_seq \l__graphics_final_name_str
         \clist_if_exist:NT \@filelist
-          { \exp_args:NV \@addtofilelist \l_graphics_name_tl }
-        \bool_if:NTF \l_graphics_draft_bool
+          { \exp_args:NV \@addtofilelist \l__graphics_final_name_str }
+        \bool_if:NTF \l__graphics_draft_bool
           { \__graphics_include_auxiii:n }
           { \__graphics_include_auxiv:n }
             {#1}
@@ -238,21 +233,21 @@
   }
 \cs_new_protected:Npn \__graphics_include_auxiii:n #1
   {
-    \hbox_to_wd:nn { \l_graphics_urx_dim - \l_graphics_llx_dim }
+    \hbox_to_wd:nn { \l__graphics_urx_dim - \l__graphics_llx_dim }
       {
         \tex_vrule:D
         \tex_hss:D
         \vbox_to_ht:nn
-          { \l_graphics_ury_dim - \l_graphics_lly_dim }
+          { \l__graphics_ury_dim - \l__graphics_lly_dim }
           {
             \tex_hrule:D width
-              \dim_eval:n { \l_graphics_urx_dim - \l_graphics_llx_dim }
+              \dim_eval:n { \l__graphics_urx_dim - \l__graphics_llx_dim }
             \tex_vss:D
             \hbox_to_wd:nn
-              { \l_graphics_urx_dim - \l_graphics_llx_dim }
+              { \l__graphics_urx_dim - \l__graphics_llx_dim }
               {
                 \ttfamily
-                \tex_hss:D \l__graphics_name_tl \tex_hss:D
+                \tex_hss:D \l__graphics_full_name_str \tex_hss:D
               }
             \tex_vss:D
             \tex_hrule:D
@@ -266,13 +261,13 @@
     \hbox_set:Nn \l__graphics_internal_box
       {
         \exp_args:NnV \use:c { __graphics_backend_include_ #1 :n }
-          \l__graphics_name_tl
+          \l__graphics_full_name_str
       }
     \box_set_dp:Nn \l__graphics_internal_box { 0pt }
     \box_set_ht:Nn \l__graphics_internal_box
-      { \l_graphics_ury_dim - \l_graphics_lly_dim }
+      { \l__graphics_ury_dim - \l__graphics_lly_dim }
      \box_set_wd:Nn \l__graphics_internal_box
-      { \l_graphics_urx_dim - \l_graphics_llx_dim }
+      { \l__graphics_urx_dim - \l__graphics_llx_dim }
     \box_use_drop:N \l__graphics_internal_box
   }
 \cs_new_protected:Npn \graphics_show_list: { \__graphics_list:N \msg_show:nnxxxx }
@@ -280,16 +275,100 @@
 \cs_new_protected:Npn \__graphics_list:N #1
   {
     \seq_remove_duplicates:N \g__graphics_record_seq
-    #1 { LaTeX/kernel } { file-list }
+    #1 { kernel } { file-list }
       { \seq_map_function:NN \g__graphics_record_seq \__graphics_list_aux:n }
         { } { } { }
   }
 \cs_new:Npn \__graphics_list_aux:n #1 { \iow_newline: #1 }
+\cs_new_protected:Npn \graphics_get_full_name:nN #1#2
+  {
+    \graphics_get_full_name:nNF {#1} #2
+      { \tl_set:Nn #2 { \q_no_value } }
+  }
+\prg_new_protected_conditional:Npnn \graphics_get_full_name:nN #1#2
+  { T , F , TF }
+  {
+    \group_begin:
+      \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
+      \file_get_full_name:nNTF {#1} \l__graphics_full_name_str
+        {
+          \str_if_eq:eeT { \l__graphics_full_name_str } { #1 .tex }
+            { \__graphics_get_full_name:n {#1} }
+        }
+        { \__graphics_get_full_name:n {#1} }
+    \exp_args:NNNV \group_end:
+    \tl_set:Nn #2 \l__graphics_full_name_str
+    \tl_if_empty:NTF #2
+      { \prg_return_false: }
+      { \prg_return_true: }
+  }
+\cs_new_protected:Npn \__graphics_get_full_name:n #1
+  {
+    \str_clear:N \l__graphics_full_name_str
+    \seq_map_inline:Nn \l_graphics_search_ext_seq
+      {
+        \file_get_full_name:nNT { #1 ##1 } \l__graphics_full_name_str
+          { \seq_map_break:n { \use_none:nn } }
+      }
+    \use:n
+      { \str_clear:N \l__graphics_full_name_str }
+  }
+\cs_new_protected:Npn \graphics_get_pagecount:nN #1#2
+  {
+    \group_begin:
+      \seq_set_eq:NN \l_file_search_path_seq \l_graphics_search_path_seq
+      \file_get_full_name:nNTF {#1} \l__graphics_full_name_str
+        {
+          \int_if_exist:cF { c__graphics_ \l__graphics_full_name_str _pages_int }
+            {
+              \exp_args:NV \__graphics_backend_get_pagecount:n
+                \l__graphics_full_name_str
+            }
+          \tl_set:Nv #2 { c__graphics_ \l__graphics_full_name_str _pages_int }
+        }
+        {
+          \tl_set:Nn #2 { 0 }
+          \msg_error:nnn { graphics } { graphic-not-found } {#1}
+        }
+    \exp_args:NNNV \group_end:
+    \tl_set:Nn #2 #2
+  }
+\cs_new_protected:Npx \__graphics_get_pagecount:n #1
+  {
+    \ior_shell_open:Nn \exp_not:N \l__graphics_internal_ior
+      { extractbb~-O~#1 }
+    \exp_not:N \ior_if_eof:NTF \exp_not:N \l__graphics_internal_ior
+      { \msg_error:nnn { graphics } { pipe-failed } }
+      {
+        \ior_str_map_inline:Nn \exp_not:N \l__graphics_internal_ior
+          {
+            \exp_not:N \__graphics_get_pagecount:nw {#1}
+              ##1 ~ \c_colon_str \c_colon_str \s__graphics_stop
+          }
+        \exp_not:N \int_if_exist:cF { c__graphics_ #1 _pages_int }
+          { \int_const:cn { c__graphics_ #1 _pages_int } { 1 } }
+      }
+    \ior_close:N \exp_not:N \l__graphics_internal_ior
+  }
+\use:x
+  {
+    \cs_new_protected:Npn \exp_not:N \__graphics_get_pagecount:nw
+      ##1##2 \c_colon_str ##3 \c_colon_str ##4 \s__graphics_stop
+      {
+        \exp_not:N \str_if_eq:nnT
+          { \c_percent_str \c_percent_str Pages }
+          {##2}
+          {
+            \int_const:cn { c__graphics_ ##1 _pages_int } {##3}
+            \exp_not:N \ior_map_break:
+          }
+      }
+  }
 \msg_new:nnnn { graphics } { graphic-not-found }
   { Image~file~'#1'~not~found. }
   {
-    LaTeX~tried~to~open~graphic~file~'#1',
-    ~but~the~file~could~not~be~read.
+    LaTeX~tried~to~open~graphic~file~'#1',~
+    but~the~file~could~not~be~read.
   }
 \msg_new:nnnn { graphics } { pipe-failed }
   { Cannot~run~piped~system~commands. }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3opacity/l3opacity.sty	2022-04-11 20:14:43 UTC (rev 63007)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3opacity.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3opacity}{2022-02-05}{}
+\ProvidesExplPackage{l3opacity}{2022-04-10}{}
   {L3 Experimental opacity support}
 \cs_new_protected:Npn \opacity_select:n #1
   { \__opacity_select:nN {#1} \__opacity_backend_select:n }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3str/l3str-format.sty	2022-04-11 20:14:43 UTC (rev 63007)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3str-format.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3str-format}{2022-02-05}{}
+\ProvidesExplPackage{l3str-format}{2022-04-10}{}
   {L3 Experimental string formatting}
 \cs_generate_variant:Nn \use:nn { nf }
 \cs_generate_variant:Nn \use:nnn { fnf }

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/l3sys-shell/l3sys-shell.sty	2022-04-11 20:14:43 UTC (rev 63007)
@@ -20,7 +20,7 @@
 %% 
 %% File: l3sys-shell.dtx
 \RequirePackage{expl3}
-\ProvidesExplPackage{l3sys-shell}{2022-02-05}{}
+\ProvidesExplPackage{l3sys-shell}{2022-04-10}{}
   {L3 Experimental system shell functions}
 \scan_new:N \s__sys_stop
 \quark_new:N \q__sys_nil
@@ -176,6 +176,8 @@
         \seq_set_split:NnV #2 { \char_generate:nn { `\^^M } { 12 } }
           \exp_not:N \l__sys_tmp_tl
         \seq_pop_right:NN #2 \exp_not:N \l__sys_tmp_tl
+        \exp_not:N \tl_if_blank:eTF { \exp_not:N \seq_item:Nn #2 { 1 } }
+          { \seq_clear:N #2 }
       }
   }
 %% 

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xcoffins/xcoffins.sty	2022-04-11 20:14:43 UTC (rev 63007)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: xcoffins.dtx
-\ProvidesExplPackage{xcoffins}{2022-02-05}{}
+\ProvidesExplPackage{xcoffins}{2022-04-10}{}
   {L3 Experimental design level coffins}
 \keys_define:nn { coffin }
   {

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/l3galley.sty	2022-04-11 20:14:43 UTC (rev 63007)
@@ -32,7 +32,7 @@
       }%
     \endinput
   }
-\ProvidesExplPackage{l3galley}{2022-02-05}{}
+\ProvidesExplPackage{l3galley}{2022-04-10}{}
   {L3 Experimental galley code}
 \int_new:N \l__galley_tmp_int
 \seq_new:N \g__galley_tmpa_seq

Modified: trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3experimental/xgalley/xgalley.sty	2022-04-11 20:14:43 UTC (rev 63007)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: xgalley.dtx
-\ProvidesExplPackage{xgalley}{2022-02-05}{}
+\ProvidesExplPackage{xgalley}{2022-04-10}{}
   {L3 Experimental galley}
 \RequirePackage{xtemplate,l3galley}
 \clist_new:N \l__galley_tmpa_clist

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2022-04-11 20:14:43 UTC (rev 63007)
@@ -70,7 +70,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2022-02-24}%
+\def\ExplFileDate{2022-04-10}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -1256,6 +1256,7 @@
   \__kernel_primitive:NN \kcatcode              \tex_kcatcode:D
   \__kernel_primitive:NN \kuten                 \tex_kuten:D
   \__kernel_primitive:NN \lastnodechar          \tex_lastnodechar:D
+  \__kernel_primitive:NN \lastnodefont          \tex_lastnodefont:D
   \__kernel_primitive:NN \lastnodesubtype       \tex_lastnodesubtype:D
   \__kernel_primitive:NN \noautospacing         \tex_noautospacing:D
   \__kernel_primitive:NN \noautoxspacing        \tex_noautoxspacing:D
@@ -1262,6 +1263,7 @@
   \__kernel_primitive:NN \pagefistretch         \tex_pagefistretch:D
   \__kernel_primitive:NN \postbreakpenalty      \tex_postbreakpenalty:D
   \__kernel_primitive:NN \prebreakpenalty       \tex_prebreakpenalty:D
+  \__kernel_primitive:NN \ptexlineendmode       \tex_lineendmode:D
   \__kernel_primitive:NN \ptexminorversion      \tex_ptexminorversion:D
   \__kernel_primitive:NN \ptexrevision          \tex_ptexrevision:D
   \__kernel_primitive:NN \ptexversion           \tex_ptexversion:D
@@ -1277,6 +1279,8 @@
   \__kernel_primitive:NN \textbaselineshiftfactor
     \tex_textbaselineshiftfactor:D
   \__kernel_primitive:NN \tfont                 \tex_tfont:D
+  \__kernel_primitive:NN \toucs                 \tex_toucs:D
+  \__kernel_primitive:NN \ucs                   \tex_ucs:D
   \__kernel_primitive:NN \xkanjiskip            \tex_xkanjiskip:D
   \__kernel_primitive:NN \xspcode               \tex_xspcode:D
   \__kernel_primitive:NN \ybaselineshift        \tex_ybaselineshift:D
@@ -1289,7 +1293,6 @@
   \__kernel_primitive:NN \kchar                 \tex_kchar:D
   \__kernel_primitive:NN \kchardef              \tex_kchardef:D
   \__kernel_primitive:NN \kuten                 \tex_kuten:D
-  \__kernel_primitive:NN \ucs                   \tex_ucs:D
   \__kernel_primitive:NN \uptexrevision         \tex_uptexrevision:D
   \__kernel_primitive:NN \uptexversion          \tex_uptexversion:D
   \__kernel_primitive:NN \odelcode              \tex_odelcode:D
@@ -1301,6 +1304,7 @@
   \__kernel_primitive:NN \oradical              \tex_oradical:D
   \__kernel_primitive:NN \partokencontext       \tex_partokencontext:D
   \__kernel_primitive:NN \partokenname          \tex_partokenname:D
+  \__kernel_primitive:NN \showstream            \tex_showstream:D
   \__kernel_primitive:NN \tracingstacklevels    \tex_tracingstacklevels:D
 \tex_endgroup:D
 \tex_ifdefined:D \@@end
@@ -4943,6 +4947,8 @@
   { p , T , F , TF }
 \prg_new_eq_conditional:NNn \str_if_empty:c \tl_if_empty:c
   { p , T , F , TF }
+\prg_new_eq_conditional:NNn \str_if_empty:n \tl_if_empty:n
+  { p , T , F , TF }
 \cs_new_eq:NN \__str_if_eq:nn \tex_strcmp:D
 \prg_new_conditional:Npnn \str_compare:nNn #1#2#3 { p , T , F , TF }
   {
@@ -5012,6 +5018,10 @@
 \cs_new:Npn \__str_case:nnTF #1#2#3#4
   { \__str_case:nw {#1} #2 {#1} { } \s__str_mark {#3} \s__str_mark {#4} \s__str_stop }
 \cs_generate_variant:Nn \str_case:nn   { V , o , nV , nv }
+\cs_new_eq:NN \str_case:Nn   \str_case:Vn
+\cs_new_eq:NN \str_case:NnT  \str_case:VnT
+\cs_new_eq:NN \str_case:NnF  \str_case:VnF
+\cs_new_eq:NN \str_case:NnTF \str_case:VnTF
 \prg_generate_conditional_variant:Nnn \str_case:nn
   { V , o , nV , nv } { T , F , TF }
 \cs_new:Npn \__str_case:nw #1#2#3
@@ -5441,6 +5451,92 @@
       { \use:c { char_str_ #1 case:N } #2 }
     \__str_change_case_loop:nw {#1}
   }
+\if_int_compare:w 0
+  \cs_if_exist:NT \tex_XeTeXversion:D { 1 }
+  \cs_if_exist:NT \tex_luatexversion:D { 1 }
+  > 0 \exp_stop_f:
+\else:
+  \cs_gset:Npn \__str_change_case_char:nN #1#2
+    {
+      \__str_if_recursion_tail_stop_do:Nn #2
+        { \__str_change_case_end:wn }
+      \int_compare:nNnTF { `#2 } > { "80 }
+        {
+          \int_compare:nNnTF { `#2 } < { "E0 }
+            { \__str_change_case_char_UTFviii:nNN }
+            {
+              \int_compare:nNnTF { `#2 } < { "F0 }
+                { \__str_change_case_char_UTFviii:nNNN }
+                { \__str_change_case_char_UTFviii:nNNNN }
+            }
+          {#1} #2
+        }
+        {
+          \__str_change_case_output:fw
+            { \use:c { char_str_ #1 case:N } #2 }
+          \__str_change_case_loop:nw {#1}
+        }
+    }
+  \cs_new:Npn \__str_change_case_char_UTFviii:nNN #1#2#3
+    { \__str_change_case_char_UTFviii:nn {#1} {#2#3} }
+  \cs_new:Npn \__str_change_case_char_UTFviii:nNNN #1#2#3#4
+    { \__str_change_case_char_UTFviii:nn {#1} {#2#3#4} }
+  \cs_new:Npn \__str_change_case_char_UTFviii:nNNNN #1#2#3#4#5
+    { \__str_change_case_char_UTFviii:nn {#1} {#2#3#4#5} }
+  \cs_if_exist:NF \tex_pdftexversion:D
+    {
+      \cs_gset:Npn \__str_change_case_char_UTFviii:nNNN #1#2#3#4
+        {
+          \__str_change_case_output:nw {#2#3#4}
+          \__str_change_case_loop:nw {#1}
+        }
+      \cs_gset:Npn \__str_change_case_char_UTFviii:nNNNN #1#2#3#4#5
+        {
+          \__str_change_case_output:nw {#2#3#4#5}
+          \__str_change_case_loop:nw {#1}
+        }
+    }
+  \cs_new:Npn \__str_change_case_char_UTFviii:nn #1#2
+    {
+      \use:c { __str_change_case_char_UTFviii_ #1 :nn } {#1} {#2}
+    }
+  \cs_new:Npn \__str_change_case_char_UTFviii_upper:nn #1#2
+    {
+      \__str_change_case_output:fw
+        {
+          \cs_if_exist:cTF { c__kernel_ #1 case_ #2 _tl }
+            {
+              \__kernel_tl_to_str:w \exp_after:wN \exp_after:wN \exp_after:wN
+                { \cs:w c__kernel_ #1 case_ #2 _tl \cs_end: }
+            }
+            {#2}
+        }
+      \__str_change_case_loop:nw {#1}
+    }
+  \cs_new_eq:NN \__str_change_case_char_UTFviii_lower:nn
+    \__str_change_case_char_UTFviii_upper:nn
+  \cs_new:Npn \__str_change_case_char_UTFviii_fold:nn #1#2
+    {
+      \__str_change_case_output:fw
+        {
+          \cs_if_exist:cTF { c__kernel_ #1 case_ #2 _tl }
+            {
+              \__kernel_tl_to_str:w \exp_after:wN \exp_after:wN \exp_after:wN
+                { \cs:w c__kernel_ #1 case_ #2 _tl \cs_end: }
+            }
+            {
+              \cs_if_exist:cTF { c__kernel_lowercase_ #2 _tl }
+                {
+                  \__kernel_tl_to_str:w
+                    \exp_after:wN \exp_after:wN \exp_after:wN
+                    { \cs:w c__kernel_lowercase_ #2 _tl \cs_end: }
+                }
+                {#2}
+            }
+        }
+      \__str_change_case_loop:nw {#1}
+    }
+\fi:
 \str_const:Nx \c_ampersand_str   { \cs_to_str:N \& }
 \str_const:Nx \c_atsign_str      { \cs_to_str:N \@ }
 \str_const:Nx \c_backslash_str   { \cs_to_str:N \\ }
@@ -8598,26 +8694,22 @@
   }
 \cs_new:Npn \__char_generate_aux:w #1 ; #2 ;
   {
-    \if_int_compare:w #2 = 10 \exp_stop_f:
-      \if_int_compare:w #1 =  \c_zero_int
-        \msg_expandable_error:nn { char } { null-space }
-      \else:
-        \msg_expandable_error:nn { char } { space }
-      \fi:
+    \if_int_odd:w 0
+        \if_int_compare:w #2 < 1  \exp_stop_f: 1 \fi:
+        \if_int_compare:w #2 = 5  \exp_stop_f: 1 \fi:
+        \if_int_compare:w #2 = 9  \exp_stop_f: 1 \fi:
+        \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
+      \msg_expandable_error:nn { char }
+        { invalid-catcode }
     \else:
       \if_int_odd:w 0
-          \if_int_compare:w #2 < 1  \exp_stop_f: 1 \fi:
-          \if_int_compare:w #2 = 5  \exp_stop_f: 1 \fi:
-          \if_int_compare:w #2 = 9  \exp_stop_f: 1 \fi:
-          \if_int_compare:w #2 > 13 \exp_stop_f: 1 \fi: \exp_stop_f:
+        \if_int_compare:w #1 < \c_zero_int 1 \fi:
+        \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f:
         \msg_expandable_error:nn { char }
-          { invalid-catcode }
+          { out-of-range }
       \else:
-        \if_int_odd:w 0
-          \if_int_compare:w #1 < \c_zero_int 1 \fi:
-          \if_int_compare:w #1 > \c_max_char_int 1 \fi: \exp_stop_f:
-          \msg_expandable_error:nn { char }
-            { out-of-range }
+        \if_int_compare:w #2#1 = 100 \exp_stop_f:
+          \msg_expandable_error:nn { char } { null-space }
         \else:
           \__char_generate_aux:nnw {#1} {#2}
         \fi:
@@ -10533,9 +10625,7 @@
   { Cannot~generate~null~char~as~a~space. }
 \msg_new:nnn { char } { out-of-range }
   { Charcode~requested~out~of~engine~range. }
-\msg_new:nnn { char } { space }
-  { Cannot~generate~space~chars. }
-\msg_new:nnnn { ior } { quote-in-shell }
+\msg_new:nnnn { kernel } { quote-in-shell }
   { Quotes~in~shell~command~'#1'. }
   { Shell~commands~cannot~contain~quotes~("). }
 \msg_new:nnnn { keys } { no-property }
@@ -13036,6 +13126,8 @@
 \bool_new:N \l__keys_tmp_bool
 \tl_new:N \l__keys_tmpa_tl
 \tl_new:N \l__keys_tmpb_tl
+\bool_new:N \l__keys_precompile_bool
+\tl_new:N \l__keys_precompile_tl
 \prop_new:N \l_keys_usage_load_prop
 \prop_new:N \l_keys_usage_preamble_prop
 \scan_new:N \s__keys_nil
@@ -13043,6 +13135,13 @@
 \scan_new:N \s__keys_stop
 \quark_new:N \q__keys_no_value
 \__kernel_quark_new_conditional:Nn \__keys_quark_if_no_value:N { TF }
+\cs_new_protected:Npn \__keys_precompile:n #1
+  {
+    \bool_if:NTF \l__keys_precompile_bool
+      { \tl_put_right:Nn \l__keys_precompile_tl }
+      { \use:n }
+        {#1}
+  }
 \cs_new_protected:Npn \keys_define:nn
   { \__keys_define:onn \l__keys_module_str }
 \cs_new_protected:Npn \__keys_define:nnn #1#2#3
@@ -13146,7 +13245,7 @@
       { \exp_not:c { bool_ #2 set_ #3 :N } \exp_not:N #1 }
     \__keys_cmd_set:nx { \l_keys_path_str / false }
       { \exp_not:c { bool_ #2 set_ #4 :N } \exp_not:N #1 }
-    \__keys_cmd_set:nn { \l_keys_path_str / unknown }
+    \__keys_cmd_set_direct:nn { \l_keys_path_str / unknown }
       {
         \msg_error:nnx { keys } { boolean-values-only }
           \l_keys_key_str
@@ -13178,8 +13277,8 @@
   {
     \cs_set_nopar:cpn { \c__keys_type_root_str \l_keys_path_str }
       { choice }
-    \__keys_cmd_set:nn \l_keys_path_str { #1 {##1} }
-    \__keys_cmd_set:nn { \l_keys_path_str / unknown }
+    \__keys_cmd_set_direct:nn \l_keys_path_str { #1 {##1} }
+    \__keys_cmd_set_direct:nn { \l_keys_path_str / unknown }
       {
         \msg_error:nnxx { keys } { choice-unknown }
           \l_keys_path_str {##1}
@@ -13207,12 +13306,17 @@
       }
   }
 \cs_new_protected:Npn \__keys_cmd_set:nn #1#2
+  {  \__keys_cmd_set_direct:nn {#1} { \__keys_precompile:n {#2} } }
+\cs_generate_variant:Nn \__keys_cmd_set:nn { nx , Vn , Vo }
+\cs_new_protected:Npn \__keys_cmd_set_direct:nn #1#2
   { \cs_set_protected:cpn { \c__keys_code_root_str #1 } ##1 {#2} }
-\cs_generate_variant:Nn \__keys_cmd_set:nn { nx , Vn , Vo }
 \cs_new_protected:Npn \__keys_cs_set:NNpn #1#2#3#
   {
     \cs_set_protected:cpx { \c__keys_code_root_str \l_keys_path_str } ##1
-      { #1 \exp_not:N #2 \exp_not:n {#3} {##1} }
+      {
+        \__keys_precompile:n
+          { #1 \exp_not:N #2 \exp_not:n {#3} {##1} }
+      }
     \use_none:n
   }
 \cs_generate_variant:Nn \__keys_cs_set:NNpn { Nc }
@@ -13285,13 +13389,17 @@
   }
 \cs_new_protected:Npn \__keys_meta_make:n #1
   {
-    \__keys_cmd_set:Vo \l_keys_path_str
+    \exp_args:NVo \__keys_cmd_set_direct:nn \l_keys_path_str
       {
-        \exp_after:wN \keys_set:nn \exp_after:wN { \l__keys_module_str } {#1}
+        \exp_after:wN \keys_set:nn \exp_after:wN
+          { \l__keys_module_str } {#1}
       }
   }
 \cs_new_protected:Npn \__keys_meta_make:nn #1#2
-  { \__keys_cmd_set:Vn \l_keys_path_str { \keys_set:nn {#1} {#2} } }
+  {
+    \exp_args:NV \__keys_cmd_set_direct:nn
+      \l_keys_path_str { \keys_set:nn {#1} {#2} }
+  }
 \cs_new_protected:Npn \__keys_prop_put:Nn #1#2
   {
     \prop_if_exist:NF #1 { \prop_new:N #1 }
@@ -13748,6 +13856,14 @@
     \__keys_set:nn {#2} {#4}
     \tl_set:Nn \l__keys_selective_seq {#1}
   }
+\cs_new_protected:Npn \keys_precompile:nnN #1#2#3
+  {
+    \bool_set_true:N \l__keys_precompile_bool
+    \tl_clear:N \l__keys_precompile_tl
+    \keys_set:nn {#1} {#2}
+    \bool_set_false:N \l__keys_precompile_bool
+    \tl_set_eq:NN #3 \l__keys_precompile_tl
+  }
 \cs_new_protected:Npn \__keys_set_keyval:n #1
   {
     \bool_set_true:N \l__keys_no_value_bool
@@ -14088,10 +14204,13 @@
           {
             \exp_args:Nnf \msg_show_item_unbraced:nn { code }
               {
-                \exp_args:Nc \cs_replacement_spec:N
+                \exp_args:Ne \__keys_show:n
                   {
-                    \c__keys_code_root_str
-                    \__keys_trim_spaces:n { #2 / #3 }
+                    \exp_args:Nc \cs_replacement_spec:N
+                    {
+                      \c__keys_code_root_str
+                      \__keys_trim_spaces:n { #2 / #3 }
+                    }
                   }
               }
           }
@@ -14098,6 +14217,33 @@
       }
       { } { }
   }
+\cs_new:Npx \__keys_show:n #1
+  {
+    \exp_not:N \__keys_show:w
+      #1
+      \tl_to_str:n { \__keys_precompile:n }
+      #1
+      \tl_to_str:n { \__keys_precompile:n }
+      \exp_not:N \s__keys_stop
+  }
+\use:x
+  {
+    \cs_new:Npn \exp_not:N \__keys_show:w
+      ##1 \tl_to_str:n { \__keys_precompile:n }
+      ##2 \tl_to_str:n { \__keys_precompile:n }
+      ##3 \exp_not:N \s__keys_stop
+  }
+  {
+    \tl_if_blank:nTF {#2}
+      {#1}
+      { \__keys_show:Nw #2 \s__keys_stop }
+  }
+\use:x
+  {
+    \cs_new:Npn \exp_not:N \__keys_show:Nw ##1##2
+      \c_right_brace_str \exp_not:N \s__keys_stop
+  }
+  {#2}
 \msg_new:nnnn { keys } { bad-relative-key-path }
   { The~key~'#1'~is~not~inside~the~'#2'~path. }
   { The~key~'#1'~cannot~be~expressed~relative~to~path~'#2'. }
@@ -23296,33 +23442,30 @@
     32 \s__tl
     \__tl_analysis_b_loop:w #1 ;
   }
+\cs_new_protected:Npn \tl_analysis_map_inline:Nn #1
+  { \exp_args:No \tl_analysis_map_inline:nn #1 }
 \cs_new_protected:Npn \tl_analysis_map_inline:nn #1
   {
     \__tl_analysis:n {#1}
     \int_gincr:N \g__kernel_prg_map_int
-    \exp_args:Nc \__tl_analysis_map_inline_aux:Nn
+    \exp_args:Nc \__tl_analysis_map:Nn
       { __tl_analysis_map_inline_ \int_use:N \g__kernel_prg_map_int :wNw }
   }
-\cs_new_protected:Npn  \tl_analysis_map_inline:Nn #1
-  { \exp_args:No \tl_analysis_map_inline:nn #1 }
-\cs_new_protected:Npn \__tl_analysis_map_inline_aux:Nn #1#2
+\cs_new_protected:Npn \__tl_analysis_map:Nn #1#2
   {
-    \cs_gset_protected:Npn #1 ##1 \s__tl ##2 ##3 \s__tl
-      {
-        \use_none:n ##2
-        \__tl_analysis_map_inline_aux:nnn {##1} {##3} {##2}
-      }
-    \cs_gset_protected:Npn \__tl_analysis_map_inline_aux:nnn ##1##2##3
-      {
-        #2
-        #1
-      }
-    \exp_after:wN #1
+    \cs_gset_protected:Npn #1 ##1##2##3 {#2}
+    \exp_after:wN \__tl_analysis_map:NwNw \exp_after:wN #1
       \g__tl_analysis_result_tl
       \s__tl { ? \tl_map_break: } \s__tl
     \prg_break_point:Nn \tl_map_break:
       { \int_gdecr:N \g__kernel_prg_map_int }
   }
+\cs_new_protected:Npn \__tl_analysis_map:NwNw #1 #2 \s__tl #3 #4 \s__tl
+  {
+    \use_none:n #3
+    #1 {#2} {#4} {#3}
+    \__tl_analysis_map:NwNw #1
+  }
 \cs_new_protected:Npn \tl_analysis_show:N
   { \__tl_analysis_show:NNN \msg_show:nnxxxx \tl_show:N }
 \cs_new_protected:Npn \tl_analysis_log:N
@@ -31694,6 +31837,39 @@
 \tl_new:N \l_text_expand_exclude_tl
 \tl_set:Nn \l_text_expand_exclude_tl
   { \begin \cite \end \label \ref }
+\bool_lazy_and:nnT
+  { \str_if_eq_p:Vn \fmtname { LaTeX2e } }
+  { \tl_if_exist_p:N \@expl at finalise@setup@@ }
+  {
+    \tl_gput_right:Nn \@expl at finalise@setup@@
+      {
+        \tl_gput_right:Nn \@kernel at after@begindocument
+          {
+            \group_begin:
+              \cs_set_protected:Npn \__text_tmp:w #1
+                {
+                  \tl_clear:N \l_text_expand_exclude_tl
+                  \tl_map_inline:nn {#1}
+                    {
+                      \bool_lazy_any:nF
+                        {
+                          { \token_if_protected_macro_p:N ##1 }
+                          { \token_if_protected_long_macro_p:N ##1 }
+                          {
+                            \str_if_eq_p:ee
+                              { \cs_replacement_spec:N ##1 }
+                              { \exp_not:n { \protect ##1 } \c_space_tl }
+                          }
+                        }
+                        { \tl_put_right:Nn \l_text_expand_exclude_tl {##1} }
+                    }
+                }
+              \exp_args:NV \__text_tmp:w \l_text_expand_exclude_tl
+            \exp_args:NNNV \group_end:
+            \tl_set:Nn \l_text_expand_exclude_tl \l_text_expand_exclude_tl
+          }
+      }
+  }
 \tl_new:N \l__text_math_mode_tl
 \tex_chardef:D \c__text_chardef_space_token = `\  %
 \tex_mathchardef:D \c__text_mathchardef_space_token = `\  %
@@ -31946,7 +32122,7 @@
 \cs_new:Npx \__text_expand_cs:N #1
   {
     \exp_not:N \str_if_eq:nnTF {#1} { \exp_not:N \protect }
-      { \exp_not:N \__text_expand_protect:N }
+      { \exp_not:N \__text_expand_protect:w }
       {
         \bool_lazy_and:nnTF
           { \cs_if_exist_p:N \fmtname }
@@ -31955,8 +32131,23 @@
           { \exp_not:N \__text_expand_replace:N #1 }
       }
   }
+\cs_new:Npn \__text_expand_protect:w #1 \q__text_recursion_stop
+  {
+    \tl_if_head_is_N_type:nTF {#1}
+      { \__text_expand_protect:N }
+      {
+        \__text_expand_store:n { \protect }
+        \__text_expand_loop:w
+      }
+        #1 \q__text_recursion_stop
+  }
 \cs_new:Npn \__text_expand_protect:N #1
   {
+    \__text_if_recursion_tail_stop_do:Nn #1
+      {
+        \__text_expand_store:n { \protect }
+        \__text_expand_end:w
+      }
     \exp_args:Ne \__text_expand_protect:nN
       { \cs_to_str:N #1 } #1
   }
@@ -32466,10 +32657,10 @@
       { \__text_change_case_char_UTFviii:nnnn {#1} {#2} {#3} {#4#5#6#7} }
     \cs_new:Npn \__text_change_case_char_UTFviii:nnnn #1#2#3#4
       {
-        \cs_if_exist:cTF { c__text_ #1 case_ \tl_to_str:n {#4} _tl }
+        \cs_if_exist:cTF { c__kernel_ #1 case_ \tl_to_str:n {#4} _tl }
           {
             \__text_change_case_store:v
-              { c__text_ #1 case_ \tl_to_str:n {#4} _tl }
+              { c__kernel_ #1 case_ \tl_to_str:n {#4} _tl }
           }
           { \__text_change_case_store:n {#4} }
         \use:c { __text_change_case_char_next_ #2 :nn } {#2} {#3}
@@ -33094,7 +33285,7 @@
         {
           \tl_const:cx
             {
-              c__text_ #1 case_
+              c__kernel_ #1 case_
               \char_generate:nn {#2} { 12 }
               \char_generate:nn {#3} { 12 }
               _tl
@@ -33110,7 +33301,7 @@
         {
           \tl_const:cx
             {
-              c__text_lowercase_
+              c__kernel_lowercase_
               \char_generate:nn {#1} { 12 }
               \char_generate:nn {#2} { 12 }
               _tl
@@ -33338,7 +33529,7 @@
               {
                 \tl_const:cx
                   {
-                    c__text_ #3 case_
+                    c__kernel_ #3 case_
                     \char_generate:nn {##1} { 12 }
                     \char_generate:nn {##2} { 12 }
                     _tl
@@ -33375,7 +33566,7 @@
               {
                 \tl_const:cn
                   {
-                    c__text_ #3 case_
+                    c__kernel_ #3 case_
                     \char_generate:nn {##1} { 12 }
                     \char_generate:nn {##2} { 12 }
                     _tl
@@ -33393,7 +33584,7 @@
         {
           \tl_const:cx
             {
-              c__text_ #1 case_
+              c__kernel_ #1 case_
               \char_generate:nn {#2} { 12 }
               \char_generate:nn {#3} { 12 }
               \char_generate:nn {#4} { 12 }
@@ -33412,7 +33603,7 @@
         {
           \tl_const:cx
             {
-              c__text_lowercase_
+              c__kernel_lowercase_
               \char_generate:nn {#1} { 12 }
               \char_generate:nn {#2} { 12 }
               \char_generate:nn {#3} { 12 }
@@ -33535,7 +33726,7 @@
               {
                 \tl_const:cx
                   {
-                    c__text_ #3 case_
+                    c__kernel_ #3 case_
                     \char_generate:nn {##1} { 12 }
                     \char_generate:nn {##2} { 12 }
                     \char_generate:nn {##3} { 12 }
@@ -34658,7 +34849,7 @@
     \tl_if_in:nnTF {#1} { " }
       {
         \msg_error:nnx
-          { ior } { quote-in-shell } {#1}
+          { kernel } { quote-in-shell } {#1}
       }
       { \__kernel_ior_open:Nn #2 { |#1 } }
   }
@@ -34857,10 +35048,11 @@
 %% File: l3legacy.dtx
 \prg_new_conditional:Npnn \legacy_if:n #1 { p , T , F , TF }
   {
-    \exp_args:Nc \if_meaning:w { if#1 } \iftrue
+    \exp_after:wN \reverse_if:N
+      \cs:w if#1 \cs_end:
+      \prg_return_false:
+    \else:
       \prg_return_true:
-    \else:
-      \prg_return_false:
     \fi:
   }
 \cs_new_protected:Npn \legacy_if_set_true:n #1

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2022-04-11 20:14:43 UTC (rev 63007)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2022-02-24}%
+\def\ExplFileDate{2022-04-10}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2022-04-11 20:14:43 UTC (rev 63007)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2022-02-24}%
+\def\ExplFileDate{2022-04-10}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.lua	2022-04-11 20:14:43 UTC (rev 63007)
@@ -56,6 +56,7 @@
 local scan_keyword = token.scan_keyword
 local put_next     = token.put_next
 local token_create = token.create
+local token_new    = token.new
 local token_create_safe
 do
   local is_defined = token.is_defined
@@ -255,9 +256,9 @@
   end
 end
 -- File: l3names.dtx
-local minus_tok = token.new(string.byte'-', 12)
-local zero_tok = token.new(string.byte'0', 12)
-local one_tok = token.new(string.byte'1', 12)
+local minus_tok = token_new(string.byte'-', 12)
+local zero_tok = token_new(string.byte'0', 12)
+local one_tok = token_new(string.byte'1', 12)
 luacmd('tex_strcmp:D', function()
   local first = scan_string()
   local second = scan_string()
@@ -267,11 +268,16 @@
     put_next(first == second and zero_tok or one_tok)
   end
 end, 'global')
+local sprint = tex.sprint
 local cprint = tex.cprint
 luacmd('tex_Ucharcat:D', function()
   local charcode = scan_int()
   local catcode = scan_int()
-  cprint(catcode, utf8_char(charcode))
+  if catcode == 10 then
+    sprint(token_new(charcode, 10))
+  else
+    cprint(catcode, utf8_char(charcode))
+  end
 end, 'global')
 luacmd('tex_filesize:D', function()
   local size = filesize(scan_string())

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2022-04-11 20:14:43 UTC (rev 63007)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2022-02-24}%
+\def\ExplFileDate{2022-04-10}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2022-04-11 20:11:58 UTC (rev 63006)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2022-04-11 20:14:43 UTC (rev 63007)
@@ -624,7 +624,7 @@
         { \__kernel_debug_log:x { Defining~key~#1~\msg_line_context: } }
     }
     { }
-    { \__keys_cmd_set:nn }
+    { \__keys_cmd_set_direct:nn }
   \__kernel_patch:nnn
     { }
     {



More information about the tex-live-commits mailing list.