texlive[73463] Master/texmf-dist: expltools (15jan25)

commits+karl at tug.org commits+karl at tug.org
Wed Jan 15 21:59:27 CET 2025


Revision: 73463
          https://tug.org/svn/texlive?view=revision&revision=73463
Author:   karl
Date:     2025-01-15 21:59:26 +0100 (Wed, 15 Jan 2025)
Log Message:
-----------
expltools (15jan25)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/support/expltools/CHANGES.md
    trunk/Master/texmf-dist/doc/support/expltools/README.md
    trunk/Master/texmf-dist/doc/support/expltools/project-proposal.pdf
    trunk/Master/texmf-dist/doc/support/expltools/warnings-and-errors-01-preprocessing.md
    trunk/Master/texmf-dist/doc/support/expltools/warnings-and-errors.pdf
    trunk/Master/texmf-dist/scripts/expltools/explcheck-cli.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-config.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-format.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-issues.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-lexical-analysis.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-obsolete.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-parsers.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-preprocessing.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-utils.lua

Modified: trunk/Master/texmf-dist/doc/support/expltools/CHANGES.md
===================================================================
--- trunk/Master/texmf-dist/doc/support/expltools/CHANGES.md	2025-01-15 18:18:01 UTC (rev 73462)
+++ trunk/Master/texmf-dist/doc/support/expltools/CHANGES.md	2025-01-15 20:59:26 UTC (rev 73463)
@@ -1,5 +1,54 @@
 # Changes
 
