texlive[67026] Master/texmf-dist: l3kernel (5may23)

commits+karl at tug.org commits+karl at tug.org
Fri May 5 23:23:27 CEST 2023


Revision: 67026
          http://tug.org/svn/texlive?view=revision&revision=67026
Author:   karl
Date:     2023-05-05 23:23:26 +0200 (Fri, 05 May 2023)
Log Message:
-----------
l3kernel (5may23)

Modified Paths:
--------------
    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.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/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-map.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/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.sty
    trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/CHANGELOG.md	2023-05-05 21:23:26 UTC (rev 67026)
@@ -7,6 +7,44 @@
 
 ## [Unreleased]
 
+## [2023-05-05]
+
+### Added
+- `\bool_case:n(TF)` (renamed from  `\bool_case_true:n(TF)`)
+- `\flag_ensure_raised:n` (renamed from `\flag_raise_if_clear:n`)
+- `\iow_wrap_allow_break:` (renamed from `\iow_allow_break:`)
+
+### Changed
+- Moved to stable status:
+  - `\bool_(g)set_inverse:N`
+  - `\c_catcode_active_space_tl`
+  - `\c_sys_engine_version_str`
+  - `\exp_args_generate:n`
+  - `\fp_if_nan:n(TF)`
+  - `\ior_get_term:nN` and `\ior_str_get_term:nN`
+  - `\ior_shell_open:Nn`
+  - `\msg_show_item:n`, `\msg_show_item_unbraced:n`,
+    `\msg_show_item:nn`, `\msg_show_item_unbraced:nn`
+- Require random number support from engine
+
+### Removed
+- Experimental functions from `l3candidates`:
+  - `\bool_case_false:n(TF)`
+  - `\intarray_gset_rand:Nn(n)`
+  - `\intarray_to_clist:N`
+  - `\peek_catcode_collect_inline:Nn`, `\peek_charcode_collect_inline:Nn` and
+    `\peek_meaning_collect_inline:Nn`
+  - `\prop_rand_key_value:N`
+  - `\seq_set_from_function:Nnn` and `\seq_set_from_inline_x:Nnn`
+  - `\sys_if_rand_exist:(TF)`
+  - `\tl_range_braced:Nnn` and `\tl_range_unbraced:Nnn`
+- Experimental functions now renamed
+  - `\bool_case_true:n(TF)` (now `\bool_case:n(TF)`)
+  - `\flag_raise_if_clear:n` (now `\flag_raise_if_clear:n`)
+  - `\iow_allow_break:` (now `\iow_wrap_allow_break:`)
+- Experimental functions moved to kernel-internal:
+  - `\msg_log_eval:Nn` and `\msg_show_eval:Nn`
+
 ## [2023-04-20]
 
 ### Changed
@@ -1345,7 +1383,8 @@
 - Step functions have been added for dim variables,
   e.g. `\dim_step_inline:nnnn`
 
-[Unreleased]: https://github.com/latex3/latex3/compare/2023-04-20...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2023-05-05...HEAD
+[2023-05-05]: https://github.com/latex3/latex3/compare/2023-04-20...2023-05-05
 [2023-04-20]: https://github.com/latex3/latex3/compare/2023-04-19...2023-04-20
 [2023-04-19]: https://github.com/latex3/latex3/compare/2023-03-30...2023-04-19
 [2023-03-30]: https://github.com/latex3/latex3/compare/2023-02-22...2023-03-30

Modified: trunk/Master/texmf-dist/doc/latex/l3kernel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/README.md	2023-05-05 21:23:26 UTC (rev 67026)
@@ -1,7 +1,7 @@
 LaTeX3 Programming Conventions
 ==============================
 
-Release 2023-04-20
+Release 2023-05-05
 
 Overview
 --------
@@ -21,9 +21,6 @@
 very minor when compared to the scope of `l3kernel`. In particular, no functions
 will be removed, although some may be deprecated.
 
-Programmers making use of `l3kernel` are *strongly* encouraged to subscribe to
-the LaTeX-L mailing list (see below): announcements concerning the deprecation
-or modification of functions are made on the list.
 
 Requirements
 ------------
@@ -77,21 +74,6 @@
 The existence of the primitive `\Umathcode` is used as the marker for Unicode
 support.
 
-Discussion
-----------
-
-Discussion concerning the approach, suggestions for improvements,
-changes, additions, _etc._ should be addressed to the list
-[LaTeX-L](https://listserv.uni-heidelberg.de/cgi-bin/wa?A0=LATEX-L).
-
-You can subscribe to this list by sending mail to
-
-    listserv at urz.uni-heidelberg.de
-
-with the body containing
-
-    subscribe LATEX-L  <Your-First-Name> <Your-Second-Name>
-
 Issues
 ------
 
@@ -98,9 +80,6 @@
 The issue tracker for LaTeX3 is currently located
 [on GitHub](https://github.com/latex3/latex3/issues).
 
-Please report specific issues with LaTeX3 code there; more general
-discussion should be directed to the [LaTeX-L list](#Discussion).
-
 The LaTeX Project
 ------------------
 
@@ -108,8 +87,7 @@
 [The LaTeX Project](https://www.latex-project.org/latex3/).
 
 The development team can be contacted
-by e-mail: <latex-team at latex-project.org>; for general LaTeX3 discussion
-the [LaTeX-L list](#Discussion) should be used.
+by e-mail: <latex-team at latex-project.org>.
 
 -----
 

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	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/interface3.tex	2023-05-05 21:23:26 UTC (rev 67026)
@@ -62,7 +62,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2023-04-20}
+\date{Released 2023-05-05}
 
 \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.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	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3styleguide.tex	2023-05-05 21:23:26 UTC (rev 67026)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2023-04-20}
+\date{Released 2023-05-05}
 
 \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	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3syntax-changes.tex	2023-05-05 21:23:26 UTC (rev 67026)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2023-04-20}
+\date{Released 2023-05-05}
 
 \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	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/l3term-glossary.tex	2023-05-05 21:23:26 UTC (rev 67026)
@@ -32,7 +32,7 @@
         {latex-team at latex-project.org}%
     }%
 }
-\date{Released 2023-04-20}
+\date{Released 2023-05-05}
 
 \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	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/doc/latex/l3kernel/source3.tex	2023-05-05 21:23:26 UTC (rev 67026)
@@ -53,7 +53,7 @@
          {latex-team at latex-project.org}%
    }%
 }
-\date{Released 2023-04-20}
+\date{Released 2023-05-05}
 
 \pagenumbering{roman}
 \maketitle

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/expl3.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -24,7 +24,7 @@
 %
 %<*driver|generic|package|2ekernel>
 %</driver|generic|package|2ekernel>
-\def\ExplFileDate{2023-04-20}%
+\def\ExplFileDate{2023-05-05}%
 %<*driver>
 \documentclass[full]{l3doc}
 \usepackage{graphicx}
@@ -51,7 +51,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3box.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -84,221 +84,6 @@
 % into the kernel. However, real use sometimes leads to better ideas, so functions from this module are
 % \textbf{not necessarily stable} and we may have to adjust them!
 %
-% \section{Additions to \pkg{l3expan}}
-%
-% \begin{function}[added = 2018-04-04, updated = 2019-02-08]
-%   {\exp_args_generate:n}
-%   \begin{syntax}
-%     \cs{exp_args_generate:n} \Arg{variant argument specifiers}
-%   \end{syntax}
-%   Defines \cs[no-index]{exp_args:N\meta{variant}} functions for each
-%   \meta{variant} given in the comma list \Arg{variant argument
-%   specifiers}.  Each \meta{variant} should consist of the letters |N|,
-%   |c|, |n|, |V|, |v|, |o|, |f|, |e|, |x|, |p| and the resulting function is
-%   protected if the letter |x| appears in the \meta{variant}.  This is
-%   only useful for cases where \cs{cs_generate_variant:Nn} is not
-%   applicable.
-% \end{function}
-%
-% \section{Additions to \pkg{l3fp}}
-%
-% \begin{function}[pTF, added = 2019-08-25]{\fp_if_nan:n}
-%   \begin{syntax}
-%     \cs{fp_if_nan:n} \Arg{fp expr}
-%   \end{syntax}
-%   Evaluates the \meta{fp expr} and tests whether the result is exactly
-%   \nan{}.  The test returns \texttt{false} for any other result, even
-%   a tuple containing \nan{}.
-% \end{function}
-%
-% \section{Additions to \pkg{l3file}}
-%
-% \begin{function}[added = 2018-12-29]{\iow_allow_break:}
-%   \begin{syntax}
-%     \cs{iow_allow_break:}
-%   \end{syntax}
-%   In the first argument of \cs{iow_wrap:nnnN} (for instance in
-%   messages), inserts a break-point that allows a line break.
-%   In other words this is a zero-width breaking space.
-% \end{function}
-%
-% \begin{function}[added = 2019-03-23]{\ior_get_term:nN, \ior_str_get_term:nN}
-%   \begin{syntax}
-%     \cs{ior_get_term:nN} \meta{prompt} \meta{token list variable}
-%   \end{syntax}
-%   Function that reads one or more lines (until an equal number of left
-%   and right braces are found) from the terminal and stores
-%   the result locally in the \meta{token list} variable. Tokenization
-%   occurs as described for \cs{ior_get:NN} or \cs{ior_str_get:NN}, respectively.
-%   When the \meta{prompt}
-%   is empty, \TeX{} will wait for input without any other indication:
-%   typically the programmer will have provided a suitable text using
-%   e.g.~\cs{iow_term:n}. Where the \meta{prompt} is given, it will appear
-%   in the terminal followed by an |=|, e.g.
-%   \begin{verbatim}
-%     prompt=
-%   \end{verbatim}
-% \end{function}
-%
-% \begin{function}[added = 2019-05-08]{\ior_shell_open:Nn}
-%   \begin{syntax}
-%     \cs{ior_shell_open:Nn} \meta{stream} \Arg{shell~command}
-%   \end{syntax}
-%   Opens the \emph{pseudo}-file created by the output of the
-%   \meta{shell command} for reading using \meta{stream} as the
-%   control sequence for access. If the \meta{stream} was already
-%   open it is closed before the new operation begins. The
-%   \meta{stream} is available for access immediately and will remain
-%   allocated to \meta{shell command} until a \cs{ior_close:N} instruction
-%   is given or the \TeX{} run ends.
-%   If piped system calls are disabled an error is raised.
-%
-%   For details of handling of the \meta{shell command}, see
-%   \cs{sys_get_shell:nnNTF}.
-% \end{function}
-%
-% \section{Additions to \pkg{l3flag}}
-%
-% \begin{function}[EXP, added = 2018-04-02]{\flag_raise_if_clear:n}
-%   \begin{syntax}
-%     \cs{flag_raise_if_clear:n} \Arg{flag name}
-%   \end{syntax}
-%   Ensures the \meta{flag} is raised by making its height at least~$1$,
-%   locally.
-% \end{function}
-%
-% \section{Additions to \pkg{l3intarray}}
-%
-% \begin{function}[added = 2018-05-05]
-%   {
-%     \intarray_gset_rand:Nnn, \intarray_gset_rand:cnn,
-%     \intarray_gset_rand:Nn, \intarray_gset_rand:cn
-%   }
-%   \begin{syntax}
-%     \cs{intarray_gset_rand:Nnn} \meta{intarray~var} \Arg{minimum} \Arg{maximum}
-%     \cs{intarray_gset_rand:Nn} \meta{intarray~var} \Arg{maximum}
-%   \end{syntax}
-%   Evaluates the integer expressions \meta{minimum} and \meta{maximum}
-%   then sets each entry (independently) of the \meta{integer array
-%   variable} to a pseudo-random number between the two (with bounds
-%   included).  If the absolute value of either bound is bigger than
-%   $2^{30}-1$, an error occurs.  Entries are generated in the same way
-%   as repeated calls to \cs{int_rand:nn} or \cs{int_rand:n}
-%   respectively, in particular for the second function the
-%   \meta{minimum} is $1$.
-%   Assignments are always global.
-%   This is not available in older versions of \XeTeX{}.
-% \end{function}
-%
-% \begin{function}[added = 2018-05-04, rEXP]{\intarray_to_clist:N}
-%   \begin{syntax}
-%     \cs{intarray_to_clist:N} \meta{intarray~var}
-%   \end{syntax}
-%   Converts the \meta{intarray} to integer denotations separated by
-%   commas.  All tokens have category code other.  If the
-%   \meta{intarray} has no entry the result is empty; otherwise the
-%   result has one fewer comma than the number of items.
-% \end{function}
-%
-% \section{Additions to \pkg{l3msg}}
-%
-% \begin{function}[added = 2017-12-04]{\msg_show_eval:Nn, \msg_log_eval:Nn}
-%   \begin{syntax}
-%     \cs{msg_show_eval:Nn} \meta{function} \Arg{expression}
-%   \end{syntax}
-%   Shows or logs the \meta{expression} (turned into a string), an equal
-%   sign, and the result of applying the \meta{function} to the
-%   \Arg{expression} (with \texttt{f}-expansion).  For instance, if the
-%   \meta{function} is \cs{int_eval:n} and the \meta{expression} is
-%   |1+2| then this logs |> 1+2=3.|
-% \end{function}
-%
-% \begin{function}[EXP, added = 2017-12-04]
-%   {\msg_show_item:n, \msg_show_item_unbraced:n, \msg_show_item:nn, \msg_show_item_unbraced:nn}
-%   \begin{syntax}
-%     \cs{seq_map_function:NN} \meta{seq} \cs{msg_show_item:n}
-%     \cs{prop_map_function:NN} \meta{prop} \cs{msg_show_item:nn}
-%   \end{syntax}
-%   Used in the text of messages for \cs{msg_show:nnxxxx} to show or log
-%   a list of items or key--value pairs.  The one-argument functions are
-%   used for sequences, clist or token lists and the others for property
-%   lists.  These functions turn their arguments to strings.
-% \end{function}
-%
-% \section{Additions to \pkg{l3prg}}
-%
-% \begin{function}[added = 2018-05-10]
-%   {
-%     \bool_set_inverse:N , \bool_set_inverse:c ,
-%     \bool_gset_inverse:N, \bool_gset_inverse:c
-%   }
-%   \begin{syntax}
-%     \cs{bool_set_inverse:N} \meta{boolean}
-%   \end{syntax}
-%   Toggles the \meta{boolean} from \texttt{true} to \texttt{false} and
-%   conversely: sets it to the inverse of its current value.
-% \end{function}
-%
-% \begin{function}[added = 2019-02-10, EXP, noTF]
-%   {\bool_case_true:n, \bool_case_false:n}
-%   \begin{syntax}
-%     \cs{bool_case_true:nTF} \\
-%     ~~|{| \\
-%     ~~~~\Arg{boolexpr case_1} \Arg{code case_1} \\
-%     ~~~~\Arg{boolexpr case_2} \Arg{code case_2} \\
-%     ~~~~\ldots \\
-%     ~~~~\Arg{boolexpr case_n} \Arg{code case_n} \\
-%     ~~|}| \\
-%     ~~\Arg{true code}
-%     ~~\Arg{false code}
-%   \end{syntax}
-%   Evaluates in turn each of the \meta{boolean expression cases} until
-%   the first one that evaluates to \texttt{true} or to \texttt{false},
-%   for \cs{bool_case_true:n} and \cs{bool_case_false:n}, respectively.
-%   The \meta{code} associated to this first case is left in the input
-%   stream, followed by the \meta{true code}, and other cases are
-%   discarded.  If none of the cases match then only the \meta{false
-%   code} is inserted. The functions \cs{bool_case_true:n} and
-%   \cs{bool_case_false:n}, which do nothing if there is no match, are
-%   also available. For example
-%   \begin{verbatim}
-%     \bool_case_true:nF
-%       {
-%         { \dim_compare_p:n { \l__mypkg_wd_dim <= 10pt } }
-%             { Fits }
-%         { \int_compare_p:n { \l__mypkg_total_int >= 10 } }
-%             { Many }
-%         { \l__mypkg_special_bool }
-%             { Special }
-%       }
-%       { No idea! }
-%   \end{verbatim}
-%   leaves \enquote{\texttt{Fits}} or \enquote{\texttt{Many}} or
-%   \enquote{\texttt{Special}} or \enquote{\texttt{No idea!}} in the
-%   input stream, in a way similar to some other language's
-%   \enquote{\texttt{if} \ldots\ \texttt{elseif} \ldots\ \texttt{elseif} \ldots\
-%   \texttt{else} \ldots}.
-% \end{function}
-%
-% \section{Additions to \pkg{l3prop}}
-%
-% \begin{function}[EXP, added = 2016-12-06]
-%   {\prop_rand_key_value:N, \prop_rand_key_value:c}
-%   \begin{syntax}
-%     \cs{prop_rand_key_value:N} \meta{property list}
-%   \end{syntax}
-%   Selects a pseudo-random key--value pair from the \meta{property list}
-%   and returns \Arg{key} and \Arg{value}.  If the \meta{property list} is
-%   empty the result is empty.
-%   This is not available in older versions of \XeTeX{}.
-%   \begin{texnote}
-%     The result is returned within the \tn{unexpanded}
-%     primitive (\cs{exp_not:n}), which means that the \meta{value}
-%     does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
-%   \end{texnote}
-% \end{function}
-%
 % \section{Additions to \pkg{l3seq}}
 %
 % \begin{function}[rEXP]
@@ -334,44 +119,6 @@
 %   \end{texnote}
 % \end{function}
 %
-% \begin{function}[added = 2018-04-06]
-%   {\seq_set_from_function:NnN, \seq_gset_from_function:NnN}
-%   \begin{syntax}
-%     \cs{seq_set_from_function:NnN} \meta{seq~var} \Arg{loop~code} \meta{function}
-%   \end{syntax}
-%   Sets the \meta{seq~var} equal to a sequence whose items are obtained
-%   by \texttt{x}-expanding \meta{loop~code} \meta{function}.  This
-%   expansion must result in successive calls to the \meta{function}
-%   with no nonexpandable tokens in between.  More precisely the
-%   \meta{function} is replaced by a wrapper function that inserts the
-%   appropriate separators between items in the sequence.  The
-%   \meta{loop~code} must be expandable; it can be for example
-%   \cs{tl_map_function:NN} \meta{tl~var} or \cs{clist_map_function:nN}
-%   \Arg{clist} or \cs{int_step_function:nnnN} \Arg{initial value}
-%   \Arg{step} \Arg{final value}.
-% \end{function}
-%
-% \begin{function}[added = 2018-04-06]
-%   {\seq_set_from_inline_x:Nnn, \seq_gset_from_inline_x:Nnn}
-%   \begin{syntax}
-%     \cs{seq_set_from_inline_x:Nnn} \meta{seq~var} \Arg{loop~code} \Arg{inline~code}
-%   \end{syntax}
-%   Sets the \meta{seq~var} equal to a sequence whose items are obtained
-%   by \texttt{x}-expanding \meta{loop~code} applied to a
-%   \meta{function} derived from the \meta{inline~code}.  A
-%   \meta{function} is defined, that takes one argument,
-%   \texttt{x}-expands the \meta{inline~code} with that argument
-%   as~|#1|, then adds appropriate separators to turn the result into an
-%   item of the sequence.  The \texttt{x}-expansion of \meta{loop~code}
-%   \meta{function} must result in successive calls to the
-%   \meta{function} with no nonexpandable tokens in between.  The
-%   \meta{loop~code} must be expandable; it can be for example
-%   \cs{tl_map_function:NN} \meta{tl~var} or \cs{clist_map_function:nN}
-%   \Arg{clist} or \cs{int_step_function:nnnN} \Arg{initial value}
-%   \Arg{step} \Arg{final value}, but not the analogous \enquote{inline}
-%   mappings.
-% \end{function}
-%
 % \begin{function}[added = 2021-04-29, noTF]
 %   {\seq_set_item:Nnn, \seq_set_item:cnn, \seq_gset_item:Nnn, \seq_gset_item:cnn}
 %   \begin{syntax}
@@ -408,87 +155,8 @@
 %   assigned locally for |pop| or globally for |gpop| functions.
 % \end{function}
 %
-% \section{Additions to \pkg{l3sys}}
-%
-% \begin{variable}[added = 2018-05-02]{\c_sys_engine_version_str}
-%   The version string of the current engine, in the same form as
-%   given in the banner issued when running a job. For \pdfTeX{}
-%   and \LuaTeX{} this is of the form
-%   \begin{quote}
-%     \meta{major}.\meta{minor}.\meta{revision}
-%   \end{quote}
-%   For \XeTeX{}, the form is
-%   \begin{quote}
-%     \meta{major}.\meta{minor}
-%   \end{quote}
-%   For \pTeX{} and \upTeX{}, only releases since \TeX{} Live 2018
-%   make the data available, and the form is more complex, as it comprises
-%   the \pTeX{} version, the \upTeX{} version and the e-\pTeX{} version.
-%   \begin{quote}
-%     p\meta{major}.\meta{minor}.\meta{revision}-u\meta{major}.\meta{minor}^^A
-%     -\meta{epTeX}
-%   \end{quote}
-%   where the |u| part is only present for \upTeX{}.
-% \end{variable}
-%
-% \begin{function}[added = 2017-05-27, EXP, pTF]{\sys_if_rand_exist:}
-%   \begin{syntax}
-%     \cs{sys_if_rand_exist_p:}
-%     \cs{sys_if_rand_exist:TF} \Arg{true code} \Arg{false code}
-%   \end{syntax}
-%   Tests if the engine has a pseudo-random number generator.  Currently
-%   this is the case in \pdfTeX{}, \LuaTeX{}, \pTeX{}, \upTeX{} and recent
-%   releases of \XeTeX{}.
-% \end{function}
-%
 % \section{Additions to \pkg{l3tl}}
 %
-% \begin{function}[EXP, added = 2017-07-15]
-%   {
-%     \tl_range_braced:Nnn, \tl_range_braced:cnn, \tl_range_braced:nnn,
-%     \tl_range_unbraced:Nnn, \tl_range_unbraced:cnn, \tl_range_unbraced:nnn
-%   }
-%   \begin{syntax}
-%     \cs{tl_range_braced:Nnn} \meta{tl~var} \Arg{start index} \Arg{end index}
-%     \cs{tl_range_braced:nnn} \Arg{token list} \Arg{start index} \Arg{end index}
-%     \cs{tl_range_unbraced:Nnn} \meta{tl~var} \Arg{start index} \Arg{end index}
-%     \cs{tl_range_unbraced:nnn} \Arg{token list} \Arg{start index} \Arg{end index}
-%   \end{syntax}
-%   Leaves in the input stream the items from the \meta{start index} to
-%   the \meta{end index} inclusive, using the same indexing as
-%   \cs{tl_range:nnn}.  Spaces are ignored.  Regardless of whether items
-%   appear with or without braces in the \meta{token list}, the
-%   \cs{tl_range_braced:nnn} function wraps each item in braces, while
-%   \cs{tl_range_unbraced:nnn} does not (overall it removes an outer set
-%   of braces).  For instance,
-%   \begin{verbatim}
-%     \iow_term:x { \tl_range_braced:nnn { abcd~{e{}}f } { 2 } { 5 } }
-%     \iow_term:x { \tl_range_braced:nnn { abcd~{e{}}f } { -4 } { -1 } }
-%     \iow_term:x { \tl_range_braced:nnn { abcd~{e{}}f } { -2 } { -1 } }
-%     \iow_term:x { \tl_range_braced:nnn { abcd~{e{}}f } { 0 } { -1 } }
-%   \end{verbatim}
-%   prints \verb*|{b}{c}{d}{e{}}|, \verb*|{c}{d}{e{}}{f}|, \verb*|{e{}}{f}|, and an empty
-%   line to the terminal, while
-%   \begin{verbatim}
-%     \iow_term:x { \tl_range_unbraced:nnn { abcd~{e{}}f } { 2 } { 5 } }
-%     \iow_term:x { \tl_range_unbraced:nnn { abcd~{e{}}f } { -4 } { -1 } }
-%     \iow_term:x { \tl_range_unbraced:nnn { abcd~{e{}}f } { -2 } { -1 } }
-%     \iow_term:x { \tl_range_unbraced:nnn { abcd~{e{}}f } { 0 } { -1 } }
-%   \end{verbatim}
-%   prints \verb*|bcde{}|, \verb*|cde{}f|, \verb*|e{}f|, and an empty
-%   line to the terminal.  Because braces are removed, the result of
-%   \cs{tl_range_unbraced:nnn} may have a different number of items as
-%   for \cs{tl_range:nnn} or \cs{tl_range_braced:nnn}.  In cases where
-%   preserving spaces is important, consider the slower function
-%   \cs{tl_range:nnn}.
-%   \begin{texnote}
-%     The result is returned within the \tn{unexpanded}
-%     primitive (\cs{exp_not:n}), which means that the \meta{item}
-%     does not expand further when appearing in an \texttt{x}-type
-%     or \texttt{e}-type argument expansion.
-%   \end{texnote}
-% \end{function}
-%
 % \begin{function}[added = 2018-04-01]{\tl_build_begin:N, \tl_build_gbegin:N}
 %   \begin{syntax}
 %     \cs{tl_build_begin:N} \meta{tl~var}
