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.