+## expltools 2025-01-15
+
+### explcheck v0.5.0
+
+#### Development
+
+- Add support for ignoring file-wide issues and issues on a single line using
+  TeX comments. (#23)
+
+  For example, a comment `% noqa` will ignore any issues on the current line,
+  whereas a comment `% noqa: W100, S206` will ignore the file-wide warning W100
+  (No standard delimiters) and the warning S206 (Malformed variable or constant
+  name) on the current line.
+
+- Add command-line option `--ignored-issues` and Lua option `ignored_issues`
+  for ignoring issues. (#23)
+
+  For example, `--ignored-issues=w100,s206` will ignore the file-wide warning
+  W100 (No standard delimiters) and all warnings S206 (Malformed variable or
+  constant name).
+
+#### Fixes
+
+- Correctly shorten long names of files from the current working directory in
+  the command-line output. (#23)
+
+- Correctly parenthesize and order LPEG parsers in the file
+  `explcheck-obsolete.lua`. (#23)
+
+- Do not produce warning S204 (Missing stylistic whitespaces) for non-expl3,
+  empty, or one-character names of control sequences. (#23)
+
+- Do not produce warning S204 (Missing stylistic whitespaces) for an empty
+  grouping (`{}`). (#23)
+
+- Do not produce warning S204 (Missing stylistic whitespaces) for a parameter
+  before begin grouping (`#1{`). (#23)
+
+- Do not produce S204 (Missing stylistic whitespaces) for a comma immediately
+  after a control sequence. (505608f9)
+
+- Do not produce warnings S205 (Malformed function name) and S206 (Malformed
+  variable or constant name) for non-expl3 functions, variables, and constants.
+  (#23)
+
+- Do not produce warnings S206 (Malformed variable or constant name) for
+  variable and constant names that contain names of built-in types such as
+  `\c_module_constant_clist_tl` containing `clist`. (#23)
+
 ## expltools 2025-01-14
 
 ### explcheck v0.4.0

Modified: trunk/Master/texmf-dist/doc/support/expltools/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/support/expltools/README.md	2025-01-15 18:18:01 UTC (rev 73462)
+++ trunk/Master/texmf-dist/doc/support/expltools/README.md	2025-01-15 20:59:26 UTC (rev 73463)
@@ -12,7 +12,7 @@
 
 These devlog posts chronicle the latest updates and progress in the ongoing development of the tool:
 
-5. [Frank Mittelbach in Brno, the first public release of explcheck, and expl3 usage statistics][8] from December 5, 2024
+5. [Frank Mittelbach in Brno, first public release of explcheck, and expl3 usage statistics][8] from Dec 5, 2024
 6. [A flurry of releases, CSTUG talk, and what's next][9] from December 19, 2024
 
 In the future, this repository may also contain the code of other useful development tools for expl3 programmers, such as a command-line utility similar to `grep` that will ignore whitespaces and newlines as well as other tools.
@@ -57,12 +57,11 @@
 local content = assert(file:read("*a"))
 assert(file:close())
 
-local line_starting_byte_numbers, expl_ranges = preprocessing(issues, content)
-local tokens = lexical_analysis(issues, content, expl_ranges)
+local _, expl_ranges = preprocessing(issues, content)
+lexical_analysis(issues, content, expl_ranges)
 
 print(
-  "There were " .. #tokens .. " tokens, "
-  .. #issues.warnings .. " warnings, "
+  "There were " .. #issues.warnings .. " warnings, "
   .. "and " .. #issues.errors .. " errors "
   .. "in the file " .. filename .. "."
 )
@@ -89,7 +88,7 @@
 
 You can prepare the expltools bundle for distribution with the following two commands:
 
-1. `l3build tag`: Add the current version numbers to the file `explcheck-lua.cli`.
+1. `l3build tag`: Add version numbers to file `explcheck-cli.lua` and create `explcheck-obsolete.lua`.
 2. `l3build ctan`: Run tests, build the documentation, and create a CTAN archive `expltools-ctan.zip`.
 
 The file `explcheck.lua` should be installed in the TDS directory `scripts/expltools/explcheck`. Furthermore, it should be made executable and either symlinked to system directories as `explcheck` on Unix or have a wrapper `explcheck.exe` installed on Windows.

Modified: trunk/Master/texmf-dist/doc/support/expltools/project-proposal.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/support/expltools/warnings-and-errors-01-preprocessing.md
===================================================================
--- trunk/Master/texmf-dist/doc/support/expltools/warnings-and-errors-01-preprocessing.md	2025-01-15 18:18:01 UTC (rev 73462)
+++ trunk/Master/texmf-dist/doc/support/expltools/warnings-and-errors-01-preprocessing.md	2025-01-15 20:59:26 UTC (rev 73463)
@@ -21,7 +21,7 @@
 
  /s103.tex
 
-The maximum line length can be configured using the command-line option `--max-line-length` or with the parameter `max_line_length` of the function returned by the Lua module `explcheck-preprocessing`.
+The maximum line length can be configured using the command-line option `--max-line-length` or with the Lua option `max_line_length`.
 
 ## Multiple delimiters `\ProvidesExpl*` in a single file {.e label=e104}
 An input file contains multiple delimiters `\ProvidesExplPackage`, `\ProvidesExplClass`, and `\ProvidesExplFile`.

Modified: trunk/Master/texmf-dist/doc/support/expltools/warnings-and-errors.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-cli.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-cli.lua	2025-01-15 18:18:01 UTC (rev 73462)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-cli.lua	2025-01-15 20:59:26 UTC (rev 73463)
@@ -3,6 +3,7 @@
 local config = require("explcheck-config")
 local new_issues = require("explcheck-issues")
 local format = require("explcheck-format")
+local utils = require("explcheck-utils")
 
 local preprocessing = require("explcheck-preprocessing")
 local lexical_analysis = require("explcheck-lexical-analysis")
@@ -93,11 +94,16 @@
 
   for pathname_number, pathname in ipairs(pathnames) do
 
+    -- Set up the issue registry.
+    local issues = new_issues()
+    for _, issue_identifier in ipairs(utils.get_option(options, "ignored_issues")) do
+      issues:ignore(issue_identifier)
+    end
+
     -- Load an input file.
     local file = assert(io.open(pathname, "r"), "Could not open " .. pathname .. " for reading")
     local content = assert(file:read("*a"))
     assert(file:close())
-    local issues = new_issues()
 
     -- Run all processing steps.
     local line_starting_byte_numbers, expl_ranges, tokens  -- luacheck: ignore tokens
@@ -143,6 +149,7 @@
     "Options:\n\n"
     .. "\t--expect-expl3-everywhere  Expect that the whole files are in expl3, ignoring \\ExplSyntaxOn and Off.\n"
     .. "\t                           This prevents the error E102 (expl3 material in non-expl3 parts).\n\n"
+    .. "\t--ignored-issues=ISSUES    A comma-list of warning and error identifiers that should not be reported.\n\n"
     .. "\t--max-line-length=N        The maximum line length before the warning S103 (Line too long) is produced.\n"
     .. "\t                           The default maximum line length is N=" .. max_line_length .. " characters.\n\n"
     .. "\t--porcelain, -p            Produce machine-readable output.\n\n"
@@ -152,7 +159,7 @@
 end
 
 local function print_version()
-  print("explcheck (expltools 2025-01-14) v0.4.0")
+  print("explcheck (expltools 2025-01-15) v0.5.0")
   print("Copyright (c) 2024-2025 Vít Starý Novotný")
   print("Licenses: LPPL 1.3 or later, GNU GPL v2 or later")
 end
@@ -178,6 +185,11 @@
       os.exit(0)
     elseif argument == "--expect-expl3-everywhere" then
       options.expect_expl3_everywhere = true
+    elseif argument:sub(1, 17) == "--ignored-issues=" then
+      options.ignored_issues = {}
+      for issue_identifier in argument:sub(18):gmatch('[^,]+') do
+        table.insert(options.ignored_issues, issue_identifier)
+      end
     elseif argument:sub(1, 18) == "--max-line-length=" then
       options.max_line_length = tonumber(argument:sub(19))
     elseif argument == "--porcelain" or argument == "-p" then

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-config.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-config.lua	2025-01-15 18:18:01 UTC (rev 73462)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-config.lua	2025-01-15 20:59:26 UTC (rev 73463)
@@ -5,4 +5,5 @@
   max_line_length = 80,
   porcelain = false,
   warnings_are_errors = false,
+  ignored_issues = {},
 }

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-format.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-format.lua	2025-01-15 18:18:01 UTC (rev 73462)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-format.lua	2025-01-15 20:59:26 UTC (rev 73463)
@@ -1,5 +1,7 @@
 -- Formatting for the command-line interface of the static analyzer explcheck.
 
+local utils = require("explcheck-utils")
+
 -- Transform a singular into plural if the count is zero or greater than two.
 local function pluralize(singular, count)
   if count == 1 then
@@ -31,12 +33,14 @@
   if #pathname > max_length then
     local pattern
     if first_iteration then
-      pattern = "([^\\/]*[\\/]?)(.*)"
+      pattern = "([^\\/]*[\\/])(.*)"
     else
       pattern = "([^\\/]*[\\/]%.%.%.[\\/])(.*)"
     end
     local prefix_start, _, _, suffix = pathname:find(pattern)
-    if prefix_start == 1 then
+    if prefix_start == nil or prefix_start > 1 then
+      pathname = "..." .. pathname:sub(-(max_length - #("...")))
+    else
       pathname = ".../" .. suffix
       if #pathname > max_length then
         pathname = "..." .. suffix:sub(-(max_length - #("...")))
@@ -64,22 +68,6 @@
   return text:gsub("\27%[[0-9]+m", "")
 end
 
--- Convert a byte number in a file to a line and column number in a file.
-local function convert_byte_to_line_and_column(line_starting_byte_numbers, byte_number)
-  local line_number = 0
-  for _, line_starting_byte_number in ipairs(line_starting_byte_numbers) do
-    if line_starting_byte_number > byte_number then
-      break
-    end
-    line_number = line_number + 1
-  end
-  assert(line_number > 0)
-  local line_starting_byte_number = line_starting_byte_numbers[line_number]
-  assert(line_starting_byte_number <= byte_number)
-  local column_number = byte_number - line_starting_byte_number + 1
-  return line_number, column_number
-end
-
 -- Print the results of analyzing a file.
 local function print_results(pathname, issues, line_starting_byte_numbers, is_last_file, porcelain)
   -- Display an overview.
@@ -169,7 +157,7 @@
         local range = issue[3]
         local position = ":"
         if range ~= nil then
-          local line_number, column_number = convert_byte_to_line_and_column(line_starting_byte_numbers, range[1])
+          local line_number, column_number = utils.convert_byte_to_line_and_column(line_starting_byte_numbers, range[1])
           position = position .. tostring(line_number) .. ":" .. tostring(column_number) .. ":"
         end
         local max_line_length = 88
@@ -236,7 +224,6 @@
 end
 
 return {
-  convert_byte_to_line_and_column = convert_byte_to_line_and_column,
   pluralize = pluralize,
   print_results = print_results,
   print_summary = print_summary,

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-issues.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-issues.lua	2025-01-15 18:18:01 UTC (rev 73462)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-issues.lua	2025-01-15 20:59:26 UTC (rev 73463)
@@ -26,10 +26,7 @@
 
 -- Add an issue to the table of issues.
 function Issues:add(identifier, message, range_start, range_end)
-  if self.ignored_issues[identifier] then
-    return
-  end
-  local issue_table = self:_get_issue_table(identifier)
+  -- Construct the issue.
   local range
   if range_start == nil then
     range = nil
@@ -36,27 +33,89 @@
   else
     range = {range_start, range_end}
   end
+  local issue = {identifier, message, range}
+
+  -- Determine if the issue should be ignored.
+  for _, ignore_issue in ipairs(self.ignored_issues) do
+    if ignore_issue(issue) then
+      return
+    end
+  end
+
+  -- Add the issue to the table of issues.
+  local issue_table = self:_get_issue_table(identifier)
   table.insert(issue_table, {identifier, message, range})
 end
 
--- Prevent an issue from being present in the table of issues.
-function Issues:ignore(identifier)
+-- Prevent issues from being present in the table of issues.
+function Issues:ignore(identifier, range_start, range_end)
+  -- Determine which issues should be ignored.
+  local function match_issue_range(issue_range)
+    local issue_range_start, issue_range_end = table.unpack(issue_range)
+    return (
+      issue_range_start >= range_start and issue_range_start <= range_end  -- issue starts within the range
+      or issue_range_start <= range_start and issue_range_end >= range_end  -- issue is in the middle of the range
+      or issue_range_end >= range_start and issue_range_end <= range_end  -- issue ends within the range
+    )
+  end
+  local function match_issue_identifier(issue_identifier)
+    return issue_identifier == identifier
+  end
+
+  local ignore_issue, issue_tables
+  if identifier == nil then
+    -- Prevent any issues within the given range.
+    assert(range_start ~= nil and range_end ~= nil)
+    issue_tables = {self.warnings, self.errors}
+    ignore_issue = function(issue)
+      local issue_range = issue[3]
+      if issue_range == nil then  -- file-wide issue
+        return false
+      else  -- ranged issue
+        return match_issue_range(issue_range)
+      end
+    end
+  elseif range_start == nil then
+    -- Prevent any issues with the given identifier.
+    assert(identifier ~= nil)
+    issue_tables = {self:_get_issue_table(identifier)}
+    ignore_issue = function(issue)
+      local issue_identifier = issue[1]
+      return match_issue_identifier(issue_identifier)
+    end
+  else
+    -- Prevent any issues with the given identifier that are also either within the given range or file-wide.
+    assert(range_start ~= nil and range_end ~= nil and identifier ~= nil)
+    issue_tables = {self:_get_issue_table(identifier)}
+    ignore_issue = function(issue)
+      local issue_identifier = issue[1]
+      local issue_range = issue[3]
+      if issue_range == nil then  -- file-wide issue
+        return match_issue_identifier(issue_identifier)
+      else  -- ranged issue
+        return match_issue_range(issue_range) and match_issue_identifier(issue_identifier)
+      end
+    end
+  end
+
   -- Remove the issue if it has already been added.
-  local issue_table = self:_get_issue_table(identifier)
-  local updated_issues = {}
-  for _, issue in ipairs(issue_table) do
-    if issue[1] ~= identifier then
-      table.insert(updated_issues, issue)
+  for _, issue_table in ipairs(issue_tables) do
+    local filtered_issues = {}
+    for _, issue in ipairs(issue_table) do
+      if not ignore_issue(issue) then
+        table.insert(filtered_issues, issue)
+      end
     end
+    for issue_index, issue in ipairs(filtered_issues) do
+      issue_table[issue_index] = issue
+    end
+    for issue_index = #filtered_issues + 1, #issue_table, 1 do
+      issue_table[issue_index] = nil
+    end
   end
-  for issue_index, issue in ipairs(updated_issues) do
-    issue_table[issue_index] = issue
-  end
-  for issue_index = #updated_issues + 1, #issue_table, 1 do
-    issue_table[issue_index] = nil
-  end
+
   -- Prevent the issue from being added later.
-  self.ignored_issues[identifier] = true
+  table.insert(self.ignored_issues, ignore_issue)
 end
 
 -- Sort the warnings/errors using location as the primary key.
@@ -63,15 +122,15 @@
 function Issues.sort(warnings_and_errors)
   local sorted_warnings_and_errors = {}
   for _, issue in ipairs(warnings_and_errors) do
-    local code = issue[1]
+    local identifier = issue[1]
     local message = issue[2]
     local range = issue[3]
-    table.insert(sorted_warnings_and_errors, {code, message, range})
+    table.insert(sorted_warnings_and_errors, {identifier, message, range})
   end
   table.sort(sorted_warnings_and_errors, function(a, b)
-    local a_code, b_code = a[1], b[1]
+    local a_identifier, b_identifier = a[1], b[1]
     local a_range, b_range = (a[3] and a[3][1]) or 0, (b[3] and b[3][1]) or 0
-    return a_range < b_range or (a_range == b_range and a_code < b_code)
+    return a_range < b_range or (a_range == b_range and a_identifier < b_identifier)
   end)
   return sorted_warnings_and_errors
 end

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-lexical-analysis.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-lexical-analysis.lua	2025-01-15 18:18:01 UTC (rev 73462)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-lexical-analysis.lua	2025-01-15 20:59:26 UTC (rev 73463)
@@ -78,20 +78,28 @@
         end
       end
 
-      local previous_catcode = 9
+      local previous_catcode, previous_csname = 9, nil
       while character_index <= #line_text do
         local character, catcode, character_index_increment = get_character_and_catcode(character_index)
         local range_start = map_back(character_index)
         local range_end = range_start + 1
-        if (  -- a potential missing stylistic whitespace
-              previous_catcode == 0  -- right after a control sequence
-              or previous_catcode == 1 or previous_catcode == 2  -- or a begin/end grouping
+        if (
+              catcode ~= 9 and catcode ~= 10  -- a potential missing stylistic whitespace
+              and (
+                previous_catcode == 0  -- right after a control sequence
+                or previous_catcode == 1 or previous_catcode == 2  -- or a begin/end grouping
+              )
             ) then
+          if (previous_catcode == 0) then
+            assert(previous_csname ~= nil)
+          end
           if (
-                catcode ~= 0 and catcode ~= 1  -- for a control sequence of being grouping, we will handle the lack of whitespace elsewhere
-                and not (previous_catcode == 2 and character == ",")  -- allow a comma after end grouping without a whitespace in between
-                and not (previous_catcode == 1 and catcode == 6)  -- allow a parameter after begin grouping  without a whitespace in between
-                and catcode ~= 9 and catcode ~= 10
+                catcode ~= 0 and catcode ~= 1 and catcode ~= 2  -- for a control sequence or begin/end grouping, we handle this elsewhere
+                -- do not require whitespace after non-expl3 control sequences or control sequences with empty or one-character names
+                and (previous_catcode ~= 0 or #previous_csname > 1 and lpeg.match(parsers.non_expl3_csname, previous_csname) == nil)
+                and (previous_catcode ~= 0 or character ~= ",")  -- allow a comma after a control sequence without whitespace in between
+                and (previous_catcode ~= 1 or catcode ~= 6)  -- allow a parameter after begin grouping without whitespace in between
+                and (previous_catcode ~= 2 or character ~= ",")  -- allow a comma after end grouping without whitespace in between
               ) then
             issues:add('s204', 'missing stylistic whitespaces', range_start, range_end)
           end
@@ -126,10 +134,14 @@
           local csname = table.concat(csname_table)
           range_end = map_back(previous_csname_index) + 1
           table.insert(tokens, {"control sequence", csname, 0, range_start, range_end})
-          if previous_catcode ~= 9 and previous_catcode ~= 10 then
+          if (
+                previous_catcode ~= 9 and previous_catcode ~= 10  -- a potential missing stylistic whitespace
+                -- do not require whitespace before non-expl3 control sequences or control sequences with empty or one-character names
+                and #csname > 1 and lpeg.match(parsers.non_expl3_csname, csname) == nil
+              ) then
             issues:add('s204', 'missing stylistic whitespaces', range_start, range_end)
           end
-          previous_catcode = 0
+          previous_catcode, previous_csname = 0, csname
           character_index = csname_index
         elseif catcode == 5 then  -- end of line
           if state == "N" then
@@ -163,7 +175,13 @@
                 issues:add('e208', 'too many closing braces', range_start, range_end)
               end
             end
-            if previous_catcode ~= 9 and previous_catcode ~= 10 and not (previous_catcode == 6 and catcode == 2) then
+            if (
+                    previous_catcode ~= 9 and previous_catcode ~= 10  -- a potential missing stylistic whitespace
+                    -- do not require whitespace after non-expl3 control sequences or control sequences with empty or one-character names
+                    and (previous_catcode ~= 0 or #previous_csname > 1 and lpeg.match(parsers.non_expl3_csname, previous_csname) == nil)
+                    and (previous_catcode ~= 1 or catcode ~= 2)  -- allow an end grouping immediately after begin grouping
+                    and (previous_catcode ~= 6 or catcode ~= 1 and catcode ~= 2)  -- allow a parameter immediately before grouping
+                ) then
               issues:add('s204', 'missing stylistic whitespaces', range_start, range_end)
             end
             previous_catcode = catcode
@@ -226,6 +244,7 @@
           if next_token_type == "control sequence" then
             if (
                   lpeg.match(parsers.expl3_function_assignment_csname, csname) ~= nil
+                  and lpeg.match(parsers.non_expl3_csname, next_csname) == nil
                   and lpeg.match(parsers.expl3_function_csname, next_csname) == nil
                 ) then
               issues:add('s205', 'malformed function name', next_range_start, next_range_end)
@@ -232,8 +251,9 @@
             end
             if (
                   lpeg.match(parsers.expl3_variable_or_constant_use_csname, csname) ~= nil
+                  and lpeg.match(parsers.non_expl3_csname, next_csname) == nil
+                  and lpeg.match(parsers.expl3_scratch_variable_csname, next_csname) == nil
                   and lpeg.match(parsers.expl3_variable_or_constant_csname, next_csname) == nil
-                  and lpeg.match(parsers.expl3_scratch_variable_csname, next_csname) == nil
                 ) then
               issues:add('s206', 'malformed variable or constant name', next_range_start, next_range_end)
             end

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-obsolete.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-obsolete.lua	2025-01-15 18:18:01 UTC (rev 73462)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-obsolete.lua	2025-01-15 20:59:26 UTC (rev 73463)
@@ -9,8 +9,8 @@
 
 -- luacheck: push no max line length
 local obsolete = {}
-obsolete.removed_csname = P("x") * (P("e") * (P("t") * (P("e") * (P("x") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("n") * (P("g") * (P("i") * (P("n") * (P("e") * (P("_p:") + P(":") * (P("F") + P("T") + P("TF"))))))))))) + wildcard * P(":D"))))))) + P("c") * (P("s") * (P("_") * (P("g") * (P("u") * (P("n") * (P("d") * (P("e") * (P("f") * (P("i") * (P("n") * (P("e") * (P(":") * (P("c") + P("N")))))))))) + P("n") * (P("e") * (P("w") * (P("_") * (P("e") * (P("q") * (P(":") * (P("c") * (P("c") + P("N")) + P("Nc")))) + P("p") * (P("r") * (P("o") * (P("t") * (P("e") * (P("c") * (P("t") * (P("e") * (P("d") * (P("_") * (P("n") * (P("o") * (P("p") * (P("a") * (P("r") * (P(":") * (P("c") * (P("p") * (P("n") + P("x"))) + P("N") * (P("p") * (P("n") + P("x")))))))))) + P(":") * (P("c") * (P("p") * (P("n") + P("x"))) + P("N") * (P("p") * (P("n") + P("x"))))))))))))) + P("n") * (P("o") * (P("p") * (P("a") * (P("r") * (P(":") * (P("c") * (P("p") * (P("n") + P("x"))) + P("N") * (P("p") * (P("n") + P("x")))))))))) + P(":") * (P("c") * (P("p") * (P("n") + P("x"))) + P("N") * (P("p") * (P("n") + P("x")))))))) + P("set_eq:NwN"))) + P("h") * (P("a") * (P("r") * (P("_") * (P("m") * (P("a") * (P("k") * (P("e") * (P("_") * (P("i") * (P("g") * (P("n") * (P("o") * (P("r") * (P("e") * (P(":") * (P("N") + P("n"))))))) + P("n") * (P("v") * (P("a") * (P("l") * (P("i") * (P("d") * (P(":") * (P("N") + P("n"))))))))) + P("m") * (P("a") * (P("t") * (P("h") * (P("_") * (P("s") * (P("u") * (P("p") * (P("e") * (P("r") * (P("s") * (P("c") * (P("r") * (P("i") * (P("p") * (P("t") * (P(":") * (P("N") + P("n"))))))))))) + P("b") * (P("s") * (P("c") * (P("r") * (P("i") * (P("p") * (P("t") * (P(":") * (P("N") + P("n")))))))))) + P("h") * (P("i") * (P("f") * (P("t") * (P(":") * (P("N") + P("n")))))))))))) + P("l") * (P("e") * (P("t") * (P("t") * (P("e") * (P("r") * (P(":") * (P("N") + P("n")))))))) + P("o") * (P("t") * (P("h") * (P("e") * (P("r") * (P(":") * (P("N") + P("n"))))))) + P("a") * (P("c") * (P("t") * (P("i") * (P("v") * (P("e"!
 ) * (P(":") * (P("N") + P("n"))))))) + P("l") * (P("i") * (P("g") * (P("n") * (P("m") * (P("e") * (P("n") * (P("t") * (P("_") * (P("t") * (P("a") * (P("b") * (P(":") * (P("N") + P("n"))))))))))))))) + P("p") * (P("a") * (P("r") * (P("a") * (P("m") * (P("e") * (P("t") * (P("e") * (P("r") * (P(":") * (P("N") + P("n"))))))))))) + P("c") * (P("o") * (P("m") * (P("m") * (P("e") * (P("n") * (P("t") * (P(":") * (P("N") + P("n"))))))))) + P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P("_") * (P("g") * (P("r") * (P("o") * (P("u") * (P("p") * (P(":") * (P("N") + P("n"))))))))))))) + P("e") * (P("s") * (P("c") * (P("a") * (P("p") * (P("e") * (P(":") * (P("N") + P("n"))))))) + P("n") * (P("d") * (P("_") * (P("g") * (P("r") * (P("o") * (P("u") * (P("p") * (P(":") * (P("N") + P("n"))))))) + P("l") * (P("i") * (P("n") * (P("e") * (P(":") * (P("N") + P("n")))))))))) + P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P(":") * (P("N") + P("n")))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("sfcode:w") + P("mathcode:w") + P("lccode:w") + P("uccode:w") + P("catcode:w")))) + P("h") * (P("o") * (P("w") * (P("_") * (P("v") * (P("a") * (P("l") * (P("u") * (P("e") * (P("_") * (P("sfcode:w") + P("mathcode:w") + P("lccode:w") + P("uccode:w") + P("catcode:w")))))))))))) + P("v") * (P("a") * (P("l") * (P("u") * (P("e") * (P("_") * (P("sfcode:w") + P("mathcode:w") + P("lccode:w") + P("uccode:w") + P("catcode:w")))))))))) + P("k_if_free_cs:N")) + P("_") * (P("zero") + P("xetex_is_engine_bool") + P("keys_code_root_tl") + P("job_name_tl") + P("m") * (P("ath_shift_token") + P("inus_one")) + P("l") * (P("etter_token") + P("uatex_is_engine_bool")) + P("o") * (P("ther_char_token") + P("n") * (P("e") + P("e") * (P("_") * (P("thousand") + P("hundred"))))) + P("nine") + P("a") * (P("ctive_char_token") + P("lignment_tab_token")) + P("pdftex_is_engine_bool") + P("catcode_active_tl") + P("undefined_fp") + P("e") * (P("ight") + P("leven") + P("mpty_toks")) + P("t") * (P("e") * (P("n") + P("n_thousand") + P("rm_ior")) + P("h") * (P("i") * (P(!
 "r") * (P("t") * (P("een") + P("y_two")))) + P("ree")) + P("w") * (P("o") + P("elve") + P("o") * (P("_") * (P("h") * (P("u") * (P("n") * (P("d") * (P("r") * (P("e") * (P("d") * (P("_") * (P("f") * (P("i") * (P("f") * (P("t") * (P("y") * (P("_") * (P("six") + P("five"))))))))))))))))))) + P("s") * (P("i") * (P("x") + P("xteen")) + P("tring_cctab") + P("even")) + P("f") * (P("i") * (P("ve") + P("fteen")) + P("o") * (P("u") * (P("r") + P("rteen"))))) + P("l") * (P("i") * (P("s") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("q") * (P("_") * (P("p") * (P(":") * (P("c") * (P("c") + P("N")) + P("Nc")))) + P(":") * (P("c") * (P("c") * (P("F") + P("T") + P("TF")) + P("N") * (P("F") + P("T") + P("TF"))) + P("N") * (P("c") * (P("F") + P("T") + P("TF"))))))))) + P("t") * (P("op:cN") + P("r") * (P("i") * (P("m") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("c") + P("N"))))))))))))) + P("remove_element:Nn") + P("u") * (P("s") * (P("e") * (P(":") * (P("c") + P("N"))))) + P("l") * (P("e") * (P("n") * (P("g") * (P("t") * (P("h") * (P(":") * (P("c") + P("N") + P("n")))))))) + P("g") * (P("t") * (P("r") * (P("i") * (P("m") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("c") + P("N"))))))))))))) + P("remove_element:Nn")) + P("d") * (P("i") * (P("s") * (P("p") * (P("l") * (P("a") * (P("y") * (P(":") * (P("c") + P("N"))))))))))))))) + P("b") * (P("o") * (P("x") * (P("_") * (P("u") * (P("s") * (P("e") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("e") * (P("q") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") * (P("c") + P("N")) + P("N") * (P("c") + P("N"))))))))))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("e") * (P("q") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") * (P("c") + P("N")) + P("N") * (P("c") + P("N")))))))))))))))) + P("r") * (P("e") * (P("s") * (P("!
 i") * (P("z") * (P("e") * (P(":") * (P("cnn") + P("Nnn")))))))))))) + P("e") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(".:D")))))) + P("d") * (P("i") * (P("m") * (P("_") * (P("e") * (P("v") * (P("a") * (P("l") * (P("_end:") + P(":w"))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("m") * (P("a") * (P("x") * (P(":") * (P("cn") + P("Nn")))) + P("i") * (P("n") * (P(":") * (P("cn") + P("Nn"))))))))) + P("case:nnn") + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("m") * (P("a") * (P("x") * (P(":") * (P("cn") + P("Nn")))) + P("i") * (P("n") * (P(":") * (P("cn") + P("Nn")))))))))))))) + P("g") * (P("_") * (P("t") * (P("m") * (P("p") * (P("a_toks") + P("c_toks") + P("b_toks")))) + P("file_current_name_tl")) + P("roup_execute_after:N")) + P("f") * (P("i") * (P("l") * (P("e") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("x") * (P("i") * (P("s") * (P("t") * (P("_") * (P("i") * (P("n") * (P("p") * (P("u") * (P("t") * (P(":") * (P("n") * (P("T") + P("TF"))))))))))))))))) + P("list:") + P("p") * (P("a") * (P("t") * (P("h") * (P("_") * (P("include:n") + P("remove:n")))))) + P("add_path:nN"))))) + P("p") * (P("_") * (P("i") * (P("f") * (P("_") * (P("u") * (P("n") * (P("d") * (P("e") * (P("f") * (P("i") * (P("n") * (P("e") * (P("d") * (P("_p:N") + P(":") * (P("N") * (P("F") + P("T") + P("TF")))))))))))) + P("z") * (P("e") * (P("r") * (P("o") * (P("_p:N") + P(":") * (P("N") * (P("F") + P("T") + P("TF")))))))))) + P("m") * (P("u") * (P("l") * (P(":") * (P("cn") + P("Nn"))))) + P("l") * (P("n") * (P(":") * (P("cn") + P("Nn")))) + P("t") * (P("a") * (P("n") * (P(":") * (P("cn") + P("Nn"))))) + P("n") * (P("e") * (P("g") * (P(":") * (P("c") + P("N"))))) + P("a") * (P("b") * (P("s") * (P(":") * (P("c") + P("N"))))) + P("p") * (P("o") * (P("w") * (P(":") * (P("cn") + P("Nn"))))) + P("c") * (P("o") * (P("m") * (P("p") * (P("a") * (P("r") * (P("e") * (P(":") * (P("N") * (P("N") * (P("N") * (P("F") + P("T") + P("TF")))))))))) + P("s") * (P(":") * (P("cn") + P("Nn"))))) + P("r") * (P("o") * (P("u") * (P("n") *!
  (P("d") * (P("_") * (P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("cn") + P("Nn")))))))) + P("f") * (P("i") * (P("g") * (P("u") * (P("r") * (P("e") * (P("s") * (P(":") * (P("cn") + P("Nn"))))))))))))))) + P("e") * (P("x") * (P("p") * (P(":") * (P("cn") + P("Nn"))))) + P("d") * (P("i") * (P("v") * (P(":") * (P("cn") + P("Nn"))))) + P("g") * (P("m") * (P("u") * (P("l") * (P(":") * (P("cn") + P("Nn"))))) + P("l") * (P("n") * (P(":") * (P("cn") + P("Nn")))) + P("n") * (P("e") * (P("g") * (P(":") * (P("c") + P("N"))))) + P("a") * (P("b") * (P("s") * (P(":") * (P("c") + P("N"))))) + P("p") * (P("o") * (P("w") * (P(":") * (P("cn") + P("Nn"))))) + P("c") * (P("o") * (P("s") * (P(":") * (P("cn") + P("Nn"))))) + P("r") * (P("o") * (P("u") * (P("n") * (P("d") * (P("_") * (P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("cn") + P("Nn")))))))) + P("f") * (P("i") * (P("g") * (P("u") * (P("r") * (P("e") * (P("s") * (P(":") * (P("cn") + P("Nn"))))))))))))))) + P("e") * (P("x") * (P("p") * (P(":") * (P("cn") + P("Nn"))))) + P("d") * (P("i") * (P("v") * (P(":") * (P("cn") + P("Nn"))))) + P("t") * (P("a") * (P("n") * (P(":") * (P("cn") + P("Nn"))))) + P("s") * (P("i") * (P("n") * (P(":") * (P("cn") + P("Nn")))))) + P("s") * (P("i") * (P("n") * (P(":") * (P("cn") + P("Nn")))))))) + P("i") * (P("n") * (P("t") * (P("_") * (P("c") * (P("ase:nnn") + P("o") * (P("n") * (P("v") * (P("e") * (P("r") * (P("t") * (P("_") * (P("to_base_ten:nn") + P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("symbols:nn") + P("base_ten:nn")))))))))))))) + P("e") * (P("v") * (P("a") * (P("l") * (P("_end:") + P(":w"))))) + P("t") * (P("o") * (P("_") * (P("symbol:n") + P("hexadecimal:n") + P("octal:n") + P("binary:n")))) + P("value:w") + P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("hexadecimal:n") + P("octal:n") + P("binary:n"))))))))) + P("o") * (P("w") * (P("_") * (P("wrap:xnnnN") + P("l") * (P("ist_streams:") + P("og_streams:")) + P("open_streams:") + P("n") * (P("o") * (P("w") * (P("_") * (P("!
 w") * (P("h") * (P("e") * (P("n") * (P("_") * (P("a") * (P("v") * (P("a") * (P("i") * (P("l") * (P(":") * (P("N") * (P("n") + P("x"))))))))))))) + P("b") * (P("u") * (P("f") * (P("f") * (P("e") * (P("r") * (P("_") * (P("s") * (P("a") * (P("f") * (P("e") * (P(":") * (P("N") * (P("n") + P("x")))))))))))))))))))) + P("r") * (P("_") * (P("s") * (P("t") * (P("r") * (P("_") * (P("gto:NN") + P("to:NN"))))) + P("to:NN") + P("l") * (P("ist_streams:") + P("og_streams:")) + P("open_streams:") + P("g") * (P("et_str:NN") + P("to:NN"))))) + P("f_num:w")) + P("h") * (P("b") * (P("o") * (P("x") * (P("_") * (P("u") * (P("n") * (P("p") * (P("a") * (P("c") * (P("k") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N")))))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("end:") + P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N")))))))))))))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("end:") + P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N")))))))))))))))))))))))) + P("K") * (P("V") * (P("_") * (P("p") * (P("r") * (P("o") * (P("c") * (P("e") * (P("s") * (P("s") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("_") * (P("r") * (P("e") * (P("m") * (P("o") * (P("v") * (P("a") * (P("l") * (P("_") * (P("sanitize:NNn") + P("no_sanitize:NNn"))))))))))))))) + P("no_space_removal_no_sanitize:NNn")))))))))))) + P("m") * (P("s") * (P("g") * (P("_") * (P("i") * (P("n") * (P("t") * (P("e") * (P("r") * (P("r") * (P("u") * (P("p") * (P("t") * (P(":") * (P("xxx") + P("nn"))))))))))) + P("c") * (P("l") * (P("a") * (P("s") * (P("s") * (P("_") * (P("set:nn") + P("new:nn"))))))) + P("t") * (P("e") * (P("r") * (P("m") * (P(":") * (P("n") + P("x"))))) + P("wo_newlines:") + P("r") * (P("a") * (P("c") * (P("e") * (P(":") * (P("n") * (P("n") + P("n") * (P("x") + P("x") * (P("x") + P("x") * (P("x"!
 ) + P("xx"))))))))))) + P("l") * (P("o") * (P("g") * (P(":") * (P("n") + P("x"))))) + P("d") * (P("i") * (P("r") * (P("e") * (P("c") * (P("t") * (P("_") * (P("interrupt:xxxxx") + P("log:xx") + P("term:xx")))))))) + P("g") * (P("e") * (P("n") * (P("e") * (P("r") * (P("i") * (P("c") * (P("_") * (P("s") * (P("e") * (P("t") * (P(":") * (P("n") * (P("n") + P("nn")))))) + P("n") * (P("e") * (P("w") * (P(":") * (P("n") * (P("n") + P("nn")))))))))))))) + P("newline:"))))) + P("l") * (P("_") * (P("iow_line_length_int") + P("last_box") + P("t") * (P("m") * (P("p") * (P("a_toks") + P("c") * (P("_") * (P("int") + P("toks"))) + P("b_toks"))) + P("l_replace_toks"))) + P("u") * (P("a") * (P("_") * (P("escape_x:n") + P("shipout_x:n") + P("now_x:n")) + P("t") * (P("e") * (P("x") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("n") * (P("g") * (P("i") * (P("n") * (P("e") * (P("_p:") + P(":") * (P("F") + P("T") + P("TF"))))))))))) + wildcard * P(":D")))))))) + P("q") * (P("u") * (P("a") * (P("r") * (P("k") * (P("_") * (P("i") * (P("f") * (P("_") * (P("r") * (P("e") * (P("c") * (P("u") * (P("r") * (P("s") * (P("i") * (P("o") * (P("n") * (P("_") * (P("t") * (P("a") * (P("i") * (P("l") * (P("_") * (P("b") * (P("r") * (P("e") * (P("a") * (P("k") * (P(":") * (P("N") + P("n"))))))))))))))))))))))))))))))) + P("p") * (P("e") * (P("e") * (P("k") * (P("_") * (P("after:NN") + P("gafter:NN"))))) + P("d") * (P("f") * (P("t") * (P("e") * (P("x") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("n") * (P("g") * (P("i") * (P("n") * (P("e") * (P("_p:") + P(":") * (P("F") + P("T") + P("TF"))))))))))) + wildcard * P(":D"))))))) + P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D"))))) + P("r") * (P("g") * (P("_") * (P("s") * (P("et_map_functions:Nn") + P("t") * (P("e") * (P("p") * (P("w") * (P("i") * (P("s") * (P("e") * (P("_") * (P("inline:nnnn") + P("variable:nnnNn") + P("function:nnnN")))))))))) + P("c") * (P("a") * (P("s") * (P("e") * (P("_") * (P("int:nnn") + P("dim:nnn") + P("s") * (P("t") * (P("r") * (P(":") * (P("xxn") +!
  P("onn") + P("nnn"))))) + P("t") * (P("l") * (P(":") * (P("cnn") + P("Nnn"))))))))) + P("new_map_functions:Nn"))) + P("o") * (P("p") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("q") * (P("_") * (P("p") * (P(":") * (P("c") * (P("c") + P("N")) + P("N") * (P("c") + P("N"))))) + P(":") * (P("c") * (P("c") * (P("F") + P("T") + P("TF")) + P("N") * (P("F") + P("T") + P("TF"))) + P("N") * (P("c") * (P("F") + P("T") + P("TF")) + P("N") * (P("F") + P("T") + P("TF")))))) + P("i") * (P("n") * (P(":") * (P("c") * (P("c") * (P("F") + P("T") + P("TF"))))))))) + P("d") * (P("e") * (P("l") * (P(":") * (P("c") * (P("n") + P("V")) + P("N") * (P("n") + P("V"))))) + P("i") * (P("s") * (P("p") * (P("l") * (P("a") * (P("y") * (P(":") * (P("c") + P("N"))))))))) + P("g") * (P("e") * (P("t") * (P("_gdel:NnN") + P(":") * (P("cn") + P("Nn")))) + P("d") * (P("e") * (P("l") * (P(":") * (P("c") * (P("n") + P("V")) + P("N") * (P("n") + P("V")))))) + P("g") * (P("e") * (P("t") * (P(":") * (P("c") * (P("VN") + P("nN")) + P("N") * (P("VN") + P("nN")))))) + P("put:ccx"))))))) + P("s") * (P("k") * (P("i") * (P("p") * (P("_") * (P("i") * (P("f") * (P("_") * (P("i") * (P("n") * (P("f") * (P("i") * (P("n") * (P("i") * (P("t") * (P("e") * (P("_") * (P("g") * (P("l") * (P("u") * (P("e") * (P("_p:n") + P(":") * (P("n") * (P("F") + P("T") + P("TF"))))))))))))))))))))))) + P("e") * (P("q") * (P("_") * (P("u") * (P("s") * (P("e") * (P(":") * (P("c") + P("N"))))) + P("d") * (P("i") * (P("s") * (P("p") * (P("l") * (P("a") * (P("y") * (P(":") * (P("c") + P("N"))))))))) + P("t") * (P("o") * (P("p") * (P(":") * (P("cN") + P("NN"))))) + P("l") * (P("e") * (P("n") * (P("g") * (P("t") * (P("h") * (P(":") * (P("c") + P("N"))))))))))) + P("t") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P("_") * (P("x") * (P(":") * (P("n") * (P("n") + P("n") * (P("F") + P("n") + P("T") + P("TF")))))) + P(":") * (P("onn") + P("nnn")))))) + P("i") * (P("f") * (P("_") * (P("e") * (P("q") * (P("_") * (P("x") * (P("_p:nn") + P(":") * (P("n") * (P("n") * (P("!
 F") + P("T") + P("TF"))))) + P("p:xx")) + P(":") * (P("x") * (P("x") * (P("F") + P("T") + P("TF")))))))))))) + P("o") * (P("r") * (P("t") * (P("_") * (P("ordered:") + P("reversed:"))))) + P("can_align_safe_stop:")) + P("u") * (P("p") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D")))))) + P("s") * (P("e") * (P("_") * (P("i") * (P("_") * (P("a") * (P("f") * (P("t") * (P("e") * (P("r") * (P("_") * (P("else:nw") + P("o") * (P("r") * (P("else:nw") + P(":nw"))) + P("fi:nw")))))))))))) + P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D")))))) + P("t") * (P("o") * (P("k") * (P("e") * (P("n") * (P("_") * (P("i") * (P("f") * (P("_") * (P("m") * (P("a") * (P("t") * (P("h") * (P("_") * (P("s") * (P("h") * (P("i") * (P("f") * (P("t") * (P("_p:N") + P(":") * (P("N") * (P("F") + P("T") + P("TF"))))))))))))) + P("o") * (P("t") * (P("h") * (P("e") * (P("r") * (P("_") * (P("c") * (P("h") * (P("a") * (P("r") * (P("_p:N") + P(":") * (P("N") * (P("F") + P("T") + P("TF"))))))))))))) + P("a") * (P("c") * (P("t") * (P("i") * (P("v") * (P("e") * (P("_") * (P("c") * (P("h") * (P("a") * (P("r") * (P("_p:N") + P(":") * (P("N") * (P("F") + P("T") + P("TF"))))))))))))) + P("l") * (P("i") * (P("g") * (P("n") * (P("m") * (P("e") * (P("n") * (P("t") * (P("_") * (P("t") * (P("a") * (P("b") * (P("_p:N") + P(":") * (P("N") * (P("F") + P("T") + P("TF"))))))))))))))))))) + P("g") * (P("e") * (P("t") * (P("_") * (P("arg_spec:N") + P("prefix_spec:N") + P("replacement_spec:N"))))) + P("new:Nn")))) + P("s") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("m") * (P("p") * (P("t") * (P("y") * (P("_") * (P("p") * (P(":") * (P("c") + P("N")))) + P(":") * (P("c") * (P("F") + P("T") + P("TF")) + P("N") * (P("F") + P("T") + P("TF"))))))) + P("q") * (P("_") * (P("p") * (P(":") * (P("c") * (P("c") + P("N")) + P("N") * (P("c") + P("N"))))) + P(":") * (P("c") * (P("c") * (P("F") + P("T") + P("TF")) + P("N") * (P("F") + P("T") + P("TF"))) + P("N") * (P("c") * (P("F") + P("T") + P("TF")) + P("N") * (P("F") + P("T") + P("TF"))))))))) + P(!
 "p") * (P("u") * (P("t") * (P("_") * (P("r") * (P("i") * (P("g") * (P("h") * (P("t") * (P(":") * (P("c") * (P("n") + P("o") + P("V")) + P("N") * (P("f") + P("n") + P("o") + P("V") + P("x")))))))) + P("l") * (P("e") * (P("f") * (P("t") * (P(":") * (P("c") * (P("n") + P("o") + P("V")) + P("N") * (P("n") + P("o") + P("V") + P("x"))))))))))) + P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))) + P("u") * (P("s") * (P("e") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))) + P("g") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))))) + P(":") * (P("c") + P("N"))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("e") * (P("q") * (P(":") * (P("c") * (P("c") + P("N")) + P("N") * (P("c") + P("N")))))) + P(":") * (P("c") * (P("f") + P("n") + P("o") + P("V") + P("v") + P("x")) + P("N") * (P("f") + P("n") + P("o") + P("V") + P("v") + P("x"))))) + P("h") * (P("o") * (P("w") * (P(":") * (P("c") + P("N")))))) + P("g") * (P("p") * (P("u") * (P("t") * (P("_") * (P("r") * (P("i") * (P("g") * (P("h") * (P("t") * (P(":") * (P("c") * (P("n") + P("o") + P("V")) + P("N") * (P("n") + P("o") + P("V") + P("x")))))))) + P("l") * (P("e") * (P("f") * (P("t") * (P(":") * (P("c") * (P("n") + P("o") + P("V")) + P("N") * (P("n") + P("o") + P("V") + P("x"))))))))))) + P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("e") * (P("q") * (P(":") * (P("c") * (P("c") + P("N")) + P("N") * (P("c") + P("N")))))) + P(":") * (P("c") * (P("n") + P("o") + P("V") + P("x")) + P("N") * (P("n") + P("o") + P("V") + P("x"))))))) + P("n") * (P("e") * (P("w") * (P(":") * (P("c") + P("N"))))))))) + P("l") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("m") * (P("p") * (P("t") * (P("y") * (P(":") * (P("x") * (P("F") + P("T") + P("TF")))))))) + P("h") * (P("e") * (P("a") * (P("d") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("_p:n") + P(":") * (P("n") * (P("F") +!
  P("T") + P("TF")))))))) + P("g") * (P("r") * (P("o") * (P("u") * (P("p") * (P("_p:n") + P(":") * (P("n") * (P("F") + P("T") + P("TF")))))))) + P("N") * (P("_") * (P("t") * (P("y") * (P("p") * (P("e") * (P("_p:n") + P(":") * (P("n") * (P("F") + P("T") + P("TF"))))))))))))))))) + P("h") * (P("e") * (P("a") * (P("d") * (P("_") * (P("i") * (P("i") * (P("i") * (P(":") * (P("f") + P("n") + P("w")))) + P(":") * (P("n") + P("w")))))))) + P("l") * (P("e") * (P("n") * (P("g") * (P("t") * (P("h") * (P(":") * (P("c") + P("n") + P("N") + P("o") + P("V")))))))) + P("n") * (P("e") * (P("w") * (P(":") * (P("cn") + P("N") * (P("n") + P("x")))))) + P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("cnn") + P("Nnn")))))) + P("r") * (P("e") * (P("m") * (P("o") * (P("v") * (P("e") * (P("_") * (P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("cn") + P("Nn")))))))) + P("i") * (P("n") * (P(":") * (P("cn") + P("Nn"))))))))) + P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("_") * (P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("cnn") + P("Nnn")))))))) + P("i") * (P("n") * (P(":") * (P("cnn") + P("Nnn")))))))))))) + P("e") * (P("l") * (P("t") * (P("_") * (P("c") * (P("o") * (P("u") * (P("n") * (P("t") * (P(":") * (P("c") + P("n") + P("N") + P("o") + P("V"))))))))))) + P("t") * (P("ail:w") + P("o") * (P("_") * (P("uppercase:n") + P("lowercase:n")))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("f") * (P("i") * (P("l") * (P("e") * (P("_") * (P("x") * (P(":") * (P("cnn") + P("Nnn")))) + P(":") * (P("cnn") + P("Nnn")))))))))))) + P(":Nc")))) + P("r") * (P("e") * (P("m") * (P("o") * (P("v") * (P("e") * (P("_") * (P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("cn") + P("Nn")))))))) + P("i") * (P("n") * (P(":") * (P("cn") + P("Nn"))))))))) + P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("_") * (P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("cnn") + P("Nnn")))))))) + P("i") *!
  (P("n") * (P(":") * (P("cnn") + P("Nnn"))))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("f") * (P("i") * (P("l") * (P("e") * (P("_") * (P("x") * (P(":") * (P("cnn") + P("Nnn")))) + P(":") * (P("cnn") + P("Nnn")))))))))))) + P(":Nc"))) + P("h") * (P("o") * (P("w") * (P("_") * (P("a") * (P("n") * (P("a") * (P("l") * (P("y") * (P("s") * (P("i") * (P("s") * (P(":") * (P("N") + P("n")))))))))))))))))) + P("E") * (P("x") * (P("p") * (P("l") * (P("S") * (P("y") * (P("n") * (P("t") * (P("a") * (P("x") * (P("N") * (P("a") * (P("m") * (P("e") * (P("s") * (P("O") * (P("n") + P("ff"))))))))))))))))) + P("v") * (P("b") * (P("o") * (P("x") * (P("_") * (P("u") * (P("n") * (P("p") * (P("a") * (P("c") * (P("k") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N")))))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("end:") + P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N")))))))))))))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("end:") + P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N")))))))))))))))))))))))) * eof