@@ -557,46 +225,6 @@
 %   \cs[no-index]{tl_build_\ldots{}} functions.
 % \end{function}
 %
-% \section{Additions to \pkg{l3token}}
-%
-% \begin{variable}[added = 2017-08-07]{\c_catcode_active_space_tl}
-%   Token list containing one character with category code $13$,
-%   (\enquote{active}), and character code $32$ (space).
-% \end{variable}
-%
-% \begin{function}[added = 2018-09-23]
-%   {
-%     \peek_catcode_collect_inline:Nn,
-%     \peek_charcode_collect_inline:Nn,
-%     \peek_meaning_collect_inline:Nn
-%   }
-%   \begin{syntax}
-%     \cs{peek_catcode_collect_inline:Nn} \meta{test token} \Arg{inline code}
-%     \cs{peek_charcode_collect_inline:Nn} \meta{test token} \Arg{inline code}
-%     \cs{peek_meaning_collect_inline:Nn} \meta{test token} \Arg{inline code}
-%   \end{syntax}
-%   Collects and removes tokens from the input stream until finding a
-%   token that does not match the \meta{test token} (as defined by the
-%   test \cs{token_if_eq_catcode:NNTF} or \cs{token_if_eq_charcode:NNTF}
-%   or \cs{token_if_eq_meaning:NNTF}).  The collected tokens are passed
-%   to the \meta{inline code} as~|#1|.  When begin-group or end-group
-%   tokens (usually |{| or~|}|) are collected they are replaced by
-%   implicit \cs{c_group_begin_token} and \cs{c_group_end_token}, and
-%   when spaces (including \cs{c_space_token}) are collected they are
-%   replaced by explicit spaces.
-%
-%   For example the following code prints ``Hello'' to the terminal and
-%   leave ``, world!'' in the input stream.
-% \begin{verbatim}
-% \peek_catcode_collect_inline:Nn A { \iow_term:n {#1} } Hello,~world!
-% \end{verbatim}
-%   Another example is that the following code tests if the next token is |*|, ignoring intervening spaces, but putting them back using |#1| if there is no~|*|.
-% \begin{verbatim}
-% \peek_meaning_collect_inline:Nn \c_space_token
-%   { \peek_charcode:NTF * { star } { no~star #1 } }
-% \end{verbatim}
-% \end{function}
-%
 % \end{documentation}
 %
 % \begin{implementation}
@@ -607,202 +235,6 @@
 %<*package>
 %    \end{macrocode}
 %
-% \subsection{Additions to \pkg{l3flag}}
-%
-%    \begin{macrocode}
-%<@@=flag>
-%    \end{macrocode}
-%
-% \begin{macro}[EXP]{\flag_raise_if_clear:n}
-%   It might be faster to just call the \enquote{trap} function in all
-%   cases but conceptually the function name suggests we should only run
-%   it if the flag is zero in case the \enquote{trap} made customizable
-%   in the future.
-%    \begin{macrocode}
-\cs_new:Npn \flag_raise_if_clear:n #1
-  {
-    \if_cs_exist:w flag~#1~0 \cs_end:
-    \else:
-      \cs:w flag~#1 \cs_end: 0 ;
-    \fi:
-  }
-%    \end{macrocode}
-% \end{macro}
-%
-% \subsection{Additions to \pkg{l3msg}}
-%
-%    \begin{macrocode}
-%<@@=msg>
-%    \end{macrocode}
-%
-% \begin{macro}{\msg_show_eval:Nn, \msg_log_eval:Nn, \@@_show_eval:nnN}
-%   A short-hand used for \cs{int_show:n} and similar functions that
-%   passes to \cs{tl_show:n} the result of applying |#1| (a
-%   function such as \cs{int_eval:n}) to the expression |#2|.  The use of
-%   \texttt{f}-expansion ensures that |#1| is expanded in the scope in which the
-%   show command is called, rather than in the group created by
-%   \cs{iow_wrap:nnnN}.  This is only important for expressions
-%   involving the \tn{currentgrouplevel} or \tn{currentgrouptype}.
-%   On the other hand we want the expression to be converted to a string
-%   with the usual escape character, hence within the wrapping code.
-%    \begin{macrocode}
-\cs_new_protected:Npn \msg_show_eval:Nn #1#2
-  { \exp_args:Nf \@@_show_eval:nnN { #1 {#2} } {#2} \tl_show:n }
-\cs_new_protected:Npn \msg_log_eval:Nn #1#2
-  { \exp_args:Nf \@@_show_eval:nnN { #1 {#2} } {#2} \tl_log:n }
-\cs_new_protected:Npn \@@_show_eval:nnN #1#2#3 { #3 { #2 = #1 } }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\msg_show_item:n}
-% \begin{macro}[EXP]{\msg_show_item_unbraced:n}
-% \begin{macro}[EXP]{\msg_show_item:nn}
-% \begin{macro}[EXP]{\msg_show_item_unbraced:nn}
-%   Each item in the variable is formatted using one of the following
-%   functions.  We cannot use |\\| and so on because these short-hands
-%   cannot be used inside the arguments of messages, only when defining
-%   the messages.
-%    \begin{macrocode}
-\cs_new:Npx \msg_show_item:n #1
-  { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n { {#1} } }
-\cs_new:Npx \msg_show_item_unbraced:n #1
-  { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n {#1} }
-\cs_new:Npx \msg_show_item:nn #1#2
-  {
-    \iow_newline: > \use:nn { ~ } { ~ }
-    \exp_not:N \tl_to_str:n { {#1} }
-    \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
-    \exp_not:N \tl_to_str:n { {#2} }
-  }
-\cs_new:Npx \msg_show_item_unbraced:nn #1#2
-  {
-    \iow_newline: > \use:nn { ~ } { ~ }
-    \exp_not:N \tl_to_str:n {#1}
-    \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
-    \exp_not:N \tl_to_str:n {#2}
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Additions to \pkg{l3prg}}
-%
-%    \begin{macrocode}
-%<@@=bool>
-%    \end{macrocode}
-%
-% \begin{macro}[added = 2018-05-10]
-%   {\bool_set_inverse:N, \bool_set_inverse:c, \bool_gset_inverse:N, \bool_gset_inverse:c}
-%   Set to \texttt{false} or \texttt{true} locally or globally.
-%    \begin{macrocode}
-\cs_new_protected:Npn \bool_set_inverse:N #1
-  { \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1 }
-\cs_generate_variant:Nn \bool_set_inverse:N { c }
-\cs_new_protected:Npn \bool_gset_inverse:N #1
-  { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 }
-\cs_generate_variant:Nn \bool_gset_inverse:N { c }
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{variable}{\s_@@_mark,\s_@@_stop}
-%   Internal scan marks.
-%    \begin{macrocode}
-\scan_new:N \s_@@_mark
-\scan_new:N \s_@@_stop
-%    \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[EXP, noTF]{\bool_case_true:n, \bool_case_false:n}
-% \begin{macro}{\@@_case:NnTF}
-% \begin{macro}{\@@_case_true:w, \@@_case_false:w, \@@_case_end:nw}
-%   For boolean cases the overall idea is the same as for
-%   \cs{tl_case:nnTF} as described in \pkg{l3tl}.
-%    \begin{macrocode}
-\cs_new:Npn \bool_case_true:nTF
-  { \exp:w \@@_case:NnTF \c_true_bool }
-\cs_new:Npn \bool_case_true:nT #1#2
-  { \exp:w \@@_case:NnTF \c_true_bool {#1} {#2} { } }
-\cs_new:Npn \bool_case_true:nF #1
-  { \exp:w \@@_case:NnTF \c_true_bool {#1} { } }
-\cs_new:Npn \bool_case_true:n #1
-  { \exp:w \@@_case:NnTF \c_true_bool {#1} { } { } }
-\cs_new:Npn \bool_case_false:nTF
-  { \exp:w \@@_case:NnTF \c_false_bool }
-\cs_new:Npn \bool_case_false:nT #1#2
-  { \exp:w \@@_case:NnTF \c_false_bool {#1} {#2} { } }
-\cs_new:Npn \bool_case_false:nF #1
-  { \exp:w \@@_case:NnTF \c_false_bool {#1} { } }
-\cs_new:Npn \bool_case_false:n #1
-  { \exp:w \@@_case:NnTF \c_false_bool {#1} { } { } }
-\cs_new:Npn \@@_case:NnTF #1#2#3#4
-  {
-    \bool_if:NTF #1 \@@_case_true:w \@@_case_false:w
-    #2 #1 { } \s_@@_mark {#3} \s_@@_mark {#4} \s_@@_stop
-  }
-\cs_new:Npn \@@_case_true:w #1#2
-  {
-    \bool_if:nTF {#1}
-      { \@@_case_end:nw {#2} }
-      { \@@_case_true:w }
-  }
-\cs_new:Npn \@@_case_false:w #1#2
-  {
-    \bool_if:nTF {#1}
-      { \@@_case_false:w }
-      { \@@_case_end:nw {#2} }
-  }
-\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
-  { \exp_end: #1 #4 }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Additions to \pkg{l3prop}}
-%
-%    \begin{macrocode}
-%<@@=prop>
-%    \end{macrocode}
-%
-% \begin{macro}[EXP]{\@@_use_i_delimit_by_s_stop:nw}
-%   Functions to gobble up to a scan mark.
-%    \begin{macrocode}
-\cs_new:Npn \@@_use_i_delimit_by_s_stop:nw #1 #2 \s_@@_stop {#1}
-%    \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[EXP]
-%   {\prop_rand_key_value:N, \prop_rand_key_value:c}
-% \begin{macro}[EXP]{\@@_rand_item:w}
-%   Contrarily to |clist|, |seq| and |tl|, there is no function to get
-%   an item of a |prop| given an integer between $1$ and the number of
-%   items, so we write the appropriate code.  There is no bounds
-%   checking because \cs{int_rand:nn} is always within bounds.  The
-%   initial \cs{int_value:w} is stopped by the first \cs{s_@@} in~|#1|.
-%    \begin{macrocode}
-\cs_new:Npn \prop_rand_key_value:N #1
-  {
-    \prop_if_empty:NF #1
-      {
-        \exp_after:wN \@@_rand_item:w
-        \int_value:w \int_rand:nn { 1 } { \prop_count:N #1 }
-        #1 \s_@@_stop
-      }
-  }
-\cs_generate_variant:Nn \prop_rand_key_value:N { c }
-\cs_new:Npn \@@_rand_item:w #1 \s_@@ \@@_pair:wn #2 \s_@@ #3
-  {
-    \int_compare:nNnF {#1} > 1
-      { \@@_use_i_delimit_by_s_stop:nw { \exp_not:n { {#2} {#3} } } }
-    \exp_after:wN \@@_rand_item:w
-    \int_value:w \int_eval:n { #1 - 1 } \s_@@
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
 % \subsection{Additions to \pkg{l3seq}}
 %
 %    \begin{macrocode}
@@ -880,35 +312,6 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\seq_set_from_inline_x:Nnn, \seq_gset_from_inline_x:Nnn}
-% \begin{macro}{\@@_set_from_inline_x:NNnn}
-%   Set \cs{@@_item:n} then map it using the loop code.
-%    \begin{macrocode}
-\cs_new_protected:Npn \seq_set_from_inline_x:Nnn
-  { \@@_set_from_inline_x:NNnn \__kernel_tl_set:Nx }
-\cs_new_protected:Npn \seq_gset_from_inline_x:Nnn
-  { \@@_set_from_inline_x:NNnn \__kernel_tl_gset:Nx }
-\cs_new_protected:Npn \@@_set_from_inline_x:NNnn #1#2#3#4
-  {
-    \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
-    #1 #2 { \s_@@ #3 \@@_item:n }
-    \@@_pop_item_def:
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\seq_set_from_function:NnN, \seq_gset_from_function:NnN}
-%   Reuse \cs{seq_set_from_inline_x:Nnn}.
-%    \begin{macrocode}
-\cs_new_protected:Npn \seq_set_from_function:NnN #1#2#3
-  { \seq_set_from_inline_x:Nnn #1 {#2} { #3 {##1} } }
-\cs_new_protected:Npn \seq_gset_from_function:NnN #1#2#3
-  { \seq_gset_from_inline_x:Nnn #1 {#2} { #3 {##1} } }
-%    \end{macrocode}
-% \end{macro}
-%
-%
 % \begin{macro}{\@@_int_eval:w}
 %   Useful to more quickly go through items.
 %    \begin{macrocode}
@@ -1079,114 +482,6 @@
 % \end{macro}
 % \end{macro}
 %
-% \subsection{Additions to \pkg{l3sys}}
-%
-%    \begin{macrocode}
-%<@@=sys>
-%    \end{macrocode}
-%
-% \begin{variable}{\c_sys_engine_version_str}
-%   Various different engines, various different ways to extract the
-%   data!
-%    \begin{macrocode}
-\str_const:Nx \c_sys_engine_version_str
-  {
-    \str_case:on \c_sys_engine_str
-      {
-        { pdftex }
-          {
-            \int_div_truncate:nn { \tex_pdftexversion:D } { 100 }
-            .
-            \int_mod:nn { \tex_pdftexversion:D } { 100 }
-            .
-            \tex_pdftexrevision:D
-          }
-        { ptex }
-          {
-            \cs_if_exist:NT \tex_ptexversion:D
-              {
-                p
-                \int_use:N  \tex_ptexversion:D
-                .
-                \int_use:N \tex_ptexminorversion:D
-                \tex_ptexrevision:D
-                -
-                \int_use:N \tex_epTeXversion:D
-              }
-          }
-        { luatex }
-          {
-            \int_div_truncate:nn { \tex_luatexversion:D } { 100 }
-            .
-            \int_mod:nn { \tex_luatexversion:D } { 100 }
-            .
-            \tex_luatexrevision:D
-          }
-        { uptex }
-          {
-            \cs_if_exist:NT \tex_ptexversion:D
-              {
-                p
-                \int_use:N  \tex_ptexversion:D
-                .
-                \int_use:N \tex_ptexminorversion:D
-                \tex_ptexrevision:D
-                -
-                u
-                \int_use:N  \tex_uptexversion:D
-                \tex_uptexrevision:D
-                -
-                \int_use:N \tex_epTeXversion:D
-              }
-          }
-        { xetex }
-          {
-            \int_use:N \tex_XeTeXversion:D
-            \tex_XeTeXrevision:D
-          }
-      }
-  }
-%    \end{macrocode}
-% \end{variable}
-%
-% \subsection{Additions to \pkg{l3file}}
-%
-%    \begin{macrocode}
-%<@@=ior>
-%    \end{macrocode}
-%
-% \begin{macro}{\ior_shell_open:Nn}
-% \begin{macro}{\@@_shell_open:nN}
-%   Actually much easier than either the standard open or input versions!
-%   When calling \cs{__kernel_ior_open:Nn} the file the pipe is added to
-%   signal a shell command, but the quotes are not added yet---they are
-%   added later by \cs{__kernel_file_name_quote:n}.
-%    \begin{macrocode}
-\cs_new_protected:Npn \ior_shell_open:Nn #1#2
-  {
-    \sys_if_shell:TF
-      { \exp_args:No \@@_shell_open:nN { \tl_to_str:n {#2} } #1 }
-      { \msg_error:nn { ior } { pipe-failed } }
-  }
-\cs_new_protected:Npn \@@_shell_open:nN #1#2
-  {
-    \tl_if_in:nnTF {#1} { " }
-      {
-        \msg_error:nnx
-          { kernel } { quote-in-shell } {#1}
-      }
-      { \__kernel_ior_open:Nn #2 { |#1 } }
-  }
-\msg_new:nnnn { ior } { pipe-failed }
-  { Cannot~run~piped~system~commands. }
-  {
-    LaTeX~tried~to~call~a~system~process~but~this~was~not~possible.\\
-    Try~the~"--shell-escape"~(or~"--enable-pipes")~option.
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
 % \subsection{Additions to \pkg{l3tl}}
 %
 % \subsubsection{Building a token list}
@@ -1409,162 +704,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsubsection{Other additions to \pkg{l3tl}}
-%
-% \begin{macro}{\tl_range_braced:Nnn, \tl_range_braced:cnn, \tl_range_braced:nnn}
-% \begin{macro}
-%   {\tl_range_unbraced:Nnn, \tl_range_unbraced:cnn, \tl_range_unbraced:nnn}
-% \begin{macro}
-%   {
-%     \@@_range_braced:w, \@@_range_collect_braced:w,
-%     \@@_range_unbraced:w, \@@_range_collect_unbraced:w,
-%   }
-%   For the braced version \cs{@@_range_braced:w} sets up
-%   \cs{@@_range_collect_braced:w} which stores items one by one in an
-%   argument after the semicolon.  The unbraced version is almost
-%   identical.  The version preserving braces and spaces starts by
-%   deleting spaces before the argument to avoid collecting them, and
-%   sets up \cs{@@_range_collect:nn} with a first argument of the form
-%   |{| \Arg{collected} \meta{tokens} |}|, whose head is the collected
-%   tokens and whose tail is what remains of the original token list.
-%   This form makes it easier to move tokens to the \meta{collected}
-%   tokens.
 %    \begin{macrocode}
-\cs_new:Npn \tl_range_braced:Nnn { \exp_args:No \tl_range_braced:nnn }
-\cs_generate_variant:Nn \tl_range_braced:Nnn { c }
-\cs_new:Npn \tl_range_braced:nnn { \@@_range:Nnnn \@@_range_braced:w }
-\cs_new:Npn \tl_range_unbraced:Nnn
-  { \exp_args:No \tl_range_unbraced:nnn }
-\cs_generate_variant:Nn \tl_range_unbraced:Nnn { c }
-\cs_new:Npn \tl_range_unbraced:nnn
-  { \@@_range:Nnnn \@@_range_unbraced:w }
-\cs_new:Npn \@@_range_braced:w #1 ; #2
-  { \@@_range_collect_braced:w #1 ; { } #2 }
-\cs_new:Npn \@@_range_unbraced:w #1 ; #2
-  { \@@_range_collect_unbraced:w #1 ; { } #2 }
-\cs_new:Npn \@@_range_collect_braced:w #1 ; #2#3
-  {
-    \if_int_compare:w #1 > \c_one_int
-      \exp_after:wN \@@_range_collect_braced:w
-      \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
-    \fi:
-    { #2 {#3} }
-  }
-\cs_new:Npn \@@_range_collect_unbraced:w #1 ; #2#3
-  {
-    \if_int_compare:w #1 > \c_one_int
-      \exp_after:wN \@@_range_collect_unbraced:w
-      \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
-    \fi:
-    { #2 #3 }
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Additions to \pkg{l3token}}
-%
-% \begin{variable}{\c_catcode_active_space_tl}
-%   While \cs{char_generate:nn} can produce active characters in some
-%   engines it cannot in general.  It would be possible to simply change
-%   the catcode of space but then the code would need to avoid all
-%   spaces, making it quite unreadable.  Instead we use the primitive
-%   \cs{tex_lowercase:D} trick.
-%    \begin{macrocode}
-\group_begin:
-  \char_set_catcode_active:N *
-  \char_set_lccode:nn { `* } { `\ }
-  \tex_lowercase:D { \tl_const:Nn \c_catcode_active_space_tl { * } }
-\group_end:
-%    \end{macrocode}
-% \end{variable}
-%
-%    \begin{macrocode}
-%<@@=peek>
-%    \end{macrocode}
-%
-% \begin{variable}{\l_@@_collect_tl}
-%    \begin{macrocode}
-\tl_new:N \l_@@_collect_tl
-%    \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}
-%   {
-%     \peek_catcode_collect_inline:Nn,
-%     \peek_charcode_collect_inline:Nn,
-%     \peek_meaning_collect_inline:Nn
-%   }
-% \begin{macro}
-%   {
-%     \@@_collect:NNn, \@@_collect_true:w,
-%     \@@_collect_remove:nw, \@@_collect:N
-%   }
-%     Most of the work is done by \cs{@@_execute_branches_\ldots{}:},
-%     which calls either \cs{@@_true:w} or \cs{@@_false:w} according to
-%     whether the next token \cs{l_peek_token} matches the search token
-%     (stored in \cs{l_@@_search_token} and \cs{l_@@_search_tl}).
-%     Here, in the \texttt{true} case we run \cs{@@_collect_true:w},
-%     which generally calls \cs{@@_collect:N} to store the peeked token
-%     into \cs{l_@@_collect_tl}, except in special non-\texttt{N}-type
-%     cases (begin-group, end-group, or space), where a frozen token is
-%     stored.  The \texttt{true} branch calls
-%     \cs{@@_execute_branches_\ldots{}:} to fetch more matching tokens.
-%     Once there are no more, \cs{@@_false_aux:n} closes the safe-align
-%     group and runs the user's inline code.
-%    \begin{macrocode}
-\cs_new_protected:Npn \peek_catcode_collect_inline:Nn
-  { \@@_collect:NNn \@@_execute_branches_catcode: }
-\cs_new_protected:Npn \peek_charcode_collect_inline:Nn
-  { \@@_collect:NNn \@@_execute_branches_charcode: }
-\cs_new_protected:Npn \peek_meaning_collect_inline:Nn
-  { \@@_collect:NNn \@@_execute_branches_meaning: }
-\cs_new_protected:Npn \@@_collect:NNn #1#2#3
-  {
-    \group_align_safe_begin:
-    \cs_set_eq:NN \l_@@_search_token #2
-    \tl_set:Nn \l_@@_search_tl {#2}
-    \tl_clear:N \l_@@_collect_tl
-    \cs_set:Npn \@@_false:w
-      { \exp_args:No \@@_false_aux:n \l_@@_collect_tl }
-    \cs_set:Npn \@@_false_aux:n ##1
-      {
-        \group_align_safe_end:
-        #3
-      }
-    \cs_set_eq:NN \@@_true:w \@@_collect_true:w
-    \cs_set:Npn \@@_true_aux:w { \peek_after:Nw #1 }
-    \@@_true_aux:w
-  }
-\cs_new_protected:Npn \@@_collect_true:w
-  {
-    \if_case:w
-        \if_catcode:w \exp_not:N \l_peek_token {   1 \exp_stop_f: \fi:
-        \if_catcode:w \exp_not:N \l_peek_token }   2 \exp_stop_f: \fi:
-        \if_meaning:w \l_peek_token \c_space_token 3 \exp_stop_f: \fi:
-        0 \exp_stop_f:
-      \exp_after:wN \@@_collect:N
-    \or: \@@_collect_remove:nw { \c_group_begin_token }
-    \or: \@@_collect_remove:nw { \c_group_end_token }
-    \or: \@@_collect_remove:nw { ~ }
-    \fi:
-  }
-\cs_new_protected:Npn \@@_collect:N #1
-  {
-    \tl_put_right:Nn \l_@@_collect_tl {#1}
-    \@@_true_aux:w
-  }
-\cs_new_protected:Npn \@@_collect_remove:nw #1
-  {
-    \tl_put_right:Nn \l_@@_collect_tl {#1}
-    \exp_after:wN \@@_true_remove:w
-  }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%    \begin{macrocode}
 %</package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3cctab.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3color.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3debug.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -954,7 +954,7 @@
       \flag_if_raised:nTF
       \flag_if_raised_p:n
       \flag_height:n
-      \flag_raise_if_clear:n
+      \flag_ensure_raised:n
       \flag_clear:n
     }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -447,6 +447,25 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \subsection{Deprecated \pkg{l3prg} functions}
+%
+%    \begin{macrocode}
+%<@@=cs>
+%    \end{macrocode}
+%
+% \begin{macro}[EXP, noTF]{\bool_case_true:n}
+%    \begin{macrocode}
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:n }
+\cs_gset:Npn \bool_case_true:n { \bool_case:n }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nT }
+\cs_gset:Npn \bool_case_true:nT { \bool_case:nT }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nF }
+\cs_gset:Npn \bool_case_true:nF { \bool_case:nF }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nTF }
+\cs_gset:Npn \bool_case_true:nTF { \bool_case:nTF }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Deprecated \pkg{l3str} functions}
 %
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -85,7 +85,7 @@
 %    require you to do updates, if the class changes.}}
 %
 % \author{\Team}
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 % \maketitle
 % \tableofcontents
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -63,7 +63,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -180,6 +180,20 @@
 %   functions explicitly is preferred to defining confusing variants.
 % \end{function}
 %
+% \begin{function}[added = 2018-04-04, updated = 2019-02-08]
+%   {\exp_args_generate:n}
+%   \begin{syntax}
+%     \cs{exp_args_generate:n} \Arg{variant argument specifiers}
+%   \end{syntax}
+%   Defines \cs[no-index]{exp_args:N\meta{variant}} functions for each
+%   \meta{variant} given in the comma list \Arg{variant argument
+%   specifiers}.  Each \meta{variant} should consist of the letters |N|,
+%   |c|, |n|, |V|, |v|, |o|, |f|, |e|, |x|, |p| and the resulting function is
+%   protected if the letter |x| appears in the \meta{variant}.  This is
+%   only useful for cases where \cs{cs_generate_variant:Nn} is not
+%   applicable.
+% \end{function}
+%
 % \section{Introducing the variants}
 %
 % The |V| type returns the value of a register, which can be one of

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3file.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -140,6 +140,23 @@
 %   additive).
 % \end{function}
 %
+% \begin{function}[added = 2019-05-08]{\ior_shell_open:Nn}
+%   \begin{syntax}
+%     \cs{ior_shell_open:Nn} \meta{stream} \Arg{shell~command}
+%   \end{syntax}
+%   Opens the \emph{pseudo}-file created by the output of the
+%   \meta{shell command} for reading using \meta{stream} as the
+%   control sequence for access. If the \meta{stream} was already
+%   open it is closed before the new operation begins. The
+%   \meta{stream} is available for access immediately and will remain
+%   allocated to \meta{shell command} until a \cs{ior_close:N} instruction
+%   is given or the \TeX{} run ends.
+%   If piped system calls are disabled an error is raised.
+%
+%   For details of handling of the \meta{shell command}, see
+%   \cs{sys_get_shell:nnNTF}.
+% \end{function}
+%
 % \begin{function}[updated = 2012-07-31]
 %   {\ior_close:N, \ior_close:c, \iow_close:N, \iow_close:c}
 %   \begin{syntax}
@@ -390,6 +407,26 @@
 %   the \meta{stream} is not open.
 % \end{function}
 %
+% \subsection{Reading from the terminal}
+%
+% \begin{function}[added = 2019-03-23]{\ior_get_term:nN, \ior_str_get_term:nN}
+%   \begin{syntax}
+%     \cs{ior_get_term:nN} \meta{prompt} \meta{token list variable}
+%   \end{syntax}
+%   Function that reads one or more lines (until an equal number of left
+%   and right braces are found) from the terminal and stores
+%   the result locally in the \meta{token list} variable. Tokenization
+%   occurs as described for \cs{ior_get:NN} or \cs{ior_str_get:NN}, respectively.
+%   When the \meta{prompt}
+%   is empty, \TeX{} will wait for input without any other indication:
+%   typically the programmer will have provided a suitable text using
+%   e.g.~\cs{iow_term:n}. Where the \meta{prompt} is given, it will appear
+%   in the terminal followed by an |=|, e.g.
+%   \begin{verbatim}
+%     prompt=
+%   \end{verbatim}
+% \end{function}
+%
 % \subsection{Writing to files}
 %
 % \begin{function}[updated = 2012-06-05]{\iow_now:Nn, \iow_now:Nx, \iow_now:cn, \iow_now:cx}
@@ -516,8 +553,8 @@
 %       (for example after a control sequence),
 %     \item |\#|, |\%|, |\{|, |\}|, |\~| may be used to represent
 %       the corresponding character,
-%     \item \cs{iow_allow_break:} may be used to allow a line-break
-%       without inserting a space (this is experimental),
+%     \item \cs{iow_wrap_allow_break:} may be used to allow a line-break
+%       without inserting a space,
 %     \item \cs{iow_indent:n} may be used to indent a part of the
 %       \meta{text} (not the \meta{run-on text}).
 %   \end{itemize}
@@ -547,6 +584,15 @@
 %   \end{texnote}
 % \end{function}
 %
+% \begin{function}[added = 2023-04-25]{\iow_wrap_allow_break:}
+%   \begin{syntax}
+%     \cs{iow_wrap_allow_break:}
+%   \end{syntax}
+%   In the first argument of \cs{iow_wrap:nnnN} (for instance in
+%   messages), inserts a break-point that allows a line break. If
+%   no break occurs, this function adds nothing to the output.
+% \end{function}
+%
 % \begin{function}[added = 2011-09-21]{\iow_indent:n}
 %   \begin{syntax}
 %     \cs{iow_indent:n} \Arg{text}
@@ -1111,6 +1157,38 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}{\ior_shell_open:Nn}
+% \begin{macro}{\@@_shell_open:nN}
+%   Actually much easier than either the standard open or input versions!
+%   When calling \cs{__kernel_ior_open:Nn} the file the pipe is added to
+%   signal a shell command, but the quotes are not added yet---they are
+%   added later by \cs{__kernel_file_name_quote:n}.
+%    \begin{macrocode}
+\cs_new_protected:Npn \ior_shell_open:Nn #1#2
+  {
+    \sys_if_shell:TF
+      { \exp_args:No \@@_shell_open:nN { \tl_to_str:n {#2} } #1 }
+      { \msg_error:nn { ior } { pipe-failed } }
+  }
+\cs_new_protected:Npn \@@_shell_open:nN #1#2
+  {
+    \tl_if_in:nnTF {#1} { " }
+      {
+        \msg_error:nnx
+          { kernel } { quote-in-shell } {#1}
+      }
+      { \__kernel_ior_open:Nn #2 { |#1 } }
+  }
+\msg_new:nnnn { ior } { pipe-failed }
+  { Cannot~run~piped~system~commands. }
+  {
+    LaTeX~tried~to~call~a~system~process~but~this~was~not~possible.\\
+    Try~the~"--shell-escape"~(or~"--enable-pipes")~option.
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}{\ior_close:N, \ior_close:c}
 %   Closing a stream means getting rid of it at the \TeX{} level and
 %   removing from the various data structures.  Unless the name passed
@@ -1846,24 +1924,24 @@
 % \end{variable}
 % \end{variable}
 %
-% \begin{macro}{\iow_allow_break:}
-% \begin{macro}[EXP]{\@@_allow_break:}
-% \begin{macro}[EXP]{\@@_allow_break_error:}
-%   We set \cs{iow_allow_break:n} to produce an error when outside
-%   messages. Within wrapped message, it is set to \cs{@@_allow_break:}
-%   when valid and otherwise to \cs{@@_allow_break_error:}.  The second
+% \begin{macro}{\iow_wrap_allow_break:}
+% \begin{macro}[EXP]{\@@_wrap_allow_break:}
+% \begin{macro}[EXP]{\@@_wrap_allow_break_error:}
+%   We set \cs{iow_wrap_allow_break:n} to produce an error when outside
+%   messages. Within wrapped message, it is set to \cs{@@_wrap_allow_break:}
+%   when valid and otherwise to \cs{@@_wrap_allow_break_error:}.  The second
 %   produces an error expandably.
 %    \begin{macrocode}
-\cs_new_protected:Npn \iow_allow_break:
+\cs_new_protected:Npn \iow_wrap_allow_break:
   {
     \msg_error:nnnn { kernel } { iow-indent }
-      { \iow_wrap:nnnN } { \iow_allow_break: }
+      { \iow_wrap:nnnN } { \iow_wrap_allow_break: }
   }
-\cs_new:Npx \@@_allow_break: { \c_@@_wrap_allow_break_marker_tl }
-\cs_new:Npn \@@_allow_break_error:
+\cs_new:Npx \@@_wrap_allow_break: { \c_@@_wrap_allow_break_marker_tl }
+\cs_new:Npn \@@_wrap_allow_break_error:
   {
     \msg_expandable_error:nnnn { kernel } { iow-indent }
-      { \iow_wrap:nnnN } { \iow_allow_break: }
+      { \iow_wrap:nnnN } { \iow_wrap_allow_break: }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1928,7 +2006,7 @@
       \int_set:Nn \tex_escapechar:D { 92 }
       \cs_set_eq:NN \\ \iow_newline:
       \cs_set_eq:NN \  \c_catcode_other_space_tl
-      \cs_set_eq:NN \iow_allow_break: \@@_allow_break:
+      \cs_set_eq:NN \iow_wrap_allow_break: \@@_wrap_allow_break:
       \cs_set_eq:NN \iow_indent:n \@@_indent:n
       #3
 %    \end{macrocode}
@@ -1941,7 +2019,7 @@
 %    \begin{macrocode}
       \cs_set_eq:NN \protect \token_to_str:N
       \__kernel_tl_set:Nx \l_@@_wrap_tl {#1}
-      \cs_set_eq:NN \iow_allow_break: \@@_allow_break_error:
+      \cs_set_eq:NN \iow_wrap_allow_break: \@@_wrap_allow_break_error:
       \cs_set_eq:NN \iow_indent:n \@@_indent_error:n
 %    \end{macrocode}
 %   Afterwards, set the newline marker (two assignments to fully expand,

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -152,6 +152,14 @@
 %   The \meta{flag}'s height is increased by $1$ locally.
 % \end{function}
 %
+% \begin{function}[EXP, added = 2023-04-25]{\flag_ensure_raised:n}
+%   \begin{syntax}
+%     \cs{flag_ensure_raised:n} \Arg{flag name}
+%   \end{syntax}
+%   Ensures the \meta{flag} is raised by making its height at least~$1$,
+%   locally.
+% \end{function}
+%
 % \end{documentation}
 %
 % \begin{implementation}
@@ -299,7 +307,23 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\flag_ensure_raised:n}
+%   It might be faster to just call the \enquote{trap} function in all
+%   cases but conceptually the function name suggests we should only run
+%   it if the flag is zero in case the \enquote{trap} made customizable
+%   in the future.
 %    \begin{macrocode}
+\cs_new:Npn \flag_ensure_raised:n #1
+  {
+    \if_cs_exist:w flag~#1~0 \cs_end:
+    \else:
+      \cs:w flag~#1 \cs_end: 0 ;
+    \fi:
+  }
+%    \end{macrocode}
+% \end{macro}
+%
+%    \begin{macrocode}
 %</package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 % \maketitle
 %
 % \begin{documentation}
@@ -200,9 +200,9 @@
 %   Use general tools.
 %    \begin{macrocode}
 \cs_new_protected:Npn \fp_show:n
-  { \msg_show_eval:Nn \fp_to_tl:n }
+  { \__kernel_msg_show_eval:Nn \fp_to_tl:n }
 \cs_new_protected:Npn \fp_log:n
-  { \msg_log_eval:Nn \fp_to_tl:n }
+  { \__kernel_msg_log_eval:Nn \fp_to_tl:n }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -73,37 +73,6 @@
 %
 % \subsection{Engine support}
 %
-% Most engines provide random numbers, but not all.  We write the test
-% twice simply in order to write the \texttt{false} branch first.
-%    \begin{macrocode}
-\sys_if_rand_exist:F
-  {
-    \msg_new:nnn { kernel } { fp-no-random }
-      { Random~numbers~unavailable~for~#1 }
-    \cs_new:Npn \@@_rand_o:Nw ? #1 @
-      {
-        \msg_expandable_error:nnn { kernel } { fp-no-random }
-          { fp~rand }
-        \exp_after:wN \c_nan_fp
-      }
-    \cs_new_eq:NN \@@_randint_o:Nw \@@_rand_o:Nw
-    \cs_new:Npn \int_rand:nn #1#2
-      {
-        \msg_expandable_error:nnn { kernel } { fp-no-random }
-          { \int_rand:nn {#1} {#2} }
-        \int_eval:n {#1}
-      }
-    \cs_new:Npn \int_rand:n #1
-      {
-        \msg_expandable_error:nnn { kernel } { fp-no-random }
-          { \int_rand:n {#1} }
-        1
-      }
-  }
-\sys_if_rand_exist:T
-  {
-%    \end{macrocode}
-%
 % Obviously, every word \enquote{random} below means
 % \enquote{pseudo-random}, as we have no access to entropy (except a
 % very unreliable source of entropy: the time it takes to run some
@@ -271,7 +240,7 @@
 %   Constant equal to $2^{17}-1$, the maximal size of a range that
 %   \cs{int_range:nn} can do with its \enquote{simple} algorithm.
 %    \begin{macrocode}
-    \int_const:Nn \c__kernel_randint_max_int { 131071 }
+\int_const:Nn \c__kernel_randint_max_int { 131071 }
 %    \end{macrocode}
 % \end{variable}
 %
@@ -284,11 +253,11 @@
 %   $\operatorname{ediv}(p-2^{13},2^{14})$ but that wrongly gives $-1$
 %   for $p=0$.
 %    \begin{macrocode}
-    \cs_new:Npn \__kernel_randint:n #1
-      {
-        (#1 * \tex_uniformdeviate:D 16384
-        + \tex_uniformdeviate:D #1 + 8192 ) / 16384
-      }
+\cs_new:Npn \__kernel_randint:n #1
+  {
+    (#1 * \tex_uniformdeviate:D 16384
+    + \tex_uniformdeviate:D #1 + 8192 ) / 16384
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -300,17 +269,17 @@
 %   four (pseudo-random) digits.  Digits are produced as a random number
 %   in $[10000,19999]$ for the usual reason of preserving leading zeros.
 %    \begin{macrocode}
-    \cs_new:Npn \@@_rand_myriads:n #1
-      { \@@_rand_myriads_loop:w #1 \prg_break: X \prg_break_point: ; }
-    \cs_new:Npn \@@_rand_myriads_loop:w #1 X
-      {
-        #1
-        \exp_after:wN \@@_rand_myriads_get:w
-        \int_value:w \@@_int_eval:w 9999 +
-          \__kernel_randint:n { 10000 }
-        \@@_rand_myriads_loop:w
-      }
-    \cs_new:Npn \@@_rand_myriads_get:w 1 #1 ; { ; {#1} }
+\cs_new:Npn \@@_rand_myriads:n #1
+  { \@@_rand_myriads_loop:w #1 \prg_break: X \prg_break_point: ; }
+\cs_new:Npn \@@_rand_myriads_loop:w #1 X
+  {
+    #1
+    \exp_after:wN \@@_rand_myriads_get:w
+    \int_value:w \@@_int_eval:w 9999 +
+      \__kernel_randint:n { 10000 }
+    \@@_rand_myriads_loop:w
+  }
+\cs_new:Npn \@@_rand_myriads_get:w 1 #1 ; { ; {#1} }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -324,27 +293,27 @@
 %   is correctly~$0$ but it raises the \texttt{underflow} flag; it
 %   should not do that.
 %    \begin{macrocode}
-    \cs_new:Npn \@@_rand_o:Nw ? #1 @
+\cs_new:Npn \@@_rand_o:Nw ? #1 @
+  {
+    \tl_if_empty:nTF {#1}
       {
-        \tl_if_empty:nTF {#1}
-          {
-            \exp_after:wN \@@_rand_o:w
-            \exp:w \exp_end_continue_f:w
-            \@@_rand_myriads:n { XXXX } { 0000 } { 0000 } ; 0
-          }
-          {
-            \msg_expandable_error:nnnnn
-              { fp } { num-args } { rand() } { 0 } { 0 }
-            \exp_after:wN \c_nan_fp
-          }
+        \exp_after:wN \@@_rand_o:w
+        \exp:w \exp_end_continue_f:w
+        \@@_rand_myriads:n { XXXX } { 0000 } { 0000 } ; 0
       }
-    \cs_new:Npn \@@_rand_o:w ;
       {
-        \exp_after:wN \@@_sanitize:Nw
-        \exp_after:wN 0
-        \int_value:w \@@_int_eval:w \c_zero_int
-          \@@_fixed_to_float_o:wN
+        \msg_expandable_error:nnnnn
+          { fp } { num-args } { rand() } { 0 } { 0 }
+        \exp_after:wN \c_nan_fp
       }
+  }
+\cs_new:Npn \@@_rand_o:w ;
+  {
+    \exp_after:wN \@@_sanitize:Nw
+    \exp_after:wN 0
+    \int_value:w \@@_int_eval:w \c_zero_int
+      \@@_fixed_to_float_o:wN
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -382,115 +351,115 @@
 %     numbers (namely $10^{16}$ to the integers they represent), except
 %     of course when it is time to convert back to a float.
 %    \begin{macrocode}
-    \cs_new:Npn \@@_randint_o:Nw ?
+\cs_new:Npn \@@_randint_o:Nw ?
+  {
+    \@@_parse_function_one_two:nnw
+      { randint }
+      { \@@_randint_default:w \@@_randint_o:w }
+  }
+\cs_new:Npn \@@_randint_default:w #1 { \exp_after:wN #1 \c_one_fp }
+\cs_new:Npn \@@_randint_badarg:w \s_@@ \@@_chk:w #1#2#3;
+  {
+    \@@_int:wTF \s_@@ \@@_chk:w #1#2#3;
       {
-        \@@_parse_function_one_two:nnw
-          { randint }
-          { \@@_randint_default:w \@@_randint_o:w }
-      }
-    \cs_new:Npn \@@_randint_default:w #1 { \exp_after:wN #1 \c_one_fp }
-    \cs_new:Npn \@@_randint_badarg:w \s_@@ \@@_chk:w #1#2#3;
-      {
-        \@@_int:wTF \s_@@ \@@_chk:w #1#2#3;
-          {
-            \if_meaning:w 1 #1
-              \if_int_compare:w
-                  \@@_use_i_until_s:nw #3 ; > \c_@@_prec_int
-                \c_one_int
-              \fi:
-            \fi:
-          }
-          { \c_one_int }
-      }
-    \cs_new:Npn \@@_randint_o:w #1; #2; @
-      {
-        \if_case:w
-            \@@_randint_badarg:w #1;
-            \@@_randint_badarg:w #2;
-            \if:w 1 \@@_compare_back:ww #2; #1; \c_one_int \fi:
-            \c_zero_int
-          \@@_randint_auxi_o:ww #1; #2;
-        \or:
-          \@@_invalid_operation_tl_o:ff
-            { randint } { \@@_array_to_clist:n { #1; #2; } }
-          \exp:w
+        \if_meaning:w 1 #1
+          \if_int_compare:w
+              \@@_use_i_until_s:nw #3 ; > \c_@@_prec_int
+            \c_one_int
+          \fi:
         \fi:
-        \exp_after:wN \exp_end:
       }
-    \cs_new:Npn \@@_randint_auxi_o:ww #1 ; #2 ; #3 \exp_end:
+      { \c_one_int }
+  }
+\cs_new:Npn \@@_randint_o:w #1; #2; @
+  {
+    \if_case:w
+        \@@_randint_badarg:w #1;
+        \@@_randint_badarg:w #2;
+        \if:w 1 \@@_compare_back:ww #2; #1; \c_one_int \fi:
+        \c_zero_int
+      \@@_randint_auxi_o:ww #1; #2;
+    \or:
+      \@@_invalid_operation_tl_o:ff
+        { randint } { \@@_array_to_clist:n { #1; #2; } }
+      \exp:w
+    \fi:
+    \exp_after:wN \exp_end:
+  }
+\cs_new:Npn \@@_randint_auxi_o:ww #1 ; #2 ; #3 \exp_end:
+  {
+    \fi:
+    \@@_randint_auxii:wn #2 ;
+    { \@@_randint_auxii:wn #1 ; \@@_randint_auxiii_o:ww }
+  }
+\cs_new:Npn \@@_randint_auxii:wn \s_@@ \@@_chk:w #1#2#3#4 ;
+  {
+    \if_meaning:w 0 #1
+      \exp_after:wN \use_i:nn
+    \else:
+      \exp_after:wN \use_ii:nn
+    \fi:
+    { \exp_after:wN \@@_fixed_continue:wn \c_@@_one_fixed_tl }
+    {
+      \exp_after:wN \@@_ep_to_fixed:wwn
+      \int_value:w \@@_int_eval:w
+        #3 - \c_@@_prec_int , #4 {0000} {0000} ;
       {
+        \if_meaning:w 0 #2
+          \exp_after:wN \use_i:nnnn
+          \exp_after:wN \@@_fixed_add_one:wN
         \fi:
-        \@@_randint_auxii:wn #2 ;
-        { \@@_randint_auxii:wn #1 ; \@@_randint_auxiii_o:ww }
-      }
-    \cs_new:Npn \@@_randint_auxii:wn \s_@@ \@@_chk:w #1#2#3#4 ;
-      {
-        \if_meaning:w 0 #1
-          \exp_after:wN \use_i:nn
-        \else:
-          \exp_after:wN \use_ii:nn
-        \fi:
-        { \exp_after:wN \@@_fixed_continue:wn \c_@@_one_fixed_tl }
-        {
-          \exp_after:wN \@@_ep_to_fixed:wwn
-          \int_value:w \@@_int_eval:w
-            #3 - \c_@@_prec_int , #4 {0000} {0000} ;
-          {
-            \if_meaning:w 0 #2
-              \exp_after:wN \use_i:nnnn
-              \exp_after:wN \@@_fixed_add_one:wN
-            \fi:
-            \exp_after:wN \@@_fixed_sub:wwn \c_@@_one_fixed_tl
-          }
-          \@@_fixed_continue:wn
-        }
-      }
-    \cs_new:Npn \@@_randint_auxiii_o:ww #1 ; #2 ;
-      {
-        \@@_fixed_add:wwn #2 ;
-          {0000} {0000} {0000} {0001} {0000} {0000} ;
-        \@@_fixed_sub:wwn #1 ;
-        {
-          \exp_after:wN \use_i:nn
-          \exp_after:wN \@@_fixed_mul_add:wwwn
-          \exp:w \exp_end_continue_f:w \@@_rand_myriads:n { XXXXXX } ;
-        }
-        #1 ;
-        \@@_randint_auxiv_o:ww
-        #2 ;
-        \@@_randint_auxv_o:w #1 ; @
-      }
-    \cs_new:Npn \@@_randint_auxiv_o:ww #1#2#3#4#5 ; #6#7#8#9
-      {
-        \if_int_compare:w
-            \if_int_compare:w #1#2 > #6#7 \exp_stop_f: 1 \else:
-            \if_int_compare:w #1#2 < #6#7 \exp_stop_f: - \fi: \fi:
-            #3#4 > #8#9 \exp_stop_f:
-          \@@_use_i_until_s:nw
-        \fi:
-        \@@_randint_auxv_o:w {#1}{#2}{#3}{#4}#5
-      }
-    \cs_new:Npn \@@_randint_auxv_o:w #1#2#3#4#5 ; #6 @
-      {
-        \exp_after:wN \@@_sanitize:Nw
-        \int_value:w
-        \if_int_compare:w #1 < 10000 \exp_stop_f:
-          2
-        \else:
-          0
-          \exp_after:wN \exp_after:wN
-          \exp_after:wN \@@_reverse_args:Nww
-        \fi:
         \exp_after:wN \@@_fixed_sub:wwn \c_@@_one_fixed_tl
-        {#1} {#2} {#3} {#4} {0000} {0000} ;
-        {
-          \exp_after:wN \exp_stop_f:
-          \int_value:w \@@_int_eval:w \c_@@_prec_int
-            \@@_fixed_to_float_o:wN
-        }
-        0
-        \exp:w \exp_after:wN \exp_end:
       }
+      \@@_fixed_continue:wn
+    }
+  }
+\cs_new:Npn \@@_randint_auxiii_o:ww #1 ; #2 ;
+  {
+    \@@_fixed_add:wwn #2 ;
+      {0000} {0000} {0000} {0001} {0000} {0000} ;
+    \@@_fixed_sub:wwn #1 ;
+    {
+      \exp_after:wN \use_i:nn
+      \exp_after:wN \@@_fixed_mul_add:wwwn
+      \exp:w \exp_end_continue_f:w \@@_rand_myriads:n { XXXXXX } ;
+    }
+    #1 ;
+    \@@_randint_auxiv_o:ww
+    #2 ;
+    \@@_randint_auxv_o:w #1 ; @
+  }
+\cs_new:Npn \@@_randint_auxiv_o:ww #1#2#3#4#5 ; #6#7#8#9
+  {
+    \if_int_compare:w
+        \if_int_compare:w #1#2 > #6#7 \exp_stop_f: 1 \else:
+        \if_int_compare:w #1#2 < #6#7 \exp_stop_f: - \fi: \fi:
+        #3#4 > #8#9 \exp_stop_f:
+     \@@_use_i_until_s:nw
+    \fi:
+    \@@_randint_auxv_o:w {#1}{#2}{#3}{#4}#5
+  }
+\cs_new:Npn \@@_randint_auxv_o:w #1#2#3#4#5 ; #6 @
+  {
+    \exp_after:wN \@@_sanitize:Nw
+    \int_value:w
+    \if_int_compare:w #1 < 10000 \exp_stop_f:
+      2
+    \else:
+      0
+      \exp_after:wN \exp_after:wN
+      \exp_after:wN \@@_reverse_args:Nww
+    \fi:
+    \exp_after:wN \@@_fixed_sub:wwn \c_@@_one_fixed_tl
+    {#1} {#2} {#3} {#4} {0000} {0000} ;
+    {
+      \exp_after:wN \exp_stop_f:
+      \int_value:w \@@_int_eval:w \c_@@_prec_int
+        \@@_fixed_to_float_o:wN
+    }
+    0
+    \exp:w \exp_after:wN \exp_end:
+  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -504,38 +473,38 @@
 %   where \meta{choices} is the number of possible outcomes.  If the
 %   range is wide, use somewhat slower code.
 %    \begin{macrocode}
-    \cs_new:Npn \int_rand:nn #1#2
+\cs_new:Npn \int_rand:nn #1#2
+  {
+    \int_eval:n
       {
-        \int_eval:n
-          {
-            \exp_after:wN \@@_randint:ww
-            \int_value:w \int_eval:n {#1} \exp_after:wN ;
-            \int_value:w \int_eval:n {#2} ;
-          }
+        \exp_after:wN \@@_randint:ww
+        \int_value:w \int_eval:n {#1} \exp_after:wN ;
+        \int_value:w \int_eval:n {#2} ;
       }
-    \cs_new:Npn \@@_randint:ww #1; #2;
-      {
-        \if_int_compare:w #1 > #2 \exp_stop_f:
-          \msg_expandable_error:nnnn
-            { kernel } { randint-backward-range } {#1} {#2}
-          \@@_randint:ww #2; #1;
-        \else:
-          \if_int_compare:w \@@_int_eval:w #2
-              \if_int_compare:w #1 > \c_zero_int
-                - #1 < \@@_int_eval:w
-              \else:
-                < \@@_int_eval:w #1 +
-              \fi:
-              \c__kernel_randint_max_int
-              \@@_int_eval_end:
-            \__kernel_randint:n
-              { \@@_int_eval:w #2 - #1 + 1 \@@_int_eval_end: }
-            - 1 + #1
+  }
+\cs_new:Npn \@@_randint:ww #1; #2;
+  {
+    \if_int_compare:w #1 > #2 \exp_stop_f:
+      \msg_expandable_error:nnnn
+        { kernel } { randint-backward-range } {#1} {#2}
+      \@@_randint:ww #2; #1;
+    \else:
+      \if_int_compare:w \@@_int_eval:w #2
+          \if_int_compare:w #1 > \c_zero_int
+            - #1 < \@@_int_eval:w
           \else:
-            \__kernel_randint:nn {#1} {#2}
+            < \@@_int_eval:w #1 +
           \fi:
-        \fi:
-      }
+          \c__kernel_randint_max_int
+          \@@_int_eval_end:
+        \__kernel_randint:n
+          { \@@_int_eval:w #2 - #1 + 1 \@@_int_eval_end: }
+        - 1 + #1
+      \else:
+        \__kernel_randint:nn {#1} {#2}
+      \fi:
+    \fi:
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -557,68 +526,68 @@
 %   \meta{Y_1}|;|\meta{Y_0}|;| \meta{R_2}|;|\meta{R_1}|;|\meta{R_0}|;.|
 %   and we apply the algorithm described earlier.
 %    \begin{macrocode}
-    \cs_new:Npn \__kernel_randint:nn #1#2
-      {
-        #1
-        \exp_after:wN \@@_randint_wide_aux:w
+\cs_new:Npn \__kernel_randint:nn #1#2
+  {
+    #1
+    \exp_after:wN \@@_randint_wide_aux:w
+    \int_value:w
+      \exp_after:wN \@@_randint_split_o:Nw
+      \tex_uniformdeviate:D 268435456 ;
+    \int_value:w
+      \exp_after:wN \@@_randint_split_o:Nw
+      \tex_uniformdeviate:D 268435456 ;
+    \int_value:w
+      \exp_after:wN \@@_randint_split_o:Nw
+      \int_value:w \@@_int_eval:w 131072 +
+        \exp_after:wN \@@_randint_split_o:Nw
         \int_value:w
-          \exp_after:wN \@@_randint_split_o:Nw
-          \tex_uniformdeviate:D 268435456 ;
-        \int_value:w
-          \exp_after:wN \@@_randint_split_o:Nw
-          \tex_uniformdeviate:D 268435456 ;
-        \int_value:w
-          \exp_after:wN \@@_randint_split_o:Nw
-          \int_value:w \@@_int_eval:w 131072 +
-            \exp_after:wN \@@_randint_split_o:Nw
-            \int_value:w
-              \__kernel_int_add:nnn {#2} { -#1 } { -\c_max_int } ;
-        .
-      }
-    \cs_new:Npn \@@_randint_split_o:Nw #1#2 ;
-      {
-        \if_meaning:w 0 #1
-          0 \exp_after:wN ; \int_value:w 0
-        \else:
-          \exp_after:wN \@@_randint_split_aux:w
-          \int_value:w \@@_int_eval:w (#1#2 - 8192) / 16384 ;
-          + #1#2
-        \fi:
-        \exp_after:wN ;
-      }
-    \cs_new:Npn \@@_randint_split_aux:w #1 ;
-      {
-        #1 \exp_after:wN ;
-        \int_value:w \@@_int_eval:w - #1 * 16384
-      }
-    \cs_new:Npn \@@_randint_wide_aux:w #1;#2; #3;#4; #5;#6;#7; .
-      {
-        \exp_after:wN \@@_randint_wide_auxii:w
-        \int_value:w \@@_int_eval:w #5 * #3 + #6 * #1 +
-          (#5 * #4 + #6 * #3 + #7 * #1 +
-           (#5 * #2 +           #7 * #3 +
-            (16384 * #6 + #7) * (16384 * #4 + #2) / 268435456) / 16384
-          ) / 16384 \exp_after:wN ;
-        \int_value:w \@@_int_eval:w (#5 + #6) * 16384 + #7 ;
-        #1 ; #5 ;
-      }
-    \cs_new:Npn \@@_randint_wide_auxii:w #1; #2; #3; #4;
-      {
-        \if_int_odd:w 0
-            \if_int_compare:w #1 = #2 \else: \exp_stop_f: \fi:
-            \if_int_compare:w #4 = \c_zero_int 1 \fi:
-            \if_int_compare:w #3 = 16383 ~ 1 \fi:
-            \exp_stop_f:
-          \exp_after:wN \prg_break:
-        \fi:
-        \if_int_compare:w #4 < 8 \exp_stop_f:
-          + #4 * #3 * 16384
-        \else:
-          + 8 * #3 * 16384 + (#4 - 8) * #3 * 16384
-        \fi:
-        + #1
-        \prg_break_point:
-      }
+          \__kernel_int_add:nnn {#2} { -#1 } { -\c_max_int } ;
+    .
+  }
+\cs_new:Npn \@@_randint_split_o:Nw #1#2 ;
+  {
+    \if_meaning:w 0 #1
+      0 \exp_after:wN ; \int_value:w 0
+    \else:
+      \exp_after:wN \@@_randint_split_aux:w
+      \int_value:w \@@_int_eval:w (#1#2 - 8192) / 16384 ;
+      + #1#2
+    \fi:
+    \exp_after:wN ;
+  }
+\cs_new:Npn \@@_randint_split_aux:w #1 ;
+  {
+    #1 \exp_after:wN ;
+    \int_value:w \@@_int_eval:w - #1 * 16384
+  }
+\cs_new:Npn \@@_randint_wide_aux:w #1;#2; #3;#4; #5;#6;#7; .
+  {
+    \exp_after:wN \@@_randint_wide_auxii:w
+    \int_value:w \@@_int_eval:w #5 * #3 + #6 * #1 +
+      (#5 * #4 + #6 * #3 + #7 * #1 +
+       (#5 * #2 +           #7 * #3 +
+        (16384 * #6 + #7) * (16384 * #4 + #2) / 268435456) / 16384
+      ) / 16384 \exp_after:wN ;
+    \int_value:w \@@_int_eval:w (#5 + #6) * 16384 + #7 ;
+    #1 ; #5 ;
+  }
+\cs_new:Npn \@@_randint_wide_auxii:w #1; #2; #3; #4;
+  {
+    \if_int_odd:w 0
+        \if_int_compare:w #1 = #2 \else: \exp_stop_f: \fi:
+        \if_int_compare:w #4 = \c_zero_int 1 \fi:
+        \if_int_compare:w #3 = 16383 ~ 1 \fi:
+        \exp_stop_f:
+      \exp_after:wN \prg_break:
+    \fi:
+    \if_int_compare:w #4 < 8 \exp_stop_f:
+      + #4 * #3 * 16384
+    \else:
+      + 8 * #3 * 16384 + (#4 - 8) * #3 * 16384
+    \fi:
+    + #1
+    \prg_break_point:
+  }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -625,35 +594,29 @@
 % \begin{macro}{\int_rand:n, \@@_randint:n}
 %   Similar to \cs{int_rand:nn}, but needs fewer checks.
 %    \begin{macrocode}
-    \cs_new:Npn \int_rand:n #1
-      {
-        \int_eval:n
-          { \exp_args:Nf \@@_randint:n { \int_eval:n {#1} } }
-      }
-    \cs_new:Npn \@@_randint:n #1
-      {
-        \if_int_compare:w #1 < \c_one_int
-          \msg_expandable_error:nnnn
-            { kernel } { randint-backward-range } { 1 } {#1}
-          \@@_randint:ww #1; 1;
-        \else:
-          \if_int_compare:w #1 > \c__kernel_randint_max_int
-            \__kernel_randint:nn { 1 } {#1}
-          \else:
-            \__kernel_randint:n {#1}
-          \fi:
-        \fi:
-      }
+\cs_new:Npn \int_rand:n #1
+  {
+    \int_eval:n
+      { \exp_args:Nf \@@_randint:n { \int_eval:n {#1} } }
+  }
+\cs_new:Npn \@@_randint:n #1
+  {
+    \if_int_compare:w #1 < \c_one_int
+      \msg_expandable_error:nnnn
+        { kernel } { randint-backward-range } { 1 } {#1}
+      \@@_randint:ww #1; 1;
+    \else:
+      \if_int_compare:w #1 > \c__kernel_randint_max_int
+        \__kernel_randint:nn { 1 } {#1}
+      \else:
+        \__kernel_randint:n {#1}
+      \fi:
+    \fi:
+  }
 %    \end{macrocode}
 % \end{macro}
 %
-% End the initial conditional that ensures these commands are only
-% defined in engines that support random numbers.
 %    \begin{macrocode}
-  }
-%    \end{macrocode}
-%
-%    \begin{macrocode}
 %</package>
 %    \end{macrocode}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 % \maketitle
 %
 % \begin{documentation}
@@ -165,7 +165,7 @@
       {
         #1
         \@@_error:nnfn { invalid } {##2} { \fp_to_tl:n { ##3; } } { }
-        \flag_raise_if_clear:n { fp_invalid_operation }
+        \flag_ensure_raised:n { fp_invalid_operation }
         ##1
       }
     \exp_args:Nno \use:n
@@ -174,7 +174,7 @@
         #1
         \@@_error:nffn { invalid-ii }
           { \fp_to_tl:n { ##2; } } { \fp_to_tl:n { ##3; } } {##1}
-        \flag_raise_if_clear:n { fp_invalid_operation }
+        \flag_ensure_raised:n { fp_invalid_operation }
         \exp_after:wN \c_nan_fp
       }
     \exp_args:Nno \use:n
@@ -182,7 +182,7 @@
       {
         #1
         \@@_error:nffn { invalid } {##1} {##2} { }
-        \flag_raise_if_clear:n { fp_invalid_operation }
+        \flag_ensure_raised:n { fp_invalid_operation }
         \exp_after:wN \c_nan_fp
       }
   }
@@ -215,7 +215,7 @@
       {
         #1
         \@@_error:nnfn { zero-div } {##2} { \fp_to_tl:n { ##3; } } { }
-        \flag_raise_if_clear:n { fp_division_by_zero }
+        \flag_ensure_raised:n { fp_division_by_zero }
         \exp_after:wN ##1
       }
     \exp_args:Nno \use:n
@@ -224,7 +224,7 @@
         #1
         \@@_error:nffn { zero-div-ii }
           { \fp_to_tl:n { ##3; } } { \fp_to_tl:n { ##4; } } {##2}
-        \flag_raise_if_clear:n { fp_division_by_zero }
+        \flag_ensure_raised:n { fp_division_by_zero }
         \exp_after:wN ##1
       }
   }
@@ -287,7 +287,7 @@
           { \fp_to_tl:n { \s_@@ \@@_chk:w ##1##2##3; } }
           { \token_if_eq_meaning:NNF 0 ##2 { - } #4 }
           {#2}
-        \flag_raise_if_clear:n { fp_#2 }
+        \flag_ensure_raised:n { fp_#2 }
         #3 ##2
       }
   }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -40,7 +40,7 @@
 %          {latex-team at latex-project.org}^^A
 %    }^^A
 % }
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -49,7 +49,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -476,6 +476,15 @@
 %   slightly slower.
 % \end{function}
 %
+% \begin{function}[pTF, added = 2019-08-25]{\fp_if_nan:n}
+%   \begin{syntax}
+%     \cs{fp_if_nan:n} \Arg{fp expr}
+%   \end{syntax}
+%   Evaluates the \meta{fp expr} and tests whether the result is exactly
+%   \nan{}.  The test returns \texttt{false} for any other result, even
+%   a tuple containing \nan{}.
+% \end{function}
+%
 % \section{Floating point expression loops}
 %
 % \begin{function}[rEXP, added = 2012-08-16, tested = m3fp-logic003]

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3int.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -2555,7 +2555,7 @@
 %   expressions: this gives a more unified output.
 %    \begin{macrocode}
 \cs_new_protected:Npn \int_show:n
-  { \msg_show_eval:Nn \int_eval:n }
+  { \__kernel_msg_show_eval:Nn \int_eval:n }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2571,7 +2571,7 @@
 %   Similar to \cs{int_show:n}.
 %    \begin{macrocode}
 \cs_new_protected:Npn \int_log:n
-  { \msg_log_eval:Nn \int_eval:n }
+  { \__kernel_msg_log_eval:Nn \int_eval:n }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -495,7 +495,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[rEXP]{\intarray_to_clist:N, \intarray_to_clist:c}
 % \begin{macro}[rEXP]{\@@_to_clist:Nn, \@@_to_clist:w}
 %   The \cs{@@_to_clist:Nn} auxiliary allows to choose the delimiter and
 %   is also used in \cs{intarray_show:N}. Here we just pass the information
@@ -504,8 +503,6 @@
 %   an issue since the delimiter is always just a comma or a comma and a space.
 %   In both cases \texttt{sprint(2, ...)} provides the right catcodes.
 %    \begin{macrocode}
-    \cs_new:Npn \intarray_to_clist:N #1 { \@@_to_clist:Nn #1 { , } }
-    \cs_generate_variant:Nn \intarray_to_clist:N { c }
 %</tex>
 %<*lua>
 local concat = table.concat
@@ -517,7 +514,6 @@
 %</lua>
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}[rEXP]{\__kernel_intarray_range_to_clist:Nnn, \@@_range_to_clist:w}
 %   Loop through part of the array.
@@ -840,14 +836,11 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}[rEXP]{\intarray_to_clist:N, \intarray_to_clist:c}
 % \begin{macro}[rEXP]{\@@_to_clist:Nn, \@@_to_clist:w}
 %   Loop through the array, putting a comma before each item.  Remove
 %   the leading comma with |f|-expansion.  We also use the auxiliary in
 %   \cs{intarray_show:N} with argument comma, space.
 %    \begin{macrocode}
-    \cs_new:Npn \intarray_to_clist:N #1 { \@@_to_clist:Nn #1 { , } }
-    \cs_generate_variant:Nn \intarray_to_clist:N { c }
     \cs_new:Npn \@@_to_clist:Nn #1#2
       {
         \int_compare:nNnF { \intarray_count:N #1 } = \c_zero_int
@@ -867,7 +860,6 @@
       }
 %    \end{macrocode}
 % \end{macro}
-% \end{macro}
 %
 % \begin{macro}[rEXP]{\__kernel_intarray_range_to_clist:Nnn, \@@_range_to_clist:ww}
 %   Loop through part of the array.
@@ -941,103 +933,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \subsubsection{Random arrays}
-%
-% \begin{macro}{\intarray_gset_rand:Nn, \intarray_gset_rand:cn}
-% \begin{macro}{\intarray_gset_rand:Nnn, \intarray_gset_rand:cnn}
-% \begin{macro}
-%   {
-%     \@@_gset_rand:Nnn,
-%     \@@_gset_rand:Nff,
-%     \@@_gset_rand_auxi:Nnnn,
-%     \@@_gset_rand_auxii:Nnnn,
-%     \@@_gset_rand_auxiii:Nnnn,
-%     \@@_gset_all_same:Nn,
-%   }
-%   We only perform the bounds checks once.  This is done by two
-%   \cs{@@_gset_overflow_test:nw}, with an appropriate empty argument to
-%   avoid a spurious \enquote{at position \texttt{\#1}} part in the
-%   error message.  Then calculate the number of choices: this is at
-%   most $(2^{30}-1)-(-(2^{30}-1))+1=2^{31}-1$, which just barely does
-%   not overflow.  For small ranges use \cs{__kernel_randint:n} (making
-%   sure to subtract~$1$ \emph{before} adding the random number to the
-%   \meta{min}, to avoid overflow when \meta{min} or \meta{max} are
-%   $\pm\cs{c_max_int}$), otherwise \cs{__kernel_randint:nn}.  Finally,
-%   if there are no random numbers do not define any of the auxiliaries.
 %    \begin{macrocode}
-\cs_new_protected:Npn \intarray_gset_rand:Nn #1
-  { \intarray_gset_rand:Nnn #1 { 1 } }
-\cs_generate_variant:Nn \intarray_gset_rand:Nn { c }
-\sys_if_rand_exist:TF
-  {
-    \cs_new_protected:Npn \intarray_gset_rand:Nnn #1#2#3
-      {
-        \@@_gset_rand:Nff #1
-          { \int_eval:n {#2} } { \int_eval:n {#3} }
-      }
-    \cs_new_protected:Npn \@@_gset_rand:Nnn #1#2#3
-      {
-        \int_compare:nNnTF {#2} > {#3}
-          {
-            \msg_expandable_error:nnnn
-              { kernel } { randint-backward-range } {#2} {#3}
-            \@@_gset_rand:Nnn #1 {#3} {#2}
-          }
-          {
-            \@@_gset_overflow_test:nw {#2}
-            \@@_gset_rand_auxi:Nnnn #1 { } {#2} {#3}
-          }
-      }
-    \cs_generate_variant:Nn \@@_gset_rand:Nnn { Nff }
-    \cs_new_protected:Npn \@@_gset_rand_auxi:Nnnn #1#2#3#4
-      {
-        \@@_gset_overflow_test:nw {#4}
-        \@@_gset_rand_auxii:Nnnn #1 { } {#4} {#3}
-      }
-    \cs_new_protected:Npn \@@_gset_rand_auxii:Nnnn #1#2#3#4
-      {
-        \exp_args:NNf \@@_gset_rand_auxiii:Nnnn #1
-          { \int_eval:n { #3 - #4 + 1 } } {#4} {#3}
-      }
-    \cs_new_protected:Npn \@@_gset_rand_auxiii:Nnnn #1#2#3#4
-      {
-        \exp_args:NNf \@@_gset_all_same:Nn #1
-          {
-            \int_compare:nNnTF {#2} > \c__kernel_randint_max_int
-              {
-                \exp_stop_f:
-                \int_eval:n { \__kernel_randint:nn {#3} {#4} }
-              }
-              {
-                \exp_stop_f:
-                \int_eval:n { \__kernel_randint:n {#2} - 1 + #3 }
-              }
-          }
-      }
-    \cs_new_protected:Npn \@@_gset_all_same:Nn #1#2
-      {
-        \int_zero:N \l_@@_loop_int
-        \prg_replicate:nn { \intarray_count:N #1 }
-          {
-            \int_incr:N \l_@@_loop_int
-            \__kernel_intarray_gset:Nnn #1 \l_@@_loop_int {#2}
-          }
-      }
-  }
-  {
-    \cs_new_protected:Npn \intarray_gset_rand:Nnn #1#2#3
-      {
-        \msg_error:nnn { kernel } { fp-no-random }
-          { \intarray_gset_rand:Nnn #1 {#2} {#3} }
-      }
-  }
-\cs_generate_variant:Nn \intarray_gset_rand:Nnn { c }
-%    \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%    \begin{macrocode}
 %</tex>
 %</package>
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -296,6 +296,17 @@
 %   Inserts a kern of the specified \meta{length}, a dimension expression.
 % \end{variable}
 %
+% \begin{function}{\__kernel_msg_show_eval:Nn, \__kernel_msg_log_eval:Nn}
+%   \begin{syntax}
+%     \cs{__kernel_msg_show_eval:Nn} \meta{function} \Arg{expression}
+%   \end{syntax}
+%   Shows or logs the \meta{expression} (turned into a string), an equal
+%   sign, and the result of applying the \meta{function} to the
+%   \Arg{expression} (with \texttt{f}-expansion).  For instance, if the
+%   \meta{function} is \cs{int_eval:n} and the \meta{expression} is
+%   |1+2| then this logs |> 1+2=3.|
+% \end{function}
+%
 % \begin{variable}{\g__kernel_prg_map_int}
 %   This integer is used by non-expandable mapping functions to track
 %   the level of nesting in force.  The functions

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -496,6 +496,35 @@
 %   present.
 % \end{function}
 %
+% \begin{function}[EXP, added = 2017-12-04]
+%   {\msg_show_item:n, \msg_show_item_unbraced:n, \msg_show_item:nn, \msg_show_item_unbraced:nn}
+%   \begin{syntax}
+%     \cs{seq_map_function:NN} \meta{seq} \cs{msg_show_item:n}
+%     \cs{prop_map_function:NN} \meta{prop} \cs{msg_show_item:nn}
+%   \end{syntax}
+%   Used in the text of messages for \cs{msg_show:nnxxxx} to show or log
+%   a list of items or key--value pairs.  The output of
+%   \cs{msg_show_item:n} produces a newline, the prefix |>|, two spaces,
+%   then the braced string representation of its argument.
+%   The two-argument versions separates the key and value using
+%   \verb*|  =>  |, and the \texttt{unbraced} versions don't print the
+%   surrounding braces.
+%
+%   These functions are suitable for usage with iterator functions like
+%   \cs{seq_map_function:NN}, \cs{prop_map_function:NN}, etc.  For
+%   example, with a sequence \cs[no-index]{l_tmpa_seq} containing |a|,
+%   |{b}| and |\c|,
+%   \begin{verbatim}
+%     \seq_map_function:NN \l_tmpa_seq \msg_show_item:n
+%   \end{verbatim}
+%   would expand to three lines:
+%   \begin{quotation}
+%     \noindent\verb*|>  {a}|\\
+%     \verb*|>  {{b}}|\\
+%     \verb*|>  {\c }|
+%   \end{quotation}
+% \end{function}
+%
 % \subsection{Expandable error messages}
 %
 % In very rare cases it may be necessary to produce errors in an
@@ -1382,6 +1411,40 @@
 \group_end:
 %    \end{macrocode}
 %
+% \begin{macro}[EXP]{\msg_show_item:n}
+% \begin{macro}[EXP]{\msg_show_item_unbraced:n}
+% \begin{macro}[EXP]{\msg_show_item:nn}
+% \begin{macro}[EXP]{\msg_show_item_unbraced:nn}
+%   Each item in the variable is formatted using one of the following
+%   functions.  We cannot use |\\| and so on because these short-hands
+%   cannot be used inside the arguments of messages, only when defining
+%   the messages. We need to use |^^J| here directly as \pkg{l3file} is
+%   not yet loaded.
+%    \begin{macrocode}
+\cs_new:Npx \msg_show_item:n #1
+  { ^^J > ~ \c_space_tl \exp_not:N \tl_to_str:n { {#1} } }
+\cs_new:Npx \msg_show_item_unbraced:n #1
+  { ^^J > ~ \c_space_tl \exp_not:N \tl_to_str:n {#1} }
+\cs_new:Npx \msg_show_item:nn #1#2
+  {
+    ^^J > \use:nn { ~ } { ~ }
+    \exp_not:N \tl_to_str:n { {#1} }
+    \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
+    \exp_not:N \tl_to_str:n { {#2} }
+  }
+\cs_new:Npx \msg_show_item_unbraced:nn #1#2
+  {
+    ^^J > \use:nn { ~ } { ~ }
+    \exp_not:N \tl_to_str:n {#1}
+    \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
+    \exp_not:N \tl_to_str:n {#2}
+  }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \begin{macro}{\@@_class_chk_exist:nT}
 %   Checking that a message class exists.  We build this from
 %   \cs{cs_if_free:cTF} rather than \cs{cs_if_exist:cTF} because that
@@ -1634,6 +1697,25 @@
 %
 % \subsection{Kernel-specific functions}
 %
+% \begin{macro}{\__kernel_msg_show_eval:Nn, \__kernel_msg_log_eval:Nn, \@@_show_eval:nnN}
+%   A short-hand used for \cs{int_show:n} and similar functions that
+%   passes to \cs{tl_show:n} the result of applying |#1| (a
+%   function such as \cs{int_eval:n}) to the expression |#2|.  The use of
+%   \texttt{f}-expansion ensures that |#1| is expanded in the scope in which the
+%   show command is called, rather than in the group created by
+%   \cs{iow_wrap:nnnN}.  This is only important for expressions
+%   involving the \tn{currentgrouplevel} or \tn{currentgrouptype}.
+%   On the other hand we want the expression to be converted to a string
+%   with the usual escape character, hence within the wrapping code.
+%    \begin{macrocode}
+\cs_new_protected:Npn \__kernel_msg_show_eval:Nn #1#2
+  { \exp_args:Nf \@@_show_eval:nnN { #1 {#2} } {#2} \tl_show:n }
+\cs_new_protected:Npn \__kernel_msg_log_eval:Nn #1#2
+  { \exp_args:Nf \@@_show_eval:nnN { #1 {#2} } {#2} \tl_log:n }
+\cs_new_protected:Npn \@@_show_eval:nnN #1#2#3 { #3 { #2 = #1 } }
+%    \end{macrocode}
+% \end{macro}
+%
 % These are all retained purely for older \pkg{xparse} support.
 %
 % \begin{macro}{\__kernel_msg_new:nnnn, \__kernel_msg_new:nnn}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3names.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3pdf.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -304,6 +304,18 @@
 %   the logical truth of this evaluation.
 % \end{function}
 %
+% \begin{function}[added = 2018-05-10]
+%   {
+%     \bool_set_inverse:N , \bool_set_inverse:c ,
+%     \bool_gset_inverse:N, \bool_gset_inverse:c
+%   }
+%   \begin{syntax}
+%     \cs{bool_set_inverse:N} \meta{boolean}
+%   \end{syntax}
+%   Toggles the \meta{boolean} from \texttt{true} to \texttt{false} and
+%   conversely: sets it to the inverse of its current value.
+% \end{function}
+%
 % \begin{function}[EXP,pTF, updated = 2017-07-15]{\bool_if:N, \bool_if:c}
 %   \begin{syntax}
 %     \cs{bool_if_p:N} \meta{boolean}
@@ -625,6 +637,45 @@
 %   then loops until the \meta{boolean expression} is \texttt{false}.
 % \end{function}
 %
+% \begin{function}[added = 2023-05-03, EXP, noTF]{\bool_case:n}
+%   \begin{syntax}
+%     \cs{bool_case:nTF} \\
+%     ~~|{| \\
+%     ~~~~\Arg{boolexpr case_1} \Arg{code case_1} \\
+%     ~~~~\Arg{boolexpr case_2} \Arg{code case_2} \\
+%     ~~~~\ldots \\
+%     ~~~~\Arg{boolexpr case_n} \Arg{code case_n} \\
+%     ~~|}| \\
+%     ~~\Arg{true code}
+%     ~~\Arg{false code}
+%   \end{syntax}
+%   Evaluates in turn each of the \meta{boolean expression cases} until
+%   the first one that evaluates to \texttt{true}.
+%   The \meta{code} associated to this first case is left in the input
+%   stream, followed by the \meta{true code}, and other cases are
+%   discarded.  If none of the cases match then only the \meta{false
+%   code} is inserted. The function \cs{bool_case_true:n},
+%   which does nothing if there is no match, is
+%   also available. For example
+%   \begin{verbatim}
+%     \bool_case:nF
+%       {
+%         { \dim_compare_p:n { \l__mypkg_wd_dim <= 10pt } }
+%             { Fits }
+%         { \int_compare_p:n { \l__mypkg_total_int >= 10 } }
+%             { Many }
+%         { \l__mypkg_special_bool }
+%             { Special }
+%       }
+%       { No idea! }
+%   \end{verbatim}
+%   leaves \enquote{\texttt{Fits}} or \enquote{\texttt{Many}} or
+%   \enquote{\texttt{Special}} or \enquote{\texttt{No idea!}} in the
+%   input stream, in a way similar to some other language's
+%   \enquote{\texttt{if} \ldots\ \texttt{elseif} \ldots\ \texttt{elseif} \ldots\
+%   \texttt{else} \ldots}.
+% \end{function}
+%
 % \section{Producing multiple copies}
 %
 % \begin{function}[updated = 2011-07-04, EXP]{\prg_replicate:nn}
@@ -929,6 +980,19 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{macro}[added = 2018-05-10]
+%   {\bool_set_inverse:N, \bool_set_inverse:c, \bool_gset_inverse:N, \bool_gset_inverse:c}
+%   Set to \texttt{false} or \texttt{true} locally or globally.
+%    \begin{macrocode}
+\cs_new_protected:Npn \bool_set_inverse:N #1
+  { \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1 }
+\cs_generate_variant:Nn \bool_set_inverse:N { c }
+\cs_new_protected:Npn \bool_gset_inverse:N #1
+  { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 }
+\cs_generate_variant:Nn \bool_gset_inverse:N { c }
+%    \end{macrocode}
+% \end{macro}
+%
 % \subsection{Internal auxiliaries}
 %
 % \begin{variable}{\q_@@_recursion_tail,\q_@@_recursion_stop}
@@ -984,9 +1048,9 @@
 %   Show the truth value of the boolean.
 %    \begin{macrocode}
 \cs_new_protected:Npn \bool_show:n
-  { \msg_show_eval:Nn \bool_to_str:n }
+  { \__kernel_msg_show_eval:Nn \bool_to_str:n }
 \cs_new_protected:Npn \bool_log:n
-  { \msg_log_eval:Nn \bool_to_str:n }
+  { \__kernel_msg_log_eval:Nn \bool_to_str:n }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1458,6 +1522,46 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{variable}{\s_@@_mark,\s_@@_stop}
+%   Internal scan marks.
+%    \begin{macrocode}
+\scan_new:N \s_@@_mark
+\scan_new:N \s_@@_stop
+%    \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[EXP, noTF]{\bool_case:n}
+% \begin{macro}{\@@_case:NnTF}
+% \begin{macro}{\@@_case:w,a\@@_case_end:nw}
+%   For boolean cases the overall idea is the same as for
+%   \cs{tl_case:nnTF} as described in \pkg{l3tl}.
+%    \begin{macrocode}
+\cs_new:Npn \bool_case:nTF
+  { \exp:w \@@_case:nTF }
+\cs_new:Npn \bool_case:nT #1#2
+  { \exp:w \@@_case:nTF {#1} {#2} { } }
+\cs_new:Npn \bool_case:nF #1
+  { \exp:w \@@_case:nTF {#1} { } }
+\cs_new:Npn \bool_case:n #1
+  { \exp:w \@@_case:nTF {#1} { } { } }
+\cs_new:Npn \@@_case:nTF #1#2#3
+  {
+    \@@_case:w
+    #1 \c_true_bool { } \s_@@_mark {#2} \s_@@_mark {#3} \s_@@_stop
+  }
+\cs_new:Npn \@@_case:w #1#2
+  {
+    \bool_if:nTF {#1}
+      { \@@_case_end:nw {#2} }
+      { \@@_case:w }
+  }
+\cs_new:Npn \@@_case_end:nw #1#2#3 \s_@@_mark #4#5 \s_@@_stop
+  { \exp_end: #1 #4 }
+%    \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
 % \subsection{Producing multiple copies}
 %
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -3536,7 +3536,7 @@
         \@@_compile_cs_aux:Nn
       }
       {
-        \@@_quark_if_nil:NF #1 { \flag_raise_if_clear:n { @@_cs } }
+        \@@_quark_if_nil:NF #1 { \flag_ensure_raised:n { @@_cs } }
         \@@_use_none_delimit_by_q_recursion_stop:w
       }
   }
@@ -3558,7 +3558,7 @@
       {
         \@@_quark_if_nil:NF #1
           {
-            \flag_raise_if_clear:n { @@_cs }
+            \flag_ensure_raised:n { @@_cs }
             \@@_use_i_delimit_by_q_recursion_stop:nw
           }
         \@@_use_none_delimit_by_q_recursion_stop:w
@@ -6938,6 +6938,9 @@
 % \end{macro}
 %
 % \begin{macro}{\@@_group_end_extract_seq:N}
+% \begin{macro}{\@@_extract_seq:N}
+% \begin{macro}{\@@_extract_seq:NNn}
+% \begin{macro}{\@@_extract_seq_loop:Nw}
 %   The end-points of submatches are stored as entries of two arrays
 %   from \cs{l_@@_min_submatch_int} to \cs{l_@@_submatch_int}
 %   (exclusive). Extract the relevant ranges into \cs{g_@@_internal_tl},
@@ -6977,12 +6980,28 @@
             { \int_use:N \l_@@_added_end_int }
         }
     \group_end:
-    \cs_set_eq:NN \@@_tmp:w \@@_extract_map_loop:w
-    \seq_set_from_function:NnN #1
-      { \@@_extract_map:N } \exp_not:n
+    \@@_extract_seq:N #1
   }
+\cs_gset_protected:Npn \@@_extract_seq:N #1
+  {
+    \seq_clear:N #1
+    \cs_set_eq:NN \@@_tmp:w  \@@_extract_seq_loop:Nw
+    \exp_after:wN \@@_extract_seq:NNn
+    \exp_after:wN #1
+    \g_@@_internal_tl \use_none:nnn
+  }
+\cs_new_protected:Npn \@@_extract_seq:NNn #1#2#3
+  { #3 #2 #1 \prg_do_nothing: }
+\cs_new_protected:Npn \@@_extract_seq_loop:Nw #1#2 \@@_tmp:w #3
+  {
+    \seq_put_right:No #1 {#2}
+    #3 \@@_extract_seq_loop:Nw #1 \prg_do_nothing:
+  }
 %    \end{macrocode}
 % \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
 %
 % \begin{macro}[EXP]{\@@_extract_seq_aux:n, \@@_extract_seq_aux:ww}
 %   The \texttt{:n} auxiliary builds one item of the sequence of
@@ -7090,35 +7109,6 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP]
-%   {
-%     \@@_extract_map:N,
-%     \@@_extract_map_aux:NNn,
-%     \@@_extract_map_loop:w
-%   }
-%   This receives a |seq| internal function and maps it over all items
-%   in \cs{g_@@_internal_tl}.  This token list takes the form
-%   \cs{@@_tmp:w} |{}| \meta{item_1} \cs{@@_tmp:w} |{}| \meta{item_2}
-%   \ldots{} \cs{@@_tmp:w}, and the calling code has set \cs{@@_tmp:w}
-%   equal to \cs{@@_extract_map_loop:w}.  The loop is otherwise pretty
-%   standard, with \cs{prg_do_nothing:} to avoid losing braces.
-%    \begin{macrocode}
-\cs_new:Npn \@@_extract_map:N #1
-  {
-    \exp_after:wN \@@_extract_map_aux:NNn
-    \exp_after:wN #1
-    \g_@@_internal_tl \use_none:nnn
-  }
-\cs_new:Npn \@@_extract_map_aux:NNn #1#2#3
-  { #3 #2 #1 \prg_do_nothing: }
-\cs_new:Npn \@@_extract_map_loop:w #1#2 \@@_tmp:w #3
-  {
-    \exp_after:wN #1 \exp_after:wN {#2}
-    #3 \@@_extract_map_loop:w #1 \prg_do_nothing:
-  }
-%    \end{macrocode}
-% \end{macro}
-%
 % \begin{macro}{\@@_extract:, \@@_extract_aux:w}
 %   Our task here is to store the list of end-points of submatches, and
 %   store them in appropriate array entries, from

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -1608,50 +1608,42 @@
 %   somewhat moot. The integer variables are declared in \pkg{l3int}:
 %   load-order issues.
 %    \begin{macrocode}
-\cs_if_exist:NTF \tex_uniformdeviate:D
+\seq_new:N \g_@@_internal_seq
+\cs_new_protected:Npn \seq_shuffle:N { \@@_shuffle:NN \seq_set_eq:NN }
+\cs_new_protected:Npn \seq_gshuffle:N { \@@_shuffle:NN \seq_gset_eq:NN }
+\cs_new_protected:Npn \@@_shuffle:NN #1#2
   {
-    \seq_new:N \g_@@_internal_seq
-    \cs_new_protected:Npn \seq_shuffle:N { \@@_shuffle:NN \seq_set_eq:NN }
-    \cs_new_protected:Npn \seq_gshuffle:N { \@@_shuffle:NN \seq_gset_eq:NN }
-    \cs_new_protected:Npn \@@_shuffle:NN #1#2
+    \int_compare:nNnTF { \seq_count:N #2 } > \c_max_register_int
       {
-        \int_compare:nNnTF { \seq_count:N #2 } > \c_max_register_int
-          {
-            \msg_error:nnx { seq } { shuffle-too-large }
-              { \token_to_str:N #2 }
-          }
-          {
-            \group_begin:
-              \int_zero:N \l_@@_internal_a_int
-              \@@_push_item_def:
-              \cs_gset_eq:NN \@@_item:n \@@_shuffle_item:n
-              #2
-              \@@_pop_item_def:
-              \seq_gset_from_inline_x:Nnn \g_@@_internal_seq
-                { \int_step_function:nN { \l_@@_internal_a_int } }
-                { \tex_the:D \tex_toks:D ##1 }
-            \group_end:
-            #1 #2 \g_@@_internal_seq
-            \seq_gclear:N \g_@@_internal_seq
-          }
+        \msg_error:nnx { seq } { shuffle-too-large }
+          { \token_to_str:N #2 }
       }
-    \cs_new_protected:Npn \@@_shuffle_item:n
       {
-        \int_incr:N \l_@@_internal_a_int
-        \int_set:Nn \l_@@_internal_b_int
-          { 1 + \tex_uniformdeviate:D \l_@@_internal_a_int }
-        \tex_toks:D \l_@@_internal_a_int
-          = \tex_toks:D \l_@@_internal_b_int
-        \tex_toks:D \l_@@_internal_b_int
-      }
+        \group_begin:
+          \int_zero:N \l_@@_internal_a_int
+          \@@_push_item_def:
+          \cs_gset_eq:NN \@@_item:n \@@_shuffle_item:n
+          #2
+          \@@_pop_item_def:
+          \seq_gclear:N \g_@@_internal_seq
+          \int_step_inline:nn \l_@@_internal_a_int
+            {
+              \seq_gput_right:Nx \g_@@_internal_seq
+                { \tex_the:D \tex_toks:D ##1 }
+            }
+        \group_end:
+        #1 #2 \g_@@_internal_seq
+        \seq_gclear:N \g_@@_internal_seq
+    }
   }
+\cs_new_protected:Npn \@@_shuffle_item:n
   {
-    \cs_new_protected:Npn \seq_shuffle:N #1
-      {
-        \msg_error:nnn { kernel } { fp-no-random }
-          { \seq_shuffle:N #1 }
-      }
-    \cs_new_eq:NN \seq_gshuffle:N \seq_shuffle:N
+    \int_incr:N \l_@@_internal_a_int
+    \int_set:Nn \l_@@_internal_b_int
+      { 1 + \tex_uniformdeviate:D \l_@@_internal_a_int }
+    \tex_toks:D \l_@@_internal_a_int
+      = \tex_toks:D \l_@@_internal_b_int
+    \tex_toks:D \l_@@_internal_b_int
   }
 \cs_generate_variant:Nn \seq_shuffle:N { c }
 \cs_generate_variant:Nn \seq_gshuffle:N { c }

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -1738,7 +1738,7 @@
 %   dimension expressions: this gives a more unified output.
 %    \begin{macrocode}
 \cs_new_protected:Npn \dim_show:n
-  { \msg_show_eval:Nn \dim_eval:n }
+  { \__kernel_msg_show_eval:Nn \dim_eval:n }
 %    \end{macrocode}
 %  \end{macro}
 %
@@ -1748,7 +1748,7 @@
 \cs_new_eq:NN \dim_log:N \__kernel_register_log:N
 \cs_new_eq:NN \dim_log:c \__kernel_register_log:c
 \cs_new_protected:Npn \dim_log:n
-  { \msg_log_eval:Nn \dim_eval:n }
+  { \__kernel_msg_log_eval:Nn \dim_eval:n }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -1996,7 +1996,7 @@
 %   skip expressions: this gives a more unified output.
 %    \begin{macrocode}
 \cs_new_protected:Npn \skip_show:n
-  { \msg_show_eval:Nn \skip_eval:n }
+  { \__kernel_msg_show_eval:Nn \skip_eval:n }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2006,7 +2006,7 @@
 \cs_new_eq:NN \skip_log:N \__kernel_register_log:N
 \cs_new_eq:NN \skip_log:c \__kernel_register_log:c
 \cs_new_protected:Npn \skip_log:n
-  { \msg_log_eval:Nn \skip_eval:n }
+  { \__kernel_msg_log_eval:Nn \skip_eval:n }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2195,7 +2195,7 @@
 %   muskip expressions: this gives a more unified output.
 %    \begin{macrocode}
 \cs_new_protected:Npn \muskip_show:n
-  { \msg_show_eval:Nn \muskip_eval:n }
+  { \__kernel_msg_show_eval:Nn \muskip_eval:n }
 %    \end{macrocode}
 % \end{macro}
 %
@@ -2205,7 +2205,7 @@
 \cs_new_eq:NN \muskip_log:N \__kernel_register_log:N
 \cs_new_eq:NN \muskip_log:c \__kernel_register_log:c
 \cs_new_protected:Npn \muskip_log:n
-  { \msg_log_eval:Nn \muskip_eval:n }
+  { \__kernel_msg_log_eval:Nn \muskip_eval:n }
 %    \end{macrocode}
 % \end{macro}
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -428,12 +428,13 @@
   {
     \group_begin:
       \@@_main:NNNn #1 #2 #4 {#5}
-      \seq_gset_from_inline_x:Nnn \g_@@_internal_seq
+      \seq_gclear:N \g_@@_internal_seq
+      \int_step_inline:nnn
+        \l_@@_min_int { \l_@@_top_int - 1 }
         {
-          \int_step_function:nnN
-            { \l_@@_min_int } { \l_@@_top_int - 1 }
+          \seq_gput_right:Nx \g_@@_internal_seq
+            { \tex_the:D \tex_toks:D ##1 }
         }
-        { \tex_the:D \tex_toks:D ##1 }
     \group_end:
     #3 #4 \g_@@_internal_seq
     \seq_gclear:N \g_@@_internal_seq

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str-convert.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3str.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -121,6 +121,27 @@
 %   \tn{fmtname}).
 % \end{variable}
 %
+% \begin{variable}[added = 2018-05-02]{\c_sys_engine_version_str}
+%   The version string of the current engine, in the same form as
+%   given in the banner issued when running a job. For \pdfTeX{}
+%   and \LuaTeX{} this is of the form
+%   \begin{quote}
+%     \meta{major}.\meta{minor}.\meta{revision}
+%   \end{quote}
+%   For \XeTeX{}, the form is
+%   \begin{quote}
+%     \meta{major}.\meta{minor}
+%   \end{quote}
+%   For \pTeX{} and \upTeX{}, only releases since \TeX{} Live 2018
+%   make the data available, and the form is more complex, as it comprises
+%   the \pTeX{} version, the \upTeX{} version and the e-\pTeX{} version.
+%   \begin{quote}
+%     p\meta{major}.\meta{minor}.\meta{revision}-u\meta{major}.\meta{minor}^^A
+%     -\meta{epTeX}
+%   \end{quote}
+%   where the |u| part is only present for \upTeX{}.
+% \end{variable}
+%
 % \begin{function}[added = 2020-09-24, EXP]{\sys_timer:}
 %   \begin{syntax}
 %     \cs{sys_timer:}
@@ -472,18 +493,69 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \subsubsection{Randomness}
-%
-% This candidate function is placed there because
-% \cs{sys_if_rand_exist:TF} is used in \pkg{l3fp-rand}.
-%
-% \begin{macro}[EXP, pTF]{\sys_if_rand_exist:}
-%   Currently, randomness exists under \pdfTeX{}, \LuaTeX{}, \pTeX{} and \upTeX{}.
+% \begin{variable}{\c_sys_engine_version_str}
+%   Various different engines, various different ways to extract the
+%   data!
 %    \begin{macrocode}
-\@@_const:nn { sys_if_rand_exist }
-  { \cs_if_exist_p:N \tex_uniformdeviate:D }
+\str_const:Nx \c_sys_engine_version_str
+  {
+    \str_case:on \c_sys_engine_str
+      {
+        { pdftex }
+          {
+            \int_div_truncate:nn { \tex_pdftexversion:D } { 100 }
+            .
+            \int_mod:nn { \tex_pdftexversion:D } { 100 }
+            .
+            \tex_pdftexrevision:D
+          }
+        { ptex }
+          {
+            \cs_if_exist:NT \tex_ptexversion:D
+              {
+                p
+                \int_use:N  \tex_ptexversion:D
+                .
+                \int_use:N \tex_ptexminorversion:D
+                \tex_ptexrevision:D
+                -
+                \int_use:N \tex_epTeXversion:D
+              }
+          }
+        { luatex }
+          {
+            \int_div_truncate:nn { \tex_luatexversion:D } { 100 }
+            .
+            \int_mod:nn { \tex_luatexversion:D } { 100 }
+            .
+            \tex_luatexrevision:D
+          }
+        { uptex }
+          {
+            \cs_if_exist:NT \tex_ptexversion:D
+              {
+                p
+                \int_use:N  \tex_ptexversion:D
+                .
+                \int_use:N \tex_ptexminorversion:D
+                \tex_ptexrevision:D
+                -
+                u
+                \int_use:N  \tex_uptexversion:D
+                \tex_uptexrevision:D
+                -
+                \int_use:N \tex_epTeXversion:D
+              }
+          }
+        { xetex }
+          {
+            \int_use:N \tex_XeTeXversion:D
+            \tex_XeTeXrevision:D
+          }
+      }
+  }
 %    \end{macrocode}
-% \end{macro}
+% \end{variable}
 %
 % \subsubsection{Platform}
 %
@@ -856,23 +928,11 @@
 % \subsubsection{Random numbers}
 %
 % \begin{macro}[EXP]{\sys_rand_seed:}
-%   Unpack the primitive.  When random numbers are not available, we
-%   return zero after an error (and incidentally make sure the number of
-%   expansions needed is the same as with random numbers available).
+%   Unpack the primitive.
 %    \begin{macrocode}
 \@@_everyjob:n
   {
-    \sys_if_rand_exist:TF
-      { \cs_new:Npn \sys_rand_seed: { \tex_the:D \tex_randomseed:D } }
-      {
-        \cs_new:Npn \sys_rand_seed:
-          {
-            \int_value:w
-            \msg_expandable_error:nnn { kernel } { fp-no-random }
-              { \sys_rand_seed: }
-            \c_zero_int
-          }
-      }
+    \cs_new:Npn \sys_rand_seed: { \tex_the:D \tex_randomseed:D }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -882,18 +942,8 @@
 %    \begin{macrocode}
 \@@_everyjob:n
   {
-    \sys_if_rand_exist:TF
-      {
-        \cs_new_protected:Npn \sys_gset_rand_seed:n #1
-          { \tex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
-      }
-      {
-        \cs_new_protected:Npn \sys_gset_rand_seed:n #1
-          {
-            \msg_error:nnn { kernel } { fp-no-random }
-              { \sys_gset_rand_seed:n {#1} }
-          }
-      }
+    \cs_new_protected:Npn \sys_gset_rand_seed:n #1
+      { \tex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
   }
 %    \end{macrocode}
 % \end{macro}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-case.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-map.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text-purify.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3text.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -44,7 +44,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -1048,8 +1048,6 @@
 %^^A   The behavior of \cs{tl_range:Nnn} is exactly the same, acting on the
 %^^A   contents of the tl variable.
 %
-%   For better performance, see  \cs{tl_range_braced:nnn} and
-%   \cs{tl_range_unbraced:nnn}.
 %   \begin{texnote}
 %     The result is returned within the \tn{unexpanded}
 %     primitive (\cs{exp_not:n}), which means that the \meta{item}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3token.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %
@@ -155,6 +155,11 @@
 %   \end{texnote}
 % \end{function}
 %
+% \begin{variable}[added = 2017-08-07]{\c_catcode_active_space_tl}
+%   Token list containing one character with category code $13$,
+%   (\enquote{active}), and character code $32$ (space).
+% \end{variable}
+%
 % \begin{variable}[added = 2011-09-05]{\c_catcode_other_space_tl}
 %   Token list containing one character with category code $12$,
 %   (\enquote{other}), and character code $32$ (space).
@@ -1838,6 +1843,21 @@
 % \end{macro}
 % \end{macro}
 %
+% \begin{variable}{\c_catcode_active_space_tl}
+%   While \cs{char_generate:nn} can produce active characters in some
+%   engines it cannot in general.  It would be possible to simply change
+%   the catcode of space but then the code would need to avoid all
+%   spaces, making it quite unreadable.  Instead we use the primitive
+%   \cs{tex_lowercase:D} trick.
+%    \begin{macrocode}
+\group_begin:
+  \char_set_catcode_active:N *
+  \char_set_lccode:nn { `* } { `\ }
+  \tex_lowercase:D { \tl_const:Nn \c_catcode_active_space_tl { * } }
+\group_end:
+%    \end{macrocode}
+% \end{variable}
+%
 % \begin{macro}{\c_catcode_other_space_tl}
 %   Create a space with category code $12$: an \enquote{other} space.
 %    \begin{macrocode}

Modified: trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -43,7 +43,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2023-04-20}
+% \date{Released 2023-05-05}
 %
 % \maketitle
 %

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex	2023-05-05 21:23:26 UTC (rev 67026)
@@ -71,7 +71,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-04-20}%
+\def\ExplFileDate{2023-05-05}%
 \begingroup
   \def\next{\endgroup}%
   \expandafter\ifx\csname PackageError\endcsname\relax
@@ -5838,50 +5838,42 @@
   }
 \prg_generate_conditional_variant:Nnn \seq_if_empty:N
   { c } { p , T , F , TF }
-\cs_if_exist:NTF \tex_uniformdeviate:D
+\seq_new:N \g__seq_internal_seq
+\cs_new_protected:Npn \seq_shuffle:N { \__seq_shuffle:NN \seq_set_eq:NN }
+\cs_new_protected:Npn \seq_gshuffle:N { \__seq_shuffle:NN \seq_gset_eq:NN }
+\cs_new_protected:Npn \__seq_shuffle:NN #1#2
   {
-    \seq_new:N \g__seq_internal_seq
-    \cs_new_protected:Npn \seq_shuffle:N { \__seq_shuffle:NN \seq_set_eq:NN }
-    \cs_new_protected:Npn \seq_gshuffle:N { \__seq_shuffle:NN \seq_gset_eq:NN }
-    \cs_new_protected:Npn \__seq_shuffle:NN #1#2
+    \int_compare:nNnTF { \seq_count:N #2 } > \c_max_register_int
       {
-        \int_compare:nNnTF { \seq_count:N #2 } > \c_max_register_int
-          {
-            \msg_error:nnx { seq } { shuffle-too-large }
-              { \token_to_str:N #2 }
-          }
-          {
-            \group_begin:
-              \int_zero:N \l__seq_internal_a_int
-              \__seq_push_item_def:
-              \cs_gset_eq:NN \__seq_item:n \__seq_shuffle_item:n
-              #2
-              \__seq_pop_item_def:
-              \seq_gset_from_inline_x:Nnn \g__seq_internal_seq
-                { \int_step_function:nN { \l__seq_internal_a_int } }
-                { \tex_the:D \tex_toks:D ##1 }
-            \group_end:
-            #1 #2 \g__seq_internal_seq
-            \seq_gclear:N \g__seq_internal_seq
-          }
+        \msg_error:nnx { seq } { shuffle-too-large }
+          { \token_to_str:N #2 }
       }
-    \cs_new_protected:Npn \__seq_shuffle_item:n
       {
-        \int_incr:N \l__seq_internal_a_int
-        \int_set:Nn \l__seq_internal_b_int
-          { 1 + \tex_uniformdeviate:D \l__seq_internal_a_int }
-        \tex_toks:D \l__seq_internal_a_int
-          = \tex_toks:D \l__seq_internal_b_int
-        \tex_toks:D \l__seq_internal_b_int
-      }
+        \group_begin:
+          \int_zero:N \l__seq_internal_a_int
+          \__seq_push_item_def:
+          \cs_gset_eq:NN \__seq_item:n \__seq_shuffle_item:n
+          #2
+          \__seq_pop_item_def:
+          \seq_gclear:N \g__seq_internal_seq
+          \int_step_inline:nn \l__seq_internal_a_int
+            {
+              \seq_gput_right:Nx \g__seq_internal_seq
+                { \tex_the:D \tex_toks:D ##1 }
+            }
+        \group_end:
+        #1 #2 \g__seq_internal_seq
+        \seq_gclear:N \g__seq_internal_seq
+    }
   }
+\cs_new_protected:Npn \__seq_shuffle_item:n
   {
-    \cs_new_protected:Npn \seq_shuffle:N #1
-      {
-        \msg_error:nnn { kernel } { fp-no-random }
-          { \seq_shuffle:N #1 }
-      }
-    \cs_new_eq:NN \seq_gshuffle:N \seq_shuffle:N
+    \int_incr:N \l__seq_internal_a_int
+    \int_set:Nn \l__seq_internal_b_int
+      { 1 + \tex_uniformdeviate:D \l__seq_internal_a_int }
+    \tex_toks:D \l__seq_internal_a_int
+      = \tex_toks:D \l__seq_internal_b_int
+    \tex_toks:D \l__seq_internal_b_int
   }
 \cs_generate_variant:Nn \seq_shuffle:N { c }
 \cs_generate_variant:Nn \seq_gshuffle:N { c }
@@ -7117,11 +7109,11 @@
 \cs_new_eq:NN \int_show:N \__kernel_register_show:N
 \cs_generate_variant:Nn \int_show:N { c }
 \cs_new_protected:Npn \int_show:n
-  { \msg_show_eval:Nn \int_eval:n }
+  { \__kernel_msg_show_eval:Nn \int_eval:n }
 \cs_new_eq:NN \int_log:N \__kernel_register_log:N
 \cs_generate_variant:Nn \int_log:N { c }
 \cs_new_protected:Npn \int_log:n
-  { \msg_log_eval:Nn \int_eval:n }
+  { \__kernel_msg_log_eval:Nn \int_eval:n }
 \int_const:Nn \c_one_int { 1 }
 \int_const:Nn \c_max_int { 2 147 483 647 }
 \int_const:Nn \c_max_char_int
@@ -7199,6 +7191,13 @@
     \cs:w flag~#1 \exp_after:wN \cs_end:
     \int_value:w \flag_height:n {#1} ;
   }
+\cs_new:Npn \flag_ensure_raised:n #1
+  {
+    \if_cs_exist:w flag~#1~0 \cs_end:
+    \else:
+      \cs:w flag~#1 \cs_end: 0 ;
+    \fi:
+  }
 %% File: l3prg.dtx
 \cs_new_eq:NN \if_predicate:w \tex_ifodd:D
 \cs_new_protected:Npn \bool_new:N #1 { \cs_new_eq:NN #1 \c_false_bool }
@@ -7237,6 +7236,12 @@
   }
 \cs_generate_variant:Nn \bool_set:Nn  { c }
 \cs_generate_variant:Nn \bool_gset:Nn { c }
+\cs_new_protected:Npn \bool_set_inverse:N #1
+  { \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1 }
+\cs_generate_variant:Nn \bool_set_inverse:N { c }
+\cs_new_protected:Npn \bool_gset_inverse:N #1
+  { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 }
+\cs_generate_variant:Nn \bool_gset_inverse:N { c }
 \quark_new:N \q__bool_recursion_tail
 \quark_new:N \q__bool_recursion_stop
 \cs_new:Npn \__bool_use_i_delimit_by_q_recursion_stop:nw
@@ -7255,9 +7260,9 @@
 \cs_generate_variant:Nn \bool_to_str:N { c }
 \cs_new:Npn \bool_to_str:n #1 { \bool_if:nTF {#1} { true } { false } }
 \cs_new_protected:Npn \bool_show:n
-  { \msg_show_eval:Nn \bool_to_str:n }
+  { \__kernel_msg_show_eval:Nn \bool_to_str:n }
 \cs_new_protected:Npn \bool_log:n
-  { \msg_log_eval:Nn \bool_to_str:n }
+  { \__kernel_msg_log_eval:Nn \bool_to_str:n }
 \cs_new_protected:Npn \bool_show:N { \__bool_show:NN \tl_show:n }
 \cs_generate_variant:Nn \bool_show:N { c }
 \cs_new_protected:Npn \bool_log:N { \__bool_show:NN \tl_log:n }
@@ -7444,6 +7449,29 @@
     #2
     \bool_if:nF {#1} { \bool_do_until:nn {#1} {#2}  }
   }
+\scan_new:N \s__bool_mark
+\scan_new:N \s__bool_stop
+\cs_new:Npn \bool_case:nTF
+  { \exp:w \__bool_case:nTF }
+\cs_new:Npn \bool_case:nT #1#2
+  { \exp:w \__bool_case:nTF {#1} {#2} { } }
+\cs_new:Npn \bool_case:nF #1
+  { \exp:w \__bool_case:nTF {#1} { } }
+\cs_new:Npn \bool_case:n #1
+  { \exp:w \__bool_case:nTF {#1} { } { } }
+\cs_new:Npn \__bool_case:nTF #1#2#3
+  {
+    \__bool_case:w
+    #1 \c_true_bool { } \s__bool_mark {#2} \s__bool_mark {#3} \s__bool_stop
+  }
+\cs_new:Npn \__bool_case:w #1#2
+  {
+    \bool_if:nTF {#1}
+      { \__bool_case_end:nw {#2} }
+      { \__bool_case:w }
+  }
+\cs_new:Npn \__bool_case_end:nw #1#2#3 \s__bool_mark #4#5 \s__bool_stop
+  { \exp_end: #1 #4 }
 \cs_new:Npn \prg_replicate:nn #1
   {
     \exp:w
@@ -7594,8 +7622,63 @@
       }
       { unknown }
   }
-\__sys_const:nn { sys_if_rand_exist }
-  { \cs_if_exist_p:N \tex_uniformdeviate:D }
+\str_const:Nx \c_sys_engine_version_str
+  {
+    \str_case:on \c_sys_engine_str
+      {
+        { pdftex }
+          {
+            \int_div_truncate:nn { \tex_pdftexversion:D } { 100 }
+            .
+            \int_mod:nn { \tex_pdftexversion:D } { 100 }
+            .
+            \tex_pdftexrevision:D
+          }
+        { ptex }
+          {
+            \cs_if_exist:NT \tex_ptexversion:D
+              {
+                p
+                \int_use:N  \tex_ptexversion:D
+                .
+                \int_use:N \tex_ptexminorversion:D
+                \tex_ptexrevision:D
+                -
+                \int_use:N \tex_epTeXversion:D
+              }
+          }
+        { luatex }
+          {
+            \int_div_truncate:nn { \tex_luatexversion:D } { 100 }
+            .
+            \int_mod:nn { \tex_luatexversion:D } { 100 }
+            .
+            \tex_luatexrevision:D
+          }
+        { uptex }
+          {
+            \cs_if_exist:NT \tex_ptexversion:D
+              {
+                p
+                \int_use:N  \tex_ptexversion:D
+                .
+                \int_use:N \tex_ptexminorversion:D
+                \tex_ptexrevision:D
+                -
+                u
+                \int_use:N  \tex_uptexversion:D
+                \tex_uptexrevision:D
+                -
+                \int_use:N \tex_epTeXversion:D
+              }
+          }
+        { xetex }
+          {
+            \int_use:N \tex_XeTeXversion:D
+            \tex_XeTeXrevision:D
+          }
+      }
+  }
 \cs_new_protected:Npn \sys_load_backend:n #1
   {
     \sys_finalise:
@@ -7786,32 +7869,12 @@
   }
 \__sys_everyjob:n
   {
-    \sys_if_rand_exist:TF
-      { \cs_new:Npn \sys_rand_seed: { \tex_the:D \tex_randomseed:D } }
-      {
-        \cs_new:Npn \sys_rand_seed:
-          {
-            \int_value:w
-            \msg_expandable_error:nnn { kernel } { fp-no-random }
-              { \sys_rand_seed: }
-            \c_zero_int
-          }
-      }
+    \cs_new:Npn \sys_rand_seed: { \tex_the:D \tex_randomseed:D }
   }
 \__sys_everyjob:n
   {
-    \sys_if_rand_exist:TF
-      {
-        \cs_new_protected:Npn \sys_gset_rand_seed:n #1
-          { \tex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
-      }
-      {
-        \cs_new_protected:Npn \sys_gset_rand_seed:n #1
-          {
-            \msg_error:nnn { kernel } { fp-no-random }
-              { \sys_gset_rand_seed:n {#1} }
-          }
-      }
+    \cs_new_protected:Npn \sys_gset_rand_seed:n #1
+      { \tex_setrandomseed:D \int_eval:n {#1} \exp_stop_f: }
   }
 \sys_if_engine_luatex:TF
   {
@@ -8961,6 +9024,11 @@
   }
 \cs_new:Npn \__char_str_change_case:n #1
   { \char_generate:nn {#1} { 12 } }
+\group_begin:
+  \char_set_catcode_active:N *
+  \char_set_lccode:nn { `* } { `\ }
+  \tex_lowercase:D { \tl_const:Nn \c_catcode_active_space_tl { * } }
+\group_end:
 \tl_const:Nx \c_catcode_other_space_tl { \char_generate:nn { `\  } { 12 } }
 \scan_new:N \s__token_mark
 \scan_new:N \s__token_stop
@@ -10248,6 +10316,24 @@
         }
     }
 \group_end:
+\cs_new:Npx \msg_show_item:n #1
+  { ^^J > ~ \c_space_tl \exp_not:N \tl_to_str:n { {#1} } }
+\cs_new:Npx \msg_show_item_unbraced:n #1
+  { ^^J > ~ \c_space_tl \exp_not:N \tl_to_str:n {#1} }
+\cs_new:Npx \msg_show_item:nn #1#2
+  {
+    ^^J > \use:nn { ~ } { ~ }
+    \exp_not:N \tl_to_str:n { {#1} }
+    \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
+    \exp_not:N \tl_to_str:n { {#2} }
+  }
+\cs_new:Npx \msg_show_item_unbraced:nn #1#2
+  {
+    ^^J > \use:nn { ~ } { ~ }
+    \exp_not:N \tl_to_str:n {#1}
+    \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
+    \exp_not:N \tl_to_str:n {#2}
+  }
 \cs_new:Npn \__msg_class_chk_exist:nT #1
   {
     \cs_if_free:cTF { __msg_ #1 _code:nnnnnn }
@@ -10382,6 +10468,11 @@
   }
 \cs_generate_variant:Nn \__msg_redirect_loop_chk:nnn { o }
 \cs_new:Npn \__msg_redirect_loop_list:n #1 { {#1} ~ => ~ }
+\cs_new_protected:Npn \__kernel_msg_show_eval:Nn #1#2
+  { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_show:n }
+\cs_new_protected:Npn \__kernel_msg_log_eval:Nn #1#2
+  { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_log:n }
+\cs_new_protected:Npn \__msg_show_eval:nnN #1#2#3 { #3 { #2 = #1 } }
 \cs_new_protected:Npn \__kernel_msg_new:nnnn #1
   { \msg_new:nnnn { LaTeX / #1 } }
 \cs_new_protected:Npn \__kernel_msg_new:nnn #1
@@ -10854,6 +10945,27 @@
         { {#2} }
         {  \exp_not:N \__kernel_file_name_quote:n {#2} \scan_stop: }
   }
+\cs_new_protected:Npn \ior_shell_open:Nn #1#2
+  {
+    \sys_if_shell:TF
+      { \exp_args:No \__ior_shell_open:nN { \tl_to_str:n {#2} } #1 }
+      { \msg_error:nn { ior } { pipe-failed } }
+  }
+\cs_new_protected:Npn \__ior_shell_open:nN #1#2
+  {
+    \tl_if_in:nnTF {#1} { " }
+      {
+        \msg_error:nnx
+          { kernel } { quote-in-shell } {#1}
+      }
+      { \__kernel_ior_open:Nn #2 { |#1 } }
+  }
+\msg_new:nnnn { ior } { pipe-failed }
+  { Cannot~run~piped~system~commands. }
+  {
+    LaTeX~tried~to~call~a~system~process~but~this~was~not~possible.\\
+    Try~the~"--shell-escape"~(or~"--enable-pipes")~option.
+  }
 \cs_new_protected:Npn \ior_close:N #1
   {
     \int_compare:nT { -1 < #1 < \c__ior_term_ior }
@@ -11184,16 +11296,16 @@
         \c_catcode_other_space_tl
       }
   }
-\cs_new_protected:Npn \iow_allow_break:
+\cs_new_protected:Npn \iow_wrap_allow_break:
   {
     \msg_error:nnnn { kernel } { iow-indent }
-      { \iow_wrap:nnnN } { \iow_allow_break: }
+      { \iow_wrap:nnnN } { \iow_wrap_allow_break: }
   }
-\cs_new:Npx \__iow_allow_break: { \c__iow_wrap_allow_break_marker_tl }
-\cs_new:Npn \__iow_allow_break_error:
+\cs_new:Npx \__iow_wrap_allow_break: { \c__iow_wrap_allow_break_marker_tl }
+\cs_new:Npn \__iow_wrap_allow_break_error:
   {
     \msg_expandable_error:nnnn { kernel } { iow-indent }
-      { \iow_wrap:nnnN } { \iow_allow_break: }
+      { \iow_wrap:nnnN } { \iow_wrap_allow_break: }
   }
 \cs_new_protected:Npn \iow_indent:n #1
   {
@@ -11226,12 +11338,12 @@
       \int_set:Nn \tex_escapechar:D { 92 }
       \cs_set_eq:NN \\ \iow_newline:
       \cs_set_eq:NN \  \c_catcode_other_space_tl
-      \cs_set_eq:NN \iow_allow_break: \__iow_allow_break:
+      \cs_set_eq:NN \iow_wrap_allow_break: \__iow_wrap_allow_break:
       \cs_set_eq:NN \iow_indent:n \__iow_indent:n
       #3
       \cs_set_eq:NN \protect \token_to_str:N
       \__kernel_tl_set:Nx \l__iow_wrap_tl {#1}
-      \cs_set_eq:NN \iow_allow_break: \__iow_allow_break_error:
+      \cs_set_eq:NN \iow_wrap_allow_break: \__iow_wrap_allow_break_error:
       \cs_set_eq:NN \iow_indent:n \__iow_indent_error:n
       \__kernel_tl_set:Nx \l__iow_newline_tl { \iow_newline: #2 }
       \__kernel_tl_set:Nx \l__iow_newline_tl { \tl_to_str:N \l__iow_newline_tl }
@@ -12646,11 +12758,11 @@
 \cs_new_eq:NN  \dim_show:N \__kernel_register_show:N
 \cs_generate_variant:Nn \dim_show:N { c }
 \cs_new_protected:Npn \dim_show:n
-  { \msg_show_eval:Nn \dim_eval:n }
+  { \__kernel_msg_show_eval:Nn \dim_eval:n }
 \cs_new_eq:NN \dim_log:N \__kernel_register_log:N
 \cs_new_eq:NN \dim_log:c \__kernel_register_log:c
 \cs_new_protected:Npn \dim_log:n
-  { \msg_log_eval:Nn \dim_eval:n }
+  { \__kernel_msg_log_eval:Nn \dim_eval:n }
 \dim_const:Nn \c_zero_dim { 0 pt }
 \dim_const:Nn \c_max_dim { 16383.99999 pt }
 \dim_new:N \l_tmpa_dim
@@ -12738,11 +12850,11 @@
 \cs_new_eq:NN  \skip_show:N \__kernel_register_show:N
 \cs_generate_variant:Nn \skip_show:N { c }
 \cs_new_protected:Npn \skip_show:n
-  { \msg_show_eval:Nn \skip_eval:n }
+  { \__kernel_msg_show_eval:Nn \skip_eval:n }
 \cs_new_eq:NN \skip_log:N \__kernel_register_log:N
 \cs_new_eq:NN \skip_log:c \__kernel_register_log:c
 \cs_new_protected:Npn \skip_log:n
-  { \msg_log_eval:Nn \skip_eval:n }
+  { \__kernel_msg_log_eval:Nn \skip_eval:n }
 \skip_const:Nn \c_zero_skip { \c_zero_dim }
 \skip_const:Nn \c_max_skip { \c_max_dim }
 \skip_new:N \l_tmpa_skip
@@ -12806,11 +12918,11 @@
 \cs_new_eq:NN  \muskip_show:N \__kernel_register_show:N
 \cs_generate_variant:Nn \muskip_show:N { c }
 \cs_new_protected:Npn \muskip_show:n
-  { \msg_show_eval:Nn \muskip_eval:n }
+  { \__kernel_msg_show_eval:Nn \muskip_eval:n }
 \cs_new_eq:NN \muskip_log:N \__kernel_register_log:N
 \cs_new_eq:NN \muskip_log:c \__kernel_register_log:c
 \cs_new_protected:Npn \muskip_log:n
-  { \msg_log_eval:Nn \muskip_eval:n }
+  { \__kernel_msg_log_eval:Nn \muskip_eval:n }
 \muskip_const:Nn \c_zero_muskip { 0 mu }
 \muskip_const:Nn \c_max_muskip  { 16383.99999 mu }
 \muskip_new:N \l_tmpa_muskip
@@ -14302,8 +14414,6 @@
             \__kernel_intarray_gset:Nnn #1 \l__intarray_loop_int { \int_eval:n {##1} } }
       }
     \cs_generate_variant:Nn \intarray_const_from_clist:Nn { c }
-    \cs_new:Npn \intarray_to_clist:N #1 { \__intarray_to_clist:Nn #1 { , } }
-    \cs_generate_variant:Nn \intarray_to_clist:N { c }
     \cs_new:Npn \__kernel_intarray_range_to_clist:Nnn #1#2#3
       {
         \__intarray_range_to_clist:w #1
@@ -14451,8 +14561,6 @@
         \__intarray_gset_overflow_test:nw {#1}
         \__kernel_intarray_gset:Nnn #2 \l__intarray_loop_int {#1}
       }
-    \cs_new:Npn \intarray_to_clist:N #1 { \__intarray_to_clist:Nn #1 { , } }
-    \cs_generate_variant:Nn \intarray_to_clist:N { c }
     \cs_new:Npn \__intarray_to_clist:Nn #1#2
       {
         \int_compare:nNnF { \intarray_count:N #1 } = \c_zero_int
@@ -14519,73 +14627,6 @@
           { }
       }
   }
-\cs_new_protected:Npn \intarray_gset_rand:Nn #1
-  { \intarray_gset_rand:Nnn #1 { 1 } }
-\cs_generate_variant:Nn \intarray_gset_rand:Nn { c }
-\sys_if_rand_exist:TF
-  {
-    \cs_new_protected:Npn \intarray_gset_rand:Nnn #1#2#3
-      {
-        \__intarray_gset_rand:Nff #1
-          { \int_eval:n {#2} } { \int_eval:n {#3} }
-      }
-    \cs_new_protected:Npn \__intarray_gset_rand:Nnn #1#2#3
-      {
-        \int_compare:nNnTF {#2} > {#3}
-          {
-            \msg_expandable_error:nnnn
-              { kernel } { randint-backward-range } {#2} {#3}
-            \__intarray_gset_rand:Nnn #1 {#3} {#2}
-          }
-          {
-            \__intarray_gset_overflow_test:nw {#2}
-            \__intarray_gset_rand_auxi:Nnnn #1 { } {#2} {#3}
-          }
-      }
-    \cs_generate_variant:Nn \__intarray_gset_rand:Nnn { Nff }
-    \cs_new_protected:Npn \__intarray_gset_rand_auxi:Nnnn #1#2#3#4
-      {
-        \__intarray_gset_overflow_test:nw {#4}
-        \__intarray_gset_rand_auxii:Nnnn #1 { } {#4} {#3}
-      }
-    \cs_new_protected:Npn \__intarray_gset_rand_auxii:Nnnn #1#2#3#4
-      {
-        \exp_args:NNf \__intarray_gset_rand_auxiii:Nnnn #1
-          { \int_eval:n { #3 - #4 + 1 } } {#4} {#3}
-      }
-    \cs_new_protected:Npn \__intarray_gset_rand_auxiii:Nnnn #1#2#3#4
-      {
-        \exp_args:NNf \__intarray_gset_all_same:Nn #1
-          {
-            \int_compare:nNnTF {#2} > \c__kernel_randint_max_int
-              {
-                \exp_stop_f:
-                \int_eval:n { \__kernel_randint:nn {#3} {#4} }
-              }
-              {
-                \exp_stop_f:
-                \int_eval:n { \__kernel_randint:n {#2} - 1 + #3 }
-              }
-          }
-      }
-    \cs_new_protected:Npn \__intarray_gset_all_same:Nn #1#2
-      {
-        \int_zero:N \l__intarray_loop_int
-        \prg_replicate:nn { \intarray_count:N #1 }
-          {
-            \int_incr:N \l__intarray_loop_int
-            \__kernel_intarray_gset:Nnn #1 \l__intarray_loop_int {#2}
-          }
-      }
-  }
-  {
-    \cs_new_protected:Npn \intarray_gset_rand:Nnn #1#2#3
-      {
-        \msg_error:nnn { kernel } { fp-no-random }
-          { \intarray_gset_rand:Nnn #1 {#2} {#3} }
-      }
-  }
-\cs_generate_variant:Nn \intarray_gset_rand:Nnn { c }
 %% File: l3fp.dtx
 %% File: l3fp-aux.dtx
 \cs_new_eq:NN \__fp_int_eval:w \tex_numexpr:D
@@ -15016,7 +15057,7 @@
       {
         #1
         \__fp_error:nnfn { invalid } {##2} { \fp_to_tl:n { ##3; } } { }
-        \flag_raise_if_clear:n { fp_invalid_operation }
+        \flag_ensure_raised:n { fp_invalid_operation }
         ##1
       }
     \exp_args:Nno \use:n
@@ -15025,7 +15066,7 @@
         #1
         \__fp_error:nffn { invalid-ii }
           { \fp_to_tl:n { ##2; } } { \fp_to_tl:n { ##3; } } {##1}
-        \flag_raise_if_clear:n { fp_invalid_operation }
+        \flag_ensure_raised:n { fp_invalid_operation }
         \exp_after:wN \c_nan_fp
       }
     \exp_args:Nno \use:n
@@ -15033,7 +15074,7 @@
       {
         #1
         \__fp_error:nffn { invalid } {##1} {##2} { }
-        \flag_raise_if_clear:n { fp_invalid_operation }
+        \flag_ensure_raised:n { fp_invalid_operation }
         \exp_after:wN \c_nan_fp
       }
   }
@@ -15050,7 +15091,7 @@
       {
         #1
         \__fp_error:nnfn { zero-div } {##2} { \fp_to_tl:n { ##3; } } { }
-        \flag_raise_if_clear:n { fp_division_by_zero }
+        \flag_ensure_raised:n { fp_division_by_zero }
         \exp_after:wN ##1
       }
     \exp_args:Nno \use:n
@@ -15059,7 +15100,7 @@
         #1
         \__fp_error:nffn { zero-div-ii }
           { \fp_to_tl:n { ##3; } } { \fp_to_tl:n { ##4; } } {##2}
-        \flag_raise_if_clear:n { fp_division_by_zero }
+        \flag_ensure_raised:n { fp_division_by_zero }
         \exp_after:wN ##1
       }
   }
@@ -15090,7 +15131,7 @@
           { \fp_to_tl:n { \s__fp \__fp_chk:w ##1##2##3; } }
           { \token_if_eq_meaning:NNF 0 ##2 { - } #4 }
           {#2}
-        \flag_raise_if_clear:n { fp_#2 }
+        \flag_ensure_raised:n { fp_#2 }
         #3 ##2
       }
   }
@@ -16854,9 +16895,9 @@
       { \s__fp \__fp_chk:w #2 #3 #4 #5 ; }
   }
 \cs_new_protected:Npn \fp_show:n
-  { \msg_show_eval:Nn \fp_to_tl:n }
+  { \__kernel_msg_show_eval:Nn \fp_to_tl:n }
 \cs_new_protected:Npn \fp_log:n
-  { \msg_log_eval:Nn \fp_to_tl:n }
+  { \__kernel_msg_log_eval:Nn \fp_to_tl:n }
 \fp_const:Nn \c_e_fp          { 2.718 2818 2845 9045 }
 \fp_const:Nn \c_one_fp        { 1 }
 \fp_const:Nn \c_pi_fp         { 3.141 5926 5358 9793 }
@@ -20472,293 +20513,266 @@
   { \__fp_parse_function:NNN \__fp_rand_o:Nw ? }
 \cs_new:Npn \__fp_parse_word_randint:N
   { \__fp_parse_function:NNN \__fp_randint_o:Nw ? }
-\sys_if_rand_exist:F
+\int_const:Nn \c__kernel_randint_max_int { 131071 }
+\cs_new:Npn \__kernel_randint:n #1
   {
-    \msg_new:nnn { kernel } { fp-no-random }
-      { Random~numbers~unavailable~for~#1 }
-    \cs_new:Npn \__fp_rand_o:Nw ? #1 @
+    (#1 * \tex_uniformdeviate:D 16384
+    + \tex_uniformdeviate:D #1 + 8192 ) / 16384
+  }
+\cs_new:Npn \__fp_rand_myriads:n #1
+  { \__fp_rand_myriads_loop:w #1 \prg_break: X \prg_break_point: ; }
+\cs_new:Npn \__fp_rand_myriads_loop:w #1 X
+  {
+    #1
+    \exp_after:wN \__fp_rand_myriads_get:w
+    \int_value:w \__fp_int_eval:w 9999 +
+      \__kernel_randint:n { 10000 }
+    \__fp_rand_myriads_loop:w
+  }
+\cs_new:Npn \__fp_rand_myriads_get:w 1 #1 ; { ; {#1} }
+\cs_new:Npn \__fp_rand_o:Nw ? #1 @
+  {
+    \tl_if_empty:nTF {#1}
       {
-        \msg_expandable_error:nnn { kernel } { fp-no-random }
-          { fp~rand }
-        \exp_after:wN \c_nan_fp
+        \exp_after:wN \__fp_rand_o:w
+        \exp:w \exp_end_continue_f:w
+        \__fp_rand_myriads:n { XXXX } { 0000 } { 0000 } ; 0
       }
-    \cs_new_eq:NN \__fp_randint_o:Nw \__fp_rand_o:Nw
-    \cs_new:Npn \int_rand:nn #1#2
       {
-        \msg_expandable_error:nnn { kernel } { fp-no-random }
-          { \int_rand:nn {#1} {#2} }
-        \int_eval:n {#1}
+        \msg_expandable_error:nnnnn
+          { fp } { num-args } { rand() } { 0 } { 0 }
+        \exp_after:wN \c_nan_fp
       }
-    \cs_new:Npn \int_rand:n #1
-      {
-        \msg_expandable_error:nnn { kernel } { fp-no-random }
-          { \int_rand:n {#1} }
-        1
-      }
   }
-\sys_if_rand_exist:T
+\cs_new:Npn \__fp_rand_o:w ;
   {
-    \int_const:Nn \c__kernel_randint_max_int { 131071 }
-    \cs_new:Npn \__kernel_randint:n #1
+    \exp_after:wN \__fp_sanitize:Nw
+    \exp_after:wN 0
+    \int_value:w \__fp_int_eval:w \c_zero_int
+      \__fp_fixed_to_float_o:wN
+  }
+\cs_new:Npn \__fp_randint_o:Nw ?
+  {
+    \__fp_parse_function_one_two:nnw
+      { randint }
+      { \__fp_randint_default:w \__fp_randint_o:w }
+  }
+\cs_new:Npn \__fp_randint_default:w #1 { \exp_after:wN #1 \c_one_fp }
+\cs_new:Npn \__fp_randint_badarg:w \s__fp \__fp_chk:w #1#2#3;
+  {
+    \__fp_int:wTF \s__fp \__fp_chk:w #1#2#3;
       {
-        (#1 * \tex_uniformdeviate:D 16384
-        + \tex_uniformdeviate:D #1 + 8192 ) / 16384
-      }
-    \cs_new:Npn \__fp_rand_myriads:n #1
-      { \__fp_rand_myriads_loop:w #1 \prg_break: X \prg_break_point: ; }
-    \cs_new:Npn \__fp_rand_myriads_loop:w #1 X
-      {
-        #1
-        \exp_after:wN \__fp_rand_myriads_get:w
-        \int_value:w \__fp_int_eval:w 9999 +
-          \__kernel_randint:n { 10000 }
-        \__fp_rand_myriads_loop:w
-      }
-    \cs_new:Npn \__fp_rand_myriads_get:w 1 #1 ; { ; {#1} }
-    \cs_new:Npn \__fp_rand_o:Nw ? #1 @
-      {
-        \tl_if_empty:nTF {#1}
-          {
-            \exp_after:wN \__fp_rand_o:w
-            \exp:w \exp_end_continue_f:w
-            \__fp_rand_myriads:n { XXXX } { 0000 } { 0000 } ; 0
-          }
-          {
-            \msg_expandable_error:nnnnn
-              { fp } { num-args } { rand() } { 0 } { 0 }
-            \exp_after:wN \c_nan_fp
-          }
-      }
-    \cs_new:Npn \__fp_rand_o:w ;
-      {
-        \exp_after:wN \__fp_sanitize:Nw
-        \exp_after:wN 0
-        \int_value:w \__fp_int_eval:w \c_zero_int
-          \__fp_fixed_to_float_o:wN
-      }
-    \cs_new:Npn \__fp_randint_o:Nw ?
-      {
-        \__fp_parse_function_one_two:nnw
-          { randint }
-          { \__fp_randint_default:w \__fp_randint_o:w }
-      }
-    \cs_new:Npn \__fp_randint_default:w #1 { \exp_after:wN #1 \c_one_fp }
-    \cs_new:Npn \__fp_randint_badarg:w \s__fp \__fp_chk:w #1#2#3;
-      {
-        \__fp_int:wTF \s__fp \__fp_chk:w #1#2#3;
-          {
-            \if_meaning:w 1 #1
-              \if_int_compare:w
-                  \__fp_use_i_until_s:nw #3 ; > \c__fp_prec_int
-                \c_one_int
-              \fi:
-            \fi:
-          }
-          { \c_one_int }
-      }
-    \cs_new:Npn \__fp_randint_o:w #1; #2; @
-      {
-        \if_case:w
-            \__fp_randint_badarg:w #1;
-            \__fp_randint_badarg:w #2;
-            \if:w 1 \__fp_compare_back:ww #2; #1; \c_one_int \fi:
-            \c_zero_int
-          \__fp_randint_auxi_o:ww #1; #2;
-        \or:
-          \__fp_invalid_operation_tl_o:ff
-            { randint } { \__fp_array_to_clist:n { #1; #2; } }
-          \exp:w
+        \if_meaning:w 1 #1
+          \if_int_compare:w
+              \__fp_use_i_until_s:nw #3 ; > \c__fp_prec_int
+            \c_one_int
+          \fi:
         \fi:
-        \exp_after:wN \exp_end:
       }
-    \cs_new:Npn \__fp_randint_auxi_o:ww #1 ; #2 ; #3 \exp_end:
+      { \c_one_int }
+  }
+\cs_new:Npn \__fp_randint_o:w #1; #2; @
+  {
+    \if_case:w
+        \__fp_randint_badarg:w #1;
+        \__fp_randint_badarg:w #2;
+        \if:w 1 \__fp_compare_back:ww #2; #1; \c_one_int \fi:
+        \c_zero_int
+      \__fp_randint_auxi_o:ww #1; #2;
+    \or:
+      \__fp_invalid_operation_tl_o:ff
+        { randint } { \__fp_array_to_clist:n { #1; #2; } }
+      \exp:w
+    \fi:
+    \exp_after:wN \exp_end:
+  }
+\cs_new:Npn \__fp_randint_auxi_o:ww #1 ; #2 ; #3 \exp_end:
+  {
+    \fi:
+    \__fp_randint_auxii:wn #2 ;
+    { \__fp_randint_auxii:wn #1 ; \__fp_randint_auxiii_o:ww }
+  }
+\cs_new:Npn \__fp_randint_auxii:wn \s__fp \__fp_chk:w #1#2#3#4 ;
+  {
+    \if_meaning:w 0 #1
+      \exp_after:wN \use_i:nn
+    \else:
+      \exp_after:wN \use_ii:nn
+    \fi:
+    { \exp_after:wN \__fp_fixed_continue:wn \c__fp_one_fixed_tl }
+    {
+      \exp_after:wN \__fp_ep_to_fixed:wwn
+      \int_value:w \__fp_int_eval:w
+        #3 - \c__fp_prec_int , #4 {0000} {0000} ;
       {
+        \if_meaning:w 0 #2
+          \exp_after:wN \use_i:nnnn
+          \exp_after:wN \__fp_fixed_add_one:wN
         \fi:
-        \__fp_randint_auxii:wn #2 ;
-        { \__fp_randint_auxii:wn #1 ; \__fp_randint_auxiii_o:ww }
-      }
-    \cs_new:Npn \__fp_randint_auxii:wn \s__fp \__fp_chk:w #1#2#3#4 ;
-      {
-        \if_meaning:w 0 #1
-          \exp_after:wN \use_i:nn
-        \else:
-          \exp_after:wN \use_ii:nn
-        \fi:
-        { \exp_after:wN \__fp_fixed_continue:wn \c__fp_one_fixed_tl }
-        {
-          \exp_after:wN \__fp_ep_to_fixed:wwn
-          \int_value:w \__fp_int_eval:w
-            #3 - \c__fp_prec_int , #4 {0000} {0000} ;
-          {
-            \if_meaning:w 0 #2
-              \exp_after:wN \use_i:nnnn
-              \exp_after:wN \__fp_fixed_add_one:wN
-            \fi:
-            \exp_after:wN \__fp_fixed_sub:wwn \c__fp_one_fixed_tl
-          }
-          \__fp_fixed_continue:wn
-        }
-      }
-    \cs_new:Npn \__fp_randint_auxiii_o:ww #1 ; #2 ;
-      {
-        \__fp_fixed_add:wwn #2 ;
-          {0000} {0000} {0000} {0001} {0000} {0000} ;
-        \__fp_fixed_sub:wwn #1 ;
-        {
-          \exp_after:wN \use_i:nn
-          \exp_after:wN \__fp_fixed_mul_add:wwwn
-          \exp:w \exp_end_continue_f:w \__fp_rand_myriads:n { XXXXXX } ;
-        }
-        #1 ;
-        \__fp_randint_auxiv_o:ww
-        #2 ;
-        \__fp_randint_auxv_o:w #1 ; @
-      }
-    \cs_new:Npn \__fp_randint_auxiv_o:ww #1#2#3#4#5 ; #6#7#8#9
-      {
-        \if_int_compare:w
-            \if_int_compare:w #1#2 > #6#7 \exp_stop_f: 1 \else:
-            \if_int_compare:w #1#2 < #6#7 \exp_stop_f: - \fi: \fi:
-            #3#4 > #8#9 \exp_stop_f:
-          \__fp_use_i_until_s:nw
-        \fi:
-        \__fp_randint_auxv_o:w {#1}{#2}{#3}{#4}#5
-      }
-    \cs_new:Npn \__fp_randint_auxv_o:w #1#2#3#4#5 ; #6 @
-      {
-        \exp_after:wN \__fp_sanitize:Nw
-        \int_value:w
-        \if_int_compare:w #1 < 10000 \exp_stop_f:
-          2
-        \else:
-          0
-          \exp_after:wN \exp_after:wN
-          \exp_after:wN \__fp_reverse_args:Nww
-        \fi:
         \exp_after:wN \__fp_fixed_sub:wwn \c__fp_one_fixed_tl
-        {#1} {#2} {#3} {#4} {0000} {0000} ;
-        {
-          \exp_after:wN \exp_stop_f:
-          \int_value:w \__fp_int_eval:w \c__fp_prec_int
-            \__fp_fixed_to_float_o:wN
-        }
-        0
-        \exp:w \exp_after:wN \exp_end:
       }
-    \cs_new:Npn \int_rand:nn #1#2
+      \__fp_fixed_continue:wn
+    }
+  }
+\cs_new:Npn \__fp_randint_auxiii_o:ww #1 ; #2 ;
+  {
+    \__fp_fixed_add:wwn #2 ;
+      {0000} {0000} {0000} {0001} {0000} {0000} ;
+    \__fp_fixed_sub:wwn #1 ;
+    {
+      \exp_after:wN \use_i:nn
+      \exp_after:wN \__fp_fixed_mul_add:wwwn
+      \exp:w \exp_end_continue_f:w \__fp_rand_myriads:n { XXXXXX } ;
+    }
+    #1 ;
+    \__fp_randint_auxiv_o:ww
+    #2 ;
+    \__fp_randint_auxv_o:w #1 ; @
+  }
+\cs_new:Npn \__fp_randint_auxiv_o:ww #1#2#3#4#5 ; #6#7#8#9
+  {
+    \if_int_compare:w
+        \if_int_compare:w #1#2 > #6#7 \exp_stop_f: 1 \else:
+        \if_int_compare:w #1#2 < #6#7 \exp_stop_f: - \fi: \fi:
+        #3#4 > #8#9 \exp_stop_f:
+     \__fp_use_i_until_s:nw
+    \fi:
+    \__fp_randint_auxv_o:w {#1}{#2}{#3}{#4}#5
+  }
+\cs_new:Npn \__fp_randint_auxv_o:w #1#2#3#4#5 ; #6 @
+  {
+    \exp_after:wN \__fp_sanitize:Nw
+    \int_value:w
+    \if_int_compare:w #1 < 10000 \exp_stop_f:
+      2
+    \else:
+      0
+      \exp_after:wN \exp_after:wN
+      \exp_after:wN \__fp_reverse_args:Nww
+    \fi:
+    \exp_after:wN \__fp_fixed_sub:wwn \c__fp_one_fixed_tl
+    {#1} {#2} {#3} {#4} {0000} {0000} ;
+    {
+      \exp_after:wN \exp_stop_f:
+      \int_value:w \__fp_int_eval:w \c__fp_prec_int
+        \__fp_fixed_to_float_o:wN
+    }
+    0
+    \exp:w \exp_after:wN \exp_end:
+  }
+\cs_new:Npn \int_rand:nn #1#2
+  {
+    \int_eval:n
       {
-        \int_eval:n
-          {
-            \exp_after:wN \__fp_randint:ww
-            \int_value:w \int_eval:n {#1} \exp_after:wN ;
-            \int_value:w \int_eval:n {#2} ;
-          }
+        \exp_after:wN \__fp_randint:ww
+        \int_value:w \int_eval:n {#1} \exp_after:wN ;
+        \int_value:w \int_eval:n {#2} ;
       }
-    \cs_new:Npn \__fp_randint:ww #1; #2;
-      {
-        \if_int_compare:w #1 > #2 \exp_stop_f:
-          \msg_expandable_error:nnnn
-            { kernel } { randint-backward-range } {#1} {#2}
-          \__fp_randint:ww #2; #1;
-        \else:
-          \if_int_compare:w \__fp_int_eval:w #2
-              \if_int_compare:w #1 > \c_zero_int
-                - #1 < \__fp_int_eval:w
-              \else:
-                < \__fp_int_eval:w #1 +
-              \fi:
-              \c__kernel_randint_max_int
-              \__fp_int_eval_end:
-            \__kernel_randint:n
-              { \__fp_int_eval:w #2 - #1 + 1 \__fp_int_eval_end: }
-            - 1 + #1
+  }
+\cs_new:Npn \__fp_randint:ww #1; #2;
+  {
+    \if_int_compare:w #1 > #2 \exp_stop_f:
+      \msg_expandable_error:nnnn
+        { kernel } { randint-backward-range } {#1} {#2}
+      \__fp_randint:ww #2; #1;
+    \else:
+      \if_int_compare:w \__fp_int_eval:w #2
+          \if_int_compare:w #1 > \c_zero_int
+            - #1 < \__fp_int_eval:w
           \else:
-            \__kernel_randint:nn {#1} {#2}
+            < \__fp_int_eval:w #1 +
           \fi:
-        \fi:
-      }
-    \cs_new:Npn \__kernel_randint:nn #1#2
-      {
-        #1
-        \exp_after:wN \__fp_randint_wide_aux:w
+          \c__kernel_randint_max_int
+          \__fp_int_eval_end:
+        \__kernel_randint:n
+          { \__fp_int_eval:w #2 - #1 + 1 \__fp_int_eval_end: }
+        - 1 + #1
+      \else:
+        \__kernel_randint:nn {#1} {#2}
+      \fi:
+    \fi:
+  }
+\cs_new:Npn \__kernel_randint:nn #1#2
+  {
+    #1
+    \exp_after:wN \__fp_randint_wide_aux:w
+    \int_value:w
+      \exp_after:wN \__fp_randint_split_o:Nw
+      \tex_uniformdeviate:D 268435456 ;
+    \int_value:w
+      \exp_after:wN \__fp_randint_split_o:Nw
+      \tex_uniformdeviate:D 268435456 ;
+    \int_value:w
+      \exp_after:wN \__fp_randint_split_o:Nw
+      \int_value:w \__fp_int_eval:w 131072 +
+        \exp_after:wN \__fp_randint_split_o:Nw
         \int_value:w
-          \exp_after:wN \__fp_randint_split_o:Nw
-          \tex_uniformdeviate:D 268435456 ;
-        \int_value:w
-          \exp_after:wN \__fp_randint_split_o:Nw
-          \tex_uniformdeviate:D 268435456 ;
-        \int_value:w
-          \exp_after:wN \__fp_randint_split_o:Nw
-          \int_value:w \__fp_int_eval:w 131072 +
-            \exp_after:wN \__fp_randint_split_o:Nw
-            \int_value:w
-              \__kernel_int_add:nnn {#2} { -#1 } { -\c_max_int } ;
-        .
-      }
-    \cs_new:Npn \__fp_randint_split_o:Nw #1#2 ;
-      {
-        \if_meaning:w 0 #1
-          0 \exp_after:wN ; \int_value:w 0
-        \else:
-          \exp_after:wN \__fp_randint_split_aux:w
-          \int_value:w \__fp_int_eval:w (#1#2 - 8192) / 16384 ;
-          + #1#2
-        \fi:
-        \exp_after:wN ;
-      }
-    \cs_new:Npn \__fp_randint_split_aux:w #1 ;
-      {
-        #1 \exp_after:wN ;
-        \int_value:w \__fp_int_eval:w - #1 * 16384
-      }
-    \cs_new:Npn \__fp_randint_wide_aux:w #1;#2; #3;#4; #5;#6;#7; .
-      {
-        \exp_after:wN \__fp_randint_wide_auxii:w
-        \int_value:w \__fp_int_eval:w #5 * #3 + #6 * #1 +
-          (#5 * #4 + #6 * #3 + #7 * #1 +
-           (#5 * #2 +           #7 * #3 +
-            (16384 * #6 + #7) * (16384 * #4 + #2) / 268435456) / 16384
-          ) / 16384 \exp_after:wN ;
-        \int_value:w \__fp_int_eval:w (#5 + #6) * 16384 + #7 ;
-        #1 ; #5 ;
-      }
-    \cs_new:Npn \__fp_randint_wide_auxii:w #1; #2; #3; #4;
-      {
-        \if_int_odd:w 0
-            \if_int_compare:w #1 = #2 \else: \exp_stop_f: \fi:
-            \if_int_compare:w #4 = \c_zero_int 1 \fi:
-            \if_int_compare:w #3 = 16383 ~ 1 \fi:
-            \exp_stop_f:
-          \exp_after:wN \prg_break:
-        \fi:
-        \if_int_compare:w #4 < 8 \exp_stop_f:
-          + #4 * #3 * 16384
-        \else:
-          + 8 * #3 * 16384 + (#4 - 8) * #3 * 16384
-        \fi:
-        + #1
-        \prg_break_point:
-      }
-    \cs_new:Npn \int_rand:n #1
-      {
-        \int_eval:n
-          { \exp_args:Nf \__fp_randint:n { \int_eval:n {#1} } }
-      }
-    \cs_new:Npn \__fp_randint:n #1
-      {
-        \if_int_compare:w #1 < \c_one_int
-          \msg_expandable_error:nnnn
-            { kernel } { randint-backward-range } { 1 } {#1}
-          \__fp_randint:ww #1; 1;
-        \else:
-          \if_int_compare:w #1 > \c__kernel_randint_max_int
-            \__kernel_randint:nn { 1 } {#1}
-          \else:
-            \__kernel_randint:n {#1}
-          \fi:
-        \fi:
-      }
+          \__kernel_int_add:nnn {#2} { -#1 } { -\c_max_int } ;
+    .
   }
+\cs_new:Npn \__fp_randint_split_o:Nw #1#2 ;
+  {
+    \if_meaning:w 0 #1
+      0 \exp_after:wN ; \int_value:w 0
+    \else:
+      \exp_after:wN \__fp_randint_split_aux:w
+      \int_value:w \__fp_int_eval:w (#1#2 - 8192) / 16384 ;
+      + #1#2
+    \fi:
+    \exp_after:wN ;
+  }
+\cs_new:Npn \__fp_randint_split_aux:w #1 ;
+  {
+    #1 \exp_after:wN ;
+    \int_value:w \__fp_int_eval:w - #1 * 16384
+  }
+\cs_new:Npn \__fp_randint_wide_aux:w #1;#2; #3;#4; #5;#6;#7; .
+  {
+    \exp_after:wN \__fp_randint_wide_auxii:w
+    \int_value:w \__fp_int_eval:w #5 * #3 + #6 * #1 +
+      (#5 * #4 + #6 * #3 + #7 * #1 +
+       (#5 * #2 +           #7 * #3 +
+        (16384 * #6 + #7) * (16384 * #4 + #2) / 268435456) / 16384
+      ) / 16384 \exp_after:wN ;
+    \int_value:w \__fp_int_eval:w (#5 + #6) * 16384 + #7 ;
+    #1 ; #5 ;
+  }
+\cs_new:Npn \__fp_randint_wide_auxii:w #1; #2; #3; #4;
+  {
+    \if_int_odd:w 0
+        \if_int_compare:w #1 = #2 \else: \exp_stop_f: \fi:
+        \if_int_compare:w #4 = \c_zero_int 1 \fi:
+        \if_int_compare:w #3 = 16383 ~ 1 \fi:
+        \exp_stop_f:
+      \exp_after:wN \prg_break:
+    \fi:
+    \if_int_compare:w #4 < 8 \exp_stop_f:
+      + #4 * #3 * 16384
+    \else:
+      + 8 * #3 * 16384 + (#4 - 8) * #3 * 16384
+    \fi:
+    + #1
+    \prg_break_point:
+  }
+\cs_new:Npn \int_rand:n #1
+  {
+    \int_eval:n
+      { \exp_args:Nf \__fp_randint:n { \int_eval:n {#1} } }
+  }
+\cs_new:Npn \__fp_randint:n #1
+  {
+    \if_int_compare:w #1 < \c_one_int
+      \msg_expandable_error:nnnn
+        { kernel } { randint-backward-range } { 1 } {#1}
+      \__fp_randint:ww #1; 1;
+    \else:
+      \if_int_compare:w #1 > \c__kernel_randint_max_int
+        \__kernel_randint:nn { 1 } {#1}
+      \else:
+        \__kernel_randint:n {#1}
+      \fi:
+    \fi:
+  }
 %% File: l3fparray.dtx
 \int_new:N \g__fp_array_int
 \int_new:N \l__fp_array_loop_int
@@ -21470,12 +21484,13 @@
   {
     \group_begin:
       \__sort_main:NNNn #1 #2 #4 {#5}
-      \seq_gset_from_inline_x:Nnn \g__sort_internal_seq
+      \seq_gclear:N \g__sort_internal_seq
+      \int_step_inline:nnn
+        \l__sort_min_int { \l__sort_top_int - 1 }
         {
-          \int_step_function:nnN
-            { \l__sort_min_int } { \l__sort_top_int - 1 }
+          \seq_gput_right:Nx \g__sort_internal_seq
+            { \tex_the:D \tex_toks:D ##1 }
         }
-        { \tex_the:D \tex_toks:D ##1 }
     \group_end:
     #3 #4 \g__sort_internal_seq
     \seq_gclear:N \g__sort_internal_seq
@@ -25168,7 +25183,7 @@
         \__regex_compile_cs_aux:Nn
       }
       {
-        \__regex_quark_if_nil:NF #1 { \flag_raise_if_clear:n { __regex_cs } }
+        \__regex_quark_if_nil:NF #1 { \flag_ensure_raised:n { __regex_cs } }
         \__regex_use_none_delimit_by_q_recursion_stop:w
       }
   }
@@ -25190,7 +25205,7 @@
       {
         \__regex_quark_if_nil:NF #1
           {
-            \flag_raise_if_clear:n { __regex_cs }
+            \flag_ensure_raised:n { __regex_cs }
             \__regex_use_i_delimit_by_q_recursion_stop:nw
           }
         \__regex_use_none_delimit_by_q_recursion_stop:w
@@ -27051,10 +27066,23 @@
             { \int_use:N \l__regex_added_end_int }
         }
     \group_end:
-    \cs_set_eq:NN \__regex_tmp:w \__regex_extract_map_loop:w
-    \seq_set_from_function:NnN #1
-      { \__regex_extract_map:N } \exp_not:n
+    \__regex_extract_seq:N #1
   }
+\cs_gset_protected:Npn \__regex_extract_seq:N #1
+  {
+    \seq_clear:N #1
+    \cs_set_eq:NN \__regex_tmp:w  \__regex_extract_seq_loop:Nw
+    \exp_after:wN \__regex_extract_seq:NNn
+    \exp_after:wN #1
+    \g__regex_internal_tl \use_none:nnn
+  }
+\cs_new_protected:Npn \__regex_extract_seq:NNn #1#2#3
+  { #3 #2 #1 \prg_do_nothing: }
+\cs_new_protected:Npn \__regex_extract_seq_loop:Nw #1#2 \__regex_tmp:w #3
+  {
+    \seq_put_right:No #1 {#2}
+    #3 \__regex_extract_seq_loop:Nw #1 \prg_do_nothing:
+  }
 \cs_new:Npn \__regex_extract_seq_aux:n #1
   {
     \__regex_tmp:w { }
@@ -27115,19 +27143,6 @@
     \if_false: { \fi: }
     \__regex_tmp:w
   }
-\cs_new:Npn \__regex_extract_map:N #1
-  {
-    \exp_after:wN \__regex_extract_map_aux:NNn
-    \exp_after:wN #1
-    \g__regex_internal_tl \use_none:nnn
-  }
-\cs_new:Npn \__regex_extract_map_aux:NNn #1#2#3
-  { #3 #2 #1 \prg_do_nothing: }
-\cs_new:Npn \__regex_extract_map_loop:w #1#2 \__regex_tmp:w #3
-  {
-    \exp_after:wN #1 \exp_after:wN {#2}
-    #3 \__regex_extract_map_loop:w #1 \prg_do_nothing:
-  }
 \cs_new_protected:Npn \__regex_extract:
   {
     \if_meaning:w \c_true_bool \g__regex_success_bool
@@ -35540,97 +35555,6 @@
     \q_recursion_stop
 \group_end:
 %% File: l3candidates.dtx
-\cs_new:Npn \flag_raise_if_clear:n #1
-  {
-    \if_cs_exist:w flag~#1~0 \cs_end:
-    \else:
-      \cs:w flag~#1 \cs_end: 0 ;
-    \fi:
-  }
-\cs_new_protected:Npn \msg_show_eval:Nn #1#2
-  { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_show:n }
-\cs_new_protected:Npn \msg_log_eval:Nn #1#2
-  { \exp_args:Nf \__msg_show_eval:nnN { #1 {#2} } {#2} \tl_log:n }
-\cs_new_protected:Npn \__msg_show_eval:nnN #1#2#3 { #3 { #2 = #1 } }
-\cs_new:Npx \msg_show_item:n #1
-  { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n { {#1} } }
-\cs_new:Npx \msg_show_item_unbraced:n #1
-  { \iow_newline: > ~ \c_space_tl \exp_not:N \tl_to_str:n {#1} }
-\cs_new:Npx \msg_show_item:nn #1#2
-  {
-    \iow_newline: > \use:nn { ~ } { ~ }
-    \exp_not:N \tl_to_str:n { {#1} }
-    \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
-    \exp_not:N \tl_to_str:n { {#2} }
-  }
-\cs_new:Npx \msg_show_item_unbraced:nn #1#2
-  {
-    \iow_newline: > \use:nn { ~ } { ~ }
-    \exp_not:N \tl_to_str:n {#1}
-    \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
-    \exp_not:N \tl_to_str:n {#2}
-  }
-\cs_new_protected:Npn \bool_set_inverse:N #1
-  { \bool_if:NTF #1 { \bool_set_false:N } { \bool_set_true:N } #1 }
-\cs_generate_variant:Nn \bool_set_inverse:N { c }
-\cs_new_protected:Npn \bool_gset_inverse:N #1
-  { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 }
-\cs_generate_variant:Nn \bool_gset_inverse:N { c }
-\scan_new:N \s__bool_mark
-\scan_new:N \s__bool_stop
-\cs_new:Npn \bool_case_true:nTF
-  { \exp:w \__bool_case:NnTF \c_true_bool }
-\cs_new:Npn \bool_case_true:nT #1#2
-  { \exp:w \__bool_case:NnTF \c_true_bool {#1} {#2} { } }
-\cs_new:Npn \bool_case_true:nF #1
-  { \exp:w \__bool_case:NnTF \c_true_bool {#1} { } }
-\cs_new:Npn \bool_case_true:n #1
-  { \exp:w \__bool_case:NnTF \c_true_bool {#1} { } { } }
-\cs_new:Npn \bool_case_false:nTF
-  { \exp:w \__bool_case:NnTF \c_false_bool }
-\cs_new:Npn \bool_case_false:nT #1#2
-  { \exp:w \__bool_case:NnTF \c_false_bool {#1} {#2} { } }
-\cs_new:Npn \bool_case_false:nF #1
-  { \exp:w \__bool_case:NnTF \c_false_bool {#1} { } }
-\cs_new:Npn \bool_case_false:n #1
-  { \exp:w \__bool_case:NnTF \c_false_bool {#1} { } { } }
-\cs_new:Npn \__bool_case:NnTF #1#2#3#4
-  {
-    \bool_if:NTF #1 \__bool_case_true:w \__bool_case_false:w
-    #2 #1 { } \s__bool_mark {#3} \s__bool_mark {#4} \s__bool_stop
-  }
-\cs_new:Npn \__bool_case_true:w #1#2
-  {
-    \bool_if:nTF {#1}
-      { \__bool_case_end:nw {#2} }
-      { \__bool_case_true:w }
-  }
-\cs_new:Npn \__bool_case_false:w #1#2
-  {
-    \bool_if:nTF {#1}
-      { \__bool_case_false:w }
-      { \__bool_case_end:nw {#2} }
-  }
-\cs_new:Npn \__bool_case_end:nw #1#2#3 \s__bool_mark #4#5 \s__bool_stop
-  { \exp_end: #1 #4 }
-\cs_new:Npn \__prop_use_i_delimit_by_s_stop:nw #1 #2 \s__prop_stop {#1}
-\cs_new:Npn \prop_rand_key_value:N #1
-  {
-    \prop_if_empty:NF #1
-      {
-        \exp_after:wN \__prop_rand_item:w
-        \int_value:w \int_rand:nn { 1 } { \prop_count:N #1 }
-        #1 \s__prop_stop
-      }
-  }
-\cs_generate_variant:Nn \prop_rand_key_value:N { c }
-\cs_new:Npn \__prop_rand_item:w #1 \s__prop \__prop_pair:wn #2 \s__prop #3
-  {
-    \int_compare:nNnF {#1} > 1
-      { \__prop_use_i_delimit_by_s_stop:nw { \exp_not:n { {#2} {#3} } } }
-    \exp_after:wN \__prop_rand_item:w
-    \int_value:w \int_eval:n { #1 - 1 } \s__prop
-  }
 \cs_new:Npn \seq_mapthread_function:NNN #1#2#3
   { \exp_after:wN \__seq_mapthread_function:wNN #2 \s__seq_stop #1 #3 }
 \cs_new:Npn \__seq_mapthread_function:wNN \s__seq #1 \s__seq_stop #2#3
@@ -35663,20 +35587,6 @@
     #1 #2 { #3 }
     \__seq_pop_item_def:
   }
-\cs_new_protected:Npn \seq_set_from_inline_x:Nnn
-  { \__seq_set_from_inline_x:NNnn \__kernel_tl_set:Nx }
-\cs_new_protected:Npn \seq_gset_from_inline_x:Nnn
-  { \__seq_set_from_inline_x:NNnn \__kernel_tl_gset:Nx }
-\cs_new_protected:Npn \__seq_set_from_inline_x:NNnn #1#2#3#4
-  {
-    \__seq_push_item_def:n { \exp_not:N \__seq_item:n {#4} }
-    #1 #2 { \s__seq #3 \__seq_item:n }
-    \__seq_pop_item_def:
-  }
-\cs_new_protected:Npn \seq_set_from_function:NnN #1#2#3
-  { \seq_set_from_inline_x:Nnn #1 {#2} { #3 {##1} } }
-\cs_new_protected:Npn \seq_gset_from_function:NnN #1#2#3
-  { \seq_gset_from_inline_x:Nnn #1 {#2} { #3 {##1} } }
 \cs_new_eq:NN \__seq_int_eval:w \tex_numexpr:D
 \cs_new_protected:Npn \seq_set_item:Nnn #1#2#3
   { \__seq_set_item:NnnNN #1 {#2} {#3} \__kernel_tl_set:Nx \use_i:nn }
@@ -35784,84 +35694,6 @@
     \if_false: { \fi: }
     \l__seq_internal_b_tl { \if_false: } \fi: \exp_not:n {#1}
   }
-\str_const:Nx \c_sys_engine_version_str
-  {
-    \str_case:on \c_sys_engine_str
-      {
-        { pdftex }
-          {
-            \int_div_truncate:nn { \tex_pdftexversion:D } { 100 }
-            .
-            \int_mod:nn { \tex_pdftexversion:D } { 100 }
-            .
-            \tex_pdftexrevision:D
-          }
-        { ptex }
-          {
-            \cs_if_exist:NT \tex_ptexversion:D
-              {
-                p
-                \int_use:N  \tex_ptexversion:D
-                .
-                \int_use:N \tex_ptexminorversion:D
-                \tex_ptexrevision:D
-                -
-                \int_use:N \tex_epTeXversion:D
-              }
-          }
-        { luatex }
-          {
-            \int_div_truncate:nn { \tex_luatexversion:D } { 100 }
-            .
-            \int_mod:nn { \tex_luatexversion:D } { 100 }
-            .
-            \tex_luatexrevision:D
-          }
-        { uptex }
-          {
-            \cs_if_exist:NT \tex_ptexversion:D
-              {
-                p
-                \int_use:N  \tex_ptexversion:D
-                .
-                \int_use:N \tex_ptexminorversion:D
-                \tex_ptexrevision:D
-                -
-                u
-                \int_use:N  \tex_uptexversion:D
-                \tex_uptexrevision:D
-                -
-                \int_use:N \tex_epTeXversion:D
-              }
-          }
-        { xetex }
-          {
-            \int_use:N \tex_XeTeXversion:D
-            \tex_XeTeXrevision:D
-          }
-      }
-  }
-\cs_new_protected:Npn \ior_shell_open:Nn #1#2
-  {
-    \sys_if_shell:TF
-      { \exp_args:No \__ior_shell_open:nN { \tl_to_str:n {#2} } #1 }
-      { \msg_error:nn { ior } { pipe-failed } }
-  }
-\cs_new_protected:Npn \__ior_shell_open:nN #1#2
-  {
-    \tl_if_in:nnTF {#1} { " }
-      {
-        \msg_error:nnx
-          { kernel } { quote-in-shell } {#1}
-      }
-      { \__kernel_ior_open:Nn #2 { |#1 } }
-  }
-\msg_new:nnnn { ior } { pipe-failed }
-  { Cannot~run~piped~system~commands. }
-  {
-    LaTeX~tried~to~call~a~system~process~but~this~was~not~possible.\\
-    Try~the~"--shell-escape"~(or~"--enable-pipes")~option.
-  }
 \cs_new_protected:Npn \tl_build_begin:N #1
   { \__tl_build_begin:NN \cs_set_nopar:Npx #1 }
 \cs_new_protected:Npn \tl_build_gbegin:N #1
@@ -35968,86 +35800,6 @@
     #2 #1
     \exp_args:Nc \__tl_build_end_loop:NN { \cs_to_str:N #1 ' } #2
   }
-\cs_new:Npn \tl_range_braced:Nnn { \exp_args:No \tl_range_braced:nnn }
-\cs_generate_variant:Nn \tl_range_braced:Nnn { c }
-\cs_new:Npn \tl_range_braced:nnn { \__tl_range:Nnnn \__tl_range_braced:w }
-\cs_new:Npn \tl_range_unbraced:Nnn
-  { \exp_args:No \tl_range_unbraced:nnn }
-\cs_generate_variant:Nn \tl_range_unbraced:Nnn { c }
-\cs_new:Npn \tl_range_unbraced:nnn
-  { \__tl_range:Nnnn \__tl_range_unbraced:w }
-\cs_new:Npn \__tl_range_braced:w #1 ; #2
-  { \__tl_range_collect_braced:w #1 ; { } #2 }
-\cs_new:Npn \__tl_range_unbraced:w #1 ; #2
-  { \__tl_range_collect_unbraced:w #1 ; { } #2 }
-\cs_new:Npn \__tl_range_collect_braced:w #1 ; #2#3
-  {
-    \if_int_compare:w #1 > \c_one_int
-      \exp_after:wN \__tl_range_collect_braced:w
-      \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
-    \fi:
-    { #2 {#3} }
-  }
-\cs_new:Npn \__tl_range_collect_unbraced:w #1 ; #2#3
-  {
-    \if_int_compare:w #1 > \c_one_int
-      \exp_after:wN \__tl_range_collect_unbraced:w
-      \int_value:w \int_eval:n { #1 - 1 } \exp_after:wN ;
-    \fi:
-    { #2 #3 }
-  }
-\group_begin:
-  \char_set_catcode_active:N *
-  \char_set_lccode:nn { `* } { `\ }
-  \tex_lowercase:D { \tl_const:Nn \c_catcode_active_space_tl { * } }
-\group_end:
-\tl_new:N \l__peek_collect_tl
-\cs_new_protected:Npn \peek_catcode_collect_inline:Nn
-  { \__peek_collect:NNn \__peek_execute_branches_catcode: }
-\cs_new_protected:Npn \peek_charcode_collect_inline:Nn
-  { \__peek_collect:NNn \__peek_execute_branches_charcode: }
-\cs_new_protected:Npn \peek_meaning_collect_inline:Nn
-  { \__peek_collect:NNn \__peek_execute_branches_meaning: }
-\cs_new_protected:Npn \__peek_collect:NNn #1#2#3
-  {
-    \group_align_safe_begin:
-    \cs_set_eq:NN \l__peek_search_token #2
-    \tl_set:Nn \l__peek_search_tl {#2}
-    \tl_clear:N \l__peek_collect_tl
-    \cs_set:Npn \__peek_false:w
-      { \exp_args:No \__peek_false_aux:n \l__peek_collect_tl }
-    \cs_set:Npn \__peek_false_aux:n ##1
-      {
-        \group_align_safe_end:
-        #3
-      }
-    \cs_set_eq:NN \__peek_true:w \__peek_collect_true:w
-    \cs_set:Npn \__peek_true_aux:w { \peek_after:Nw #1 }
-    \__peek_true_aux:w
-  }
-\cs_new_protected:Npn \__peek_collect_true:w
-  {
-    \if_case:w
-        \if_catcode:w \exp_not:N \l_peek_token {   1 \exp_stop_f: \fi:
-        \if_catcode:w \exp_not:N \l_peek_token }   2 \exp_stop_f: \fi:
-        \if_meaning:w \l_peek_token \c_space_token 3 \exp_stop_f: \fi:
-        0 \exp_stop_f:
-      \exp_after:wN \__peek_collect:N
-    \or: \__peek_collect_remove:nw { \c_group_begin_token }
-    \or: \__peek_collect_remove:nw { \c_group_end_token }
-    \or: \__peek_collect_remove:nw { ~ }
-    \fi:
-  }
-\cs_new_protected:Npn \__peek_collect:N #1
-  {
-    \tl_put_right:Nn \l__peek_collect_tl {#1}
-    \__peek_true_aux:w
-  }
-\cs_new_protected:Npn \__peek_collect_remove:nw #1
-  {
-    \tl_put_right:Nn \l__peek_collect_tl {#1}
-    \exp_after:wN \__peek_true_remove:w
-  }
 %% File: l3legacy.dtx
 \prg_new_conditional:Npnn \legacy_if:n #1 { p , T , F , TF }
   {
@@ -36349,6 +36101,14 @@
 \__deprecation_old:Nnn \xetex_if_engine:TF
   { \sys_if_engine_xetex:TF } { 2017-01-01 }
 \cs_gset:Npn \cs_argument_spec:N { \cs_parameter_spec:N }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:n }
+\cs_gset:Npn \bool_case_true:n { \bool_case:n }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nT }
+\cs_gset:Npn \bool_case_true:nT { \bool_case:nT }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nF }
+\cs_gset:Npn \bool_case_true:nF { \bool_case:nF }
+\__kernel_patch_deprecation:nnNNpn { 2023-05-03 } { \bool_case_true:nTF }
+\cs_gset:Npn \bool_case_true:nTF { \bool_case:nTF }
 \__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_lowercase:n }
 \cs_gset:Npn \str_lower_case:n { \str_lowercase:n }
 \__kernel_patch_deprecation:nnNNpn { 2020-01-03 } { \str_lowercase:f }

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex	2023-05-05 21:23:26 UTC (rev 67026)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-04-20}%
+\def\ExplFileDate{2023-05-05}%
 \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	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.ltx	2023-05-05 21:23:26 UTC (rev 67026)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-04-20}%
+\def\ExplFileDate{2023-05-05}%
 \let\ExplLoaderFileDate\ExplFileDate
 \begingroup
   \catcode`\_=11

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/expl3.sty	2023-05-05 21:23:26 UTC (rev 67026)
@@ -19,7 +19,7 @@
 %% and all files in that bundle must be distributed together.
 %% 
 %% File: expl3.dtx
-\def\ExplFileDate{2023-04-20}%
+\def\ExplFileDate{2023-05-05}%
 \let\ExplLoaderFileDate\ExplFileDate
 \ProvidesPackage{expl3}
   [%

Modified: trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def
===================================================================
--- trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2023-05-05 21:22:50 UTC (rev 67025)
+++ trunk/Master/texmf-dist/tex/latex/l3kernel/l3debug.def	2023-05-05 21:23:26 UTC (rev 67026)
@@ -575,7 +575,7 @@
       \flag_if_raised:nTF
       \flag_if_raised_p:n
       \flag_height:n
-      \flag_raise_if_clear:n
+      \flag_ensure_raised:n
       \flag_clear:n
     }
   \__kernel_patch:nnn



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