-obsolete.deprecated_csname = P("i") * (P("o") * (P("w") * (P("_") * (P("s") * (P("h") * (P("i") * (P("p") * (P("o") * (P("u") * (P("t") * (P("_") * (P("x") * (P(":") * (P("c") * (P("n") + P("x")) + P("N") * (P("n") + P("x")))))))))))))))) + P("p") * (P("e") * (P("e") * (P("k") * (P("_") * (P("c") * (P("a") * (P("t") * (P("c") * (P("o") * (P("d") * (P("e") * (P("_") * (P("ignore_spaces:N") + P("remove_ignore_spaces:N")))))))) + P("h") * (P("a") * (P("r") * (P("c") * (P("o") * (P("d") * (P("e") * (P("_") * (P("ignore_spaces:N") + P("remove_ignore_spaces:N")))))))))) + P("m") * (P("e") * (P("a") * (P("n") * (P("i") * (P("n") * (P("g") * (P("_") * (P("ignore_spaces:N") + P("remove_ignore_spaces:N"))))))))))))) + P("d") * (P("f") * (P("_") * (P("o") * (P("b") * (P("j") * (P("e") * (P("c") * (P("t") * (P("_") * (P("w") * (P("r") * (P("i") * (P("t") * (P("e") * (P(":") * (P("n") * (P("n") + P("x")))))))) + P("new:nn"))))))))))) + P("r") * (P("o") * (P("p") * (P("_") * (P("g") * (P("p") * (P("u") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("c") * (P("Vn") + P("n") * (P("n") + P("V"))) + P("N") * (P("Vn") + P("n") * (P("n") + P("V"))))))))))))))) + P("p") * (P("u") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("c") * (P("Vn") + P("n") * (P("n") + P("V"))) + P("N") * (P("Vn") + P("n") * (P("n") + P("V"))))))))))))))))))) + P("k") * (P("e") * (P("y") * (P("s") * (P("_") * (P("s") * (P("e") * (P("t") * (P("_") * (P("f") * (P("i") * (P("l") * (P("t") * (P("e") * (P("r") * (P(":") * (P("n") * (P("n") * (P("n") + P("V") + P("v") + P("o") + P("V") * (P("N") + P("nN")) + P("v") * (P("N") + P("nN")) + P("o") * (P("N") + P("nN")) + P("n") * (P("N") + P("nN")))))))))))))))))))) + P("t") * (P("e") * (P("x") * (P("t") * (P("_") * (P("t") * (P("i") * (P("t") * (P("l") * (P("e") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("nn"))))))))))))))) + P("l") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":")!
  * (P("c") * (P("n") + P("n") * (P("F") + P("T") + P("TF"))) + P("N") * (P("n") + P("n") * (P("F") + P("T") + P("TF")))))))) + P("b") * (P("u") * (P("i") * (P("l") * (P("d") * (P("_") * (P("clear:N") + P("g") * (P("clear:N") + P("et:NN")))))))) + P("m") * (P("i") * (P("x") * (P("e") * (P("d") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("nn")))))))))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("nn")))))))))))) + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("nn"))))))))))))))) + P("m") * (P("s") * (P("g") * (P("_") * (P("g") * (P("s") * (P("e") * (P("t") * (P(":") * (P("n") * (P("n") * (P("n") + P("nn")))))))))))) + P("l") * (P("_") * (P("k") * (P("e") * (P("y") * (P("s") * (P("_") * (P("key_tl") + P("path_tl")))))) + P("t") * (P("e") * (P("x") * (P("t") * (P("_") * (P("accents_tl") + P("letterlike_tl")))))))) + P("s") * (P("e") * (P("q") * (P("_") * (P("i") * (P("n") * (P("d") * (P("e") * (P("x") * (P("e") * (P("d") * (P("_") * (P("m") * (P("a") * (P("p") * (P("_") * (P("inline:Nn") + P("function:NN"))))))))))))) + P("gset_map_x:NNn") + P("set_map_x:NNn")))) + P("t") * (P("r") * (P("_") * (P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("f") + P("n")))))))))))) + P("declare_eight_bit_encoding:nnn") + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("f") + P("n")))))))))))) + P("f") * (P("o") * (P("l") * (P("d") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("V"))))))) + P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("V"))))))))))))) + P("ys_load_deprecation:")) + P("c") * (P("s_argument_spec:N") + P("h") * (P("a") * (P("r") * (P("_") * (P("s") * (P("t") * (P("r") * (P("_") * (P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_case:N") + P("case:N")))))) + P("mi!
 xed_case:N") + P("titlecase:N") + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_case:N") + P("case:N")))))) + P("f") * (P("o") * (P("l") * (P("d") * (P("_case:N") + P("case:N"))))))))) + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_case:N") + P("case:N")))))) + P("mixed_case:N") + P("t") * (P("itlecase:N") + P("o") * (P("_") * (P("utfviii_bytes:n") + P("nfd:N")))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_case:N") + P("case:N")))))) + P("f") * (P("o") * (P("l") * (P("d") * (P("_case:N") + P("case:N")))))))))) * eof
+obsolete.deprecated_csname = (P("p") * (P("d") * (P("f") * (P("_") * (P("o") * (P("b") * (P("j") * (P("e") * (P("c") * (P("t") * (P("_") * (P("new:nn") + P("w") * (P("r") * (P("i") * (P("t") * (P("e") * (P(":") * (P("n") * (P("n") + P("x")))))))))))))))))) + P("e") * (P("e") * (P("k") * (P("_") * (P("m") * (P("e") * (P("a") * (P("n") * (P("i") * (P("n") * (P("g") * (P("_") * (P("remove_ignore_spaces:N") + P("ignore_spaces:N"))))))))) + P("c") * (P("h") * (P("a") * (P("r") * (P("c") * (P("o") * (P("d") * (P("e") * (P("_") * (P("remove_ignore_spaces:N") + P("ignore_spaces:N"))))))))) + P("a") * (P("t") * (P("c") * (P("o") * (P("d") * (P("e") * (P("_") * (P("remove_ignore_spaces:N") + P("ignore_spaces:N"))))))))))))) + P("r") * (P("o") * (P("p") * (P("_") * (P("p") * (P("u") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("N") * (P("n") * (P("n") + P("V")) + P("Vn")) + P("c") * (P("n") * (P("n") + P("V")) + P("Vn"))))))))))))) + P("g") * (P("p") * (P("u") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("N") * (P("n") * (P("n") + P("V")) + P("Vn")) + P("c") * (P("n") * (P("n") + P("V")) + P("Vn"))))))))))))))))))) + P("i") * (P("o") * (P("w") * (P("_") * (P("s") * (P("h") * (P("i") * (P("p") * (P("o") * (P("u") * (P("t") * (P("_") * (P("x") * (P(":") * (P("N") * (P("n") + P("x")) + P("c") * (P("n") + P("x")))))))))))))))) + P("t") * (P("l") * (P("_") * (P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("m") * (P("i") * (P("x") * (P("e") * (P("d") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("b") * (P("u") * (P("i") * (P("l") * (P("d") * (P("_") * (P("g") * (P("et:NN") + P("clear:N")) + P("clear:N"))))))) + P("c") * (P("a") * (P("s") * (P(!
 "e") * (P(":") * (P("N") * (P("n") * (P("TF") + P("F") + P("T")) + P("n")) + P("c") * (P("n") * (P("TF") + P("F") + P("T")) + P("n"))))))))) + P("e") * (P("x") * (P("t") * (P("_") * (P("t") * (P("i") * (P("t") * (P("l") * (P("e") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))))))) + P("s") * (P("t") * (P("r") * (P("_") * (P("declare_eight_bit_encoding:nnn") + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("f") + P("n")))))))))))) + P("f") * (P("o") * (P("l") * (P("d") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("V")))))) + P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("V"))))))))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("f") + P("n"))))))))))))))) + P("e") * (P("q") * (P("_") * (P("i") * (P("n") * (P("d") * (P("e") * (P("x") * (P("e") * (P("d") * (P("_") * (P("m") * (P("a") * (P("p") * (P("_") * (P("function:NN") + P("inline:Nn"))))))))))))) + P("set_map_x:NNn") + P("gset_map_x:NNn")))) + P("ys_load_deprecation:")) + P("l") * (P("_") * (P("t") * (P("e") * (P("x") * (P("t") * (P("_") * (P("letterlike_tl") + P("accents_tl")))))) + P("k") * (P("e") * (P("y") * (P("s") * (P("_") * (P("path_tl") + P("key_tl")))))))) + P("m") * (P("s") * (P("g") * (P("_") * (P("g") * (P("s") * (P("e") * (P("t") * (P(":") * (P("n") * (P("n") * (P("nn") + P("n")))))))))))) + P("k") * (P("e") * (P("y") * (P("s") * (P("_") * (P("s") * (P("e") * (P("t") * (P("_") * (P("f") * (P("i") * (P("l") * (P("t") * (P("e") * (P("r") * (P(":") * (P("n") * (P("n") * (P("n") * (P("nN") + P("N")) + P("v") * (P("nN") + P("N")) + P("V") * (P("nN") + P("N")) + P("o") * (P("nN") + P("N")) + P("n") + P("V") + P("v") + P("o"))))))))))))))))))) + P("c") * (P("h") * (P("a") * (P("r") * (P("_") * (P("f") * (P("o") * (P("l") * (P("d") * (P("case:N") + P("_case:N"))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))!
 ) + P("t") * (P("o") * (P("_") * (P("nfd:N") + P("utfviii_bytes:n"))) + P("itlecase:N")) + P("mixed_case:N") + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))) + P("s") * (P("t") * (P("r") * (P("_") * (P("f") * (P("o") * (P("l") * (P("d") * (P("case:N") + P("_case:N"))))) + P("titlecase:N") + P("mixed_case:N") + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))))))))))) + P("s_argument_spec:N"))) * eof
+obsolete.removed_csname = (P("h") * (P("b") * (P("o") * (P("x") * (P("_") * (P("u") * (P("n") * (P("p") * (P("a") * (P("c") * (P("k") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N")))))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N"))))))) + P("end:")))))))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N"))))))) + P("end:")))))))))))))))))) + P("i") * (P("f_num:w") + P("n") * (P("t") * (P("_") * (P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("hexadecimal:n") + P("binary:n") + P("octal:n")))))) + P("t") * (P("o") * (P("_") * (P("hexadecimal:n") + P("symbol:n") + P("binary:n") + P("octal:n")))) + P("e") * (P("v") * (P("a") * (P("l") * (P(":w") + P("_end:"))))) + P("value:w") + P("c") * (P("o") * (P("n") * (P("v") * (P("e") * (P("r") * (P("t") * (P("_") * (P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("base_ten:nn") + P("symbols:nn")))))) + P("to_base_ten:nn")))))))) + P("ase:nnn"))))) + P("o") * (P("r") * (P("_") * (P("g") * (P("to:NN") + P("et_str:NN")) + P("l") * (P("og_streams:") + P("ist_streams:")) + P("to:NN") + P("open_streams:") + P("s") * (P("t") * (P("r") * (P("_") * (P("to:NN") + P("gto:NN"))))))) + P("w") * (P("_") * (P("l") * (P("og_streams:") + P("ist_streams:")) + P("wrap:xnnnN") + P("n") * (P("o") * (P("w") * (P("_") * (P("b") * (P("u") * (P("f") * (P("f") * (P("e") * (P("r") * (P("_") * (P("s") * (P("a") * (P("f") * (P("e") * (P(":") * (P("N") * (P("n") + P("x")))))))))))))) + P("w") * (P("h") * (P("e") * (P("n") * (P("_") * (P("a") * (P("v") * (P("a") * (P("i") * (P("l") * (P(":") * (P("N") * (P("n") + P("x"))))))))))))))))) + P("open_streams:"))))) + P("f") * (P("p") * (P("_") * (P("i") * (P("f") * (P("_") * (P("z") * (P("e") * (P("r") * !
 (P("o") * (P(":") * (P("N") * (P("TF") + P("F") + P("T"))) + P("_p:N"))))) + P("u") * (P("n") * (P("d") * (P("e") * (P("f") * (P("i") * (P("n") * (P("e") * (P("d") * (P(":") * (P("N") * (P("TF") + P("F") + P("T"))) + P("_p:N"))))))))))))) + P("g") * (P("l") * (P("n") * (P(":") * (P("Nn") + P("cn")))) + P("m") * (P("u") * (P("l") * (P(":") * (P("Nn") + P("cn"))))) + P("t") * (P("a") * (P("n") * (P(":") * (P("Nn") + P("cn"))))) + P("p") * (P("o") * (P("w") * (P(":") * (P("Nn") + P("cn"))))) + P("a") * (P("b") * (P("s") * (P(":") * (P("c") + P("N"))))) + P("n") * (P("e") * (P("g") * (P(":") * (P("c") + P("N"))))) + P("s") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn"))))) + P("d") * (P("i") * (P("v") * (P(":") * (P("Nn") + P("cn"))))) + P("e") * (P("x") * (P("p") * (P(":") * (P("Nn") + P("cn"))))) + P("r") * (P("o") * (P("u") * (P("n") * (P("d") * (P("_") * (P("f") * (P("i") * (P("g") * (P("u") * (P("r") * (P("e") * (P("s") * (P(":") * (P("Nn") + P("cn"))))))))) + P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("Nn") + P("cn")))))))))))))) + P("c") * (P("o") * (P("s") * (P(":") * (P("Nn") + P("cn")))))) + P("l") * (P("n") * (P(":") * (P("Nn") + P("cn")))) + P("m") * (P("u") * (P("l") * (P(":") * (P("Nn") + P("cn"))))) + P("t") * (P("a") * (P("n") * (P(":") * (P("Nn") + P("cn"))))) + P("p") * (P("o") * (P("w") * (P(":") * (P("Nn") + P("cn"))))) + P("a") * (P("b") * (P("s") * (P(":") * (P("c") + P("N"))))) + P("n") * (P("e") * (P("g") * (P(":") * (P("c") + P("N"))))) + P("s") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn"))))) + P("d") * (P("i") * (P("v") * (P(":") * (P("Nn") + P("cn"))))) + P("e") * (P("x") * (P("p") * (P(":") * (P("Nn") + P("cn"))))) + P("r") * (P("o") * (P("u") * (P("n") * (P("d") * (P("_") * (P("f") * (P("i") * (P("g") * (P("u") * (P("r") * (P("e") * (P("s") * (P(":") * (P("Nn") + P("cn"))))))))) + P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("Nn") + P("cn")))))))))))))) + P("c") * (P("o") * (P("s") * (P(":") * (P("Nn") + P("cn"))) + P("m"!
 ) * (P("p") * (P("a") * (P("r") * (P("e") * (P(":") * (P("N") * (P("N") * (P("N") * (P("TF") + P("F") + P("T")))))))))))))) + P("i") * (P("l") * (P("e") * (P("_") * (P("list:") + P("add_path:nN") + P("p") * (P("a") * (P("t") * (P("h") * (P("_") * (P("remove:n") + P("include:n")))))) + P("i") * (P("f") * (P("_") * (P("e") * (P("x") * (P("i") * (P("s") * (P("t") * (P("_") * (P("i") * (P("n") * (P("p") * (P("u") * (P("t") * (P(":") * (P("n") * (P("TF") + P("T")))))))))))))))))))))) + P("g") * (P("roup_execute_after:N") + P("_") * (P("file_current_name_tl") + P("t") * (P("m") * (P("p") * (P("a_toks") + P("b_toks") + P("c_toks")))))) + P("l") * (P("u") * (P("a") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D") + P("i") * (P("f") * (P("_") * (P("e") * (P("n") * (P("g") * (P("i") * (P("n") * (P("e") * (P(":") * (P("TF") + P("F") + P("T")) + P("_p:")))))))))))))) + P("_") * (P("escape_x:n") + P("now_x:n") + P("shipout_x:n")))) + P("_") * (P("last_box") + P("iow_line_length_int") + P("t") * (P("l_replace_toks") + P("m") * (P("p") * (P("a_toks") + P("b_toks") + P("c") * (P("_") * (P("toks") + P("int")))))))) + P("m") * (P("s") * (P("g") * (P("_") * (P("i") * (P("n") * (P("t") * (P("e") * (P("r") * (P("r") * (P("u") * (P("p") * (P("t") * (P(":") * (P("nn") + P("xxx"))))))))))) + P("newline:") + P("g") * (P("e") * (P("n") * (P("e") * (P("r") * (P("i") * (P("c") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("n") * (P("nn") + P("n")))))) + P("s") * (P("e") * (P("t") * (P(":") * (P("n") * (P("nn") + P("n")))))))))))))) + P("d") * (P("i") * (P("r") * (P("e") * (P("c") * (P("t") * (P("_") * (P("log:xx") + P("interrupt:xxxxx") + P("term:xx")))))))) + P("t") * (P("e") * (P("r") * (P("m") * (P(":") * (P("n") + P("x"))))) + P("r") * (P("a") * (P("c") * (P("e") * (P(":") * (P("n") * (P("n") * (P("x") * (P("x") * (P("xx") + P("x")) + P("x")) + P("x")) + P("n"))))))) + P("wo_newlines:")) + P("l") * (P("o") * (P("g") * (P(":") * (P("n") + P("x"))))) + P("c") * (P("l") * (P("a") * (P("s") * (P("s") * (P("_") * (P("n!
 ew:nn") + P("set:nn"))))))))))) + P("K") * (P("V") * (P("_") * (P("p") * (P("r") * (P("o") * (P("c") * (P("e") * (P("s") * (P("s") * (P("_") * (P("no_space_removal_no_sanitize:NNn") + P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("_") * (P("r") * (P("e") * (P("m") * (P("o") * (P("v") * (P("a") * (P("l") * (P("_") * (P("no_sanitize:NNn") + P("sanitize:NNn")))))))))))))))))))))))))) + P("d") * (P("i") * (P("m") * (P("_") * (P("s") * (P("e") * (P("t") * (P("_") * (P("m") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn")))) + P("a") * (P("x") * (P(":") * (P("Nn") + P("cn"))))))))) + P("e") * (P("v") * (P("a") * (P("l") * (P(":w") + P("_end:"))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("m") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn")))) + P("a") * (P("x") * (P(":") * (P("Nn") + P("cn")))))))))) + P("case:nnn"))))) + P("e") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(".:D")))))) + P("b") * (P("o") * (P("x") * (P("_") * (P("s") * (P("e") * (P("t") * (P("_") * (P("e") * (P("q") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("N") * (P("c") + P("N")) + P("c") * (P("c") + P("N"))))))))))))))) + P("u") * (P("s") * (P("e") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))))))) + P("r") * (P("e") * (P("s") * (P("i") * (P("z") * (P("e") * (P(":") * (P("Nnn") + P("cnn")))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("e") * (P("q") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("N") * (P("c") + P("N")) + P("c") * (P("c") + P("N")))))))))))))))))))) + P("c") * (P("h") * (P("k_if_free_cs:N") + P("a") * (P("r") * (P("_") * (P("m") * (P("a") * (P("k") * (P("e") * (P("_") * (P("i") * (P("n") * (P("v") * (P("a") * (P("l") * (P("i") * (P("d") * (P(":") * (P("N") + P("n")))))))) + P("g") * (P("n") * (P("o") * (P("r") * (P("e") * (P(":") * (P("N") + P("n")))))))) + P("l") * (P("e") * (P("t") * (P("t") * (P("e") * (P("r") * (P(":") * (P("N") + P("n")))))))) + P("m") * (P("a") * (P("t") !
 * (P("h") * (P("_") * (P("s") * (P("h") * (P("i") * (P("f") * (P("t") * (P(":") * (P("N") + P("n")))))) + P("u") * (P("b") * (P("s") * (P("c") * (P("r") * (P("i") * (P("p") * (P("t") * (P(":") * (P("N") + P("n"))))))))) + P("p") * (P("e") * (P("r") * (P("s") * (P("c") * (P("r") * (P("i") * (P("p") * (P("t") * (P(":") * (P("N") + P("n")))))))))))))))))) + P("p") * (P("a") * (P("r") * (P("a") * (P("m") * (P("e") * (P("t") * (P("e") * (P("r") * (P(":") * (P("N") + P("n"))))))))))) + P("a") * (P("l") * (P("i") * (P("g") * (P("n") * (P("m") * (P("e") * (P("n") * (P("t") * (P("_") * (P("t") * (P("a") * (P("b") * (P(":") * (P("N") + P("n")))))))))))))) + P("c") * (P("t") * (P("i") * (P("v") * (P("e") * (P(":") * (P("N") + P("n")))))))) + P("o") * (P("t") * (P("h") * (P("e") * (P("r") * (P(":") * (P("N") + P("n"))))))) + P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P(":") * (P("N") + P("n"))))))) + P("e") * (P("n") * (P("d") * (P("_") * (P("l") * (P("i") * (P("n") * (P("e") * (P(":") * (P("N") + P("n")))))) + P("g") * (P("r") * (P("o") * (P("u") * (P("p") * (P(":") * (P("N") + P("n")))))))))) + P("s") * (P("c") * (P("a") * (P("p") * (P("e") * (P(":") * (P("N") + P("n")))))))) + P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P("_") * (P("g") * (P("r") * (P("o") * (P("u") * (P("p") * (P(":") * (P("N") + P("n"))))))))))))) + P("c") * (P("o") * (P("m") * (P("m") * (P("e") * (P("n") * (P("t") * (P(":") * (P("N") + P("n")))))))))))))) + P("v") * (P("a") * (P("l") * (P("u") * (P("e") * (P("_") * (P("uccode:w") + P("lccode:w") + P("mathcode:w") + P("sfcode:w") + P("catcode:w"))))))) + P("s") * (P("h") * (P("o") * (P("w") * (P("_") * (P("v") * (P("a") * (P("l") * (P("u") * (P("e") * (P("_") * (P("uccode:w") + P("lccode:w") + P("mathcode:w") + P("sfcode:w") + P("catcode:w"))))))))))) + P("e") * (P("t") * (P("_") * (P("uccode:w") + P("lccode:w") + P("mathcode:w") + P("sfcode:w") + P("catcode:w"))))))))) + P("s") * (P("_") * (P("set_eq:NwN") + P("g") * (P("n") * (P("e") * (P("w") * (P(":") * (P("N") * (P("p") * (P("n") + P(!
 "x"))) + P("c") * (P("p") * (P("n") + P("x")))) + P("_") * (P("p") * (P("r") * (P("o") * (P("t") * (P("e") * (P("c") * (P("t") * (P("e") * (P("d") * (P(":") * (P("N") * (P("p") * (P("n") + P("x"))) + P("c") * (P("p") * (P("n") + P("x")))) + P("_") * (P("n") * (P("o") * (P("p") * (P("a") * (P("r") * (P(":") * (P("N") * (P("p") * (P("n") + P("x"))) + P("c") * (P("p") * (P("n") + P("x"))))))))))))))))))) + P("e") * (P("q") * (P(":") * (P("Nc") + P("c") * (P("c") + P("N"))))) + P("n") * (P("o") * (P("p") * (P("a") * (P("r") * (P(":") * (P("N") * (P("p") * (P("n") + P("x"))) + P("c") * (P("p") * (P("n") + P("x"))))))))))))) + P("u") * (P("n") * (P("d") * (P("e") * (P("f") * (P("i") * (P("n") * (P("e") * (P(":") * (P("c") + P("N"))))))))))))) + P("l") * (P("i") * (P("s") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("q") * (P(":") * (P("N") * (P("c") * (P("TF") + P("F") + P("T"))) + P("c") * (P("N") * (P("TF") + P("F") + P("T")) + P("c") * (P("TF") + P("F") + P("T")))) + P("_") * (P("p") * (P(":") * (P("Nc") + P("c") * (P("c") + P("N")))))))))) + P("t") * (P("r") * (P("i") * (P("m") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("c") + P("N")))))))))))) + P("op:cN")) + P("g") * (P("remove_element:Nn") + P("t") * (P("r") * (P("i") * (P("m") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * (P("s") * (P(":") * (P("c") + P("N")))))))))))))) + P("l") * (P("e") * (P("n") * (P("g") * (P("t") * (P("h") * (P(":") * (P("c") + P("N") + P("n")))))))) + P("u") * (P("s") * (P("e") * (P(":") * (P("c") + P("N"))))) + P("remove_element:Nn") + P("d") * (P("i") * (P("s") * (P("p") * (P("l") * (P("a") * (P("y") * (P(":") * (P("c") + P("N")))))))))))))) + P("_") * (P("xetex_is_engine_bool") + P("zero") + P("f") * (P("o") * (P("u") * (P("rteen") + P("r"))) + P("i") * (P("fteen") + P("ve"))) + P("undefined_fp") + P("l") * (P("uatex_is_engine_bool") + P("etter_token")) + P("m") * (P("inus_one") + P("ath_shift_token")) + P("job_name_tl") + P("keys_code_root_tl") + P("pdftex!
 _is_engine_bool") + P("a") * (P("lignment_tab_token") + P("ctive_char_token")) + P("nine") + P("o") * (P("n") * (P("e") * (P("_") * (P("hundred") + P("thousand"))) + P("e")) + P("ther_char_token")) + P("t") * (P("h") * (P("ree") + P("i") * (P("r") * (P("t") * (P("y_two") + P("een"))))) + P("e") * (P("rm_ior") + P("n_thousand") + P("n")) + P("w") * (P("o") * (P("_") * (P("h") * (P("u") * (P("n") * (P("d") * (P("r") * (P("e") * (P("d") * (P("_") * (P("f") * (P("i") * (P("f") * (P("t") * (P("y") * (P("_") * (P("five") + P("six"))))))))))))))))) + P("elve") + P("o"))) + P("e") * (P("leven") + P("ight") + P("mpty_toks")) + P("s") * (P("tring_cctab") + P("even") + P("i") * (P("xteen") + P("x"))) + P("catcode_active_tl"))) + P("x") * (P("e") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D") + P("i") * (P("f") * (P("_") * (P("e") * (P("n") * (P("g") * (P("i") * (P("n") * (P("e") * (P(":") * (P("TF") + P("F") + P("T")) + P("_p:")))))))))))))))) + P("v") * (P("b") * (P("o") * (P("x") * (P("_") * (P("u") * (P("n") * (P("p") * (P("a") * (P("c") * (P("k") * (P("_") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N")))))))))))))) + P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N"))))))) + P("end:")))))))))))) + P("g") * (P("s") * (P("e") * (P("t") * (P("_") * (P("i") * (P("n") * (P("l") * (P("i") * (P("n") * (P("e") * (P("_") * (P("b") * (P("e") * (P("g") * (P("i") * (P("n") * (P(":") * (P("c") + P("N"))))))) + P("end:")))))))))))))))))) + P("p") * (P("d") * (P("f") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D") + P("i") * (P("f") * (P("_") * (P("e") * (P("n") * (P("g") * (P("i") * (P("n") * (P("e") * (P(":") * (P("TF") + P("F") + P("T")) + P("_p:")))))))))))))))) + P("e") * (P("e") * (P("k") * (P("_") * (P("gafter:NN") + P("after:NN"))))) + P("r") * (P("o") * (P("p") * (P("_") * (P("d") * (P("i") * (P("s") * (P("p") * (P("l") * (P("a") * !
 (P("y") * (P(":") * (P("c") + P("N")))))))) + P("e") * (P("l") * (P(":") * (P("N") * (P("n") + P("V")) + P("c") * (P("n") + P("V")))))) + P("i") * (P("f") * (P("_") * (P("i") * (P("n") * (P(":") * (P("c") * (P("c") * (P("TF") + P("F") + P("T")))))) + P("e") * (P("q") * (P(":") * (P("N") * (P("N") * (P("TF") + P("F") + P("T")) + P("c") * (P("TF") + P("F") + P("T"))) + P("c") * (P("N") * (P("TF") + P("F") + P("T")) + P("c") * (P("TF") + P("F") + P("T")))) + P("_") * (P("p") * (P(":") * (P("N") * (P("c") + P("N")) + P("c") * (P("c") + P("N")))))))))) + P("g") * (P("d") * (P("e") * (P("l") * (P(":") * (P("N") * (P("n") + P("V")) + P("c") * (P("n") + P("V")))))) + P("e") * (P("t") * (P(":") * (P("Nn") + P("cn")) + P("_gdel:NnN"))) + P("put:ccx") + P("g") * (P("e") * (P("t") * (P(":") * (P("N") * (P("nN") + P("VN")) + P("c") * (P("nN") + P("VN")))))))))) + P("g") * (P("_") * (P("s") * (P("t") * (P("e") * (P("p") * (P("w") * (P("i") * (P("s") * (P("e") * (P("_") * (P("inline:nnnn") + P("function:nnnN") + P("variable:nnnNn"))))))))) + P("et_map_functions:Nn")) + P("new_map_functions:Nn") + P("c") * (P("a") * (P("s") * (P("e") * (P("_") * (P("dim:nnn") + P("int:nnn") + P("t") * (P("l") * (P(":") * (P("Nnn") + P("cnn")))) + P("s") * (P("t") * (P("r") * (P(":") * (P("xxn") + P("nnn") + P("onn"))))))))))))) + P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D")))))) + P("q") * (P("u") * (P("a") * (P("r") * (P("k") * (P("_") * (P("i") * (P("f") * (P("_") * (P("r") * (P("e") * (P("c") * (P("u") * (P("r") * (P("s") * (P("i") * (P("o") * (P("n") * (P("_") * (P("t") * (P("a") * (P("i") * (P("l") * (P("_") * (P("b") * (P("r") * (P("e") * (P("a") * (P("k") * (P(":") * (P("N") + P("n"))))))))))))))))))))))))))))))) + P("t") * (P("l") * (P("_") * (P("h") * (P("e") * (P("a") * (P("d") * (P("_") * (P("i") * (P(":") * (P("n") + P("w")) + P("i") * (P("i") * (P(":") * (P("f") + P("n") + P("w")))))))))) + P("i") * (P("f") * (P("_") * (P("h") * (P("e") * (P("a") * (P("d") * (P("_") * (P("s") * (P("p") * (P("a") * (P("c") * (P("e") * !
 (P(":") * (P("n") * (P("TF") + P("F") + P("T"))) + P("_p:n")))))) + P("N") * (P("_") * (P("t") * (P("y") * (P("p") * (P("e") * (P(":") * (P("n") * (P("TF") + P("F") + P("T"))) + P("_p:n"))))))) + P("g") * (P("r") * (P("o") * (P("u") * (P("p") * (P(":") * (P("n") * (P("TF") + P("F") + P("T"))) + P("_p:n"))))))))))) + P("e") * (P("m") * (P("p") * (P("t") * (P("y") * (P(":") * (P("x") * (P("TF") + P("F") + P("T"))))))))))) + P("g") * (P("r") * (P("e") * (P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nnn") + P("cnn")))) + P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nnn") + P("cnn")))))))))))))) + P("m") * (P("o") * (P("v") * (P("e") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn")))) + P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn"))))))))))))))) + P("s") * (P("e") * (P("t") * (P(":Nc") + P("_") * (P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("f") * (P("i") * (P("l") * (P("e") * (P(":") * (P("Nnn") + P("cnn")) + P("_") * (P("x") * (P(":") * (P("Nnn") + P("cnn")))))))))))))))))) + P("l") * (P("e") * (P("n") * (P("g") * (P("t") * (P("h") * (P(":") * (P("c") + P("n") + P("N") + P("o") + P("V")))))))) + P("n") * (P("e") * (P("w") * (P(":") * (P("N") * (P("n") + P("x")) + P("cn"))))) + P("s") * (P("h") * (P("o") * (P("w") * (P("_") * (P("a") * (P("n") * (P("a") * (P("l") * (P("y") * (P("s") * (P("i") * (P("s") * (P(":") * (P("N") + P("n")))))))))))))) + P("e") * (P("t") * (P(":Nc") + P("_") * (P("f") * (P("r") * (P("o") * (P("m") * (P("_") * (P("f") * (P("i") * (P("l") * (P("e") * (P(":") * (P("Nnn") + P("cnn")) + P("_") * (P("x") * (P(":") * (P("Nnn") + P("cnn"))))))))))))))))) + P("t") * (P("o") * (P("_") * (P("lowercase:n") + P("uppercase:n"))) + P("ail:w")) + P("e") * (P("l") * (P("t") * (P("_") * (P("c") * (P("o") * (P("u") * (P("n") * (P("t") * (P(":") * (P("c") + P("n") + P("N") + P("o") + P("V"))))))))))) + P("r") * (P("e") * (P("p") * (P("l") * (P("a") * (P("c") * (P("e") * (P("_!
 ") * (P("i") * (P("n") * (P(":") * (P("Nnn") + P("cnn")))) + P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nnn") + P("cnn")))))))))))))) + P("m") * (P("o") * (P("v") * (P("e") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn")))) + P("a") * (P("l") * (P("l") * (P("_") * (P("i") * (P("n") * (P(":") * (P("Nn") + P("cn"))))))))))))))) + P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("Nnn") + P("cnn")))))))) + P("o") * (P("k") * (P("s") * (P("_") * (P("p") * (P("u") * (P("t") * (P("_") * (P("l") * (P("e") * (P("f") * (P("t") * (P(":") * (P("N") * (P("n") + P("o") + P("V") + P("x")) + P("c") * (P("n") + P("o") + P("V"))))))) + P("r") * (P("i") * (P("g") * (P("h") * (P("t") * (P(":") * (P("N") * (P("f") + P("n") + P("o") + P("V") + P("x")) + P("c") * (P("n") + P("o") + P("V")))))))))))) + P("i") * (P("f") * (P("_") * (P("e") * (P("q") * (P(":") * (P("N") * (P("N") * (P("TF") + P("F") + P("T")) + P("c") * (P("TF") + P("F") + P("T"))) + P("c") * (P("N") * (P("TF") + P("F") + P("T")) + P("c") * (P("TF") + P("F") + P("T")))) + P("_") * (P("p") * (P(":") * (P("N") * (P("c") + P("N")) + P("c") * (P("c") + P("N")))))) + P("m") * (P("p") * (P("t") * (P("y") * (P(":") * (P("N") * (P("TF") + P("F") + P("T")) + P("c") * (P("TF") + P("F") + P("T"))) + P("_") * (P("p") * (P(":") * (P("c") + P("N")))))))))))) + P("n") * (P("e") * (P("w") * (P(":") * (P("c") + P("N"))))) + P("g") * (P("p") * (P("u") * (P("t") * (P("_") * (P("l") * (P("e") * (P("f") * (P("t") * (P(":") * (P("N") * (P("n") + P("o") + P("V") + P("x")) + P("c") * (P("n") + P("o") + P("V"))))))) + P("r") * (P("i") * (P("g") * (P("h") * (P("t") * (P(":") * (P("N") * (P("n") + P("o") + P("V") + P("x")) + P("c") * (P("n") + P("o") + P("V")))))))))))) + P("s") * (P("e") * (P("t") * (P(":") * (P("N") * (P("n") + P("o") + P("V") + P("x")) + P("c") * (P("n") + P("o") + P("V") + P("x"))) + P("_") * (P("e") * (P("q") * (P(":") * (P("N") * (P("c") + P("N")) + P("c") * (P("c") + P("N"))))))))) + P("c") * (P("l") * (P("e") * (P("a") * (P("r"!
 ) * (P(":") * (P("c") + P("N")))))))) + P("u") * (P("s") * (P("e") * (P(":") * (P("c") + P("N")) + P("_") * (P("g") * (P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N")))))))) + P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))))))) + P("s") * (P("h") * (P("o") * (P("w") * (P(":") * (P("c") + P("N"))))) + P("e") * (P("t") * (P(":") * (P("N") * (P("f") + P("n") + P("o") + P("V") + P("v") + P("x")) + P("c") * (P("f") + P("n") + P("o") + P("V") + P("v") + P("x"))) + P("_") * (P("e") * (P("q") * (P(":") * (P("N") * (P("c") + P("N")) + P("c") * (P("c") + P("N"))))))))) + P("c") * (P("l") * (P("e") * (P("a") * (P("r") * (P(":") * (P("c") + P("N"))))))))) + P("e") * (P("n") * (P("_") * (P("i") * (P("f") * (P("_") * (P("a") * (P("l") * (P("i") * (P("g") * (P("n") * (P("m") * (P("e") * (P("n") * (P("t") * (P("_") * (P("t") * (P("a") * (P("b") * (P(":") * (P("N") * (P("TF") + P("F") + P("T"))) + P("_p:N"))))))))))))) + P("c") * (P("t") * (P("i") * (P("v") * (P("e") * (P("_") * (P("c") * (P("h") * (P("a") * (P("r") * (P(":") * (P("N") * (P("TF") + P("F") + P("T"))) + P("_p:N")))))))))))) + P("m") * (P("a") * (P("t") * (P("h") * (P("_") * (P("s") * (P("h") * (P("i") * (P("f") * (P("t") * (P(":") * (P("N") * (P("TF") + P("F") + P("T"))) + P("_p:N"))))))))))) + P("o") * (P("t") * (P("h") * (P("e") * (P("r") * (P("_") * (P("c") * (P("h") * (P("a") * (P("r") * (P(":") * (P("N") * (P("TF") + P("F") + P("T"))) + P("_p:N")))))))))))))) + P("new:Nn") + P("g") * (P("e") * (P("t") * (P("_") * (P("prefix_spec:N") + P("arg_spec:N") + P("replacement_spec:N"))))))))))) + P("u") * (P("p") * (P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D")))))) + P("t") * (P("e") * (P("x") * (P("_") * (wildcard * P(":D"))))) + P("s") * (P("e") * (P("_") * (P("i") * (P("_") * (P("a") * (P("f") * (P("t") * (P("e") * (P("r") * (P("_") * (P("else:nw") + P("fi:nw") + P("o") * (P("r") * (P(":nw") + P("else:nw"))))))))))))))) + P("E") * (P("x") * (P("p") * (P("l") * (P("S") * (P("y") * (P("n") * !
 (P("t") * (P("a") * (P("x") * (P("N") * (P("a") * (P("m") * (P("e") * (P("s") * (P("O") * (P("ff") + P("n"))))))))))))))))) + P("s") * (P("o") * (P("r") * (P("t") * (P("_") * (P("reversed:") + P("ordered:"))))) + P("t") * (P("r") * (P("_") * (P("i") * (P("f") * (P("_") * (P("e") * (P("q") * (P(":") * (P("x") * (P("x") * (P("TF") + P("F") + P("T")))) + P("_") * (P("p:xx") + P("x") * (P(":") * (P("n") * (P("n") * (P("TF") + P("F") + P("T")))) + P("_p:nn")))))))) + P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nnn") + P("onn")) + P("_") * (P("x") * (P(":") * (P("n") * (P("n") * (P("TF") + P("F") + P("n") + P("T")) + P("n")))))))))))) + P("e") * (P("q") * (P("_") * (P("l") * (P("e") * (P("n") * (P("g") * (P("t") * (P("h") * (P(":") * (P("c") + P("N")))))))) + P("u") * (P("s") * (P("e") * (P(":") * (P("c") + P("N"))))) + P("t") * (P("o") * (P("p") * (P(":") * (P("NN") + P("cN"))))) + P("d") * (P("i") * (P("s") * (P("p") * (P("l") * (P("a") * (P("y") * (P(":") * (P("c") + P("N")))))))))))) + P("k") * (P("i") * (P("p") * (P("_") * (P("i") * (P("f") * (P("_") * (P("i") * (P("n") * (P("f") * (P("i") * (P("n") * (P("i") * (P("t") * (P("e") * (P("_") * (P("g") * (P("l") * (P("u") * (P("e") * (P(":") * (P("n") * (P("TF") + P("F") + P("T"))) + P("_p:n"))))))))))))))))))))) + P("can_align_safe_stop:"))) * eof
 -- luacheck: pop
 
 return obsolete

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-parsers.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-parsers.lua	2025-01-15 18:18:01 UTC (rev 73462)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-parsers.lua	2025-01-15 20:59:26 UTC (rev 73463)
@@ -14,6 +14,7 @@
 local backslash = P([[\]])
 local circumflex = P("^")
 local colon = P(":")
+local comma = P(",")
 local control_character = R("\x00\x1F") + P("\x7F")
 local dollar_sign = P("$")
 local form_feed = P("\x0C")
@@ -201,6 +202,54 @@
   + any_expl3_variable_or_constant
 )
 
+local expl3_variable_or_constant_type = (
+  P("bitset")
+  + S("hv")^-1 * P("box")
+  + P("bool")
+  + P("cctab")
+  + P("clist")
+  + P("coffin")
+  + P("dim")
+  + P("flag")
+  + P("fp") * P("array")^-1
+  + P("int") * P("array")^-1
+  + P("ior")
+  + P("iow")
+  + P("muskip")
+  + P("prop")
+  + P("regex")
+  + P("seq")
+  + P("skip")
+  + P("str")
+  + P("tl")
+)
+
+local expl3_variable_or_constant_csname = (
+  S("cgl")  -- scope
+  * underscore
+  * (
+    underscore^-1 * letter^1  -- module
+    * underscore
+    * letter * (letter + underscore * -#(expl3_variable_or_constant_type * eof))^0  -- description
+  )
+  * underscore
+  * expl3_variable_or_constant_type
+  * eof
+)
+local expl3_scratch_variable_csname = (
+  P("l")
+  * underscore
+  * P("tmp") * S("ab")
+  * underscore
+  * expl3_variable_or_constant_type
+  * eof
+)
+
+local non_expl3_csname = (
+  letter^1
+  * eof
+)
+
 ---- Comments
 local commented_line_letter = (
   linechar
@@ -250,6 +299,35 @@
   )
 )
 
+-- Explcheck issues
+local issue_code = (
+  S("EeSsTtWw")
+  / function(prefix)
+    return prefix:lower()
+  end
+  * decimal_digit
+  * decimal_digit
+  * decimal_digit
+)
+local ignored_issues = Ct(
+  optional_spaces
+  * P("noqa")
+  * (
+    P(":")
+    * optional_spaces
+    * (
+      Cs(issue_code)
+      * optional_spaces
+      * comma
+      * optional_spaces
+    )^0
+    * Cs(issue_code)
+    * optional_spaces
+    + optional_spaces
+  )
+  * eof
+)
+
 ---- Standard delimiters
 local provides = (
   expl3_catcodes[0]
@@ -291,28 +369,6 @@
 )
 
 ---- Using variables/constants
-local expl3_variable_or_constant_type = (
-  P("bitset")
-  + S("hv")^-1 * P("box")
-  + P("bool")
-  + P("cctab")
-  + P("clist")
-  + P("coffin")
-  + P("dim")
-  + P("flag")
-  + P("fp") * P("array")^-1
-  + P("int") * P("array")^-1
-  + P("ior")
-  + P("iow")
-  + P("muskip")
-  + P("prop")
-  + P("regex")
-  + P("seq")
-  + P("skip")
-  + P("str")
-  + P("tl")
-)
-
 local expl3_variable_or_constant_use_csname = (
   expl3_variable_or_constant_type
   * P("_")
@@ -327,27 +383,6 @@
   * P(":N")
 )
 
-local expl3_variable_or_constant_csname = (
-  S("cgl")  -- scope
-  * underscore
-  * (
-    underscore^-1 * letter^1  -- module
-    * underscore
-    * letter * (letter + underscore * -#expl3_variable_or_constant_type)^0  -- description
-  )
-  * underscore
-  * expl3_variable_or_constant_type
-  * eof
-)
-local expl3_scratch_variable_csname = (
-  P("l")
-  * underscore
-  * P("tmp") * S("ab")
-  * underscore
-  * expl3_variable_or_constant_type
-  * eof
-)
-
 ---- Defining quarks and scan marks
 local expl3_quark_or_scan_mark_definition_csname = (
   (
@@ -379,8 +414,10 @@
   expl3_quark_or_scan_mark_definition_csname = expl3_quark_or_scan_mark_definition_csname,
   expl_syntax_off = expl_syntax_off,
   expl_syntax_on = expl_syntax_on,
+  ignored_issues = ignored_issues,
   linechar = linechar,
   newline = newline,
+  non_expl3_csname = non_expl3_csname,
   provides = provides,
   tex_lines = tex_lines,
   weird_argument_specifiers = weird_argument_specifiers,

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-preprocessing.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-preprocessing.lua	2025-01-15 18:18:01 UTC (rev 73462)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-preprocessing.lua	2025-01-15 20:59:26 UTC (rev 73463)
@@ -6,46 +6,6 @@
 local lpeg = require("lpeg")
 local Cp, Ct, P, V = lpeg.Cp, lpeg.Ct, lpeg.P, lpeg.V
 
--- Strip TeX comments from a text. Besides the transformed text, also return
--- a function that maps positions in the transformed text back to the original
--- text.
-local function strip_comments(text)
-  local transformed_index = 0
-  local numbers_of_bytes_removed = {}
-  local transformed_text_table = {}
-  for index, text_position in ipairs(lpeg.match(Ct(parsers.commented_line^1), text)) do
-    local span_size = text_position - transformed_index - 1
-    if span_size > 0 then
-      if index % 2 == 1 then  -- chunk of text
-        table.insert(transformed_text_table, text:sub(transformed_index + 1, text_position - 1))
-      else  -- comment
-        table.insert(numbers_of_bytes_removed, {transformed_index, span_size})
-      end
-      transformed_index = transformed_index + span_size
-    end
-  end
-  table.insert(transformed_text_table, text:sub(transformed_index + 1, -1))
-  local transformed_text = table.concat(transformed_text_table, "")
-  local function map_back(index)
-    local mapped_index = index
-    for _, where_and_number_of_bytes_removed in ipairs(numbers_of_bytes_removed) do
-      local where, number_of_bytes_removed = table.unpack(where_and_number_of_bytes_removed)
-      if mapped_index > where then
-        mapped_index = mapped_index + number_of_bytes_removed
-      else
-        break
-      end
-    end
-    assert(mapped_index > 0)
-    assert(mapped_index <= #text + 1)
-    if mapped_index <= #text then
-      assert(transformed_text[index] == text[mapped_index])
-    end
-    return mapped_index
-  end
-  return transformed_text, map_back
-end
-
 -- Preprocess the content and register any issues.
 local function preprocessing(issues, content, options)
 
@@ -76,8 +36,66 @@
   lpeg.match(line_numbers_grammar, content)
 
   -- Strip TeX comments before further analysis.
-  local transformed_content, map_back = strip_comments(content)
+  local function strip_comments()
+    local transformed_index = 0
+    local numbers_of_bytes_removed = {}
+    local transformed_text_table = {}
+    for index, text_position in ipairs(lpeg.match(Ct(parsers.commented_line^1), content)) do
+      local span_size = text_position - transformed_index - 1
+      if span_size > 0 then
+        if index % 2 == 1 then  -- chunk of text
+          table.insert(transformed_text_table, content:sub(transformed_index + 1, text_position - 1))
+        else  -- comment
+          local comment_text = content:sub(transformed_index + 2, text_position - 1)
+          local ignored_issues = lpeg.match(parsers.ignored_issues, comment_text)
+          -- If a comment specifies ignored issues, register them.
+          if ignored_issues ~= nil then
+            local comment_line_number = utils.convert_byte_to_line_and_column(line_starting_byte_numbers, transformed_index + 1)
+            assert(comment_line_number <= #line_starting_byte_numbers)
+            local comment_range_start = line_starting_byte_numbers[comment_line_number]
+            local comment_range_end
+            if(comment_line_number + 1 <= #line_starting_byte_numbers) then
+              comment_range_end = line_starting_byte_numbers[comment_line_number + 1] - 1
+            else
+              comment_range_end = #content
+            end
+            if #ignored_issues == 0 then  -- ignore all issues on this line
+              issues:ignore(nil, comment_range_start, comment_range_end)
+            else  -- ignore specific issues on this line or everywhere (for file-wide issues)
+              for _, identifier in ipairs(ignored_issues) do
+                issues:ignore(identifier, comment_range_start, comment_range_end)
+              end
+            end
+          end
+          table.insert(numbers_of_bytes_removed, {transformed_index, span_size})
+        end
+        transformed_index = transformed_index + span_size
+      end
+    end
+    table.insert(transformed_text_table, content:sub(transformed_index + 1, -1))
+    local transformed_text = table.concat(transformed_text_table, "")
+    local function map_back(index)
+      local mapped_index = index
+      for _, where_and_number_of_bytes_removed in ipairs(numbers_of_bytes_removed) do
+        local where, number_of_bytes_removed = table.unpack(where_and_number_of_bytes_removed)
+        if mapped_index > where then
+          mapped_index = mapped_index + number_of_bytes_removed
+        else
+          break
+        end
+      end
+      assert(mapped_index > 0)
+      assert(mapped_index <= #content + 1)
+      if mapped_index <= #content then
+        assert(transformed_text[index] == content[mapped_index])
+      end
+      return mapped_index
+    end
+    return transformed_text, map_back
+  end
 
+  local transformed_content, map_back = strip_comments()
+
   -- Determine which parts of the input files contain expl3 code.
   local expl_ranges = {}
 

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-utils.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-utils.lua	2025-01-15 18:18:01 UTC (rev 73462)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-utils.lua	2025-01-15 20:59:26 UTC (rev 73463)
@@ -2,6 +2,22 @@
 
 local config = require("explcheck-config")
 
+-- Convert a byte number in a file to a line and column number in a file.
+local function convert_byte_to_line_and_column(line_starting_byte_numbers, byte_number)
+  local line_number = 0
+  for _, line_starting_byte_number in ipairs(line_starting_byte_numbers) do
+    if line_starting_byte_number > byte_number then
+      break
+    end
+    line_number = line_number + 1
+  end
+  assert(line_number > 0)
+  local line_starting_byte_number = line_starting_byte_numbers[line_number]
+  assert(line_starting_byte_number <= byte_number)
+  local column_number = byte_number - line_starting_byte_number + 1
+  return line_number, column_number
+end
+
 -- Get the value of an option or the default value if unspecified.
 local function get_option(options, key)
   if options == nil or options[key] == nil then
@@ -11,5 +27,6 @@
 end
 
 return {
+  convert_byte_to_line_and_column = convert_byte_to_line_and_column,
   get_option = get_option,
 }



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